From 2fa091337395679f1f3cbd8b0895aa0c8113af53 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 8 Jan 2026 10:12:34 +0100 Subject: [PATCH 001/260] Merge update_version_to3.4.0-DEV into develop (#4574) * Update version to 3.4.0-DEV * chore: correct design system version --------- Co-authored-by: @dhis2-bot Co-authored-by: Xavier Molloy --- gradle/libs.versions.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2fb48cce6d4..8b26b34cbe0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,13 +5,13 @@ navigationCompose = "2.9.1" sdk = "36" minSdk = "21" vCode = "150" -vName = "3.3.1-Dev" +vName = "3.4.0-DEV" gradle = "8.13.2" kotlin = '2.2.21' dagger = '2.57.2' jacoco = '0.8.14' -designSystem = "0.6.1-SNAPSHOT" -dhis2sdk = "1.13.1-SNAPSHOT" +designSystem = "0.7.0-SNAPSHOT" +dhis2sdk = "1.14.0-SNAPSHOT" ruleEngine = "3.3.11" expressionParser = "1.2.1" appcompat = "1.7.1" From 7db84171c2286578ea971352a32e69831b7b551b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 Jan 2026 12:11:27 +0100 Subject: [PATCH 002/260] deps: bump the gradle-updates group across 1 directory with 15 updates (#4576) Bumps the gradle-updates group with 15 updates in the / directory: | Package | From | To | | --- | --- | --- | | [org.hisp.dhis.lib.expression:expression-parser-jvm](https://github.com/dhis2/expression-parser) | `1.2.1` | `1.2.2` | | androidx.compose.material:material | `1.9.3` | `1.9.5` | | androidx.compose.ui:ui | `1.9.3` | `1.9.5` | | androidx.compose.runtime:runtime-livedata | `1.9.3` | `1.9.5` | | androidx.compose.ui:ui-tooling | `1.9.3` | `1.9.5` | | androidx.compose.ui:ui-tooling-preview | `1.9.3` | `1.9.5` | | androidx.compose.ui:ui-test-junit4 | `1.9.3` | `1.9.5` | | androidx.compose.ui:ui-test-manifest | `1.9.3` | `1.9.5` | | androidx.compose.ui:ui-test-junit4-android | `1.9.3` | `1.9.5` | | [org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose](https://github.com/JetBrains/compose-jb) | `2.9.5` | `2.9.6` | | com.google.android.gms:play-services-auth-api-phone | `18.0.1` | `18.0.2` | | [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit-framework) | `6.0.1` | `6.0.2` | | org.jetbrains.compose | `1.9.1` | `1.9.3` | | [com.google.devtools.ksp](https://github.com/google/ksp) | `2.2.20-2.0.4` | `2.2.21-2.0.4` | | org.sonarqube | `7.0.0.6105` | `7.0.1.6134` | Updates `org.hisp.dhis.lib.expression:expression-parser-jvm` from 1.2.1 to 1.2.2 - [Release notes](https://github.com/dhis2/expression-parser/releases) - [Commits](https://github.com/dhis2/expression-parser/compare/v1.2.1...v1.2.2) Updates `androidx.compose.material:material` from 1.9.3 to 1.9.5 Updates `androidx.compose.ui:ui` from 1.9.3 to 1.9.5 Updates `androidx.compose.runtime:runtime-livedata` from 1.9.3 to 1.9.5 Updates `androidx.compose.ui:ui-tooling` from 1.9.3 to 1.9.5 Updates `androidx.compose.ui:ui-tooling-preview` from 1.9.3 to 1.9.5 Updates `androidx.compose.ui:ui-test-junit4` from 1.9.3 to 1.9.5 Updates `androidx.compose.ui:ui-test-manifest` from 1.9.3 to 1.9.5 Updates `androidx.compose.ui:ui-test-junit4-android` from 1.9.3 to 1.9.5 Updates `androidx.compose.ui:ui` from 1.9.3 to 1.9.5 Updates `androidx.compose.runtime:runtime-livedata` from 1.9.3 to 1.9.5 Updates `androidx.compose.ui:ui-tooling` from 1.9.3 to 1.9.5 Updates `androidx.compose.ui:ui-tooling-preview` from 1.9.3 to 1.9.5 Updates `org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose` from 2.9.5 to 2.9.6 - [Release notes](https://github.com/JetBrains/compose-jb/releases) - [Changelog](https://github.com/JetBrains/compose-multiplatform/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/compose-jb/commits) Updates `com.google.android.gms:play-services-auth-api-phone` from 18.0.1 to 18.0.2 Updates `androidx.compose.ui:ui-test-junit4` from 1.9.3 to 1.9.5 Updates `androidx.compose.ui:ui-test-manifest` from 1.9.3 to 1.9.5 Updates `androidx.compose.ui:ui-test-junit4-android` from 1.9.3 to 1.9.5 Updates `org.junit.jupiter:junit-jupiter` from 6.0.1 to 6.0.2 - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r6.0.1...r6.0.2) Updates `org.jetbrains.compose` from 1.9.1 to 1.9.3 Updates `com.google.devtools.ksp` from 2.2.20-2.0.4 to 2.2.21-2.0.4 - [Release notes](https://github.com/google/ksp/releases) - [Commits](https://github.com/google/ksp/compare/2.2.20-2.0.4...2.2.21-2.0.4) Updates `org.sonarqube` from 7.0.0.6105 to 7.0.1.6134 --- updated-dependencies: - dependency-name: org.hisp.dhis.lib.expression:expression-parser-jvm dependency-version: 1.2.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.material:material dependency-version: 1.9.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui dependency-version: 1.9.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.runtime:runtime-livedata dependency-version: 1.9.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-tooling dependency-version: 1.9.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-tooling-preview dependency-version: 1.9.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-test-junit4 dependency-version: 1.9.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-test-manifest dependency-version: 1.9.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-test-junit4-android dependency-version: 1.9.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui dependency-version: 1.9.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.runtime:runtime-livedata dependency-version: 1.9.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-tooling dependency-version: 1.9.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-tooling-preview dependency-version: 1.9.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose dependency-version: 2.9.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: com.google.android.gms:play-services-auth-api-phone dependency-version: 18.0.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-test-junit4 dependency-version: 1.9.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-test-manifest dependency-version: 1.9.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-test-junit4-android dependency-version: 1.9.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: org.junit.jupiter:junit-jupiter dependency-version: 6.0.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: org.jetbrains.compose dependency-version: 1.9.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: com.google.devtools.ksp dependency-version: 2.2.21-2.0.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: org.sonarqube dependency-version: 7.0.1.6134 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8b26b34cbe0..c3381cb1f31 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] kotlinxDatetime = "0.7.1-0.6.x-compat" #Needs to be compatible with the Rule engine, update when it's updated -lifecycleRuntimeCompose = "2.9.5" +lifecycleRuntimeCompose = "2.9.6" navigationCompose = "2.9.1" sdk = "36" minSdk = "21" @@ -13,7 +13,7 @@ jacoco = '0.8.14' designSystem = "0.7.0-SNAPSHOT" dhis2sdk = "1.14.0-SNAPSHOT" ruleEngine = "3.3.11" -expressionParser = "1.2.1" +expressionParser = "1.2.2" appcompat = "1.7.1" annotation = "1.9.1" cardview = "1.0.0" @@ -26,8 +26,8 @@ exif = "1.4.2" corektx = "1.17.0" fragmentktx = "1.8.9" recyclerview = "1.4.0" -compose = "1.9.3" -composePluginVersion = "1.9.1" +compose = "1.9.5" +composePluginVersion = "1.9.3" composePaging = "3.3.6" pagingTesting = "3.3.6" composeConstraintLayout = "1.1.1" @@ -83,15 +83,15 @@ material3WindowSize = "1.4.0" material3WindowSizeCompose = "1.8.2" material3AdaptiveAndroid = "1.1.0" koin = "4.1.1" -junitJupiter = "6.0.1" +junitJupiter = "6.0.2" ktxml = "1.0.0" atomicfu = "0.29.0" playservicesauth = "21.4.0" -playservicesphone = "18.0.1" #Can not be updated to latest due minSDK requirement of 23 -ksp = "2.2.20-2.0.4" +playservicesphone = "18.0.2" #Can not be updated to latest due minSDK requirement of 23 +ksp = "2.2.21-2.0.4" commonsText = "1.14.0" ktlint = "13.1.0" -sonarqube = "7.0.0.6105" +sonarqube = "7.0.1.6134" browser = "1.9.0" biometric = "1.1.0" coil = "3.3.0" From db5796ec299a7cc3eb96d1347fa8be12b36bd9c5 Mon Sep 17 00:00:00 2001 From: danielTari Date: Fri, 9 Jan 2026 09:13:06 +0100 Subject: [PATCH 003/260] chore: [ANDROAPP-7435] deprecate android sdk 21 and 22 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c3381cb1f31..3e239e338f5 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,7 +3,7 @@ kotlinxDatetime = "0.7.1-0.6.x-compat" #Needs to be compatible with the Rule eng lifecycleRuntimeCompose = "2.9.6" navigationCompose = "2.9.1" sdk = "36" -minSdk = "21" +minSdk = "23" vCode = "150" vName = "3.4.0-DEV" gradle = "8.13.2" From d558609efdb8b4f92ca557db750981343cd2e819 Mon Sep 17 00:00:00 2001 From: danielTari Date: Fri, 9 Jan 2026 13:15:44 +0100 Subject: [PATCH 004/260] chore: [ANDROAPP-7435] simplify logic depending on deprecated android sdk --- .../java/org/dhis2/bindings/Bindings.java | 9 --- .../dhis2/data/biometric/BiometricUtils.kt | 34 ++++------ .../TeiDashboardMobileActivity.kt | 17 ++--- .../commons/bindings/CommonExtensions.kt | 65 +++++++++---------- .../dialogs/calendarpicker/CalendarPicker.kt | 13 ---- .../dhis2/commons/popupmenu/AppMenuHelper.kt | 7 +- .../network/NetworkStatusProviderImpl.kt | 17 ++--- .../biometrics/CryptographicActions.kt | 4 +- .../login/main/data/LoginRepositoryImpl.kt | 2 +- .../usecase/UpdateBiometricPermission.kt | 27 ++++---- .../dhis2/android/rtsm/utils/LocaleManager.kt | 8 +-- 11 files changed, 74 insertions(+), 129 deletions(-) diff --git a/app/src/main/java/org/dhis2/bindings/Bindings.java b/app/src/main/java/org/dhis2/bindings/Bindings.java index 0354b034f25..60d0a67c159 100644 --- a/app/src/main/java/org/dhis2/bindings/Bindings.java +++ b/app/src/main/java/org/dhis2/bindings/Bindings.java @@ -5,11 +5,9 @@ import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; -import android.os.Build; import android.util.TypedValue; import android.view.View; import android.widget.ImageView; -import android.widget.LinearLayout; import android.widget.TextView; import androidx.appcompat.content.res.AppCompatResources; @@ -168,13 +166,6 @@ public static void setImageBackground(ImageView imageView, Drawable drawable) { } - @BindingAdapter("versionVisibility") - public static void setVisibility(LinearLayout linearLayout, boolean check) { - if (check && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - linearLayout.setVisibility(View.GONE); - } - } - @BindingAdapter("settingIcon") public static void setSettingIcon(ImageView view, int drawableReference) { Drawable drawable = AppCompatResources.getDrawable(view.getContext(), drawableReference); diff --git a/app/src/main/java/org/dhis2/data/biometric/BiometricUtils.kt b/app/src/main/java/org/dhis2/data/biometric/BiometricUtils.kt index 47627d21950..781e1485952 100644 --- a/app/src/main/java/org/dhis2/data/biometric/BiometricUtils.kt +++ b/app/src/main/java/org/dhis2/data/biometric/BiometricUtils.kt @@ -4,7 +4,6 @@ import android.content.Context import android.os.Build import android.security.keystore.KeyGenParameterSpec import android.security.keystore.KeyProperties -import androidx.annotation.RequiresApi import androidx.biometric.BiometricManager import androidx.biometric.BiometricPrompt import androidx.core.content.ContextCompat @@ -93,27 +92,19 @@ class CryptographyManager : CryptographicActions { load(null) } - override fun getInitializedCipherForEncryption(): Cipher? = - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - val cipher = getCipher() - val secretKey = - getOrCreateSecretKey() - - cipher.init(Cipher.ENCRYPT_MODE, secretKey) - cipher - } else { - null - } + override fun getInitializedCipherForEncryption(): Cipher { + val cipher = getCipher() + val secretKey = getOrCreateSecretKey() + cipher.init(Cipher.ENCRYPT_MODE, secretKey) + return cipher + } - override fun getInitializedCipherForDecryption(initializationVector: ByteArray): Cipher? = - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - val cipher = getCipher() - val secretKey = getOrCreateSecretKey() - cipher.init(Cipher.DECRYPT_MODE, secretKey, GCMParameterSpec(128, initializationVector)) - cipher - } else { - null - } + override fun getInitializedCipherForDecryption(initializationVector: ByteArray): Cipher { + val cipher = getCipher() + val secretKey = getOrCreateSecretKey() + cipher.init(Cipher.DECRYPT_MODE, secretKey, GCMParameterSpec(128, initializationVector)) + return cipher + } override fun encryptData( plaintext: String, @@ -136,7 +127,6 @@ class CryptographyManager : CryptographicActions { return Cipher.getInstance(transformation) } - @RequiresApi(Build.VERSION_CODES.M) private fun getOrCreateSecretKey(): SecretKey { // If Secretkey was previously created for that keyName, then grab and return it. keyStore.getKey(KEY_NAME, null)?.let { return it as SecretKey } diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/TeiDashboardMobileActivity.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/TeiDashboardMobileActivity.kt index aeb40312665..4620323adc1 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/TeiDashboardMobileActivity.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/TeiDashboardMobileActivity.kt @@ -3,7 +3,6 @@ package org.dhis2.usescases.teiDashboard import android.app.ActivityOptions import android.content.Context import android.content.Intent -import android.os.Build import android.os.Bundle import android.os.Handler import android.os.Looper @@ -630,15 +629,13 @@ class TeiDashboardMobileActivity : } binding.executePendingBindings() setTheme(themeManager.getProgramTheme()) - if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) { - val window = window - window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) - val typedValue = TypedValue() - val a = obtainStyledAttributes(typedValue.data, intArrayOf(R.attr.colorPrimaryDark)) - val colorToReturn = a.getColor(0, 0) - a.recycle() - window.statusBarColor = colorToReturn - } + val window = window + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) + val typedValue = TypedValue() + val a = obtainStyledAttributes(typedValue.data, intArrayOf(R.attr.colorPrimaryDark)) + val colorToReturn = a.getColor(0, 0) + a.recycle() + window.statusBarColor = colorToReturn } override fun updateNoteBadge(numberOfNotes: Int) { diff --git a/commons/src/main/java/org/dhis2/commons/bindings/CommonExtensions.kt b/commons/src/main/java/org/dhis2/commons/bindings/CommonExtensions.kt index a5bbdcd6ae5..3bf11e76cb1 100644 --- a/commons/src/main/java/org/dhis2/commons/bindings/CommonExtensions.kt +++ b/commons/src/main/java/org/dhis2/commons/bindings/CommonExtensions.kt @@ -5,7 +5,6 @@ import android.graphics.Color import android.graphics.Outline import android.graphics.PorterDuff import android.graphics.Typeface -import android.os.Build import android.text.method.ScrollingMovementMethod import android.util.TypedValue import android.view.View @@ -116,45 +115,41 @@ val Int.px: Int get() = (this / Resources.getSystem().displayMetrics.density).toInt() fun View.clipWithRoundedCorners(curvedRadio: Int = 16.dp) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - outlineProvider = - object : ViewOutlineProvider() { - override fun getOutline( - view: View, - outline: Outline, - ) { - outline.setRoundRect( - 0, - 0, - view.width, - view.height + curvedRadio, - curvedRadio.toFloat(), - ) - } + outlineProvider = + object : ViewOutlineProvider() { + override fun getOutline( + view: View, + outline: Outline, + ) { + outline.setRoundRect( + 0, + 0, + view.width, + view.height + curvedRadio, + curvedRadio.toFloat(), + ) } - clipToOutline = true - } + } + clipToOutline = true } fun View.clipWithAllRoundedCorners(curvedRadio: Int = 16.dp) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - outlineProvider = - object : ViewOutlineProvider() { - override fun getOutline( - view: View, - outline: Outline, - ) { - outline.setRoundRect( - 0, - 0, - view.width, - view.height, - curvedRadio.toFloat(), - ) - } + outlineProvider = + object : ViewOutlineProvider() { + override fun getOutline( + view: View, + outline: Outline, + ) { + outline.setRoundRect( + 0, + 0, + view.width, + view.height, + curvedRadio.toFloat(), + ) } - clipToOutline = true - } + } + clipToOutline = true } fun HorizontalScrollView.scrollToPosition(viewTag: String) { diff --git a/commons/src/main/java/org/dhis2/commons/dialogs/calendarpicker/CalendarPicker.kt b/commons/src/main/java/org/dhis2/commons/dialogs/calendarpicker/CalendarPicker.kt index 97b8897df33..67433ea0706 100644 --- a/commons/src/main/java/org/dhis2/commons/dialogs/calendarpicker/CalendarPicker.kt +++ b/commons/src/main/java/org/dhis2/commons/dialogs/calendarpicker/CalendarPicker.kt @@ -3,12 +3,9 @@ package org.dhis2.commons.dialogs.calendarpicker import android.app.AlertDialog import android.app.Dialog import android.content.Context -import android.os.Build import android.view.LayoutInflater import android.view.View import android.widget.DatePicker -import android.widget.LinearLayout -import androidx.databinding.BindingAdapter import org.dhis2.commons.R import org.dhis2.commons.databinding.CalendarPickerViewBinding import org.dhis2.commons.dialogs.calendarpicker.di.CalendarPickerComponentProvider @@ -174,13 +171,3 @@ class CalendarPicker( } } } - -@BindingAdapter("versionCustomVisibility") -fun setCustomVisibility( - linearLayout: LinearLayout, - check: Boolean, -) { - if (check && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - linearLayout.visibility = View.GONE - } -} diff --git a/commons/src/main/java/org/dhis2/commons/popupmenu/AppMenuHelper.kt b/commons/src/main/java/org/dhis2/commons/popupmenu/AppMenuHelper.kt index 4cec7237932..5f6a19cf9ff 100644 --- a/commons/src/main/java/org/dhis2/commons/popupmenu/AppMenuHelper.kt +++ b/commons/src/main/java/org/dhis2/commons/popupmenu/AppMenuHelper.kt @@ -1,7 +1,6 @@ package org.dhis2.commons.popupmenu import android.content.Context -import android.os.Build import android.view.ContextThemeWrapper import android.view.Gravity import android.view.View @@ -26,11 +25,7 @@ class AppMenuHelper private constructor( fun show() { val contextWrapper = ContextThemeWrapper(context, R.style.PopupMenuMarginStyle) popupMenu = - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) { - PopupMenu(contextWrapper, anchor, Gravity.END, 0, R.style.PopupMenuMarginStyle) - } else { - PopupMenu(contextWrapper, anchor, Gravity.END) - } + PopupMenu(contextWrapper, anchor, Gravity.END, 0, R.style.PopupMenuMarginStyle) try { val fields = popupMenu.javaClass.declaredFields for (field in fields) { diff --git a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/network/NetworkStatusProviderImpl.kt b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/network/NetworkStatusProviderImpl.kt index ba9ed9bb433..02837629b5f 100644 --- a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/network/NetworkStatusProviderImpl.kt +++ b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/network/NetworkStatusProviderImpl.kt @@ -5,7 +5,6 @@ import android.net.ConnectivityManager import android.net.Network import android.net.NetworkCapabilities import android.net.NetworkRequest -import android.os.Build import androidx.annotation.RequiresPermission import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow @@ -24,11 +23,8 @@ class NetworkStatusProviderImpl( NetworkRequest .Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - .also { builder -> - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - builder.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) - } - }.build() + .addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) + .build() private val availableNetworks = mutableSetOf() @@ -77,13 +73,8 @@ class NetworkStatusProviderImpl( @RequiresPermission("android.permission.ACCESS_NETWORK_STATE") private fun ConnectivityManager.getCurrentNetworkState(): Boolean { - @Suppress("DEPRECATION") - return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { - activeNetworkInfo?.isConnected == true - } else { - val networkCapabilities = getNetworkCapabilities(activeNetwork) - networkCapabilities?.asNetworkState() ?: false - } + val networkCapabilities = getNetworkCapabilities(activeNetwork) + return networkCapabilities?.asNetworkState() ?: false } private fun NetworkCapabilities.asNetworkState(): Boolean = hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/biometrics/CryptographicActions.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/biometrics/CryptographicActions.kt index 9146451a323..fa04f543535 100644 --- a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/biometrics/CryptographicActions.kt +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/biometrics/CryptographicActions.kt @@ -3,9 +3,9 @@ package org.dhis2.mobile.commons.biometrics import javax.crypto.Cipher interface CryptographicActions { - fun getInitializedCipherForEncryption(): Cipher? + fun getInitializedCipherForEncryption(): Cipher - fun getInitializedCipherForDecryption(initializationVector: ByteArray): Cipher? + fun getInitializedCipherForDecryption(initializationVector: ByteArray): Cipher fun encryptData( plaintext: String, diff --git a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt index 272979b548e..068cd2faf6c 100644 --- a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt +++ b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt @@ -264,7 +264,7 @@ class LoginRepositoryImpl( preferences.getBiometricCredentials()?.let { ciphertextWrapper -> cryptographyManager .getInitializedCipherForDecryption(ciphertextWrapper.initializationVector) - ?.let { cipher -> + .let { cipher -> suspendCancellableCoroutine { continuation -> authenticator.authenticate(cipher) { cipher -> val pass = diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/UpdateBiometricPermission.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/UpdateBiometricPermission.kt index 71aa7cb3eaf..b9cf84f5d14 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/UpdateBiometricPermission.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/UpdateBiometricPermission.kt @@ -32,20 +32,19 @@ class UpdateBiometricPermission( val cancellationMessage = getString(Res.string.biometrics_permission_cancelled) suspendCancellableCoroutine { continuation -> val scope = CoroutineScope(continuation.context) - cryptographics.getInitializedCipherForEncryption()?.let { - biometrics.authenticate(it) { cryptoObjectCipher -> - scope.launch { - val ciphertextWrapper = - cryptographics.encryptData(password, cryptoObjectCipher) - preferences.saveUserCredentialsAndCipher( - serverUrl, - username, - ciphertextWrapper, - ) - loginRepository.updateBiometricsPermissions(granted) - if (continuation.isActive) { - continuation.resume(Result.success(Unit)) - } + val cipher = cryptographics.getInitializedCipherForEncryption() + biometrics.authenticate(cipher) { cryptoObjectCipher -> + scope.launch { + val ciphertextWrapper = + cryptographics.encryptData(password, cryptoObjectCipher) + preferences.saveUserCredentialsAndCipher( + serverUrl, + username, + ciphertextWrapper, + ) + loginRepository.updateBiometricsPermissions(granted) + if (continuation.isActive) { + continuation.resume(Result.success(Unit)) } } } diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/utils/LocaleManager.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/utils/LocaleManager.kt index a3765cacb0a..e027631b994 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/utils/LocaleManager.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/utils/LocaleManager.kt @@ -28,10 +28,10 @@ class LocaleManager { ): Context { val config = updateConfiguration(context, language) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - return context.createConfigurationContext(config) + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + context.createConfigurationContext(config) } else { - return context + context } } @@ -44,7 +44,7 @@ class LocaleManager { val resources = context.resources val config = Configuration(resources.configuration) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { val localeList = LocaleList(newLocale) LocaleList.setDefault(localeList) config.setLocales(localeList) // additionally sets the layout direction From 61d11377eb7295a7c28e64c3e8503d32942b03e2 Mon Sep 17 00:00:00 2001 From: Rohit <168576901+rohit-wa@users.noreply.github.com> Date: Fri, 9 Jan 2026 18:59:07 +0530 Subject: [PATCH 005/260] feat: add workflow and gradle plugin for generating sbom [skip size] (#4579) * feat: add workflow and gradle plugin for generating sbom * feat: add workflow and gradle plugin for generating sbom --- .github/workflows/generate-and-upload-bom.yml | 34 +++++++++++++++++++ build.gradle.kts | 2 ++ gradle/libs.versions.toml | 2 ++ 3 files changed, 38 insertions(+) create mode 100644 .github/workflows/generate-and-upload-bom.yml diff --git a/.github/workflows/generate-and-upload-bom.yml b/.github/workflows/generate-and-upload-bom.yml new file mode 100644 index 00000000000..759a9ce310a --- /dev/null +++ b/.github/workflows/generate-and-upload-bom.yml @@ -0,0 +1,34 @@ +name: 'This workflow creates bill of material and uploads it to Dependency-Track each night' + +on: + schedule: + - cron: '0 0 * * *' + +jobs: + create-bom: + name: Create and Upload SBOM + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + - name: Set up JDK 17 + uses: actions/setup-java@v5 + with: + java-version: 17 + distribution: zulu + cache: 'gradle' + - name: Change wrapper permission + run: chmod +x ./gradlew + - name: Generate BOM + run: ./gradlew cyclonedxBom + - name: Upload SBOM to DependencyTrack + env: + DEPENDENCY_TRACK_API: 'https://dt.security.dhis2.org/api/v1/bom' + run: | + curl -X POST "$DEPENDENCY_TRACK_API" \ + --fail-with-body \ + -H "Content-Type: multipart/form-data" \ + -H "X-Api-Key: ${{ secrets.DEPENDENCYTRACK_APIKEY }}" \ + -F "project=5d9c948b-3968-4f47-867f-3b7f04ba9fb6" \ + -F "bom=@build/reports/bom.json" diff --git a/build.gradle.kts b/build.gradle.kts index bddb98c8cc0..e89cca27fa1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,6 +14,8 @@ plugins { alias(libs.plugins.compose) apply false alias(libs.plugins.kotlin.compose.compiler) apply false alias(libs.plugins.ksp) apply false + alias(libs.plugins.cyclonedx) + } // Variables to hold aggregated test results diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c3381cb1f31..a9e97a57276 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -95,6 +95,7 @@ sonarqube = "7.0.1.6134" browser = "1.9.0" biometric = "1.1.0" coil = "3.3.0" +cyclonedx = "2.1.0" [libraries] gradlePlugin = { group = "com.android.tools.build", name = "gradle", version.ref = "gradle" } @@ -227,6 +228,7 @@ ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } kotlin-atomicfu = { id = "org.jetbrains.kotlinx.atomicfu", version.ref = "atomicfu" } ktlint = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlint" } sonarqube = { id = "org.sonarqube", version.ref = "sonarqube" } +cyclonedx = { id = "org.cyclonedx.bom", version.ref = "cyclonedx" } [bundles] uicomponents-implementation = ["androidx-coreKtx", "androidx-material3", "androidx-material3-window", "androidx-material3-adaptative-android", "google-material", "lottie-compose", "dhis2-mobile-designsystem"] From a137aa4c65846433c81f9ce4dc0708e39ad55e5d Mon Sep 17 00:00:00 2001 From: danielTari Date: Fri, 9 Jan 2026 14:44:40 +0100 Subject: [PATCH 006/260] chore: [ANDROAPP-7435] fix kapt error --- .../main/res/layout/calendar_picker_view.xml | 1 - .../login/main/data/LoginRepositoryImpl.kt | 28 +++++++++---------- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/commons/src/main/res/layout/calendar_picker_view.xml b/commons/src/main/res/layout/calendar_picker_view.xml index 9e0dae8fcbf..65fdbd8f1c5 100644 --- a/commons/src/main/res/layout/calendar_picker_view.xml +++ b/commons/src/main/res/layout/calendar_picker_view.xml @@ -31,7 +31,6 @@ diff --git a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt index 068cd2faf6c..bff29e25242 100644 --- a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt +++ b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt @@ -262,23 +262,21 @@ class LoginRepositoryImpl( override suspend fun loginWithBiometric(): kotlin.Result = withContext(dispatcher.main) { preferences.getBiometricCredentials()?.let { ciphertextWrapper -> - cryptographyManager + val cipher = cryptographyManager .getInitializedCipherForDecryption(ciphertextWrapper.initializationVector) - .let { cipher -> - suspendCancellableCoroutine { continuation -> - authenticator.authenticate(cipher) { cipher -> - val pass = - cryptographyManager.decryptData( - ciphertextWrapper.ciphertext, - cipher, - ) - continuation.resume(value = kotlin.Result.success(pass)) { _, _, _ -> } - } - continuation.invokeOnCancellation { - // If needed perform action on cancellation - } - } + suspendCancellableCoroutine { continuation -> + authenticator.authenticate(cipher) { cipher -> + val pass = + cryptographyManager.decryptData( + ciphertextWrapper.ciphertext, + cipher, + ) + continuation.resume(value = kotlin.Result.success(pass)) { _, _, _ -> } + } + continuation.invokeOnCancellation { + // If needed perform action on cancellation } + } } ?: kotlin.Result.failure(Exception("No biometrics found")) } From 0977504e07ca45c23835c943d30d937a89f8d8a7 Mon Sep 17 00:00:00 2001 From: danielTari Date: Fri, 9 Jan 2026 16:05:30 +0100 Subject: [PATCH 007/260] chore: [ANDROAPP-7435] fix ktlint complaints --- .../login/main/data/LoginRepositoryImpl.kt | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt index bff29e25242..068cd2faf6c 100644 --- a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt +++ b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt @@ -262,21 +262,23 @@ class LoginRepositoryImpl( override suspend fun loginWithBiometric(): kotlin.Result = withContext(dispatcher.main) { preferences.getBiometricCredentials()?.let { ciphertextWrapper -> - val cipher = cryptographyManager + cryptographyManager .getInitializedCipherForDecryption(ciphertextWrapper.initializationVector) - suspendCancellableCoroutine { continuation -> - authenticator.authenticate(cipher) { cipher -> - val pass = - cryptographyManager.decryptData( - ciphertextWrapper.ciphertext, - cipher, - ) - continuation.resume(value = kotlin.Result.success(pass)) { _, _, _ -> } - } - continuation.invokeOnCancellation { - // If needed perform action on cancellation + .let { cipher -> + suspendCancellableCoroutine { continuation -> + authenticator.authenticate(cipher) { cipher -> + val pass = + cryptographyManager.decryptData( + ciphertextWrapper.ciphertext, + cipher, + ) + continuation.resume(value = kotlin.Result.success(pass)) { _, _, _ -> } + } + continuation.invokeOnCancellation { + // If needed perform action on cancellation + } + } } - } } ?: kotlin.Result.failure(Exception("No biometrics found")) } From 57c0ee33d2f438cf8e20721790f1236d8743e121 Mon Sep 17 00:00:00 2001 From: danielTari Date: Fri, 9 Jan 2026 09:13:06 +0100 Subject: [PATCH 008/260] chore: [ANDROAPP-7435] deprecate android sdk 21 and 22 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a9e97a57276..ee5dac35a56 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,7 +3,7 @@ kotlinxDatetime = "0.7.1-0.6.x-compat" #Needs to be compatible with the Rule eng lifecycleRuntimeCompose = "2.9.6" navigationCompose = "2.9.1" sdk = "36" -minSdk = "21" +minSdk = "23" vCode = "150" vName = "3.4.0-DEV" gradle = "8.13.2" From 28a8f6ff43103fe3bbb4080d2a087f1ccb620041 Mon Sep 17 00:00:00 2001 From: danielTari Date: Fri, 9 Jan 2026 13:15:44 +0100 Subject: [PATCH 009/260] chore: [ANDROAPP-7435] simplify logic depending on deprecated android sdk --- .../java/org/dhis2/bindings/Bindings.java | 9 --- .../dhis2/data/biometric/BiometricUtils.kt | 34 ++++------ .../TeiDashboardMobileActivity.kt | 17 ++--- .../commons/bindings/CommonExtensions.kt | 65 +++++++++---------- .../dialogs/calendarpicker/CalendarPicker.kt | 13 ---- .../dhis2/commons/popupmenu/AppMenuHelper.kt | 7 +- .../network/NetworkStatusProviderImpl.kt | 17 ++--- .../biometrics/CryptographicActions.kt | 4 +- .../login/main/data/LoginRepositoryImpl.kt | 2 +- .../usecase/UpdateBiometricPermission.kt | 27 ++++---- .../dhis2/android/rtsm/utils/LocaleManager.kt | 8 +-- 11 files changed, 74 insertions(+), 129 deletions(-) diff --git a/app/src/main/java/org/dhis2/bindings/Bindings.java b/app/src/main/java/org/dhis2/bindings/Bindings.java index 0354b034f25..60d0a67c159 100644 --- a/app/src/main/java/org/dhis2/bindings/Bindings.java +++ b/app/src/main/java/org/dhis2/bindings/Bindings.java @@ -5,11 +5,9 @@ import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; -import android.os.Build; import android.util.TypedValue; import android.view.View; import android.widget.ImageView; -import android.widget.LinearLayout; import android.widget.TextView; import androidx.appcompat.content.res.AppCompatResources; @@ -168,13 +166,6 @@ public static void setImageBackground(ImageView imageView, Drawable drawable) { } - @BindingAdapter("versionVisibility") - public static void setVisibility(LinearLayout linearLayout, boolean check) { - if (check && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - linearLayout.setVisibility(View.GONE); - } - } - @BindingAdapter("settingIcon") public static void setSettingIcon(ImageView view, int drawableReference) { Drawable drawable = AppCompatResources.getDrawable(view.getContext(), drawableReference); diff --git a/app/src/main/java/org/dhis2/data/biometric/BiometricUtils.kt b/app/src/main/java/org/dhis2/data/biometric/BiometricUtils.kt index 47627d21950..781e1485952 100644 --- a/app/src/main/java/org/dhis2/data/biometric/BiometricUtils.kt +++ b/app/src/main/java/org/dhis2/data/biometric/BiometricUtils.kt @@ -4,7 +4,6 @@ import android.content.Context import android.os.Build import android.security.keystore.KeyGenParameterSpec import android.security.keystore.KeyProperties -import androidx.annotation.RequiresApi import androidx.biometric.BiometricManager import androidx.biometric.BiometricPrompt import androidx.core.content.ContextCompat @@ -93,27 +92,19 @@ class CryptographyManager : CryptographicActions { load(null) } - override fun getInitializedCipherForEncryption(): Cipher? = - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - val cipher = getCipher() - val secretKey = - getOrCreateSecretKey() - - cipher.init(Cipher.ENCRYPT_MODE, secretKey) - cipher - } else { - null - } + override fun getInitializedCipherForEncryption(): Cipher { + val cipher = getCipher() + val secretKey = getOrCreateSecretKey() + cipher.init(Cipher.ENCRYPT_MODE, secretKey) + return cipher + } - override fun getInitializedCipherForDecryption(initializationVector: ByteArray): Cipher? = - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - val cipher = getCipher() - val secretKey = getOrCreateSecretKey() - cipher.init(Cipher.DECRYPT_MODE, secretKey, GCMParameterSpec(128, initializationVector)) - cipher - } else { - null - } + override fun getInitializedCipherForDecryption(initializationVector: ByteArray): Cipher { + val cipher = getCipher() + val secretKey = getOrCreateSecretKey() + cipher.init(Cipher.DECRYPT_MODE, secretKey, GCMParameterSpec(128, initializationVector)) + return cipher + } override fun encryptData( plaintext: String, @@ -136,7 +127,6 @@ class CryptographyManager : CryptographicActions { return Cipher.getInstance(transformation) } - @RequiresApi(Build.VERSION_CODES.M) private fun getOrCreateSecretKey(): SecretKey { // If Secretkey was previously created for that keyName, then grab and return it. keyStore.getKey(KEY_NAME, null)?.let { return it as SecretKey } diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/TeiDashboardMobileActivity.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/TeiDashboardMobileActivity.kt index aeb40312665..4620323adc1 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/TeiDashboardMobileActivity.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/TeiDashboardMobileActivity.kt @@ -3,7 +3,6 @@ package org.dhis2.usescases.teiDashboard import android.app.ActivityOptions import android.content.Context import android.content.Intent -import android.os.Build import android.os.Bundle import android.os.Handler import android.os.Looper @@ -630,15 +629,13 @@ class TeiDashboardMobileActivity : } binding.executePendingBindings() setTheme(themeManager.getProgramTheme()) - if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) { - val window = window - window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) - val typedValue = TypedValue() - val a = obtainStyledAttributes(typedValue.data, intArrayOf(R.attr.colorPrimaryDark)) - val colorToReturn = a.getColor(0, 0) - a.recycle() - window.statusBarColor = colorToReturn - } + val window = window + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) + val typedValue = TypedValue() + val a = obtainStyledAttributes(typedValue.data, intArrayOf(R.attr.colorPrimaryDark)) + val colorToReturn = a.getColor(0, 0) + a.recycle() + window.statusBarColor = colorToReturn } override fun updateNoteBadge(numberOfNotes: Int) { diff --git a/commons/src/main/java/org/dhis2/commons/bindings/CommonExtensions.kt b/commons/src/main/java/org/dhis2/commons/bindings/CommonExtensions.kt index a5bbdcd6ae5..3bf11e76cb1 100644 --- a/commons/src/main/java/org/dhis2/commons/bindings/CommonExtensions.kt +++ b/commons/src/main/java/org/dhis2/commons/bindings/CommonExtensions.kt @@ -5,7 +5,6 @@ import android.graphics.Color import android.graphics.Outline import android.graphics.PorterDuff import android.graphics.Typeface -import android.os.Build import android.text.method.ScrollingMovementMethod import android.util.TypedValue import android.view.View @@ -116,45 +115,41 @@ val Int.px: Int get() = (this / Resources.getSystem().displayMetrics.density).toInt() fun View.clipWithRoundedCorners(curvedRadio: Int = 16.dp) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - outlineProvider = - object : ViewOutlineProvider() { - override fun getOutline( - view: View, - outline: Outline, - ) { - outline.setRoundRect( - 0, - 0, - view.width, - view.height + curvedRadio, - curvedRadio.toFloat(), - ) - } + outlineProvider = + object : ViewOutlineProvider() { + override fun getOutline( + view: View, + outline: Outline, + ) { + outline.setRoundRect( + 0, + 0, + view.width, + view.height + curvedRadio, + curvedRadio.toFloat(), + ) } - clipToOutline = true - } + } + clipToOutline = true } fun View.clipWithAllRoundedCorners(curvedRadio: Int = 16.dp) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - outlineProvider = - object : ViewOutlineProvider() { - override fun getOutline( - view: View, - outline: Outline, - ) { - outline.setRoundRect( - 0, - 0, - view.width, - view.height, - curvedRadio.toFloat(), - ) - } + outlineProvider = + object : ViewOutlineProvider() { + override fun getOutline( + view: View, + outline: Outline, + ) { + outline.setRoundRect( + 0, + 0, + view.width, + view.height, + curvedRadio.toFloat(), + ) } - clipToOutline = true - } + } + clipToOutline = true } fun HorizontalScrollView.scrollToPosition(viewTag: String) { diff --git a/commons/src/main/java/org/dhis2/commons/dialogs/calendarpicker/CalendarPicker.kt b/commons/src/main/java/org/dhis2/commons/dialogs/calendarpicker/CalendarPicker.kt index 97b8897df33..67433ea0706 100644 --- a/commons/src/main/java/org/dhis2/commons/dialogs/calendarpicker/CalendarPicker.kt +++ b/commons/src/main/java/org/dhis2/commons/dialogs/calendarpicker/CalendarPicker.kt @@ -3,12 +3,9 @@ package org.dhis2.commons.dialogs.calendarpicker import android.app.AlertDialog import android.app.Dialog import android.content.Context -import android.os.Build import android.view.LayoutInflater import android.view.View import android.widget.DatePicker -import android.widget.LinearLayout -import androidx.databinding.BindingAdapter import org.dhis2.commons.R import org.dhis2.commons.databinding.CalendarPickerViewBinding import org.dhis2.commons.dialogs.calendarpicker.di.CalendarPickerComponentProvider @@ -174,13 +171,3 @@ class CalendarPicker( } } } - -@BindingAdapter("versionCustomVisibility") -fun setCustomVisibility( - linearLayout: LinearLayout, - check: Boolean, -) { - if (check && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - linearLayout.visibility = View.GONE - } -} diff --git a/commons/src/main/java/org/dhis2/commons/popupmenu/AppMenuHelper.kt b/commons/src/main/java/org/dhis2/commons/popupmenu/AppMenuHelper.kt index 4cec7237932..5f6a19cf9ff 100644 --- a/commons/src/main/java/org/dhis2/commons/popupmenu/AppMenuHelper.kt +++ b/commons/src/main/java/org/dhis2/commons/popupmenu/AppMenuHelper.kt @@ -1,7 +1,6 @@ package org.dhis2.commons.popupmenu import android.content.Context -import android.os.Build import android.view.ContextThemeWrapper import android.view.Gravity import android.view.View @@ -26,11 +25,7 @@ class AppMenuHelper private constructor( fun show() { val contextWrapper = ContextThemeWrapper(context, R.style.PopupMenuMarginStyle) popupMenu = - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) { - PopupMenu(contextWrapper, anchor, Gravity.END, 0, R.style.PopupMenuMarginStyle) - } else { - PopupMenu(contextWrapper, anchor, Gravity.END) - } + PopupMenu(contextWrapper, anchor, Gravity.END, 0, R.style.PopupMenuMarginStyle) try { val fields = popupMenu.javaClass.declaredFields for (field in fields) { diff --git a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/network/NetworkStatusProviderImpl.kt b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/network/NetworkStatusProviderImpl.kt index ba9ed9bb433..02837629b5f 100644 --- a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/network/NetworkStatusProviderImpl.kt +++ b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/network/NetworkStatusProviderImpl.kt @@ -5,7 +5,6 @@ import android.net.ConnectivityManager import android.net.Network import android.net.NetworkCapabilities import android.net.NetworkRequest -import android.os.Build import androidx.annotation.RequiresPermission import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow @@ -24,11 +23,8 @@ class NetworkStatusProviderImpl( NetworkRequest .Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - .also { builder -> - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - builder.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) - } - }.build() + .addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) + .build() private val availableNetworks = mutableSetOf() @@ -77,13 +73,8 @@ class NetworkStatusProviderImpl( @RequiresPermission("android.permission.ACCESS_NETWORK_STATE") private fun ConnectivityManager.getCurrentNetworkState(): Boolean { - @Suppress("DEPRECATION") - return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { - activeNetworkInfo?.isConnected == true - } else { - val networkCapabilities = getNetworkCapabilities(activeNetwork) - networkCapabilities?.asNetworkState() ?: false - } + val networkCapabilities = getNetworkCapabilities(activeNetwork) + return networkCapabilities?.asNetworkState() ?: false } private fun NetworkCapabilities.asNetworkState(): Boolean = hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/biometrics/CryptographicActions.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/biometrics/CryptographicActions.kt index 9146451a323..fa04f543535 100644 --- a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/biometrics/CryptographicActions.kt +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/biometrics/CryptographicActions.kt @@ -3,9 +3,9 @@ package org.dhis2.mobile.commons.biometrics import javax.crypto.Cipher interface CryptographicActions { - fun getInitializedCipherForEncryption(): Cipher? + fun getInitializedCipherForEncryption(): Cipher - fun getInitializedCipherForDecryption(initializationVector: ByteArray): Cipher? + fun getInitializedCipherForDecryption(initializationVector: ByteArray): Cipher fun encryptData( plaintext: String, diff --git a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt index 272979b548e..068cd2faf6c 100644 --- a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt +++ b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt @@ -264,7 +264,7 @@ class LoginRepositoryImpl( preferences.getBiometricCredentials()?.let { ciphertextWrapper -> cryptographyManager .getInitializedCipherForDecryption(ciphertextWrapper.initializationVector) - ?.let { cipher -> + .let { cipher -> suspendCancellableCoroutine { continuation -> authenticator.authenticate(cipher) { cipher -> val pass = diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/UpdateBiometricPermission.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/UpdateBiometricPermission.kt index 71aa7cb3eaf..b9cf84f5d14 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/UpdateBiometricPermission.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/UpdateBiometricPermission.kt @@ -32,20 +32,19 @@ class UpdateBiometricPermission( val cancellationMessage = getString(Res.string.biometrics_permission_cancelled) suspendCancellableCoroutine { continuation -> val scope = CoroutineScope(continuation.context) - cryptographics.getInitializedCipherForEncryption()?.let { - biometrics.authenticate(it) { cryptoObjectCipher -> - scope.launch { - val ciphertextWrapper = - cryptographics.encryptData(password, cryptoObjectCipher) - preferences.saveUserCredentialsAndCipher( - serverUrl, - username, - ciphertextWrapper, - ) - loginRepository.updateBiometricsPermissions(granted) - if (continuation.isActive) { - continuation.resume(Result.success(Unit)) - } + val cipher = cryptographics.getInitializedCipherForEncryption() + biometrics.authenticate(cipher) { cryptoObjectCipher -> + scope.launch { + val ciphertextWrapper = + cryptographics.encryptData(password, cryptoObjectCipher) + preferences.saveUserCredentialsAndCipher( + serverUrl, + username, + ciphertextWrapper, + ) + loginRepository.updateBiometricsPermissions(granted) + if (continuation.isActive) { + continuation.resume(Result.success(Unit)) } } } diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/utils/LocaleManager.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/utils/LocaleManager.kt index a3765cacb0a..e027631b994 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/utils/LocaleManager.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/utils/LocaleManager.kt @@ -28,10 +28,10 @@ class LocaleManager { ): Context { val config = updateConfiguration(context, language) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - return context.createConfigurationContext(config) + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + context.createConfigurationContext(config) } else { - return context + context } } @@ -44,7 +44,7 @@ class LocaleManager { val resources = context.resources val config = Configuration(resources.configuration) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { val localeList = LocaleList(newLocale) LocaleList.setDefault(localeList) config.setLocales(localeList) // additionally sets the layout direction From 5dc741d29f356104f40363bcbab5de5cbf447ef1 Mon Sep 17 00:00:00 2001 From: danielTari Date: Fri, 9 Jan 2026 14:44:40 +0100 Subject: [PATCH 010/260] chore: [ANDROAPP-7435] fix kapt error --- .../main/res/layout/calendar_picker_view.xml | 1 - .../login/main/data/LoginRepositoryImpl.kt | 28 +++++++++---------- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/commons/src/main/res/layout/calendar_picker_view.xml b/commons/src/main/res/layout/calendar_picker_view.xml index 9e0dae8fcbf..65fdbd8f1c5 100644 --- a/commons/src/main/res/layout/calendar_picker_view.xml +++ b/commons/src/main/res/layout/calendar_picker_view.xml @@ -31,7 +31,6 @@ diff --git a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt index 068cd2faf6c..bff29e25242 100644 --- a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt +++ b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt @@ -262,23 +262,21 @@ class LoginRepositoryImpl( override suspend fun loginWithBiometric(): kotlin.Result = withContext(dispatcher.main) { preferences.getBiometricCredentials()?.let { ciphertextWrapper -> - cryptographyManager + val cipher = cryptographyManager .getInitializedCipherForDecryption(ciphertextWrapper.initializationVector) - .let { cipher -> - suspendCancellableCoroutine { continuation -> - authenticator.authenticate(cipher) { cipher -> - val pass = - cryptographyManager.decryptData( - ciphertextWrapper.ciphertext, - cipher, - ) - continuation.resume(value = kotlin.Result.success(pass)) { _, _, _ -> } - } - continuation.invokeOnCancellation { - // If needed perform action on cancellation - } - } + suspendCancellableCoroutine { continuation -> + authenticator.authenticate(cipher) { cipher -> + val pass = + cryptographyManager.decryptData( + ciphertextWrapper.ciphertext, + cipher, + ) + continuation.resume(value = kotlin.Result.success(pass)) { _, _, _ -> } + } + continuation.invokeOnCancellation { + // If needed perform action on cancellation } + } } ?: kotlin.Result.failure(Exception("No biometrics found")) } From 8fcfc0bc5d54c430816e6c1c9e6f99f01285a302 Mon Sep 17 00:00:00 2001 From: danielTari Date: Fri, 9 Jan 2026 16:05:30 +0100 Subject: [PATCH 011/260] chore: [ANDROAPP-7435] fix ktlint complaints --- .../login/main/data/LoginRepositoryImpl.kt | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt index bff29e25242..068cd2faf6c 100644 --- a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt +++ b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt @@ -262,21 +262,23 @@ class LoginRepositoryImpl( override suspend fun loginWithBiometric(): kotlin.Result = withContext(dispatcher.main) { preferences.getBiometricCredentials()?.let { ciphertextWrapper -> - val cipher = cryptographyManager + cryptographyManager .getInitializedCipherForDecryption(ciphertextWrapper.initializationVector) - suspendCancellableCoroutine { continuation -> - authenticator.authenticate(cipher) { cipher -> - val pass = - cryptographyManager.decryptData( - ciphertextWrapper.ciphertext, - cipher, - ) - continuation.resume(value = kotlin.Result.success(pass)) { _, _, _ -> } - } - continuation.invokeOnCancellation { - // If needed perform action on cancellation + .let { cipher -> + suspendCancellableCoroutine { continuation -> + authenticator.authenticate(cipher) { cipher -> + val pass = + cryptographyManager.decryptData( + ciphertextWrapper.ciphertext, + cipher, + ) + continuation.resume(value = kotlin.Result.success(pass)) { _, _, _ -> } + } + continuation.invokeOnCancellation { + // If needed perform action on cancellation + } + } } - } } ?: kotlin.Result.failure(Exception("No biometrics found")) } From a090fd6fc88b72d94ad371b30ee199c233ddd3b8 Mon Sep 17 00:00:00 2001 From: danielTari Date: Tue, 13 Jan 2026 10:37:19 +0100 Subject: [PATCH 012/260] chore: [ANDROAPP-7435] simplify version logic --- .../main/java/org/dhis2/android/rtsm/utils/LocaleManager.kt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/utils/LocaleManager.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/utils/LocaleManager.kt index e027631b994..1a15c9646c2 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/utils/LocaleManager.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/utils/LocaleManager.kt @@ -28,11 +28,7 @@ class LocaleManager { ): Context { val config = updateConfiguration(context, language) - return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - context.createConfigurationContext(config) - } else { - context - } + return context.createConfigurationContext(config) } @JvmStatic From e425b513cc14502102003fb2e246b8d53582462d Mon Sep 17 00:00:00 2001 From: Pablo Date: Tue, 13 Jan 2026 13:45:59 +0100 Subject: [PATCH 013/260] build: [ANDROAPP-7434] remove ui components [skip size] (#4573) --- .tx/config | 8 --- .../dhis2/usescases/datasets/DataSetTest.kt | 9 ++- .../teidashboard/TeiDashboardTest.kt | 24 ++++--- .../teidashboard/robot/EnrollmentRobot.kt | 8 ++- .../utils/granularsync/SyncStatusDialog.kt | 2 +- .../utils/granularsync/SyncStatusItem.kt | 2 +- commons/build.gradle.kts | 1 - .../commons/bindings/TEICardExtensions.kt | 2 +- .../dialogs/bottomsheet/BottomSheetDialog.kt | 2 +- .../bottomsheet/BottomSheetDialogContent.kt | 2 +- .../bottomsheet/DeleteBottomSheetDialog.kt | 2 +- .../dialogs/bottomsheet/DialogButtonStyle.kt | 2 +- .../src/main/res/drawable/ic_delete.xml | 0 .../main/res/drawable/ic_error_outline.xml | 0 .../res/drawable/ic_event_status_complete.xml | 0 .../src/main/res/drawable/ic_file.xml | 0 .../main/res/drawable/ic_file_download.xml | 0 .../main/res/drawable/ic_home_negative.xml | 0 .../src/main/res/drawable/ic_home_outline.xml | 0 .../main/res/drawable/ic_home_positive.xml | 0 .../src/main/res/drawable/ic_input_info.xml | 0 .../src/main/res/drawable/ic_saved_check.xml | 0 .../main/res/drawable/ic_tree_node_close.xml | 0 .../res/drawable/ic_tree_node_default.xml | 0 .../main/res/drawable/ic_tree_node_open.xml | 0 .../main/res/drawable/ic_warning_alert.xml | 0 .../main/res/drawable/image_not_supported.xml | 0 commons/src/main/res/values-ar/strings.xml | 3 +- commons/src/main/res/values-cs/strings.xml | 1 + commons/src/main/res/values-es/strings.xml | 3 +- commons/src/main/res/values-fr/strings.xml | 3 +- commons/src/main/res/values-nb/strings.xml | 3 +- .../src/main/res/values-pt-rBR/strings.xml | 2 +- commons/src/main/res/values-pt/strings.xml | 3 +- commons/src/main/res/values-ru/strings.xml | 3 +- commons/src/main/res/values-sv/strings.xml | 3 +- .../src/main/res/values-uz-rUZ/strings.xml | 3 +- commons/src/main/res/values-uz/strings.xml | 3 +- commons/src/main/res/values-vi/strings.xml | 1 + .../src/main/res/values-zh-rCN/strings.xml | 3 +- commons/src/main/res/values-zh/strings.xml | 1 + commons/src/main/res/values/strings.xml | 2 + commons/src/main/res/values/styles.xml | 8 +++ .../analytics/charts/mappers/GraphToTable.kt | 2 +- gradle/libs.versions.toml | 4 -- settings.gradle.kts | 2 +- stock-usecase/build.gradle.kts | 2 + ui-components/.gitignore | 1 - ui-components/build.gradle.kts | 60 ------------------ ui-components/consumer-rules.pro | 0 ui-components/proguard-rules.pro | 21 ------ .../src/main/res/drawable/ic_add_image.xml | 9 --- .../src/main/res/font/rubik_bold.ttf | Bin 143356 -> 0 bytes .../src/main/res/font/rubik_light.ttf | Bin 136816 -> 0 bytes .../src/main/res/font/rubik_medium.ttf | Bin 135760 -> 0 bytes .../src/main/res/font/rubik_regular.ttf | Bin 140732 -> 0 bytes ui-components/src/main/res/raw/warning.json | 1 - .../src/main/res/values-ar-rEG/strings.xml | 5 -- .../src/main/res/values-ar-rIQ/strings.xml | 10 --- .../src/main/res/values-ar/strings.xml | 32 ---------- .../src/main/res/values-ckb/strings.xml | 11 ---- .../src/main/res/values-cs/strings.xml | 29 --------- .../src/main/res/values-da/strings.xml | 8 --- .../src/main/res/values-es-rES/strings.xml | 15 ----- .../src/main/res/values-es/strings.xml | 27 -------- .../src/main/res/values-fr/strings.xml | 26 -------- .../src/main/res/values-hi-rIN/strings.xml | 15 ----- .../src/main/res/values-id/strings.xml | 12 ---- .../src/main/res/values-km/strings.xml | 13 ---- .../src/main/res/values-lo/strings.xml | 18 ------ .../src/main/res/values-my/strings.xml | 10 --- .../src/main/res/values-nb/strings.xml | 14 ---- .../src/main/res/values-ne/strings.xml | 6 -- .../src/main/res/values-nl/strings.xml | 23 ------- .../src/main/res/values-or/strings.xml | 4 -- .../src/main/res/values-prs/strings.xml | 11 ---- .../src/main/res/values-ps/strings.xml | 11 ---- .../src/main/res/values-pt-rBR/strings.xml | 12 ---- .../src/main/res/values-pt/strings.xml | 27 -------- .../src/main/res/values-ro/strings.xml | 9 --- .../src/main/res/values-ru/strings.xml | 28 -------- .../src/main/res/values-si/strings.xml | 8 --- .../src/main/res/values-sv/strings.xml | 13 ---- .../src/main/res/values-tet/strings.xml | 9 --- .../src/main/res/values-tg/strings.xml | 11 ---- .../src/main/res/values-uk/strings.xml | 3 - .../src/main/res/values-ur/strings.xml | 11 ---- .../src/main/res/values-uz-rUZ/strings.xml | 14 ---- .../src/main/res/values-uz/strings.xml | 23 ------- .../src/main/res/values-vi/strings.xml | 23 ------- .../src/main/res/values-zh-rCN/strings.xml | 23 ------- .../src/main/res/values-zh/strings.xml | 23 ------- ui-components/src/main/res/values/colors.xml | 2 - ui-components/src/main/res/values/strings.xml | 26 -------- ui-components/src/main/res/values/styles.xml | 10 --- 95 files changed, 67 insertions(+), 719 deletions(-) rename {ui-components => commons}/src/main/res/drawable/ic_delete.xml (100%) rename {ui-components => commons}/src/main/res/drawable/ic_error_outline.xml (100%) rename {ui-components => commons}/src/main/res/drawable/ic_event_status_complete.xml (100%) rename {ui-components => commons}/src/main/res/drawable/ic_file.xml (100%) rename {ui-components => commons}/src/main/res/drawable/ic_file_download.xml (100%) rename {ui-components => commons}/src/main/res/drawable/ic_home_negative.xml (100%) rename {ui-components => commons}/src/main/res/drawable/ic_home_outline.xml (100%) rename {ui-components => commons}/src/main/res/drawable/ic_home_positive.xml (100%) rename {ui-components => commons}/src/main/res/drawable/ic_input_info.xml (100%) rename {ui-components => commons}/src/main/res/drawable/ic_saved_check.xml (100%) rename {ui-components => commons}/src/main/res/drawable/ic_tree_node_close.xml (100%) rename {ui-components => commons}/src/main/res/drawable/ic_tree_node_default.xml (100%) rename {ui-components => commons}/src/main/res/drawable/ic_tree_node_open.xml (100%) rename {ui-components => commons}/src/main/res/drawable/ic_warning_alert.xml (100%) rename {ui-components => commons}/src/main/res/drawable/image_not_supported.xml (100%) delete mode 100644 ui-components/.gitignore delete mode 100644 ui-components/build.gradle.kts delete mode 100644 ui-components/consumer-rules.pro delete mode 100644 ui-components/proguard-rules.pro delete mode 100644 ui-components/src/main/res/drawable/ic_add_image.xml delete mode 100644 ui-components/src/main/res/font/rubik_bold.ttf delete mode 100644 ui-components/src/main/res/font/rubik_light.ttf delete mode 100644 ui-components/src/main/res/font/rubik_medium.ttf delete mode 100644 ui-components/src/main/res/font/rubik_regular.ttf delete mode 100644 ui-components/src/main/res/raw/warning.json delete mode 100644 ui-components/src/main/res/values-ar-rEG/strings.xml delete mode 100644 ui-components/src/main/res/values-ar-rIQ/strings.xml delete mode 100644 ui-components/src/main/res/values-ar/strings.xml delete mode 100644 ui-components/src/main/res/values-ckb/strings.xml delete mode 100644 ui-components/src/main/res/values-cs/strings.xml delete mode 100644 ui-components/src/main/res/values-da/strings.xml delete mode 100644 ui-components/src/main/res/values-es-rES/strings.xml delete mode 100644 ui-components/src/main/res/values-es/strings.xml delete mode 100644 ui-components/src/main/res/values-fr/strings.xml delete mode 100644 ui-components/src/main/res/values-hi-rIN/strings.xml delete mode 100644 ui-components/src/main/res/values-id/strings.xml delete mode 100644 ui-components/src/main/res/values-km/strings.xml delete mode 100644 ui-components/src/main/res/values-lo/strings.xml delete mode 100644 ui-components/src/main/res/values-my/strings.xml delete mode 100644 ui-components/src/main/res/values-nb/strings.xml delete mode 100644 ui-components/src/main/res/values-ne/strings.xml delete mode 100644 ui-components/src/main/res/values-nl/strings.xml delete mode 100644 ui-components/src/main/res/values-or/strings.xml delete mode 100644 ui-components/src/main/res/values-prs/strings.xml delete mode 100644 ui-components/src/main/res/values-ps/strings.xml delete mode 100644 ui-components/src/main/res/values-pt-rBR/strings.xml delete mode 100644 ui-components/src/main/res/values-pt/strings.xml delete mode 100644 ui-components/src/main/res/values-ro/strings.xml delete mode 100644 ui-components/src/main/res/values-ru/strings.xml delete mode 100644 ui-components/src/main/res/values-si/strings.xml delete mode 100644 ui-components/src/main/res/values-sv/strings.xml delete mode 100644 ui-components/src/main/res/values-tet/strings.xml delete mode 100644 ui-components/src/main/res/values-tg/strings.xml delete mode 100644 ui-components/src/main/res/values-uk/strings.xml delete mode 100644 ui-components/src/main/res/values-ur/strings.xml delete mode 100644 ui-components/src/main/res/values-uz-rUZ/strings.xml delete mode 100644 ui-components/src/main/res/values-uz/strings.xml delete mode 100644 ui-components/src/main/res/values-vi/strings.xml delete mode 100644 ui-components/src/main/res/values-zh-rCN/strings.xml delete mode 100644 ui-components/src/main/res/values-zh/strings.xml delete mode 100644 ui-components/src/main/res/values/colors.xml delete mode 100644 ui-components/src/main/res/values/strings.xml delete mode 100644 ui-components/src/main/res/values/styles.xml diff --git a/.tx/config b/.tx/config index af74d17517a..1041abf2e4c 100644 --- a/.tx/config +++ b/.tx/config @@ -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-/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-/strings.xml source_file = compose-table/src/main/res/values/strings.xml diff --git a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt index fddab093aa3..6a7fe071478 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt @@ -306,6 +306,7 @@ class DataSetTest : BaseTest() { val cellId = "PGRlPlhOcmpYcVpySEQ4Ojxjb2M+SGxsdlg1MGNYQzA=" val threeDaysFromNowStr = threeDaysFromNow.format(formatter) val fiveDaysAgoStr = fiveDaysAgo.format(formatter) + enterDataSetStep( uid = dataSetUid, name = dataSetName, @@ -317,10 +318,7 @@ class DataSetTest : BaseTest() { ) checkTableIsNotEditable() - dataSetTableRobot(composeTestRule) { - tapOnSaveButton() - } - composeTestRule.waitForIdle() + createDailyPeriodDataSetInstanceStep( date = threeDaysFromNowStr, orgUnit = orgUnit, @@ -381,8 +379,9 @@ class DataSetTest : BaseTest() { composeTestRule.onNodeWithTag("TABLE_SCROLLABLE_COLUMN").printToLog("TABLE_LOG") dataSetTableRobot(composeTestRule) { checkItemWithTextIsDisplayed("This data is not editable") + tapOnSaveButton() + composeTestRule.waitForIdle() } - composeTestRule.waitForIdle() } private suspend fun checkContentBoxesAreDisplayed() { diff --git a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/TeiDashboardTest.kt b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/TeiDashboardTest.kt index 93c3c49e54f..1e67d65ca19 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/TeiDashboardTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/TeiDashboardTest.kt @@ -339,23 +339,21 @@ class TeiDashboardTest : BaseTest() { clickOnTimelineEvents() clickOnMenuMoreOptions() clickOnMenuProgramEnrollments() - } - enrollmentRobot(composeTestRule) { - clickOnAProgramForEnrollment(composeTestRule, womanProgram) - clickOnAcceptInDatePicker() + enrollmentRobot(composeTestRule) { + clickOnAProgramForEnrollment(composeTestRule, womanProgram) + clickOnAcceptInDatePicker() - orgUnitSelectorRobot(composeTestRule) { - selectTreeOrgUnit(orgUnit) - } + orgUnitSelectorRobot(composeTestRule) { + selectTreeOrgUnit(orgUnit) + } - waitUntilActivityVisible() - openFormSection(personAttribute) - typeOnInputDateField("01012000", "Date of birth") - clickOnSaveEnrollment() - } + waitUntilActivityVisible() + openFormSection(personAttribute) + typeOnInputDateField("01012000", "Date of birth") + clickOnSaveEnrollment() + } - teiDashboardRobot(composeTestRule) { waitToDebounce(1000) clickOnMenuMoreOptions() clickOnTimelineEvents() diff --git a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/EnrollmentRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/EnrollmentRobot.kt index 1941f23e3db..1a95d437aa5 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/EnrollmentRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/EnrollmentRobot.kt @@ -40,9 +40,15 @@ fun enrollmentRobot( class EnrollmentRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { + @OptIn(ExperimentalTestApi::class) fun clickOnAProgramForEnrollment(composeTestRule: ComposeTestRule, program: String) { + val testTag = PROGRAM_TO_ENROLL.format(program) composeTestRule.waitForIdle() - composeTestRule.onNodeWithTag(PROGRAM_TO_ENROLL.format(program), useUnmergedTree = true) + composeTestRule.waitUntilAtLeastOneExists( + hasTestTag(testTag), + TIMEOUT + ) + composeTestRule.onNodeWithTag(testTag, useUnmergedTree = true) .performClick() composeTestRule.waitForIdle() } diff --git a/app/src/main/java/org/dhis2/utils/granularsync/SyncStatusDialog.kt b/app/src/main/java/org/dhis2/utils/granularsync/SyncStatusDialog.kt index b37d679c104..ea90a4b0dd3 100644 --- a/app/src/main/java/org/dhis2/utils/granularsync/SyncStatusDialog.kt +++ b/app/src/main/java/org/dhis2/utils/granularsync/SyncStatusDialog.kt @@ -90,7 +90,7 @@ class SyncStatusDialog : override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setStyle(STYLE_NORMAL, org.dhis2.ui.R.style.CustomBottomSheetDialogTheme) + setStyle(STYLE_NORMAL, org.dhis2.commons.R.style.CustomBottomSheetDialogTheme) } override fun onCreateView( diff --git a/app/src/main/java/org/dhis2/utils/granularsync/SyncStatusItem.kt b/app/src/main/java/org/dhis2/utils/granularsync/SyncStatusItem.kt index 7d87562e767..a0557714a75 100644 --- a/app/src/main/java/org/dhis2/utils/granularsync/SyncStatusItem.kt +++ b/app/src/main/java/org/dhis2/utils/granularsync/SyncStatusItem.kt @@ -18,7 +18,7 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.vectorResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import org.dhis2.ui.R +import org.dhis2.commons.R @Composable fun SyncStatusItem( diff --git a/commons/build.gradle.kts b/commons/build.gradle.kts index da9af0110d0..e7f6e7c3bd6 100644 --- a/commons/build.gradle.kts +++ b/commons/build.gradle.kts @@ -63,7 +63,6 @@ kotlin { dependencies { implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) - api(project(":ui-components")) implementation(project(":commonskmm")) api(libs.dhis2.android.sdk) { diff --git a/commons/src/main/java/org/dhis2/commons/bindings/TEICardExtensions.kt b/commons/src/main/java/org/dhis2/commons/bindings/TEICardExtensions.kt index 1e8c74bf814..a3974ce22b0 100644 --- a/commons/src/main/java/org/dhis2/commons/bindings/TEICardExtensions.kt +++ b/commons/src/main/java/org/dhis2/commons/bindings/TEICardExtensions.kt @@ -146,7 +146,7 @@ private fun SquareWithNumber(number: Int) { text = "+$number", color = "#6f6f6f".toColor(), textAlign = TextAlign.Center, - fontFamily = FontFamily(Font(org.dhis2.ui.R.font.rubik_regular)), + fontFamily = FontFamily(Font(R.font.rubik_regular)), ) } } diff --git a/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/BottomSheetDialog.kt b/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/BottomSheetDialog.kt index 411f9948d65..fa052662cd2 100644 --- a/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/BottomSheetDialog.kt +++ b/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/BottomSheetDialog.kt @@ -28,7 +28,7 @@ import androidx.compose.ui.text.style.TextDecoration import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialogFragment -import org.dhis2.ui.R +import org.dhis2.commons.R import org.hisp.dhis.mobile.ui.designsystem.component.BottomSheetShell import org.hisp.dhis.mobile.ui.designsystem.component.Button import org.hisp.dhis.mobile.ui.designsystem.component.ButtonBlock diff --git a/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/BottomSheetDialogContent.kt b/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/BottomSheetDialogContent.kt index 9f18de0dcb7..f1ab514d53a 100644 --- a/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/BottomSheetDialogContent.kt +++ b/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/BottomSheetDialogContent.kt @@ -39,7 +39,7 @@ import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import org.dhis2.ui.R +import org.dhis2.commons.R import org.hisp.dhis.mobile.ui.designsystem.component.Button import org.hisp.dhis.mobile.ui.designsystem.component.ButtonStyle import org.hisp.dhis.mobile.ui.designsystem.theme.TextColor diff --git a/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/DeleteBottomSheetDialog.kt b/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/DeleteBottomSheetDialog.kt index fd31a01b0d0..112d4979088 100644 --- a/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/DeleteBottomSheetDialog.kt +++ b/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/DeleteBottomSheetDialog.kt @@ -15,7 +15,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ViewCompositionStrategy import com.google.android.material.bottomsheet.BottomSheetDialogFragment -import org.dhis2.ui.R +import org.dhis2.commons.R import org.hisp.dhis.mobile.ui.designsystem.component.BottomSheetShell import org.hisp.dhis.mobile.ui.designsystem.component.Button import org.hisp.dhis.mobile.ui.designsystem.component.ButtonBlock diff --git a/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/DialogButtonStyle.kt b/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/DialogButtonStyle.kt index 6261f09a93d..d372c0e526d 100644 --- a/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/DialogButtonStyle.kt +++ b/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/DialogButtonStyle.kt @@ -1,7 +1,7 @@ package org.dhis2.commons.dialogs.bottomsheet import androidx.compose.ui.graphics.Color -import org.dhis2.ui.R +import org.dhis2.commons.R import org.hisp.dhis.mobile.ui.designsystem.component.ButtonStyle import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor diff --git a/ui-components/src/main/res/drawable/ic_delete.xml b/commons/src/main/res/drawable/ic_delete.xml similarity index 100% rename from ui-components/src/main/res/drawable/ic_delete.xml rename to commons/src/main/res/drawable/ic_delete.xml diff --git a/ui-components/src/main/res/drawable/ic_error_outline.xml b/commons/src/main/res/drawable/ic_error_outline.xml similarity index 100% rename from ui-components/src/main/res/drawable/ic_error_outline.xml rename to commons/src/main/res/drawable/ic_error_outline.xml diff --git a/ui-components/src/main/res/drawable/ic_event_status_complete.xml b/commons/src/main/res/drawable/ic_event_status_complete.xml similarity index 100% rename from ui-components/src/main/res/drawable/ic_event_status_complete.xml rename to commons/src/main/res/drawable/ic_event_status_complete.xml diff --git a/ui-components/src/main/res/drawable/ic_file.xml b/commons/src/main/res/drawable/ic_file.xml similarity index 100% rename from ui-components/src/main/res/drawable/ic_file.xml rename to commons/src/main/res/drawable/ic_file.xml diff --git a/ui-components/src/main/res/drawable/ic_file_download.xml b/commons/src/main/res/drawable/ic_file_download.xml similarity index 100% rename from ui-components/src/main/res/drawable/ic_file_download.xml rename to commons/src/main/res/drawable/ic_file_download.xml diff --git a/ui-components/src/main/res/drawable/ic_home_negative.xml b/commons/src/main/res/drawable/ic_home_negative.xml similarity index 100% rename from ui-components/src/main/res/drawable/ic_home_negative.xml rename to commons/src/main/res/drawable/ic_home_negative.xml diff --git a/ui-components/src/main/res/drawable/ic_home_outline.xml b/commons/src/main/res/drawable/ic_home_outline.xml similarity index 100% rename from ui-components/src/main/res/drawable/ic_home_outline.xml rename to commons/src/main/res/drawable/ic_home_outline.xml diff --git a/ui-components/src/main/res/drawable/ic_home_positive.xml b/commons/src/main/res/drawable/ic_home_positive.xml similarity index 100% rename from ui-components/src/main/res/drawable/ic_home_positive.xml rename to commons/src/main/res/drawable/ic_home_positive.xml diff --git a/ui-components/src/main/res/drawable/ic_input_info.xml b/commons/src/main/res/drawable/ic_input_info.xml similarity index 100% rename from ui-components/src/main/res/drawable/ic_input_info.xml rename to commons/src/main/res/drawable/ic_input_info.xml diff --git a/ui-components/src/main/res/drawable/ic_saved_check.xml b/commons/src/main/res/drawable/ic_saved_check.xml similarity index 100% rename from ui-components/src/main/res/drawable/ic_saved_check.xml rename to commons/src/main/res/drawable/ic_saved_check.xml diff --git a/ui-components/src/main/res/drawable/ic_tree_node_close.xml b/commons/src/main/res/drawable/ic_tree_node_close.xml similarity index 100% rename from ui-components/src/main/res/drawable/ic_tree_node_close.xml rename to commons/src/main/res/drawable/ic_tree_node_close.xml diff --git a/ui-components/src/main/res/drawable/ic_tree_node_default.xml b/commons/src/main/res/drawable/ic_tree_node_default.xml similarity index 100% rename from ui-components/src/main/res/drawable/ic_tree_node_default.xml rename to commons/src/main/res/drawable/ic_tree_node_default.xml diff --git a/ui-components/src/main/res/drawable/ic_tree_node_open.xml b/commons/src/main/res/drawable/ic_tree_node_open.xml similarity index 100% rename from ui-components/src/main/res/drawable/ic_tree_node_open.xml rename to commons/src/main/res/drawable/ic_tree_node_open.xml diff --git a/ui-components/src/main/res/drawable/ic_warning_alert.xml b/commons/src/main/res/drawable/ic_warning_alert.xml similarity index 100% rename from ui-components/src/main/res/drawable/ic_warning_alert.xml rename to commons/src/main/res/drawable/ic_warning_alert.xml diff --git a/ui-components/src/main/res/drawable/image_not_supported.xml b/commons/src/main/res/drawable/image_not_supported.xml similarity index 100% rename from ui-components/src/main/res/drawable/image_not_supported.xml rename to commons/src/main/res/drawable/image_not_supported.xml diff --git a/commons/src/main/res/values-ar/strings.xml b/commons/src/main/res/values-ar/strings.xml index 3259c450693..149d9166be8 100644 --- a/commons/src/main/res/values-ar/strings.xml +++ b/commons/src/main/res/values-ar/strings.xml @@ -250,4 +250,5 @@ ربع السنة ستة أشهر سنة - + تنظيف الكل + diff --git a/commons/src/main/res/values-cs/strings.xml b/commons/src/main/res/values-cs/strings.xml index c05ca45ae64..433479b5f2a 100644 --- a/commons/src/main/res/values-cs/strings.xml +++ b/commons/src/main/res/values-cs/strings.xml @@ -329,4 +329,5 @@ Import databáze se nezdařil Neplatný soubor Není v režimu registrace TOTP 2FA + Vymazat vše diff --git a/commons/src/main/res/values-es/strings.xml b/commons/src/main/res/values-es/strings.xml index fa1b681c9da..7677a34705d 100644 --- a/commons/src/main/res/values-es/strings.xml +++ b/commons/src/main/res/values-es/strings.xml @@ -347,4 +347,5 @@ No hay periodos disponibles\n Importación de la base de datos fallida Archivo no válido - + Limpiar todo + diff --git a/commons/src/main/res/values-fr/strings.xml b/commons/src/main/res/values-fr/strings.xml index 0007a893d5d..72f5db28171 100644 --- a/commons/src/main/res/values-fr/strings.xml +++ b/commons/src/main/res/values-fr/strings.xml @@ -220,4 +220,5 @@ Mois Trimestre Année - + Tout effacer + diff --git a/commons/src/main/res/values-nb/strings.xml b/commons/src/main/res/values-nb/strings.xml index ea9b4ffa21a..315bebd06d5 100644 --- a/commons/src/main/res/values-nb/strings.xml +++ b/commons/src/main/res/values-nb/strings.xml @@ -154,4 +154,5 @@ Måned Kvartal År - + Fjern alt + diff --git a/commons/src/main/res/values-pt-rBR/strings.xml b/commons/src/main/res/values-pt-rBR/strings.xml index 8708140ea77..29debb34bfb 100644 --- a/commons/src/main/res/values-pt-rBR/strings.xml +++ b/commons/src/main/res/values-pt-rBR/strings.xml @@ -74,4 +74,4 @@ Semana Mês Ano - + diff --git a/commons/src/main/res/values-pt/strings.xml b/commons/src/main/res/values-pt/strings.xml index df8ac8934cb..39a2d819503 100644 --- a/commons/src/main/res/values-pt/strings.xml +++ b/commons/src/main/res/values-pt/strings.xml @@ -273,4 +273,5 @@ Mês Trimestral Ano - + Limpar tudo + diff --git a/commons/src/main/res/values-ru/strings.xml b/commons/src/main/res/values-ru/strings.xml index 3325067de3d..1961a02d8e8 100644 --- a/commons/src/main/res/values-ru/strings.xml +++ b/commons/src/main/res/values-ru/strings.xml @@ -332,4 +332,5 @@ Квартал Год Нет доступных периодов - + Очистить все + diff --git a/commons/src/main/res/values-sv/strings.xml b/commons/src/main/res/values-sv/strings.xml index 20f9a44f588..95291c34402 100644 --- a/commons/src/main/res/values-sv/strings.xml +++ b/commons/src/main/res/values-sv/strings.xml @@ -78,4 +78,5 @@ Ta bort Dagligen År - + Rensa alla + diff --git a/commons/src/main/res/values-uz-rUZ/strings.xml b/commons/src/main/res/values-uz-rUZ/strings.xml index a119ce757b7..08d9efbf1e3 100644 --- a/commons/src/main/res/values-uz-rUZ/strings.xml +++ b/commons/src/main/res/values-uz-rUZ/strings.xml @@ -136,4 +136,5 @@ Кунлик Hafta Yil - + Barchasini tozalash + diff --git a/commons/src/main/res/values-uz/strings.xml b/commons/src/main/res/values-uz/strings.xml index 3965897d0ef..035658fff84 100644 --- a/commons/src/main/res/values-uz/strings.xml +++ b/commons/src/main/res/values-uz/strings.xml @@ -168,4 +168,5 @@ Ой Чорак Йил - + Барчасини тозалаш + diff --git a/commons/src/main/res/values-vi/strings.xml b/commons/src/main/res/values-vi/strings.xml index 5f6402a327a..b8f0ab5403d 100644 --- a/commons/src/main/res/values-vi/strings.xml +++ b/commons/src/main/res/values-vi/strings.xml @@ -271,4 +271,5 @@ Nhập cơ sở dữ liệu không thành công Tệp không hợp lệ Không ở chế độ đăng ký TOTP 2FA + Xóa tất cả diff --git a/commons/src/main/res/values-zh-rCN/strings.xml b/commons/src/main/res/values-zh-rCN/strings.xml index e9ed97e50eb..6b655484185 100644 --- a/commons/src/main/res/values-zh-rCN/strings.xml +++ b/commons/src/main/res/values-zh-rCN/strings.xml @@ -329,4 +329,5 @@ 财政年度 无可用时段 - + 全清除 + diff --git a/commons/src/main/res/values-zh/strings.xml b/commons/src/main/res/values-zh/strings.xml index f0a63a42cb1..296cd3050b1 100644 --- a/commons/src/main/res/values-zh/strings.xml +++ b/commons/src/main/res/values-zh/strings.xml @@ -332,4 +332,5 @@ 数据库导入失败 无效文件 未进入 TOTP 2FA 注册模式 + 全清除 diff --git a/commons/src/main/res/values/strings.xml b/commons/src/main/res/values/strings.xml index 0ff4f103756..fa7ec938076 100644 --- a/commons/src/main/res/values/strings.xml +++ b/commons/src/main/res/values/strings.xml @@ -344,4 +344,6 @@ Database import failed Invalid file Not in TOTP 2FA enrollment mode + + Clear all diff --git a/commons/src/main/res/values/styles.xml b/commons/src/main/res/values/styles.xml index 459deafba55..14aea64adc7 100644 --- a/commons/src/main/res/values/styles.xml +++ b/commons/src/main/res/values/styles.xml @@ -69,6 +69,14 @@ ?colorPrimary + + + + - - - \ No newline at end of file From 7230c23efd34e5208878243b90a622667c0564a2 Mon Sep 17 00:00:00 2001 From: Xavier Molloy Date: Wed, 14 Jan 2026 18:43:27 +0100 Subject: [PATCH 014/260] chore: [ANDROAPP-7348] Enable dependency verification [skip size] (#4559) * fix: [ANDROAPP-7348] Enable dependency verification * fix: [ANDROAPP-7348] Enable dependency verification only for release builds * fix: [ANDROAPP-7348] Enable dependency verification only for release builds * fix: [ANDROAPP-7348] code clean up * chore: [ANDROAPP-7348] Update dependency verification file * chore: [ANDROAPP-7348] Update dependency verification file * chore: [ANDROAPP-7348] Update dependency verification file * chore: [ANDROAPP-7348] updated dependency verification mode to lenient * fix: [ANDROAPP-7348] update continuous-delivery job * fix: [ANDROAPP-7348] update Jenkinsfile job * fix: [ANDROAPP-7348] update sonarcube script * fix: [ANDROAPP-7348] update remaining git hub actions for dependency verification --- .github/workflows/build-release-candidate.yml | 4 +- .github/workflows/continuous-delivery.yml | 2 +- .github/workflows/deploy-release.yml | 4 +- Jenkinsfile | 4 +- gradle.properties | 5 +- gradle/verification-metadata.xml | 12855 ++++++++++++++++ scripts/sonarqube.sh | 2 +- 7 files changed, 12867 insertions(+), 9 deletions(-) create mode 100644 gradle/verification-metadata.xml diff --git a/.github/workflows/build-release-candidate.yml b/.github/workflows/build-release-candidate.yml index 6d4a76a4581..89e7ab954c3 100644 --- a/.github/workflows/build-release-candidate.yml +++ b/.github/workflows/build-release-candidate.yml @@ -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 }} SIGNING_KEY_ALIAS: ${{ secrets.KEY_ALIAS }} @@ -67,7 +67,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 diff --git a/.github/workflows/continuous-delivery.yml b/.github/workflows/continuous-delivery.yml index e156128ed9e..37700ef863a 100644 --- a/.github/workflows/continuous-delivery.yml +++ b/.github/workflows/continuous-delivery.yml @@ -44,7 +44,7 @@ jobs: # 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 }} diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml index eefe95478f6..33eabded0b0 100644 --- a/.github/workflows/deploy-release.yml +++ b/.github/workflows/deploy-release.yml @@ -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 }} SIGNING_KEY_ALIAS: ${{ secrets.KEY_ALIAS }} @@ -71,7 +71,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 diff --git a/Jenkinsfile b/Jenkinsfile index de22090ec9f..c32f74a3656 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -72,7 +72,7 @@ pipeline { steps { script { echo 'Running unit tests' - sh './gradlew testDebugUnitTest testDhis2DebugUnitTest --stacktrace --no-daemon' + sh './gradlew --dependency-verification lenient testDebugUnitTest testDhis2DebugUnitTest --stacktrace --no-daemon' } } } @@ -80,7 +80,7 @@ pipeline { 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' } } } diff --git a/gradle.properties b/gradle.properties index f4bd86ad56c..e13a05e180a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -41,4 +41,7 @@ android.enableR8.fullMode=false # Kotlin compiler flags kotlin.daemon.jvmargs=-Xmx2048M -kotlin.incremental=true \ No newline at end of file +kotlin.incremental=true + +# Enable dependency verification +org.gradle.dependency.verification.mode=lenient diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml new file mode 100644 index 00000000000..38d2a9bff69 --- /dev/null +++ b/gradle/verification-metadata.xml @@ -0,0 +1,12855 @@ + + + + true + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/scripts/sonarqube.sh b/scripts/sonarqube.sh index 7192029a1cc..2b60e3be6c2 100644 --- a/scripts/sonarqube.sh +++ b/scripts/sonarqube.sh @@ -37,4 +37,4 @@ then git fetch --no-tags --force --progress -- $url +refs/heads/$GIT_BRANCH_DEST:refs/remotes/$remote/$GIT_BRANCH_DEST fi -./gradlew sonarqube --stacktrace --no-daemon \ No newline at end of file +./gradlew --dependency-verification lenient sonarqube --stacktrace --no-daemon \ No newline at end of file From 811f9d630271d1d4470b1bbc64eac5d3c97512b5 Mon Sep 17 00:00:00 2001 From: Pablo Date: Thu, 15 Jan 2026 13:00:22 +0100 Subject: [PATCH 015/260] build: [ANDROAPP-7337] Implement usecases for Home screen [skip size] (#4587) --- .../main/domain/DownloadNewVersion.kt | 19 +++ .../dhis2/data/service/VersionRepository.kt | 22 +-- .../org/dhis2/usescases/main/MainPresenter.kt | 5 +- .../usescases/main/data/HomeRepository.kt | 6 + .../usescases/main/data/HomeRepositoryImpl.kt | 19 +++ .../main/domain/CheckSingleNavigation.kt | 22 +++ .../main/domain/ConfigureHomeNavigationBar.kt | 24 ++++ .../usescases/main/domain/DeleteAccount.kt | 25 ++++ .../main/domain/DownloadNewVersion.kt | 33 +++++ .../usescases/main/domain/GetHomeFilters.kt | 17 +++ .../usescases/main/domain/GetLockAction.kt | 22 +++ .../usescases/main/domain/GetUserName.kt | 20 +++ .../main/domain/LaunchInitialSync.kt | 32 +++++ .../dhis2/usescases/main/domain/LogoutUser.kt | 5 +- .../main/domain/ScheduleNewVersionAlert.kt | 32 +++++ .../main/domain/UpdateInitialSyncStatus.kt | 17 +++ .../main/domain/model/BottomNavigationItem.kt | 7 + .../main/domain/model/DownloadMethod.kt | 11 ++ .../usescases/main/domain/model/LockAction.kt | 7 + .../dhis2/usescases/main/MainPresenterTest.kt | 1 + .../main/domain/CheckSingleNavigationTest.kt | 70 +++++++++ .../domain/ConfigureHomeNavigationBarTest.kt | 57 ++++++++ .../main/domain/DeleteAccountTest.kt | 65 +++++++++ .../main/domain/DownloadNewVersionTest.kt | 60 ++++++++ .../main/domain/GetHomeFiltersTest.kt | 44 ++++++ .../main/domain/GetLockActionTest.kt | 53 +++++++ .../usescases/main/domain/GetUserNameTest.kt | 99 +++++++++++++ .../main/domain/LaunchInitialSyncTest.kt | 136 ++++++++++++++++++ .../usescases/main/domain/LogoutUserTest.kt | 1 + .../domain/ScheduleNewVersionAlertTest.kt | 55 +++++++ .../domain/UpdateInitialSyncStatusTest.kt | 46 ++++++ 31 files changed, 1010 insertions(+), 22 deletions(-) create mode 100644 app/src/dhis2PlayServices/java/org/dhis2/usecases/main/domain/DownloadNewVersion.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/domain/CheckSingleNavigation.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/domain/ConfigureHomeNavigationBar.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/domain/DeleteAccount.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/domain/DownloadNewVersion.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/domain/GetHomeFilters.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/domain/GetLockAction.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/domain/GetUserName.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/domain/LaunchInitialSync.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/domain/ScheduleNewVersionAlert.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/domain/UpdateInitialSyncStatus.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/domain/model/BottomNavigationItem.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/domain/model/DownloadMethod.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/domain/model/LockAction.kt create mode 100644 app/src/test/java/org/dhis2/usescases/main/domain/CheckSingleNavigationTest.kt create mode 100644 app/src/test/java/org/dhis2/usescases/main/domain/ConfigureHomeNavigationBarTest.kt create mode 100644 app/src/test/java/org/dhis2/usescases/main/domain/DeleteAccountTest.kt create mode 100644 app/src/test/java/org/dhis2/usescases/main/domain/DownloadNewVersionTest.kt create mode 100644 app/src/test/java/org/dhis2/usescases/main/domain/GetHomeFiltersTest.kt create mode 100644 app/src/test/java/org/dhis2/usescases/main/domain/GetLockActionTest.kt create mode 100644 app/src/test/java/org/dhis2/usescases/main/domain/GetUserNameTest.kt create mode 100644 app/src/test/java/org/dhis2/usescases/main/domain/LaunchInitialSyncTest.kt create mode 100644 app/src/test/java/org/dhis2/usescases/main/domain/ScheduleNewVersionAlertTest.kt create mode 100644 app/src/test/java/org/dhis2/usescases/main/domain/UpdateInitialSyncStatusTest.kt diff --git a/app/src/dhis2PlayServices/java/org/dhis2/usecases/main/domain/DownloadNewVersion.kt b/app/src/dhis2PlayServices/java/org/dhis2/usecases/main/domain/DownloadNewVersion.kt new file mode 100644 index 00000000000..d2a07a80162 --- /dev/null +++ b/app/src/dhis2PlayServices/java/org/dhis2/usecases/main/domain/DownloadNewVersion.kt @@ -0,0 +1,19 @@ +package org.dhis2.usescases.main.domain + +import org.dhis2.data.service.VersionRepository +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.usescases.main.domain.model.DownloadMethod + +class DownloadNewVersion( + private val versionRepository: VersionRepository, +) : UseCase { + override suspend fun invoke(input: Unit): Result = + try { + val url = versionRepository.getUrl() + url?.let { + Result.success(DownloadMethod.Url(it)) + } ?: Result.failure(DomainError.UnexpectedError("No url provided")) + } catch (domainError: DomainError) { + Result.failure(domainError) + } +} diff --git a/app/src/main/java/org/dhis2/data/service/VersionRepository.kt b/app/src/main/java/org/dhis2/data/service/VersionRepository.kt index 23771279cc4..49c65337ce8 100644 --- a/app/src/main/java/org/dhis2/data/service/VersionRepository.kt +++ b/app/src/main/java/org/dhis2/data/service/VersionRepository.kt @@ -5,11 +5,8 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter -import android.net.Uri -import android.os.Build import android.os.Environment import androidx.core.content.ContextCompat -import androidx.core.content.FileProvider import androidx.core.net.toUri import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharedFlow @@ -44,7 +41,7 @@ class VersionRepository( fun download( context: Context, - onDownloadCompleted: (Uri) -> Unit, + onDownloadCompleted: (String) -> Unit, onDownloading: () -> Unit, ) { val url = @@ -60,9 +57,8 @@ class VersionRepository( )}/$fileName" val apkFile = File(destination) - val apkUri = uriFromFile(context, apkFile) if (apkFile.exists()) { - onDownloadCompleted(apkUri) + onDownloadCompleted(destination) } else if (fileName?.endsWith("apk") == true) { val request = DownloadManager @@ -86,7 +82,7 @@ class VersionRepository( ctxt: Context, intent: Intent?, ) { - onDownloadCompleted(apkUri) + onDownloadCompleted(destination) } } ContextCompat.registerReceiver( @@ -96,20 +92,10 @@ class VersionRepository( ContextCompat.RECEIVER_EXPORTED, ) } else { - url?.let { onDownloadCompleted(it.toUri()) } + url?.let { onDownloadCompleted(url) } } } - private fun uriFromFile( - context: Context, - file: File, - ): Uri = - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", file) - } else { - Uri.fromFile(file) - } - fun getUrl(): String? = d2 .settingModule() diff --git a/app/src/main/java/org/dhis2/usescases/main/MainPresenter.kt b/app/src/main/java/org/dhis2/usescases/main/MainPresenter.kt index a651681199b..4f8396c2463 100644 --- a/app/src/main/java/org/dhis2/usescases/main/MainPresenter.kt +++ b/app/src/main/java/org/dhis2/usescases/main/MainPresenter.kt @@ -40,6 +40,7 @@ import org.dhis2.data.service.VersionRepository import org.dhis2.data.service.workManager.WorkManagerController import org.dhis2.data.service.workManager.WorkerItem import org.dhis2.data.service.workManager.WorkerType +import org.dhis2.mobile.commons.domain.invoke import org.dhis2.usescases.login.SyncIsPerformedInteractor import org.dhis2.usescases.main.domain.LogoutUser import org.dhis2.usescases.settings.DeleteUserData @@ -230,7 +231,7 @@ class MainPresenter( .user() .blockingGet() ?.uid() ?: "" - } catch (e: Exception) { + } catch (_: Exception) { "" } @@ -373,7 +374,7 @@ class MainPresenter( versionRepository.download( context = context, onDownloadCompleted = { - onDownloadCompleted(it) + onDownloadCompleted(it.toUri()) downloadingVersion.value = false }, onDownloading = { downloadingVersion.value = true }, diff --git a/app/src/main/java/org/dhis2/usescases/main/data/HomeRepository.kt b/app/src/main/java/org/dhis2/usescases/main/data/HomeRepository.kt index f9740fb75ec..86b2849f635 100644 --- a/app/src/main/java/org/dhis2/usescases/main/data/HomeRepository.kt +++ b/app/src/main/java/org/dhis2/usescases/main/data/HomeRepository.kt @@ -34,4 +34,10 @@ interface HomeRepository { suspend fun getInitialSyncDone(): Boolean suspend fun isImportedDb(): Boolean + + suspend fun stopBackgroundSync() + + suspend fun restoreSyncStatus() + + suspend fun syncData() } diff --git a/app/src/main/java/org/dhis2/usescases/main/data/HomeRepositoryImpl.kt b/app/src/main/java/org/dhis2/usescases/main/data/HomeRepositoryImpl.kt index 09203ab805e..7408dccbe0f 100644 --- a/app/src/main/java/org/dhis2/usescases/main/data/HomeRepositoryImpl.kt +++ b/app/src/main/java/org/dhis2/usescases/main/data/HomeRepositoryImpl.kt @@ -2,12 +2,15 @@ package org.dhis2.usescases.main.data import dhis2.org.analytics.charts.Charts import kotlinx.coroutines.withContext +import org.dhis2.commons.Constants import org.dhis2.commons.bindings.dataSet import org.dhis2.commons.bindings.dataSetInstanceSummaries import org.dhis2.commons.bindings.isStockProgram import org.dhis2.commons.bindings.programs import org.dhis2.commons.prefs.Preference import org.dhis2.commons.prefs.Preference.Companion.PIN +import org.dhis2.data.service.SyncStatusController +import org.dhis2.data.service.workManager.WorkManagerController import org.dhis2.mobile.commons.coroutine.Dispatcher import org.dhis2.mobile.commons.error.DomainErrorMapper import org.dhis2.mobile.commons.providers.PreferenceProvider @@ -26,6 +29,8 @@ class HomeRepositoryImpl( private val d2: D2, private val charts: Charts?, private val preferences: PreferenceProvider, + private val workManagerController: WorkManagerController, + private val syncStatusController: SyncStatusController, private val domainErrorMapper: DomainErrorMapper, private val dispatcher: Dispatcher, ) : HomeRepository { @@ -187,4 +192,18 @@ class HomeRepositoryImpl( .accountManager() .deleteCurrentAccount() } + + override suspend fun stopBackgroundSync() { + workManagerController.cancelAllWorkAndWait() + workManagerController.pruneWork() + } + + override suspend fun restoreSyncStatus() { + syncStatusController.restore() + } + + override suspend fun syncData() { + workManagerController + .syncDataForWorker(Constants.DATA_NOW, Constants.INITIAL_SYNC) + } } diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/CheckSingleNavigation.kt b/app/src/main/java/org/dhis2/usescases/main/domain/CheckSingleNavigation.kt new file mode 100644 index 00000000000..a3e066abb70 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/domain/CheckSingleNavigation.kt @@ -0,0 +1,22 @@ +package org.dhis2.usescases.main.domain + +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.HomeItemData +import org.dhis2.usescases.main.data.HomeRepository + +class CheckSingleNavigation( + private val homeRepository: HomeRepository, +) : UseCase { + override suspend fun invoke(input: Unit): Result = + try { + val homeItemCount = homeRepository.homeItemCount() + if (homeItemCount == 1) { + Result.success(homeRepository.singleHomeItemData()) + } else { + Result.failure(DomainError.ConfigurationError("Expected exactly one home item")) + } + } catch (domainError: DomainError) { + Result.failure(domainError) + } +} diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/ConfigureHomeNavigationBar.kt b/app/src/main/java/org/dhis2/usescases/main/domain/ConfigureHomeNavigationBar.kt new file mode 100644 index 00000000000..2d2d368432d --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/domain/ConfigureHomeNavigationBar.kt @@ -0,0 +1,24 @@ +package org.dhis2.usescases.main.domain + +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.data.HomeRepository +import org.dhis2.usescases.main.domain.model.BottomNavigationItem + +class ConfigureHomeNavigationBar( + private val homeRepository: HomeRepository, +) : UseCase> { + override suspend operator fun invoke(input: Unit) = + try { + val list = + buildList { + add(BottomNavigationItem.Program) + if (homeRepository.hasHomeAnalytics()) { + add(BottomNavigationItem.Analytics) + } + } + Result.success(list) + } catch (_: DomainError) { + Result.success(listOf(BottomNavigationItem.Program)) + } +} diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/DeleteAccount.kt b/app/src/main/java/org/dhis2/usescases/main/domain/DeleteAccount.kt new file mode 100644 index 00000000000..c8f6eb9df43 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/domain/DeleteAccount.kt @@ -0,0 +1,25 @@ +package org.dhis2.usescases.main.domain + +import org.dhis2.commons.filters.FilterManager +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.data.HomeRepository +import java.io.File + +class DeleteAccount( + private val filterManager: FilterManager, + private val repository: HomeRepository, +) : UseCase { + override suspend fun invoke(input: File?): Result = + try { + filterManager.clearAllFilters() + input?.let { repository.clearCache(it) } + repository.clearPreferences() + repository.wipeAll() + repository.deleteCurrentAccount() + val accountCount = repository.accountsCount() + Result.success(accountCount) + } catch (domainError: DomainError) { + Result.failure(domainError) + } +} diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/DownloadNewVersion.kt b/app/src/main/java/org/dhis2/usescases/main/domain/DownloadNewVersion.kt new file mode 100644 index 00000000000..746bee80950 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/domain/DownloadNewVersion.kt @@ -0,0 +1,33 @@ +package org.dhis2.usescases.main.domain + +import android.content.Context +import kotlinx.coroutines.suspendCancellableCoroutine +import org.dhis2.data.service.VersionRepository +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.domain.model.DownloadMethod +import kotlin.coroutines.resume + +class DownloadNewVersion( + private val versionRepository: VersionRepository, +) : UseCase { + override suspend fun invoke(input: Context): Result = + try { + suspendCancellableCoroutine { continuation -> + versionRepository.download( + context = input, + onDownloadCompleted = { + continuation.resume(Result.success(DownloadMethod.File(it))) + }, + onDownloading = { + // no-op + }, + ) + continuation.invokeOnCancellation { + // If needed perform action on cancellation + } + } + } catch (e: DomainError) { + Result.failure(e) + } +} diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/GetHomeFilters.kt b/app/src/main/java/org/dhis2/usescases/main/domain/GetHomeFilters.kt new file mode 100644 index 00000000000..ac75779773d --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/domain/GetHomeFilters.kt @@ -0,0 +1,17 @@ +package org.dhis2.usescases.main.domain + +import org.dhis2.commons.filters.FilterItem +import org.dhis2.commons.filters.data.FilterRepository +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError + +class GetHomeFilters( + private val filterRepository: FilterRepository, +) : UseCase> { + override suspend fun invoke(input: Unit): Result> = + try { + Result.success(filterRepository.homeFilters()) + } catch (domainError: DomainError) { + Result.failure(domainError) + } +} diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/GetLockAction.kt b/app/src/main/java/org/dhis2/usescases/main/domain/GetLockAction.kt new file mode 100644 index 00000000000..002a6ffa476 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/domain/GetLockAction.kt @@ -0,0 +1,22 @@ +package org.dhis2.usescases.main.domain + +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.data.HomeRepository +import org.dhis2.usescases.main.domain.model.LockAction + +class GetLockAction( + private val repository: HomeRepository, +) : UseCase { + override suspend fun invoke(input: Unit): Result = + try { + val isPinSet = repository.isPinStored() + if (isPinSet) { + Result.success(LockAction.BlockSession) + } else { + Result.success(LockAction.CreatePin) + } + } catch (domainError: DomainError) { + Result.failure(domainError) + } +} diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/GetUserName.kt b/app/src/main/java/org/dhis2/usescases/main/domain/GetUserName.kt new file mode 100644 index 00000000000..064ee7c7722 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/domain/GetUserName.kt @@ -0,0 +1,20 @@ +package org.dhis2.usescases.main.domain + +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.data.HomeRepository + +class GetUserName( + private val homeRepository: HomeRepository, +) : UseCase { + override suspend operator fun invoke(input: Unit) = + try { + val user = homeRepository.user() + val firstName = user?.firstName() + val surname = user?.surname() + val userName = listOfNotNull(firstName, surname).joinToString(" ") + Result.success(userName) + } catch (domainError: DomainError) { + Result.failure(domainError) + } +} diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/LaunchInitialSync.kt b/app/src/main/java/org/dhis2/usescases/main/domain/LaunchInitialSync.kt new file mode 100644 index 00000000000..72db6f550c7 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/domain/LaunchInitialSync.kt @@ -0,0 +1,32 @@ +package org.dhis2.usescases.main.domain + +import org.dhis2.data.service.VersionRepository +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.data.HomeRepository + +class LaunchInitialSync( + private val skipSync: Boolean, + private val homeRepository: HomeRepository, + private val versionRepository: VersionRepository, +) : UseCase { + override suspend fun invoke(input: Unit): Result = + try { + if (skipSync || homeRepository.isImportedDb() || homeRepository.getInitialSyncDone()) { + Result.success(InitialSyncAction.Skip) + } else { + versionRepository.checkVersionUpdates() + homeRepository.syncData() + + Result.success(InitialSyncAction.Syncing) + } + } catch (domainError: DomainError) { + Result.failure(domainError) + } +} + +sealed interface InitialSyncAction { + data object Skip : InitialSyncAction + + data object Syncing : InitialSyncAction +} diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/LogoutUser.kt b/app/src/main/java/org/dhis2/usescases/main/domain/LogoutUser.kt index a54b2277973..4961f4589d9 100644 --- a/app/src/main/java/org/dhis2/usescases/main/domain/LogoutUser.kt +++ b/app/src/main/java/org/dhis2/usescases/main/domain/LogoutUser.kt @@ -3,6 +3,7 @@ package org.dhis2.usescases.main.domain import org.dhis2.commons.filters.FilterManager import org.dhis2.data.service.SyncStatusController import org.dhis2.data.service.workManager.WorkManagerController +import org.dhis2.mobile.commons.domain.UseCase import org.dhis2.usescases.main.HomeRepository typealias AccountCount = Int @@ -12,8 +13,8 @@ class LogoutUser( private val workManagerController: WorkManagerController, private val syncStatusController: SyncStatusController, private val filterManager: FilterManager, -) { - suspend operator fun invoke(): Result { +) : UseCase { + override suspend operator fun invoke(input: Unit): Result { workManagerController.cancelAllWorkAndWait() syncStatusController.restore() filterManager.clearAllFilters() diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/ScheduleNewVersionAlert.kt b/app/src/main/java/org/dhis2/usescases/main/domain/ScheduleNewVersionAlert.kt new file mode 100644 index 00000000000..ef60d039491 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/domain/ScheduleNewVersionAlert.kt @@ -0,0 +1,32 @@ +package org.dhis2.usescases.main.domain + +import androidx.work.ExistingWorkPolicy +import org.dhis2.commons.Constants +import org.dhis2.data.service.VersionRepository +import org.dhis2.data.service.workManager.WorkManagerController +import org.dhis2.data.service.workManager.WorkerItem +import org.dhis2.data.service.workManager.WorkerType +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import kotlin.time.Duration.Companion.days + +class ScheduleNewVersionAlert( + private val workManagerController: WorkManagerController, + private val versionRepository: VersionRepository, +) : UseCase { + override suspend fun invoke(input: Unit): Result = + try { + val workerItem = + WorkerItem( + Constants.NEW_APP_VERSION, + WorkerType.NEW_VERSION, + delayInSeconds = 1.days.inWholeSeconds, + policy = ExistingWorkPolicy.REPLACE, + ) + workManagerController.beginUniqueWork(workerItem) + versionRepository.removeVersionInfo() + Result.success(Unit) + } catch (domainError: DomainError) { + Result.failure(domainError) + } +} diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/UpdateInitialSyncStatus.kt b/app/src/main/java/org/dhis2/usescases/main/domain/UpdateInitialSyncStatus.kt new file mode 100644 index 00000000000..c62d756a229 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/domain/UpdateInitialSyncStatus.kt @@ -0,0 +1,17 @@ +package org.dhis2.usescases.main.domain + +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.data.HomeRepository + +class UpdateInitialSyncStatus( + val repository: HomeRepository, +) : UseCase { + override suspend fun invoke(input: Unit): Result = + try { + repository.setInitialSyncDone() + Result.success(Unit) + } catch (domainError: DomainError) { + Result.failure(domainError) + } +} diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/model/BottomNavigationItem.kt b/app/src/main/java/org/dhis2/usescases/main/domain/model/BottomNavigationItem.kt new file mode 100644 index 00000000000..43b4696c439 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/domain/model/BottomNavigationItem.kt @@ -0,0 +1,7 @@ +package org.dhis2.usescases.main.domain.model + +sealed interface BottomNavigationItem { + data object Program : BottomNavigationItem + + data object Analytics : BottomNavigationItem +} diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/model/DownloadMethod.kt b/app/src/main/java/org/dhis2/usescases/main/domain/model/DownloadMethod.kt new file mode 100644 index 00000000000..c28de7abf9c --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/domain/model/DownloadMethod.kt @@ -0,0 +1,11 @@ +package org.dhis2.usescases.main.domain.model + +sealed interface DownloadMethod { + data class Url( + val url: String, + ) : DownloadMethod + + data class File( + val path: String, + ) : DownloadMethod +} diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/model/LockAction.kt b/app/src/main/java/org/dhis2/usescases/main/domain/model/LockAction.kt new file mode 100644 index 00000000000..01df14106f6 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/domain/model/LockAction.kt @@ -0,0 +1,7 @@ +package org.dhis2.usescases.main.domain.model + +sealed interface LockAction { + data object CreatePin : LockAction + + data object BlockSession : LockAction +} diff --git a/app/src/test/java/org/dhis2/usescases/main/MainPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/main/MainPresenterTest.kt index 2604bc66e6a..1e62905099f 100644 --- a/app/src/test/java/org/dhis2/usescases/main/MainPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/main/MainPresenterTest.kt @@ -28,6 +28,7 @@ import org.dhis2.data.server.UserManager import org.dhis2.data.service.SyncStatusController import org.dhis2.data.service.VersionRepository import org.dhis2.data.service.workManager.WorkManagerController +import org.dhis2.mobile.commons.domain.invoke import org.dhis2.usescases.login.SyncIsPerformedInteractor import org.dhis2.usescases.main.domain.LogoutUser import org.dhis2.usescases.settings.DeleteUserData diff --git a/app/src/test/java/org/dhis2/usescases/main/domain/CheckSingleNavigationTest.kt b/app/src/test/java/org/dhis2/usescases/main/domain/CheckSingleNavigationTest.kt new file mode 100644 index 00000000000..afa1fbd1c78 --- /dev/null +++ b/app/src/test/java/org/dhis2/usescases/main/domain/CheckSingleNavigationTest.kt @@ -0,0 +1,70 @@ +package org.dhis2.usescases.main.domain + +import kotlinx.coroutines.test.runTest +import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.HomeItemData +import org.dhis2.usescases.main.data.HomeRepository +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.given +import org.mockito.kotlin.mock +import org.mockito.kotlin.times +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever +import org.mockito.kotlin.willAnswer + +class CheckSingleNavigationTest { + private val homeRepository: HomeRepository = mock() + private lateinit var checkSingleNavigation: CheckSingleNavigation + + @Before + fun setUp() { + checkSingleNavigation = CheckSingleNavigation(homeRepository) + } + + @Test + fun `should return HomeDataItem if there is only one program`() = + runTest { + whenever(homeRepository.homeItemCount()) doReturn 1 + whenever(homeRepository.singleHomeItemData()) doReturn + HomeItemData.EventProgram( + "eventUid", + "eventLabel", + true, + ) + assertTrue(checkSingleNavigation().isSuccess) + } + + @Test + fun `should return failure if more than one program`() = + runTest { + whenever(homeRepository.homeItemCount()) doReturn 2 + with(checkSingleNavigation()) { + verify(homeRepository, times(0)).singleHomeItemData() + assertTrue(isFailure) + } + } + + @Test + fun `should return failure if there are no programs`() = + runTest { + whenever(homeRepository.homeItemCount()) doReturn 0 + with(checkSingleNavigation()) { + verify(homeRepository, times(0)).singleHomeItemData() + assertTrue(isFailure) + } + } + + @Test + fun `should return failure if there is a domain exception`() = + runTest { + given(homeRepository.homeItemCount()) willAnswer { throw DomainError.DatabaseError("Test") } + with(checkSingleNavigation()) { + assertTrue(isFailure) + assertTrue(exceptionOrNull() is DomainError) + } + } +} diff --git a/app/src/test/java/org/dhis2/usescases/main/domain/ConfigureHomeNavigationBarTest.kt b/app/src/test/java/org/dhis2/usescases/main/domain/ConfigureHomeNavigationBarTest.kt new file mode 100644 index 00000000000..27aa04a1d22 --- /dev/null +++ b/app/src/test/java/org/dhis2/usescases/main/domain/ConfigureHomeNavigationBarTest.kt @@ -0,0 +1,57 @@ +package org.dhis2.usescases.main.domain + +import kotlinx.coroutines.test.runTest +import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.data.HomeRepository +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.given +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever +import org.mockito.kotlin.willAnswer + +class ConfigureHomeNavigationBarTest { + private val homeRepository: HomeRepository = mock() + lateinit var configureHomeNavigationBar: ConfigureHomeNavigationBar + + @Before + fun setUp() { + configureHomeNavigationBar = + ConfigureHomeNavigationBar( + homeRepository = homeRepository, + ) + } + + @Test + fun `should return programs and analytics items if configured`() = + runTest { + whenever(homeRepository.hasHomeAnalytics()) doReturn true + with(configureHomeNavigationBar()) { + assertTrue(isSuccess) + assertTrue(getOrNull()?.size == 2) + } + } + + @Test + fun `should return just programs if analytics is not configured`() = + runTest { + whenever(homeRepository.hasHomeAnalytics()) doReturn false + with(configureHomeNavigationBar()) { + assertTrue(isSuccess) + assertTrue(getOrNull()?.size == 1) + } + } + + @Test + fun `should return just programs if an exception is thrown`() = + runTest { + given(homeRepository.hasHomeAnalytics()) willAnswer { throw DomainError.DatabaseError("Test") } + with(configureHomeNavigationBar()) { + assertTrue(isSuccess) + assertTrue(getOrNull()?.size == 1) + } + } +} diff --git a/app/src/test/java/org/dhis2/usescases/main/domain/DeleteAccountTest.kt b/app/src/test/java/org/dhis2/usescases/main/domain/DeleteAccountTest.kt new file mode 100644 index 00000000000..a3f6f112651 --- /dev/null +++ b/app/src/test/java/org/dhis2/usescases/main/domain/DeleteAccountTest.kt @@ -0,0 +1,65 @@ +package org.dhis2.usescases.main.domain + +import junit.framework.Assert.assertTrue +import kotlinx.coroutines.test.runTest +import org.dhis2.commons.filters.FilterManager +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.data.HomeRepository +import org.junit.Before +import org.junit.Test +import org.mockito.Mockito.mock +import org.mockito.kotlin.any +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.given +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever +import org.mockito.kotlin.willAnswer +import kotlin.io.path.createTempFile + +class DeleteAccountTest { + private val filterManager: FilterManager = mock() + private val repository: HomeRepository = mock() + private lateinit var deleteAccount: DeleteAccount + + @Before + fun setUp() { + deleteAccount = + DeleteAccount( + filterManager = filterManager, + repository = repository, + ) + } + + @Test + fun `should successfully return and clear all data`() = + runTest { + val cacheFile = createTempFile().toFile() + whenever(repository.clearCache(any())) doReturn true + whenever(repository.accountsCount()) doReturn 3 + with(deleteAccount(cacheFile)) { + verify(filterManager).clearAllFilters() + verify(repository).clearCache(cacheFile) + verify(repository).clearPreferences() + verify(repository).wipeAll() + verify(repository).deleteCurrentAccount() + assertTrue(isSuccess) + assertTrue(getOrNull() == 3) + } + } + + @Test + fun `should return failure when domain exception is thrown`() = + runTest { + val cacheFile = createTempFile().toFile() + whenever(repository.clearCache(any())) doReturn true + given(repository.deleteCurrentAccount()) willAnswer { throw DomainError.DatabaseError("Test") } + with(deleteAccount(cacheFile)) { + verify(filterManager).clearAllFilters() + verify(repository).clearCache(cacheFile) + verify(repository).clearPreferences() + verify(repository).wipeAll() + verify(repository).deleteCurrentAccount() + assertTrue(isFailure) + } + } +} diff --git a/app/src/test/java/org/dhis2/usescases/main/domain/DownloadNewVersionTest.kt b/app/src/test/java/org/dhis2/usescases/main/domain/DownloadNewVersionTest.kt new file mode 100644 index 00000000000..caaec27534d --- /dev/null +++ b/app/src/test/java/org/dhis2/usescases/main/domain/DownloadNewVersionTest.kt @@ -0,0 +1,60 @@ +package org.dhis2.usescases.main.domain + +import android.content.Context +import kotlinx.coroutines.test.runTest +import org.dhis2.data.service.VersionRepository +import org.dhis2.mobile.commons.error.DomainError +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.mockito.kotlin.any +import org.mockito.kotlin.given +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever +import org.mockito.kotlin.willAnswer + +class DownloadNewVersionTest { + private val versionRepository: VersionRepository = mock() + private lateinit var downloadNewVersion: DownloadNewVersion + + @Before + fun setUp() { + downloadNewVersion = DownloadNewVersion(versionRepository) + } + + @Test + fun `should successfully download new version`() = + runTest { + // GIVEN + val fakeUriPath = "fakeUriPath" + whenever( + versionRepository.download( + context = any(), + onDownloadCompleted = any(), + onDownloading = any(), + ), + ).thenAnswer { + // Simulate the callback being called upon successful download + val onDownloadCompletedCallback = it.getArgument<(String) -> Unit>(1) + onDownloadCompletedCallback.invoke(fakeUriPath) + } + val context: Context = mock() + + with(downloadNewVersion(context)) { + assertTrue(isSuccess) + } + } + + @Test + fun `should return failure if an exception is thrown`() = + runTest { + given(versionRepository.download(any(), any(), any())) willAnswer { + throw DomainError.DatabaseError("Test") + } + val context: Context = mock() + + with(downloadNewVersion(context)) { + assertTrue(isFailure) + } + } +} diff --git a/app/src/test/java/org/dhis2/usescases/main/domain/GetHomeFiltersTest.kt b/app/src/test/java/org/dhis2/usescases/main/domain/GetHomeFiltersTest.kt new file mode 100644 index 00000000000..cc5fb863bd5 --- /dev/null +++ b/app/src/test/java/org/dhis2/usescases/main/domain/GetHomeFiltersTest.kt @@ -0,0 +1,44 @@ +package org.dhis2.usescases.main.domain + +import kotlinx.coroutines.test.runTest +import org.dhis2.commons.filters.FilterItem +import org.dhis2.commons.filters.data.FilterRepository +import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.commons.error.DomainError +import org.junit.Before +import org.junit.Test +import org.mockito.Mockito.mock +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.given +import org.mockito.kotlin.whenever +import org.mockito.kotlin.willAnswer + +class GetHomeFiltersTest { + private val filterRepository: FilterRepository = mock() + private lateinit var getHomeFilters: GetHomeFilters + + @Before + fun setUp() { + getHomeFilters = GetHomeFilters(filterRepository) + } + + @Test + fun `should return a list of home filters`() = + runTest { + val expectedFilters: List = mock() + whenever(filterRepository.homeFilters()) doReturn expectedFilters + val result = getHomeFilters() + assert(result.isSuccess) + assert(result.getOrNull() == expectedFilters) + } + + @Test + fun `should return a failure when an exception is thrown`() = + runTest { + given(filterRepository.homeFilters()) willAnswer { + throw DomainError.DatabaseError("Test") + } + val result = getHomeFilters() + assert(result.isFailure) + } +} diff --git a/app/src/test/java/org/dhis2/usescases/main/domain/GetLockActionTest.kt b/app/src/test/java/org/dhis2/usescases/main/domain/GetLockActionTest.kt new file mode 100644 index 00000000000..3db9ea7323e --- /dev/null +++ b/app/src/test/java/org/dhis2/usescases/main/domain/GetLockActionTest.kt @@ -0,0 +1,53 @@ +package org.dhis2.usescases.main.domain + +import kotlinx.coroutines.test.runTest +import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.data.HomeRepository +import org.dhis2.usescases.main.domain.model.LockAction +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.given +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever +import org.mockito.kotlin.willAnswer + +class GetLockActionTest { + private val homeRepository: HomeRepository = mock() + private lateinit var getLockAction: GetLockAction + + @Before + fun setUp() { + getLockAction = GetLockAction(homeRepository) + } + + @Test + fun `should return BlockSession action if pin is set`() = + runTest { + whenever(homeRepository.isPinStored()) doReturn true + val result = getLockAction() + assertTrue(result.isSuccess) + assertTrue(result.getOrNull() is LockAction.BlockSession) + } + + @Test + fun `should return CreatePin action if pin is set`() = + runTest { + whenever(homeRepository.isPinStored()) doReturn false + val result = getLockAction() + assertTrue(result.isSuccess) + assertTrue(result.getOrNull() is LockAction.CreatePin) + } + + @Test + fun `should return failure if an exception is thrown`() = + runTest { + given(homeRepository.isPinStored()) willAnswer { + throw DomainError.DatabaseError("Test") + } + val result = getLockAction() + assertTrue(result.isFailure) + } +} diff --git a/app/src/test/java/org/dhis2/usescases/main/domain/GetUserNameTest.kt b/app/src/test/java/org/dhis2/usescases/main/domain/GetUserNameTest.kt new file mode 100644 index 00000000000..aee8436306d --- /dev/null +++ b/app/src/test/java/org/dhis2/usescases/main/domain/GetUserNameTest.kt @@ -0,0 +1,99 @@ +package org.dhis2.usescases.main.domain + +import kotlinx.coroutines.test.runTest +import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.data.HomeRepository +import org.hisp.dhis.android.core.user.User +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.given +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever +import org.mockito.kotlin.willAnswer + +class GetUserNameTest { + private val homeRepository: HomeRepository = mock() + private lateinit var getUserName: GetUserName + + @Before + fun setUp() { + getUserName = GetUserName(homeRepository) + } + + @Test + fun `should return full name if user exists`() = + runTest { + val user: User = + mock { + on { firstName() } doReturn "Peter" + on { surname() } doReturn "Jones" + } + whenever(homeRepository.user()) doReturn user + + val result = getUserName() + + assertTrue(result.isSuccess) + assertEquals("Peter Jones", result.getOrNull()) + } + + @Test + fun `should return surname if first name is null`() = + runTest { + val user: User = + mock { + on { firstName() } doReturn null + on { surname() } doReturn "Jones" + } + whenever(homeRepository.user()) doReturn user + + val result = getUserName() + + assertTrue(result.isSuccess) + assertEquals("Jones", result.getOrNull()) + } + + @Test + fun `should return first name if surname is null`() = + runTest { + val user: User = + mock { + on { firstName() } doReturn "Peter" + on { surname() } doReturn null + } + whenever(homeRepository.user()) doReturn user + + val result = getUserName() + + assertTrue(result.isSuccess) + assertEquals("Peter", result.getOrNull()) + } + + @Test + fun `should return empty string if user is null`() = + runTest { + whenever(homeRepository.user()) doReturn null + + val result = getUserName() + + assertTrue(result.isSuccess) + assertEquals("", result.getOrNull()) + } + + @Test + fun `should return failure if repository throws error`() = + runTest { + val exception = DomainError.DatabaseError("Error") + given(homeRepository.user()) willAnswer { + throw exception + } + + val result = getUserName() + + assertTrue(result.isFailure) + assertEquals(exception, result.exceptionOrNull()) + } +} diff --git a/app/src/test/java/org/dhis2/usescases/main/domain/LaunchInitialSyncTest.kt b/app/src/test/java/org/dhis2/usescases/main/domain/LaunchInitialSyncTest.kt new file mode 100644 index 00000000000..f217f744cf3 --- /dev/null +++ b/app/src/test/java/org/dhis2/usescases/main/domain/LaunchInitialSyncTest.kt @@ -0,0 +1,136 @@ +package org.dhis2.usescases.main.domain + +import kotlinx.coroutines.test.runTest +import org.dhis2.data.service.VersionRepository +import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.data.HomeRepository +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Test +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.given +import org.mockito.kotlin.mock +import org.mockito.kotlin.verify +import org.mockito.kotlin.verifyNoInteractions +import org.mockito.kotlin.whenever + +class LaunchInitialSyncTest { + private val homeRepository: HomeRepository = mock() + private val versionRepository: VersionRepository = mock() + private lateinit var launchInitialSync: LaunchInitialSync + + @Test + fun `should return Skip if skipSync is true`() = + runTest { + launchInitialSync = + LaunchInitialSync( + skipSync = true, + homeRepository = homeRepository, + versionRepository = versionRepository, + ) + + val result = launchInitialSync() + + assertTrue(result.isSuccess) + assertEquals(InitialSyncAction.Skip, result.getOrNull()) + verifyNoInteractions(homeRepository) + verifyNoInteractions(versionRepository) + } + + @Test + fun `should return Skip if database is imported`() = + runTest { + whenever(homeRepository.isImportedDb()) doReturn true + launchInitialSync = + LaunchInitialSync( + skipSync = false, + homeRepository = homeRepository, + versionRepository = versionRepository, + ) + + val result = launchInitialSync() + + assertTrue(result.isSuccess) + assertEquals(InitialSyncAction.Skip, result.getOrNull()) + } + + @Test + fun `should return Skip if initial sync is done`() = + runTest { + whenever(homeRepository.isImportedDb()) doReturn false + whenever(homeRepository.getInitialSyncDone()) doReturn true + launchInitialSync = + LaunchInitialSync( + skipSync = false, + homeRepository = homeRepository, + versionRepository = versionRepository, + ) + + val result = launchInitialSync() + + assertTrue(result.isSuccess) + assertEquals(InitialSyncAction.Skip, result.getOrNull()) + } + + @Test + fun `should return Syncing and launch initial sync`() = + runTest { + whenever(homeRepository.isImportedDb()) doReturn false + whenever(homeRepository.getInitialSyncDone()) doReturn false + launchInitialSync = + LaunchInitialSync( + skipSync = false, + homeRepository = homeRepository, + versionRepository = versionRepository, + ) + + val result = launchInitialSync() + + assertTrue(result.isSuccess) + assertEquals(InitialSyncAction.Syncing, result.getOrNull()) + verify(versionRepository).checkVersionUpdates() + } + + @Test + fun `should return failure if check version update fails`() = + runTest { + val exception = DomainError.DatabaseError("Error") + whenever(homeRepository.isImportedDb()) doReturn false + whenever(homeRepository.getInitialSyncDone()) doReturn false + given(versionRepository.checkVersionUpdates()).willAnswer { + throw exception + } + launchInitialSync = + LaunchInitialSync( + skipSync = false, + homeRepository = homeRepository, + versionRepository = versionRepository, + ) + + val result = launchInitialSync() + + assertTrue(result.isFailure) + assertEquals(exception, result.exceptionOrNull()) + } + + @Test + fun `should return failure if home repository fails`() = + runTest { + val exception = DomainError.DatabaseError("Error") + given(homeRepository.isImportedDb()).willAnswer { + throw exception + } + launchInitialSync = + LaunchInitialSync( + skipSync = false, + homeRepository = homeRepository, + versionRepository = versionRepository, + ) + + val result = launchInitialSync() + + assertTrue(result.isFailure) + assertEquals(exception, result.exceptionOrNull()) + } +} diff --git a/app/src/test/java/org/dhis2/usescases/main/domain/LogoutUserTest.kt b/app/src/test/java/org/dhis2/usescases/main/domain/LogoutUserTest.kt index df31b8e52fa..775290b5914 100644 --- a/app/src/test/java/org/dhis2/usescases/main/domain/LogoutUserTest.kt +++ b/app/src/test/java/org/dhis2/usescases/main/domain/LogoutUserTest.kt @@ -4,6 +4,7 @@ import kotlinx.coroutines.test.runTest import org.dhis2.commons.filters.FilterManager import org.dhis2.data.service.SyncStatusController import org.dhis2.data.service.workManager.WorkManagerController +import org.dhis2.mobile.commons.domain.invoke import org.dhis2.mobile.commons.error.DomainError import org.dhis2.usescases.main.HomeRepository import org.junit.Assert.assertTrue diff --git a/app/src/test/java/org/dhis2/usescases/main/domain/ScheduleNewVersionAlertTest.kt b/app/src/test/java/org/dhis2/usescases/main/domain/ScheduleNewVersionAlertTest.kt new file mode 100644 index 00000000000..77f6c45144e --- /dev/null +++ b/app/src/test/java/org/dhis2/usescases/main/domain/ScheduleNewVersionAlertTest.kt @@ -0,0 +1,55 @@ +package org.dhis2.usescases.main.domain + +import kotlinx.coroutines.test.runTest +import org.dhis2.data.service.VersionRepository +import org.dhis2.data.service.workManager.WorkManagerController +import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.commons.error.DomainError +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.mockito.kotlin.any +import org.mockito.kotlin.given +import org.mockito.kotlin.mock +import org.mockito.kotlin.verify + +class ScheduleNewVersionAlertTest { + private val workManagerController: WorkManagerController = mock() + private val versionRepository: VersionRepository = mock() + private lateinit var scheduleNewVersionAlert: ScheduleNewVersionAlert + + @Before + fun setUp() { + scheduleNewVersionAlert = + ScheduleNewVersionAlert( + workManagerController = workManagerController, + versionRepository = versionRepository, + ) + } + + @Test + fun `should schedule new version alert and remove version info`() = + runTest { + val result = scheduleNewVersionAlert() + + assertTrue(result.isSuccess) + + verify(workManagerController).beginUniqueWork(any()) + verify(versionRepository).removeVersionInfo() + } + + @Test + fun `should return failure when remove version info fails`() = + runTest { + val exception = DomainError.DatabaseError("Error") + given(versionRepository.removeVersionInfo()).willAnswer { + throw exception + } + + val result = scheduleNewVersionAlert() + + assertTrue(result.isFailure) + assertEquals(exception, result.exceptionOrNull()) + } +} diff --git a/app/src/test/java/org/dhis2/usescases/main/domain/UpdateInitialSyncStatusTest.kt b/app/src/test/java/org/dhis2/usescases/main/domain/UpdateInitialSyncStatusTest.kt new file mode 100644 index 00000000000..11589c76b5f --- /dev/null +++ b/app/src/test/java/org/dhis2/usescases/main/domain/UpdateInitialSyncStatusTest.kt @@ -0,0 +1,46 @@ +package org.dhis2.usescases.main.domain + +import kotlinx.coroutines.test.runTest +import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.data.HomeRepository +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.mockito.kotlin.given +import org.mockito.kotlin.mock +import org.mockito.kotlin.verify + +class UpdateInitialSyncStatusTest { + private val homeRepository: HomeRepository = mock() + private lateinit var updateInitialSyncStatus: UpdateInitialSyncStatus + + @Before + fun setUp() { + updateInitialSyncStatus = UpdateInitialSyncStatus(homeRepository) + } + + @Test + fun `should call set initial sync done`() = + runTest { + val result = updateInitialSyncStatus() + + assertTrue(result.isSuccess) + verify(homeRepository).setInitialSyncDone() + } + + @Test + fun `should return failure when repository fails`() = + runTest { + val exception = DomainError.DatabaseError("Error") + given(homeRepository.setInitialSyncDone()).willAnswer { + throw exception + } + + val result = updateInitialSyncStatus() + + assertTrue(result.isFailure) + assertEquals(exception, result.exceptionOrNull()) + } +} From a6a33fdbfccb9d8fc7e3b90e7d1de59ed26bb778 Mon Sep 17 00:00:00 2001 From: Xavier Molloy Date: Fri, 16 Jan 2026 12:34:22 +0100 Subject: [PATCH 016/260] chore: update dependency verification file --- gradle/verification-metadata.xml | 133 +++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 38d2a9bff69..86141f50d0a 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -2067,6 +2067,9 @@ + + + @@ -8171,6 +8174,14 @@ + + + + + + + + @@ -8179,6 +8190,14 @@ + + + + + + + + @@ -8187,6 +8206,14 @@ + + + + + + + + @@ -8195,6 +8222,22 @@ + + + + + + + + + + + + + + + + @@ -8203,6 +8246,14 @@ + + + + + + + + @@ -8211,6 +8262,14 @@ + + + + + + + + @@ -8219,6 +8278,14 @@ + + + + + + + + @@ -8227,6 +8294,14 @@ + + + + + + + + @@ -8235,6 +8310,19 @@ + + + + + + + + + + + + + @@ -11187,6 +11275,11 @@ + + + + + @@ -12534,6 +12627,14 @@ + + + + + + + + @@ -12558,6 +12659,14 @@ + + + + + + + + @@ -12576,6 +12685,14 @@ + + + + + + + + @@ -12600,6 +12717,14 @@ + + + + + + + + @@ -12624,6 +12749,14 @@ + + + + + + + + From f8ad342dc944786e059687a3640d4fe64c37f475 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Tar=C3=AD?= Date: Mon, 19 Jan 2026 16:53:19 +0100 Subject: [PATCH 017/260] chore: [ANDROAPP-7463] Change database creation date type on main presenter test [skip size] (#4600) * chore: [ANDROAPP-7463] update databaseCreationDate type * chore: [ANDROAPP-7463] fix test * chore: [ANDROAPP-7463] add dependency verification metadata --- .../dhis2/usescases/main/MainPresenterTest.kt | 5 +- gradle/verification-metadata.xml | 427 ++++++++++++++++++ 2 files changed, 430 insertions(+), 2 deletions(-) diff --git a/app/src/test/java/org/dhis2/usescases/main/MainPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/main/MainPresenterTest.kt index 1e62905099f..af876ab2d4e 100644 --- a/app/src/test/java/org/dhis2/usescases/main/MainPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/main/MainPresenterTest.kt @@ -32,6 +32,7 @@ import org.dhis2.mobile.commons.domain.invoke import org.dhis2.usescases.login.SyncIsPerformedInteractor import org.dhis2.usescases.main.domain.LogoutUser import org.dhis2.usescases.settings.DeleteUserData +import org.hisp.dhis.android.core.arch.helpers.DateUtils import org.hisp.dhis.android.core.category.CategoryCombo import org.hisp.dhis.android.core.category.CategoryOptionCombo import org.hisp.dhis.android.core.configuration.internal.DatabaseAccount @@ -205,7 +206,7 @@ class MainPresenterTest { .serverUrl("https://www.random.com/") .encrypted(false) .databaseName("none") - .databaseCreationDate("16/2/2012") + .databaseCreationDate(DateUtils.SIMPLE_DATE_FORMAT.parse("2012-2-16")) .build() val secondRandomUserAccount = DatabaseAccount @@ -214,7 +215,7 @@ class MainPresenterTest { .serverUrl("https://www.random.com/") .encrypted(false) .databaseName("none") - .databaseCreationDate("16/2/2012") + .databaseCreationDate(DateUtils.SIMPLE_DATE_FORMAT.parse("2012-2-16")) .build() val randomFile = File("random") diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 38d2a9bff69..24c738bf1c1 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -46,6 +46,11 @@ + + + + + @@ -269,6 +274,14 @@ + + + + + + + + @@ -342,6 +355,11 @@ + + + + + @@ -2067,6 +2085,9 @@ + + + @@ -2171,6 +2192,11 @@ + + + + + @@ -2536,6 +2562,11 @@ + + + + + @@ -3767,6 +3798,11 @@ + + + + + @@ -3775,6 +3811,14 @@ + + + + + + + + @@ -3788,11 +3832,24 @@ + + + + + + + + + + + + + @@ -3801,11 +3858,24 @@ + + + + + + + + + + + + + @@ -3814,6 +3884,14 @@ + + + + + + + + @@ -3994,6 +4072,11 @@ + + + + + @@ -4002,11 +4085,24 @@ + + + + + + + + + + + + + @@ -4015,6 +4111,14 @@ + + + + + + + + @@ -4025,6 +4129,11 @@ + + + + + @@ -4033,6 +4142,14 @@ + + + + + + + + @@ -5640,6 +5757,9 @@ + + + @@ -6402,6 +6522,11 @@ + + + + + @@ -6673,6 +6798,9 @@ + + + @@ -7697,6 +7825,14 @@ + + + + + + + + @@ -7705,6 +7841,14 @@ + + + + + + + + @@ -7713,6 +7857,14 @@ + + + + + + + + @@ -7721,6 +7873,14 @@ + + + + + + + + @@ -7729,6 +7889,14 @@ + + + + + + + + @@ -7737,6 +7905,14 @@ + + + + + + + + @@ -7745,6 +7921,14 @@ + + + + + + + + @@ -7753,6 +7937,14 @@ + + + + + + + + @@ -7761,6 +7953,14 @@ + + + + + + + + @@ -7769,6 +7969,14 @@ + + + + + + + + @@ -7777,6 +7985,14 @@ + + + + + + + + @@ -7785,6 +8001,14 @@ + + + + + + + + @@ -7793,6 +8017,14 @@ + + + + + + + + @@ -7801,6 +8033,14 @@ + + + + + + + + @@ -7809,6 +8049,14 @@ + + + + + + + + @@ -7817,6 +8065,14 @@ + + + + + + + + @@ -7825,6 +8081,14 @@ + + + + + + + + @@ -7833,6 +8097,14 @@ + + + + + + + + @@ -7841,6 +8113,14 @@ + + + + + + + + @@ -7849,6 +8129,14 @@ + + + + + + + + @@ -7857,6 +8145,14 @@ + + + + + + + + @@ -7865,6 +8161,14 @@ + + + + + + + + @@ -7873,6 +8177,14 @@ + + + + + + + + @@ -7881,6 +8193,14 @@ + + + + + + + + @@ -7889,6 +8209,14 @@ + + + + + + + + @@ -7897,6 +8225,14 @@ + + + + + + + + @@ -8439,11 +8775,24 @@ + + + + + + + + + + + + + @@ -8881,6 +9230,9 @@ + + + @@ -9256,6 +9608,9 @@ + + + @@ -9299,6 +9654,11 @@ + + + + + @@ -9315,6 +9675,14 @@ + + + + + + + + @@ -9323,6 +9691,14 @@ + + + + + + + + @@ -11091,6 +11467,9 @@ + + + @@ -11187,6 +11566,11 @@ + + + + + @@ -11981,6 +12365,11 @@ + + + + + @@ -12009,6 +12398,14 @@ + + + + + + + + @@ -12041,6 +12438,14 @@ + + + + + + + + @@ -12067,6 +12472,14 @@ + + + + + + + + @@ -12099,6 +12512,14 @@ + + + + + + + + @@ -12177,6 +12598,9 @@ + + + @@ -12528,6 +12952,9 @@ + + + From 391342074a9e7f1044daf10b93d052dd16ecf064 Mon Sep 17 00:00:00 2001 From: Rohit <168576901+rohit-wa@users.noreply.github.com> Date: Tue, 20 Jan 2026 13:26:44 +0530 Subject: [PATCH 018/260] chore: [ANDROAPP-7432] add android app to dhis2 dependency tracker (#4590) * chore: rename dependency-track workflow and set gradle group/version * chore: rename dependency-track workflow and set gradle group/version * chore: rename dependency-track workflow and set gradle group/version * reverting changes * chore: [ANDROAPP-7432] added workflow_dispatch: --- .github/workflows/generate-and-upload-bom.yml | 3 ++- build.gradle.kts | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/generate-and-upload-bom.yml b/.github/workflows/generate-and-upload-bom.yml index 759a9ce310a..75b06db8311 100644 --- a/.github/workflows/generate-and-upload-bom.yml +++ b/.github/workflows/generate-and-upload-bom.yml @@ -1,6 +1,7 @@ -name: 'This workflow creates bill of material and uploads it to Dependency-Track each night' +name: 'Dependency Tracker' on: + workflow_dispatch: schedule: - cron: '0 0 * * *' diff --git a/build.gradle.kts b/build.gradle.kts index e89cca27fa1..7b62571c3c3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,4 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. +group = "org.hisp.dhis" +version = libs.versions.vName.get() + buildscript { dependencies { classpath(libs.gradlePlugin) From 4db7d3a037b3bc10e0cd2c8c3bf2404cc5e17f9c Mon Sep 17 00:00:00 2001 From: Xavier Molloy Date: Tue, 20 Jan 2026 09:06:30 +0100 Subject: [PATCH 019/260] fix: correct dependency verification conflict resolution error --- gradle/verification-metadata.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 4f67b5e7f58..386a632c1f6 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -11654,6 +11654,7 @@ + From 7121cc2190867ac2f5d7b23f3581686bd4fef399 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Tar=C3=AD?= Date: Wed, 21 Jan 2026 12:57:16 +0100 Subject: [PATCH 020/260] chore: [ANDROAPP-7466] add new MetadataSyncPeriod item 6h (#4604) --- app/src/main/java/org/dhis2/bindings/SettingExtensions.kt | 1 + app/src/test/java/org/dhis2/bindings/SettingsExtensionsTest.kt | 1 + 2 files changed, 2 insertions(+) diff --git a/app/src/main/java/org/dhis2/bindings/SettingExtensions.kt b/app/src/main/java/org/dhis2/bindings/SettingExtensions.kt index bafbb9a0aba..66102244615 100644 --- a/app/src/main/java/org/dhis2/bindings/SettingExtensions.kt +++ b/app/src/main/java/org/dhis2/bindings/SettingExtensions.kt @@ -15,6 +15,7 @@ const val MANUAL = 0 fun MetadataSyncPeriod.toSeconds(): Int = when (this) { MetadataSyncPeriod.EVERY_HOUR -> EVERY_HOUR + MetadataSyncPeriod.EVERY_6_HOURS -> EVERY_6_HOUR MetadataSyncPeriod.EVERY_12_HOURS -> EVERY_12_HOUR MetadataSyncPeriod.EVERY_24_HOURS -> EVERY_24_HOUR MetadataSyncPeriod.EVERY_7_DAYS -> EVERY_7_DAYS diff --git a/app/src/test/java/org/dhis2/bindings/SettingsExtensionsTest.kt b/app/src/test/java/org/dhis2/bindings/SettingsExtensionsTest.kt index c2cc572746f..21bb995381c 100644 --- a/app/src/test/java/org/dhis2/bindings/SettingsExtensionsTest.kt +++ b/app/src/test/java/org/dhis2/bindings/SettingsExtensionsTest.kt @@ -8,6 +8,7 @@ class SettingsExtensionsTest { private val metadataSyncingPeriods = arrayListOf( EVERY_HOUR, + EVERY_6_HOUR, EVERY_12_HOUR, EVERY_24_HOUR, EVERY_7_DAYS, From 165951ddb2943a0d46508b788cf6ccc1ad255e0f Mon Sep 17 00:00:00 2001 From: Xavier Molloy Date: Fri, 23 Jan 2026 07:33:44 +0100 Subject: [PATCH 021/260] fix: Manage Invalid configuration d2 error (#4606) * fix: Manage Invalid configuration d2 error * fix: Update deprecated sdk methods * fix: fix unit tests --- .../data/DataSetInstanceRepositoryImpl.kt | 54 ++++++++++++------- .../data/DataSetInstanceRepository.kt | 3 ++ .../aggregates/domain/GetDataValueData.kt | 1 + .../aggregates/domain/GetDataValueInput.kt | 2 + .../mobile/aggregates/domain/SetDataValue.kt | 1 + .../domain/GetDataValueInputTest.kt | 2 +- .../mobile/commons/error/DomainErrorMapper.kt | 1 + .../resources/D2ErrorMessageProviderImpl.kt | 2 + .../composeResources/values/strings.xml | 1 + 9 files changed, 46 insertions(+), 21 deletions(-) diff --git a/aggregates/src/androidMain/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepositoryImpl.kt b/aggregates/src/androidMain/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepositoryImpl.kt index 66e74b898e7..d10db4a946c 100644 --- a/aggregates/src/androidMain/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepositoryImpl.kt +++ b/aggregates/src/androidMain/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepositoryImpl.kt @@ -415,11 +415,12 @@ internal class DataSetInstanceRepositoryImpl( .dataValueModule() .dataValues() .value( - periodId, - orgUnitUid, - dataElementUid, - categoryOptionComboUid, - attrOptionComboUid, + period = periodId, + organisationUnit = orgUnitUid, + dataElement = dataElementUid, + categoryOptionCombo = categoryOptionComboUid, + attributeOptionCombo = attrOptionComboUid, + sourceDataSet = dataSetUid, ).blockingGet() ?.syncState() @@ -817,6 +818,7 @@ internal class DataSetInstanceRepositoryImpl( orgUnitUid: String, categoryOptionComboUid: String, attrOptionComboUid: String, + sourceDataSetUid: String, ): Pair? { val dataElement = d2 @@ -847,6 +849,7 @@ internal class DataSetInstanceRepositoryImpl( dataElement = dataElementUid, categoryOptionCombo = categoryOptionComboUid, attributeOptionCombo = attrOptionComboUid, + sourceDataSet = sourceDataSetUid, ).blockingGet() ?.value() ?.toDoubleOrNull() @@ -982,6 +985,7 @@ internal class DataSetInstanceRepositoryImpl( attrOptionComboUid: String, dataElementUid: String, categoryOptionComboUid: String, + sourceDataSetUid: String, ) = d2 .dataValueModule() .dataValues() @@ -993,6 +997,7 @@ internal class DataSetInstanceRepositoryImpl( dataElementUid, categoryOptionComboUid, attrOptionComboUid, + sourceDataSetUid, ).blockingGet() ?.value() @@ -1003,6 +1008,7 @@ internal class DataSetInstanceRepositoryImpl( dataElementUid: String, categoryOptionComboUid: String, value: String?, + sourceDataSetUid: String, ): Result { val valueRepository = d2 @@ -1014,6 +1020,7 @@ internal class DataSetInstanceRepositoryImpl( dataElement = dataElementUid, categoryOptionCombo = categoryOptionComboUid, attributeOptionCombo = attrOptionComboUid, + sourceDataSet = sourceDataSetUid, ) val dataElement = @@ -1257,6 +1264,7 @@ internal class DataSetInstanceRepositoryImpl( ValidationResultStatus.valueOf(result.status().name), mapViolations( violations = result.violations(), + dataSetUid = dataSetUid, periodId = periodId, orgUnitUid = orgUnitUid, attrOptionComboUid = attrOptionComboUid, @@ -1291,6 +1299,7 @@ internal class DataSetInstanceRepositoryImpl( private fun mapViolations( violations: List, + dataSetUid: String, periodId: String, orgUnitUid: String, attrOptionComboUid: String, @@ -1301,6 +1310,7 @@ internal class DataSetInstanceRepositoryImpl( it.validationRule().instruction(), mapDataElements( dataElementUids = it.dataElementUids(), + dataSetUid = dataSetUid, periodId = periodId, orgUnitUid = orgUnitUid, attrOptionComboUid = attrOptionComboUid, @@ -1310,6 +1320,7 @@ internal class DataSetInstanceRepositoryImpl( private fun mapDataElements( dataElementUids: Set, + dataSetUid: String, periodId: String, orgUnitUid: String, attrOptionComboUid: String, @@ -1348,21 +1359,23 @@ internal class DataSetInstanceRepositoryImpl( .dataValueModule() .dataValues() .value( - periodId, - orgUnitUid, - de.uid(), - catOptCombo.uid(), - attrOptionComboUid, + period = periodId, + organisationUnit = orgUnitUid, + dataElement = de.uid(), + categoryOptionCombo = catOptCombo.uid(), + attributeOptionCombo = attrOptionComboUid, + sourceDataSet = dataSetUid, ).blockingExists() && d2 .dataValueModule() .dataValues() .value( - periodId, - orgUnitUid, - de.uid(), - catOptCombo.uid(), - attrOptionComboUid, + period = periodId, + organisationUnit = orgUnitUid, + dataElement = de.uid(), + categoryOptionCombo = catOptCombo.uid(), + attributeOptionCombo = attrOptionComboUid, + sourceDataSet = dataSetUid, ).blockingGet() ?.deleted() != true ) { @@ -1370,11 +1383,12 @@ internal class DataSetInstanceRepositoryImpl( .dataValueModule() .dataValues() .value( - periodId, - orgUnitUid, - de.uid(), - catOptCombo.uid(), - attrOptionComboUid, + period = periodId, + organisationUnit = orgUnitUid, + dataElement = de.uid(), + categoryOptionCombo = catOptCombo.uid(), + attributeOptionCombo = attrOptionComboUid, + sourceDataSet = dataSetUid, ).blockingGet() ?.value() ?: "-" } else { diff --git a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepository.kt b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepository.kt index b05c6f6d4db..9ef94b10437 100644 --- a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepository.kt +++ b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepository.kt @@ -87,6 +87,7 @@ internal interface DataSetInstanceRepository { attrOptionComboUid: String, dataElementUid: String, categoryOptionComboUid: String, + sourceDataSetUid: String, ): String? suspend fun updateValue( @@ -96,6 +97,7 @@ internal interface DataSetInstanceRepository { dataElementUid: String, categoryOptionComboUid: String, value: String?, + sourceDataSetUid: String, ): Result suspend fun categoryOptionComboFromCategoryOptions( @@ -165,6 +167,7 @@ internal interface DataSetInstanceRepository { orgUnitUid: String, categoryOptionComboUid: String, attrOptionComboUid: String, + sourceDataSetUid: String, ): Pair? suspend fun uploadFile( diff --git a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/domain/GetDataValueData.kt b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/domain/GetDataValueData.kt index 806d71cba6c..db2a48536d8 100644 --- a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/domain/GetDataValueData.kt +++ b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/domain/GetDataValueData.kt @@ -36,6 +36,7 @@ internal class GetDataValueData( orgUnitUid = orgUnitUid, attrOptionComboUid = attrOptionComboUid, categoryOptionComboUid = key.second, + sourceDataSetUid = datasetUid, )?.first, ) } diff --git a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/domain/GetDataValueInput.kt b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/domain/GetDataValueInput.kt index 10e579b42b6..0ae33c4e922 100644 --- a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/domain/GetDataValueInput.kt +++ b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/domain/GetDataValueInput.kt @@ -45,6 +45,7 @@ internal class GetDataValueInput( attrOptionComboUid = attrOptionComboUid, dataElementUid = dataElementUid, categoryOptionComboUid = categoryOptionComboUid, + sourceDataSetUid = dataSetUid, ) val conflicts = repository.conflicts( @@ -63,6 +64,7 @@ internal class GetDataValueInput( orgUnitUid = orgUnitUid, categoryOptionComboUid = categoryOptionComboUid, attrOptionComboUid = attrOptionComboUid, + sourceDataSetUid = dataSetUid, ) CellInfo( diff --git a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/domain/SetDataValue.kt b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/domain/SetDataValue.kt index 5ae00192639..d92058d2c90 100644 --- a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/domain/SetDataValue.kt +++ b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/domain/SetDataValue.kt @@ -25,6 +25,7 @@ internal class SetDataValue( dataElementUid = dataElementUid, categoryOptionComboUid = categoryOptionComboUid, value = value, + sourceDataSetUid = dataSetUid, ) } } diff --git a/aggregates/src/commonTest/kotlin/org/dhis2/mobile/aggregates/domain/GetDataValueInputTest.kt b/aggregates/src/commonTest/kotlin/org/dhis2/mobile/aggregates/domain/GetDataValueInputTest.kt index b6c8a3d380f..574902e8bdc 100644 --- a/aggregates/src/commonTest/kotlin/org/dhis2/mobile/aggregates/domain/GetDataValueInputTest.kt +++ b/aggregates/src/commonTest/kotlin/org/dhis2/mobile/aggregates/domain/GetDataValueInputTest.kt @@ -46,7 +46,7 @@ internal class GetDataValueInputTest : KoinTest { private val repository = mock { onRunBlocking { dataElementInfo(any(), any(), any()) } doReturn mockedDataElementInfo - onRunBlocking { value(any(), any(), any(), any(), any()) } doReturn "Current value" + onRunBlocking { value(any(), any(), any(), any(), any(), any()) } doReturn "Current value" onRunBlocking { conflicts(any(), any(), any(), any(), any(), any()) } doReturn Pair( emptyList(), diff --git a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/error/DomainErrorMapper.kt b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/error/DomainErrorMapper.kt index 2a13641ed6c..3fbe1042a92 100644 --- a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/error/DomainErrorMapper.kt +++ b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/error/DomainErrorMapper.kt @@ -80,6 +80,7 @@ class DomainErrorMapper( D2ErrorCode.NO_DHIS2_SERVER, D2ErrorCode.SERVER_URL_NULL, D2ErrorCode.SERVER_URL_MALFORMED, + D2ErrorCode.INVALID_CONFIGURATION, D2ErrorCode.INVALID_DHIS_VERSION, -> DomainError.ConfigurationError(errorMessage) diff --git a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/resources/D2ErrorMessageProviderImpl.kt b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/resources/D2ErrorMessageProviderImpl.kt index ec2d3bed3eb..beaa22da65b 100644 --- a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/resources/D2ErrorMessageProviderImpl.kt +++ b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/resources/D2ErrorMessageProviderImpl.kt @@ -203,6 +203,8 @@ class D2ErrorMessageProviderImpl : D2ErrorMessageProvider { D2ErrorCode.ORGUNIT_NOT_IN_SEARCH_SCOPE -> getString(Res.string.error_org_unit_scope) + D2ErrorCode.INVALID_CONFIGURATION -> + getString(Res.string.invalid_configuration) D2ErrorCode.INVALID_CHARACTERS -> getString(Res.string.error_invalid_characters) diff --git a/commonskmm/src/commonMain/composeResources/values/strings.xml b/commonskmm/src/commonMain/composeResources/values/strings.xml index d8ce06638d2..950703d6ec7 100644 --- a/commonskmm/src/commonMain/composeResources/values/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values/strings.xml @@ -201,6 +201,7 @@ SMS is not supported. There are not enough attributes to perform the search. Please refine your search with more attributes. Online search is only available for your user search organisation units. + Invalid configuration There are invalid characters in the query. Please ask the administrator to verify the server configuration (relaxedQueryChars,...). The server is currently unavailable. Try again later. You are offline. Connect to the internet and try again. From e9e4c8a2421fc5317619300cf73554de8dc42406 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Fri, 23 Jan 2026 12:14:35 +0100 Subject: [PATCH 022/260] fix: set compose multiplatform resources of type XML (#4608) --- .tx/config | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.tx/config b/.tx/config index 1041abf2e4c..e7420f6fab8 100644 --- a/.tx/config +++ b/.tx/config @@ -62,7 +62,7 @@ resource_name = Compose Table file_filter = tracker/src/commonMain/composeResources/values-/strings.xml source_file = tracker/src/commonMain/composeResources/values/strings.xml source_lang = en -type = ANDROID +type = XML minimum_perc = 0 resource_name = Tracker @@ -70,7 +70,7 @@ resource_name = Tracker file_filter = aggregates/src/commonMain/composeResources/values-/strings.xml source_file = aggregates/src/commonMain/composeResources/values/strings.xml source_lang = en -type = ANDROID +type = XML minimum_perc = 0 resource_name = Aggregates @@ -78,7 +78,7 @@ resource_name = Aggregates file_filter = commonskmm/src/commonMain/composeResources/values-/strings.xml source_file = commonskmm/src/commonMain/composeResources/values/strings.xml source_lang = en -type = ANDROID +type = XML minimum_perc = 0 resource_name = CommonsKMM @@ -86,7 +86,7 @@ resource_name = CommonsKMM file_filter = login/src/commonMain/composeResources/values-/strings.xml source_file = login/src/commonMain/composeResources/values/strings.xml source_lang = en -type = ANDROID +type = XML minimum_perc = 0 resource_name = Login @@ -94,7 +94,7 @@ resource_name = Login file_filter = sync/src/commonMain/composeResources/values-/strings.xml source_file = sync/src/commonMain/composeResources/values/strings.xml source_lang = en -type = ANDROID +type = XML minimum_perc = 0 resource_name = Sync From feec09ff1fa03f51069a4f12989334585478e452 Mon Sep 17 00:00:00 2001 From: Xavier Molloy Date: Fri, 23 Jan 2026 13:34:56 +0100 Subject: [PATCH 023/260] fix: [ANDROAPP-7433] Do not format option set display name values (#4607) --- .../dhis2/form/data/RulesUtilsProviderImpl.kt | 66 +++++++++++-------- 1 file changed, 40 insertions(+), 26 deletions(-) diff --git a/form/src/main/java/org/dhis2/form/data/RulesUtilsProviderImpl.kt b/form/src/main/java/org/dhis2/form/data/RulesUtilsProviderImpl.kt index 3710d5b6c55..ab594dd1389 100644 --- a/form/src/main/java/org/dhis2/form/data/RulesUtilsProviderImpl.kt +++ b/form/src/main/java/org/dhis2/form/data/RulesUtilsProviderImpl.kt @@ -4,6 +4,7 @@ import org.dhis2.commons.bindings.formatData import org.dhis2.form.model.FieldUiModel import org.dhis2.form.model.ValueStoreResult import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.android.core.maintenance.D2Error import org.hisp.dhis.android.core.program.ProgramRuleActionType import org.hisp.dhis.android.core.program.ProgramStage @@ -287,6 +288,7 @@ class RulesUtilsProviderImpl( ruleEffect: RuleEffect, fieldViewModels: MutableMap, ) { + // Not implemented } private fun displayKeyValuePair( @@ -294,6 +296,7 @@ class RulesUtilsProviderImpl( ruleEffect: RuleEffect, fieldViewModels: MutableMap, ) { + // Not implemented } private fun hideSection( @@ -343,37 +346,13 @@ class RulesUtilsProviderImpl( valuesToChange[fieldUid] = it } } - val valueToShow = - if (field.optionSet != null && ruleEffect.data?.isNotEmpty() == true) { - val effectOption = - optionsRepository.getOptionByCode( - optionSet = field.optionSet!!, - code = ruleEffect.data!!, - ) - if (effectOption == null) { - configurationErrors.add( - RulesUtilsProviderConfigurationError( - currentRuleUid, - ActionType.ASSIGN, - ConfigurationError.VALUE_TO_ASSIGN_NOT_IN_OPTION_SET, - listOf( - currentRuleUid ?: "", - ruleEffect.data ?: "", - field.optionSet ?: "", - ), - ), - ) - } - effectOption?.displayName() - } else { - ruleEffect.data - } + val valueToShow = getDisplayValue(field.optionSet, ruleEffect.data) ruleEffect.data?.formatData(field.valueType)?.let { formattedValue -> val updatedField = fieldViewModels[assign.field()] ?.setValue(formattedValue) - ?.setDisplayName(valueToShow?.formatData(field.valueType)) + ?.setDisplayName(formatDisplayName(valueToShow, field.valueType, field.optionSet)) ?.setEditable(false) updatedField?.let { @@ -387,6 +366,41 @@ class RulesUtilsProviderImpl( } } + private fun formatDisplayName( + value: String?, + valueType: ValueType?, + optionSetUid: String?, + ): String? = if (optionSetUid != null) value else value?.formatData(valueType) + + private fun getDisplayValue( + optionSetUid: String?, + ruleEffectData: String?, + ): String? = + if (optionSetUid != null && ruleEffectData?.isNotEmpty() == true) { + val effectOption = + optionsRepository.getOptionByCode( + optionSet = optionSetUid, + code = ruleEffectData, + ) + if (effectOption == null) { + configurationErrors.add( + RulesUtilsProviderConfigurationError( + currentRuleUid, + ActionType.ASSIGN, + ConfigurationError.VALUE_TO_ASSIGN_NOT_IN_OPTION_SET, + listOf( + currentRuleUid ?: "", + ruleEffectData, + optionSetUid, + ), + ), + ) + } + effectOption?.displayName() + } else { + ruleEffectData + } + private fun createEvent( createEvent: RuleAction, fieldViewModels: MutableMap, From fdeb1929dae783d69b91e09ae835977b3c28322e Mon Sep 17 00:00:00 2001 From: Ferdy Rodriguez Date: Fri, 23 Jan 2026 14:41:55 +0100 Subject: [PATCH 024/260] chore: [ANDROAPP-7303] Update apk name and use custom debug keystore (#4603) * updates continues delivery workflow * updates continues delivery workflow * Add debug suffix to apk name * Add config for using debug keystore store in the CI * change debug keystore name and extension * change debug keystore name and extension --- .github/workflows/continuous-delivery.yml | 20 +++++++++++++++++- app/build.gradle.kts | 25 +++++++++++++++++++++++ gradle/verification-metadata.xml | 9 ++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/.github/workflows/continuous-delivery.yml b/.github/workflows/continuous-delivery.yml index 37700ef863a..bb1777b6b94 100644 --- a/.github/workflows/continuous-delivery.yml +++ b/.github/workflows/continuous-delivery.yml @@ -42,20 +42,38 @@ 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 --dependency-verification lenient assembleDhis2Debug env: SENTRY_DSN: ${{ secrets.SENTRY_DSN }} + 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: 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" + - name: Get JIRA issue number + id: jira-issue-number + run: | + BRANCH_NAME="${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" + JIRA_ISSUE=$(echo "$BRANCH_NAME" | grep -oE '[a-zA-Z]+-[0-9]+' | head -1 || echo "$BRANCH_NAME") + echo "issue=$JIRA_ISSUE" >> "$GITHUB_OUTPUT" + # Upload Artifact Build - name: Upload Android artifacts uses: actions/upload-artifact@v6.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: ${{ env.main_project_module }}/build/outputs/apk/dhis2/debug/dhis2-v${{ steps.read-version.outputs.vName }}-${{ steps.jira-issue-number.outputs.issue}}.apk diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 479b5a6139f..449181cd068 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -39,6 +39,21 @@ android { } } + val getBranchName by extra { + fun(): String { + return try { + val process = ProcessBuilder("git", "rev-parse", "--abbrev-ref", "HEAD") + .redirectOutput(ProcessBuilder.Redirect.PIPE) + .redirectError(ProcessBuilder.Redirect.PIPE) + .start() + val branchName = process.inputStream.bufferedReader().readText().trim() + branchName.replace(Regex("[/\\\\:*?\"<>|]"), "-") + } catch (e: Exception) { + "unknown" + } + } + } + signingConfigs { create("release") { keyAlias = System.getenv("SIGNING_KEY_ALIAS") @@ -56,6 +71,15 @@ android { } storePassword = System.getenv("TRAINING_STORE_PASSWORD") } + val customKeystorePath = System.getenv("DEBUG_KEYSTORE_PATH") + if (customKeystorePath != null ) { + getByName("debug") { + keyAlias = System.getenv("DEBUG_KEYSTORE_ALIAS") + keyPassword = System.getenv("DEBUG_KEY_PASS") + storeFile = file(customKeystorePath) + storePassword = System.getenv("DEBUG_KEYSTORE_PASSWORD") + } + } } testOptions { @@ -215,6 +239,7 @@ android { val suffix = when { buildType == "release" && flavorName == "dhis2Training" -> "-training" buildType == "release" && flavorName == "dhis2PlayServices" -> "-googlePlay" + buildType == "debug" -> "-${getBranchName()}" else -> "" } diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 386a632c1f6..1b4dfb351c8 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -11530,9 +11530,15 @@ + + + + + + @@ -12198,6 +12204,9 @@ + + + From e74911fd0f73f362bd29f0cd1b5e9392ce7c5bed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Tue, 27 Jan 2026 09:46:49 +0100 Subject: [PATCH 025/260] ANDROAPP-7231-Test-legacy-login [skip size] (#4410) * refactor(tests): integrate ComposeTestRule into homeRobot for improved UI testing * tests: create shouldLoginWithoutOauth test * refactor(tests): remove redundant home screen checks in login tests * refactor(tests): Editing test to finish after accepting Tracking Permission * test: For landscape testing, close keyboard after entering credentials * test: keep waitUntilAtLeastOneExists on MainRobot.kt --- .../mocks/settingswebapp/generalsettings.json | 9 + .../org/dhis2/usescases/UseCaseTestsSuite.kt | 1 + .../org/dhis2/usescases/about/AboutTest.kt | 6 +- .../org/dhis2/usescases/login/LoginRobot.kt | 173 ++++++++++++------ .../org/dhis2/usescases/login/LoginTest.kt | 165 ++++++----------- .../org/dhis2/usescases/main/MainRobot.kt | 14 +- .../java/org/dhis2/usescases/main/MainTest.kt | 4 +- .../java/org/dhis2/usescases/pin/PinTest.kt | 6 +- .../dhis2/usescases/settings/SettingsTest.kt | 14 +- .../login/main/data/LoginRepositoryImpl.kt | 16 +- .../login/accounts/ui/screen/AccountItem.kt | 6 +- .../login/main/ui/screen/CredentialsScreen.kt | 17 +- 12 files changed, 230 insertions(+), 201 deletions(-) create mode 100644 app/src/androidTest/assets/mocks/settingswebapp/generalsettings.json diff --git a/app/src/androidTest/assets/mocks/settingswebapp/generalsettings.json b/app/src/androidTest/assets/mocks/settingswebapp/generalsettings.json new file mode 100644 index 00000000000..8b14c43405f --- /dev/null +++ b/app/src/androidTest/assets/mocks/settingswebapp/generalsettings.json @@ -0,0 +1,9 @@ +{ + "encryptDB": false, + "mobileConfiguration": { + "disableAllSettings": false + }, + "reservedValues": 100, + "smsGateway": "", + "smsResultSender": "" +} diff --git a/app/src/androidTest/java/org/dhis2/usescases/UseCaseTestsSuite.kt b/app/src/androidTest/java/org/dhis2/usescases/UseCaseTestsSuite.kt index 76b6b8edc7c..84e2ac1e94f 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/UseCaseTestsSuite.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/UseCaseTestsSuite.kt @@ -30,5 +30,6 @@ import org.junit.runners.Suite SyncActivityTest::class, TeiDashboardTest::class, SchedulingDialogUiTest::class, + LoginTest::class, ) class UseCaseTestsSuite diff --git a/app/src/androidTest/java/org/dhis2/usescases/about/AboutTest.kt b/app/src/androidTest/java/org/dhis2/usescases/about/AboutTest.kt index 2e3261c54e1..d2b1c598757 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/about/AboutTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/about/AboutTest.kt @@ -1,5 +1,6 @@ package org.dhis2.usescases.about +import androidx.compose.ui.test.junit4.createComposeRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.rule.ActivityTestRule import org.dhis2.bindings.buildInfo @@ -18,13 +19,16 @@ class AboutTest : BaseTest() { @get:Rule val rule = ActivityTestRule(MainActivity::class.java, false, false) + @get:Rule + val composeTestRule = createComposeRule() + @Test fun shouldCheckVersionsWhenOpenAboutScreen() { startActivity() val appVersion = getAppVersionName() val sdkVersion = getSDKVersionName() - homeRobot { + homeRobot(composeTestRule) { clickOnNavigationDrawerMenu() clickAbout() } diff --git a/app/src/androidTest/java/org/dhis2/usescases/login/LoginRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/login/LoginRobot.kt index fce28c37788..a3fffd53c88 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/login/LoginRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/login/LoginRobot.kt @@ -1,34 +1,24 @@ package org.dhis2.usescases.login import androidx.compose.ui.test.ExperimentalTestApi -import androidx.compose.ui.test.assert import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.assertIsEnabled +import androidx.compose.ui.test.assertIsNotEnabled import androidx.compose.ui.test.hasTestTag import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.ComposeTestRule import androidx.compose.ui.test.onNodeWithTag -import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performTextReplacement -import androidx.test.espresso.Espresso.onView -import androidx.test.espresso.action.ViewActions.click -import androidx.test.espresso.assertion.ViewAssertions.matches -import androidx.test.espresso.intent.Intents -import androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent -import androidx.test.espresso.intent.matcher.IntentMatchers.hasExtra -import androidx.test.espresso.matcher.ViewMatchers.isDisplayed -import androidx.test.espresso.matcher.ViewMatchers.withId -import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.platform.app.InstrumentationRegistry -import org.dhis2.R import org.dhis2.common.BaseRobot -import org.dhis2.commons.dialogs.bottomsheet.CLICKABLE_TEXT_TAG +import org.dhis2.mobile.login.accounts.ui.screen.ACCOUNT_ITEM_TAG +import org.dhis2.mobile.login.main.ui.screen.CREDENTIALS_ERROR_INFO_BAR_TAG +import org.dhis2.mobile.login.main.ui.screen.CREDENTIALS_LOGIN_BUTTON_TAG +import org.dhis2.mobile.login.main.ui.screen.CREDENTIALS_MANAGE_ACCOUNTS_BUTTON_TAG +import org.dhis2.mobile.login.main.ui.screen.CREDENTIALS_PASSWORD_INPUT_TAG +import org.dhis2.mobile.login.main.ui.screen.CREDENTIALS_USERNAME_INPUT_TAG import org.dhis2.mobile.login.main.ui.screen.SERVER_VALIDATION_CONTENT_BUTTON_TAG -import org.dhis2.usescases.BaseTest.Companion.MOCK_SERVER_URL -import org.dhis2.usescases.about.PolicyView -import org.dhis2.usescases.qrScanner.ScanActivity -import org.dhis2.utils.WebViewActivity -import org.hamcrest.CoreMatchers fun loginRobot( @@ -42,7 +32,6 @@ fun loginRobot( class LoginRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { - val context = InstrumentationRegistry.getInstrumentation().targetContext @OptIn(ExperimentalTestApi::class) @@ -58,71 +47,135 @@ class LoginRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { composeTestRule.onNodeWithTag("INPUT_QR_CODE_FIELD").performTextReplacement(server) } - fun clickQRButton() { - composeTestRule.onNodeWithTag("INPUT_QR_CODE_BUTTON").performClick() + @OptIn(ExperimentalTestApi::class) + fun checkServerInputIsDisplayed() { + composeTestRule.waitUntilExactlyOneExists( + hasTestTag("INPUT_QR_CODE_FIELD"), + TIMEOUT, + ) + composeTestRule.onNodeWithTag("INPUT_QR_CODE_FIELD").assertIsDisplayed() } - - fun checkAuthErrorAlertIsVisible() { - waitForView(withText(LOGIN_ERROR_TITLE)).check(matches(isDisplayed())) + @OptIn(ExperimentalTestApi::class) + fun typeUsername(username: String) { + // Wait for credentials screen to appear + composeTestRule.waitUntilExactlyOneExists( + hasTestTag(CREDENTIALS_USERNAME_INPUT_TAG), + TIMEOUT, + ) + // Click on the username input to focus it + composeTestRule.onNodeWithTag(CREDENTIALS_USERNAME_INPUT_TAG).performClick() + // Now find the inner text field and type the username + composeTestRule.onNodeWithTag("INPUT_USER_FIELD").performTextReplacement(username) } - fun clickOKAuthErrorAlert() { - onView(withText(OK)).perform(click()) + @OptIn(ExperimentalTestApi::class) + fun typePassword(password: String) { + // Wait for password field to appear + composeTestRule.waitUntilExactlyOneExists( + hasTestTag(CREDENTIALS_PASSWORD_INPUT_TAG), + TIMEOUT, + ) + // Click on the password input to focus it + composeTestRule.onNodeWithTag(CREDENTIALS_PASSWORD_INPUT_TAG).performClick() + // Now find the inner text field and type the password + composeTestRule.onNodeWithTag("INPUT_PASSWORD_TEXT_FIELD").performTextReplacement(password) } - fun checkUnblockSessionViewIsVisible() { - onView(withId(R.id.cardview_pin)).check(matches(isDisplayed())) + @OptIn(ExperimentalTestApi::class) + fun checkLoginButtonIsEnabled() { + closeKeyboard() + composeTestRule.waitUntilExactlyOneExists( + hasTestTag(CREDENTIALS_LOGIN_BUTTON_TAG), + TIMEOUT, + ) + composeTestRule.onNodeWithTag(CREDENTIALS_LOGIN_BUTTON_TAG) + .assertIsEnabled() } - fun checkURL(url: String) { - composeTestRule.onNodeWithTag("INPUT_QR_CODE_FIELD").assert(hasText(url)) + @OptIn(ExperimentalTestApi::class) + fun checkLoginButtonIsDisabled() { + composeTestRule.waitUntilExactlyOneExists( + hasTestTag(CREDENTIALS_LOGIN_BUTTON_TAG), + TIMEOUT, + ) + composeTestRule.onNodeWithTag(CREDENTIALS_LOGIN_BUTTON_TAG) + .assertIsNotEnabled() } - fun checkWebviewWithRecoveryAccountIsOpened() { - Intents.intended( - CoreMatchers.allOf( - hasExtra( - WebViewActivity.WEB_VIEW_URL, - "${MOCK_SERVER_URL}/dhis-web-commons/security/recovery.action" - ), - hasComponent(WebViewActivity::class.java.name) - ) + @OptIn(ExperimentalTestApi::class) + fun clickLoginButton() { + composeTestRule.waitUntilExactlyOneExists( + hasTestTag(CREDENTIALS_LOGIN_BUTTON_TAG), + TIMEOUT, ) + composeTestRule.onNodeWithTag(CREDENTIALS_LOGIN_BUTTON_TAG).performClick() } - fun checkQRScanIsOpened() { - Intents.intended(CoreMatchers.allOf(hasComponent(ScanActivity::class.java.name))) + @OptIn(ExperimentalTestApi::class) + fun checkServerValidationErrorIsDisplayed() { + // Wait for error to appear in the supporting text of the server input + composeTestRule.waitUntilAtLeastOneExists( + hasTestTag("INPUT_QR_CODE_FIELD"), + TIMEOUT, + ) + // The error is displayed as supporting text, we just need to verify the field is in error state } - fun checkShareDataDialogIsDisplayed() { - val title = InstrumentationRegistry.getInstrumentation() - .targetContext.getString(R.string.improve_app_msg_title) - composeTestRule.onNodeWithText(title) + @OptIn(ExperimentalTestApi::class) + fun checkCredentialsErrorIsDisplayed() { + // Wait for the InfoBar with error message to appear + composeTestRule.waitUntilAtLeastOneExists( + hasTestTag(CREDENTIALS_ERROR_INFO_BAR_TAG), + TIMEOUT, + ) + composeTestRule.onNodeWithTag(CREDENTIALS_ERROR_INFO_BAR_TAG).assertIsDisplayed() } - fun clickOnPrivacyPolicy() { - composeTestRule.onNodeWithTag(CLICKABLE_TEXT_TAG).performClick() + @OptIn(ExperimentalTestApi::class) + fun clickOnManageAccountsButton() { + composeTestRule.waitUntilExactlyOneExists( + hasTestTag(CREDENTIALS_MANAGE_ACCOUNTS_BUTTON_TAG), + TIMEOUT, + ) + composeTestRule.onNodeWithTag(CREDENTIALS_MANAGE_ACCOUNTS_BUTTON_TAG).performClick() } - fun acceptTrackerDialog() { - val title = InstrumentationRegistry - .getInstrumentation() - .targetContext.getString(R.string.improve_app_msg_title) - composeTestRule.onNodeWithText(title).assertIsDisplayed() + @OptIn(ExperimentalTestApi::class) + fun checkAccountIsListed(serverUrl: String, username: String) { + val accountTag = "${ACCOUNT_ITEM_TAG}_${serverUrl}_${username}" + composeTestRule.waitUntilExactlyOneExists( + hasTestTag(accountTag), + TIMEOUT, + ) + composeTestRule.onNodeWithTag(accountTag).assertIsDisplayed() } - fun clickYesOnAcceptTrackerDialog() { - composeTestRule.onNodeWithText(context.getString(R.string.yes)) - .performClick() + @OptIn(ExperimentalTestApi::class) + fun clickOnAccount(serverUrl: String, username: String) { + val accountTag = "${ACCOUNT_ITEM_TAG}_${serverUrl}_${username}" + composeTestRule.waitUntilExactlyOneExists( + hasTestTag(accountTag), + TIMEOUT, + ) + composeTestRule.onNodeWithTag(accountTag).performClick() } - fun checkPrivacyViewIsOpened() { - Intents.intended(CoreMatchers.allOf(hasComponent(PolicyView::class.java.name))) + @OptIn(ExperimentalTestApi::class) + fun checkTrackingPermissionDialogIsDisplayed() { + composeTestRule.waitUntilExactlyOneExists( + hasText("Do you want to help us improve this app?"), + TIMEOUT, + ) } - companion object { - const val LOGIN_ERROR_TITLE = "Login error" - const val OK = "OK" + @OptIn(ExperimentalTestApi::class) + fun acceptTrackingPermission() { + checkTrackingPermissionDialogIsDisplayed() + composeTestRule.waitUntilExactlyOneExists( + hasText("Yes"), + TIMEOUT, + ) + composeTestRule.onNode(hasText("Yes")).performClick() } } diff --git a/app/src/androidTest/java/org/dhis2/usescases/login/LoginTest.kt b/app/src/androidTest/java/org/dhis2/usescases/login/LoginTest.kt index a2cf81e3e12..708a2590a71 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/login/LoginTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/login/LoginTest.kt @@ -1,31 +1,20 @@ package org.dhis2.usescases.login -import android.app.Activity -import android.app.Instrumentation import android.content.Intent import androidx.compose.ui.test.junit4.createComposeRule import androidx.test.core.app.ApplicationProvider -import androidx.test.espresso.intent.Intents.intending -import androidx.test.espresso.intent.matcher.IntentMatchers import org.dhis2.common.keystore.KeyStoreRobot -import org.dhis2.commons.Constants.EXTRA_DATA -import org.dhis2.commons.prefs.Preference.Companion.PIN -import org.dhis2.commons.prefs.Preference.Companion.SESSION_LOCKED import org.dhis2.lazyActivityScenarioRule import org.dhis2.usescases.BaseTest -import org.dhis2.usescases.qrScanner.ScanActivity -import org.hamcrest.CoreMatchers.allOf import org.hisp.dhis.android.core.D2Manager import org.hisp.dhis.android.core.mockwebserver.ResponseController.Companion.API_ME_PATH import org.hisp.dhis.android.core.mockwebserver.ResponseController.Companion.API_SYSTEM_INFO_PATH import org.hisp.dhis.android.core.mockwebserver.ResponseController.Companion.GET import org.junit.FixMethodOrder -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.junit.runners.MethodSorters -@Ignore("implement in login module") @FixMethodOrder(MethodSorters.NAME_ASCENDING) class LoginTest : BaseTest() { @@ -39,6 +28,7 @@ class LoginTest : BaseTest() { restoreDataBaseOnBeforeAction = false super.setUp() setupMockServer() + clearAnalyticsPermission() D2Manager.removeCredentials() } @@ -46,110 +36,60 @@ class LoginTest : BaseTest() { override fun teardown() { restoreDataBaseOnBeforeAction = true super.teardown() + // Restore original credentials D2Manager.setCredentials(KeyStoreRobot.KEYSTORE_USERNAME, KeyStoreRobot.PASSWORD) } - @Ignore("implement in login module") @Test - fun loginFlow() { - mockWebServerRobot.addResponse(GET, API_LOGIN_CONFIG, API_LOGIN_CONFIG_RESPONSE, 200) - mockWebServerRobot.addResponse(GET, API_ME_PATH, API_ME_RESPONSE_OK) - mockWebServerRobot.addResponse(GET, API_SYSTEM_INFO_PATH, API_SYSTEM_INFO_RESPONSE_OK) - mockWebServerRobot.addResponse( - GET, - PATH_WEBAPP_GENERAL_SETTINGS, - API_METADATA_SETTINGS_RESPONSE_ERROR, - 404 - ) - mockWebServerRobot.addResponse(GET, PATH_WEBAPP_INFO, API_METADATA_SETTINGS_INFO_ERROR, 404) + fun shouldLoginWithoutOauth() { + enableIntents() startLoginActivity() loginRobot(composeTestRule) { - typeServerToValidate(MOCK_SERVER_URL) + // Step: Enter incorrect server URL and validate - should show error + typeServerToValidate("https://invalid-server.com") clickOnValidateServerButton() - // Test case - [ANDROAPP-4122](https://dhis2.atlassian.net/browse/ANDROAPP-4122) -// typeUsername(USERNAME) -// typePassword(PASSWORD) -// clearUsernameField() -// clearPasswordField() -// checkUsernameFieldIsClear() -// checkPasswordFieldIsClear() - - //Test case - [ANDROAPP-4123](https://dhis2.atlassian.net/browse/ANDROAPP-4123) -// checkLoginButtonIsHidden() - - // Test case - [ANDROAPP-4126](https://dhis2.atlassian.net/browse/ANDROAPP-4126) - enableIntents() -// clickAccountRecovery() - checkWebviewWithRecoveryAccountIsOpened() - pressBack() - - // Test case - [ANDROAPP-4121](https://dhis2.atlassian.net/browse/ANDROAPP-4121) - mockWebServerRobot.addResponse(GET, API_ME_PATH, API_ME_UNAUTHORIZE, HTTP_UNAUTHORIZE) -// selectUsernameField() -// typeUsername(USERNAME) -// typePassword(PASSWORD) - waitToDebounce(5000) -// clickLoginButton() - checkAuthErrorAlertIsVisible() - clickOKAuthErrorAlert() - - // Test case - [ANDROAPP-4121](https://dhis2.atlassian.net/browse/ANDROAPP-4121) - mockWebServerRobot.addResponse(GET, API_ME_PATH, API_ME_RESPONSE_OK) -// clearPasswordField() -// typePassword(PASSWORD) - waitToDebounce(5000) -// clickLoginButton() - - //Test case - [ANDROAPP-5184](https://dhis2.atlassian.net/browse/ANDROAPP-5184) - checkShareDataDialogIsDisplayed() - clickOnPrivacyPolicy() - checkPrivacyViewIsOpened() - pressBack() - acceptTrackerDialog() - clickYesOnAcceptTrackerDialog() - } - cleanDatabase() - } + checkServerValidationErrorIsDisplayed() - @Ignore("implement in login module") - @Test - fun goToPinScreenWhenPinWasSet() { - preferencesRobot.saveValue(SESSION_LOCKED, true) - preferencesRobot.saveValue(PIN, PIN_PASSWORD) - - startLoginActivity() - - loginRobot(composeTestRule) { + // Step: Enter correct server URL and validate - should proceed to credentials + mockWebServerRobot.addResponse(GET, API_LOGIN_CONFIG, API_LOGIN_CONFIG_RESPONSE, 200) + typeServerToValidate(MOCK_SERVER_URL) clickOnValidateServerButton() - checkUnblockSessionViewIsVisible() - } - } - @Ignore("implement in login module") - @Test - fun generateLoginThroughQR() { - preferencesRobot.cleanPreferences() - enableIntents() - startLoginActivity() + // Step: Credentials screen should be displayed + // Enter incorrect credentials - should show error + mockWebServerRobot.addResponse(GET, API_ME_PATH, API_ME_UNAUTHORIZE, HTTP_UNAUTHORIZE) + checkLoginButtonIsDisabled() + typeUsername("wronguser") + typePassword("wrongpassword") + checkLoginButtonIsEnabled() + clickLoginButton() + checkCredentialsErrorIsDisplayed() + + // Step: Enter correct credentials - should proceed to tracker dialog + mockWebServerRobot.addResponse(GET, API_ME_PATH, API_ME_RESPONSE_OK) + mockWebServerRobot.addResponse(GET, API_SYSTEM_INFO_PATH, API_SYSTEM_INFO_RESPONSE_OK) + mockWebServerRobot.addResponse( + GET, + PATH_WEBAPP_GENERAL_SETTINGS, + API_METADATA_SETTINGS_RESPONSE_OK, + 200 + ) + mockWebServerRobot.addResponse( + GET, + PATH_WEBAPP_INFO, + API_METADATA_SETTINGS_INFO_ERROR, + 404 + ) - loginRobot(composeTestRule) { - mockOnActivityForResult() - clickQRButton() - checkQRScanIsOpened() - checkURL(MOCK_SERVER_URL) - } - } + typeUsername(USERNAME) + typePassword(PASSWORD) + checkLoginButtonIsEnabled() + clickLoginButton() - private fun mockOnActivityForResult() { - val intent = Intent().apply { - putExtra(EXTRA_DATA, MOCK_SERVER_URL - ) + // Step: Handle tracking permission dialog + acceptTrackingPermission() } - val result = Instrumentation.ActivityResult(Activity.RESULT_OK, intent) - intending(allOf(IntentMatchers.hasComponent(ScanActivity::class.java.name))).respondWith( - result - ) } private fun startLoginActivity() { @@ -161,27 +101,32 @@ class LoginTest : BaseTest() { } - private fun cleanDatabase() { - context.deleteDatabase(DB_GENERATED_BY_LOGIN) + private fun clearAnalyticsPermission() { + D2Manager.getD2() + .dataStoreModule() + .localDataStore() + .value(ANALYTICS_PERMISSION_KEY) + .blockingDeleteIfExist() } companion object { const val HTTP_UNAUTHORIZE = 401 const val API_LOGIN_CONFIG = "/api/loginConfig" - const val API_LOGIN_CONFIG_RESPONSE ="mocks/loginconfig/legacy_flow_config.json" + const val API_LOGIN_CONFIG_RESPONSE = "mocks/loginconfig/legacy_flow_config.json" const val API_ME_RESPONSE_OK = "mocks/user/user.json" const val API_ME_UNAUTHORIZE = "mocks/user/unauthorize.json" const val API_SYSTEM_INFO_RESPONSE_OK = "mocks/systeminfo/systeminfo.json" - const val API_METADATA_SETTINGS_RESPONSE_ERROR = - "mocks/settingswebapp/generalsettings_404.json" + const val API_METADATA_SETTINGS_RESPONSE_OK = + "mocks/settingswebapp/generalsettings.json" const val API_METADATA_SETTINGS_INFO_ERROR = "mocks/settingswebapp/infosettings_404.json" const val PATH_WEBAPP_GENERAL_SETTINGS = "/api/dataStore/ANDROID_SETTING_APP/general_settings?.*" const val PATH_WEBAPP_INFO = "/api/dataStore/ANDROID_SETTINGS_APP/info?.*" - const val DB_GENERATED_BY_LOGIN = "127-0-0-1-8080_test_unencrypted.db" - const val PIN_PASSWORD = 1234 - const val USERNAME = "test" - const val PASSWORD = "Android123" + const val USERNAME = "android" // Existing test database username + const val PASSWORD = "Android123" // Existing test database password + + private const val ANALYTICS_PERMISSION_KEY = "analytics_permission" + } } diff --git a/app/src/androidTest/java/org/dhis2/usescases/main/MainRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/main/MainRobot.kt index 07ad8529ebf..3ab5103fef8 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/main/MainRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/main/MainRobot.kt @@ -17,13 +17,16 @@ import org.dhis2.common.BaseRobot import org.dhis2.usescases.main.program.HOME_ITEMS import org.dhis2.usescases.main.program.hasPrograms -fun homeRobot(robotBody: MainRobot.() -> Unit) { - MainRobot().apply { +fun homeRobot( + composeTestRule: ComposeTestRule, + robotBody: MainRobot.() -> Unit +) { + MainRobot(composeTestRule).apply { robotBody() } } -class MainRobot : BaseRobot() { +class MainRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { fun clickOnNavigationDrawerMenu() = apply { waitForView(withId(R.id.menu)).perform(click()) @@ -43,10 +46,6 @@ class MainRobot : BaseRobot() { waitToDebounce(FRAGMENT_TRANSITION) } - fun clickDeleteAccount() = apply { - onView(withId(R.id.nav_view)).perform(NavigationViewActions.navigateTo(R.id.delete_account)) - } - fun checkViewIsNotEmpty(composeTestRule: ComposeTestRule) { composeTestRule.waitUntil() { composeTestRule.onNodeWithTag(HOME_ITEMS) @@ -65,6 +64,5 @@ class MainRobot : BaseRobot() { companion object { const val FRAGMENT_TRANSITION = 1500L - const val LOGOUT_TRANSITION = 2000L } } diff --git a/app/src/androidTest/java/org/dhis2/usescases/main/MainTest.kt b/app/src/androidTest/java/org/dhis2/usescases/main/MainTest.kt index 1df078c6a6a..5e90b83bcdf 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/main/MainTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/main/MainTest.kt @@ -32,7 +32,7 @@ class MainTest : BaseTest() { @Test fun checkHomeScreenRecyclerviewHasElements() { - homeRobot { + homeRobot(composeTestRule) { composeTestRule.waitForIdle() checkViewIsNotEmpty(composeTestRule) } @@ -40,7 +40,7 @@ class MainTest : BaseTest() { @Test fun shouldNavigateToHomeWhenBackPressed() { - homeRobot { + homeRobot(composeTestRule) { clickOnNavigationDrawerMenu() clickOnSettings() pressBack() diff --git a/app/src/androidTest/java/org/dhis2/usescases/pin/PinTest.kt b/app/src/androidTest/java/org/dhis2/usescases/pin/PinTest.kt index 75664686787..d05622e8d83 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/pin/PinTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/pin/PinTest.kt @@ -1,5 +1,6 @@ package org.dhis2.usescases.pin +import androidx.compose.ui.test.junit4.createComposeRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.rule.ActivityTestRule import org.dhis2.usescases.BaseTest @@ -15,11 +16,14 @@ class PinTest : BaseTest() { @get:Rule val rule = ActivityTestRule(MainActivity::class.java, false, false) + @get:Rule + val composeTestRule = createComposeRule() + @Test fun openPin() { startActivity() - homeRobot { + homeRobot(composeTestRule) { clickOnNavigationDrawerMenu() clickOnPin() } diff --git a/app/src/androidTest/java/org/dhis2/usescases/settings/SettingsTest.kt b/app/src/androidTest/java/org/dhis2/usescases/settings/SettingsTest.kt index ce1b9bcb812..bd1ffb25c07 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/settings/SettingsTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/settings/SettingsTest.kt @@ -34,7 +34,7 @@ class SettingsTest : BaseTest() { fun shouldFindEditPeriodDisabledWhenClickOnSyncData() { startActivity() - homeRobot { + homeRobot(composeTestRule) { clickOnNavigationDrawerMenu() clickOnSettings() } @@ -49,7 +49,7 @@ class SettingsTest : BaseTest() { fun shouldFindEditDisabledWhenClickOnSyncConfiguration() { startActivity() - homeRobot { + homeRobot(composeTestRule) { clickOnNavigationDrawerMenu() clickOnSettings() } @@ -64,7 +64,7 @@ class SettingsTest : BaseTest() { fun shouldFindEditDisableWhenClickOnSyncParameters() { startActivity() - homeRobot { + homeRobot(composeTestRule) { clickOnNavigationDrawerMenu() clickOnSettings() } @@ -79,7 +79,7 @@ class SettingsTest : BaseTest() { fun shouldRefillValuesWhenClickOnReservedValues() { startActivity() - homeRobot { + homeRobot(composeTestRule) { clickOnNavigationDrawerMenu() clickOnSettings() } @@ -94,7 +94,7 @@ class SettingsTest : BaseTest() { fun shouldSuccessfullyOpenLogs() { startActivity() - homeRobot { + homeRobot(composeTestRule) { clickOnNavigationDrawerMenu() clickOnSettings() } @@ -112,7 +112,7 @@ class SettingsTest : BaseTest() { startActivity() - homeRobot { + homeRobot(composeTestRule) { clickOnNavigationDrawerMenu() clickOnSettings() } @@ -129,7 +129,7 @@ class SettingsTest : BaseTest() { startActivity() - homeRobot { + homeRobot(composeTestRule) { clickOnNavigationDrawerMenu() clickOnSettings() } diff --git a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt index e51814348e5..30f30552423 100644 --- a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt +++ b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt @@ -157,12 +157,16 @@ class LoginRepositoryImpl( override suspend fun displayTrackingMessage(): Boolean = withContext(dispatcher.io) { - d2 - .dataStoreModule() - .localDataStore() - .value(DATA_STORE_ANALYTICS_PERMISSION_KEY) - .blockingGet() - ?.value() == null + try { + d2 + .dataStoreModule() + .localDataStore() + .value(DATA_STORE_ANALYTICS_PERMISSION_KEY) + .blockingGet() + ?.value() == null + } catch (_: Exception) { + false + } } private fun hasEnabledBiometricsPermission(): Boolean = diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/accounts/ui/screen/AccountItem.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/accounts/ui/screen/AccountItem.kt index af7a132c5e1..7ee54e2e0e5 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/accounts/ui/screen/AccountItem.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/accounts/ui/screen/AccountItem.kt @@ -9,6 +9,7 @@ import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag import org.dhis2.mobile.commons.resources.getDrawableResource import org.dhis2.mobile.login.accounts.domain.model.AccountModel import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItem @@ -20,6 +21,8 @@ import org.hisp.dhis.mobile.ui.designsystem.component.ListCardTitleModel import org.hisp.dhis.mobile.ui.designsystem.component.state.rememberAdditionalInfoColumnState import org.hisp.dhis.mobile.ui.designsystem.component.state.rememberListCardState +const val ACCOUNT_ITEM_TAG = "account_item" + @OptIn(ExperimentalMaterial3Api::class, ExperimentalSharedTransitionApi::class) @Composable fun AccountItem( @@ -61,7 +64,8 @@ fun AccountItem( ListCard( modifier = modifier - .fillMaxWidth(), + .fillMaxWidth() + .testTag("${ACCOUNT_ITEM_TAG}_${account.serverUrl}_${account.name}"), listCardState = listCardState, onCardClick = { onItemClicked(account) }, listAvatar = { diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/CredentialsScreen.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/CredentialsScreen.kt index 8bd562f811c..bc133808cf6 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/CredentialsScreen.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/CredentialsScreen.kt @@ -37,6 +37,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusDirection import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.platform.testTag import androidx.compose.ui.text.LinkAnnotation import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.TextLinkStyles @@ -102,6 +103,12 @@ import org.jetbrains.compose.resources.stringResource import org.koin.compose.viewmodel.koinViewModel import org.koin.core.parameter.parametersOf +const val CREDENTIALS_USERNAME_INPUT_TAG = "credentials_username_input" +const val CREDENTIALS_PASSWORD_INPUT_TAG = "credentials_password_input" +const val CREDENTIALS_LOGIN_BUTTON_TAG = "credentials_login_button" +const val CREDENTIALS_ERROR_INFO_BAR_TAG = "credentials_error_info_bar" +const val CREDENTIALS_MANAGE_ACCOUNTS_BUTTON_TAG = "credentials_manage_accounts_button" + @OptIn(ExperimentalSharedTransitionApi::class) @Composable context(sharedTransitionScope: SharedTransitionScope, animatedVisibilityScope: AnimatedVisibilityScope) @@ -384,7 +391,7 @@ private fun CredentialsContainer( ) { if (isUsernameEditable) { InputUser( - modifier = Modifier.fillMaxWidth(), + modifier = Modifier.fillMaxWidth().testTag(CREDENTIALS_USERNAME_INPUT_TAG), uiModel = InputUserModel( title = stringResource(Res.string.username_hint), @@ -417,7 +424,7 @@ private fun CredentialsContainer( ) } InputPassword( - modifier = Modifier.fillMaxWidth(), + modifier = Modifier.fillMaxWidth().testTag(CREDENTIALS_PASSWORD_INPUT_TAG), uiModel = InputPasswordModel( title = stringResource(Res.string.password_hint), @@ -471,7 +478,7 @@ private fun LoginStatus( ) } else if (loginErrorMessage != null) { InfoBar( - modifier = Modifier, + modifier = Modifier.testTag(CREDENTIALS_ERROR_INFO_BAR_TAG), text = loginErrorMessage, textColor = MaterialTheme.colorScheme.onErrorContainer, backgroundColor = MaterialTheme.colorScheme.errorContainer, @@ -501,7 +508,7 @@ private fun CredentialActions( verticalArrangement = spacedBy(Spacing.Spacing0), ) { Button( - modifier = Modifier.fillMaxWidth(), + modifier = Modifier.fillMaxWidth().testTag(CREDENTIALS_LOGIN_BUTTON_TAG), enabled = canLogin, text = stringResource(Res.string.action_log_in), style = ButtonStyle.FILLED, @@ -591,7 +598,7 @@ private fun CredentialActions( contentAlignment = Alignment.BottomCenter, ) { Button( - modifier = Modifier.fillMaxWidth(), + modifier = Modifier.fillMaxWidth().testTag(CREDENTIALS_MANAGE_ACCOUNTS_BUTTON_TAG), text = stringResource(Res.string.action_manage_account), style = ButtonStyle.OUTLINED, onClick = { From 4a6bca730ae6cd1aadc2849cb9e9bb69452b6bd2 Mon Sep 17 00:00:00 2001 From: Xavier Molloy Date: Wed, 28 Jan 2026 09:27:08 +0100 Subject: [PATCH 026/260] chore: [ANDROAPP-7387] Update README.md (#4611) * chore: [ANDROAPP-7387] Update README.md * chore: [ANDROAPP-7387] Update README.md --- README.md | 29 +++++++++++++++++++++++++---- docs/README.md | 3 --- 2 files changed, 25 insertions(+), 7 deletions(-) delete mode 100644 docs/README.md diff --git a/README.md b/README.md index 1bc9fccc045..49d33cccdaa 100644 --- a/README.md +++ b/README.md @@ -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). diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index fbcac6a5156..00000000000 --- a/docs/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# DHIS 2 Android Capture App - Documentation - -This folder used to contain the the documentation of the DHIS 2 Android App and other technical docs. Since January 2022 it has been moved to [dhis2-android-docs](https://github.com/dhis2-android-docs). From a1fdd00fd8000a51a96e019b76fe1c724ff19d92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Wed, 28 Jan 2026 17:46:57 +0100 Subject: [PATCH 027/260] deps: update sdk version (#4617) --- gradle/libs.versions.toml | 2 +- gradle/verification-metadata.xml | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index bba9b1f917f..068fa4c986d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -11,7 +11,7 @@ kotlin = '2.2.21' dagger = '2.57.2' jacoco = '0.8.14' designSystem = "0.7.0-SNAPSHOT" -dhis2sdk = "1.14.0-SNAPSHOT" +dhis2sdk = "1.14.0-20260126.105658-5" ruleEngine = "3.3.11" expressionParser = "1.2.2" appcompat = "1.7.1" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 1b4dfb351c8..b4a5eccf956 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -9734,6 +9734,14 @@ + + + + + + + + From 84112c1ff750cb7757c29daf577180637557d4f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Thu, 29 Jan 2026 08:15:44 +0100 Subject: [PATCH 028/260] chore: [ANDROAPP- 6429] feature/tracker-search-refactor [skip size] (#4586) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(search): Add ParameterSelectorItemProvider in tracker module * feat(search): Add ParameterInputModel.kt for tracker UI * feat(search): Add ParameterSelectorItemProviderTest.kt * feat(search): Add ParameterInputProvider.kt * refactor(search): Move search parameter provider to tracker component * refactor(search): Remove ParameterRenderingType * refactor(search): unify scan callback methods * refactor(search): Improve parameter mapping and component stubs * refactor(search): Extract ParameterInputType.kt * refactor(search): Rename parameter input components * refactor(search): delete `ParameterSelectorItemProviderTest` The tests for `ParameterSelectorItemProvider` are no longer needed and have been removed. This is part of a refactoring effort to move search-related UI components to the design system library. * refactor(search): Add missing properties to TrackerInputModel.kt * refactor(search): Rename to TrackerInputModel.kt * refactor(search): Add InputDropdown * refactor(search): Add Not supported input types * feat(search): Add ParameterInputModel.kt for tracker UI * feat(search): Add ParameterSelectorItemProviderTest.kt * feat(search): Add ParameterInputProvider.kt * refactor(search): Remove ParameterRenderingType * refactor(search): Improve parameter mapping and component stubs * refactor(search): Extract ParameterInputType.kt * refactor(search): Rename parameter input components * refactor(search): delete `ParameterSelectorItemProviderTest` The tests for `ParameterSelectorItemProvider` are no longer needed and have been removed. This is part of a refactoring effort to move search-related UI components to the design system library. * refactor(search): Add missing properties to TrackerInputModel.kt * refactor(search): Rename to TrackerInputModel.kt * feat: [ANDROAPP-7451] implement multiselection in tracker input provider (#4594) * feat: [ANDROAPP-7251] implement multiselection in tracker input provider Signed-off-by: Manu Muñoz * onItemSelected Signed-off-by: Manu Muñoz * fix: take option only if not empty Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix: propagate editable value Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix: updated value to null if emtpy Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * feat(search): Set non supported types --------- Signed-off-by: Manu Muñoz Co-authored-by: Andrés Miguel Rubio Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * chore: [ANDROAPP-7450] Implement age and date time inputs in new tracker input provider (#4601) * feat(search): Add ParameterSelectorItemProvider in tracker module * feat(search): Add ParameterInputModel.kt for tracker UI * feat(search): Add ParameterSelectorItemProviderTest.kt * feat(search): Add ParameterInputProvider.kt * refactor(search): Move search parameter provider to tracker component * refactor(search): Remove ParameterRenderingType * refactor(search): unify scan callback methods * refactor(search): Improve parameter mapping and component stubs * refactor(search): Extract ParameterInputType.kt * refactor(search): Rename parameter input components * refactor(search): delete `ParameterSelectorItemProviderTest` The tests for `ParameterSelectorItemProvider` are no longer needed and have been removed. This is part of a refactoring effort to move search-related UI components to the design system library. * refactor(search): Add missing properties to TrackerInputModel.kt * refactor(search): Rename to TrackerInputModel.kt * refactor(search): Add InputDropdown * refactor(search): Add Not supported input types * chore: [ANDROAPP-7435] fix kapt error * chore: [ANDROAPP-7450] Implement Input age and date time inputs in new tracker Input provider * fix: [ANDROAPP-7450] fix rebase conflict changes * fix: [ANDROAPP-7450] resolve sonar code smells --------- Co-authored-by: andresmr Co-authored-by: danielTari * feat: [ANDROAPP-7452] Implement radioButtonInput and checkboxInput in search screen (#4591) * feat: [ANDROAPP-7452] Implement radioButtonInput and checkboxInput for search screen * fix: add options for boolean valueType and orientation Signed-off-by: Manu Muñoz * import Signed-off-by: Manu Muñoz * remove unused import --------- Signed-off-by: Manu Muñoz Co-authored-by: Manu Muñoz Co-authored-by: Pablo Pajuelo Cabezas * task: [ANDROAPP-7449] Add InputCustomIntent to TrackerInputProvider (#4602) * refactor: Move specific providers to provider package * refactor: Rename SearchAction.kt to TrackerInputAction.kt * refactor: Rename TrackerInputProvider.kt * refactor: Extract onItemClick and OnValueChange to TrackerInputUiEvent.kt * feat: Implement InputOrgUnit * refactor: remove RecyclerViewUiEvents handling from SearchParametersScreen.kt * refactor: code review fixes * refactor: code review fixes * fix: sonarcloud comments * fix: remove redundant focusRequester on ParameterSelectorItemProvider.kt * Add unit tests for ParameterInputModelMapper (#4615) * Update tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerInputProvider.kt Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerInputProvider.kt Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Initial plan * Add comprehensive unit tests for ParameterInputModelMapper Co-authored-by: andresmr <3330344+andresmr@users.noreply.github.com> * Remove unused imports from test file Co-authored-by: andresmr <3330344+andresmr@users.noreply.github.com> * fix: rename library properties * fix: update test signature --------- Co-authored-by: Andrés Miguel Rubio Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: andresmr <3330344+andresmr@users.noreply.github.com> --------- Signed-off-by: Manu Muñoz Co-authored-by: Manu Muñoz Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Xavier Molloy Co-authored-by: danielTari Co-authored-by: Pablo Pajuelo Cabezas Co-authored-by: Pablo Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> Co-authored-by: andresmr <3330344+andresmr@users.noreply.github.com> --- .editorconfig | 1 + .../SearchRepositoryImplKt.kt | 10 + .../searchTrackEntity/SearchRepositoryKt.kt | 4 + .../searchTrackEntity/SearchTEIViewModel.kt | 50 +- .../SearchParametersScreen.kt | 145 ++- .../mapper/ParameterInputModelMapper.kt | 204 +++++ .../provider/ParameterSelectorItemProvider.kt | 138 --- .../SearchTEIViewModelTest.kt | 79 +- .../mapper/ParameterInputModelMapperTest.kt | 334 +++++++ commonskmm/build.gradle.kts | 2 +- .../composeResources/values/strings.xml | 5 + .../commons/dates/DateTimeInputsUtils.kt | 94 ++ .../inputfield/CustomIntentProvider.kt | 14 +- .../ui/provider/inputfield/FieldProvider.kt | 1 - .../composeResources/values-cs/strings.xml | 2 + .../composeResources/values-zh/strings.xml | 1 + .../composeResources/values/strings.xml | 1 + .../provider/ParameterSelectorItemProvider.kt | 87 ++ .../ui/input/action/TrackerInputAction.kt | 13 + .../ui/input/model/TrackerInputModel.kt | 56 ++ .../ui/input/model/TrackerInputType.kt | 35 + .../ui/input/model/TrackerInputUiEvent.kt | 27 + .../model/TrackerOptionSetConfiguration.kt | 16 + .../input/provider/TrackerAgeInputProvider.kt | 138 +++ .../provider/TrackerCheckboxInputProvider.kt | 56 ++ .../input/provider/TrackerDateTimeProvider.kt | 108 +++ .../ui/input/provider/TrackerInputProvider.kt | 825 ++++++++++++++++++ .../TrackerRadioButtonInputProvider.kt | 58 ++ 28 files changed, 2314 insertions(+), 190 deletions(-) create mode 100644 app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapper.kt delete mode 100644 app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/provider/ParameterSelectorItemProvider.kt create mode 100644 app/src/test/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapperTest.kt create mode 100644 commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/dates/DateTimeInputsUtils.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/provider/ParameterSelectorItemProvider.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/action/TrackerInputAction.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/model/TrackerInputModel.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/model/TrackerInputType.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/model/TrackerInputUiEvent.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/model/TrackerOptionSetConfiguration.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerAgeInputProvider.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerCheckboxInputProvider.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerDateTimeProvider.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerInputProvider.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerRadioButtonInputProvider.kt diff --git a/.editorconfig b/.editorconfig index 9778c7012d1..f706f5dee15 100644 --- a/.editorconfig +++ b/.editorconfig @@ -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 diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImplKt.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImplKt.kt index 63daa1aa06b..c1fe2f61fc9 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImplKt.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImplKt.kt @@ -24,6 +24,7 @@ import org.dhis2.mobile.commons.customintents.CustomIntentRepository import org.dhis2.mobile.commons.extensions.toColor import org.dhis2.mobile.commons.model.CustomIntentActionTypeModel import org.dhis2.mobile.commons.model.CustomIntentModel +import org.dhis2.tracker.ui.input.action.FieldUid import org.dhis2.usescases.events.EventInfoProvider import org.dhis2.usescases.tracker.TrackedEntityInstanceInfoProvider import org.hisp.dhis.android.core.D2 @@ -432,6 +433,15 @@ class SearchRepositoryImplKt( } } + override suspend fun getCustomIntent(fieldUid: FieldUid) = + withContext(dispatcher.io()) { + customIntentRepository.getCustomIntent( + triggerUid = fieldUid, + orgUnitUid = null, + actionType = CustomIntentActionTypeModel.SEARCH, + ) + } + private fun trackedEntitySearchFields(teiTypeUid: String): List { val teTypeAttributes = d2 diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryKt.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryKt.kt index 1b57f339c79..d07c0c6130e 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryKt.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryKt.kt @@ -5,6 +5,8 @@ import kotlinx.coroutines.flow.Flow import org.dhis2.data.search.SearchParametersModel import org.dhis2.form.model.FieldUiModel import org.dhis2.maps.model.MapItemModel +import org.dhis2.mobile.commons.model.CustomIntentModel +import org.dhis2.tracker.ui.input.action.FieldUid import org.hisp.dhis.android.core.program.Program import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItem @@ -38,4 +40,6 @@ interface SearchRepositoryKt { teis: List, selectedProgram: Program?, ): List + + suspend fun getCustomIntent(fieldUid: FieldUid): CustomIntentModel? } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt index 3d645b7f686..9ce14658a12 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt @@ -45,6 +45,7 @@ import org.dhis2.commons.resources.ResourceManager import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.search.SearchParametersModel import org.dhis2.form.model.FieldUiModelImpl +import org.dhis2.form.ui.customintent.CustomIntentResult import org.dhis2.form.ui.intent.FormIntent import org.dhis2.form.ui.provider.DisplayNameProvider import org.dhis2.maps.extensions.toStringProperty @@ -54,6 +55,9 @@ import org.dhis2.maps.managers.MapManager import org.dhis2.maps.usecases.MapStyleConfiguration import org.dhis2.mobile.commons.coroutine.CoroutineTracker import org.dhis2.tracker.NavigationBarUIState +import org.dhis2.tracker.ui.input.action.CustomIntentUid +import org.dhis2.tracker.ui.input.action.FieldUid +import org.dhis2.tracker.ui.input.action.TrackerInputAction import org.dhis2.usescases.searchTrackEntity.listView.SearchResult import org.dhis2.usescases.searchTrackEntity.searchparameters.model.SearchParametersUiState import org.dhis2.usescases.searchTrackEntity.ui.UnableToSearchOutsideData @@ -142,6 +146,9 @@ class SearchTEIViewModel( private val onNewSearch = MutableSharedFlow(extraBufferCapacity = 1) + private val _searchActions = Channel() + val searchActions = _searchActions.receiveAsFlow() + val searchPagingData = onNewSearch .onStart { emit(Unit) } @@ -393,6 +400,7 @@ class SearchTEIViewModel( private fun updateSearchParameters( uid: String, values: List?, + errorMessage: String? = null, ) { val updatedItems = searchParametersUiState.items.map { @@ -406,6 +414,7 @@ class SearchTEIViewModel( optionSet = it.optionSet, periodType = it.periodSelector?.type, ), + error = errorMessage, ) } else { it @@ -446,7 +455,8 @@ class SearchTEIViewModel( ), ) } - searchParametersUiState = searchParametersUiState.copy(searchEnabled = queryData.isNotEmpty()) + searchParametersUiState = + searchParametersUiState.copy(searchEnabled = queryData.isNotEmpty()) } private suspend fun loadSearchResults() = @@ -621,7 +631,8 @@ class SearchTEIViewModel( R.string.search_min_num_attr, minAttributesToSearch, ) - searchParametersUiState = searchParametersUiState.copy(minAttributesMessage = message) + searchParametersUiState = + searchParametersUiState.copy(minAttributesMessage = message) searchParametersUiState.updateMinAttributeWarning(true) setSearchScreen() _refreshData.postValue(Unit) @@ -1175,4 +1186,39 @@ class SearchTEIViewModel( this.layersVisibility = layersVisibility fetchMapResults() } + + fun onLaunchCustomIntent( + fieldUid: FieldUid, + customIntentUid: CustomIntentUid, + ) { + viewModelScope.launch { + searchRepositoryKt.getCustomIntent(fieldUid)?.let { customIntentModel -> + _searchActions.send( + TrackerInputAction.LaunchCustomIntent( + fieldUid = fieldUid, + customIntentModel = customIntentModel, + ), + ) + } + } + } + + fun handleCustomIntentResult(customIntentResult: CustomIntentResult) { + when (customIntentResult) { + is CustomIntentResult.Error -> { + updateSearchParameters( + customIntentResult.fieldUid, + null, + resourceManager.getString(R.string.custom_intent_error), + ) + } + + is CustomIntentResult.Success -> { + updateSearchParameters( + customIntentResult.fieldUid, + listOf(customIntentResult.value), + ) + } + } + } } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreen.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreen.kt index 3189760befc..bd2ab645350 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreen.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreen.kt @@ -48,12 +48,20 @@ import org.dhis2.commons.resources.ResourceManager import org.dhis2.form.data.scan.ScanContract import org.dhis2.form.model.FieldUiModel import org.dhis2.form.model.FieldUiModelImpl +import org.dhis2.form.ui.customintent.CustomIntentActivityResultContract +import org.dhis2.form.ui.customintent.CustomIntentInput import org.dhis2.form.ui.event.RecyclerViewUiEvents import org.dhis2.form.ui.intent.FormIntent +import org.dhis2.mobile.commons.extensions.ObserveAsEvents import org.dhis2.mobile.commons.orgunit.OrgUnitSelectorScope +import org.dhis2.tracker.search.ui.provider.provideParameterSelectorItem +import org.dhis2.tracker.ui.input.action.CustomIntentUid +import org.dhis2.tracker.ui.input.action.FieldUid +import org.dhis2.tracker.ui.input.action.TrackerInputAction +import org.dhis2.tracker.ui.input.model.TrackerInputUiEvent import org.dhis2.usescases.searchTrackEntity.SearchTEIViewModel +import org.dhis2.usescases.searchTrackEntity.searchparameters.mapper.toParameterInputModel import org.dhis2.usescases.searchTrackEntity.searchparameters.model.SearchParametersUiState -import org.dhis2.usescases.searchTrackEntity.searchparameters.provider.provideParameterSelectorItem import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItemColor import org.hisp.dhis.mobile.ui.designsystem.component.Button @@ -79,6 +87,7 @@ fun SearchParametersScreen( onSearch: () -> Unit, onClear: () -> Unit, onClose: () -> Unit, + onLaunchCustomIntent: (FieldUid, CustomIntentUid) -> Unit, ) { val snackBarHostState = remember { SnackbarHostState() } val coroutineScope = rememberCoroutineScope() @@ -109,38 +118,7 @@ fun SearchParametersScreen( } override fun recyclerViewUiEvents(uiEvent: RecyclerViewUiEvents) { - when (uiEvent) { - is RecyclerViewUiEvents.OpenOrgUnitDialog -> - onShowOrgUnit( - uiEvent.uid, - uiEvent.value?.let { listOf(it) } ?: emptyList(), - uiEvent.orgUnitSelectorScope ?: OrgUnitSelectorScope.UserSearchScope(), - uiEvent.label, - ) - - is RecyclerViewUiEvents.ScanQRCode -> { - qrScanLauncher.launch( - ScanOptions().apply { - setDesiredBarcodeFormats() - setPrompt("") - setBeepEnabled(true) - setBarcodeImageEnabled(false) - addExtra(Constants.UID, uiEvent.uid) - uiEvent.optionSet?.let { - addExtra( - Constants.OPTION_SET, - uiEvent.optionSet, - ) - } - addExtra(Constants.SCAN_RENDERING_TYPE, uiEvent.renderingType) - }, - ) - } - - else -> { - // no-op - } - } + // no - op } } } @@ -252,16 +230,80 @@ fun SearchParametersScreen( .testTag("SEARCH_PARAM_ITEM"), model = provideParameterSelectorItem( - resources = resourceManager, - focusManager = focusManager, - fieldUiModel = fieldUiModel, - callback = callback, + inputModel = + fieldUiModel.toParameterInputModel( + fetchOptions = { + fieldUiModel.optionSet?.let { optionSetUid -> + intentHandler( + FormIntent.FetchOptions( + uid = fieldUiModel.uid, + optionSetUid = optionSetUid, + value = fieldUiModel.value, + ), + ) + } + }, + resourceManager = resourceManager, + ), + // TODO is this always the same string?, check if it is optional somewhere + helperText = resourceManager.getString(R.string.optional), onNextClicked = { val nextIndex = index + 1 if (nextIndex < uiState.items.size) { uiState.items[nextIndex].onItemClick() } }, + onUiEvent = { uiEvent -> + when (uiEvent) { + is TrackerInputUiEvent.OnScanButtonClicked -> { + qrScanLauncher.launch( + ScanOptions().apply { + setDesiredBarcodeFormats() + setPrompt("") + setBeepEnabled(true) + setBarcodeImageEnabled(false) + addExtra(Constants.UID, uiEvent.uid) + fieldUiModel.optionSet?.let { + addExtra( + Constants.OPTION_SET, + it, + ) + } + addExtra( + Constants.SCAN_RENDERING_TYPE, + fieldUiModel.renderingType, + ) + }, + ) + } + + is TrackerInputUiEvent.OnOrgUnitButtonClicked -> { + onShowOrgUnit( + uiEvent.uid, + uiEvent.value?.let { listOf(it) } + ?: emptyList(), + fieldUiModel.orgUnitSelectorScope + ?: OrgUnitSelectorScope.UserSearchScope(), + uiEvent.label, + ) + } + + is TrackerInputUiEvent.OnLaunchCustomIntent -> { + onLaunchCustomIntent( + uiEvent.uid, + uiEvent.customIntentUid, + ) + } + + is TrackerInputUiEvent.OnItemClick -> { + fieldUiModel.onItemClick() + } + + is TrackerInputUiEvent.OnValueChange -> { + fieldUiModel.onSave(uiEvent.value) + } + } + }, ), ) } @@ -351,6 +393,7 @@ fun SearchFormPreview() { onSearch = {}, onClear = {}, onClose = {}, + onLaunchCustomIntent = { _, _ -> }, ) } @@ -382,6 +425,7 @@ fun SearchFormPreviewWithClear() { onSearch = {}, onClear = {}, onClose = {}, + onLaunchCustomIntent = { _, _ -> }, ) } @@ -404,6 +448,32 @@ fun initSearchScreen( teiTypeUid = teiType, ) composeView.setContent { + val launcher = + rememberLauncherForActivityResult( + contract = CustomIntentActivityResultContract(), + onResult = viewModel::handleCustomIntentResult, + ) + + ObserveAsEvents( + flow = viewModel.searchActions, + ) { action -> + when (action) { + is TrackerInputAction.LaunchCustomIntent -> { + launcher.launch( + with(action) { + CustomIntentInput( + fieldUid = fieldUid, + customIntent = customIntentModel, + defaultTitle = + customIntentModel.name + ?: resources.getString(org.dhis2.form.R.string.select_app_intent), + ) + }, + ) + } + } + } + SearchParametersScreen( resourceManager = resources, uiState = viewModel.searchParametersUiState, @@ -416,6 +486,7 @@ fun initSearchScreen( viewModel.clearFocus() }, onClose = { viewModel.clearFocus() }, + onLaunchCustomIntent = viewModel::onLaunchCustomIntent, ) } } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapper.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapper.kt new file mode 100644 index 00000000000..e98369d5546 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapper.kt @@ -0,0 +1,204 @@ +package org.dhis2.usescases.searchTrackEntity.searchparameters.mapper + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.ui.graphics.Color +import androidx.paging.compose.collectAsLazyPagingItems +import org.dhis2.commons.resources.ResourceManager +import org.dhis2.form.R +import org.dhis2.form.model.FieldUiModel +import org.dhis2.form.model.UiRenderType +import org.dhis2.tracker.ui.input.model.TrackerInputModel +import org.dhis2.tracker.ui.input.model.TrackerInputType +import org.dhis2.tracker.ui.input.model.TrackerOptionItem +import org.dhis2.tracker.ui.input.model.TrackerOptionSetConfiguration +import org.hisp.dhis.android.core.common.ValueType +import org.hisp.dhis.mobile.ui.designsystem.component.LegendData +import org.hisp.dhis.mobile.ui.designsystem.component.Orientation + +@Composable +fun FieldUiModel.toParameterInputModel( + fetchOptions: () -> Unit, + resourceManager: ResourceManager, +): TrackerInputModel { + val trackerInputType = + when { + optionSet != null && valueType != ValueType.MULTI_TEXT -> { + getInputTypeForOptionSetByRenderingType(renderingType) + } + + customIntent != null -> { + TrackerInputType.CUSTOM_INTENT + } + + eventCategories != null -> { + TrackerInputType.NOT_SUPPORTED + } + + else -> getInputTypeByValueType(valueType, renderingType) + } + + return TrackerInputModel( + uid = uid, + label = label, + value = value, + focused = focused, + valueType = trackerInputType, + optionSet = optionSet, + error = error, + warning = warning, + description = description, + mandatory = mandatory, + editable = editable, + legend = + legend?.let { + LegendData( + color = Color(it.color), + title = it.label ?: "", + popUpLegendDescriptionData = it.legendsInfo, + ) + }, + orientation = renderingType.getOrientation(), + optionSetConfiguration = + when (valueType) { + ValueType.BOOLEAN -> getBooleanOptionConfiguration(resourceManager) + else -> optionSetConfiguration?.toTrackerOptionSetConfiguration(fetchOptions) + }, + customIntentUid = customIntent?.uid, + displayName = displayName, + ) +} + +@Composable +private fun org.dhis2.form.model.OptionSetConfiguration.toTrackerOptionSetConfiguration( + fetchOptions: () -> Unit, +): TrackerOptionSetConfiguration { + val optionsData = + optionFlow + .collectAsLazyPagingItems() + .also { LaunchedEffect(this) { it.refresh() } } + + val options by remember { + derivedStateOf { + (0 until (optionsData.itemCount)).mapNotNull { index -> + optionsData[index]?.let { optionData -> + TrackerOptionItem( + code = optionData.option.code() ?: "", + displayName = optionData.option.displayName() ?: "", + ) + } + } + } + } + + return TrackerOptionSetConfiguration( + options = options, + onSearch = onSearch, + onLoadOptions = fetchOptions, + ) +} + +internal fun getInputTypeForOptionSetByRenderingType(renderingType: UiRenderType?): TrackerInputType = + when (renderingType) { + UiRenderType.HORIZONTAL_RADIOBUTTONS, + UiRenderType.VERTICAL_RADIOBUTTONS, + -> TrackerInputType.RADIO_BUTTON + + UiRenderType.HORIZONTAL_CHECKBOXES, + UiRenderType.VERTICAL_CHECKBOXES, + -> TrackerInputType.CHECKBOX + + UiRenderType.MATRIX -> TrackerInputType.MATRIX + + UiRenderType.SEQUENCIAL -> TrackerInputType.SEQUENTIAL + + else -> TrackerInputType.DROPDOWN + } + +internal fun getInputTypeByValueType( + valueType: ValueType?, + renderingType: UiRenderType?, +): TrackerInputType = + when (valueType) { + ValueType.TEXT -> { + when (renderingType) { + UiRenderType.QR_CODE, UiRenderType.GS1_DATAMATRIX -> TrackerInputType.QR_CODE + UiRenderType.BAR_CODE -> TrackerInputType.BAR_CODE + else -> TrackerInputType.TEXT + } + } + + ValueType.INTEGER_POSITIVE -> TrackerInputType.INTEGER_POSITIVE + ValueType.INTEGER_ZERO_OR_POSITIVE -> TrackerInputType.INTEGER_ZERO_OR_POSITIVE + ValueType.PERCENTAGE -> TrackerInputType.PERCENTAGE + ValueType.NUMBER -> TrackerInputType.NUMBER + ValueType.INTEGER_NEGATIVE -> TrackerInputType.INTEGER_NEGATIVE + ValueType.LONG_TEXT -> TrackerInputType.LONG_TEXT + ValueType.INTEGER -> TrackerInputType.INTEGER + ValueType.ORGANISATION_UNIT -> TrackerInputType.ORGANISATION_UNIT + ValueType.EMAIL -> TrackerInputType.EMAIL + ValueType.BOOLEAN -> { + when (renderingType) { + UiRenderType.HORIZONTAL_CHECKBOXES, + UiRenderType.VERTICAL_CHECKBOXES, + -> TrackerInputType.CHECKBOX + + else -> TrackerInputType.RADIO_BUTTON + } + } + + ValueType.TRUE_ONLY -> { + when (renderingType) { + UiRenderType.TOGGLE -> TrackerInputType.YES_ONLY_SWITCH + else -> TrackerInputType.YES_ONLY_CHECKBOX + } + } + + ValueType.PHONE_NUMBER -> TrackerInputType.PHONE_NUMBER + ValueType.DATE -> TrackerInputType.DATE + ValueType.DATETIME -> TrackerInputType.DATE_TIME + ValueType.TIME -> TrackerInputType.TIME + + ValueType.AGE -> TrackerInputType.AGE + ValueType.MULTI_TEXT -> TrackerInputType.MULTI_SELECTION + + ValueType.USERNAME, + ValueType.LETTER, + ValueType.UNIT_INTERVAL, + ValueType.TRACKER_ASSOCIATE, + ValueType.REFERENCE, + ValueType.COORDINATE, + ValueType.IMAGE, + ValueType.FILE_RESOURCE, + ValueType.GEOJSON, + ValueType.URL, + null, + -> TrackerInputType.NOT_SUPPORTED + } + +internal fun UiRenderType?.getOrientation(): Orientation = + when (this) { + UiRenderType.HORIZONTAL_CHECKBOXES, + UiRenderType.HORIZONTAL_RADIOBUTTONS, + -> Orientation.HORIZONTAL + + else -> Orientation.VERTICAL + } + +internal fun getBooleanOptionConfiguration(resourceManager: ResourceManager) = + TrackerOptionSetConfiguration( + options = + listOf( + TrackerOptionItem( + true.toString(), + resourceManager.getString(R.string.yes), + ), + TrackerOptionItem( + false.toString(), + resourceManager.getString(R.string.no), + ), + ), + ) diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/provider/ParameterSelectorItemProvider.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/provider/ParameterSelectorItemProvider.kt deleted file mode 100644 index 1709f044e45..00000000000 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/provider/ParameterSelectorItemProvider.kt +++ /dev/null @@ -1,138 +0,0 @@ -package org.dhis2.usescases.searchTrackEntity.searchparameters.provider - -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.outlined.AddCircleOutline -import androidx.compose.material.icons.outlined.QrCode2 -import androidx.compose.material3.Icon -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.remember -import androidx.compose.ui.Modifier -import androidx.compose.ui.focus.FocusManager -import androidx.compose.ui.focus.FocusRequester -import androidx.compose.ui.focus.focusRequester -import org.dhis2.R -import org.dhis2.commons.resources.ResourceManager -import org.dhis2.form.model.FieldUiModel -import org.dhis2.form.model.UiRenderType -import org.dhis2.form.ui.event.RecyclerViewUiEvents -import org.dhis2.form.ui.provider.inputfield.FieldProvider -import org.hisp.dhis.android.core.common.ValueType -import org.hisp.dhis.mobile.ui.designsystem.component.InputStyle -import org.hisp.dhis.mobile.ui.designsystem.component.parameter.model.ParameterSelectorItemModel -import org.hisp.dhis.mobile.ui.designsystem.resource.provideDHIS2Icon -import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor - -@Composable -fun provideParameterSelectorItem( - resources: ResourceManager, - focusManager: FocusManager, - fieldUiModel: FieldUiModel, - callback: FieldUiModel.Callback, - onNextClicked: () -> Unit, -): ParameterSelectorItemModel { - val focusRequester = remember { FocusRequester() } - - val status = - if (fieldUiModel.focused) { - ParameterSelectorItemModel.Status.FOCUSED - } else if (fieldUiModel.value.isNullOrEmpty()) { - ParameterSelectorItemModel.Status.CLOSED - } else { - ParameterSelectorItemModel.Status.UNFOCUSED - } - - LaunchedEffect(key1 = status) { - if (status == ParameterSelectorItemModel.Status.FOCUSED) { - focusRequester.requestFocus() - } - } - - return ParameterSelectorItemModel( - icon = { ProvideIcon(fieldUiModel.valueType, fieldUiModel.renderingType) }, - label = fieldUiModel.label, - helper = resources.getString(R.string.optional), - inputField = { - FieldProvider( - modifier = - Modifier - .focusRequester(focusRequester), - inputStyle = InputStyle.ParameterInputStyle(), - fieldUiModel = fieldUiModel, - uiEventHandler = callback::recyclerViewUiEvents, - intentHandler = callback::intent, - resources = resources, - focusManager = focusManager, - onNextClicked = onNextClicked, - onFileSelected = { - // Not supported for search - }, - reEvaluateCustomIntentRequestParameters = false, - ) - }, - status = status, - onExpand = { - performOnExpandActions(fieldUiModel, callback) - }, - ) -} - -private fun performOnExpandActions( - fieldUiModel: FieldUiModel, - callback: FieldUiModel.Callback, -) { - fieldUiModel.onItemClick() - - if (fieldUiModel.renderingType == UiRenderType.QR_CODE || - fieldUiModel.renderingType == UiRenderType.BAR_CODE - ) { - callback.recyclerViewUiEvents( - RecyclerViewUiEvents.ScanQRCode( - uid = fieldUiModel.uid, - optionSet = fieldUiModel.optionSet, - renderingType = fieldUiModel.renderingType, - ), - ) - } -} - -@Composable -private fun ProvideIcon( - valueType: ValueType?, - renderingType: UiRenderType?, -) = when (valueType) { - ValueType.TEXT -> { - when (renderingType) { - UiRenderType.QR_CODE, UiRenderType.GS1_DATAMATRIX -> { - Icon( - imageVector = Icons.Outlined.QrCode2, - contentDescription = "Icon Button", - tint = SurfaceColor.Primary, - ) - } - - UiRenderType.BAR_CODE -> { - Icon( - painter = provideDHIS2Icon("material_barcode_scanner"), - contentDescription = "Icon Button", - tint = SurfaceColor.Primary, - ) - } - - else -> { - Icon( - imageVector = Icons.Outlined.AddCircleOutline, - contentDescription = "Icon Button", - tint = SurfaceColor.Primary, - ) - } - } - } - - else -> - Icon( - imageVector = Icons.Outlined.AddCircleOutline, - contentDescription = "Icon Button", - tint = SurfaceColor.Primary, - ) -} diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt index 546d952cbd0..c101623c935 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt @@ -26,10 +26,13 @@ import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.search.SearchParametersModel import org.dhis2.form.model.FieldUiModel import org.dhis2.form.model.FieldUiModelImpl +import org.dhis2.form.ui.customintent.CustomIntentResult import org.dhis2.form.ui.intent.FormIntent import org.dhis2.form.ui.provider.DisplayNameProvider import org.dhis2.maps.geometry.mapper.EventsByProgramStage import org.dhis2.maps.usecases.MapStyleConfiguration +import org.dhis2.mobile.commons.model.CustomIntentModel +import org.dhis2.tracker.ui.input.action.TrackerInputAction import org.dhis2.usescases.searchTrackEntity.listView.SearchResult.SearchResultType import org.dhis2.utils.customviews.navigationbar.NavigationPage import org.hisp.dhis.android.core.common.ValueType @@ -48,7 +51,6 @@ import org.mockito.kotlin.mock import org.mockito.kotlin.times import org.mockito.kotlin.verify import org.mockito.kotlin.whenever -import kotlin.text.get @OptIn(ExperimentalCoroutinesApi::class) class SearchTEIViewModelTest { @@ -717,7 +719,8 @@ class SearchTEIViewModelTest { @Test fun `should return user-friendly names on search parameters fields`() { - viewModel.searchParametersUiState = viewModel.searchParametersUiState.copy(items = getFieldUIModels()) + viewModel.searchParametersUiState = + viewModel.searchParametersUiState.copy(items = getFieldUIModels()) val expectedMap = mapOf( "uid1" to "Friendly OrgUnit Name", @@ -737,7 +740,8 @@ class SearchTEIViewModelTest { @Test fun `should clear uiState when clearing data`() { - viewModel.searchParametersUiState = viewModel.searchParametersUiState.copy(items = getFieldUIModels()) + viewModel.searchParametersUiState = + viewModel.searchParametersUiState.copy(items = getFieldUIModels()) performSearch() viewModel.clearQueryData() assert(viewModel.queryData.isEmpty()) @@ -747,7 +751,8 @@ class SearchTEIViewModelTest { @Test fun `should return date without format`() { - viewModel.searchParametersUiState = viewModel.searchParametersUiState.copy(items = getMalformedDateFieldUIModels()) + viewModel.searchParametersUiState = + viewModel.searchParametersUiState.copy(items = getMalformedDateFieldUIModels()) val expectedMap = mapOf( "uid1" to "04", @@ -863,6 +868,72 @@ class SearchTEIViewModelTest { ) } + @Test + fun `should send launch custom intent action`() = + runTest { + val customIntentModel: CustomIntentModel = mock() + whenever(repositoryKt.getCustomIntent(any())) doReturn customIntentModel + viewModel.searchActions.test { + viewModel.onLaunchCustomIntent("fieldUid", "customIntentUid") + assertTrue(awaitItem() is TrackerInputAction.LaunchCustomIntent) + } + } + + @Test + fun `should set error if custom intent result is error`() { + whenever(resourceManager.getString(R.string.custom_intent_error)) doReturn "Custom intent error message" + viewModel.searchParametersUiState = + viewModel.searchParametersUiState.copy(items = customIntentFieldUIModels()) + viewModel.handleCustomIntentResult( + CustomIntentResult.Error("fieldUid"), + ) + assertTrue( + viewModel.searchParametersUiState.items + .first() + .error != null, + ) + } + + @Test + fun `should update values if custom intent result is successful`() = + runTest { + viewModel.searchParametersUiState = + viewModel.searchParametersUiState.copy(items = customIntentFieldUIModels()) + viewModel.handleCustomIntentResult( + CustomIntentResult.Success("fieldUid", "customValue"), + ) + assertTrue( + viewModel.searchParametersUiState.items + .first() + .error == null, + ) + assertTrue( + viewModel.searchParametersUiState.items + .first() + .value == "customValue", + ) + } + + private fun customIntentFieldUIModels() = + listOf( + FieldUiModelImpl( + uid = "fieldUid", + label = "CustomIntent", + value = null, + autocompleteList = emptyList(), + optionSetConfiguration = null, + customIntent = + CustomIntentModel( + uid = "customIntentUid", + name = "test", + packageName = "test.test.test", + customIntentRequest = listOf(), + customIntentResponse = listOf(), + ), + valueType = ValueType.TEXT, + ), + ) + private fun getMalformedDateFieldUIModels(): List = listOf( FieldUiModelImpl( diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapperTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapperTest.kt new file mode 100644 index 00000000000..401655d54b2 --- /dev/null +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapperTest.kt @@ -0,0 +1,334 @@ +package org.dhis2.usescases.searchTrackEntity.searchparameters.mapper + +import org.dhis2.commons.resources.ResourceManager +import org.dhis2.form.R +import org.dhis2.form.model.UiRenderType +import org.dhis2.tracker.ui.input.model.TrackerInputType +import org.hisp.dhis.android.core.common.ValueType +import org.hisp.dhis.mobile.ui.designsystem.component.Orientation +import org.junit.Assert.assertEquals +import org.junit.Before +import org.junit.Test +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever + +class ParameterInputModelMapperTest { + private val resourceManager: ResourceManager = mock() + + @Before + fun setUp() { + whenever(resourceManager.getString(R.string.yes)) doReturn "Yes" + whenever(resourceManager.getString(R.string.no)) doReturn "No" + } + + // Test getInputTypeForOptionSetByRenderingType + @Test + fun `should return RADIO_BUTTON for horizontal radio buttons rendering type`() { + val result = getInputTypeForOptionSetByRenderingType(UiRenderType.HORIZONTAL_RADIOBUTTONS) + assertEquals(TrackerInputType.RADIO_BUTTON, result) + } + + @Test + fun `should return RADIO_BUTTON for vertical radio buttons rendering type`() { + val result = getInputTypeForOptionSetByRenderingType(UiRenderType.VERTICAL_RADIOBUTTONS) + assertEquals(TrackerInputType.RADIO_BUTTON, result) + } + + @Test + fun `should return CHECKBOX for horizontal checkboxes rendering type`() { + val result = getInputTypeForOptionSetByRenderingType(UiRenderType.HORIZONTAL_CHECKBOXES) + assertEquals(TrackerInputType.CHECKBOX, result) + } + + @Test + fun `should return CHECKBOX for vertical checkboxes rendering type`() { + val result = getInputTypeForOptionSetByRenderingType(UiRenderType.VERTICAL_CHECKBOXES) + assertEquals(TrackerInputType.CHECKBOX, result) + } + + @Test + fun `should return MATRIX for matrix rendering type`() { + val result = getInputTypeForOptionSetByRenderingType(UiRenderType.MATRIX) + assertEquals(TrackerInputType.MATRIX, result) + } + + @Test + fun `should return SEQUENTIAL for sequential rendering type`() { + val result = getInputTypeForOptionSetByRenderingType(UiRenderType.SEQUENCIAL) + assertEquals(TrackerInputType.SEQUENTIAL, result) + } + + @Test + fun `should return DROPDOWN for null rendering type`() { + val result = getInputTypeForOptionSetByRenderingType(null) + assertEquals(TrackerInputType.DROPDOWN, result) + } + + @Test + fun `should return DROPDOWN for default rendering type`() { + val result = getInputTypeForOptionSetByRenderingType(UiRenderType.DEFAULT) + assertEquals(TrackerInputType.DROPDOWN, result) + } + + // Test getInputTypeByValueType for TEXT + @Test + fun `should return TEXT for TEXT value type with default rendering`() { + val result = getInputTypeByValueType(ValueType.TEXT, null) + assertEquals(TrackerInputType.TEXT, result) + } + + @Test + fun `should return QR_CODE for TEXT value type with QR_CODE rendering`() { + val result = getInputTypeByValueType(ValueType.TEXT, UiRenderType.QR_CODE) + assertEquals(TrackerInputType.QR_CODE, result) + } + + @Test + fun `should return QR_CODE for TEXT value type with GS1_DATAMATRIX rendering`() { + val result = getInputTypeByValueType(ValueType.TEXT, UiRenderType.GS1_DATAMATRIX) + assertEquals(TrackerInputType.QR_CODE, result) + } + + @Test + fun `should return BAR_CODE for TEXT value type with BAR_CODE rendering`() { + val result = getInputTypeByValueType(ValueType.TEXT, UiRenderType.BAR_CODE) + assertEquals(TrackerInputType.BAR_CODE, result) + } + + // Test getInputTypeByValueType for numeric types + @Test + fun `should return INTEGER_POSITIVE for INTEGER_POSITIVE value type`() { + val result = getInputTypeByValueType(ValueType.INTEGER_POSITIVE, null) + assertEquals(TrackerInputType.INTEGER_POSITIVE, result) + } + + @Test + fun `should return INTEGER_ZERO_OR_POSITIVE for INTEGER_ZERO_OR_POSITIVE value type`() { + val result = getInputTypeByValueType(ValueType.INTEGER_ZERO_OR_POSITIVE, null) + assertEquals(TrackerInputType.INTEGER_ZERO_OR_POSITIVE, result) + } + + @Test + fun `should return PERCENTAGE for PERCENTAGE value type`() { + val result = getInputTypeByValueType(ValueType.PERCENTAGE, null) + assertEquals(TrackerInputType.PERCENTAGE, result) + } + + @Test + fun `should return NUMBER for NUMBER value type`() { + val result = getInputTypeByValueType(ValueType.NUMBER, null) + assertEquals(TrackerInputType.NUMBER, result) + } + + @Test + fun `should return INTEGER_NEGATIVE for INTEGER_NEGATIVE value type`() { + val result = getInputTypeByValueType(ValueType.INTEGER_NEGATIVE, null) + assertEquals(TrackerInputType.INTEGER_NEGATIVE, result) + } + + @Test + fun `should return INTEGER for INTEGER value type`() { + val result = getInputTypeByValueType(ValueType.INTEGER, null) + assertEquals(TrackerInputType.INTEGER, result) + } + + // Test getInputTypeByValueType for text types + @Test + fun `should return LONG_TEXT for LONG_TEXT value type`() { + val result = getInputTypeByValueType(ValueType.LONG_TEXT, null) + assertEquals(TrackerInputType.LONG_TEXT, result) + } + + @Test + fun `should return EMAIL for EMAIL value type`() { + val result = getInputTypeByValueType(ValueType.EMAIL, null) + assertEquals(TrackerInputType.EMAIL, result) + } + + @Test + fun `should return PHONE_NUMBER for PHONE_NUMBER value type`() { + val result = getInputTypeByValueType(ValueType.PHONE_NUMBER, null) + assertEquals(TrackerInputType.PHONE_NUMBER, result) + } + + // Test getInputTypeByValueType for BOOLEAN + @Test + fun `should return RADIO_BUTTON for BOOLEAN value type with default rendering`() { + val result = getInputTypeByValueType(ValueType.BOOLEAN, null) + assertEquals(TrackerInputType.RADIO_BUTTON, result) + } + + @Test + fun `should return CHECKBOX for BOOLEAN value type with horizontal checkboxes rendering`() { + val result = getInputTypeByValueType(ValueType.BOOLEAN, UiRenderType.HORIZONTAL_CHECKBOXES) + assertEquals(TrackerInputType.CHECKBOX, result) + } + + @Test + fun `should return CHECKBOX for BOOLEAN value type with vertical checkboxes rendering`() { + val result = getInputTypeByValueType(ValueType.BOOLEAN, UiRenderType.VERTICAL_CHECKBOXES) + assertEquals(TrackerInputType.CHECKBOX, result) + } + + // Test getInputTypeByValueType for TRUE_ONLY + @Test + fun `should return YES_ONLY_CHECKBOX for TRUE_ONLY value type with default rendering`() { + val result = getInputTypeByValueType(ValueType.TRUE_ONLY, null) + assertEquals(TrackerInputType.YES_ONLY_CHECKBOX, result) + } + + @Test + fun `should return YES_ONLY_SWITCH for TRUE_ONLY value type with toggle rendering`() { + val result = getInputTypeByValueType(ValueType.TRUE_ONLY, UiRenderType.TOGGLE) + assertEquals(TrackerInputType.YES_ONLY_SWITCH, result) + } + + // Test getInputTypeByValueType for date/time types + @Test + fun `should return DATE for DATE value type`() { + val result = getInputTypeByValueType(ValueType.DATE, null) + assertEquals(TrackerInputType.DATE, result) + } + + @Test + fun `should return DATE_TIME for DATETIME value type`() { + val result = getInputTypeByValueType(ValueType.DATETIME, null) + assertEquals(TrackerInputType.DATE_TIME, result) + } + + @Test + fun `should return TIME for TIME value type`() { + val result = getInputTypeByValueType(ValueType.TIME, null) + assertEquals(TrackerInputType.TIME, result) + } + + @Test + fun `should return AGE for AGE value type`() { + val result = getInputTypeByValueType(ValueType.AGE, null) + assertEquals(TrackerInputType.AGE, result) + } + + // Test getInputTypeByValueType for other supported types + @Test + fun `should return ORGANISATION_UNIT for ORGANISATION_UNIT value type`() { + val result = getInputTypeByValueType(ValueType.ORGANISATION_UNIT, null) + assertEquals(TrackerInputType.ORGANISATION_UNIT, result) + } + + @Test + fun `should return MULTI_SELECTION for MULTI_TEXT value type`() { + val result = getInputTypeByValueType(ValueType.MULTI_TEXT, null) + assertEquals(TrackerInputType.MULTI_SELECTION, result) + } + + // Test getInputTypeByValueType for NOT_SUPPORTED types + @Test + fun `should return NOT_SUPPORTED for USERNAME value type`() { + val result = getInputTypeByValueType(ValueType.USERNAME, null) + assertEquals(TrackerInputType.NOT_SUPPORTED, result) + } + + @Test + fun `should return NOT_SUPPORTED for LETTER value type`() { + val result = getInputTypeByValueType(ValueType.LETTER, null) + assertEquals(TrackerInputType.NOT_SUPPORTED, result) + } + + @Test + fun `should return NOT_SUPPORTED for UNIT_INTERVAL value type`() { + val result = getInputTypeByValueType(ValueType.UNIT_INTERVAL, null) + assertEquals(TrackerInputType.NOT_SUPPORTED, result) + } + + @Test + fun `should return NOT_SUPPORTED for TRACKER_ASSOCIATE value type`() { + val result = getInputTypeByValueType(ValueType.TRACKER_ASSOCIATE, null) + assertEquals(TrackerInputType.NOT_SUPPORTED, result) + } + + @Test + fun `should return NOT_SUPPORTED for REFERENCE value type`() { + val result = getInputTypeByValueType(ValueType.REFERENCE, null) + assertEquals(TrackerInputType.NOT_SUPPORTED, result) + } + + @Test + fun `should return NOT_SUPPORTED for COORDINATE value type`() { + val result = getInputTypeByValueType(ValueType.COORDINATE, null) + assertEquals(TrackerInputType.NOT_SUPPORTED, result) + } + + @Test + fun `should return NOT_SUPPORTED for IMAGE value type`() { + val result = getInputTypeByValueType(ValueType.IMAGE, null) + assertEquals(TrackerInputType.NOT_SUPPORTED, result) + } + + @Test + fun `should return NOT_SUPPORTED for FILE_RESOURCE value type`() { + val result = getInputTypeByValueType(ValueType.FILE_RESOURCE, null) + assertEquals(TrackerInputType.NOT_SUPPORTED, result) + } + + @Test + fun `should return NOT_SUPPORTED for GEOJSON value type`() { + val result = getInputTypeByValueType(ValueType.GEOJSON, null) + assertEquals(TrackerInputType.NOT_SUPPORTED, result) + } + + @Test + fun `should return NOT_SUPPORTED for URL value type`() { + val result = getInputTypeByValueType(ValueType.URL, null) + assertEquals(TrackerInputType.NOT_SUPPORTED, result) + } + + @Test + fun `should return NOT_SUPPORTED for null value type`() { + val result = getInputTypeByValueType(null, null) + assertEquals(TrackerInputType.NOT_SUPPORTED, result) + } + + // Test getOrientation + @Test + fun `should return HORIZONTAL for horizontal checkboxes rendering type`() { + val result = UiRenderType.HORIZONTAL_CHECKBOXES.getOrientation() + assertEquals(Orientation.HORIZONTAL, result) + } + + @Test + fun `should return HORIZONTAL for horizontal radio buttons rendering type`() { + val result = UiRenderType.HORIZONTAL_RADIOBUTTONS.getOrientation() + assertEquals(Orientation.HORIZONTAL, result) + } + + @Test + fun `should return VERTICAL for vertical checkboxes rendering type`() { + val result = UiRenderType.VERTICAL_CHECKBOXES.getOrientation() + assertEquals(Orientation.VERTICAL, result) + } + + @Test + fun `should return VERTICAL for null rendering type`() { + val result = (null as UiRenderType?).getOrientation() + assertEquals(Orientation.VERTICAL, result) + } + + @Test + fun `should return VERTICAL for default rendering type`() { + val result = UiRenderType.DEFAULT.getOrientation() + assertEquals(Orientation.VERTICAL, result) + } + + // Test getBooleanOptionConfiguration + @Test + fun `should return correct boolean option configuration`() { + val result = getBooleanOptionConfiguration(resourceManager) + + assertEquals(2, result.options.size) + assertEquals("true", result.options[0].code) + assertEquals("Yes", result.options[0].displayName) + assertEquals("false", result.options[1].code) + assertEquals("No", result.options[1].displayName) + } +} diff --git a/commonskmm/build.gradle.kts b/commonskmm/build.gradle.kts index 110b39f9280..1d9c1cc2f75 100644 --- a/commonskmm/build.gradle.kts +++ b/commonskmm/build.gradle.kts @@ -101,7 +101,7 @@ kotlin { } compose.resources { - publicResClass = false + publicResClass = true packageOfResClass = "org.dhis2.mobile.commons.resources" generateResClass = always } diff --git a/commonskmm/src/commonMain/composeResources/values/strings.xml b/commonskmm/src/commonMain/composeResources/values/strings.xml index 950703d6ec7..2503658a720 100644 --- a/commonskmm/src/commonMain/composeResources/values/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values/strings.xml @@ -212,5 +212,10 @@ + OR + AGE + DATE OF BIRTH + Cancel + OK \ No newline at end of file diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/dates/DateTimeInputsUtils.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/dates/DateTimeInputsUtils.kt new file mode 100644 index 00000000000..402504b738e --- /dev/null +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/dates/DateTimeInputsUtils.kt @@ -0,0 +1,94 @@ +package org.dhis2.mobile.commons.dates + +import kotlinx.datetime.DateTimeUnit +import kotlinx.datetime.LocalDate +import kotlinx.datetime.TimeZone +import kotlinx.datetime.daysUntil +import kotlinx.datetime.minus +import kotlinx.datetime.number +import kotlinx.datetime.periodUntil +import kotlinx.datetime.todayIn +import kotlin.time.Clock +import kotlin.time.ExperimentalTime + +/** + * Calculates a date from an age value and time unit + * Uses kotlinx.datetime for date arithmetic + * @param ageValue The age value as an integer + * @param timeUnit The time unit (years, months, or days) - expects string values: "YEARS", "MONTHS", "DAYS" + * @return The calculated date in yyyy-MM-dd format, or null if calculation fails + */ +@OptIn(ExperimentalTime::class) +fun calculateDateFromAge( + ageValue: String, + timeUnit: String, +): String? { + return try { + val today = + Clock.System + .todayIn(TimeZone.currentSystemDefault()) + + val calculatedDate = + when (timeUnit) { + "YEARS" -> today.minus(ageValue.toInt(), DateTimeUnit.YEAR) + "MONTHS" -> today.minus(ageValue.toInt(), DateTimeUnit.MONTH) + "DAYS" -> today.minus(ageValue.toInt(), DateTimeUnit.DAY) + else -> return null + } + + calculatedDate.toString() + } catch (_: Exception) { + null + } +} + +/** + * Calculates age from a date string based on the specified time unit + * Uses kotlinx.datetime for period calculations + * @param dateString The birth date in yyyy-MM-dd format + * @param timeUnit The time unit to calculate age in - expects string values: "YEARS", "MONTHS", "DAYS" + * @return The calculated age as a string, or null if calculation fails + */ +@OptIn(ExperimentalTime::class) +fun calculateAgeFromDate( + dateString: String, + timeUnit: String, +): String? = + try { + val birthDate = LocalDate.parse(dateString) + val today = + Clock.System + .todayIn(TimeZone.currentSystemDefault()) + + when (timeUnit) { + "YEARS" -> { + val period = birthDate.periodUntil(today) + period.years.toString() + } + "MONTHS" -> { + monthsBetween(birthDate, today).toString() + } + "DAYS" -> { + birthDate.daysUntil(today).toString() + } + else -> null + } + } catch (_: Exception) { + null + } + +/** + * Calculates the number of months between two dates + * Uses kotlinx.datetime for accurate month calculations + * @param startDate The start date + * @param endDate The end date + * @return The number of months between the two dates + */ +fun monthsBetween( + startDate: LocalDate, + endDate: LocalDate, +): Int { + val startDateTotalMonths = 12 * startDate.year + startDate.month.number + val endDateTotalMonths = 12 * endDate.year + endDate.month.number + return endDateTotalMonths - startDateTotalMonths +} diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/CustomIntentProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/CustomIntentProvider.kt index 049b901e3df..47177937c8c 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/CustomIntentProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/CustomIntentProvider.kt @@ -9,7 +9,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshots.SnapshotStateList import androidx.compose.ui.Modifier -import org.dhis2.commons.resources.ResourceManager +import androidx.compose.ui.res.stringResource import org.dhis2.form.R import org.dhis2.form.extensions.inputState import org.dhis2.form.extensions.supportingText @@ -29,7 +29,6 @@ import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextState @Composable fun ProvideCustomIntentInput( fieldUiModel: FieldUiModel, - resources: ResourceManager, intentHandler: (FormIntent) -> Unit, uiEventHandler: (RecyclerViewUiEvents) -> Unit, inputStyle: InputStyle, @@ -48,7 +47,7 @@ fun ProvideCustomIntentInput( val errorGettingDataMessage = SupportingTextData( state = SupportingTextState.ERROR, - text = resources.getString(R.string.custom_intent_error), + text = stringResource(R.string.custom_intent_error), ) val fieldErrorMessage = SupportingTextData( @@ -86,9 +85,10 @@ fun ProvideCustomIntentInput( } } } + val defaultLauncherTitle = stringResource(R.string.select_app_intent) InputCustomIntent( title = fieldUiModel.label, - buttonText = resources.getString(R.string.custom_intent_launch), + buttonText = stringResource(R.string.custom_intent_launch), supportingText = supportingTextList.toList(), inputShellState = inputShellState, inputStyle = inputStyle, @@ -108,12 +108,12 @@ fun ProvideCustomIntentInput( if (supportingTextList.contains(errorGettingDataMessage)) { supportingTextList.remove(errorGettingDataMessage) } - fieldUiModel.customIntent?.let { + fieldUiModel.customIntent?.let { customIntent -> launcher.launch( CustomIntentInput( fieldUid = fieldUiModel.uid, - customIntent = it, - defaultTitle = fieldUiModel.customIntent?.name ?: resources.getString(R.string.select_app_intent), + customIntent = customIntent, + defaultTitle = customIntent.name ?: defaultLauncherTitle, ), ) } diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/FieldProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/FieldProvider.kt index 27ba6a2ee2b..0b39ebef224 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/FieldProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/FieldProvider.kt @@ -130,7 +130,6 @@ fun FieldProvider( fieldUiModel = fieldUiModel, intentHandler = intentHandler, uiEventHandler = uiEventHandler, - resources = resources, inputStyle = inputStyle, reEvaluateRequestParams = reEvaluateCustomIntentRequestParameters, modifier = modifierWithFocus, diff --git a/tracker/src/commonMain/composeResources/values-cs/strings.xml b/tracker/src/commonMain/composeResources/values-cs/strings.xml index 6360fc3ac40..0e2b324281e 100644 --- a/tracker/src/commonMain/composeResources/values-cs/strings.xml +++ b/tracker/src/commonMain/composeResources/values-cs/strings.xml @@ -17,4 +17,6 @@ Vymazat hledání Hledat Volitelný + Spustit + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-zh/strings.xml b/tracker/src/commonMain/composeResources/values-zh/strings.xml index e9bd51827e4..3d55157830f 100644 --- a/tracker/src/commonMain/composeResources/values-zh/strings.xml +++ b/tracker/src/commonMain/composeResources/values-zh/strings.xml @@ -17,5 +17,6 @@ 清除搜索 搜索 可选项描述 + 启动 \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values/strings.xml b/tracker/src/commonMain/composeResources/values/strings.xml index a716e26fc62..3cbc1bb369b 100644 --- a/tracker/src/commonMain/composeResources/values/strings.xml +++ b/tracker/src/commonMain/composeResources/values/strings.xml @@ -18,5 +18,6 @@ Clear search Search Optional + Launch \ No newline at end of file diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/provider/ParameterSelectorItemProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/provider/ParameterSelectorItemProvider.kt new file mode 100644 index 00000000000..20637114a78 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/provider/ParameterSelectorItemProvider.kt @@ -0,0 +1,87 @@ +package org.dhis2.tracker.search.ui.provider + +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.AddCircleOutline +import androidx.compose.material.icons.outlined.QrCode2 +import androidx.compose.material3.Icon +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import org.dhis2.tracker.ui.input.model.TrackerInputModel +import org.dhis2.tracker.ui.input.model.TrackerInputType +import org.dhis2.tracker.ui.input.model.TrackerInputUiEvent +import org.dhis2.tracker.ui.input.provider.TrackerInputProvider +import org.hisp.dhis.mobile.ui.designsystem.component.InputStyle +import org.hisp.dhis.mobile.ui.designsystem.component.parameter.model.ParameterSelectorItemModel +import org.hisp.dhis.mobile.ui.designsystem.resource.provideDHIS2Icon +import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor + +@Composable +fun provideParameterSelectorItem( + inputModel: TrackerInputModel, + helperText: String, + onNextClicked: () -> Unit, + onUiEvent: (TrackerInputUiEvent) -> Unit, +): ParameterSelectorItemModel { + val status = + if (inputModel.focused) { + ParameterSelectorItemModel.Status.FOCUSED + } else if (inputModel.value.isNullOrEmpty()) { + ParameterSelectorItemModel.Status.CLOSED + } else { + ParameterSelectorItemModel.Status.UNFOCUSED + } + + return ParameterSelectorItemModel( + icon = { ProvideParameterIcon(inputModel.valueType) }, + label = inputModel.label, + helper = helperText, + inputField = { + TrackerInputProvider( + modifier = Modifier, + inputStyle = InputStyle.ParameterInputStyle(), + inputModel = inputModel, + onNextClicked = onNextClicked, + onUiEvent = onUiEvent, + ) + }, + status = status, + onExpand = { + onUiEvent(TrackerInputUiEvent.OnItemClick(inputModel.uid)) + when (inputModel.valueType) { + TrackerInputType.QR_CODE, + TrackerInputType.BAR_CODE, + -> + onUiEvent(TrackerInputUiEvent.OnScanButtonClicked(inputModel.uid)) + + else -> { + // no-op + } + } + }, + ) +} + +@Composable +private fun ProvideParameterIcon(valueType: TrackerInputType?) = + when (valueType) { + TrackerInputType.QR_CODE -> + Icon( + imageVector = Icons.Outlined.QrCode2, + contentDescription = "QR Code Icon", + tint = SurfaceColor.Primary, + ) + + TrackerInputType.BAR_CODE -> + Icon( + painter = provideDHIS2Icon("material_barcode_scanner"), + contentDescription = "Barcode Icon", + tint = SurfaceColor.Primary, + ) + + else -> + Icon( + imageVector = Icons.Outlined.AddCircleOutline, + contentDescription = "Add Icon", + tint = SurfaceColor.Primary, + ) + } diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/action/TrackerInputAction.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/action/TrackerInputAction.kt new file mode 100644 index 00000000000..1aea9c9c270 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/action/TrackerInputAction.kt @@ -0,0 +1,13 @@ +package org.dhis2.tracker.ui.input.action + +import org.dhis2.mobile.commons.model.CustomIntentModel + +typealias CustomIntentUid = String +typealias FieldUid = String + +sealed interface TrackerInputAction { + data class LaunchCustomIntent( + val fieldUid: FieldUid, + val customIntentModel: CustomIntentModel, + ) : TrackerInputAction +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/model/TrackerInputModel.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/model/TrackerInputModel.kt new file mode 100644 index 00000000000..b27887922d6 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/model/TrackerInputModel.kt @@ -0,0 +1,56 @@ +package org.dhis2.tracker.ui.input.model + +import org.hisp.dhis.mobile.ui.designsystem.component.InputShellState +import org.hisp.dhis.mobile.ui.designsystem.component.LegendData +import org.hisp.dhis.mobile.ui.designsystem.component.Orientation +import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextData +import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextState + +data class TrackerInputModel( + val uid: String, + val label: String, + val value: String?, + val focused: Boolean, + val valueType: TrackerInputType, + val optionSet: String?, + val error: String?, + val warning: String?, + val description: String?, + val mandatory: Boolean, + val editable: Boolean, + val legend: LegendData?, + val orientation: Orientation, + val optionSetConfiguration: TrackerOptionSetConfiguration? = null, + val customIntentUid: String? = null, + val displayName: String?, +) + +fun TrackerInputModel.supportingText(): List? = + listOfNotNull( + error?.let { + SupportingTextData( + it, + SupportingTextState.ERROR, + ) + }, + warning?.let { + SupportingTextData( + it, + SupportingTextState.WARNING, + ) + }, + description?.let { + SupportingTextData( + it, + SupportingTextState.DEFAULT, + ) + }, + ).ifEmpty { null } + +fun TrackerInputModel.inputState(): InputShellState = + when { + !editable -> InputShellState.DISABLED + error != null -> InputShellState.ERROR + focused -> InputShellState.FOCUSED + else -> InputShellState.UNFOCUSED + } diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/model/TrackerInputType.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/model/TrackerInputType.kt new file mode 100644 index 00000000000..f93a0af77f6 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/model/TrackerInputType.kt @@ -0,0 +1,35 @@ +package org.dhis2.tracker.ui.input.model + +enum class TrackerInputType { + TEXT, + LONG_TEXT, + LETTER, + PHONE_NUMBER, + EMAIL, + URL, + NUMBER, + INTEGER, + INTEGER_POSITIVE, + INTEGER_NEGATIVE, + INTEGER_ZERO_OR_POSITIVE, + PERCENTAGE, + UNIT_INTERVAL, + AGE, + ORGANISATION_UNIT, + MULTI_SELECTION, + QR_CODE, + BAR_CODE, + CHECKBOX, + RADIO_BUTTON, + YES_ONLY_SWITCH, + YES_ONLY_CHECKBOX, + DATE_TIME, + DATE, + TIME, + PERIOD_SELECTOR, + MATRIX, + SEQUENTIAL, + DROPDOWN, + NOT_SUPPORTED, + CUSTOM_INTENT, +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/model/TrackerInputUiEvent.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/model/TrackerInputUiEvent.kt new file mode 100644 index 00000000000..73beffde51f --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/model/TrackerInputUiEvent.kt @@ -0,0 +1,27 @@ +package org.dhis2.tracker.ui.input.model + +sealed interface TrackerInputUiEvent { + data class OnScanButtonClicked( + val uid: String, + ) : TrackerInputUiEvent + + data class OnOrgUnitButtonClicked( + val uid: String, + val label: String, + val value: String?, + ) : TrackerInputUiEvent + + data class OnLaunchCustomIntent( + val uid: String, + val customIntentUid: String, + ) : TrackerInputUiEvent + + data class OnItemClick( + val uid: String, + ) : TrackerInputUiEvent + + data class OnValueChange( + val uid: String, + val value: String?, + ) : TrackerInputUiEvent +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/model/TrackerOptionSetConfiguration.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/model/TrackerOptionSetConfiguration.kt new file mode 100644 index 00000000000..9e47a4864b6 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/model/TrackerOptionSetConfiguration.kt @@ -0,0 +1,16 @@ +package org.dhis2.tracker.ui.input.model + +/** + * Configuration for option set fields in tracker inputs. + * Provides options and callbacks for dropdown/selection components. + */ +data class TrackerOptionSetConfiguration( + val options: List, + val onSearch: ((String) -> Unit)? = null, + val onLoadOptions: (() -> Unit)? = null, +) + +data class TrackerOptionItem( + val code: String, + val displayName: String, +) diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerAgeInputProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerAgeInputProvider.kt new file mode 100644 index 00000000000..a4d43c9bec6 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerAgeInputProvider.kt @@ -0,0 +1,138 @@ +package org.dhis2.tracker.ui.input.provider + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.TextRange +import androidx.compose.ui.text.input.TextFieldValue +import org.dhis2.mobile.commons.dates.calculateAgeFromDate +import org.dhis2.mobile.commons.dates.calculateDateFromAge +import org.dhis2.mobile.commons.resources.Res +import org.dhis2.mobile.commons.resources.age +import org.dhis2.mobile.commons.resources.age_or +import org.dhis2.mobile.commons.resources.cancel +import org.dhis2.mobile.commons.resources.date_of_birth +import org.dhis2.mobile.commons.resources.ok +import org.dhis2.tracker.ui.input.model.TrackerInputModel +import org.dhis2.tracker.ui.input.model.inputState +import org.dhis2.tracker.ui.input.model.supportingText +import org.hisp.dhis.mobile.ui.designsystem.component.AgeInputType +import org.hisp.dhis.mobile.ui.designsystem.component.InputAge +import org.hisp.dhis.mobile.ui.designsystem.component.InputStyle +import org.hisp.dhis.mobile.ui.designsystem.component.state.InputAgeData +import org.hisp.dhis.mobile.ui.designsystem.component.state.rememberInputAgeState +import org.jetbrains.compose.resources.stringResource + +@Composable +fun ProvideTrackerAgeInput( + model: TrackerInputModel, + inputStyle: InputStyle, + onNextClicked: () -> Unit, + modifier: Modifier, + onValueChange: (String?) -> Unit, +) { + var inputType by remember { + mutableStateOf( + if (!model.value.isNullOrEmpty()) { + model.value.let { + AgeInputType.DateOfBirth(TextFieldValue(it, TextRange(it.length))) + } + } else { + AgeInputType.None + }, + ) + } + + DisposableEffect(model.value) { + when (inputType) { + is AgeInputType.Age -> + if (!model.value.isNullOrEmpty()) { + calculateAgeFromDate( + model.value, + (inputType as AgeInputType.Age).unit.name, + )?.let { + (inputType as AgeInputType.Age).copy( + value = + TextFieldValue( + it, + TextRange(it.length), + ), + ) + } ?: AgeInputType.None + } + + is AgeInputType.DateOfBirth -> + if (!model.value.isNullOrEmpty()) { + model.value.let { + (inputType as AgeInputType.DateOfBirth).copy( + value = + TextFieldValue( + it, + TextRange(it.length), + ), + ) + } + } + + AgeInputType.None -> { + // no-op + } + } + + onDispose { } + } + + InputAge( + state = + rememberInputAgeState( + inputAgeData = + InputAgeData( + title = model.label, + inputStyle = inputStyle, + isRequired = model.mandatory, + dateOfBirthLabel = stringResource(Res.string.date_of_birth), + orLabel = stringResource(Res.string.age_or), + ageLabel = stringResource(Res.string.age), + cancelText = stringResource(Res.string.cancel), + acceptText = stringResource(Res.string.ok), + ), + inputType = inputType, + inputState = model.inputState(), + legendData = model.legend, + supportingText = model.supportingText(), + ), + onValueChanged = { ageInputType -> + if (ageInputType != null) { + inputType = ageInputType + } + + when (val type = inputType) { + is AgeInputType.Age -> { + calculateDateFromAge(type.value.text, type.unit.name)?.let { calculatedDate -> + onValueChange(calculatedDate) + } + } + + is AgeInputType.DateOfBirth -> { + type.value.text + .takeIf { it != model.value } + ?.let { + onValueChange(it) + } + } + + AgeInputType.None -> { + onValueChange(null) + } + } + }, + onImeActionClick = { _ -> + onNextClicked() + }, + modifier = modifier, + ) +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerCheckboxInputProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerCheckboxInputProvider.kt new file mode 100644 index 00000000000..ea648570e1b --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerCheckboxInputProvider.kt @@ -0,0 +1,56 @@ +package org.dhis2.tracker.ui.input.provider + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import org.dhis2.tracker.ui.input.model.TrackerInputModel +import org.dhis2.tracker.ui.input.model.inputState +import org.dhis2.tracker.ui.input.model.supportingText +import org.hisp.dhis.mobile.ui.designsystem.component.CheckBoxData +import org.hisp.dhis.mobile.ui.designsystem.component.InputCheckBox +import org.hisp.dhis.mobile.ui.designsystem.component.InputStyle + +@Composable +fun TrackerCheckboxInputProvider( + model: TrackerInputModel, + inputStyle: InputStyle, + modifier: Modifier, + onValueChange: (String?) -> Unit, +) { + val dataMap = + buildMap { + model.optionSetConfiguration?.options.let { optionDataList -> + optionDataList?.forEach { optionData -> + put( + optionData.code, + CheckBoxData( + uid = optionData.code, + checked = model.value == optionData.code, + enabled = model.editable, + textInput = optionData.displayName, + ), + ) + } + } + } + + val (codeList, data) = dataMap.toList().unzip() + + InputCheckBox( + modifier = modifier, + inputStyle = inputStyle, + title = model.label, + checkBoxData = data, + orientation = model.orientation, + state = model.inputState(), + supportingText = model.supportingText(), + legendData = model.legend, + isRequired = model.mandatory, + onItemChange = { item -> + val selectedIndex = data.indexOf(item) + onValueChange(if (item.checked) null else codeList[selectedIndex]) + }, + onClearSelection = { + onValueChange(null) + }, + ) +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerDateTimeProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerDateTimeProvider.kt new file mode 100644 index 00000000000..51e7da8dba2 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerDateTimeProvider.kt @@ -0,0 +1,108 @@ +package org.dhis2.tracker.ui.input.provider + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.text.TextRange +import androidx.compose.ui.text.input.TextFieldValue +import org.dhis2.tracker.ui.input.model.TrackerInputModel +import org.dhis2.tracker.ui.input.model.TrackerInputType +import org.dhis2.tracker.ui.input.model.inputState +import org.dhis2.tracker.ui.input.model.supportingText +import org.hisp.dhis.mobile.ui.designsystem.component.DateTimeActionType +import org.hisp.dhis.mobile.ui.designsystem.component.InputDateTime +import org.hisp.dhis.mobile.ui.designsystem.component.InputStyle +import org.hisp.dhis.mobile.ui.designsystem.component.SelectableDates +import org.hisp.dhis.mobile.ui.designsystem.component.model.DateTimeTransformation +import org.hisp.dhis.mobile.ui.designsystem.component.model.DateTransformation +import org.hisp.dhis.mobile.ui.designsystem.component.model.TimeTransformation +import org.hisp.dhis.mobile.ui.designsystem.component.state.InputDateTimeData +import org.hisp.dhis.mobile.ui.designsystem.component.state.rememberInputDateTimeState + +@Composable +fun ProvideTrackerDateTimeInput( + model: TrackerInputModel, + inputStyle: InputStyle, + onNextClicked: () -> Unit, + modifier: Modifier, + onValueChange: (String?) -> Unit, +) { + val (actionType, visualTransformation) = + when (model.valueType) { + TrackerInputType.DATE_TIME -> DateTimeActionType.DATE_TIME to DateTimeTransformation() + TrackerInputType.TIME -> DateTimeActionType.TIME to TimeTransformation() + else -> DateTimeActionType.DATE to DateTransformation() + } + val textSelection = + TextRange( + model.value?.length ?: 0, + ) + + val yearIntRange = getYearRange() + val selectableDates = + SelectableDates( + initialDate = DEFAULT_MIN_DATE, + endDate = DEFAULT_MAX_DATE, + ) + + var value by remember(model.value) { + mutableStateOf( + model.value?.let { value -> + TextFieldValue( + value, + textSelection, + ) + } ?: TextFieldValue(), + ) + } + + val inputState = + rememberInputDateTimeState( + InputDateTimeData( + title = model.label, + actionType = actionType, + visualTransformation = visualTransformation, + isRequired = model.mandatory, + selectableDates = selectableDates, + yearRange = yearIntRange, + inputStyle = inputStyle, + ), + inputTextFieldValue = value, + inputState = model.inputState(), + legendData = model.legend, + supportingText = model.supportingText(), + ) + + InputDateTime( + state = inputState, + modifier = + modifier.semantics { + contentDescription = value.text + }, + onValueChanged = { + value = it ?: TextFieldValue() + onValueChange(value.text.ifEmpty { null }) + }, + onImeActionClick = { _ -> + onNextClicked() + }, + ) +} + +private fun getYearRange(): IntRange = + IntRange( + DEFAULT_MIN_DATE + .substring(4, 8) + .toInt(), + DEFAULT_MAX_DATE + .substring(4, 8) + .toInt(), + ) + +const val DEFAULT_MIN_DATE = "12111924" +const val DEFAULT_MAX_DATE = "12112124" diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerInputProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerInputProvider.kt new file mode 100644 index 00000000000..467a5b004b2 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerInputProvider.kt @@ -0,0 +1,825 @@ +package org.dhis2.tracker.ui.input.provider + +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.text.TextRange +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.TextFieldValue +import org.dhis2.mobile.tracker.resources.Res +import org.dhis2.mobile.tracker.resources.custom_intent_launch +import org.dhis2.tracker.ui.input.model.TrackerInputModel +import org.dhis2.tracker.ui.input.model.TrackerInputType +import org.dhis2.tracker.ui.input.model.TrackerInputUiEvent +import org.dhis2.tracker.ui.input.model.inputState +import org.dhis2.tracker.ui.input.model.supportingText +import org.hisp.dhis.mobile.ui.designsystem.component.CheckBoxData +import org.hisp.dhis.mobile.ui.designsystem.component.CustomIntentState +import org.hisp.dhis.mobile.ui.designsystem.component.DropdownItem +import org.hisp.dhis.mobile.ui.designsystem.component.InputBarCode +import org.hisp.dhis.mobile.ui.designsystem.component.InputCustomIntent +import org.hisp.dhis.mobile.ui.designsystem.component.InputDropDown +import org.hisp.dhis.mobile.ui.designsystem.component.InputEmail +import org.hisp.dhis.mobile.ui.designsystem.component.InputInteger +import org.hisp.dhis.mobile.ui.designsystem.component.InputLetter +import org.hisp.dhis.mobile.ui.designsystem.component.InputLink +import org.hisp.dhis.mobile.ui.designsystem.component.InputLongText +import org.hisp.dhis.mobile.ui.designsystem.component.InputMultiSelection +import org.hisp.dhis.mobile.ui.designsystem.component.InputNegativeInteger +import org.hisp.dhis.mobile.ui.designsystem.component.InputNotSupported +import org.hisp.dhis.mobile.ui.designsystem.component.InputNumber +import org.hisp.dhis.mobile.ui.designsystem.component.InputOrgUnit +import org.hisp.dhis.mobile.ui.designsystem.component.InputPercentage +import org.hisp.dhis.mobile.ui.designsystem.component.InputPhoneNumber +import org.hisp.dhis.mobile.ui.designsystem.component.InputPositiveInteger +import org.hisp.dhis.mobile.ui.designsystem.component.InputPositiveIntegerOrZero +import org.hisp.dhis.mobile.ui.designsystem.component.InputQRCode +import org.hisp.dhis.mobile.ui.designsystem.component.InputStyle +import org.hisp.dhis.mobile.ui.designsystem.component.InputText +import org.hisp.dhis.mobile.ui.designsystem.component.InputUnitInterval +import org.hisp.dhis.mobile.ui.designsystem.component.InputYesOnlyCheckBox +import org.hisp.dhis.mobile.ui.designsystem.component.InputYesOnlySwitch +import org.jetbrains.compose.resources.stringResource + +@Composable +fun TrackerInputProvider( + modifier: Modifier = Modifier, + inputModel: TrackerInputModel, + inputStyle: InputStyle, + onNextClicked: () -> Unit, + onUiEvent: (TrackerInputUiEvent) -> Unit, +) { + var textValue by remember(inputModel.uid, inputModel.value) { + mutableStateOf( + TextFieldValue( + text = inputModel.value ?: "", + selection = TextRange(inputModel.value?.length ?: 0), + ), + ) + } + + val focusRequester = remember { FocusRequester() } + val modifierWithFocus = modifier.focusRequester(focusRequester) + + LaunchedEffect(inputModel.focused) { + if (inputModel.focused) { + focusRequester.requestFocus() + } + } + + val onImeActionClick: (ImeAction) -> Unit = { imeAction -> + if (imeAction == ImeAction.Next) { + onNextClicked() + } + } + + when (inputModel.valueType) { + TrackerInputType.TEXT -> { + InputText( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onValueChanged = { newValue -> + newValue?.let { + if (it.text != inputModel.value) { + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = it.text.takeIf { text -> text.isNotEmpty() }, + ), + ) + } + } + }, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + ) + } + + TrackerInputType.LONG_TEXT -> { + InputLongText( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onValueChanged = { newValue -> + newValue?.let { + if (it.text != inputModel.value) { + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = it.text.takeIf { text -> text.isNotEmpty() }, + ), + ) + } + } + }, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + ) + } + + TrackerInputType.LETTER -> { + InputLetter( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onValueChanged = { newValue -> + newValue?.let { + if (it.text != inputModel.value) { + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = it.text.takeIf { text -> text.isNotEmpty() }, + ), + ) + } + } + }, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + ) + } + + TrackerInputType.EMAIL -> { + InputEmail( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onEmailActionCLicked = {}, + onValueChanged = { newValue -> + newValue?.let { + if (it.text != inputModel.value) { + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = it.text.takeIf { text -> text.isNotEmpty() }, + ), + ) + } + } + }, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + ) + } + + TrackerInputType.PHONE_NUMBER -> { + InputPhoneNumber( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onCallActionClicked = {}, + onValueChanged = { newValue -> + newValue?.let { + if (it.text != inputModel.value) { + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = it.text.takeIf { text -> text.isNotEmpty() }, + ), + ) + } + } + }, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + ) + } + + TrackerInputType.URL -> { + InputLink( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onLinkActionCLicked = {}, + onValueChanged = { newValue -> + newValue?.let { + if (it.text != inputModel.value) { + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = it.text.takeIf { text -> text.isNotEmpty() }, + ), + ) + } + } + }, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + ) + } + + TrackerInputType.NUMBER -> { + InputNumber( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onValueChanged = { newValue -> + newValue?.let { + if (it.text != inputModel.value) { + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = it.text.takeIf { text -> text.isNotEmpty() }, + ), + ) + } + } + }, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + ) + } + + TrackerInputType.INTEGER -> { + InputInteger( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onValueChanged = { newValue -> + newValue?.let { + if (it.text != inputModel.value) { + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = it.text.takeIf { text -> text.isNotEmpty() }, + ), + ) + } + } + }, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + ) + } + + TrackerInputType.INTEGER_POSITIVE -> { + InputPositiveInteger( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onValueChanged = { newValue -> + newValue?.let { + if (it.text != inputModel.value) { + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = it.text.takeIf { text -> text.isNotEmpty() }, + ), + ) + } + } + }, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + ) + } + + TrackerInputType.INTEGER_NEGATIVE -> { + InputNegativeInteger( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onValueChanged = { newValue -> + newValue?.let { + if (it.text != inputModel.value) { + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = it.text.takeIf { text -> text.isNotEmpty() }, + ), + ) + } + } + }, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + ) + } + + TrackerInputType.INTEGER_ZERO_OR_POSITIVE -> { + InputPositiveIntegerOrZero( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onValueChanged = { newValue -> + newValue?.let { + if (it.text != inputModel.value) { + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = it.text.takeIf { text -> text.isNotEmpty() }, + ), + ) + } + } + }, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + ) + } + + TrackerInputType.PERCENTAGE -> { + InputPercentage( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onValueChanged = { newValue -> + newValue?.let { + if (it.text != inputModel.value) { + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = it.text.takeIf { text -> text.isNotEmpty() }, + ), + ) + } + } + }, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + ) + } + + TrackerInputType.UNIT_INTERVAL -> { + InputUnitInterval( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onValueChanged = { newValue -> + newValue?.let { + if (it.text != inputModel.value) { + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = it.text.takeIf { text -> text.isNotEmpty() }, + ), + ) + } + } + }, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + ) + } + + TrackerInputType.AGE -> { + ProvideTrackerAgeInput( + model = inputModel, + inputStyle = inputStyle, + onNextClicked = onNextClicked, + modifier = modifierWithFocus, + onValueChange = { newValue -> + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = newValue, + ), + ) + }, + ) + } + + TrackerInputType.DATE_TIME, TrackerInputType.DATE, TrackerInputType.TIME -> { + ProvideTrackerDateTimeInput( + model = inputModel, + inputStyle = inputStyle, + onNextClicked = onNextClicked, + modifier = modifierWithFocus, + onValueChange = { newValue -> + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = newValue, + ), + ) + }, + ) + } + + TrackerInputType.ORGANISATION_UNIT -> { + InputOrgUnit( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputText = inputModel.displayName, + onValueChanged = { newValue -> + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = newValue, + ), + ) + }, + onOrgUnitActionCLicked = { + onUiEvent( + TrackerInputUiEvent.OnOrgUnitButtonClicked( + uid = inputModel.uid, + label = inputModel.label, + value = inputModel.value, + ), + ) + }, + ) + } + + TrackerInputType.MULTI_SELECTION -> { + val options = + inputModel.optionSetConfiguration?.options?.map { optionItem -> + CheckBoxData( + uid = optionItem.code, + checked = + optionItem.code.let { code -> + inputModel.value + ?.takeIf { it.isNotEmpty() } + ?.split(",") + ?.contains(code) + } ?: false, + enabled = inputModel.editable, + textInput = optionItem.displayName, + ) + } ?: emptyList() + + InputMultiSelection( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + items = options, + state = inputModel.inputState(), + supportingTextData = inputModel.supportingText(), + legendData = inputModel.legend, + isRequired = inputModel.mandatory, + inputStyle = inputStyle, + onItemsSelected = { checkBoxData -> + val checkedValues = + checkBoxData + .filter { it.checked } + .joinToString(",") { it.uid } + .takeIf { it.isNotEmpty() } + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = checkedValues, + ), + ) + }, + onClearItemSelection = { + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = null, + ), + ) + }, + ) + } + + TrackerInputType.QR_CODE -> { + InputQRCode( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onQRButtonClicked = { + onUiEvent( + TrackerInputUiEvent.OnScanButtonClicked( + uid = inputModel.uid, + ), + ) + }, + onValueChanged = { newValue -> + newValue?.let { + if (it.text != inputModel.value) { + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = it.text.takeIf { text -> text.isNotEmpty() }, + ), + ) + } + } + }, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + ) + } + + TrackerInputType.BAR_CODE -> { + InputBarCode( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onActionButtonClicked = { + onUiEvent( + TrackerInputUiEvent.OnScanButtonClicked( + uid = inputModel.uid, + ), + ) + }, + onValueChanged = { newValue -> + newValue?.let { + if (it.text != inputModel.value) { + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = it.text.takeIf { text -> text.isNotEmpty() }, + ), + ) + } + } + }, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + ) + } + + TrackerInputType.CHECKBOX -> { + TrackerCheckboxInputProvider( + model = inputModel, + inputStyle = inputStyle, + modifier = modifierWithFocus, + onValueChange = { newValue -> + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = newValue, + ), + ) + }, + ) + } + + TrackerInputType.RADIO_BUTTON -> { + TrackerRadioButtonInputProvider( + model = inputModel, + inputStyle = inputStyle, + modifier = modifierWithFocus, + onValueChange = { newValue -> + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = newValue, + ), + ) + }, + ) + } + + TrackerInputType.YES_ONLY_SWITCH -> { + InputYesOnlySwitch( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequired = inputModel.mandatory, + inputStyle = inputStyle, + isChecked = inputModel.value?.toBooleanStrictOrNull() == true, + onClick = { isChecked -> + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = if (isChecked) "true" else null, + ), + ) + }, + ) + } + + TrackerInputType.YES_ONLY_CHECKBOX -> { + InputYesOnlyCheckBox( + modifier = modifierWithFocus.fillMaxWidth(), + checkBoxData = + CheckBoxData( + uid = inputModel.uid, + checked = inputModel.value?.toBooleanStrictOrNull() == true, + enabled = inputModel.editable, + textInput = inputModel.label, + ), + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequired = inputModel.mandatory, + inputStyle = inputStyle, + onClick = { isChecked -> + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = if (isChecked) "true" else null, + ), + ) + }, + ) + } + + TrackerInputType.DROPDOWN -> { + val optionSetConfiguration = inputModel.optionSetConfiguration!! + + var selectedItem by remember(inputModel.uid, inputModel.value) { + val displayName = + optionSetConfiguration.options + .find { + it.code == inputModel.value + }?.displayName + mutableStateOf(displayName ?: inputModel.value ?: "") + } + + val options = optionSetConfiguration.options + val useDropdown by remember { + derivedStateOf { options.size < 15 } + } + + InputDropDown( + modifier = modifierWithFocus.fillMaxWidth(), + inputStyle = inputStyle, + title = inputModel.label, + state = inputModel.inputState(), + selectedItem = DropdownItem(selectedItem), + supportingTextData = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + onResetButtonClicked = { + selectedItem = "" + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = null, + ), + ) + }, + fetchItem = { index -> + DropdownItem(options.getOrNull(index)?.displayName ?: "") + }, + onSearchOption = { query -> + optionSetConfiguration.onSearch?.invoke(query) + }, + itemCount = options.size, + useDropDown = useDropdown, + onItemSelected = { index, newSelectedItem -> + selectedItem = newSelectedItem.label + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = options.getOrNull(index)?.code, + ), + ) + }, + loadOptions = { + optionSetConfiguration.onLoadOptions?.invoke() + }, + onDismiss = { + optionSetConfiguration.onSearch?.invoke("") + }, + ) + } + + TrackerInputType.CUSTOM_INTENT -> { + val values by remember(inputModel) { + derivedStateOf { + inputModel.value + ?.takeIf { it.isNotEmpty() } + ?.split(",") + ?.toMutableList() ?: mutableListOf() + } + } + + var customIntentState by remember(inputModel, inputModel.value) { + mutableStateOf( + if (inputModel.value.isNullOrEmpty()) { + CustomIntentState.LAUNCH + } else { + CustomIntentState.LOADED + }, + ) + } + + InputCustomIntent( + title = inputModel.label, + buttonText = stringResource(Res.string.custom_intent_launch), + supportingText = inputModel.supportingText(), + inputShellState = inputModel.inputState(), + inputStyle = inputStyle, + modifier = modifier, + isRequired = inputModel.mandatory, + onLaunch = { + customIntentState = CustomIntentState.LOADING + inputModel.customIntentUid?.let { customIntentUid -> + onUiEvent( + TrackerInputUiEvent.OnLaunchCustomIntent( + inputModel.uid, + customIntentUid, + ), + ) + } + }, + onClear = { + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = null, + ), + ) + }, + customIntentState = customIntentState, + values = values.toList(), + ) + } + + TrackerInputType.PERIOD_SELECTOR, + TrackerInputType.MATRIX, + TrackerInputType.SEQUENTIAL, + TrackerInputType.NOT_SUPPORTED, + -> { + InputNotSupported( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + inputStyle = inputStyle, + ) + } + } +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerRadioButtonInputProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerRadioButtonInputProvider.kt new file mode 100644 index 00000000000..7cfcc3fc004 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerRadioButtonInputProvider.kt @@ -0,0 +1,58 @@ +package org.dhis2.tracker.ui.input.provider + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import org.dhis2.tracker.ui.input.model.TrackerInputModel +import org.dhis2.tracker.ui.input.model.inputState +import org.dhis2.tracker.ui.input.model.supportingText +import org.hisp.dhis.mobile.ui.designsystem.component.InputRadioButton +import org.hisp.dhis.mobile.ui.designsystem.component.InputStyle +import org.hisp.dhis.mobile.ui.designsystem.component.RadioButtonData + +@Composable +fun TrackerRadioButtonInputProvider( + model: TrackerInputModel, + inputStyle: InputStyle, + modifier: Modifier, + onValueChange: (String?) -> Unit, +) { + val dataMap = + buildMap { + model.optionSetConfiguration?.options.let { optionDataList -> + optionDataList?.forEach { optionData -> + put( + optionData.code, + RadioButtonData( + uid = optionData.code, + selected = model.value == optionData.code, + enabled = true, + textInput = optionData.displayName, + ), + ) + } + } + } + + val (codeList, data) = dataMap.toList().unzip() + + InputRadioButton( + modifier = modifier, + inputStyle = inputStyle, + title = model.label, + radioButtonData = data, + orientation = model.orientation, + state = model.inputState(), + supportingText = model.supportingText(), + legendData = model.legend, + isRequired = model.mandatory, + itemSelected = data.find { it.selected }, + onItemChange = { item -> + if (item != null) { + val selectedIndex = data.indexOf(item) + onValueChange(codeList[selectedIndex]) + } else { + onValueChange(null) + } + }, + ) +} From d3767fead261d73fda686cb5448f6baef8627b64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Fri, 30 Jan 2026 11:19:24 +0100 Subject: [PATCH 029/260] ANDROAPP-7478-dependabot-specific-rules (#4619) * feat: Group dhis2-android-core dependabot updates * deps: create a specific group for rule engine ad expression parser --- .github/dependabot.yml | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index b75843dd40d..a1c12cd0f33 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -19,14 +19,36 @@ 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 update-types: - "patch" # Only include patch updates (no major or minor versions) + # Rule engine and expression parser updates (all semver types) + - package-ecosystem: "gradle" + directory: "/" + schedule: + interval: "weekly" + target-branch: "develop" + open-pull-requests-limit: 5 + commit-message: + prefix: "deps" + allow: + - dependency-name: "org.hisp.dhis.rules:rule-engine-jvm" + - dependency-name: "org.hisp.dhis.lib.expression:expression-parser-jvm" + groups: + dhis2-rules: + patterns: + - "org.hisp.dhis.rules:rule-engine-jvm" + - "org.hisp.dhis.lib.expression:expression-parser-jvm" + # GitHub Actions updates (optional) - package-ecosystem: "github-actions" directory: "/" From d63432c614c049bc68dc6de51e3bb99dc09f172a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Fri, 30 Jan 2026 19:11:43 +0100 Subject: [PATCH 030/260] test: improve some tests (#4629) --- .../androidTest/java/org/dhis2/common/BaseRobot.kt | 13 ++++++++++++- .../org/dhis2/usescases/datasets/DataSetTest.kt | 4 ++++ .../dhis2/usescases/teidashboard/robot/NoteRobot.kt | 8 +++++++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/common/BaseRobot.kt b/app/src/androidTest/java/org/dhis2/common/BaseRobot.kt index bbc2ad5e85c..57f243124e9 100644 --- a/app/src/androidTest/java/org/dhis2/common/BaseRobot.kt +++ b/app/src/androidTest/java/org/dhis2/common/BaseRobot.kt @@ -10,10 +10,12 @@ import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.junit4.ComposeContentTestRule import androidx.compose.ui.test.onNodeWithText import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.FailureHandler import androidx.test.espresso.NoMatchingViewException import androidx.test.espresso.UiController import androidx.test.espresso.ViewAction import androidx.test.espresso.ViewInteraction +import androidx.test.espresso.base.DefaultFailureHandler import androidx.test.espresso.matcher.ViewMatchers.isRoot import androidx.test.espresso.util.TreeIterables import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation @@ -105,6 +107,13 @@ open class BaseRobot { val maxTries = waitMillis / waitMillisPerTry.toInt() var tries = 0 + val defaultFailureHandler = DefaultFailureHandler(getInstrumentation().targetContext) + val failureHandler = FailureHandler { error, matcher -> + if (error is NoMatchingViewException) { + throw error + } + defaultFailureHandler.handle(error, matcher) + } for (i in 0..maxTries) try { @@ -112,7 +121,9 @@ open class BaseRobot { tries++ // Search the root for the view - onView(isRoot()).perform(searchFor(viewMatcher)) + onView(isRoot()) + .withFailureHandler(failureHandler) + .perform(searchFor(viewMatcher)) // If we're here, we found our view. Now return it return onView(viewMatcher) diff --git a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt index 93cf6e2f09a..f06f4c0182a 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt @@ -346,6 +346,10 @@ class DataSetTest : BaseTest() { dataSetDetailRobot(composeTestRule){ clickOnDataSetAtPosition(0) } + composeTestRule.waitUntilExactlyOneExists( + hasTestTag("TABLE_SCROLLABLE_COLUMN"), + timeoutMillis = 15000 + ) tableIsVisible() dataSetTableRobot(composeTestRule) { checkItemWithTextIsDisplayed("Re-open form to edit") diff --git a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt index 53774a20689..6beae0c2fcd 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt @@ -4,12 +4,14 @@ import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.TypeTextAction import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.assertion.ViewAssertions.matches +import androidx.test.espresso.matcher.RootMatchers.isDialog import androidx.test.espresso.intent.Intents import androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent import androidx.test.espresso.matcher.ViewMatchers.Visibility import androidx.test.espresso.matcher.ViewMatchers.hasDescendant import androidx.test.espresso.matcher.ViewMatchers.isDisplayed import androidx.test.espresso.matcher.ViewMatchers.isEnabled +import androidx.test.espresso.matcher.ViewMatchers.isRoot import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText @@ -49,7 +51,11 @@ class NoteRobot : BaseRobot() { } fun clickYesOnAlertDialog() { - waitForView(withText(R.string.yes)) + onView(isRoot()) + .inRoot(isDialog()) + .perform(searchFor(withId(android.R.id.button1))) + onView(withId(android.R.id.button1)) + .inRoot(isDialog()) .check(matches(isDisplayed())) .perform(click()) } From 468e168d26094c901ec62787d05a853009a44b4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Fri, 30 Jan 2026 19:47:49 +0100 Subject: [PATCH 031/260] deps: update dependabot (#4630) --- .github/dependabot.yml | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index a1c12cd0f33..e72b95fcd40 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -31,24 +31,6 @@ updates: update-types: - "patch" # Only include patch updates (no major or minor versions) - # Rule engine and expression parser updates (all semver types) - - package-ecosystem: "gradle" - directory: "/" - schedule: - interval: "weekly" - target-branch: "develop" - open-pull-requests-limit: 5 - commit-message: - prefix: "deps" - allow: - - dependency-name: "org.hisp.dhis.rules:rule-engine-jvm" - - dependency-name: "org.hisp.dhis.lib.expression:expression-parser-jvm" - groups: - dhis2-rules: - patterns: - - "org.hisp.dhis.rules:rule-engine-jvm" - - "org.hisp.dhis.lib.expression:expression-parser-jvm" - # GitHub Actions updates (optional) - package-ecosystem: "github-actions" directory: "/" From b3216755556d668b85e1fdbd5177a501975ec3e1 Mon Sep 17 00:00:00 2001 From: Pablo Date: Sun, 1 Feb 2026 10:35:19 +0100 Subject: [PATCH 032/260] build: Move flavor dependant class to correct path (#4612) --- .../org/dhis2/usescases/main/domain/DownloadNewVersion.kt | 0 .../main/domain/DownloadNewVersion.kt | 6 ++++-- 2 files changed, 4 insertions(+), 2 deletions(-) rename app/src/{main => dhis2}/java/org/dhis2/usescases/main/domain/DownloadNewVersion.kt (100%) rename app/src/dhis2PlayServices/java/org/dhis2/{usecases => usescases}/main/domain/DownloadNewVersion.kt (75%) diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/DownloadNewVersion.kt b/app/src/dhis2/java/org/dhis2/usescases/main/domain/DownloadNewVersion.kt similarity index 100% rename from app/src/main/java/org/dhis2/usescases/main/domain/DownloadNewVersion.kt rename to app/src/dhis2/java/org/dhis2/usescases/main/domain/DownloadNewVersion.kt diff --git a/app/src/dhis2PlayServices/java/org/dhis2/usecases/main/domain/DownloadNewVersion.kt b/app/src/dhis2PlayServices/java/org/dhis2/usescases/main/domain/DownloadNewVersion.kt similarity index 75% rename from app/src/dhis2PlayServices/java/org/dhis2/usecases/main/domain/DownloadNewVersion.kt rename to app/src/dhis2PlayServices/java/org/dhis2/usescases/main/domain/DownloadNewVersion.kt index d2a07a80162..df2258b4d61 100644 --- a/app/src/dhis2PlayServices/java/org/dhis2/usecases/main/domain/DownloadNewVersion.kt +++ b/app/src/dhis2PlayServices/java/org/dhis2/usescases/main/domain/DownloadNewVersion.kt @@ -1,13 +1,15 @@ package org.dhis2.usescases.main.domain +import android.content.Context import org.dhis2.data.service.VersionRepository import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError import org.dhis2.usescases.main.domain.model.DownloadMethod class DownloadNewVersion( private val versionRepository: VersionRepository, -) : UseCase { - override suspend fun invoke(input: Unit): Result = +) : UseCase { + override suspend fun invoke(input: Context): Result = try { val url = versionRepository.getUrl() url?.let { From b65076393817a251c22035587af13a21906f63ac Mon Sep 17 00:00:00 2001 From: Ferdy Rodriguez Date: Sun, 1 Feb 2026 23:53:11 +0100 Subject: [PATCH 033/260] ci: [ANDROAPP-7303] Updates Apk name and uploads correct artifact (#4621) * Logs apk path's and use the path to upload the artifacts * Removes steps that are not needed * tries to get the correct branch name on pull requests --- .github/workflows/continuous-delivery.yml | 20 ++++++++------------ app/build.gradle.kts | 6 ++++++ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/.github/workflows/continuous-delivery.yml b/.github/workflows/continuous-delivery.yml index bb1777b6b94..7488214edaa 100644 --- a/.github/workflows/continuous-delivery.yml +++ b/.github/workflows/continuous-delivery.yml @@ -58,22 +58,18 @@ jobs: DEBUG_KEY_PASS: ${{ secrets.DEBUG_KEY_PASS }} DEBUG_KEYSTORE_PASSWORD: ${{ secrets.DEBUG_KEYSTORE_PASSWORD }} DEBUG_KEYSTORE_PATH: ${{ steps.decode_keystore.outputs.filePath }} - - - 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" - - - name: Get JIRA issue number - id: jira-issue-number + + - name: Locate built APK + id: apk-path run: | - BRANCH_NAME="${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" - JIRA_ISSUE=$(echo "$BRANCH_NAME" | grep -oE '[a-zA-Z]+-[0-9]+' | head -1 || echo "$BRANCH_NAME") - echo "issue=$JIRA_ISSUE" >> "$GITHUB_OUTPUT" + 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 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 }}-${{ steps.jira-issue-number.outputs.issue}}.apk + path: ${{ steps.apk-path.outputs.apk_path }} diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 449181cd068..cca34391705 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -41,7 +41,13 @@ android { val getBranchName by extra { fun(): String { + val envBranchName = System.getenv("GITHUB_HEAD_REF") + ?: System.getenv("GITHUB_REF_NAME") + return try { + if (!envBranchName.isNullOrBlank()) { + return envBranchName.replace(Regex("[/\\\\:*?\"<>|]"), "-") + } val process = ProcessBuilder("git", "rev-parse", "--abbrev-ref", "HEAD") .redirectOutput(ProcessBuilder.Redirect.PIPE) .redirectError(ProcessBuilder.Redirect.PIPE) From a1501ca8bdf5ab51150e838c36aec08038385717 Mon Sep 17 00:00:00 2001 From: Xavier Molloy Date: Mon, 2 Feb 2026 07:27:21 +0100 Subject: [PATCH 034/260] feat: [ANDROAPP-7472] I Clean up old search repository [skip size] I (#4622) * feat: [ANDROAPP-7472] Clean up old search repository * feat: [ANDROAPP-7472] Add Paging data and dependency verification * fix: [ANDROAPP-7472] fix compilation error * feat: [ANDROAPP-7472] fix unit test * feat: [ANDROAPP-7472] copilot review * fix: [ANDROAPP-7472] revert library update * fix: [ANDROAPP-7472] fix sonar code smells --- .../main/program/ProgramRepositoryImpl.kt | 2 +- .../searchTrackEntity/SearchRepository.java | 10 - .../SearchRepositoryImpl.java | 105 +-- .../searchTrackEntity/SearchTEModule.java | 1 - .../main/program/ProgramRepositoryImplTest.kt | 2 +- .../searchTrackEntity/SearchRepositoryTest.kt | 3 - .../commons/filters/data/FilterPresenter.kt | 6 +- gradle/verification-metadata.xml | 646 +++++++++++++++++- tracker/build.gradle.kts | 1 + 9 files changed, 648 insertions(+), 128 deletions(-) diff --git a/app/src/main/java/org/dhis2/usescases/main/program/ProgramRepositoryImpl.kt b/app/src/main/java/org/dhis2/usescases/main/program/ProgramRepositoryImpl.kt index 7f1d6ed5119..f6bcd648454 100644 --- a/app/src/main/java/org/dhis2/usescases/main/program/ProgramRepositoryImpl.kt +++ b/app/src/main/java/org/dhis2/usescases/main/program/ProgramRepositoryImpl.kt @@ -178,7 +178,7 @@ internal class ProgramRepositoryImpl( private fun getTrackerTeiCount(program: Program): Int { val teiIds = filterPresenter - .filteredTrackerProgram(program) + .filteredTrackerProgram(program.uid()) .offlineFirst() .blockingGetUids() val teiCount = teiIds.size diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepository.java b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepository.java index 0c199898d14..80965866353 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepository.java +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepository.java @@ -33,9 +33,6 @@ public interface SearchRepository { void clearFetchedList(); - @NonNull - Flowable> searchTeiForMap(SearchParametersModel searchParametersModel, boolean isOnline); - @NonNull Observable> saveToEnroll(@NonNull String teiType, @NonNull String orgUnitUID, @NonNull String programUid, @Nullable String teiUid, HashMap> queryData, @Nullable String fromRelationshipUid); @@ -47,8 +44,6 @@ public interface SearchRepository { TrackedEntityType getTrackedEntityType(); - List getEventsForMap(List teis); - Observable downloadTei(String teiUid); TeiDownloadResult download(String teiUid, @Nullable String enrollmentUid, String reason); @@ -85,9 +80,4 @@ public interface SearchRepository { boolean filtersApplyOnGlobalSearch(); - @NotNull HashSet getFetchedTeiUIDs(); - - SearchParametersModel getSavedSearchParameters(); - - FilterManager getSavedFilters(); } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImpl.java b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImpl.java index cd66d341233..f994e09b025 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImpl.java +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImpl.java @@ -8,14 +8,11 @@ import org.dhis2.bindings.ValueExtensionsKt; import org.dhis2.commons.Constants; import org.dhis2.commons.data.EntryMode; -import org.dhis2.commons.data.EventModel; -import org.dhis2.commons.data.EventViewModelType; import org.dhis2.commons.date.DateUtils; import org.dhis2.commons.filters.FilterManager; import org.dhis2.commons.filters.data.FilterPresenter; import org.dhis2.commons.filters.sorting.SortingItem; import org.dhis2.commons.network.NetworkUtils; -import org.dhis2.commons.resources.DhisPeriodUtils; import org.dhis2.commons.resources.MetadataIconProvider; import org.dhis2.commons.resources.ResourceManager; import org.dhis2.data.dhislogic.DhisEnrollmentUtils; @@ -86,7 +83,6 @@ import java.util.Map; import dhis2.org.analytics.charts.Charts; -import io.reactivex.Flowable; import io.reactivex.Observable; import io.reactivex.Single; import kotlin.Pair; @@ -99,10 +95,7 @@ public class SearchRepositoryImpl implements SearchRepository { private final D2 d2; private final SearchSortingValueSetter sortingValueSetter; private TrackedEntitySearchCollectionRepository trackedEntityInstanceQuery; - public SearchParametersModel savedSearchParameters; - private FilterManager savedFilters; private FilterPresenter filterPresenter; - private DhisPeriodUtils periodUtils; private String currentProgram; private final Charts charts; private final CrashReportController crashReportController; @@ -132,7 +125,6 @@ public class SearchRepositoryImpl implements SearchRepository { FilterPresenter filterPresenter, ResourceManager resources, SearchSortingValueSetter sortingValueSetter, - DhisPeriodUtils periodUtils, Charts charts, CrashReportController crashReportController, NetworkUtils networkUtils, @@ -148,7 +140,6 @@ public class SearchRepositoryImpl implements SearchRepository { this.resources = resources; this.sortingValueSetter = sortingValueSetter; this.filterPresenter = filterPresenter; - this.periodUtils = periodUtils; this.charts = charts; this.crashReportController = crashReportController; this.dateUtils = dateUtils; @@ -184,36 +175,15 @@ public void clearFetchedList() { fetchedTeiUids.clear(); } - @NonNull - @Override - public Flowable> searchTeiForMap(SearchParametersModel searchParametersModel, boolean isOnline) { - - boolean allowCache = false; - if (!searchParametersModel.equals(savedSearchParameters) || !FilterManager.getInstance().equals(savedFilters)) { - trackedEntityInstanceQuery = getFilteredRepository(searchParametersModel); - } else { - allowCache = true; - } - - if (isOnline && FilterManager.getInstance().getStateFilters().isEmpty()) - return trackedEntityInstanceQuery.allowOnlineCache().eq(allowCache).offlineFirst().get().toFlowable() - .flatMapIterable(list -> list) - .map(tei -> transform(tei, searchParametersModel.getSelectedProgram(), false, FilterManager.getInstance().getSortingItem())) - .toList().toFlowable(); - else - return trackedEntityInstanceQuery.allowOnlineCache().eq(allowCache).offlineOnly().get().toFlowable() - .flatMapIterable(list -> list) - .map(tei -> transform(tei, searchParametersModel.getSelectedProgram(), true, FilterManager.getInstance().getSortingItem())) - .toList().toFlowable(); - } @Override public TrackedEntitySearchCollectionRepository getFilteredRepository(SearchParametersModel searchParametersModel) { - this.savedSearchParameters = searchParametersModel.copy(); - this.savedFilters = FilterManager.getInstance().copy(); + String programUid = searchParametersModel.getSelectedProgram() != null + ? searchParametersModel.getSelectedProgram().uid() + : null; trackedEntityInstanceQuery = filterPresenter.filteredTrackedEntityInstances( - searchParametersModel.getSelectedProgram(), teiType + programUid, teiType ); for (int i = 0; i < searchParametersModel.getQueryData().keySet().size(); i++) { @@ -666,20 +636,6 @@ public boolean filtersApplyOnGlobalSearch() { !FilterManager.getInstance().getStateFilters().isEmpty(); } - @Override - public @NotNull HashSet getFetchedTeiUIDs() { - return fetchedTeiUids; - } - - @Override - public SearchParametersModel getSavedSearchParameters() { - return savedSearchParameters; - } - - @Override - public FilterManager getSavedFilters() { - return savedFilters; - } @Override public Observable getTrackedEntityType(String trackedEntityUid) { @@ -691,59 +647,6 @@ public TrackedEntityType getTrackedEntityType() { return d2.trackedEntityModule().trackedEntityTypes().uid(teiType).blockingGet(); } - @Override - public List getEventsForMap(List teis) { - List eventModels = new ArrayList<>(); - List teiUidList = new ArrayList<>(); - for (SearchTeiModel tei : teis) { - teiUidList.add(tei.getTei().uid()); - } - - List events = d2.eventModule().events() - .byTrackedEntityInstanceUids(teiUidList) - .byDeleted().isFalse() - .blockingGet(); - - HashMap cacheStages = new HashMap<>(); - - for (Event event : events) { - if (!cacheStages.containsKey(event.programStage())) { - ProgramStage stage = d2.programModule().programStages() - .uid(event.programStage()) - .blockingGet(); - cacheStages.put(event.programStage(), stage); - } - - eventModels.add( - new EventModel( - EventViewModelType.EVENT, - cacheStages.get(event.programStage()), - event, - 0, - null, - true, - true, - orgUnitName(event.organisationUnit()), - true, - null, - null, - false, - false, - false, - false, - false, - 0, - periodUtils.getPeriodUIString(cacheStages.get(event.programStage()).periodType(), event.eventDate() != null ? event.eventDate() : event.dueDate(), Locale.getDefault()), - null, - metadataIconProvider.invoke(cacheStages.get(event.programStage()).style()), - true, - true - )); - } - - return eventModels; - } - private String orgUnitName(String orgUnitUid) { if (!orgUnitNameCache.containsKey(orgUnitUid)) { OrganisationUnit organisationUnit = d2.organisationUnitModule() diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java index 2bebf70266c..4419e730727 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java @@ -166,7 +166,6 @@ SearchRepository searchRepository(@NonNull D2 d2, filterPresenter, resources, searchSortingValueSetter, - periodUtils, charts, crashReportController, networkUtils, diff --git a/app/src/test/java/org/dhis2/usescases/main/program/ProgramRepositoryImplTest.kt b/app/src/test/java/org/dhis2/usescases/main/program/ProgramRepositoryImplTest.kt index ff8c3653a59..8b86f26d761 100644 --- a/app/src/test/java/org/dhis2/usescases/main/program/ProgramRepositoryImplTest.kt +++ b/app/src/test/java/org/dhis2/usescases/main/program/ProgramRepositoryImplTest.kt @@ -242,7 +242,7 @@ class ProgramRepositoryImplTest { filterPresenter.filteredTrackerProgram(any()).offlineFirst(), ) doReturn mock() whenever( - filterPresenter.filteredTrackerProgram(any()).offlineFirst().blockingGetUids(), + filterPresenter.filteredTrackerProgram(any()).offlineFirst().blockingGetUids(), ) doReturn listOf("0", "1") } diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryTest.kt index b2437a4242b..bf93de0c0ae 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryTest.kt @@ -7,7 +7,6 @@ import org.dhis2.commons.filters.Filters import org.dhis2.commons.filters.data.FilterPresenter import org.dhis2.commons.filters.sorting.SortingItem import org.dhis2.commons.network.NetworkUtils -import org.dhis2.commons.resources.DhisPeriodUtils import org.dhis2.commons.resources.MetadataIconProvider import org.dhis2.commons.resources.ResourceManager import org.dhis2.commons.viewmodel.DispatcherProvider @@ -91,7 +90,6 @@ class SearchRepositoryTest { private val filterPresenter: FilterPresenter = mock() private val resourceManager: ResourceManager = mock() private val sortingValueSetter: SearchSortingValueSetter = mock() - private val dhisPeriodUtils: DhisPeriodUtils = mock() private val charts: Charts = mock() private val crashReporterController: CrashReportController = mock() private val networkUtils: NetworkUtils = mock() @@ -137,7 +135,6 @@ class SearchRepositoryTest { filterPresenter, resourceManager, sortingValueSetter, - dhisPeriodUtils, charts, crashReporterController, networkUtils, diff --git a/commons/src/main/java/org/dhis2/commons/filters/data/FilterPresenter.kt b/commons/src/main/java/org/dhis2/commons/filters/data/FilterPresenter.kt index b9e2fd347e5..a857bc0013f 100644 --- a/commons/src/main/java/org/dhis2/commons/filters/data/FilterPresenter.kt +++ b/commons/src/main/java/org/dhis2/commons/filters/data/FilterPresenter.kt @@ -34,15 +34,15 @@ class FilterPresenter fun filteredEventProgram(program: Program): EventQueryCollectionRepository = eventProgramFilterSearchHelper.getFilteredEventRepository(program) - fun filteredTrackerProgram(program: Program): TrackedEntitySearchCollectionRepository = - trackerFilterSearchHelper.getFilteredProgramRepository(program.uid()) + fun filteredTrackerProgram(program: String): TrackedEntitySearchCollectionRepository = + trackerFilterSearchHelper.getFilteredProgramRepository(program) fun filteredTrackedEntityTypes(trackedEntityTypeUid: String): TrackedEntitySearchCollectionRepository = trackerFilterSearchHelper .getFilteredTrackedEntityTypeRepository(trackedEntityTypeUid) fun filteredTrackedEntityInstances( - program: Program?, + program: String?, trackedEntityTypeUid: String, ): TrackedEntitySearchCollectionRepository = program?.let { filteredTrackerProgram(program) } diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index b4a5eccf956..3e51a169baf 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -9,6 +9,7 @@ + @@ -541,6 +542,19 @@ + + + + + + + + + + + + + @@ -582,6 +596,22 @@ + + + + + + + + + + + + + + + + @@ -619,6 +649,19 @@ + + + + + + + + + + + + + @@ -655,6 +698,22 @@ + + + + + + + + + + + + + + + + @@ -697,10 +756,18 @@ + + + + + + + + @@ -753,6 +820,22 @@ + + + + + + + + + + + + + + + + @@ -795,6 +878,19 @@ + + + + + + + + + + + + + @@ -836,6 +932,22 @@ + + + + + + + + + + + + + + + + @@ -1090,6 +1202,11 @@ + + + + + @@ -1135,6 +1252,14 @@ + + + + + + + + @@ -1159,6 +1284,11 @@ + + + + + @@ -1191,6 +1321,14 @@ + + + + + + + + @@ -1247,6 +1385,14 @@ + + + + + + + + @@ -1271,11 +1417,29 @@ + + + + + + + + + + + + + + + + + + @@ -1331,6 +1495,14 @@ + + + + + + + + @@ -1389,6 +1561,19 @@ + + + + + + + + + + + + + @@ -1418,6 +1603,22 @@ + + + + + + + + + + + + + + + + @@ -1450,11 +1651,29 @@ + + + + + + + + + + + + + + + + + + @@ -1484,6 +1703,27 @@ + + + + + + + + + + + + + + + + + + + + + @@ -1516,6 +1756,19 @@ + + + + + + + + + + + + + @@ -1545,6 +1798,22 @@ + + + + + + + + + + + + + + + + @@ -1569,6 +1838,11 @@ + + + + + @@ -1590,6 +1864,14 @@ + + + + + + + + @@ -1611,6 +1893,11 @@ + + + + + @@ -1632,6 +1919,14 @@ + + + + + + + + @@ -1656,6 +1951,14 @@ + + + + + + + + @@ -1688,6 +1991,19 @@ + + + + + + + + + + + + + @@ -1722,6 +2038,22 @@ + + + + + + + + + + + + + + + + @@ -1751,6 +2083,11 @@ + + + + + @@ -1772,6 +2109,14 @@ + + + + + + + + @@ -1796,6 +2141,11 @@ + + + + + @@ -1817,6 +2167,14 @@ + + + + + + + + @@ -1841,6 +2199,11 @@ + + + + + @@ -1862,6 +2225,14 @@ + + + + + + + + @@ -1894,6 +2265,19 @@ + + + + + + + + + + + + + @@ -1933,6 +2317,27 @@ + + + + + + + + + + + + + + + + + + + + + @@ -1957,6 +2362,16 @@ + + + + + + + + + + @@ -1991,6 +2406,27 @@ + + + + + + + + + + + + + + + + + + + + + @@ -3602,6 +4038,22 @@ + + + + + + + + + + + + + + + + @@ -3618,6 +4070,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3642,6 +4134,22 @@ + + + + + + + + + + + + + + + + @@ -3650,6 +4158,22 @@ + + + + + + + + + + + + + + + + @@ -3658,6 +4182,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3682,6 +4238,22 @@ + + + + + + + + + + + + + + + + @@ -3690,6 +4262,22 @@ + + + + + + + + + + + + + + + + @@ -3698,6 +4286,22 @@ + + + + + + + + + + + + + + + + @@ -4400,6 +5004,14 @@ + + + + + + + + @@ -4477,6 +5089,14 @@ + + + + + + + + @@ -4485,6 +5105,11 @@ + + + + + @@ -4493,6 +5118,14 @@ + + + + + + + + @@ -9734,14 +10367,6 @@ - - - - - - - - @@ -12100,6 +12725,11 @@ + + + + + diff --git a/tracker/build.gradle.kts b/tracker/build.gradle.kts index 39bd0a7dd63..857e11e1cd6 100644 --- a/tracker/build.gradle.kts +++ b/tracker/build.gradle.kts @@ -36,6 +36,7 @@ kotlin { implementation(libs.compose.material3.window) implementation(compose.components.resources) implementation(project(":commonskmm")) + implementation(libs.androidx.compose.paging) // Koin api(libs.koin.core) From e4e52e4c358ccfae4187874095b15d4a5c177c05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manu=20Mu=C3=B1oz?= Date: Mon, 2 Feb 2026 10:11:00 +0100 Subject: [PATCH 035/260] refactor: [ANDROAPP-7461] remove deprecated onNextClicked (#4613) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Manu Muñoz --- .../aggregates/ui/inputs/InputProvider.kt | 30 +++++++++---------- .../ui/provider/inputfield/AgeProvider.kt | 2 +- .../ui/provider/inputfield/DateProvider.kt | 2 +- .../ui/provider/inputfield/FieldProvider.kt | 30 +++++++++++-------- .../InputsForTextValueTypeProvider.kt | 6 ++-- .../inputfield/UnitIntervalInputProvider.kt | 2 +- .../main/ui/screen/ServerValidationContent.kt | 2 +- 7 files changed, 39 insertions(+), 35 deletions(-) diff --git a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/inputs/InputProvider.kt b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/inputs/InputProvider.kt index 18190b8143c..8c2fa2a7234 100644 --- a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/inputs/InputProvider.kt +++ b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/inputs/InputProvider.kt @@ -223,7 +223,7 @@ internal fun InputProvider( onAction(UiAction.OnValueChanged(inputData.id, value)) } }, - onNextClicked = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, modifier = modifierWithFocus, ) } @@ -329,7 +329,7 @@ internal fun InputProvider( dateTextValue = it ?: TextFieldValue() onAction(UiAction.OnValueChanged(inputData.id, dateTextValue.text)) }, - onNextClicked = { onAction(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction(UiAction.OnNextClick(inputData.id)) }, modifier = modifierWithFocus, ) } @@ -342,7 +342,7 @@ internal fun InputProvider( legendData = inputData.legendData, inputTextFieldValue = textValue, isRequiredField = inputData.isRequired, - onNextClicked = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, onValueChanged = { textValue = it ?: TextFieldValue() onAction(UiAction.OnValueChanged(inputData.id, textValue.text)) @@ -457,7 +457,7 @@ internal fun InputProvider( legendData = inputData.legendData, inputTextFieldValue = textValue, isRequiredField = inputData.isRequired, - onNextClicked = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, onValueChanged = { textValue = it ?: TextFieldValue() onAction(UiAction.OnValueChanged(inputData.id, textValue.text)) @@ -477,7 +477,7 @@ internal fun InputProvider( legendData = inputData.legendData, inputTextFieldValue = textValue, isRequiredField = inputData.isRequired, - onNextClicked = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, onValueChanged = { textValue = it ?: TextFieldValue() onAction(UiAction.OnValueChanged(inputData.id, textValue.text)) @@ -497,7 +497,7 @@ internal fun InputProvider( legendData = inputData.legendData, inputTextFieldValue = textValue, isRequiredField = inputData.isRequired, - onNextClicked = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, onValueChanged = { textValue = it ?: TextFieldValue() onAction(UiAction.OnValueChanged(inputData.id, textValue.text)) @@ -517,7 +517,7 @@ internal fun InputProvider( legendData = inputData.legendData, inputTextFieldValue = textValue, isRequiredField = inputData.isRequired, - onNextClicked = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, onValueChanged = { textValue = it ?: TextFieldValue() onAction(UiAction.OnValueChanged(inputData.id, textValue.text)) @@ -537,7 +537,7 @@ internal fun InputProvider( legendData = inputData.legendData, inputTextFieldValue = textValue, isRequiredField = inputData.isRequired, - onNextClicked = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, onValueChanged = { if (textValue.text != it?.text) { textValue = it ?: TextFieldValue() @@ -559,7 +559,7 @@ internal fun InputProvider( legendData = inputData.legendData, inputTextFieldValue = textValue, isRequiredField = inputData.isRequired, - onNextClicked = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, onValueChanged = { textValue = it ?: TextFieldValue() onAction(UiAction.OnValueChanged(inputData.id, textValue.text)) @@ -783,7 +783,7 @@ internal fun InputProvider( legendData = inputData.legendData, inputTextFieldValue = textValue, isRequiredField = inputData.isRequired, - onNextClicked = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, onValueChanged = { textValue = it ?: TextFieldValue() onAction(UiAction.OnValueChanged(inputData.id, textValue.text)) @@ -824,7 +824,7 @@ internal fun InputProvider( legendData = inputData.legendData, inputTextFieldValue = textValue, isRequiredField = inputData.isRequired, - onNextClicked = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, onValueChanged = { textValue = it ?: TextFieldValue() onAction(UiAction.OnValueChanged(inputData.id, textValue.text)) @@ -847,7 +847,7 @@ internal fun InputProvider( inputTextFieldValue = textValue, isRequiredField = inputData.isRequired, onCallActionClicked = { onAction(UiAction.OnCall(inputData.id, textValue.text)) }, - onNextClicked = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, onValueChanged = { textValue = it ?: TextFieldValue() onAction(UiAction.OnValueChanged(inputData.id, textValue.text)) @@ -867,7 +867,7 @@ internal fun InputProvider( legendData = inputData.legendData, inputTextFieldValue = textValue, isRequiredField = inputData.isRequired, - onNextClicked = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, onValueChanged = { textValue = it ?: TextFieldValue() onAction(UiAction.OnValueChanged(inputData.id, textValue.text)) @@ -909,7 +909,7 @@ internal fun InputProvider( legendData = inputData.legendData, inputTextFieldValue = textValue, isRequiredField = inputData.isRequired, - onNextClicked = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, onValueChanged = { textValue = it ?: TextFieldValue() onAction(UiAction.OnValueChanged(inputData.id, textValue.text)) @@ -928,7 +928,7 @@ internal fun InputProvider( legendData = inputData.legendData, inputTextFieldValue = textValue, isRequiredField = inputData.isRequired, - onNextClicked = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, onValueChanged = { textValue = it ?: TextFieldValue() onAction(UiAction.OnValueChanged(inputData.id, textValue.text)) diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/AgeProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/AgeProvider.kt index a7414fa1c45..ed9ff8f3c5e 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/AgeProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/AgeProvider.kt @@ -151,7 +151,7 @@ fun ProvideInputAge( } } }, - onNextClicked = onNextClicked, + onImeActionClick = { onNextClicked() }, modifier = modifier, ) } diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/DateProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/DateProvider.kt index 868804d8474..f9a65c4df6d 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/DateProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/DateProvider.kt @@ -105,7 +105,7 @@ fun ProvideInputDate( } intentHandler.invoke(formIntent) }, - onNextClicked = onNextClicked, + onImeActionClick = { onNextClicked() }, ) } diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/FieldProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/FieldProvider.kt index 0b39ebef224..b04c8cc3728 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/FieldProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/FieldProvider.kt @@ -584,7 +584,7 @@ private fun ProvideIntegerPositive( legendData = fieldUiModel.legend(), inputTextFieldValue = value, isRequiredField = fieldUiModel.mandatory, - onNextClicked = { + onImeActionClick = { clickedOnNext = true onNextClicked() }, @@ -653,7 +653,7 @@ private fun ProvideIntegerPositiveOrZero( legendData = fieldUiModel.legend(), inputTextFieldValue = value, isRequiredField = fieldUiModel.mandatory, - onNextClicked = { + onImeActionClick = { clickedOnNext = true onNextClicked() }, @@ -722,7 +722,7 @@ private fun ProvidePercentage( legendData = fieldUiModel.legend(), inputTextFieldValue = value, isRequiredField = fieldUiModel.mandatory, - onNextClicked = { + onImeActionClick = { clickedOnNext = true onNextClicked() }, @@ -791,7 +791,7 @@ private fun ProvideNumber( legendData = fieldUiModel.legend(), inputTextFieldValue = value, isRequiredField = fieldUiModel.mandatory, - onNextClicked = { + onImeActionClick = { clickedOnNext = true onNextClicked() }, @@ -865,7 +865,7 @@ private fun ProvideIntegerNegative( legendData = fieldUiModel.legend(), inputTextFieldValue = value, isRequiredField = fieldUiModel.mandatory, - onNextClicked = { + onImeActionClick = { clickedOnNext = true onNextClicked() }, @@ -934,9 +934,13 @@ private fun ProvideLongText( legendData = fieldUiModel.legend(), inputTextFieldValue = value, isRequiredField = fieldUiModel.mandatory, - onNextClicked = { - clickedOnNext = true - onNextClicked() + onImeActionClick = { imeAction -> + when (imeAction) { + ImeAction.Next -> { + clickedOnNext = true + onNextClicked() + } + } }, onValueChanged = { value = it ?: TextFieldValue() @@ -1004,7 +1008,7 @@ private fun ProvideLetter( legendData = fieldUiModel.legend(), inputTextFieldValue = value, isRequiredField = fieldUiModel.mandatory, - onNextClicked = { + onImeActionClick = { clickedOnNext = true onNextClicked() }, @@ -1073,7 +1077,7 @@ private fun ProvideInteger( legendData = fieldUiModel.legend(), inputTextFieldValue = value, isRequiredField = fieldUiModel.mandatory, - onNextClicked = { + onImeActionClick = { clickedOnNext = true onNextClicked() }, @@ -1143,7 +1147,7 @@ private fun ProvideEmail( legendData = fieldUiModel.legend(), inputTextFieldValue = value, isRequiredField = fieldUiModel.mandatory, - onNextClicked = { + onImeActionClick = { clickedOnNext = true onNextClicked() }, @@ -1222,7 +1226,7 @@ private fun ProvideInputPhoneNumber( legendData = fieldUiModel.legend(), inputTextFieldValue = value, isRequiredField = fieldUiModel.mandatory, - onNextClicked = { + onImeActionClick = { clickedOnNext = true onNextClicked() }, @@ -1301,7 +1305,7 @@ private fun ProvideInputLink( legendData = fieldUiModel.legend(), inputTextFieldValue = value, isRequiredField = fieldUiModel.mandatory, - onNextClicked = { + onImeActionClick = { clickedOnNext = true onNextClicked() }, diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/InputsForTextValueTypeProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/InputsForTextValueTypeProvider.kt index 4cb4471e7ea..8d4d0541424 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/InputsForTextValueTypeProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/InputsForTextValueTypeProvider.kt @@ -102,7 +102,7 @@ private fun ProvideQRInput( inputTextFieldValue = value, inputStyle = inputStyle, isRequiredField = fieldUiModel.mandatory, - onNextClicked = { + onImeActionClick = { clickedOnNext = true onNextClicked() }, @@ -187,7 +187,7 @@ private fun ProvideDefaultTextInput( inputTextFieldValue = value, inputStyle = inputStyle, isRequiredField = fieldUiModel.mandatory, - onNextClicked = { + onImeActionClick = { clickedOnNext = true onNextClicked() }, @@ -252,7 +252,7 @@ private fun ProvideBarcodeInput( legendData = fieldUiModel.legend(), inputTextFieldValue = value, isRequiredField = fieldUiModel.mandatory, - onNextClicked = { + onImeActionClick = { clickedOnNext = true onNextClicked() }, diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/UnitIntervalInputProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/UnitIntervalInputProvider.kt index b2e317aa419..b9331718646 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/UnitIntervalInputProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/UnitIntervalInputProvider.kt @@ -39,7 +39,7 @@ fun ProvideUnitIntervalInput( legendData = fieldUiModel.legend(), inputTextFieldValue = value, isRequiredField = fieldUiModel.mandatory, - onNextClicked = onNextClicked, + onImeActionClick = { onNextClicked() }, onValueChanged = { value = it ?: TextFieldValue() intentHandler( diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/ServerValidationContent.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/ServerValidationContent.kt index f8a34e422b3..31446065e0b 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/ServerValidationContent.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/ServerValidationContent.kt @@ -131,7 +131,7 @@ internal fun ServerValidationContent( server = it ?: TextFieldValue() }, imeAction = ImeAction.Done, - onNextClicked = { + onImeActionClick = { onValidate(server.text) inputFocusState = InputShellState.UNFOCUSED }, From feb6b1dff13fbc5d4a6968319fcda4d0e82cee58 Mon Sep 17 00:00:00 2001 From: Xavier Molloy Date: Mon, 2 Feb 2026 13:11:07 +0100 Subject: [PATCH 036/260] feat: [ANDROAPP-7472] II data models and mappers (#4623) * feat: [ANDROAPP-7472] data models and mappers * feat: [ANDROAPP-7472] ktlint and copilot review comments * feat: [ANDROAPP-7472] correct geometry mapping * feat: [ANDROAPP-7472] remove verbose imports * feat: [ANDROAPP-7472] copilot review * fix: [ANDROAPP-7472] copilot review * fix: [ANDROAPP-7472] sonar smell * fix: [ANDROAPP-7472] code review comments --- ...omainToSDKTrackedEntitySearchItemMapper.kt | 135 +++++++++++++++++ .../data/TrackedEntitySearchItemMapper.kt | 138 ++++++++++++++++++ .../model/SearchTrackedEntitiesInput.kt | 10 ++ .../model/SearchTrackedEntityAttribute.kt | 6 + .../model/TrackedEntitySearchItemResult.kt | 81 ++++++++++ 5 files changed, 370 insertions(+) create mode 100644 tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/DomainToSDKTrackedEntitySearchItemMapper.kt create mode 100644 tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/TrackedEntitySearchItemMapper.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchTrackedEntitiesInput.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchTrackedEntityAttribute.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/TrackedEntitySearchItemResult.kt diff --git a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/DomainToSDKTrackedEntitySearchItemMapper.kt b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/DomainToSDKTrackedEntitySearchItemMapper.kt new file mode 100644 index 00000000000..08b8664494e --- /dev/null +++ b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/DomainToSDKTrackedEntitySearchItemMapper.kt @@ -0,0 +1,135 @@ +package org.dhis2.tracker.search.data + +import org.dhis2.tracker.search.model.GeometryFeatureType +import org.dhis2.tracker.search.model.SyncState +import org.dhis2.tracker.search.model.TrackedEntityGeometry +import org.dhis2.tracker.search.model.TrackedEntitySearchItemAttributeDomain +import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult +import org.dhis2.tracker.search.model.TrackedEntityTypeDomain +import org.dhis2.tracker.ui.input.model.TrackerInputType +import org.hisp.dhis.android.core.common.FeatureType +import org.hisp.dhis.android.core.common.Geometry +import org.hisp.dhis.android.core.common.State +import org.hisp.dhis.android.core.common.ValueType +import org.hisp.dhis.android.core.trackedentity.TrackedEntityType +import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItem +import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItemAttribute +import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItemProgramOwner + +fun transformDomainTeiToSDKTei(trackedEntitySearchItemResult: TrackedEntitySearchItemResult): TrackedEntitySearchItem = + TrackedEntitySearchItem( + uid = trackedEntitySearchItemResult.uid, + created = trackedEntitySearchItemResult.created, + lastUpdated = trackedEntitySearchItemResult.lastUpdated, + createdAtClient = trackedEntitySearchItemResult.createdAtClient, + lastUpdatedAtClient = trackedEntitySearchItemResult.lastUpdatedAtClient, + organisationUnit = trackedEntitySearchItemResult.organisationUnit, + geometry = trackedEntitySearchItemResult.geometry?.toSDKGeometry(), + syncState = trackedEntitySearchItemResult.syncState?.toSDKState(), + aggregatedSyncState = trackedEntitySearchItemResult.aggregatedSyncState?.toSDKState(), + deleted = trackedEntitySearchItemResult.deleted, + isOnline = trackedEntitySearchItemResult.isOnline, + type = mapTrackedEntityType(trackedEntitySearchItemResult.type), + header = trackedEntitySearchItemResult.header, + attributeValues = trackedEntitySearchItemResult.attributeValues.map { it.toSDKAttribute() }, + programOwners = + trackedEntitySearchItemResult.programOwners.map { + TrackedEntitySearchItemProgramOwner( + program = it.program, + ownerOrgUnit = it.organisationUnit, + ) + }, + ) + +private fun TrackedEntityGeometry.toSDKGeometry(): Geometry? = + coordinates?.let { + Geometry + .builder() + .type(geometryFeatureType.toSDKFeatureType()) + .coordinates(it) + .build() + } + +private fun GeometryFeatureType.toSDKFeatureType(): FeatureType = + when (this) { + GeometryFeatureType.POINT -> FeatureType.POINT + GeometryFeatureType.POLYGON -> FeatureType.POLYGON + GeometryFeatureType.MULTI_POLYGON -> FeatureType.MULTI_POLYGON + GeometryFeatureType.NONE -> FeatureType.NONE + GeometryFeatureType.SYMBOL -> FeatureType.SYMBOL + } + +private fun SyncState.toSDKState(): State = + when (this) { + SyncState.TO_POST -> State.TO_POST + SyncState.TO_UPDATE -> State.TO_UPDATE + SyncState.ERROR -> State.ERROR + SyncState.SYNCED -> State.SYNCED + SyncState.WARNING -> State.WARNING + SyncState.UPLOADING -> State.UPLOADING + SyncState.RELATIONSHIP -> State.RELATIONSHIP + SyncState.SENT_VIA_SMS -> State.SENT_VIA_SMS + SyncState.SYNCED_VIA_SMS -> State.SYNCED_VIA_SMS + } + +private fun TrackedEntitySearchItemAttributeDomain.toSDKAttribute(): TrackedEntitySearchItemAttribute = + TrackedEntitySearchItemAttribute( + attribute = attribute, + displayName = displayName, + displayFormName = displayFormName, + value = value, + created = created, + lastUpdated = lastUpdated, + valueType = valueType.toSDKValueType(), + displayInList = displayInList, + optionSet = optionSet, + ) + +private fun TrackerInputType.toSDKValueType(): ValueType = + when (this) { + TrackerInputType.TEXT -> ValueType.TEXT + TrackerInputType.LONG_TEXT -> ValueType.LONG_TEXT + TrackerInputType.LETTER -> ValueType.LETTER + TrackerInputType.PHONE_NUMBER -> ValueType.PHONE_NUMBER + TrackerInputType.EMAIL -> ValueType.EMAIL + TrackerInputType.URL -> ValueType.URL + TrackerInputType.NUMBER -> ValueType.NUMBER + TrackerInputType.INTEGER -> ValueType.INTEGER + TrackerInputType.INTEGER_POSITIVE -> ValueType.INTEGER_POSITIVE + TrackerInputType.INTEGER_NEGATIVE -> ValueType.INTEGER_NEGATIVE + TrackerInputType.INTEGER_ZERO_OR_POSITIVE -> ValueType.INTEGER_ZERO_OR_POSITIVE + TrackerInputType.PERCENTAGE -> ValueType.PERCENTAGE + TrackerInputType.UNIT_INTERVAL -> ValueType.UNIT_INTERVAL + TrackerInputType.AGE -> ValueType.AGE + TrackerInputType.ORGANISATION_UNIT -> ValueType.ORGANISATION_UNIT + TrackerInputType.DATE_TIME -> ValueType.DATETIME + TrackerInputType.DATE -> ValueType.DATE + TrackerInputType.TIME -> ValueType.TIME + TrackerInputType.CHECKBOX, + TrackerInputType.RADIO_BUTTON, + -> ValueType.BOOLEAN + TrackerInputType.YES_ONLY_SWITCH, + TrackerInputType.YES_ONLY_CHECKBOX, + -> ValueType.TRUE_ONLY + TrackerInputType.QR_CODE, + TrackerInputType.BAR_CODE, + -> ValueType.TEXT + TrackerInputType.MULTI_SELECTION -> ValueType.MULTI_TEXT + TrackerInputType.DROPDOWN, + TrackerInputType.PERIOD_SELECTOR, + TrackerInputType.MATRIX, + TrackerInputType.SEQUENTIAL, + TrackerInputType.NOT_SUPPORTED, + TrackerInputType.CUSTOM_INTENT, + -> ValueType.TEXT + } + +private fun mapTrackedEntityType(trackedEntityTypeDomain: TrackedEntityTypeDomain): TrackedEntityType { + val firstAttribute = trackedEntityTypeDomain.trackedEntityTypeAttributeDomains.firstOrNull() + val teiTypeUid = firstAttribute?.trackedEntityTypeUid ?: "unknown" + + return TrackedEntityType + .builder() + .uid(teiTypeUid) + .build() +} diff --git a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/TrackedEntitySearchItemMapper.kt b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/TrackedEntitySearchItemMapper.kt new file mode 100644 index 00000000000..2b62b721425 --- /dev/null +++ b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/TrackedEntitySearchItemMapper.kt @@ -0,0 +1,138 @@ +package org.dhis2.tracker.search.data + +import org.dhis2.tracker.search.model.GeometryFeatureType +import org.dhis2.tracker.search.model.SyncState +import org.dhis2.tracker.search.model.TrackedEntityGeometry +import org.dhis2.tracker.search.model.TrackedEntitySearchItemAttributeDomain +import org.dhis2.tracker.search.model.TrackedEntitySearchItemProgramOwnerDomain +import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult +import org.dhis2.tracker.search.model.TrackedEntityTypeAttributeDomain +import org.dhis2.tracker.search.model.TrackedEntityTypeDomain +import org.dhis2.tracker.ui.input.model.TrackerInputType +import org.hisp.dhis.android.core.common.FeatureType +import org.hisp.dhis.android.core.common.Geometry +import org.hisp.dhis.android.core.common.State +import org.hisp.dhis.android.core.common.ValueType +import org.hisp.dhis.android.core.trackedentity.TrackedEntityType +import org.hisp.dhis.android.core.trackedentity.TrackedEntityTypeAttribute +import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItem +import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItemAttribute +import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItemProgramOwner + +fun TrackedEntitySearchItem.toTrackedEntitySearchItemResult(): TrackedEntitySearchItemResult = + TrackedEntitySearchItemResult( + uid = this.uid, + created = this.created, + lastUpdated = this.lastUpdated, + createdAtClient = this.createdAtClient, + lastUpdatedAtClient = this.lastUpdatedAtClient, + organisationUnit = this.organisationUnit, + geometry = this.geometry.toDomainGeometry(), + syncState = this.syncState?.toSyncState(), + aggregatedSyncState = this.aggregatedSyncState?.toSyncState(), + deleted = this.deleted, + isOnline = this.isOnline, + type = this.type.toTrackedEntityType(), + header = this.header, + attributeValues = this.attributeValues?.map { it.toTrackedEntitySearchItemAttribute() } ?: emptyList(), + programOwners = this.programOwners?.map { it.toTrackedEntitySearchItemProgramOwner() } ?: emptyList(), + ) + +private fun Geometry?.toDomainGeometry(): TrackedEntityGeometry? = + this?.let { + TrackedEntityGeometry( + geometryFeatureType = getGeometryType(it.type()), + coordinates = it.coordinates(), + ) + } + +private fun getGeometryType(type: FeatureType?): GeometryFeatureType = + when (type) { + FeatureType.POINT -> GeometryFeatureType.POINT + FeatureType.MULTI_POLYGON -> GeometryFeatureType.MULTI_POLYGON + FeatureType.POLYGON -> GeometryFeatureType.POLYGON + FeatureType.NONE -> GeometryFeatureType.NONE + FeatureType.SYMBOL -> GeometryFeatureType.SYMBOL + else -> GeometryFeatureType.NONE + } + +private fun State?.toSyncState(): SyncState? = + when (this) { + State.TO_POST -> SyncState.TO_POST + State.TO_UPDATE -> SyncState.TO_UPDATE + State.ERROR -> SyncState.ERROR + State.SYNCED -> SyncState.SYNCED + State.WARNING -> SyncState.WARNING + State.UPLOADING -> SyncState.UPLOADING + State.RELATIONSHIP -> SyncState.RELATIONSHIP + State.SENT_VIA_SMS -> SyncState.SENT_VIA_SMS + State.SYNCED_VIA_SMS -> SyncState.SYNCED_VIA_SMS + null -> null + } + +private fun TrackedEntityType.toTrackedEntityType(): TrackedEntityTypeDomain = + TrackedEntityTypeDomain( + trackedEntityTypeAttributeDomains = this.trackedEntityTypeAttributes()?.map { it.toTrackedEntityTypeAttribute() } ?: emptyList(), + featureType = getGeometryType(this.featureType()), + ) + +private fun TrackedEntityTypeAttribute.toTrackedEntityTypeAttribute(): TrackedEntityTypeAttributeDomain = + TrackedEntityTypeAttributeDomain( + trackedEntityTypeUid = this.trackedEntityType()?.uid(), + trackedEntityAttributeUid = this.trackedEntityAttribute()?.uid(), + displayInList = this.displayInList() ?: false, + mandatory = this.mandatory() ?: false, + searchable = this.searchable() ?: false, + sortOrder = this.sortOrder() ?: 0, + ) + +private fun TrackedEntitySearchItemAttribute.toTrackedEntitySearchItemAttribute(): TrackedEntitySearchItemAttributeDomain = + TrackedEntitySearchItemAttributeDomain( + attribute = this.attribute, + displayName = this.displayName, + displayFormName = this.displayFormName, + value = this.value, + created = this.created, + lastUpdated = this.lastUpdated, + valueType = this.valueType.toTrackerInputType(), + displayInList = this.displayInList, + optionSet = this.optionSet, + ) + +private fun ValueType.toTrackerInputType(): TrackerInputType = + when (this) { + ValueType.TEXT -> TrackerInputType.TEXT + ValueType.LONG_TEXT -> TrackerInputType.LONG_TEXT + ValueType.NUMBER -> TrackerInputType.NUMBER + ValueType.INTEGER -> TrackerInputType.INTEGER + ValueType.INTEGER_POSITIVE -> TrackerInputType.INTEGER_POSITIVE + ValueType.INTEGER_NEGATIVE -> TrackerInputType.INTEGER_NEGATIVE + ValueType.INTEGER_ZERO_OR_POSITIVE -> TrackerInputType.INTEGER_ZERO_OR_POSITIVE + ValueType.BOOLEAN -> TrackerInputType.CHECKBOX + ValueType.TRUE_ONLY -> TrackerInputType.YES_ONLY_CHECKBOX + ValueType.DATE -> TrackerInputType.DATE + ValueType.DATETIME -> TrackerInputType.DATE_TIME + ValueType.TIME -> TrackerInputType.TIME + ValueType.EMAIL -> TrackerInputType.EMAIL + ValueType.PHONE_NUMBER -> TrackerInputType.PHONE_NUMBER + ValueType.PERCENTAGE -> TrackerInputType.PERCENTAGE + ValueType.URL -> TrackerInputType.URL + ValueType.COORDINATE -> TrackerInputType.NOT_SUPPORTED + ValueType.AGE -> TrackerInputType.AGE + ValueType.ORGANISATION_UNIT -> TrackerInputType.ORGANISATION_UNIT + ValueType.UNIT_INTERVAL -> TrackerInputType.UNIT_INTERVAL + ValueType.FILE_RESOURCE -> TrackerInputType.NOT_SUPPORTED + ValueType.IMAGE -> TrackerInputType.NOT_SUPPORTED + ValueType.LETTER -> TrackerInputType.LETTER + ValueType.USERNAME -> TrackerInputType.TEXT + ValueType.TRACKER_ASSOCIATE -> TrackerInputType.NOT_SUPPORTED + ValueType.REFERENCE -> TrackerInputType.NOT_SUPPORTED + ValueType.GEOJSON -> TrackerInputType.NOT_SUPPORTED + ValueType.MULTI_TEXT -> TrackerInputType.MULTI_SELECTION + } + +private fun TrackedEntitySearchItemProgramOwner.toTrackedEntitySearchItemProgramOwner(): TrackedEntitySearchItemProgramOwnerDomain = + TrackedEntitySearchItemProgramOwnerDomain( + program = this.program, + organisationUnit = this.ownerOrgUnit, + ) diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchTrackedEntitiesInput.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchTrackedEntitiesInput.kt new file mode 100644 index 00000000000..07c69077884 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchTrackedEntitiesInput.kt @@ -0,0 +1,10 @@ +package org.dhis2.tracker.search.model + +data class SearchTrackedEntitiesInput( + val selectedProgram: String?, + val allowCache: Boolean, + val excludeValues: Set?, + val hasStateFilters: Boolean, + val isOnline: Boolean, + val queryData: Map?>?, +) diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchTrackedEntityAttribute.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchTrackedEntityAttribute.kt new file mode 100644 index 00000000000..916ec481093 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchTrackedEntityAttribute.kt @@ -0,0 +1,6 @@ +package org.dhis2.tracker.search.model + +data class SearchTrackedEntityAttribute( + val isUnique: Boolean, + val isOptionSet: Boolean, +) diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/TrackedEntitySearchItemResult.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/TrackedEntitySearchItemResult.kt new file mode 100644 index 00000000000..3bc4f9bd79b --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/TrackedEntitySearchItemResult.kt @@ -0,0 +1,81 @@ +package org.dhis2.tracker.search.model + +import org.dhis2.tracker.ui.input.model.TrackerInputType +import java.util.Date + +data class TrackedEntitySearchItemResult( + val uid: String, + val created: Date?, + val lastUpdated: Date?, + val createdAtClient: Date?, + val lastUpdatedAtClient: Date?, + val organisationUnit: String?, + val geometry: TrackedEntityGeometry?, + val syncState: SyncState?, + val aggregatedSyncState: SyncState?, + val deleted: Boolean, + val isOnline: Boolean = false, + val type: TrackedEntityTypeDomain, + val header: String? = null, + val attributeValues: List, + val programOwners: List, +) + +data class TrackedEntitySearchItemAttributeDomain( + val attribute: String, + val displayName: String, + val displayFormName: String, + val value: String?, + val created: Date?, + val lastUpdated: Date?, + val valueType: TrackerInputType, + val displayInList: Boolean, + val optionSet: String?, +) + +data class TrackedEntityTypeDomain( + val trackedEntityTypeAttributeDomains: List, + val featureType: GeometryFeatureType, +) + +data class TrackedEntityTypeAttributeDomain( + val trackedEntityTypeUid: String?, + val trackedEntityAttributeUid: String?, + val displayInList: Boolean, + val mandatory: Boolean, + val searchable: Boolean, + val sortOrder: Int, +) + +data class TrackedEntitySearchItemProgramOwnerDomain( + val program: String, + val organisationUnit: String, +) + +data class TrackedEntityGeometry( + val geometryFeatureType: GeometryFeatureType, + val coordinates: String?, +) + +enum class GeometryFeatureType( + val featureType: String, + val geometryType: String, +) { + POINT("POINT", "Point"), + POLYGON("POLYGON", "Polygon"), + MULTI_POLYGON("MULTI_POLYGON", "MultiPolygon"), + NONE("NONE", "None"), + SYMBOL("SYMBOL", "Symbol"), +} + +enum class SyncState { + TO_POST, + TO_UPDATE, + ERROR, + SYNCED, + WARNING, + UPLOADING, + RELATIONSHIP, + SENT_VIA_SMS, + SYNCED_VIA_SMS, +} From de1a8180034dd9dd192a11f45ca18757333ac16b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Tar=C3=AD?= Date: Mon, 2 Feb 2026 15:12:48 +0100 Subject: [PATCH 037/260] fix: [ANDROAPP-7465] ds data input periods appear available but are actually closed (#4628) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: [ANDROAPP-7465] add new DataSetNonEditableReason PERIOD_NOT_IN_DATA_INPUT_PERIODS * chore: [ANDROAPP-7465] fix sdk version * chore: [ANDROAPP-7465] fix ktlint format --------- Co-authored-by: Andrés Miguel Rubio --- .../aggregates/data/DataSetInstanceRepositoryImpl.kt | 8 +++++++- .../src/commonMain/composeResources/values/strings.xml | 1 + .../org/dhis2/mobile/aggregates/model/DataSetDetails.kt | 2 ++ .../org/dhis2/mobile/aggregates/ui/DataSetTableScreen.kt | 4 ++++ gradle/libs.versions.toml | 2 +- gradle/verification-metadata.xml | 5 +++++ 6 files changed, 20 insertions(+), 2 deletions(-) diff --git a/aggregates/src/androidMain/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepositoryImpl.kt b/aggregates/src/androidMain/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepositoryImpl.kt index d10db4a946c..eb0086a8113 100644 --- a/aggregates/src/androidMain/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepositoryImpl.kt +++ b/aggregates/src/androidMain/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepositoryImpl.kt @@ -179,6 +179,9 @@ internal class DataSetInstanceRepositoryImpl( DataSetNonEditableReason.EXPIRED -> NonEditableReason.Expired + + DataSetNonEditableReason.PERIOD_NOT_IN_DATA_INPUT_PERIODS -> + NonEditableReason.PeriodNotInDataInputPeriods } } ?: NonEditableReason.None, ) @@ -336,7 +339,10 @@ internal class DataSetInstanceRepositoryImpl( .blockingGet() ?.let { DataSetRenderingConfig( - useVerticalTabs = it.displayOptions()?.tabsDirection() == TabsDirection.VERTICAL, + useVerticalTabs = + it + .displayOptions() + ?.tabsDirection() == TabsDirection.VERTICAL, ) } ?: DataSetRenderingConfig( useVerticalTabs = true, diff --git a/aggregates/src/commonMain/composeResources/values/strings.xml b/aggregates/src/commonMain/composeResources/values/strings.xml index bc1831ca71d..7a7b077647f 100644 --- a/aggregates/src/commonMain/composeResources/values/strings.xml +++ b/aggregates/src/commonMain/composeResources/values/strings.xml @@ -72,6 +72,7 @@ %2$s is the attribute option combo name --> You cannot edit data for the period %1$s in %2$s + This data is not editable because the selected period is outside the data input period This data is not editable because it is marked as closed This data is not editable because its edition time has expired diff --git a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/model/DataSetDetails.kt b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/model/DataSetDetails.kt index 6845e8b4baa..cdd01bb9875 100644 --- a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/model/DataSetDetails.kt +++ b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/model/DataSetDetails.kt @@ -53,6 +53,8 @@ sealed class NonEditableReason { data object Closed : NonEditableReason() data object Expired : NonEditableReason() + + data object PeriodNotInDataInputPeriods : NonEditableReason() } enum class TextAlignment { diff --git a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/DataSetTableScreen.kt b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/DataSetTableScreen.kt index 6be8ccf6780..95e836b5cd5 100644 --- a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/DataSetTableScreen.kt +++ b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/DataSetTableScreen.kt @@ -70,6 +70,7 @@ import org.dhis2.mobile.aggregates.resources.empty_section_message import org.dhis2.mobile.aggregates.resources.no_data_write_access import org.dhis2.mobile.aggregates.resources.org_unit_not_in_capture_scope import org.dhis2.mobile.aggregates.resources.period_not_in_attribute_option_combo_range +import org.dhis2.mobile.aggregates.resources.period_not_in_data_input_periods import org.dhis2.mobile.aggregates.resources.period_not_in_org_unit_range import org.dhis2.mobile.aggregates.ui.component.HtmlContentBox import org.dhis2.mobile.aggregates.ui.component.ValidationBar @@ -575,6 +576,9 @@ private fun nonEditableReasonLabel(edition: DataSetEdition) = edition.nonEditableReason.periodLabel, edition.nonEditableReason.orgUnitLabel, ) + + is NonEditableReason.PeriodNotInDataInputPeriods -> + stringResource(Res.string.period_not_in_data_input_periods) } /** diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 068fa4c986d..1423b46e244 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -11,7 +11,7 @@ kotlin = '2.2.21' dagger = '2.57.2' jacoco = '0.8.14' designSystem = "0.7.0-SNAPSHOT" -dhis2sdk = "1.14.0-20260126.105658-5" +dhis2sdk = "1.14.0-20260129.154413-7" ruleEngine = "3.3.11" expressionParser = "1.2.2" appcompat = "1.7.1" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 3e51a169baf..6fa4869b326 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -10367,6 +10367,11 @@ + + + + + From 98ffe5b218ebc7a00eb8b56c56004d2f4e6b1298 Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Tue, 3 Feb 2026 07:57:36 +0100 Subject: [PATCH 038/260] fix(translations): sync translations from transifex (develop) [skip size] (#4614) * fix(translations): sync translations from transifex (develop) * fix(translations): sync translations from transifex (develop) * fix: remove escaped characters --------- Co-authored-by: andresmr --- .../values-en-rUS/strings.xml | 26 +++ .../values-hi-rIN/strings.xml | 1 + .../composeResources/values-pt/strings.xml | 4 + app/src/main/res/values-en-rUS/strings.xml | 94 ++++++++ app/src/main/res/values-hi-rIN/strings.xml | 19 ++ commons/src/main/res/values-cs/strings.xml | 1 + .../src/main/res/values-en-rUS/strings.xml | 87 +++++++ .../src/main/res/values-hi-rIN/strings.xml | 4 + .../src/main/res/values-pt-rBR/strings.xml | 1 + commons/src/main/res/values-uk/strings.xml | 3 +- commons/src/main/res/values-vi/strings.xml | 1 + commons/src/main/res/values-zh/strings.xml | 1 + .../composeResources/values-cs/strings.xml | 1 + .../values-en-rUS/strings.xml | 214 ++++++++++++++++++ .../composeResources/values-es/strings.xml | 4 +- .../values-hi-rIN/strings.xml | 17 +- .../composeResources/values-zh/strings.xml | 1 + .../src/main/res/values-en-rUS/strings.xml | 4 + .../src/main/res/values-en-rUS/strings.xml | 4 + form/src/main/res/values-en-rUS/strings.xml | 93 ++++++++ form/src/main/res/values-hi-rIN/strings.xml | 3 + .../composeResources/values-cs/strings.xml | 51 ++++- .../values-en-rUS/strings.xml | 4 + .../composeResources/values-es/strings.xml | 5 + .../composeResources/values-zh/strings.xml | 51 ++++- .../src/main/res/values-en-rUS/strings.xml | 39 ++++ .../src/main/res/values-hi-rIN/strings.xml | 1 + .../composeResources/values-am/strings.xml | 5 + .../values-ar-rEG/strings.xml | 5 + .../values-ar-rIQ/strings.xml | 1 + .../values-ar-rSD/strings.xml | 5 + .../composeResources/values-ar/strings.xml | 1 + .../composeResources/values-bn/strings.xml | 1 + .../composeResources/values-ckb/strings.xml | 1 + .../composeResources/values-cs/strings.xml | 1 + .../composeResources/values-da/strings.xml | 1 + .../values-en-rUS/strings.xml | 5 + .../values-es-rES/strings.xml | 1 + .../values-es-rUS/strings.xml | 5 + .../composeResources/values-es/strings.xml | 1 + .../composeResources/values-fi/strings.xml | 5 + .../composeResources/values-fr/strings.xml | 1 + .../composeResources/values-fur/strings.xml | 5 + .../values-hi-rIN/strings.xml | 1 + .../composeResources/values-id/strings.xml | 1 + .../composeResources/values-it/strings.xml | 5 + .../composeResources/values-ka/strings.xml | 5 + .../composeResources/values-km/strings.xml | 1 + .../values-ko-rKR/strings.xml | 5 + .../composeResources/values-ko/strings.xml | 5 + .../composeResources/values-ku/strings.xml | 5 + .../composeResources/values-ky/strings.xml | 5 + .../composeResources/values-ln/strings.xml | 5 + .../composeResources/values-lo/strings.xml | 1 + .../composeResources/values-mk/strings.xml | 5 + .../composeResources/values-ml/strings.xml | 5 + .../composeResources/values-mn/strings.xml | 5 + .../composeResources/values-my/strings.xml | 1 + .../composeResources/values-nb/strings.xml | 1 + .../composeResources/values-ne/strings.xml | 5 + .../composeResources/values-nl/strings.xml | 1 + .../composeResources/values-no/strings.xml | 5 + .../composeResources/values-or/strings.xml | 1 + .../composeResources/values-pl/strings.xml | 5 + .../composeResources/values-prs/strings.xml | 1 + .../composeResources/values-ps/strings.xml | 1 + .../values-pt-rBR/strings.xml | 1 + .../composeResources/values-pt/strings.xml | 1 + .../composeResources/values-rn/strings.xml | 5 + .../composeResources/values-ro/strings.xml | 1 + .../composeResources/values-ru/strings.xml | 1 + .../composeResources/values-rw/strings.xml | 5 + .../composeResources/values-si/strings.xml | 1 + .../composeResources/values-sv/strings.xml | 1 + .../values-sw-rTZ/strings.xml | 5 + .../composeResources/values-tet/strings.xml | 1 + .../composeResources/values-tg/strings.xml | 1 + .../composeResources/values-th/strings.xml | 5 + .../composeResources/values-ti/strings.xml | 5 + .../composeResources/values-tl/strings.xml | 5 + .../composeResources/values-uk/strings.xml | 1 + .../composeResources/values-ur/strings.xml | 1 + .../values-uz-rUZ/strings.xml | 1 + .../composeResources/values-uz/strings.xml | 1 + .../composeResources/values-vi/strings.xml | 1 + .../values-zh-rCN/strings.xml | 2 +- .../values-zh-rHK/strings.xml | 5 + .../composeResources/values-zh/strings.xml | 1 + .../values-en-rUS/strings.xml | 4 + .../values-hi-rIN/strings.xml | 3 +- 90 files changed, 904 insertions(+), 7 deletions(-) create mode 100644 aggregates/src/commonMain/composeResources/values-en-rUS/strings.xml create mode 100644 app/src/main/res/values-en-rUS/strings.xml create mode 100644 commons/src/main/res/values-en-rUS/strings.xml create mode 100644 commonskmm/src/commonMain/composeResources/values-en-rUS/strings.xml create mode 100644 compose-table/src/main/res/values-en-rUS/strings.xml create mode 100644 dhis_android_analytics/src/main/res/values-en-rUS/strings.xml create mode 100644 form/src/main/res/values-en-rUS/strings.xml create mode 100644 login/src/commonMain/composeResources/values-en-rUS/strings.xml create mode 100644 stock-usecase/src/main/res/values-en-rUS/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-am/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-ar-rEG/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-ar-rSD/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-en-rUS/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-es-rUS/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-fi/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-fur/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-it/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-ka/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-ko-rKR/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-ko/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-ku/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-ky/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-ln/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-mk/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-ml/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-mn/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-ne/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-no/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-pl/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-rn/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-rw/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-sw-rTZ/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-th/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-ti/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-tl/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-zh-rHK/strings.xml create mode 100644 tracker/src/commonMain/composeResources/values-en-rUS/strings.xml diff --git a/aggregates/src/commonMain/composeResources/values-en-rUS/strings.xml b/aggregates/src/commonMain/composeResources/values-en-rUS/strings.xml new file mode 100644 index 00000000000..ee2d73a4cec --- /dev/null +++ b/aggregates/src/commonMain/composeResources/values-en-rUS/strings.xml @@ -0,0 +1,26 @@ + + + Date of birth + Age + or + Accept + Cancel + No results found + Search to find more + Done + Latitude + Longitude + Add location + Out of range + Incorrect format + Not supported + Not now + Complete + Saved! + Error + Review + Add file + Add Image + Take Photo + Add from Gallery + \ No newline at end of file diff --git a/aggregates/src/commonMain/composeResources/values-hi-rIN/strings.xml b/aggregates/src/commonMain/composeResources/values-hi-rIN/strings.xml index ab97a4a588a..63817c5629b 100644 --- a/aggregates/src/commonMain/composeResources/values-hi-rIN/strings.xml +++ b/aggregates/src/commonMain/composeResources/values-hi-rIN/strings.xml @@ -14,6 +14,7 @@ सब ठीक है अभी नहीं पूरा हुआ + सेव ठीक है नहीं हाँ diff --git a/aggregates/src/commonMain/composeResources/values-pt/strings.xml b/aggregates/src/commonMain/composeResources/values-pt/strings.xml index 8b8a23fbbcf..b2f477af0e2 100644 --- a/aggregates/src/commonMain/composeResources/values-pt/strings.xml +++ b/aggregates/src/commonMain/composeResources/values-pt/strings.xml @@ -35,4 +35,8 @@ Tirar fotografia Indicadores Não tem permissão para editar estes dados + + Não tem permissão para editar dados para %1$s \ No newline at end of file diff --git a/app/src/main/res/values-en-rUS/strings.xml b/app/src/main/res/values-en-rUS/strings.xml new file mode 100644 index 00000000000..a93fa338c92 --- /dev/null +++ b/app/src/main/res/values-en-rUS/strings.xml @@ -0,0 +1,94 @@ + + + Error + There are no more reserved values. Contact your system administrator + Accept + Share + Enter text + Enter long text + Enter number + Enter negative integer + Enter positive integer or zero + Enter positive integer + Choose date + Error + Date + Org unit + Latitude + Longitude + + Due date + Cat combo + Cancel + No options available + + Accept + Cancel + Add file + Some fields need your attention.\nDo you want to review the form? + Coordinates for the + + + Days + Months + Years + Incident date + Share + Check this! + Error + This server is running a dhis version different than 2.29. Update your server version or use the testing environment to proceed. + Error while parsing results + This is not a valid phone number + This is not a valid email + Only negative numbers are allowed + Only positive numbers or zero allowed + Only positive numbers are allowed + Only values from 0 to 1 are allowed + Only values from 0 to 100 are allowed + The value should be unique, a coincidence has been found. It has not been saved. Please check it. + No info for this field + Accept + Close + Complete + Formatting error + This is not a valid url + Copied + Polygon captured + Polygon + Attributes - %s + Select time + Enter letter + Enter number from 0 to 1 + Enter percentage + Enter phone number + Enter email + Choose organisation unit + Enter url + Enter value + Saved! + Complete + Done + Date + Coordinates values are not valid + This field is mandatory + Close + Camera permission is denied.\nYou need to enable it to use this feature. + Take Photo + Unknown server + Value must be an integer + Do not show again + %s can\'t be parsed as a date + This field could not be updated. Please try again + Program rules warning + There is a configuration issue causing a loop in the rules. Contact you administrator. + Not saved + Some fields need your attention.\nDo you want to review the form? + You have some warning messages. + You have some warning messages.\nDo you want to mark this form as complete\? + Some fields have errors and they are not saved. \nDo you want to review the form? + Do you want to mark this form as complete? + You have some error messages.\nDo you want to review them? + %s details + Not now + Coordinates + diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml index d3a58b70737..d8d42d13d12 100644 --- a/app/src/main/res/values-hi-rIN/strings.xml +++ b/app/src/main/res/values-hi-rIN/strings.xml @@ -24,8 +24,11 @@ साझा करें सर्च करें / खोजें + दिन चुनें इवेंट कंप्लीटेड त्रुटि + + बनाएँ अपडेट करें तारीख नया इवेंट @@ -46,13 +49,22 @@ दिन महीने वर्ष + सप्ताह साफ़ करें आगे सहेजें ठीक है साझा करें + अधिकतम त्रुटि सहेजें + यह मान्य फ़ोन नंबर नहीं है + यह मान्य ईमेल नहीं है + केवल नेगेटिव संख्या ही अनुमति है + केवल शून्य या पॉजिटिव संख्या ही अनुमति है + केवल पॉजिटिव संख्या ही अनुमति है + केवल 0 से 1 के मान ही अनुमति हैं + केवल 0 से 100 के वैल्यूज़ अनुमति हैं नया इवेंट जनरेट करें क्या आप एक और इवेंट बनाना चाहते हैं? छोड़ें @@ -62,15 +74,21 @@ पूरा हुआ रोज़ाना साप्ताहिक + यह मान्य URL नहीं है आज कल (बिता हुआ) + इस सप्ताह + पिछला सप्ताह इस महीने पिछला महीना अतिदेय विज़िट की गई पीछे जाएं + डेटा सेट्स कल (बिता हुआ) + समय चुनें सिंक की गलती + सेव नाम पूरा हुआ डेटा @@ -80,6 +98,7 @@ पीछे जाएं बंद करें इस वर्ष + पिछली तिमाही पिछला वर्ष वैल्यू यह प्रोग्राम सुरक्षित है diff --git a/commons/src/main/res/values-cs/strings.xml b/commons/src/main/res/values-cs/strings.xml index 433479b5f2a..50f2effd560 100644 --- a/commons/src/main/res/values-cs/strings.xml +++ b/commons/src/main/res/values-cs/strings.xml @@ -329,5 +329,6 @@ Import databáze se nezdařil Neplatný soubor Není v režimu registrace TOTP 2FA + Vymazat vše diff --git a/commons/src/main/res/values-en-rUS/strings.xml b/commons/src/main/res/values-en-rUS/strings.xml new file mode 100644 index 00000000000..b72c89af550 --- /dev/null +++ b/commons/src/main/res/values-en-rUS/strings.xml @@ -0,0 +1,87 @@ + + + Accept + Cancel + Done + + Date + Error + Complete + + Password is missing. Please enter password. + Username is missing. Please enter username. + This server is running a dhis version different than 2.29. Update your server version or use the testing environment to proceed. + This server is running a DHIS2 version different than %s. Update your server version or contact your admin. + Something went wrong. Please check that server URL, username and password are correct and try again. + Sorry! Something failed on the server side. + The URL provided is not a DHIS2 server. + The username or password are incorrect + Unknown server + Error while parsing results + Something unexpected went worng. + Your user has more than one root organisation units. Review your configuration or contact your admin. + Online results exceed the maximum number of tracker instances that can be shown. Please refine your search. + The server is a bit busy at this moment. Please try a bit later. + The user is already logged in. + The request has already been executed. + Server request is invalid. + The application name has not been set. + The application version has not been set. + Unable to access device keystore. + Creation aborted. The object already exists. + Deletion aborted. The object does not exist. + Unable to instantiate keystore. + We couldn´t reserve values for these record. Please contact your admin. + Please login to export the database. + Exporting an encrypted database is not supported. + You are importing an already existing database. + Please logout to import a new database. + The version of the imported database is higher than supported. + The file has not been found. + There was an error resizing the image. + It is not possible to generate coordinates. + Job report not available. + You might be running low on available values. + There is no user authenticated. + There is no user authenticated offline. + There are not enough values to reserve on the server. Please conctact your admin. + You are trying to login offline with a different user. + The geometry value is invalid. + There are no reserved values available. Go to settings and refill values when you have internet connection. + The object could not be updated. + The object could not be inserted. + You don\'t have access. + The server URL is missing. Please enter URL. + The server URL is not well formed. Please check it. + This version of the Settings Web App is not supported. + The Settings Web App is not installed in the server. + The server took too much time to respond. We canceled the request. + The relationship can\'t be updated. + There are too many periods. + We couldn´t find the URL. Please verify it. + Your user account have been disabled. If this is an error, contact your administrator. + Your user account is locked. If this is an error, contact your administrator. + The value could not be set. + The request to reserve values has taken too much time. Please retry. + There is a problem with the server certificates. Please, contact your administrator. + SMS is not supported. + There are not enough attributes to perform the search. Please refine your search with more attributes. + Online search is only available for your user search organisation units. + There are invalid characters in the query. Please ask the administrator to verify the server configuration (relaxedQueryChars,...). + The server is currently unavailable. Try again later. + You are offline. Connect to the internet and try again. + Add Image + Add file + Keep editing + Not now + Review + Complete + Discard changes + Open with + + %s data + Database import failed + Invalid file + Not in TOTP 2FA enrollment mode + + diff --git a/commons/src/main/res/values-hi-rIN/strings.xml b/commons/src/main/res/values-hi-rIN/strings.xml index 15dd7b04465..af792346c7c 100644 --- a/commons/src/main/res/values-hi-rIN/strings.xml +++ b/commons/src/main/res/values-hi-rIN/strings.xml @@ -8,6 +8,7 @@ नहीं सर्च करें / खोजें इवेंट्स + डेटा सेट्स पूरा हुआ तारीख @@ -22,9 +23,12 @@ आज कल (बिता हुआ) + इस सप्ताह + पिछला सप्ताह इस महीने पिछला महीना इस वर्ष + पिछली तिमाही पिछला वर्ष रोज़ाना साप्ताहिक diff --git a/commons/src/main/res/values-pt-rBR/strings.xml b/commons/src/main/res/values-pt-rBR/strings.xml index 29debb34bfb..4aa6983ff14 100644 --- a/commons/src/main/res/values-pt-rBR/strings.xml +++ b/commons/src/main/res/values-pt-rBR/strings.xml @@ -74,4 +74,5 @@ Semana Mês Ano + Limpar tudo diff --git a/commons/src/main/res/values-uk/strings.xml b/commons/src/main/res/values-uk/strings.xml index 9d3be7fc57f..e6cafb5a74f 100644 --- a/commons/src/main/res/values-uk/strings.xml +++ b/commons/src/main/res/values-uk/strings.xml @@ -264,4 +264,5 @@ Щодня Тиждень Рік - + Очистити все + diff --git a/commons/src/main/res/values-vi/strings.xml b/commons/src/main/res/values-vi/strings.xml index b8f0ab5403d..d5d27531d7b 100644 --- a/commons/src/main/res/values-vi/strings.xml +++ b/commons/src/main/res/values-vi/strings.xml @@ -271,5 +271,6 @@ Nhập cơ sở dữ liệu không thành công Tệp không hợp lệ Không ở chế độ đăng ký TOTP 2FA + Xóa tất cả diff --git a/commons/src/main/res/values-zh/strings.xml b/commons/src/main/res/values-zh/strings.xml index 296cd3050b1..51340ad9ab1 100644 --- a/commons/src/main/res/values-zh/strings.xml +++ b/commons/src/main/res/values-zh/strings.xml @@ -332,5 +332,6 @@ 数据库导入失败 无效文件 未进入 TOTP 2FA 注册模式 + 全清除 diff --git a/commonskmm/src/commonMain/composeResources/values-cs/strings.xml b/commonskmm/src/commonMain/composeResources/values-cs/strings.xml index f96dfc25db0..5e8d38ae346 100644 --- a/commonskmm/src/commonMain/composeResources/values-cs/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-cs/strings.xml @@ -206,6 +206,7 @@ Import databáze se nezdařil Neplatný soubor Není v režimu registrace TOTP 2FA + Ověřování zrušeno diff --git a/commonskmm/src/commonMain/composeResources/values-en-rUS/strings.xml b/commonskmm/src/commonMain/composeResources/values-en-rUS/strings.xml new file mode 100644 index 00000000000..cd5583d93ef --- /dev/null +++ b/commonskmm/src/commonMain/composeResources/values-en-rUS/strings.xml @@ -0,0 +1,214 @@ + + + Only values from 0 to 100 are allowed + Please review this field + Formatting error + Only positive numbers are allowed + This is not a valid phone number + This is not a valid email + Only negative numbers are allowed + Only positive numbers or zero allowed + Only values from 0 to 1 are allowed + This is not a valid url + Value must be an integer + It is not a correct format. + The configured pattern %s is wrong. + This field could not be updated. Please try again + Error + The value should be unique, a coincidence has been found. It has not been saved. Please check it. + Select time + Choose date + Choose organisation unit + Program rule %s is trying to assign value %s which does not belongs to option set %s + Value for field %s does not belong to the option set in %s + This field is mandatory + You have some warning messages. + You have some warning messages.\nDo you want to mark this form as complete? + Required + Date + Years + Months + Days + %s can\'t be parsed as a date + Polygon + Latitude + Longitude + Coordinates values are not valid + Polygon captured + Enter value + Enter url + Enter email + Enter phone number + Enter positive integer or zero + Enter negative integer + Enter positive integer + Enter number + Enter percentage + Enter number from 0 to 1 + Enter letter + Enter long text + Enter text + Due date + Mandatory field + Lat: + Long: + Not saved + Review + Complete + Discard changes + Saved! + You have some error messages.\nDo you want to review them? + Some fields have errors and they are not saved. \nDo you want to review the form? + Some fields need your attention.\nDo you want to review the form? + Not now + Save anyway + Keep editing + Do you want to mark this form as complete? + If you exit now all the information in the form will be discarded. + Some fields have errors and they are not saved. \nIf you exit now the changes will be discarded. + Some fields have errors and they are not saved. + Some mandatory fields are missing and the form cannot be saved. + Some mandatory fields are missing and the form cannot be saved. \nIf you exit now the changes will be discarded. + Share + Camera permission is denied.\nYou need to enable it to use this feature. + Close + Program rules warning + There is a configuration issue causing a loop in the rules. Contact you administrator. + Copied + No info for this field + Take Photo + From gallery + Check this! + Do not show again + the provided value is not allowed for this field + Invalid character 0 + Invalid character 1 + Value is neither true or false + This date format is not valid + This date and time format is not valid + This time format is not valid + The value is empty + The value contains more than one letter + The value is not a letter + The text is too long + Value is neither true or false + This field can only be true + Invalid character 1 + DataValues can\'t be saved using these arguments. Use the other one. + Leading zero numbers are not allowed + Couldn\'t retrieve data + Attributes - %s + Coordinates for the + There are no more reserved values. Contact your system administrator + Incident date + The location permission is needed for capturing coordinates. Please, enable them in the application settings + Open with + No option found + Download + Scan + QR code + Bar code + Add location + This form has no fields configured + %s details + %s data + Org unit + Coordinates + Category Combo + No options available + Cat combo + Storage permission is not granted.\nYou need to enable it to use this feature. + yes + no + Re-open form to edit + Date of birth + Age + or + Accept + Cancel + Latitude + Longitude + Add location + Out of range + Incorrect format + Add file + Add Image + Add from Gallery + No results found + Search to find more + Done + Not supported + + Password is missing. Please enter password. + Username is missing. Please enter username. + This server is running a dhis version different than 2.29. Update your server version or use the testing environment to proceed. + This server is running a DHIS2 version different than %s. Update your server version or contact your admin. + Something went wrong. Please check that server URL, username and password are correct and try again. + Sorry! Something failed on the server side. + The URL provided is not a DHIS2 server. + The username or password are incorrect + Unknown server + Error while parsing results + Something unexpected went worng. + Your user has more than one root organisation units. Review your configuration or contact your admin. + Online results exceed the maximum number of tracker instances that can be shown. Please refine your search. + The server is a bit busy at this moment. Please try a bit later. + The user is already logged in. + The request has already been executed. + Server request is invalid. + The application name has not been set. + The application version has not been set. + Unable to access device keystore. + Creation aborted. The object already exists. + Deletion aborted. The object does not exist. + Unable to instantiate keystore. + We couldn´t reserve values for these record. Please contact your admin. + Please login to export the database. + Exporting an encrypted database is not supported. + You are importing an already existing database. + Please logout to import a new database. + The version of the imported database is higher than supported. + The file has not been found. + There was an error resizing the image. + It is not possible to generate coordinates. + Job report not available. + You might be running low on available values. + There is no user authenticated. + There is no user authenticated offline. + There are not enough values to reserve on the server. Please conctact your admin. + You are trying to login offline with a different user. + The geometry value is invalid. + There are no reserved values available. Go to settings and refill values when you have internet connection. + The object could not be updated. + The object could not be inserted. + You don\'t have access. + The server URL is missing. Please enter URL. + The server URL is not well formed. Please check it. + This version of the Settings Web App is not supported. + The Settings Web App is not installed in the server. + The server took too much time to respond. We canceled the request. + The relationship can\'t be updated. + There are too many periods. + We couldn´t find the URL. Please verify it. + Your user account have been disabled. If this is an error, contact your administrator. + Your user account is locked. If this is an error, contact your administrator. + The value could not be set. + The request to reserve values has taken too much time. Please retry. + There is a problem with the server certificates. Please, contact your administrator. + SMS is not supported. + There are not enough attributes to perform the search. Please refine your search with more attributes. + Online search is only available for your user search organisation units. + There are invalid characters in the query. Please ask the administrator to verify the server configuration (relaxedQueryChars,...). + The server is currently unavailable. Try again later. + You are offline. Connect to the internet and try again. + Database import failed + Invalid file + Not in TOTP 2FA enrollment mode + Authentication cancelled + + + \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-es/strings.xml b/commonskmm/src/commonMain/composeResources/values-es/strings.xml index 20aedf80ee6..b9adfd39b39 100644 --- a/commonskmm/src/commonMain/composeResources/values-es/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-es/strings.xml @@ -63,7 +63,7 @@ Ahora no Guardar de todos modos Seguir editando - ¿Desea marcar este formulario como completo? + ¿Desea marcar este formulario como completo\? Si sale toda la información del formulario será descartada. Algunos campos presentan errores y no se han guardado.\nSi sales ahora, los cambios se descartarán. Algunos campos tienen errores y no serán guardados. @@ -202,6 +202,8 @@ La consulta contiene caracteres inválidos. Por favor contacte a su administrador para verificar la configuración del servidor (relaxedQueryChars,...). El servidor no está disponible actualmente. Vuelve a intentarlo más tarde. Estas desconectado. Conéctese a Internet e inténtelo nuevamente. + Importación de la base de datos fallida + Archivo no válido diff --git a/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml b/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml index ec4f6b15d7c..4f43e662b4e 100644 --- a/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml @@ -1,10 +1,25 @@ - त्रुटि + केवल 0 से 100 के वैल्यूज़ अनुमति हैं + कृपया इस फ़ील्ड की रिव्यू करें + केवल पॉजिटिव संख्या ही अनुमति है + यह मान्य फ़ोन नंबर नहीं है + यह मान्य ईमेल नहीं है + केवल नेगेटिव संख्या ही अनुमति है + केवल शून्य या पॉजिटिव संख्या ही अनुमति है + केवल 0 से 1 के मान ही अनुमति हैं + यह मान्य URL नहीं है + एरर्स + समय चुनें + दिन चुनें आवश्यकता है + तारीख + वर्ष + महीने दिन रिव्यू पूरा हुआ + सेव अभी नहीं सेव करें संपादन करते रहें diff --git a/commonskmm/src/commonMain/composeResources/values-zh/strings.xml b/commonskmm/src/commonMain/composeResources/values-zh/strings.xml index 9bcc998280b..fb0c24ba6bc 100644 --- a/commonskmm/src/commonMain/composeResources/values-zh/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-zh/strings.xml @@ -206,6 +206,7 @@ 数据库导入失败 无效文件 未进入 TOTP 2FA 注册模式 + 认证取消 diff --git a/compose-table/src/main/res/values-en-rUS/strings.xml b/compose-table/src/main/res/values-en-rUS/strings.xml new file mode 100644 index 00000000000..22be4f21d21 --- /dev/null +++ b/compose-table/src/main/res/values-en-rUS/strings.xml @@ -0,0 +1,4 @@ + + + Accept + \ No newline at end of file diff --git a/dhis_android_analytics/src/main/res/values-en-rUS/strings.xml b/dhis_android_analytics/src/main/res/values-en-rUS/strings.xml new file mode 100644 index 00000000000..40df7fe8191 --- /dev/null +++ b/dhis_android_analytics/src/main/res/values-en-rUS/strings.xml @@ -0,0 +1,4 @@ + + + Accept + \ No newline at end of file diff --git a/form/src/main/res/values-en-rUS/strings.xml b/form/src/main/res/values-en-rUS/strings.xml new file mode 100644 index 00000000000..f7bc8b9bbd7 --- /dev/null +++ b/form/src/main/res/values-en-rUS/strings.xml @@ -0,0 +1,93 @@ + + + This field could not be updated. Please try again + Error + The value should be unique, a coincidence has been found. It has not been saved. Please check it. + Select time + Choose date + Choose organisation unit + Program rule %s is trying to assign value %s which does not belongs to option set %s + Value for field %s does not belong to the option set in %s + This field is mandatory + You have some warning messages. + You have some warning messages.\nDo you want to mark this form as complete? + Required + Date + Years + Months + Days + %s can\'t be parsed as a date + Polygon + Latitude + Longitude + Coordinates values are not valid + Polygon captured + Enter value + Enter url + Enter email + Enter phone number + Enter positive integer or zero + Enter negative integer + Enter positive integer + Enter number + Enter percentage + Enter number from 0 to 1 + Enter letter + Enter long text + Enter text + Due date + Mandatory field + Lat: + Long: + Not saved + Review + Complete + Discard changes + Saved! + You have some error messages.\nDo you want to review them? + Some fields have errors and they are not saved. \nDo you want to review the form? + Some fields need your attention.\nDo you want to review the form? + Not now + Save anyway + Keep editing + Do you want to mark this form as complete? + If you exit now all the information in the form will be discarded. + Some fields have errors and they are not saved. \nIf you exit now the changes will be discarded. + Some fields have errors and they are not saved. + Some mandatory fields are missing and the form cannot be saved. + Some mandatory fields are missing and the form cannot be saved. \nIf you exit now the changes will be discarded. + Share + Camera permission is denied.\nYou need to enable it to use this feature. + Close + Program rules warning + There is a configuration issue causing a loop in the rules. Contact you administrator. + Copied + No info for this field + Take Photo + From gallery + Check this! + Do not show again + DataValues can\'t be saved using these arguments. Use the other one. + Attributes - %s + Coordinates for the + There are no more reserved values. Contact your system administrator + Incident date + The location permission is needed for capturing coordinates. Please, enable them in the application settings + Open with + No option found + Download + Scan + QR code + Bar code + Add location + This form has no fields configured + %s details + %s data + Org unit + Coordinates + Category Combo + No options available + Cat combo + Storage permission is not granted.\nYou need to enable it to use this feature. + Couldn\'t retrieve data + \ No newline at end of file diff --git a/form/src/main/res/values-hi-rIN/strings.xml b/form/src/main/res/values-hi-rIN/strings.xml index 3d8474ea231..3058e1e0ae8 100644 --- a/form/src/main/res/values-hi-rIN/strings.xml +++ b/form/src/main/res/values-hi-rIN/strings.xml @@ -1,6 +1,8 @@ त्रुटि + समय चुनें + दिन चुनें आवश्यकता है तारीख वर्ष @@ -8,6 +10,7 @@ दिन रिव्यू पूरा हुआ + सेव अभी नहीं सेव करें संपादन करते रहें diff --git a/login/src/commonMain/composeResources/values-cs/strings.xml b/login/src/commonMain/composeResources/values-cs/strings.xml index 5ceb89a7371..2598d71c8c1 100644 --- a/login/src/commonMain/composeResources/values-cs/strings.xml +++ b/login/src/commonMain/composeResources/values-cs/strings.xml @@ -1,21 +1,70 @@ + Přidat nový účet Dvoufaktorové ověřování + Nelze se připojit k síti + K zapnutí nebo vypnutí dvoufaktorového ověřování potřebujete připojení k internetu. + Zkuste se znovu připojit + Kontrola stavu... + Dvoufaktorové ověřování je vypnuté + Zapnutí dvoufaktorového ověřování + 1. + Chcete-li povolit dvoufaktorové ověřování, ujistěte se, že máte v zařízení nainstalovanou aplikaci autentizátoru. Doporučujeme Google Authenticator, ale můžete použít jakoukoli aplikaci kompatibilní s TOTP. + 2. + Propojte aplikaci autentizátoru pomocí tohoto konfiguračního klíče v aplikaci autentizátoru. + 3. + Níže zadejte kód z aplikace autentizátoru. + Aplikace Google Authenticator Ověřovací kód + Nepodařilo se zapnout dvoufaktorové ověřování + Zapnout + Zapnutí... + Zpět na nastavení Další + Navázání spojení... + Ke kterému serveru se chcete připojit? + URL serveru Je zapnuté dvoufaktorové ověřování. + Vypnutí dvoufaktorového ověřování + Chcete-li vypnout dvoufaktorové ověřování, otevřete aplikaci Authenticator. + Níže zadejte kód z aplikace autentizátoru. Ověřovací kód + Vypnout + Vypnutí... + Nepodařilo se vypnout dvoufaktorové ověřování. + Není platná URL serveru Rychlé přihlášení Chcete se přihlásit pomocí otisku prstu nebo jiné biometrické metody? + Pověření již byla uložena + Pověření nebyla uložena Uživatelské jméno Heslo Přihlášování... Přihlášení + Obnovení účtu Nebo + Přihlášení pomocí openID + Správa účtů Chcete nám pomoci vylepšit tuto aplikaci? + Pokud řeknete ano, aplikace bude odesílat anonymní statistiky a protokoly o chybách, které nám pomáhají zlepšovat uživatelský komfort a výkon. + Další podrobnosti naleznete v našem Zásady ochrany osobních údajů Teď ne Ano + Vytvoření kódu PIN + Nastavte si kód PIN pro rychlý přístup k aplikaci v režimu offline. + Vytvořit kód PIN + Zadejte svůj kód PIN + Pro přístup k účtu zadejte čtyřmístný kód PIN. Odemknout + Zapomněli jste kód PIN? + Nesprávný kód PIN + Není nakonfigurován žádný kód PIN + Nepodařilo se uložit kód PIN + Nepodařilo se resetovat kód PIN + %1$s zbývající pokusy + Importovat databázi Import byl úspěšný - \ No newline at end of file + Přihlášení bylo zrušeno + Neplatný výsledek autorizace + \ No newline at end of file diff --git a/login/src/commonMain/composeResources/values-en-rUS/strings.xml b/login/src/commonMain/composeResources/values-en-rUS/strings.xml new file mode 100644 index 00000000000..3b3f80dc158 --- /dev/null +++ b/login/src/commonMain/composeResources/values-en-rUS/strings.xml @@ -0,0 +1,4 @@ + + + Not now + \ No newline at end of file diff --git a/login/src/commonMain/composeResources/values-es/strings.xml b/login/src/commonMain/composeResources/values-es/strings.xml index 9802bb43fa3..6d7a8e7a334 100644 --- a/login/src/commonMain/composeResources/values-es/strings.xml +++ b/login/src/commonMain/composeResources/values-es/strings.xml @@ -1,17 +1,22 @@ + Añadir una cuenta nueva Autenticación de dos factores Siguiente + Estableciendo conexión... La autenticación de dos factores está activada. Acceso rápido ¿Te gustaría usar tu huella o algún otro método biométrico para acceder? Nombre de usuario Contraseña + Iniciando sesión + Iniciar sesión O ¿Desea ayudarnos a mejorar esta aplicación? política de privacidad Ahora no Desbloquear + Importar base de datos Importado con éxito \ No newline at end of file diff --git a/login/src/commonMain/composeResources/values-zh/strings.xml b/login/src/commonMain/composeResources/values-zh/strings.xml index cf3bb6de0fe..034612438d4 100644 --- a/login/src/commonMain/composeResources/values-zh/strings.xml +++ b/login/src/commonMain/composeResources/values-zh/strings.xml @@ -1,21 +1,70 @@ + 添加新账户 双重身份验证 + 无法连接网络 + 您需要连接互联网才能打开或关闭双因素身份验证。 + 尝试重新连接 + 检查状态... + 双因素验证已关闭 + 开启双因素身份验证 + 1. + 要启用双因素身份验证,请确保您的设备上安装了身份验证程序。我们推荐使用 Google Authenticator,但您也可以使用任何兼容 TOTP 的应用程序。 + 2. + 使用认证程序上的配置密钥链接认证程序。 + 3. + 在下方输入验证程序中的代码。 + 谷歌身份验证应用程序 验证码 + 双因素身份验证开启失败 + 打开 + 打开... + 返回设置 下一步 + 建立连接... + 您想连接哪个服务器? + 服务器 URL 双因素身份验证已开启。 + 关闭双因素身份验证 + 要禁用双因素身份验证,请打开身份验证程序。 + 在下方输入验证程序中的代码。 验证码 + 关闭 + 关闭... + 未关闭双因素身份验证。 + 不是有效的服务器 URL 快速登录 您想使用指纹或其他生物识别方法登录吗? + 已保存证书 + 证书未保存 用户名 口令 登录... 登录 + 恢复账户 + 使用 openID 登录 + 管理账户 你想帮助我们改进这个应用程序吗? + 如果您同意,应用程序将发送匿名统计数据和错误日志,帮助我们改善用户体验和性能。 + 更多详情,请参阅我们的 隐私政策 现在不要 + 创建密码 + 设置 PIN 码,以便快速离线访问应用程序。 + 创建密码 + 输入密码 + 输入您的 4 位数字 PIN 码访问您的账户。 解锁 + 忘记密码? + 密码不正确 + 未配置密码 + 密码保存失败 + 重置密码失败 + %1$s 剩余尝试次数 + 导入数据库 导入成功 - \ No newline at end of file + 登录被取消 + 授权结果无效 + \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-en-rUS/strings.xml b/stock-usecase/src/main/res/values-en-rUS/strings.xml new file mode 100644 index 00000000000..1765a6d8fde --- /dev/null +++ b/stock-usecase/src/main/res/values-en-rUS/strings.xml @@ -0,0 +1,39 @@ + + Review + Review + + Cancel + + Something went wrong. Please check that server URL, username and password are correct and try again. + Unknown server + Error while parsing results + The server is a bit busy at this moment. Please try a bit later. + The user is already logged in. + The request has already been executed. + Server request is invalid. + Creation aborted. The object already exists. + Please login to export the database. + Exporting an encrypted database is not supported. + You are importing an already existing database. + Please logout to import a new database. + The version of the imported database is higher than supported. + There is no user authenticated. + There is no user authenticated offline. + You are trying to login offline with a different user. + The object could not be updated. + The object could not be inserted. + The server URL is missing. Please enter URL. + The server URL is not well formed. Please check it. + This version of the Settings Web App is not supported. + The Settings Web App is not installed in the server. + The server took too much time to respond. We canceled the request. + We couldn´t find the URL. Please verify it. + Your user account have been disabled. If this is an error, contact your administrator. + Your user account is locked. If this is an error, contact your administrator. + The value could not be set. + There is a problem with the server certificates. Please, contact your administrator. + Not saved + Formatting error + Only positive numbers or zero allowed + Leading zero numbers are not allowed + \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-hi-rIN/strings.xml b/stock-usecase/src/main/res/values-hi-rIN/strings.xml index 37b99cfa15d..d5eb4cb7ee3 100644 --- a/stock-usecase/src/main/res/values-hi-rIN/strings.xml +++ b/stock-usecase/src/main/res/values-hi-rIN/strings.xml @@ -12,4 +12,5 @@ भाषा सर्च करें / खोजें वापस जाएँ + केवल शून्य या पॉजिटिव संख्या ही अनुमति है \ No newline at end of file diff --git a/sync/src/commonMain/composeResources/values-am/strings.xml b/sync/src/commonMain/composeResources/values-am/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-am/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-ar-rEG/strings.xml b/sync/src/commonMain/composeResources/values-ar-rEG/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-ar-rEG/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-ar-rIQ/strings.xml b/sync/src/commonMain/composeResources/values-ar-rIQ/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-ar-rIQ/strings.xml +++ b/sync/src/commonMain/composeResources/values-ar-rIQ/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-ar-rSD/strings.xml b/sync/src/commonMain/composeResources/values-ar-rSD/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-ar-rSD/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-ar/strings.xml b/sync/src/commonMain/composeResources/values-ar/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-ar/strings.xml +++ b/sync/src/commonMain/composeResources/values-ar/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-bn/strings.xml b/sync/src/commonMain/composeResources/values-bn/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-bn/strings.xml +++ b/sync/src/commonMain/composeResources/values-bn/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-ckb/strings.xml b/sync/src/commonMain/composeResources/values-ckb/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-ckb/strings.xml +++ b/sync/src/commonMain/composeResources/values-ckb/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-cs/strings.xml b/sync/src/commonMain/composeResources/values-cs/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-cs/strings.xml +++ b/sync/src/commonMain/composeResources/values-cs/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-da/strings.xml b/sync/src/commonMain/composeResources/values-da/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-da/strings.xml +++ b/sync/src/commonMain/composeResources/values-da/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-en-rUS/strings.xml b/sync/src/commonMain/composeResources/values-en-rUS/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-en-rUS/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-es-rES/strings.xml b/sync/src/commonMain/composeResources/values-es-rES/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-es-rES/strings.xml +++ b/sync/src/commonMain/composeResources/values-es-rES/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-es-rUS/strings.xml b/sync/src/commonMain/composeResources/values-es-rUS/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-es-rUS/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-es/strings.xml b/sync/src/commonMain/composeResources/values-es/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-es/strings.xml +++ b/sync/src/commonMain/composeResources/values-es/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-fi/strings.xml b/sync/src/commonMain/composeResources/values-fi/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-fi/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-fr/strings.xml b/sync/src/commonMain/composeResources/values-fr/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-fr/strings.xml +++ b/sync/src/commonMain/composeResources/values-fr/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-fur/strings.xml b/sync/src/commonMain/composeResources/values-fur/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-fur/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-hi-rIN/strings.xml b/sync/src/commonMain/composeResources/values-hi-rIN/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-hi-rIN/strings.xml +++ b/sync/src/commonMain/composeResources/values-hi-rIN/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-id/strings.xml b/sync/src/commonMain/composeResources/values-id/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-id/strings.xml +++ b/sync/src/commonMain/composeResources/values-id/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-it/strings.xml b/sync/src/commonMain/composeResources/values-it/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-it/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-ka/strings.xml b/sync/src/commonMain/composeResources/values-ka/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-ka/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-km/strings.xml b/sync/src/commonMain/composeResources/values-km/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-km/strings.xml +++ b/sync/src/commonMain/composeResources/values-km/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-ko-rKR/strings.xml b/sync/src/commonMain/composeResources/values-ko-rKR/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-ko-rKR/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-ko/strings.xml b/sync/src/commonMain/composeResources/values-ko/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-ko/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-ku/strings.xml b/sync/src/commonMain/composeResources/values-ku/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-ku/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-ky/strings.xml b/sync/src/commonMain/composeResources/values-ky/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-ky/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-ln/strings.xml b/sync/src/commonMain/composeResources/values-ln/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-ln/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-lo/strings.xml b/sync/src/commonMain/composeResources/values-lo/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-lo/strings.xml +++ b/sync/src/commonMain/composeResources/values-lo/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-mk/strings.xml b/sync/src/commonMain/composeResources/values-mk/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-mk/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-ml/strings.xml b/sync/src/commonMain/composeResources/values-ml/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-ml/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-mn/strings.xml b/sync/src/commonMain/composeResources/values-mn/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-mn/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-my/strings.xml b/sync/src/commonMain/composeResources/values-my/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-my/strings.xml +++ b/sync/src/commonMain/composeResources/values-my/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-nb/strings.xml b/sync/src/commonMain/composeResources/values-nb/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-nb/strings.xml +++ b/sync/src/commonMain/composeResources/values-nb/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-ne/strings.xml b/sync/src/commonMain/composeResources/values-ne/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-ne/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-nl/strings.xml b/sync/src/commonMain/composeResources/values-nl/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-nl/strings.xml +++ b/sync/src/commonMain/composeResources/values-nl/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-no/strings.xml b/sync/src/commonMain/composeResources/values-no/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-no/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-or/strings.xml b/sync/src/commonMain/composeResources/values-or/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-or/strings.xml +++ b/sync/src/commonMain/composeResources/values-or/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-pl/strings.xml b/sync/src/commonMain/composeResources/values-pl/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-pl/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-prs/strings.xml b/sync/src/commonMain/composeResources/values-prs/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-prs/strings.xml +++ b/sync/src/commonMain/composeResources/values-prs/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-ps/strings.xml b/sync/src/commonMain/composeResources/values-ps/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-ps/strings.xml +++ b/sync/src/commonMain/composeResources/values-ps/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-pt-rBR/strings.xml b/sync/src/commonMain/composeResources/values-pt-rBR/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-pt-rBR/strings.xml +++ b/sync/src/commonMain/composeResources/values-pt-rBR/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-pt/strings.xml b/sync/src/commonMain/composeResources/values-pt/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-pt/strings.xml +++ b/sync/src/commonMain/composeResources/values-pt/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-rn/strings.xml b/sync/src/commonMain/composeResources/values-rn/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-rn/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-ro/strings.xml b/sync/src/commonMain/composeResources/values-ro/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-ro/strings.xml +++ b/sync/src/commonMain/composeResources/values-ro/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-ru/strings.xml b/sync/src/commonMain/composeResources/values-ru/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-ru/strings.xml +++ b/sync/src/commonMain/composeResources/values-ru/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-rw/strings.xml b/sync/src/commonMain/composeResources/values-rw/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-rw/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-si/strings.xml b/sync/src/commonMain/composeResources/values-si/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-si/strings.xml +++ b/sync/src/commonMain/composeResources/values-si/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-sv/strings.xml b/sync/src/commonMain/composeResources/values-sv/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-sv/strings.xml +++ b/sync/src/commonMain/composeResources/values-sv/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-sw-rTZ/strings.xml b/sync/src/commonMain/composeResources/values-sw-rTZ/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-sw-rTZ/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-tet/strings.xml b/sync/src/commonMain/composeResources/values-tet/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-tet/strings.xml +++ b/sync/src/commonMain/composeResources/values-tet/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-tg/strings.xml b/sync/src/commonMain/composeResources/values-tg/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-tg/strings.xml +++ b/sync/src/commonMain/composeResources/values-tg/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-th/strings.xml b/sync/src/commonMain/composeResources/values-th/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-th/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-ti/strings.xml b/sync/src/commonMain/composeResources/values-ti/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-ti/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-tl/strings.xml b/sync/src/commonMain/composeResources/values-tl/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-tl/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-uk/strings.xml b/sync/src/commonMain/composeResources/values-uk/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-uk/strings.xml +++ b/sync/src/commonMain/composeResources/values-uk/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-ur/strings.xml b/sync/src/commonMain/composeResources/values-ur/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-ur/strings.xml +++ b/sync/src/commonMain/composeResources/values-ur/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-uz-rUZ/strings.xml b/sync/src/commonMain/composeResources/values-uz-rUZ/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-uz-rUZ/strings.xml +++ b/sync/src/commonMain/composeResources/values-uz-rUZ/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-uz/strings.xml b/sync/src/commonMain/composeResources/values-uz/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-uz/strings.xml +++ b/sync/src/commonMain/composeResources/values-uz/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-vi/strings.xml b/sync/src/commonMain/composeResources/values-vi/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-vi/strings.xml +++ b/sync/src/commonMain/composeResources/values-vi/strings.xml @@ -1,4 +1,5 @@ + diff --git a/sync/src/commonMain/composeResources/values-zh-rCN/strings.xml b/sync/src/commonMain/composeResources/values-zh-rCN/strings.xml index fde1d508bc0..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-zh-rCN/strings.xml +++ b/sync/src/commonMain/composeResources/values-zh-rCN/strings.xml @@ -1,5 +1,5 @@ + - diff --git a/sync/src/commonMain/composeResources/values-zh-rHK/strings.xml b/sync/src/commonMain/composeResources/values-zh-rHK/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-zh-rHK/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-zh/strings.xml b/sync/src/commonMain/composeResources/values-zh/strings.xml index d573f95216f..4c1c46011bd 100644 --- a/sync/src/commonMain/composeResources/values-zh/strings.xml +++ b/sync/src/commonMain/composeResources/values-zh/strings.xml @@ -1,4 +1,5 @@ + diff --git a/tracker/src/commonMain/composeResources/values-en-rUS/strings.xml b/tracker/src/commonMain/composeResources/values-en-rUS/strings.xml new file mode 100644 index 00000000000..b2079e4cc5a --- /dev/null +++ b/tracker/src/commonMain/composeResources/values-en-rUS/strings.xml @@ -0,0 +1,4 @@ + + + Cancel + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-hi-rIN/strings.xml b/tracker/src/commonMain/composeResources/values-hi-rIN/strings.xml index 643cbe46861..a91e87c5a30 100644 --- a/tracker/src/commonMain/composeResources/values-hi-rIN/strings.xml +++ b/tracker/src/commonMain/composeResources/values-hi-rIN/strings.xml @@ -1,8 +1,9 @@ + कोई डेटा नहीं और दिखाएँ कम दिखाएँ रद्द करें हटाएं सर्च करें / खोजें - \ No newline at end of file + \ No newline at end of file From af7ccdd4d634dff96bf6cda427fb8941f084d438 Mon Sep 17 00:00:00 2001 From: Xavier Molloy Date: Wed, 4 Feb 2026 08:19:33 +0100 Subject: [PATCH 039/260] chore: [ANDROAPP-7472] Update paging data (#4632) * chore: [ANDROAPP-7472] Update Paging data and dependency verification file * chore: [ANDROAPP-7472] Fix login without oath test * chore: [ANDROAPP-7472] remove duplicate dependency * chore: [ANDROAPP-7472] Use different compose paging version for tracker module * Revert "chore: [ANDROAPP-7472] Fix login without oath test" This reverts commit 7a4170a8664a3736594dc6f816002638d6367dfe. * chore: [ANDROAPP-7472] Use different compose paging version for tracker module * chore: [ANDROAPP-7472] Force compose animation version --- build.gradle.kts | 4 ++ gradle/libs.versions.toml | 4 +- gradle/verification-metadata.xml | 102 ++++++------------------------- 3 files changed, 23 insertions(+), 87 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 7b62571c3c3..0f749f4a086 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -59,6 +59,10 @@ allprojects { eachDependency { if (requested.group == "org.jacoco") useVersion("0.8.10") + // Force androidx.compose.animation to 1.9.5 to maintain compatibility with sharedElement API + if (requested.group == "androidx.compose.animation") { + useVersion("1.9.3") + } } } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1423b46e244..fb837ce38c9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -28,8 +28,8 @@ fragmentktx = "1.8.9" recyclerview = "1.4.0" compose = "1.9.5" composePluginVersion = "1.9.3" -composePaging = "3.3.6" -pagingTesting = "3.3.6" +composePaging = "3.4.0" +pagingTesting = "3.4.0" composeConstraintLayout = "1.1.1" activityCompose = "1.11.0" viewModelCompose = "2.9.4" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 6fa4869b326..5e475e877f2 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -585,6 +585,9 @@ + + + @@ -687,6 +690,9 @@ + + + @@ -809,6 +815,9 @@ + + + @@ -921,6 +930,9 @@ + + + @@ -1458,6 +1470,11 @@ + + + + + @@ -4046,14 +4063,6 @@ - - - - - - - - @@ -4078,14 +4087,6 @@ - - - - - - - - @@ -4094,14 +4095,6 @@ - - - - - - - - @@ -4142,14 +4135,6 @@ - - - - - - - - @@ -4166,14 +4151,6 @@ - - - - - - - - @@ -4190,14 +4167,6 @@ - - - - - - - - @@ -4206,14 +4175,6 @@ - - - - - - - - @@ -4246,14 +4207,6 @@ - - - - - - - - @@ -4270,14 +4223,6 @@ - - - - - - - - @@ -4294,14 +4239,6 @@ - - - - - - - - @@ -10367,11 +10304,6 @@ - - - - - From c0892d10a73c6ec367beb6ddf00c5e5bfbc67bae Mon Sep 17 00:00:00 2001 From: Marcos Campos Date: Wed, 4 Feb 2026 13:09:11 +0100 Subject: [PATCH 040/260] chore: [ANDROAPP-7483] Adapt app to changes caused by category combo refactor in updated android sdk [skip size] (#4633) * chore: [ANDROAPP-7484] adapt to ktor upgrade * chore: [ANDROAPP-7484] adapt to ktor upgrade * chore: [ANDROAPP-7465] fix sdk version * feat: [ANDROAPP-7472] I Clean up old search repository [skip size] I (#4622) * feat: [ANDROAPP-7472] Clean up old search repository * feat: [ANDROAPP-7472] Add Paging data and dependency verification * fix: [ANDROAPP-7472] fix compilation error * feat: [ANDROAPP-7472] fix unit test * feat: [ANDROAPP-7472] copilot review * fix: [ANDROAPP-7472] revert library update * fix: [ANDROAPP-7472] fix sonar code smells * chore: [ANDROAPP-7483] Add missing categoryCombo to DataElement builders in tests * chore: [ANDROAPP-7483] add categoryCombo to Program builders in tests * chore: [ANDROAPP-7483] update dhis2sdk lib version * chore: [ANDROAPP-7483] Add to list to deviceProviders * chore: [ANDROAPP-7483] KtlintFormat --------- Co-authored-by: danielTari Co-authored-by: Xavier Molloy --- .../dhis2/bindings/TEICardExtensionsTest.kt | 4 +- .../dhislogic/EnrollmentEventGeneratorTest.kt | 2 + .../dhis2/data/filter/FilterRepositoryTest.kt | 6 + .../data/forms/dataentry/ValueStoreTest.kt | 4 + .../sorting/SearchSortingValueSetterTest.kt | 3 + ...pCoordinateFieldToFeatureCollectionTest.kt | 4 + .../MapDataElementToFeatureTest.kt | 4 + .../EnrollmentFormRepositoryTest.kt | 2 + .../enrollment/EnrollmentPresenterImplTest.kt | 17 +- .../EventCaptureRepositoryImplTest.kt | 25 +- .../eventInitial/EventInitialPresenterTest.kt | 8 +- .../EventInitialRepositoryImplTest.kt | 1 + .../main/program/ProgramRepositoryImplTest.kt | 4 + .../usescases/notes/NotesRepositoryTest.kt | 2 + .../ProgramEventDetailPresenterTest.kt | 8 +- .../ProgramEventMapperTest.kt | 2 + .../searchTrackEntity/SearchRepositoryTest.kt | 23 +- .../SearchTEIViewModelTest.kt | 2 + .../SearchTEPresenterTest.kt | 5 + .../ui/mapper/TEICardMapperTest.kt | 3 + .../teiDashboard/TeiAttributesProviderTest.kt | 7 +- .../teiDashboard/TeiDashboardPresenterTest.kt | 14 +- .../TeiProgramListRepositoryImplTest.kt | 3 + .../ui/mapper/InfoBarMapperTest.kt | 3 + .../ui/mapper/TEIDetailMapperTest.kt | 3 + .../TrackedEntityInstanceInfoProviderTests.kt | 7 +- .../locationprovider/LocationProviderImpl.kt | 3 +- .../analytics/charts/ChartsRepositoryTest.kt | 4 +- .../org/dhis2/form/data/FormValueStoreTest.kt | 3 + gradle/libs.versions.toml | 2 +- gradle/verification-metadata.xml | 448 ++++++++++++++++++ .../android/rtsm/data/DataElementFactory.kt | 2 + .../android/rtsm/services/StockManagerTest.kt | 5 +- 33 files changed, 610 insertions(+), 23 deletions(-) diff --git a/app/src/test/java/org/dhis2/bindings/TEICardExtensionsTest.kt b/app/src/test/java/org/dhis2/bindings/TEICardExtensionsTest.kt index 6aa51739cbf..36e20959173 100644 --- a/app/src/test/java/org/dhis2/bindings/TEICardExtensionsTest.kt +++ b/app/src/test/java/org/dhis2/bindings/TEICardExtensionsTest.kt @@ -8,6 +8,7 @@ import org.dhis2.commons.resources.ColorUtils import org.dhis2.commons.resources.ResourceManager import org.dhis2.mobile.commons.model.MetadataIconData import org.hisp.dhis.android.core.common.ObjectStyle +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.program.Program import org.junit.Test import org.mockito.kotlin.any @@ -128,5 +129,6 @@ class TEICardExtensionsTest { .color("color") .icon("icon") .build(), - ).build() + ).categoryCombo(ObjectWithUid.create("categoryComboUid")) + .build() } diff --git a/app/src/test/java/org/dhis2/data/dhislogic/EnrollmentEventGeneratorTest.kt b/app/src/test/java/org/dhis2/data/dhislogic/EnrollmentEventGeneratorTest.kt index dff2410bd0c..5f1c85a5a64 100644 --- a/app/src/test/java/org/dhis2/data/dhislogic/EnrollmentEventGeneratorTest.kt +++ b/app/src/test/java/org/dhis2/data/dhislogic/EnrollmentEventGeneratorTest.kt @@ -1,6 +1,7 @@ package org.dhis2.data.dhislogic import org.dhis2.commons.Constants +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.period.PeriodType import org.hisp.dhis.android.core.program.Program @@ -170,6 +171,7 @@ class EnrollmentEventGeneratorTest { .builder() .uid(PROGRAM_UID) .useFirstStageDuringRegistration(useFirstStage) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build() private fun mockedAutogeneratedEvents( diff --git a/app/src/test/java/org/dhis2/data/filter/FilterRepositoryTest.kt b/app/src/test/java/org/dhis2/data/filter/FilterRepositoryTest.kt index fb4eb711151..ac6a58fa1b1 100644 --- a/app/src/test/java/org/dhis2/data/filter/FilterRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/data/filter/FilterRepositoryTest.kt @@ -18,6 +18,7 @@ import org.dhis2.commons.filters.workingLists.ProgramStageToWorkingListItemMappe import org.dhis2.commons.filters.workingLists.TeiFilterToWorkingListItemMapper import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.category.CategoryCombo +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.program.Program import org.hisp.dhis.android.core.settings.FilterSetting import org.hisp.dhis.android.core.settings.HomeFilter @@ -211,6 +212,7 @@ class FilterRepositoryTest { Program .builder() .uid("random") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .programType(org.hisp.dhis.android.core.program.ProgramType.WITH_REGISTRATION) .build() val catCombo = @@ -286,6 +288,7 @@ class FilterRepositoryTest { Program .builder() .uid("random") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .programType(org.hisp.dhis.android.core.program.ProgramType.WITH_REGISTRATION) .build() val catCombo = @@ -380,6 +383,7 @@ class FilterRepositoryTest { Program .builder() .uid("random") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .programType(org.hisp.dhis.android.core.program.ProgramType.WITH_REGISTRATION) .build() val catCombo = @@ -459,6 +463,7 @@ class FilterRepositoryTest { Program .builder() .uid("random") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .programType(org.hisp.dhis.android.core.program.ProgramType.WITH_REGISTRATION) .trackedEntityType( TrackedEntityType @@ -600,6 +605,7 @@ class FilterRepositoryTest { Program .builder() .uid("random") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .programType(org.hisp.dhis.android.core.program.ProgramType.WITH_REGISTRATION) .trackedEntityType( TrackedEntityType diff --git a/app/src/test/java/org/dhis2/data/forms/dataentry/ValueStoreTest.kt b/app/src/test/java/org/dhis2/data/forms/dataentry/ValueStoreTest.kt index d177b550eec..68189846a02 100644 --- a/app/src/test/java/org/dhis2/data/forms/dataentry/ValueStoreTest.kt +++ b/app/src/test/java/org/dhis2/data/forms/dataentry/ValueStoreTest.kt @@ -8,6 +8,7 @@ import org.dhis2.form.model.ValueStoreResult import org.dhis2.mobile.commons.providers.FieldErrorMessageProvider import org.dhis2.mobile.commons.reporting.CrashReportController import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.android.core.dataelement.DataElement import org.hisp.dhis.android.core.option.Option @@ -346,6 +347,7 @@ class ValueStoreTest { .builder() .uid("fieldUid") .valueType(ValueType.TEXT) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build() val storeResult = deValueStore.deleteOptionValueIfSelected( @@ -418,6 +420,7 @@ class ValueStoreTest { .builder() .uid(testingUid) .valueType(ValueType.TEXT) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build() whenever( d2 @@ -509,6 +512,7 @@ class ValueStoreTest { .builder() .uid("uid") .valueType(ValueType.TEXT) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build() private fun mockedUniqueAttribute(): TrackedEntityAttribute = diff --git a/app/src/test/java/org/dhis2/data/sorting/SearchSortingValueSetterTest.kt b/app/src/test/java/org/dhis2/data/sorting/SearchSortingValueSetterTest.kt index 36203ba359f..0c6a4a2aff4 100644 --- a/app/src/test/java/org/dhis2/data/sorting/SearchSortingValueSetterTest.kt +++ b/app/src/test/java/org/dhis2/data/sorting/SearchSortingValueSetterTest.kt @@ -7,6 +7,7 @@ import org.dhis2.data.enrollment.EnrollmentUiDataHelper import org.dhis2.usescases.searchTrackEntity.SearchTeiModel import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.arch.repositories.scope.RepositoryScope +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.enrollment.EnrollmentStatus import org.hisp.dhis.android.core.event.Event @@ -447,6 +448,7 @@ class SearchSortingValueSetterTest { Program .builder() .uid("programUid") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .enrollmentDateLabel("programEnrollmentDateLabel") .build() @@ -481,6 +483,7 @@ class SearchSortingValueSetterTest { Program .builder() .uid("programUid") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build() val result = diff --git a/app/src/test/java/org/dhis2/uicomponents/map/geometry/MapCoordinateFieldToFeatureCollectionTest.kt b/app/src/test/java/org/dhis2/uicomponents/map/geometry/MapCoordinateFieldToFeatureCollectionTest.kt index c63760f9c95..24c0aa71ddc 100644 --- a/app/src/test/java/org/dhis2/uicomponents/map/geometry/MapCoordinateFieldToFeatureCollectionTest.kt +++ b/app/src/test/java/org/dhis2/uicomponents/map/geometry/MapCoordinateFieldToFeatureCollectionTest.kt @@ -7,6 +7,7 @@ import org.dhis2.maps.utils.CoordinateAttributeInfo import org.dhis2.maps.utils.CoordinateDataElementInfo import org.hisp.dhis.android.core.common.FeatureType import org.hisp.dhis.android.core.common.Geometry +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.dataelement.DataElement import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.event.Event @@ -69,6 +70,7 @@ class MapCoordinateFieldToFeatureCollectionTest { .builder() .uid("deUid") .displayFormName("deName") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), Enrollment .builder() @@ -96,6 +98,7 @@ class MapCoordinateFieldToFeatureCollectionTest { .builder() .uid("de2Uid") .displayFormName("de2Name") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), Enrollment .builder() @@ -123,6 +126,7 @@ class MapCoordinateFieldToFeatureCollectionTest { .builder() .uid("deUid") .displayFormName("deName") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), Enrollment .builder() diff --git a/app/src/test/java/org/dhis2/uicomponents/map/geometry/mapper/featurecollection/MapDataElementToFeatureTest.kt b/app/src/test/java/org/dhis2/uicomponents/map/geometry/mapper/featurecollection/MapDataElementToFeatureTest.kt index 41076b5017b..109afa7ac23 100644 --- a/app/src/test/java/org/dhis2/uicomponents/map/geometry/mapper/featurecollection/MapDataElementToFeatureTest.kt +++ b/app/src/test/java/org/dhis2/uicomponents/map/geometry/mapper/featurecollection/MapDataElementToFeatureTest.kt @@ -6,6 +6,7 @@ import org.dhis2.maps.utils.CoordinateDataElementInfo import org.dhis2.uicomponents.map.geometry.MapEventToFeatureCollectionTest import org.hisp.dhis.android.core.common.FeatureType import org.hisp.dhis.android.core.common.Geometry +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.dataelement.DataElement import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.event.Event @@ -78,6 +79,7 @@ class MapDataElementToFeatureTest { .builder() .uid("deUid") .displayFormName("deName") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), Enrollment .builder() @@ -105,6 +107,7 @@ class MapDataElementToFeatureTest { .builder() .uid("de2Uid") .displayFormName("de2Name") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), Enrollment .builder() @@ -132,6 +135,7 @@ class MapDataElementToFeatureTest { .builder() .uid("deUid") .displayFormName("deName") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), Enrollment .builder() diff --git a/app/src/test/java/org/dhis2/usescases/enrollment/EnrollmentFormRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/enrollment/EnrollmentFormRepositoryTest.kt index 8b59fa59d37..cdbfe200d15 100644 --- a/app/src/test/java/org/dhis2/usescases/enrollment/EnrollmentFormRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/usescases/enrollment/EnrollmentFormRepositoryTest.kt @@ -3,6 +3,7 @@ package org.dhis2.usescases.enrollment import org.dhis2.data.dhislogic.DhisEnrollmentUtils import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.arch.repositories.`object`.ReadOnlyOneObjectRepositoryFinalImpl +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.enrollment.EnrollmentObjectRepository import org.hisp.dhis.android.core.enrollment.EnrollmentStatus @@ -35,6 +36,7 @@ class EnrollmentFormRepositoryTest { .builder() .uid("programUid") .displayName("programName") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build() whenever(enrollmentRepository.blockingGet()) doReturn Enrollment diff --git a/app/src/test/java/org/dhis2/usescases/enrollment/EnrollmentPresenterImplTest.kt b/app/src/test/java/org/dhis2/usescases/enrollment/EnrollmentPresenterImplTest.kt index 5b5233bf151..6ba88a9741e 100644 --- a/app/src/test/java/org/dhis2/usescases/enrollment/EnrollmentPresenterImplTest.kt +++ b/app/src/test/java/org/dhis2/usescases/enrollment/EnrollmentPresenterImplTest.kt @@ -15,6 +15,7 @@ import org.hisp.dhis.android.core.common.Access import org.hisp.dhis.android.core.common.DataAccess import org.hisp.dhis.android.core.common.FeatureType import org.hisp.dhis.android.core.common.Geometry +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.enrollment.EnrollmentAccess import org.hisp.dhis.android.core.enrollment.EnrollmentObjectRepository import org.hisp.dhis.android.core.enrollment.EnrollmentStatus @@ -73,6 +74,7 @@ class EnrollmentPresenterImplTest { Program .builder() .uid("") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .access( Access .builder() @@ -94,6 +96,7 @@ class EnrollmentPresenterImplTest { Program .builder() .uid("") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .access( Access .builder() @@ -161,7 +164,12 @@ class EnrollmentPresenterImplTest { .geometry(geometry) .uid("random") .build() - val program = Program.builder().uid("tUID").build() + val program = + Program + .builder() + .uid("tUID") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .build() whenever(teiRepository.blockingGet()) doReturn tei whenever(programRepository.blockingGet()) doReturn program @@ -193,7 +201,12 @@ class EnrollmentPresenterImplTest { .geometry(geometry) .uid("random") .build() - val program = Program.builder().uid("tUID").build() + val program = + Program + .builder() + .uid("tUID") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .build() whenever(teiRepository.blockingGet()) doReturn tei whenever(programRepository.blockingGet()) doReturn program diff --git a/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImplTest.kt b/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImplTest.kt index e79e8acf17a..263ca795f01 100644 --- a/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImplTest.kt +++ b/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImplTest.kt @@ -5,6 +5,7 @@ import io.reactivex.Single import org.dhis2.data.dhislogic.AUTH_ALL import org.dhis2.data.dhislogic.AUTH_UNCOMPLETE_EVENT import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.dataelement.DataElement import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.enrollment.EnrollmentStatus @@ -752,7 +753,11 @@ class EventCaptureRepositoryImplTest { .sortOrder(sectionOrderC) .dataElements( mutableListOf( - DataElement.builder().uid(sectionCDataElementA).build(), + DataElement + .builder() + .uid(sectionCDataElementA) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .build(), ), ).build(), ProgramStageSection @@ -762,8 +767,16 @@ class EventCaptureRepositoryImplTest { .sortOrder(sectionOrderB) .dataElements( mutableListOf( - DataElement.builder().uid(sectionBDataElementA).build(), - DataElement.builder().uid(sectionBDataElementB).build(), + DataElement + .builder() + .uid(sectionBDataElementA) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .build(), + DataElement + .builder() + .uid(sectionBDataElementB) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .build(), ), ).build(), ProgramStageSection @@ -773,7 +786,11 @@ class EventCaptureRepositoryImplTest { .sortOrder(sectionOrderA) .dataElements( mutableListOf( - DataElement.builder().uid(sectionADataElementA).build(), + DataElement + .builder() + .uid(sectionADataElementA) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .build(), ), ).build(), ) diff --git a/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialPresenterTest.kt index 0ba99a2cf04..6d1518444f3 100644 --- a/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialPresenterTest.kt @@ -12,6 +12,7 @@ import org.dhis2.usescases.eventsWithoutRegistration.eventCapture.EventFieldMapp import org.dhis2.utils.analytics.AnalyticsHelper import org.hisp.dhis.android.core.common.FeatureType import org.hisp.dhis.android.core.common.Geometry +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.event.Event import org.hisp.dhis.android.core.event.EventEditableStatus.Editable import org.hisp.dhis.android.core.event.EventEditableStatus.NonEditable @@ -364,7 +365,12 @@ class EventInitialPresenterTest { programStageUid: String?, moreOrgUnits: Boolean = false, ) { - val program = Program.builder().uid(uid).build() + val program = + Program + .builder() + .uid(uid) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .build() val orgUnits = mutableListOf( OrganisationUnit diff --git a/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialRepositoryImplTest.kt b/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialRepositoryImplTest.kt index 501f6b8559f..6e28218ae7c 100644 --- a/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialRepositoryImplTest.kt +++ b/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialRepositoryImplTest.kt @@ -259,6 +259,7 @@ class EventInitialRepositoryImplTest { Program .builder() .uid("programUid") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .access(Access.create(true, true, DataAccess.create(true, hasAccess))) .build() } diff --git a/app/src/test/java/org/dhis2/usescases/main/program/ProgramRepositoryImplTest.kt b/app/src/test/java/org/dhis2/usescases/main/program/ProgramRepositoryImplTest.kt index 8b86f26d761..bbbd457b33f 100644 --- a/app/src/test/java/org/dhis2/usescases/main/program/ProgramRepositoryImplTest.kt +++ b/app/src/test/java/org/dhis2/usescases/main/program/ProgramRepositoryImplTest.kt @@ -18,6 +18,7 @@ import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.common.Access import org.hisp.dhis.android.core.common.DataAccess import org.hisp.dhis.android.core.common.ObjectStyle +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.dataset.DataSet import org.hisp.dhis.android.core.dataset.DataSetInstanceSummary @@ -88,6 +89,7 @@ class ProgramRepositoryImplTest { .builder() .uid("dataSetUid") .description("description") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .style( ObjectStyle .builder() @@ -274,6 +276,7 @@ class ProgramRepositoryImplTest { .displayName("program1") .programType(ProgramType.WITHOUT_REGISTRATION) .style(ObjectStyle.builder().build()) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), Program .builder() @@ -281,6 +284,7 @@ class ProgramRepositoryImplTest { .displayName("program2") .programType(ProgramType.WITH_REGISTRATION) .style(ObjectStyle.builder().build()) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .trackedEntityType( TrackedEntityType .builder() diff --git a/app/src/test/java/org/dhis2/usescases/notes/NotesRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/notes/NotesRepositoryTest.kt index b931b2efaa0..1474e19945d 100644 --- a/app/src/test/java/org/dhis2/usescases/notes/NotesRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/usescases/notes/NotesRepositoryTest.kt @@ -4,6 +4,7 @@ import io.reactivex.Single import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.common.Access import org.hisp.dhis.android.core.common.DataAccess +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.note.Note import org.hisp.dhis.android.core.program.Program @@ -94,6 +95,7 @@ class NotesRepositoryTest { Program .builder() .uid(UUID.randomUUID().toString()) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .access( Access .builder() diff --git a/app/src/test/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailPresenterTest.kt index 494382f094c..a14db2e227f 100644 --- a/app/src/test/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailPresenterTest.kt @@ -15,6 +15,7 @@ import org.dhis2.commons.prefs.PreferenceProvider import org.dhis2.data.schedulers.TrampolineSchedulerProvider import org.hisp.dhis.android.core.category.CategoryCombo import org.hisp.dhis.android.core.category.CategoryOptionCombo +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.program.Program import org.junit.After import org.junit.Assert.assertTrue @@ -69,7 +70,12 @@ class ProgramEventDetailPresenterTest { @Test fun `Should init screen`() { - val program = Program.builder().uid("programUid").build() + val program = + Program + .builder() + .uid("programUid") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .build() whenever(repository.getAccessDataWrite()) doReturn true whenever(repository.program()) doReturn Single.just(program) diff --git a/app/src/test/java/org/dhis2/usescases/programEventDetail/ProgramEventMapperTest.kt b/app/src/test/java/org/dhis2/usescases/programEventDetail/ProgramEventMapperTest.kt index cb20610a333..d43e86829d3 100644 --- a/app/src/test/java/org/dhis2/usescases/programEventDetail/ProgramEventMapperTest.kt +++ b/app/src/test/java/org/dhis2/usescases/programEventDetail/ProgramEventMapperTest.kt @@ -7,6 +7,7 @@ import org.dhis2.mobile.commons.model.MetadataIconData import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.category.CategoryOptionCombo import org.hisp.dhis.android.core.common.ObjectStyle +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.event.Event import org.hisp.dhis.android.core.event.EventStatus @@ -226,6 +227,7 @@ class ProgramEventMapperTest { .uid("programUid") .completeEventsExpiryDays(0) .expiryDays(0) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build() private fun dummyCategoryOptionCombo() = diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryTest.kt index bf93de0c0ae..d3c83ec6b23 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryTest.kt @@ -25,6 +25,7 @@ import org.hisp.dhis.android.core.arch.repositories.filters.internal.BooleanFilt import org.hisp.dhis.android.core.arch.repositories.filters.internal.StringFilterConnector import org.hisp.dhis.android.core.arch.repositories.`object`.ReadOnlyOneObjectRepositoryFinalImpl import org.hisp.dhis.android.core.arch.repositories.scope.RepositoryScope +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.android.core.enrollment.Enrollment @@ -167,7 +168,12 @@ class SearchRepositoryTest { @Test fun shouldTransformToSearchTeiModelWithOverdueEvents() { val searchItem = getTrackedEntitySearchItem("header") - val program = Program.builder().uid("programUid").build() + val program = + Program + .builder() + .uid("programUid") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .build() val sorting = SortingItem.create(Filters.ENROLLMENT_DATE) val tei = TrackedEntitySearchItemHelper.toTrackedEntityInstance(searchItem) @@ -200,7 +206,12 @@ class SearchRepositoryTest { @Test fun shouldTransformToSearchTeiModelWithOverdueScheduledEvents() { val searchItem = getTrackedEntitySearchItem("header") - val program = Program.builder().uid("programUid").build() + val program = + Program + .builder() + .uid("programUid") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .build() val sorting = SortingItem.create(Filters.ENROLLMENT_DATE) val tei = TrackedEntitySearchItemHelper.toTrackedEntityInstance(searchItem) @@ -232,7 +243,12 @@ class SearchRepositoryTest { @Test fun shouldTransformToSearchTeiModelWithOutOverdueEvents() { val searchItem = getTrackedEntitySearchItem("header") - val program = Program.builder().uid("programUid").build() + val program = + Program + .builder() + .uid("programUid") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .build() val sorting = SortingItem.create(Filters.ENROLLMENT_DATE) val tei = TrackedEntitySearchItemHelper.toTrackedEntityInstance(searchItem) @@ -352,6 +368,7 @@ class SearchRepositoryTest { .builder() .uid(programUid) .displayFrontPageList(true) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build() // Mock setOverdueEvents diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt index c101623c935..bc25581f333 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt @@ -35,6 +35,7 @@ import org.dhis2.mobile.commons.model.CustomIntentModel import org.dhis2.tracker.ui.input.action.TrackerInputAction import org.dhis2.usescases.searchTrackEntity.listView.SearchResult.SearchResultType import org.dhis2.utils.customviews.navigationbar.NavigationPage +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.android.core.program.Program import org.hisp.dhis.android.core.trackedentity.TrackedEntityType @@ -1035,6 +1036,7 @@ class SearchTEIViewModelTest { .displayFrontPageList(displayFrontPageList) .minAttributesRequiredToSearch(minAttributesToSearch) .trackedEntityType(TrackedEntityType.builder().uid("teTypeUid").build()) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .apply { maxTeiCountToReturn?.let { maxTeiCountToReturn(maxTeiCountToReturn) diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEPresenterTest.kt index aaac8009b41..0de7cf852e4 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEPresenterTest.kt @@ -13,6 +13,7 @@ import org.dhis2.data.schedulers.TestSchedulerProvider import org.dhis2.data.service.SyncStatusController import org.dhis2.utils.analytics.AnalyticsHelper import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.program.Program import org.hisp.dhis.android.core.trackedentity.TrackedEntityType import org.junit.After @@ -58,6 +59,7 @@ class SearchTEPresenterTest { .uid(initialProgram) .displayFrontPageList(true) .minAttributesRequiredToSearch(0) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build() whenever( @@ -98,6 +100,7 @@ class SearchTEPresenterTest { .uid("uid") .displayFrontPageList(true) .minAttributesRequiredToSearch(1) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build() presenter.setProgramForTesting(program) @@ -115,6 +118,7 @@ class SearchTEPresenterTest { .uid("uid") .displayFrontPageList(true) .minAttributesRequiredToSearch(1) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build() val newSelectedProgram = @@ -123,6 +127,7 @@ class SearchTEPresenterTest { .uid("uid2") .displayFrontPageList(true) .minAttributesRequiredToSearch(1) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build() whenever( diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapperTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapperTest.kt index cd9dd6ffdfd..aff56c83073 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapperTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapperTest.kt @@ -7,6 +7,7 @@ import org.dhis2.commons.date.toDateSpan import org.dhis2.commons.date.toOverdueOrScheduledUiText import org.dhis2.commons.resources.ResourceManager import org.dhis2.usescases.searchTrackEntity.SearchTeiModel +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.enrollment.EnrollmentStatus @@ -143,6 +144,7 @@ class TEICardMapperTest { .builder() .uid("Program1Uid") .displayName("Program 1") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), null, ) @@ -151,6 +153,7 @@ class TEICardMapperTest { .builder() .uid("Program2Uid") .displayName("Program 2") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), null, ) diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiAttributesProviderTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiAttributesProviderTest.kt index 68e2e2c7c8a..bd0d4f4b8bb 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiAttributesProviderTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiAttributesProviderTest.kt @@ -267,7 +267,12 @@ class TeiAttributesProviderTest { .byTrackedEntityTypeUid() .eq(teType) .blockingGet()[0], - ) doReturn Program.builder().uid(program).build() + ) doReturn + Program + .builder() + .uid(program) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .build() whenever(d2.programModule().programTrackedEntityAttributes()) doReturn mock() whenever(d2.programModule().programTrackedEntityAttributes().byProgram()) doReturn mock() diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiDashboardPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiDashboardPresenterTest.kt index f727dbf0576..692004883f3 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiDashboardPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiDashboardPresenterTest.kt @@ -12,6 +12,7 @@ import org.dhis2.mobile.commons.model.MetadataIconData import org.dhis2.utils.analytics.AnalyticsHelper import org.dhis2.utils.analytics.CLICK import org.dhis2.utils.analytics.DELETE_TEI +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.enrollment.EnrollmentStatus import org.hisp.dhis.android.core.organisationunit.OrganisationUnit @@ -65,7 +66,12 @@ class TeiDashboardPresenterTest { @Test fun `Should set program and restore adapter`() { val programUid = "programUid" - val program = Program.builder().uid(programUid).build() + val program = + Program + .builder() + .uid(programUid) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .build() val trackedEntityInstance = TrackedEntityInstance.builder().uid(teiUid).build() val enrollment = Enrollment.builder().uid("enrollmentUid").build() val programStages = listOf(ProgramStage.builder().uid("programStageUid").build()) @@ -81,7 +87,11 @@ class TeiDashboardPresenterTest { val programs = listOf( Pair( - Program.builder().uid(programUid).build(), + Program + .builder() + .uid(programUid) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .build(), MetadataIconData.defaultIcon(), ), ) diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListRepositoryImplTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListRepositoryImplTest.kt index c10529a1bd4..d86bd361a7c 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListRepositoryImplTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListRepositoryImplTest.kt @@ -5,6 +5,7 @@ import org.dhis2.commons.date.DateUtils import org.dhis2.commons.resources.MetadataIconProvider import org.dhis2.usescases.main.program.ProgramViewModelMapper import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.enrollment.EnrollmentCreateProjection import org.hisp.dhis.android.core.program.Program @@ -61,6 +62,7 @@ class TeiProgramListRepositoryImplTest { .builder() .uid("programUid") .displayIncidentDate(true) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build() whenever( @@ -125,6 +127,7 @@ class TeiProgramListRepositoryImplTest { .builder() .uid("programUid") .displayIncidentDate(false) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build() whenever( diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/InfoBarMapperTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/InfoBarMapperTest.kt index b9224df9966..baddf218723 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/InfoBarMapperTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/InfoBarMapperTest.kt @@ -5,6 +5,7 @@ import org.dhis2.commons.resources.ResourceManager import org.dhis2.mobile.commons.model.MetadataIconData import org.dhis2.usescases.teiDashboard.DashboardEnrollmentModel import org.dhis2.usescases.teiDashboard.ui.model.InfoBarType +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.enrollment.EnrollmentStatus @@ -173,6 +174,7 @@ class InfoBarMapperTest { .builder() .uid("Program1Uid") .displayName("Program 1") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), MetadataIconData.defaultIcon(), ), @@ -181,6 +183,7 @@ class InfoBarMapperTest { .builder() .uid("Program2Uid") .displayName("Program 2") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), MetadataIconData.defaultIcon(), ), diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/TEIDetailMapperTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/TEIDetailMapperTest.kt index 93de79a22de..d30cd759fa9 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/TEIDetailMapperTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/TEIDetailMapperTest.kt @@ -4,6 +4,7 @@ import org.dhis2.R import org.dhis2.commons.resources.ResourceManager import org.dhis2.mobile.commons.model.MetadataIconData import org.dhis2.usescases.teiDashboard.DashboardEnrollmentModel +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.enrollment.EnrollmentStatus @@ -132,6 +133,7 @@ class TEIDetailMapperTest { .builder() .uid("Program1Uid") .displayName("Program 1") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), MetadataIconData.defaultIcon(), ), @@ -140,6 +142,7 @@ class TEIDetailMapperTest { .builder() .uid("Program2Uid") .displayName("Program 2") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), MetadataIconData.defaultIcon(), ), diff --git a/app/src/test/java/org/dhis2/usescases/tracker/TrackedEntityInstanceInfoProviderTests.kt b/app/src/test/java/org/dhis2/usescases/tracker/TrackedEntityInstanceInfoProviderTests.kt index 20b0453b82e..d0e9ed58c99 100644 --- a/app/src/test/java/org/dhis2/usescases/tracker/TrackedEntityInstanceInfoProviderTests.kt +++ b/app/src/test/java/org/dhis2/usescases/tracker/TrackedEntityInstanceInfoProviderTests.kt @@ -8,6 +8,7 @@ import org.dhis2.mobile.commons.model.MetadataIconData import org.dhis2.tracker.data.ProfilePictureProvider import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.common.ObjectStyle +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.program.Program import org.hisp.dhis.android.core.trackedentity.TrackedEntityInstance import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItem @@ -216,7 +217,11 @@ class TrackedEntityInstanceInfoProviderTests { .build() private fun mockProgram(hasStyle: Boolean = false): Program { - val program = Program.builder().uid("programUid") + val program = + Program + .builder() + .uid("programUid") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) if (hasStyle) { program.style( diff --git a/commons/src/main/java/org/dhis2/commons/locationprovider/LocationProviderImpl.kt b/commons/src/main/java/org/dhis2/commons/locationprovider/LocationProviderImpl.kt index 2959bc49df4..b924db56dde 100644 --- a/commons/src/main/java/org/dhis2/commons/locationprovider/LocationProviderImpl.kt +++ b/commons/src/main/java/org/dhis2/commons/locationprovider/LocationProviderImpl.kt @@ -10,7 +10,6 @@ import android.location.LocationListener import android.location.LocationManager import androidx.core.app.ActivityCompat import androidx.core.location.LocationListenerCompat -import okhttp3.internal.toImmutableList private const val FUSED_LOCATION_PROVIDER = "fused" @@ -69,7 +68,7 @@ open class LocationProviderImpl( onLocationProviderChanged() } } - val deviceProviders = locationManager.allProviders.toImmutableList() + val deviceProviders = locationManager.allProviders.toList() if (deviceProviders.contains(LocationManager.NETWORK_PROVIDER)) { locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, diff --git a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ChartsRepositoryTest.kt b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ChartsRepositoryTest.kt index adf8c8f65be..416e55b4a47 100644 --- a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ChartsRepositoryTest.kt +++ b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ChartsRepositoryTest.kt @@ -16,6 +16,7 @@ import org.hisp.dhis.android.core.analytics.AnalyticsException import org.hisp.dhis.android.core.analytics.aggregated.DimensionItem import org.hisp.dhis.android.core.analytics.aggregated.GridAnalyticsResponse import org.hisp.dhis.android.core.arch.helpers.Result +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.common.RelativeOrganisationUnit import org.hisp.dhis.android.core.common.RelativePeriod import org.hisp.dhis.android.core.common.ValueType @@ -676,6 +677,7 @@ class ChartsRepositoryTest { .builder() .uid("de_1") .valueType(ValueType.NUMBER) + .categoryCombo(ObjectWithUid.create("categoryOptionComboUid")) .build() whenever( d2 @@ -706,7 +708,7 @@ class ChartsRepositoryTest { ProgramStageDataElement .builder() .uid("psde_uid_1") - .dataElement(DataElement.builder().uid("de_1").build()) + .dataElement(ObjectWithUid.create("de_1")) .build(), ) } diff --git a/form/src/test/java/org/dhis2/form/data/FormValueStoreTest.kt b/form/src/test/java/org/dhis2/form/data/FormValueStoreTest.kt index 2e91e0324c4..5899c327e98 100644 --- a/form/src/test/java/org/dhis2/form/data/FormValueStoreTest.kt +++ b/form/src/test/java/org/dhis2/form/data/FormValueStoreTest.kt @@ -731,6 +731,7 @@ class FormValueStoreTest { .builder() .uid("fieldUid") .valueType(ValueType.TEXT) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build() val storeResult = deValueStore.deleteOptionValueIfSelected( @@ -1178,6 +1179,7 @@ class FormValueStoreTest { .builder() .uid(testingUid) .valueType(ValueType.TEXT) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build() whenever( d2 @@ -1386,6 +1388,7 @@ class FormValueStoreTest { .builder() .uid("uid") .valueType(ValueType.TEXT) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build() private fun mockedUniqueAttribute(): TrackedEntityAttribute = diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fb837ce38c9..a9d6178ede3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -11,7 +11,7 @@ kotlin = '2.2.21' dagger = '2.57.2' jacoco = '0.8.14' designSystem = "0.7.0-SNAPSHOT" -dhis2sdk = "1.14.0-20260129.154413-7" +dhis2sdk = "1.14.0-20260202.110438-9" ruleEngine = "3.3.11" expressionParser = "1.2.2" appcompat = "1.7.1" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 5e475e877f2..69d9a98c4ed 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -4704,6 +4704,14 @@ + + + + + + + + @@ -7628,6 +7636,22 @@ + + + + + + + + + + + + + + + + @@ -7636,6 +7660,22 @@ + + + + + + + + + + + + + + + + @@ -7660,6 +7700,14 @@ + + + + + + + + @@ -7681,6 +7729,14 @@ + + + + + + + + @@ -8403,6 +8459,14 @@ + + + + + + + + @@ -8419,6 +8483,14 @@ + + + + + + + + @@ -8435,6 +8507,14 @@ + + + + + + + + @@ -8451,6 +8531,14 @@ + + + + + + + + @@ -8467,6 +8555,14 @@ + + + + + + + + @@ -8483,6 +8579,14 @@ + + + + + + + + @@ -8499,6 +8603,14 @@ + + + + + + + + @@ -8515,6 +8627,14 @@ + + + + + + + + @@ -8531,6 +8651,14 @@ + + + + + + + + @@ -8547,6 +8675,14 @@ + + + + + + + + @@ -8563,6 +8699,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -8579,6 +8739,14 @@ + + + + + + + + @@ -8595,6 +8763,14 @@ + + + + + + + + @@ -8611,6 +8787,27 @@ + + + + + + + + + + + + + + + + + + + + + @@ -8627,6 +8824,14 @@ + + + + + + + + @@ -8643,6 +8848,14 @@ + + + + + + + + @@ -8659,6 +8872,14 @@ + + + + + + + + @@ -8675,6 +8896,14 @@ + + + + + + + + @@ -8691,6 +8920,14 @@ + + + + + + + + @@ -8707,6 +8944,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -8723,6 +8984,14 @@ + + + + + + + + @@ -8739,6 +9008,14 @@ + + + + + + + + @@ -8755,6 +9032,14 @@ + + + + + + + + @@ -8771,6 +9056,14 @@ + + + + + + + + @@ -8787,6 +9080,14 @@ + + + + + + + + @@ -8803,6 +9104,14 @@ + + + + + + + + @@ -12183,6 +12492,17 @@ + + + + + + + + + + + @@ -12265,6 +12585,11 @@ + + + + + @@ -13022,6 +13347,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -13047,6 +13419,14 @@ + + + + + + + + @@ -13086,6 +13466,14 @@ + + + + + + + + @@ -13126,6 +13514,14 @@ + + + + + + + + @@ -13160,6 +13556,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -13824,6 +14254,14 @@ + + + + + + + + @@ -13842,6 +14280,11 @@ + + + + + @@ -13867,6 +14310,11 @@ + + + + + diff --git a/stock-usecase/src/test/java/org/dhis2/android/rtsm/data/DataElementFactory.kt b/stock-usecase/src/test/java/org/dhis2/android/rtsm/data/DataElementFactory.kt index ada2b8e52fd..c41a2dd92bf 100644 --- a/stock-usecase/src/test/java/org/dhis2/android/rtsm/data/DataElementFactory.kt +++ b/stock-usecase/src/test/java/org/dhis2/android/rtsm/data/DataElementFactory.kt @@ -1,5 +1,6 @@ package org.dhis2.android.rtsm.data +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.dataelement.DataElement object DataElementFactory { @@ -12,5 +13,6 @@ object DataElementFactory { .uid(uid) .name(name) .displayName(name) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build() } diff --git a/stock-usecase/src/test/java/org/dhis2/android/rtsm/services/StockManagerTest.kt b/stock-usecase/src/test/java/org/dhis2/android/rtsm/services/StockManagerTest.kt index 7bac851da6c..004feaa75f7 100644 --- a/stock-usecase/src/test/java/org/dhis2/android/rtsm/services/StockManagerTest.kt +++ b/stock-usecase/src/test/java/org/dhis2/android/rtsm/services/StockManagerTest.kt @@ -19,7 +19,6 @@ import org.hisp.dhis.android.core.arch.repositories.filters.internal.StringFilte import org.hisp.dhis.android.core.arch.repositories.`object`.ReadOnlyOneObjectRepositoryFinalImpl import org.hisp.dhis.android.core.arch.repositories.scope.RepositoryScope import org.hisp.dhis.android.core.common.ObjectWithUid -import org.hisp.dhis.android.core.dataelement.DataElement import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.enrollment.EnrollmentCollectionRepository import org.hisp.dhis.android.core.enrollment.EnrollmentStatus @@ -270,7 +269,7 @@ class StockManagerTest { // Mock mandatory field check to pass val dataElement = - mock { + mock { on { uid() } doReturn "de_uid" } val mandatoryDataElement = @@ -343,7 +342,7 @@ class StockManagerTest { // Mock mandatory field check to fail val dataElement = - mock { + mock { on { uid() } doReturn "de_uid" } val mandatoryDataElement = From 381bfd258d31814275796f59b0182852cf5e03f5 Mon Sep 17 00:00:00 2001 From: Xavier Molloy Date: Wed, 4 Feb 2026 15:47:13 +0100 Subject: [PATCH 041/260] feat: [ANDROAPP-7472] III Repositories and usecase [skip size] (#4624) * feat: [ANDROAPP-7472] copilot review * feat: [ANDROAPP-7472] Repositories and usecase * feat: [ANDROAPP-7472] refactor prepare query * fix: [ANDROAPP-7472] make fetch results not suspend * fix: [ANDROAPP-7472] Code review comments * fix: [ANDROAPP-7472] Code review comments * feat: [ANDROAPP-7472] copilot review * fix: [ANDROAPP-7472] Code review comments * chore: [ANDROAPP-7472] reduce cognitive complexity * chore: [ANDROAPP-7472] Address final copilot review comments * feat: [ANDROAPP-7472] Add tests for new repository and usecases (#4625) * feat: [ANDROAPP-7472] IV Koin injection for implementation (#4626) * feat: [ANDROAPP-7472] Koin injection for implementation * feat: [ANDROAPP-7472] Remove verbose import * feat: [ANDROAPP-7472] Add usecase to viewmodel and its factory * feat: [ANDROAPP-7472] Fix compilation error, unit tests * fix: [ANDROAPP-7472] Code review comments * chore: [ANDROAPP-7472] Small code review improvements --- .../java/org/dhis2/di/KoinInitialization.kt | 6 + .../searchTrackEntity/SearchTEIViewModel.kt | 2 + .../searchTrackEntity/SearchTEModule.java | 34 +- .../SearchTeiViewModelFactory.kt | 3 + .../di/SearchTEKoinModule.kt | 72 +++ .../SearchTEIViewModelTest.kt | 5 + .../java/org/dhis2/commons/di/FilterModule.kt | 82 +++ .../dhis2/commons/di/ResourceManagerModule.kt | 6 +- .../filters/periods/di/FilterPeriodsModule.kt | 3 +- .../data/SearchTrackedEntityRepositoryImpl.kt | 108 ++++ .../search/di/TrackerSearchModule.android.kt | 20 + .../SearchTrackedEntityRepositoryImplTest.kt | 422 +++++++++++++++ .../data/SearchTrackedEntityRepository.kt | 35 ++ .../tracker/search/di/TrackerSearchModule.kt | 29 + .../search/domain/SearchTrackedEntities.kt | 95 ++++ .../domain/SearchTrackedEntitiesTest.kt | 504 ++++++++++++++++++ .../search/di/TrackerSearchModule.desktop.kt | 13 + 17 files changed, 1433 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/org/dhis2/usescases/searchTrackEntity/di/SearchTEKoinModule.kt create mode 100644 commons/src/main/java/org/dhis2/commons/di/FilterModule.kt create mode 100644 tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImpl.kt create mode 100644 tracker/src/androidMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.android.kt create mode 100644 tracker/src/androidUnitTest/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImplTest.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepository.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntities.kt create mode 100644 tracker/src/commonTest/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntitiesTest.kt create mode 100644 tracker/src/desktopMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.desktop.kt diff --git a/app/src/main/java/org/dhis2/di/KoinInitialization.kt b/app/src/main/java/org/dhis2/di/KoinInitialization.kt index 61bbf879f81..cd0ba2b8593 100644 --- a/app/src/main/java/org/dhis2/di/KoinInitialization.kt +++ b/app/src/main/java/org/dhis2/di/KoinInitialization.kt @@ -2,13 +2,16 @@ package org.dhis2.di import android.app.Application import org.dhis2.android.rtsm.di.stockModule +import org.dhis2.commons.di.filterModule import org.dhis2.commons.di.resourceManagerModule import org.dhis2.commons.filters.periods.di.filterPeriodsModule import org.dhis2.data.biometric.biometricModule import org.dhis2.mobile.aggregates.di.aggregatesModule import org.dhis2.mobile.commons.di.commonsModule import org.dhis2.mobile.login.main.di.loginModule +import org.dhis2.tracker.search.di.trackerSearchModule import org.dhis2.usescases.datasets.di.dataSetModules +import org.dhis2.usescases.searchTrackEntity.di.searchTEKoinModule import org.dhis2.usescases.settingsprogram.di.settingsProgramModule import org.dhis2.utils.analytics.matomo.matomoModule import org.hisp.dhis.android.core.D2Configuration @@ -25,11 +28,14 @@ object KoinInitialization { serverModule(d2Configuration), commonsModule, aggregatesModule, + filterModule, filterPeriodsModule, resourceManagerModule, dataSetModules, stockModule, loginModule, + trackerSearchModule, + searchTEKoinModule, settingsProgramModule, biometricModule, matomoModule, diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt index 9ce14658a12..6dfe89d4a18 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt @@ -55,6 +55,7 @@ import org.dhis2.maps.managers.MapManager import org.dhis2.maps.usecases.MapStyleConfiguration import org.dhis2.mobile.commons.coroutine.CoroutineTracker import org.dhis2.tracker.NavigationBarUIState +import org.dhis2.tracker.search.domain.SearchTrackedEntities import org.dhis2.tracker.ui.input.action.CustomIntentUid import org.dhis2.tracker.ui.input.action.FieldUid import org.dhis2.tracker.ui.input.action.TrackerInputAction @@ -85,6 +86,7 @@ class SearchTEIViewModel( private val resourceManager: ResourceManager, private val displayNameProvider: DisplayNameProvider, private val filterManager: FilterManager, + private val searchTrackedEntities: SearchTrackedEntities, ) : ViewModel() { private var layersVisibility: Map = emptyMap() diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java index 4419e730727..5bd9b79947d 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java @@ -63,6 +63,9 @@ import org.dhis2.mobile.commons.customintents.CustomIntentRepositoryImpl; import org.dhis2.mobile.commons.reporting.CrashReportController; import org.dhis2.tracker.data.ProfilePictureProvider; +import org.dhis2.tracker.search.data.SearchTrackedEntityRepository; +import org.dhis2.tracker.search.data.SearchTrackedEntityRepositoryImpl; +import org.dhis2.tracker.search.domain.SearchTrackedEntities; import org.dhis2.ui.ThemeManager; import org.dhis2.usescases.events.EventInfoProvider; import org.dhis2.usescases.searchTrackEntity.ui.mapper.TEICardMapper; @@ -326,7 +329,8 @@ SearchTeiViewModelFactory providesViewModelFactory( ResourceManager resourceManager, DisplayNameProvider displayNameProvider, FilterManager filterManager, - ProgramConfigurationRepository programConfigurationRepository + ProgramConfigurationRepository programConfigurationRepository, + SearchTrackedEntities searchTrackedEntities ) { return new SearchTeiViewModelFactory( searchRepository, @@ -345,7 +349,33 @@ SearchTeiViewModelFactory providesViewModelFactory( ), resourceManager, displayNameProvider, - filterManager + filterManager, + searchTrackedEntities + ); + } + + @Provides + @PerActivity + SearchTrackedEntities provideLoadSearchResultsUseCase( + SearchTrackedEntityRepository searchTrackedEntityRepository, + org.dhis2.mobile.commons.customintents.CustomIntentRepository customIntentRepository + ) { + return new SearchTrackedEntities( + searchTrackedEntityRepository, + customIntentRepository, + this.teiType + ); + } + + @Provides + @PerActivity + SearchTrackedEntityRepository provideLoadSearchResultsRepository( + D2 d2, + FilterPresenter filterPresenter + ) { + return new SearchTrackedEntityRepositoryImpl( + d2, + filterPresenter ); } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTeiViewModelFactory.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTeiViewModelFactory.kt index ee636e4696e..6358f8bebea 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTeiViewModelFactory.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTeiViewModelFactory.kt @@ -8,6 +8,7 @@ import org.dhis2.commons.resources.ResourceManager import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.form.ui.provider.DisplayNameProvider import org.dhis2.maps.usecases.MapStyleConfiguration +import org.dhis2.tracker.search.domain.SearchTrackedEntities class SearchTeiViewModelFactory( private val searchRepository: SearchRepository, @@ -22,6 +23,7 @@ class SearchTeiViewModelFactory( private val resourceManager: ResourceManager, private val displayNameProvider: DisplayNameProvider, private val filterManager: FilterManager, + private val searchTrackedEntities: SearchTrackedEntities, ) : ViewModelProvider.Factory { override fun create(modelClass: Class): T = SearchTEIViewModel( @@ -37,5 +39,6 @@ class SearchTeiViewModelFactory( resourceManager, displayNameProvider, filterManager, + searchTrackedEntities, ) as T } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/di/SearchTEKoinModule.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/di/SearchTEKoinModule.kt new file mode 100644 index 00000000000..c87e8f1a9a5 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/di/SearchTEKoinModule.kt @@ -0,0 +1,72 @@ +package org.dhis2.usescases.searchTrackEntity.di + +import org.dhis2.usescases.searchTrackEntity.SearchRepository +import org.dhis2.usescases.searchTrackEntity.SearchTEIViewModel +import org.dhis2.usescases.searchTrackEntity.SearchTeiViewModelFactory +import org.koin.core.module.dsl.viewModel +import org.koin.core.parameter.parametersOf +import org.koin.dsl.module + +/** + * Koin module for Search Tracked Entity feature. + * This module provides dependencies for SearchTEIViewModel and related components. + * + * Note: This module coexists with the legacy Dagger SearchTEModule during the migration. + */ +val searchTEKoinModule = + module { + // SearchTeiViewModelFactory + // Factory for creating SearchTEIViewModel instances with SearchTrackedEntities + factory { params -> + val initialProgramUid: String? = params.getOrNull() + val initialQuery: MutableMap?>? = params.getOrNull() + val teType: String = params.get() // teType is required + + // Get SearchRepository from Dagger to access teType + val searchRepository: SearchRepository = get() + + SearchTeiViewModelFactory( + searchRepository = searchRepository, + searchRepositoryKt = get(), + searchNavPageConfigurator = get(), + initialProgramUid = initialProgramUid, + initialQuery = initialQuery, + mapDataRepository = get(), + networkUtils = get(), + dispatchers = get(), + mapStyleConfig = get(), + resourceManager = get(), + displayNameProvider = get(), + filterManager = get(), + searchTrackedEntities = get { parametersOf(teType) }, + ) + } + + // SearchTEIViewModel + // Note: This ViewModel requires parameters (initialProgramUid, initialQuery, teType) + // Use: viewModel { parametersOf(programUid, queryMap, teType) } + viewModel { params -> + val initialProgramUid: String? = params.getOrNull() + val initialQuery: MutableMap?>? = params.getOrNull() + val teType: String = params.get() // teType is required + + // Get SearchRepository from Dagger + val searchRepository: SearchRepository = get() + + SearchTEIViewModel( + initialProgramUid = initialProgramUid, + initialQuery = initialQuery, + searchRepository = searchRepository, + searchRepositoryKt = get(), + searchNavPageConfigurator = get(), + mapDataRepository = get(), + networkUtils = get(), + dispatchers = get(), + mapStyleConfig = get(), + resourceManager = get(), + displayNameProvider = get(), + filterManager = get(), + searchTrackedEntities = get { parametersOf(teType) }, + ) + } + } diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt index bc25581f333..543fbdf0dba 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt @@ -32,6 +32,7 @@ import org.dhis2.form.ui.provider.DisplayNameProvider import org.dhis2.maps.geometry.mapper.EventsByProgramStage import org.dhis2.maps.usecases.MapStyleConfiguration import org.dhis2.mobile.commons.model.CustomIntentModel +import org.dhis2.tracker.search.domain.SearchTrackedEntities import org.dhis2.tracker.ui.input.action.TrackerInputAction import org.dhis2.usescases.searchTrackEntity.listView.SearchResult.SearchResultType import org.dhis2.utils.customviews.navigationbar.NavigationPage @@ -73,6 +74,7 @@ class SearchTEIViewModelTest { private val resourceManager: ResourceManager = mock() private val displayNameProvider: DisplayNameProvider = mock() private val filterManager: FilterManager = mock() + private val searchTrackedEntities: SearchTrackedEntities = mock() @ExperimentalCoroutinesApi private val testingDispatcher = StandardTestDispatcher() @@ -106,6 +108,7 @@ class SearchTEIViewModelTest { resourceManager = resourceManager, displayNameProvider = displayNameProvider, filterManager = filterManager, + searchTrackedEntities = searchTrackedEntities, ) testingDispatcher.scheduler.advanceUntilIdle() } @@ -798,6 +801,7 @@ class SearchTEIViewModelTest { resourceManager = resourceManager, displayNameProvider = displayNameProvider, filterManager = filterManager, + searchTrackedEntities = searchTrackedEntities, ) testingDispatcher.scheduler.advanceUntilIdle() @@ -844,6 +848,7 @@ class SearchTEIViewModelTest { }, displayNameProvider = displayNameProvider, filterManager = filterManager, + searchTrackedEntities = searchTrackedEntities, ) testingDispatcher.scheduler.advanceUntilIdle() diff --git a/commons/src/main/java/org/dhis2/commons/di/FilterModule.kt b/commons/src/main/java/org/dhis2/commons/di/FilterModule.kt new file mode 100644 index 00000000000..acf03d69a6c --- /dev/null +++ b/commons/src/main/java/org/dhis2/commons/di/FilterModule.kt @@ -0,0 +1,82 @@ +package org.dhis2.commons.di + +import org.dhis2.commons.filters.FilterManager +import org.dhis2.commons.filters.FilterResources +import org.dhis2.commons.filters.data.FilterPresenter +import org.dhis2.commons.filters.data.FilterRepository +import org.dhis2.commons.filters.data.GetFiltersApplyingWebAppConfig +import org.dhis2.commons.filters.workingLists.EventFilterToWorkingListItemMapper +import org.dhis2.commons.filters.workingLists.ProgramStageToWorkingListItemMapper +import org.dhis2.commons.filters.workingLists.TeiFilterToWorkingListItemMapper +import org.dhis2.commons.resources.EventResourcesProvider +import org.dhis2.commons.resources.ResourceManager +import org.koin.core.module.dsl.factoryOf +import org.koin.dsl.module + +val mainFilterModule = + module { + // Singleton for GetFiltersApplyingWebAppConfig + single { + GetFiltersApplyingWebAppConfig() + } + + // FilterManager - singleton per server + single { + FilterManager.initWith(get()) + } + + // FilterResources + factory { + FilterResources( + resourceManager = get(), + eventResourcesProvider = get(), + ) + } + + // EventResourcesProvider + factory { + EventResourcesProvider( + d2 = get(), + resourceManager = get(), + ) + } + + // Working list mappers + factory { + EventFilterToWorkingListItemMapper( + defaultWorkingListLabel = get().defaultWorkingListLabel(), + ) + } + + factory { + TeiFilterToWorkingListItemMapper( + defaultWorkingListLabel = get().defaultWorkingListLabel(), + ) + } + + factory { + ProgramStageToWorkingListItemMapper( + defaultWorkingListLabel = get().defaultWorkingListLabel(), + ) + } + + // FilterRepository + factory { + FilterRepository( + d2 = get(), + resources = get(), + getFiltersApplyingWebAppConfig = get(), + eventFilterToWorkingListItemMapper = get(), + teiFilterToWorkingListItemMapper = get(), + programStageToWorkingListItemMapper = get(), + ) + } + + // FilterPresenter + factoryOf(::FilterPresenter) + } + +val filterModule = + module { + includes(mainFilterModule, resourceManagerModule) + } diff --git a/commons/src/main/java/org/dhis2/commons/di/ResourceManagerModule.kt b/commons/src/main/java/org/dhis2/commons/di/ResourceManagerModule.kt index e67a160e02a..8f98dff4375 100644 --- a/commons/src/main/java/org/dhis2/commons/di/ResourceManagerModule.kt +++ b/commons/src/main/java/org/dhis2/commons/di/ResourceManagerModule.kt @@ -3,6 +3,7 @@ package org.dhis2.commons.di import org.dhis2.commons.periods.data.PeriodLabelProvider import org.dhis2.commons.resources.ColorUtils import org.dhis2.commons.resources.ResourceManager +import org.koin.android.ext.koin.androidContext import org.koin.dsl.module val resourceManagerModule = @@ -10,8 +11,9 @@ val resourceManagerModule = single { ColorUtils() } - factory { params -> - ResourceManager(params.get(), get()) + + single { + ResourceManager(androidContext(), get()) } factory { diff --git a/commons/src/main/java/org/dhis2/commons/filters/periods/di/FilterPeriodsModule.kt b/commons/src/main/java/org/dhis2/commons/filters/periods/di/FilterPeriodsModule.kt index 15bb0d6d421..402e5f224c5 100644 --- a/commons/src/main/java/org/dhis2/commons/filters/periods/di/FilterPeriodsModule.kt +++ b/commons/src/main/java/org/dhis2/commons/filters/periods/di/FilterPeriodsModule.kt @@ -7,7 +7,6 @@ import org.dhis2.commons.filters.periods.domain.GetFilterPeriods import org.dhis2.commons.filters.periods.ui.viewmodel.FilterPeriodsDialogViewmodel import org.koin.core.module.dsl.singleOf import org.koin.core.module.dsl.viewModel -import org.koin.core.parameter.parametersOf import org.koin.dsl.module val filterPeriodsModule = @@ -34,7 +33,7 @@ val filterPeriodsModule = FilterPeriodsDialogViewmodel( getFilterPeriods = get(), getFilterPeriodTypes = get(), - resourceManager = get { parametersOf(params.get()) }, + resourceManager = get(), periodTypeLabelProvider = get(), launchMode = params.get(), ) diff --git a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImpl.kt b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImpl.kt new file mode 100644 index 00000000000..2dc088b2573 --- /dev/null +++ b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImpl.kt @@ -0,0 +1,108 @@ +package org.dhis2.tracker.search.data + +import androidx.paging.PagingData +import androidx.paging.map +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map +import org.dhis2.commons.filters.data.FilterPresenter +import org.dhis2.tracker.search.model.SearchTrackedEntityAttribute +import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult +import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchCollectionRepository + +class SearchTrackedEntityRepositoryImpl( + private val d2: D2, + private val filterPresenter: FilterPresenter, +) : SearchTrackedEntityRepository { + private var trackedEntityInstanceQuery: TrackedEntitySearchCollectionRepository? = null + + // Checks whether the dataId is an attribute of the teType + override suspend fun isTETypeAttribute( + teType: String, + dataId: String, + ): Boolean = + d2 + .trackedEntityModule() + .trackedEntityTypeAttributes() + .byTrackedEntityTypeUid() + .eq(teType) + .byTrackedEntityAttributeUid() + .eq(dataId) + .one() + .blockingExists() + + override suspend fun getTEAttribute(dataId: String): SearchTrackedEntityAttribute { + val attribute = + d2 + .trackedEntityModule() + .trackedEntityAttributes() + .uid(dataId) + .blockingGet() + return SearchTrackedEntityAttribute( + isUnique = attribute?.unique() == true, + isOptionSet = (attribute?.optionSet() != null), + ) + } + + override suspend fun addToQuery( + dataId: String, + dataValues: List, + isUnique: Boolean, + isOptionSet: Boolean, + ) { + trackedEntityInstanceQuery = + if (dataValues.size > 1) { + // return any tracked entities with attributes that match the values in the list + trackedEntityInstanceQuery?.byFilter(dataId)?.`in`(dataValues) + } else { + if (dataValues.size == 1) { + if (isUnique || isOptionSet) { + // If the attribute is unique or an option set, we want an exact match + trackedEntityInstanceQuery?.byFilter(dataId)?.eq(dataValues[0]) + } else { + // return tracked entities that contain the data value + trackedEntityInstanceQuery?.byFilter(dataId)?.like(dataValues[0]) + } + } else { + trackedEntityInstanceQuery + } + } + } + + override suspend fun addFiltersToQuery( + program: String?, + teType: String, + ) { + trackedEntityInstanceQuery = + filterPresenter.filteredTrackedEntityInstances( + program, + teType, + ) + } + + override suspend fun excludeValuesFromQuery(excludeValues: List) { + trackedEntityInstanceQuery = trackedEntityInstanceQuery?.excludeUids()?.`in`(excludeValues) + } + + override fun fetchResults( + isOnline: Boolean, + hasStateFilters: Boolean, + allowCache: Boolean, + ): Flow> { + // if the device is online and there are no state filters, we can use online cache + val pagerFlow = + if (isOnline && !hasStateFilters) { + trackedEntityInstanceQuery?.allowOnlineCache()?.eq(allowCache)?.offlineFirst() + } else { + // otherwise we use offline only + trackedEntityInstanceQuery?.allowOnlineCache()?.eq(allowCache)?.offlineOnly() + } + + // map the paging data to TrackedEntitySearchItemResult + return pagerFlow?.getPagingData(10)?.map { pagingData -> + pagingData.map { item -> + item.toTrackedEntitySearchItemResult() + } + } ?: throw IllegalStateException("TrackedEntityInstanceQuery is not initialized") + } +} diff --git a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.android.kt b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.android.kt new file mode 100644 index 00000000000..fa86fafc999 --- /dev/null +++ b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.android.kt @@ -0,0 +1,20 @@ +package org.dhis2.tracker.search.di + +import org.dhis2.tracker.search.data.SearchTrackedEntityRepository +import org.dhis2.tracker.search.data.SearchTrackedEntityRepositoryImpl +import org.koin.core.module.Module +import org.koin.dsl.module + +/** + * Android-specific implementation of the tracker search repository module. + */ +internal actual val trackerSearchRepositoryModule: Module = + module { + // SearchTrackedEntityRepository - factory implementation + factory { + SearchTrackedEntityRepositoryImpl( + d2 = get(), + filterPresenter = get(), + ) + } + } diff --git a/tracker/src/androidUnitTest/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImplTest.kt b/tracker/src/androidUnitTest/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImplTest.kt new file mode 100644 index 00000000000..7bc2c81871d --- /dev/null +++ b/tracker/src/androidUnitTest/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImplTest.kt @@ -0,0 +1,422 @@ +package org.dhis2.tracker.search.data + +import kotlinx.coroutines.test.runTest +import org.dhis2.commons.filters.data.FilterPresenter +import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.arch.repositories.`object`.ReadOnlyOneObjectRepositoryFinalImpl +import org.hisp.dhis.android.core.trackedentity.TrackedEntityAttribute +import org.hisp.dhis.android.core.trackedentity.TrackedEntityTypeAttribute +import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchCollectionRepository +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.mockito.Mockito +import org.mockito.kotlin.any +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever + +class SearchTrackedEntityRepositoryImplTest { + private lateinit var repository: SearchTrackedEntityRepositoryImpl + + private val d2: D2 = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) + private val filterPresenter: FilterPresenter = mock() + + private val teType = "personType" + private val programUid = "programUid" + + @Before + fun setup() { + repository = + SearchTrackedEntityRepositoryImpl( + d2 = d2, + filterPresenter = filterPresenter, + ) + } + + @Test + fun `isTETypeAttribute should return true when attribute belongs to teType`() = + runTest { + // Given + val attributeUid = "attr1" + val mockOneRepository: ReadOnlyOneObjectRepositoryFinalImpl = mock() + + whenever( + d2 + .trackedEntityModule() + .trackedEntityTypeAttributes() + .byTrackedEntityTypeUid() + .eq(teType), + ) doReturn mock() + + whenever( + d2 + .trackedEntityModule() + .trackedEntityTypeAttributes() + .byTrackedEntityTypeUid() + .eq(teType) + .byTrackedEntityAttributeUid(), + ) doReturn mock() + + whenever( + d2 + .trackedEntityModule() + .trackedEntityTypeAttributes() + .byTrackedEntityTypeUid() + .eq(teType) + .byTrackedEntityAttributeUid() + .eq(attributeUid), + ) doReturn mock() + + whenever( + d2 + .trackedEntityModule() + .trackedEntityTypeAttributes() + .byTrackedEntityTypeUid() + .eq(teType) + .byTrackedEntityAttributeUid() + .eq(attributeUid) + .one(), + ) doReturn mockOneRepository + + whenever(mockOneRepository.blockingExists()) doReturn true + + // When + val result = repository.isTETypeAttribute(teType, attributeUid) + + // Then + assertTrue(result) + } + + @Test + fun `isTETypeAttribute should return false when attribute does not belong to teType`() = + runTest { + // Given + val attributeUid = "attr1" + val mockOneRepository: ReadOnlyOneObjectRepositoryFinalImpl = mock() + + whenever( + d2 + .trackedEntityModule() + .trackedEntityTypeAttributes() + .byTrackedEntityTypeUid() + .eq(teType), + ) doReturn mock() + + whenever( + d2 + .trackedEntityModule() + .trackedEntityTypeAttributes() + .byTrackedEntityTypeUid() + .eq(teType) + .byTrackedEntityAttributeUid(), + ) doReturn mock() + + whenever( + d2 + .trackedEntityModule() + .trackedEntityTypeAttributes() + .byTrackedEntityTypeUid() + .eq(teType) + .byTrackedEntityAttributeUid() + .eq(attributeUid), + ) doReturn mock() + + whenever( + d2 + .trackedEntityModule() + .trackedEntityTypeAttributes() + .byTrackedEntityTypeUid() + .eq(teType) + .byTrackedEntityAttributeUid() + .eq(attributeUid) + .one(), + ) doReturn mockOneRepository + + whenever(mockOneRepository.blockingExists()) doReturn false + + // When + val result = repository.isTETypeAttribute(teType, attributeUid) + + // Then + assertFalse(result) + } + + @Test + fun `getTEAttribute should return unique attribute properties`() = + runTest { + // Given + val attributeUid = "uniqueAttr" + val attribute = + TrackedEntityAttribute + .builder() + .uid(attributeUid) + .unique(true) + .optionSet(null) + .build() + + whenever( + d2 + .trackedEntityModule() + .trackedEntityAttributes() + .uid(attributeUid) + .blockingGet(), + ) doReturn attribute + + // When + val result = repository.getTEAttribute(attributeUid) + + // Then + assertTrue(result.isUnique) + assertFalse(result.isOptionSet) + } + + @Test + fun `getTEAttribute should return option set attribute properties`() = + runTest { + // Given + val attributeUid = "optionSetAttr" + + val attribute = + TrackedEntityAttribute + .builder() + .uid(attributeUid) + .unique(false) + .optionSet( + org.hisp.dhis.android.core.common.ObjectWithUid + .create("optionSetUid"), + ).build() + + whenever( + d2 + .trackedEntityModule() + .trackedEntityAttributes() + .uid(attributeUid) + .blockingGet(), + ) doReturn attribute + + // When + val result = repository.getTEAttribute(attributeUid) + + // Then + assertFalse(result.isUnique) + assertTrue(result.isOptionSet) + } + + @Test + fun `addToQuery should add filter with multiple values using in`() = + runTest { + // Given + val dataId = "attr1" + val dataValues = listOf("value1", "value2", "value3") + val mockQuery: TrackedEntitySearchCollectionRepository = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) + + // Initialize query first + whenever(filterPresenter.filteredTrackedEntityInstances(any(), any())) doReturn mockQuery + + repository.addFiltersToQuery(programUid, teType) + + // When + repository.addToQuery( + dataId = dataId, + dataValues = dataValues, + isUnique = false, + isOptionSet = false, + ) + + // Then - verify the filter was applied + verify(mockQuery).byFilter(dataId) + } + + @Test + fun `addToQuery should add filter with exact match for unique attribute`() = + runTest { + // Given + val dataId = "uniqueAttr" + val dataValues = listOf("exactValue") + val mockQuery: TrackedEntitySearchCollectionRepository = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) + + // Initialize query first + whenever(filterPresenter.filteredTrackedEntityInstances(any(), any())) doReturn mockQuery + + repository.addFiltersToQuery(programUid, teType) + + // When + repository.addToQuery( + dataId = dataId, + dataValues = dataValues, + isUnique = true, + isOptionSet = false, + ) + + // Then - verify the filter was applied + verify(mockQuery).byFilter(dataId) + } + + @Test + fun `addToQuery should add filter with exact match for option set attribute`() = + runTest { + // Given + val dataId = "optionSetAttr" + val dataValues = listOf("optionValue") + val mockQuery: TrackedEntitySearchCollectionRepository = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) + + // Initialize query first + whenever(filterPresenter.filteredTrackedEntityInstances(any(), any())) doReturn mockQuery + + repository.addFiltersToQuery(programUid, teType) + + // When + repository.addToQuery( + dataId = dataId, + dataValues = dataValues, + isUnique = false, + isOptionSet = true, + ) + + // Then - verify the filter was applied + verify(mockQuery).byFilter(dataId) + } + + @Test + fun `addToQuery should add filter with like for regular attribute`() = + runTest { + // Given + val dataId = "regularAttr" + val dataValues = listOf("searchValue") + val mockQuery: TrackedEntitySearchCollectionRepository = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) + + // Initialize query first + whenever(filterPresenter.filteredTrackedEntityInstances(any(), any())) doReturn mockQuery + + repository.addFiltersToQuery(programUid, teType) + + // When + repository.addToQuery( + dataId = dataId, + dataValues = dataValues, + isUnique = false, + isOptionSet = false, + ) + + // Then - verify the filter was applied + verify(mockQuery).byFilter(dataId) + } + + @Test + fun `addFiltersToQuery should initialize query with filter presenter`() = + runTest { + // Given + val mockQuery: TrackedEntitySearchCollectionRepository = mock() + whenever(filterPresenter.filteredTrackedEntityInstances(programUid, teType)) doReturn mockQuery + + // When + repository.addFiltersToQuery(programUid, teType) + + // Then + verify(filterPresenter).filteredTrackedEntityInstances(programUid, teType) + } + + @Test + fun `excludeValuesFromQuery should add exclude filter`() = + runTest { + // Given + val excludeValues = listOf("uid1", "uid2", "uid3") + val mockQuery: TrackedEntitySearchCollectionRepository = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) + + whenever(filterPresenter.filteredTrackedEntityInstances(any(), any())) doReturn mockQuery + + repository.addFiltersToQuery(programUid, teType) + + // When + repository.excludeValuesFromQuery(excludeValues) + + // Then + verify(mockQuery).excludeUids() + } + + @Test + fun `fetchResults should return offline only when offline or has state filters`() = + runTest { + // Given + val mockQuery: TrackedEntitySearchCollectionRepository = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) + + whenever(filterPresenter.filteredTrackedEntityInstances(any(), any())) doReturn mockQuery + + repository.addFiltersToQuery(programUid, teType) + + // When + val result = + repository.fetchResults( + isOnline = false, + hasStateFilters = false, + allowCache = true, + ) + + // Then + assertNotNull(result) + verify(mockQuery).allowOnlineCache() + } + + @Test + fun `fetchResults should return offline first when online and no state filters`() = + runTest { + // Given + val mockQuery: TrackedEntitySearchCollectionRepository = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) + + whenever(filterPresenter.filteredTrackedEntityInstances(any(), any())) doReturn mockQuery + + repository.addFiltersToQuery(programUid, teType) + + // When + val result = + repository.fetchResults( + isOnline = true, + hasStateFilters = false, + allowCache = false, + ) + + // Then + assertNotNull(result) + verify(mockQuery).allowOnlineCache() + } + + @Test + fun `fetchResults should use allowCache parameter correctly`() = + runTest { + // Given + val mockQuery: TrackedEntitySearchCollectionRepository = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) + + whenever(filterPresenter.filteredTrackedEntityInstances(any(), any())) doReturn mockQuery + + repository.addFiltersToQuery(programUid, teType) + + // When + repository.fetchResults( + isOnline = true, + hasStateFilters = false, + allowCache = true, + ) + + // Then + verify(mockQuery).allowOnlineCache() + } + + @Test(expected = IllegalStateException::class) + fun `fetchResults should throw exception when query not initialized`() = + runTest { + // Given - no query initialized + + // When + repository.fetchResults( + isOnline = false, + hasStateFilters = false, + allowCache = true, + ) + + // Then - exception is thrown + } +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepository.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepository.kt new file mode 100644 index 00000000000..577775d93a9 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepository.kt @@ -0,0 +1,35 @@ +package org.dhis2.tracker.search.data + +import androidx.paging.PagingData +import kotlinx.coroutines.flow.Flow +import org.dhis2.tracker.search.model.SearchTrackedEntityAttribute +import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult + +interface SearchTrackedEntityRepository { + suspend fun isTETypeAttribute( + teType: String, + dataId: String, + ): Boolean + + suspend fun getTEAttribute(dataId: String): SearchTrackedEntityAttribute + + suspend fun addToQuery( + dataId: String, + dataValues: List, + isUnique: Boolean, + isOptionSet: Boolean, + ) + + suspend fun addFiltersToQuery( + program: String?, + teType: String, + ) + + suspend fun excludeValuesFromQuery(excludeValues: List) + + fun fetchResults( + isOnline: Boolean, + hasStateFilters: Boolean, + allowCache: Boolean, + ): Flow> +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.kt new file mode 100644 index 00000000000..8ad69ed4c6e --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.kt @@ -0,0 +1,29 @@ +package org.dhis2.tracker.search.di + +import org.dhis2.tracker.search.domain.SearchTrackedEntities +import org.koin.core.module.Module +import org.koin.dsl.module + +/** + * Platform-specific repository module. + * Implemented in androidMain and other platform-specific source sets. + */ +internal expect val trackerSearchRepositoryModule: Module + +/** + * Common tracker search module containing use cases and common dependencies. + */ +val trackerSearchModule = + module { + // Include platform-specific repository implementations + includes(trackerSearchRepositoryModule) + + // SearchTrackedEntities - factory with teType parameter + factory { params -> + SearchTrackedEntities( + repository = get(), + customIntentRepository = get(), + teType = params.get(), + ) + } + } diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntities.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntities.kt new file mode 100644 index 00000000000..32c1d9fd291 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntities.kt @@ -0,0 +1,95 @@ +package org.dhis2.tracker.search.domain + +import androidx.paging.PagingData +import kotlinx.coroutines.flow.Flow +import org.dhis2.mobile.commons.customintents.CustomIntentRepository +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.mobile.commons.model.CustomIntentActionTypeModel +import org.dhis2.tracker.search.data.SearchTrackedEntityRepository +import org.dhis2.tracker.search.model.SearchTrackedEntitiesInput +import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult + +class SearchTrackedEntities( + private val repository: SearchTrackedEntityRepository, + private val customIntentRepository: CustomIntentRepository, + private val teType: String, +) : UseCase>> { + override suspend fun invoke(input: SearchTrackedEntitiesInput): Result>> { + try { + prepareQuery(input, teType) + // Due to performance issues and possible duplicates we exclude the values in the exclude list only when no program is selected + if (input.excludeValues?.isNotEmpty() == true && input.selectedProgram == null) { + repository.excludeValuesFromQuery(input.excludeValues.toList()) + } + // fetch results from repository based on the prepared query + // and if the device is online and has state filters + return Result.success( + repository.fetchResults( + isOnline = input.isOnline, + hasStateFilters = input.hasStateFilters, + allowCache = input.allowCache, + ), + ) + } catch (domainError: DomainError) { + // Errors will be handled by the view layer + return Result.failure(domainError) + } + } + + private suspend fun prepareQuery( + input: SearchTrackedEntitiesInput, + teType: String, + ) { + // Add filters from FilterManager + repository.addFiltersToQuery(input.selectedProgram, teType) + + input.queryData?.let { queryData -> + // iterate through the query data and add to the repository query + for ((dataId, dataValues) in queryData) { + // checks if the dataId is an attribute of the teType + val isTETypeAttribute = getIsTETypeAttribute(input.selectedProgram, dataId, teType) + + if (input.selectedProgram != null || isTETypeAttribute) { + // fetches the teAttribute details (isUnique, isOptionSet) + + dataValues?.let { values -> + // normalize values: if the attribute doesn't have custom intent that returns multiple values + // and there are multiple values, join them into a single comma-separated value + val normalizedValues = + if (values.size > 1 && + !customIntentRepository.attributeHasCustomIntentAndReturnsAListOfValues( + dataId, + CustomIntentActionTypeModel.SEARCH, + ) + ) { + mutableListOf(values.joinToString(",")) + } else { + values + } + + val teAttribute = repository.getTEAttribute(dataId) + + repository.addToQuery( + dataId, + normalizedValues, + teAttribute.isUnique, + teAttribute.isOptionSet, + ) + } + } + } + } + } + + private suspend fun getIsTETypeAttribute( + selectedProgram: String?, + dataId: String, + teType: String, + ): Boolean = + if (selectedProgram == null) { + repository.isTETypeAttribute(teType, dataId) + } else { + false + } +} diff --git a/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntitiesTest.kt b/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntitiesTest.kt new file mode 100644 index 00000000000..d8c89db0806 --- /dev/null +++ b/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntitiesTest.kt @@ -0,0 +1,504 @@ +package org.dhis2.tracker.search.domain + +import androidx.paging.PagingData +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.test.runTest +import org.dhis2.mobile.commons.customintents.CustomIntentRepository +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.mobile.commons.model.CustomIntentActionTypeModel +import org.dhis2.tracker.search.data.SearchTrackedEntityRepository +import org.dhis2.tracker.search.model.SearchTrackedEntitiesInput +import org.dhis2.tracker.search.model.SearchTrackedEntityAttribute +import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.mockito.kotlin.any +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.eq +import org.mockito.kotlin.mock +import org.mockito.kotlin.never +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever + +class SearchTrackedEntitiesTest { + private lateinit var useCase: SearchTrackedEntities + + private val repository: SearchTrackedEntityRepository = mock() + private val customIntentRepository: CustomIntentRepository = mock() + private val teType = "personType" + + @Before + fun setup() { + useCase = + SearchTrackedEntities( + repository = repository, + customIntentRepository = customIntentRepository, + teType = teType, + ) + } + + @Test + fun `invoke should successfully return flow when query has data`() = + runTest { + // Given + val queryData = mutableMapOf?>("attr1" to listOf("value1"), "attr2" to listOf("value2")) + val searchParams = + SearchTrackedEntitiesInput( + selectedProgram = "programUid", + allowCache = true, + excludeValues = hashSetOf(), + hasStateFilters = false, + isOnline = true, + queryData = queryData, + ) + + val mockPagingData: PagingData = PagingData.empty() + val mockFlow: Flow> = flowOf(mockPagingData) + + whenever(repository.isTETypeAttribute(eq(teType), any())) doReturn true + whenever(repository.getTEAttribute(any())) doReturn + SearchTrackedEntityAttribute( + isUnique = false, + isOptionSet = false, + ) + whenever( + customIntentRepository.attributeHasCustomIntentAndReturnsAListOfValues( + any(), + eq(CustomIntentActionTypeModel.SEARCH), + ), + ) doReturn false + whenever(repository.fetchResults(any(), any(), any())) doReturn mockFlow + + // When + val result = useCase.invoke(searchParams) + + // Then + assertTrue(result.isSuccess) + verify(repository).addFiltersToQuery("programUid", teType) + verify(repository).addToQuery( + dataId = "attr1", + dataValues = listOf("value1"), + isUnique = false, + isOptionSet = false, + ) + verify(repository).addToQuery( + dataId = "attr2", + dataValues = listOf("value2"), + isUnique = false, + isOptionSet = false, + ) + verify(repository).fetchResults( + isOnline = true, + hasStateFilters = false, + allowCache = true, + ) + } + + @Test + fun `invoke should successfully return flow when query is null`() = + runTest { + // Given + val searchParams = + SearchTrackedEntitiesInput( + selectedProgram = "programUid", + allowCache = true, + excludeValues = hashSetOf(), + hasStateFilters = false, + isOnline = false, + queryData = null, + ) + + val mockPagingData: PagingData = PagingData.empty() + val mockFlow: Flow> = flowOf(mockPagingData) + + whenever(repository.fetchResults(any(), any(), any())) doReturn mockFlow + + // When + val result = useCase.invoke(searchParams) + + // Then + assertTrue(result.isSuccess) + verify(repository).addFiltersToQuery("programUid", teType) + verify(repository, never()).addToQuery(any(), any(), any(), any()) + verify(repository).fetchResults( + isOnline = false, + hasStateFilters = false, + allowCache = true, + ) + } + + @Test + fun `invoke should exclude values when no program is selected`() = + runTest { + // Given + val excludedValues = hashSetOf("excludedUid1", "excludedUid2") + val searchParams = + SearchTrackedEntitiesInput( + selectedProgram = null, + allowCache = true, + excludeValues = excludedValues, + hasStateFilters = false, + isOnline = false, + queryData = null, + ) + + val mockPagingData: PagingData = PagingData.empty() + val mockFlow: Flow> = flowOf(mockPagingData) + + whenever(repository.fetchResults(any(), any(), any())) doReturn mockFlow + + // When + val result = useCase.invoke(searchParams) + + // Then + assertTrue(result.isSuccess) + verify(repository).excludeValuesFromQuery(excludedValues.toList()) + } + + @Test + fun `invoke should not exclude values when program is selected`() = + runTest { + // Given + val excludedValues = hashSetOf("excludedUid1", "excludedUid2") + val searchParams = + SearchTrackedEntitiesInput( + selectedProgram = "programUid", + allowCache = true, + excludeValues = excludedValues, + hasStateFilters = false, + isOnline = false, + queryData = null, + ) + + val mockPagingData: PagingData = PagingData.empty() + val mockFlow: Flow> = flowOf(mockPagingData) + + whenever(repository.fetchResults(any(), any(), any())) doReturn mockFlow + + // When + val result = useCase.invoke(searchParams) + + // Then + assertTrue(result.isSuccess) + verify(repository, never()).excludeValuesFromQuery(any()) + } + + @Test + fun `invoke should add query for unique attributes`() = + runTest { + // Given + val queryData = mutableMapOf?>("uniqueAttr" to listOf("exactValue")) + val searchParams = + SearchTrackedEntitiesInput( + selectedProgram = "programUid", + allowCache = true, + excludeValues = hashSetOf(), + hasStateFilters = false, + isOnline = true, + queryData = queryData, + ) + + val mockPagingData: PagingData = PagingData.empty() + val mockFlow: Flow> = flowOf(mockPagingData) + + whenever(repository.isTETypeAttribute(eq(teType), any())) doReturn true + whenever(repository.getTEAttribute("uniqueAttr")) doReturn + SearchTrackedEntityAttribute( + isUnique = true, + isOptionSet = false, + ) + whenever( + customIntentRepository.attributeHasCustomIntentAndReturnsAListOfValues( + any(), + eq(CustomIntentActionTypeModel.SEARCH), + ), + ) doReturn false + whenever(repository.fetchResults(any(), any(), any())) doReturn mockFlow + + // When + val result = useCase.invoke(searchParams) + + // Then + assertTrue(result.isSuccess) + verify(repository).addToQuery( + dataId = "uniqueAttr", + dataValues = listOf("exactValue"), + isUnique = true, + isOptionSet = false, + ) + } + + @Test + fun `invoke should add query for option set attributes`() = + runTest { + // Given + val queryData = mutableMapOf?>("optionSetAttr" to listOf("optionValue")) + val searchParams = + SearchTrackedEntitiesInput( + selectedProgram = "programUid", + allowCache = true, + excludeValues = hashSetOf(), + hasStateFilters = false, + isOnline = true, + queryData = queryData, + ) + + val mockPagingData: PagingData = PagingData.empty() + val mockFlow: Flow> = flowOf(mockPagingData) + + whenever(repository.isTETypeAttribute(eq(teType), any())) doReturn true + whenever(repository.getTEAttribute("optionSetAttr")) doReturn + SearchTrackedEntityAttribute( + isUnique = false, + isOptionSet = true, + ) + whenever( + customIntentRepository.attributeHasCustomIntentAndReturnsAListOfValues( + any(), + eq(CustomIntentActionTypeModel.SEARCH), + ), + ) doReturn false + whenever(repository.fetchResults(any(), any(), any())) doReturn mockFlow + + // When + val result = useCase.invoke(searchParams) + + // Then + assertTrue(result.isSuccess) + verify(repository).addToQuery( + dataId = "optionSetAttr", + dataValues = listOf("optionValue"), + isUnique = false, + isOptionSet = true, + ) + } + + @Test + fun `invoke should join multiple values when custom intent does not return list`() = + runTest { + // Given + val queryData = mutableMapOf?>("attr1" to listOf("value1", "value2", "value3")) + val searchParams = + SearchTrackedEntitiesInput( + selectedProgram = "programUid", + allowCache = true, + excludeValues = hashSetOf(), + hasStateFilters = false, + isOnline = true, + queryData = queryData, + ) + + val mockPagingData: PagingData = PagingData.empty() + val mockFlow: Flow> = flowOf(mockPagingData) + + whenever(repository.isTETypeAttribute(eq(teType), any())) doReturn true + whenever(repository.getTEAttribute(any())) doReturn + SearchTrackedEntityAttribute( + isUnique = false, + isOptionSet = false, + ) + whenever( + customIntentRepository.attributeHasCustomIntentAndReturnsAListOfValues( + "attr1", + CustomIntentActionTypeModel.SEARCH, + ), + ) doReturn false + whenever(repository.fetchResults(any(), any(), any())) doReturn mockFlow + + // When + val result = useCase.invoke(searchParams) + + // Then + assertTrue(result.isSuccess) + verify(repository).addToQuery( + dataId = "attr1", + dataValues = listOf("value1,value2,value3"), + isUnique = false, + isOptionSet = false, + ) + } + + @Test + fun `invoke should keep multiple values when custom intent returns list`() = + runTest { + // Given + val queryData = mutableMapOf?>("attr1" to listOf("value1", "value2", "value3")) + val searchParams = + SearchTrackedEntitiesInput( + selectedProgram = "programUid", + allowCache = true, + excludeValues = hashSetOf(), + hasStateFilters = false, + isOnline = true, + queryData = queryData, + ) + + val mockPagingData: PagingData = PagingData.empty() + val mockFlow: Flow> = flowOf(mockPagingData) + + whenever(repository.isTETypeAttribute(eq(teType), any())) doReturn true + whenever(repository.getTEAttribute(any())) doReturn + SearchTrackedEntityAttribute( + isUnique = false, + isOptionSet = false, + ) + whenever( + customIntentRepository.attributeHasCustomIntentAndReturnsAListOfValues( + "attr1", + CustomIntentActionTypeModel.SEARCH, + ), + ) doReturn true + whenever(repository.fetchResults(any(), any(), any())) doReturn mockFlow + + // When + val result = useCase.invoke(searchParams) + + // Then + assertTrue(result.isSuccess) + verify(repository).addToQuery( + dataId = "attr1", + dataValues = listOf("value1", "value2", "value3"), + isUnique = false, + isOptionSet = false, + ) + } + + @Test + fun `invoke should skip attributes not belonging to teType when no program selected`() = + runTest { + // Given + val queryData = mutableMapOf?>("attr1" to listOf("value1"), "attr2" to listOf("value2")) + val searchParams = + SearchTrackedEntitiesInput( + selectedProgram = null, + allowCache = true, + excludeValues = hashSetOf(), + hasStateFilters = false, + isOnline = false, + queryData = queryData, + ) + + val mockPagingData: PagingData = PagingData.empty() + val mockFlow: Flow> = flowOf(mockPagingData) + + whenever(repository.isTETypeAttribute(teType, "attr1")) doReturn true + whenever(repository.isTETypeAttribute(teType, "attr2")) doReturn false + whenever(repository.getTEAttribute("attr1")) doReturn + SearchTrackedEntityAttribute( + isUnique = false, + isOptionSet = false, + ) + whenever( + customIntentRepository.attributeHasCustomIntentAndReturnsAListOfValues( + any(), + eq(CustomIntentActionTypeModel.SEARCH), + ), + ) doReturn false + whenever(repository.fetchResults(any(), any(), any())) doReturn mockFlow + + // When + val result = useCase.invoke(searchParams) + + // Then + assertTrue(result.isSuccess) + verify(repository).addToQuery( + dataId = "attr1", + dataValues = listOf("value1"), + isUnique = false, + isOptionSet = false, + ) + verify(repository, never()).getTEAttribute("attr2") + } + + @Test + fun `invoke should return failure when domain error occurs`() = + runTest { + // Given + val searchParams = + SearchTrackedEntitiesInput( + selectedProgram = "programUid", + allowCache = true, + excludeValues = hashSetOf(), + hasStateFilters = false, + isOnline = true, + queryData = null, + ) + + val domainError = DomainError.UnexpectedError("Test error") + + whenever(repository.fetchResults(any(), any(), any())).thenAnswer { throw domainError } + + // When + val result = useCase.invoke(searchParams) + + // Then + assertTrue(result.isFailure) + assertTrue(result.exceptionOrNull() is DomainError.UnexpectedError) + assertEquals("Test error", (result.exceptionOrNull() as DomainError.UnexpectedError).message) + } + + @Test + fun `invoke should handle online search with state filters`() = + runTest { + // Given + val searchParams = + SearchTrackedEntitiesInput( + selectedProgram = "programUid", + allowCache = false, + excludeValues = hashSetOf(), + hasStateFilters = true, + isOnline = true, + queryData = null, + ) + + val mockPagingData: PagingData = PagingData.empty() + val mockFlow: Flow> = flowOf(mockPagingData) + + whenever(repository.fetchResults(any(), any(), any())) doReturn mockFlow + + // When + val result = useCase.invoke(searchParams) + + // Then + assertTrue(result.isSuccess) + verify(repository).fetchResults( + isOnline = true, + hasStateFilters = true, + allowCache = false, + ) + } + + @Test + fun `invoke should handle offline search`() = + runTest { + // Given + val searchParams = + SearchTrackedEntitiesInput( + selectedProgram = "programUid", + allowCache = true, + excludeValues = hashSetOf(), + hasStateFilters = false, + isOnline = false, + queryData = null, + ) + + val mockPagingData: PagingData = PagingData.empty() + val mockFlow: Flow> = flowOf(mockPagingData) + + whenever(repository.fetchResults(any(), any(), any())) doReturn mockFlow + + // When + val result = useCase.invoke(searchParams) + + // Then + assertTrue(result.isSuccess) + verify(repository).fetchResults( + isOnline = false, + hasStateFilters = false, + allowCache = true, + ) + } +} diff --git a/tracker/src/desktopMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.desktop.kt b/tracker/src/desktopMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.desktop.kt new file mode 100644 index 00000000000..94b83b71c1d --- /dev/null +++ b/tracker/src/desktopMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.desktop.kt @@ -0,0 +1,13 @@ +package org.dhis2.tracker.search.di + +import org.koin.core.module.Module +import org.koin.dsl.module + +/** + * Desktop-specific implementation of the tracker search repository module. + * Currently empty as desktop support is not yet implemented for search. + */ +internal actual val trackerSearchRepositoryModule: Module = + module { + // Desktop implementation placeholder + } From f2dbbec51d1466adc19a3133eba6115b98ede5fa Mon Sep 17 00:00:00 2001 From: Xavier Molloy Date: Thu, 5 Feb 2026 16:10:12 +0100 Subject: [PATCH 042/260] feat: [ANDROAPP-7472] V Use case implementation into SearchTEIViewModel [skip size] (#4627) * feat: [ANDROAPP-7472] copilot review * fix: [ANDROAPP-7472] Code review comments * feat: [ANDROAPP-7472] copilot review * fix: [ANDROAPP-7472] Code review comments * feat: [ANDROAPP-7472] Add tests for new repository and usecases (#4625) * chore: [ANDROAPP-7472] Small code review improvements * feat: [ANDROAPP-7472] Load search results with new use case, map to old model * fix: [ANDROAPP-7472] Code review comments * chore: [ANDROAPP-7472] Replace old repository calls with new usecase * chore: [ANDROAPP-7472] Adapt tests to new usecase * chore: [ANDROAPP-7472] Adapt usecase to return unpaginated results, fix sonar code smells --- .../SearchRepositoryImplKt.kt | 70 ++---- .../searchTrackEntity/SearchRepositoryKt.kt | 20 +- .../searchTrackEntity/SearchTEIViewModel.kt | 235 ++++++++++-------- .../searchTrackEntity/SearchTEModule.java | 2 +- .../SearchTEIViewModelTest.kt | 48 ++-- .../data/SearchTrackedEntityRepositoryImpl.kt | 18 ++ .../data/SearchTrackedEntityRepository.kt | 5 + .../search/domain/SearchTrackedEntities.kt | 23 ++ 8 files changed, 227 insertions(+), 194 deletions(-) diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImplKt.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImplKt.kt index c1fe2f61fc9..2b58b3492b2 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImplKt.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImplKt.kt @@ -2,11 +2,9 @@ package org.dhis2.usescases.searchTrackEntity -import androidx.paging.PagingData import androidx.paging.map import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.FlowPreview -import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.flatMapLatest @@ -63,49 +61,32 @@ class SearchRepositoryImplKt( private val fetchedTeiUids = HashSet() - override fun searchTrackedEntities( - searchParametersModel: SearchParametersModel, - isOnline: Boolean, - ): Flow> = - trackedEntitySearchQuery(searchParametersModel, isOnline) - .getPagingData(10) - - private fun trackedEntitySearchQuery( - searchParametersModel: SearchParametersModel, - isOnline: Boolean, - ): TrackedEntitySearchCollectionRepository { - var allowCache = false - savedSearchParameters = searchParametersModel.copy() - savedFilters = FilterManager.getInstance().copy() - - if (searchParametersModel != savedSearchParameters || - !FilterManager - .getInstance() - .sameFilters(savedFilters) - ) { - trackedEntityInstanceQuery = - searchRepositoryJava.getFilteredRepository(searchParametersModel) - } else { - trackedEntityInstanceQuery = - searchRepositoryJava.getFilteredRepository(searchParametersModel) - allowCache = true + override fun saveSearchValuesAndGetAllowCache( + queryData: MutableMap?>?, + programUid: String?, + ): Boolean { + if (!this::savedSearchParameters.isInitialized) { + savedSearchParameters = + SearchParametersModel(queryData = queryData, selectedProgram = searchRepositoryJava.getProgram(programUid)) } - - if (fetchedTeiUids.isNotEmpty() && searchParametersModel.selectedProgram == null) { - trackedEntityInstanceQuery = - trackedEntityInstanceQuery.excludeUids().`in`(fetchedTeiUids.toList()) + if (!this::savedFilters.isInitialized) { + savedFilters = FilterManager.getInstance().copy() } - - val pagerFlow = - if (isOnline && FilterManager.getInstance().stateFilters.isEmpty()) { - trackedEntityInstanceQuery.allowOnlineCache().eq(allowCache).offlineFirst() - } else { - trackedEntityInstanceQuery.allowOnlineCache().eq(allowCache).offlineOnly() - } - - return pagerFlow + val allowCache = + queryData == savedSearchParameters.queryData && + FilterManager + .getInstance() + .sameFilters(savedFilters) + savedSearchParameters = savedSearchParameters.copy(queryData = queryData) + savedFilters = FilterManager.getInstance().copy() + return allowCache } + override fun getExcludeValues(): HashSet? = + fetchedTeiUids.ifEmpty { + null + } + override suspend fun searchParameters( programUid: String?, teiTypeUid: String, @@ -136,13 +117,6 @@ class SearchRepositoryImplKt( .blockingGet() ?.unique() ?: false - override suspend fun searchTrackedEntitiesImmediate( - searchParametersModel: SearchParametersModel, - isOnline: Boolean, - ): List = - trackedEntitySearchQuery(searchParametersModel, isOnline) - .blockingGet() - override fun searchTeiForMap( searchParametersModel: SearchParametersModel, isOnline: Boolean, diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryKt.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryKt.kt index d07c0c6130e..a69fd6198b0 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryKt.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryKt.kt @@ -1,31 +1,18 @@ package org.dhis2.usescases.searchTrackEntity -import androidx.paging.PagingData -import kotlinx.coroutines.flow.Flow import org.dhis2.data.search.SearchParametersModel import org.dhis2.form.model.FieldUiModel import org.dhis2.maps.model.MapItemModel import org.dhis2.mobile.commons.model.CustomIntentModel import org.dhis2.tracker.ui.input.action.FieldUid import org.hisp.dhis.android.core.program.Program -import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItem interface SearchRepositoryKt { - fun searchTrackedEntities( - searchParametersModel: SearchParametersModel, - isOnline: Boolean, - ): Flow> - suspend fun searchParameters( programUid: String?, teiTypeUid: String, ): List - suspend fun searchTrackedEntitiesImmediate( - searchParametersModel: SearchParametersModel, - isOnline: Boolean, - ): List - fun searchTeiForMap( searchParametersModel: SearchParametersModel, isOnline: Boolean, @@ -42,4 +29,11 @@ interface SearchRepositoryKt { ): List suspend fun getCustomIntent(fieldUid: FieldUid): CustomIntentModel? + + fun saveSearchValuesAndGetAllowCache( + queryData: MutableMap?>?, + programUid: String?, + ): Boolean + + fun getExcludeValues(): HashSet? } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt index 6dfe89d4a18..213c805f2d7 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt @@ -43,7 +43,6 @@ import org.dhis2.commons.filters.FilterManager import org.dhis2.commons.network.NetworkUtils import org.dhis2.commons.resources.ResourceManager import org.dhis2.commons.viewmodel.DispatcherProvider -import org.dhis2.data.search.SearchParametersModel import org.dhis2.form.model.FieldUiModelImpl import org.dhis2.form.ui.customintent.CustomIntentResult import org.dhis2.form.ui.intent.FormIntent @@ -55,7 +54,9 @@ import org.dhis2.maps.managers.MapManager import org.dhis2.maps.usecases.MapStyleConfiguration import org.dhis2.mobile.commons.coroutine.CoroutineTracker import org.dhis2.tracker.NavigationBarUIState +import org.dhis2.tracker.search.data.transformDomainTeiToSDKTei import org.dhis2.tracker.search.domain.SearchTrackedEntities +import org.dhis2.tracker.search.model.SearchTrackedEntitiesInput import org.dhis2.tracker.ui.input.action.CustomIntentUid import org.dhis2.tracker.ui.input.action.FieldUid import org.dhis2.tracker.ui.input.action.TrackerInputAction @@ -461,116 +462,130 @@ class SearchTEIViewModel( searchParametersUiState.copy(searchEnabled = queryData.isNotEmpty()) } - private suspend fun loadSearchResults() = - withContext(dispatchers.io()) { - val searchParametersModel = - SearchParametersModel( - selectedProgram = searchRepository.getProgram(initialProgramUid), + private fun loadSearchResults(): Flow> = + flow { + // get uids to exclude for possible duplicates + val excludeValues = searchRepositoryKt.getExcludeValues() + + val isOnline = searching && networkUtils.isOnline() + val selectedProgram = searchRepository.getProgram(initialProgramUid) + + val allowCache = searchRepositoryKt.saveSearchValuesAndGetAllowCache(queryData, selectedProgram?.uid()) + val newTrackerSearchModel = + SearchTrackedEntitiesInput( + selectedProgram = selectedProgram?.uid(), + allowCache = allowCache, + excludeValues = excludeValues, + hasStateFilters = filterManager.stateFilters.isNotEmpty(), + isOnline = isOnline, queryData = queryData, ) - val getPagingData = - searchRepositoryKt.searchTrackedEntities( - searchParametersModel, - searching && networkUtils.isOnline(), - ) + val results = searchTrackedEntities.invoke(newTrackerSearchModel) - return@withContext getPagingData.map { pagingData -> - pagingData.map { item -> - withContext(dispatchers.io()) { - if ( - searching && - networkUtils.isOnline() && - filterManager.stateFilters.isEmpty() - ) { - searchRepository.transform( - item, - searchParametersModel.selectedProgram, - false, - filterManager.sortingItem, - ) - } else { + emitAll( + results.getOrThrow().map { pagingData -> + pagingData.map { item -> + withContext(dispatchers.io()) { + // TODO Create a new SearchTeiModel that does not use + // SDK objects and remove this mapping from the domain model back to the SDK one + val sdkTei = transformDomainTeiToSDKTei(item) + val searchOnline = + isOnline && + filterManager.stateFilters.isEmpty() searchRepository.transform( - item, - searchParametersModel.selectedProgram, - true, + sdkTei, + selectedProgram, + !searchOnline, filterManager.sortingItem, ) } } - } - } + }, + ) } - private suspend fun loadDisplayInListResults() = - withContext(dispatchers.io()) { - val searchParametersModel = - SearchParametersModel( - selectedProgram = searchRepository.getProgram(initialProgramUid), + private fun loadDisplayInListResults(): Flow> = + flow { + val excludeValues = searchRepositoryKt.getExcludeValues() + val selectedProgram = searchRepository.getProgram(initialProgramUid) + + val allowCache = searchRepositoryKt.saveSearchValuesAndGetAllowCache(queryData, selectedProgram?.uid()) + val newTrackerSearchModel = + SearchTrackedEntitiesInput( + selectedProgram = selectedProgram?.uid(), + allowCache = allowCache, + excludeValues = excludeValues, + hasStateFilters = filterManager.stateFilters.isNotEmpty(), + isOnline = false, queryData = queryData, ) - val getPagingData = - searchRepositoryKt.searchTrackedEntities( - searchParametersModel, - false, - ) + val results = searchTrackedEntities.invoke(newTrackerSearchModel) - return@withContext getPagingData.map { pagingData -> - pagingData.map { item -> - withContext(dispatchers.io()) { - searchRepository.transform( - item, - searchParametersModel.selectedProgram, - true, - filterManager.sortingItem, - ) + emitAll( + results.getOrThrow().map { pagingData -> + pagingData.map { item -> + withContext(dispatchers.io()) { + // TODO Create a new SearchTeiModel that does not use + // SDK objects and remove this mapping from the domain model back to the SDK one + val sdkTei = transformDomainTeiToSDKTei(item) + searchRepository.transform( + sdkTei, + selectedProgram, + true, + filterManager.sortingItem, + ) + } } - } - } + }, + ) } - suspend fun fetchGlobalResults() = - withContext(dispatchers.io()) { - val searchParametersModel = - SearchParametersModel( - selectedProgram = null, - queryData = queryData, - ) - val getPagingData = - searchRepositoryKt.searchTrackedEntities( - searchParametersModel, - searching && networkUtils.isOnline(), - ) - - return@withContext if (searching) { - getPagingData.map { pagingData -> - pagingData.map { item -> - withContext(dispatchers.io()) { - if ( - searching && - networkUtils.isOnline() && - filterManager.stateFilters.isEmpty() - ) { - searchRepository.transform( - item, - searchParametersModel.selectedProgram, - false, - filterManager.sortingItem, - ) - } else { + fun fetchGlobalResults(): Flow>? { + // get uids to exclude for possible duplicates + return if (searching) { + flow { + val excludeValues = searchRepositoryKt.getExcludeValues() + + val isOnline = searching && networkUtils.isOnline() + val selectedProgram = searchRepository.getProgram(initialProgramUid) + + val allowCache = searchRepositoryKt.saveSearchValuesAndGetAllowCache(queryData, selectedProgram?.uid()) + val newTrackerSearchModel = + SearchTrackedEntitiesInput( + selectedProgram = null, + allowCache = allowCache, + excludeValues = excludeValues, + hasStateFilters = filterManager.stateFilters.isNotEmpty(), + isOnline = isOnline, + queryData = queryData, + ) + val results = searchTrackedEntities.invoke(newTrackerSearchModel) + + emitAll( + results.getOrThrow().map { pagingData -> + pagingData.map { item -> + withContext(dispatchers.io()) { + // TODO Create a new SearchTeiModel that does not use + // SDK objects and remove this mapping from the domain model back to the SDK one + val sdkTei = transformDomainTeiToSDKTei(item) + val searchOnline = + isOnline && + filterManager.stateFilters.isEmpty() searchRepository.transform( - item, - searchParametersModel.selectedProgram, - true, + sdkTei, + selectedProgram, + !searchOnline, filterManager.sortingItem, ) } } - } - } - } else { - null + }, + ) } + } else { + null } + } fun fetchMapResults() { CoroutineTracker.increment() @@ -1070,33 +1085,43 @@ class SearchTEIViewModel( searchedItems = getFriendlyQueryData(), ) - val searchParametersModel = - SearchParametersModel( - selectedProgram = searchRepository.getProgram(initialProgramUid), + val isOnline = searching && networkUtils.isOnline() + val selectedProgram = searchRepository.getProgram(initialProgramUid) + + // get uids to exclude for possible duplicates + val excludeValues = searchRepositoryKt.getExcludeValues() + + val newTrackerSearchModel = + SearchTrackedEntitiesInput( + selectedProgram = selectedProgram?.uid(), + allowCache = false, // No need for cache in immediate search + excludeValues = excludeValues, + hasStateFilters = filterManager.stateFilters.isNotEmpty(), + isOnline = isOnline, queryData = queryData, ) - val isOnline = searching && networkUtils.isOnline() - val trackedEntities = - async(dispatchers.io()) { - searchRepositoryKt.searchTrackedEntitiesImmediate( - searchParametersModel = searchParametersModel, - isOnline = isOnline, - ) - }.await() + + // Use invokeImmediate for QR code scanning to get immediate non-paginated results + val trackedEntitiesResult = searchTrackedEntities.invokeImmediate(newTrackerSearchModel) + + val trackedEntities = trackedEntitiesResult.getOrNull() ?: emptyList() if (trackedEntities.isEmpty() || trackedEntities.size > 1) return@launch val tei = trackedEntities.first() + + // Transform domain model to SDK model for compatibility with existing code + val sdkTei = + withContext(dispatchers.io()) { + transformDomainTeiToSDKTei(tei) + } + val searchTeiModel = withContext(dispatchers.io()) { searchRepository.transform( - // searchItem = - tei, - // selectedProgram = - searchParametersModel.selectedProgram, - // offlineOnly = + sdkTei, + selectedProgram, !(isOnline && filterManager.stateFilters.isEmpty()), - // sortingItem = filterManager.sortingItem, ) } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java index 5bd9b79947d..372f433cfa4 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java @@ -358,7 +358,7 @@ SearchTeiViewModelFactory providesViewModelFactory( @PerActivity SearchTrackedEntities provideLoadSearchResultsUseCase( SearchTrackedEntityRepository searchTrackedEntityRepository, - org.dhis2.mobile.commons.customintents.CustomIntentRepository customIntentRepository + CustomIntentRepository customIntentRepository ) { return new SearchTrackedEntities( searchTrackedEntityRepository, diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt index 543fbdf0dba..45e88671f9f 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt @@ -23,7 +23,6 @@ import org.dhis2.commons.filters.FilterManager import org.dhis2.commons.network.NetworkUtils import org.dhis2.commons.resources.ResourceManager import org.dhis2.commons.viewmodel.DispatcherProvider -import org.dhis2.data.search.SearchParametersModel import org.dhis2.form.model.FieldUiModel import org.dhis2.form.model.FieldUiModelImpl import org.dhis2.form.ui.customintent.CustomIntentResult @@ -33,6 +32,7 @@ import org.dhis2.maps.geometry.mapper.EventsByProgramStage import org.dhis2.maps.usecases.MapStyleConfiguration import org.dhis2.mobile.commons.model.CustomIntentModel import org.dhis2.tracker.search.domain.SearchTrackedEntities +import org.dhis2.tracker.search.model.SearchTrackedEntitiesInput import org.dhis2.tracker.ui.input.action.TrackerInputAction import org.dhis2.usescases.searchTrackEntity.listView.SearchResult.SearchResultType import org.dhis2.utils.customviews.navigationbar.NavigationPage @@ -49,8 +49,9 @@ import org.junit.Test import org.maplibre.geojson.BoundingBox import org.mockito.kotlin.any import org.mockito.kotlin.doReturn +import org.mockito.kotlin.eq import org.mockito.kotlin.mock -import org.mockito.kotlin.times +import org.mockito.kotlin.never import org.mockito.kotlin.verify import org.mockito.kotlin.whenever @@ -63,10 +64,7 @@ class SearchTEIViewModelTest { private val initialProgram = "programUid" private val initialQuery = mutableMapOf?>() private val repository: SearchRepository = mock() - private val repositoryKt: SearchRepositoryKt = - mock { - on { searchTrackedEntities(any(), any()) } doReturn flowOf(PagingData.empty()) - } + private val repositoryKt: SearchRepositoryKt = mock() private val pageConfigurator: SearchPageConfigurator = mock() private val mapDataRepository: MapDataRepository = mock() private val networkUtils: NetworkUtils = mock() @@ -74,7 +72,10 @@ class SearchTEIViewModelTest { private val resourceManager: ResourceManager = mock() private val displayNameProvider: DisplayNameProvider = mock() private val filterManager: FilterManager = mock() - private val searchTrackedEntities: SearchTrackedEntities = mock() + private val searchTrackedEntities: SearchTrackedEntities = + mock { + onBlocking { invoke(any()) } doReturn Result.success(flowOf(PagingData.empty())) + } @ExperimentalCoroutinesApi private val testingDispatcher = StandardTestDispatcher() @@ -88,6 +89,8 @@ class SearchTEIViewModelTest { whenever(repository.canCreateInProgramWithoutSearch()) doReturn true whenever(repository.getTrackedEntityType()) doReturn testingTrackedEntityType() whenever(repository.filtersApplyOnGlobalSearch()) doReturn true + whenever(repositoryKt.getExcludeValues()) doReturn HashSet() + whenever(repositoryKt.saveSearchValuesAndGetAllowCache(any(), any())) doReturn true viewModel = SearchTEIViewModel( initialProgram, @@ -279,12 +282,17 @@ class SearchTEIViewModelTest { viewModel.searchPagingData.take(1).asSnapshot() - verify(repositoryKt).searchTrackedEntities( - SearchParametersModel( - selectedProgram = testingProgram, - queryData = mutableMapOf(), + verify(searchTrackedEntities).invoke( + eq( + SearchTrackedEntitiesInput( + selectedProgram = testingProgram.uid(), + queryData = mutableMapOf(), + allowCache = true, + excludeValues = emptySet(), + hasStateFilters = false, + isOnline = false, + ), ), - false, ) } @@ -295,21 +303,7 @@ class SearchTEIViewModelTest { setCurrentProgram(testingProgram) viewModel.searchPagingData.test { awaitItem() - verify(repositoryKt, times(0)).searchTrackedEntities( - SearchParametersModel( - selectedProgram = testingProgram, - queryData = mutableMapOf(), - ), - true, - ) - - verify(repositoryKt, times(0)).searchTrackedEntities( - SearchParametersModel( - selectedProgram = testingProgram, - queryData = mutableMapOf(), - ), - false, - ) + verify(searchTrackedEntities, never()).invoke(any()) } } diff --git a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImpl.kt b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImpl.kt index 2dc088b2573..a4bfd48d5e4 100644 --- a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImpl.kt +++ b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImpl.kt @@ -105,4 +105,22 @@ class SearchTrackedEntityRepositoryImpl( } } ?: throw IllegalStateException("TrackedEntityInstanceQuery is not initialized") } + + override suspend fun fetchImmediateResults( + isOnline: Boolean, + hasStateFilters: Boolean, + ): List { + // if the device is online and there are no state filters, we can use online cache + val results = + if (isOnline && !hasStateFilters) { + trackedEntityInstanceQuery?.offlineFirst()?.blockingGet() + } else { + // otherwise we use offline only + trackedEntityInstanceQuery?.offlineOnly()?.blockingGet() + } + + return results?.map { item -> + item.toTrackedEntitySearchItemResult() + } ?: throw IllegalStateException("TrackedEntityInstanceQuery is not initialized") + } } diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepository.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepository.kt index 577775d93a9..2cd934ed16d 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepository.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepository.kt @@ -32,4 +32,9 @@ interface SearchTrackedEntityRepository { hasStateFilters: Boolean, allowCache: Boolean, ): Flow> + + suspend fun fetchImmediateResults( + isOnline: Boolean, + hasStateFilters: Boolean, + ): List } diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntities.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntities.kt index 32c1d9fd291..c313d045951 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntities.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntities.kt @@ -37,6 +37,29 @@ class SearchTrackedEntities( } } + /** + * Invoke method for immediate non-paginated results. + * Useful for scenarios like QR code scanning where immediate results are needed. + */ + suspend fun invokeImmediate(input: SearchTrackedEntitiesInput): Result> { + try { + prepareQuery(input, teType) + // Due to performance issues and possible duplicates we exclude the values in the exclude list only when no program is selected + if (input.excludeValues?.isNotEmpty() == true && input.selectedProgram == null) { + repository.excludeValuesFromQuery(input.excludeValues.toList()) + } + // fetch immediate results from repository + return Result.success( + repository.fetchImmediateResults( + isOnline = input.isOnline, + hasStateFilters = input.hasStateFilters, + ), + ) + } catch (domainError: DomainError) { + return Result.failure(domainError) + } + } + private suspend fun prepareQuery( input: SearchTrackedEntitiesInput, teType: String, From 42031e3fd6b0a51d1b934e430531051096126950 Mon Sep 17 00:00:00 2001 From: Pablo Date: Fri, 6 Feb 2026 07:10:45 +0100 Subject: [PATCH 043/260] feat: [ANDROAPP-7370] Support 6 and 12 hours metadata sync (#4605) * feat: [ANDROAPP-7370] Support 6 and 12 hours metadata sync * fix tests * ktlint * ktlint * fix: [ANDROAPP-7370] ktlint * fix test * restore ui when selecting sync period --------- Co-authored-by: Xavier Molloy --- .../usescases/settings/SettingsRepository.kt | 27 +++++------- .../settings/SyncManagerPresenter.kt | 9 +--- .../settings/ui/SyncMetadataSettingItem.kt | 44 +++++++++++++------ .../settings/SettingsRepositoryTest.kt | 42 ++++++++++++------ gradle/verification-metadata.xml | 11 +++-- 5 files changed, 80 insertions(+), 53 deletions(-) diff --git a/app/src/main/java/org/dhis2/usescases/settings/SettingsRepository.kt b/app/src/main/java/org/dhis2/usescases/settings/SettingsRepository.kt index 6c620134340..96f70fc217b 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/SettingsRepository.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/SettingsRepository.kt @@ -49,12 +49,7 @@ class SettingsRepository( null } private val programSettings: ProgramSettings? - get() = - if (d2.settingModule().programSetting().blockingExists()) { - d2.settingModule().programSetting().blockingGet() - } else { - null - } + get() = syncSettings?.programSettings() private val smsConfig: ConfigCase.SmsConfig get() = d2 @@ -179,13 +174,13 @@ class SettingsRepository( .isNotEmpty() private fun metadataPeriod(): Int = - generalSettings?.metadataSync()?.toSeconds() ?: prefs.getInt( + syncSettings?.metadataSync()?.toSeconds() ?: prefs.getInt( Preference.TIME_META, TIME_WEEKLY, ) private fun dataPeriod(): Int = - generalSettings?.dataSync()?.toSeconds() ?: prefs.getInt( + syncSettings?.dataSync()?.toSeconds() ?: prefs.getInt( Preference.TIME_DATA, TIME_DAILY, ) @@ -231,14 +226,11 @@ class SettingsRepository( private fun getLimitedScopeFromPreferences(): LimitScope { val byOrgUnit = prefs.getBoolean(Constants.LIMIT_BY_ORG_UNIT, false) val byProgram = prefs.getBoolean(Constants.LIMIT_BY_PROGRAM, false) - return if (byOrgUnit && !byProgram) { - LimitScope.PER_ORG_UNIT - } else if (!byOrgUnit && byProgram) { - LimitScope.PER_PROGRAM - } else if (byOrgUnit && byProgram) { - LimitScope.PER_OU_AND_PROGRAM - } else { - LimitScope.GLOBAL + return when { + byOrgUnit && byProgram -> LimitScope.PER_OU_AND_PROGRAM + byOrgUnit && !byProgram -> LimitScope.PER_ORG_UNIT + !byOrgUnit && byProgram -> LimitScope.PER_PROGRAM + else -> LimitScope.GLOBAL } } @@ -253,6 +245,7 @@ class SettingsRepository( suspend fun saveLimitScope(limitScope: LimitScope) { when (limitScope) { LimitScope.ALL_ORG_UNITS -> { + // Do nothing } LimitScope.GLOBAL -> { @@ -289,7 +282,7 @@ class SettingsRepository( .setGatewayNumber(gatewayNumber) .blockingAwait() } catch (e: Exception) { - Timber.d(e.message) + Timber.d(e) } } diff --git a/app/src/main/java/org/dhis2/usescases/settings/SyncManagerPresenter.kt b/app/src/main/java/org/dhis2/usescases/settings/SyncManagerPresenter.kt index ae5c98a3f97..d017aeb80d0 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/SyncManagerPresenter.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/SyncManagerPresenter.kt @@ -12,7 +12,6 @@ import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -import org.dhis2.commons.Constants import org.dhis2.commons.network.NetworkUtils import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.usescases.settings.domain.CheckVersionUpdate @@ -361,18 +360,14 @@ class SyncManagerPresenter( fun onSyncDataPeriodChanged(period: Int) { viewModelScope.launch(dispatcherProvider.io()) { launchSync(LaunchSync.SyncAction.UpdateSyncDataPeriod(period)) - if (period == Constants.TIME_MANUAL) { - loadData() - } + loadData() } } fun onSyncMetaPeriodChanged(period: Int) { viewModelScope.launch(dispatcherProvider.io()) { launchSync(LaunchSync.SyncAction.UpdateSyncMetadataPeriod(period)) - if (period == Constants.TIME_MANUAL) { - loadData() - } + loadData() } } diff --git a/app/src/main/java/org/dhis2/usescases/settings/ui/SyncMetadataSettingItem.kt b/app/src/main/java/org/dhis2/usescases/settings/ui/SyncMetadataSettingItem.kt index 7d78ecc6996..df68e65dbfe 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/ui/SyncMetadataSettingItem.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/ui/SyncMetadataSettingItem.kt @@ -1,6 +1,7 @@ package org.dhis2.usescases.settings.ui import android.content.Context +import androidx.annotation.StringRes import androidx.compose.foundation.layout.Arrangement.Absolute.spacedBy import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth @@ -21,9 +22,11 @@ import androidx.compose.ui.text.capitalize import androidx.compose.ui.text.intl.Locale import androidx.compose.ui.unit.dp import org.dhis2.R +import org.dhis2.bindings.EVERY_12_HOUR import org.dhis2.bindings.EVERY_24_HOUR +import org.dhis2.bindings.EVERY_6_HOUR import org.dhis2.bindings.EVERY_7_DAYS -import org.dhis2.commons.Constants +import org.dhis2.commons.Constants.TIME_MANUAL import org.dhis2.usescases.settings.SettingItem import org.dhis2.usescases.settings.models.MetadataSettingsViewModel import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItem @@ -77,11 +80,18 @@ internal fun SyncMetadataSettingItem( if (metadataSettings.canEdit) { val metaSyncPeriods = listOf( - stringResource(R.string.a_day), - stringResource(R.string.a_week), - stringResource(R.string.Manual), + SyncMetadataPeriods.Every6Hours, + SyncMetadataPeriods.Every12Hours, + SyncMetadataPeriods.Every24Hours, + SyncMetadataPeriods.EveryWeek, + SyncMetadataPeriods.Manual, ) + val dropdownItemLabel = + metaSyncPeriods.map { + stringResource(it.label) + } + var selectedItem by remember { mutableStateOf( @@ -101,21 +111,14 @@ internal fun SyncMetadataSettingItem( itemCount = metaSyncPeriods.size, onSearchOption = {}, fetchItem = { index -> - DropdownItem(metaSyncPeriods[index]) + DropdownItem(dropdownItemLabel[index]) }, selectedItem = selectedItem, onResetButtonClicked = { }, onItemSelected = { index, newItem -> selectedItem = newItem inputSyncConfigurationState = InputShellState.UNFOCUSED - when (index) { - 0 -> onSyncMetaPeriodChanged(EVERY_24_HOUR) - 1 -> onSyncMetaPeriodChanged(EVERY_7_DAYS) - 2 -> onSyncMetaPeriodChanged(Constants.TIME_MANUAL) - else -> { - // do nothing - } - } + onSyncMetaPeriodChanged(metaSyncPeriods[index].syncPeriod) }, showSearchBar = false, loadOptions = {}, @@ -193,3 +196,18 @@ private fun provideSyncInProgressInfoItems( isConstantItem = true, ), ) + +internal sealed class SyncMetadataPeriods( + @StringRes val label: Int, + val syncPeriod: Int, +) { + data object Every24Hours : SyncMetadataPeriods(R.string.a_day, EVERY_24_HOUR) + + data object Every12Hours : SyncMetadataPeriods(R.string.every_12_hours, EVERY_12_HOUR) + + data object Every6Hours : SyncMetadataPeriods(R.string.every_6_hours, EVERY_6_HOUR) + + data object EveryWeek : SyncMetadataPeriods(R.string.a_week, EVERY_7_DAYS) + + data object Manual : SyncMetadataPeriods(R.string.Manual, TIME_MANUAL) +} diff --git a/app/src/test/java/org/dhis2/usescases/settings/SettingsRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/settings/SettingsRepositoryTest.kt index 4f241f06d06..6fc5636760c 100644 --- a/app/src/test/java/org/dhis2/usescases/settings/SettingsRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/usescases/settings/SettingsRepositoryTest.kt @@ -27,6 +27,7 @@ import org.hisp.dhis.android.core.settings.LimitScope import org.hisp.dhis.android.core.settings.MetadataSyncPeriod import org.hisp.dhis.android.core.settings.ProgramSetting import org.hisp.dhis.android.core.settings.ProgramSettings +import org.hisp.dhis.android.core.settings.SynchronizationSettings import org.hisp.dhis.android.core.sms.domain.interactor.ConfigCase import org.junit.Before import org.junit.Test @@ -70,6 +71,7 @@ class SettingsRepositoryTest { @Test fun `Should return metadata period from general settings if exist`() { + configureSyncSettings(true) configureGeneralSettings(true) val testObserver = settingsRepository.metaSync().test() testObserver @@ -92,6 +94,7 @@ class SettingsRepositoryTest { @Test fun `Should return data period from general settings if exist`() { + configureSyncSettings(true) configureGeneralSettings(true) configureDataErrors() val testObserver = settingsRepository.dataSync().test() @@ -116,8 +119,9 @@ class SettingsRepositoryTest { @Test fun `Should return parameters from general settings if exist`() { + configureSyncSettings(true) configureGeneralSettings(true) - configureProgramSettings(true) + val testObserver = settingsRepository.syncParameters().test() testObserver .assertNoErrors() @@ -130,8 +134,9 @@ class SettingsRepositoryTest { @Test fun `Should return parameters from preferences if general settings does not exist`() { + configureSyncSettings(false) configureGeneralSettings(false) - configureProgramSettings(false) + val testObserver = settingsRepository.syncParameters().test() testObserver .assertNoErrors() @@ -146,6 +151,7 @@ class SettingsRepositoryTest { fun `Should return reserved values from settings if exist`() { configureGeneralSettings(true) val testObserver = settingsRepository.reservedValues().test() + testObserver .assertNoErrors() .assertValue { @@ -157,6 +163,7 @@ class SettingsRepositoryTest { fun `Should return reserved values from preferences if settings does not exist`() { configureGeneralSettings(false) val testObserver = settingsRepository.reservedValues().test() + testObserver .assertNoErrors() .assertValue { @@ -168,6 +175,7 @@ class SettingsRepositoryTest { fun `Should return editable sms configuration if settings does not exist`() { configureGeneralSettings(false) val testObserver = settingsRepository.sms().test() + testObserver .assertNoErrors() .assertValue { @@ -175,6 +183,17 @@ class SettingsRepositoryTest { } } + private fun configureSyncSettings(hasSyncSettings: Boolean) { + whenever( + d2.settingModule().synchronizationSettings().blockingExists(), + ) doReturn hasSyncSettings + if (hasSyncSettings) { + whenever( + d2.settingModule().synchronizationSettings().blockingGet(), + ) doReturn mockedSyncSettings() + } + } + private fun configureGeneralSettings(hasGeneralSettings: Boolean) { whenever(d2.settingModule().generalSetting().blockingExists()) doReturn hasGeneralSettings @@ -185,15 +204,6 @@ class SettingsRepositoryTest { } } - private fun configureProgramSettings(hasProgramSettings: Boolean) { - whenever(d2.settingModule().programSetting().blockingExists()) doReturn - hasProgramSettings - if (hasProgramSettings) { - whenever(d2.settingModule().programSetting().blockingGet()) doReturn - mockedProgramSettings() - } - } - private fun configurePreferences() { whenever( preferencesProvider.getString(Constants.LAST_META_SYNC, "-"), @@ -469,11 +479,17 @@ class SettingsRepositoryTest { whenever(d2.smsModule().configCase()) doReturn configCase } - private fun mockedGeneralSettings(): GeneralSettings = - GeneralSettings + private fun mockedSyncSettings() = + SynchronizationSettings .builder() .dataSync(SETTINGS_DATA_PERIOD) .metadataSync(SETTINGS_METADATA_PERIOD) + .programSettings(mockedProgramSettings()) + .build() + + private fun mockedGeneralSettings(): GeneralSettings = + GeneralSettings + .builder() .encryptDB(SETTINGS_ENCRYPT) .reservedValues(SETTINGS_RV) .build() diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 69d9a98c4ed..9da014e089c 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -12409,11 +12409,16 @@ - - - + + + + + + From 1759a884d70f5cedc8763037f1ff5dd2ba2edab7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Mon, 9 Feb 2026 12:11:02 +0100 Subject: [PATCH 044/260] test: Add waitForView in openMenuMoreOptions action in EventRobot.kt and clear some unused functions (#4642) --- .../usescases/event/EventRegistrationRobot.kt | 40 --------------- .../teidashboard/robot/EventRobot.kt | 50 +------------------ 2 files changed, 1 insertion(+), 89 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/event/EventRegistrationRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/event/EventRegistrationRobot.kt index d818ea3e31e..13f9abb3a6b 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/event/EventRegistrationRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/event/EventRegistrationRobot.kt @@ -3,13 +3,10 @@ package org.dhis2.usescases.event import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.junit4.ComposeTestRule import androidx.compose.ui.test.onNodeWithText -import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performScrollTo import androidx.test.espresso.Espresso.onView -import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers.withId -import androidx.test.platform.app.InstrumentationRegistry import org.dhis2.R import org.dhis2.common.BaseRobot import org.dhis2.common.matchers.hasCompletedPercentage @@ -25,45 +22,8 @@ fun eventRegistrationRobot( class EventRegistrationRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { - fun openMenuMoreOptions() { - onView(withId(R.id.moreOptions)).perform(click()) - } - - fun clickOnDelete() { - with(InstrumentationRegistry.getInstrumentation().targetContext) { - composeTestRule.onNodeWithText(getString(R.string.delete)).performClick() - } - } - fun checkEventDataEntryIsOpened(completion: Int, orgUnit: String) { onView(withId(R.id.completion)).check(matches(hasCompletedPercentage(completion))) composeTestRule.onNodeWithText(orgUnit).performScrollTo().assertIsDisplayed() } - - fun clickOnShare() { - with(InstrumentationRegistry.getInstrumentation().targetContext) { - composeTestRule.onNodeWithText(getString(R.string.share)).performClick() - } - } - - private fun clickOnNextQR() { - waitForView(withId(R.id.next)).perform(click()) - } - - fun clickOnAllQR(listQR: Int) { - var qrLength = 1 - - while (qrLength < listQR) { - clickOnNextQR() - qrLength++ - } - } - - fun clickOnDeleteDialog() { - onView(withId(R.id.possitive)).perform(click()) - } - - fun clickNextButton() { - waitForView(withId(R.id.action_button)).perform(click()) - } } diff --git a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/EventRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/EventRobot.kt index b42e272c0ad..64200c78baa 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/EventRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/EventRobot.kt @@ -3,17 +3,11 @@ package org.dhis2.usescases.teidashboard.robot import androidx.compose.ui.test.ExperimentalTestApi import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsNotDisplayed -import androidx.compose.ui.test.hasAnyAncestor -import androidx.compose.ui.test.hasAnySibling import androidx.compose.ui.test.hasTestTag -import androidx.compose.ui.test.hasText -import androidx.compose.ui.test.isDialog import androidx.compose.ui.test.junit4.ComposeTestRule -import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick -import androidx.compose.ui.test.performTextReplacement import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.assertion.ViewAssertions.matches @@ -52,22 +46,14 @@ class EventRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { composeTestRule.onNodeWithTag(MAIN_BUTTON_TAG).performClick() } - fun checkSecondaryButtonNotVisible() { - composeTestRule.onNodeWithTag(SECONDARY_BUTTON_TAG).assertDoesNotExist() - } - @OptIn(ExperimentalTestApi::class) fun clickOnReopen() { composeTestRule.waitUntilAtLeastOneExists(hasTestTag("REOPEN_BUTTON")) composeTestRule.onNodeWithTag("REOPEN_BUTTON", useUnmergedTree = true).performClick() } - fun acceptUpdateEventDate() { - composeTestRule.onNodeWithText("OK", true).performClick() - } - fun openMenuMoreOptions() { - onView(withId(R.id.moreOptions)).perform(click()) + waitForView(withId(R.id.moreOptions)).perform(click()) } fun clickOnDelete() { @@ -81,36 +67,6 @@ class EventRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { onView(withId(R.id.possitive)).perform(click()) } - fun clickOnEventDueDate() { - composeTestRule.onNode( - hasTestTag("INPUT_DATE_TIME_ACTION_BUTTON") and hasAnySibling( - hasText("Due date") - ) - ).assertIsDisplayed().performClick() - - } - - fun selectSpecificDate(currentDate: String, date: String) { - composeTestRule.onNodeWithTag("DATE_PICKER").assertIsDisplayed() - composeTestRule.onNodeWithContentDescription( - label = "text", - substring = true, - useUnmergedTree = true, - ).performClick() - composeTestRule.onNode( - hasText(currentDate) and hasAnyAncestor(isDialog()) - ).performTextReplacement(date) - } - - @OptIn(ExperimentalTestApi::class) - fun typeOnDateParameter(dateValue: String) { - composeTestRule.waitUntilAtLeastOneExists(hasTestTag("INPUT_DATE_TIME_TEXT_FIELD"),2000) - composeTestRule.apply { - onNodeWithTag("INPUT_DATE_TIME_TEXT_FIELD").performClick() - onNodeWithTag("INPUT_DATE_TIME_TEXT_FIELD").performTextReplacement(dateValue) - } - } - fun checkEventDetails(eventDate: String, eventOrgUnit: String) { waitForView((withId(R.id.completion))) onView(withId(R.id.completion)).check(matches(hasCompletedPercentage(100))) @@ -123,10 +79,6 @@ class EventRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { Intents.intended(allOf(IntentMatchers.hasComponent(EventCaptureActivity::class.java.name))) } - fun openEventDetailsSection() { - composeTestRule.onNodeWithText("Event details").performClick() - } - fun checkEventIsOpen() { composeTestRule.onNodeWithTag("REOPEN_BUTTON").assertIsNotDisplayed() } From ca9f339fa67614436ba3bd511d56e2cf588a6a3e Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Tue, 10 Feb 2026 07:03:25 +0100 Subject: [PATCH 045/260] fix(translations): sync translations from transifex (develop) (#4634) * fix(translations): sync translations from transifex (develop) * fix(translations): sync translations from transifex (develop) * fix: remove unescaped characters * fix(translations): sync translations from transifex (develop) --------- Co-authored-by: andresmr --- .../commonMain/composeResources/values-zh/strings.xml | 1 + app/src/main/res/values-en-rUS/strings.xml | 2 +- app/src/main/res/values-hi-rIN/strings.xml | 10 ++++++++-- commons/src/main/res/values-hi-rIN/strings.xml | 1 + .../commonMain/composeResources/values-es/strings.xml | 2 +- .../composeResources/values-hi-rIN/strings.xml | 6 ++++++ stock-usecase/src/main/res/values-hi-rIN/strings.xml | 6 ++++++ 7 files changed, 24 insertions(+), 4 deletions(-) diff --git a/aggregates/src/commonMain/composeResources/values-zh/strings.xml b/aggregates/src/commonMain/composeResources/values-zh/strings.xml index d04eee4fcbd..96c9eb79402 100644 --- a/aggregates/src/commonMain/composeResources/values-zh/strings.xml +++ b/aggregates/src/commonMain/composeResources/values-zh/strings.xml @@ -72,6 +72,7 @@ %2$s is the attribute option combo name --> 您不能编辑 %2$s中的时段%1$s的数据。 + 该数据 不可编辑,因为所选期间不在数据 输入周期内 此数据不可编辑,因为已标记为关闭状态 该数据不可编辑,因为其编辑时间已过 diff --git a/app/src/main/res/values-en-rUS/strings.xml b/app/src/main/res/values-en-rUS/strings.xml index a93fa338c92..b132a6c3afc 100644 --- a/app/src/main/res/values-en-rUS/strings.xml +++ b/app/src/main/res/values-en-rUS/strings.xml @@ -84,7 +84,7 @@ Not saved Some fields need your attention.\nDo you want to review the form? You have some warning messages. - You have some warning messages.\nDo you want to mark this form as complete\? + You have some warning messages.\nDo you want to mark this form as complete? Some fields have errors and they are not saved. \nDo you want to review the form? Do you want to mark this form as complete? You have some error messages.\nDo you want to review them? diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml index d8d42d13d12..1d5d2fdbbc6 100644 --- a/app/src/main/res/values-hi-rIN/strings.xml +++ b/app/src/main/res/values-hi-rIN/strings.xml @@ -15,6 +15,8 @@ सिंक की गलती सिंक के दौरान एक त्रुटि हुई है। कृपया फिर से प्रयास करें। जोड़ें + यूज़रनेम + पासवर्ड रोज़ाना साप्ताहिक @@ -26,6 +28,7 @@ सर्च करें / खोजें दिन चुनें इवेंट कंप्लीटेड + पूरा हुआ त्रुटि बनाएँ @@ -66,7 +69,8 @@ केवल 0 से 1 के मान ही अनुमति हैं केवल 0 से 100 के वैल्यूज़ अनुमति हैं नया इवेंट जनरेट करें - क्या आप एक और इवेंट बनाना चाहते हैं? + क्या आप एक और इवेंट बनाना चाहते हैं\? + खत्म छोड़ें अतिदेय स्वीकार करें @@ -75,6 +79,7 @@ रोज़ाना साप्ताहिक यह मान्य URL नहीं है + पूरा हुआ आज कल (बिता हुआ) इस सप्ताह @@ -83,6 +88,7 @@ पिछला महीना अतिदेय विज़िट की गई + पूरा हुआ पीछे जाएं डेटा सेट्स कल (बिता हुआ) @@ -93,7 +99,7 @@ पूरा हुआ डेटा पूरा हुआ - क्या आप सुनिश्चित हैं? + क्या आप सुनिश्चित हैं\? तारीख पीछे जाएं बंद करें diff --git a/commons/src/main/res/values-hi-rIN/strings.xml b/commons/src/main/res/values-hi-rIN/strings.xml index af792346c7c..7104ef24343 100644 --- a/commons/src/main/res/values-hi-rIN/strings.xml +++ b/commons/src/main/res/values-hi-rIN/strings.xml @@ -19,6 +19,7 @@ त्रुटि अतिदेय विज़िट की गई + पूरा हुआ पूरा हुआ आज diff --git a/commonskmm/src/commonMain/composeResources/values-es/strings.xml b/commonskmm/src/commonMain/composeResources/values-es/strings.xml index b9adfd39b39..734e809d218 100644 --- a/commonskmm/src/commonMain/composeResources/values-es/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-es/strings.xml @@ -63,7 +63,7 @@ Ahora no Guardar de todos modos Seguir editando - ¿Desea marcar este formulario como completo\? + ¿Desea marcar este formulario como completo? Si sale toda la información del formulario será descartada. Algunos campos presentan errores y no se han guardado.\nSi sales ahora, los cambios se descartarán. Algunos campos tienen errores y no serán guardados. diff --git a/login/src/commonMain/composeResources/values-hi-rIN/strings.xml b/login/src/commonMain/composeResources/values-hi-rIN/strings.xml index 02cc514b5b2..af04834da4e 100644 --- a/login/src/commonMain/composeResources/values-hi-rIN/strings.xml +++ b/login/src/commonMain/composeResources/values-hi-rIN/strings.xml @@ -1,6 +1,12 @@ + ऑथेंटिकेशन कोड आगे + ऑथेंटिकेशन कोड + यूज़रनेम + पासवर्ड + लॉग इन हो रहा है… + लॉग इन या अभी नहीं हाँ diff --git a/stock-usecase/src/main/res/values-hi-rIN/strings.xml b/stock-usecase/src/main/res/values-hi-rIN/strings.xml index d5eb4cb7ee3..030e478daca 100644 --- a/stock-usecase/src/main/res/values-hi-rIN/strings.xml +++ b/stock-usecase/src/main/res/values-hi-rIN/strings.xml @@ -3,6 +3,10 @@ सेटिंग्स छोड़ें + यूज़रनेम + पासवर्ड + पासवर्ड भूल गए\? + रिव्यू हटाएं @@ -10,6 +14,8 @@ रद्द करें से भाषा + ईमेल + पासवर्ड सर्च करें / खोजें वापस जाएँ केवल शून्य या पॉजिटिव संख्या ही अनुमति है From 8c4244a484ee503684fc8313df8d9ebd0d82d486 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Tue, 10 Feb 2026 11:36:47 +0100 Subject: [PATCH 046/260] test: update DataSetTableViewModel.kt to increment and decrement async tasks (#4643) --- .../ui/viewModel/DataSetTableViewModel.kt | 33 +++++++++++-------- .../usescases/datasets/DataSetTableRobot.kt | 4 +++ .../dhis2/usescases/datasets/DataSetTest.kt | 6 ++++ .../commons/extensions/ViewModelExtensions.kt | 20 ++++++----- 4 files changed, 41 insertions(+), 22 deletions(-) diff --git a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/viewModel/DataSetTableViewModel.kt b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/viewModel/DataSetTableViewModel.kt index 9906c538bb9..fce2ed7f0ff 100644 --- a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/viewModel/DataSetTableViewModel.kt +++ b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/viewModel/DataSetTableViewModel.kt @@ -58,6 +58,7 @@ import org.dhis2.mobile.aggregates.ui.states.OverwrittenDimension import org.dhis2.mobile.aggregates.ui.states.ValidationBarUiState import org.dhis2.mobile.aggregates.ui.states.mapper.InputDataUiStateMapper import org.dhis2.mobile.commons.coroutine.CoroutineTracker +import org.dhis2.mobile.commons.extensions.launchUseCase import org.dhis2.mobile.commons.input.CallbackStatus import org.dhis2.mobile.commons.input.InputType import org.dhis2.mobile.commons.input.UiAction @@ -104,7 +105,7 @@ internal class DataSetTableViewModel( ) fun loadDataSet() { - viewModelScope.launch(dispatcher.io()) { + launchUseCase(dispatcher.io()) { val dataSetInstanceData = getDataSetInstanceData(this) val initialSection = dataSetInstanceData.initialSectionToLoad @@ -379,7 +380,14 @@ internal class DataSetTableViewModel( } else { it.dataSetSectionTable }, - selectedCellInfo = if (showInputDialog) inputData else CellSelectionState.Default(TableSelection.Unselected()), + selectedCellInfo = + if (showInputDialog) { + inputData + } else { + CellSelectionState.Default( + TableSelection.Unselected(), + ) + }, ) ?: it } CoroutineTracker.decrement() @@ -432,11 +440,16 @@ internal class DataSetTableViewModel( selectedCellInfo is CellSelectionState.InputDataUiState && selectedCellInfo.inputType is InputType.MultiText -> !selectedCellInfo.multiTextExtras().optionsFetched + else -> false } - updateSelectedCell(uiAction.id, fetchOptions, showInputDialog = uiAction.showInputDialog) + updateSelectedCell( + uiAction.id, + fetchOptions, + showInputDialog = uiAction.showInputDialog, + ) }, onFailure = { updateSelectedCell( @@ -737,14 +750,11 @@ internal class DataSetTableViewModel( it } } - CoroutineTracker.decrement() } } private fun checkValidationRules() { - viewModelScope.launch { - CoroutineTracker.increment() - + launchUseCase { val rules = withContext(dispatcher.io()) { runValidationRules() @@ -793,7 +803,6 @@ internal class DataSetTableViewModel( } } } - CoroutineTracker.decrement() } } @@ -823,8 +832,7 @@ internal class DataSetTableViewModel( } private fun attemptToFinish() { - viewModelScope.launch { - CoroutineTracker.increment() + launchUseCase { val onSavedMessage = resourceManager.provideSaved() val result = @@ -851,13 +859,11 @@ internal class DataSetTableViewModel( } } } - CoroutineTracker.decrement() } } private fun attemptToComplete() { - viewModelScope.launch { - CoroutineTracker.increment() + launchUseCase { val result = withContext(dispatcher.io()) { completeDataSet() @@ -907,7 +913,6 @@ internal class DataSetTableViewModel( showSnackbar(resourceManager.provideErrorOnCompleteDataset()) } } - CoroutineTracker.decrement() } } diff --git a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTableRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTableRobot.kt index ae070a9fa4b..e8b6e272edf 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTableRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTableRobot.kt @@ -400,6 +400,10 @@ internal class DataSetTableRobot( fun checkItemWithTextIsDisplayed(text: String) { assertTableIsDisplayed() + composeTestRule.waitUntilAtLeastOneExists( + hasText(text, substring = true), + timeoutMillis = 5000 + ) composeTestRule.onNodeWithText(text, substring = true, useUnmergedTree = true) .assertIsDisplayed() } diff --git a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt index f06f4c0182a..5d1e1025397 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt @@ -5,6 +5,7 @@ import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsNotDisplayed import androidx.compose.ui.test.assertTextEquals import androidx.compose.ui.test.hasTestTag +import androidx.compose.ui.test.hasText import androidx.compose.ui.test.isDisplayed import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithTag @@ -350,6 +351,11 @@ class DataSetTest : BaseTest() { hasTestTag("TABLE_SCROLLABLE_COLUMN"), timeoutMillis = 15000 ) + // Wait for completion state to be reflected in the UI + composeTestRule.waitUntilAtLeastOneExists( + hasText("Re-open form to edit"), + timeoutMillis = 10000 + ) tableIsVisible() dataSetTableRobot(composeTestRule) { checkItemWithTextIsDisplayed("Re-open form to edit") diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/extensions/ViewModelExtensions.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/extensions/ViewModelExtensions.kt index ca4334259e2..27f2c919e50 100644 --- a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/extensions/ViewModelExtensions.kt +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/extensions/ViewModelExtensions.kt @@ -5,6 +5,8 @@ import androidx.lifecycle.viewModelScope import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import org.dhis2.mobile.commons.coroutine.CoroutineTracker +import kotlin.coroutines.CoroutineContext +import kotlin.coroutines.EmptyCoroutineContext /** * Launches a coroutine in the ViewModel's scope for executing a use case. @@ -13,12 +15,14 @@ import org.dhis2.mobile.commons.coroutine.CoroutineTracker * * @param block The suspend block of code to be executed within the coroutine. This is typically the use case logic. */ -fun ViewModel.launchUseCase(block: suspend CoroutineScope.() -> Unit) = - viewModelScope.launch { - CoroutineTracker.increment() - try { - block() - } finally { - CoroutineTracker.decrement() - } +fun ViewModel.launchUseCase( + dispatcher: CoroutineContext = EmptyCoroutineContext, + block: suspend CoroutineScope.() -> Unit, +) = viewModelScope.launch(dispatcher) { + CoroutineTracker.increment() + try { + block() + } finally { + CoroutineTracker.decrement() } +} From 78afccf054166aab906c908512047bb532a9c8e8 Mon Sep 17 00:00:00 2001 From: Ferdy Rodriguez Date: Tue, 10 Feb 2026 13:29:42 +0100 Subject: [PATCH 047/260] refactor: [ANDROAPP-7305] Include error when device doesn't have network available on login screen (#4609) --- .../commons/resources/D2ErrorMessageProviderImpl.kt | 9 +++++++-- .../login/main/ui/viewmodel/CredentialsViewModel.kt | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/resources/D2ErrorMessageProviderImpl.kt b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/resources/D2ErrorMessageProviderImpl.kt index beaa22da65b..47d10f04c7a 100644 --- a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/resources/D2ErrorMessageProviderImpl.kt +++ b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/resources/D2ErrorMessageProviderImpl.kt @@ -51,8 +51,13 @@ class D2ErrorMessageProviderImpl : D2ErrorMessageProvider { D2ErrorCode.BAD_CREDENTIALS -> getString(Res.string.login_error_bad_credentials) - D2ErrorCode.UNKNOWN_HOST -> - getString(Res.string.login_error_unknown_host) + D2ErrorCode.UNKNOWN_HOST -> { + if (isNetworkAvailable) { + getString(Res.string.login_error_unknown_host) + } else { + getString(Res.string.error_no_internet_connection) + } + } D2ErrorCode.UNEXPECTED -> getString(Res.string.error_unexpected) diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModel.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModel.kt index e61bb6a1f27..83abc216aac 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModel.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModel.kt @@ -204,6 +204,7 @@ class CredentialsViewModel( _credentialsScreenState.update { it.copy( loginState = LoginState.Running, + errorMessage = null, ) } loginJob = From a30b68fbbcb39fd391fff03e88445921c00efa86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Wed, 11 Feb 2026 06:48:49 +0100 Subject: [PATCH 048/260] translations: update transifex types to Android (#4645) --- .tx/config | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.tx/config b/.tx/config index e7420f6fab8..dbefa2b2d9d 100644 --- a/.tx/config +++ b/.tx/config @@ -62,7 +62,7 @@ resource_name = Compose Table file_filter = tracker/src/commonMain/composeResources/values-/strings.xml source_file = tracker/src/commonMain/composeResources/values/strings.xml source_lang = en -type = XML +type = ANDROID minimum_perc = 0 resource_name = Tracker @@ -70,7 +70,7 @@ resource_name = Tracker file_filter = aggregates/src/commonMain/composeResources/values-/strings.xml source_file = aggregates/src/commonMain/composeResources/values/strings.xml source_lang = en -type = XML +type = ANDROID minimum_perc = 0 resource_name = Aggregates @@ -78,7 +78,7 @@ resource_name = Aggregates file_filter = commonskmm/src/commonMain/composeResources/values-/strings.xml source_file = commonskmm/src/commonMain/composeResources/values/strings.xml source_lang = en -type = XML +type = ANDROID minimum_perc = 0 resource_name = CommonsKMM @@ -86,7 +86,7 @@ resource_name = CommonsKMM file_filter = login/src/commonMain/composeResources/values-/strings.xml source_file = login/src/commonMain/composeResources/values/strings.xml source_lang = en -type = XML +type = ANDROID minimum_perc = 0 resource_name = Login @@ -94,7 +94,6 @@ resource_name = Login file_filter = sync/src/commonMain/composeResources/values-/strings.xml source_file = sync/src/commonMain/composeResources/values/strings.xml source_lang = en -type = XML +type = ANDROID minimum_perc = 0 resource_name = Sync - From bb677b061b49a15ad9c8e3d7b467d57e5e161bcd Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Thu, 12 Feb 2026 08:15:54 +0100 Subject: [PATCH 049/260] fix(translations): sync translations from transifex (develop) [skip size] (#4646) * fix(translations): sync translations from transifex (develop) * fix: remove \? escape character in KMM modules * fix: remove \"+\" escape character in KMM modules * fix(translations): sync translations from transifex (develop) --------- Co-authored-by: andresmr --- .../values-hi-rIN/strings.xml | 53 ++++++++++++++++++- .../composeResources/values-lo/strings.xml | 1 + app/src/main/res/values-ar/strings.xml | 1 + app/src/main/res/values-en-rUS/strings.xml | 8 +-- app/src/main/res/values-es-rES/strings.xml | 5 +- app/src/main/res/values-es/strings.xml | 5 +- app/src/main/res/values-fr/strings.xml | 5 +- app/src/main/res/values-hi-rIN/strings.xml | 46 ++++++++++++++++ app/src/main/res/values-id/strings.xml | 5 +- app/src/main/res/values-lo/strings.xml | 7 ++- app/src/main/res/values-nb/strings.xml | 5 +- app/src/main/res/values-nl/strings.xml | 5 +- app/src/main/res/values-pt/strings.xml | 5 +- app/src/main/res/values-ru/strings.xml | 5 +- app/src/main/res/values-uk/strings.xml | 5 +- app/src/main/res/values-uz-rUZ/strings.xml | 5 +- app/src/main/res/values-uz/strings.xml | 5 +- app/src/main/res/values-vi/strings.xml | 5 +- app/src/main/res/values-zh-rCN/strings.xml | 1 + .../src/main/res/values-hi-rIN/strings.xml | 11 ++++ .../values-en-rUS/strings.xml | 31 +---------- .../values-hi-rIN/strings.xml | 30 +++++++++++ .../composeResources/values-lo/strings.xml | 1 + .../src/main/res/values-hi-rIN/strings.xml | 1 + form/src/main/res/values-en-rUS/strings.xml | 10 +--- form/src/main/res/values-hi-rIN/strings.xml | 28 +++++++++- .../src/main/res/values-hi-rIN/strings.xml | 4 ++ .../src/main/res/values-uz/strings.xml | 2 +- .../composeResources/values-ny_MW/strings.xml | 5 ++ .../values-ar-rEG/strings.xml | 2 +- .../values-ar-rIQ/strings.xml | 2 +- .../composeResources/values-ar/strings.xml | 2 +- .../composeResources/values-ckb/strings.xml | 2 +- .../composeResources/values-cs/strings.xml | 1 + .../composeResources/values-da/strings.xml | 3 +- .../values-es-rES/strings.xml | 2 +- .../composeResources/values-es/strings.xml | 3 +- .../composeResources/values-fr/strings.xml | 5 +- .../values-hi-rIN/strings.xml | 16 +++++- .../composeResources/values-id/strings.xml | 2 +- .../composeResources/values-km/strings.xml | 3 +- .../values-ko-rKR/strings.xml | 2 +- .../composeResources/values-lo/strings.xml | 3 +- .../composeResources/values-my/strings.xml | 3 +- .../composeResources/values-nb/strings.xml | 2 +- .../composeResources/values-ne/strings.xml | 2 +- .../composeResources/values-nl/strings.xml | 2 +- .../composeResources/values-prs/strings.xml | 2 +- .../composeResources/values-ps/strings.xml | 3 +- .../values-pt-rBR/strings.xml | 2 +- .../composeResources/values-pt/strings.xml | 3 +- .../composeResources/values-ro/strings.xml | 2 +- .../composeResources/values-ru/strings.xml | 3 +- .../composeResources/values-si/strings.xml | 2 +- .../composeResources/values-sv/strings.xml | 3 +- .../composeResources/values-tet/strings.xml | 3 +- .../composeResources/values-tg/strings.xml | 3 +- .../composeResources/values-uk/strings.xml | 7 ++- .../composeResources/values-ur/strings.xml | 3 +- .../values-uz-rUZ/strings.xml | 3 +- .../composeResources/values-uz/strings.xml | 2 +- .../composeResources/values-vi/strings.xml | 3 +- .../values-zh-rCN/strings.xml | 3 +- .../composeResources/values-zh/strings.xml | 1 + 64 files changed, 277 insertions(+), 128 deletions(-) create mode 100644 sync/src/commonMain/composeResources/values-ny_MW/strings.xml diff --git a/aggregates/src/commonMain/composeResources/values-hi-rIN/strings.xml b/aggregates/src/commonMain/composeResources/values-hi-rIN/strings.xml index 63817c5629b..8abd1a6dddf 100644 --- a/aggregates/src/commonMain/composeResources/values-hi-rIN/strings.xml +++ b/aggregates/src/commonMain/composeResources/values-hi-rIN/strings.xml @@ -1,5 +1,6 @@ + वैल्यू कुल जन्म तिथि आयु @@ -9,19 +10,69 @@ कोई परिणाम नहीं मिला खोजें और अधिक पाएं पूरा हुआ + अक्षांश + देशांतर लोकेशन + सीमा से बाहर + गलत फ़ॉर्मैट + सपोर्टेड नहीं है सब ठीक है + क्या आप डेटा सेट पूरा करना चाहते हैं? सब ठीक है + क्या आप डेटा सेट पूरा करना चाहते हैं? अभी नहीं पूरा हुआ सेव + कुछ अनिवार्य फ़ील्ड खाली हैं। डेटा सेट पूरा करने के लिए उन्हें भरें। + यदि आप कोई वैल्यू दर्ज करते हैं, तो डेटा सेट पूरा करने के लिए पूरी पंक्ति के सभी वैल्यू आवश्यक हैं। ठीक है + सेव और कंप्लीटेड + डेटा सेट पूरा करें में एक एरर हुआ + क्या आप डेटा क्वालिटी चेक करना चाहते हैं? नहीं हाँ त्रुटि एरर्स + फिर भी पूरा करें रिव्यू + रिव्यू के लिए डेटा + यह एक्शन नहीं की जा सकती आगे फ़ाइल जोड़ें + फ़ाइल सफलतापूर्वक डाउनलोड हो गई + फ़ाइल डाउनलोड नहीं हो सकी इमेज जोड़ें - \ No newline at end of file + फ़ोटो लें + गैलरी से ऐड करें + यह सेक्शन सही तरह से कॉन्फ़िगर नहीं है\nअपने एडमिन से संपर्क करें + यह डेटा सेट सही तरह से कॉन्फ़िगर नहीं है\nअपने एडमिन से संपर्क करें + + इंडिकेटर्स + इस डेटा को संपादित करने की अनुमति नहीं है + + %1$s डेटा को संपादित करने की अनुमति नहीं है + + आप %1$s से डेटा संपादित नहीं कर सकते + + आप %1$s में %2$s के लिए डेटा संपादित नहीं कर सकते + + आप %1$s में %2$s के लिए डेटा संपादित नहीं कर सकते + + आप %2$s में पीरियड %1$s के लिए डेटा संपादित नहीं कर सकते + यह डेटा संपादन योग्य नहीं है क्योंकि इसे क्लोज़ मार्क किया गया है + यह डेटा संपादन योग्य नहीं है क्योंकि संपादन का समय समाप्त हो गया है + + \ No newline at end of file diff --git a/aggregates/src/commonMain/composeResources/values-lo/strings.xml b/aggregates/src/commonMain/composeResources/values-lo/strings.xml index c27aaf37943..4462f935c05 100644 --- a/aggregates/src/commonMain/composeResources/values-lo/strings.xml +++ b/aggregates/src/commonMain/composeResources/values-lo/strings.xml @@ -12,6 +12,7 @@ ເສັ້ນຂະໜານ ເສັ້ນແວງ ເພີ່ມທີ່ຕັ້ງ + ບໍ່ຮອງຮັບ ທ່ານຕ້ອງການເຮັດຊຸດຂໍ້ມູນໃຫ້ຄົບຖ້ວນບໍ? ບໍ່​ແມ່ນ​ຕອນ​ນີ້ ສຳເລັດແລ້ວ diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 7cb98ce3856..178250337e8 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -493,6 +493,7 @@ قبول متابعة رابط الخادم + أدخل عنوان URL لخادم DHIS 2 لمؤسستك على النحو الذي حصلت عليه من مسؤول النظام.\n\n أو بدلاً من ذلك ، يمكنك مسح رمز الـ QR الذي يحتوي على عنوان URL لخادمك نسيت الرمز الخاص بك؟ ما الذي تريد فعله لهذا الحدث؟ إنهاء diff --git a/app/src/main/res/values-en-rUS/strings.xml b/app/src/main/res/values-en-rUS/strings.xml index b132a6c3afc..a28a6cbd146 100644 --- a/app/src/main/res/values-en-rUS/strings.xml +++ b/app/src/main/res/values-en-rUS/strings.xml @@ -25,7 +25,6 @@ Accept Cancel Add file - Some fields need your attention.\nDo you want to review the form? Coordinates for the @@ -72,7 +71,6 @@ Coordinates values are not valid This field is mandatory Close - Camera permission is denied.\nYou need to enable it to use this feature. Take Photo Unknown server Value must be an integer @@ -82,12 +80,8 @@ Program rules warning There is a configuration issue causing a loop in the rules. Contact you administrator. Not saved - Some fields need your attention.\nDo you want to review the form? You have some warning messages. - You have some warning messages.\nDo you want to mark this form as complete? - Some fields have errors and they are not saved. \nDo you want to review the form? - Do you want to mark this form as complete? - You have some error messages.\nDo you want to review them? + Do you want to mark this form as complete\? %s details Not now Coordinates diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 0755788e474..4040f9348fb 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -466,6 +466,7 @@ Confirmar Seguir URL de servidor + Introduzca la URL del servidor DHIS 2 de su organización proporcionada por su administrador. También puede escanear un código QR con la URL de su servidor. ¿Olvido su código? ¿Que quiere hacer con este evento? FIN @@ -649,9 +650,9 @@ Detalles Comentarios ¡Guardado! - ¿Quiere validar la calidad de los datos? + ¿Quieree validar la calidad de los datos\? ¡Parece que todo está bien! - ¿Quiere completar también el set de datos? + ¿Quiere completar también el set de datos\? Marcar como completado Nombre Fórmula diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index f88780799f8..d4332bf6a1b 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -497,6 +497,7 @@ Confirmar Seguir URL de servidor + Introduzca la URL del servidor DHIS 2 de su organización proporcionada por su administrador. También puede escanear un código QR con la URL de su servidor. ¿Olvido su código? ¿Que quiere hacer con este evento? FIN @@ -681,9 +682,9 @@ Detalles Comentarios ¡Guardado! - ¿Quiere validar la calidad de los datos? + ¿Quieree validar la calidad de los datos\? ¡Parece que todo está bien! - ¿Quiere completar también el set de datos? + ¿Quiere completar también el set de datos\? Marcar como completado Nombre Fórmula diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 106f507ae8e..0267efee3d4 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -475,6 +475,7 @@ Accord Continuer URL du serveur + Saisissez l\'URL du serveur DHIS 2 de votre organisation tel que fourni par votre administrateur système.\n\nVous pouvez également scanner le code QR avec le lien URL du serveur Oublié le code? Que souhaitez-vous faire pour cet évènement? FIN @@ -658,9 +659,9 @@ Details Commentaires Enregistré! - Voulez-vous vérifier la qualité des données? + Voulez-vous vérifier la qualité des données\? Tout a l\'air bien! - Voulez-vous également compléter l\'ensemble de données? + Voulez-vous également compléter l\'ensemble de données\? Marquer comme terminé Nom Formule diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml index 1d5d2fdbbc6..d8deda45566 100644 --- a/app/src/main/res/values-hi-rIN/strings.xml +++ b/app/src/main/res/values-hi-rIN/strings.xml @@ -9,6 +9,7 @@ सिंक हो रहा है सिंक हो रहा है + इवेंट्स खत्म सिंक पूरा हुआ @@ -26,7 +27,11 @@ साझा करें सर्च करें / खोजें + पाठ दर्ज करें + लंबा अक्षर दर्ज करें + नंबर दर्ज करें दिन चुनें + खोलें इवेंट कंप्लीटेड पूरा हुआ त्रुटि @@ -34,7 +39,11 @@ बनाएँ अपडेट करें तारीख + अक्षांश + देशांतर नया इवेंट + यदि आप कोई वैल्यू दर्ज करते हैं, तो डेटा सेट पूरा करने के लिए पूरी पंक्ति के सभी वैल्यू आवश्यक हैं। + कुछ अनिवार्य फ़ील्ड खाली हैं। डेटा सेट पूरा करने के लिए उन्हें भरें। रद्द करें हटाएं संपादन करें @@ -57,6 +66,7 @@ आगे सहेजें ठीक है + इवेंट्स साझा करें अधिकतम त्रुटि @@ -70,22 +80,29 @@ केवल 0 से 100 के वैल्यूज़ अनुमति हैं नया इवेंट जनरेट करें क्या आप एक और इवेंट बनाना चाहते हैं\? + इंडिकेटर्स + इंडिकेटर्स खत्म + मान अद्वितीय होना चाहिए। समान मान मिला है। इसे सहेजा नहीं गया। कृपया जाँच करें छोड़ें अतिदेय स्वीकार करें + संबंध बंद करें पूरा हुआ + खोलें रोज़ाना साप्ताहिक यह मान्य URL नहीं है पूरा हुआ + सिंक हो रहा है… आज कल (बिता हुआ) इस सप्ताह पिछला सप्ताह इस महीने पिछला महीना + खोलें अतिदेय विज़िट की गई पूरा हुआ @@ -93,31 +110,60 @@ डेटा सेट्स कल (बिता हुआ) समय चुनें + अक्षर दर्ज करें + 0 से 1 नंबर दर्ज करें + प्रतिशत दर्ज करें + फ़ोन नंबर दर्ज करें + ईमेल दर्ज करें + URL दर्ज करें + मान दर्ज करें सिंक की गलती सेव + क्या आप डेटा क्वालिटी चेक करना चाहते हैं\? + क्या आप डेटा सेट पूरा करना चाहते हैं\? नाम + फिर भी पूरा करें + रिव्यू के लिए डेटा + सेव और कंप्लीटेड + खोलें पूरा हुआ डेटा पूरा हुआ क्या आप सुनिश्चित हैं\? तारीख + यह फ़ील्ड आवश्यक है पीछे जाएं बंद करें इस वर्ष पिछली तिमाही पिछला वर्ष + इंडिकेटर्स वैल्यू + फ़ोटो लें यह प्रोग्राम सुरक्षित है गलत लॉगिन जानकारी + वैल्यू + %s डेट के रूप में पढ़ा नहीं जा सकता + यह फ़ील्ड अपडेट नहीं हो सका। कृपया फिर से प्रयास करें उपलब्ध + इस डेटा को संपादित करने की अनुमति नहीं है + इस डेटा को संपादित करने की अनुमति नहीं है अज्ञात भाषा + सेव नहीं नया बनाएँ + आपके पास कुछ चेतावनी संदेश हैं + आपके पास कुछ चेतावनी संदेश हैं\nक्या आप इस फ़ॉर्म को कम्प्लीट मार्क करना चाहते हैं\? सिंक हो रहा है अभी नहीं + केवल देखें सिंक की गलती रेफर करें इवेंट + खोज साफ़ करें + वैकल्पिक + उपयोग के लिए कोई खोज फ़ील्ड कॉन्फ़िगर नहीं है और दिखाएँ कम दिखाएँ + यह सेक्शन सही तरह से कॉन्फ़िगर नहीं है\n अपने एडमिन से संपर्क करें diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 03b89200dbd..820b42c2ed8 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -455,6 +455,7 @@ Setuju Terus URL server + Masukkan url server DHIS 2 untuk organisasi Anda seperti yang disediakan oleh administrator sistem Anda.\n\nAtau, Anda dapat memindai kode QR yang berisi URL server Anda Lupa kode Anda? Apa yang ingin Anda lakukan untuk even ini? AKHIR @@ -747,9 +748,9 @@ Rincian Komentar Tersimpan! - Apakah Anda ingin memeriksa kualitas data? + Apakah Anda ingin memeriksa kualitas data\? Semuanya terlihat bagus! - Apakah Anda juga ingin melengkapi data set? + Apakah Anda juga ingin melengkapi data set\? Tandai sebagai selesai Nama Formula diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index 6433b7179f9..fca80f9df6a 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -470,6 +470,7 @@ ຍິນຍອມ ຕໍ່ໄປ ທີ່ຢູ່ຂອງເຄື່ອງຄອມພີວເຕີໜ່ວຍແມ່ + ປ້ອນທີ່ຢູ່ຂອງຄອມພິວເຕີໜ່ວຍແມ່ DHIS 2 ສຳລັບອົງກອນຂອງທ່ານ ຕາມທີ່ຜູ້ດູແລລະບົບຂອງທ່ານໃຫ້ມາ ຫຼື ທ່ານສາມາດສະແກນຄິວອາໂຄ້ດທີ່ມີທີ່ຢູ່ຂອງຄອມພິວເຕີໜ່ວຍແມ່ຂອງທ່ານ ລືມລະຫັດຂອງທ່ານ? ທ່ານຕ້ອງເຮັດຫຍັງສໍາລັບເຫດການນີ້? ສິ້ນສຸດ @@ -650,9 +651,9 @@ ລາຍລະອຽດ ຄຳເຫັນ ບັນທຶກແລ້ວ! - ທ່ານຕ້ອງການກວດສອບຄຸນນະພາບຂໍ້ມູນນີ້ບໍ? + ທ່ານຕ້ອງການກວດສອບຄຸນນະພາບຂໍ້ມູນນີ້ບໍ\? ທຸກຢ່າງຮຽບຮ້ອຍດີ - ທ່ານຕ້ອງການເຮັດຊຸດຂໍ້ມູນໃຫ້ຄົບຖ້ວນບໍ? + ທ່ານຕ້ອງການເຮັດຊຸດຂໍ້ມູນໃຫ້ຄົບຖ້ວນບໍ\? ເຮັດໃຫ້ສຳເລັດແລ້ວ ຊື່ Formula @@ -873,5 +874,7 @@ ສະແດງໃຫ້ເຫັນໜ້ອຍລົງ ອັບເດດຂໍ້ມູນໃຫ້ຄືກັນ ກຳລັງອັບເດດຂໍ້ມູນໃຫ້ຄືກັນ %s... + ສະແດງຄຳອະທິບາຍ + ເຊື່ອງຄຳອະທິບາຍ ໂອນ diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 62716d80438..f37faac1a69 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -458,6 +458,7 @@ Enig Fortsett Server URL + Angi DHIS 2 server URL for din organisasjons som er oppgitt av din systemadministrator.\n\nAlternativt, kan du skanne en QR kode som inneholder URL til din server Har du glemt koden? Hva vil du gjøre for denne hendelsen? SLUTT @@ -638,9 +639,9 @@ Detaljer Kommentarer Lagret! - Vil du sjekke datakvaliteten? + Vil du sjekke datakvaliteten\? Alt ser bra ut - Vil du også fullføre datasettet? + Vil du også fullføre datasettet\? Merk som fullført Navn Formel diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index d003ccdedab..5ca9c9d85ca 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -472,6 +472,7 @@ Mee eens zijn Doorgaan Server-URL + Voer de DHIS 2-server-URL voor uw organisatie in zoals verstrekt door uw systeembeheerder.\n\nU kunt ook een QR-code scannen met de URL van uw server Ben je je code vergeten? Wat zou je willen doen voor dit evenement? EINDE @@ -655,9 +656,9 @@ Details Opmerkingen Opgeslagen! - Wilt u de datakwaliteit controleren? + Wilt u de datakwaliteit controleren\? Alles ziet er goed uit! - Wil je ook de dataset compleet maken? + Wil je ook de dataset compleet maken\? Markeer als voltooid Naam Formule diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 2858f9d1765..022335f6705 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -495,6 +495,7 @@ Aceita Continuar url do servidor + Digite o URL do servidor DHIS 2 da sua organização, conforme fornecido pelo administrador do sistema.\n\nAlternativamente, você pode digitalizar um código QR contendo o URL do seu servido Esqueceu seu código? O que você gostaria de fazer para este evento? FIM @@ -678,9 +679,9 @@ Detalhes Comentarios Gravado! - Você quer verificar a qualidade dos dados? + Você quer verificar a qualidade dos dados\? Tudo parece bem! - Você também deseja completar o conjunto de dados? + Você também deseja completar o conjunto de dados\? Marcar como completado Nome Fórmula diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 15b86e237a6..026770ee294 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -480,6 +480,7 @@ Согласен Продолжить Адрес веб-страницы сервера + Введите URL-адрес сервера DHIS 2 для Вашей организации, предоставленный Вашим системным администратором. Другой вариант - отсканировать QR-код, содержащий URL-адрес Вашего сервера. Забыли свой код? Что бы Вы хотели сделать для этого события? КОНЕЦ @@ -650,9 +651,9 @@ Детали Комментарии Сохранено! - Вы хотите проверить качество данных? + Вы хотите проверить качество данных\? Все выглядит хорошо! - Вы также хотите завершить набор данных? + Вы также хотите завершить набор данных\? Отметить как завершенное Название Формула diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 50377656940..2a103ab6774 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -484,6 +484,7 @@ Погодитись Продовжити URL-адреса серверу + Введіть URL-адресу серверу DHIS 2 для Вашої організації, надану Вашим системним адміністратором. Альтернативно, Ви можете відсканувати QR-код, що містить URL-адресу Вашого сервера Забули код? Що б Ви хотіли зробити для цього випадку? КІН @@ -667,9 +668,9 @@ Деталі Коментарі Збережено! - Хочете перевірити якість даних? + Хочете перевірити якість даних\? Все виглядає добре! - Ви бажаєте також завершити набір даних? + Ви бажаєте також завершити набір даних\? Позначити як виконане Ім\'я Формула diff --git a/app/src/main/res/values-uz-rUZ/strings.xml b/app/src/main/res/values-uz-rUZ/strings.xml index 8eb34822ab0..81af89fe43f 100644 --- a/app/src/main/res/values-uz-rUZ/strings.xml +++ b/app/src/main/res/values-uz-rUZ/strings.xml @@ -439,6 +439,7 @@ Roziman Davom etish Server URLi + Tashkilotingiz uchun tizim maʼmuri tomonidan taqdim etilgan DHIS2 server URL manzilini kiriting. \n\ Boshqa holda, siz serveringiz URL manzilini oʼz ichiga olgan QR kodini skanerlashingiz mumkin. Kodingizni unutdingizmi? Ushbu hodisa/tadbir uchun nima qilmoqchisiz? TАMOM @@ -617,9 +618,9 @@ Тафсилотлари Izohlar Saqlandi! - Maʼlumotlar sifatini tekshirishni xoxlaysizmi? + Maʼlumotlar sifatini tekshirishni xoxlaysizmi\? Koʼrinishidan hammasi yaxshi! - Maʼlumotlar toʼplamini toʼldirishni xoxlaysizmi? + Maʼlumotlar toʼplamini toʼldirishni xoxlaysizmi\? Tugallangan deb belgilang Исми Formula diff --git a/app/src/main/res/values-uz/strings.xml b/app/src/main/res/values-uz/strings.xml index d3749c8f8b2..5e84cfba12b 100644 --- a/app/src/main/res/values-uz/strings.xml +++ b/app/src/main/res/values-uz/strings.xml @@ -458,6 +458,7 @@ Розиман Давом этиш Сервер URLи + Ташкилотингиз учун тизим маъмури томонидан тақдим этилган DHIS2 сервер URL манзилини киритинг. \n\ Бошқа ҳолда, сиз серверингиз URL манзилини ўз ичига олган QR кодини сканерлашингиз мумкин. Кодингизни унутдингизми? Ушбу ҳодиса/тадбир учун нима қилмоқчисиз? ТАМОМ @@ -640,9 +641,9 @@ Тафсилотлари Изоҳлар Сақланди! - Маълумотлар сифатини текширишни хохлайсизми? + Маълумотлар сифатини текширишни хохлайсизми\? Кўринишидан ҳаммаси яхши! - Маълумотлар тўпламини тўлдиришни хохлайсизми? + Маълумотлар тўпламини тўлдиришни хохлайсизми\? Тугалланган сифатида белгилансин Исми Формула diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 4372fd2f7f6..1e16d6b8b29 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -491,6 +491,7 @@ Đồng ý Tiếp tục Đường dẫn đến máy chủ + Nhập đường dẫn liên kết đến máy chủ DHIS 2 với đơn vị được cung cấp bởi quản lý của bạn.\n\n Hoặc bạn có thể quét mã QR có chứa đường dẫn liên kết đến máy chủ. Bạn đã quên mã của bạn phải không? Bạn muốn làm gì với sự kiện này? KẾT THÚC @@ -674,9 +675,9 @@ Chi tiết Ghi chú Đã lưu! - Ban có muốn kiểm tra chất lượng dữ liệu không? + Ban có muốn kiểm tra chất lượng dữ liệu không\? Mọi thứ đều ổn! - Bạn cũng muốn hoàn tất biểu nhập phải không? + Bạn cũng muốn hoàn tất biểu nhập phải không\? Đánh dấu đã hoàn tất Tên Công thức diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 496d801487e..59694fa102e 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -491,6 +491,7 @@ 同意 继续 服务器URL + 输入管理员提供的服务器地址。\n\n 可选的你可以扫描服务器地址 二维码 忘记你的数字口令 对该事件你想做什么? 结束 diff --git a/commons/src/main/res/values-hi-rIN/strings.xml b/commons/src/main/res/values-hi-rIN/strings.xml index 7104ef24343..45fa1a37cb9 100644 --- a/commons/src/main/res/values-hi-rIN/strings.xml +++ b/commons/src/main/res/values-hi-rIN/strings.xml @@ -17,9 +17,13 @@ मासिक वार्षिक त्रुटि + संबंध + + खोलें अतिदेय विज़िट की गई पूरा हुआ + खोलें पूरा हुआ आज @@ -39,6 +43,7 @@ सिंक की गलती कल (बिता हुआ) + इंडिकेटर्स इमेज जोड़ें फ़ाइल जोड़ें संपादन करते रहें @@ -46,12 +51,18 @@ रिव्यू पूरा हुआ वैल्यू + बदलावों को छोड़ना है डेटा आज %d दिन बाकी है %d दिन बाकी है + फ़ाइल सफलतापूर्वक डाउनलोड हो गई + + + %s डेटा + सिंक हो रहा है… हटाएं रोज़ाना महीना diff --git a/commonskmm/src/commonMain/composeResources/values-en-rUS/strings.xml b/commonskmm/src/commonMain/composeResources/values-en-rUS/strings.xml index cd5583d93ef..451502a78b9 100644 --- a/commonskmm/src/commonMain/composeResources/values-en-rUS/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-en-rUS/strings.xml @@ -1,7 +1,6 @@ Only values from 0 to 100 are allowed - Please review this field Formatting error Only positive numbers are allowed This is not a valid phone number @@ -11,8 +10,6 @@ Only values from 0 to 1 are allowed This is not a valid url Value must be an integer - It is not a correct format. - The configured pattern %s is wrong. This field could not be updated. Please try again Error The value should be unique, a coincidence has been found. It has not been saved. Please check it. @@ -23,7 +20,6 @@ Value for field %s does not belong to the option set in %s This field is mandatory You have some warning messages. - You have some warning messages.\nDo you want to mark this form as complete? Required Date Years @@ -57,20 +53,14 @@ Complete Discard changes Saved! - You have some error messages.\nDo you want to review them? - Some fields have errors and they are not saved. \nDo you want to review the form? - Some fields need your attention.\nDo you want to review the form? Not now Save anyway Keep editing - Do you want to mark this form as complete? + Do you want to mark this form as complete\? If you exit now all the information in the form will be discarded. - Some fields have errors and they are not saved. \nIf you exit now the changes will be discarded. Some fields have errors and they are not saved. Some mandatory fields are missing and the form cannot be saved. - Some mandatory fields are missing and the form cannot be saved. \nIf you exit now the changes will be discarded. Share - Camera permission is denied.\nYou need to enable it to use this feature. Close Program rules warning There is a configuration issue causing a loop in the rules. Contact you administrator. @@ -80,20 +70,6 @@ From gallery Check this! Do not show again - the provided value is not allowed for this field - Invalid character 0 - Invalid character 1 - Value is neither true or false - This date format is not valid - This date and time format is not valid - This time format is not valid - The value is empty - The value contains more than one letter - The value is not a letter - The text is too long - Value is neither true or false - This field can only be true - Invalid character 1 DataValues can\'t be saved using these arguments. Use the other one. Leading zero numbers are not allowed Couldn\'t retrieve data @@ -117,10 +93,6 @@ Category Combo No options available Cat combo - Storage permission is not granted.\nYou need to enable it to use this feature. - yes - no - Re-open form to edit Date of birth Age or @@ -206,7 +178,6 @@ Database import failed Invalid file Not in TOTP 2FA enrollment mode - Authentication cancelled diff --git a/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml b/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml index 4f43e662b4e..7b6e0115917 100644 --- a/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml @@ -9,35 +9,65 @@ केवल शून्य या पॉजिटिव संख्या ही अनुमति है केवल 0 से 1 के मान ही अनुमति हैं यह मान्य URL नहीं है + यह फ़ील्ड अपडेट नहीं हो सका। कृपया फिर से प्रयास करें एरर्स + मान अद्वितीय होना चाहिए। समान मान मिला है। इसे सहेजा नहीं गया। कृपया जाँच करें समय चुनें दिन चुनें + यह फ़ील्ड आवश्यक है + आपके पास कुछ चेतावनी संदेश हैं + आपके पास कुछ चेतावनी संदेश हैं\nक्या आप इस फ़ॉर्म को कम्प्लीट मार्क करना चाहते हैं\? आवश्यकता है तारीख वर्ष महीने दिन + %s डेट के रूप में पढ़ा नहीं जा सकता + अक्षांश + देशांतर + मान दर्ज करें + URL दर्ज करें + ईमेल दर्ज करें + फ़ोन नंबर दर्ज करें + नंबर दर्ज करें + प्रतिशत दर्ज करें + 0 से 1 नंबर दर्ज करें + अक्षर दर्ज करें + लंबा अक्षर दर्ज करें + पाठ दर्ज करें + अक्षांश + देशांतर + सेव नहीं रिव्यू पूरा हुआ + बदलावों को छोड़ना है सेव अभी नहीं सेव करें संपादन करते रहें साझा करें बंद करें + फ़ोटो लें डाउनलोड लोकेशन + %s डेटा जन्म तिथि आयु या स्वीकार करें रद्द करें + अक्षांश + देशांतर लोकेशन + सीमा से बाहर + गलत फ़ॉर्मैट फ़ाइल जोड़ें इमेज जोड़ें + गैलरी से ऐड करें कोई परिणाम नहीं मिला खोजें और अधिक पाएं पूरा हुआ + सपोर्टेड नहीं है diff --git a/commonskmm/src/commonMain/composeResources/values-lo/strings.xml b/commonskmm/src/commonMain/composeResources/values-lo/strings.xml index 41f3f814e7d..e9d1e1ed7b1 100644 --- a/commonskmm/src/commonMain/composeResources/values-lo/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-lo/strings.xml @@ -101,6 +101,7 @@ ເພີ່ມຮູບພາບ ບໍ່ພົບຜົນການຊອກຫາ ສຳເລັດ + ບໍ່ຮອງຮັບ diff --git a/dhis_android_analytics/src/main/res/values-hi-rIN/strings.xml b/dhis_android_analytics/src/main/res/values-hi-rIN/strings.xml index ec697df6cbd..a4e3d321508 100644 --- a/dhis_android_analytics/src/main/res/values-hi-rIN/strings.xml +++ b/dhis_android_analytics/src/main/res/values-hi-rIN/strings.xml @@ -9,5 +9,6 @@ साप्ताहिक मासिक वार्षिक + सभी रीसेट करें \ No newline at end of file diff --git a/form/src/main/res/values-en-rUS/strings.xml b/form/src/main/res/values-en-rUS/strings.xml index f7bc8b9bbd7..195e9fea377 100644 --- a/form/src/main/res/values-en-rUS/strings.xml +++ b/form/src/main/res/values-en-rUS/strings.xml @@ -10,7 +10,6 @@ Value for field %s does not belong to the option set in %s This field is mandatory You have some warning messages. - You have some warning messages.\nDo you want to mark this form as complete? Required Date Years @@ -44,20 +43,14 @@ Complete Discard changes Saved! - You have some error messages.\nDo you want to review them? - Some fields have errors and they are not saved. \nDo you want to review the form? - Some fields need your attention.\nDo you want to review the form? Not now Save anyway Keep editing - Do you want to mark this form as complete? + Do you want to mark this form as complete\? If you exit now all the information in the form will be discarded. - Some fields have errors and they are not saved. \nIf you exit now the changes will be discarded. Some fields have errors and they are not saved. Some mandatory fields are missing and the form cannot be saved. - Some mandatory fields are missing and the form cannot be saved. \nIf you exit now the changes will be discarded. Share - Camera permission is denied.\nYou need to enable it to use this feature. Close Program rules warning There is a configuration issue causing a loop in the rules. Contact you administrator. @@ -88,6 +81,5 @@ Category Combo No options available Cat combo - Storage permission is not granted.\nYou need to enable it to use this feature. Couldn\'t retrieve data \ No newline at end of file diff --git a/form/src/main/res/values-hi-rIN/strings.xml b/form/src/main/res/values-hi-rIN/strings.xml index 3058e1e0ae8..98d40ab6b26 100644 --- a/form/src/main/res/values-hi-rIN/strings.xml +++ b/form/src/main/res/values-hi-rIN/strings.xml @@ -1,21 +1,47 @@ + यह फ़ील्ड अपडेट नहीं हो सका। कृपया फिर से प्रयास करें त्रुटि + मान अद्वितीय होना चाहिए। समान मान मिला है। इसे सहेजा नहीं गया। कृपया जाँच करें समय चुनें दिन चुनें + यह फ़ील्ड आवश्यक है + आपके पास कुछ चेतावनी संदेश हैं + आपके पास कुछ चेतावनी संदेश हैं\nक्या आप इस फ़ॉर्म को कम्प्लीट मार्क करना चाहते हैं\? आवश्यकता है तारीख वर्ष महीने दिन + %s डेट के रूप में पढ़ा नहीं जा सकता + अक्षांश + देशांतर + मान दर्ज करें + URL दर्ज करें + ईमेल दर्ज करें + फ़ोन नंबर दर्ज करें + नंबर दर्ज करें + प्रतिशत दर्ज करें + 0 से 1 नंबर दर्ज करें + अक्षर दर्ज करें + लंबा पाठ दर्ज करें + पाठ दर्ज करें + अक्षांश + देशांतर + सेव नहीं रिव्यू पूरा हुआ + बदलावों को छोड़ना है सेव अभी नहीं सेव करें संपादन करते रहें साझा करें बंद करें + फ़ोटो लें डाउनलोड लोकेशन - \ No newline at end of file + %s डेटा + लॉन्च + + \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-hi-rIN/strings.xml b/stock-usecase/src/main/res/values-hi-rIN/strings.xml index 030e478daca..75300e27444 100644 --- a/stock-usecase/src/main/res/values-hi-rIN/strings.xml +++ b/stock-usecase/src/main/res/values-hi-rIN/strings.xml @@ -14,9 +14,13 @@ रद्द करें से भाषा + लॉग आउट + + ईमेल पासवर्ड सर्च करें / खोजें वापस जाएँ + सेव नहीं केवल शून्य या पॉजिटिव संख्या ही अनुमति है \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-uz/strings.xml b/stock-usecase/src/main/res/values-uz/strings.xml index da5cf96b3f9..6b402c132c1 100644 --- a/stock-usecase/src/main/res/values-uz/strings.xml +++ b/stock-usecase/src/main/res/values-uz/strings.xml @@ -24,7 +24,7 @@ ICRC ходимлари учун Фойдаланувчи исми Пароль - Паролни унутдингизми? + Паролни унутдингизми\? Охирги фаоллик юкланмоқда … Ҳозирда ҳеч қандай фаоллик амалга оширилмаган diff --git a/sync/src/commonMain/composeResources/values-ny_MW/strings.xml b/sync/src/commonMain/composeResources/values-ny_MW/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-ny_MW/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/tracker/src/commonMain/composeResources/values-ar-rEG/strings.xml b/tracker/src/commonMain/composeResources/values-ar-rEG/strings.xml index 2fe13df924f..5fff35c0890 100644 --- a/tracker/src/commonMain/composeResources/values-ar-rEG/strings.xml +++ b/tracker/src/commonMain/composeResources/values-ar-rEG/strings.xml @@ -1,4 +1,4 @@ إلغاء - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-ar-rIQ/strings.xml b/tracker/src/commonMain/composeResources/values-ar-rIQ/strings.xml index d5c8672a934..89c900b726e 100644 --- a/tracker/src/commonMain/composeResources/values-ar-rIQ/strings.xml +++ b/tracker/src/commonMain/composeResources/values-ar-rIQ/strings.xml @@ -5,4 +5,4 @@ إلغاء إزالة البحث - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-ar/strings.xml b/tracker/src/commonMain/composeResources/values-ar/strings.xml index 8dce4e073d0..49ad9b39dd4 100644 --- a/tracker/src/commonMain/composeResources/values-ar/strings.xml +++ b/tracker/src/commonMain/composeResources/values-ar/strings.xml @@ -10,4 +10,4 @@ إزلة بحث اختياري - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-ckb/strings.xml b/tracker/src/commonMain/composeResources/values-ckb/strings.xml index f5ddbc7a2bf..194e179ced2 100644 --- a/tracker/src/commonMain/composeResources/values-ckb/strings.xml +++ b/tracker/src/commonMain/composeResources/values-ckb/strings.xml @@ -3,4 +3,4 @@ لابردن لابردن گەڕان - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-cs/strings.xml b/tracker/src/commonMain/composeResources/values-cs/strings.xml index 0e2b324281e..23c94f46bf8 100644 --- a/tracker/src/commonMain/composeResources/values-cs/strings.xml +++ b/tracker/src/commonMain/composeResources/values-cs/strings.xml @@ -14,6 +14,7 @@ Zobrazit méně Zrušit Odstranit + Nejsou nakonfigurována žádná pole pro vyhledávání.\nObraťte se na správce. Vymazat hledání Hledat Volitelný diff --git a/tracker/src/commonMain/composeResources/values-da/strings.xml b/tracker/src/commonMain/composeResources/values-da/strings.xml index 60ff2b43248..755406527e6 100644 --- a/tracker/src/commonMain/composeResources/values-da/strings.xml +++ b/tracker/src/commonMain/composeResources/values-da/strings.xml @@ -3,5 +3,4 @@ Cancel Remove Optional - - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-es-rES/strings.xml b/tracker/src/commonMain/composeResources/values-es-rES/strings.xml index 00394e9675c..83326a8a023 100644 --- a/tracker/src/commonMain/composeResources/values-es-rES/strings.xml +++ b/tracker/src/commonMain/composeResources/values-es-rES/strings.xml @@ -7,4 +7,4 @@ Cancelar Eliminar Buscar - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-es/strings.xml b/tracker/src/commonMain/composeResources/values-es/strings.xml index 30a12a04e4f..5f312bc0403 100644 --- a/tracker/src/commonMain/composeResources/values-es/strings.xml +++ b/tracker/src/commonMain/composeResources/values-es/strings.xml @@ -17,5 +17,4 @@ Borrar búsqueda Buscar Opcional - - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-fr/strings.xml b/tracker/src/commonMain/composeResources/values-fr/strings.xml index e60c3cb7d1f..d1753b587c8 100644 --- a/tracker/src/commonMain/composeResources/values-fr/strings.xml +++ b/tracker/src/commonMain/composeResources/values-fr/strings.xml @@ -1,6 +1,6 @@ - Il n'y a pas de relations, cliquez "+" pour en ajouter une nouvelle. + Il n\'y a pas de relations, cliquez "+" pour en ajouter une nouvelle. Relation créée le Supprimer %1$s? Le fichier %1$s sera supprimé. Cette action est irréversible. @@ -15,5 +15,4 @@ Supprimer Rechercher Optional - - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-hi-rIN/strings.xml b/tracker/src/commonMain/composeResources/values-hi-rIN/strings.xml index a91e87c5a30..27cb0420f55 100644 --- a/tracker/src/commonMain/composeResources/values-hi-rIN/strings.xml +++ b/tracker/src/commonMain/composeResources/values-hi-rIN/strings.xml @@ -1,9 +1,23 @@ + कोई संबंध नहीं है, नया जोड़ने के लिए “+” पर क्लिक करें + संबंध बनाया गया + हटाएँ %1$s\? + %1$s हटा दिया जाएगा। यह कार्रवाई वापस नहीं की जा सकती + %1$d संबंध हटाएँ\? + %1$d हटा दिया जाएगा। यह कार्रवाई वापस नहीं की जा सकती + %1$d और दिखाएँ + संबंध कोई डेटा नहीं + सिंक हो रहा है… और दिखाएँ कम दिखाएँ रद्द करें हटाएं + उपयोग के लिए कोई खोज फ़ील्ड कॉन्फ़िगर नहीं है\nकृपया अपने एडमिन से संपर्क करें + खोज साफ़ करें सर्च करें / खोजें - \ No newline at end of file + वैकल्पिक + लॉन्च + + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-id/strings.xml b/tracker/src/commonMain/composeResources/values-id/strings.xml index 487f5f0df04..181e9438838 100644 --- a/tracker/src/commonMain/composeResources/values-id/strings.xml +++ b/tracker/src/commonMain/composeResources/values-id/strings.xml @@ -9,4 +9,4 @@ Batal Hapus Pencarian - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-km/strings.xml b/tracker/src/commonMain/composeResources/values-km/strings.xml index 354a52217c5..d49b5cb7837 100644 --- a/tracker/src/commonMain/composeResources/values-km/strings.xml +++ b/tracker/src/commonMain/composeResources/values-km/strings.xml @@ -6,5 +6,4 @@ លុបចេញ ស្វែងរក មិនមានក៏បាន - - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-ko-rKR/strings.xml b/tracker/src/commonMain/composeResources/values-ko-rKR/strings.xml index 7b7dd413661..9401e526928 100644 --- a/tracker/src/commonMain/composeResources/values-ko-rKR/strings.xml +++ b/tracker/src/commonMain/composeResources/values-ko-rKR/strings.xml @@ -1,4 +1,4 @@ 제거 - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-lo/strings.xml b/tracker/src/commonMain/composeResources/values-lo/strings.xml index e1a1a3aaa1d..d56ad65951f 100644 --- a/tracker/src/commonMain/composeResources/values-lo/strings.xml +++ b/tracker/src/commonMain/composeResources/values-lo/strings.xml @@ -10,5 +10,4 @@ ລົບອອກ ຄົ້ນຫາ ​ຢ່າງ​ຕ່ຳ ມີ​ ທັງ​ໝົດ 8 ຄຳ ໃນ​ນັ້ນ​ຕ້ອງ​ມີ​ໂຕ​ໃຫ​ຍ່ 1 ໂຕ ແລະ ໂຕ​ເລກ 1 ໂຕ - - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-my/strings.xml b/tracker/src/commonMain/composeResources/values-my/strings.xml index 84af54c4bb4..6b9d631e693 100644 --- a/tracker/src/commonMain/composeResources/values-my/strings.xml +++ b/tracker/src/commonMain/composeResources/values-my/strings.xml @@ -4,5 +4,4 @@ ပယ်ဖျက်သည် ဖယ်ရှားခြင်း မဖြစ်မနေလုပ်ရန်မလိုပါ။ - - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-nb/strings.xml b/tracker/src/commonMain/composeResources/values-nb/strings.xml index 26e67b8d849..2de83b014cf 100644 --- a/tracker/src/commonMain/composeResources/values-nb/strings.xml +++ b/tracker/src/commonMain/composeResources/values-nb/strings.xml @@ -10,4 +10,4 @@ Fjern Søk Valgfri - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-ne/strings.xml b/tracker/src/commonMain/composeResources/values-ne/strings.xml index df266c4dfd6..d2c23fe891a 100644 --- a/tracker/src/commonMain/composeResources/values-ne/strings.xml +++ b/tracker/src/commonMain/composeResources/values-ne/strings.xml @@ -2,4 +2,4 @@ रद्द गर्नुहोस् खोज - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-nl/strings.xml b/tracker/src/commonMain/composeResources/values-nl/strings.xml index b608c31358e..d3556058f1f 100644 --- a/tracker/src/commonMain/composeResources/values-nl/strings.xml +++ b/tracker/src/commonMain/composeResources/values-nl/strings.xml @@ -9,4 +9,4 @@ Annuleren Verwijderen Zoek - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-prs/strings.xml b/tracker/src/commonMain/composeResources/values-prs/strings.xml index 66f37179cf9..a9146b48628 100644 --- a/tracker/src/commonMain/composeResources/values-prs/strings.xml +++ b/tracker/src/commonMain/composeResources/values-prs/strings.xml @@ -8,4 +8,4 @@ حذف جستجو گزینه ها - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-ps/strings.xml b/tracker/src/commonMain/composeResources/values-ps/strings.xml index 1db8a3aef10..54b359fe55e 100644 --- a/tracker/src/commonMain/composeResources/values-ps/strings.xml +++ b/tracker/src/commonMain/composeResources/values-ps/strings.xml @@ -8,5 +8,4 @@ لرې کول جستجو اختیاري دی - - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-pt-rBR/strings.xml b/tracker/src/commonMain/composeResources/values-pt-rBR/strings.xml index 7b0eb07e654..d6c05ff6e29 100644 --- a/tracker/src/commonMain/composeResources/values-pt-rBR/strings.xml +++ b/tracker/src/commonMain/composeResources/values-pt-rBR/strings.xml @@ -6,4 +6,4 @@ Remover Pesquisar Opcional - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-pt/strings.xml b/tracker/src/commonMain/composeResources/values-pt/strings.xml index 7029762cabd..18e93aa987d 100644 --- a/tracker/src/commonMain/composeResources/values-pt/strings.xml +++ b/tracker/src/commonMain/composeResources/values-pt/strings.xml @@ -17,5 +17,4 @@ Limpar pesquisa Procurar Opcional - - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-ro/strings.xml b/tracker/src/commonMain/composeResources/values-ro/strings.xml index 91c533061af..5e0229f510c 100644 --- a/tracker/src/commonMain/composeResources/values-ro/strings.xml +++ b/tracker/src/commonMain/composeResources/values-ro/strings.xml @@ -2,4 +2,4 @@ Anulare Căutare - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-ru/strings.xml b/tracker/src/commonMain/composeResources/values-ru/strings.xml index a7f61c008ff..80ee1d781ad 100644 --- a/tracker/src/commonMain/composeResources/values-ru/strings.xml +++ b/tracker/src/commonMain/composeResources/values-ru/strings.xml @@ -17,5 +17,4 @@ Очистить поиск Поиск Опционно - - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-si/strings.xml b/tracker/src/commonMain/composeResources/values-si/strings.xml index f8cda1f5046..94986d2b8af 100644 --- a/tracker/src/commonMain/composeResources/values-si/strings.xml +++ b/tracker/src/commonMain/composeResources/values-si/strings.xml @@ -3,4 +3,4 @@ වැඩියෙන් පෙන්වන්න ඉවත් කරන්න සොයන්න - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-sv/strings.xml b/tracker/src/commonMain/composeResources/values-sv/strings.xml index e546e37a096..a8be5c79de8 100644 --- a/tracker/src/commonMain/composeResources/values-sv/strings.xml +++ b/tracker/src/commonMain/composeResources/values-sv/strings.xml @@ -6,5 +6,4 @@ Ta bort Sök Frivillig - - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-tet/strings.xml b/tracker/src/commonMain/composeResources/values-tet/strings.xml index e45c3dc35e3..8e01704e5a1 100644 --- a/tracker/src/commonMain/composeResources/values-tet/strings.xml +++ b/tracker/src/commonMain/composeResources/values-tet/strings.xml @@ -4,5 +4,4 @@ Kansela Hasai Opsional - - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-tg/strings.xml b/tracker/src/commonMain/composeResources/values-tg/strings.xml index 5a698c31b13..e59af9a3757 100644 --- a/tracker/src/commonMain/composeResources/values-tg/strings.xml +++ b/tracker/src/commonMain/composeResources/values-tg/strings.xml @@ -5,5 +5,4 @@ Тоза кардан Ҷустуҷӯ Ихтиёрӣ - - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-uk/strings.xml b/tracker/src/commonMain/composeResources/values-uk/strings.xml index 12b515b7b84..6d354930f7b 100644 --- a/tracker/src/commonMain/composeResources/values-uk/strings.xml +++ b/tracker/src/commonMain/composeResources/values-uk/strings.xml @@ -1,7 +1,7 @@ Немає зв’язків, натисніть «+», щоб додати новий. - Зв'язок + Зв\'язок Немає даних Синхронізація... Показати більше @@ -10,6 +10,5 @@ Видалити Очистити пошук Пошук - Необов'язково - - \ No newline at end of file + Необов\'язково + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-ur/strings.xml b/tracker/src/commonMain/composeResources/values-ur/strings.xml index 5458cc5374b..9d20049aa25 100644 --- a/tracker/src/commonMain/composeResources/values-ur/strings.xml +++ b/tracker/src/commonMain/composeResources/values-ur/strings.xml @@ -8,5 +8,4 @@ حذف تلاش کریں اختیاری - - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-uz-rUZ/strings.xml b/tracker/src/commonMain/composeResources/values-uz-rUZ/strings.xml index 9647509a8a9..6c653b2157b 100644 --- a/tracker/src/commonMain/composeResources/values-uz-rUZ/strings.xml +++ b/tracker/src/commonMain/composeResources/values-uz-rUZ/strings.xml @@ -10,5 +10,4 @@ Олиб ташлаш Izlash Ixtiyoriy - - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-uz/strings.xml b/tracker/src/commonMain/composeResources/values-uz/strings.xml index 8b5e8cc7d14..1849a1ca653 100644 --- a/tracker/src/commonMain/composeResources/values-uz/strings.xml +++ b/tracker/src/commonMain/composeResources/values-uz/strings.xml @@ -11,4 +11,4 @@ Олиб ташлаш Излаш Ихтиёрий - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-vi/strings.xml b/tracker/src/commonMain/composeResources/values-vi/strings.xml index 7558b5f8bce..55e0c4c892a 100644 --- a/tracker/src/commonMain/composeResources/values-vi/strings.xml +++ b/tracker/src/commonMain/composeResources/values-vi/strings.xml @@ -17,5 +17,4 @@ Bỏ tìm kiếm Tìm kiếm Không bắt buộc - - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-zh-rCN/strings.xml b/tracker/src/commonMain/composeResources/values-zh-rCN/strings.xml index e9bd51827e4..10588f2a543 100644 --- a/tracker/src/commonMain/composeResources/values-zh-rCN/strings.xml +++ b/tracker/src/commonMain/composeResources/values-zh-rCN/strings.xml @@ -17,5 +17,4 @@ 清除搜索 搜索 可选项描述 - - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-zh/strings.xml b/tracker/src/commonMain/composeResources/values-zh/strings.xml index 3d55157830f..1809d042178 100644 --- a/tracker/src/commonMain/composeResources/values-zh/strings.xml +++ b/tracker/src/commonMain/composeResources/values-zh/strings.xml @@ -14,6 +14,7 @@ 显示较少 取消 移除 + 没有配置可使用的搜索字段。\n请联系您的管理员。 清除搜索 搜索 可选项描述 From 5e177fa5830a25940836bdbb5dba9b3f90de4a2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Thu, 12 Feb 2026 14:00:56 +0100 Subject: [PATCH 050/260] test: Add NotesIdlingResource to NoteDetailPresenter.kt on save() method (#4650) * test: Add NotesIdlingResource to NoteDetailPresenter.kt on save() method * Update app/src/main/java/org/dhis2/usescases/notes/noteDetail/NoteDetailPresenter.kt Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../usescases/notes/noteDetail/NoteDetailPresenter.kt | 3 +++ gradle/verification-metadata.xml | 11 +++-------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/dhis2/usescases/notes/noteDetail/NoteDetailPresenter.kt b/app/src/main/java/org/dhis2/usescases/notes/noteDetail/NoteDetailPresenter.kt index e6177b63925..2b2ae97b545 100644 --- a/app/src/main/java/org/dhis2/usescases/notes/noteDetail/NoteDetailPresenter.kt +++ b/app/src/main/java/org/dhis2/usescases/notes/noteDetail/NoteDetailPresenter.kt @@ -2,6 +2,7 @@ package org.dhis2.usescases.notes.noteDetail import io.reactivex.disposables.CompositeDisposable import org.dhis2.commons.schedulers.SchedulerProvider +import org.dhis2.usescases.notes.NotesIdlingResource import timber.log.Timber class NoteDetailPresenter( @@ -33,6 +34,8 @@ class NoteDetailPresenter( disposable.add( repository .saveNote(noteType, uid, message) + .doOnSubscribe { NotesIdlingResource.increment() } + .doFinally { NotesIdlingResource.decrement() } .subscribeOn(scheduler.io()) .observeOn(scheduler.ui()) .subscribe( diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 9da014e089c..69d9a98c4ed 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -12409,16 +12409,11 @@ - - - + + + - - - From d3fd9f891678428659c7467eba6c1f22083b985f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Fri, 13 Feb 2026 07:13:43 +0100 Subject: [PATCH 051/260] review-flaky-tests (#4653) * test: add wait for view on DataSetTableRobot.kt * test: add waitForView on checkNoteWasNotCreated in NoteRobot.kt * test: add waitUntilExactlyOneExists on some actions in TeiDashboardRobot.kt * test: remove un used methods on TeiDashboardRobot.kt * wait for confirmation button to be displayed * wait for confirmation button to be displayed --------- Co-authored-by: Pablo Pajuelo Cabezas --- .../usescases/datasets/DataSetTableRobot.kt | 11 ++ .../usescases/flow/teiFlow/TeiFlowRobot.kt | 2 + .../programevent/ProgramEventTest.kt | 12 +- .../programevent/robot/ProgramEventsRobot.kt | 7 +- .../teidashboard/robot/EventRobot.kt | 3 +- .../usescases/teidashboard/robot/NoteRobot.kt | 2 +- .../teidashboard/robot/TeiDashboardRobot.kt | 164 ++---------------- 7 files changed, 36 insertions(+), 165 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTableRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTableRobot.kt index e8b6e272edf..45df85f6752 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTableRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTableRobot.kt @@ -115,8 +115,19 @@ internal class DataSetTableRobot( composeTestRule.onNodeWithTag(SYNC_BUTTON_TAG) .assertIsDisplayed() .performClick() + + // Wait for the dialog to appear before interacting with it + composeTestRule.waitUntilExactlyOneExists( + hasText("Refresh"), + TIMEOUT, + ) composeTestRule.onNodeWithText("Refresh") .assertIsDisplayed() + + composeTestRule.waitUntilExactlyOneExists( + hasText("Not now"), + TIMEOUT, + ) composeTestRule.onNodeWithText("Not now") .assertIsDisplayed() .performClick() diff --git a/app/src/androidTest/java/org/dhis2/usescases/flow/teiFlow/TeiFlowRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/flow/teiFlow/TeiFlowRobot.kt index 59904781ca9..a8d0f167239 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/flow/teiFlow/TeiFlowRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/flow/teiFlow/TeiFlowRobot.kt @@ -116,8 +116,10 @@ class TeiFlowRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { teiDashboardRobot(composeTestRule) { clickOnMenuMoreOptions() clickOnTimelineEvents() + composeTestRule.waitForIdle() clickOnMenuMoreOptions() clickOnMenuComplete() + composeTestRule.waitForIdle() checkCanNotAddEvent() checkAllEventsAreClosed() } diff --git a/app/src/androidTest/java/org/dhis2/usescases/programevent/ProgramEventTest.kt b/app/src/androidTest/java/org/dhis2/usescases/programevent/ProgramEventTest.kt index 99bde9ffc87..094cbace362 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/programevent/ProgramEventTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/programevent/ProgramEventTest.kt @@ -80,13 +80,11 @@ class ProgramEventTest : BaseTest() { programEventsRobot(composeTestRule) { clickOnEvent(eventDate) - } - eventRobot(composeTestRule) { - openMenuMoreOptions() - clickOnDelete() - clickOnDeleteDialog() - } - programEventsRobot(composeTestRule) { + eventRobot(composeTestRule) { + openMenuMoreOptions() + clickOnDelete() + clickOnDeleteDialog() + } checkEventWasDeleted(eventDate) } } diff --git a/app/src/androidTest/java/org/dhis2/usescases/programevent/robot/ProgramEventsRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/programevent/robot/ProgramEventsRobot.kt index e8d749e430e..ad20e27a443 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/programevent/robot/ProgramEventsRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/programevent/robot/ProgramEventsRobot.kt @@ -9,12 +9,6 @@ import androidx.compose.ui.test.junit4.ComposeContentTestRule import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick -import androidx.test.espresso.Espresso.onView -import androidx.test.espresso.action.ViewActions.click -import androidx.test.espresso.assertion.ViewAssertions.matches -import androidx.test.espresso.matcher.ViewMatchers.isDisplayed -import androidx.test.espresso.matcher.ViewMatchers.withId -import org.dhis2.R import org.dhis2.common.BaseRobot fun programEventsRobot( @@ -68,6 +62,7 @@ class ProgramEventsRobot(val composeTestRule: ComposeContentTestRule) : BaseRobo } fun checkEventWasDeleted(eventDate: String) { + composeTestRule.waitForIdle() composeTestRule.onNodeWithText(eventDate).assertDoesNotExist() } diff --git a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/EventRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/EventRobot.kt index 64200c78baa..cb6475cdba3 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/EventRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/EventRobot.kt @@ -60,11 +60,12 @@ class EventRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { with(InstrumentationRegistry.getInstrumentation().targetContext) { val deleteLabel = getString(R.string.delete) composeTestRule.onNodeWithText(deleteLabel).performClick() + composeTestRule.waitForIdle() } } fun clickOnDeleteDialog() { - onView(withId(R.id.possitive)).perform(click()) + waitForView(withId(R.id.possitive)).perform(click()) } fun checkEventDetails(eventDate: String, eventOrgUnit: String) { diff --git a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt index 6beae0c2fcd..15271cd54d8 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt @@ -61,7 +61,7 @@ class NoteRobot : BaseRobot() { } fun checkNoteWasNotCreated(text: String) { - onView(withId(R.id.notes_recycler)).check( + waitForView(withId(R.id.notes_recycler)).check( matches( not( atPosition( diff --git a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/TeiDashboardRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/TeiDashboardRobot.kt index 5c1ae787770..d43cf6a216f 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/TeiDashboardRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/TeiDashboardRobot.kt @@ -7,8 +7,6 @@ import androidx.compose.ui.test.hasAnySibling import androidx.compose.ui.test.hasTestTag import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.ComposeTestRule -import androidx.compose.ui.test.onAllNodesWithText -import androidx.compose.ui.test.onFirst import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick @@ -17,7 +15,6 @@ import androidx.test.espresso.Espresso.onView import androidx.test.espresso.NoMatchingViewException import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.assertion.ViewAssertions.matches -import androidx.test.espresso.contrib.RecyclerViewActions.actionOnItem import androidx.test.espresso.contrib.RecyclerViewActions.actionOnItemAtPosition import androidx.test.espresso.intent.Intents import androidx.test.espresso.intent.matcher.IntentMatchers @@ -31,20 +28,14 @@ import androidx.test.platform.app.InstrumentationRegistry import org.dhis2.R import org.dhis2.common.BaseRobot import org.dhis2.common.matchers.RecyclerviewMatchers.Companion.atPosition -import org.dhis2.common.matchers.RecyclerviewMatchers.Companion.hasItem import org.dhis2.common.matchers.RecyclerviewMatchers.Companion.isNotEmpty -import org.dhis2.usescases.event.entity.EventStatusUIModel -import org.dhis2.usescases.event.entity.TEIProgramStagesUIModel -import org.dhis2.usescases.flow.teiFlow.entity.DateRegistrationUIModel import org.dhis2.usescases.programStageSelection.ProgramStageSelectionActivity import org.dhis2.usescases.programStageSelection.ProgramStageSelectionViewHolder -import org.dhis2.usescases.teiDashboard.dashboardfragments.teidata.teievents.EventViewHolder import org.dhis2.usescases.teiDashboard.ui.INFO_BAR_TEST_TAG import org.dhis2.usescases.teiDashboard.ui.TEST_ADD_EVENT_BUTTON import org.dhis2.usescases.teiDashboard.ui.TEST_ADD_EVENT_BUTTON_IN_TIMELINE import org.dhis2.usescases.teiDashboard.ui.model.InfoBarType import org.dhis2.usescases.teidashboard.entity.EnrollmentUIModel -import org.dhis2.usescases.teidashboard.entity.UpperEnrollmentUIModel import org.hamcrest.CoreMatchers.allOf import org.hamcrest.CoreMatchers.anyOf import org.hamcrest.CoreMatchers.equalTo @@ -58,6 +49,7 @@ fun teiDashboardRobot( } } +@OptIn(ExperimentalTestApi::class) class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { fun goToNotes() { @@ -84,7 +76,7 @@ class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { R.string.navigation_analytics ) composeTestRule.waitUntilExactlyOneExists( - hasText(analyticsText,true), + hasText(analyticsText, true), TIMEOUT ) composeTestRule.onNodeWithText(analyticsText, useUnmergedTree = true).performClick() @@ -113,11 +105,6 @@ class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { composeTestRule.onNodeWithText(title).performClick() } - fun clickOnEventWith(searchParam: String) { - composeTestRule.onAllNodesWithText(searchParam, useUnmergedTree = true).onFirst() - .performClick() - } - fun clickOnFab() { composeTestRule.onNodeWithTag(TEST_ADD_EVENT_BUTTON_IN_TIMELINE, useUnmergedTree = true) .performClick() @@ -144,11 +131,6 @@ class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { Intents.intended(allOf(IntentMatchers.hasComponent(ProgramStageSelectionActivity::class.java.name))) } - - fun clickOnReferralOption(oneTime: String) { - composeTestRule.onNodeWithText(oneTime).performClick() - } - fun clickOnReferralNextButton() { waitForView(withId(R.id.action_button)).perform(click()) } @@ -184,6 +166,10 @@ class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { fun clickOnMenuComplete() { with(InstrumentationRegistry.getInstrumentation().targetContext) { + composeTestRule.waitUntilExactlyOneExists( + hasText(getString(R.string.complete)), + TIMEOUT + ) composeTestRule.onNodeWithText(getString(R.string.complete)).performClick() } } @@ -199,22 +185,6 @@ class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { .assertDoesNotExist() } - fun clickOnShareButton() { - with(InstrumentationRegistry.getInstrumentation().targetContext) { - composeTestRule.onNodeWithText(getString(R.string.share)).performClick() - } - } - - fun clickOnNextQR() { - var qrLenght = 1 - - while (qrLenght < 8) { - waitForView(withId(R.id.next)) - onView(withId(R.id.next)).perform(click()) - qrLenght++ - } - } - fun clickOnMenuDeleteTEI() { with(InstrumentationRegistry.getInstrumentation().targetContext) { composeTestRule.onNodeWithText(getString(R.string.dashboard_menu_delete_person)) @@ -222,11 +192,6 @@ class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { } } - fun checkUpperInfo(upperInformation: UpperEnrollmentUIModel) { - onView(withId(R.id.org_unit)) - .check(matches(withText(upperInformation.orgUnit))) - } - fun clickOnSeeDetails() { waitForView(withId(R.id.editButton)) .perform(click()) @@ -270,17 +235,14 @@ class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { fun clickOnMenuProgramEnrollments() { with(InstrumentationRegistry.getInstrumentation().targetContext) { val programSelectorLabel = getString(R.string.more_enrollments) + composeTestRule.waitUntilExactlyOneExists( + hasText(programSelectorLabel), + TIMEOUT + ) composeTestRule.onNodeWithText(programSelectorLabel).performClick() } } - fun checkEventWasCreatedAndClosed(eventName: String) { - composeTestRule.onNodeWithText(eventName).assertIsDisplayed() - val targetContext: Context = InstrumentationRegistry.getInstrumentation().targetContext - val viewOnlyText = targetContext.resources.getString(R.string.view_only) - composeTestRule.onNodeWithText(viewOnlyText).assertDoesNotExist() - } - fun clickOnMenuDeleteEnrollment() { with(InstrumentationRegistry.getInstrumentation().targetContext) { val deleteEnrollmentLabel = getString(R.string.remove_from) @@ -292,6 +254,10 @@ class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { with(InstrumentationRegistry.getInstrumentation().targetContext) { val timelineLabel = getString(R.string.view_timeline) try { + composeTestRule.waitUntilExactlyOneExists( + hasText(timelineLabel), + TIMEOUT + ) composeTestRule.onNodeWithText(timelineLabel).performClick() } catch (e: NoMatchingViewException) { checkIfGroupedEventsIsVisible() @@ -299,19 +265,6 @@ class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { } } - fun clickOnReopen() { - with(InstrumentationRegistry.getInstrumentation().targetContext) { - val timelineLabel = getString(R.string.enrollment_reopen) - val eventLabel = resources.getQuantityString(R.plurals.event_label, 2) - val itemLabel = timelineLabel.format(eventLabel) - try { - onView(withText(itemLabel)).perform(click()) - } catch (e: NoMatchingViewException) { - checkIfGroupedEventsIsVisible() - } - } - } - private fun checkIfGroupedEventsIsVisible() { with(InstrumentationRegistry.getInstrumentation().targetContext) { val groupLabel = getString(R.string.group_by_stage) @@ -383,85 +336,6 @@ class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { composeTestRule.onAllNodes(hasText(viewOnlyText), useUnmergedTree = false) } - fun clickOnStageGroup(programStageName: String) { - composeTestRule.onNodeWithText(programStageName).performClick() - } - - fun clickOnEventGroupByStage(eventDate: String) { - onView(withId(R.id.tei_recycler)) - .perform( - actionOnItem( - hasDescendant( - allOf( - withText(eventDate), - withId(R.id.event_date), - ), - ), - click(), - ), - ) - } - - fun checkEventWasDeletedStageGroup(teiProgramStages: TEIProgramStagesUIModel) { - val firstProgramStage = teiProgramStages.programStage_first - val secondProgramStage = teiProgramStages.programStage_second - val thirdProgramStage = teiProgramStages.programStage_third - - onView(withId(R.id.tei_recycler)) - .check( - matches( - allOf( - hasItem( - allOf( - hasDescendant(withText(firstProgramStage.name)), - hasDescendant(withText(firstProgramStage.events)), - ), - ), - hasItem( - allOf( - hasDescendant(withText(secondProgramStage.name)), - hasDescendant(withText(secondProgramStage.events)), - ), - ), - hasItem( - allOf( - hasDescendant(withText(thirdProgramStage.name)), - hasDescendant(withText(thirdProgramStage.events)), - ), - ), - ), - ), - ) - } - - fun checkEventStateStageGroup(eventDetails: EventStatusUIModel) { - var status = R.drawable.ic_event_status_open - when (eventDetails.status) { - "Open" -> status = R.drawable.ic_event_status_open - "Overdue" -> status = R.drawable.ic_event_status_overdue - "Event Completed" -> status = R.drawable.ic_event_status_complete - "Skip" -> status = R.drawable.ic_event_status_skipped - "Schedule" -> status = R.drawable.ic_event_status_schedule - } - - onView(withId(R.id.tei_recycler)) - .check( - matches( - hasItem( - allOf( - hasDescendant(withText(eventDetails.date)), - hasDescendant(withText(eventDetails.orgUnit)), - hasDescendant(withTagValue(equalTo(status))), - ), - ), - ), - ) - } - - fun clickOnEventGroupByStageUsingDate(dueDate: String) { - composeTestRule.onNodeWithText(dueDate).performClick() - } - fun clickOnConfirmDeleteTEI() { composeTestRule.onNodeWithText("Delete").performClick() } @@ -470,16 +344,6 @@ class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { composeTestRule.onNodeWithText("Remove").performClick() } - fun checkEnrollmentDate(enrollmentDate: DateRegistrationUIModel) { - composeTestRule.onNode( - hasText( - "Date of enrollment: 0${enrollmentDate.day}/0${enrollmentDate.month}/${enrollmentDate.year}", - true - ), - useUnmergedTree = true - ).assertIsDisplayed() - } - fun typeOnInputDateField(dateValue: String, title: String) { composeTestRule.apply { onNode( From b52006de0fdce22fdfa8be4479c0cfd33c889ea1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Fri, 13 Feb 2026 10:45:05 +0100 Subject: [PATCH 052/260] ANDROAPP-7218-Implement-OAuth-login-flow-Part-2-Retrieving-authentication-token-and-log-in [skip size] (#4637) * feat: Register the device * feat: Enroll device in the SDK * feat: POC full login with OAuth * feat: remove hardcoded server * feat: Move Oauth flow to CredentialsScreen.kt * feat: Clear CustomTabs sessions when starting the login flow * refactor: move hardcoded error message to resources * feat: hide credentialsContainer when is an OAuth login * change initialization order to avoid creashes * feat: update login button text to display oauth login * feat: set states for running log in process * SDK support * refactor: merge LegacyLogin and OAuthLogin * feat: Improve Server title and image background * refactor: Remove Login with DHIS2 button text * feat: automatically enroll when user arrives to credentials screen with OAuth * test: update CredentialsViewModelTest.kt * test: remove testing url * fix: Login Repository * fix: SonarCloud warnings * test: Add waitForView to assert that a note has been created * fix: avoid non null assertion in LoginUserWithOAuth.kt * fix: remove clear cache --- .../usescases/teidashboard/robot/NoteRobot.kt | 13 +- app/src/main/AndroidManifest.xml | 8 + .../data/forms/dataentry/ValueStoreImpl.kt | 8 + .../development/ConflictGenerator.kt | 7 +- gradle/libs.versions.toml | 2 +- gradle/verification-metadata.xml | 16 ++ .../login/main/data/LoginRepositoryImpl.kt | 94 +++++++--- .../login/main/di/LoginModule.android.kt | 19 +- .../ui/screen/WebAuthenticator.android.kt | 15 +- .../composeResources/values/strings.xml | 2 + .../ui/viewmodel/AccountsViewModel.kt | 3 +- .../mobile/login/main/data/LoginRepository.kt | 13 ++ .../dhis2/mobile/login/main/di/LoginModule.kt | 33 +++- .../main/domain/model/DeviceEnrollmentInfo.kt | 6 + .../main/domain/model/LoginScreenState.kt | 5 +- .../domain/model/ServerValidationResult.kt | 5 +- .../domain/usecase/GetDeviceEnrollmentUrl.kt | 16 ++ .../main/domain/usecase/GetInitialScreen.kt | 36 ++-- .../main/domain/usecase/LoginUserWithOAuth.kt | 32 ++++ .../domain/usecase/ProcessDeviceEnrollment.kt | 22 +++ .../login/main/ui/screen/CredentialsScreen.kt | 54 ++++-- .../login/main/ui/screen/LoginScreen.kt | 18 +- .../login/main/ui/state/CredentialsUiState.kt | 1 + .../main/ui/viewmodel/CredentialsViewModel.kt | 149 ++++++++++++++- .../login/main/ui/viewmodel/LoginViewModel.kt | 38 +--- .../login/main/LoginScreenIntegrationTest.kt | 30 +-- .../ui/viewmodel/CredentialsViewModelTest.kt | 171 +++++++++++++++++- .../main/ui/viewmodel/LoginViewModelTest.kt | 48 ----- .../usecase/GetInitialScreenUseCaseTest.kt | 17 +- 29 files changed, 661 insertions(+), 220 deletions(-) create mode 100644 login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/DeviceEnrollmentInfo.kt create mode 100644 login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/GetDeviceEnrollmentUrl.kt create mode 100644 login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/LoginUserWithOAuth.kt create mode 100644 login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/ProcessDeviceEnrollment.kt diff --git a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt index 15271cd54d8..97cf54d2117 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt @@ -74,13 +74,12 @@ class NoteRobot : BaseRobot() { } fun checkNewNoteWasCreated(text: String) { - waitForView(withId(R.id.notes_recycler)).check( - matches( - allOf( - isDisplayed(), - isNotEmpty(), - atPosition(0, hasDescendant(withText(text))) - ) + waitForView( + allOf( + withId(R.id.notes_recycler), + isDisplayed(), + isNotEmpty(), + atPosition(0, hasDescendant(withText(text))) ) ) } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dd346b3e6c1..015c7bc1c15 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -73,6 +73,14 @@ android:configChanges="orientation|screenSize" android:exported="true" android:launchMode="singleTask"> + + + + + + diff --git a/app/src/main/java/org/dhis2/data/forms/dataentry/ValueStoreImpl.kt b/app/src/main/java/org/dhis2/data/forms/dataentry/ValueStoreImpl.kt index 523c7b362cc..c505471e2c0 100644 --- a/app/src/main/java/org/dhis2/data/forms/dataentry/ValueStoreImpl.kt +++ b/app/src/main/java/org/dhis2/data/forms/dataentry/ValueStoreImpl.kt @@ -17,9 +17,11 @@ import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.arch.helpers.FileResizerHelper import org.hisp.dhis.android.core.arch.helpers.Result import org.hisp.dhis.android.core.common.ValueType +import org.hisp.dhis.android.core.datavalue.LegacyDataValueApi import org.hisp.dhis.android.core.enrollment.EnrollmentObjectRepository import java.io.File +@OptIn(LegacyDataValueApi::class) class ValueStoreImpl( private val d2: D2, private val recordUid: String, @@ -108,10 +110,12 @@ class ValueStoreImpl( .getFriendlyErrorMessage(validation.failure), ), ) + is Result.Success -> dataValueObject .set(value) .andThen(Flowable.just(StoreResult("", ValueStoreResult.VALUE_CHANGED))) + else -> Flowable.just( StoreResult( @@ -146,12 +150,14 @@ class ValueStoreImpl( .uid(uid) .blockingExists() -> saveDataElement(uid, value) + d2 .trackedEntityModule() .trackedEntityAttributes() .uid(uid) .blockingExists() -> saveAttribute(uid, value) + else -> Flowable.just(StoreResult(uid, ValueStoreResult.UID_IS_NOT_DE_OR_ATTR)) } @@ -176,6 +182,7 @@ class ValueStoreImpl( .blockingGet() enrollment?.trackedEntityInstance() } + EntryMode.ATTR -> recordUid EntryMode.DV -> null } @@ -381,6 +388,7 @@ class ValueStoreImpl( deleteOptionValuesForEnrollment( optionCodeValuesToDelete, ) + EntryMode.DV, -> throw IllegalArgumentException( "DataValues can't be saved using these arguments. Use the other one.", diff --git a/app/src/main/java/org/dhis2/usescases/development/ConflictGenerator.kt b/app/src/main/java/org/dhis2/usescases/development/ConflictGenerator.kt index 601483fe600..b8b9243cbdb 100644 --- a/app/src/main/java/org/dhis2/usescases/development/ConflictGenerator.kt +++ b/app/src/main/java/org/dhis2/usescases/development/ConflictGenerator.kt @@ -1,3 +1,5 @@ +@file:OptIn(LegacyDataValueApi::class) + package org.dhis2.usescases.development import kotlinx.coroutines.runBlocking @@ -8,6 +10,7 @@ import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.datavalue.DataValue import org.hisp.dhis.android.core.datavalue.DataValueConflict +import org.hisp.dhis.android.core.datavalue.LegacyDataValueApi import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.event.Event import org.hisp.dhis.android.core.imports.ImportStatus @@ -423,7 +426,9 @@ class ConflictGenerator( try { runBlocking { d2.databaseAdapter().upsertObject(conflict, TrackerImportConflict::class) - d2.databaseAdapter().execSQL(updateEvent(event.uid(), importStatus.toSyncState().name)) + d2 + .databaseAdapter() + .execSQL(updateEvent(event.uid(), importStatus.toSyncState().name)) } } catch (e: Exception) { Timber.e(e) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a9d6178ede3..10c1780dfe7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -11,7 +11,7 @@ kotlin = '2.2.21' dagger = '2.57.2' jacoco = '0.8.14' designSystem = "0.7.0-SNAPSHOT" -dhis2sdk = "1.14.0-20260202.110438-9" +dhis2sdk = "1.14.0-20260209.084921-13" ruleEngine = "3.3.11" expressionParser = "1.2.2" appcompat = "1.7.1" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 69d9a98c4ed..ffb15d35b03 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -6427,6 +6427,14 @@ + + + + + + + + @@ -7452,6 +7460,14 @@ + + + + + + + + diff --git a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt index 30f30552423..b6ae1019e9c 100644 --- a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt +++ b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt @@ -8,6 +8,8 @@ import org.dhis2.mobile.commons.auth.OpenIdController import org.dhis2.mobile.commons.biometrics.BiometricActions import org.dhis2.mobile.commons.biometrics.CryptographicActions import org.dhis2.mobile.commons.coroutine.Dispatcher +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.mobile.commons.error.DomainErrorMapper import org.dhis2.mobile.commons.providers.BIOMETRIC_CREDENTIALS import org.dhis2.mobile.commons.providers.PreferenceProvider import org.dhis2.mobile.commons.providers.SECURE_PASS @@ -17,11 +19,14 @@ import org.dhis2.mobile.commons.reporting.CrashReportController import org.dhis2.mobile.commons.resources.D2ErrorMessageProvider import org.dhis2.mobile.login.main.domain.model.ServerValidationResult import org.dhis2.mobile.login.resources.Res +import org.dhis2.mobile.login.resources.error_device_not_registered import org.dhis2.mobile.login.resources.openid_invalid_auth_result import org.dhis2.mobile.login.resources.openid_process_cancelled import org.dhis2.mobile.login.resources.server_url_error import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.arch.helpers.Result +import org.hisp.dhis.android.core.maintenance.D2Error +import org.hisp.dhis.android.core.user.oauth2.OAuth2Config import org.hisp.dhis.android.core.user.openid.IntentWithRequestCode import org.hisp.dhis.android.core.user.openid.OpenIDConnectConfig import org.jetbrains.compose.resources.getString @@ -47,6 +52,7 @@ class LoginRepositoryImpl( private val analyticActions: AnalyticActions, private val openIdController: OpenIdController, private val dispatcher: Dispatcher, + private val domainErrorMapper: DomainErrorMapper, ) : LoginRepository { override suspend fun validateServer( server: String, @@ -55,26 +61,24 @@ class LoginRepositoryImpl( withContext(dispatcher.io) { when (val result = d2.serverModule().blockingCheckServerUrl(server)) { is Result.Success -> { - if (result.value.isOauthEnabled()) { - ServerValidationResult.Oauth - } else { - val oidcProvider = result.value.oidcProviders.firstOrNull() - val serverName = - result.value.applicationTitle ?: try { - server.substringAfter("://").substringBefore("/") - } catch (_: Exception) { - server - } - ServerValidationResult.Legacy( - serverName = serverName, - serverDescription = result.value.applicationDescription, - countryFlag = result.value.countryFlag, - allowRecovery = result.value.allowAccountRecovery, - oidcIcon = oidcProvider?.icon, - oidcLoginText = oidcProvider?.loginText, - oidcUrl = oidcProvider?.url, - ) - } + val serverName = + result.value.applicationTitle ?: try { + server.substringAfter("://").substringBefore("/") + } catch (_: Exception) { + server + } + + val oidcProvider = result.value.oidcProviders.firstOrNull() + ServerValidationResult.Success( + serverName = serverName.ifEmpty { "DHIS2" }, + serverDescription = result.value.applicationDescription, + countryFlag = result.value.countryFlag, + allowRecovery = result.value.allowAccountRecovery, + oidcIcon = oidcProvider?.icon, + oidcLoginText = oidcProvider?.loginText, + oidcUrl = oidcProvider?.url, + oAuthEnabled = result.value.isOauthEnabled(), + ) } is Result.Failure -> { @@ -123,6 +127,51 @@ class LoginRepositoryImpl( } } + override suspend fun getDeviceEnrollmentUrl(serverUrl: String) = + withContext(dispatcher.io) { + try { + d2.userModule().oauth2Handler().blockingBuildEnrollmentUrl(serverUrl) + } catch (d2Error: D2Error) { + throw domainErrorMapper.mapToDomainError(d2Error) + } + } + + override suspend fun enrollDevice( + iat: String, + serverURL: String, + ) = withContext(dispatcher.io) { + try { + d2.userModule().oauth2Handler().blockingHandleEnrollmentResponse( + serverUrl = serverURL, + iat = iat, + ) + + if (!d2.userModule().oauth2Handler().isDeviceRegistered()) { + throw DomainError.AuthenticationError(getString(Res.string.error_device_not_registered)) + } + + val config = OAuth2Config(serverUrl = serverURL) + // Return the authorization URL + d2.userModule().oauth2Handler().blockingLogIn(config) + } catch (d2Error: D2Error) { + throw domainErrorMapper.mapToDomainError(d2Error) + } + } + + override suspend fun loginUserWithOAuth( + serverUrl: String, + code: String, + ) = withContext(dispatcher.io) { + try { + val user = + d2.userModule().oauth2Handler().blockingHandleLogInResponse(serverUrl, code) + kotlin.Result.success(user.username()) + } catch (d2Error: D2Error) { + val mappedError = domainErrorMapper.mapToDomainError(d2Error) + kotlin.Result.failure(mappedError) + } + } + override suspend fun getAvailableLoginUsernames(): List = withContext(dispatcher.io) { preferences.getSet(PREF_USERS, HashSet())?.toList() ?: emptyList() @@ -179,7 +228,10 @@ class LoginRepositoryImpl( override suspend fun initialSyncDone( serverUrl: String, username: String, - ): Boolean = withContext(dispatcher.io) { isImportedDatabase(serverUrl, username) or entryExists() } + ): Boolean = + withContext(dispatcher.io) { + isImportedDatabase(serverUrl, username) or entryExists() + } override suspend fun canLoginWithBiometrics(serverUrl: String): Boolean = withContext(dispatcher.io) { diff --git a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.android.kt b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.android.kt index 89064cbbbbe..67f3de6957d 100644 --- a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.android.kt +++ b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.android.kt @@ -26,15 +26,16 @@ internal actual val accountModule = factory { params -> LoginRepositoryImpl( - get(), - get(), - get(), - get(), - get(), - get(), - get(), - get { parametersOf(params.get()) }, - get(), + d2 = get(), + authenticator = get(), + cryptographyManager = get(), + preferences = get(), + d2ErrorMessageProvider = get(), + crashReportController = get(), + analyticActions = get(), + openIdController = get { parametersOf(params.get()) }, + dispatcher = get(), + domainErrorMapper = get(), ) } diff --git a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/ui/screen/WebAuthenticator.android.kt b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/ui/screen/WebAuthenticator.android.kt index e9999983252..8c4e18dfa78 100644 --- a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/ui/screen/WebAuthenticator.android.kt +++ b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/ui/screen/WebAuthenticator.android.kt @@ -14,17 +14,6 @@ actual fun WebAuthenticator( url: String, onDismiss: () -> Unit, ) { - // TODO Use the url parameter when the backend supports dynamic redirect URIs - val redirectUri = "https://vgarciabnz.github.io" - val oauthAuthUrl = - "https://dev.im.dhis2.org/oauth2-android-test/oauth2/authorize?" + - "response_type=code" + - "&client_id=dhis2-client" + - "&redirect_uri=$redirectUri" + - "&scope=openid%20email" + - "&state=abc123" - - // Custom Tab launcher will handle the result of the Custom Tab to detect if the user closed it val customTabLauncher = rememberLauncherForActivityResult( contract = ActivityResultContracts.StartActivityForResult(), @@ -41,11 +30,13 @@ actual fun WebAuthenticator( .setShowTitle(false) .setUrlBarHidingEnabled(true) .build() + // Custom Tab is not kept in the activity history stack and it's removed from memory. + // It won't appear in the "Recent Apps" list customTabsIntent.intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) val intent = customTabsIntent.intent.apply { - data = oauthAuthUrl.toUri() + data = url.toUri() } customTabLauncher.launch(intent) diff --git a/login/src/commonMain/composeResources/values/strings.xml b/login/src/commonMain/composeResources/values/strings.xml index a257953321e..12f33c513f6 100644 --- a/login/src/commonMain/composeResources/values/strings.xml +++ b/login/src/commonMain/composeResources/values/strings.xml @@ -67,4 +67,6 @@ Import successful The login was cancelled Invalid authorization result + Device not registered + Missing username from OAuth login response \ No newline at end of file diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/accounts/ui/viewmodel/AccountsViewModel.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/accounts/ui/viewmodel/AccountsViewModel.kt index 65acf2dbe6b..f751d0ec19c 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/accounts/ui/viewmodel/AccountsViewModel.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/accounts/ui/viewmodel/AccountsViewModel.kt @@ -36,12 +36,13 @@ class AccountsViewModel( fun onAccountClicked(account: AccountModel) { viewModelScope.launch { navigator.navigate( - LoginScreenState.LegacyLogin( + LoginScreenState.LoginCredentials( selectedServer = account.serverUrl, selectedUsername = account.name, serverName = account.serverName, selectedServerFlag = account.serverFlag, allowRecovery = account.allowRecovery, + oAuthEnabled = account.isOauthEnabled, ), ) } diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepository.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepository.kt index 9da51f7fbfc..d815b28ed81 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepository.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepository.kt @@ -2,6 +2,7 @@ package org.dhis2.mobile.login.main.data import coil3.PlatformContext import org.dhis2.mobile.login.main.domain.model.ServerValidationResult + typealias UserPassword = String interface LoginRepository { @@ -64,4 +65,16 @@ interface LoginRepository { suspend fun getUsername(): String suspend fun logoutUser(): Result + + suspend fun getDeviceEnrollmentUrl(serverUrl: String): String + + suspend fun enrollDevice( + iat: String, + serverURL: String, + ): String + + suspend fun loginUserWithOAuth( + serverUrl: String, + code: String, + ): Result } diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.kt index 895d4a6c236..ad3a8473672 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.kt @@ -5,12 +5,15 @@ import org.dhis2.mobile.login.authentication.di.twoFAModule import org.dhis2.mobile.login.main.domain.usecase.BiometricLogin import org.dhis2.mobile.login.main.domain.usecase.GetAvailableUsernames import org.dhis2.mobile.login.main.domain.usecase.GetBiometricInfo +import org.dhis2.mobile.login.main.domain.usecase.GetDeviceEnrollmentUrl import org.dhis2.mobile.login.main.domain.usecase.GetHasOtherAccounts import org.dhis2.mobile.login.main.domain.usecase.GetInitialScreen import org.dhis2.mobile.login.main.domain.usecase.ImportDatabase import org.dhis2.mobile.login.main.domain.usecase.LogOutUser import org.dhis2.mobile.login.main.domain.usecase.LoginUser +import org.dhis2.mobile.login.main.domain.usecase.LoginUserWithOAuth import org.dhis2.mobile.login.main.domain.usecase.OpenIdLogin +import org.dhis2.mobile.login.main.domain.usecase.ProcessDeviceEnrollment import org.dhis2.mobile.login.main.domain.usecase.UpdateBiometricPermission import org.dhis2.mobile.login.main.domain.usecase.UpdateTrackingPermission import org.dhis2.mobile.login.main.domain.usecase.ValidateServer @@ -71,15 +74,27 @@ internal val mainLoginModule = factory { params -> OpenIdLogin(get { parametersOf(params.get()) }) } + + factory { params -> + GetDeviceEnrollmentUrl(get { parametersOf(params.get()) }) + } + + factory { params -> + ProcessDeviceEnrollment(get { parametersOf(params.get()) }) + } + + factory { params -> + LoginUserWithOAuth(get { parametersOf(params.get()) }) + } + viewModel { parameters -> val context = parameters.get() LoginViewModel( - get(), - get(), - get { parametersOf(context) }, - get { parametersOf(context) }, - get(), - get(), + navigator = get(), + getInitialScreen = get(), + importDatabase = get { parametersOf(context) }, + validateServer = get { parametersOf(context) }, + networkStatusProvider = get(), ) } viewModel { parameters -> @@ -90,6 +105,7 @@ internal val mainLoginModule = val oidcInfo = parameters[4] as OidcInfo? val context = parameters[5] as PlatformContext val fromHome = parameters[6] as Boolean + val oAuthEnable = parameters[7] as Boolean CredentialsViewModel( navigator = get(), getAvailableUsernames = get { parametersOf(context) }, @@ -99,8 +115,12 @@ internal val mainLoginModule = logOutUser = get { parametersOf(context) }, openIdLogin = get { parametersOf(context) }, biometricLogin = get { parametersOf(context) }, + loginUserWithOAuth = get { parametersOf(context) }, + getDeviceEnrollmentUrl = get { parametersOf(context) }, + processDeviceEnrollment = get { parametersOf(context) }, updateTrackingPermission = get { parametersOf(context) }, updateBiometricPermission = get { parametersOf(context) }, + appLinkNavigation = get(), networkStatusProvider = get(), serverName = serverName, serverUrl = serverUrl, @@ -110,6 +130,7 @@ internal val mainLoginModule = oidcInfo = oidcInfo, forgotPinUseCase = get(), fromHome = fromHome, + oAuthEnable = oAuthEnable, ) } } diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/DeviceEnrollmentInfo.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/DeviceEnrollmentInfo.kt new file mode 100644 index 00000000000..6b5031cdf17 --- /dev/null +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/DeviceEnrollmentInfo.kt @@ -0,0 +1,6 @@ +package org.dhis2.mobile.login.main.domain.model + +data class DeviceEnrollmentInfo( + val iat: String, + val serverURL: String, +) diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/LoginScreenState.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/LoginScreenState.kt index 7e2050a2434..2a11b406016 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/LoginScreenState.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/LoginScreenState.kt @@ -16,16 +16,17 @@ sealed interface LoginScreenState { ) : LoginScreenState @Serializable - data class LegacyLogin( + data class LoginCredentials( val selectedServer: String, val selectedUsername: String?, val serverName: String?, val selectedServerFlag: String?, val allowRecovery: Boolean, + val oAuthEnabled: Boolean, ) : LoginScreenState @Serializable - data class OauthLogin( + data class OauthAuthentication( val selectedServer: String, ) : LoginScreenState diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/ServerValidationResult.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/ServerValidationResult.kt index 527f18a6c64..d870f7b880f 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/ServerValidationResult.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/ServerValidationResult.kt @@ -1,7 +1,7 @@ package org.dhis2.mobile.login.main.domain.model sealed interface ServerValidationResult { - data class Legacy( + data class Success( val serverName: String?, val serverDescription: String?, val countryFlag: String?, @@ -9,10 +9,9 @@ sealed interface ServerValidationResult { val oidcIcon: String?, val oidcLoginText: String?, val oidcUrl: String?, + val oAuthEnabled: Boolean, ) : ServerValidationResult - object Oauth : ServerValidationResult - data class Error( val message: String, ) : ServerValidationResult diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/GetDeviceEnrollmentUrl.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/GetDeviceEnrollmentUrl.kt new file mode 100644 index 00000000000..fc3d1d5c854 --- /dev/null +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/GetDeviceEnrollmentUrl.kt @@ -0,0 +1,16 @@ +package org.dhis2.mobile.login.main.domain.usecase + +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.mobile.login.main.data.LoginRepository + +class GetDeviceEnrollmentUrl( + private val repository: LoginRepository, +) : UseCase { + override suspend fun invoke(input: String): Result = + try { + Result.success(repository.getDeviceEnrollmentUrl(input)) + } catch (e: DomainError) { + Result.failure(e) + } +} diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/GetInitialScreen.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/GetInitialScreen.kt index 31af22fa7d8..0d8f56985ce 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/GetInitialScreen.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/GetInitialScreen.kt @@ -27,28 +27,24 @@ class GetInitialScreen( } private fun handleSingleAccount(account: AccountModel): LoginScreenState = - if (account.isOauthEnabled) { - LoginScreenState.OauthLogin(selectedServer = account.serverUrl) - } else { - account.toLegacyLoginState() - } + LoginScreenState.LoginCredentials( + selectedServer = account.serverUrl, + selectedUsername = account.name, + serverName = account.serverName, + selectedServerFlag = account.serverFlag, + allowRecovery = account.allowRecovery, + oAuthEnabled = account.isOauthEnabled, + ) private suspend fun handleLockedSession(): LoginScreenState { val activeAccount = accountRepository.getActiveAccount() ?: return LoginScreenState.Accounts - - return if (activeAccount.isOauthEnabled) { - LoginScreenState.OauthLogin(selectedServer = activeAccount.serverUrl) - } else { - activeAccount.toLegacyLoginState() - } - } - - private fun AccountModel.toLegacyLoginState(): LoginScreenState.LegacyLogin = - LoginScreenState.LegacyLogin( - selectedServer = serverUrl, - selectedUsername = name, - serverName = serverName, - selectedServerFlag = serverFlag, - allowRecovery = allowRecovery, + return LoginScreenState.LoginCredentials( + selectedServer = activeAccount.serverUrl, + selectedUsername = activeAccount.name, + serverName = activeAccount.serverName, + selectedServerFlag = activeAccount.serverFlag, + allowRecovery = activeAccount.allowRecovery, + oAuthEnabled = activeAccount.isOauthEnabled, ) + } } diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/LoginUserWithOAuth.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/LoginUserWithOAuth.kt new file mode 100644 index 00000000000..87ea9e47967 --- /dev/null +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/LoginUserWithOAuth.kt @@ -0,0 +1,32 @@ +package org.dhis2.mobile.login.main.domain.usecase + +import org.dhis2.mobile.login.main.data.LoginRepository +import org.dhis2.mobile.login.main.domain.model.LoginResult +import org.dhis2.mobile.login.resources.Res +import org.dhis2.mobile.login.resources.missing_username_from_oauth_login_response +import org.jetbrains.compose.resources.getString + +class LoginUserWithOAuth( + repository: LoginRepository, +) : BaseLogin(repository) { + suspend operator fun invoke( + serverUrl: String, + code: String, + ): LoginResult { + val result = repository.loginUserWithOAuth(serverUrl, code) + return when { + result.isSuccess -> { + val username = result.getOrNull() + if (username != null) { + handleResult(Result.success(Unit), serverUrl, username) + } else { + LoginResult.Error(getString(Res.string.missing_username_from_oauth_login_response)) + } + } + + else -> { + LoginResult.Error(result.exceptionOrNull()?.message) + } + } + } +} diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/ProcessDeviceEnrollment.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/ProcessDeviceEnrollment.kt new file mode 100644 index 00000000000..36af353f0f2 --- /dev/null +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/ProcessDeviceEnrollment.kt @@ -0,0 +1,22 @@ +package org.dhis2.mobile.login.main.domain.usecase + +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.mobile.login.main.data.LoginRepository +import org.dhis2.mobile.login.main.domain.model.DeviceEnrollmentInfo + +class ProcessDeviceEnrollment( + private val repository: LoginRepository, +) : UseCase { + override suspend fun invoke(input: DeviceEnrollmentInfo): Result = + try { + Result.success( + repository.enrollDevice( + iat = input.iat, + serverURL = input.serverURL, + ), + ) + } catch (e: DomainError) { + Result.failure(e) + } +} diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/CredentialsScreen.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/CredentialsScreen.kt index bc133808cf6..bdf7cc64e90 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/CredentialsScreen.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/CredentialsScreen.kt @@ -3,6 +3,7 @@ package org.dhis2.mobile.login.main.ui.screen import androidx.compose.animation.AnimatedVisibilityScope import androidx.compose.animation.ExperimentalSharedTransitionApi import androidx.compose.animation.SharedTransitionScope +import androidx.compose.foundation.background import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement.spacedBy import androidx.compose.foundation.layout.Box @@ -12,6 +13,7 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.Login import androidx.compose.material.icons.automirrored.outlined.ShowChart @@ -98,6 +100,7 @@ import org.hisp.dhis.mobile.ui.designsystem.component.state.BottomSheetShellUISt import org.hisp.dhis.mobile.ui.designsystem.component.state.rememberAdditionalInfoColumnState import org.hisp.dhis.mobile.ui.designsystem.component.state.rememberListCardState import org.hisp.dhis.mobile.ui.designsystem.theme.Spacing +import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor import org.hisp.dhis.mobile.ui.designsystem.theme.TextColor import org.jetbrains.compose.resources.stringResource import org.koin.compose.viewmodel.koinViewModel @@ -120,6 +123,7 @@ fun CredentialsScreen( allowRecovery: Boolean, oidcInfo: OidcInfo?, fromHome: Boolean, + oAuthEnable: Boolean, ) { val context = LocalPlatformContext.current @@ -133,6 +137,7 @@ fun CredentialsScreen( oidcInfo, context, fromHome, + oAuthEnable, ) } @@ -190,25 +195,28 @@ fun CredentialsScreen( serverImageUrl = selectedServerFlag, ) } - CredentialsContainer( - availableUsernames = screenState.credentialsInfo.availableUsernames, - username = screenState.credentialsInfo.username, - password = screenState.credentialsInfo.password, - isUsernameEditable = screenState.credentialsInfo.usernameCanBeEdited, - isLoggingIn = isLoggingIn, - onCredentialsUpdate = { credentialsUpdate -> - when (credentialsUpdate) { - CredentialsUpdate.Complete -> - viewModel.onLoginClicked() - is CredentialsUpdate.Password -> - viewModel.updatePassword(credentialsUpdate.password) + if (!oAuthEnable) { + CredentialsContainer( + availableUsernames = screenState.credentialsInfo.availableUsernames, + username = screenState.credentialsInfo.username, + password = screenState.credentialsInfo.password, + isUsernameEditable = screenState.credentialsInfo.usernameCanBeEdited, + isLoggingIn = isLoggingIn, + onCredentialsUpdate = { credentialsUpdate -> + when (credentialsUpdate) { + CredentialsUpdate.Complete -> + viewModel.onLoginClicked() - is CredentialsUpdate.Username -> - viewModel.updateUsername(credentialsUpdate.username) - } - }, - ) + is CredentialsUpdate.Password -> + viewModel.updatePassword(credentialsUpdate.password) + + is CredentialsUpdate.Username -> + viewModel.updateUsername(credentialsUpdate.username) + } + }, + ) + } LoginStatus( isLoggingIn = isLoggingIn, loginErrorMessage = screenState.errorMessage, @@ -269,11 +277,13 @@ private fun handleCredentialAction( CredentialsAction.OnLoginClicked -> viewModel.onLoginClicked() + CredentialsAction.OnManageAccounts -> viewModel.onManageAccountsClicked() CredentialsAction.OnOpenIdLogin -> viewModel.onOpenIdLogin() + CredentialsAction.OnRecoverAccount -> viewModel.onRecoverAccountClicked() } @@ -326,6 +336,11 @@ private fun ServerInfo( ), listAvatar = { Avatar( + modifier = + Modifier.background( + color = SurfaceColor.PrimaryContainer, + shape = CircleShape, + ), style = flag?.let { painter -> AvatarStyleData.Image(painter) @@ -598,7 +613,10 @@ private fun CredentialActions( contentAlignment = Alignment.BottomCenter, ) { Button( - modifier = Modifier.fillMaxWidth().testTag(CREDENTIALS_MANAGE_ACCOUNTS_BUTTON_TAG), + modifier = + Modifier + .fillMaxWidth() + .testTag(CREDENTIALS_MANAGE_ACCOUNTS_BUTTON_TAG), text = stringResource(Res.string.action_manage_account), style = ButtonStyle.OUTLINED, onClick = { diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/LoginScreen.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/LoginScreen.kt index 7c8d14f739d..04650c2d270 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/LoginScreen.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/LoginScreen.kt @@ -201,8 +201,8 @@ fun LoginScreen( onManageAccounts = viewModel::onBackToManageAccounts, ) } - composable { - val arg = it.toRoute() + composable { + val arg = it.toRoute() displayMoreActions = arg.selectedServer.isEmpty() displayBackArrow = true CredentialsScreen( @@ -216,13 +216,17 @@ fun LoginScreen( info.serverUrl == arg.selectedServer }, fromHome = fromHome, + oAuthEnable = arg.oAuthEnabled, ) } - composable { - val args = it.toRoute() - WebAuthenticator(url = args.selectedServer) { - viewModel.onOauthLoginCancelled() - } + composable { + val args = it.toRoute() + WebAuthenticator( + url = args.selectedServer, + onDismiss = { + viewModel.onOauthLoginCancelled() + }, + ) } composable { displayMoreActions = true diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/state/CredentialsUiState.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/state/CredentialsUiState.kt index b6e2c17fc2c..dc9b17c8fc5 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/state/CredentialsUiState.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/state/CredentialsUiState.kt @@ -14,6 +14,7 @@ data class CredentialsUiState( val displayBiometricsDialog: Boolean, val hasOtherAccounts: Boolean, val isSessionLocked: Boolean, + val oAuthEnable: Boolean, ) { fun username() = serverInfo.username ?: credentialsInfo.username } diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModel.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModel.kt index 83abc216aac..ef85ad58b7b 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModel.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModel.kt @@ -13,17 +13,22 @@ import org.dhis2.mobile.commons.domain.invoke import org.dhis2.mobile.commons.extensions.launchUseCase import org.dhis2.mobile.commons.extensions.withMinimumDuration import org.dhis2.mobile.commons.network.NetworkStatusProvider +import org.dhis2.mobile.login.main.domain.model.DeviceEnrollmentInfo import org.dhis2.mobile.login.main.domain.model.LoginResult import org.dhis2.mobile.login.main.domain.model.LoginScreenState import org.dhis2.mobile.login.main.domain.usecase.BiometricLogin import org.dhis2.mobile.login.main.domain.usecase.GetAvailableUsernames import org.dhis2.mobile.login.main.domain.usecase.GetBiometricInfo +import org.dhis2.mobile.login.main.domain.usecase.GetDeviceEnrollmentUrl import org.dhis2.mobile.login.main.domain.usecase.GetHasOtherAccounts import org.dhis2.mobile.login.main.domain.usecase.LogOutUser import org.dhis2.mobile.login.main.domain.usecase.LoginUser +import org.dhis2.mobile.login.main.domain.usecase.LoginUserWithOAuth import org.dhis2.mobile.login.main.domain.usecase.OpenIdLogin +import org.dhis2.mobile.login.main.domain.usecase.ProcessDeviceEnrollment import org.dhis2.mobile.login.main.domain.usecase.UpdateBiometricPermission import org.dhis2.mobile.login.main.domain.usecase.UpdateTrackingPermission +import org.dhis2.mobile.login.main.ui.navigation.AppLinkNavigation import org.dhis2.mobile.login.main.ui.navigation.Navigator import org.dhis2.mobile.login.main.ui.state.AfterLoginAction import org.dhis2.mobile.login.main.ui.state.CredentialsInfo @@ -43,8 +48,12 @@ class CredentialsViewModel( private val logOutUser: LogOutUser, private val biometricLogin: BiometricLogin, private val openIdLogin: OpenIdLogin, + private val loginUserWithOAuth: LoginUserWithOAuth, + private val getDeviceEnrollmentUrl: GetDeviceEnrollmentUrl, + private val processDeviceEnrollment: ProcessDeviceEnrollment, private val updateTrackingPermission: UpdateTrackingPermission, private val updateBiometricPermission: UpdateBiometricPermission, + private val appLinkNavigation: AppLinkNavigation, networkStatusProvider: NetworkStatusProvider, private val serverName: String?, private val serverUrl: String, @@ -54,6 +63,7 @@ class CredentialsViewModel( private val forgotPinUseCase: ForgotPinUseCase, private val oidcInfo: OidcInfo?, private val fromHome: Boolean, + private val oAuthEnable: Boolean, ) : ViewModel() { private val isNetworkOnline = networkStatusProvider.connectionStatus @@ -87,6 +97,7 @@ class CredentialsViewModel( hasOtherAccounts = false, isSessionLocked = false, displayBiometricsDialog = false, + oAuthEnable = oAuthEnable, ) private var loginJob: Job? = null @@ -102,6 +113,16 @@ class CredentialsViewModel( initialValue = initialState, ) + init { + launchUseCase { + appLinkNavigation.appLink.collect { urlString -> + if (credentialsScreenState.value.loginState is LoginState.Running) { + handleOAuthCallbacks(urlString) + } + } + } + } + private fun loadData() { launchUseCase { val biometricInfo = getBiometricInfo(serverUrl) @@ -121,7 +142,7 @@ class CredentialsViewModel( availableUsernames = getAvailableUsernames(), usernameCanBeEdited = username == null, ), - loginState = LoginState.Disabled, + loginState = if (oAuthEnable) LoginState.Enabled else LoginState.Disabled, errorMessage = null, allowRecovery = allowRecovery, canUseBiometrics = getBiometricInfo(serverUrl).canUseBiometrics, @@ -130,8 +151,116 @@ class CredentialsViewModel( hasOtherAccounts = getHasOtherAccounts(), isSessionLocked = getIsSessionLockedUseCase(), displayBiometricsDialog = biometricInfo.canUseBiometrics && !fromHome, + oAuthEnable = oAuthEnable, ), ) + + if (_credentialsScreenState.value.oAuthEnable && !fromHome) { + fetchOAuthEnrollmentUrl() + } + } + } + + private fun fetchOAuthEnrollmentUrl() { + _credentialsScreenState.update { + it.copy( + loginState = LoginState.Running, + ) + } + launchUseCase { + getDeviceEnrollmentUrl(serverUrl).fold( + onSuccess = { enrollmentURL -> + // First OAuth call (enrollment) - clear any previous OAuth sessions + navigator.navigate( + LoginScreenState.OauthAuthentication( + selectedServer = enrollmentURL, + ), + ) + }, + onFailure = { error -> + _credentialsScreenState.update { + it.copy( + loginState = LoginState.Enabled, + errorMessage = error.message, + ) + } + }, + ) + } + } + + private fun handleOAuthCallbacks(urlString: String) { + // First check if there is any error + val error = urlString.substringAfter("error=", "").substringBefore('&') + if (error.isNotEmpty()) { + _credentialsScreenState.update { + it.copy( + errorMessage = error, + loginState = LoginState.Enabled, + ) + } + return + } + + // Check if there is a device enrollment callback + val iat = urlString.substringAfter("iat=", "").substringBefore('&') + if (iat.isNotEmpty()) { + registerDevice(iat) + return + } + + // Check if there is a login callback with the authorization code + val code = urlString.substringAfter("code=", "").substringBefore('&') + if (code.isNotEmpty()) { + loginWithOAuthCode(code) + return + } + + _credentialsScreenState.update { + it.copy( + loginState = LoginState.Enabled, + ) + } + } + + private fun loginWithOAuthCode(code: String) { + startLoginJob { + loginUserWithOAuth( + serverUrl = serverUrl, + code = code, + ) + } + } + + private fun registerDevice(enrollmentIat: String) { + launchUseCase { + _credentialsScreenState.update { + it.copy(loginState = LoginState.Running) + } + + processDeviceEnrollment( + DeviceEnrollmentInfo( + iat = enrollmentIat, + serverURL = serverUrl, + ), + ).fold( + onSuccess = { consentUrl -> + // Second OAuth call (consent) - keep session from enrollment + navigator.navigate( + LoginScreenState.OauthAuthentication( + selectedServer = consentUrl, + ), + ) + }, + onFailure = { error -> + _credentialsScreenState.update { + it.copy( + errorMessage = error.message, + loginState = LoginState.Enabled, + ) + } + }, + ) } } @@ -176,13 +305,17 @@ class CredentialsViewModel( } fun onLoginClicked() { - startLoginJob { - loginUser( - serverUrl = _credentialsScreenState.value.serverInfo.serverUrl, - username = _credentialsScreenState.value.credentialsInfo.username, - password = _credentialsScreenState.value.credentialsInfo.password, - isNetworkAvailable = isNetworkOnline.value, - ) + if (_credentialsScreenState.value.oAuthEnable) { + fetchOAuthEnrollmentUrl() + } else { + startLoginJob { + loginUser( + serverUrl = _credentialsScreenState.value.serverInfo.serverUrl, + username = _credentialsScreenState.value.credentialsInfo.username, + password = _credentialsScreenState.value.credentialsInfo.password, + isNetworkAvailable = isNetworkOnline.value, + ) + } } } diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/LoginViewModel.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/LoginViewModel.kt index b3295c1633c..ce1607ba114 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/LoginViewModel.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/LoginViewModel.kt @@ -12,13 +12,11 @@ import org.dhis2.mobile.commons.extensions.launchUseCase import org.dhis2.mobile.commons.extensions.withMinimumDuration import org.dhis2.mobile.commons.network.NetworkStatusProvider import org.dhis2.mobile.login.main.domain.model.LoginScreenState -import org.dhis2.mobile.login.main.domain.model.LoginScreenState.LegacyLogin -import org.dhis2.mobile.login.main.domain.model.LoginScreenState.OauthLogin +import org.dhis2.mobile.login.main.domain.model.LoginScreenState.LoginCredentials import org.dhis2.mobile.login.main.domain.model.ServerValidationResult import org.dhis2.mobile.login.main.domain.usecase.GetInitialScreen import org.dhis2.mobile.login.main.domain.usecase.ImportDatabase import org.dhis2.mobile.login.main.domain.usecase.ValidateServer -import org.dhis2.mobile.login.main.ui.navigation.AppLinkNavigation import org.dhis2.mobile.login.main.ui.navigation.Navigator import org.dhis2.mobile.login.main.ui.state.DatabaseImportState import org.dhis2.mobile.login.main.ui.state.ServerValidationUiState @@ -28,7 +26,6 @@ class LoginViewModel( private val getInitialScreen: GetInitialScreen, private val importDatabase: ImportDatabase, private val validateServer: ValidateServer, - private val appLinkNavigation: AppLinkNavigation, networkStatusProvider: NetworkStatusProvider, ) : ViewModel() { private val isNetworkOnline = @@ -46,14 +43,8 @@ class LoginViewModel( val importDatabaseState = _importDatabaseState.asStateFlow() private var serverValidationJob: Job? = null - private val redirectUri = "https://vgarciabnz.github.io" init { - launchUseCase { - appLinkNavigation.appLink.collect { urlString -> - handleAppLink(urlString) - } - } goToInitialScreen() } @@ -94,24 +85,20 @@ class LoginViewModel( } } - is ServerValidationResult.Legacy -> { + is ServerValidationResult.Success -> { navigator.navigate( destination = - LegacyLogin( + LoginCredentials( serverName = result.serverName, allowRecovery = result.allowRecovery, selectedServer = serverUrl, selectedServerFlag = result.countryFlag, selectedUsername = null, + oAuthEnabled = result.oAuthEnabled, ), ) stopValidation() } - - ServerValidationResult.Oauth -> { - navigator.navigate(OauthLogin(serverUrl)) - stopValidation() - } } } } @@ -125,23 +112,6 @@ class LoginViewModel( _serverValidationState.update { it.copy(validationRunning = false) } } - private fun handleAppLink(urlString: String) { - if (urlString.startsWith(redirectUri)) { - val code = urlString.substringAfter("code=").substringBefore('&') - if (code.isNotEmpty()) { - // TODO "Use the authorization code to get a token and log in, then show statistics screen" - } else { - val error = urlString.substringAfter("error=").substringBefore('&') - _serverValidationState.update { - it.copy( - error = error, - validationRunning = false, - ) - } - } - } - } - fun onOauthLoginCancelled() { navigateUp() } diff --git a/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/LoginScreenIntegrationTest.kt b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/LoginScreenIntegrationTest.kt index 207a88957b0..4b8010875a0 100644 --- a/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/LoginScreenIntegrationTest.kt +++ b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/LoginScreenIntegrationTest.kt @@ -2,7 +2,6 @@ package org.dhis2.mobile.login.main import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.resetMain @@ -15,8 +14,8 @@ import org.dhis2.mobile.login.main.data.LoginRepository import org.dhis2.mobile.login.main.domain.model.LoginScreenState import org.dhis2.mobile.login.main.domain.usecase.GetInitialScreen import org.dhis2.mobile.login.main.domain.usecase.ImportDatabase +import org.dhis2.mobile.login.main.domain.usecase.ProcessDeviceEnrollment import org.dhis2.mobile.login.main.domain.usecase.ValidateServer -import org.dhis2.mobile.login.main.ui.navigation.AppLinkNavigation import org.dhis2.mobile.login.main.ui.navigation.Navigator import org.dhis2.mobile.login.main.ui.viewmodel.LoginViewModel import org.dhis2.mobile.login.pin.data.SessionRepository @@ -35,30 +34,24 @@ class LoginScreenIntegrationTest { private val navigator: Navigator = mock() private val accountRepository: AccountRepository = mock() private val sessionRepository: SessionRepository = mock() - private val loginRepository: LoginRepository = mock() - private val appLinkNavigation: AppLinkNavigation = mock() private val networkStatusProvider: NetworkStatusProvider = mock() - private val testDispatcher = UnconfinedTestDispatcher() - private val mockAppLinkFlow = MutableSharedFlow() private val mockNetworkStatusFlow = MutableStateFlow(true) - private lateinit var getInitialScreen: GetInitialScreen - private lateinit var importDatabase: ImportDatabase - private lateinit var validateServer: ValidateServer + private lateinit var processDeviceEnrollment: ProcessDeviceEnrollment @BeforeTest fun setUp() { Dispatchers.setMain(testDispatcher) - whenever(appLinkNavigation.appLink).thenReturn(mockAppLinkFlow) whenever(networkStatusProvider.connectionStatus).thenReturn(mockNetworkStatusFlow) importDatabase = ImportDatabase(repository = loginRepository) validateServer = ValidateServer(repository = loginRepository) getInitialScreen = GetInitialScreen(accountRepository, sessionRepository) + processDeviceEnrollment = ProcessDeviceEnrollment(repository = loginRepository) } @AfterTest @@ -117,12 +110,13 @@ class LoginScreenIntegrationTest { // Then goes to existing account screen (LegacyLogin) verify(navigator).navigate( eq( - LoginScreenState.LegacyLogin( + LoginScreenState.LoginCredentials( selectedServer = singleAccount.serverUrl, selectedUsername = singleAccount.name, serverName = singleAccount.serverName, selectedServerFlag = singleAccount.serverFlag, allowRecovery = singleAccount.allowRecovery, + oAuthEnabled = false, ), ), any(), @@ -145,9 +139,18 @@ class LoginScreenIntegrationTest { // When opening the app initViewModel() - // Then goes to OAuth login screen + // Then goes to login screen with OAuth verify(navigator).navigate( - eq(LoginScreenState.OauthLogin(selectedServer = oauthAccount.serverUrl)), + eq( + LoginScreenState.LoginCredentials( + selectedServer = oauthAccount.serverUrl, + selectedUsername = oauthAccount.name, + serverName = oauthAccount.serverName, + selectedServerFlag = oauthAccount.serverFlag, + allowRecovery = false, + oAuthEnabled = true, + ), + ), any(), ) } @@ -213,7 +216,6 @@ class LoginScreenIntegrationTest { getInitialScreen = getInitialScreen, importDatabase = importDatabase, validateServer = validateServer, - appLinkNavigation = appLinkNavigation, networkStatusProvider = networkStatusProvider, ) } diff --git a/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModelTest.kt b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModelTest.kt index 5952605f521..897256990e4 100644 --- a/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModelTest.kt +++ b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModelTest.kt @@ -4,6 +4,7 @@ import app.cash.turbine.test import coil3.PlatformContext import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.resetMain @@ -16,12 +17,16 @@ import org.dhis2.mobile.login.main.domain.model.LoginScreenState import org.dhis2.mobile.login.main.domain.usecase.BiometricLogin import org.dhis2.mobile.login.main.domain.usecase.GetAvailableUsernames import org.dhis2.mobile.login.main.domain.usecase.GetBiometricInfo +import org.dhis2.mobile.login.main.domain.usecase.GetDeviceEnrollmentUrl import org.dhis2.mobile.login.main.domain.usecase.GetHasOtherAccounts import org.dhis2.mobile.login.main.domain.usecase.LogOutUser import org.dhis2.mobile.login.main.domain.usecase.LoginUser +import org.dhis2.mobile.login.main.domain.usecase.LoginUserWithOAuth import org.dhis2.mobile.login.main.domain.usecase.OpenIdLogin +import org.dhis2.mobile.login.main.domain.usecase.ProcessDeviceEnrollment import org.dhis2.mobile.login.main.domain.usecase.UpdateBiometricPermission import org.dhis2.mobile.login.main.domain.usecase.UpdateTrackingPermission +import org.dhis2.mobile.login.main.ui.navigation.AppLinkNavigation import org.dhis2.mobile.login.main.ui.navigation.Navigator import org.dhis2.mobile.login.main.ui.state.LoginState import org.dhis2.mobile.login.pin.domain.usecase.ForgotPinUseCase @@ -34,6 +39,7 @@ import org.mockito.kotlin.doReturn import org.mockito.kotlin.eq import org.mockito.kotlin.mock import org.mockito.kotlin.never +import org.mockito.kotlin.times import org.mockito.kotlin.verify import org.mockito.kotlin.whenever import kotlin.test.assertEquals @@ -53,8 +59,12 @@ class CredentialsViewModelTest { private val loginOutUser: LogOutUser = mock() private val biometricLogin: BiometricLogin = mock() private val openIdLogin: OpenIdLogin = mock() + private val loginUserWithOAuth: LoginUserWithOAuth = mock() + private val getDeviceEnrollmentUrl: GetDeviceEnrollmentUrl = mock() + private val processDeviceEnrollment: ProcessDeviceEnrollment = mock() private val updateTrackingPermission: UpdateTrackingPermission = mock() private val updateBiometricPermission: UpdateBiometricPermission = mock() + private val appLinkNavigation: AppLinkNavigation = mock() private val networkStatusProvider: NetworkStatusProvider = mock() private val getIsSessionLockedUseCase: GetIsSessionLockedUseCase = mock() private val forgotPinUseCase: ForgotPinUseCase = mock() @@ -67,6 +77,7 @@ class CredentialsViewModelTest { fun setUp() { Dispatchers.setMain(testDispatcher) whenever(networkStatusProvider.connectionStatus) doReturn flowOf(true) + whenever(appLinkNavigation.appLink) doReturn MutableSharedFlow() } @After @@ -532,11 +543,164 @@ class CredentialsViewModelTest { } } + @Test + fun `GIVEN app link with authorization code WHEN link arrives THEN OAuth login is triggered`() = + runTest { + // GIVEN + val serverUrl = "https://test.server.org" + val authCode = "auth_code_123" + val appLinkUrl = "https://vgarciabnz.github.io?code=$authCode&state=test" + val mockAppLinkFlow = MutableSharedFlow() + val enrollmentUrl = "https://test.server.org/oauth2/enrollment" + + whenever(getAvailableUsernames()) doReturn emptyList() + whenever(getBiometricInfo(any())) doReturn BiometricsInfo(false, false) + whenever(getHasOtherAccounts.invoke()) doReturn false + whenever(getIsSessionLockedUseCase()) doReturn false + whenever(appLinkNavigation.appLink) doReturn mockAppLinkFlow + whenever(getDeviceEnrollmentUrl(any())) doReturn Result.success(enrollmentUrl) + whenever( + loginUserWithOAuth.invoke(any(), any()), + ) doReturn LoginResult.Success(initialSyncDone = true, displayTrackingMessage = false) + + // Use oAuthEnable=true and fromHome=true to avoid auto-launch but enable OAuth flow + initViewModel(serverUrl = serverUrl, username = "testuser", oAuthEnable = true, fromHome = true) + + viewModel.credentialsScreenState.test(timeout = turbineTimeout) { + awaitItem() + awaitItem() + + // Trigger OAuth flow by clicking login + viewModel.onLoginClicked() + testDispatcher.scheduler.advanceUntilIdle() + + // Login state should be running after clicking login + val runningState = awaitItem() + assertEquals(LoginState.Running, runningState.loginState) + + // WHEN - Send app link with authorization code (simulates OAuth callback) + mockAppLinkFlow.emit(appLinkUrl) + testDispatcher.scheduler.advanceUntilIdle() + + // Advance time for login to complete + testDispatcher.scheduler.advanceTimeBy(4.seconds) + + // Login should succeed and show after login actions + val finalState = awaitItem() + assertEquals(LoginState.Enabled, finalState.loginState) + assertTrue(finalState.afterLoginActions.isNotEmpty()) + + // Verify OAuth login was called with the correct code + verify(loginUserWithOAuth).invoke( + serverUrl = serverUrl, + code = authCode, + ) + + cancelAndIgnoreRemainingEvents() + } + } + + @Test + fun `GIVEN app link with IAT token WHEN link arrives THEN device enrollment is processed`() = + runTest { + // GIVEN + val serverUrl = "https://test.server.org" + val iat = "enrollment_iat_token" + val consentUrl = "https://test.server.org/oauth2/consent" + val enrollmentUrl = "https://test.server.org/oauth2/enrollment" + val appLinkUrl = "https://vgarciabnz.github.io?iat=$iat&state=test" + val mockAppLinkFlow = MutableSharedFlow() + + whenever(getAvailableUsernames()) doReturn emptyList() + whenever(getBiometricInfo(any())) doReturn BiometricsInfo(false, false) + whenever(getHasOtherAccounts.invoke()) doReturn false + whenever(getIsSessionLockedUseCase()) doReturn false + whenever(appLinkNavigation.appLink) doReturn mockAppLinkFlow + whenever(getDeviceEnrollmentUrl(any())) doReturn Result.success(enrollmentUrl) + whenever( + processDeviceEnrollment.invoke(any()), + ) doReturn Result.success(consentUrl) + + // Use oAuthEnable=true and fromHome=true to avoid auto-launch but enable OAuth flow + initViewModel(serverUrl = serverUrl, username = "testuser", oAuthEnable = true, fromHome = true) + + viewModel.credentialsScreenState.test(timeout = turbineTimeout) { + awaitItem() + awaitItem() + + // Trigger OAuth flow by clicking login + viewModel.onLoginClicked() + testDispatcher.scheduler.advanceUntilIdle() + + // Login state should be running after clicking login + val runningState = awaitItem() + assertEquals(LoginState.Running, runningState.loginState) + + // WHEN - Send app link with IAT token (simulates enrollment callback) + mockAppLinkFlow.emit(appLinkUrl) + testDispatcher.scheduler.advanceUntilIdle() + + // Verify device enrollment was called with the correct IAT + verify(processDeviceEnrollment).invoke(any()) + + // Verify navigation happened twice: once for enrollment URL, once for consent URL + verify(navigator, times(2)).navigate(any(), any()) + + cancelAndIgnoreRemainingEvents() + } + } + + @Test + fun `GIVEN app link with error WHEN link arrives THEN error message is displayed`() = + runTest { + // GIVEN + val serverUrl = "https://test.server.org" + val appLinkUrl = "https://vgarciabnz.github.io?error=access_denied&state=test" + val mockAppLinkFlow = MutableSharedFlow() + val enrollmentUrl = "https://test.server.org/oauth2/enrollment" + + whenever(getAvailableUsernames()) doReturn emptyList() + whenever(getBiometricInfo(any())) doReturn BiometricsInfo(false, false) + whenever(getHasOtherAccounts.invoke()) doReturn false + whenever(getIsSessionLockedUseCase()) doReturn false + whenever(appLinkNavigation.appLink) doReturn mockAppLinkFlow + whenever(getDeviceEnrollmentUrl(any())) doReturn Result.success(enrollmentUrl) + + // Use oAuthEnable=true and fromHome=true to avoid auto-launch but enable OAuth flow + initViewModel(serverUrl = serverUrl, username = "testuser", oAuthEnable = true, fromHome = true) + + viewModel.credentialsScreenState.test(timeout = turbineTimeout) { + awaitItem() + awaitItem() + + // Trigger OAuth flow by clicking login + viewModel.onLoginClicked() + testDispatcher.scheduler.advanceUntilIdle() + + // Login state should be running after clicking login + val runningState = awaitItem() + assertEquals(LoginState.Running, runningState.loginState) + + // WHEN - Send app link with error (simulates OAuth error callback) + mockAppLinkFlow.emit(appLinkUrl) + testDispatcher.scheduler.advanceUntilIdle() + + // THEN - Error message should be shown + val errorState = awaitItem() + assertEquals("access_denied", errorState.errorMessage) + assertEquals(LoginState.Enabled, errorState.loginState) + + cancelAndIgnoreRemainingEvents() + } + } + private fun initViewModel( serverName: String? = "Test Server", serverUrl: String = "https://test.server.org", username: String? = null, allowRecovery: Boolean = true, + oAuthEnable: Boolean = false, + fromHome: Boolean = false, ) { viewModel = CredentialsViewModel( @@ -548,8 +712,12 @@ class CredentialsViewModelTest { loginOutUser, biometricLogin, openIdLogin, + loginUserWithOAuth, + getDeviceEnrollmentUrl, + processDeviceEnrollment, updateTrackingPermission, updateBiometricPermission, + appLinkNavigation, networkStatusProvider, serverName, serverUrl, @@ -558,7 +726,8 @@ class CredentialsViewModelTest { getIsSessionLockedUseCase, forgotPinUseCase, oidcInfo = null, - false, + fromHome = fromHome, + oAuthEnable = oAuthEnable, ) } } diff --git a/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/LoginViewModelTest.kt b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/LoginViewModelTest.kt index 8a7c39020c7..12c498cc340 100644 --- a/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/LoginViewModelTest.kt +++ b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/LoginViewModelTest.kt @@ -3,7 +3,6 @@ package org.dhis2.mobile.login.main.ui.viewmodel import app.cash.turbine.test import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runTest @@ -14,7 +13,6 @@ import org.dhis2.mobile.login.main.domain.model.ServerValidationResult import org.dhis2.mobile.login.main.domain.usecase.GetInitialScreen import org.dhis2.mobile.login.main.domain.usecase.ImportDatabase import org.dhis2.mobile.login.main.domain.usecase.ValidateServer -import org.dhis2.mobile.login.main.ui.navigation.AppLinkNavigation import org.dhis2.mobile.login.main.ui.navigation.Navigator import org.dhis2.mobile.login.main.ui.state.DatabaseImportState import org.dhis2.mobile.login.main.ui.state.ServerValidationUiState @@ -36,16 +34,13 @@ class LoginViewModelTest { private val getInitialScreen: GetInitialScreen = mock() private val importDatabase: ImportDatabase = mock() private val validateServer: ValidateServer = mock() - private val appLinkNavigation: AppLinkNavigation = mock() private val testDispatcher = UnconfinedTestDispatcher() - private val mockAppLinkFlow = MutableSharedFlow() private val networkStatusProvider: NetworkStatusProvider = mock() private val mockNetworkStatusFlow = MutableStateFlow(true) @Before fun setUp() { Dispatchers.setMain(testDispatcher) - whenever(appLinkNavigation.appLink).thenReturn(mockAppLinkFlow) whenever(networkStatusProvider.connectionStatus).thenReturn(mockNetworkStatusFlow) } @@ -67,7 +62,6 @@ class LoginViewModelTest { getInitialScreen = getInitialScreen, importDatabase = importDatabase, validateServer = validateServer, - appLinkNavigation = appLinkNavigation, networkStatusProvider = networkStatusProvider, ) @@ -102,7 +96,6 @@ class LoginViewModelTest { getInitialScreen = getInitialScreen, importDatabase = importDatabase, validateServer = validateServer, - appLinkNavigation = appLinkNavigation, networkStatusProvider = networkStatusProvider, ) @@ -146,7 +139,6 @@ class LoginViewModelTest { getInitialScreen = getInitialScreen, importDatabase = importDatabase, validateServer = validateServer, - appLinkNavigation = appLinkNavigation, networkStatusProvider = networkStatusProvider, ) @@ -167,44 +159,6 @@ class LoginViewModelTest { } } - @Test - fun `app link with valid code is handled correctly`() = - runTest { - val redirectUri = "https://vgarciabnz.github.io" - val code = "auth_code_123" - val appLinkUrl = "$redirectUri?code=$code&state=test" - - whenever(getInitialScreen()).thenReturn( - LoginScreenState.ServerValidation( - currentServer = "https://test.dhis2.org", - availableServers = listOf("https://test.dhis2.org"), - hasAccounts = false, - ), - ) - - viewModel = - LoginViewModel( - navigator = navigator, - getInitialScreen = getInitialScreen, - importDatabase = importDatabase, - validateServer = validateServer, - appLinkNavigation = appLinkNavigation, - networkStatusProvider = networkStatusProvider, - ) - - viewModel.serverValidationState.test { - assertEquals(ServerValidationUiState(), awaitItem()) - - // Send app link - mockAppLinkFlow.emit(appLinkUrl) - - // TODO: Verify that the code is processed correctly - // Currently the LoginViewModel has a TODO comment for this functionality - - expectNoEvents() - } - } - @Test fun `successfully import database`() = runTest { @@ -218,7 +172,6 @@ class LoginViewModelTest { getInitialScreen = getInitialScreen, importDatabase = importDatabase, validateServer = validateServer, - appLinkNavigation = appLinkNavigation, networkStatusProvider = networkStatusProvider, ) @@ -245,7 +198,6 @@ class LoginViewModelTest { getInitialScreen = getInitialScreen, importDatabase = importDatabase, validateServer = validateServer, - appLinkNavigation = appLinkNavigation, networkStatusProvider = networkStatusProvider, ) diff --git a/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/GetInitialScreenUseCaseTest.kt b/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/GetInitialScreenUseCaseTest.kt index 953ed6bd72a..faf1072cd4c 100644 --- a/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/GetInitialScreenUseCaseTest.kt +++ b/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/GetInitialScreenUseCaseTest.kt @@ -50,11 +50,11 @@ class GetInitialScreenUseCaseTest { val result = useCase() // Then - assertTrue(result is LoginScreenState.LegacyLogin) + assertTrue(result is LoginScreenState.LoginCredentials) } @Test - fun `go to oauth if there is 1 logged account with oauth`() = + fun `go to credentials screen with logout if there is 1 logged account with oauth`() = runTest { // Given whenever(accountRepository.getLoggedInAccounts()) doReturn @@ -64,7 +64,8 @@ class GetInitialScreenUseCaseTest { val result = useCase() // Then - assertTrue(result is LoginScreenState.OauthLogin) + assertTrue(result is LoginScreenState.LoginCredentials) + assertEquals(true, result.oAuthEnabled) // OAuth enabled, enrollment URL will be fetched by CredentialsViewModel } @Test @@ -83,7 +84,7 @@ class GetInitialScreenUseCaseTest { } @Test - fun `invoke returns OauthLogin when multiple accounts and session locked with OAuth account`() = + fun `invoke returns LegacyLogin when multiple accounts and session locked with OAuth account`() = runTest { // Given val activeAccount = @@ -105,8 +106,10 @@ class GetInitialScreenUseCaseTest { val result = useCase() // Then - assertIs(result) + assertIs(result) assertEquals("https://active.com", result.selectedServer) + assertEquals("active_user", result.selectedUsername) + assertEquals(true, result.oAuthEnabled) // OAuth enabled, enrollment URL will be fetched by CredentialsViewModel } @Test @@ -133,7 +136,7 @@ class GetInitialScreenUseCaseTest { val result = useCase() // Then - assertIs(result) + assertIs(result) assertEquals("https://active.com", result.selectedServer) assertEquals("active_user", result.selectedUsername) } @@ -182,7 +185,7 @@ class GetInitialScreenUseCaseTest { val result = useCase() // Then - assertIs(result) + assertIs(result) assertEquals("locked_user", result.selectedUsername) } From b0fb5a0d82b9488d7ecf48daec7769497aba263f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Mon, 16 Feb 2026 07:52:02 +0100 Subject: [PATCH 053/260] refactor(test): [Login] Update test annotations to use Kotlin test framework (#4529) * test(navigation): add integration tests for initial screen navigation logic Signed-off-by: andresmr * fix(navigation): update integration test setup to include LoginRepository Signed-off-by: andresmr * refactor(navigation): rename initial screen integration test to login screen and streamline setup Signed-off-by: andresmr * refactor(test): update LoginScreenIntegrationTest to use Kotlin test annotations Signed-off-by: andresmr * refactor(test): update test annotations to use Kotlin test framework Signed-off-by: andresmr * test: reset dispatchers after tests in PinViewModelTest.kt --------- Signed-off-by: andresmr --- login/build.gradle.kts | 4 ---- .../mobile/login/main/LoginScreenIntegrationTest.kt | 10 ++++++++++ .../main/ui/viewmodel/CredentialsViewModelTest.kt | 10 +++++----- .../login/main/ui/viewmodel/LoginViewModelTest.kt | 4 ++-- .../login/pin/domain/usecase/ForgotPinUseCaseTest.kt | 4 ++-- .../pin/domain/usecase/GetInitialScreenUseCaseTest.kt | 6 +++--- .../login/pin/domain/usecase/SavePinUseCaseTest.kt | 4 ++-- .../pin/domain/usecase/ValidatePinUseCaseTest.kt | 4 ++-- .../mobile/login/pin/ui/viewmodel/PinViewModelTest.kt | 11 +++++++++-- 9 files changed, 35 insertions(+), 22 deletions(-) diff --git a/login/build.gradle.kts b/login/build.gradle.kts index b142ac086d9..47cc88ba03d 100644 --- a/login/build.gradle.kts +++ b/login/build.gradle.kts @@ -58,10 +58,6 @@ kotlin { commonTest { dependencies { implementation(kotlin("test")) - // Koin Test features - implementation(libs.koin.test) - implementation(libs.koin.test.junit5) - implementation(libs.koin.test.junit4) implementation(libs.test.turbine) implementation(libs.test.kotlinCoroutines) implementation(libs.test.mockitoKotlin) diff --git a/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/LoginScreenIntegrationTest.kt b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/LoginScreenIntegrationTest.kt index 4b8010875a0..0093f82cd53 100644 --- a/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/LoginScreenIntegrationTest.kt +++ b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/LoginScreenIntegrationTest.kt @@ -63,6 +63,16 @@ class LoginScreenIntegrationTest { * * Test case: ANDROAPP-7220 * Scenario: Manage accounts screen + * Given the user is logged out + * And has accounts stored + * When opens the app + * Then goes to + * + * Examples: + * |number_of_accounts |destination_screen | + * | none |server configuration screen| + * | one |existing account screen | + * | two or more |manage accounts screen | * */ diff --git a/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModelTest.kt b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModelTest.kt index 897256990e4..a9197a2aacb 100644 --- a/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModelTest.kt +++ b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModelTest.kt @@ -31,9 +31,6 @@ import org.dhis2.mobile.login.main.ui.navigation.Navigator import org.dhis2.mobile.login.main.ui.state.LoginState import org.dhis2.mobile.login.pin.domain.usecase.ForgotPinUseCase import org.dhis2.mobile.login.pin.domain.usecase.GetIsSessionLockedUseCase -import org.junit.After -import org.junit.Before -import org.junit.Test import org.mockito.kotlin.any import org.mockito.kotlin.doReturn import org.mockito.kotlin.eq @@ -42,6 +39,9 @@ import org.mockito.kotlin.never import org.mockito.kotlin.times import org.mockito.kotlin.verify import org.mockito.kotlin.whenever +import kotlin.test.AfterTest +import kotlin.test.BeforeTest +import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertFalse import kotlin.test.assertTrue @@ -73,14 +73,14 @@ class CredentialsViewModelTest { private val turbineTimeout = 10.seconds - @Before + @BeforeTest fun setUp() { Dispatchers.setMain(testDispatcher) whenever(networkStatusProvider.connectionStatus) doReturn flowOf(true) whenever(appLinkNavigation.appLink) doReturn MutableSharedFlow() } - @After + @AfterTest fun tearDown() { Dispatchers.resetMain() } diff --git a/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/LoginViewModelTest.kt b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/LoginViewModelTest.kt index 12c498cc340..1e7d20baacb 100644 --- a/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/LoginViewModelTest.kt +++ b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/LoginViewModelTest.kt @@ -16,12 +16,12 @@ import org.dhis2.mobile.login.main.domain.usecase.ValidateServer import org.dhis2.mobile.login.main.ui.navigation.Navigator import org.dhis2.mobile.login.main.ui.state.DatabaseImportState import org.dhis2.mobile.login.main.ui.state.ServerValidationUiState -import org.junit.Before import org.mockito.kotlin.any import org.mockito.kotlin.eq import org.mockito.kotlin.mock import org.mockito.kotlin.verify import org.mockito.kotlin.whenever +import kotlin.test.BeforeTest import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertNull @@ -38,7 +38,7 @@ class LoginViewModelTest { private val networkStatusProvider: NetworkStatusProvider = mock() private val mockNetworkStatusFlow = MutableStateFlow(true) - @Before + @BeforeTest fun setUp() { Dispatchers.setMain(testDispatcher) whenever(networkStatusProvider.connectionStatus).thenReturn(mockNetworkStatusFlow) diff --git a/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/ForgotPinUseCaseTest.kt b/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/ForgotPinUseCaseTest.kt index 27c27f93ed1..d631a0d9c0a 100644 --- a/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/ForgotPinUseCaseTest.kt +++ b/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/ForgotPinUseCaseTest.kt @@ -2,10 +2,10 @@ package org.dhis2.mobile.login.pin.domain.usecase import kotlinx.coroutines.test.runTest import org.dhis2.mobile.login.pin.data.SessionRepository -import org.junit.Before import org.mockito.kotlin.mock import org.mockito.kotlin.verify import org.mockito.kotlin.whenever +import kotlin.test.BeforeTest import kotlin.test.Test import kotlin.test.assertTrue @@ -13,7 +13,7 @@ class ForgotPinUseCaseTest { private lateinit var useCase: ForgotPinUseCase private val repository: SessionRepository = mock() - @Before + @BeforeTest fun setUp() { useCase = ForgotPinUseCase(repository) } diff --git a/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/GetInitialScreenUseCaseTest.kt b/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/GetInitialScreenUseCaseTest.kt index faf1072cd4c..9acf4a84562 100644 --- a/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/GetInitialScreenUseCaseTest.kt +++ b/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/GetInitialScreenUseCaseTest.kt @@ -6,12 +6,12 @@ import org.dhis2.mobile.login.accounts.domain.model.AccountModel import org.dhis2.mobile.login.main.domain.model.LoginScreenState import org.dhis2.mobile.login.main.domain.usecase.GetInitialScreen import org.dhis2.mobile.login.pin.data.SessionRepository -import org.junit.Assert.assertEquals -import org.junit.Before import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock import org.mockito.kotlin.whenever +import kotlin.test.BeforeTest import kotlin.test.Test +import kotlin.test.assertEquals import kotlin.test.assertIs import kotlin.test.assertTrue @@ -20,7 +20,7 @@ class GetInitialScreenUseCaseTest { private val accountRepository: AccountRepository = mock() private val sessionRepository: SessionRepository = mock() - @Before + @BeforeTest fun setUp() { useCase = GetInitialScreen(accountRepository, sessionRepository) } diff --git a/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/SavePinUseCaseTest.kt b/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/SavePinUseCaseTest.kt index ac82cc1f900..4fff47af996 100644 --- a/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/SavePinUseCaseTest.kt +++ b/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/SavePinUseCaseTest.kt @@ -2,10 +2,10 @@ package org.dhis2.mobile.login.pin.domain.usecase import kotlinx.coroutines.test.runTest import org.dhis2.mobile.login.pin.data.SessionRepository -import org.junit.Before import org.mockito.kotlin.mock import org.mockito.kotlin.verify import org.mockito.kotlin.whenever +import kotlin.test.BeforeTest import kotlin.test.Test import kotlin.test.assertTrue @@ -13,7 +13,7 @@ class SavePinUseCaseTest { private lateinit var useCase: SavePinUseCase private val repository: SessionRepository = mock() - @Before + @BeforeTest fun setUp() { useCase = SavePinUseCase(repository) } diff --git a/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/ValidatePinUseCaseTest.kt b/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/ValidatePinUseCaseTest.kt index d2cdf525284..e140b293109 100644 --- a/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/ValidatePinUseCaseTest.kt +++ b/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/ValidatePinUseCaseTest.kt @@ -4,9 +4,9 @@ import kotlinx.coroutines.test.runTest import org.dhis2.mobile.login.pin.data.SessionRepository import org.dhis2.mobile.login.pin.domain.model.PinError import org.dhis2.mobile.login.pin.domain.model.ValidatePinInput -import org.junit.Before import org.mockito.kotlin.mock import org.mockito.kotlin.whenever +import kotlin.test.BeforeTest import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertTrue @@ -15,7 +15,7 @@ class ValidatePinUseCaseTest { private lateinit var useCase: ValidatePinUseCase private val repository: SessionRepository = mock() - @Before + @BeforeTest fun setUp() { useCase = ValidatePinUseCase(repository) } diff --git a/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/ui/viewmodel/PinViewModelTest.kt b/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/ui/viewmodel/PinViewModelTest.kt index ec708e71a05..bd68b60dfaa 100644 --- a/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/ui/viewmodel/PinViewModelTest.kt +++ b/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/ui/viewmodel/PinViewModelTest.kt @@ -5,6 +5,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.setMain import org.dhis2.mobile.login.pin.domain.model.PinError @@ -15,9 +16,10 @@ import org.dhis2.mobile.login.pin.domain.usecase.SavePinUseCase import org.dhis2.mobile.login.pin.domain.usecase.ValidatePinUseCase import org.dhis2.mobile.login.pin.ui.components.PinMode import org.dhis2.mobile.login.pin.ui.provider.PinResourceProvider -import org.junit.Before import org.mockito.kotlin.mock import org.mockito.kotlin.whenever +import kotlin.test.AfterTest +import kotlin.test.BeforeTest import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertTrue @@ -31,11 +33,16 @@ class PinViewModelTest { private val resourceProvider: PinResourceProvider = mock() private val testDispatcher = StandardTestDispatcher() - @Before + @BeforeTest fun setUp() { Dispatchers.setMain(testDispatcher) } + @AfterTest + fun tearDown() { + Dispatchers.resetMain() + } + @Test fun `initial state is Idle`() = runTest { From 24b20d95c330787a3e3c56673ed022d51a269961 Mon Sep 17 00:00:00 2001 From: Pablo Date: Wed, 18 Feb 2026 09:22:50 +0100 Subject: [PATCH 054/260] feat: [ANDROAPP-7459][1/6] Added new worker to update sync settings [skip size] (#4638) --- commonskmm/build.gradle.kts | 1 + .../notifications/WorkerNotificationInfo.kt | 7 + .../notifications/NotificationManager.kt | 47 ++ .../notifications/NotificationModel.kt | 3 + .../commons/providers/PreferenceConstants.kt | 3 + .../commons/providers/PreferenceProvider.kt | 5 + gradle/libs.versions.toml | 2 + gradle/verification-metadata.xml | 796 +++++++++++++----- scripts/check_pr_size.sh | 11 +- sync/build.gradle.kts | 3 +- .../data/AndroidSyncBackgroundJobAction.kt | 65 ++ .../mobile/sync/data/AndroidSyncRepository.kt | 159 ++++ .../sync/data/SdkSyncPeriodToSyncPeriod.kt | 25 + .../mobile/sync/data/SyncSettingsWorker.kt | 56 ++ .../mobile/sync/di/SyncModule.android.kt | 28 + .../composeResources/values/strings.xml | 3 + .../sync/data/SyncBackgroundJobAction.kt | 20 + .../dhis2/mobile/sync/data/SyncRepository.kt | 23 + .../org/dhis2/mobile/sync/di/SyncModule.kt | 5 + .../dhis2/mobile/sync/domain/SyncSettings.kt | 34 + .../dhis2/mobile/sync/model/SyncJobStatus.kt | 21 + .../org/dhis2/mobile/sync/model/SyncPeriod.kt | 48 ++ .../mobile/sync/di/SyncModule.desktop.kt | 9 + sync/src/main/res/drawable/ic_sync.xml | 10 + 24 files changed, 1167 insertions(+), 217 deletions(-) create mode 100644 commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/notifications/WorkerNotificationInfo.kt create mode 100644 commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationManager.kt create mode 100644 commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationModel.kt create mode 100644 sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncBackgroundJobAction.kt create mode 100644 sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt create mode 100644 sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SdkSyncPeriodToSyncPeriod.kt create mode 100644 sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncSettingsWorker.kt create mode 100644 sync/src/androidMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.android.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncBackgroundJobAction.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncSettings.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncJobStatus.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncPeriod.kt create mode 100644 sync/src/desktopMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.desktop.kt create mode 100644 sync/src/main/res/drawable/ic_sync.xml diff --git a/commonskmm/build.gradle.kts b/commonskmm/build.gradle.kts index 1d9c1cc2f75..909d0454f74 100644 --- a/commonskmm/build.gradle.kts +++ b/commonskmm/build.gradle.kts @@ -77,6 +77,7 @@ kotlin { implementation(libs.androidx.browser) // Sentry api(libs.analytics.sentry) + implementation(libs.androidx.work) } androidUnitTest.dependencies { diff --git a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/notifications/WorkerNotificationInfo.kt b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/notifications/WorkerNotificationInfo.kt new file mode 100644 index 00000000000..e3e00856e49 --- /dev/null +++ b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/notifications/WorkerNotificationInfo.kt @@ -0,0 +1,7 @@ +package org.dhis2.mobile.commons.notifications + +import androidx.work.ForegroundInfo + +data class WorkerNotificationInfo( + val foregroundInfo: ForegroundInfo, +) : NotificationModel diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationManager.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationManager.kt new file mode 100644 index 00000000000..178ecef144d --- /dev/null +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationManager.kt @@ -0,0 +1,47 @@ +package org.dhis2.mobile.commons.notifications + +interface NotificationManager { + fun getDataSyncNotification( + smallIcon: Int, + contentTitle: String, + contentText: String, + progress: Int, + ): NotificationModel + + fun displayDataSyncNotification( + smallIcon: Int, + contentTitle: String, + contentText: String, + progress: Int, + ) + + fun getMetadataSyncNotification( + smallIcon: Int, + contentTitle: String, + contentText: String, + progress: Int, + ): NotificationModel + + fun displayMetadataSyncNotification( + smallIcon: Int, + contentTitle: String, + contentText: String, + progress: Int, + ) + + fun getSyncSettingsNotificationModel( + smallIcon: Int, + contentTitle: String, + contentText: String, + ): NotificationModel + + fun displaySyncSettingsNotification( + smallIcon: Int, + contentTitle: String, + contentText: String, + ) + + fun cancelMetadataSyncNotification() + + fun cancelSyncSettingsNotification() +} diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationModel.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationModel.kt new file mode 100644 index 00000000000..831c2446f68 --- /dev/null +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationModel.kt @@ -0,0 +1,3 @@ +package org.dhis2.mobile.commons.notifications + +interface NotificationModel diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/providers/PreferenceConstants.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/providers/PreferenceConstants.kt index 03a9fd3f090..297a5a768c9 100644 --- a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/providers/PreferenceConstants.kt +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/providers/PreferenceConstants.kt @@ -6,5 +6,8 @@ const val SECURE_USER_NAME = "SECURE_USER_NAME" const val SECURE_PASS = "SECURE_PASS" const val SHARE_PREFS = "org.dhis2" const val LAST_META_SYNC = "last_meta_sync" +const val TIME_META = "timeMeta" +const val LAST_META_SYNC_STATUS = "last_meta_sync_status" const val LAST_DATA_SYNC = "last_data_sync" +const val TIME_DATA = "timeData" const val BIOMETRIC_CREDENTIALS = "biometric_credentials" diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/providers/PreferenceProvider.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/providers/PreferenceProvider.kt index 3c5d1d07892..5fb3b0eebb9 100644 --- a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/providers/PreferenceProvider.kt +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/providers/PreferenceProvider.kt @@ -1,6 +1,7 @@ package org.dhis2.mobile.commons.providers import org.dhis2.mobile.commons.biometrics.CiphertextWrapper +import kotlin.time.Duration.Companion.days interface PreferenceProvider { fun saveUserCredentials( @@ -91,4 +92,8 @@ interface PreferenceProvider { ): List fun updateLoginServers(serverUrl: String) + + fun getMetadataSyncPeriod(): Int = getInt(TIME_META, 7.days.inWholeSeconds.toInt()) + + fun getDataSyncPeriod(): Int = getInt(TIME_DATA, 1.days.inWholeSeconds.toInt()) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 10c1780dfe7..371c9294cbd 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -97,6 +97,7 @@ browser = "1.9.0" biometric = "1.1.0" coil = "3.3.0" cyclonedx = "2.1.0" +workRuntimeKtx = "2.11.1" [libraries] gradlePlugin = { group = "com.android.tools.build", name = "gradle", version.ref = "gradle" } @@ -220,6 +221,7 @@ ktxml = { module = "org.kobjects.ktxml:core", version.ref = "ktxml" } commons-text = { module = "org.apache.commons:commons-text", version.ref = "commonsText" } coil = { module = "io.coil-kt.coil3:coil-compose", version.ref = "coil"} coil-network = { module = "io.coil-kt.coil3:coil-network-okhttp", version.ref = "coil"} +androidx-work-runtime-ktx = { group = "androidx.work", name = "work-runtime-ktx", version.ref = "workRuntimeKtx" } [plugins] kotlin-compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index ffb15d35b03..039ec11a49a 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -2591,6 +2591,10 @@ + + + @@ -2662,6 +2666,12 @@ + + + + + @@ -3183,6 +3193,12 @@ + + + + + @@ -3391,6 +3407,12 @@ + + + + + @@ -3857,6 +3879,12 @@ + + + + + @@ -4704,14 +4732,16 @@ - - - - - - - - + + + + + + + + @@ -7668,6 +7698,26 @@ + + + + + + + + + + + + + + + + @@ -7676,22 +7726,26 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + @@ -7715,6 +7769,16 @@ + + + + + + + + @@ -7745,14 +7809,16 @@ - - - - - - - - + + + + + + + + @@ -8475,14 +8541,16 @@ - - - - - - - - + + + + + + + + @@ -8498,6 +8566,16 @@ + + + + + + + + @@ -8522,6 +8600,16 @@ + + + + + + + + @@ -8555,6 +8643,16 @@ + + + + + + + + @@ -8578,6 +8676,16 @@ + + + + + + + + @@ -8595,12 +8703,14 @@ - - - - - - + + + + + + @@ -8619,12 +8729,14 @@ - - - - - - + + + + + + @@ -8650,6 +8762,16 @@ + + + + + + + + @@ -8667,14 +8789,16 @@ - - - - - - - - + + + + + + + + @@ -8690,6 +8814,16 @@ + + + + + + + + @@ -8715,30 +8849,36 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + @@ -8762,6 +8902,16 @@ + + + + + + + + @@ -8787,6 +8937,16 @@ + + + + + + + + @@ -8802,6 +8962,32 @@ + + + + + + + + + + + + + + + + + + + + + @@ -8840,14 +9026,16 @@ - - - - - - - - + + + + + + + + @@ -8864,14 +9052,16 @@ - - - - - - - - + + + + + + + + @@ -8896,6 +9086,16 @@ + + + + + + + + @@ -8912,12 +9112,14 @@ - - - - - - + + + + + + @@ -8935,6 +9137,16 @@ + + + + + + + + @@ -8960,30 +9172,36 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + @@ -9008,6 +9226,16 @@ + + + + + + + + @@ -9024,14 +9252,16 @@ - - - - - - - - + + + + + + + + @@ -9047,6 +9277,16 @@ + + + + + + + + @@ -9072,14 +9312,16 @@ - - - - - - - - + + + + + + + + @@ -9096,14 +9338,16 @@ - - - - - - - - + + + + + + + + @@ -9127,6 +9371,16 @@ + + + + + + + + @@ -12518,6 +12772,20 @@ + + + + + + + + + + + @@ -12606,6 +12874,12 @@ + + + + + @@ -13363,53 +13637,64 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -13443,6 +13728,16 @@ + + + + + + + + @@ -13482,14 +13777,17 @@ - - - - - - - - + + + + + + + + @@ -13529,6 +13827,16 @@ + + + + + + + + @@ -13571,6 +13879,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -14278,6 +14633,16 @@ + + + + + + + + @@ -14301,6 +14666,12 @@ + + + + + @@ -14326,9 +14697,10 @@ - - - + + + diff --git a/scripts/check_pr_size.sh b/scripts/check_pr_size.sh index d5a9f161367..f0b15e54fee 100644 --- a/scripts/check_pr_size.sh +++ b/scripts/check_pr_size.sh @@ -40,12 +40,15 @@ fi echo "Merge base: $MERGE_BASE" +# Define the files to exclude +EXCLUDE_PATTERN="**/verification-metadata.xml" + # Print the diff statistics from merge base to HEAD (only your changes) -echo "Diff statistics from merge base to HEAD (PR changes only):" -git diff --stat "$MERGE_BASE"..HEAD +echo "Diff statistics from merge base to HEAD (PR changes only), excluding $EXCLUDE_PATTERN:" +git diff --stat "$MERGE_BASE"..HEAD -- . ":(exclude)$EXCLUDE_PATTERN" # Get the total number of lines changed in the PR from the merge base -CHANGED_LINES=$(git diff --stat "$MERGE_BASE"..HEAD | tail -n1 | awk '{print $4 + $6}') +CHANGED_LINES=$(git diff --numstat "$MERGE_BASE"..HEAD -- . ":(exclude)$EXCLUDE_PATTERN" | awk '{s+=$1; s+=$2} END {print s}') # Handle cases where no changes are detected if [[ -z "$CHANGED_LINES" ]]; then @@ -59,4 +62,4 @@ if [[ "$CHANGED_LINES" -gt "$MAX_LINES" ]]; then fi echo "PR size is acceptable: $CHANGED_LINES lines changed." -exit 0 \ No newline at end of file +exit 0 diff --git a/sync/build.gradle.kts b/sync/build.gradle.kts index e5b4a06bdd8..d8f6f2db064 100644 --- a/sync/build.gradle.kts +++ b/sync/build.gradle.kts @@ -36,6 +36,7 @@ kotlin { resources.srcDirs("src/commonMain/composeResources") dependencies { + implementation(project(":commonskmm")) implementation(compose.runtime) implementation(compose.foundation) @@ -62,7 +63,7 @@ kotlin { androidMain.dependencies { implementation(libs.dhis2.android.sdk) api(libs.analytics.timber) - + implementation(libs.androidx.work) } androidUnitTest.dependencies { diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncBackgroundJobAction.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncBackgroundJobAction.kt new file mode 100644 index 00000000000..159461d8dbf --- /dev/null +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncBackgroundJobAction.kt @@ -0,0 +1,65 @@ +package org.dhis2.mobile.sync.data + +import androidx.work.ExistingPeriodicWorkPolicy +import androidx.work.PeriodicWorkRequest +import androidx.work.WorkManager +import androidx.work.await +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.emptyFlow +import org.dhis2.mobile.sync.model.SyncJobStatus +import java.util.concurrent.TimeUnit +import kotlin.time.Duration.Companion.days + +private const val METADATA_SYNC = "METADATA_SYNC" +private const val METADATA_SYNC_NOW = "METADATA_SYNC_NOW" +private const val DATA_SYNC = "DATA_SYNC" +private const val DATA_SYNC_NOW = "DATA_SYNC_NOW" +private const val SYNC_SETTINGS = "SYNC_SETTINGS" + +internal class AndroidSyncBackgroundJobAction( + private val workManager: WorkManager, +) : SyncBackgroundJobAction { + override fun launchMetadataSync(syncingPeriod: Long) { + // implement later + } + + override fun launchDataSync(syncingPeriod: Long) { + // implement later + } + + override fun launchSyncSettings() { + val request = + PeriodicWorkRequest + .Builder( + workerClass = SyncSettingsWorker::class.java, + repeatInterval = 1.days.inWholeSeconds, + repeatIntervalTimeUnit = TimeUnit.SECONDS, + ).setInitialDelay(1, TimeUnit.MINUTES) + .addTag( + SYNC_SETTINGS, + ).build() + + workManager.enqueueUniquePeriodicWork( + SYNC_SETTINGS, + ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE, + request, + ) + } + + override fun observeMetadataJob(): Flow> { + // implement later + return emptyFlow() + } + + override suspend fun cancelSyncSettings() { + workManager.cancelUniqueWork(SYNC_SETTINGS).await() + } + + override suspend fun cancelMetadataSync() { + workManager.cancelUniqueWork(METADATA_SYNC).await() + } + + override suspend fun cancelDataSync() { + workManager.cancelUniqueWork(DATA_SYNC).await() + } +} diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt new file mode 100644 index 00000000000..eafab16e4e6 --- /dev/null +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt @@ -0,0 +1,159 @@ +package org.dhis2.mobile.sync.data + +import kotlinx.coroutines.withContext +import kotlinx.datetime.TimeZone +import kotlinx.datetime.format +import kotlinx.datetime.toLocalDateTime +import org.dhis2.mobile.commons.coroutine.Dispatcher +import org.dhis2.mobile.commons.dates.dateTimeFormat +import org.dhis2.mobile.commons.error.DomainErrorMapper +import org.dhis2.mobile.commons.providers.LAST_META_SYNC +import org.dhis2.mobile.commons.providers.LAST_META_SYNC_STATUS +import org.dhis2.mobile.commons.providers.PreferenceProvider +import org.dhis2.mobile.commons.reporting.AnalyticActions +import org.dhis2.mobile.sync.model.toSyncPeriod +import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.fileresource.FileResourceDomainType +import org.hisp.dhis.android.core.maintenance.D2Error +import kotlin.math.ceil +import kotlin.time.Clock +import kotlin.time.ExperimentalTime + +class AndroidSyncRepository( + private val d2: D2, + private val preferences: PreferenceProvider, + private val analyticsHelper: AnalyticActions, + private val domainErrorMapper: DomainErrorMapper, + private val dispatcher: Dispatcher, +) : SyncRepository { + private suspend fun execute(block: suspend () -> Result): Result = + withContext(dispatcher.io) { + try { + block() + } catch (d2Error: D2Error) { + Result.failure(domainErrorMapper.mapToDomainError(d2Error)) + } + } + + override suspend fun currentMetadataSyncPeriod() = + withContext(dispatcher.io) { + d2 + .settingModule() + .synchronizationSettings() + .blockingGet() + ?.metadataSync() + ?.toSyncPeriod() + ?: preferences + .getMetadataSyncPeriod() + .toLong() + .toSyncPeriod() + } + + override suspend fun currentDataSyncPeriod() = + withContext(dispatcher.io) { + d2 + .settingModule() + .synchronizationSettings() + .blockingGet() + ?.dataSync() + ?.toSyncPeriod() + ?: preferences + .getDataSyncPeriod() + .toLong() + .toSyncPeriod() + } + + override suspend fun downloadFileResources(): Result = + execute { + d2 + .fileResourceModule() + .fileResourceDownloader() + .byDomainType() + .eq(FileResourceDomainType.ICON) + .blockingDownload() + Result.success(Unit) + } + + @OptIn(ExperimentalTime::class) + override suspend fun saveMetadataSyncState(isSuccess: Boolean) { + preferences.setValue( + LAST_META_SYNC, + Clock.System + .now() + .toLocalDateTime(TimeZone.currentSystemDefault()) + .format(dateTimeFormat), + ) + preferences.setValue(LAST_META_SYNC_STATUS, isSuccess) + } + + override suspend fun downloadMapMetadata(): Result = + execute { + d2 + .mapsModule() + .mapLayersDownloader() + .downloadMetadata() + .blockingAwait() + Result.success(Unit) + } + + override suspend fun refreshSyncSettings() = + execute { + d2.settingModule().synchronizationSettings().blockingDownload() + Result.success(Unit) + } + + override suspend fun syncMetadata(onProgressUpdate: (Int) -> Unit) = + execute { + d2.metadataModule().download().blockingForEach { progress -> + onProgressUpdate(ceil(progress.percentage() ?: 0.0).toInt()) + } + Result.success(Unit) + } + + override suspend fun updateProjectAnalytics(): Result = + execute { + d2.settingModule().generalSetting().blockingGet()?.let { globalSettings -> + if (globalSettings.matomoID() != null && globalSettings.matomoURL() != null) { + analyticsHelper.updateMatomoSecondaryTracker( + globalSettings.matomoURL()!!, + globalSettings.matomoID()!!, + "secondaryTracker", + ) + } + } ?: analyticsHelper.clearMatomoSecondaryTracker() + Result.success(Unit) + } + + override suspend fun setUpSMS(): Result = + execute { + d2.settingModule().generalSetting().blockingGet()?.let { globalSettings -> + globalSettings + .smsGateway() + ?.let { + d2 + .smsModule() + .configCase() + .setGatewayNumber(it) + .blockingAwait() + } + globalSettings.smsResultSender()?.let { + d2 + .smsModule() + .configCase() + .setConfirmationSenderNumber(it) + .blockingAwait() + } + d2 + .smsModule() + .configCase() + .setModuleEnabled(true) + .blockingAwait() + d2 + .smsModule() + .configCase() + .refreshMetadataIds() + .blockingAwait() + } + Result.success(Unit) + } +} diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SdkSyncPeriodToSyncPeriod.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SdkSyncPeriodToSyncPeriod.kt new file mode 100644 index 00000000000..318b956f0c9 --- /dev/null +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SdkSyncPeriodToSyncPeriod.kt @@ -0,0 +1,25 @@ +package org.dhis2.mobile.sync.data + +import org.dhis2.mobile.sync.model.SyncPeriod +import org.hisp.dhis.android.core.settings.DataSyncPeriod +import org.hisp.dhis.android.core.settings.MetadataSyncPeriod + +internal fun MetadataSyncPeriod.toSyncPeriod() = + when (this) { + MetadataSyncPeriod.EVERY_HOUR -> SyncPeriod.EveryHour + MetadataSyncPeriod.EVERY_6_HOURS -> SyncPeriod.Every6Hour + MetadataSyncPeriod.EVERY_12_HOURS -> SyncPeriod.Every12Hour + MetadataSyncPeriod.EVERY_24_HOURS -> SyncPeriod.Every24Hour + MetadataSyncPeriod.EVERY_7_DAYS -> SyncPeriod.Every7Days + MetadataSyncPeriod.MANUAL -> SyncPeriod.Manual + } + +internal fun DataSyncPeriod.toSyncPeriod() = + when (this) { + DataSyncPeriod.EVERY_30_MIN -> SyncPeriod.Every30Min + DataSyncPeriod.EVERY_HOUR -> SyncPeriod.EveryHour + DataSyncPeriod.EVERY_6_HOURS -> SyncPeriod.Every6Hour + DataSyncPeriod.EVERY_12_HOURS -> SyncPeriod.Every12Hour + DataSyncPeriod.EVERY_24_HOURS -> SyncPeriod.Every24Hour + DataSyncPeriod.MANUAL -> SyncPeriod.Manual + } diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncSettingsWorker.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncSettingsWorker.kt new file mode 100644 index 00000000000..bb0b9c33c93 --- /dev/null +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncSettingsWorker.kt @@ -0,0 +1,56 @@ +package org.dhis2.mobile.sync.data + +import android.content.Context +import androidx.work.CoroutineWorker +import androidx.work.ForegroundInfo +import androidx.work.WorkerParameters +import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.commons.notifications.NotificationManager +import org.dhis2.mobile.commons.notifications.WorkerNotificationInfo +import org.dhis2.mobile.sync.R +import org.dhis2.mobile.sync.domain.SyncSettings +import org.dhis2.mobile.sync.resources.Res +import org.dhis2.mobile.sync.resources.app_name +import org.dhis2.mobile.sync.resources.syncing_settings +import org.jetbrains.compose.resources.getString +import org.koin.core.component.KoinComponent +import org.koin.core.component.inject + +class SyncSettingsWorker( + private val context: Context, + workerParams: WorkerParameters, +) : CoroutineWorker(context, workerParams), + KoinComponent { + private val syncSettings: SyncSettings by inject() + private val notificationManager: NotificationManager by inject() + + override suspend fun doWork(): Result { + setForegroundAsync(getForegroundInfo()) + notificationManager.displaySyncSettingsNotification( + smallIcon = R.drawable.ic_sync, + contentTitle = getString(Res.string.app_name), + contentText = getString(Res.string.syncing_settings), + ) + val result = syncSettings() + notificationManager.cancelSyncSettingsNotification() + return when { + result.isSuccess -> Result.success() + else -> Result.failure() + } + } + + override suspend fun getForegroundInfo(): ForegroundInfo { + val notificationModel = + notificationManager.getSyncSettingsNotificationModel( + smallIcon = R.drawable.ic_sync, + contentTitle = getString(Res.string.app_name), + contentText = getString(Res.string.syncing_settings), + ) + val notificationInfo = + notificationModel as? WorkerNotificationInfo + ?: throw IllegalStateException( + "Expected WorkerNotificationInfo but got ${notificationModel::class.qualifiedName}", + ) + return notificationInfo.foregroundInfo + } +} diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.android.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.android.kt new file mode 100644 index 00000000000..17b950dbad1 --- /dev/null +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.android.kt @@ -0,0 +1,28 @@ +package org.dhis2.mobile.sync.di + +import androidx.work.WorkManager +import org.dhis2.mobile.sync.data.AndroidSyncBackgroundJobAction +import org.dhis2.mobile.sync.data.AndroidSyncRepository +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.data.SyncRepository +import org.dhis2.mobile.sync.domain.SyncSettings +import org.koin.core.module.dsl.factoryOf +import org.koin.dsl.module + +actual val syncModule = + module { + factory { + WorkManager.getInstance(get()) + } + factory { + AndroidSyncBackgroundJobAction( + workManager = get(), + ) + } + + factory { + AndroidSyncRepository(get(), get(), get(), get(), get()) + } + + factoryOf(::SyncSettings) + } diff --git a/sync/src/commonMain/composeResources/values/strings.xml b/sync/src/commonMain/composeResources/values/strings.xml index 4c1c46011bd..7fee4c96904 100644 --- a/sync/src/commonMain/composeResources/values/strings.xml +++ b/sync/src/commonMain/composeResources/values/strings.xml @@ -1,5 +1,8 @@ + Dhis2 + Checking web settings + Syncing your configuration diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncBackgroundJobAction.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncBackgroundJobAction.kt new file mode 100644 index 00000000000..a429afecf1e --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncBackgroundJobAction.kt @@ -0,0 +1,20 @@ +package org.dhis2.mobile.sync.data + +import kotlinx.coroutines.flow.Flow +import org.dhis2.mobile.sync.model.SyncJobStatus + +interface SyncBackgroundJobAction { + fun launchMetadataSync(syncingPeriod: Long) + + fun launchDataSync(syncingPeriod: Long) + + fun launchSyncSettings() + + fun observeMetadataJob(): Flow> + + suspend fun cancelSyncSettings() + + suspend fun cancelMetadataSync() + + suspend fun cancelDataSync() +} diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt new file mode 100644 index 00000000000..1f8f7db3bc9 --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt @@ -0,0 +1,23 @@ +package org.dhis2.mobile.sync.data + +import org.dhis2.mobile.sync.model.SyncPeriod + +interface SyncRepository { + suspend fun refreshSyncSettings(): Result + + suspend fun currentMetadataSyncPeriod(): SyncPeriod + + suspend fun currentDataSyncPeriod(): SyncPeriod + + suspend fun syncMetadata(onProgressUpdate: (Int) -> Unit): Result + + suspend fun updateProjectAnalytics(): Result + + suspend fun setUpSMS(): Result + + suspend fun downloadMapMetadata(): Result + + suspend fun downloadFileResources(): Result + + suspend fun saveMetadataSyncState(isSuccess: Boolean) +} diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.kt new file mode 100644 index 00000000000..9beaff8c03b --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.kt @@ -0,0 +1,5 @@ +package org.dhis2.mobile.sync.di + +import org.koin.core.module.Module + +expect val syncModule: Module diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncSettings.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncSettings.kt new file mode 100644 index 00000000000..dd97e76bb4d --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncSettings.kt @@ -0,0 +1,34 @@ +package org.dhis2.mobile.sync.domain + +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.data.SyncRepository +import org.dhis2.mobile.sync.model.SyncPeriod + +class SyncSettings( + private val repository: SyncRepository, + private val syncBackgroundJobAction: SyncBackgroundJobAction, +) : UseCase { + override suspend fun invoke(input: Unit): Result = + try { + val previousMetadataSyncPeriod = repository.currentMetadataSyncPeriod() + val result = repository.refreshSyncSettings() + if (result.isSuccess) { + val currentMetadataSyncPeriod = repository.currentMetadataSyncPeriod() + + val metadataPeriodChangedFromManual = + previousMetadataSyncPeriod is SyncPeriod.Manual && + currentMetadataSyncPeriod !is SyncPeriod.Manual + + if (metadataPeriodChangedFromManual) { + syncBackgroundJobAction.launchMetadataSync(currentMetadataSyncPeriod.toSeconds()) + syncBackgroundJobAction.cancelSyncSettings() + } + } + + result + } catch (e: DomainError) { + Result.failure(e) + } +} diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncJobStatus.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncJobStatus.kt new file mode 100644 index 00000000000..71f6f4dea61 --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncJobStatus.kt @@ -0,0 +1,21 @@ +package org.dhis2.mobile.sync.model + +data class SyncJobStatus( + val tags: List, + val status: SyncStatus, + val message: String?, +) + +sealed interface SyncStatus { + data object Enqueue : SyncStatus + + data object Running : SyncStatus + + data object Succeed : SyncStatus + + data object Failed : SyncStatus + + data object Blocked : SyncStatus + + data object Cancelled : SyncStatus +} diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncPeriod.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncPeriod.kt new file mode 100644 index 00000000000..437fe882394 --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncPeriod.kt @@ -0,0 +1,48 @@ +package org.dhis2.mobile.sync.model + +import kotlin.time.Duration.Companion.days +import kotlin.time.Duration.Companion.hours +import kotlin.time.Duration.Companion.minutes + +sealed interface SyncPeriod { + object Every15Min : SyncPeriod + + object Every30Min : SyncPeriod + + object EveryHour : SyncPeriod + + object Every6Hour : SyncPeriod + + object Every12Hour : SyncPeriod + + object Every24Hour : SyncPeriod + + object Every7Days : SyncPeriod + + object Manual : SyncPeriod + + fun toSeconds() = + when (this) { + Every12Hour -> 12.hours.inWholeSeconds + Every15Min -> 15.minutes.inWholeSeconds + Every24Hour -> 1.days.inWholeSeconds + Every30Min -> 30.minutes.inWholeSeconds + Every6Hour -> 6.hours.inWholeSeconds + Every7Days -> 7.days.inWholeSeconds + EveryHour -> 1.hours.inWholeSeconds + Manual -> 0 + } +} + +fun Long.toSyncPeriod() = + when { + this == 0.toLong() -> SyncPeriod.Manual + this == 15.minutes.inWholeSeconds -> SyncPeriod.Every15Min + this == 30.minutes.inWholeSeconds -> SyncPeriod.Every30Min + this == 1.hours.inWholeSeconds -> SyncPeriod.EveryHour + this == 6.hours.inWholeSeconds -> SyncPeriod.Every6Hour + this == 12.hours.inWholeSeconds -> SyncPeriod.Every12Hour + this == 1.days.inWholeSeconds -> SyncPeriod.Every24Hour + this == 7.days.inWholeSeconds -> SyncPeriod.Every7Days + else -> throw IllegalArgumentException("Invalid sync period") + } diff --git a/sync/src/desktopMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.desktop.kt b/sync/src/desktopMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.desktop.kt new file mode 100644 index 00000000000..a4d7b8e2cb7 --- /dev/null +++ b/sync/src/desktopMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.desktop.kt @@ -0,0 +1,9 @@ +package org.dhis2.mobile.sync.di + +import org.koin.core.module.Module +import org.koin.dsl.module + +actual val syncModule: Module + get() = + module { + } diff --git a/sync/src/main/res/drawable/ic_sync.xml b/sync/src/main/res/drawable/ic_sync.xml new file mode 100644 index 00000000000..26c0b192b0f --- /dev/null +++ b/sync/src/main/res/drawable/ic_sync.xml @@ -0,0 +1,10 @@ + + + From ff251692baf7c0edfbeea177501ca25cd647c0a3 Mon Sep 17 00:00:00 2001 From: Pablo Date: Thu, 19 Feb 2026 14:45:11 +0100 Subject: [PATCH 055/260] test: refactor how dataset waits to table (#4655) * refactor how dataset waits to table * refactor create note robot --- Jenkinsfile | 11 +++++++ .../usescases/datasets/DataSetInitialRobot.kt | 12 ++++---- .../usescases/datasets/DataSetTableRobot.kt | 6 ++-- .../dhis2/usescases/datasets/DataSetTest.kt | 15 ---------- .../usescases/teidashboard/robot/NoteRobot.kt | 29 +++++++++++++------ 5 files changed, 39 insertions(+), 34 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index c32f74a3656..ca2ad64efda 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -66,6 +66,11 @@ pipeline { } } stage('Unit tests') { + when { + expression { + return !isSkipUnitTest() + } + } environment { ANDROID_HOME = '/opt/android-sdk' } @@ -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]")) +} diff --git a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetInitialRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetInitialRobot.kt index 6f8df0645b7..85a98e6a34b 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetInitialRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetInitialRobot.kt @@ -7,7 +7,6 @@ import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performTextReplacement -import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers.isDisplayed @@ -30,23 +29,23 @@ internal class DataSetInitialRobot( ) : BaseRobot() { fun clickOnInputOrgUnit() { - onView(withId(R.id.dataSetOrgUnitInputLayout)).perform(click()) + waitForView(withId(R.id.dataSetOrgUnitInputLayout)).perform(click()) } fun clickOnInputPeriod() { - onView(withId(R.id.dataSetPeriodInputLayout)).perform(click()) + waitForView(withId(R.id.dataSetPeriodInputLayout)).perform(click()) } fun clickOnActionButton() { - onView(withId(R.id.actionButton)).perform(click()) + waitForView(withId(R.id.actionButton)).perform(click()) } fun clickOnInputCatCombo() { - onView(withId(R.id.input_layout)).perform(click()) + waitForView(withId(R.id.input_layout)).perform(click()) } fun selectCatCombo(catCombo: String) { - onView(withText(catCombo)).perform(click()) + waitForView(withText(catCombo)).perform(click()) } fun chooseDate(date: String) { @@ -59,6 +58,7 @@ internal class DataSetInitialRobot( ).performClick() composeTestRule.onNodeWithContentDescription("Date", substring = true).performTextReplacement(date) composeTestRule.onNodeWithText("Accept", true).performClick() + composeTestRule.waitForIdle() } fun checkActionInputIsNotDisplayed() { diff --git a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTableRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTableRobot.kt index 45df85f6752..dac099e47cc 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTableRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTableRobot.kt @@ -2,7 +2,6 @@ package org.dhis2.usescases.datasets -import androidx.compose.ui.graphics.Color import androidx.compose.ui.semantics.SemanticsProperties.TestTag import androidx.compose.ui.test.ExperimentalTestApi import androidx.compose.ui.test.SemanticsMatcher @@ -31,7 +30,6 @@ import androidx.compose.ui.test.performTextReplacement import androidx.compose.ui.test.performTouchInput import androidx.compose.ui.test.printToLog import androidx.compose.ui.test.swipeRight -import androidx.core.graphics.toColorInt import org.dhis2.common.BaseRobot import org.dhis2.composetable.ui.semantics.CELL_TEST_TAG import org.dhis2.composetable.ui.semantics.MANDATORY_ICON_TEST_TAG @@ -255,7 +253,7 @@ internal class DataSetTableRobot( fun assertTableIsDisplayed() { composeTestRule.waitUntilExactlyOneExists( hasTestTag("TABLE_SCROLLABLE_COLUMN"), - timeoutMillis = 3000 + timeoutMillis = 10000 ) } @@ -413,7 +411,7 @@ internal class DataSetTableRobot( assertTableIsDisplayed() composeTestRule.waitUntilAtLeastOneExists( hasText(text, substring = true), - timeoutMillis = 5000 + timeoutMillis = 10000 ) composeTestRule.onNodeWithText(text, substring = true, useUnmergedTree = true) .assertIsDisplayed() diff --git a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt index 5d1e1025397..893f582a233 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt @@ -5,7 +5,6 @@ import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsNotDisplayed import androidx.compose.ui.test.assertTextEquals import androidx.compose.ui.test.hasTestTag -import androidx.compose.ui.test.hasText import androidx.compose.ui.test.isDisplayed import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithTag @@ -326,11 +325,6 @@ class DataSetTest : BaseTest() { orgUnit = orgUnit, catCombo = catCombo ) - // Wait for table to be ready after creating the second dataset instance - composeTestRule.waitUntilExactlyOneExists( - hasTestTag("TABLE_SCROLLABLE_COLUMN"), - timeoutMillis = 10000 - ) tableIsVisible() enterDataStep( tableId = tableId, @@ -347,15 +341,6 @@ class DataSetTest : BaseTest() { dataSetDetailRobot(composeTestRule){ clickOnDataSetAtPosition(0) } - composeTestRule.waitUntilExactlyOneExists( - hasTestTag("TABLE_SCROLLABLE_COLUMN"), - timeoutMillis = 15000 - ) - // Wait for completion state to be reflected in the UI - composeTestRule.waitUntilAtLeastOneExists( - hasText("Re-open form to edit"), - timeoutMillis = 10000 - ) tableIsVisible() dataSetTableRobot(composeTestRule) { checkItemWithTextIsDisplayed("Re-open form to edit") diff --git a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt index 97cf54d2117..d77699f8755 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt @@ -1,12 +1,11 @@ package org.dhis2.usescases.teidashboard.robot -import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.TypeTextAction import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.assertion.ViewAssertions.matches -import androidx.test.espresso.matcher.RootMatchers.isDialog import androidx.test.espresso.intent.Intents import androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent +import androidx.test.espresso.matcher.RootMatchers.isDialog import androidx.test.espresso.matcher.ViewMatchers.Visibility import androidx.test.espresso.matcher.ViewMatchers.hasDescendant import androidx.test.espresso.matcher.ViewMatchers.isDisplayed @@ -32,7 +31,7 @@ fun noteRobot(noteRobot: NoteRobot.() -> Unit) { class NoteRobot : BaseRobot() { fun clickOnFabAddNewNote() { - onView(withId(R.id.addNoteButton)).check(matches(isDisplayed())).perform(click()) + waitForView(withId(R.id.addNoteButton)).check(matches(isDisplayed())).perform(click()) } fun verifyNoteDetailActivityIsLaunched() { @@ -40,21 +39,21 @@ class NoteRobot : BaseRobot() { } fun typeNote(text: String) { - onView(withId(R.id.noteText)).perform(TypeTextAction(text)) + waitForView(withId(R.id.noteText)).perform(TypeTextAction(text)) closeKeyboard() } fun clickOnSaveButton() { - waitForView(withText(R.string.save)) + waitForView(allOf(withId(R.id.saveButton), withText(R.string.save))) .check(matches(allOf(isDisplayed(), isEnabled()))) .perform(click()) } fun clickYesOnAlertDialog() { - onView(isRoot()) + waitForView(isRoot()) .inRoot(isDialog()) .perform(searchFor(withId(android.R.id.button1))) - onView(withId(android.R.id.button1)) + waitForView(withId(android.R.id.button1)) .inRoot(isDialog()) .check(matches(isDisplayed())) .perform(click()) @@ -92,9 +91,21 @@ class NoteRobot : BaseRobot() { fun checkNoteDetails(user: String, noteText: String) { waitForView(withId(R.id.notes_recycler)).check(matches(isDisplayed())) - waitForView(allOf(withId(R.id.storeBy), withEffectiveVisibility(Visibility.VISIBLE), withText(user))) + waitForView( + allOf( + withId(R.id.storeBy), + withEffectiveVisibility(Visibility.VISIBLE), + withText(user) + ) + ) .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) - waitForView(allOf(withId(R.id.note_text), withEffectiveVisibility(Visibility.VISIBLE), withText(noteText))) + waitForView( + allOf( + withId(R.id.note_text), + withEffectiveVisibility(Visibility.VISIBLE), + withText(noteText) + ) + ) .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) } } From 58a37a22fa8f37782930ecaa675b765073c1e124 Mon Sep 17 00:00:00 2001 From: Xavier Molloy Date: Thu, 19 Feb 2026 20:54:16 +0100 Subject: [PATCH 056/260] chore: [ANDROAPP-7470] File relocation and fetchOptionSets usecase (I) [skip size] (#4667) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: [ANDROAPP-7470] file relocation * feat: [ANDROAPP-7470] FetchOptionSetOptions usecase (#4668) * feat: [ANDROAPP-7470] Address sonar code smell * refactor: Replace suspend operator by returning a cold flow (#4671) --------- Co-authored-by: Andrés Miguel Rubio --- .../SearchRepositoryImplKt.kt | 2 +- .../searchTrackEntity/SearchRepositoryKt.kt | 2 +- .../searchTrackEntity/SearchTEIViewModel.kt | 6 +- .../SearchParametersScreen.kt | 8 +- .../mapper/ParameterInputModelMapper.kt | 12 +- .../SearchTEIViewModelTest.kt | 2 +- .../mapper/ParameterInputModelMapperTest.kt | 2 +- ...omainToSDKTrackedEntitySearchItemMapper.kt | 2 +- .../data/OptionSetRepository.android.kt | 71 +++++ .../data/TrackedEntitySearchItemMapper.kt | 2 +- .../{ui => }/input/model/TrackerInputType.kt | 2 +- .../ui}/action/TrackerInputAction.kt | 2 +- .../ui/action}/TrackerInputUiEvent.kt | 2 +- .../ui}/provider/TrackerAgeInputProvider.kt | 10 +- .../provider/TrackerCheckboxInputProvider.kt | 10 +- .../ui}/provider/TrackerDateTimeProvider.kt | 12 +- .../ui}/provider/TrackerInputProvider.kt | 271 +++++++----------- .../TrackerRadioButtonInputProvider.kt | 10 +- .../ui/state/TrackerInputUIState.kt} | 9 +- .../state}/TrackerOptionSetConfiguration.kt | 2 +- .../search/data/OptionSetRepository.kt | 26 ++ .../tracker/search/di/TrackerSearchModule.kt | 4 + .../search/domain/FetchOptionSetOptions.kt | 35 +++ .../model/TrackedEntitySearchItemResult.kt | 2 +- .../provider/ParameterSelectorItemProvider.kt | 10 +- .../data/OptionSetRepository.desktop.kt | 22 ++ 26 files changed, 320 insertions(+), 218 deletions(-) create mode 100644 tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepository.android.kt rename tracker/src/commonMain/kotlin/org/dhis2/tracker/{ui => }/input/model/TrackerInputType.kt (92%) rename tracker/src/commonMain/kotlin/org/dhis2/tracker/{ui/input => input/ui}/action/TrackerInputAction.kt (87%) rename tracker/src/commonMain/kotlin/org/dhis2/tracker/{ui/input/model => input/ui/action}/TrackerInputUiEvent.kt (93%) rename tracker/src/commonMain/kotlin/org/dhis2/tracker/{ui/input => input/ui}/provider/TrackerAgeInputProvider.kt (95%) rename tracker/src/commonMain/kotlin/org/dhis2/tracker/{ui/input => input/ui}/provider/TrackerCheckboxInputProvider.kt (87%) rename tracker/src/commonMain/kotlin/org/dhis2/tracker/{ui/input => input/ui}/provider/TrackerDateTimeProvider.kt (92%) rename tracker/src/commonMain/kotlin/org/dhis2/tracker/{ui/input => input/ui}/provider/TrackerInputProvider.kt (77%) rename tracker/src/commonMain/kotlin/org/dhis2/tracker/{ui/input => input/ui}/provider/TrackerRadioButtonInputProvider.kt (87%) rename tracker/src/commonMain/kotlin/org/dhis2/tracker/{ui/input/model/TrackerInputModel.kt => input/ui/state/TrackerInputUIState.kt} (85%) rename tracker/src/commonMain/kotlin/org/dhis2/tracker/{ui/input/model => input/ui/state}/TrackerOptionSetConfiguration.kt (90%) create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepository.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/FetchOptionSetOptions.kt create mode 100644 tracker/src/desktopMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepository.desktop.kt diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImplKt.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImplKt.kt index 2b58b3492b2..822fbbeb51b 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImplKt.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImplKt.kt @@ -22,7 +22,7 @@ import org.dhis2.mobile.commons.customintents.CustomIntentRepository import org.dhis2.mobile.commons.extensions.toColor import org.dhis2.mobile.commons.model.CustomIntentActionTypeModel import org.dhis2.mobile.commons.model.CustomIntentModel -import org.dhis2.tracker.ui.input.action.FieldUid +import org.dhis2.tracker.input.ui.action.FieldUid import org.dhis2.usescases.events.EventInfoProvider import org.dhis2.usescases.tracker.TrackedEntityInstanceInfoProvider import org.hisp.dhis.android.core.D2 diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryKt.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryKt.kt index a69fd6198b0..43bde52a6f7 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryKt.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryKt.kt @@ -4,7 +4,7 @@ import org.dhis2.data.search.SearchParametersModel import org.dhis2.form.model.FieldUiModel import org.dhis2.maps.model.MapItemModel import org.dhis2.mobile.commons.model.CustomIntentModel -import org.dhis2.tracker.ui.input.action.FieldUid +import org.dhis2.tracker.input.ui.action.FieldUid import org.hisp.dhis.android.core.program.Program interface SearchRepositoryKt { diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt index 213c805f2d7..0388f89c9ac 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt @@ -54,12 +54,12 @@ import org.dhis2.maps.managers.MapManager import org.dhis2.maps.usecases.MapStyleConfiguration import org.dhis2.mobile.commons.coroutine.CoroutineTracker import org.dhis2.tracker.NavigationBarUIState +import org.dhis2.tracker.input.ui.action.CustomIntentUid +import org.dhis2.tracker.input.ui.action.FieldUid +import org.dhis2.tracker.input.ui.action.TrackerInputAction import org.dhis2.tracker.search.data.transformDomainTeiToSDKTei import org.dhis2.tracker.search.domain.SearchTrackedEntities import org.dhis2.tracker.search.model.SearchTrackedEntitiesInput -import org.dhis2.tracker.ui.input.action.CustomIntentUid -import org.dhis2.tracker.ui.input.action.FieldUid -import org.dhis2.tracker.ui.input.action.TrackerInputAction import org.dhis2.usescases.searchTrackEntity.listView.SearchResult import org.dhis2.usescases.searchTrackEntity.searchparameters.model.SearchParametersUiState import org.dhis2.usescases.searchTrackEntity.ui.UnableToSearchOutsideData diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreen.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreen.kt index bd2ab645350..013f70a01ea 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreen.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreen.kt @@ -54,11 +54,11 @@ import org.dhis2.form.ui.event.RecyclerViewUiEvents import org.dhis2.form.ui.intent.FormIntent import org.dhis2.mobile.commons.extensions.ObserveAsEvents import org.dhis2.mobile.commons.orgunit.OrgUnitSelectorScope +import org.dhis2.tracker.input.ui.action.CustomIntentUid +import org.dhis2.tracker.input.ui.action.FieldUid +import org.dhis2.tracker.input.ui.action.TrackerInputAction +import org.dhis2.tracker.input.ui.action.TrackerInputUiEvent import org.dhis2.tracker.search.ui.provider.provideParameterSelectorItem -import org.dhis2.tracker.ui.input.action.CustomIntentUid -import org.dhis2.tracker.ui.input.action.FieldUid -import org.dhis2.tracker.ui.input.action.TrackerInputAction -import org.dhis2.tracker.ui.input.model.TrackerInputUiEvent import org.dhis2.usescases.searchTrackEntity.SearchTEIViewModel import org.dhis2.usescases.searchTrackEntity.searchparameters.mapper.toParameterInputModel import org.dhis2.usescases.searchTrackEntity.searchparameters.model.SearchParametersUiState diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapper.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapper.kt index e98369d5546..e49883292b3 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapper.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapper.kt @@ -11,10 +11,10 @@ import org.dhis2.commons.resources.ResourceManager import org.dhis2.form.R import org.dhis2.form.model.FieldUiModel import org.dhis2.form.model.UiRenderType -import org.dhis2.tracker.ui.input.model.TrackerInputModel -import org.dhis2.tracker.ui.input.model.TrackerInputType -import org.dhis2.tracker.ui.input.model.TrackerOptionItem -import org.dhis2.tracker.ui.input.model.TrackerOptionSetConfiguration +import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.input.ui.state.TrackerInputUIState +import org.dhis2.tracker.input.ui.state.TrackerOptionItem +import org.dhis2.tracker.input.ui.state.TrackerOptionSetConfiguration import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.mobile.ui.designsystem.component.LegendData import org.hisp.dhis.mobile.ui.designsystem.component.Orientation @@ -23,7 +23,7 @@ import org.hisp.dhis.mobile.ui.designsystem.component.Orientation fun FieldUiModel.toParameterInputModel( fetchOptions: () -> Unit, resourceManager: ResourceManager, -): TrackerInputModel { +): TrackerInputUIState { val trackerInputType = when { optionSet != null && valueType != ValueType.MULTI_TEXT -> { @@ -41,7 +41,7 @@ fun FieldUiModel.toParameterInputModel( else -> getInputTypeByValueType(valueType, renderingType) } - return TrackerInputModel( + return TrackerInputUIState( uid = uid, label = label, value = value, diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt index 45e88671f9f..4ac2925f6d0 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt @@ -31,9 +31,9 @@ import org.dhis2.form.ui.provider.DisplayNameProvider import org.dhis2.maps.geometry.mapper.EventsByProgramStage import org.dhis2.maps.usecases.MapStyleConfiguration import org.dhis2.mobile.commons.model.CustomIntentModel +import org.dhis2.tracker.input.ui.action.TrackerInputAction import org.dhis2.tracker.search.domain.SearchTrackedEntities import org.dhis2.tracker.search.model.SearchTrackedEntitiesInput -import org.dhis2.tracker.ui.input.action.TrackerInputAction import org.dhis2.usescases.searchTrackEntity.listView.SearchResult.SearchResultType import org.dhis2.utils.customviews.navigationbar.NavigationPage import org.hisp.dhis.android.core.common.ObjectWithUid diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapperTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapperTest.kt index 401655d54b2..7196a8f808d 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapperTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapperTest.kt @@ -3,7 +3,7 @@ package org.dhis2.usescases.searchTrackEntity.searchparameters.mapper import org.dhis2.commons.resources.ResourceManager import org.dhis2.form.R import org.dhis2.form.model.UiRenderType -import org.dhis2.tracker.ui.input.model.TrackerInputType +import org.dhis2.tracker.input.model.TrackerInputType import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.mobile.ui.designsystem.component.Orientation import org.junit.Assert.assertEquals diff --git a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/DomainToSDKTrackedEntitySearchItemMapper.kt b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/DomainToSDKTrackedEntitySearchItemMapper.kt index 08b8664494e..a37b00a6968 100644 --- a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/DomainToSDKTrackedEntitySearchItemMapper.kt +++ b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/DomainToSDKTrackedEntitySearchItemMapper.kt @@ -1,12 +1,12 @@ package org.dhis2.tracker.search.data +import org.dhis2.tracker.input.model.TrackerInputType import org.dhis2.tracker.search.model.GeometryFeatureType import org.dhis2.tracker.search.model.SyncState import org.dhis2.tracker.search.model.TrackedEntityGeometry import org.dhis2.tracker.search.model.TrackedEntitySearchItemAttributeDomain import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult import org.dhis2.tracker.search.model.TrackedEntityTypeDomain -import org.dhis2.tracker.ui.input.model.TrackerInputType import org.hisp.dhis.android.core.common.FeatureType import org.hisp.dhis.android.core.common.Geometry import org.hisp.dhis.android.core.common.State diff --git a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepository.android.kt b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepository.android.kt new file mode 100644 index 00000000000..e561b26c5ed --- /dev/null +++ b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepository.android.kt @@ -0,0 +1,71 @@ +package org.dhis2.tracker.search.data + +import androidx.paging.PagingData +import androidx.paging.map +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.emitAll +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.map +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.mobile.commons.error.DomainErrorMapper +import org.dhis2.tracker.input.ui.state.TrackerOptionItem +import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.arch.repositories.scope.RepositoryScope +import org.hisp.dhis.android.core.maintenance.D2Error + +/** + * Android implementation of OptionSetRepository using DHIS2 Android SDK. + */ +@Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING") +actual class OptionSetRepository( + private val d2: D2, + private val domainErrorMapper: DomainErrorMapper, +) { + /** + * Fetches paginated options for a given option set. + * @param optionSetUid The unique identifier of the option set + * @param pageSize Number of items per page + * @param searchQuery Optional search query to filter options + * @return Flow of paginated option items. The `flow { }` builder creates a cold (lazy) flow that + * will be executed when collected. The code inside runs in the collector's coroutine context. + */ + actual fun getOptions( + optionSetUid: String, + pageSize: Int, + searchQuery: String?, + ): Flow> = + flow { + try { + var query = + d2 + .optionModule() + .options() + .byOptionSetUid() + .eq(optionSetUid) + .orderBySortOrder(RepositoryScope.OrderByDirection.ASC) + + // Apply search filter if provided + searchQuery?.takeIf { it.isNotBlank() }?.let { search -> + query = query.byDisplayName().like("%$search%") + } + + val pagingFlow = + query + .getPagingData(pageSize) + .map { pagingData -> + pagingData.map { option -> + TrackerOptionItem( + code = option.code() ?: "", + displayName = option.displayName() ?: "", + ) + } + } + + emitAll(pagingFlow) + } catch (d2Error: D2Error) { + throw domainErrorMapper.mapToDomainError(d2Error) + } catch (e: Exception) { + throw DomainError.UnexpectedError(e.message ?: "Unknown error fetching options") + } + } +} diff --git a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/TrackedEntitySearchItemMapper.kt b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/TrackedEntitySearchItemMapper.kt index 2b62b721425..eb05207c5b2 100644 --- a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/TrackedEntitySearchItemMapper.kt +++ b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/TrackedEntitySearchItemMapper.kt @@ -1,5 +1,6 @@ package org.dhis2.tracker.search.data +import org.dhis2.tracker.input.model.TrackerInputType import org.dhis2.tracker.search.model.GeometryFeatureType import org.dhis2.tracker.search.model.SyncState import org.dhis2.tracker.search.model.TrackedEntityGeometry @@ -8,7 +9,6 @@ import org.dhis2.tracker.search.model.TrackedEntitySearchItemProgramOwnerDomain import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult import org.dhis2.tracker.search.model.TrackedEntityTypeAttributeDomain import org.dhis2.tracker.search.model.TrackedEntityTypeDomain -import org.dhis2.tracker.ui.input.model.TrackerInputType import org.hisp.dhis.android.core.common.FeatureType import org.hisp.dhis.android.core.common.Geometry import org.hisp.dhis.android.core.common.State diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/model/TrackerInputType.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/model/TrackerInputType.kt similarity index 92% rename from tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/model/TrackerInputType.kt rename to tracker/src/commonMain/kotlin/org/dhis2/tracker/input/model/TrackerInputType.kt index f93a0af77f6..02b819fb954 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/model/TrackerInputType.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/model/TrackerInputType.kt @@ -1,4 +1,4 @@ -package org.dhis2.tracker.ui.input.model +package org.dhis2.tracker.input.model enum class TrackerInputType { TEXT, diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/action/TrackerInputAction.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/action/TrackerInputAction.kt similarity index 87% rename from tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/action/TrackerInputAction.kt rename to tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/action/TrackerInputAction.kt index 1aea9c9c270..2a024512262 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/action/TrackerInputAction.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/action/TrackerInputAction.kt @@ -1,4 +1,4 @@ -package org.dhis2.tracker.ui.input.action +package org.dhis2.tracker.input.ui.action import org.dhis2.mobile.commons.model.CustomIntentModel diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/model/TrackerInputUiEvent.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/action/TrackerInputUiEvent.kt similarity index 93% rename from tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/model/TrackerInputUiEvent.kt rename to tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/action/TrackerInputUiEvent.kt index 73beffde51f..ec534567ff9 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/model/TrackerInputUiEvent.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/action/TrackerInputUiEvent.kt @@ -1,4 +1,4 @@ -package org.dhis2.tracker.ui.input.model +package org.dhis2.tracker.input.ui.action sealed interface TrackerInputUiEvent { data class OnScanButtonClicked( diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerAgeInputProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerAgeInputProvider.kt similarity index 95% rename from tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerAgeInputProvider.kt rename to tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerAgeInputProvider.kt index a4d43c9bec6..a22ad53a1d8 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerAgeInputProvider.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerAgeInputProvider.kt @@ -1,4 +1,4 @@ -package org.dhis2.tracker.ui.input.provider +package org.dhis2.tracker.input.ui.provider import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect @@ -17,9 +17,9 @@ import org.dhis2.mobile.commons.resources.age_or import org.dhis2.mobile.commons.resources.cancel import org.dhis2.mobile.commons.resources.date_of_birth import org.dhis2.mobile.commons.resources.ok -import org.dhis2.tracker.ui.input.model.TrackerInputModel -import org.dhis2.tracker.ui.input.model.inputState -import org.dhis2.tracker.ui.input.model.supportingText +import org.dhis2.tracker.input.ui.state.TrackerInputUIState +import org.dhis2.tracker.input.ui.state.inputState +import org.dhis2.tracker.input.ui.state.supportingText import org.hisp.dhis.mobile.ui.designsystem.component.AgeInputType import org.hisp.dhis.mobile.ui.designsystem.component.InputAge import org.hisp.dhis.mobile.ui.designsystem.component.InputStyle @@ -29,7 +29,7 @@ import org.jetbrains.compose.resources.stringResource @Composable fun ProvideTrackerAgeInput( - model: TrackerInputModel, + model: TrackerInputUIState, inputStyle: InputStyle, onNextClicked: () -> Unit, modifier: Modifier, diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerCheckboxInputProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerCheckboxInputProvider.kt similarity index 87% rename from tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerCheckboxInputProvider.kt rename to tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerCheckboxInputProvider.kt index ea648570e1b..5be95d7b1a9 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerCheckboxInputProvider.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerCheckboxInputProvider.kt @@ -1,17 +1,17 @@ -package org.dhis2.tracker.ui.input.provider +package org.dhis2.tracker.input.ui.provider import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import org.dhis2.tracker.ui.input.model.TrackerInputModel -import org.dhis2.tracker.ui.input.model.inputState -import org.dhis2.tracker.ui.input.model.supportingText +import org.dhis2.tracker.input.ui.state.TrackerInputUIState +import org.dhis2.tracker.input.ui.state.inputState +import org.dhis2.tracker.input.ui.state.supportingText import org.hisp.dhis.mobile.ui.designsystem.component.CheckBoxData import org.hisp.dhis.mobile.ui.designsystem.component.InputCheckBox import org.hisp.dhis.mobile.ui.designsystem.component.InputStyle @Composable fun TrackerCheckboxInputProvider( - model: TrackerInputModel, + model: TrackerInputUIState, inputStyle: InputStyle, modifier: Modifier, onValueChange: (String?) -> Unit, diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerDateTimeProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerDateTimeProvider.kt similarity index 92% rename from tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerDateTimeProvider.kt rename to tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerDateTimeProvider.kt index 51e7da8dba2..469b469cc28 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerDateTimeProvider.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerDateTimeProvider.kt @@ -1,4 +1,4 @@ -package org.dhis2.tracker.ui.input.provider +package org.dhis2.tracker.input.ui.provider import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -10,10 +10,10 @@ import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.input.TextFieldValue -import org.dhis2.tracker.ui.input.model.TrackerInputModel -import org.dhis2.tracker.ui.input.model.TrackerInputType -import org.dhis2.tracker.ui.input.model.inputState -import org.dhis2.tracker.ui.input.model.supportingText +import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.input.ui.state.TrackerInputUIState +import org.dhis2.tracker.input.ui.state.inputState +import org.dhis2.tracker.input.ui.state.supportingText import org.hisp.dhis.mobile.ui.designsystem.component.DateTimeActionType import org.hisp.dhis.mobile.ui.designsystem.component.InputDateTime import org.hisp.dhis.mobile.ui.designsystem.component.InputStyle @@ -26,7 +26,7 @@ import org.hisp.dhis.mobile.ui.designsystem.component.state.rememberInputDateTim @Composable fun ProvideTrackerDateTimeInput( - model: TrackerInputModel, + model: TrackerInputUIState, inputStyle: InputStyle, onNextClicked: () -> Unit, modifier: Modifier, diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerInputProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt similarity index 77% rename from tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerInputProvider.kt rename to tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt index 467a5b004b2..df64a705398 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerInputProvider.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt @@ -1,4 +1,4 @@ -package org.dhis2.tracker.ui.input.provider +package org.dhis2.tracker.input.ui.provider import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.runtime.Composable @@ -16,11 +16,11 @@ import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.TextFieldValue import org.dhis2.mobile.tracker.resources.Res import org.dhis2.mobile.tracker.resources.custom_intent_launch -import org.dhis2.tracker.ui.input.model.TrackerInputModel -import org.dhis2.tracker.ui.input.model.TrackerInputType -import org.dhis2.tracker.ui.input.model.TrackerInputUiEvent -import org.dhis2.tracker.ui.input.model.inputState -import org.dhis2.tracker.ui.input.model.supportingText +import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.input.ui.action.TrackerInputUiEvent +import org.dhis2.tracker.input.ui.state.TrackerInputUIState +import org.dhis2.tracker.input.ui.state.inputState +import org.dhis2.tracker.input.ui.state.supportingText import org.hisp.dhis.mobile.ui.designsystem.component.CheckBoxData import org.hisp.dhis.mobile.ui.designsystem.component.CustomIntentState import org.hisp.dhis.mobile.ui.designsystem.component.DropdownItem @@ -52,7 +52,7 @@ import org.jetbrains.compose.resources.stringResource @Composable fun TrackerInputProvider( modifier: Modifier = Modifier, - inputModel: TrackerInputModel, + inputModel: TrackerInputUIState, inputStyle: InputStyle, onNextClicked: () -> Unit, onUiEvent: (TrackerInputUiEvent) -> Unit, @@ -93,16 +93,11 @@ fun TrackerInputProvider( inputStyle = inputStyle, inputTextFieldValue = textValue, onValueChanged = { newValue -> - newValue?.let { - if (it.text != inputModel.value) { - onUiEvent( - TrackerInputUiEvent.OnValueChange( - uid = inputModel.uid, - value = it.text.takeIf { text -> text.isNotEmpty() }, - ), - ) - } - } + manageOnValueChange( + newValue = newValue?.text, + inputModel = inputModel, + onUiEvent = onUiEvent, + ) }, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, @@ -120,16 +115,11 @@ fun TrackerInputProvider( inputStyle = inputStyle, inputTextFieldValue = textValue, onValueChanged = { newValue -> - newValue?.let { - if (it.text != inputModel.value) { - onUiEvent( - TrackerInputUiEvent.OnValueChange( - uid = inputModel.uid, - value = it.text.takeIf { text -> text.isNotEmpty() }, - ), - ) - } - } + manageOnValueChange( + newValue = newValue?.text, + inputModel = inputModel, + onUiEvent = onUiEvent, + ) }, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, @@ -147,16 +137,11 @@ fun TrackerInputProvider( inputStyle = inputStyle, inputTextFieldValue = textValue, onValueChanged = { newValue -> - newValue?.let { - if (it.text != inputModel.value) { - onUiEvent( - TrackerInputUiEvent.OnValueChange( - uid = inputModel.uid, - value = it.text.takeIf { text -> text.isNotEmpty() }, - ), - ) - } - } + manageOnValueChange( + newValue = newValue?.text, + inputModel = inputModel, + onUiEvent = onUiEvent, + ) }, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, @@ -175,16 +160,11 @@ fun TrackerInputProvider( inputTextFieldValue = textValue, onEmailActionCLicked = {}, onValueChanged = { newValue -> - newValue?.let { - if (it.text != inputModel.value) { - onUiEvent( - TrackerInputUiEvent.OnValueChange( - uid = inputModel.uid, - value = it.text.takeIf { text -> text.isNotEmpty() }, - ), - ) - } - } + manageOnValueChange( + newValue = newValue?.text, + inputModel = inputModel, + onUiEvent = onUiEvent, + ) }, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, @@ -203,16 +183,11 @@ fun TrackerInputProvider( inputTextFieldValue = textValue, onCallActionClicked = {}, onValueChanged = { newValue -> - newValue?.let { - if (it.text != inputModel.value) { - onUiEvent( - TrackerInputUiEvent.OnValueChange( - uid = inputModel.uid, - value = it.text.takeIf { text -> text.isNotEmpty() }, - ), - ) - } - } + manageOnValueChange( + newValue = newValue?.text, + inputModel = inputModel, + onUiEvent = onUiEvent, + ) }, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, @@ -231,16 +206,11 @@ fun TrackerInputProvider( inputTextFieldValue = textValue, onLinkActionCLicked = {}, onValueChanged = { newValue -> - newValue?.let { - if (it.text != inputModel.value) { - onUiEvent( - TrackerInputUiEvent.OnValueChange( - uid = inputModel.uid, - value = it.text.takeIf { text -> text.isNotEmpty() }, - ), - ) - } - } + manageOnValueChange( + newValue = newValue?.text, + inputModel = inputModel, + onUiEvent = onUiEvent, + ) }, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, @@ -258,16 +228,11 @@ fun TrackerInputProvider( inputStyle = inputStyle, inputTextFieldValue = textValue, onValueChanged = { newValue -> - newValue?.let { - if (it.text != inputModel.value) { - onUiEvent( - TrackerInputUiEvent.OnValueChange( - uid = inputModel.uid, - value = it.text.takeIf { text -> text.isNotEmpty() }, - ), - ) - } - } + manageOnValueChange( + newValue = newValue?.text, + inputModel = inputModel, + onUiEvent = onUiEvent, + ) }, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, @@ -285,16 +250,11 @@ fun TrackerInputProvider( inputStyle = inputStyle, inputTextFieldValue = textValue, onValueChanged = { newValue -> - newValue?.let { - if (it.text != inputModel.value) { - onUiEvent( - TrackerInputUiEvent.OnValueChange( - uid = inputModel.uid, - value = it.text.takeIf { text -> text.isNotEmpty() }, - ), - ) - } - } + manageOnValueChange( + newValue = newValue?.text, + inputModel = inputModel, + onUiEvent = onUiEvent, + ) }, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, @@ -312,16 +272,11 @@ fun TrackerInputProvider( inputStyle = inputStyle, inputTextFieldValue = textValue, onValueChanged = { newValue -> - newValue?.let { - if (it.text != inputModel.value) { - onUiEvent( - TrackerInputUiEvent.OnValueChange( - uid = inputModel.uid, - value = it.text.takeIf { text -> text.isNotEmpty() }, - ), - ) - } - } + manageOnValueChange( + newValue = newValue?.text, + inputModel = inputModel, + onUiEvent = onUiEvent, + ) }, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, @@ -339,16 +294,11 @@ fun TrackerInputProvider( inputStyle = inputStyle, inputTextFieldValue = textValue, onValueChanged = { newValue -> - newValue?.let { - if (it.text != inputModel.value) { - onUiEvent( - TrackerInputUiEvent.OnValueChange( - uid = inputModel.uid, - value = it.text.takeIf { text -> text.isNotEmpty() }, - ), - ) - } - } + manageOnValueChange( + newValue = newValue?.text, + inputModel = inputModel, + onUiEvent = onUiEvent, + ) }, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, @@ -366,16 +316,11 @@ fun TrackerInputProvider( inputStyle = inputStyle, inputTextFieldValue = textValue, onValueChanged = { newValue -> - newValue?.let { - if (it.text != inputModel.value) { - onUiEvent( - TrackerInputUiEvent.OnValueChange( - uid = inputModel.uid, - value = it.text.takeIf { text -> text.isNotEmpty() }, - ), - ) - } - } + manageOnValueChange( + newValue = newValue?.text, + inputModel = inputModel, + onUiEvent = onUiEvent, + ) }, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, @@ -393,16 +338,11 @@ fun TrackerInputProvider( inputStyle = inputStyle, inputTextFieldValue = textValue, onValueChanged = { newValue -> - newValue?.let { - if (it.text != inputModel.value) { - onUiEvent( - TrackerInputUiEvent.OnValueChange( - uid = inputModel.uid, - value = it.text.takeIf { text -> text.isNotEmpty() }, - ), - ) - } - } + manageOnValueChange( + newValue = newValue?.text, + inputModel = inputModel, + onUiEvent = onUiEvent, + ) }, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, @@ -420,16 +360,11 @@ fun TrackerInputProvider( inputStyle = inputStyle, inputTextFieldValue = textValue, onValueChanged = { newValue -> - newValue?.let { - if (it.text != inputModel.value) { - onUiEvent( - TrackerInputUiEvent.OnValueChange( - uid = inputModel.uid, - value = it.text.takeIf { text -> text.isNotEmpty() }, - ), - ) - } - } + manageOnValueChange( + newValue = newValue?.text, + inputModel = inputModel, + onUiEvent = onUiEvent, + ) }, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, @@ -443,11 +378,10 @@ fun TrackerInputProvider( onNextClicked = onNextClicked, modifier = modifierWithFocus, onValueChange = { newValue -> - onUiEvent( - TrackerInputUiEvent.OnValueChange( - uid = inputModel.uid, - value = newValue, - ), + manageOnValueChange( + newValue = newValue, + inputModel = inputModel, + onUiEvent = onUiEvent, ) }, ) @@ -568,16 +502,11 @@ fun TrackerInputProvider( ) }, onValueChanged = { newValue -> - newValue?.let { - if (it.text != inputModel.value) { - onUiEvent( - TrackerInputUiEvent.OnValueChange( - uid = inputModel.uid, - value = it.text.takeIf { text -> text.isNotEmpty() }, - ), - ) - } - } + manageOnValueChange( + newValue = newValue?.text, + inputModel = inputModel, + onUiEvent = onUiEvent, + ) }, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, @@ -602,16 +531,11 @@ fun TrackerInputProvider( ) }, onValueChanged = { newValue -> - newValue?.let { - if (it.text != inputModel.value) { - onUiEvent( - TrackerInputUiEvent.OnValueChange( - uid = inputModel.uid, - value = it.text.takeIf { text -> text.isNotEmpty() }, - ), - ) - } - } + manageOnValueChange( + newValue = newValue?.text, + inputModel = inputModel, + onUiEvent = onUiEvent, + ) }, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, @@ -664,7 +588,7 @@ fun TrackerInputProvider( onUiEvent( TrackerInputUiEvent.OnValueChange( uid = inputModel.uid, - value = if (isChecked) "true" else null, + value = getYesOnlyValue(isChecked), ), ) }, @@ -690,7 +614,7 @@ fun TrackerInputProvider( onUiEvent( TrackerInputUiEvent.OnValueChange( uid = inputModel.uid, - value = if (isChecked) "true" else null, + value = getYesOnlyValue(isChecked), ), ) }, @@ -823,3 +747,22 @@ fun TrackerInputProvider( } } } + +fun manageOnValueChange( + newValue: String?, + inputModel: TrackerInputUIState, + onUiEvent: (TrackerInputUiEvent) -> Unit, +) { + newValue?.let { + if (it != inputModel.value) { + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = it.takeIf { text -> text.isNotEmpty() }, + ), + ) + } + } +} + +private fun getYesOnlyValue(checked: Boolean): String? = if (checked) "true" else null diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerRadioButtonInputProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerRadioButtonInputProvider.kt similarity index 87% rename from tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerRadioButtonInputProvider.kt rename to tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerRadioButtonInputProvider.kt index 7cfcc3fc004..b018a70a60b 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/provider/TrackerRadioButtonInputProvider.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerRadioButtonInputProvider.kt @@ -1,17 +1,17 @@ -package org.dhis2.tracker.ui.input.provider +package org.dhis2.tracker.input.ui.provider import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import org.dhis2.tracker.ui.input.model.TrackerInputModel -import org.dhis2.tracker.ui.input.model.inputState -import org.dhis2.tracker.ui.input.model.supportingText +import org.dhis2.tracker.input.ui.state.TrackerInputUIState +import org.dhis2.tracker.input.ui.state.inputState +import org.dhis2.tracker.input.ui.state.supportingText import org.hisp.dhis.mobile.ui.designsystem.component.InputRadioButton import org.hisp.dhis.mobile.ui.designsystem.component.InputStyle import org.hisp.dhis.mobile.ui.designsystem.component.RadioButtonData @Composable fun TrackerRadioButtonInputProvider( - model: TrackerInputModel, + model: TrackerInputUIState, inputStyle: InputStyle, modifier: Modifier, onValueChange: (String?) -> Unit, diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/model/TrackerInputModel.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerInputUIState.kt similarity index 85% rename from tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/model/TrackerInputModel.kt rename to tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerInputUIState.kt index b27887922d6..7f8c3053412 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/model/TrackerInputModel.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerInputUIState.kt @@ -1,12 +1,13 @@ -package org.dhis2.tracker.ui.input.model +package org.dhis2.tracker.input.ui.state +import org.dhis2.tracker.input.model.TrackerInputType import org.hisp.dhis.mobile.ui.designsystem.component.InputShellState import org.hisp.dhis.mobile.ui.designsystem.component.LegendData import org.hisp.dhis.mobile.ui.designsystem.component.Orientation import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextData import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextState -data class TrackerInputModel( +data class TrackerInputUIState( val uid: String, val label: String, val value: String?, @@ -25,7 +26,7 @@ data class TrackerInputModel( val displayName: String?, ) -fun TrackerInputModel.supportingText(): List? = +fun TrackerInputUIState.supportingText(): List? = listOfNotNull( error?.let { SupportingTextData( @@ -47,7 +48,7 @@ fun TrackerInputModel.supportingText(): List? = }, ).ifEmpty { null } -fun TrackerInputModel.inputState(): InputShellState = +fun TrackerInputUIState.inputState(): InputShellState = when { !editable -> InputShellState.DISABLED error != null -> InputShellState.ERROR diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/model/TrackerOptionSetConfiguration.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerOptionSetConfiguration.kt similarity index 90% rename from tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/model/TrackerOptionSetConfiguration.kt rename to tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerOptionSetConfiguration.kt index 9e47a4864b6..7f2a2917c6a 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/ui/input/model/TrackerOptionSetConfiguration.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerOptionSetConfiguration.kt @@ -1,4 +1,4 @@ -package org.dhis2.tracker.ui.input.model +package org.dhis2.tracker.input.ui.state /** * Configuration for option set fields in tracker inputs. diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepository.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepository.kt new file mode 100644 index 00000000000..c2da3315782 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepository.kt @@ -0,0 +1,26 @@ +package org.dhis2.tracker.search.data + +import androidx.paging.PagingData +import kotlinx.coroutines.flow.Flow +import org.dhis2.tracker.input.ui.state.TrackerOptionItem + +/** + * Repository for fetching option set data. + * Handles pagination and search of options for dropdown/selection inputs. + */ +@Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING") +expect class OptionSetRepository { + /** + * Fetches paginated options for a given option set. + * + * @param optionSetUid The unique identifier of the option set + * @param pageSize Number of items per page + * @param searchQuery Optional search query to filter options + * @return Flow of paginated option items + */ + fun getOptions( + optionSetUid: String, + pageSize: Int = 10, + searchQuery: String? = null, + ): Flow> +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.kt index 8ad69ed4c6e..1ae532b442d 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.kt @@ -1,7 +1,9 @@ package org.dhis2.tracker.search.di +import org.dhis2.tracker.search.domain.FetchOptionSetOptions import org.dhis2.tracker.search.domain.SearchTrackedEntities import org.koin.core.module.Module +import org.koin.core.module.dsl.factoryOf import org.koin.dsl.module /** @@ -26,4 +28,6 @@ val trackerSearchModule = teType = params.get(), ) } + // FetchOptionSetOptions use case + factoryOf(::FetchOptionSetOptions) } diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/FetchOptionSetOptions.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/FetchOptionSetOptions.kt new file mode 100644 index 00000000000..bdc123bf1fc --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/FetchOptionSetOptions.kt @@ -0,0 +1,35 @@ +package org.dhis2.tracker.search.domain + +import androidx.paging.PagingData +import kotlinx.coroutines.flow.Flow +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.tracker.input.ui.state.TrackerOptionItem +import org.dhis2.tracker.search.data.OptionSetRepository + +/** + * Use case for fetching option set options with pagination. + * Coordinates between repository and UI layer. + */ +class FetchOptionSetOptions( + private val optionSetRepository: OptionSetRepository, +) : UseCase>> { + override suspend fun invoke(input: Params): Result>> = + try { + val flow = + optionSetRepository.getOptions( + optionSetUid = input.optionSetUid, + pageSize = input.pageSize, + searchQuery = input.searchQuery, + ) + Result.success(flow) + } catch (e: DomainError) { + Result.failure(e) + } + + data class Params( + val optionSetUid: String, + val pageSize: Int = 10, + val searchQuery: String? = null, + ) +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/TrackedEntitySearchItemResult.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/TrackedEntitySearchItemResult.kt index 3bc4f9bd79b..4daeecc39b6 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/TrackedEntitySearchItemResult.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/TrackedEntitySearchItemResult.kt @@ -1,6 +1,6 @@ package org.dhis2.tracker.search.model -import org.dhis2.tracker.ui.input.model.TrackerInputType +import org.dhis2.tracker.input.model.TrackerInputType import java.util.Date data class TrackedEntitySearchItemResult( diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/provider/ParameterSelectorItemProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/provider/ParameterSelectorItemProvider.kt index 20637114a78..a64ed31ac54 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/provider/ParameterSelectorItemProvider.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/provider/ParameterSelectorItemProvider.kt @@ -6,10 +6,10 @@ import androidx.compose.material.icons.outlined.QrCode2 import androidx.compose.material3.Icon import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import org.dhis2.tracker.ui.input.model.TrackerInputModel -import org.dhis2.tracker.ui.input.model.TrackerInputType -import org.dhis2.tracker.ui.input.model.TrackerInputUiEvent -import org.dhis2.tracker.ui.input.provider.TrackerInputProvider +import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.input.ui.action.TrackerInputUiEvent +import org.dhis2.tracker.input.ui.provider.TrackerInputProvider +import org.dhis2.tracker.input.ui.state.TrackerInputUIState import org.hisp.dhis.mobile.ui.designsystem.component.InputStyle import org.hisp.dhis.mobile.ui.designsystem.component.parameter.model.ParameterSelectorItemModel import org.hisp.dhis.mobile.ui.designsystem.resource.provideDHIS2Icon @@ -17,7 +17,7 @@ import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor @Composable fun provideParameterSelectorItem( - inputModel: TrackerInputModel, + inputModel: TrackerInputUIState, helperText: String, onNextClicked: () -> Unit, onUiEvent: (TrackerInputUiEvent) -> Unit, diff --git a/tracker/src/desktopMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepository.desktop.kt b/tracker/src/desktopMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepository.desktop.kt new file mode 100644 index 00000000000..ae87059733e --- /dev/null +++ b/tracker/src/desktopMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepository.desktop.kt @@ -0,0 +1,22 @@ +package org.dhis2.tracker.search.data + +import androidx.paging.PagingData +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOf +import org.dhis2.tracker.input.ui.state.TrackerOptionItem + +/** + * Desktop stub implementation of OptionSetRepository. + * TODO: Implement when desktop support is added + */ +@Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING") +actual class OptionSetRepository { + actual fun getOptions( + optionSetUid: String, + pageSize: Int, + searchQuery: String?, + ): Flow> { + // Return empty flow for desktop + return flowOf(PagingData.empty()) + } +} From 8372fc82c0c230bcf9f8f11cdb173e4bbd46e4c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Fri, 20 Feb 2026 10:03:48 +0100 Subject: [PATCH 057/260] test: Replaced all awaitIdle() calls with waitForIdle() (#4673) --- .../dhis2/usescases/datasets/DataSetTest.kt | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt index 893f582a233..f9f5e33e751 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt @@ -367,15 +367,15 @@ class DataSetTest : BaseTest() { } } - private suspend fun waitForTableToBeVisible() { - composeTestRule.awaitIdle() + private fun waitForTableToBeVisible() { + composeTestRule.waitForIdle() dataSetRobot { clickOnDataSetAtPosition(0) } tableIsVisible() } - private suspend fun checkTableIsNotEditable() { + private fun checkTableIsNotEditable() { tableIsVisible() composeTestRule.onNodeWithTag("TABLE_SCROLLABLE_COLUMN").printToLog("TABLE_LOG") dataSetTableRobot(composeTestRule) { @@ -385,7 +385,7 @@ class DataSetTest : BaseTest() { } } - private suspend fun checkContentBoxesAreDisplayed() { + private fun checkContentBoxesAreDisplayed() { tableIsVisible() // Check top and bottom content is displayed in initial section dataSetDetailRobot(composeTestRule) { @@ -443,7 +443,7 @@ class DataSetTest : BaseTest() { } } - private suspend fun checkCategoryIsMovedToRow() { + private fun checkCategoryIsMovedToRow() { val cellIdSection8 = "PGRlPlAzakpINVR1NVZDLCA8Y28+RmJMWlMzdWVXYlE6PGNvPg==" val cellId2Section8 = "PGRlPkZRMm84VUJsY3JTLCA8Y28+RmJMWlMzdWVXYlE6PGNvPg==" val cellIdSection16 = "PGRlPkFyUzdWeXVMOTVmLCA8Y28+RmJMWlMzdWVXYlE6PGNvPg==" @@ -554,7 +554,7 @@ class DataSetTest : BaseTest() { } } - private suspend fun checkAutomaticGroupingDisabled() { + private fun checkAutomaticGroupingDisabled() { val table19 = "t3aNCvHsoSn_0" val table219 = "aN8uN5b15YG_1" val table20 = "ck7mRNwGDjP_1" @@ -631,7 +631,7 @@ class DataSetTest : BaseTest() { } } - private suspend fun checkPivotOptions() { + private fun checkPivotOptions() { val table5 = "aN8uN5b15YG" val table23 = "aN8uN5b15YG_1" val cellIdSection5 = "PGNvYz5ET0M3ZW1MenlSaTo8ZGU+TFNKNW1LcHlFdjE=" @@ -700,29 +700,29 @@ class DataSetTest : BaseTest() { } } - private suspend fun tableIsVisible() { - composeTestRule.awaitIdle() + private fun tableIsVisible() { + composeTestRule.waitForIdle() dataSetTableRobot(composeTestRule) { assertTableIsDisplayed() } } - private suspend fun checkImmunizationTableIsDisplayed() { - composeTestRule.awaitIdle() + private fun checkImmunizationTableIsDisplayed() { + composeTestRule.waitForIdle() dataSetTableRobot(composeTestRule) { assertImmunizationTableIsDisplayed() } } - private suspend fun syncButtonIsAvailableStep() { - composeTestRule.awaitIdle() + private fun syncButtonIsAvailableStep() { + composeTestRule.waitForIdle() dataSetTableRobot(composeTestRule) { syncIsAvailable() } } - private suspend fun checkTotals() { - composeTestRule.awaitIdle() + private fun checkTotals() { + composeTestRule.waitForIdle() dataSetTableRobot(composeTestRule) { totalsAreDisplayed( tableId = "dzjKKQq0cSO", @@ -787,14 +787,14 @@ class DataSetTest : BaseTest() { } } - private suspend fun checkIndicatorsStep() { - composeTestRule.awaitIdle() + private fun checkIndicatorsStep() { + composeTestRule.waitForIdle() dataSetTableRobot(composeTestRule) { indicatorTableIsDisplayed() } } - private suspend fun reenterDataSetToCheckValueSavedStep() { + private fun reenterDataSetToCheckValueSavedStep() { val cell00Id = "PGRlPnM0Nm01TVMwaHh1Ojxjb2M+UHJsdDBDMVJGMHM=" dataSetTableRobot(composeTestRule) { From 387070c5359e2facecd9652f8366b8401b78b7f8 Mon Sep 17 00:00:00 2001 From: Xavier Molloy Date: Fri, 20 Feb 2026 11:41:04 +0100 Subject: [PATCH 058/260] feat: [ANDROAPP-7470] - II - Fetch parameters use case [skip size] (#4669) * feat: [ANDROAPP-7470] Fetch Search parameters use case * feat: [ANDROAPP-7470] small adaptation * feat: [ANDROAPP-7470] Adapt to new enum values in input type * feat: [ANDROAPP-7470] code review comments * feat: [ANDROAPP-7470] code review comments * feat: [ANDROAPP-7470] Remove todo, make methods internal in Fetch Search parameters usecase * feat: [ANDROAPP-7470] Add tests for fetch parameters usecase (#4670) * feat: [ANDROAPP-7470] Fetch Search parameters use case * feat: [ANDROAPP-7470] small adaptation * feat: [ANDROAPP-7470] Adapt to new enum values in input type * feat: [ANDROAPP-7470] code review comments * feat: [ANDROAPP-7470] code review comments * feat: [ANDROAPP-7470] Remove todo, make methods internal in Fetch Search parameters usecase * feat: [ANDROAPP-7470] Add tests for fetch parameters usecase --- .../mapper/ParameterInputModelMapper.kt | 20 +- .../mapper/ParameterInputModelMapperTest.kt | 14 +- ...omainToSDKTrackedEntitySearchItemMapper.kt | 6 +- .../data/SearchParametersRepositoryImpl.kt | 297 ++++++++++++++++ .../data/TrackedEntitySearchItemMapper.kt | 2 +- .../tracker/input/model/TrackerInputType.kt | 6 +- .../input/ui/provider/TrackerInputProvider.kt | 4 +- .../search/data/SearchParametersRepository.kt | 9 + .../search/domain/FetchSearchParameters.kt | 42 +++ .../search/model/FetchSearchParametersData.kt | 6 + .../tracker/search/model/SearchOperator.kt | 8 + .../search/model/SearchParameterModel.kt | 14 + .../domain/FetchSearchParametersTest.kt | 335 ++++++++++++++++++ 13 files changed, 738 insertions(+), 25 deletions(-) create mode 100644 tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchParametersRepositoryImpl.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/SearchParametersRepository.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/FetchSearchParameters.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/FetchSearchParametersData.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchOperator.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchParameterModel.kt create mode 100644 tracker/src/commonTest/kotlin/org/dhis2/tracker/search/domain/FetchSearchParametersTest.kt diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapper.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapper.kt index e49883292b3..c72fa49130a 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapper.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapper.kt @@ -103,13 +103,10 @@ private fun org.dhis2.form.model.OptionSetConfiguration.toTrackerOptionSetConfig internal fun getInputTypeForOptionSetByRenderingType(renderingType: UiRenderType?): TrackerInputType = when (renderingType) { - UiRenderType.HORIZONTAL_RADIOBUTTONS, - UiRenderType.VERTICAL_RADIOBUTTONS, - -> TrackerInputType.RADIO_BUTTON - - UiRenderType.HORIZONTAL_CHECKBOXES, - UiRenderType.VERTICAL_CHECKBOXES, - -> TrackerInputType.CHECKBOX + UiRenderType.HORIZONTAL_CHECKBOXES -> TrackerInputType.HORIZONTAL_CHECKBOXES + UiRenderType.VERTICAL_CHECKBOXES -> TrackerInputType.VERTICAL_CHECKBOXES + UiRenderType.HORIZONTAL_RADIOBUTTONS -> TrackerInputType.HORIZONTAL_RADIOBUTTONS + UiRenderType.VERTICAL_RADIOBUTTONS -> TrackerInputType.VERTICAL_RADIOBUTTONS UiRenderType.MATRIX -> TrackerInputType.MATRIX @@ -142,11 +139,12 @@ internal fun getInputTypeByValueType( ValueType.EMAIL -> TrackerInputType.EMAIL ValueType.BOOLEAN -> { when (renderingType) { - UiRenderType.HORIZONTAL_CHECKBOXES, - UiRenderType.VERTICAL_CHECKBOXES, - -> TrackerInputType.CHECKBOX + UiRenderType.HORIZONTAL_CHECKBOXES -> TrackerInputType.HORIZONTAL_CHECKBOXES + UiRenderType.VERTICAL_CHECKBOXES -> TrackerInputType.VERTICAL_CHECKBOXES + UiRenderType.HORIZONTAL_RADIOBUTTONS -> TrackerInputType.HORIZONTAL_RADIOBUTTONS + UiRenderType.VERTICAL_RADIOBUTTONS -> TrackerInputType.VERTICAL_RADIOBUTTONS - else -> TrackerInputType.RADIO_BUTTON + else -> TrackerInputType.VERTICAL_RADIOBUTTONS } } diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapperTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapperTest.kt index 7196a8f808d..e19f109a773 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapperTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapperTest.kt @@ -26,25 +26,25 @@ class ParameterInputModelMapperTest { @Test fun `should return RADIO_BUTTON for horizontal radio buttons rendering type`() { val result = getInputTypeForOptionSetByRenderingType(UiRenderType.HORIZONTAL_RADIOBUTTONS) - assertEquals(TrackerInputType.RADIO_BUTTON, result) + assertEquals(TrackerInputType.HORIZONTAL_RADIOBUTTONS, result) } @Test fun `should return RADIO_BUTTON for vertical radio buttons rendering type`() { val result = getInputTypeForOptionSetByRenderingType(UiRenderType.VERTICAL_RADIOBUTTONS) - assertEquals(TrackerInputType.RADIO_BUTTON, result) + assertEquals(TrackerInputType.VERTICAL_RADIOBUTTONS, result) } @Test fun `should return CHECKBOX for horizontal checkboxes rendering type`() { val result = getInputTypeForOptionSetByRenderingType(UiRenderType.HORIZONTAL_CHECKBOXES) - assertEquals(TrackerInputType.CHECKBOX, result) + assertEquals(TrackerInputType.HORIZONTAL_CHECKBOXES, result) } @Test fun `should return CHECKBOX for vertical checkboxes rendering type`() { val result = getInputTypeForOptionSetByRenderingType(UiRenderType.VERTICAL_CHECKBOXES) - assertEquals(TrackerInputType.CHECKBOX, result) + assertEquals(TrackerInputType.VERTICAL_CHECKBOXES, result) } @Test @@ -156,19 +156,19 @@ class ParameterInputModelMapperTest { @Test fun `should return RADIO_BUTTON for BOOLEAN value type with default rendering`() { val result = getInputTypeByValueType(ValueType.BOOLEAN, null) - assertEquals(TrackerInputType.RADIO_BUTTON, result) + assertEquals(TrackerInputType.VERTICAL_RADIOBUTTONS, result) } @Test fun `should return CHECKBOX for BOOLEAN value type with horizontal checkboxes rendering`() { val result = getInputTypeByValueType(ValueType.BOOLEAN, UiRenderType.HORIZONTAL_CHECKBOXES) - assertEquals(TrackerInputType.CHECKBOX, result) + assertEquals(TrackerInputType.HORIZONTAL_CHECKBOXES, result) } @Test fun `should return CHECKBOX for BOOLEAN value type with vertical checkboxes rendering`() { val result = getInputTypeByValueType(ValueType.BOOLEAN, UiRenderType.VERTICAL_CHECKBOXES) - assertEquals(TrackerInputType.CHECKBOX, result) + assertEquals(TrackerInputType.VERTICAL_CHECKBOXES, result) } // Test getInputTypeByValueType for TRUE_ONLY diff --git a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/DomainToSDKTrackedEntitySearchItemMapper.kt b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/DomainToSDKTrackedEntitySearchItemMapper.kt index a37b00a6968..fbeb41ddb5e 100644 --- a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/DomainToSDKTrackedEntitySearchItemMapper.kt +++ b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/DomainToSDKTrackedEntitySearchItemMapper.kt @@ -105,8 +105,10 @@ private fun TrackerInputType.toSDKValueType(): ValueType = TrackerInputType.DATE_TIME -> ValueType.DATETIME TrackerInputType.DATE -> ValueType.DATE TrackerInputType.TIME -> ValueType.TIME - TrackerInputType.CHECKBOX, - TrackerInputType.RADIO_BUTTON, + TrackerInputType.HORIZONTAL_CHECKBOXES, + TrackerInputType.VERTICAL_CHECKBOXES, + TrackerInputType.HORIZONTAL_RADIOBUTTONS, + TrackerInputType.VERTICAL_RADIOBUTTONS, -> ValueType.BOOLEAN TrackerInputType.YES_ONLY_SWITCH, TrackerInputType.YES_ONLY_CHECKBOX, diff --git a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchParametersRepositoryImpl.kt b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchParametersRepositoryImpl.kt new file mode 100644 index 00000000000..f09c06d7074 --- /dev/null +++ b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchParametersRepositoryImpl.kt @@ -0,0 +1,297 @@ +package org.dhis2.tracker.search.data + +import org.dhis2.mobile.commons.customintents.CustomIntentRepository +import org.dhis2.mobile.commons.error.DomainErrorMapper +import org.dhis2.mobile.commons.model.CustomIntentActionTypeModel +import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.search.model.SearchOperator +import org.dhis2.tracker.search.model.SearchParameterModel +import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.arch.repositories.scope.RepositoryScope +import org.hisp.dhis.android.core.arch.repositories.scope.internal.TrackerSearchOperator +import org.hisp.dhis.android.core.common.ValueType +import org.hisp.dhis.android.core.common.ValueTypeRenderingType +import org.hisp.dhis.android.core.maintenance.D2Error +import org.hisp.dhis.android.core.program.ProgramTrackedEntityAttribute +import org.hisp.dhis.android.core.trackedentity.TrackedEntityAttribute +import org.hisp.dhis.android.core.trackedentity.TrackedEntityTypeAttribute + +class SearchParametersRepositoryImpl( + val d2: D2, + val customIntentRepository: CustomIntentRepository, + val domainErrorMapper: DomainErrorMapper, +) : SearchParametersRepository { + override suspend fun getSearchParametersByProgram(programUid: String): List = + try { + // this is the attribute and its properties related to a specific program + val programTrackedEntityAttributes = + getSearchableProgramTrackedEntityAttributes(programUid) + programTrackedEntityAttributes.mapNotNull { programTrackedEntityAttribute -> + + // Now, we get the TrackedEntityAttribute with all the info + val trackedEntityAttribute = + getTrackedEntityAttributeByProgram(programTrackedEntityAttribute) + trackedEntityAttribute?.let { attribute -> + val renderingType = programTrackedEntityAttribute.renderType()?.mobile()?.type() + val customIntent = + customIntentRepository.getCustomIntent( + attribute.uid(), + orgUnitUid = null, + actionType = CustomIntentActionTypeModel.SEARCH, + ) + + SearchParameterModel( + uid = attribute.uid(), + label = attribute.displayFormName() ?: "", + inputType = + getInputType( + attribute = attribute, + isCustomIntent = customIntent != null, + valueTypeRenderingType = renderingType, + ), + optionSet = attribute.optionSet()?.uid(), + customIntentUid = customIntent?.uid, + minCharactersToSearch = attribute.minCharactersToSearch(), + searchOperator = getSearchOperator(attribute), + isUnique = attribute.unique() ?: false, + ) + } + } + } catch (d2Error: D2Error) { + throw domainErrorMapper.mapToDomainError(d2Error) + } + + override suspend fun getSearchParametersByTrackedEntityType(trackedEntityTypeUid: String): List = + try { + val trackedEntityAttributes = + getTrackedEntityAttributesByTrackedEntityType(trackedEntityTypeUid) + trackedEntityAttributes.mapNotNull { trackedEntityTypeAttribute -> + // Now, we get the TrackedEntityAttribute with all the info + val trackedEntityAttribute = + getTrackedEntityAttributeByTrackedEntityType(trackedEntityTypeAttribute) + trackedEntityAttribute?.let { attribute -> + SearchParameterModel( + uid = attribute.uid(), + label = attribute.displayFormName() ?: "", + inputType = + getInputType( + attribute = attribute, + isCustomIntent = false, + valueTypeRenderingType = null, + ), + optionSet = attribute.optionSet()?.uid(), + customIntentUid = null, + minCharactersToSearch = attribute.minCharactersToSearch(), + searchOperator = getSearchOperator(attribute), + isUnique = attribute.unique() ?: false, + ) + } + } + } catch (d2Error: D2Error) { + throw domainErrorMapper.mapToDomainError(d2Error) + } + + private fun getTrackedEntityAttributeByTrackedEntityType( + trackedEntityTypeAttribute: TrackedEntityTypeAttribute, + ): TrackedEntityAttribute? = + trackedEntityTypeAttribute.trackedEntityAttribute()?.uid()?.let { uid -> + d2 + .trackedEntityModule() + .trackedEntityAttributes() + .uid(uid) + .blockingGet() + } + + private fun getTrackedEntityAttributesByTrackedEntityType(trackedEntityTypeUid: String): List = + d2 + .trackedEntityModule() + .trackedEntityTypeAttributes() + .byTrackedEntityTypeUid() + .eq(trackedEntityTypeUid) + .bySearchable() + .isTrue + .blockingGet() + + private fun getTrackedEntityAttributeByProgram(programTrackedEntityAttribute: ProgramTrackedEntityAttribute): TrackedEntityAttribute? = + programTrackedEntityAttribute.trackedEntityAttribute()?.uid()?.let { uid -> + d2 + .trackedEntityModule() + .trackedEntityAttributes() + .uid(uid) + .blockingGet() + } + + private fun getSearchableProgramTrackedEntityAttributes(programUid: String): List = + d2 + .programModule() + .programTrackedEntityAttributes() + .withRenderType() + .byProgram() + .eq(programUid) + .orderBySortOrder(RepositoryScope.OrderByDirection.ASC) + .blockingGet() + .filter { programAttribute -> + val isSearchable = programAttribute.searchable()!! + val isUnique = + d2 + .trackedEntityModule() + .trackedEntityAttributes() + .uid(programAttribute.trackedEntityAttribute()!!.uid()) + .blockingGet() + ?.unique() == true + isSearchable || isUnique + } + + private fun getInputType( + attribute: TrackedEntityAttribute, + isCustomIntent: Boolean, + valueTypeRenderingType: ValueTypeRenderingType?, + ): TrackerInputType = + when { + attribute.optionSet()?.uid() != null && attribute.valueType() != ValueType.MULTI_TEXT + -> getInputTypeForOptionSetByRenderingType(valueTypeRenderingType) + + isCustomIntent -> TrackerInputType.CUSTOM_INTENT + + else -> getInputTypeByValueType(attribute.valueType(), valueTypeRenderingType) + } + + private fun getInputTypeByValueType( + valueType: ValueType?, + valueTypeRenderingType: ValueTypeRenderingType?, + ): TrackerInputType = + when (valueType) { + ValueType.TEXT -> { + when (valueTypeRenderingType) { + ValueTypeRenderingType.QR_CODE, ValueTypeRenderingType.GS1_DATAMATRIX -> TrackerInputType.QR_CODE + ValueTypeRenderingType.BAR_CODE -> TrackerInputType.BAR_CODE + else -> TrackerInputType.TEXT + } + } + + ValueType.INTEGER_POSITIVE -> TrackerInputType.INTEGER_POSITIVE + ValueType.INTEGER_ZERO_OR_POSITIVE -> TrackerInputType.INTEGER_ZERO_OR_POSITIVE + ValueType.PERCENTAGE -> TrackerInputType.PERCENTAGE + ValueType.NUMBER -> TrackerInputType.NUMBER + ValueType.INTEGER_NEGATIVE -> TrackerInputType.INTEGER_NEGATIVE + ValueType.LONG_TEXT -> TrackerInputType.LONG_TEXT + ValueType.INTEGER -> TrackerInputType.INTEGER + ValueType.ORGANISATION_UNIT -> TrackerInputType.ORGANISATION_UNIT + ValueType.EMAIL -> TrackerInputType.EMAIL + ValueType.BOOLEAN -> { + when (valueTypeRenderingType) { + ValueTypeRenderingType.HORIZONTAL_CHECKBOXES -> TrackerInputType.HORIZONTAL_CHECKBOXES + ValueTypeRenderingType.VERTICAL_CHECKBOXES -> TrackerInputType.VERTICAL_CHECKBOXES + ValueTypeRenderingType.HORIZONTAL_RADIOBUTTONS -> TrackerInputType.HORIZONTAL_RADIOBUTTONS + else -> TrackerInputType.VERTICAL_RADIOBUTTONS + } + } + + ValueType.TRUE_ONLY -> { + when (valueTypeRenderingType) { + ValueTypeRenderingType.TOGGLE -> TrackerInputType.YES_ONLY_SWITCH + else -> TrackerInputType.YES_ONLY_CHECKBOX + } + } + + ValueType.PHONE_NUMBER -> TrackerInputType.PHONE_NUMBER + ValueType.DATE -> TrackerInputType.DATE + ValueType.DATETIME -> TrackerInputType.DATE_TIME + ValueType.TIME -> TrackerInputType.TIME + + ValueType.AGE -> TrackerInputType.AGE + ValueType.MULTI_TEXT -> TrackerInputType.MULTI_SELECTION + + ValueType.USERNAME, + ValueType.LETTER, + ValueType.UNIT_INTERVAL, + ValueType.TRACKER_ASSOCIATE, + ValueType.REFERENCE, + ValueType.COORDINATE, + ValueType.IMAGE, + ValueType.FILE_RESOURCE, + ValueType.GEOJSON, + ValueType.URL, + null, + -> TrackerInputType.NOT_SUPPORTED + } + + private fun getInputTypeForOptionSetByRenderingType(valueTypeRenderingType: ValueTypeRenderingType?): TrackerInputType = + when (valueTypeRenderingType) { + ValueTypeRenderingType.HORIZONTAL_RADIOBUTTONS -> TrackerInputType.HORIZONTAL_RADIOBUTTONS + ValueTypeRenderingType.VERTICAL_RADIOBUTTONS -> TrackerInputType.VERTICAL_RADIOBUTTONS + ValueTypeRenderingType.HORIZONTAL_CHECKBOXES -> TrackerInputType.HORIZONTAL_CHECKBOXES + ValueTypeRenderingType.VERTICAL_CHECKBOXES -> TrackerInputType.VERTICAL_CHECKBOXES + else -> TrackerInputType.DROPDOWN + } + + private fun getSearchOperator(attribute: TrackedEntityAttribute): SearchOperator? { + val mainOperators = listOf(SearchOperator.LIKE, SearchOperator.SW, SearchOperator.EQ) + val blockedOperators = + attribute + .blockedSearchOperators() + ?.mapNotNull { sdkOperator -> + sdkOperator.toSearchOperator() + } ?: emptyList() + val preferredOperator: SearchOperator? = + attribute.preferredSearchOperator()?.toSearchOperator() + val valueType = attribute.valueType() + val hasOptionSet = attribute.optionSet() != null + val isUnique = attribute.unique() == true + + val alwaysEqValueTypes = + listOf( + ValueType.BOOLEAN, + ValueType.TRUE_ONLY, + ValueType.AGE, + ValueType.ORGANISATION_UNIT, + ) + + val preferredOperatorValueTypes = + listOf( + ValueType.NUMBER, + ValueType.INTEGER, + ValueType.INTEGER_POSITIVE, + ValueType.INTEGER_NEGATIVE, + ValueType.INTEGER_ZERO_OR_POSITIVE, + ValueType.DATE, + ValueType.DATETIME, + ValueType.TIME, + ValueType.TEXT, + ValueType.LONG_TEXT, + ValueType.EMAIL, + ValueType.PHONE_NUMBER, + ValueType.PERCENTAGE, + ) + + return when { + isUnique || + (hasOptionSet && valueType != ValueType.MULTI_TEXT) || + valueType in alwaysEqValueTypes -> { + SearchOperator.EQ + } + + valueType == ValueType.MULTI_TEXT -> { + mainOperators.firstOrNull { it !in blockedOperators } + } + + valueType in preferredOperatorValueTypes -> { + if (preferredOperator != null && preferredOperator !in blockedOperators) { + preferredOperator + } else { + mainOperators.firstOrNull { it !in blockedOperators } + } + } + + else -> null + } + } + + private fun TrackerSearchOperator.toSearchOperator() = + when (this) { + TrackerSearchOperator.LIKE -> SearchOperator.LIKE + TrackerSearchOperator.SW -> SearchOperator.SW + TrackerSearchOperator.EW -> SearchOperator.EW + TrackerSearchOperator.EQ -> SearchOperator.EQ + } +} diff --git a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/TrackedEntitySearchItemMapper.kt b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/TrackedEntitySearchItemMapper.kt index eb05207c5b2..6f61deeb5b7 100644 --- a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/TrackedEntitySearchItemMapper.kt +++ b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/TrackedEntitySearchItemMapper.kt @@ -108,7 +108,7 @@ private fun ValueType.toTrackerInputType(): TrackerInputType = ValueType.INTEGER_POSITIVE -> TrackerInputType.INTEGER_POSITIVE ValueType.INTEGER_NEGATIVE -> TrackerInputType.INTEGER_NEGATIVE ValueType.INTEGER_ZERO_OR_POSITIVE -> TrackerInputType.INTEGER_ZERO_OR_POSITIVE - ValueType.BOOLEAN -> TrackerInputType.CHECKBOX + ValueType.BOOLEAN -> TrackerInputType.HORIZONTAL_RADIOBUTTONS ValueType.TRUE_ONLY -> TrackerInputType.YES_ONLY_CHECKBOX ValueType.DATE -> TrackerInputType.DATE ValueType.DATETIME -> TrackerInputType.DATE_TIME diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/model/TrackerInputType.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/model/TrackerInputType.kt index 02b819fb954..a8debd148c1 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/model/TrackerInputType.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/model/TrackerInputType.kt @@ -19,8 +19,10 @@ enum class TrackerInputType { MULTI_SELECTION, QR_CODE, BAR_CODE, - CHECKBOX, - RADIO_BUTTON, + HORIZONTAL_CHECKBOXES, + VERTICAL_CHECKBOXES, + HORIZONTAL_RADIOBUTTONS, + VERTICAL_RADIOBUTTONS, YES_ONLY_SWITCH, YES_ONLY_CHECKBOX, DATE_TIME, diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt index df64a705398..ed1d1fad925 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt @@ -542,7 +542,7 @@ fun TrackerInputProvider( ) } - TrackerInputType.CHECKBOX -> { + TrackerInputType.HORIZONTAL_CHECKBOXES, TrackerInputType.VERTICAL_CHECKBOXES -> { TrackerCheckboxInputProvider( model = inputModel, inputStyle = inputStyle, @@ -558,7 +558,7 @@ fun TrackerInputProvider( ) } - TrackerInputType.RADIO_BUTTON -> { + TrackerInputType.HORIZONTAL_RADIOBUTTONS, TrackerInputType.VERTICAL_RADIOBUTTONS -> { TrackerRadioButtonInputProvider( model = inputModel, inputStyle = inputStyle, diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/SearchParametersRepository.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/SearchParametersRepository.kt new file mode 100644 index 00000000000..5b13e398794 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/SearchParametersRepository.kt @@ -0,0 +1,9 @@ +package org.dhis2.tracker.search.data + +import org.dhis2.tracker.search.model.SearchParameterModel + +interface SearchParametersRepository { + suspend fun getSearchParametersByProgram(programUid: String): List + + suspend fun getSearchParametersByTrackedEntityType(trackedEntityTypeUid: String): List +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/FetchSearchParameters.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/FetchSearchParameters.kt new file mode 100644 index 00000000000..15995134fca --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/FetchSearchParameters.kt @@ -0,0 +1,42 @@ +package org.dhis2.tracker.search.domain + +import kotlinx.coroutines.withContext +import org.dhis2.mobile.commons.coroutine.Dispatcher +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.search.data.SearchParametersRepository +import org.dhis2.tracker.search.model.FetchSearchParametersData +import org.dhis2.tracker.search.model.SearchParameterModel + +class FetchSearchParameters( + val dispatcher: Dispatcher, + val repository: SearchParametersRepository, +) : UseCase> { + override suspend fun invoke(input: FetchSearchParametersData): Result> = + withContext(dispatcher.io) { + try { + val searchParameters = + input.programUid?.let { + repository.getSearchParametersByProgram(it) + } ?: repository.getSearchParametersByTrackedEntityType(input.teiTypeUid) + + Result.success(sortSearchParameters(searchParameters)) + } catch (e: DomainError) { + Result.failure(e) + } + } + + // Sort parameters to list first QR or BarCode uniques, then QR or BarCode and then remaining uniques + internal fun sortSearchParameters(parameters: List): List = + parameters.sortedWith( + compareByDescending { + isQrCodeOrBarCode(it.inputType) && it.isUnique + }.thenByDescending { + isQrCodeOrBarCode(it.inputType) + }.thenByDescending { it.isUnique }, + ) + + internal fun isQrCodeOrBarCode(inputType: TrackerInputType?): Boolean = + inputType == TrackerInputType.QR_CODE || inputType == TrackerInputType.BAR_CODE +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/FetchSearchParametersData.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/FetchSearchParametersData.kt new file mode 100644 index 00000000000..7e09670f911 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/FetchSearchParametersData.kt @@ -0,0 +1,6 @@ +package org.dhis2.tracker.search.model + +data class FetchSearchParametersData( + val teiTypeUid: String, + val programUid: String? = null, +) diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchOperator.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchOperator.kt new file mode 100644 index 00000000000..7f886bd1054 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchOperator.kt @@ -0,0 +1,8 @@ +package org.dhis2.tracker.search.model + +enum class SearchOperator { + LIKE, + SW, + EW, + EQ, +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchParameterModel.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchParameterModel.kt new file mode 100644 index 00000000000..83f5a98dfba --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchParameterModel.kt @@ -0,0 +1,14 @@ +package org.dhis2.tracker.search.model + +import org.dhis2.tracker.input.model.TrackerInputType + +data class SearchParameterModel( + val uid: String, + val label: String, + val inputType: TrackerInputType, + val optionSet: String?, + val customIntentUid: String? = null, + val minCharactersToSearch: Int?, + val searchOperator: SearchOperator?, + val isUnique: Boolean, +) diff --git a/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/domain/FetchSearchParametersTest.kt b/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/domain/FetchSearchParametersTest.kt new file mode 100644 index 00000000000..e0fdab3c52a --- /dev/null +++ b/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/domain/FetchSearchParametersTest.kt @@ -0,0 +1,335 @@ +package org.dhis2.tracker.search.domain + +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.runTest +import org.dhis2.mobile.commons.coroutine.Dispatcher +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.search.data.SearchParametersRepository +import org.dhis2.tracker.search.model.FetchSearchParametersData +import org.dhis2.tracker.search.model.SearchOperator +import org.dhis2.tracker.search.model.SearchParameterModel +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever + +class FetchSearchParametersTest { + private lateinit var useCase: FetchSearchParameters + + private val repository: SearchParametersRepository = mock() + + @OptIn(ExperimentalCoroutinesApi::class) + private val testDispatcher = UnconfinedTestDispatcher() + private val dispatcher = + Dispatcher( + io = testDispatcher, + main = Dispatchers.Unconfined, + default = Dispatchers.Unconfined, + ) + + @Before + fun setup() { + useCase = + FetchSearchParameters( + dispatcher = dispatcher, + repository = repository, + ) + } + + @Test + fun `invoke should return sorted parameters for program`() = + runTest { + // Given + val programUid = "programUid123" + val teiTypeUid = "teiTypeUid123" + val input = FetchSearchParametersData(teiTypeUid = teiTypeUid, programUid = programUid) + + val parameters = + listOf( + createSearchParameter("param1", TrackerInputType.TEXT, isUnique = false), + createSearchParameter("param2", TrackerInputType.QR_CODE, isUnique = true), + createSearchParameter("param3", TrackerInputType.BAR_CODE, isUnique = false), + ) + + whenever(repository.getSearchParametersByProgram(programUid)) doReturn parameters + + // When + val result = useCase.invoke(input) + + // Then + assertTrue(result.isSuccess) + verify(repository).getSearchParametersByProgram(programUid) + + val sortedParameters = result.getOrNull() + assertEquals(3, sortedParameters?.size) + // QR_CODE unique should be first + assertEquals("param2", sortedParameters?.get(0)?.uid) + assertEquals(TrackerInputType.QR_CODE, sortedParameters?.get(0)?.inputType) + assertTrue(sortedParameters?.get(0)?.isUnique == true) + } + + @Test + fun `invoke should return sorted parameters for tracked entity type when no program`() = + runTest { + // Given + val teiTypeUid = "teiTypeUid123" + val input = FetchSearchParametersData(teiTypeUid = teiTypeUid, programUid = null) + + val parameters = + listOf( + createSearchParameter("param1", TrackerInputType.TEXT, isUnique = true), + createSearchParameter("param2", TrackerInputType.EMAIL, isUnique = false), + ) + + whenever(repository.getSearchParametersByTrackedEntityType(teiTypeUid)) doReturn parameters + + // When + val result = useCase.invoke(input) + + // Then + assertTrue(result.isSuccess) + verify(repository).getSearchParametersByTrackedEntityType(teiTypeUid) + + val sortedParameters = result.getOrNull() + assertEquals(2, sortedParameters?.size) + } + + @Test + fun `invoke should return failure when repository throws DomainError`() = + runTest { + // Given + val teiTypeUid = "teiTypeUid123" + val input = FetchSearchParametersData(teiTypeUid = teiTypeUid, programUid = null) + val domainError = DomainError.UnexpectedError("Test error") + + whenever(repository.getSearchParametersByTrackedEntityType(teiTypeUid)).thenAnswer { throw domainError } + + val result = useCase.invoke(input) + + // Then + assertTrue(result.isFailure) + assertEquals(domainError, result.exceptionOrNull()) + } + + @Test + fun `sortSearchParameters should prioritize QR and BarCode unique parameters`() { + // Given + val parameters = + listOf( + createSearchParameter("text1", TrackerInputType.TEXT, isUnique = false), + createSearchParameter("qr1", TrackerInputType.QR_CODE, isUnique = true), + createSearchParameter("text2", TrackerInputType.TEXT, isUnique = true), + createSearchParameter("bar1", TrackerInputType.BAR_CODE, isUnique = true), + createSearchParameter("qr2", TrackerInputType.QR_CODE, isUnique = false), + ) + + // When + val sorted = useCase.sortSearchParameters(parameters) + + // Then + assertEquals(5, sorted.size) + // First two should be QR_CODE or BAR_CODE with unique + assertTrue(useCase.isQrCodeOrBarCode(sorted[0].inputType) && sorted[0].isUnique) + assertTrue(useCase.isQrCodeOrBarCode(sorted[1].inputType) && sorted[1].isUnique) + // Third should be QR_CODE without unique + assertTrue(useCase.isQrCodeOrBarCode(sorted[2].inputType)) + // Fourth should be text with unique + assertEquals(TrackerInputType.TEXT, sorted[3].inputType) + assertTrue(sorted[3].isUnique) + // Last should be text without unique + assertEquals(TrackerInputType.TEXT, sorted[4].inputType) + assertFalse(sorted[4].isUnique) + } + + @Test + fun `sortSearchParameters should handle empty list`() { + // Given + val parameters = emptyList() + + // When + val sorted = useCase.sortSearchParameters(parameters) + + // Then + assertTrue(sorted.isEmpty()) + } + + @Test + fun `sortSearchParameters should handle list with only non-QR-BarCode parameters`() { + // Given + val parameters = + listOf( + createSearchParameter("text1", TrackerInputType.TEXT, isUnique = false), + createSearchParameter("email1", TrackerInputType.EMAIL, isUnique = true), + createSearchParameter("number1", TrackerInputType.NUMBER, isUnique = false), + ) + + // When + val sorted = useCase.sortSearchParameters(parameters) + + // Then + assertEquals(3, sorted.size) + // Unique should come before non-unique + assertTrue(sorted[0].isUnique) + assertEquals("email1", sorted[0].uid) + assertFalse(sorted[1].isUnique) + assertFalse(sorted[2].isUnique) + } + + @Test + fun `sortSearchParameters should handle list with only QR and BarCode parameters`() { + // Given + val parameters = + listOf( + createSearchParameter("qr1", TrackerInputType.QR_CODE, isUnique = false), + createSearchParameter("bar1", TrackerInputType.BAR_CODE, isUnique = true), + createSearchParameter("qr2", TrackerInputType.QR_CODE, isUnique = true), + createSearchParameter("bar2", TrackerInputType.BAR_CODE, isUnique = false), + ) + + // When + val sorted = useCase.sortSearchParameters(parameters) + + // Then + assertEquals(4, sorted.size) + // First two should be unique QR or BarCode + assertTrue(sorted[0].isUnique) + assertTrue(sorted[1].isUnique) + // Last two should be non-unique QR or BarCode + assertFalse(sorted[2].isUnique) + assertFalse(sorted[3].isUnique) + } + + @Test + fun `isQrCodeOrBarCode should return true for QR_CODE`() { + // When + val result = useCase.isQrCodeOrBarCode(TrackerInputType.QR_CODE) + + // Then + assertTrue(result) + } + + @Test + fun `isQrCodeOrBarCode should return true for BAR_CODE`() { + // When + val result = useCase.isQrCodeOrBarCode(TrackerInputType.BAR_CODE) + + // Then + assertTrue(result) + } + + @Test + fun `isQrCodeOrBarCode should return false for TEXT`() { + // When + val result = useCase.isQrCodeOrBarCode(TrackerInputType.TEXT) + + // Then + assertFalse(result) + } + + @Test + fun `isQrCodeOrBarCode should return false for null`() { + // When + val result = useCase.isQrCodeOrBarCode(null) + + // Then + assertFalse(result) + } + + @Test + fun `isQrCodeOrBarCode should return false for other input types`() { + // Test various other input types + assertFalse(useCase.isQrCodeOrBarCode(TrackerInputType.EMAIL)) + assertFalse(useCase.isQrCodeOrBarCode(TrackerInputType.NUMBER)) + assertFalse(useCase.isQrCodeOrBarCode(TrackerInputType.DATE)) + assertFalse(useCase.isQrCodeOrBarCode(TrackerInputType.DATE_TIME)) + assertFalse(useCase.isQrCodeOrBarCode(TrackerInputType.PHONE_NUMBER)) + assertFalse(useCase.isQrCodeOrBarCode(TrackerInputType.ORGANISATION_UNIT)) + } + + @Test + fun `sortSearchParameters should maintain stable order for equal priority items`() { + // Given - multiple items with same priority + val parameters = + listOf( + createSearchParameter("text1", TrackerInputType.TEXT, isUnique = false), + createSearchParameter("text2", TrackerInputType.TEXT, isUnique = false), + createSearchParameter("text3", TrackerInputType.TEXT, isUnique = false), + ) + + // When + val sorted = useCase.sortSearchParameters(parameters) + + // Then - order should be maintained + assertEquals(3, sorted.size) + assertEquals("text1", sorted[0].uid) + assertEquals("text2", sorted[1].uid) + assertEquals("text3", sorted[2].uid) + } + + @Test + fun `sortSearchParameters should handle complex mixed scenario`() { + // Given - a complex realistic scenario + val parameters = + listOf( + createSearchParameter("firstName", TrackerInputType.TEXT, isUnique = false), + createSearchParameter("nationalId", TrackerInputType.TEXT, isUnique = true), + createSearchParameter("qrCode", TrackerInputType.QR_CODE, isUnique = true), + createSearchParameter("email", TrackerInputType.EMAIL, isUnique = false), + createSearchParameter("barCode", TrackerInputType.BAR_CODE, isUnique = false), + createSearchParameter("uniqueCode", TrackerInputType.TEXT, isUnique = true), + createSearchParameter("scanQr", TrackerInputType.QR_CODE, isUnique = false), + ) + + // When + val sorted = useCase.sortSearchParameters(parameters) + + // Then - verify correct sorting priority + assertEquals(7, sorted.size) + + // Position 0: QR_CODE unique + assertEquals("qrCode", sorted[0].uid) + assertTrue(sorted[0].isUnique) + assertEquals(TrackerInputType.QR_CODE, sorted[0].inputType) + + // Position 1-2: BAR_CODE or QR_CODE non-unique + assertTrue(useCase.isQrCodeOrBarCode(sorted[1].inputType)) + assertTrue(useCase.isQrCodeOrBarCode(sorted[2].inputType)) + + // Position 3-4: Other unique parameters + assertTrue(sorted[3].isUnique) + assertTrue(sorted[4].isUnique) + assertFalse(useCase.isQrCodeOrBarCode(sorted[3].inputType)) + assertFalse(useCase.isQrCodeOrBarCode(sorted[4].inputType)) + + // Position 5-6: Non-unique, non-QR/BarCode + assertFalse(sorted[5].isUnique) + assertFalse(sorted[6].isUnique) + assertFalse(useCase.isQrCodeOrBarCode(sorted[5].inputType)) + assertFalse(useCase.isQrCodeOrBarCode(sorted[6].inputType)) + } + + // Helper function to create SearchParameterModel for testing + private fun createSearchParameter( + uid: String, + inputType: TrackerInputType, + isUnique: Boolean, + ): SearchParameterModel = + SearchParameterModel( + uid = uid, + label = "Label for $uid", + inputType = inputType, + optionSet = null, + customIntentUid = null, + minCharactersToSearch = null, + searchOperator = SearchOperator.LIKE, + isUnique = isUnique, + ) +} From bf7b8e254d51aafcecad6f6b71efa7b3cc4b2e55 Mon Sep 17 00:00:00 2001 From: Xavier Molloy Date: Fri, 20 Feb 2026 13:17:50 +0100 Subject: [PATCH 059/260] feat: [ANDROAPP-7470] - III - Injection of new use cases and final prep steps (#4674) * feat: [ANDROAPP-7470] Injection of new usecases and final prep steps * feat: [ANDROAPP-7470] Remove actual desktop class --- .../searchTrackEntity/SearchTEIViewModel.kt | 4 + .../searchTrackEntity/SearchTEModule.java | 94 ++++++++++++++++++- .../SearchTeiViewModelFactory.kt | 6 ++ .../di/SearchTEKoinModule.kt | 4 + .../SearchParametersScreen.kt | 3 + .../mapper/ParameterInputModelMapper.kt | 6 +- .../SearchTEIViewModelTest.kt | 10 ++ ....android.kt => OptionSetRepositoryImpl.kt} | 7 +- .../search/di/TrackerSearchModule.android.kt | 21 +++++ .../composeResources/values/strings.xml | 6 ++ .../input/ui/action/TrackerInputAction.kt | 12 +++ .../ui/mapper/TrackerInputUiStateMapper.kt | 35 +++++++ .../ui/provider/TrackerAgeInputProvider.kt | 4 +- .../provider/TrackerCheckboxInputProvider.kt | 4 +- .../ui/provider/TrackerDateTimeProvider.kt | 4 +- .../input/ui/provider/TrackerInputProvider.kt | 6 +- .../TrackerRadioButtonInputProvider.kt | 4 +- ...InputUIState.kt => TrackerInputUiState.kt} | 6 +- .../search/data/OptionSetRepository.kt | 3 +- .../search/ui/action/SearchScreenUiEvent.kt | 9 ++ .../provider/ParameterSelectorItemProvider.kt | 4 +- .../data/OptionSetRepository.desktop.kt | 22 ----- 22 files changed, 225 insertions(+), 49 deletions(-) rename tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/{OptionSetRepository.android.kt => OptionSetRepositoryImpl.kt} (95%) create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/mapper/TrackerInputUiStateMapper.kt rename tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/{TrackerInputUIState.kt => TrackerInputUiState.kt} (91%) create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/action/SearchScreenUiEvent.kt delete mode 100644 tracker/src/desktopMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepository.desktop.kt diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt index 0388f89c9ac..3dd0c002743 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt @@ -58,6 +58,8 @@ import org.dhis2.tracker.input.ui.action.CustomIntentUid import org.dhis2.tracker.input.ui.action.FieldUid import org.dhis2.tracker.input.ui.action.TrackerInputAction import org.dhis2.tracker.search.data.transformDomainTeiToSDKTei +import org.dhis2.tracker.search.domain.FetchOptionSetOptions +import org.dhis2.tracker.search.domain.FetchSearchParameters import org.dhis2.tracker.search.domain.SearchTrackedEntities import org.dhis2.tracker.search.model.SearchTrackedEntitiesInput import org.dhis2.usescases.searchTrackEntity.listView.SearchResult @@ -88,6 +90,8 @@ class SearchTEIViewModel( private val displayNameProvider: DisplayNameProvider, private val filterManager: FilterManager, private val searchTrackedEntities: SearchTrackedEntities, + private val fetchSearchParameters: FetchSearchParameters, + private val fetchOptionSetOptions: FetchOptionSetOptions, ) : ViewModel() { private var layersVisibility: Map = emptyMap() diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java index 372f433cfa4..1d55b4a17b7 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java @@ -59,12 +59,24 @@ import org.dhis2.maps.model.MapScope; import org.dhis2.maps.usecases.MapStyleConfiguration; import org.dhis2.maps.utils.DhisMapUtils; +import org.dhis2.mobile.commons.coroutine.Dispatcher; import org.dhis2.mobile.commons.customintents.CustomIntentRepository; import org.dhis2.mobile.commons.customintents.CustomIntentRepositoryImpl; +import org.dhis2.mobile.commons.error.DomainErrorMapper; +import org.dhis2.mobile.commons.network.NetworkStatusProvider; +import org.dhis2.mobile.commons.network.NetworkStatusProviderImpl; import org.dhis2.mobile.commons.reporting.CrashReportController; +import org.dhis2.mobile.commons.resources.D2ErrorMessageProvider; +import org.dhis2.mobile.commons.resources.D2ErrorMessageProviderImpl; import org.dhis2.tracker.data.ProfilePictureProvider; +import org.dhis2.tracker.search.data.OptionSetRepository; +import org.dhis2.tracker.search.data.OptionSetRepositoryImpl; +import org.dhis2.tracker.search.data.SearchParametersRepository; +import org.dhis2.tracker.search.data.SearchParametersRepositoryImpl; import org.dhis2.tracker.search.data.SearchTrackedEntityRepository; import org.dhis2.tracker.search.data.SearchTrackedEntityRepositoryImpl; +import org.dhis2.tracker.search.domain.FetchOptionSetOptions; +import org.dhis2.tracker.search.domain.FetchSearchParameters; import org.dhis2.tracker.search.domain.SearchTrackedEntities; import org.dhis2.ui.ThemeManager; import org.dhis2.usescases.events.EventInfoProvider; @@ -330,7 +342,9 @@ SearchTeiViewModelFactory providesViewModelFactory( DisplayNameProvider displayNameProvider, FilterManager filterManager, ProgramConfigurationRepository programConfigurationRepository, - SearchTrackedEntities searchTrackedEntities + SearchTrackedEntities searchTrackedEntities, + FetchSearchParameters fetchSearchParameters, + FetchOptionSetOptions fetchOptionSetOptions ) { return new SearchTeiViewModelFactory( searchRepository, @@ -350,10 +364,61 @@ SearchTeiViewModelFactory providesViewModelFactory( resourceManager, displayNameProvider, filterManager, - searchTrackedEntities + searchTrackedEntities, + fetchSearchParameters, + fetchOptionSetOptions ); } + @Provides + @PerActivity + FetchSearchParameters provideFetchSearchParametersUseCase( + SearchParametersRepository searchParametersRepository + ) { + return new FetchSearchParameters( + new Dispatcher(), + searchParametersRepository + ); + } + + @Provides + @PerActivity + FetchOptionSetOptions provideFetchOptionSetOptionsUseCase( + OptionSetRepository optionSetRepository + ) { + return new FetchOptionSetOptions( + optionSetRepository + ); + } + + @Provides + @PerActivity + SearchParametersRepository provideSearchParametersRepository( + D2 d2, + CustomIntentRepository customIntentRepository, + DomainErrorMapper domainErrorMapper + ) { + return new SearchParametersRepositoryImpl( + d2, + customIntentRepository, + domainErrorMapper + ); + } + + @Provides + @PerActivity + OptionSetRepository provideOptionSetRepository( + D2 d2, + DomainErrorMapper domainErrorMapper + ) { + return new OptionSetRepositoryImpl( + d2, + domainErrorMapper + ); + } + + + @Provides @PerActivity SearchTrackedEntities provideLoadSearchResultsUseCase( @@ -447,4 +512,29 @@ WorkingListViewModelFactory provideWorkingListViewModelFactory( ) { return new WorkingListViewModelFactory(initialProgram, filterRepository); } + + @Provides + @PerActivity + DomainErrorMapper provideDomainErrorMapper( + D2ErrorMessageProvider d2ErrorMessageProvider, + NetworkStatusProvider networkStatusProvider + ) { + return new DomainErrorMapper( + d2ErrorMessageProvider, + networkStatusProvider + ); + } + + @Provides + @PerActivity + D2ErrorMessageProvider provideD2ErrorMessageProvider() { + return new D2ErrorMessageProviderImpl(); + } + + @Provides + @PerActivity + NetworkStatusProvider provideNetworkStatusProvider() { + + return new NetworkStatusProviderImpl(moduleContext); + } } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTeiViewModelFactory.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTeiViewModelFactory.kt index 6358f8bebea..6244a20203b 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTeiViewModelFactory.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTeiViewModelFactory.kt @@ -8,6 +8,8 @@ import org.dhis2.commons.resources.ResourceManager import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.form.ui.provider.DisplayNameProvider import org.dhis2.maps.usecases.MapStyleConfiguration +import org.dhis2.tracker.search.domain.FetchOptionSetOptions +import org.dhis2.tracker.search.domain.FetchSearchParameters import org.dhis2.tracker.search.domain.SearchTrackedEntities class SearchTeiViewModelFactory( @@ -24,6 +26,8 @@ class SearchTeiViewModelFactory( private val displayNameProvider: DisplayNameProvider, private val filterManager: FilterManager, private val searchTrackedEntities: SearchTrackedEntities, + private val fetchSearchParameters: FetchSearchParameters, + private val fetchOptionSetOptions: FetchOptionSetOptions, ) : ViewModelProvider.Factory { override fun create(modelClass: Class): T = SearchTEIViewModel( @@ -40,5 +44,7 @@ class SearchTeiViewModelFactory( displayNameProvider, filterManager, searchTrackedEntities, + fetchSearchParameters, + fetchOptionSetOptions, ) as T } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/di/SearchTEKoinModule.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/di/SearchTEKoinModule.kt index c87e8f1a9a5..710d7a9d45e 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/di/SearchTEKoinModule.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/di/SearchTEKoinModule.kt @@ -39,6 +39,8 @@ val searchTEKoinModule = displayNameProvider = get(), filterManager = get(), searchTrackedEntities = get { parametersOf(teType) }, + fetchSearchParameters = get(), + fetchOptionSetOptions = get(), ) } @@ -67,6 +69,8 @@ val searchTEKoinModule = displayNameProvider = get(), filterManager = get(), searchTrackedEntities = get { parametersOf(teType) }, + fetchSearchParameters = get(), + fetchOptionSetOptions = get(), ) } } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreen.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreen.kt index 013f70a01ea..0103bee77e7 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreen.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreen.kt @@ -471,6 +471,9 @@ fun initSearchScreen( }, ) } + + is TrackerInputAction.Scan -> {} // TODO to be implemented + is TrackerInputAction.ValueChanged -> {} // TODO to be implemented } } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapper.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapper.kt index c72fa49130a..a6ba90db778 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapper.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapper.kt @@ -12,7 +12,7 @@ import org.dhis2.form.R import org.dhis2.form.model.FieldUiModel import org.dhis2.form.model.UiRenderType import org.dhis2.tracker.input.model.TrackerInputType -import org.dhis2.tracker.input.ui.state.TrackerInputUIState +import org.dhis2.tracker.input.ui.state.TrackerInputUiState import org.dhis2.tracker.input.ui.state.TrackerOptionItem import org.dhis2.tracker.input.ui.state.TrackerOptionSetConfiguration import org.hisp.dhis.android.core.common.ValueType @@ -23,7 +23,7 @@ import org.hisp.dhis.mobile.ui.designsystem.component.Orientation fun FieldUiModel.toParameterInputModel( fetchOptions: () -> Unit, resourceManager: ResourceManager, -): TrackerInputUIState { +): TrackerInputUiState { val trackerInputType = when { optionSet != null && valueType != ValueType.MULTI_TEXT -> { @@ -41,7 +41,7 @@ fun FieldUiModel.toParameterInputModel( else -> getInputTypeByValueType(valueType, renderingType) } - return TrackerInputUIState( + return TrackerInputUiState( uid = uid, label = label, value = value, diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt index 4ac2925f6d0..9b3f5d7d9f6 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt @@ -32,6 +32,8 @@ import org.dhis2.maps.geometry.mapper.EventsByProgramStage import org.dhis2.maps.usecases.MapStyleConfiguration import org.dhis2.mobile.commons.model.CustomIntentModel import org.dhis2.tracker.input.ui.action.TrackerInputAction +import org.dhis2.tracker.search.domain.FetchOptionSetOptions +import org.dhis2.tracker.search.domain.FetchSearchParameters import org.dhis2.tracker.search.domain.SearchTrackedEntities import org.dhis2.tracker.search.model.SearchTrackedEntitiesInput import org.dhis2.usescases.searchTrackEntity.listView.SearchResult.SearchResultType @@ -76,6 +78,8 @@ class SearchTEIViewModelTest { mock { onBlocking { invoke(any()) } doReturn Result.success(flowOf(PagingData.empty())) } + private val fetchSearchParameters: FetchSearchParameters = mock() + private val fetchOptionSetOptions: FetchOptionSetOptions = mock() @ExperimentalCoroutinesApi private val testingDispatcher = StandardTestDispatcher() @@ -112,6 +116,8 @@ class SearchTEIViewModelTest { displayNameProvider = displayNameProvider, filterManager = filterManager, searchTrackedEntities = searchTrackedEntities, + fetchSearchParameters = fetchSearchParameters, + fetchOptionSetOptions = fetchOptionSetOptions, ) testingDispatcher.scheduler.advanceUntilIdle() } @@ -796,6 +802,8 @@ class SearchTEIViewModelTest { displayNameProvider = displayNameProvider, filterManager = filterManager, searchTrackedEntities = searchTrackedEntities, + fetchSearchParameters = fetchSearchParameters, + fetchOptionSetOptions = fetchOptionSetOptions, ) testingDispatcher.scheduler.advanceUntilIdle() @@ -843,6 +851,8 @@ class SearchTEIViewModelTest { displayNameProvider = displayNameProvider, filterManager = filterManager, searchTrackedEntities = searchTrackedEntities, + fetchSearchParameters = fetchSearchParameters, + fetchOptionSetOptions = fetchOptionSetOptions, ) testingDispatcher.scheduler.advanceUntilIdle() diff --git a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepository.android.kt b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepositoryImpl.kt similarity index 95% rename from tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepository.android.kt rename to tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepositoryImpl.kt index e561b26c5ed..c07bfb58cdf 100644 --- a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepository.android.kt +++ b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepositoryImpl.kt @@ -16,11 +16,10 @@ import org.hisp.dhis.android.core.maintenance.D2Error /** * Android implementation of OptionSetRepository using DHIS2 Android SDK. */ -@Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING") -actual class OptionSetRepository( +class OptionSetRepositoryImpl( private val d2: D2, private val domainErrorMapper: DomainErrorMapper, -) { +) : OptionSetRepository { /** * Fetches paginated options for a given option set. * @param optionSetUid The unique identifier of the option set @@ -29,7 +28,7 @@ actual class OptionSetRepository( * @return Flow of paginated option items. The `flow { }` builder creates a cold (lazy) flow that * will be executed when collected. The code inside runs in the collector's coroutine context. */ - actual fun getOptions( + override fun getOptions( optionSetUid: String, pageSize: Int, searchQuery: String?, diff --git a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.android.kt b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.android.kt index fa86fafc999..eb5df5f70ff 100644 --- a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.android.kt +++ b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.android.kt @@ -1,5 +1,9 @@ package org.dhis2.tracker.search.di +import org.dhis2.tracker.search.data.OptionSetRepository +import org.dhis2.tracker.search.data.OptionSetRepositoryImpl +import org.dhis2.tracker.search.data.SearchParametersRepository +import org.dhis2.tracker.search.data.SearchParametersRepositoryImpl import org.dhis2.tracker.search.data.SearchTrackedEntityRepository import org.dhis2.tracker.search.data.SearchTrackedEntityRepositoryImpl import org.koin.core.module.Module @@ -17,4 +21,21 @@ internal actual val trackerSearchRepositoryModule: Module = filterPresenter = get(), ) } + + // SearchParametersRepository - interface implementation + single { + SearchParametersRepositoryImpl( + d2 = get(), + customIntentRepository = get(), + domainErrorMapper = get(), + ) + } + + // OptionSetRepository - interface implementation + single { + OptionSetRepositoryImpl( + d2 = get(), + domainErrorMapper = get(), + ) + } } diff --git a/tracker/src/commonMain/composeResources/values/strings.xml b/tracker/src/commonMain/composeResources/values/strings.xml index 3cbc1bb369b..e47fae5fd7b 100644 --- a/tracker/src/commonMain/composeResources/values/strings.xml +++ b/tracker/src/commonMain/composeResources/values/strings.xml @@ -19,5 +19,11 @@ Search Optional Launch + Exact matches only + Matches any part of the value + Must match the start of the value + Must match the end of the value + yes + no \ No newline at end of file diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/action/TrackerInputAction.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/action/TrackerInputAction.kt index 2a024512262..d368c574868 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/action/TrackerInputAction.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/action/TrackerInputAction.kt @@ -1,6 +1,7 @@ package org.dhis2.tracker.input.ui.action import org.dhis2.mobile.commons.model.CustomIntentModel +import org.dhis2.tracker.input.model.TrackerInputType typealias CustomIntentUid = String typealias FieldUid = String @@ -10,4 +11,15 @@ sealed interface TrackerInputAction { val fieldUid: FieldUid, val customIntentModel: CustomIntentModel, ) : TrackerInputAction + + data class Scan( + val fieldUid: FieldUid, + val optionSet: String?, + val renderType: TrackerInputType, + ) : TrackerInputAction + + data class ValueChanged( + val fieldUid: FieldUid, + val value: String?, + ) : TrackerInputAction } diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/mapper/TrackerInputUiStateMapper.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/mapper/TrackerInputUiStateMapper.kt new file mode 100644 index 00000000000..ccc444b6463 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/mapper/TrackerInputUiStateMapper.kt @@ -0,0 +1,35 @@ +package org.dhis2.tracker.input.ui.mapper + +import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.input.ui.state.TrackerInputUiState +import org.dhis2.tracker.search.model.SearchParameterModel +import org.hisp.dhis.mobile.ui.designsystem.component.Orientation + +fun SearchParameterModel.toTrackerInputUiState() = + TrackerInputUiState( + uid = uid, + label = label, + value = null, + focused = false, + valueType = inputType, + optionSet = optionSet, + error = null, + warning = null, + description = null, + mandatory = false, + editable = true, + legend = null, + orientation = inputType.getOrientation(), + optionSetConfiguration = null, + customIntentUid = customIntentUid, + displayName = null, + ) + +private fun TrackerInputType.getOrientation(): Orientation = + when (this) { + TrackerInputType.HORIZONTAL_CHECKBOXES, + TrackerInputType.HORIZONTAL_RADIOBUTTONS, + -> Orientation.HORIZONTAL + + else -> Orientation.VERTICAL + } diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerAgeInputProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerAgeInputProvider.kt index a22ad53a1d8..edd05b75d9d 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerAgeInputProvider.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerAgeInputProvider.kt @@ -17,7 +17,7 @@ import org.dhis2.mobile.commons.resources.age_or import org.dhis2.mobile.commons.resources.cancel import org.dhis2.mobile.commons.resources.date_of_birth import org.dhis2.mobile.commons.resources.ok -import org.dhis2.tracker.input.ui.state.TrackerInputUIState +import org.dhis2.tracker.input.ui.state.TrackerInputUiState import org.dhis2.tracker.input.ui.state.inputState import org.dhis2.tracker.input.ui.state.supportingText import org.hisp.dhis.mobile.ui.designsystem.component.AgeInputType @@ -29,7 +29,7 @@ import org.jetbrains.compose.resources.stringResource @Composable fun ProvideTrackerAgeInput( - model: TrackerInputUIState, + model: TrackerInputUiState, inputStyle: InputStyle, onNextClicked: () -> Unit, modifier: Modifier, diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerCheckboxInputProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerCheckboxInputProvider.kt index 5be95d7b1a9..58001abd402 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerCheckboxInputProvider.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerCheckboxInputProvider.kt @@ -2,7 +2,7 @@ package org.dhis2.tracker.input.ui.provider import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import org.dhis2.tracker.input.ui.state.TrackerInputUIState +import org.dhis2.tracker.input.ui.state.TrackerInputUiState import org.dhis2.tracker.input.ui.state.inputState import org.dhis2.tracker.input.ui.state.supportingText import org.hisp.dhis.mobile.ui.designsystem.component.CheckBoxData @@ -11,7 +11,7 @@ import org.hisp.dhis.mobile.ui.designsystem.component.InputStyle @Composable fun TrackerCheckboxInputProvider( - model: TrackerInputUIState, + model: TrackerInputUiState, inputStyle: InputStyle, modifier: Modifier, onValueChange: (String?) -> Unit, diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerDateTimeProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerDateTimeProvider.kt index 469b469cc28..d1025c92fc7 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerDateTimeProvider.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerDateTimeProvider.kt @@ -11,7 +11,7 @@ import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.input.TextFieldValue import org.dhis2.tracker.input.model.TrackerInputType -import org.dhis2.tracker.input.ui.state.TrackerInputUIState +import org.dhis2.tracker.input.ui.state.TrackerInputUiState import org.dhis2.tracker.input.ui.state.inputState import org.dhis2.tracker.input.ui.state.supportingText import org.hisp.dhis.mobile.ui.designsystem.component.DateTimeActionType @@ -26,7 +26,7 @@ import org.hisp.dhis.mobile.ui.designsystem.component.state.rememberInputDateTim @Composable fun ProvideTrackerDateTimeInput( - model: TrackerInputUIState, + model: TrackerInputUiState, inputStyle: InputStyle, onNextClicked: () -> Unit, modifier: Modifier, diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt index ed1d1fad925..0fc4fba9c20 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt @@ -18,7 +18,7 @@ import org.dhis2.mobile.tracker.resources.Res import org.dhis2.mobile.tracker.resources.custom_intent_launch import org.dhis2.tracker.input.model.TrackerInputType import org.dhis2.tracker.input.ui.action.TrackerInputUiEvent -import org.dhis2.tracker.input.ui.state.TrackerInputUIState +import org.dhis2.tracker.input.ui.state.TrackerInputUiState import org.dhis2.tracker.input.ui.state.inputState import org.dhis2.tracker.input.ui.state.supportingText import org.hisp.dhis.mobile.ui.designsystem.component.CheckBoxData @@ -52,7 +52,7 @@ import org.jetbrains.compose.resources.stringResource @Composable fun TrackerInputProvider( modifier: Modifier = Modifier, - inputModel: TrackerInputUIState, + inputModel: TrackerInputUiState, inputStyle: InputStyle, onNextClicked: () -> Unit, onUiEvent: (TrackerInputUiEvent) -> Unit, @@ -750,7 +750,7 @@ fun TrackerInputProvider( fun manageOnValueChange( newValue: String?, - inputModel: TrackerInputUIState, + inputModel: TrackerInputUiState, onUiEvent: (TrackerInputUiEvent) -> Unit, ) { newValue?.let { diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerRadioButtonInputProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerRadioButtonInputProvider.kt index b018a70a60b..63656617658 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerRadioButtonInputProvider.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerRadioButtonInputProvider.kt @@ -2,7 +2,7 @@ package org.dhis2.tracker.input.ui.provider import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import org.dhis2.tracker.input.ui.state.TrackerInputUIState +import org.dhis2.tracker.input.ui.state.TrackerInputUiState import org.dhis2.tracker.input.ui.state.inputState import org.dhis2.tracker.input.ui.state.supportingText import org.hisp.dhis.mobile.ui.designsystem.component.InputRadioButton @@ -11,7 +11,7 @@ import org.hisp.dhis.mobile.ui.designsystem.component.RadioButtonData @Composable fun TrackerRadioButtonInputProvider( - model: TrackerInputUIState, + model: TrackerInputUiState, inputStyle: InputStyle, modifier: Modifier, onValueChange: (String?) -> Unit, diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerInputUIState.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerInputUiState.kt similarity index 91% rename from tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerInputUIState.kt rename to tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerInputUiState.kt index 7f8c3053412..6fbef970209 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerInputUIState.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerInputUiState.kt @@ -7,7 +7,7 @@ import org.hisp.dhis.mobile.ui.designsystem.component.Orientation import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextData import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextState -data class TrackerInputUIState( +data class TrackerInputUiState( val uid: String, val label: String, val value: String?, @@ -26,7 +26,7 @@ data class TrackerInputUIState( val displayName: String?, ) -fun TrackerInputUIState.supportingText(): List? = +fun TrackerInputUiState.supportingText(): List? = listOfNotNull( error?.let { SupportingTextData( @@ -48,7 +48,7 @@ fun TrackerInputUIState.supportingText(): List? = }, ).ifEmpty { null } -fun TrackerInputUIState.inputState(): InputShellState = +fun TrackerInputUiState.inputState(): InputShellState = when { !editable -> InputShellState.DISABLED error != null -> InputShellState.ERROR diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepository.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepository.kt index c2da3315782..03075e6c880 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepository.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepository.kt @@ -8,8 +8,7 @@ import org.dhis2.tracker.input.ui.state.TrackerOptionItem * Repository for fetching option set data. * Handles pagination and search of options for dropdown/selection inputs. */ -@Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING") -expect class OptionSetRepository { +interface OptionSetRepository { /** * Fetches paginated options for a given option set. * diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/action/SearchScreenUiEvent.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/action/SearchScreenUiEvent.kt new file mode 100644 index 00000000000..22b8e1c5010 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/action/SearchScreenUiEvent.kt @@ -0,0 +1,9 @@ +package org.dhis2.tracker.search.ui.action + +sealed interface SearchScreenUiEvent { + data object OnSearchButtonClicked : SearchScreenUiEvent + + data object OnClearSearchButtonClicked : SearchScreenUiEvent + + data object OnCloseClicked : SearchScreenUiEvent +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/provider/ParameterSelectorItemProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/provider/ParameterSelectorItemProvider.kt index a64ed31ac54..519d2e211c3 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/provider/ParameterSelectorItemProvider.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/provider/ParameterSelectorItemProvider.kt @@ -9,7 +9,7 @@ import androidx.compose.ui.Modifier import org.dhis2.tracker.input.model.TrackerInputType import org.dhis2.tracker.input.ui.action.TrackerInputUiEvent import org.dhis2.tracker.input.ui.provider.TrackerInputProvider -import org.dhis2.tracker.input.ui.state.TrackerInputUIState +import org.dhis2.tracker.input.ui.state.TrackerInputUiState import org.hisp.dhis.mobile.ui.designsystem.component.InputStyle import org.hisp.dhis.mobile.ui.designsystem.component.parameter.model.ParameterSelectorItemModel import org.hisp.dhis.mobile.ui.designsystem.resource.provideDHIS2Icon @@ -17,7 +17,7 @@ import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor @Composable fun provideParameterSelectorItem( - inputModel: TrackerInputUIState, + inputModel: TrackerInputUiState, helperText: String, onNextClicked: () -> Unit, onUiEvent: (TrackerInputUiEvent) -> Unit, diff --git a/tracker/src/desktopMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepository.desktop.kt b/tracker/src/desktopMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepository.desktop.kt deleted file mode 100644 index ae87059733e..00000000000 --- a/tracker/src/desktopMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepository.desktop.kt +++ /dev/null @@ -1,22 +0,0 @@ -package org.dhis2.tracker.search.data - -import androidx.paging.PagingData -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.flowOf -import org.dhis2.tracker.input.ui.state.TrackerOptionItem - -/** - * Desktop stub implementation of OptionSetRepository. - * TODO: Implement when desktop support is added - */ -@Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING") -actual class OptionSetRepository { - actual fun getOptions( - optionSetUid: String, - pageSize: Int, - searchQuery: String?, - ): Flow> { - // Return empty flow for desktop - return flowOf(PagingData.empty()) - } -} From f8af65f2f14d340007611f0017dbf34443c98b06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Tar=C3=AD?= Date: Fri, 20 Feb 2026 14:43:08 +0100 Subject: [PATCH 060/260] chore: [ANDROAPP-7498 ] handle new period types [skip size] (#4664) * chore: [ANDROAPP-7498] Update latest sdk snapshot * chore: [ANDROAPP-7498] Add new period types to enums and labels * chore: [ANDROAPP-7498] Extend test with new period types * chore: [ANDROAPP-7498] Fix tests --- .../data/dhislogic/DhisPeriodUtilsTest.kt | 100 +++ .../org/dhis2/commons/date/DateExtensions.kt | 8 +- .../periods/data/FilterPeriodsRepository.kt | 8 + .../periods/data/PeriodTypeLabelProvider.kt | 4 + .../filters/periods/model/FilterPeriodType.kt | 4 + .../periods/data/PeriodLabelProvider.kt | 10 + .../commons/resources/DhisPeriodUtils.kt | 5 + commons/src/main/res/values/strings.xml | 4 + .../charts/bindings/AnalyticsBindings.kt | 8 +- .../charts/bindings/DateToPosition.kt | 8 +- .../dhis2/org/analytics/charts/data/Graph.kt | 16 +- .../charts/mappers/GraphToBarData.kt | 8 +- .../providers/PeriodStepProviderImpl.kt | 9 + .../charts/bindings/DateToPositionTest.kt | 8 +- gradle/libs.versions.toml | 2 +- gradle/verification-metadata.xml | 811 +++++------------- 16 files changed, 422 insertions(+), 591 deletions(-) diff --git a/app/src/test/java/org/dhis2/data/dhislogic/DhisPeriodUtilsTest.kt b/app/src/test/java/org/dhis2/data/dhislogic/DhisPeriodUtilsTest.kt index 423bc8ad1ae..7e32ff6d492 100644 --- a/app/src/test/java/org/dhis2/data/dhislogic/DhisPeriodUtilsTest.kt +++ b/app/src/test/java/org/dhis2/data/dhislogic/DhisPeriodUtilsTest.kt @@ -154,6 +154,31 @@ class DhisPeriodUtilsTest { ) } + @Test + fun `WeeklyFriday period should return expected result`() { + whenever( + periodHelper.blockingGetPeriodForPeriodTypeAndDate( + PeriodType.WeeklyFriday, + testDate, + ), + ) doReturn + Period + .builder() + .periodId("2019ThuW2") + .startDate(GregorianCalendar(2019, 0, 11).time) + .endDate(GregorianCalendar(2019, 0, 17).time) + .build() + + Assert.assertEquals( + "Week 0 2019-01-11 To 2019-01-17", + periodUtils.getPeriodUIString( + PeriodType.WeeklyFriday, + testDate, + Locale.ENGLISH, + ), + ) + } + @Test fun `WeeklySaturday period should return expected result`() { whenever( @@ -430,6 +455,31 @@ class DhisPeriodUtilsTest { ) } + @Test + fun `FinancialFeb period should return expected result`() { + whenever( + periodHelper.blockingGetPeriodForPeriodTypeAndDate( + PeriodType.FinancialFeb, + testDate, + ), + ) doReturn + Period + .builder() + .periodId("periodId") + .startDate(GregorianCalendar(2018, 1, 1).time) + .endDate(GregorianCalendar(2019, 0, 31).time) + .build() + + Assert.assertEquals( + "Feb 2018 - Jan 2019", + periodUtils.getPeriodUIString( + PeriodType.FinancialFeb, + testDate, + Locale.ENGLISH, + ), + ) + } + @Test fun `FinancialApril period should return expected result`() { whenever( @@ -480,6 +530,56 @@ class DhisPeriodUtilsTest { ) } + @Test + fun `FinancialAug period should return expected result`() { + whenever( + periodHelper.blockingGetPeriodForPeriodTypeAndDate( + PeriodType.FinancialAug, + testDate, + ), + ) doReturn + Period + .builder() + .periodId("periodId") + .startDate(GregorianCalendar(2018, 7, 1).time) + .endDate(GregorianCalendar(2019, 6, 31).time) + .build() + + Assert.assertEquals( + "Aug 2018 - Jul 2019", + periodUtils.getPeriodUIString( + PeriodType.FinancialAug, + testDate, + Locale.ENGLISH, + ), + ) + } + + @Test + fun `FinancialSep period should return expected result`() { + whenever( + periodHelper.blockingGetPeriodForPeriodTypeAndDate( + PeriodType.FinancialSep, + testDate, + ), + ) doReturn + Period + .builder() + .periodId("periodId") + .startDate(GregorianCalendar(2018, 8, 1).time) + .endDate(GregorianCalendar(2019, 7, 31).time) + .build() + + Assert.assertEquals( + "Sep 2018 - Aug 2019", + periodUtils.getPeriodUIString( + PeriodType.FinancialSep, + testDate, + Locale.ENGLISH, + ), + ) + } + @Test fun `FinancialOct period should return expected result`() { whenever( diff --git a/commons/src/main/java/org/dhis2/commons/date/DateExtensions.kt b/commons/src/main/java/org/dhis2/commons/date/DateExtensions.kt index 478779db2ab..938b3241953 100644 --- a/commons/src/main/java/org/dhis2/commons/date/DateExtensions.kt +++ b/commons/src/main/java/org/dhis2/commons/date/DateExtensions.kt @@ -186,10 +186,11 @@ fun Date?.toUi(): String? = this?.let { DateUtils.uiDateFormat().format(this) } fun Dhis2PeriodType.toUiStringResource() = when (this) { Dhis2PeriodType.Weekly, + Dhis2PeriodType.WeeklyWednesday, + Dhis2PeriodType.WeeklyThursday, + Dhis2PeriodType.WeeklyFriday, Dhis2PeriodType.WeeklySaturday, Dhis2PeriodType.WeeklySunday, - Dhis2PeriodType.WeeklyThursday, - Dhis2PeriodType.WeeklyWednesday, -> R.string.period_weekly_title Dhis2PeriodType.BiWeekly -> R.string.period_biweekly_title @@ -205,8 +206,11 @@ fun Dhis2PeriodType.toUiStringResource() = -> R.string.period_six_monthly_title Dhis2PeriodType.Yearly -> R.string.period_yearly_title + Dhis2PeriodType.FinancialFeb, Dhis2PeriodType.FinancialApril, Dhis2PeriodType.FinancialJuly, + Dhis2PeriodType.FinancialAug, + Dhis2PeriodType.FinancialSep, Dhis2PeriodType.FinancialOct, Dhis2PeriodType.FinancialNov, -> R.string.period_financial_year_title diff --git a/commons/src/main/java/org/dhis2/commons/filters/periods/data/FilterPeriodsRepository.kt b/commons/src/main/java/org/dhis2/commons/filters/periods/data/FilterPeriodsRepository.kt index 3470bfd0eea..7aa86a2c200 100644 --- a/commons/src/main/java/org/dhis2/commons/filters/periods/data/FilterPeriodsRepository.kt +++ b/commons/src/main/java/org/dhis2/commons/filters/periods/data/FilterPeriodsRepository.kt @@ -25,6 +25,7 @@ class FilterPeriodsRepository( FilterPeriodType.WEEKLY, FilterPeriodType.WEEKLY_WEDNESDAY, FilterPeriodType.WEEKLY_THURSDAY, + FilterPeriodType.WEEKLY_FRIDAY, FilterPeriodType.WEEKLY_SATURDAY, FilterPeriodType.WEEKLY_SUNDAY, FilterPeriodType.BI_WEEKLY, @@ -36,8 +37,11 @@ class FilterPeriodsRepository( FilterPeriodType.SIX_MONTHLY_APRIL, FilterPeriodType.SIX_MONTHLY_NOV, FilterPeriodType.YEARLY, + FilterPeriodType.FINANCIAL_FEB, FilterPeriodType.FINANCIAL_APRIL, FilterPeriodType.FINANCIAL_JULY, + FilterPeriodType.FINANCIAL_AUG, + FilterPeriodType.FINANCIAL_SEP, FilterPeriodType.FINANCIAL_OCT, FilterPeriodType.FINANCIAL_NOV, ) @@ -48,6 +52,7 @@ class FilterPeriodsRepository( FilterPeriodType.WEEKLY -> PeriodType.Weekly FilterPeriodType.WEEKLY_WEDNESDAY -> PeriodType.WeeklyWednesday FilterPeriodType.WEEKLY_THURSDAY -> PeriodType.WeeklyThursday + FilterPeriodType.WEEKLY_FRIDAY -> PeriodType.WeeklyFriday FilterPeriodType.WEEKLY_SATURDAY -> PeriodType.WeeklySaturday FilterPeriodType.WEEKLY_SUNDAY -> PeriodType.WeeklySunday FilterPeriodType.BI_WEEKLY -> PeriodType.BiWeekly @@ -59,8 +64,11 @@ class FilterPeriodsRepository( FilterPeriodType.SIX_MONTHLY_APRIL -> PeriodType.SixMonthlyApril FilterPeriodType.SIX_MONTHLY_NOV -> PeriodType.SixMonthlyNov FilterPeriodType.YEARLY -> PeriodType.Yearly + FilterPeriodType.FINANCIAL_FEB -> PeriodType.FinancialFeb FilterPeriodType.FINANCIAL_APRIL -> PeriodType.FinancialApril FilterPeriodType.FINANCIAL_JULY -> PeriodType.FinancialJuly + FilterPeriodType.FINANCIAL_AUG -> PeriodType.FinancialAug + FilterPeriodType.FINANCIAL_SEP -> PeriodType.FinancialSep FilterPeriodType.FINANCIAL_OCT -> PeriodType.FinancialOct FilterPeriodType.FINANCIAL_NOV -> PeriodType.FinancialNov FilterPeriodType.NONE -> PeriodType.Daily diff --git a/commons/src/main/java/org/dhis2/commons/filters/periods/data/PeriodTypeLabelProvider.kt b/commons/src/main/java/org/dhis2/commons/filters/periods/data/PeriodTypeLabelProvider.kt index 6f8730da45a..677f4750651 100644 --- a/commons/src/main/java/org/dhis2/commons/filters/periods/data/PeriodTypeLabelProvider.kt +++ b/commons/src/main/java/org/dhis2/commons/filters/periods/data/PeriodTypeLabelProvider.kt @@ -11,6 +11,7 @@ class PeriodTypeLabelProvider { FilterPeriodType.WEEKLY -> R.string.weekly FilterPeriodType.WEEKLY_WEDNESDAY -> R.string.weekly_start_wednesday FilterPeriodType.WEEKLY_THURSDAY -> R.string.weekly_start_thursday + FilterPeriodType.WEEKLY_FRIDAY -> R.string.weekly_start_friday FilterPeriodType.WEEKLY_SATURDAY -> R.string.weekly_start_saturday FilterPeriodType.WEEKLY_SUNDAY -> R.string.weekly_start_sunday FilterPeriodType.BI_WEEKLY -> R.string.bi_weekly @@ -22,8 +23,11 @@ class PeriodTypeLabelProvider { FilterPeriodType.SIX_MONTHLY_APRIL -> R.string.six_monthly_april FilterPeriodType.SIX_MONTHLY_NOV -> R.string.six_monthly_nov FilterPeriodType.YEARLY -> R.string.YEARLY + FilterPeriodType.FINANCIAL_FEB -> R.string.financial_year_february FilterPeriodType.FINANCIAL_APRIL -> R.string.financial_year_april FilterPeriodType.FINANCIAL_JULY -> R.string.financial_year_july + FilterPeriodType.FINANCIAL_AUG -> R.string.financial_year_august + FilterPeriodType.FINANCIAL_SEP -> R.string.financial_year_september FilterPeriodType.FINANCIAL_OCT -> R.string.financial_year_october FilterPeriodType.FINANCIAL_NOV -> R.string.financial_year_november } diff --git a/commons/src/main/java/org/dhis2/commons/filters/periods/model/FilterPeriodType.kt b/commons/src/main/java/org/dhis2/commons/filters/periods/model/FilterPeriodType.kt index e7af37e9a96..4d0fea03ad1 100644 --- a/commons/src/main/java/org/dhis2/commons/filters/periods/model/FilterPeriodType.kt +++ b/commons/src/main/java/org/dhis2/commons/filters/periods/model/FilterPeriodType.kt @@ -6,6 +6,7 @@ enum class FilterPeriodType { WEEKLY, WEEKLY_WEDNESDAY, WEEKLY_THURSDAY, + WEEKLY_FRIDAY, WEEKLY_SATURDAY, WEEKLY_SUNDAY, BI_WEEKLY, @@ -17,8 +18,11 @@ enum class FilterPeriodType { SIX_MONTHLY_APRIL, SIX_MONTHLY_NOV, YEARLY, + FINANCIAL_FEB, FINANCIAL_APRIL, FINANCIAL_JULY, + FINANCIAL_AUG, + FINANCIAL_SEP, FINANCIAL_OCT, FINANCIAL_NOV, } diff --git a/commons/src/main/java/org/dhis2/commons/periods/data/PeriodLabelProvider.kt b/commons/src/main/java/org/dhis2/commons/periods/data/PeriodLabelProvider.kt index cecd1dde871..a3b6aa7db02 100644 --- a/commons/src/main/java/org/dhis2/commons/periods/data/PeriodLabelProvider.kt +++ b/commons/src/main/java/org/dhis2/commons/periods/data/PeriodLabelProvider.kt @@ -57,6 +57,7 @@ class PeriodLabelProvider( PeriodType.Weekly, PeriodType.WeeklyWednesday, PeriodType.WeeklyThursday, + PeriodType.WeeklyFriday, PeriodType.WeeklySaturday, PeriodType.WeeklySunday, PeriodType.BiWeekly, @@ -80,9 +81,13 @@ class PeriodLabelProvider( PeriodType.BiMonthly, PeriodType.SixMonthly, PeriodType.SixMonthlyApril, PeriodType.Quarterly, PeriodType.QuarterlyNov, + PeriodType.FinancialFeb, PeriodType.FinancialApril, PeriodType.FinancialJuly, + PeriodType.FinancialAug, + PeriodType.FinancialSep, PeriodType.FinancialOct, + PeriodType.FinancialNov, -> if (periodBetweenYears) { FROM_TO_LABEL.format( @@ -116,6 +121,7 @@ class PeriodLabelProvider( PeriodType.Weekly, PeriodType.WeeklyWednesday, PeriodType.WeeklyThursday, + PeriodType.WeeklyFriday, PeriodType.WeeklySaturday, PeriodType.WeeklySunday, -> { @@ -181,9 +187,13 @@ class PeriodLabelProvider( ) } + PeriodType.FinancialFeb, PeriodType.FinancialApril, PeriodType.FinancialJuly, + PeriodType.FinancialAug, + PeriodType.FinancialSep, PeriodType.FinancialOct, + PeriodType.FinancialNov, -> FROM_TO_LABEL.format( SimpleDateFormat(MONTH_YEAR_FULL_FORMAT, locale).format(periodStartDate), diff --git a/commons/src/main/java/org/dhis2/commons/resources/DhisPeriodUtils.kt b/commons/src/main/java/org/dhis2/commons/resources/DhisPeriodUtils.kt index 834db2aa3f1..b8a90f020c3 100644 --- a/commons/src/main/java/org/dhis2/commons/resources/DhisPeriodUtils.kt +++ b/commons/src/main/java/org/dhis2/commons/resources/DhisPeriodUtils.kt @@ -34,6 +34,7 @@ class DhisPeriodUtils( PeriodType.Weekly, PeriodType.WeeklyWednesday, PeriodType.WeeklyThursday, + PeriodType.WeeklyFriday, PeriodType.WeeklySaturday, PeriodType.WeeklySunday, -> { @@ -73,9 +74,13 @@ class DhisPeriodUtils( PeriodType.QuarterlyNov, PeriodType.SixMonthly, PeriodType.SixMonthlyApril, + PeriodType.FinancialFeb, PeriodType.FinancialApril, PeriodType.FinancialJuly, + PeriodType.FinancialAug, + PeriodType.FinancialSep, PeriodType.FinancialOct, + PeriodType.FinancialNov, -> formattedDate = periodString.format( diff --git a/commons/src/main/res/values/strings.xml b/commons/src/main/res/values/strings.xml index fa7ec938076..86841ba4fb0 100644 --- a/commons/src/main/res/values/strings.xml +++ b/commons/src/main/res/values/strings.xml @@ -51,6 +51,7 @@ Bi-weekly Weekly starting Wednesday Weekly starting Thursday + Weekly starting Friday Weekly starting Saturday Weekly starting Sunday Monthly @@ -62,8 +63,11 @@ Six-monthly starting July Six-monthly starting November Yearly + Financial year starting February Financial year starting April Financial year starting July + Financial year starting August + Financial year starting September Financial year starting October Financial year starting November diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/bindings/AnalyticsBindings.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/bindings/AnalyticsBindings.kt index 60bece0c4b5..d2616d6f567 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/bindings/AnalyticsBindings.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/bindings/AnalyticsBindings.kt @@ -35,10 +35,11 @@ fun PeriodType.datePattern(): String = when (this) { PeriodType.Daily, PeriodType.Weekly, + PeriodType.WeeklyWednesday, + PeriodType.WeeklyThursday, + PeriodType.WeeklyFriday, PeriodType.WeeklySaturday, PeriodType.WeeklySunday, - PeriodType.WeeklyThursday, - PeriodType.WeeklyWednesday, PeriodType.BiWeekly, PeriodType.Monthly, PeriodType.BiMonthly, @@ -52,8 +53,11 @@ fun PeriodType.datePattern(): String = } PeriodType.Yearly, + PeriodType.FinancialFeb, PeriodType.FinancialApril, PeriodType.FinancialJuly, + PeriodType.FinancialAug, + PeriodType.FinancialSep, PeriodType.FinancialOct, PeriodType.FinancialNov, -> { diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/bindings/DateToPosition.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/bindings/DateToPosition.kt index 60f5089c8f5..301a3c84bcc 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/bindings/DateToPosition.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/bindings/DateToPosition.kt @@ -26,10 +26,11 @@ class DateToPosition { when (eventPeriodType) { PeriodType.Daily, PeriodType.Weekly, + PeriodType.WeeklyWednesday, + PeriodType.WeeklyThursday, + PeriodType.WeeklyFriday, PeriodType.WeeklySaturday, PeriodType.WeeklySunday, - PeriodType.WeeklyThursday, - PeriodType.WeeklyWednesday, PeriodType.BiWeekly, PeriodType.Monthly, PeriodType.BiMonthly, @@ -48,8 +49,11 @@ class DateToPosition { monthDiff.toFloat() + (dayInMonth.toFloat() - 1f) / daysInMonth.toFloat() } PeriodType.Yearly, + PeriodType.FinancialFeb, PeriodType.FinancialApril, PeriodType.FinancialJuly, + PeriodType.FinancialAug, + PeriodType.FinancialSep, PeriodType.FinancialOct, PeriodType.FinancialNov, -> { diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/data/Graph.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/data/Graph.kt index cfa972b8430..3ba229b4c4c 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/data/Graph.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/data/Graph.kt @@ -48,10 +48,11 @@ data class Graph( return when (eventPeriodType) { PeriodType.Daily, PeriodType.Weekly, + PeriodType.WeeklyWednesday, + PeriodType.WeeklyThursday, + PeriodType.WeeklyFriday, PeriodType.WeeklySaturday, PeriodType.WeeklySunday, - PeriodType.WeeklyThursday, - PeriodType.WeeklyWednesday, PeriodType.BiWeekly, PeriodType.Monthly, PeriodType.BiMonthly, @@ -65,8 +66,11 @@ data class Graph( } PeriodType.Yearly, + PeriodType.FinancialFeb, PeriodType.FinancialApril, PeriodType.FinancialJuly, + PeriodType.FinancialAug, + PeriodType.FinancialSep, PeriodType.FinancialOct, PeriodType.FinancialNov, -> { @@ -126,10 +130,11 @@ data class Graph( when (eventPeriodType) { PeriodType.Daily, PeriodType.Weekly, + PeriodType.WeeklyWednesday, + PeriodType.WeeklyThursday, + PeriodType.WeeklyFriday, PeriodType.WeeklySaturday, PeriodType.WeeklySunday, - PeriodType.WeeklyThursday, - PeriodType.WeeklyWednesday, PeriodType.BiWeekly, PeriodType.Monthly, PeriodType.BiMonthly, @@ -144,8 +149,11 @@ data class Graph( } PeriodType.Yearly, + PeriodType.FinancialFeb, PeriodType.FinancialApril, PeriodType.FinancialJuly, + PeriodType.FinancialAug, + PeriodType.FinancialSep, PeriodType.FinancialOct, PeriodType.FinancialNov, -> { diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/GraphToBarData.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/GraphToBarData.kt index 60cedf8f36e..2c49a231409 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/GraphToBarData.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/GraphToBarData.kt @@ -57,10 +57,11 @@ class GraphToBarData { PeriodType.Daily -> DAILY_BAR_WIDTH PeriodType.Weekly, + PeriodType.WeeklyWednesday, + PeriodType.WeeklyThursday, + PeriodType.WeeklyFriday, PeriodType.WeeklySaturday, PeriodType.WeeklySunday, - PeriodType.WeeklyThursday, - PeriodType.WeeklyWednesday, -> WEEKLY_BAR_WIDTH PeriodType.BiWeekly, @@ -77,8 +78,11 @@ class GraphToBarData { SIX_MONTHLY_BAR_WIDTH } PeriodType.Yearly, + PeriodType.FinancialFeb, PeriodType.FinancialApril, PeriodType.FinancialJuly, + PeriodType.FinancialAug, + PeriodType.FinancialSep, PeriodType.FinancialOct, PeriodType.FinancialNov, -> { diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/PeriodStepProviderImpl.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/PeriodStepProviderImpl.kt index a67a8637eb3..8a603334dd4 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/PeriodStepProviderImpl.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/PeriodStepProviderImpl.kt @@ -77,6 +77,7 @@ class PeriodStepProviderImpl( PeriodType.Weekly, PeriodType.WeeklyWednesday, PeriodType.WeeklyThursday, + PeriodType.WeeklyFriday, PeriodType.WeeklySaturday, PeriodType.WeeklySunday, -> { @@ -111,9 +112,13 @@ class PeriodStepProviderImpl( PeriodType.QuarterlyNov, PeriodType.SixMonthly, PeriodType.SixMonthlyApril, + PeriodType.FinancialFeb, PeriodType.FinancialApril, PeriodType.FinancialJuly, + PeriodType.FinancialAug, + PeriodType.FinancialSep, PeriodType.FinancialOct, + PeriodType.FinancialNov, -> formattedDate = periodString.format( @@ -173,6 +178,7 @@ class PeriodStepProviderImpl( PeriodType.Weekly, PeriodType.WeeklyWednesday, PeriodType.WeeklyThursday, + PeriodType.WeeklyFriday, PeriodType.WeeklySaturday, PeriodType.WeeklySunday, -> @@ -223,8 +229,11 @@ class PeriodStepProviderImpl( ).months / 6 PeriodType.Yearly, + PeriodType.FinancialFeb, PeriodType.FinancialApril, PeriodType.FinancialJuly, + PeriodType.FinancialAug, + PeriodType.FinancialSep, PeriodType.FinancialOct, PeriodType.FinancialNov, -> diff --git a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/bindings/DateToPositionTest.kt b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/bindings/DateToPositionTest.kt index 3a7bc105ff8..05205d9a1ed 100644 --- a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/bindings/DateToPositionTest.kt +++ b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/bindings/DateToPositionTest.kt @@ -32,10 +32,11 @@ class DateToPositionTest { listOf( PeriodType.Daily, PeriodType.Weekly, + PeriodType.WeeklyWednesday, + PeriodType.WeeklyThursday, + PeriodType.WeeklyFriday, PeriodType.WeeklySaturday, PeriodType.WeeklySunday, - PeriodType.WeeklyThursday, - PeriodType.WeeklyWednesday, PeriodType.BiWeekly, PeriodType.Monthly, PeriodType.BiMonthly, @@ -86,8 +87,11 @@ class DateToPositionTest { listOf( PeriodType.Yearly, + PeriodType.FinancialFeb, PeriodType.FinancialApril, PeriodType.FinancialJuly, + PeriodType.FinancialAug, + PeriodType.FinancialSep, PeriodType.FinancialOct, PeriodType.FinancialNov, ).forEach { period -> diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 371c9294cbd..f6afab9a261 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -11,7 +11,7 @@ kotlin = '2.2.21' dagger = '2.57.2' jacoco = '0.8.14' designSystem = "0.7.0-SNAPSHOT" -dhis2sdk = "1.14.0-20260209.084921-13" +dhis2sdk = "1.14.0-20260216.141057-20" ruleEngine = "3.3.11" expressionParser = "1.2.2" appcompat = "1.7.1" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 039ec11a49a..a48a4721150 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -2591,10 +2591,9 @@ - - - + + + @@ -2667,10 +2666,9 @@ - - - + + + @@ -3194,10 +3192,9 @@ - - - + + + @@ -3408,10 +3405,9 @@ - - - + + + @@ -3880,10 +3876,9 @@ - - - + + + @@ -4732,16 +4727,14 @@ - - - - - - - - + + + + + + + + @@ -7698,26 +7691,6 @@ - - - - - - - - - - - - - - - - @@ -7726,26 +7699,22 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + @@ -7769,16 +7738,6 @@ - - - - - - - - @@ -7809,16 +7768,14 @@ - - - - - - - - + + + + + + + + @@ -8541,16 +8498,14 @@ - - - - - - - - + + + + + + + + @@ -8566,16 +8521,6 @@ - - - - - - - - @@ -8600,16 +8545,6 @@ - - - - - - - - @@ -8643,16 +8578,6 @@ - - - - - - - - @@ -8676,16 +8601,6 @@ - - - - - - - - @@ -8703,14 +8618,12 @@ - - - - - - + + + + + + @@ -8729,14 +8642,12 @@ - - - - - - + + + + + + @@ -8762,16 +8673,6 @@ - - - - - - - - @@ -8789,16 +8690,14 @@ - - - - - - - - + + + + + + + + @@ -8814,16 +8713,6 @@ - - - - - - - - @@ -8849,36 +8738,30 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + @@ -8902,16 +8785,6 @@ - - - - - - - - @@ -8937,16 +8810,6 @@ - - - - - - - - @@ -8962,32 +8825,6 @@ - - - - - - - - - - - - - - - - - - - - - @@ -9026,16 +8863,14 @@ - - - - - - - - + + + + + + + + @@ -9052,16 +8887,14 @@ - - - - - - - - + + + + + + + + @@ -9086,16 +8919,6 @@ - - - - - - - - @@ -9112,14 +8935,12 @@ - - - - - - + + + + + + @@ -9137,16 +8958,6 @@ - - - - - - - - @@ -9172,36 +8983,30 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + @@ -9226,16 +9031,6 @@ - - - - - - - - @@ -9252,16 +9047,14 @@ - - - - - - - - + + + + + + + + @@ -9277,16 +9070,6 @@ - - - - - - - - @@ -9312,16 +9095,14 @@ - - - - - - - - + + + + + + + + @@ -9338,16 +9119,14 @@ - - - - - - - - + + + + + + + + @@ -9371,16 +9150,6 @@ - - - - - - - - @@ -10854,6 +10623,14 @@ + + + + + + + + @@ -12772,20 +12549,6 @@ - - - - - - - - - - - @@ -12874,12 +12637,6 @@ - - - - - @@ -13637,64 +13394,53 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -13728,16 +13474,6 @@ - - - - - - - - @@ -13777,17 +13513,14 @@ - - - - - - - - + + + + + + + + @@ -13827,16 +13560,6 @@ - - - - - - - - @@ -13879,53 +13602,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -14633,16 +14309,6 @@ - - - - - - - - @@ -14666,12 +14332,6 @@ - - - - - @@ -14697,10 +14357,9 @@ - - - + + + From 6e30070fcd3df8056f33d36d8c745a8efa2ff7eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Tar=C3=AD?= Date: Fri, 20 Feb 2026 15:45:09 +0100 Subject: [PATCH 061/260] chore: [ANDROAPP-7517] Adapt to mandatory enrollment category combo on programs (#4672) * chore: [ANDROAPP-7498] Update latest sdk snapshot * chore: [ANDROAPP-7498] Add new period types to enums and labels * chore: [ANDROAPP-7498] Extend test with new period types * chore: [ANDROAPP-7498] Fix tests * chore: [ANDROAPP-7517] add mandatory enrollmentCategoryCombo to testing programs update SDK version * chore: [ANDROAPP-7517] format * chore: [ANDROAPP-7517] fix test * chore: [ANDROAPP-7498] Extend test with new period types * chore: [ANDROAPP-7498] Fix tests * chore: [ANDROAPP-7517] add mandatory enrollmentCategoryCombo to testing programs update SDK version * chore: [ANDROAPP-7517] format * chore: [ANDROAPP-7517] fix test --- .../test/java/org/dhis2/bindings/TEICardExtensionsTest.kt | 1 + .../org/dhis2/data/dhislogic/EnrollmentEventGeneratorTest.kt | 1 + .../test/java/org/dhis2/data/filter/FilterRepositoryTest.kt | 5 +++++ .../org/dhis2/data/sorting/SearchSortingValueSetterTest.kt | 2 ++ .../usescases/enrollment/EnrollmentFormRepositoryTest.kt | 1 + .../usescases/enrollment/EnrollmentPresenterImplTest.kt | 4 ++++ .../eventInitial/EventInitialPresenterTest.kt | 1 + .../eventInitial/EventInitialRepositoryImplTest.kt | 1 + .../usescases/main/program/ProgramRepositoryImplTest.kt | 2 ++ .../java/org/dhis2/usescases/notes/NotesRepositoryTest.kt | 1 + .../programEventDetail/ProgramEventDetailPresenterTest.kt | 1 + .../usescases/programEventDetail/ProgramEventMapperTest.kt | 1 + .../usescases/searchTrackEntity/SearchRepositoryTest.kt | 4 ++++ .../usescases/searchTrackEntity/SearchTEIViewModelTest.kt | 1 + .../usescases/searchTrackEntity/SearchTEPresenterTest.kt | 4 ++++ .../searchTrackEntity/ui/mapper/TEICardMapperTest.kt | 2 ++ .../usescases/teiDashboard/TeiAttributesProviderTest.kt | 1 + .../usescases/teiDashboard/TeiDashboardPresenterTest.kt | 2 ++ .../teiProgramList/TeiProgramListRepositoryImplTest.kt | 2 ++ .../usescases/teiDashboard/ui/mapper/InfoBarMapperTest.kt | 2 ++ .../usescases/teiDashboard/ui/mapper/TEIDetailMapperTest.kt | 2 ++ .../tracker/TrackedEntityInstanceInfoProviderTests.kt | 1 + gradle/libs.versions.toml | 2 +- 23 files changed, 43 insertions(+), 1 deletion(-) diff --git a/app/src/test/java/org/dhis2/bindings/TEICardExtensionsTest.kt b/app/src/test/java/org/dhis2/bindings/TEICardExtensionsTest.kt index 36e20959173..dd5fb510726 100644 --- a/app/src/test/java/org/dhis2/bindings/TEICardExtensionsTest.kt +++ b/app/src/test/java/org/dhis2/bindings/TEICardExtensionsTest.kt @@ -130,5 +130,6 @@ class TEICardExtensionsTest { .icon("icon") .build(), ).categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() } diff --git a/app/src/test/java/org/dhis2/data/dhislogic/EnrollmentEventGeneratorTest.kt b/app/src/test/java/org/dhis2/data/dhislogic/EnrollmentEventGeneratorTest.kt index 5f1c85a5a64..10e238194b7 100644 --- a/app/src/test/java/org/dhis2/data/dhislogic/EnrollmentEventGeneratorTest.kt +++ b/app/src/test/java/org/dhis2/data/dhislogic/EnrollmentEventGeneratorTest.kt @@ -172,6 +172,7 @@ class EnrollmentEventGeneratorTest { .uid(PROGRAM_UID) .useFirstStageDuringRegistration(useFirstStage) .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() private fun mockedAutogeneratedEvents( diff --git a/app/src/test/java/org/dhis2/data/filter/FilterRepositoryTest.kt b/app/src/test/java/org/dhis2/data/filter/FilterRepositoryTest.kt index ac6a58fa1b1..1fa1ddc8cb8 100644 --- a/app/src/test/java/org/dhis2/data/filter/FilterRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/data/filter/FilterRepositoryTest.kt @@ -213,6 +213,7 @@ class FilterRepositoryTest { .builder() .uid("random") .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .programType(org.hisp.dhis.android.core.program.ProgramType.WITH_REGISTRATION) .build() val catCombo = @@ -289,6 +290,7 @@ class FilterRepositoryTest { .builder() .uid("random") .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .programType(org.hisp.dhis.android.core.program.ProgramType.WITH_REGISTRATION) .build() val catCombo = @@ -384,6 +386,7 @@ class FilterRepositoryTest { .builder() .uid("random") .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .programType(org.hisp.dhis.android.core.program.ProgramType.WITH_REGISTRATION) .build() val catCombo = @@ -464,6 +467,7 @@ class FilterRepositoryTest { .builder() .uid("random") .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .programType(org.hisp.dhis.android.core.program.ProgramType.WITH_REGISTRATION) .trackedEntityType( TrackedEntityType @@ -606,6 +610,7 @@ class FilterRepositoryTest { .builder() .uid("random") .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .programType(org.hisp.dhis.android.core.program.ProgramType.WITH_REGISTRATION) .trackedEntityType( TrackedEntityType diff --git a/app/src/test/java/org/dhis2/data/sorting/SearchSortingValueSetterTest.kt b/app/src/test/java/org/dhis2/data/sorting/SearchSortingValueSetterTest.kt index 0c6a4a2aff4..089d9537808 100644 --- a/app/src/test/java/org/dhis2/data/sorting/SearchSortingValueSetterTest.kt +++ b/app/src/test/java/org/dhis2/data/sorting/SearchSortingValueSetterTest.kt @@ -449,6 +449,7 @@ class SearchSortingValueSetterTest { .builder() .uid("programUid") .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .enrollmentDateLabel("programEnrollmentDateLabel") .build() @@ -484,6 +485,7 @@ class SearchSortingValueSetterTest { .builder() .uid("programUid") .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() val result = diff --git a/app/src/test/java/org/dhis2/usescases/enrollment/EnrollmentFormRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/enrollment/EnrollmentFormRepositoryTest.kt index cdbfe200d15..0d5185fd534 100644 --- a/app/src/test/java/org/dhis2/usescases/enrollment/EnrollmentFormRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/usescases/enrollment/EnrollmentFormRepositoryTest.kt @@ -37,6 +37,7 @@ class EnrollmentFormRepositoryTest { .uid("programUid") .displayName("programName") .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() whenever(enrollmentRepository.blockingGet()) doReturn Enrollment diff --git a/app/src/test/java/org/dhis2/usescases/enrollment/EnrollmentPresenterImplTest.kt b/app/src/test/java/org/dhis2/usescases/enrollment/EnrollmentPresenterImplTest.kt index 6ba88a9741e..8471215a86f 100644 --- a/app/src/test/java/org/dhis2/usescases/enrollment/EnrollmentPresenterImplTest.kt +++ b/app/src/test/java/org/dhis2/usescases/enrollment/EnrollmentPresenterImplTest.kt @@ -75,6 +75,7 @@ class EnrollmentPresenterImplTest { .builder() .uid("") .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .access( Access .builder() @@ -97,6 +98,7 @@ class EnrollmentPresenterImplTest { .builder() .uid("") .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .access( Access .builder() @@ -169,6 +171,7 @@ class EnrollmentPresenterImplTest { .builder() .uid("tUID") .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() whenever(teiRepository.blockingGet()) doReturn tei @@ -206,6 +209,7 @@ class EnrollmentPresenterImplTest { .builder() .uid("tUID") .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() whenever(teiRepository.blockingGet()) doReturn tei diff --git a/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialPresenterTest.kt index 6d1518444f3..af4c0c5a36e 100644 --- a/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialPresenterTest.kt @@ -370,6 +370,7 @@ class EventInitialPresenterTest { .builder() .uid(uid) .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() val orgUnits = mutableListOf( diff --git a/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialRepositoryImplTest.kt b/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialRepositoryImplTest.kt index 6e28218ae7c..eeb1fec1baf 100644 --- a/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialRepositoryImplTest.kt +++ b/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialRepositoryImplTest.kt @@ -260,6 +260,7 @@ class EventInitialRepositoryImplTest { .builder() .uid("programUid") .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .access(Access.create(true, true, DataAccess.create(true, hasAccess))) .build() } diff --git a/app/src/test/java/org/dhis2/usescases/main/program/ProgramRepositoryImplTest.kt b/app/src/test/java/org/dhis2/usescases/main/program/ProgramRepositoryImplTest.kt index bbbd457b33f..ec78a168082 100644 --- a/app/src/test/java/org/dhis2/usescases/main/program/ProgramRepositoryImplTest.kt +++ b/app/src/test/java/org/dhis2/usescases/main/program/ProgramRepositoryImplTest.kt @@ -277,6 +277,7 @@ class ProgramRepositoryImplTest { .programType(ProgramType.WITHOUT_REGISTRATION) .style(ObjectStyle.builder().build()) .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), Program .builder() @@ -285,6 +286,7 @@ class ProgramRepositoryImplTest { .programType(ProgramType.WITH_REGISTRATION) .style(ObjectStyle.builder().build()) .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .trackedEntityType( TrackedEntityType .builder() diff --git a/app/src/test/java/org/dhis2/usescases/notes/NotesRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/notes/NotesRepositoryTest.kt index 1474e19945d..c51061d5fca 100644 --- a/app/src/test/java/org/dhis2/usescases/notes/NotesRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/usescases/notes/NotesRepositoryTest.kt @@ -96,6 +96,7 @@ class NotesRepositoryTest { .builder() .uid(UUID.randomUUID().toString()) .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .access( Access .builder() diff --git a/app/src/test/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailPresenterTest.kt index a14db2e227f..bffb0e8e37f 100644 --- a/app/src/test/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailPresenterTest.kt @@ -75,6 +75,7 @@ class ProgramEventDetailPresenterTest { .builder() .uid("programUid") .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() whenever(repository.getAccessDataWrite()) doReturn true diff --git a/app/src/test/java/org/dhis2/usescases/programEventDetail/ProgramEventMapperTest.kt b/app/src/test/java/org/dhis2/usescases/programEventDetail/ProgramEventMapperTest.kt index d43e86829d3..6ba25515874 100644 --- a/app/src/test/java/org/dhis2/usescases/programEventDetail/ProgramEventMapperTest.kt +++ b/app/src/test/java/org/dhis2/usescases/programEventDetail/ProgramEventMapperTest.kt @@ -228,6 +228,7 @@ class ProgramEventMapperTest { .completeEventsExpiryDays(0) .expiryDays(0) .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() private fun dummyCategoryOptionCombo() = diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryTest.kt index d3c83ec6b23..8883452d181 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryTest.kt @@ -173,6 +173,7 @@ class SearchRepositoryTest { .builder() .uid("programUid") .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() val sorting = SortingItem.create(Filters.ENROLLMENT_DATE) val tei = TrackedEntitySearchItemHelper.toTrackedEntityInstance(searchItem) @@ -211,6 +212,7 @@ class SearchRepositoryTest { .builder() .uid("programUid") .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() val sorting = SortingItem.create(Filters.ENROLLMENT_DATE) val tei = TrackedEntitySearchItemHelper.toTrackedEntityInstance(searchItem) @@ -248,6 +250,7 @@ class SearchRepositoryTest { .builder() .uid("programUid") .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() val sorting = SortingItem.create(Filters.ENROLLMENT_DATE) val tei = TrackedEntitySearchItemHelper.toTrackedEntityInstance(searchItem) @@ -369,6 +372,7 @@ class SearchRepositoryTest { .uid(programUid) .displayFrontPageList(true) .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() // Mock setOverdueEvents diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt index 9b3f5d7d9f6..174af457148 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt @@ -1046,6 +1046,7 @@ class SearchTEIViewModelTest { .minAttributesRequiredToSearch(minAttributesToSearch) .trackedEntityType(TrackedEntityType.builder().uid("teTypeUid").build()) .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .apply { maxTeiCountToReturn?.let { maxTeiCountToReturn(maxTeiCountToReturn) diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEPresenterTest.kt index 0de7cf852e4..65283d5003a 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEPresenterTest.kt @@ -60,6 +60,7 @@ class SearchTEPresenterTest { .displayFrontPageList(true) .minAttributesRequiredToSearch(0) .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() whenever( @@ -101,6 +102,7 @@ class SearchTEPresenterTest { .displayFrontPageList(true) .minAttributesRequiredToSearch(1) .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() presenter.setProgramForTesting(program) @@ -119,6 +121,7 @@ class SearchTEPresenterTest { .displayFrontPageList(true) .minAttributesRequiredToSearch(1) .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() val newSelectedProgram = @@ -128,6 +131,7 @@ class SearchTEPresenterTest { .displayFrontPageList(true) .minAttributesRequiredToSearch(1) .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() whenever( diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapperTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapperTest.kt index aff56c83073..54ab9118a00 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapperTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapperTest.kt @@ -145,6 +145,7 @@ class TEICardMapperTest { .uid("Program1Uid") .displayName("Program 1") .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), null, ) @@ -154,6 +155,7 @@ class TEICardMapperTest { .uid("Program2Uid") .displayName("Program 2") .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), null, ) diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiAttributesProviderTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiAttributesProviderTest.kt index bd0d4f4b8bb..be022f1f663 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiAttributesProviderTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiAttributesProviderTest.kt @@ -272,6 +272,7 @@ class TeiAttributesProviderTest { .builder() .uid(program) .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() whenever(d2.programModule().programTrackedEntityAttributes()) doReturn mock() diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiDashboardPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiDashboardPresenterTest.kt index 692004883f3..fdc8041f68f 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiDashboardPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiDashboardPresenterTest.kt @@ -71,6 +71,7 @@ class TeiDashboardPresenterTest { .builder() .uid(programUid) .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() val trackedEntityInstance = TrackedEntityInstance.builder().uid(teiUid).build() val enrollment = Enrollment.builder().uid("enrollmentUid").build() @@ -91,6 +92,7 @@ class TeiDashboardPresenterTest { .builder() .uid(programUid) .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), MetadataIconData.defaultIcon(), ), diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListRepositoryImplTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListRepositoryImplTest.kt index d86bd361a7c..74d2256fe3b 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListRepositoryImplTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListRepositoryImplTest.kt @@ -63,6 +63,7 @@ class TeiProgramListRepositoryImplTest { .uid("programUid") .displayIncidentDate(true) .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() whenever( @@ -128,6 +129,7 @@ class TeiProgramListRepositoryImplTest { .uid("programUid") .displayIncidentDate(false) .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() whenever( diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/InfoBarMapperTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/InfoBarMapperTest.kt index baddf218723..8a4ee17d24d 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/InfoBarMapperTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/InfoBarMapperTest.kt @@ -175,6 +175,7 @@ class InfoBarMapperTest { .uid("Program1Uid") .displayName("Program 1") .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), MetadataIconData.defaultIcon(), ), @@ -184,6 +185,7 @@ class InfoBarMapperTest { .uid("Program2Uid") .displayName("Program 2") .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), MetadataIconData.defaultIcon(), ), diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/TEIDetailMapperTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/TEIDetailMapperTest.kt index d30cd759fa9..d3ec64daaa7 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/TEIDetailMapperTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/TEIDetailMapperTest.kt @@ -134,6 +134,7 @@ class TEIDetailMapperTest { .uid("Program1Uid") .displayName("Program 1") .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), MetadataIconData.defaultIcon(), ), @@ -143,6 +144,7 @@ class TEIDetailMapperTest { .uid("Program2Uid") .displayName("Program 2") .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), MetadataIconData.defaultIcon(), ), diff --git a/app/src/test/java/org/dhis2/usescases/tracker/TrackedEntityInstanceInfoProviderTests.kt b/app/src/test/java/org/dhis2/usescases/tracker/TrackedEntityInstanceInfoProviderTests.kt index d0e9ed58c99..5827f790ab7 100644 --- a/app/src/test/java/org/dhis2/usescases/tracker/TrackedEntityInstanceInfoProviderTests.kt +++ b/app/src/test/java/org/dhis2/usescases/tracker/TrackedEntityInstanceInfoProviderTests.kt @@ -222,6 +222,7 @@ class TrackedEntityInstanceInfoProviderTests { .builder() .uid("programUid") .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) if (hasStyle) { program.style( diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f6afab9a261..f787f8925e8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -11,7 +11,7 @@ kotlin = '2.2.21' dagger = '2.57.2' jacoco = '0.8.14' designSystem = "0.7.0-SNAPSHOT" -dhis2sdk = "1.14.0-20260216.141057-20" +dhis2sdk = "1.14.0-20260219.101444-21" ruleEngine = "3.3.11" expressionParser = "1.2.2" appcompat = "1.7.1" From 1ffd849d00d0e93835c1708f0f1e0fbdd08d4637 Mon Sep 17 00:00:00 2001 From: Xavier Molloy Date: Mon, 23 Feb 2026 10:22:05 +0100 Subject: [PATCH 062/260] feat: [ANDROAPP-7470] - IV - Move SearchParameters Screen to tracker module [skip size] (#4675) * feat: [ANDROAPP-7470] Injection of new usecases and final prep steps * feat: [ANDROAPP-7470] Remove actual desktop class * feat: [ANDROAPP-7470] Move SearchParameters Screen to tracker module, replace fieldUiModel with trackerInputModel * feat: [ANDROAPP-7470] ktlint * feat: [ANDROAPP-7470] Fix renderiing for option sets in boolean types * feat: [ANDROAPP-7470] Conflict resolution * feat: [ANDROAPP-7470] Conflict resolution and small fix * feat: [ANDROAPP-7470] ktlint * feat: [ANDROAPP-7470] sonar code smell * feat: [ANDROAPP-7470] test rebase feature branch * feat: [ANDROAPP-7470] test rebase feature branch * feat: [ANDROAPP-7470] test rebase feature branch * feat: [ANDROAPP-7470] copilot comment ktlint --- .../SearchRepositoryImplKt.kt | 298 +++-------- .../searchTrackEntity/SearchRepositoryKt.kt | 15 +- .../searchTrackEntity/SearchTEActivity.kt | 17 +- .../searchTrackEntity/SearchTEIViewModel.kt | 280 ++++++---- .../searchTrackEntity/SearchTEModule.java | 4 - .../SearchParametersScreen.kt | 495 ------------------ .../SearchParametersScreenProvider.kt | 175 +++++++ .../mapper/ParameterInputModelMapper.kt | 202 ------- .../searchTrackEntity/SearchRepositoryTest.kt | 64 ++- .../SearchTEIViewModelTest.kt | 305 +++++++---- .../mapper/ParameterInputModelMapperTest.kt | 334 ------------ .../search/data/OptionSetRepositoryImpl.kt | 3 + .../input/ui/action/TrackerInputUiEvent.kt | 6 + .../ui/mapper/TrackerInputUiStateMapper.kt | 3 + .../input/ui/provider/TrackerInputProvider.kt | 10 +- .../input/ui/state/TrackerInputUiState.kt | 131 ++++- .../provider/ParameterSelectorItemProvider.kt | 8 +- .../ui/screen/SearchParametersScreen.kt | 282 ++++++++++ .../ui/state}/SearchParametersUiState.kt | 6 +- 19 files changed, 1129 insertions(+), 1509 deletions(-) delete mode 100644 app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreen.kt create mode 100644 app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreenProvider.kt delete mode 100644 app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapper.kt delete mode 100644 app/src/test/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapperTest.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/screen/SearchParametersScreen.kt rename {app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/model => tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/state}/SearchParametersUiState.kt (86%) diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImplKt.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImplKt.kt index 822fbbeb51b..3f699212450 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImplKt.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImplKt.kt @@ -2,53 +2,35 @@ package org.dhis2.usescases.searchTrackEntity -import androidx.paging.map import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.FlowPreview -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.debounce -import kotlinx.coroutines.flow.flatMapLatest -import kotlinx.coroutines.flow.map import kotlinx.coroutines.withContext import org.dhis2.commons.filters.FilterManager -import org.dhis2.commons.resources.MetadataIconProvider import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.search.SearchParametersModel -import org.dhis2.form.model.FieldUiModel -import org.dhis2.form.model.OptionSetConfiguration -import org.dhis2.form.ui.FieldViewModelFactory import org.dhis2.maps.model.MapItemModel import org.dhis2.mobile.commons.customintents.CustomIntentRepository -import org.dhis2.mobile.commons.extensions.toColor import org.dhis2.mobile.commons.model.CustomIntentActionTypeModel -import org.dhis2.mobile.commons.model.CustomIntentModel +import org.dhis2.tracker.input.model.TrackerInputType import org.dhis2.tracker.input.ui.action.FieldUid import org.dhis2.usescases.events.EventInfoProvider import org.dhis2.usescases.tracker.TrackedEntityInstanceInfoProvider import org.hisp.dhis.android.core.D2 -import org.hisp.dhis.android.core.arch.repositories.scope.RepositoryScope -import org.hisp.dhis.android.core.common.ObjectStyle import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.android.core.event.EventStatus import org.hisp.dhis.android.core.program.Program -import org.hisp.dhis.android.core.program.ProgramTrackedEntityAttribute -import org.hisp.dhis.android.core.program.SectionRenderingType import org.hisp.dhis.android.core.relationship.RelationshipItem import org.hisp.dhis.android.core.relationship.RelationshipItemTrackedEntityInstance -import org.hisp.dhis.android.core.trackedentity.TrackedEntityAttribute import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchCollectionRepository import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItem import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItemHelper.toTrackedEntityInstance -import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor import timber.log.Timber class SearchRepositoryImplKt( private val searchRepositoryJava: SearchRepository, private val d2: D2, private val dispatcher: DispatcherProvider, - private val fieldViewModelFactory: FieldViewModelFactory, - private val metadataIconProvider: MetadataIconProvider, private val trackedEntityInstanceInfoProvider: TrackedEntityInstanceInfoProvider, private val eventInfoProvider: EventInfoProvider, private val customIntentRepository: CustomIntentRepository, @@ -67,7 +49,10 @@ class SearchRepositoryImplKt( ): Boolean { if (!this::savedSearchParameters.isInitialized) { savedSearchParameters = - SearchParametersModel(queryData = queryData, selectedProgram = searchRepositoryJava.getProgram(programUid)) + SearchParametersModel( + queryData = queryData, + selectedProgram = searchRepositoryJava.getProgram(programUid), + ) } if (!this::savedFilters.isInitialized) { savedFilters = FilterManager.getInstance().copy() @@ -87,36 +72,6 @@ class SearchRepositoryImplKt( null } - override suspend fun searchParameters( - programUid: String?, - teiTypeUid: String, - ): List = - withContext(dispatcher.io()) { - val searchParameters = - programUid?.let { - programTrackedEntityAttributes(programUid) - } ?: trackedEntitySearchFields(teiTypeUid) - - sortSearchParameters(searchParameters) - } - - fun sortSearchParameters(parameters: List): List = - parameters.sortedWith( - compareByDescending { - it.renderingType?.isQROrBarcode() == true && isUnique(it.uid) - }.thenByDescending { - it.renderingType?.isQROrBarcode() == true - }.thenByDescending { isUnique(it.uid) }, - ) - - private fun isUnique(teaUid: String): Boolean = - d2 - .trackedEntityModule() - .trackedEntityAttributes() - .uid(teaUid) - .blockingGet() - ?.unique() ?: false - override fun searchTeiForMap( searchParametersModel: SearchParametersModel, isOnline: Boolean, @@ -209,6 +164,50 @@ class SearchRepositoryImplKt( ) } + override fun trackerValueTypeToSDKValueType(trackerInputType: TrackerInputType): ValueType? = + when (trackerInputType) { + TrackerInputType.TEXT -> ValueType.TEXT + TrackerInputType.LONG_TEXT -> ValueType.LONG_TEXT + TrackerInputType.LETTER -> ValueType.LETTER + TrackerInputType.PHONE_NUMBER -> ValueType.PHONE_NUMBER + TrackerInputType.EMAIL -> ValueType.EMAIL + TrackerInputType.URL -> ValueType.URL + TrackerInputType.NUMBER -> ValueType.NUMBER + TrackerInputType.INTEGER -> ValueType.INTEGER + TrackerInputType.INTEGER_POSITIVE -> ValueType.INTEGER_POSITIVE + TrackerInputType.INTEGER_NEGATIVE -> ValueType.INTEGER_NEGATIVE + TrackerInputType.INTEGER_ZERO_OR_POSITIVE -> ValueType.INTEGER_ZERO_OR_POSITIVE + TrackerInputType.PERCENTAGE -> ValueType.PERCENTAGE + TrackerInputType.UNIT_INTERVAL -> ValueType.UNIT_INTERVAL + TrackerInputType.AGE -> ValueType.AGE + TrackerInputType.ORGANISATION_UNIT -> ValueType.ORGANISATION_UNIT + TrackerInputType.DATE_TIME -> ValueType.DATETIME + TrackerInputType.DATE -> ValueType.DATE + TrackerInputType.TIME -> ValueType.TIME + TrackerInputType.HORIZONTAL_CHECKBOXES, + TrackerInputType.VERTICAL_CHECKBOXES, + TrackerInputType.HORIZONTAL_RADIOBUTTONS, + TrackerInputType.VERTICAL_RADIOBUTTONS, + -> ValueType.BOOLEAN + + TrackerInputType.YES_ONLY_SWITCH, + TrackerInputType.YES_ONLY_CHECKBOX, + -> ValueType.TRUE_ONLY + + TrackerInputType.QR_CODE, + TrackerInputType.BAR_CODE, + -> ValueType.TEXT + + TrackerInputType.MULTI_SELECTION -> ValueType.MULTI_TEXT + TrackerInputType.DROPDOWN, + TrackerInputType.PERIOD_SELECTOR, + TrackerInputType.MATRIX, + TrackerInputType.SEQUENTIAL, + TrackerInputType.NOT_SUPPORTED, + TrackerInputType.CUSTOM_INTENT, + -> ValueType.TEXT + } + override fun searchRelationshipsForMap( teis: List, selectedProgram: Program?, @@ -288,6 +287,32 @@ class SearchRepositoryImplKt( } } + override fun validateValue( + inputType: TrackerInputType, + value: String, + ): Any = + { + when (inputType) { + TrackerInputType.DATE -> { + ValueType.DATE.validator.validate(value) + } + TrackerInputType.DATE_TIME -> { + ValueType.DATETIME.validator.validate(value) + } + TrackerInputType.TIME -> { + ValueType.TIME.validator.validate(value) + } + + TrackerInputType.AGE -> { + ValueType.AGE.validator.validate(value) + } + + else -> { + false + } + } + } + override fun searchEventForMap( teiUids: List, selectedProgram: Program?, @@ -320,93 +345,6 @@ class SearchRepositoryImplKt( } } - private fun programTrackedEntityAttributes(programUid: String): List { - val searchableAttributes = - d2 - .programModule() - .programTrackedEntityAttributes() - .withRenderType() - .byProgram() - .eq(programUid) - .orderBySortOrder(RepositoryScope.OrderByDirection.ASC) - .blockingGet() - .filter { programAttribute -> - val isSearchable = programAttribute.searchable()!! - val isUnique = - d2 - .trackedEntityModule() - .trackedEntityAttributes() - .uid(programAttribute.trackedEntityAttribute()!!.uid()) - .blockingGet() - ?.unique() === java.lang.Boolean.TRUE - isSearchable || isUnique - } - - val program = - d2 - .programModule() - .programs() - .uid(programUid) - .blockingGet() - - return searchableAttributes - .mapNotNull { programAttribute -> - d2 - .trackedEntityModule() - .trackedEntityAttributes() - .uid(programAttribute.trackedEntityAttribute()!!.uid()) - .blockingGet() - ?.let { attribute -> - val searchFlow = MutableStateFlow("") - val optionSetConfiguration = - attribute.optionSet()?.let { - OptionSetConfiguration( - searchEmitter = searchFlow, - optionFlow = - searchFlow.debounce(300).flatMapLatest { - d2 - .optionModule() - .options() - .orderBySortOrder(RepositoryScope.OrderByDirection.ASC) - .byOptionSetUid() - .eq(attribute.optionSet()!!.uid()) - .getPagingData(10) - .map { pagingData -> - pagingData.map { option -> - OptionSetConfiguration.OptionData( - option, - metadataIconProvider( - option.style(), - program?.style()?.color()?.toColor() - ?: SurfaceColor.Primary, - ), - ) - } - } - }, - onSearch = { searchFlow.value = it }, - ) - } - val customIntentModel = - customIntentRepository.getCustomIntent( - triggerUid = attribute.uid(), - orgUnitUid = null, - actionType = CustomIntentActionTypeModel.SEARCH, - ) - createField( - trackedEntityAttribute = attribute, - programTrackedEntityAttribute = programAttribute, - optionSetConfiguration = optionSetConfiguration, - customIntent = customIntentModel, - ) - } - }.filter { parameter -> - parameter.valueType !== ValueType.IMAGE && - parameter.valueType !== ValueType.COORDINATE && - parameter.valueType !== ValueType.FILE_RESOURCE - } - } - override suspend fun getCustomIntent(fieldUid: FieldUid) = withContext(dispatcher.io()) { customIntentRepository.getCustomIntent( @@ -415,90 +353,4 @@ class SearchRepositoryImplKt( actionType = CustomIntentActionTypeModel.SEARCH, ) } - - private fun trackedEntitySearchFields(teiTypeUid: String): List { - val teTypeAttributes = - d2 - .trackedEntityModule() - .trackedEntityTypeAttributes() - .byTrackedEntityTypeUid() - .eq(teiTypeUid) - .bySearchable() - .isTrue - .blockingGet() - - return teTypeAttributes - .mapNotNull { typeAttribute -> - d2 - .trackedEntityModule() - .trackedEntityAttributes() - .uid(typeAttribute.trackedEntityAttribute()!!.uid()) - .blockingGet() - ?.let { attribute -> - val searchEmitter = MutableStateFlow("") - val optionSetConfiguration = - attribute.optionSet()?.let { - OptionSetConfiguration( - searchEmitter = searchEmitter, - optionFlow = - d2 - .optionModule() - .options() - .byOptionSetUid() - .eq(attribute.optionSet()!!.uid()) - .orderBySortOrder(RepositoryScope.OrderByDirection.ASC) - .getPagingData(10) - .map { pagingData -> - pagingData.map { option -> - OptionSetConfiguration.OptionData( - option, - metadataIconProvider( - option.style(), - SurfaceColor.Primary, - ), - ) - } - }, - onSearch = { searchEmitter.value = it }, - ) - } - - createField( - trackedEntityAttribute = attribute, - programTrackedEntityAttribute = null, - optionSetConfiguration = optionSetConfiguration, - ) - } - }.filter { parameter -> - parameter.valueType !== ValueType.IMAGE && - parameter.valueType !== ValueType.COORDINATE && - parameter.valueType !== ValueType.FILE_RESOURCE - } - } - - private fun createField( - trackedEntityAttribute: TrackedEntityAttribute, - programTrackedEntityAttribute: ProgramTrackedEntityAttribute?, - optionSetConfiguration: OptionSetConfiguration?, - customIntent: CustomIntentModel? = null, - ): FieldUiModel = - fieldViewModelFactory.create( - id = trackedEntityAttribute.uid(), - label = trackedEntityAttribute.displayFormName() ?: "", - valueType = trackedEntityAttribute.valueType()!!, - mandatory = false, - optionSet = trackedEntityAttribute.optionSet()?.uid(), - value = null, - programStageSection = null, - allowFutureDates = programTrackedEntityAttribute?.allowFutureDate() ?: true, - editable = true, - renderingType = SectionRenderingType.LISTING, - description = null, - fieldRendering = programTrackedEntityAttribute?.renderType()?.mobile(), - objectStyle = trackedEntityAttribute.style() ?: ObjectStyle.builder().build(), - fieldMask = trackedEntityAttribute.fieldMask(), - optionSetConfiguration = optionSetConfiguration, - featureType = null, - customIntentModel = customIntent, - ) } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryKt.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryKt.kt index 43bde52a6f7..17f56679dee 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryKt.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryKt.kt @@ -1,23 +1,24 @@ package org.dhis2.usescases.searchTrackEntity import org.dhis2.data.search.SearchParametersModel -import org.dhis2.form.model.FieldUiModel import org.dhis2.maps.model.MapItemModel import org.dhis2.mobile.commons.model.CustomIntentModel +import org.dhis2.tracker.input.model.TrackerInputType import org.dhis2.tracker.input.ui.action.FieldUid +import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.android.core.program.Program interface SearchRepositoryKt { - suspend fun searchParameters( - programUid: String?, - teiTypeUid: String, - ): List - fun searchTeiForMap( searchParametersModel: SearchParametersModel, isOnline: Boolean, ): List + fun validateValue( + inputType: TrackerInputType, + value: String, + ): Any + fun searchEventForMap( teiUids: List, selectedProgram: Program?, @@ -36,4 +37,6 @@ interface SearchRepositoryKt { ): Boolean fun getExcludeValues(): HashSet? + + fun trackerValueTypeToSDKValueType(trackerInputType: TrackerInputType): ValueType? } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.kt index 87885c681dc..6c71aadcef9 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.kt @@ -54,7 +54,6 @@ import org.dhis2.commons.sync.SyncContext import org.dhis2.commons.sync.SyncContext.TrackerProgramTei import org.dhis2.data.forms.dataentry.ProgramAdapter import org.dhis2.databinding.ActivitySearchBinding -import org.dhis2.form.ui.intent.FormIntent.OnSave import org.dhis2.mobile.commons.orgunit.OrgUnitSelectorScope import org.dhis2.tracker.NavigationBarUIState import org.dhis2.ui.ThemeManager @@ -66,7 +65,7 @@ import org.dhis2.usescases.searchTrackEntity.LegacyInteraction.OnSyncIconClick import org.dhis2.usescases.searchTrackEntity.LegacyInteraction.OnTeiClick import org.dhis2.usescases.searchTrackEntity.listView.SearchTEList.Companion.get import org.dhis2.usescases.searchTrackEntity.mapView.SearchTEMap.Companion.get -import org.dhis2.usescases.searchTrackEntity.searchparameters.initSearchScreen +import org.dhis2.usescases.searchTrackEntity.searchparameters.provideSearchScreen import org.dhis2.usescases.searchTrackEntity.ui.SearchScreenConfigurator import org.dhis2.utils.customviews.BreakTheGlassBottomDialog import org.dhis2.utils.customviews.navigationbar.NavigationPage @@ -75,7 +74,6 @@ import org.dhis2.utils.granularsync.shouldLaunchSyncDialog import org.dhis2.utils.isLandscape import org.dhis2.utils.isPortrait import org.hisp.dhis.android.core.arch.call.D2Progress -import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.android.core.organisationunit.OrganisationUnit import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBar import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme @@ -336,7 +334,7 @@ class SearchTEActivity : } private fun initSearchParameters() { - initSearchScreen( + provideSearchScreen( binding.searchContainer, viewModel, initialProgram, @@ -352,14 +350,9 @@ class SearchTEActivity : if (selectedOrgUnits.isNotEmpty()) { selectedOrgUnit = selectedOrgUnits[0].uid() } - viewModel.onParameterIntent( - OnSave( - uid, - selectedOrgUnit, - ValueType.ORGANISATION_UNIT, - null, - true, - ), + viewModel.onValueChange( + fieldUid = uid, + value = selectedOrgUnit, ) }.orgUnitScope(orgUnitScope) .build() diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt index 3dd0c002743..c0076d8155a 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt @@ -23,6 +23,7 @@ import kotlinx.coroutines.async import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.emitAll import kotlinx.coroutines.flow.emptyFlow @@ -43,9 +44,7 @@ import org.dhis2.commons.filters.FilterManager import org.dhis2.commons.network.NetworkUtils import org.dhis2.commons.resources.ResourceManager import org.dhis2.commons.viewmodel.DispatcherProvider -import org.dhis2.form.model.FieldUiModelImpl import org.dhis2.form.ui.customintent.CustomIntentResult -import org.dhis2.form.ui.intent.FormIntent import org.dhis2.form.ui.provider.DisplayNameProvider import org.dhis2.maps.extensions.toStringProperty import org.dhis2.maps.layer.MapLayer @@ -54,21 +53,23 @@ import org.dhis2.maps.managers.MapManager import org.dhis2.maps.usecases.MapStyleConfiguration import org.dhis2.mobile.commons.coroutine.CoroutineTracker import org.dhis2.tracker.NavigationBarUIState +import org.dhis2.tracker.input.model.TrackerInputType import org.dhis2.tracker.input.ui.action.CustomIntentUid import org.dhis2.tracker.input.ui.action.FieldUid import org.dhis2.tracker.input.ui.action.TrackerInputAction +import org.dhis2.tracker.input.ui.mapper.toTrackerInputUiState +import org.dhis2.tracker.input.ui.state.TrackerOptionItem import org.dhis2.tracker.search.data.transformDomainTeiToSDKTei import org.dhis2.tracker.search.domain.FetchOptionSetOptions import org.dhis2.tracker.search.domain.FetchSearchParameters import org.dhis2.tracker.search.domain.SearchTrackedEntities +import org.dhis2.tracker.search.model.FetchSearchParametersData import org.dhis2.tracker.search.model.SearchTrackedEntitiesInput +import org.dhis2.tracker.search.ui.state.SearchParametersUiState import org.dhis2.usescases.searchTrackEntity.listView.SearchResult -import org.dhis2.usescases.searchTrackEntity.searchparameters.model.SearchParametersUiState import org.dhis2.usescases.searchTrackEntity.ui.UnableToSearchOutsideData import org.dhis2.utils.customviews.navigationbar.NavigationPage import org.dhis2.utils.customviews.navigationbar.NavigationPageConfigurator -import org.hisp.dhis.android.core.arch.helpers.Result -import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.android.core.maintenance.D2ErrorCode import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarItem import org.maplibre.geojson.Feature @@ -95,6 +96,12 @@ class SearchTEIViewModel( ) : ViewModel() { private var layersVisibility: Map = emptyMap() + // Store option set flows per field UID + private val optionSetFlows = mutableMapOf>>() + + // Store search query states for option sets + private val optionSetSearchQueries = mutableMapOf>() + private val pageConfiguration = MutableLiveData() private val _navigationBarUIState = @@ -188,6 +195,52 @@ class SearchTEIViewModel( } } + /** + * Get or create option set flow for a given field. + */ + fun getOptionSetFlow( + fieldUid: String, + optionSetUid: String, + ): Flow> = + optionSetFlows.getOrPut(fieldUid) { + flow { + val searchQuery = + optionSetSearchQueries.getOrPut(fieldUid) { + MutableStateFlow(null) + } + + searchQuery.collect { query -> + val result = + fetchOptionSetOptions( + FetchOptionSetOptions.Params( + optionSetUid = optionSetUid, + pageSize = 10, + searchQuery = query, + ), + ) + + result.fold( + onSuccess = { optionsFlow -> + emitAll(optionsFlow) + }, + onFailure = { + emit(PagingData.empty()) + }, + ) + } + }.cachedIn(viewModelScope) + } + + /** + * Handle search in option sets. + */ + fun onOptionSetSearch( + fieldUid: String, + query: String, + ) { + optionSetSearchQueries[fieldUid]?.value = query.takeIf { it.isNotBlank() } + } + private fun loadNavigationBarItems() { CoroutineTracker.increment() val pageConfigurator = searchNavPageConfigurator.initVariables() @@ -412,14 +465,14 @@ class SearchTEIViewModel( val updatedItems = searchParametersUiState.items.map { if (it.uid == uid) { - (it as FieldUiModelImpl).copy( + it.copy( value = values?.joinToString(","), displayName = displayNameProvider.provideDisplayName( - valueType = it.valueType, + valueType = searchRepositoryKt.trackerValueTypeToSDKValueType(it.valueType), value = values?.joinToString(","), optionSet = it.optionSet, - periodType = it.periodSelector?.type, + periodType = null, ), error = errorMessage, ) @@ -440,7 +493,7 @@ class SearchTEIViewModel( private fun clearSearchParameters() { val updatedItems = searchParametersUiState.items.map { - (it as FieldUiModelImpl).copy(value = null, displayName = null) + it.copy(value = null, displayName = null) } searchParametersUiState = searchParametersUiState.copy( @@ -474,7 +527,11 @@ class SearchTEIViewModel( val isOnline = searching && networkUtils.isOnline() val selectedProgram = searchRepository.getProgram(initialProgramUid) - val allowCache = searchRepositoryKt.saveSearchValuesAndGetAllowCache(queryData, selectedProgram?.uid()) + val allowCache = + searchRepositoryKt.saveSearchValuesAndGetAllowCache( + queryData, + selectedProgram?.uid(), + ) val newTrackerSearchModel = SearchTrackedEntitiesInput( selectedProgram = selectedProgram?.uid(), @@ -513,7 +570,11 @@ class SearchTEIViewModel( val excludeValues = searchRepositoryKt.getExcludeValues() val selectedProgram = searchRepository.getProgram(initialProgramUid) - val allowCache = searchRepositoryKt.saveSearchValuesAndGetAllowCache(queryData, selectedProgram?.uid()) + val allowCache = + searchRepositoryKt.saveSearchValuesAndGetAllowCache( + queryData, + selectedProgram?.uid(), + ) val newTrackerSearchModel = SearchTrackedEntitiesInput( selectedProgram = selectedProgram?.uid(), @@ -553,7 +614,11 @@ class SearchTEIViewModel( val isOnline = searching && networkUtils.isOnline() val selectedProgram = searchRepository.getProgram(initialProgramUid) - val allowCache = searchRepositoryKt.saveSearchValuesAndGetAllowCache(queryData, selectedProgram?.uid()) + val allowCache = + searchRepositoryKt.saveSearchValuesAndGetAllowCache( + queryData, + selectedProgram?.uid(), + ) val newTrackerSearchModel = SearchTrackedEntitiesInput( selectedProgram = null, @@ -1004,82 +1069,38 @@ class SearchTEIViewModel( fetchJob?.cancel() fetchJob = viewModelScope.launch { - val fieldUiModels = - searchRepositoryKt.searchParameters(programUid, teiTypeUid) - searchParametersUiState = searchParametersUiState.copy(items = fieldUiModels) + fetchSearchParameters + .invoke( + input = + FetchSearchParametersData( + teiTypeUid = teiTypeUid, + programUid = programUid, + ), + ).fold( + onSuccess = { searchParameters -> + searchParametersUiState = + searchParametersUiState.copy( + items = + searchParameters.map { searchParameter -> + searchParameter.toTrackerInputUiState() + }, + ) + }, + onFailure = { + // TODO(Implement error) + }, + ) } } - fun onParameterIntent(formIntent: FormIntent) = - when (formIntent) { - is FormIntent.OnTextChange -> { - updateQuery( - formIntent.uid, - formIntent.value?.split(","), - ) - } - - is FormIntent.OnSave -> { - updateQuery( - formIntent.uid, - formIntent.value?.split(","), - ) - } - - is FormIntent.OnQrCodeScanned -> { - onQrCodeScanned(formIntent) - } - - is FormIntent.OnFocus -> { - val updatedItems = - searchParametersUiState.items.map { field -> - if (field.focused && field.uid != formIntent.uid) { - val validation = - field.value - ?.takeIf { - field.valueType in - listOf( - ValueType.DATE, - ValueType.DATETIME, - ValueType.AGE, - ValueType.TIME, - ) - }?.let { value -> field.valueType?.validator?.validate(value) } - - (field as FieldUiModelImpl).copy( - focused = false, - error = - when (validation) { - is Result.Failure -> resourceManager.getString(R.string.formatting_error) - else -> null - }, - ) - } else if (field.uid == formIntent.uid) { - (field as FieldUiModelImpl).copy(focused = true) - } else { - field - } - } - searchParametersUiState = searchParametersUiState.copy(items = updatedItems) - } - - is FormIntent.ClearValue -> { - updateQuery( - formIntent.uid, - null, - ) - } - - else -> { - // no-op - } - } - - private fun onQrCodeScanned(formIntent: FormIntent.OnQrCodeScanned) { + private fun onQrCodeScanned( + uid: String, + value: String?, + ) { viewModelScope.launch { updateQuery( - formIntent.uid, - formIntent.value?.let { listOf(it) }, + uid, + value?.let { listOf(it) }, ) searching = queryData.isNotEmpty() @@ -1148,7 +1169,7 @@ class SearchTEIViewModel( val updatedItems = searchParametersUiState.items.map { if (it.focused) { - (it as FieldUiModelImpl).copy(focused = false) + it.copy(focused = false) } else { it } @@ -1163,35 +1184,37 @@ class SearchTEIViewModel( .forEach { item -> when (item.valueType) { - ValueType.ORGANISATION_UNIT, ValueType.MULTI_TEXT -> { + TrackerInputType.ORGANISATION_UNIT, TrackerInputType.MULTI_SELECTION -> { map[item.uid] = (item.displayName ?: "") } - ValueType.DATE, ValueType.AGE -> { + TrackerInputType.DATE, TrackerInputType.AGE -> { item.value?.let { map[item.uid] = it.toFriendlyDate() } } - ValueType.DATETIME -> { + TrackerInputType.DATE_TIME -> { item.value?.let { map[item.uid] = it.toFriendlyDateTime() } } - ValueType.BOOLEAN -> { - map[item.uid] = "${item.label}: ${item.value}" - } - - ValueType.TRUE_ONLY -> { + TrackerInputType.YES_ONLY_SWITCH, + TrackerInputType.YES_ONLY_CHECKBOX, + TrackerInputType.HORIZONTAL_RADIOBUTTONS, + TrackerInputType.VERTICAL_RADIOBUTTONS, + TrackerInputType.HORIZONTAL_CHECKBOXES, + TrackerInputType.VERTICAL_CHECKBOXES, + -> { item.value?.let { - if (it == "true") { - map[item.uid] = item.label + if (it == "true" || it == "false") { + map[item.uid] = "${item.label}: $it" } } } - ValueType.PERCENTAGE -> { + TrackerInputType.PERCENTAGE -> { item.value?.let { map[item.uid] = it.toPercentage() } @@ -1218,7 +1241,7 @@ class SearchTEIViewModel( fetchMapResults() } - fun onLaunchCustomIntent( + fun launchCustomIntent( fieldUid: FieldUid, customIntentUid: CustomIntentUid, ) { @@ -1234,6 +1257,55 @@ class SearchTEIViewModel( } } + fun launchScan( + fieldUid: String, + optionSet: String?, + renderType: TrackerInputType, + ) { + val scanType = + if (renderType == TrackerInputType.QR_CODE) { + TrackerInputType.QR_CODE + } else { + TrackerInputType.BAR_CODE + } + + viewModelScope.launch { + _searchActions.send( + TrackerInputAction.Scan( + fieldUid = fieldUid, + optionSet = optionSet, + renderType = scanType, + ), + ) + } + } + + fun onValueChange( + fieldUid: String, + value: String?, + ) { + updateQuery( + fieldUid, + value?.split(","), + ) + } + + fun onItemClick(fieldUid: FieldUid) { + searchParametersUiState + .copy( + items = + searchParametersUiState.items.map { + if (it.uid == fieldUid) { + it.copy(focused = true) + } else { + it.copy(focused = false) + } + }, + ).let { + searchParametersUiState = it + } + } + fun handleCustomIntentResult(customIntentResult: CustomIntentResult) { when (customIntentResult) { is CustomIntentResult.Error -> { @@ -1252,4 +1324,20 @@ class SearchTEIViewModel( } } } + + fun handleScanResult( + fieldUid: String, + value: String?, + ) { + onQrCodeScanned( + uid = fieldUid, + value = value, + ) + value?.let { + updateSearchParameters( + uid = fieldUid, + values = listOf(value), + ) + } + } } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java index 1d55b4a17b7..7f7dc950b7c 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java @@ -165,7 +165,6 @@ SearchRepository searchRepository(@NonNull D2 d2, FilterPresenter filterPresenter, ResourceManager resources, SearchSortingValueSetter searchSortingValueSetter, - DhisPeriodUtils periodUtils, Charts charts, CrashReportController crashReportController, NetworkUtils networkUtils, @@ -198,7 +197,6 @@ SearchRepositoryKt searchRepositoryKt( SearchRepository searchRepository, D2 d2, DispatcherProvider dispatcherProvider, - FieldViewModelFactory fieldViewModelFactory, MetadataIconProvider metadataIconProvider, ColorUtils colorUtils, DateUtils dateUtils, @@ -212,8 +210,6 @@ SearchRepositoryKt searchRepositoryKt( searchRepository, d2, dispatcherProvider, - fieldViewModelFactory, - metadataIconProvider, new TrackedEntityInstanceInfoProvider( d2, profilePictureProvider, diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreen.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreen.kt deleted file mode 100644 index 0103bee77e7..00000000000 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreen.kt +++ /dev/null @@ -1,495 +0,0 @@ -package org.dhis2.usescases.searchTrackEntity.searchparameters - -import android.content.res.Configuration -import androidx.activity.compose.rememberLauncherForActivityResult -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.calculateEndPadding -import androidx.compose.foundation.layout.calculateStartPadding -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.itemsIndexed -import androidx.compose.foundation.shape.CornerSize -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.outlined.Cancel -import androidx.compose.material.icons.outlined.ErrorOutline -import androidx.compose.material3.Icon -import androidx.compose.material3.Scaffold -import androidx.compose.material3.SnackbarDuration -import androidx.compose.material3.SnackbarHost -import androidx.compose.material3.SnackbarHostState -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.ComposeView -import androidx.compose.ui.platform.LocalConfiguration -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.platform.LocalLayoutDirection -import androidx.compose.ui.platform.testTag -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import com.journeyapps.barcodescanner.ScanOptions -import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.launch -import org.dhis2.R -import org.dhis2.commons.Constants -import org.dhis2.commons.resources.ColorUtils -import org.dhis2.commons.resources.ResourceManager -import org.dhis2.form.data.scan.ScanContract -import org.dhis2.form.model.FieldUiModel -import org.dhis2.form.model.FieldUiModelImpl -import org.dhis2.form.ui.customintent.CustomIntentActivityResultContract -import org.dhis2.form.ui.customintent.CustomIntentInput -import org.dhis2.form.ui.event.RecyclerViewUiEvents -import org.dhis2.form.ui.intent.FormIntent -import org.dhis2.mobile.commons.extensions.ObserveAsEvents -import org.dhis2.mobile.commons.orgunit.OrgUnitSelectorScope -import org.dhis2.tracker.input.ui.action.CustomIntentUid -import org.dhis2.tracker.input.ui.action.FieldUid -import org.dhis2.tracker.input.ui.action.TrackerInputAction -import org.dhis2.tracker.input.ui.action.TrackerInputUiEvent -import org.dhis2.tracker.search.ui.provider.provideParameterSelectorItem -import org.dhis2.usescases.searchTrackEntity.SearchTEIViewModel -import org.dhis2.usescases.searchTrackEntity.searchparameters.mapper.toParameterInputModel -import org.dhis2.usescases.searchTrackEntity.searchparameters.model.SearchParametersUiState -import org.hisp.dhis.android.core.common.ValueType -import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItemColor -import org.hisp.dhis.mobile.ui.designsystem.component.Button -import org.hisp.dhis.mobile.ui.designsystem.component.ButtonStyle -import org.hisp.dhis.mobile.ui.designsystem.component.InfoBar -import org.hisp.dhis.mobile.ui.designsystem.component.parameter.ParameterSelectorItem -import org.hisp.dhis.mobile.ui.designsystem.theme.Radius -import org.hisp.dhis.mobile.ui.designsystem.theme.Shape -import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor -import org.hisp.dhis.mobile.ui.designsystem.theme.TextColor - -@Composable -fun SearchParametersScreen( - resourceManager: ResourceManager, - uiState: SearchParametersUiState, - intentHandler: (FormIntent) -> Unit, - onShowOrgUnit: ( - uid: String, - preselectedOrgUnits: List, - orgUnitScope: OrgUnitSelectorScope, - label: String, - ) -> Unit, - onSearch: () -> Unit, - onClear: () -> Unit, - onClose: () -> Unit, - onLaunchCustomIntent: (FieldUid, CustomIntentUid) -> Unit, -) { - val snackBarHostState = remember { SnackbarHostState() } - val coroutineScope = rememberCoroutineScope() - val focusManager = LocalFocusManager.current - val configuration = LocalConfiguration.current - - val scanContract = remember { ScanContract() } - val qrScanLauncher = - rememberLauncherForActivityResult( - contract = scanContract, - ) { result -> - result.contents?.let { qrData -> - val intent = - FormIntent.OnQrCodeScanned( - uid = result.originalIntent.getStringExtra(Constants.UID)!!, - value = qrData, - valueType = ValueType.TEXT, - ) - intentHandler(intent) - } - } - - val callback = - remember { - object : FieldUiModel.Callback { - override fun intent(intent: FormIntent) { - intentHandler.invoke(intent) - } - - override fun recyclerViewUiEvents(uiEvent: RecyclerViewUiEvents) { - // no - op - } - } - } - - uiState.minAttributesMessage?.let { message -> - coroutineScope.launch { - uiState.shouldShowMinAttributeWarning.collectLatest { - if (it) { - snackBarHostState.showSnackbar( - message = message, - duration = SnackbarDuration.Short, - ) - uiState.updateMinAttributeWarning(false) - } - } - } - } - - LaunchedEffect(uiState.isOnBackPressed) { - uiState.isOnBackPressed.collectLatest { - if (it) { - focusManager.clearFocus() - onClose() - } - } - } - - val backgroundShape = - when (configuration.orientation) { - Configuration.ORIENTATION_LANDSCAPE -> - RoundedCornerShape( - topStart = CornerSize(Radius.L), - topEnd = CornerSize(Radius.NoRounding), - bottomEnd = CornerSize(Radius.NoRounding), - bottomStart = CornerSize(Radius.NoRounding), - ) - - else -> Shape.LargeTop - } - - Scaffold( - containerColor = Color.Transparent, - snackbarHost = { - SnackbarHost( - hostState = snackBarHostState, - modifier = - Modifier.padding( - start = 8.dp, - top = 8.dp, - end = 8.dp, - bottom = 48.dp, - ), - ) - }, - ) { paddingValues -> - val layoutDirection = LocalLayoutDirection.current - Column( - modifier = - Modifier - .fillMaxSize() - .background(color = Color.White, shape = backgroundShape) - .padding( - top = 0.dp, - bottom = paddingValues.calculateBottomPadding(), - start = paddingValues.calculateStartPadding(layoutDirection), - end = paddingValues.calculateEndPadding(layoutDirection), - ), - ) { - LazyColumn( - modifier = - Modifier - .weight(1F), - ) { - if (uiState.items.isEmpty()) { - item { - Box( - modifier = - Modifier - .fillMaxWidth() - .padding(16.dp), - contentAlignment = Alignment.Center, - ) { - InfoBar( - modifier = Modifier.testTag("EMPTY_SEARCH_ATTRIBUTES_TEXT_TAG"), - text = resourceManager.getString(R.string.empty_search_attributes_message), - icon = { - Icon( - imageVector = Icons.Outlined.ErrorOutline, - contentDescription = "warning", - tint = AdditionalInfoItemColor.WARNING.color, - ) - }, - textColor = AdditionalInfoItemColor.WARNING.color, - backgroundColor = AdditionalInfoItemColor.WARNING.color.copy(alpha = 0.1f), - ) - } - } - } else { - itemsIndexed( - items = uiState.items, - key = { _, fieldUiModel -> - fieldUiModel.uid - }, - ) { index, fieldUiModel -> - fieldUiModel.setCallback(callback) - ParameterSelectorItem( - modifier = - Modifier - .testTag("SEARCH_PARAM_ITEM"), - model = - provideParameterSelectorItem( - inputModel = - fieldUiModel.toParameterInputModel( - fetchOptions = { - fieldUiModel.optionSet?.let { optionSetUid -> - intentHandler( - FormIntent.FetchOptions( - uid = fieldUiModel.uid, - optionSetUid = optionSetUid, - value = fieldUiModel.value, - ), - ) - } - }, - resourceManager = resourceManager, - ), - // TODO is this always the same string?, check if it is optional somewhere - helperText = resourceManager.getString(R.string.optional), - onNextClicked = { - val nextIndex = index + 1 - if (nextIndex < uiState.items.size) { - uiState.items[nextIndex].onItemClick() - } - }, - onUiEvent = { uiEvent -> - when (uiEvent) { - is TrackerInputUiEvent.OnScanButtonClicked -> { - qrScanLauncher.launch( - ScanOptions().apply { - setDesiredBarcodeFormats() - setPrompt("") - setBeepEnabled(true) - setBarcodeImageEnabled(false) - addExtra(Constants.UID, uiEvent.uid) - fieldUiModel.optionSet?.let { - addExtra( - Constants.OPTION_SET, - it, - ) - } - addExtra( - Constants.SCAN_RENDERING_TYPE, - fieldUiModel.renderingType, - ) - }, - ) - } - - is TrackerInputUiEvent.OnOrgUnitButtonClicked -> { - onShowOrgUnit( - uiEvent.uid, - uiEvent.value?.let { listOf(it) } - ?: emptyList(), - fieldUiModel.orgUnitSelectorScope - ?: OrgUnitSelectorScope.UserSearchScope(), - uiEvent.label, - ) - } - - is TrackerInputUiEvent.OnLaunchCustomIntent -> { - onLaunchCustomIntent( - uiEvent.uid, - uiEvent.customIntentUid, - ) - } - - is TrackerInputUiEvent.OnItemClick -> { - fieldUiModel.onItemClick() - } - - is TrackerInputUiEvent.OnValueChange -> { - fieldUiModel.onSave(uiEvent.value) - } - } - }, - ), - ) - } - } - - if (uiState.clearSearchEnabled) { - item { - Box( - modifier = Modifier.fillMaxWidth(), - contentAlignment = Alignment.Center, - ) { - Button( - modifier = Modifier.padding(16.dp, 24.dp, 16.dp, 8.dp), - style = ButtonStyle.TEXT, - text = resourceManager.getString(R.string.clear_search), - icon = { - Icon( - imageVector = Icons.Outlined.Cancel, - contentDescription = resourceManager.getString(R.string.clear_search), - tint = SurfaceColor.Primary, - ) - }, - ) { - focusManager.clearFocus() - onClear() - } - } - } - } - } - - Button( - enabled = uiState.searchEnabled, - modifier = - Modifier - .fillMaxWidth() - .padding(16.dp, 8.dp, 16.dp, 8.dp) - .testTag("SEARCH_BUTTON"), - style = ButtonStyle.FILLED, - text = resourceManager.getString(R.string.search), - icon = { - val iconTint = - if (uiState.searchEnabled) { - TextColor.OnPrimary - } else { - TextColor.OnDisabledSurface - } - - Icon( - painter = painterResource(id = R.drawable.ic_search), - contentDescription = null, - tint = iconTint, - ) - }, - ) { - focusManager.clearFocus() - onSearch() - } - } - } -} - -@Preview(showBackground = true) -@Composable -fun SearchFormPreview() { - SearchParametersScreen( - resourceManager = ResourceManager(LocalContext.current, ColorUtils()), - uiState = - SearchParametersUiState( - items = - buildList { - repeat(times = 20) { index -> - add( - FieldUiModelImpl( - uid = "uid$index", - label = "Label $index", - autocompleteList = emptyList(), - optionSetConfiguration = null, - valueType = ValueType.TEXT, - ), - ) - } - }, - ), - intentHandler = {}, - onShowOrgUnit = { _, _, _, _ -> }, - onSearch = {}, - onClear = {}, - onClose = {}, - onLaunchCustomIntent = { _, _ -> }, - ) -} - -@Preview(showBackground = true) -@Composable -fun SearchFormPreviewWithClear() { - SearchParametersScreen( - resourceManager = ResourceManager(LocalContext.current, ColorUtils()), - uiState = - SearchParametersUiState( - items = - buildList { - repeat(times = 20) { index -> - add( - FieldUiModelImpl( - uid = "uid$index", - label = "Label $index", - value = "test value", - autocompleteList = emptyList(), - optionSetConfiguration = null, - valueType = ValueType.TEXT, - ), - ) - } - }, - ), - intentHandler = {}, - onShowOrgUnit = { _, _, _, _ -> }, - onSearch = {}, - onClear = {}, - onClose = {}, - onLaunchCustomIntent = { _, _ -> }, - ) -} - -fun initSearchScreen( - composeView: ComposeView, - viewModel: SearchTEIViewModel, - program: String?, - teiType: String, - resources: ResourceManager, - onShowOrgUnit: ( - uid: String, - preselectedOrgUnits: List, - orgUnitScope: OrgUnitSelectorScope, - label: String, - ) -> Unit, - onClear: () -> Unit, -) { - viewModel.fetchSearchParameters( - programUid = program, - teiTypeUid = teiType, - ) - composeView.setContent { - val launcher = - rememberLauncherForActivityResult( - contract = CustomIntentActivityResultContract(), - onResult = viewModel::handleCustomIntentResult, - ) - - ObserveAsEvents( - flow = viewModel.searchActions, - ) { action -> - when (action) { - is TrackerInputAction.LaunchCustomIntent -> { - launcher.launch( - with(action) { - CustomIntentInput( - fieldUid = fieldUid, - customIntent = customIntentModel, - defaultTitle = - customIntentModel.name - ?: resources.getString(org.dhis2.form.R.string.select_app_intent), - ) - }, - ) - } - - is TrackerInputAction.Scan -> {} // TODO to be implemented - is TrackerInputAction.ValueChanged -> {} // TODO to be implemented - } - } - - SearchParametersScreen( - resourceManager = resources, - uiState = viewModel.searchParametersUiState, - onSearch = viewModel::onSearch, - intentHandler = viewModel::onParameterIntent, - onShowOrgUnit = onShowOrgUnit, - onClear = { - onClear() - viewModel.clearQueryData() - viewModel.clearFocus() - }, - onClose = { viewModel.clearFocus() }, - onLaunchCustomIntent = viewModel::onLaunchCustomIntent, - ) - } -} diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreenProvider.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreenProvider.kt new file mode 100644 index 00000000000..f75a1882e43 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreenProvider.kt @@ -0,0 +1,175 @@ +package org.dhis2.usescases.searchTrackEntity.searchparameters + +import android.content.res.Configuration +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.compose.runtime.remember +import androidx.compose.ui.platform.ComposeView +import androidx.compose.ui.platform.LocalConfiguration +import com.journeyapps.barcodescanner.ScanOptions +import org.dhis2.commons.Constants +import org.dhis2.commons.resources.ResourceManager +import org.dhis2.form.R +import org.dhis2.form.data.scan.ScanContract +import org.dhis2.form.ui.customintent.CustomIntentActivityResultContract +import org.dhis2.form.ui.customintent.CustomIntentInput +import org.dhis2.mobile.commons.extensions.ObserveAsEvents +import org.dhis2.mobile.commons.orgunit.OrgUnitSelectorScope +import org.dhis2.tracker.input.ui.action.TrackerInputAction +import org.dhis2.tracker.input.ui.action.TrackerInputUiEvent +import org.dhis2.tracker.search.ui.action.SearchScreenUiEvent +import org.dhis2.tracker.search.ui.screen.SearchParametersScreen +import org.dhis2.usescases.searchTrackEntity.SearchTEIViewModel + +fun provideSearchScreen( + composeView: ComposeView, + viewModel: SearchTEIViewModel, + program: String?, + teiType: String, + resources: ResourceManager, + onShowOrgUnit: ( + uid: String, + preselectedOrgUnits: List, + orgUnitScope: OrgUnitSelectorScope, + label: String, + ) -> Unit, + onClear: () -> Unit, +) { + viewModel.fetchSearchParameters( + programUid = program, + teiTypeUid = teiType, + ) + composeView.setContent { + val customIntentlauncher = + rememberLauncherForActivityResult( + contract = CustomIntentActivityResultContract(), + onResult = viewModel::handleCustomIntentResult, + ) + + val scanContract = remember { ScanContract() } + + val qrScanLauncher = + rememberLauncherForActivityResult( + contract = scanContract, + ) { result -> + result.contents?.let { qrData -> + viewModel.handleScanResult( + fieldUid = result.originalIntent.getStringExtra(Constants.UID)!!, + value = qrData, + ) + } + } + + ObserveAsEvents( + flow = viewModel.searchActions, + ) { action -> + when (action) { + is TrackerInputAction.LaunchCustomIntent -> { + customIntentlauncher.launch( + with(action) { + CustomIntentInput( + fieldUid = fieldUid, + customIntent = customIntentModel, + defaultTitle = + customIntentModel.name + ?: resources.getString(R.string.select_app_intent), + ) + }, + ) + } + + is TrackerInputAction.Scan -> { + with(action) { + qrScanLauncher.launch( + ScanOptions().apply { + setDesiredBarcodeFormats() + setPrompt("") + setBeepEnabled(true) + setBarcodeImageEnabled(false) + addExtra(Constants.UID, fieldUid) + optionSet?.let { + addExtra( + Constants.OPTION_SET, + it, + ) + } + addExtra( + Constants.SCAN_RENDERING_TYPE, + renderType, + ) + }, + ) + } + } + + is TrackerInputAction.ValueChanged -> { + viewModel.onValueChange( + fieldUid = action.fieldUid, + value = action.value, + ) + } + } + } + + val configuration = LocalConfiguration.current + + val isLandscape = configuration.orientation == Configuration.ORIENTATION_LANDSCAPE + SearchParametersScreen( + uiState = viewModel.searchParametersUiState, + onSearchScreenUiEvent = { + when (it) { + is SearchScreenUiEvent.OnSearchButtonClicked -> + viewModel.onSearch() + + is SearchScreenUiEvent.OnClearSearchButtonClicked -> { + onClear() + viewModel.clearQueryData() + viewModel.clearFocus() + } + + is SearchScreenUiEvent.OnCloseClicked -> viewModel.clearFocus() + } + }, + isLandscape = isLandscape, + onTrackerInputUiEvent = { + when (it) { + is TrackerInputUiEvent.OnScanButtonClicked -> + viewModel.launchScan( + it.uid, + it.optionSet, + it.renderType, + ) + + is TrackerInputUiEvent.OnOrgUnitButtonClicked -> + onShowOrgUnit( + it.uid, + it.value?.let { listOf(it) } + ?: emptyList(), + it.orgUnitSelectorScope + ?: OrgUnitSelectorScope.UserSearchScope(), + it.label, + ) + + is TrackerInputUiEvent.OnLaunchCustomIntent -> + viewModel.launchCustomIntent( + it.uid, + it.customIntentUid, + ) + + is TrackerInputUiEvent.OnItemClick -> viewModel.onItemClick(it.uid) + + is TrackerInputUiEvent.OnValueChange -> + viewModel.onValueChange( + fieldUid = it.uid, + value = it.value, + ) + } + }, + getOptionSetFlow = { fieldUid, optionSetUid -> + viewModel.getOptionSetFlow(fieldUid, optionSetUid) + }, + onOptionSetSearch = { fieldUid, query -> + viewModel.onOptionSetSearch(fieldUid, query) + }, + ) + } +} diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapper.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapper.kt deleted file mode 100644 index a6ba90db778..00000000000 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapper.kt +++ /dev/null @@ -1,202 +0,0 @@ -package org.dhis2.usescases.searchTrackEntity.searchparameters.mapper - -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.derivedStateOf -import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember -import androidx.compose.ui.graphics.Color -import androidx.paging.compose.collectAsLazyPagingItems -import org.dhis2.commons.resources.ResourceManager -import org.dhis2.form.R -import org.dhis2.form.model.FieldUiModel -import org.dhis2.form.model.UiRenderType -import org.dhis2.tracker.input.model.TrackerInputType -import org.dhis2.tracker.input.ui.state.TrackerInputUiState -import org.dhis2.tracker.input.ui.state.TrackerOptionItem -import org.dhis2.tracker.input.ui.state.TrackerOptionSetConfiguration -import org.hisp.dhis.android.core.common.ValueType -import org.hisp.dhis.mobile.ui.designsystem.component.LegendData -import org.hisp.dhis.mobile.ui.designsystem.component.Orientation - -@Composable -fun FieldUiModel.toParameterInputModel( - fetchOptions: () -> Unit, - resourceManager: ResourceManager, -): TrackerInputUiState { - val trackerInputType = - when { - optionSet != null && valueType != ValueType.MULTI_TEXT -> { - getInputTypeForOptionSetByRenderingType(renderingType) - } - - customIntent != null -> { - TrackerInputType.CUSTOM_INTENT - } - - eventCategories != null -> { - TrackerInputType.NOT_SUPPORTED - } - - else -> getInputTypeByValueType(valueType, renderingType) - } - - return TrackerInputUiState( - uid = uid, - label = label, - value = value, - focused = focused, - valueType = trackerInputType, - optionSet = optionSet, - error = error, - warning = warning, - description = description, - mandatory = mandatory, - editable = editable, - legend = - legend?.let { - LegendData( - color = Color(it.color), - title = it.label ?: "", - popUpLegendDescriptionData = it.legendsInfo, - ) - }, - orientation = renderingType.getOrientation(), - optionSetConfiguration = - when (valueType) { - ValueType.BOOLEAN -> getBooleanOptionConfiguration(resourceManager) - else -> optionSetConfiguration?.toTrackerOptionSetConfiguration(fetchOptions) - }, - customIntentUid = customIntent?.uid, - displayName = displayName, - ) -} - -@Composable -private fun org.dhis2.form.model.OptionSetConfiguration.toTrackerOptionSetConfiguration( - fetchOptions: () -> Unit, -): TrackerOptionSetConfiguration { - val optionsData = - optionFlow - .collectAsLazyPagingItems() - .also { LaunchedEffect(this) { it.refresh() } } - - val options by remember { - derivedStateOf { - (0 until (optionsData.itemCount)).mapNotNull { index -> - optionsData[index]?.let { optionData -> - TrackerOptionItem( - code = optionData.option.code() ?: "", - displayName = optionData.option.displayName() ?: "", - ) - } - } - } - } - - return TrackerOptionSetConfiguration( - options = options, - onSearch = onSearch, - onLoadOptions = fetchOptions, - ) -} - -internal fun getInputTypeForOptionSetByRenderingType(renderingType: UiRenderType?): TrackerInputType = - when (renderingType) { - UiRenderType.HORIZONTAL_CHECKBOXES -> TrackerInputType.HORIZONTAL_CHECKBOXES - UiRenderType.VERTICAL_CHECKBOXES -> TrackerInputType.VERTICAL_CHECKBOXES - UiRenderType.HORIZONTAL_RADIOBUTTONS -> TrackerInputType.HORIZONTAL_RADIOBUTTONS - UiRenderType.VERTICAL_RADIOBUTTONS -> TrackerInputType.VERTICAL_RADIOBUTTONS - - UiRenderType.MATRIX -> TrackerInputType.MATRIX - - UiRenderType.SEQUENCIAL -> TrackerInputType.SEQUENTIAL - - else -> TrackerInputType.DROPDOWN - } - -internal fun getInputTypeByValueType( - valueType: ValueType?, - renderingType: UiRenderType?, -): TrackerInputType = - when (valueType) { - ValueType.TEXT -> { - when (renderingType) { - UiRenderType.QR_CODE, UiRenderType.GS1_DATAMATRIX -> TrackerInputType.QR_CODE - UiRenderType.BAR_CODE -> TrackerInputType.BAR_CODE - else -> TrackerInputType.TEXT - } - } - - ValueType.INTEGER_POSITIVE -> TrackerInputType.INTEGER_POSITIVE - ValueType.INTEGER_ZERO_OR_POSITIVE -> TrackerInputType.INTEGER_ZERO_OR_POSITIVE - ValueType.PERCENTAGE -> TrackerInputType.PERCENTAGE - ValueType.NUMBER -> TrackerInputType.NUMBER - ValueType.INTEGER_NEGATIVE -> TrackerInputType.INTEGER_NEGATIVE - ValueType.LONG_TEXT -> TrackerInputType.LONG_TEXT - ValueType.INTEGER -> TrackerInputType.INTEGER - ValueType.ORGANISATION_UNIT -> TrackerInputType.ORGANISATION_UNIT - ValueType.EMAIL -> TrackerInputType.EMAIL - ValueType.BOOLEAN -> { - when (renderingType) { - UiRenderType.HORIZONTAL_CHECKBOXES -> TrackerInputType.HORIZONTAL_CHECKBOXES - UiRenderType.VERTICAL_CHECKBOXES -> TrackerInputType.VERTICAL_CHECKBOXES - UiRenderType.HORIZONTAL_RADIOBUTTONS -> TrackerInputType.HORIZONTAL_RADIOBUTTONS - UiRenderType.VERTICAL_RADIOBUTTONS -> TrackerInputType.VERTICAL_RADIOBUTTONS - - else -> TrackerInputType.VERTICAL_RADIOBUTTONS - } - } - - ValueType.TRUE_ONLY -> { - when (renderingType) { - UiRenderType.TOGGLE -> TrackerInputType.YES_ONLY_SWITCH - else -> TrackerInputType.YES_ONLY_CHECKBOX - } - } - - ValueType.PHONE_NUMBER -> TrackerInputType.PHONE_NUMBER - ValueType.DATE -> TrackerInputType.DATE - ValueType.DATETIME -> TrackerInputType.DATE_TIME - ValueType.TIME -> TrackerInputType.TIME - - ValueType.AGE -> TrackerInputType.AGE - ValueType.MULTI_TEXT -> TrackerInputType.MULTI_SELECTION - - ValueType.USERNAME, - ValueType.LETTER, - ValueType.UNIT_INTERVAL, - ValueType.TRACKER_ASSOCIATE, - ValueType.REFERENCE, - ValueType.COORDINATE, - ValueType.IMAGE, - ValueType.FILE_RESOURCE, - ValueType.GEOJSON, - ValueType.URL, - null, - -> TrackerInputType.NOT_SUPPORTED - } - -internal fun UiRenderType?.getOrientation(): Orientation = - when (this) { - UiRenderType.HORIZONTAL_CHECKBOXES, - UiRenderType.HORIZONTAL_RADIOBUTTONS, - -> Orientation.HORIZONTAL - - else -> Orientation.VERTICAL - } - -internal fun getBooleanOptionConfiguration(resourceManager: ResourceManager) = - TrackerOptionSetConfiguration( - options = - listOf( - TrackerOptionItem( - true.toString(), - resourceManager.getString(R.string.yes), - ), - TrackerOptionItem( - false.toString(), - resourceManager.getString(R.string.no), - ), - ), - ) diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryTest.kt index 8883452d181..248187774ea 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryTest.kt @@ -15,7 +15,6 @@ import org.dhis2.data.sorting.SearchSortingValueSetter import org.dhis2.form.model.FieldUiModel import org.dhis2.form.model.FieldUiModelImpl import org.dhis2.form.model.UiRenderType -import org.dhis2.form.ui.FieldViewModelFactory import org.dhis2.mobile.commons.customintents.CustomIntentRepository import org.dhis2.mobile.commons.reporting.CrashReportController import org.dhis2.tracker.data.ProfilePictureProvider @@ -46,7 +45,6 @@ import org.hisp.dhis.android.core.trackedentity.TrackedEntityType import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItem import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItemAttribute import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItemHelper -import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Before @@ -62,7 +60,6 @@ import java.util.Date class SearchRepositoryTest { private val d2: D2 = Mockito.mock(D2::class.java, Mockito.RETURNS_DEEP_STUBS) - private val fieldViewModelFactory: FieldViewModelFactory = mock() private val metadataIconProvider: MetadataIconProvider = mock() private val dispatchers: DispatcherProvider = mock { @@ -75,18 +72,23 @@ class SearchRepositoryTest { private val trackedEntitySearchItemHelper: TrackedEntitySearchItemHelper = mock() private val enrollmentCollectionRepository: EnrollmentCollectionRepository = mock() - private val stringFilterConnector: StringFilterConnector = mock() - private val booleanFilterConnector: BooleanFilterConnector = mock() + private val stringFilterConnector: StringFilterConnector = + mock() + private val booleanFilterConnector: BooleanFilterConnector = + mock() private val programCollectionRepository: ProgramCollectionRepository = mock() - private val programReadOnlyOneObjectRepository: ReadOnlyOneObjectRepositoryFinalImpl = mock() + private val programReadOnlyOneObjectRepository: ReadOnlyOneObjectRepositoryFinalImpl = + mock() private val eventCollectionRepository: EventCollectionRepository = mock() private val eventStatusFilterConnector: EventStatusFilterConnector = mock() - private val stringEventFilterConnector: StringFilterConnector = mock() + private val stringEventFilterConnector: StringFilterConnector = + mock() private val orgUnitCollectionRepository: OrganisationUnitCollectionRepository = mock() - private val readOnlyOneObjectRepository: ReadOnlyOneObjectRepositoryFinalImpl = mock() + private val readOnlyOneObjectRepository: ReadOnlyOneObjectRepositoryFinalImpl = + mock() private val filterPresenter: FilterPresenter = mock() private val resourceManager: ResourceManager = mock() @@ -110,7 +112,9 @@ class SearchRepositoryTest { ) val trackedEntityAttributeCollection = mock() - whenever(d2.trackedEntityModule().trackedEntityAttributes()).thenReturn(trackedEntityAttributeCollection) + whenever(d2.trackedEntityModule().trackedEntityAttributes()).thenReturn( + trackedEntityAttributeCollection, + ) whenever(trackedEntityAttributeCollection.uid(anyString())).thenAnswer { invocation -> val uid = invocation.arguments[0] as String trackedEntityAttributes[uid] ?: createTrackedEntityAttributeRepository(uid, false) @@ -121,8 +125,6 @@ class SearchRepositoryTest { searchRepositoryJava = mock(), d2 = d2, dispatcher = dispatchers, - fieldViewModelFactory = fieldViewModelFactory, - metadataIconProvider = metadataIconProvider, trackedEntityInstanceInfoProvider = mock(), eventInfoProvider = mock(), customIntentRepository = customIntentRepository, @@ -148,23 +150,6 @@ class SearchRepositoryTest { ) } - @Test - fun shouldSortSearchParametersCorrectly() { - val mockData = createMockData() - val sortedData = searchRepository.sortSearchParameters(mockData) - - assertEquals("unique-code", sortedData[0].uid) - assertEquals("bp-number", sortedData[1].uid) - assertEquals("qr-code", sortedData[2].uid) - assertEquals("bar-code", sortedData[3].uid) - assertEquals("unique-id", sortedData[4].uid) - assertEquals("national-id", sortedData[5].uid) - assertEquals("first-name", sortedData[6].uid) - assertEquals("last-name", sortedData[7].uid) - assertEquals("phone-number", sortedData[8].uid) - assertEquals("state", sortedData[9].uid) - } - @Test fun shouldTransformToSearchTeiModelWithOverdueEvents() { val searchItem = getTrackedEntitySearchItem("header") @@ -359,7 +344,8 @@ class SearchRepositoryTest { enrollmentCollectionRepository.blockingGet(), ) doReturn enrollmentsForInfoToReturn - val programUid = if (enrollmentsForInfoToReturn.isNotEmpty()) enrollmentsForInfoToReturn[0].program() else "programUid" + val programUid = + if (enrollmentsForInfoToReturn.isNotEmpty()) enrollmentsForInfoToReturn[0].program() else "programUid" whenever(d2.programModule().programs()) doReturn programCollectionRepository whenever( programCollectionRepository.uid(any()), @@ -407,13 +393,23 @@ class SearchRepositoryTest { whenever( eventCollectionRepository.blockingGet(), ) doReturn eventsToReturn.filter { it.status() == EventStatus.OVERDUE } - whenever(eventStatusFilterConnector.eq(EventStatus.SCHEDULE)).thenReturn(eventCollectionRepository) - whenever(eventCollectionRepository.byStatus().eq(EventStatus.SCHEDULE)).thenReturn(eventCollectionRepository) - whenever(eventCollectionRepository.byProgramUid().eq(any())).thenReturn(eventCollectionRepository) - whenever(eventCollectionRepository.orderByDueDate(RepositoryScope.OrderByDirection.DESC)).thenReturn(eventCollectionRepository) + whenever(eventStatusFilterConnector.eq(EventStatus.SCHEDULE)).thenReturn( + eventCollectionRepository, + ) + whenever(eventCollectionRepository.byStatus().eq(EventStatus.SCHEDULE)).thenReturn( + eventCollectionRepository, + ) + whenever(eventCollectionRepository.byProgramUid().eq(any())).thenReturn( + eventCollectionRepository, + ) + whenever(eventCollectionRepository.orderByDueDate(RepositoryScope.OrderByDirection.DESC)).thenReturn( + eventCollectionRepository, + ) whenever(eventCollectionRepository.blockingGet()).thenReturn(eventsToReturn.filter { it.status() == EventStatus.SCHEDULE }) // mock orgUnitName(orgUnitUid) - whenever(d2.organisationUnitModule().organisationUnits()) doReturn orgUnitCollectionRepository + whenever( + d2.organisationUnitModule().organisationUnits(), + ) doReturn orgUnitCollectionRepository whenever( orgUnitCollectionRepository.uid(any()), ) doReturn readOnlyOneObjectRepository diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt index 174af457148..15c0e38e256 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt @@ -23,15 +23,14 @@ import org.dhis2.commons.filters.FilterManager import org.dhis2.commons.network.NetworkUtils import org.dhis2.commons.resources.ResourceManager import org.dhis2.commons.viewmodel.DispatcherProvider -import org.dhis2.form.model.FieldUiModel -import org.dhis2.form.model.FieldUiModelImpl import org.dhis2.form.ui.customintent.CustomIntentResult -import org.dhis2.form.ui.intent.FormIntent import org.dhis2.form.ui.provider.DisplayNameProvider import org.dhis2.maps.geometry.mapper.EventsByProgramStage import org.dhis2.maps.usecases.MapStyleConfiguration import org.dhis2.mobile.commons.model.CustomIntentModel +import org.dhis2.tracker.input.model.TrackerInputType import org.dhis2.tracker.input.ui.action.TrackerInputAction +import org.dhis2.tracker.input.ui.state.TrackerInputUiState import org.dhis2.tracker.search.domain.FetchOptionSetOptions import org.dhis2.tracker.search.domain.FetchSearchParameters import org.dhis2.tracker.search.domain.SearchTrackedEntities @@ -39,9 +38,9 @@ import org.dhis2.tracker.search.model.SearchTrackedEntitiesInput import org.dhis2.usescases.searchTrackEntity.listView.SearchResult.SearchResultType import org.dhis2.utils.customviews.navigationbar.NavigationPage import org.hisp.dhis.android.core.common.ObjectWithUid -import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.android.core.program.Program import org.hisp.dhis.android.core.trackedentity.TrackedEntityType +import org.hisp.dhis.mobile.ui.designsystem.component.Orientation import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarItem import org.junit.After import org.junit.Assert.assertTrue @@ -78,6 +77,7 @@ class SearchTEIViewModelTest { mock { onBlocking { invoke(any()) } doReturn Result.success(flowOf(PagingData.empty())) } + private val fetchSearchParameters: FetchSearchParameters = mock() private val fetchOptionSetOptions: FetchOptionSetOptions = mock() @@ -209,12 +209,9 @@ class SearchTEIViewModelTest { @Test fun `Should update query data`() { - viewModel.onParameterIntent( - FormIntent.OnSave( - uid = "testingUid", - value = "testingValue", - valueType = ValueType.TEXT, - ), + viewModel.onValueChange( + fieldUid = "testingUid", + value = "testingValue", ) val queryData = viewModel.queryData @@ -227,12 +224,9 @@ class SearchTEIViewModelTest { @Test fun `Should update query data when list of values is passed`() { - viewModel.onParameterIntent( - FormIntent.OnSave( - uid = "testingUid", - value = "testingValue,testingValue2", - valueType = ValueType.TEXT, - ), + viewModel.onValueChange( + fieldUid = "testingUid", + value = "testingValue,testingValue2", ) val queryData = viewModel.queryData @@ -247,20 +241,13 @@ class SearchTEIViewModelTest { @Test fun `Should update query data when various list of values are passed`() { - viewModel.onParameterIntent( - FormIntent.OnSave( - uid = "testingUid", - value = "testingValue,testingValue2", - valueType = ValueType.TEXT, - ), + viewModel.onValueChange( + fieldUid = "testingUid", + value = "testingValue,testingValue2", ) - - viewModel.onParameterIntent( - FormIntent.OnSave( - uid = "testingUid2", - value = "testingValue,testingValue2", - valueType = ValueType.TEXT, - ), + viewModel.onValueChange( + fieldUid = "testingUid2", + value = "testingValue,testingValue2", ) val queryData = viewModel.queryData @@ -367,13 +354,11 @@ class SearchTEIViewModelTest { setCurrentProgram(testingProgram()) viewModel.setListScreen() viewModel.setSearchScreen() - viewModel.onParameterIntent( - FormIntent.OnSave( - uid = "testingUid", - value = "testingValue", - valueType = ValueType.TEXT, - ), + viewModel.onValueChange( + fieldUid = "testingUid", + value = "testingValue", ) + viewModel.onSearch() assertTrue(viewModel.refreshData.value != null) @@ -403,13 +388,11 @@ class SearchTEIViewModelTest { setCurrentProgram(testingProgram()) viewModel.setMapScreen() viewModel.setSearchScreen() - viewModel.onParameterIntent( - FormIntent.OnSave( - uid = "testingUid", - value = "testingValue", - valueType = ValueType.TEXT, - ), + viewModel.onValueChange( + fieldUid = "testingUid", + value = "testingValue", ) + viewModel.onSearch() testingDispatcher.scheduler.advanceUntilIdle() @@ -724,7 +707,7 @@ class SearchTEIViewModelTest { @Test fun `should return user-friendly names on search parameters fields`() { viewModel.searchParametersUiState = - viewModel.searchParametersUiState.copy(items = getFieldUIModels()) + viewModel.searchParametersUiState.copy(items = getTrackerInputModels()) val expectedMap = mapOf( "uid1" to "Friendly OrgUnit Name", @@ -732,7 +715,7 @@ class SearchTEIViewModelTest { "uid3" to "21/02/2024", "uid4" to "21/02/2024 - 01:00", "uid5" to "Boolean: false", - "uid6" to "Yes Only", + "uid6" to "Yes Only: true", "uid7" to "Text value", "uid9" to "18%", ) @@ -745,7 +728,7 @@ class SearchTEIViewModelTest { @Test fun `should clear uiState when clearing data`() { viewModel.searchParametersUiState = - viewModel.searchParametersUiState.copy(items = getFieldUIModels()) + viewModel.searchParametersUiState.copy(items = getTrackerInputModels()) performSearch() viewModel.clearQueryData() assert(viewModel.queryData.isEmpty()) @@ -884,7 +867,7 @@ class SearchTEIViewModelTest { val customIntentModel: CustomIntentModel = mock() whenever(repositoryKt.getCustomIntent(any())) doReturn customIntentModel viewModel.searchActions.test { - viewModel.onLaunchCustomIntent("fieldUid", "customIntentUid") + viewModel.launchCustomIntent("fieldUid", "customIntentUid") assertTrue(awaitItem() is TrackerInputAction.LaunchCustomIntent) } } @@ -926,111 +909,244 @@ class SearchTEIViewModelTest { private fun customIntentFieldUIModels() = listOf( - FieldUiModelImpl( + TrackerInputUiState( uid = "fieldUid", label = "CustomIntent", value = null, - autocompleteList = emptyList(), + focused = false, + valueType = TrackerInputType.ORGANISATION_UNIT, + description = null, + mandatory = false, + editable = true, + legend = null, + orientation = Orientation.HORIZONTAL, optionSetConfiguration = null, - customIntent = - CustomIntentModel( - uid = "customIntentUid", - name = "test", - packageName = "test.test.test", - customIntentRequest = listOf(), - customIntentResponse = listOf(), - ), - valueType = ValueType.TEXT, + customIntentUid = "customIntentUid", + displayName = "Friendly OrgUnit Name", + orgUnitSelectorScope = null, + searchOperator = null, + minCharactersToSearch = null, + optionSet = null, + error = null, + warning = null, ), ) - private fun getMalformedDateFieldUIModels(): List = + private fun getMalformedDateFieldUIModels(): List = listOf( - FieldUiModelImpl( + TrackerInputUiState( uid = "uid1", label = "Date", value = "04", - autocompleteList = emptyList(), + focused = false, + valueType = TrackerInputType.DATE, + description = null, + mandatory = false, + editable = true, + legend = null, + orientation = Orientation.HORIZONTAL, optionSetConfiguration = null, - valueType = ValueType.DATE, + customIntentUid = null, + displayName = "Friendly OrgUnit Name", + orgUnitSelectorScope = null, + searchOperator = null, + minCharactersToSearch = null, + optionSet = null, + error = null, + warning = null, ), ) - private fun getFieldUIModels(): List = + private fun getTrackerInputModels(): List = listOf( - FieldUiModelImpl( + TrackerInputUiState( uid = "uid1", label = "Org Unit", value = "orgUnitUid", - displayName = "Friendly OrgUnit Name", - autocompleteList = emptyList(), + focused = false, + valueType = TrackerInputType.ORGANISATION_UNIT, + description = null, + mandatory = false, + editable = true, + legend = null, + orientation = Orientation.HORIZONTAL, optionSetConfiguration = null, - valueType = ValueType.ORGANISATION_UNIT, + customIntentUid = null, + displayName = "Friendly OrgUnit Name", + orgUnitSelectorScope = null, + searchOperator = null, + minCharactersToSearch = null, + optionSet = null, + error = null, + warning = null, ), - FieldUiModelImpl( + TrackerInputUiState( uid = "uid2", label = "Gender", value = "M", - displayName = "Male", - autocompleteList = emptyList(), + focused = false, + valueType = TrackerInputType.MULTI_SELECTION, + description = null, + mandatory = false, + editable = true, + legend = null, + orientation = Orientation.HORIZONTAL, optionSetConfiguration = null, - valueType = ValueType.MULTI_TEXT, + customIntentUid = null, + displayName = "Male", + orgUnitSelectorScope = null, + searchOperator = null, + minCharactersToSearch = null, + optionSet = null, + error = null, + warning = null, ), - FieldUiModelImpl( + TrackerInputUiState( uid = "uid3", label = "Date", value = "2024-02-21", - autocompleteList = emptyList(), + focused = false, + valueType = TrackerInputType.DATE, + description = null, + mandatory = false, + editable = true, + legend = null, + orientation = Orientation.HORIZONTAL, optionSetConfiguration = null, - valueType = ValueType.DATE, + customIntentUid = null, + displayName = "21/02/2024", + orgUnitSelectorScope = null, + searchOperator = null, + minCharactersToSearch = null, + optionSet = null, + error = null, + warning = null, ), - FieldUiModelImpl( + TrackerInputUiState( uid = "uid4", label = "Date and Time", value = "2024-02-21T01:00", - autocompleteList = emptyList(), + focused = false, + valueType = TrackerInputType.DATE_TIME, + description = null, + mandatory = false, + editable = true, + legend = null, + orientation = Orientation.HORIZONTAL, optionSetConfiguration = null, - valueType = ValueType.DATETIME, + customIntentUid = null, + displayName = "21/02/2024 - 01:00", + orgUnitSelectorScope = null, + searchOperator = null, + minCharactersToSearch = null, + optionSet = null, + error = null, + warning = null, ), - FieldUiModelImpl( + TrackerInputUiState( uid = "uid5", label = "Boolean", value = "false", - autocompleteList = emptyList(), + focused = false, + valueType = TrackerInputType.HORIZONTAL_CHECKBOXES, + description = null, + mandatory = false, + editable = true, + legend = null, + orientation = Orientation.HORIZONTAL, optionSetConfiguration = null, - valueType = ValueType.BOOLEAN, + customIntentUid = null, + displayName = "Boolean: false", + orgUnitSelectorScope = null, + searchOperator = null, + minCharactersToSearch = null, + optionSet = null, + error = null, + warning = null, ), - FieldUiModelImpl( + TrackerInputUiState( uid = "uid6", label = "Yes Only", value = "true", - autocompleteList = emptyList(), + focused = false, + valueType = TrackerInputType.YES_ONLY_SWITCH, + description = null, + mandatory = false, + editable = true, + legend = null, + orientation = Orientation.HORIZONTAL, optionSetConfiguration = null, - valueType = ValueType.TRUE_ONLY, + customIntentUid = null, + displayName = "Yes Only; true", + orgUnitSelectorScope = null, + searchOperator = null, + minCharactersToSearch = null, + optionSet = null, + error = null, + warning = null, ), - FieldUiModelImpl( + TrackerInputUiState( uid = "uid7", label = "Text", value = "Text value", - autocompleteList = emptyList(), + focused = false, + valueType = TrackerInputType.TEXT, + description = null, + mandatory = false, + editable = true, + legend = null, + orientation = Orientation.HORIZONTAL, optionSetConfiguration = null, - valueType = ValueType.TEXT, + customIntentUid = null, + displayName = "Text value", + orgUnitSelectorScope = null, + searchOperator = null, + minCharactersToSearch = null, + optionSet = null, + error = null, + warning = null, ), - FieldUiModelImpl( + TrackerInputUiState( uid = "uid8", label = "Other field", value = null, - autocompleteList = emptyList(), + focused = false, + valueType = TrackerInputType.TEXT, + description = null, + mandatory = false, + editable = true, + legend = null, + orientation = Orientation.HORIZONTAL, optionSetConfiguration = null, - valueType = ValueType.TEXT, + customIntentUid = null, + displayName = "Male", + orgUnitSelectorScope = null, + searchOperator = null, + minCharactersToSearch = null, + optionSet = null, + error = null, + warning = null, ), - FieldUiModelImpl( + TrackerInputUiState( uid = "uid9", label = "Percentage", value = "18", - autocompleteList = emptyList(), + focused = false, + valueType = TrackerInputType.PERCENTAGE, + description = null, + mandatory = false, + editable = true, + legend = null, + orientation = Orientation.HORIZONTAL, optionSetConfiguration = null, - valueType = ValueType.PERCENTAGE, + customIntentUid = null, + displayName = "18%", + orgUnitSelectorScope = null, + searchOperator = null, + minCharactersToSearch = null, + optionSet = null, + error = null, + warning = null, ), ) @@ -1062,12 +1178,9 @@ class SearchTEIViewModelTest { @ExperimentalCoroutinesApi private fun performSearch() { - viewModel.onParameterIntent( - FormIntent.OnSave( - uid = "testingUid", - value = "testingValue", - valueType = ValueType.TEXT, - ), + viewModel.onValueChange( + fieldUid = "testingUid", + value = "testingValue", ) viewModel.setListScreen() viewModel.setSearchScreen() diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapperTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapperTest.kt deleted file mode 100644 index e19f109a773..00000000000 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/searchparameters/mapper/ParameterInputModelMapperTest.kt +++ /dev/null @@ -1,334 +0,0 @@ -package org.dhis2.usescases.searchTrackEntity.searchparameters.mapper - -import org.dhis2.commons.resources.ResourceManager -import org.dhis2.form.R -import org.dhis2.form.model.UiRenderType -import org.dhis2.tracker.input.model.TrackerInputType -import org.hisp.dhis.android.core.common.ValueType -import org.hisp.dhis.mobile.ui.designsystem.component.Orientation -import org.junit.Assert.assertEquals -import org.junit.Before -import org.junit.Test -import org.mockito.kotlin.doReturn -import org.mockito.kotlin.mock -import org.mockito.kotlin.whenever - -class ParameterInputModelMapperTest { - private val resourceManager: ResourceManager = mock() - - @Before - fun setUp() { - whenever(resourceManager.getString(R.string.yes)) doReturn "Yes" - whenever(resourceManager.getString(R.string.no)) doReturn "No" - } - - // Test getInputTypeForOptionSetByRenderingType - @Test - fun `should return RADIO_BUTTON for horizontal radio buttons rendering type`() { - val result = getInputTypeForOptionSetByRenderingType(UiRenderType.HORIZONTAL_RADIOBUTTONS) - assertEquals(TrackerInputType.HORIZONTAL_RADIOBUTTONS, result) - } - - @Test - fun `should return RADIO_BUTTON for vertical radio buttons rendering type`() { - val result = getInputTypeForOptionSetByRenderingType(UiRenderType.VERTICAL_RADIOBUTTONS) - assertEquals(TrackerInputType.VERTICAL_RADIOBUTTONS, result) - } - - @Test - fun `should return CHECKBOX for horizontal checkboxes rendering type`() { - val result = getInputTypeForOptionSetByRenderingType(UiRenderType.HORIZONTAL_CHECKBOXES) - assertEquals(TrackerInputType.HORIZONTAL_CHECKBOXES, result) - } - - @Test - fun `should return CHECKBOX for vertical checkboxes rendering type`() { - val result = getInputTypeForOptionSetByRenderingType(UiRenderType.VERTICAL_CHECKBOXES) - assertEquals(TrackerInputType.VERTICAL_CHECKBOXES, result) - } - - @Test - fun `should return MATRIX for matrix rendering type`() { - val result = getInputTypeForOptionSetByRenderingType(UiRenderType.MATRIX) - assertEquals(TrackerInputType.MATRIX, result) - } - - @Test - fun `should return SEQUENTIAL for sequential rendering type`() { - val result = getInputTypeForOptionSetByRenderingType(UiRenderType.SEQUENCIAL) - assertEquals(TrackerInputType.SEQUENTIAL, result) - } - - @Test - fun `should return DROPDOWN for null rendering type`() { - val result = getInputTypeForOptionSetByRenderingType(null) - assertEquals(TrackerInputType.DROPDOWN, result) - } - - @Test - fun `should return DROPDOWN for default rendering type`() { - val result = getInputTypeForOptionSetByRenderingType(UiRenderType.DEFAULT) - assertEquals(TrackerInputType.DROPDOWN, result) - } - - // Test getInputTypeByValueType for TEXT - @Test - fun `should return TEXT for TEXT value type with default rendering`() { - val result = getInputTypeByValueType(ValueType.TEXT, null) - assertEquals(TrackerInputType.TEXT, result) - } - - @Test - fun `should return QR_CODE for TEXT value type with QR_CODE rendering`() { - val result = getInputTypeByValueType(ValueType.TEXT, UiRenderType.QR_CODE) - assertEquals(TrackerInputType.QR_CODE, result) - } - - @Test - fun `should return QR_CODE for TEXT value type with GS1_DATAMATRIX rendering`() { - val result = getInputTypeByValueType(ValueType.TEXT, UiRenderType.GS1_DATAMATRIX) - assertEquals(TrackerInputType.QR_CODE, result) - } - - @Test - fun `should return BAR_CODE for TEXT value type with BAR_CODE rendering`() { - val result = getInputTypeByValueType(ValueType.TEXT, UiRenderType.BAR_CODE) - assertEquals(TrackerInputType.BAR_CODE, result) - } - - // Test getInputTypeByValueType for numeric types - @Test - fun `should return INTEGER_POSITIVE for INTEGER_POSITIVE value type`() { - val result = getInputTypeByValueType(ValueType.INTEGER_POSITIVE, null) - assertEquals(TrackerInputType.INTEGER_POSITIVE, result) - } - - @Test - fun `should return INTEGER_ZERO_OR_POSITIVE for INTEGER_ZERO_OR_POSITIVE value type`() { - val result = getInputTypeByValueType(ValueType.INTEGER_ZERO_OR_POSITIVE, null) - assertEquals(TrackerInputType.INTEGER_ZERO_OR_POSITIVE, result) - } - - @Test - fun `should return PERCENTAGE for PERCENTAGE value type`() { - val result = getInputTypeByValueType(ValueType.PERCENTAGE, null) - assertEquals(TrackerInputType.PERCENTAGE, result) - } - - @Test - fun `should return NUMBER for NUMBER value type`() { - val result = getInputTypeByValueType(ValueType.NUMBER, null) - assertEquals(TrackerInputType.NUMBER, result) - } - - @Test - fun `should return INTEGER_NEGATIVE for INTEGER_NEGATIVE value type`() { - val result = getInputTypeByValueType(ValueType.INTEGER_NEGATIVE, null) - assertEquals(TrackerInputType.INTEGER_NEGATIVE, result) - } - - @Test - fun `should return INTEGER for INTEGER value type`() { - val result = getInputTypeByValueType(ValueType.INTEGER, null) - assertEquals(TrackerInputType.INTEGER, result) - } - - // Test getInputTypeByValueType for text types - @Test - fun `should return LONG_TEXT for LONG_TEXT value type`() { - val result = getInputTypeByValueType(ValueType.LONG_TEXT, null) - assertEquals(TrackerInputType.LONG_TEXT, result) - } - - @Test - fun `should return EMAIL for EMAIL value type`() { - val result = getInputTypeByValueType(ValueType.EMAIL, null) - assertEquals(TrackerInputType.EMAIL, result) - } - - @Test - fun `should return PHONE_NUMBER for PHONE_NUMBER value type`() { - val result = getInputTypeByValueType(ValueType.PHONE_NUMBER, null) - assertEquals(TrackerInputType.PHONE_NUMBER, result) - } - - // Test getInputTypeByValueType for BOOLEAN - @Test - fun `should return RADIO_BUTTON for BOOLEAN value type with default rendering`() { - val result = getInputTypeByValueType(ValueType.BOOLEAN, null) - assertEquals(TrackerInputType.VERTICAL_RADIOBUTTONS, result) - } - - @Test - fun `should return CHECKBOX for BOOLEAN value type with horizontal checkboxes rendering`() { - val result = getInputTypeByValueType(ValueType.BOOLEAN, UiRenderType.HORIZONTAL_CHECKBOXES) - assertEquals(TrackerInputType.HORIZONTAL_CHECKBOXES, result) - } - - @Test - fun `should return CHECKBOX for BOOLEAN value type with vertical checkboxes rendering`() { - val result = getInputTypeByValueType(ValueType.BOOLEAN, UiRenderType.VERTICAL_CHECKBOXES) - assertEquals(TrackerInputType.VERTICAL_CHECKBOXES, result) - } - - // Test getInputTypeByValueType for TRUE_ONLY - @Test - fun `should return YES_ONLY_CHECKBOX for TRUE_ONLY value type with default rendering`() { - val result = getInputTypeByValueType(ValueType.TRUE_ONLY, null) - assertEquals(TrackerInputType.YES_ONLY_CHECKBOX, result) - } - - @Test - fun `should return YES_ONLY_SWITCH for TRUE_ONLY value type with toggle rendering`() { - val result = getInputTypeByValueType(ValueType.TRUE_ONLY, UiRenderType.TOGGLE) - assertEquals(TrackerInputType.YES_ONLY_SWITCH, result) - } - - // Test getInputTypeByValueType for date/time types - @Test - fun `should return DATE for DATE value type`() { - val result = getInputTypeByValueType(ValueType.DATE, null) - assertEquals(TrackerInputType.DATE, result) - } - - @Test - fun `should return DATE_TIME for DATETIME value type`() { - val result = getInputTypeByValueType(ValueType.DATETIME, null) - assertEquals(TrackerInputType.DATE_TIME, result) - } - - @Test - fun `should return TIME for TIME value type`() { - val result = getInputTypeByValueType(ValueType.TIME, null) - assertEquals(TrackerInputType.TIME, result) - } - - @Test - fun `should return AGE for AGE value type`() { - val result = getInputTypeByValueType(ValueType.AGE, null) - assertEquals(TrackerInputType.AGE, result) - } - - // Test getInputTypeByValueType for other supported types - @Test - fun `should return ORGANISATION_UNIT for ORGANISATION_UNIT value type`() { - val result = getInputTypeByValueType(ValueType.ORGANISATION_UNIT, null) - assertEquals(TrackerInputType.ORGANISATION_UNIT, result) - } - - @Test - fun `should return MULTI_SELECTION for MULTI_TEXT value type`() { - val result = getInputTypeByValueType(ValueType.MULTI_TEXT, null) - assertEquals(TrackerInputType.MULTI_SELECTION, result) - } - - // Test getInputTypeByValueType for NOT_SUPPORTED types - @Test - fun `should return NOT_SUPPORTED for USERNAME value type`() { - val result = getInputTypeByValueType(ValueType.USERNAME, null) - assertEquals(TrackerInputType.NOT_SUPPORTED, result) - } - - @Test - fun `should return NOT_SUPPORTED for LETTER value type`() { - val result = getInputTypeByValueType(ValueType.LETTER, null) - assertEquals(TrackerInputType.NOT_SUPPORTED, result) - } - - @Test - fun `should return NOT_SUPPORTED for UNIT_INTERVAL value type`() { - val result = getInputTypeByValueType(ValueType.UNIT_INTERVAL, null) - assertEquals(TrackerInputType.NOT_SUPPORTED, result) - } - - @Test - fun `should return NOT_SUPPORTED for TRACKER_ASSOCIATE value type`() { - val result = getInputTypeByValueType(ValueType.TRACKER_ASSOCIATE, null) - assertEquals(TrackerInputType.NOT_SUPPORTED, result) - } - - @Test - fun `should return NOT_SUPPORTED for REFERENCE value type`() { - val result = getInputTypeByValueType(ValueType.REFERENCE, null) - assertEquals(TrackerInputType.NOT_SUPPORTED, result) - } - - @Test - fun `should return NOT_SUPPORTED for COORDINATE value type`() { - val result = getInputTypeByValueType(ValueType.COORDINATE, null) - assertEquals(TrackerInputType.NOT_SUPPORTED, result) - } - - @Test - fun `should return NOT_SUPPORTED for IMAGE value type`() { - val result = getInputTypeByValueType(ValueType.IMAGE, null) - assertEquals(TrackerInputType.NOT_SUPPORTED, result) - } - - @Test - fun `should return NOT_SUPPORTED for FILE_RESOURCE value type`() { - val result = getInputTypeByValueType(ValueType.FILE_RESOURCE, null) - assertEquals(TrackerInputType.NOT_SUPPORTED, result) - } - - @Test - fun `should return NOT_SUPPORTED for GEOJSON value type`() { - val result = getInputTypeByValueType(ValueType.GEOJSON, null) - assertEquals(TrackerInputType.NOT_SUPPORTED, result) - } - - @Test - fun `should return NOT_SUPPORTED for URL value type`() { - val result = getInputTypeByValueType(ValueType.URL, null) - assertEquals(TrackerInputType.NOT_SUPPORTED, result) - } - - @Test - fun `should return NOT_SUPPORTED for null value type`() { - val result = getInputTypeByValueType(null, null) - assertEquals(TrackerInputType.NOT_SUPPORTED, result) - } - - // Test getOrientation - @Test - fun `should return HORIZONTAL for horizontal checkboxes rendering type`() { - val result = UiRenderType.HORIZONTAL_CHECKBOXES.getOrientation() - assertEquals(Orientation.HORIZONTAL, result) - } - - @Test - fun `should return HORIZONTAL for horizontal radio buttons rendering type`() { - val result = UiRenderType.HORIZONTAL_RADIOBUTTONS.getOrientation() - assertEquals(Orientation.HORIZONTAL, result) - } - - @Test - fun `should return VERTICAL for vertical checkboxes rendering type`() { - val result = UiRenderType.VERTICAL_CHECKBOXES.getOrientation() - assertEquals(Orientation.VERTICAL, result) - } - - @Test - fun `should return VERTICAL for null rendering type`() { - val result = (null as UiRenderType?).getOrientation() - assertEquals(Orientation.VERTICAL, result) - } - - @Test - fun `should return VERTICAL for default rendering type`() { - val result = UiRenderType.DEFAULT.getOrientation() - assertEquals(Orientation.VERTICAL, result) - } - - // Test getBooleanOptionConfiguration - @Test - fun `should return correct boolean option configuration`() { - val result = getBooleanOptionConfiguration(resourceManager) - - assertEquals(2, result.options.size) - assertEquals("true", result.options[0].code) - assertEquals("Yes", result.options[0].displayName) - assertEquals("false", result.options[1].code) - assertEquals("No", result.options[1].displayName) - } -} diff --git a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepositoryImpl.kt b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepositoryImpl.kt index c07bfb58cdf..533b3056919 100644 --- a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepositoryImpl.kt +++ b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepositoryImpl.kt @@ -2,6 +2,7 @@ package org.dhis2.tracker.search.data import androidx.paging.PagingData import androidx.paging.map +import kotlinx.coroutines.CancellationException import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.emitAll import kotlinx.coroutines.flow.flow @@ -61,6 +62,8 @@ class OptionSetRepositoryImpl( } emitAll(pagingFlow) + } catch (e: CancellationException) { + // Rethrow CancellationException to properly cancel the coroutine } catch (d2Error: D2Error) { throw domainErrorMapper.mapToDomainError(d2Error) } catch (e: Exception) { diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/action/TrackerInputUiEvent.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/action/TrackerInputUiEvent.kt index ec534567ff9..afcb2632da3 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/action/TrackerInputUiEvent.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/action/TrackerInputUiEvent.kt @@ -1,14 +1,20 @@ package org.dhis2.tracker.input.ui.action +import org.dhis2.mobile.commons.orgunit.OrgUnitSelectorScope +import org.dhis2.tracker.input.model.TrackerInputType + sealed interface TrackerInputUiEvent { data class OnScanButtonClicked( val uid: String, + val optionSet: String?, + val renderType: TrackerInputType, ) : TrackerInputUiEvent data class OnOrgUnitButtonClicked( val uid: String, val label: String, val value: String?, + val orgUnitSelectorScope: OrgUnitSelectorScope?, ) : TrackerInputUiEvent data class OnLaunchCustomIntent( diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/mapper/TrackerInputUiStateMapper.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/mapper/TrackerInputUiStateMapper.kt index ccc444b6463..ed9ea3431b0 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/mapper/TrackerInputUiStateMapper.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/mapper/TrackerInputUiStateMapper.kt @@ -23,6 +23,9 @@ fun SearchParameterModel.toTrackerInputUiState() = optionSetConfiguration = null, customIntentUid = customIntentUid, displayName = null, + orgUnitSelectorScope = null, + searchOperator = searchOperator, + minCharactersToSearch = minCharactersToSearch, ) private fun TrackerInputType.getOrientation(): Orientation = diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt index 0fc4fba9c20..2f81fb85c54 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt @@ -14,6 +14,7 @@ import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.TextFieldValue +import org.dhis2.mobile.commons.orgunit.OrgUnitSelectorScope import org.dhis2.mobile.tracker.resources.Res import org.dhis2.mobile.tracker.resources.custom_intent_launch import org.dhis2.tracker.input.model.TrackerInputType @@ -428,6 +429,9 @@ fun TrackerInputProvider( uid = inputModel.uid, label = inputModel.label, value = inputModel.value, + orgUnitSelectorScope = + inputModel.orgUnitSelectorScope + ?: OrgUnitSelectorScope.UserSearchScope(), ), ) }, @@ -498,6 +502,8 @@ fun TrackerInputProvider( onUiEvent( TrackerInputUiEvent.OnScanButtonClicked( uid = inputModel.uid, + optionSet = inputModel.optionSet, + renderType = inputModel.valueType, ), ) }, @@ -527,6 +533,8 @@ fun TrackerInputProvider( onUiEvent( TrackerInputUiEvent.OnScanButtonClicked( uid = inputModel.uid, + optionSet = inputModel.optionSet, + renderType = inputModel.valueType, ), ) }, @@ -765,4 +773,4 @@ fun manageOnValueChange( } } -private fun getYesOnlyValue(checked: Boolean): String? = if (checked) "true" else null +private fun getYesOnlyValue(checked: Boolean): String? = if (!checked) "true" else null diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerInputUiState.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerInputUiState.kt index 6fbef970209..85f029905fc 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerInputUiState.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerInputUiState.kt @@ -1,11 +1,28 @@ package org.dhis2.tracker.input.ui.state +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.paging.PagingData +import androidx.paging.compose.collectAsLazyPagingItems +import kotlinx.coroutines.flow.Flow +import org.dhis2.mobile.commons.orgunit.OrgUnitSelectorScope +import org.dhis2.mobile.tracker.resources.Res +import org.dhis2.mobile.tracker.resources.end_with_search_operator +import org.dhis2.mobile.tracker.resources.equal_search_operator +import org.dhis2.mobile.tracker.resources.no +import org.dhis2.mobile.tracker.resources.starts_with_search_operator +import org.dhis2.mobile.tracker.resources.yes import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.search.model.SearchOperator import org.hisp.dhis.mobile.ui.designsystem.component.InputShellState import org.hisp.dhis.mobile.ui.designsystem.component.LegendData import org.hisp.dhis.mobile.ui.designsystem.component.Orientation import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextData import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextState +import org.jetbrains.compose.resources.stringResource data class TrackerInputUiState( val uid: String, @@ -21,11 +38,15 @@ data class TrackerInputUiState( val editable: Boolean, val legend: LegendData?, val orientation: Orientation, - val optionSetConfiguration: TrackerOptionSetConfiguration? = null, - val customIntentUid: String? = null, + val optionSetConfiguration: TrackerOptionSetConfiguration?, + val customIntentUid: String?, val displayName: String?, + val orgUnitSelectorScope: OrgUnitSelectorScope?, + val searchOperator: SearchOperator?, + val minCharactersToSearch: Int?, ) +@Composable fun TrackerInputUiState.supportingText(): List? = listOfNotNull( error?.let { @@ -40,6 +61,14 @@ fun TrackerInputUiState.supportingText(): List? = SupportingTextState.WARNING, ) }, + searchOperator?.let { operator -> + operator.supportingTextString()?.let { text -> + SupportingTextData( + text, + SupportingTextState.DEFAULT, + ) + } + }, description?.let { SupportingTextData( it, @@ -55,3 +84,101 @@ fun TrackerInputUiState.inputState(): InputShellState = focused -> InputShellState.FOCUSED else -> InputShellState.UNFOCUSED } + +@Composable +private fun SearchOperator.supportingTextString() = + when (this) { + SearchOperator.EQ -> + stringResource(Res.string.equal_search_operator) + SearchOperator.SW -> + stringResource(Res.string.starts_with_search_operator) + SearchOperator.EW -> + stringResource(Res.string.end_with_search_operator) + else -> null + } + +@Composable +fun TrackerInputUiState.loadOptionSetConfiguration( + getOptionSetFlow: (fieldUid: String, optionSetUid: String) -> Flow>?, + onOptionSetSearch: (fieldUid: String, query: String) -> Unit, +): TrackerInputUiState = + when { + valueType == TrackerInputType.YES_ONLY_CHECKBOX || + valueType == TrackerInputType.YES_ONLY_SWITCH || ( + optionSet == null && ( + valueType == TrackerInputType.HORIZONTAL_CHECKBOXES || + valueType == TrackerInputType.HORIZONTAL_RADIOBUTTONS || + valueType == TrackerInputType.VERTICAL_CHECKBOXES || + valueType == TrackerInputType.VERTICAL_RADIOBUTTONS + ) + ) + -> + this.getBooleanOptionConfiguration() + + optionSet != null -> { + val optionSetFlow = + getOptionSetFlow( + uid, + optionSet, + ) + this.loadWithOptionSetFlow( + optionSetFlow = optionSetFlow, + onSearch = { query -> + onOptionSetSearch(uid, query) + }, + ) + } + + else -> this + } + +@Composable +private fun TrackerInputUiState.getBooleanOptionConfiguration(): TrackerInputUiState { + val booleanConfiguration = + TrackerOptionSetConfiguration( + options = + listOf( + TrackerOptionItem( + code = true.toString(), + displayName = stringResource(Res.string.yes), + ), + TrackerOptionItem( + code = false.toString(), + displayName = stringResource(Res.string.no), + ), + ), + ) + + return copy(optionSetConfiguration = booleanConfiguration) +} + +@Composable +private fun TrackerInputUiState.loadWithOptionSetFlow( + optionSetFlow: Flow>?, + onSearch: ((String) -> Unit)?, +): TrackerInputUiState { + if (optionSetFlow == null) return this + + val optionsData = optionSetFlow.collectAsLazyPagingItems() + + LaunchedEffect(Unit) { + optionsData.refresh() + } + + val options by remember { + derivedStateOf { + (0 until optionsData.itemCount).mapNotNull { index -> + optionsData[index] + } + } + } + + return copy( + optionSetConfiguration = + TrackerOptionSetConfiguration( + options = options, + onSearch = onSearch, + onLoadOptions = { optionsData.refresh() }, + ), + ) +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/provider/ParameterSelectorItemProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/provider/ParameterSelectorItemProvider.kt index 519d2e211c3..f7aa6f5a9ab 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/provider/ParameterSelectorItemProvider.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/provider/ParameterSelectorItemProvider.kt @@ -51,7 +51,13 @@ fun provideParameterSelectorItem( TrackerInputType.QR_CODE, TrackerInputType.BAR_CODE, -> - onUiEvent(TrackerInputUiEvent.OnScanButtonClicked(inputModel.uid)) + onUiEvent( + TrackerInputUiEvent.OnScanButtonClicked( + inputModel.uid, + inputModel.optionSet, + inputModel.valueType, + ), + ) else -> { // no-op diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/screen/SearchParametersScreen.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/screen/SearchParametersScreen.kt new file mode 100644 index 00000000000..368e69323d0 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/screen/SearchParametersScreen.kt @@ -0,0 +1,282 @@ +package org.dhis2.tracker.search.ui.screen + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.calculateEndPadding +import androidx.compose.foundation.layout.calculateStartPadding +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.shape.CornerSize +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Cancel +import androidx.compose.material.icons.outlined.ErrorOutline +import androidx.compose.material.icons.outlined.Search +import androidx.compose.material3.Icon +import androidx.compose.material3.Scaffold +import androidx.compose.material3.SnackbarDuration +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusManager +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.platform.LocalLayoutDirection +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.unit.dp +import androidx.paging.PagingData +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch +import org.dhis2.mobile.tracker.resources.Res +import org.dhis2.mobile.tracker.resources.clear_search +import org.dhis2.mobile.tracker.resources.empty_search_attributes_message +import org.dhis2.mobile.tracker.resources.optional +import org.dhis2.mobile.tracker.resources.search +import org.dhis2.tracker.input.ui.action.TrackerInputUiEvent +import org.dhis2.tracker.input.ui.state.TrackerInputUiState +import org.dhis2.tracker.input.ui.state.TrackerOptionItem +import org.dhis2.tracker.input.ui.state.loadOptionSetConfiguration +import org.dhis2.tracker.search.ui.action.SearchScreenUiEvent +import org.dhis2.tracker.search.ui.provider.provideParameterSelectorItem +import org.dhis2.tracker.search.ui.state.SearchParametersUiState +import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItemColor +import org.hisp.dhis.mobile.ui.designsystem.component.Button +import org.hisp.dhis.mobile.ui.designsystem.component.ButtonStyle +import org.hisp.dhis.mobile.ui.designsystem.component.InfoBar +import org.hisp.dhis.mobile.ui.designsystem.component.parameter.ParameterSelectorItem +import org.hisp.dhis.mobile.ui.designsystem.theme.Radius +import org.hisp.dhis.mobile.ui.designsystem.theme.Shape +import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor +import org.hisp.dhis.mobile.ui.designsystem.theme.TextColor +import org.jetbrains.compose.resources.stringResource + +@Composable +fun SearchParametersScreen( + uiState: SearchParametersUiState, + onSearchScreenUiEvent: (SearchScreenUiEvent) -> Unit, + onTrackerInputUiEvent: (TrackerInputUiEvent) -> Unit, + isLandscape: Boolean, + getOptionSetFlow: (fieldUid: String, optionSetUid: String) -> Flow>?, + onOptionSetSearch: (fieldUid: String, query: String) -> Unit, +) { + val snackBarHostState = remember { SnackbarHostState() } + val coroutineScope = rememberCoroutineScope() + val focusManager = LocalFocusManager.current + + uiState.minAttributesMessage?.let { message -> + coroutineScope.launch { + uiState.shouldShowMinAttributeWarning.collectLatest { + if (it) { + snackBarHostState.showSnackbar( + message = message, + duration = SnackbarDuration.Short, + ) + uiState.updateMinAttributeWarning(false) + } + } + } + } + + LaunchedEffect(uiState.isOnBackPressed) { + uiState.isOnBackPressed.collectLatest { + manageOnBackPressed(it, focusManager, onSearchScreenUiEvent) + } + } + + val backgroundShape = getBackgroundShape(isLandscape) + + Scaffold( + containerColor = Color.Transparent, + snackbarHost = { + SnackbarHost( + hostState = snackBarHostState, + modifier = + Modifier.padding( + start = 8.dp, + top = 8.dp, + end = 8.dp, + bottom = 48.dp, + ), + ) + }, + ) { paddingValues -> + val layoutDirection = LocalLayoutDirection.current + Column( + modifier = + Modifier + .fillMaxSize() + .background(color = Color.White, shape = backgroundShape) + .padding( + top = 0.dp, + bottom = paddingValues.calculateBottomPadding(), + start = paddingValues.calculateStartPadding(layoutDirection), + end = paddingValues.calculateEndPadding(layoutDirection), + ), + ) { + LazyColumn( + modifier = + Modifier + .weight(1F), + ) { + if (uiState.items.isEmpty()) { + item { + Box( + modifier = + Modifier + .fillMaxWidth() + .padding(16.dp), + contentAlignment = Alignment.Center, + ) { + InfoBar( + modifier = Modifier.testTag("EMPTY_SEARCH_ATTRIBUTES_TEXT_TAG"), + text = stringResource(Res.string.empty_search_attributes_message), + icon = { + Icon( + imageVector = Icons.Outlined.ErrorOutline, + contentDescription = "warning", + tint = AdditionalInfoItemColor.WARNING.color, + ) + }, + textColor = AdditionalInfoItemColor.WARNING.color, + backgroundColor = AdditionalInfoItemColor.WARNING.color.copy(alpha = 0.1f), + ) + } + } + } else { + itemsIndexed( + items = uiState.items, + key = { _, fieldUiModel -> + fieldUiModel.uid + }, + ) { index, trackerInputModel -> + ParameterSelectorItem( + modifier = + Modifier + .testTag("SEARCH_PARAM_ITEM"), + model = + provideParameterSelectorItem( + inputModel = + trackerInputModel.loadOptionSetConfiguration( + getOptionSetFlow = getOptionSetFlow, + onOptionSetSearch = onOptionSetSearch, + ), + helperText = stringResource(Res.string.optional), + onNextClicked = { + manageOnNextClick( + index, + uiState.items, + onTrackerInputUiEvent, + ) + }, + onUiEvent = onTrackerInputUiEvent, + ), + ) + } + } + + if (uiState.clearSearchEnabled) { + item { + Box( + modifier = Modifier.fillMaxWidth(), + contentAlignment = Alignment.Center, + ) { + Button( + modifier = Modifier.padding(16.dp, 24.dp, 16.dp, 8.dp), + style = ButtonStyle.TEXT, + text = stringResource(Res.string.clear_search), + icon = { + Icon( + imageVector = Icons.Outlined.Cancel, + contentDescription = "clear search", + tint = SurfaceColor.Primary, + ) + }, + ) { + focusManager.clearFocus() + onSearchScreenUiEvent(SearchScreenUiEvent.OnClearSearchButtonClicked) + } + } + } + } + } + + Button( + enabled = uiState.searchEnabled, + modifier = + Modifier + .fillMaxWidth() + .padding(16.dp, 8.dp, 16.dp, 8.dp) + .testTag("SEARCH_BUTTON"), + style = ButtonStyle.FILLED, + text = stringResource(Res.string.search), + icon = { + val iconTint = getButtonColour(uiState.searchEnabled) + Icon( + imageVector = Icons.Outlined.Search, + contentDescription = "search", + tint = iconTint, + ) + }, + ) { + focusManager.clearFocus() + onSearchScreenUiEvent(SearchScreenUiEvent.OnSearchButtonClicked) + } + } + } +} + +private fun manageOnBackPressed( + it: Boolean, + focusManager: FocusManager, + onSearchScreenUiEvent: (SearchScreenUiEvent) -> Unit, +) { + if (it) { + focusManager.clearFocus() + onSearchScreenUiEvent(SearchScreenUiEvent.OnCloseClicked) + } +} + +private fun manageOnNextClick( + index: Int, + items: List, + onTrackerInputUiEvent: (TrackerInputUiEvent) -> Unit, +) { + val nextIndex = index + 1 + if (index + 1 < items.size && nextIndex < items.size) { + val nexItemUid = items[nextIndex].uid + onTrackerInputUiEvent( + TrackerInputUiEvent.OnItemClick( + nexItemUid, + ), + ) + } +} + +fun getBackgroundShape(isLandscape: Boolean): RoundedCornerShape = + if (isLandscape) { + RoundedCornerShape( + topStart = CornerSize(Radius.L), + topEnd = CornerSize(Radius.NoRounding), + bottomEnd = CornerSize(Radius.NoRounding), + bottomStart = CornerSize(Radius.NoRounding), + ) + } else { + Shape.LargeTop + } + +fun getButtonColour(enabled: Boolean): Color = + if (enabled) { + TextColor.OnPrimary + } else { + TextColor.OnDisabledSurface + } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/model/SearchParametersUiState.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/state/SearchParametersUiState.kt similarity index 86% rename from app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/model/SearchParametersUiState.kt rename to tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/state/SearchParametersUiState.kt index be65022a20e..3f3fed50f4b 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/model/SearchParametersUiState.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/state/SearchParametersUiState.kt @@ -1,11 +1,11 @@ -package org.dhis2.usescases.searchTrackEntity.searchparameters.model +package org.dhis2.tracker.search.ui.state import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharedFlow -import org.dhis2.form.model.FieldUiModel +import org.dhis2.tracker.input.ui.state.TrackerInputUiState data class SearchParametersUiState( - val items: List = listOf(), + val items: List = listOf(), val minAttributesMessage: String? = null, private val _shouldShowMinAttributeWarning: MutableSharedFlow = MutableSharedFlow( From d320e42d0c9c8374c4e63a2d1b70625e37d9afe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Mon, 23 Feb 2026 12:43:42 +0100 Subject: [PATCH 063/260] test: adding WaitForView in checkDataSetIsNotCompletedAndModified step for completeExpiryAndFutureDays test (#4681) --- .../java/org/dhis2/usescases/datasets/DataSetDetailRobot.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetDetailRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetDetailRobot.kt index 0216ff9c92a..bb7caf6f126 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetDetailRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetDetailRobot.kt @@ -84,7 +84,7 @@ internal class DataSetDetailRobot( } fun checkDataSetIsNotCompletedAndModified(catCombo: String, orgUnit: String ) { - onView(withId(R.id.recycler)) + waitForView(withId(R.id.recycler)) .check( matches( hasItem( From f8a57fd56d29bca65161f22659b7c260ebecb425 Mon Sep 17 00:00:00 2001 From: Pablo Date: Tue, 24 Feb 2026 12:33:08 +0100 Subject: [PATCH 064/260] feat: [ANDROAPP-7459][3/6] Added wew sync metadata worker [skip size] (#4640) * feat: [ANDROAPP-7459][1/6] Added new worker to update sync settings * feat: [ANDROAPP-7459][2/6] Added required implementations for new workers (#4639) * feat: [ANDROAPP-7459][2/6] Added required implementations for new workers * fix comments * feat: [ANDROAPP-7459][3/6] Added wew sync metadata worker * fix rebase * fix comments * feat: [ANDROAPP-7459][4/6] Implement new sync in the app [skip size] (#4641) * build: [ANDROAPP-7459][6/6] Remove unused classes [skip size] (#4649) * fix crash when deleting account while metadata sync is in progress --- app/build.gradle.kts | 3 + app/src/androidTest/java/org/dhis2/AppTest.kt | 13 -- .../sync/MockedWorkManagerController.kt | 53 ----- .../usescases/sync/MockedWorkManagerModule.kt | 13 -- .../dhis2/usescases/sync/SyncActivityTest.kt | 108 ++++----- app/src/main/AndroidManifest.xml | 4 +- .../dhis2/data/service/SyncInitWorker.java | 46 ---- .../data/service/SyncInitWorkerComponent.java | 13 -- .../data/service/SyncInitWorkerModule.kt | 35 --- .../data/service/SyncMetadataWorker.java | 212 ------------------ .../service/SyncMetadataWorkerComponent.java | 13 -- .../data/service/SyncMetadataWorkerModule.kt | 35 --- .../org/dhis2/data/service/SyncPresenter.java | 9 +- .../dhis2/data/service/SyncPresenterImpl.kt | 80 ------- .../workManager/WorkManagerController.kt | 5 - .../workManager/WorkManagerControllerImpl.kt | 22 -- .../data/service/workManager/WorkerType.kt | 1 - .../org/dhis2/data/user/UserComponent.java | 10 - .../java/org/dhis2/di/KoinInitialization.kt | 2 + .../usescases/settings/SyncManagerFragment.kt | 5 +- .../usescases/settings/SyncManagerModule.kt | 6 +- .../settings/SyncManagerPresenter.kt | 16 +- .../settings/domain/GetSettingsState.kt | 62 ++--- .../usescases/settings/domain/LaunchSync.kt | 71 +++--- .../settings/models/SyncStateInput.kt | 10 + .../org/dhis2/usescases/sync/SyncActivity.kt | 24 +- .../org/dhis2/usescases/sync/SyncInjector.kt | 6 +- .../org/dhis2/usescases/sync/SyncPresenter.kt | 31 ++- .../dhis2/utils/analytics/AnalyticsHelper.kt | 4 +- .../dhis2/data/services/SyncPresenterTest.kt | 132 ----------- .../settings/SyncManagerPresenterTest.kt | 75 +++---- .../settings/domain/LaunchSyncTest.kt | 48 ++-- .../dhis2/usescases/sync/SyncPresenterTest.kt | 47 ++-- .../commons/di/CommonsModule.android.kt | 6 + .../notifications/NotificationManagerImpl.kt | 192 ++++++++++++++++ .../commons/reporting/AnalyticActions.kt | 1 - gradle/verification-metadata.xml | 14 ++ sync/build.gradle.kts | 6 +- .../mobile/sync/ExampleInstrumentedTest.kt | 0 .../org/dhis2/mobile/sync/ExampleUnitTest.kt | 0 .../data/AndroidSyncBackgroundJobAction.kt | 82 +++++-- .../mobile/sync/data/AndroidSyncRepository.kt | 1 - .../mobile/sync/data/SyncMetadataWorker.kt | 85 +++++++ .../mobile/sync/di/SyncModule.android.kt | 3 + .../AndroidSyncRepositoryTest.kt | 169 ++++++++++++++ .../org/dhis2/mobile/sync/domain/SyncData.kt | 17 ++ .../dhis2/mobile/sync/domain/SyncMetadata.kt | 89 ++++++++ .../mobile/sync/domain/SyncMetadataTest.kt | 115 ++++++++++ .../mobile/sync/domain/SyncSettingsTest.kt | 57 +++++ 49 files changed, 1074 insertions(+), 977 deletions(-) delete mode 100644 app/src/androidTest/java/org/dhis2/usescases/sync/MockedWorkManagerController.kt delete mode 100644 app/src/androidTest/java/org/dhis2/usescases/sync/MockedWorkManagerModule.kt delete mode 100644 app/src/main/java/org/dhis2/data/service/SyncInitWorker.java delete mode 100644 app/src/main/java/org/dhis2/data/service/SyncInitWorkerComponent.java delete mode 100644 app/src/main/java/org/dhis2/data/service/SyncInitWorkerModule.kt delete mode 100644 app/src/main/java/org/dhis2/data/service/SyncMetadataWorker.java delete mode 100644 app/src/main/java/org/dhis2/data/service/SyncMetadataWorkerComponent.java delete mode 100644 app/src/main/java/org/dhis2/data/service/SyncMetadataWorkerModule.kt create mode 100644 app/src/main/java/org/dhis2/usescases/settings/models/SyncStateInput.kt create mode 100644 commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationManagerImpl.kt delete mode 100644 sync/src/androidDeviceTest/kotlin/org/dhis2/mobile/sync/ExampleInstrumentedTest.kt delete mode 100644 sync/src/androidHostTest/kotlin/org/dhis2/mobile/sync/ExampleUnitTest.kt create mode 100644 sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncMetadataWorker.kt create mode 100644 sync/src/androidUnitTest/kotlin/org.dhis2.mobile.sync.data/AndroidSyncRepositoryTest.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncData.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt create mode 100644 sync/src/commonTest/kotlin/org/dhis2/mobile/sync/domain/SyncMetadataTest.kt create mode 100644 sync/src/commonTest/kotlin/org/dhis2/mobile/sync/domain/SyncSettingsTest.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index cca34391705..7068334b38f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -286,6 +286,7 @@ dependencies { implementation(project(":aggregates")) implementation(project(":commonskmm")) implementation(project(":login")) + implementation(project(":sync")) implementation(libs.security.conscrypt) implementation(libs.security.rootbeer) @@ -347,6 +348,8 @@ dependencies { androidTestImplementation(libs.test.rx2.idler) androidTestImplementation(libs.test.compose.ui.test) androidTestImplementation(libs.test.hamcrest) + androidTestImplementation(libs.koin.test) + androidTestImplementation(libs.koin.test.junit4) } sentry { diff --git a/app/src/androidTest/java/org/dhis2/AppTest.kt b/app/src/androidTest/java/org/dhis2/AppTest.kt index f594dd84e89..aac5b3b125c 100644 --- a/app/src/androidTest/java/org/dhis2/AppTest.kt +++ b/app/src/androidTest/java/org/dhis2/AppTest.kt @@ -1,7 +1,5 @@ package org.dhis2 -import androidx.lifecycle.MutableLiveData -import androidx.work.WorkInfo import org.dhis2.common.di.TestingInjector import org.dhis2.common.keystore.KeyStoreRobot import org.dhis2.common.preferences.PreferencesTestingModule @@ -10,8 +8,6 @@ import org.dhis2.commons.schedulers.SchedulersProviderImpl import org.dhis2.data.server.ServerModule import org.dhis2.data.user.UserModule import org.dhis2.usescases.BaseTest.Companion.MOCK_SERVER_URL -import org.dhis2.usescases.sync.MockedWorkManagerController -import org.dhis2.usescases.sync.MockedWorkManagerModule import org.dhis2.utils.analytics.AnalyticsModule import org.hisp.dhis.android.core.D2Manager import org.hisp.dhis.android.core.D2Manager.blockingInstantiateD2 @@ -20,8 +16,6 @@ import org.hisp.dhis.android.core.D2Manager.setTestingSecureStore class AppTest : App() { - val mutableWorkInfoStatuses = MutableLiveData>() - fun restoreDB() { } @@ -68,13 +62,6 @@ class AppTest : App() { .schedulerModule(SchedulerModule(SchedulersProviderImpl())) .analyticsModule(AnalyticsModule()) .preferenceModule(PreferencesTestingModule()) - .workManagerController( - MockedWorkManagerModule( - MockedWorkManagerController( - mutableWorkInfoStatuses - ) - ) - ) } companion object { diff --git a/app/src/androidTest/java/org/dhis2/usescases/sync/MockedWorkManagerController.kt b/app/src/androidTest/java/org/dhis2/usescases/sync/MockedWorkManagerController.kt deleted file mode 100644 index aa258d6b737..00000000000 --- a/app/src/androidTest/java/org/dhis2/usescases/sync/MockedWorkManagerController.kt +++ /dev/null @@ -1,53 +0,0 @@ -package org.dhis2.usescases.sync - -import androidx.lifecycle.LiveData -import androidx.work.WorkInfo -import org.dhis2.data.service.workManager.WorkManagerController -import org.dhis2.data.service.workManager.WorkerItem - -class MockedWorkManagerController(private val workInfoStatuses: LiveData>) : - WorkManagerController { - - override fun syncDataForWorker(workerItem: WorkerItem) { - } - - override fun syncDataForWorker(dataWorkerTag: String, workName: String) { - - } - - override fun syncMetaDataForWorker(metadataWorkerTag: String, workName: String) { - } - - override fun beginUniqueWork(workerItem: WorkerItem) { - } - - override fun enqueuePeriodicWork(workerItem: WorkerItem) { - } - - override fun getWorkInfosForUniqueWorkLiveData(workerName: String): LiveData> { - return workInfoStatuses - } - - override fun getWorkInfosByTagLiveData(tag: String): LiveData> { - return workInfoStatuses - } - - override fun getWorkInfosForTags(vararg tags: String): LiveData> { - return workInfoStatuses - } - - override fun cancelAllWork() { - } - - override suspend fun cancelAllWorkAndWait() { - } - - override fun cancelAllWorkByTag(tag: String) { - } - - override fun cancelUniqueWork(workName: String) { - } - - override fun pruneWork() { - } -} \ No newline at end of file diff --git a/app/src/androidTest/java/org/dhis2/usescases/sync/MockedWorkManagerModule.kt b/app/src/androidTest/java/org/dhis2/usescases/sync/MockedWorkManagerModule.kt deleted file mode 100644 index 6d312feb985..00000000000 --- a/app/src/androidTest/java/org/dhis2/usescases/sync/MockedWorkManagerModule.kt +++ /dev/null @@ -1,13 +0,0 @@ -package org.dhis2.usescases.sync - -import androidx.work.WorkManager -import org.dhis2.data.service.workManager.WorkManagerController -import org.dhis2.data.service.workManager.WorkManagerModule - -class MockedWorkManagerModule(private val mockedController: WorkManagerController) : - WorkManagerModule() { - - override fun providesWorkManagerController(workManager: WorkManager): WorkManagerController { - return mockedController - } -} \ No newline at end of file diff --git a/app/src/androidTest/java/org/dhis2/usescases/sync/SyncActivityTest.kt b/app/src/androidTest/java/org/dhis2/usescases/sync/SyncActivityTest.kt index 006b9ad8be9..8b9b969d5e3 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/sync/SyncActivityTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/sync/SyncActivityTest.kt @@ -1,52 +1,60 @@ package org.dhis2.usescases.sync -import androidx.lifecycle.MutableLiveData -import androidx.test.core.app.ApplicationProvider -import androidx.test.ext.junit.rules.activityScenarioRule +import androidx.test.core.app.ActivityScenario import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.work.Data -import androidx.work.WorkInfo -import org.dhis2.AppTest -import org.dhis2.commons.Constants +import kotlinx.coroutines.flow.MutableStateFlow +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.model.SyncJobStatus +import org.dhis2.mobile.sync.model.SyncStatus import org.dhis2.usescases.BaseTest -import org.junit.Before +import org.junit.After import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith -import java.util.UUID -import org.junit.After +import org.koin.test.KoinTest +import org.koin.test.mock.MockProviderRule +import org.koin.test.mock.declareMock +import org.mockito.Mockito +import org.mockito.kotlin.any +import org.mockito.kotlin.doAnswer +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.whenever + @RunWith(AndroidJUnit4::class) -class SyncActivityTest : BaseTest() { - private lateinit var workInfoStatusLiveData: MutableLiveData> +class SyncActivityTest : BaseTest(), KoinTest { + private val metadataSyncJobStatuses = MutableStateFlow>(emptyList()) @get:Rule - val rule = activityScenarioRule() - - @Before - override fun setUp() { - super.setUp() - workInfoStatusLiveData = - ApplicationProvider.getApplicationContext().mutableWorkInfoStatuses - } + val mockProvider = + MockProviderRule.create { clazz -> + Mockito.mock(clazz.java) + } @After override fun teardown() { super.teardown() - workInfoStatusLiveData.postValue(emptyList()) + metadataSyncJobStatuses.tryEmit(emptyList()) } @Test fun shouldShowMetadataErrorDialog() { - syncRobot { - waitUntilActivityVisible() - waitToDebounce(3000) - workInfoStatusLiveData.postValue(arrayListOf(mockedMetaWorkInfo(WorkInfo.State.RUNNING))) - waitToDebounce(3000) - workInfoStatusLiveData.postValue(arrayListOf(mockedMetaWorkInfo(WorkInfo.State.FAILED))) - waitToDebounce(3000) - checkMetadataErrorDialogIsDisplayed() + declareMock { + whenever(launchMetadataSync(any())) doAnswer {} + whenever(observeMetadataJob()) doReturn metadataSyncJobStatuses + } + + ActivityScenario.launch(SyncActivity::class.java).use { + syncRobot { + waitUntilActivityVisible() + waitToDebounce(3000) + metadataSyncJobStatuses.tryEmit(listOf(mockedMetadataJobStatus(SyncStatus.Running))) + waitToDebounce(3000) + metadataSyncJobStatuses.tryEmit(listOf(mockedMetadataJobStatus(SyncStatus.Failed))) + waitToDebounce(3000) + checkMetadataErrorDialogIsDisplayed() + } } } @@ -54,28 +62,28 @@ class SyncActivityTest : BaseTest() { fun shouldCompleteSyncProcess() { enableIntents() - syncRobot { - waitUntilActivityVisible() - workInfoStatusLiveData.postValue(arrayListOf(mockedMetaWorkInfo(WorkInfo.State.RUNNING))) - waitToDebounce(3000) - checkMetadataIsSyncing() - checkDataIsWaiting() - workInfoStatusLiveData.postValue(arrayListOf(mockedMetaWorkInfo(WorkInfo.State.SUCCEEDED))) - waitToDebounce(3000) - checkMainActivityIsLaunched() + declareMock { + whenever(launchMetadataSync(any())) doAnswer {} + whenever(observeMetadataJob()) doReturn metadataSyncJobStatuses } - } - private fun mockedMetaWorkInfo(state: WorkInfo.State): WorkInfo { - return WorkInfo( - id = UUID.randomUUID(), - state = state, - tags = setOf(Constants.META_NOW), - outputData = Data.EMPTY, - progress = Data.EMPTY, - runAttemptCount = 0, - generation = 0 - ) + ActivityScenario.launch(SyncActivity::class.java).use { + syncRobot { + waitUntilActivityVisible() + metadataSyncJobStatuses.tryEmit(listOf(mockedMetadataJobStatus(SyncStatus.Running))) + waitToDebounce(3000) + checkMetadataIsSyncing() + checkDataIsWaiting() + metadataSyncJobStatuses.tryEmit(listOf(mockedMetadataJobStatus(SyncStatus.Succeed))) + waitToDebounce(3000) + checkMainActivityIsLaunched() + } + } } -} + private fun mockedMetadataJobStatus(status: SyncStatus) = SyncJobStatus( + tags = listOf("METADATA_SYNC", "METADATA_SYNC_NOW"), + status = status, + message = null + ) +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 015c7bc1c15..e9f21c33902 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,6 +17,7 @@ android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> + + android:foregroundServiceType="dataSync" /> triggerNotification( - getApplicationContext().getString(R.string.app_name), - getApplicationContext().getString(R.string.syncing_configuration), - progress)); - } catch (Exception e) { - Timber.e(e); - isMetaOk = false; - if (!NetworkUtils.isOnline(getApplicationContext())) - noNetwork = true; - if (e instanceof D2Error) { - D2Error error = (D2Error) e; - message.append(composeErrorMessageInfo(error)); - } else if (e.getCause() instanceof D2Error) { - D2Error error = (D2Error) e.getCause(); - message.append(composeErrorMessageInfo(error)); - } else { - message.append(e.toString().split("\n\t")[0]); - } - } finally { - presenter.logTimeToFinish(System.currentTimeMillis() - init, METADATA_TIME); - } - - String lastDataSyncDate = DateUtils.dateTimeFormat().format(Calendar.getInstance().getTime()); - - prefs.setValue(Constants.LAST_META_SYNC, lastDataSyncDate); - prefs.setValue(Constants.LAST_META_SYNC_STATUS, isMetaOk); - prefs.setValue(Constants.LAST_META_SYNC_NO_NETWORK, noNetwork); - - cancelNotification(); - - if (!isMetaOk) - return Result.failure(createOutputData(false, message.toString())); - - presenter.startPeriodicMetaWork(); - - return Result.success(createOutputData(true, message.toString())); - } else { - return Result.failure(createOutputData(false, getApplicationContext().getString(R.string.error_init_session))); - } - } - - @Override - public void onStopped() { - cancelNotification(); - super.onStopped(); - } - - private Data createOutputData(boolean state, String message) { - return new Data.Builder() - .putBoolean(METADATA_STATE, state) - .putString(METADATA_MESSAGE, message) - .build(); - } - - private String errorStackTrace(@Nullable Exception exception) { - if (exception == null) - return ""; - Writer writer = new StringWriter(); - exception.printStackTrace(new PrintWriter(writer)); - return writer.toString(); - } - - private StringBuilder composeErrorMessageInfo(D2Error error) { - StringBuilder builder = new StringBuilder("Cause: ") - .append(resourceManager.parseD2Error(error)) - .append("\n\n") - .append("Exception: ") - .append(errorStackTrace((error).originalException()).split("\n\t")[0]) - .append("\n\n"); - - if (error.created() != null) { - builder.append("Created: ") - .append(error.created().toString()) - .append("\n\n"); - } - - if (error.httpErrorCode() != null) { - builder.append("Http Error Code: ") - .append(error.httpErrorCode()) - .append("\n\n"); - } - - if (error.errorComponent() != null) { - builder.append("Error component: ") - .append(error.errorComponent()) - .append("\n\n"); - } - - if (error.url() != null) { - builder.append("Url: ") - .append(error.url()) - .append("\n\n"); - } - - builder.append("StackTrace: ") - .append(errorStackTrace(error).split("\n\t")[0]) - .append("\n\n"); - - return builder; - } - - private void triggerNotification(String title, String content, int progress) { - NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - NotificationChannel mChannel = new NotificationChannel(METADATA_CHANNEL, "MetadataSync", NotificationManager.IMPORTANCE_HIGH); - notificationManager.createNotificationChannel(mChannel); - } - NotificationCompat.Builder notificationBuilder = - new NotificationCompat.Builder(getApplicationContext(), METADATA_CHANNEL) - .setSmallIcon(R.drawable.ic_sync) - .setContentTitle(title) - .setContentText(content) - .setOngoing(true) - .setOnlyAlertOnce(true) - .setAutoCancel(false) - .setProgress(100, progress, false) - .setPriority(NotificationCompat.PRIORITY_DEFAULT); - - setForegroundAsync(new ForegroundInfo( - SyncMetadataWorker.SYNC_METADATA_ID, - notificationBuilder.build(), - Build.VERSION.SDK_INT >= Build.VERSION_CODES.R ? ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC : 0 - )); - } - - private void cancelNotification() { - NotificationManagerCompat notificationManager = - NotificationManagerCompat.from(getApplicationContext()); - notificationManager.cancel(SYNC_METADATA_ID); - } - - public interface OnProgressUpdate { - void onProgressUpdate(int progress); - } -} diff --git a/app/src/main/java/org/dhis2/data/service/SyncMetadataWorkerComponent.java b/app/src/main/java/org/dhis2/data/service/SyncMetadataWorkerComponent.java deleted file mode 100644 index 20d6b70c2da..00000000000 --- a/app/src/main/java/org/dhis2/data/service/SyncMetadataWorkerComponent.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.dhis2.data.service; - -import androidx.annotation.NonNull; - -import org.dhis2.commons.di.dagger.PerService; - -import dagger.Subcomponent; - -@PerService -@Subcomponent(modules = SyncMetadataWorkerModule.class) -public interface SyncMetadataWorkerComponent { - void inject(@NonNull SyncMetadataWorker syncMetadataWorker); -} diff --git a/app/src/main/java/org/dhis2/data/service/SyncMetadataWorkerModule.kt b/app/src/main/java/org/dhis2/data/service/SyncMetadataWorkerModule.kt deleted file mode 100644 index 33fcbff9d17..00000000000 --- a/app/src/main/java/org/dhis2/data/service/SyncMetadataWorkerModule.kt +++ /dev/null @@ -1,35 +0,0 @@ -package org.dhis2.data.service - -import dagger.Module -import dagger.Provides -import org.dhis2.commons.di.dagger.PerService -import org.dhis2.commons.prefs.PreferenceProvider -import org.dhis2.data.service.workManager.WorkManagerController -import org.dhis2.utils.analytics.AnalyticsHelper -import org.hisp.dhis.android.core.D2 - -@Module -class SyncMetadataWorkerModule { - @Provides - @PerService - fun syncRepository(d2: D2): SyncRepository = SyncRepositoryImpl(d2) - - @Provides - @PerService - internal fun syncPresenter( - d2: D2, - preferences: PreferenceProvider, - workManagerController: WorkManagerController, - analyticsHelper: AnalyticsHelper, - syncStatusController: SyncStatusController, - syncRepository: SyncRepository, - ): SyncPresenter = - SyncPresenterImpl( - d2, - preferences, - workManagerController, - analyticsHelper, - syncStatusController, - syncRepository, - ) -} diff --git a/app/src/main/java/org/dhis2/data/service/SyncPresenter.java b/app/src/main/java/org/dhis2/data/service/SyncPresenter.java index 507a0fabd4a..593091270dc 100644 --- a/app/src/main/java/org/dhis2/data/service/SyncPresenter.java +++ b/app/src/main/java/org/dhis2/data/service/SyncPresenter.java @@ -1,13 +1,12 @@ package org.dhis2.data.service; +import androidx.work.ListenableWorker; + import org.hisp.dhis.android.core.arch.call.D2Progress; import org.hisp.dhis.android.core.imports.TrackerImportConflict; -import org.hisp.dhis.android.core.tracker.exporter.TrackerD2Progress; import java.util.List; -import androidx.work.ListenableWorker; - import io.reactivex.Observable; interface SyncPresenter { @@ -15,8 +14,6 @@ interface SyncPresenter { void syncAndDownloadTeis() throws Exception; - void syncMetadata(SyncMetadataWorker.OnProgressUpdate progressUpdate) throws Exception; - void syncAndDownloadDataValues() throws Exception; void syncReservedValues(); @@ -59,8 +56,6 @@ interface SyncPresenter { void startPeriodicDataWork(); - void startPeriodicMetaWork(); - void downloadResources(); ListenableWorker.Result blockSyncGranularDataValues(String dataSetUid, String orgUnitUid, String attrOptionCombo, String periodId, String[] catOptionCombo); diff --git a/app/src/main/java/org/dhis2/data/service/SyncPresenterImpl.kt b/app/src/main/java/org/dhis2/data/service/SyncPresenterImpl.kt index 5f235e6521e..7a380dd0ad9 100644 --- a/app/src/main/java/org/dhis2/data/service/SyncPresenterImpl.kt +++ b/app/src/main/java/org/dhis2/data/service/SyncPresenterImpl.kt @@ -15,18 +15,15 @@ import org.dhis2.commons.prefs.Preference.Companion.EVENT_MAX import org.dhis2.commons.prefs.Preference.Companion.EVENT_MAX_DEFAULT import org.dhis2.commons.prefs.Preference.Companion.LIMIT_BY_ORG_UNIT import org.dhis2.commons.prefs.Preference.Companion.LIMIT_BY_PROGRAM -import org.dhis2.commons.prefs.Preference.Companion.META import org.dhis2.commons.prefs.Preference.Companion.TEI_MAX import org.dhis2.commons.prefs.Preference.Companion.TEI_MAX_DEFAULT import org.dhis2.commons.prefs.Preference.Companion.TIME_DAILY import org.dhis2.commons.prefs.Preference.Companion.TIME_DATA -import org.dhis2.commons.prefs.Preference.Companion.TIME_META import org.dhis2.commons.prefs.PreferenceProvider import org.dhis2.data.service.workManager.WorkManagerController import org.dhis2.data.service.workManager.WorkerItem import org.dhis2.data.service.workManager.WorkerType import org.dhis2.utils.analytics.AnalyticsHelper -import org.dhis2.utils.analytics.matomo.DEFAULT_EXTERNAL_TRACKER_NAME import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.arch.call.D2Progress import org.hisp.dhis.android.core.arch.call.D2ProgressStatus @@ -40,7 +37,6 @@ import org.hisp.dhis.android.core.settings.ProgramSettings import org.hisp.dhis.android.core.systeminfo.DHISVersion import timber.log.Timber import java.util.Calendar -import kotlin.math.ceil class SyncPresenterImpl( private val d2: D2, @@ -239,63 +235,6 @@ class SyncPresenterImpl( } } - override fun syncMetadata(progressUpdate: SyncMetadataWorker.OnProgressUpdate) { - Completable - .fromObservable( - d2 - .metadataModule() - .download() - .doOnNext { data -> - Timber.log(1, data.toString()) - progressUpdate.onProgressUpdate(ceil(data.percentage() ?: 0.0).toInt()) - }.doOnComplete { - updateProyectAnalytics() - setUpSMS() - }, - ).doOnError { - Timber.d("error while downloading Metadata") - }.onErrorComplete() - .andThen( - d2.mapsModule().mapLayersDownloader().downloadMetadata(), - ).andThen( - Completable.fromObservable( - d2 - .fileResourceModule() - .fileResourceDownloader() - .byDomainType() - .eq(FileResourceDomainType.ICON) - .download(), - ), - ).blockingAwait() - } - - private fun setUpSMS() { - val globalSettings = getSettings() - - globalSettings?.let { - if (!globalSettings.smsGateway().isNullOrEmpty()) { - d2 - .smsModule() - .configCase() - .setGatewayNumber(globalSettings.smsGateway()) - .andThen( - if (!globalSettings.smsResultSender().isNullOrEmpty()) { - d2 - .smsModule() - .configCase() - .setConfirmationSenderNumber(globalSettings.smsResultSender()) - } else { - Completable.complete() - }, - ).andThen( - d2.smsModule().configCase().setModuleEnabled(true), - ).andThen( - d2.smsModule().configCase().refreshMetadataIds(), - ).blockingAwait() - } - } - } - override fun downloadResources() { if (d2.systemInfoModule().versionManager().isGreaterThan(DHISVersion.V2_32)) { syncStatusController.initDownloadMedia() @@ -766,24 +705,6 @@ class SyncPresenterImpl( } } - override fun startPeriodicMetaWork() { - val seconds = - getSettings()?.metadataSync()?.toSeconds() ?: preferences.getInt(TIME_META, TIME_DAILY) - workManagerController.cancelUniqueWork(META) - - if (seconds != 0) { - val workerItem = - WorkerItem( - META, - WorkerType.METADATA, - seconds.toLong(), - policy = ExistingWorkPolicy.REPLACE, - ) - - workManagerController.syncDataForWorker(workerItem) - } - } - private fun getSettings(): GeneralSettings? = d2.settingModule().generalSetting().blockingGet() private fun getProgramSetting(): ProgramSettings? = d2.settingModule().programSetting().blockingGet() @@ -805,7 +726,6 @@ class SyncPresenterImpl( analyticsHelper.updateMatomoSecondaryTracker( it.matomoURL()!!, it.matomoID()!!, - DEFAULT_EXTERNAL_TRACKER_NAME, ) } } ?: analyticsHelper.clearMatomoSecondaryTracker() diff --git a/app/src/main/java/org/dhis2/data/service/workManager/WorkManagerController.kt b/app/src/main/java/org/dhis2/data/service/workManager/WorkManagerController.kt index 9723f3177bd..6ef8ddc5a98 100644 --- a/app/src/main/java/org/dhis2/data/service/workManager/WorkManagerController.kt +++ b/app/src/main/java/org/dhis2/data/service/workManager/WorkManagerController.kt @@ -34,11 +34,6 @@ import androidx.work.WorkInfo interface WorkManagerController { fun syncDataForWorker(workerItem: WorkerItem) - fun syncMetaDataForWorker( - metadataWorkerTag: String, - workName: String, - ) - fun syncDataForWorker( dataWorkerTag: String, workName: String, diff --git a/app/src/main/java/org/dhis2/data/service/workManager/WorkManagerControllerImpl.kt b/app/src/main/java/org/dhis2/data/service/workManager/WorkManagerControllerImpl.kt index 26158e84383..029f9b27af2 100644 --- a/app/src/main/java/org/dhis2/data/service/workManager/WorkManagerControllerImpl.kt +++ b/app/src/main/java/org/dhis2/data/service/workManager/WorkManagerControllerImpl.kt @@ -39,7 +39,6 @@ import androidx.work.await import org.dhis2.data.service.CheckVersionWorker import org.dhis2.data.service.SyncDataWorker import org.dhis2.data.service.SyncGranularWorker -import org.dhis2.data.service.SyncMetadataWorker import java.util.concurrent.TimeUnit class WorkManagerControllerImpl( @@ -55,19 +54,6 @@ class WorkManagerControllerImpl( } } - override fun syncMetaDataForWorker( - metadataWorkerTag: String, - workName: String, - ) { - val workerOneBuilder = OneTimeWorkRequest.Builder(SyncMetadataWorker::class.java) - workerOneBuilder - .addTag(metadataWorkerTag) - - workManager - .beginUniqueWork(workName, ExistingWorkPolicy.KEEP, workerOneBuilder.build()) - .enqueue() - } - override fun syncDataForWorker( dataWorkerTag: String, workName: String, @@ -132,7 +118,6 @@ class WorkManagerControllerImpl( private fun createOneTimeBuilder(workerItem: WorkerItem): OneTimeWorkRequest.Builder { val syncBuilder = when (workerItem.workerType) { - WorkerType.METADATA -> OneTimeWorkRequest.Builder(SyncMetadataWorker::class.java) WorkerType.DATA -> OneTimeWorkRequest.Builder(SyncDataWorker::class.java) WorkerType.GRANULAR -> OneTimeWorkRequest.Builder(SyncGranularWorker::class.java) WorkerType.NEW_VERSION -> OneTimeWorkRequest.Builder(CheckVersionWorker::class.java) @@ -155,13 +140,6 @@ class WorkManagerControllerImpl( val syncBuilder = when (workerItem.workerType) { - WorkerType.METADATA -> { - PeriodicWorkRequest.Builder( - SyncMetadataWorker::class.java, - seconds, - TimeUnit.SECONDS, - ) - } WorkerType.DATA -> { PeriodicWorkRequest.Builder( SyncDataWorker::class.java, diff --git a/app/src/main/java/org/dhis2/data/service/workManager/WorkerType.kt b/app/src/main/java/org/dhis2/data/service/workManager/WorkerType.kt index 6c77fc50fb5..067b2a45e11 100644 --- a/app/src/main/java/org/dhis2/data/service/workManager/WorkerType.kt +++ b/app/src/main/java/org/dhis2/data/service/workManager/WorkerType.kt @@ -29,7 +29,6 @@ package org.dhis2.data.service.workManager enum class WorkerType { - METADATA, DATA, GRANULAR, NEW_VERSION, diff --git a/app/src/main/java/org/dhis2/data/user/UserComponent.java b/app/src/main/java/org/dhis2/data/user/UserComponent.java index eebf6102a13..283f3d9d1e4 100644 --- a/app/src/main/java/org/dhis2/data/user/UserComponent.java +++ b/app/src/main/java/org/dhis2/data/user/UserComponent.java @@ -12,10 +12,6 @@ import org.dhis2.data.service.SyncDataWorkerModule; import org.dhis2.data.service.SyncGranularRxComponent; import org.dhis2.data.service.SyncGranularRxModule; -import org.dhis2.data.service.SyncInitWorkerComponent; -import org.dhis2.data.service.SyncInitWorkerModule; -import org.dhis2.data.service.SyncMetadataWorkerComponent; -import org.dhis2.data.service.SyncMetadataWorkerModule; import org.dhis2.usescases.about.AboutComponent; import org.dhis2.usescases.about.AboutModule; import org.dhis2.usescases.datasets.datasetDetail.DataSetDetailComponent; @@ -136,9 +132,6 @@ public interface UserComponent { @NonNull SyncDataWorkerComponent plus(SyncDataWorkerModule syncDataWorkerModule); - @NonNull - SyncMetadataWorkerComponent plus(SyncMetadataWorkerModule syncDataWorkerModule); - @NonNull EventCaptureComponent plus(EventCaptureModule eventCaptureModule); @@ -151,9 +144,6 @@ public interface UserComponent { @NonNull SyncComponent plus(SyncModule syncModule); - @NonNull - SyncInitWorkerComponent plus(SyncInitWorkerModule syncInitWorkerModule); - @NonNull EnrollmentComponent plus(EnrollmentModule enrollmentModule); diff --git a/app/src/main/java/org/dhis2/di/KoinInitialization.kt b/app/src/main/java/org/dhis2/di/KoinInitialization.kt index cd0ba2b8593..c2aa800c550 100644 --- a/app/src/main/java/org/dhis2/di/KoinInitialization.kt +++ b/app/src/main/java/org/dhis2/di/KoinInitialization.kt @@ -9,6 +9,7 @@ import org.dhis2.data.biometric.biometricModule import org.dhis2.mobile.aggregates.di.aggregatesModule import org.dhis2.mobile.commons.di.commonsModule import org.dhis2.mobile.login.main.di.loginModule +import org.dhis2.mobile.sync.di.syncModule import org.dhis2.tracker.search.di.trackerSearchModule import org.dhis2.usescases.datasets.di.dataSetModules import org.dhis2.usescases.searchTrackEntity.di.searchTEKoinModule @@ -39,6 +40,7 @@ object KoinInitialization { settingsProgramModule, biometricModule, matomoModule, + syncModule, ) } } diff --git a/app/src/main/java/org/dhis2/usescases/settings/SyncManagerFragment.kt b/app/src/main/java/org/dhis2/usescases/settings/SyncManagerFragment.kt index e744c147084..77922793602 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/SyncManagerFragment.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/SyncManagerFragment.kt @@ -17,12 +17,14 @@ import org.dhis2.commons.data.FormFileProvider import org.dhis2.commons.data.FormFileProvider.init import org.dhis2.commons.resources.ColorUtils import org.dhis2.mobile.login.authentication.TwoFASettingsActivity +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.usescases.general.FragmentGlobalAbstract import org.dhis2.usescases.reservedValue.ReservedValueActivity import org.dhis2.usescases.settings.models.ErrorViewModel import org.dhis2.usescases.settings.ui.SettingsScreen import org.dhis2.usescases.settingsprogram.SettingsProgramActivity import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme +import org.koin.android.ext.android.inject import timber.log.Timber import java.io.File import javax.inject.Inject @@ -32,6 +34,7 @@ class SyncManagerFragment : FragmentGlobalAbstract() { lateinit var settingsViewModelFactory: SettingsViewModelFactory private val presenter: SyncManagerPresenter by viewModels { settingsViewModelFactory } + private val syncBackgroundJobAction: SyncBackgroundJobAction by inject() @JvmField @Inject @@ -41,7 +44,7 @@ class SyncManagerFragment : FragmentGlobalAbstract() { super.onAttach(context) app() .userComponent() - ?.plus(SyncManagerModule()) + ?.plus(SyncManagerModule(syncBackgroundJobAction)) ?.inject(this) } diff --git a/app/src/main/java/org/dhis2/usescases/settings/SyncManagerModule.kt b/app/src/main/java/org/dhis2/usescases/settings/SyncManagerModule.kt index 2ca357252eb..c690c727e2f 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/SyncManagerModule.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/SyncManagerModule.kt @@ -12,6 +12,7 @@ import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.service.VersionRepository import org.dhis2.data.service.workManager.WorkManagerController import org.dhis2.mobile.commons.files.FileHandlerImpl +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.usescases.settings.domain.CheckVersionUpdate import org.dhis2.usescases.settings.domain.DeleteLocalData import org.dhis2.usescases.settings.domain.ExportDatabase @@ -27,7 +28,9 @@ import org.dhis2.utils.analytics.AnalyticsHelper import org.hisp.dhis.android.core.D2 @Module -class SyncManagerModule { +class SyncManagerModule( + private val syncBackgroundJobAction: SyncBackgroundJobAction, +) { @Provides @PerFragment fun provideViewModelFactory( @@ -154,6 +157,7 @@ class SyncManagerModule { preferenceProvider: PreferenceProvider, analyticsHelper: AnalyticsHelper, ) = LaunchSync( + syncBackgroundJobAction, workManagerController, preferenceProvider, analyticsHelper, diff --git a/app/src/main/java/org/dhis2/usescases/settings/SyncManagerPresenter.kt b/app/src/main/java/org/dhis2/usescases/settings/SyncManagerPresenter.kt index d017aeb80d0..d33719c18ed 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/SyncManagerPresenter.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/SyncManagerPresenter.kt @@ -27,6 +27,7 @@ import org.dhis2.usescases.settings.domain.UpdateSyncSettings import org.dhis2.usescases.settings.models.DeleteDataState import org.dhis2.usescases.settings.models.ErrorViewModel import org.dhis2.usescases.settings.models.SettingsState +import org.dhis2.usescases.settings.models.SyncStateInput import org.hisp.dhis.android.core.settings.LimitScope import java.io.File @@ -113,14 +114,21 @@ class SyncManagerPresenter( } private suspend fun loadData() { - val settingsState = - getSettingsState( + getSettingsState( + SyncStateInput( openedItem = _settingsState.value?.openedItem, hasConnection = _settingsState.value?.hasConnection == true, metadataSyncInProgress = syncWorkInfo.value.metadataSyncProgress == LaunchSync.SyncStatus.InProgress, dataSyncInProgress = syncWorkInfo.value.dataSyncProgress == LaunchSync.SyncStatus.InProgress, - ) - _settingsState.update { settingsState } + ), + ).fold( + onSuccess = { settingsState -> + _settingsState.update { settingsState } + }, + onFailure = { + // do nothing + }, + ) } fun onItemClick(settingsItem: SettingItem) { diff --git a/app/src/main/java/org/dhis2/usescases/settings/domain/GetSettingsState.kt b/app/src/main/java/org/dhis2/usescases/settings/domain/GetSettingsState.kt index 106706ebb74..cb5f700318f 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/domain/GetSettingsState.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/domain/GetSettingsState.kt @@ -1,40 +1,42 @@ package org.dhis2.usescases.settings.domain +import org.dhis2.mobile.commons.domain.UseCase import org.dhis2.usescases.settings.GatewayValidator -import org.dhis2.usescases.settings.SettingItem import org.dhis2.usescases.settings.SettingsRepository import org.dhis2.usescases.settings.models.SettingsState +import org.dhis2.usescases.settings.models.SyncStateInput class GetSettingsState( private val settingsRepository: SettingsRepository, private val gatewayValidator: GatewayValidator, -) { - suspend operator fun invoke( - openedItem: SettingItem?, - hasConnection: Boolean, - metadataSyncInProgress: Boolean, - dataSyncInProgress: Boolean, - ): SettingsState = - SettingsState( - openedItem = openedItem, - hasConnection = hasConnection, - metadataSettingsViewModel = - settingsRepository.metaSync().blockingGet().copy( - syncInProgress = metadataSyncInProgress, - ), - dataSettingsViewModel = - settingsRepository.dataSync().blockingGet().copy( - syncInProgress = dataSyncInProgress, - ), - syncParametersViewModel = settingsRepository.syncParameters().blockingGet(), - reservedValueSettingsViewModel = settingsRepository.reservedValues().blockingGet(), - smsSettingsViewModel = - with(settingsRepository.sms().blockingGet()) { - copy( - gatewayValidationResult = gatewayValidator(this.gatewayNumber), - ) - }, - isTwoFAConfigured = settingsRepository.isTwoFAConfigured(), - versionName = settingsRepository.getVersionName(), - ) +) : UseCase { + override suspend fun invoke(input: SyncStateInput) = + try { + val state = + SettingsState( + openedItem = input.openedItem, + hasConnection = input.hasConnection, + metadataSettingsViewModel = + settingsRepository.metaSync().blockingGet().copy( + syncInProgress = input.metadataSyncInProgress, + ), + dataSettingsViewModel = + settingsRepository.dataSync().blockingGet().copy( + syncInProgress = input.dataSyncInProgress, + ), + syncParametersViewModel = settingsRepository.syncParameters().blockingGet(), + reservedValueSettingsViewModel = settingsRepository.reservedValues().blockingGet(), + smsSettingsViewModel = + with(settingsRepository.sms().blockingGet()) { + copy( + gatewayValidationResult = gatewayValidator(this.gatewayNumber), + ) + }, + isTwoFAConfigured = settingsRepository.isTwoFAConfigured(), + versionName = settingsRepository.getVersionName(), + ) + Result.success(state) + } catch (e: Exception) { + Result.failure(e) + } } diff --git a/app/src/main/java/org/dhis2/usescases/settings/domain/LaunchSync.kt b/app/src/main/java/org/dhis2/usescases/settings/domain/LaunchSync.kt index 11b0e0286c3..d08e2991053 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/domain/LaunchSync.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/domain/LaunchSync.kt @@ -15,12 +15,17 @@ import org.dhis2.commons.prefs.PreferenceProvider import org.dhis2.data.service.workManager.WorkManagerController import org.dhis2.data.service.workManager.WorkerItem import org.dhis2.data.service.workManager.WorkerType +import org.dhis2.mobile.commons.providers.TIME_DATA +import org.dhis2.mobile.commons.providers.TIME_META +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.utils.analytics.AnalyticsHelper import org.dhis2.utils.analytics.CLICK import org.dhis2.utils.analytics.SYNC_DATA_NOW import org.dhis2.utils.analytics.SYNC_METADATA_NOW +import org.dhis2.mobile.sync.model.SyncStatus as Status class LaunchSync( + private val syncBackgroundJobAction: SyncBackgroundJobAction, private val workManagerController: WorkManagerController, private val preferenceProvider: PreferenceProvider, private val analyticsHelper: AnalyticsHelper, @@ -34,12 +39,19 @@ class LaunchSync( ) private val metadataWorkInfo = - workManagerController - .getWorkInfosByTagLiveData(Constants.META_NOW) - .asFlow() + syncBackgroundJobAction + .observeMetadataJob() .map { workStatuses -> - var workState: WorkInfo.State? = workStatuses.getOrNull(0)?.state - onWorkStatusesUpdate(workState, Constants.META_NOW) + var workState = workStatuses.firstOrNull()?.status + when (workState) { + Status.Enqueue, + Status.Running, + Status.Blocked, + -> syncStatus.update { it.copy(metadataSyncProgress = SyncStatus.InProgress) } + Status.Cancelled -> syncStatus.update { it.copy(metadataSyncProgress = SyncStatus.Cancelled) } + else -> syncStatus.update { it.copy(metadataSyncProgress = SyncStatus.Finished) } + } + syncStatus.value } private val dataWorkInfo = @@ -107,7 +119,6 @@ class LaunchSync( when (workState) { WorkInfo.State.CANCELLED -> when (workerTag) { - Constants.META_NOW -> syncStatus.update { it.copy(metadataSyncProgress = SyncStatus.Cancelled) } Constants.DATA_NOW -> syncStatus.update { it.copy(dataSyncProgress = SyncStatus.Cancelled) } else -> syncStatus } @@ -117,14 +128,12 @@ class LaunchSync( WorkInfo.State.BLOCKED, -> when (workerTag) { - Constants.META_NOW -> syncStatus.update { it.copy(metadataSyncProgress = SyncStatus.InProgress) } Constants.DATA_NOW -> syncStatus.update { it.copy(dataSyncProgress = SyncStatus.InProgress) } else -> syncStatus } else -> when (workerTag) { - Constants.META_NOW -> syncStatus.update { it.copy(metadataSyncProgress = SyncStatus.Finished) } Constants.DATA_NOW -> syncStatus.update { it.copy(dataSyncProgress = SyncStatus.Finished) } else -> syncStatus } @@ -157,52 +166,35 @@ class LaunchSync( private fun syncMeta() { analyticsHelper.setEvent(SYNC_METADATA_NOW, CLICK, SYNC_METADATA_NOW) - val workerItem = - WorkerItem( - Constants.META_NOW, - WorkerType.METADATA, - null, - null, - ExistingWorkPolicy.KEEP, - null, - ) - workManagerController.syncDataForWorker(workerItem) + syncBackgroundJobAction.launchMetadataSync(0) } private fun updateSyncDataPeriod(seconds: Int) { if (seconds != Constants.TIME_MANUAL) { syncData(seconds) } else { - cancelPendingWork(Constants.DATA) + preferenceProvider.setValue(TIME_DATA, 0) + workManagerController.cancelUniqueWork(Constants.DATA) } } - private fun updateSyncMetadataPeriod(seconds: Int) { + private suspend fun updateSyncMetadataPeriod(seconds: Int) { if (seconds != Constants.TIME_MANUAL) { syncMeta(seconds) } else { - cancelPendingWork(Constants.META) + preferenceProvider.setValue(TIME_META, 0) + syncBackgroundJobAction.cancelMetadataSync() } } private fun syncMeta(seconds: Int) { analyticsHelper.trackMatomoEvent(Categories.SETTINGS, Actions.SYNC_DATA, CLICK) - preferenceProvider.setValue(Constants.TIME_META, seconds) - workManagerController.cancelUniqueWork(Constants.META) - val workerItem = - WorkerItem( - Constants.META, - WorkerType.METADATA, - seconds.toLong(), - null, - null, - ExistingPeriodicWorkPolicy.REPLACE, - ) - workManagerController.enqueuePeriodicWork(workerItem) + preferenceProvider.setValue(TIME_META, seconds) + syncBackgroundJobAction.launchMetadataSync(seconds.toLong()) } private fun syncData(seconds: Int) { - preferenceProvider.setValue(Constants.TIME_DATA, seconds) + preferenceProvider.setValue(TIME_DATA, seconds) workManagerController.cancelUniqueWork(Constants.DATA) val workerItem = WorkerItem( @@ -215,15 +207,4 @@ class LaunchSync( ) workManagerController.enqueuePeriodicWork(workerItem) } - - private fun cancelPendingWork(tag: String) { - preferenceProvider.setValue( - when (tag) { - Constants.DATA -> Constants.TIME_DATA - else -> Constants.TIME_META - }, - 0, - ) - workManagerController.cancelUniqueWork(tag) - } } diff --git a/app/src/main/java/org/dhis2/usescases/settings/models/SyncStateInput.kt b/app/src/main/java/org/dhis2/usescases/settings/models/SyncStateInput.kt new file mode 100644 index 00000000000..e9a6d045b28 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/settings/models/SyncStateInput.kt @@ -0,0 +1,10 @@ +package org.dhis2.usescases.settings.models + +import org.dhis2.usescases.settings.SettingItem + +data class SyncStateInput( + val openedItem: SettingItem?, + val hasConnection: Boolean, + val metadataSyncInProgress: Boolean, + val dataSyncInProgress: Boolean, +) diff --git a/app/src/main/java/org/dhis2/usescases/sync/SyncActivity.kt b/app/src/main/java/org/dhis2/usescases/sync/SyncActivity.kt index 0b0a027a4e4..1cb60bc3cc7 100644 --- a/app/src/main/java/org/dhis2/usescases/sync/SyncActivity.kt +++ b/app/src/main/java/org/dhis2/usescases/sync/SyncActivity.kt @@ -5,18 +5,23 @@ import android.os.Bundle import android.view.View.GONE import androidx.appcompat.content.res.AppCompatResources import androidx.databinding.DataBindingUtil -import androidx.work.WorkInfo +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import kotlinx.coroutines.launch import org.dhis2.App import org.dhis2.R import org.dhis2.bindings.Bindings import org.dhis2.bindings.userComponent import org.dhis2.databinding.ActivitySynchronizationBinding +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.usescases.general.ActivityGlobalAbstract import org.dhis2.usescases.login.LoginActivity import org.dhis2.usescases.main.MainActivity import org.dhis2.utils.OnDialogClickListener import org.dhis2.utils.extension.navigateTo import org.dhis2.utils.extension.share +import org.koin.android.ext.android.inject import javax.inject.Inject class SyncActivity : @@ -30,20 +35,23 @@ class SyncActivity : @Inject lateinit var animations: SyncAnimations + private val backgroundJobAction: SyncBackgroundJobAction by inject() + override fun onCreate(savedInstanceState: Bundle?) { val serverComponent = (applicationContext as App).serverComponent() - userComponent()?.plus(SyncModule(this, serverComponent))?.inject(this) ?: finish() + userComponent()?.plus(SyncModule(this, backgroundJobAction, serverComponent))?.inject(this) + ?: finish() super.onCreate(savedInstanceState) binding = DataBindingUtil.setContentView(this, R.layout.activity_synchronization) binding.presenter = presenter - presenter.sync() - } - override fun onResume() { - super.onResume() - presenter.observeSyncProcess().observe(this) { workInfoList: List -> - presenter.handleSyncInfo(workInfoList) + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + presenter.observeSyncProcess().collect(presenter::handleSyncInfo) + } } + + presenter.sync() } override fun setMetadataSyncStarted() { diff --git a/app/src/main/java/org/dhis2/usescases/sync/SyncInjector.kt b/app/src/main/java/org/dhis2/usescases/sync/SyncInjector.kt index 1abecbbd72e..12e307c465f 100644 --- a/app/src/main/java/org/dhis2/usescases/sync/SyncInjector.kt +++ b/app/src/main/java/org/dhis2/usescases/sync/SyncInjector.kt @@ -7,7 +7,7 @@ import org.dhis2.commons.di.dagger.PerActivity import org.dhis2.commons.prefs.PreferenceProvider import org.dhis2.commons.schedulers.SchedulerProvider import org.dhis2.data.server.ServerComponent -import org.dhis2.data.service.workManager.WorkManagerController +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction @PerActivity @Subcomponent(modules = [SyncModule::class]) @@ -18,6 +18,7 @@ interface SyncComponent { @Module class SyncModule( private val view: SyncView, + private val backgroundJobAction: SyncBackgroundJobAction, serverComponent: ServerComponent?, ) { private val userManager = serverComponent?.userManager() @@ -26,14 +27,13 @@ class SyncModule( @PerActivity fun providePresenter( schedulerProvider: SchedulerProvider, - workManagerController: WorkManagerController, preferences: PreferenceProvider, ): SyncPresenter = SyncPresenter( view, userManager, schedulerProvider, - workManagerController, + backgroundJobAction, preferences, ) } diff --git a/app/src/main/java/org/dhis2/usescases/sync/SyncPresenter.kt b/app/src/main/java/org/dhis2/usescases/sync/SyncPresenter.kt index 90735348a02..91d7c5e58bc 100644 --- a/app/src/main/java/org/dhis2/usescases/sync/SyncPresenter.kt +++ b/app/src/main/java/org/dhis2/usescases/sync/SyncPresenter.kt @@ -1,15 +1,14 @@ package org.dhis2.usescases.sync -import androidx.lifecycle.LiveData -import androidx.work.WorkInfo import io.reactivex.disposables.CompositeDisposable -import org.dhis2.commons.Constants import org.dhis2.commons.prefs.Preference import org.dhis2.commons.prefs.PreferenceProvider import org.dhis2.commons.schedulers.SchedulerProvider import org.dhis2.data.server.UserManager -import org.dhis2.data.service.METADATA_MESSAGE -import org.dhis2.data.service.workManager.WorkManagerController +import org.dhis2.mobile.sync.data.METADATA_SYNC_NOW +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.model.SyncJobStatus +import org.dhis2.mobile.sync.model.SyncStatus import timber.log.Timber const val WAS_INITIAL_SYNC_DONE = "WasInitialSyncDone" @@ -18,35 +17,35 @@ class SyncPresenter internal constructor( private val view: SyncView, private val userManager: UserManager?, private val schedulerProvider: SchedulerProvider, - private val workManagerController: WorkManagerController, + private val backgroundJobAction: SyncBackgroundJobAction, private val preferences: PreferenceProvider, ) { private val disposable = CompositeDisposable() fun sync() { - workManagerController - .syncMetaDataForWorker(Constants.META_NOW, Constants.INITIAL_SYNC) + backgroundJobAction.launchMetadataSync(0) } - fun observeSyncProcess(): LiveData> = workManagerController.getWorkInfosForUniqueWorkLiveData(Constants.INITIAL_SYNC) + fun observeSyncProcess() = backgroundJobAction.observeMetadataJob() - fun handleSyncInfo(workInfoList: List) { + fun handleSyncInfo(workInfoList: List) { workInfoList.forEach { workInfo -> - if (workInfo.tags.contains(Constants.META_NOW)) { - handleMetaState(workInfo.state, workInfo.outputData.getString(METADATA_MESSAGE)) + if (workInfo.tags.contains(METADATA_SYNC_NOW)) { + handleMetaState(workInfo.status, workInfo.message) } } } private fun handleMetaState( - state: WorkInfo.State, + state: SyncStatus, message: String?, ) { when (state) { - WorkInfo.State.RUNNING -> view.setMetadataSyncStarted() - WorkInfo.State.SUCCEEDED -> view.setMetadataSyncSucceed() - WorkInfo.State.FAILED -> view.showMetadataFailedMessage(message) + SyncStatus.Running -> view.setMetadataSyncStarted() + SyncStatus.Succeed -> view.setMetadataSyncSucceed() + SyncStatus.Failed -> view.showMetadataFailedMessage(message) else -> { + // do nothing } } } diff --git a/app/src/main/java/org/dhis2/utils/analytics/AnalyticsHelper.kt b/app/src/main/java/org/dhis2/utils/analytics/AnalyticsHelper.kt index 3812af80ab1..3300d7e70d1 100644 --- a/app/src/main/java/org/dhis2/utils/analytics/AnalyticsHelper.kt +++ b/app/src/main/java/org/dhis2/utils/analytics/AnalyticsHelper.kt @@ -2,6 +2,7 @@ package org.dhis2.utils.analytics import org.dhis2.commons.matomo.MatomoAnalyticsController import org.dhis2.mobile.commons.reporting.AnalyticActions +import org.dhis2.utils.analytics.matomo.DEFAULT_EXTERNAL_TRACKER_NAME import javax.inject.Inject class AnalyticsHelper @@ -28,12 +29,11 @@ class AnalyticsHelper override fun updateMatomoSecondaryTracker( matomoUrl: String, matomoID: Int, - trackerName: String, ) { matomoAnalyticsController.updateDhisImplementationTracker( matomoUrl, matomoID, - trackerName, + DEFAULT_EXTERNAL_TRACKER_NAME, ) } diff --git a/app/src/test/java/org/dhis2/data/services/SyncPresenterTest.kt b/app/src/test/java/org/dhis2/data/services/SyncPresenterTest.kt index f0b474d582a..de07880d1f8 100644 --- a/app/src/test/java/org/dhis2/data/services/SyncPresenterTest.kt +++ b/app/src/test/java/org/dhis2/data/services/SyncPresenterTest.kt @@ -1,6 +1,5 @@ package org.dhis2.data.services -import io.reactivex.Completable import io.reactivex.Observable import org.dhis2.commons.bindings.program import org.dhis2.commons.prefs.PreferenceProvider @@ -11,16 +10,13 @@ import org.dhis2.data.service.SyncStatusController import org.dhis2.data.service.workManager.WorkManagerController import org.dhis2.utils.analytics.AnalyticsHelper import org.hisp.dhis.android.core.D2 -import org.hisp.dhis.android.core.arch.call.BaseD2Progress import org.hisp.dhis.android.core.arch.call.D2Progress import org.hisp.dhis.android.core.arch.call.D2ProgressStatus import org.hisp.dhis.android.core.arch.call.D2ProgressSyncStatus import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.event.Event -import org.hisp.dhis.android.core.fileresource.FileResourceDomainType import org.hisp.dhis.android.core.program.Program import org.hisp.dhis.android.core.program.ProgramType -import org.hisp.dhis.android.core.settings.GeneralSettings import org.hisp.dhis.android.core.settings.LimitScope import org.hisp.dhis.android.core.settings.ProgramSetting import org.hisp.dhis.android.core.settings.ProgramSettings @@ -30,12 +26,8 @@ import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import org.mockito.Mockito -import org.mockito.kotlin.any import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock -import org.mockito.kotlin.times -import org.mockito.kotlin.verify -import org.mockito.kotlin.verifyNoMoreInteractions import org.mockito.kotlin.whenever class SyncPresenterTest { @@ -125,130 +117,6 @@ class SyncPresenterTest { assertTrue(eventLimit == 200 && limitByOU && !limitByProgram) } - @Test - fun `Should configure secondary tracker if configuration exists`() { - whenever( - d2.metadataModule().download(), - ) doReturn - Observable.fromArray( - BaseD2Progress.empty(2), - ) - whenever( - d2.settingModule().generalSetting().blockingGet(), - ) doReturn - GeneralSettings - .builder() - .encryptDB(false) - .matomoID(11111) - .matomoURL("MatomoURL") - .build() - whenever( - d2.mapsModule().mapLayersDownloader().downloadMetadata(), - ) doReturn Completable.complete() - - whenever( - d2 - .fileResourceModule() - .fileResourceDownloader() - .byDomainType() - .eq(FileResourceDomainType.ICON) - .download(), - ) doReturn Observable.just(BaseD2Progress.empty(1)) - - presenter.syncMetadata { } - - verify(analyticsHelper, times(1)).updateMatomoSecondaryTracker(any(), any(), any()) - } - - @Test - fun `Should not configure secondary tracker if matomo settings is missing`() { - whenever( - d2.metadataModule().download(), - ) doReturn - Observable.fromArray( - BaseD2Progress.empty(2), - ) - whenever( - d2.settingModule().generalSetting().blockingGet(), - ) doReturn - GeneralSettings - .builder() - .encryptDB(false) - .build() - whenever( - d2.mapsModule().mapLayersDownloader().downloadMetadata(), - ) doReturn Completable.complete() - whenever( - d2 - .fileResourceModule() - .fileResourceDownloader() - .byDomainType() - .eq(FileResourceDomainType.ICON) - .download(), - ) doReturn Observable.just(BaseD2Progress.empty(1)) - presenter.syncMetadata { } - - verifyNoMoreInteractions(analyticsHelper) - } - - @Test - fun `Should not configure secondary tracker if no configuration exists`() { - whenever( - d2.metadataModule().download(), - ) doReturn - Observable.fromArray( - BaseD2Progress.empty(2), - ) - whenever( - d2.settingModule().generalSetting().blockingGet(), - ) doReturn null - whenever( - d2.mapsModule().mapLayersDownloader().downloadMetadata(), - ) doReturn Completable.complete() - whenever( - d2.mapsModule().mapLayersDownloader().downloadMetadata(), - ) doReturn Completable.complete() - whenever( - d2 - .fileResourceModule() - .fileResourceDownloader() - .byDomainType() - .eq(FileResourceDomainType.ICON) - .download(), - ) doReturn Observable.just(BaseD2Progress.empty(1)) - presenter.syncMetadata { } - - verify(analyticsHelper, times(0)).updateMatomoSecondaryTracker(any(), any(), any()) - } - - @Test - fun `Should clear secondary tracker`() { - whenever( - d2.metadataModule().download(), - ) doReturn - Observable.fromArray( - BaseD2Progress.empty(2), - ) - whenever( - d2.settingModule().generalSetting().blockingGet(), - ) doReturn null - whenever( - d2.mapsModule().mapLayersDownloader().downloadMetadata(), - ) doReturn Completable.complete() - whenever( - d2 - .fileResourceModule() - .fileResourceDownloader() - .byDomainType() - .eq(FileResourceDomainType.ICON) - .download(), - ) doReturn Observable.just(BaseD2Progress.empty(1)) - presenter.syncMetadata { } - - verify(analyticsHelper, times(0)).updateMatomoSecondaryTracker(any(), any(), any()) - verify(analyticsHelper).clearMatomoSecondaryTracker() - } - @Test fun `Should return successfully SYNC if tei enrollment and events are ok`() { whenever( diff --git a/app/src/test/java/org/dhis2/usescases/settings/SyncManagerPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/settings/SyncManagerPresenterTest.kt index 4d70a7d708a..21c59026565 100644 --- a/app/src/test/java/org/dhis2/usescases/settings/SyncManagerPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/settings/SyncManagerPresenterTest.kt @@ -39,7 +39,6 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.mockito.kotlin.any -import org.mockito.kotlin.anyOrNull import org.mockito.kotlin.doReturn import org.mockito.kotlin.doReturnConsecutively import org.mockito.kotlin.mock @@ -223,21 +222,20 @@ class SyncManagerPresenterTest { val timeoutTest = 1 whenever( getSettingsState.invoke( - anyOrNull(), - any(), - any(), any(), ), ) doReturnConsecutively listOf( - mockedSettingState(), - mockedSettingState().copy( - smsSettingsViewModel = - mockedSMSViewModel().copy( - isEnabled = true, - gatewayNumber = gatewayNumberTest, - responseTimeout = timeoutTest, - ), + Result.success(mockedSettingState()), + Result.success( + mockedSettingState().copy( + smsSettingsViewModel = + mockedSMSViewModel().copy( + isEnabled = true, + gatewayNumber = gatewayNumberTest, + responseTimeout = timeoutTest, + ), + ), ), ) @@ -254,7 +252,7 @@ class SyncManagerPresenterTest { awaitItem() presenter.enableSmsModule(true, gatewayNumberTest, timeoutTest) awaitItem() - verify(getSettingsState, times(2)).invoke(anyOrNull(), any(), any(), any()) + verify(getSettingsState, times(2)).invoke(any()) } } @@ -262,13 +260,8 @@ class SyncManagerPresenterTest { fun `Should not save gateway if validation fails`() = runTest { whenever( - getSettingsState.invoke( - anyOrNull(), - any(), - any(), - any(), - ), - ) doReturn mockedSettingState() + getSettingsState.invoke(any()), + ) doReturn Result.success(mockedSettingState()) val gatewayNumberTest = "+111" whenever( @@ -310,13 +303,8 @@ class SyncManagerPresenterTest { runTest { val smsResultSender = "test" whenever( - getSettingsState.invoke( - anyOrNull(), - any(), - any(), - any(), - ), - ) doReturn mockedSettingState() + getSettingsState.invoke(any()), + ) doReturn Result.success(mockedSettingState()) whenever(updateSmsResponse(any())) doReturn UpdateSmsResponse.UpdateSmsResponseResult.ValidationError( GatewayValidator.GatewayValidationResult.Invalid, @@ -364,17 +352,14 @@ class SyncManagerPresenterTest { fun `Should load data when setting manual trigger`() = runTest { whenever( - getSettingsState.invoke( - anyOrNull(), - any(), - any(), - any(), - ), + getSettingsState.invoke(any()), ) doReturnConsecutively listOf( - mockedSettingState(), - mockedSettingState().copy( - dataSettingsViewModel = mockedDataViewModel().copy(dataSyncPeriod = 0), + Result.success(mockedSettingState()), + Result.success( + mockedSettingState().copy( + dataSettingsViewModel = mockedDataViewModel().copy(dataSyncPeriod = 0), + ), ), ) @@ -402,13 +387,8 @@ class SyncManagerPresenterTest { fun `Should open clicked item`() = runTest { whenever( - getSettingsState.invoke( - anyOrNull(), - any(), - any(), - any(), - ), - ) doReturn mockedSettingState() + getSettingsState.invoke(any()), + ) doReturn Result.success(mockedSettingState()) presenter.settingsState.test { awaitItem() @@ -483,13 +463,8 @@ class SyncManagerPresenterTest { fun shouldUpdateSyncStatus() = runTest { whenever( - getSettingsState.invoke( - anyOrNull(), - any(), - any(), - any(), - ), - ) doReturn mockedSettingState() + getSettingsState.invoke(any()), + ) doReturn Result.success(mockedSettingState()) val dataSyncStartedProgress = LaunchSync.SyncStatusProgress( diff --git a/app/src/test/java/org/dhis2/usescases/settings/domain/LaunchSyncTest.kt b/app/src/test/java/org/dhis2/usescases/settings/domain/LaunchSyncTest.kt index 750be9ec62f..3efadfffb87 100644 --- a/app/src/test/java/org/dhis2/usescases/settings/domain/LaunchSyncTest.kt +++ b/app/src/test/java/org/dhis2/usescases/settings/domain/LaunchSyncTest.kt @@ -8,6 +8,7 @@ import androidx.work.WorkInfo import app.cash.turbine.test import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.runTest @@ -17,6 +18,9 @@ import org.dhis2.commons.prefs.PreferenceProvider import org.dhis2.data.service.workManager.WorkManagerController import org.dhis2.data.service.workManager.WorkerItem import org.dhis2.data.service.workManager.WorkerType +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.model.SyncJobStatus +import org.dhis2.mobile.sync.model.SyncStatus import org.dhis2.utils.analytics.AnalyticsHelper import org.junit.After import org.junit.Assert.assertEquals @@ -43,16 +47,18 @@ class LaunchSyncTest { private val preferenceProvider: PreferenceProvider = mock() private val analyticsHelper: AnalyticsHelper = mock() - private val mockedMetadataWorkInfo = MutableLiveData>() + private val mockedMetadataWorkInfo = MutableStateFlow>(emptyList()) private val mockedDataWorkInfo = MutableLiveData>() + private val syncBackgroundJobAction: SyncBackgroundJobAction = mock() @Before fun setUp() { Dispatchers.setMain(testingDispatcher) - whenever(workManagerController.getWorkInfosByTagLiveData(Constants.META_NOW)) doReturn mockedMetadataWorkInfo + whenever(syncBackgroundJobAction.observeMetadataJob()) doReturn mockedMetadataWorkInfo whenever(workManagerController.getWorkInfosByTagLiveData(Constants.DATA_NOW)) doReturn mockedDataWorkInfo launchSync = LaunchSync( + syncBackgroundJobAction = syncBackgroundJobAction, workManagerController = workManagerController, preferenceProvider = preferenceProvider, analyticsHelper = analyticsHelper, @@ -67,17 +73,8 @@ class LaunchSyncTest { @Test fun shouldStartSyncMetadata() = runTest { - val expectedWorkerItem = - WorkerItem( - Constants.META_NOW, - WorkerType.METADATA, - null, - null, - ExistingWorkPolicy.KEEP, - null, - ) launchSync(LaunchSync.SyncAction.SyncMetadata) - verify(workManagerController, times(1)).syncDataForWorker(expectedWorkerItem) + verify(syncBackgroundJobAction, times(1)).launchMetadataSync(0) } @Test @@ -119,19 +116,9 @@ class LaunchSyncTest { fun shouldUpdateSyncMetadataPeriod() = runTest { val newPeriod = 13 - val expectedWorkerItem = - WorkerItem( - Constants.META, - WorkerType.METADATA, - newPeriod.toLong(), - null, - null, - ExistingPeriodicWorkPolicy.REPLACE, - ) launchSync(LaunchSync.SyncAction.UpdateSyncMetadataPeriod(newPeriod)) verify(preferenceProvider, times(1)).setValue(Constants.TIME_META, newPeriod) - verify(workManagerController, times(1)).cancelUniqueWork(Constants.META) - verify(workManagerController, times(1)).enqueuePeriodicWork(expectedWorkerItem) + verify(syncBackgroundJobAction, times(1)).launchMetadataSync(newPeriod.toLong()) } @Test @@ -147,30 +134,31 @@ class LaunchSyncTest { runTest { launchSync(LaunchSync.SyncAction.UpdateSyncMetadataPeriod(0)) verify(preferenceProvider, times(1)).setValue(Constants.TIME_META, 0) - verify(workManagerController, times(1)).cancelUniqueWork(Constants.META) + verify(syncBackgroundJobAction, times(1)).cancelMetadataSync() } @Test fun shouldUpdateProgressStatus() = runTest { val startedMetadataWorkInfo = - mock { - on { state } doReturn WorkInfo.State.RUNNING + mock { + on { status } doReturn SyncStatus.Running } val startedDataWorkInfo = mock { on { state } doReturn WorkInfo.State.RUNNING } val finishedMetadataWorkInfo = - mock { - on { state } doReturn WorkInfo.State.SUCCEEDED + mock { + on { status } doReturn SyncStatus.Succeed } val finishedDataWorkInfo = mock { on { state } doReturn WorkInfo.State.SUCCEEDED } launchSync.syncWorkInfo.test { - mockedMetadataWorkInfo.postValue(listOf(startedMetadataWorkInfo)) + awaitItem() + mockedMetadataWorkInfo.emit(listOf(startedMetadataWorkInfo)) assertState(awaitItem(), LaunchSync.SyncStatus.InProgress, LaunchSync.SyncStatus.None) mockedDataWorkInfo.postValue(listOf(startedDataWorkInfo)) with(awaitItem()) { @@ -182,7 +170,7 @@ class LaunchSyncTest { assertFalse(this.hasSyncFinished(metadataWasRunning = true, dataWasRunning = false)) } - mockedMetadataWorkInfo.postValue(listOf(finishedMetadataWorkInfo)) + mockedMetadataWorkInfo.emit(listOf(finishedMetadataWorkInfo)) with(awaitItem()) { assertState( this, diff --git a/app/src/test/java/org/dhis2/usescases/sync/SyncPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/sync/SyncPresenterTest.kt index 07b6c765d3b..c54d0634dd2 100644 --- a/app/src/test/java/org/dhis2/usescases/sync/SyncPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/sync/SyncPresenterTest.kt @@ -1,17 +1,15 @@ package org.dhis2.usescases.sync -import androidx.work.Data -import androidx.work.WorkInfo import io.reactivex.Completable import io.reactivex.Single -import org.dhis2.commons.Constants import org.dhis2.commons.prefs.Preference import org.dhis2.commons.prefs.PreferenceProvider import org.dhis2.commons.schedulers.SchedulerProvider import org.dhis2.data.schedulers.TrampolineSchedulerProvider import org.dhis2.data.server.UserManager -import org.dhis2.data.service.METADATA_MESSAGE -import org.dhis2.data.service.workManager.WorkManagerController +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.model.SyncJobStatus +import org.dhis2.mobile.sync.model.SyncStatus import org.junit.Before import org.junit.Test import org.mockito.Mockito @@ -20,7 +18,6 @@ import org.mockito.kotlin.mock import org.mockito.kotlin.times import org.mockito.kotlin.verify import org.mockito.kotlin.whenever -import java.util.UUID class SyncPresenterTest { lateinit var presenter: SyncPresenter @@ -28,9 +25,10 @@ class SyncPresenterTest { private val userManager: UserManager = Mockito.mock(UserManager::class.java, Mockito.RETURNS_DEEP_STUBS) private val schedulerProvider: SchedulerProvider = TrampolineSchedulerProvider() - private val workManagerController: WorkManagerController = mock() private val preferences: PreferenceProvider = mock() + private val backgroundJobAction: SyncBackgroundJobAction = mock() + @Before fun setUp() { presenter = @@ -38,7 +36,7 @@ class SyncPresenterTest { view, userManager, schedulerProvider, - workManagerController, + backgroundJobAction, preferences, ) } @@ -46,35 +44,31 @@ class SyncPresenterTest { @Test fun `Should start initial sync`() { presenter.sync() - verify(workManagerController, times(1)).syncMetaDataForWorker( - Constants.META_NOW, - Constants.INITIAL_SYNC, - ) + verify(backgroundJobAction, times(1)).launchMetadataSync(0) } @Test fun `Should return work info live data`() { presenter.observeSyncProcess() - verify(workManagerController, times(1)) - .getWorkInfosForUniqueWorkLiveData(Constants.INITIAL_SYNC) + verify(backgroundJobAction, times(1)).observeMetadataJob() } @Test fun `Should set metadata sync started`() { - presenter.handleSyncInfo(arrayListOf(metaWorkInfo(WorkInfo.State.RUNNING))) + presenter.handleSyncInfo(arrayListOf(metaSyncJobStatus(SyncStatus.Running))) verify(view, times(1)).setMetadataSyncStarted() } @Test fun `Should set metadata sync succeeded`() { - presenter.handleSyncInfo(arrayListOf(metaWorkInfo(WorkInfo.State.SUCCEEDED))) + presenter.handleSyncInfo(arrayListOf(metaSyncJobStatus(SyncStatus.Succeed))) verify(view, times(1)).setMetadataSyncSucceed() } @Test fun `Should show metadata sync error message`() { val message = "Error message" - presenter.handleSyncInfo(arrayListOf(metaWorkInfo(WorkInfo.State.FAILED, message))) + presenter.handleSyncInfo(arrayListOf(metaSyncJobStatus(SyncStatus.Failed, message))) verify(view, times(1)).showMetadataFailedMessage(message) } @@ -97,17 +91,12 @@ class SyncPresenterTest { verify(view, times(1)).goToLogin() } - private fun metaWorkInfo( - state: WorkInfo.State, + private fun metaSyncJobStatus( + state: SyncStatus, message: String? = null, - ): WorkInfo = - WorkInfo( - id = UUID.randomUUID(), - state = state, - outputData = Data.Builder().apply { putString(METADATA_MESSAGE, message) }.build(), - tags = setOf(Constants.META_NOW), - progress = Data.EMPTY, - runAttemptCount = 0, - generation = 0, - ) + ) = SyncJobStatus( + status = state, + message = message, + tags = listOf("METADATA_SYNC_NOW"), + ) } diff --git a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/di/CommonsModule.android.kt b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/di/CommonsModule.android.kt index 5f84b93b638..46e9edc6b33 100644 --- a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/di/CommonsModule.android.kt +++ b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/di/CommonsModule.android.kt @@ -14,6 +14,8 @@ import org.dhis2.mobile.commons.files.FileHandler import org.dhis2.mobile.commons.files.FileHandlerImpl import org.dhis2.mobile.commons.network.NetworkStatusProvider import org.dhis2.mobile.commons.network.NetworkStatusProviderImpl +import org.dhis2.mobile.commons.notifications.NotificationManager +import org.dhis2.mobile.commons.notifications.NotificationManagerImpl import org.dhis2.mobile.commons.providers.PreferenceProvider import org.dhis2.mobile.commons.providers.PreferenceProviderImpl import org.dhis2.mobile.commons.reporting.CrashReportController @@ -50,6 +52,10 @@ actual val commonsModule: Module PreferenceProviderImpl(get()) } + single { + NotificationManagerImpl(get()) + } + factory { D2ErrorMessageProviderImpl() } diff --git a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationManagerImpl.kt b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationManagerImpl.kt new file mode 100644 index 00000000000..aacb93b5319 --- /dev/null +++ b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationManagerImpl.kt @@ -0,0 +1,192 @@ +package org.dhis2.mobile.commons.notifications + +import android.Manifest +import android.app.NotificationChannel +import android.content.Context +import android.content.pm.PackageManager +import android.content.pm.ServiceInfo +import android.os.Build +import androidx.annotation.RequiresApi +import androidx.core.app.NotificationCompat +import androidx.core.app.NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE +import androidx.work.ForegroundInfo + +private const val SYNC_METADATA_NOTIFICATION_ID = 26061987 +private const val SYNC_METADATA_CHANNEL_ID = "sync_metadata_notification" +private const val SYNC_METADATA_CHANNEL_NAME = "sync_metadata" + +private const val SYNC_DATA_NOTIFICATION_ID = 80071986 +private const val SYNC_DATA_CHANNEL_ID = "sync_data_notification" +private const val SYNC_DATA_CHANNEL_NAME = "sync_data" + +private const val SYNC_SETTINGS_NOTIFICATION_ID = 28042023 +private const val SYNC_SETTINGS_CHANNEL_ID = "sync_settings_notification" +private const val SYNC_SETTINGS_CHANNEL_NAME = "sync_settings" + +class NotificationManagerImpl( + private val context: Context, +) : NotificationManager { + private val notificationManager = + context.getSystemService(Context.NOTIFICATION_SERVICE) as android.app.NotificationManager + + override fun getDataSyncNotification( + smallIcon: Int, + contentTitle: String, + contentText: String, + progress: Int, + ): NotificationModel { + TODO("Not yet implemented") + } + + override fun displayDataSyncNotification( + smallIcon: Int, + contentTitle: String, + contentText: String, + progress: Int, + ) { + TODO("Not yet implemented") + } + + override fun getMetadataSyncNotification( + smallIcon: Int, + contentTitle: String, + contentText: String, + progress: Int, + ) = WorkerNotificationInfo( + createForegroundInfo( + notificationId = SYNC_METADATA_NOTIFICATION_ID, + channelId = SYNC_METADATA_CHANNEL_ID, + channelName = SYNC_METADATA_CHANNEL_NAME, + smallIcon = smallIcon, + contentTitle = contentTitle, + contentText = contentText, + progress = progress, + ), + ) + + override fun displayMetadataSyncNotification( + smallIcon: Int, + contentTitle: String, + contentText: String, + progress: Int, + ) { + val foregroundInfo = + createForegroundInfo( + notificationId = SYNC_METADATA_NOTIFICATION_ID, + channelId = SYNC_METADATA_CHANNEL_ID, + channelName = SYNC_METADATA_CHANNEL_NAME, + smallIcon = smallIcon, + contentTitle = contentTitle, + contentText = contentText, + progress = progress, + ) + + notify(foregroundInfo) + } + + override fun getSyncSettingsNotificationModel( + smallIcon: Int, + contentTitle: String, + contentText: String, + ) = WorkerNotificationInfo( + createForegroundInfo( + notificationId = SYNC_SETTINGS_NOTIFICATION_ID, + channelId = SYNC_SETTINGS_CHANNEL_ID, + channelName = SYNC_SETTINGS_CHANNEL_NAME, + smallIcon = smallIcon, + contentTitle = contentTitle, + contentText = contentText, + progress = -1, + ), + ) + + override fun displaySyncSettingsNotification( + smallIcon: Int, + contentTitle: String, + contentText: String, + ) { + val foregroundInfo = + createForegroundInfo( + notificationId = SYNC_SETTINGS_NOTIFICATION_ID, + channelId = SYNC_SETTINGS_CHANNEL_ID, + channelName = SYNC_SETTINGS_CHANNEL_NAME, + smallIcon = smallIcon, + contentTitle = contentTitle, + contentText = contentText, + progress = -1, + ) + notify(foregroundInfo) + } + + override fun cancelMetadataSyncNotification() { + notificationManager.cancel(SYNC_METADATA_NOTIFICATION_ID) + } + + override fun cancelSyncSettingsNotification() { + notificationManager.cancel(SYNC_SETTINGS_NOTIFICATION_ID) + } + + private fun createForegroundInfo( + notificationId: Int, + channelId: String, + channelName: String, + smallIcon: Int, + contentTitle: String, + contentText: String, + progress: Int = 0, + ): ForegroundInfo { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + createChannel(channelId, channelName) + } + val notification = + NotificationCompat + .Builder(context, channelId) + .setSmallIcon(smallIcon) + .setContentTitle(contentTitle) + .setContentText(contentText) + .setOngoing(true) + .setOnlyAlertOnce(true) + .setForegroundServiceBehavior(FOREGROUND_SERVICE_IMMEDIATE) + .setAutoCancel(false) + .setProgress(100, progress, progress == -1) + .build() + + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + ForegroundInfo( + notificationId, + notification, + ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC, + ) + } else { + ForegroundInfo( + notificationId, + notification, + ) + } + } + + private fun notify(foregroundInfo: ForegroundInfo) { + if ( + Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && + context.checkSelfPermission( + Manifest.permission.POST_NOTIFICATIONS, + ) == PackageManager.PERMISSION_GRANTED + ) { + notificationManager.notify(foregroundInfo.notificationId, foregroundInfo.notification) + } + } + + @RequiresApi(Build.VERSION_CODES.O) + private fun createChannel( + channelId: String, + channelName: String, + ) { + notificationManager.createNotificationChannel( + NotificationChannel( + channelId, + channelName, + android.app.NotificationManager.IMPORTANCE_HIGH, + ), + ) + } +} diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/reporting/AnalyticActions.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/reporting/AnalyticActions.kt index 92da4053031..3877335781e 100644 --- a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/reporting/AnalyticActions.kt +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/reporting/AnalyticActions.kt @@ -16,7 +16,6 @@ interface AnalyticActions { fun updateMatomoSecondaryTracker( matomoUrl: String, matomoID: Int, - trackerName: String, ) fun clearMatomoSecondaryTracker() diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index a48a4721150..e3730651265 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -12816,6 +12816,20 @@ + + + + + + + + + + + diff --git a/sync/build.gradle.kts b/sync/build.gradle.kts index d8f6f2db064..4912fafc6f4 100644 --- a/sync/build.gradle.kts +++ b/sync/build.gradle.kts @@ -67,7 +67,11 @@ kotlin { } androidUnitTest.dependencies { - + implementation(kotlin("test")) + implementation(libs.junit.jupiter) + implementation(libs.test.turbine) + implementation(libs.test.kotlinCoroutines) + implementation(libs.test.mockitoKotlin) } androidInstrumentedTest.dependencies { diff --git a/sync/src/androidDeviceTest/kotlin/org/dhis2/mobile/sync/ExampleInstrumentedTest.kt b/sync/src/androidDeviceTest/kotlin/org/dhis2/mobile/sync/ExampleInstrumentedTest.kt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/sync/src/androidHostTest/kotlin/org/dhis2/mobile/sync/ExampleUnitTest.kt b/sync/src/androidHostTest/kotlin/org/dhis2/mobile/sync/ExampleUnitTest.kt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncBackgroundJobAction.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncBackgroundJobAction.kt index 159461d8dbf..cd2c78a81b2 100644 --- a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncBackgroundJobAction.kt +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncBackgroundJobAction.kt @@ -1,26 +1,62 @@ package org.dhis2.mobile.sync.data import androidx.work.ExistingPeriodicWorkPolicy +import androidx.work.ExistingWorkPolicy +import androidx.work.OneTimeWorkRequest import androidx.work.PeriodicWorkRequest +import androidx.work.WorkInfo import androidx.work.WorkManager +import androidx.work.WorkQuery import androidx.work.await -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.emptyFlow +import kotlinx.coroutines.flow.map import org.dhis2.mobile.sync.model.SyncJobStatus +import org.dhis2.mobile.sync.model.SyncStatus import java.util.concurrent.TimeUnit import kotlin.time.Duration.Companion.days -private const val METADATA_SYNC = "METADATA_SYNC" -private const val METADATA_SYNC_NOW = "METADATA_SYNC_NOW" -private const val DATA_SYNC = "DATA_SYNC" -private const val DATA_SYNC_NOW = "DATA_SYNC_NOW" -private const val SYNC_SETTINGS = "SYNC_SETTINGS" +const val METADATA_SYNC = "METADATA_SYNC" +const val METADATA_SYNC_NOW = "METADATA_SYNC_NOW" +const val DATA_SYNC = "DATA_SYNC" +const val DATA_SYNC_NOW = "DATA_SYNC_NOW" +const val SYNC_SETTINGS = "SYNC_SETTINGS" -internal class AndroidSyncBackgroundJobAction( +class AndroidSyncBackgroundJobAction( private val workManager: WorkManager, ) : SyncBackgroundJobAction { override fun launchMetadataSync(syncingPeriod: Long) { - // implement later + if (syncingPeriod == 0L) { + val request = + OneTimeWorkRequest + .Builder( + workerClass = SyncMetadataWorker::class.java, + ).addTag( + METADATA_SYNC_NOW, + ).build() + workManager.enqueueUniqueWork( + uniqueWorkName = METADATA_SYNC_NOW, + existingWorkPolicy = ExistingWorkPolicy.KEEP, + request = request, + ) + } else { + val request = + PeriodicWorkRequest + .Builder( + workerClass = SyncMetadataWorker::class.java, + repeatInterval = syncingPeriod, + repeatIntervalTimeUnit = TimeUnit.SECONDS, + ).addTag( + METADATA_SYNC, + ).setInitialDelay( + syncingPeriod, + TimeUnit.SECONDS, + ).build() + + workManager.enqueueUniquePeriodicWork( + uniqueWorkName = METADATA_SYNC, + existingPeriodicWorkPolicy = ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE, + request = request, + ) + } } override fun launchDataSync(syncingPeriod: Long) { @@ -46,10 +82,30 @@ internal class AndroidSyncBackgroundJobAction( ) } - override fun observeMetadataJob(): Flow> { - // implement later - return emptyFlow() - } + override fun observeMetadataJob() = + workManager + .getWorkInfosFlow( + WorkQuery.fromUniqueWorkNames( + METADATA_SYNC, + METADATA_SYNC_NOW, + ), + ).map { workInfos -> + workInfos.map { workInfo -> + SyncJobStatus( + tags = workInfo.tags.toList(), + status = + when (workInfo.state) { + WorkInfo.State.ENQUEUED -> SyncStatus.Enqueue + WorkInfo.State.RUNNING -> SyncStatus.Running + WorkInfo.State.SUCCEEDED -> SyncStatus.Succeed + WorkInfo.State.FAILED -> SyncStatus.Failed + WorkInfo.State.BLOCKED -> SyncStatus.Blocked + WorkInfo.State.CANCELLED -> SyncStatus.Cancelled + }, + message = workInfo.outputData.getString(METADATA_MESSAGE), + ) + } + } override suspend fun cancelSyncSettings() { workManager.cancelUniqueWork(SYNC_SETTINGS).await() diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt index eafab16e4e6..9d95846eec5 100644 --- a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt @@ -117,7 +117,6 @@ class AndroidSyncRepository( analyticsHelper.updateMatomoSecondaryTracker( globalSettings.matomoURL()!!, globalSettings.matomoID()!!, - "secondaryTracker", ) } } ?: analyticsHelper.clearMatomoSecondaryTracker() diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncMetadataWorker.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncMetadataWorker.kt new file mode 100644 index 00000000000..5ff78101410 --- /dev/null +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncMetadataWorker.kt @@ -0,0 +1,85 @@ +package org.dhis2.mobile.sync.data + +import android.content.Context +import androidx.work.CoroutineWorker +import androidx.work.Data +import androidx.work.ForegroundInfo +import androidx.work.WorkerParameters +import org.dhis2.mobile.commons.notifications.NotificationManager +import org.dhis2.mobile.commons.notifications.WorkerNotificationInfo +import org.dhis2.mobile.sync.R +import org.dhis2.mobile.sync.domain.SyncMetadata +import org.dhis2.mobile.sync.resources.Res +import org.dhis2.mobile.sync.resources.app_name +import org.dhis2.mobile.sync.resources.syncing_configuration +import org.jetbrains.compose.resources.getString +import org.koin.core.component.KoinComponent +import org.koin.core.component.inject + +const val METADATA_MESSAGE = "METADATA_MESSAGE" + +class SyncMetadataWorker( + context: Context, + workerParams: WorkerParameters, +) : CoroutineWorker(context, workerParams), + KoinComponent { + private val syncMetadata: SyncMetadata by inject() + private val notificationManager: NotificationManager by inject() + + override suspend fun doWork(): Result { + setForegroundAsync(getForegroundInfo()) + + val notificationTitle = getString(Res.string.app_name) + val notificationText = getString(Res.string.syncing_configuration) + + notificationManager.displayMetadataSyncNotification( + smallIcon = R.drawable.ic_sync, + contentTitle = notificationTitle, + contentText = notificationText, + progress = 0, + ) + + val result = + syncMetadata { progress -> + notificationManager.displayMetadataSyncNotification( + smallIcon = R.drawable.ic_sync, + contentTitle = notificationTitle, + contentText = notificationText, + progress = progress, + ) + } + + notificationManager.cancelMetadataSyncNotification() + return when { + result.isSuccess -> Result.success() + else -> + Result.failure( + createOutputData( + result.exceptionOrNull()?.message ?: "Unknown error", + ), + ) + } + } + + override suspend fun getForegroundInfo(): ForegroundInfo { + val notificationModel = + notificationManager.getMetadataSyncNotification( + smallIcon = R.drawable.ic_sync, + contentTitle = getString(Res.string.app_name), + contentText = getString(Res.string.syncing_configuration), + progress = -1, + ) + val notificationInfo = + notificationModel as? WorkerNotificationInfo + ?: throw IllegalStateException( + "Expected WorkerNotificationInfo but got ${notificationModel::class.qualifiedName}", + ) + return notificationInfo.foregroundInfo + } + + private fun createOutputData(message: String) = + Data + .Builder() + .putString(METADATA_MESSAGE, message) + .build() +} diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.android.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.android.kt index 17b950dbad1..fedff786cb3 100644 --- a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.android.kt +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.android.kt @@ -5,6 +5,7 @@ import org.dhis2.mobile.sync.data.AndroidSyncBackgroundJobAction import org.dhis2.mobile.sync.data.AndroidSyncRepository import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.mobile.sync.data.SyncRepository +import org.dhis2.mobile.sync.domain.SyncMetadata import org.dhis2.mobile.sync.domain.SyncSettings import org.koin.core.module.dsl.factoryOf import org.koin.dsl.module @@ -24,5 +25,7 @@ actual val syncModule = AndroidSyncRepository(get(), get(), get(), get(), get()) } + factoryOf(::SyncMetadata) + factoryOf(::SyncSettings) } diff --git a/sync/src/androidUnitTest/kotlin/org.dhis2.mobile.sync.data/AndroidSyncRepositoryTest.kt b/sync/src/androidUnitTest/kotlin/org.dhis2.mobile.sync.data/AndroidSyncRepositoryTest.kt new file mode 100644 index 00000000000..aef0b06019f --- /dev/null +++ b/sync/src/androidUnitTest/kotlin/org.dhis2.mobile.sync.data/AndroidSyncRepositoryTest.kt @@ -0,0 +1,169 @@ +package org.dhis2.mobile.sync.data + +import io.reactivex.Completable +import io.reactivex.Observable +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.resetMain +import kotlinx.coroutines.test.runTest +import kotlinx.coroutines.test.setMain +import org.dhis2.mobile.commons.coroutine.Dispatcher +import org.dhis2.mobile.commons.error.DomainErrorMapper +import org.dhis2.mobile.commons.providers.PreferenceProvider +import org.dhis2.mobile.commons.reporting.AnalyticActions +import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.arch.call.BaseD2Progress +import org.hisp.dhis.android.core.fileresource.FileResourceDomainType +import org.hisp.dhis.android.core.settings.GeneralSettings +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.mockito.Mockito +import org.mockito.Mockito.mock +import org.mockito.kotlin.any +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.times +import org.mockito.kotlin.verify +import org.mockito.kotlin.verifyNoMoreInteractions +import org.mockito.kotlin.whenever + +class AndroidSyncRepositoryTest { + private val d2: D2 = Mockito.mock(D2::class.java, Mockito.RETURNS_DEEP_STUBS) + private val preferences: PreferenceProvider = mock() + private val analyticsHelper: AnalyticActions = mock() + private val domainErrorMapper: DomainErrorMapper = mock() + + private val testDispatcher = StandardTestDispatcher() + + val repository = + AndroidSyncRepository( + d2 = d2, + preferences = preferences, + analyticsHelper = analyticsHelper, + domainErrorMapper = domainErrorMapper, + dispatcher = + Dispatcher( + testDispatcher, + testDispatcher, + testDispatcher, + ), + ) + + @OptIn(ExperimentalCoroutinesApi::class) + @Before + fun setUp() { + Dispatchers.setMain(testDispatcher) + } + + @OptIn(ExperimentalCoroutinesApi::class) + @After + fun tearDown() { + Dispatchers.resetMain() + } + + @Test + fun `Should configure secondary tracker if configuration exists`() = + runTest { + whenever( + d2.settingModule().generalSetting().blockingGet(), + ) doReturn + GeneralSettings + .builder() + .encryptDB(false) + .matomoID(11111) + .matomoURL("MatomoURL") + .build() + whenever( + d2.mapsModule().mapLayersDownloader().downloadMetadata(), + ) doReturn Completable.complete() + + whenever( + d2 + .fileResourceModule() + .fileResourceDownloader() + .byDomainType() + .eq(FileResourceDomainType.ICON) + .download(), + ) doReturn Observable.just(BaseD2Progress.empty(1)) + + repository.updateProjectAnalytics() + + verify(analyticsHelper, times(1)).updateMatomoSecondaryTracker(any(), any()) + } + + @Test + fun `Should not configure secondary tracker if matomo settings is missing`() = + runTest { + whenever( + d2.settingModule().generalSetting().blockingGet(), + ) doReturn + GeneralSettings + .builder() + .encryptDB(false) + .build() + whenever( + d2.mapsModule().mapLayersDownloader().downloadMetadata(), + ) doReturn Completable.complete() + whenever( + d2 + .fileResourceModule() + .fileResourceDownloader() + .byDomainType() + .eq(FileResourceDomainType.ICON) + .download(), + ) doReturn Observable.just(BaseD2Progress.empty(1)) + + repository.updateProjectAnalytics() + + verifyNoMoreInteractions(analyticsHelper) + } + + @Test + fun `Should not configure secondary tracker if no configuration exists`() = + runTest { + whenever( + d2.settingModule().generalSetting().blockingGet(), + ) doReturn null + whenever( + d2.mapsModule().mapLayersDownloader().downloadMetadata(), + ) doReturn Completable.complete() + whenever( + d2.mapsModule().mapLayersDownloader().downloadMetadata(), + ) doReturn Completable.complete() + whenever( + d2 + .fileResourceModule() + .fileResourceDownloader() + .byDomainType() + .eq(FileResourceDomainType.ICON) + .download(), + ) doReturn Observable.just(BaseD2Progress.empty(1)) + repository.updateProjectAnalytics() + + verify(analyticsHelper, times(0)).updateMatomoSecondaryTracker(any(), any()) + } + + @Test + fun `Should clear secondary tracker`() = + runTest { + whenever( + d2.settingModule().generalSetting().blockingGet(), + ) doReturn null + whenever( + d2.mapsModule().mapLayersDownloader().downloadMetadata(), + ) doReturn Completable.complete() + whenever( + d2 + .fileResourceModule() + .fileResourceDownloader() + .byDomainType() + .eq(FileResourceDomainType.ICON) + .download(), + ) doReturn Observable.just(BaseD2Progress.empty(1)) + repository.updateProjectAnalytics() + + verify(analyticsHelper, times(0)).updateMatomoSecondaryTracker(any(), any()) + verify(analyticsHelper).clearMatomoSecondaryTracker() + } +} diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncData.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncData.kt new file mode 100644 index 00000000000..31a78c2eb08 --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncData.kt @@ -0,0 +1,17 @@ +package org.dhis2.mobile.sync.domain + +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.data.SyncRepository + +class SyncData( + private val repository: SyncRepository, + private val syncBackgroundJobAction: SyncBackgroundJobAction, +) : UseCase<(progress: Int) -> Unit, Unit> { + override suspend fun invoke(input: (progress: Int) -> Unit): Result = + try { + TODO("Not yet implemented") + } catch (e: Exception) { + Result.failure(e) + } +} diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt new file mode 100644 index 00000000000..621243a788d --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt @@ -0,0 +1,89 @@ +package org.dhis2.mobile.sync.domain + +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.data.SyncRepository +import org.dhis2.mobile.sync.model.SyncPeriod + +class SyncMetadata( + private val repository: SyncRepository, + private val syncBackgroundJobAction: SyncBackgroundJobAction, +) : UseCase<(progress: Int) -> Unit, Unit> { + override suspend fun invoke(input: (progress: Int) -> Unit): Result = + try { + val initialMetadataSyncPeriod = repository.currentMetadataSyncPeriod() + val initialDataSyncPeriod = repository.currentDataSyncPeriod() + + val syncMetadataResult = + repository.syncMetadata { progress -> + val totalProgress = 30 * progress / 100 + input(totalProgress) + } + if (syncMetadataResult.isSuccess) { + repository.updateProjectAnalytics() + input(40) + repository.setUpSMS() + input(50) + repository.downloadMapMetadata() + input(60) + repository.downloadFileResources() + input(70) + repository.saveMetadataSyncState(true) + input(80) + + val finalMetadataSyncPeriod = repository.currentMetadataSyncPeriod() + val finalDataSyncPeriod = repository.currentDataSyncPeriod() + + handleMetadataPeriodChange(initialMetadataSyncPeriod, finalMetadataSyncPeriod) + input(90) + handleDataPeriodChange(initialDataSyncPeriod, finalDataSyncPeriod) + input(100) + Result.success(Unit) + } else { + repository.saveMetadataSyncState(false) + Result.failure(syncMetadataResult.exceptionOrNull()!!) + } + } catch (e: Exception) { + Result.failure(e) + } + + private suspend fun handleMetadataPeriodChange( + initialMetadataSyncPeriod: SyncPeriod, + finalMetadataSyncPeriod: SyncPeriod, + ) { + val metadataSyncPeriodChanged = + initialMetadataSyncPeriod != finalMetadataSyncPeriod + val metadataSyncPeriodChangedToManual = + initialMetadataSyncPeriod !is SyncPeriod.Manual && finalMetadataSyncPeriod is SyncPeriod.Manual + + when { + metadataSyncPeriodChangedToManual -> { + syncBackgroundJobAction.cancelMetadataSync() + syncBackgroundJobAction.launchSyncSettings() + } + + metadataSyncPeriodChanged -> { + syncBackgroundJobAction.launchMetadataSync(finalMetadataSyncPeriod.toSeconds()) + } + } + } + + private suspend fun handleDataPeriodChange( + initialDataSyncPeriod: SyncPeriod, + finalDataSyncPeriod: SyncPeriod, + ) { + val dataSyncPeriodChanged = initialDataSyncPeriod != finalDataSyncPeriod + val dataSyncPeriodChangedToManual = + initialDataSyncPeriod !is SyncPeriod.Manual && finalDataSyncPeriod is SyncPeriod.Manual + + when { + dataSyncPeriodChangedToManual -> { + syncBackgroundJobAction.cancelDataSync() + } + + dataSyncPeriodChanged -> { + syncBackgroundJobAction.launchDataSync(finalDataSyncPeriod.toSeconds()) + } + } + } +} diff --git a/sync/src/commonTest/kotlin/org/dhis2/mobile/sync/domain/SyncMetadataTest.kt b/sync/src/commonTest/kotlin/org/dhis2/mobile/sync/domain/SyncMetadataTest.kt new file mode 100644 index 00000000000..fd2c1e0ddc7 --- /dev/null +++ b/sync/src/commonTest/kotlin/org/dhis2/mobile/sync/domain/SyncMetadataTest.kt @@ -0,0 +1,115 @@ +package org.dhis2.mobile.sync.domain + +import kotlinx.coroutines.runBlocking +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.data.SyncRepository +import org.dhis2.mobile.sync.model.SyncPeriod +import org.junit.Test +import org.mockito.kotlin.any +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock +import org.mockito.kotlin.never +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever + +class SyncMetadataTest { + private val repository: SyncRepository = mock() + private val syncBackgroundJobAction: SyncBackgroundJobAction = mock() + + private val syncMetadata = + SyncMetadata( + repository, + syncBackgroundJobAction, + ) + + @Test + fun `Should not trigger background jobs if sync periods do not change`() = + runBlocking { + whenever(repository.currentMetadataSyncPeriod()) doReturn SyncPeriod.Manual + whenever(repository.currentDataSyncPeriod()) doReturn SyncPeriod.Manual + whenever(repository.syncMetadata(any())) doReturn Result.success(Unit) + + syncMetadata.invoke { } + + verify(syncBackgroundJobAction, never()).launchMetadataSync(any()) + verify(syncBackgroundJobAction, never()).cancelMetadataSync() + verify(syncBackgroundJobAction, never()).launchDataSync(any()) + verify(syncBackgroundJobAction, never()).cancelDataSync() + } + + @Test + fun `Should cancel metadata sync if period changes to manual`() = + runBlocking { + whenever(repository.currentMetadataSyncPeriod()).thenReturn( + SyncPeriod.Every24Hour, + SyncPeriod.Manual, + ) + whenever(repository.currentDataSyncPeriod()) doReturn SyncPeriod.Manual + whenever(repository.syncMetadata(any())) doReturn Result.success(Unit) + + syncMetadata.invoke { } + + verify(syncBackgroundJobAction).cancelMetadataSync() + verify(syncBackgroundJobAction).launchSyncSettings() + } + + @Test + fun `Should re-launch metadata sync if period changes`() = + runBlocking { + whenever(repository.currentMetadataSyncPeriod()).thenReturn( + SyncPeriod.Every24Hour, + SyncPeriod.Every7Days, + ) + whenever(repository.currentDataSyncPeriod()) doReturn SyncPeriod.Manual + whenever(repository.syncMetadata(any())) doReturn Result.success(Unit) + + syncMetadata.invoke { } + + verify(syncBackgroundJobAction).launchMetadataSync(SyncPeriod.Every7Days.toSeconds()) + } + + @Test + fun `Should cancel data sync if period changes to manual`() = + runBlocking { + whenever(repository.currentMetadataSyncPeriod()) doReturn SyncPeriod.Manual + whenever(repository.currentDataSyncPeriod()).thenReturn( + SyncPeriod.Every24Hour, + SyncPeriod.Manual, + ) + whenever(repository.syncMetadata(any())) doReturn Result.success(Unit) + + syncMetadata.invoke { } + + verify(syncBackgroundJobAction).cancelDataSync() + } + + @Test + fun `Should re-launch data sync if period changes`() = + runBlocking { + whenever(repository.currentMetadataSyncPeriod()) doReturn SyncPeriod.Manual + whenever(repository.currentDataSyncPeriod()).thenReturn( + SyncPeriod.Every24Hour, + SyncPeriod.Every7Days, + ) + whenever(repository.syncMetadata(any())) doReturn Result.success(Unit) + + syncMetadata.invoke { } + + verify(syncBackgroundJobAction).launchDataSync(SyncPeriod.Every7Days.toSeconds()) + } + + @Test + fun `Should return failure and save state when metadata sync fails`() = + runBlocking { + val exception = Exception("Sync failed") + whenever(repository.currentMetadataSyncPeriod()) doReturn SyncPeriod.Manual + whenever(repository.currentDataSyncPeriod()) doReturn SyncPeriod.Manual + whenever(repository.syncMetadata(any())) doReturn Result.failure(exception) + + val result = syncMetadata.invoke { } + + verify(repository).saveMetadataSyncState(false) + assert(result.isFailure) + assert(result.exceptionOrNull() == exception) + } +} diff --git a/sync/src/commonTest/kotlin/org/dhis2/mobile/sync/domain/SyncSettingsTest.kt b/sync/src/commonTest/kotlin/org/dhis2/mobile/sync/domain/SyncSettingsTest.kt new file mode 100644 index 00000000000..dbeff9413a3 --- /dev/null +++ b/sync/src/commonTest/kotlin/org/dhis2/mobile/sync/domain/SyncSettingsTest.kt @@ -0,0 +1,57 @@ +package org.dhis2.mobile.sync.domain + +import kotlinx.coroutines.runBlocking +import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.data.SyncRepository +import org.dhis2.mobile.sync.model.SyncPeriod +import org.junit.Test +import org.mockito.kotlin.doReturnConsecutively +import org.mockito.kotlin.mock +import org.mockito.kotlin.never +import org.mockito.kotlin.times +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever + +class SyncSettingsTest { + private val syncRepository: SyncRepository = mock() + private val syncBackgroundJobAction: SyncBackgroundJobAction = mock() + + private val syncSettings = SyncSettings(syncRepository, syncBackgroundJobAction) + + @Test + fun `Should not cancel sync settings if period does not change to manual`() = + runBlocking { + whenever(syncRepository.currentMetadataSyncPeriod()) doReturnConsecutively + listOf( + SyncPeriod.Every24Hour, + SyncPeriod.Every12Hour, + ) + + syncSettings.invoke() + + verify( + syncBackgroundJobAction, + never(), + ).launchMetadataSync(SyncPeriod.Every12Hour.toSeconds()) + verify(syncBackgroundJobAction, never()).cancelSyncSettings() + } + + @Test + fun `Should cancel sync settings if period changes from manual`() = + runBlocking { + whenever(syncRepository.currentMetadataSyncPeriod()) doReturnConsecutively + listOf( + SyncPeriod.Manual, + SyncPeriod.Every12Hour, + ) + + syncSettings.invoke() + + verify( + syncBackgroundJobAction, + times(1), + ).launchMetadataSync(SyncPeriod.Every12Hour.toSeconds()) + verify(syncBackgroundJobAction, times(1)).cancelSyncSettings() + } +} From e804222eb9ceba7a404fae1c2959466d7cc8d867 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Garc=C3=ADa?= Date: Tue, 24 Feb 2026 16:12:54 +0100 Subject: [PATCH 065/260] feat: [ANDROAPP-7129] Update to Rule Engine 3.6.0, apply sort order for events (#4658) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update Rule-Engine version 3.6.0 * Apply sort order when fetching events * Remove duplicated optIn label --------- Co-authored-by: Andrés Miguel Rubio --- .../dhis2/mobileProgramRules/RuleConstants.kt | 5 + .../RuleEngineExtensions.kt | 50 +++-- .../mobileProgramRules/RuleEngineHelper.kt | 2 +- .../mobileProgramRules/RulesRepository.kt | 71 ++---- .../RuleEngineExtensionsTest.kt | 6 +- .../RuleEngineHelperTest.kt | 38 +++- .../mobileProgramRules/RulesRepositoryTest.kt | 41 ++-- gradle/libs.versions.toml | 4 +- gradle/verification-metadata.xml | 202 +++++++++++++++++- .../android/rtsm/services/StockManagerImpl.kt | 3 +- .../rules/RuleValidationHelperImpl.kt | 16 +- .../android/rtsm/utils/RuleEngineHelper.kt | 3 +- .../android/rtsm/services/ProgramRuleTests.kt | 59 +++-- 13 files changed, 379 insertions(+), 121 deletions(-) create mode 100644 dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RuleConstants.kt diff --git a/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RuleConstants.kt b/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RuleConstants.kt new file mode 100644 index 00000000000..43e5c34f347 --- /dev/null +++ b/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RuleConstants.kt @@ -0,0 +1,5 @@ +package org.dhis2.mobileProgramRules + +object RuleConstants { + const val LEGENDSET_LABEL = "legendSet" +} diff --git a/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RuleEngineExtensions.kt b/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RuleEngineExtensions.kt index 76d31368433..8b03888f94e 100644 --- a/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RuleEngineExtensions.kt +++ b/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RuleEngineExtensions.kt @@ -1,12 +1,9 @@ package org.dhis2.mobileProgramRules -import kotlinx.datetime.Instant -import kotlinx.datetime.LocalDateTime -import kotlinx.datetime.LocalTime import kotlinx.datetime.TimeZone -import kotlinx.datetime.toDeprecatedInstant -import kotlinx.datetime.toInstant +import kotlinx.datetime.number import kotlinx.datetime.toLocalDateTime +import org.dhis2.mobileProgramRules.RuleConstants.LEGENDSET_LABEL import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.android.core.dataelement.DataElementCollectionRepository @@ -25,6 +22,8 @@ import org.hisp.dhis.rules.models.Rule import org.hisp.dhis.rules.models.RuleAction import org.hisp.dhis.rules.models.RuleAttributeValue import org.hisp.dhis.rules.models.RuleDataValue +import org.hisp.dhis.rules.models.RuleInstant +import org.hisp.dhis.rules.models.RuleLocalDate import org.hisp.dhis.rules.models.RuleValueType import org.hisp.dhis.rules.models.RuleVariable import org.hisp.dhis.rules.models.RuleVariableAttribute @@ -36,22 +35,28 @@ import org.hisp.dhis.rules.models.RuleVariablePreviousEvent import timber.log.Timber import java.util.Date import kotlin.time.ExperimentalTime +import kotlin.time.Instant -fun Date.toRuleEngineInstant() = Instant.fromEpochMilliseconds(this.time) - -fun Date.toRuleEngineLocalDate() = toRuleEngineInstant().toLocalDateTime(TimeZone.currentSystemDefault()).date +@OptIn(ExperimentalTime::class) +private fun Date.toKtInstant() = Instant.fromEpochMilliseconds(this.time) @OptIn(ExperimentalTime::class) -fun Date.toRuleEngineInstantWithNoTime() = - LocalDateTime(toRuleEngineLocalDate(), LocalTime(0, 0, 0, 0)) - .toInstant(TimeZone.currentSystemDefault()) - .toDeprecatedInstant() +private fun Date.toKtLocalDateTime() = toKtInstant().toLocalDateTime(TimeZone.currentSystemDefault()) + +fun Date.toRuleEngineInstant() = RuleInstant(this.time) + +fun Date?.toRuleEngineInstantOrNow() = this?.toRuleEngineInstant() ?: RuleInstant.now() + +fun Date.toRuleEngineLocalDate() = + this.toKtLocalDateTime().let { + RuleLocalDate(it.year, it.month.number, it.day) + } fun List.sortForRuleEngine(): List = sortedWith( compareBy( - { it.eventDate()?.toRuleEngineInstantWithNoTime() }, - { it.created() }, + { it.eventDate()?.toRuleEngineLocalDate() }, + { it.createdAtClient() ?: it.created() }, ).reversed(), ) @@ -133,6 +138,7 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { ).also { map -> contentToDisplay?.let { map["content"] = it } }, + priority = priority(), ) ProgramRuleActionType.DISPLAYTEXT -> @@ -144,7 +150,9 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { Pair("location", location() ?: "indicators"), ).also { map -> contentToDisplay?.let { map["content"] = it } + legendSet()?.let { map[LEGENDSET_LABEL] = it.uid() } }, + priority = priority(), ) ProgramRuleActionType.DISPLAYKEYVALUEPAIR -> @@ -156,7 +164,9 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { Pair("location", location()!!), ).also { map -> contentToDisplay?.let { map["content"] = it } + legendSet()?.let { map[LEGENDSET_LABEL] = it.uid() } }, + priority = priority(), ) ProgramRuleActionType.HIDESECTION -> @@ -168,6 +178,7 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { mutableMapOf( Pair("programStageSection", it.uid()), ), + priority = priority(), ) } ?: RuleAction( "HIDE SECTION RULE IS MISSING PROGRAM STAGE SECTION", @@ -183,6 +194,7 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { mutableMapOf( Pair("programStage", it.uid()), ), + priority = priority(), ) } ?: RuleAction( "HIDE STAGE RULE IS MISSING PROGRAM STAGE", @@ -213,6 +225,7 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { ) } ?: emptyMap() }, + priority = priority(), ) } } @@ -227,6 +240,7 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { ).also { map -> contentToDisplay?.let { map["content"] = it } }, + priority = priority(), ) ProgramRuleActionType.WARNINGONCOMPLETE -> @@ -239,6 +253,7 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { ).also { map -> contentToDisplay?.let { map["content"] = it } }, + priority = priority(), ) ProgramRuleActionType.SHOWERROR -> @@ -251,6 +266,7 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { ).also { map -> contentToDisplay?.let { map["content"] = it } }, + priority = priority(), ) ProgramRuleActionType.ERRORONCOMPLETE -> @@ -263,6 +279,7 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { ).also { map -> contentToDisplay?.let { map["content"] = it } }, + priority = priority(), ) ProgramRuleActionType.CREATEEVENT -> @@ -276,6 +293,7 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { ).also { map -> contentToDisplay?.let { map["content"] = it } }, + priority = priority(), ) } ?: RuleAction( "CREATE EVENT RULE IS MISSING PROGRAM STAGE SECTION", @@ -292,6 +310,7 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { ).also { map -> contentToDisplay?.let { map["content"] = it } }, + priority = priority(), ) ProgramRuleActionType.HIDEOPTION -> @@ -306,6 +325,7 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { ).also { map -> contentToDisplay?.let { map["content"] = it } }, + priority = priority(), ) } ?: RuleAction( "HIDE OPTION RULE IS MISSING OPTION", @@ -324,6 +344,7 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { ).also { map -> contentToDisplay?.let { map["content"] = it } }, + priority = priority(), ) } ?: RuleAction( "SHOW OPTION GROUP RULE IS MISSING OPTION GROUP", @@ -342,6 +363,7 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { ).also { map -> contentToDisplay?.let { map["content"] = it } }, + priority = priority(), ) } ?: RuleAction( "HIDE OPTION GROUP RULE IS MISSING OPTION GROUP", diff --git a/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RuleEngineHelper.kt b/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RuleEngineHelper.kt index f992d0a131d..6777eedd337 100644 --- a/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RuleEngineHelper.kt +++ b/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RuleEngineHelper.kt @@ -84,7 +84,7 @@ class RuleEngineHelper( RuleEngineContext( rules = rules.await(), ruleVariables = ruleVariables.await(), - supplementaryData = supplData.await(), + ruleSupplementaryData = supplData.await(), constantsValues = constants.await(), ), ruleEnrollment = ruleEnrollment.await(), diff --git a/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RulesRepository.kt b/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RulesRepository.kt index 8971a8591a4..ad8d50388a1 100644 --- a/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RulesRepository.kt +++ b/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RulesRepository.kt @@ -1,22 +1,17 @@ package org.dhis2.mobileProgramRules -import android.os.Build import android.text.TextUtils.isEmpty -import kotlinx.datetime.Clock -import kotlinx.datetime.Instant -import kotlinx.datetime.TimeZone -import kotlinx.datetime.toLocalDateTime import org.dhis2.commons.bindings.enrollment import org.dhis2.commons.bindings.event import org.dhis2.commons.bindings.organisationUnit import org.dhis2.commons.bindings.program import org.dhis2.commons.bindings.programStage import org.hisp.dhis.android.core.D2 -import org.hisp.dhis.android.core.arch.repositories.scope.RepositoryScope import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.event.Event import org.hisp.dhis.android.core.event.EventStatus import org.hisp.dhis.android.core.program.ProgramRule +import org.hisp.dhis.rules.api.RuleSupplementaryData import org.hisp.dhis.rules.models.Rule import org.hisp.dhis.rules.models.RuleAttributeValue import org.hisp.dhis.rules.models.RuleDataValue @@ -33,8 +28,8 @@ class RulesRepository( ) { // ORG UNIT GROUPS // USER ROLES - suspend fun supplementaryData(orgUnitUid: String): Map> { - val supData = HashMap>() + suspend fun supplementaryData(orgUnitUid: String): RuleSupplementaryData { + val ouGroupMap = HashMap>() d2 .organisationUnitModule() @@ -44,18 +39,19 @@ class RulesRepository( .blockingGet() .let { orgUnit -> orgUnit?.organisationUnitGroups()?.map { - it.code()?.let { code -> supData[code] = arrayListOf(orgUnit.uid()) } - supData[it.uid()] = arrayListOf(orgUnit.uid()) + it.code()?.let { code -> ouGroupMap[code] = arrayListOf(orgUnit.uid()) } + ouGroupMap[it.uid()] = arrayListOf(orgUnit.uid()) } } val userRoleUids = d2.userModule().userRoles().blockingGetUids() val userGroupUids = d2.userModule().userGroups().blockingGetUids() - supData["USER_ROLES"] = userRoleUids - supData["USER_GROUPS"] = userGroupUids - supData["android_version"] = listOf(Build.VERSION.SDK_INT.toString()) - return supData + return RuleSupplementaryData( + userGroups = userGroupUids, + userRoles = userRoleUids, + orgUnitGroups = ouGroupMap, + ) } suspend fun rules( @@ -133,21 +129,9 @@ class RulesRepository( } else { RuleEventStatus.valueOf(event.status()!!.name) }, - eventDate = event.eventDate()!!.toRuleEngineInstant(), - dueDate = - event.dueDate()?.let { - Instant - .fromEpochMilliseconds(it.time) - .toLocalDateTime(TimeZone.currentSystemDefault()) - .date - }, - completedDate = - event.completedDate()?.let { - Instant - .fromEpochMilliseconds(it.time) - .toLocalDateTime(TimeZone.currentSystemDefault()) - .date - }, + eventDate = event.eventDate()!!.toRuleEngineLocalDate(), + dueDate = event.dueDate()?.toRuleEngineLocalDate(), + completedDate = event.completedDate()?.toRuleEngineLocalDate(), organisationUnit = event.organisationUnit()!!, organisationUnitCode = d2 @@ -157,11 +141,8 @@ class RulesRepository( event.organisationUnit(), ).blockingGet() ?.code(), - createdDate = - event - .created() - ?.let { Instant.fromEpochMilliseconds(it.time) } - ?: Clock.System.now(), + createdDate = event.created().toRuleEngineInstantOrNow(), + createdAtClientDate = event.createdAtClient()?.toRuleEngineInstant(), dataValues = event.trackedEntityDataValues()?.toRuleDataValue() ?: emptyList(), ) @@ -186,8 +167,8 @@ class RulesRepository( .byDeleted() .isFalse .withTrackedEntityDataValues() - .orderByEventDate(RepositoryScope.OrderByDirection.DESC) .blockingGet() + .sortForRuleEngine() } else { d2 .eventModule() @@ -205,8 +186,8 @@ class RulesRepository( .byDeleted() .isFalse .withTrackedEntityDataValues() - .orderByEventDate(RepositoryScope.OrderByDirection.DESC) .blockingGet() + .sortForRuleEngine() .let { list -> val currentEventIndex = list.indexOfFirst { it.uid() == eventToEvaluate.uid() } @@ -269,7 +250,7 @@ class RulesRepository( } else { RuleEventStatus.valueOf(event.status()!!.name) }, - eventDate = event.eventDate()!!.toRuleEngineInstant(), + eventDate = event.eventDate()!!.toRuleEngineLocalDate(), dueDate = event.dueDate()?.toRuleEngineLocalDate(), completedDate = event.completedDate()?.toRuleEngineLocalDate(), organisationUnit = event.organisationUnit()!!, @@ -280,11 +261,8 @@ class RulesRepository( .uid(event.organisationUnit()) .blockingGet() ?.code(), - createdDate = - event - .created() - ?.let { Instant.fromEpochMilliseconds(it.time) } - ?: Clock.System.now(), + createdDate = event.created().toRuleEngineInstantOrNow(), + createdAtClientDate = event.createdAtClient()?.toRuleEngineInstant(), dataValues = event.trackedEntityDataValues()?.toRuleDataValue() ?: emptyList(), ) @@ -415,16 +393,13 @@ class RulesRepository( programStage = event.programStage()!!, programStageName = d2.programStage(event.programStage()!!)?.name()!!, status = RuleEventStatus.valueOf(event.status()!!.name), - eventDate = event.eventDate()!!.toRuleEngineInstant(), + eventDate = event.eventDate()!!.toRuleEngineLocalDate(), dueDate = event.dueDate()?.toRuleEngineLocalDate(), completedDate = event.completedDate()?.toRuleEngineLocalDate(), organisationUnit = event.organisationUnit()!!, organisationUnitCode = d2.organisationUnit(event.organisationUnit()!!)?.code(), - createdDate = - event - .created() - ?.let { Instant.fromEpochMilliseconds(it.time) } - ?: Clock.System.now(), + createdDate = event.created().toRuleEngineInstantOrNow(), + createdAtClientDate = event.createdAtClient()?.toRuleEngineInstant(), dataValues = emptyList(), ) } diff --git a/dhis2-mobile-program-rules/src/test/java/org/dhis2/mobileProgramRules/RuleEngineExtensionsTest.kt b/dhis2-mobile-program-rules/src/test/java/org/dhis2/mobileProgramRules/RuleEngineExtensionsTest.kt index 05ec4abc3d2..b34420f0829 100644 --- a/dhis2-mobile-program-rules/src/test/java/org/dhis2/mobileProgramRules/RuleEngineExtensionsTest.kt +++ b/dhis2-mobile-program-rules/src/test/java/org/dhis2/mobileProgramRules/RuleEngineExtensionsTest.kt @@ -52,14 +52,14 @@ class RuleEngineExtensionsTest { val date1 = DateUtils.DATE_FORMAT.parse("2025-09-25T11:43:32.431") val date2 = DateUtils.DATE_FORMAT.parse("2025-09-25T00:00:00.000") - assertEquals(date1.toRuleEngineInstantWithNoTime(), date2.toRuleEngineInstantWithNoTime()) + assertEquals(date1.toRuleEngineLocalDate(), date2.toRuleEngineLocalDate()) val date3 = DateUtils.DATE_FORMAT.parse("2025-09-25T11:43:32.431") val date4 = DateUtils.DATE_FORMAT.parse("2025-09-26T00:00:00.000") assertNotEquals( - date3.toRuleEngineInstantWithNoTime(), - date4.toRuleEngineInstantWithNoTime(), + date3.toRuleEngineLocalDate(), + date4.toRuleEngineLocalDate(), ) } diff --git a/dhis2-mobile-program-rules/src/test/java/org/dhis2/mobileProgramRules/RuleEngineHelperTest.kt b/dhis2-mobile-program-rules/src/test/java/org/dhis2/mobileProgramRules/RuleEngineHelperTest.kt index 8693a982723..840b8f886bf 100644 --- a/dhis2-mobile-program-rules/src/test/java/org/dhis2/mobileProgramRules/RuleEngineHelperTest.kt +++ b/dhis2-mobile-program-rules/src/test/java/org/dhis2/mobileProgramRules/RuleEngineHelperTest.kt @@ -1,7 +1,9 @@ package org.dhis2.mobileProgramRules import kotlinx.coroutines.test.runTest +import org.dhis2.mobileProgramRules.RuleConstants.LEGENDSET_LABEL import org.hisp.dhis.android.core.program.ProgramRuleActionType +import org.hisp.dhis.rules.api.RuleSupplementaryData import org.hisp.dhis.rules.models.Rule import org.hisp.dhis.rules.models.RuleAction import org.hisp.dhis.rules.models.RuleEnrollment @@ -22,12 +24,13 @@ class RuleEngineHelperTest { data: String, actionType: String, priority: Int?, + values: Map = emptyMap(), ): Rule = Rule( condition = "true", actions = listOf( - RuleAction(data = "'$data'", type = actionType), + RuleAction(data = "'$data'", type = actionType, values = values), ), uid = data, name = "Rule 1", @@ -76,7 +79,7 @@ class RuleEngineHelperTest { whenever(rulesRepository.rules(any(), anyOrNull())) doReturn rules whenever(rulesRepository.ruleVariables(any())) doReturn emptyList() - whenever(rulesRepository.supplementaryData(any())) doReturn emptyMap() + whenever(rulesRepository.supplementaryData(any())) doReturn RuleSupplementaryData() whenever(rulesRepository.constants()) doReturn emptyMap() whenever(rulesRepository.enrollmentEvents(any())) doReturn emptyList() whenever(rulesRepository.getRuleEnrollment(any())) doReturn createEnrollment() @@ -93,4 +96,35 @@ class RuleEngineHelperTest { listOf("Rule1", "Rule4", "Rule2", "Rule3"), ) } + + @Test + fun `Should return values passed to ruleActions`() = + runTest { + val rules = + listOf( + createFeedbackRule( + data = "Rule1", + actionType = ProgramRuleActionType.DISPLAYKEYVALUEPAIR.name, + priority = 1, + values = mapOf(LEGENDSET_LABEL to "test_legend_set"), + ), + ) + + whenever(rulesRepository.rules(any(), anyOrNull())) doReturn rules + whenever(rulesRepository.ruleVariables(any())) doReturn emptyList() + whenever(rulesRepository.supplementaryData(any())) doReturn RuleSupplementaryData() + whenever(rulesRepository.constants()) doReturn emptyMap() + whenever(rulesRepository.enrollmentEvents(any())) doReturn emptyList() + whenever(rulesRepository.getRuleEnrollment(any())) doReturn createEnrollment() + whenever(rulesRepository.queryAttributeValues(any())) doReturn emptyList() + whenever(rulesRepository.enrollmentProgram(any())) doReturn Pair("program", "orgunit") + + val engineHelper = + RuleEngineHelper(EvaluationType.Enrollment("enrollment"), rulesRepository) + + val ruleEffects = engineHelper.evaluate() + + assertEquals(ruleEffects.size, 1) + assertEquals(ruleEffects.first().ruleAction.values, mapOf(LEGENDSET_LABEL to "test_legend_set")) + } } diff --git a/dhis2-mobile-program-rules/src/test/java/org/dhis2/mobileProgramRules/RulesRepositoryTest.kt b/dhis2-mobile-program-rules/src/test/java/org/dhis2/mobileProgramRules/RulesRepositoryTest.kt index 6bb1e5c5f4e..295016ffaf0 100644 --- a/dhis2-mobile-program-rules/src/test/java/org/dhis2/mobileProgramRules/RulesRepositoryTest.kt +++ b/dhis2-mobile-program-rules/src/test/java/org/dhis2/mobileProgramRules/RulesRepositoryTest.kt @@ -38,22 +38,21 @@ class RulesRepositoryTest { runBlocking { repository.supplementaryData("org_unit_test") } - assertTrue(supplData.isNotEmpty()) - assertTrue(supplData.containsKey("USER_ROLES")) - assertTrue(supplData.containsKey("USER_GROUPS")) - assertTrue(supplData.containsKey("org_unit_group_test_code")) - assertTrue(supplData.containsKey("org_unit_group_test")) - assertTrue(supplData["USER_ROLES"]?.contains("UtXToHNI0Cb") ?: false) - assertTrue(supplData["USER_ROLES"]?.contains("oPNOIj7zJ1m") ?: false) - assertTrue(supplData["USER_GROUPS"]?.contains("gVC8vCfNAx8") ?: false) - assertTrue(supplData["USER_GROUPS"]?.contains("Kk12LkEWtXp") ?: false) + assertTrue(supplData.userRoles.isNotEmpty()) + assertTrue(supplData.userGroups.isNotEmpty()) + assertTrue(supplData.orgUnitGroups.containsKey("org_unit_group_test_code")) + assertTrue(supplData.orgUnitGroups.containsKey("org_unit_group_test")) + assertTrue(supplData.userRoles.contains("UtXToHNI0Cb")) + assertTrue(supplData.userRoles.contains("oPNOIj7zJ1m")) + assertTrue(supplData.userGroups.contains("gVC8vCfNAx8")) + assertTrue(supplData.userGroups.contains("Kk12LkEWtXp")) assertTrue( - supplData + supplData.orgUnitGroups .getOrElse("org_unit_group_test") { arrayListOf() } .contains("org_unit_test"), ) assertTrue( - supplData + supplData.orgUnitGroups .getOrElse("org_unit_group_test_code") { arrayListOf() } .contains("org_unit_test"), ) @@ -77,19 +76,21 @@ class RulesRepositoryTest { repository.supplementaryData("org_unit_test") } - assertTrue(supplData.isNotEmpty()) - - assertTrue(supplData.containsKey("USER_ROLES")) - assertTrue(!supplData.containsKey("org_unit_group_test_code")) - assertTrue(supplData.containsKey("org_unit_group_test")) - assertTrue(supplData["USER_ROLES"]?.contains("UtXToHNI0Cb") ?: false) - assertTrue(supplData["USER_ROLES"]?.contains("oPNOIj7zJ1m") ?: false) + assertTrue(supplData.userRoles.isNotEmpty()) + assertTrue(!supplData.orgUnitGroups.containsKey("org_unit_group_test_code")) + assertTrue(supplData.orgUnitGroups.containsKey("org_unit_group_test")) + assertTrue(supplData.userRoles.contains("UtXToHNI0Cb")) + assertTrue(supplData.userRoles.contains("oPNOIj7zJ1m")) assertTrue( - supplData + supplData.orgUnitGroups .getOrElse("org_unit_group_test") { arrayListOf() } .contains("org_unit_test"), ) - assertTrue(supplData.getOrElse("org_unit_group_test_code") { arrayListOf() }.isEmpty()) + assertTrue( + supplData.orgUnitGroups + .getOrElse("org_unit_group_test_code") { arrayListOf() } + .isEmpty(), + ) } private fun getTestUserRoles(): List = arrayListOf("UtXToHNI0Cb", "oPNOIj7zJ1m") diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f787f8925e8..3d29f26df63 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -12,8 +12,8 @@ dagger = '2.57.2' jacoco = '0.8.14' designSystem = "0.7.0-SNAPSHOT" dhis2sdk = "1.14.0-20260219.101444-21" -ruleEngine = "3.3.11" -expressionParser = "1.2.2" +ruleEngine = "3.6.0" +expressionParser = "1.3.1" appcompat = "1.7.1" annotation = "1.9.1" cardview = "1.0.0" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index e3730651265..91c1498ba12 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -7088,6 +7088,9 @@ + + + @@ -7096,6 +7099,9 @@ + + + @@ -7475,6 +7481,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -7698,6 +7776,9 @@ + + + @@ -7751,6 +7832,9 @@ + + + @@ -7783,6 +7867,9 @@ + + + @@ -10350,6 +10437,9 @@ + + + @@ -10358,6 +10448,9 @@ + + + @@ -10366,6 +10459,9 @@ + + + @@ -10623,14 +10719,6 @@ - - - - - - - - @@ -10718,6 +10806,14 @@ + + + + + + + + @@ -10797,6 +10893,22 @@ + + + + + + + + + + + + + + + + @@ -12506,6 +12618,9 @@ + + + @@ -12538,6 +12653,9 @@ + + + @@ -12550,6 +12668,11 @@ + + + + + @@ -12594,6 +12717,16 @@ + + + + + + + + + + @@ -12645,6 +12778,14 @@ + + + + + + + + @@ -12653,6 +12794,11 @@ + + + + + @@ -12731,6 +12877,9 @@ + + + @@ -12998,6 +13147,22 @@ + + + + + + + + + + + + + + + + @@ -13115,9 +13280,15 @@ + + + + + + @@ -13399,6 +13570,9 @@ + + + @@ -13886,6 +14060,9 @@ + + + @@ -13910,6 +14087,9 @@ + + + @@ -13950,6 +14130,9 @@ + + + @@ -13974,6 +14157,9 @@ + + + diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/services/StockManagerImpl.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/services/StockManagerImpl.kt index 3b15f359383..2333f7ec820 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/services/StockManagerImpl.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/services/StockManagerImpl.kt @@ -18,6 +18,7 @@ import org.dhis2.android.rtsm.utils.AttributeHelper import org.dhis2.android.rtsm.utils.ConfigUtils.getTransactionDataElement import org.dhis2.commons.bindings.distributedTo import org.dhis2.commons.bindings.stockUseCase +import org.dhis2.mobileProgramRules.sortForRuleEngine import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.arch.repositories.scope.RepositoryScope import org.hisp.dhis.android.core.enrollment.Enrollment @@ -143,8 +144,8 @@ class StockManagerImpl( .byDeleted() .isFalse .withTrackedEntityDataValues() - .orderByEventDate(RepositoryScope.OrderByDirection.DESC) .blockingGet() + .sortForRuleEngine() events .filter { diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/services/rules/RuleValidationHelperImpl.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/services/rules/RuleValidationHelperImpl.kt index 5d2d9e75df6..ea3b5721372 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/services/rules/RuleValidationHelperImpl.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/services/rules/RuleValidationHelperImpl.kt @@ -2,8 +2,6 @@ package org.dhis2.android.rtsm.services.rules import io.reactivex.Flowable import io.reactivex.Single -import kotlinx.datetime.Clock -import kotlinx.datetime.Instant import org.apache.commons.lang3.math.NumberUtils import org.dhis2.android.rtsm.data.TransactionType import org.dhis2.android.rtsm.data.models.StockEntry @@ -15,6 +13,7 @@ import org.dhis2.commons.bindings.distributedTo import org.dhis2.commons.rules.RuleEngineContextData import org.dhis2.mobileProgramRules.toRuleDataValue import org.dhis2.mobileProgramRules.toRuleEngineInstant +import org.dhis2.mobileProgramRules.toRuleEngineInstantOrNow import org.dhis2.mobileProgramRules.toRuleEngineLocalDate import org.dhis2.mobileProgramRules.toRuleList import org.dhis2.mobileProgramRules.toRuleVariableList @@ -27,6 +26,7 @@ import org.hisp.dhis.android.core.program.ProgramRuleActionType import org.hisp.dhis.android.core.program.ProgramStage import org.hisp.dhis.android.core.usecase.stock.StockUseCase import org.hisp.dhis.rules.api.RuleEngine +import org.hisp.dhis.rules.api.RuleSupplementaryData import org.hisp.dhis.rules.models.RuleDataValue import org.hisp.dhis.rules.models.RuleEffect import org.hisp.dhis.rules.models.RuleEvent @@ -131,6 +131,7 @@ class RuleValidationHelperImpl( programStage.uid(), programStage.name()!!, RuleEventStatus.ACTIVE, + period.toRuleEngineLocalDate(), period.toRuleEngineInstant(), period.toRuleEngineInstant(), period.toRuleEngineLocalDate(), @@ -178,7 +179,7 @@ class RuleValidationHelperImpl( constantsMap } - private fun supplementaryData(): Single>> = Single.just(hashMapOf()) + private fun supplementaryData(): Single = Single.just(RuleSupplementaryData()) private fun ruleEngineData( teiUid: String, @@ -272,12 +273,9 @@ class RuleValidationHelperImpl( } else { RuleEventStatus.valueOf(event.status()!!.name) }, - eventDate = (event.eventDate() ?: Date()).toRuleEngineInstant(), - createdDate = - event - .created() - ?.let { Instant.fromEpochMilliseconds(it.time) } - ?: Clock.System.now(), + eventDate = (event.eventDate() ?: Date()).toRuleEngineLocalDate(), + createdDate = event.created().toRuleEngineInstantOrNow(), + createdAtClientDate = event.createdAtClient()?.toRuleEngineInstant(), dueDate = event.dueDate()?.toRuleEngineLocalDate(), completedDate = event.completedDate()?.toRuleEngineLocalDate(), organisationUnit = event.organisationUnit()!!, diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/utils/RuleEngineHelper.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/utils/RuleEngineHelper.kt index 1cacfde8e01..81de23ba072 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/utils/RuleEngineHelper.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/utils/RuleEngineHelper.kt @@ -2,6 +2,7 @@ package org.dhis2.android.rtsm.utils import org.dhis2.commons.rules.RuleEngineContextData import org.hisp.dhis.rules.api.RuleEngineContext +import org.hisp.dhis.rules.api.RuleSupplementaryData import org.hisp.dhis.rules.models.Rule import org.hisp.dhis.rules.models.RuleEvent import org.hisp.dhis.rules.models.RuleVariable @@ -13,7 +14,7 @@ class RuleEngineHelper { rules: List, ruleVariables: List, constants: Map, - supplementaryData: Map>, + supplementaryData: RuleSupplementaryData, events: List, ): RuleEngineContextData { debugRuleEngine(rules, ruleVariables, events) diff --git a/stock-usecase/src/test/java/org/dhis2/android/rtsm/services/ProgramRuleTests.kt b/stock-usecase/src/test/java/org/dhis2/android/rtsm/services/ProgramRuleTests.kt index 62d3c2b0da1..16f62c8f4b8 100644 --- a/stock-usecase/src/test/java/org/dhis2/android/rtsm/services/ProgramRuleTests.kt +++ b/stock-usecase/src/test/java/org/dhis2/android/rtsm/services/ProgramRuleTests.kt @@ -2,12 +2,12 @@ package org.dhis2.android.rtsm.services import com.google.common.collect.Lists import org.dhis2.mobileProgramRules.toRuleEngineInstant -import org.dhis2.mobileProgramRules.toRuleEngineInstantWithNoTime import org.dhis2.mobileProgramRules.toRuleEngineLocalDate import org.hisp.dhis.android.core.arch.helpers.DateUtils import org.hisp.dhis.android.core.program.ProgramRuleActionType import org.hisp.dhis.rules.api.RuleEngine import org.hisp.dhis.rules.api.RuleEngineContext +import org.hisp.dhis.rules.api.RuleSupplementaryData import org.hisp.dhis.rules.models.Rule import org.hisp.dhis.rules.models.RuleAction import org.hisp.dhis.rules.models.RuleDataValue @@ -80,7 +80,7 @@ class ProgramRuleTests { return RuleEngineContext( rules, rulesVariables, - emptyMap(), + RuleSupplementaryData(), emptyMap(), ) } @@ -133,7 +133,8 @@ class ProgramRuleTests { "test_program_stage", "", RuleEventStatus.ACTIVE, - Date().toRuleEngineInstantWithNoTime(), + Date().toRuleEngineLocalDate(), + Date().toRuleEngineInstant(), Date().toRuleEngineInstant(), Date().toRuleEngineLocalDate(), null, @@ -185,8 +186,9 @@ class ProgramRuleTests { val ruleEventAndroid = getRuleEvent( uid = "event_android", - eventDate = "2025-09-25T13:04:13.783", + eventDate = "2025-09-25T11:04:13.783", created = "2025-09-25T13:04:13.783", + createdAtClient = "2025-09-25T11:04:13.783", dataValues = listOf( RuleDataValue( @@ -195,11 +197,26 @@ class ProgramRuleTests { ), ), ) + val ruleEventAndroidSameCreated = + getRuleEvent( + uid = "event_android", + eventDate = "2025-09-25T12:02:13.783", + created = "2025-09-25T13:04:13.783", + createdAtClient = "2025-09-25T12:02:13.783", + dataValues = + listOf( + RuleDataValue( + dataElement1, + "5", + ), + ), + ) val ruleEventWeb = getRuleEvent( uid = "event_web", eventDate = "2025-09-25T00:00:00.000", created = "2025-09-25T15:06:41.483", + createdAtClient = null, dataValues = listOf( RuleDataValue( @@ -213,6 +230,7 @@ class ProgramRuleTests { uid = "event_new", eventDate = "2025-09-25T18:06:41.483", created = "2025-09-25T18:06:41.483", + createdAtClient = "2025-09-25T18:06:41.483", dataValues = listOf(), ) @@ -247,24 +265,40 @@ class ProgramRuleTests { ), ) - val ruleEffects = - RuleEngine.getInstance().evaluate( + // Evaluate the Android and Web events + RuleEngine + .getInstance() + .evaluate( ruleEventNew, getEmptyRuleEnrollment(), listOf(ruleEventAndroid, ruleEventWeb), ruleEngineContext, - ) + ).let { ruleEffects -> + // The rule effect must assign the value coming from event_web because its created date + // is most recent compared to event_android. + assertEquals(ruleEffects.size, 1) + assertEquals(ruleEffects.first().data, "10") + } - // The rule effect must assigned the value coming from event_web because its created date - // is most recent compared to event_android. - assertEquals(ruleEffects.size, 1) - assertEquals(ruleEffects.first().data, "10") + // Evaluate Android events with the same creation date + RuleEngine + .getInstance() + .evaluate( + ruleEventNew, + getEmptyRuleEnrollment(), + listOf(ruleEventAndroid, ruleEventAndroidSameCreated), + ruleEngineContext, + ).let { ruleEffects -> + assertEquals(ruleEffects.size, 1) + assertEquals(ruleEffects.first().data, "5") + } } private fun getRuleEvent( uid: String, eventDate: String, created: String, + createdAtClient: String?, dataValues: List, ): RuleEvent = RuleEvent( @@ -272,8 +306,9 @@ class ProgramRuleTests { "test_program_stage", "", RuleEventStatus.ACTIVE, - DateUtils.DATE_FORMAT.parse(eventDate).toRuleEngineInstantWithNoTime(), + DateUtils.DATE_FORMAT.parse(eventDate).toRuleEngineLocalDate(), DateUtils.DATE_FORMAT.parse(created).toRuleEngineInstant(), + createdAtClient?.let { DateUtils.DATE_FORMAT.parse(it).toRuleEngineInstant() }, null, null, "", From 5d3e48ea1662bcb63634f64227ffc947cd54574b Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Wed, 25 Feb 2026 08:41:42 +0100 Subject: [PATCH 066/260] fix(translations): sync translations from transifex (develop) (#4666) * fix(translations): sync translations from transifex (develop) * fix(translations): sync translations from transifex (develop) --- commons/src/main/res/values-lo/strings.xml | 3 ++- commons/src/main/res/values-zh/strings.xml | 4 ++++ .../src/commonMain/composeResources/values-lo/strings.xml | 3 ++- form/src/main/res/values-lo/strings.xml | 1 + sync/src/commonMain/composeResources/values-ar/strings.xml | 3 ++- sync/src/commonMain/composeResources/values-ckb/strings.xml | 3 ++- sync/src/commonMain/composeResources/values-cs/strings.xml | 3 ++- .../src/commonMain/composeResources/values-es-rES/strings.xml | 3 ++- sync/src/commonMain/composeResources/values-es/strings.xml | 3 ++- sync/src/commonMain/composeResources/values-fr/strings.xml | 3 ++- sync/src/commonMain/composeResources/values-id/strings.xml | 3 ++- sync/src/commonMain/composeResources/values-km/strings.xml | 3 ++- sync/src/commonMain/composeResources/values-lo/strings.xml | 3 ++- sync/src/commonMain/composeResources/values-nb/strings.xml | 3 ++- sync/src/commonMain/composeResources/values-nl/strings.xml | 3 ++- sync/src/commonMain/composeResources/values-pt/strings.xml | 3 ++- sync/src/commonMain/composeResources/values-ru/strings.xml | 3 ++- sync/src/commonMain/composeResources/values-sv/strings.xml | 3 ++- sync/src/commonMain/composeResources/values-uk/strings.xml | 3 ++- .../src/commonMain/composeResources/values-uz-rUZ/strings.xml | 3 ++- sync/src/commonMain/composeResources/values-uz/strings.xml | 3 ++- sync/src/commonMain/composeResources/values-vi/strings.xml | 3 ++- .../src/commonMain/composeResources/values-zh-rCN/strings.xml | 3 ++- sync/src/commonMain/composeResources/values-zh/strings.xml | 3 +++ 24 files changed, 50 insertions(+), 21 deletions(-) diff --git a/commons/src/main/res/values-lo/strings.xml b/commons/src/main/res/values-lo/strings.xml index 1c3812c27c4..b56aa1d51e7 100644 --- a/commons/src/main/res/values-lo/strings.xml +++ b/commons/src/main/res/values-lo/strings.xml @@ -227,4 +227,5 @@ ອາທິດ ເດືອນ ປີ - + ລຶບທັງໝົດ + diff --git a/commons/src/main/res/values-zh/strings.xml b/commons/src/main/res/values-zh/strings.xml index 51340ad9ab1..031f5dbb1d7 100644 --- a/commons/src/main/res/values-zh/strings.xml +++ b/commons/src/main/res/values-zh/strings.xml @@ -50,6 +50,7 @@ 两周 开始于周三的周报 开始于周四的周报 + 每周从周五开始 开始于周六的周报 开始于周日的周报 每月 @@ -61,8 +62,11 @@ 从 7 月开始,每 6 个月一次 开始于11月的半年 每年 + 从 2 月开始的财务年度 开始于四月的财政年 开始于六月的财政年 + 从 8 月开始的财政年度 + 9 月开始的财政年度 开始于十月的财政年 开始于11月的财政年 diff --git a/commonskmm/src/commonMain/composeResources/values-lo/strings.xml b/commonskmm/src/commonMain/composeResources/values-lo/strings.xml index e9d1e1ed7b1..8bacfa370ce 100644 --- a/commonskmm/src/commonMain/composeResources/values-lo/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-lo/strings.xml @@ -56,7 +56,7 @@ ບໍ່​ແມ່ນ​ຕອນ​ນີ້ ບັນທຶກ ສຶບຕໍ່ແກ້ໄຂ - ທ່ານຕ້ອງການໝາຍແບບຟອມນີ້ວ່າສຳເລັດແລ້ວຫຼືບໍ? + ທ່ານຕ້ອງການໝາຍແບບຟອມນີ້ວ່າສຳເລັດແລ້ວຫຼືບໍ\? ຖ້າທ່ານອອກດຽວນີ້ ຂໍ້ມູນທັງໝົດໃນແບບຟອມຈະຖືກຍົກເລີກ. ເຜີຍແຜ່ ປິດ @@ -86,6 +86,7 @@ %s ລາຍລະອຽດ ຫົວໜ່ວຍການຈັດຕັ້ງ ປະສານງານ + ໝວດໝູ່ແບບປະສົມ (Category Combo) ລາຍການທີ່ໃຫ້ເລືອກ ແມ່ນ ບໍ່ແມ່ນ diff --git a/form/src/main/res/values-lo/strings.xml b/form/src/main/res/values-lo/strings.xml index bfef36c2592..558a0193e17 100644 --- a/form/src/main/res/values-lo/strings.xml +++ b/form/src/main/res/values-lo/strings.xml @@ -66,5 +66,6 @@ %s ລາຍລະອຽດ ສະຖານທີ່ Coordinates + ໝວດໝູ່ແບບປະສົມ (Category Combo) ລາຍການທີ່ໃຫ້ເລືອກ \ No newline at end of file diff --git a/sync/src/commonMain/composeResources/values-ar/strings.xml b/sync/src/commonMain/composeResources/values-ar/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-ar/strings.xml +++ b/sync/src/commonMain/composeResources/values-ar/strings.xml @@ -1,5 +1,6 @@ - + Dhis2 + diff --git a/sync/src/commonMain/composeResources/values-ckb/strings.xml b/sync/src/commonMain/composeResources/values-ckb/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-ckb/strings.xml +++ b/sync/src/commonMain/composeResources/values-ckb/strings.xml @@ -1,5 +1,6 @@ - + Dhis2 + diff --git a/sync/src/commonMain/composeResources/values-cs/strings.xml b/sync/src/commonMain/composeResources/values-cs/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-cs/strings.xml +++ b/sync/src/commonMain/composeResources/values-cs/strings.xml @@ -1,5 +1,6 @@ - + Dhis2 + diff --git a/sync/src/commonMain/composeResources/values-es-rES/strings.xml b/sync/src/commonMain/composeResources/values-es-rES/strings.xml index 4c1c46011bd..fbe849a24c8 100644 --- a/sync/src/commonMain/composeResources/values-es-rES/strings.xml +++ b/sync/src/commonMain/composeResources/values-es-rES/strings.xml @@ -1,5 +1,6 @@ - + DHIS 2 + diff --git a/sync/src/commonMain/composeResources/values-es/strings.xml b/sync/src/commonMain/composeResources/values-es/strings.xml index 4c1c46011bd..fbe849a24c8 100644 --- a/sync/src/commonMain/composeResources/values-es/strings.xml +++ b/sync/src/commonMain/composeResources/values-es/strings.xml @@ -1,5 +1,6 @@ - + DHIS 2 + diff --git a/sync/src/commonMain/composeResources/values-fr/strings.xml b/sync/src/commonMain/composeResources/values-fr/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-fr/strings.xml +++ b/sync/src/commonMain/composeResources/values-fr/strings.xml @@ -1,5 +1,6 @@ - + Dhis2 + diff --git a/sync/src/commonMain/composeResources/values-id/strings.xml b/sync/src/commonMain/composeResources/values-id/strings.xml index 4c1c46011bd..91e4338bcb7 100644 --- a/sync/src/commonMain/composeResources/values-id/strings.xml +++ b/sync/src/commonMain/composeResources/values-id/strings.xml @@ -1,5 +1,6 @@ - + DHIS2 + diff --git a/sync/src/commonMain/composeResources/values-km/strings.xml b/sync/src/commonMain/composeResources/values-km/strings.xml index 4c1c46011bd..f568a46e86f 100644 --- a/sync/src/commonMain/composeResources/values-km/strings.xml +++ b/sync/src/commonMain/composeResources/values-km/strings.xml @@ -1,5 +1,6 @@ - + ឌីអេចអាយអេសធូ (DHIS 2) + diff --git a/sync/src/commonMain/composeResources/values-lo/strings.xml b/sync/src/commonMain/composeResources/values-lo/strings.xml index 4c1c46011bd..5276a519bfc 100644 --- a/sync/src/commonMain/composeResources/values-lo/strings.xml +++ b/sync/src/commonMain/composeResources/values-lo/strings.xml @@ -1,5 +1,6 @@ - + ລະບົບ DHIS2 + diff --git a/sync/src/commonMain/composeResources/values-nb/strings.xml b/sync/src/commonMain/composeResources/values-nb/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-nb/strings.xml +++ b/sync/src/commonMain/composeResources/values-nb/strings.xml @@ -1,5 +1,6 @@ - + Dhis2 + diff --git a/sync/src/commonMain/composeResources/values-nl/strings.xml b/sync/src/commonMain/composeResources/values-nl/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-nl/strings.xml +++ b/sync/src/commonMain/composeResources/values-nl/strings.xml @@ -1,5 +1,6 @@ - + Dhis2 + diff --git a/sync/src/commonMain/composeResources/values-pt/strings.xml b/sync/src/commonMain/composeResources/values-pt/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-pt/strings.xml +++ b/sync/src/commonMain/composeResources/values-pt/strings.xml @@ -1,5 +1,6 @@ - + Dhis2 + diff --git a/sync/src/commonMain/composeResources/values-ru/strings.xml b/sync/src/commonMain/composeResources/values-ru/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-ru/strings.xml +++ b/sync/src/commonMain/composeResources/values-ru/strings.xml @@ -1,5 +1,6 @@ - + Dhis2 + diff --git a/sync/src/commonMain/composeResources/values-sv/strings.xml b/sync/src/commonMain/composeResources/values-sv/strings.xml index 4c1c46011bd..91e4338bcb7 100644 --- a/sync/src/commonMain/composeResources/values-sv/strings.xml +++ b/sync/src/commonMain/composeResources/values-sv/strings.xml @@ -1,5 +1,6 @@ - + DHIS2 + diff --git a/sync/src/commonMain/composeResources/values-uk/strings.xml b/sync/src/commonMain/composeResources/values-uk/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-uk/strings.xml +++ b/sync/src/commonMain/composeResources/values-uk/strings.xml @@ -1,5 +1,6 @@ - + Dhis2 + diff --git a/sync/src/commonMain/composeResources/values-uz-rUZ/strings.xml b/sync/src/commonMain/composeResources/values-uz-rUZ/strings.xml index 4c1c46011bd..91e4338bcb7 100644 --- a/sync/src/commonMain/composeResources/values-uz-rUZ/strings.xml +++ b/sync/src/commonMain/composeResources/values-uz-rUZ/strings.xml @@ -1,5 +1,6 @@ - + DHIS2 + diff --git a/sync/src/commonMain/composeResources/values-uz/strings.xml b/sync/src/commonMain/composeResources/values-uz/strings.xml index 4c1c46011bd..91e4338bcb7 100644 --- a/sync/src/commonMain/composeResources/values-uz/strings.xml +++ b/sync/src/commonMain/composeResources/values-uz/strings.xml @@ -1,5 +1,6 @@ - + DHIS2 + diff --git a/sync/src/commonMain/composeResources/values-vi/strings.xml b/sync/src/commonMain/composeResources/values-vi/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-vi/strings.xml +++ b/sync/src/commonMain/composeResources/values-vi/strings.xml @@ -1,5 +1,6 @@ - + Dhis2 + diff --git a/sync/src/commonMain/composeResources/values-zh-rCN/strings.xml b/sync/src/commonMain/composeResources/values-zh-rCN/strings.xml index 4c1c46011bd..91e4338bcb7 100644 --- a/sync/src/commonMain/composeResources/values-zh-rCN/strings.xml +++ b/sync/src/commonMain/composeResources/values-zh-rCN/strings.xml @@ -1,5 +1,6 @@ - + DHIS2 + diff --git a/sync/src/commonMain/composeResources/values-zh/strings.xml b/sync/src/commonMain/composeResources/values-zh/strings.xml index 4c1c46011bd..d9ec0be1115 100644 --- a/sync/src/commonMain/composeResources/values-zh/strings.xml +++ b/sync/src/commonMain/composeResources/values-zh/strings.xml @@ -1,5 +1,8 @@ + DHIS2 + 检查网络设置 + 同步配置 From d3592d3db30c595390d9f75eb95ef0735d6dd60e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Feb 2026 11:02:10 +0100 Subject: [PATCH 067/260] deps: bump the gradle-updates group across 1 directory with 4 updates (#4660) Bumps the gradle-updates group with 4 updates in the / directory: androidx.paging:paging-compose, [org.jetbrains.androidx.navigation:navigation-compose](https://github.com/JetBrains/compose-multiplatform), androidx.paging:paging-testing and [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit-framework). Updates `androidx.paging:paging-compose` from 3.4.0 to 3.4.1 Updates `org.jetbrains.androidx.navigation:navigation-compose` from 2.9.1 to 2.9.2 - [Release notes](https://github.com/JetBrains/compose-multiplatform/releases) - [Changelog](https://github.com/JetBrains/compose-multiplatform/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/compose-multiplatform/commits) Updates `androidx.paging:paging-testing` from 3.4.0 to 3.4.1 Updates `org.junit.jupiter:junit-jupiter` from 6.0.2 to 6.0.3 - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r6.0.2...r6.0.3) --- updated-dependencies: - dependency-name: androidx.paging:paging-compose dependency-version: 3.4.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: org.jetbrains.androidx.navigation:navigation-compose dependency-version: 2.9.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.paging:paging-testing dependency-version: 3.4.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: org.junit.jupiter:junit-jupiter dependency-version: 6.0.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3d29f26df63..dcf4cf283ef 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] kotlinxDatetime = "0.7.1-0.6.x-compat" #Needs to be compatible with the Rule engine, update when it's updated lifecycleRuntimeCompose = "2.9.6" -navigationCompose = "2.9.1" +navigationCompose = "2.9.2" sdk = "36" minSdk = "23" vCode = "151" @@ -28,8 +28,8 @@ fragmentktx = "1.8.9" recyclerview = "1.4.0" compose = "1.9.5" composePluginVersion = "1.9.3" -composePaging = "3.4.0" -pagingTesting = "3.4.0" +composePaging = "3.4.1" +pagingTesting = "3.4.1" composeConstraintLayout = "1.1.1" activityCompose = "1.11.0" viewModelCompose = "2.9.4" @@ -84,7 +84,7 @@ material3WindowSize = "1.4.0" material3WindowSizeCompose = "1.8.2" material3AdaptiveAndroid = "1.1.0" koin = "4.1.1" -junitJupiter = "6.0.2" +junitJupiter = "6.0.3" ktxml = "1.0.0" atomicfu = "0.29.0" playservicesauth = "21.4.0" From 39cddbcf9dc63d0f34df93599b80869747ee0b1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Tar=C3=AD?= Date: Thu, 26 Feb 2026 07:21:09 +0100 Subject: [PATCH 068/260] fix: [ANDROAPP-7081] program stage sections order is not applied correctly (#4680) * chore: [ANDROAPP-7081] sort enrollment and event sections by sort order * chore: [ANDROAPP-7081] fix test --- .../eventInitial/EventInitialRepositoryImpl.kt | 2 ++ .../programEventDetail/ProgramEventMapper.kt | 1 + .../main/java/org/dhis2/form/data/EventRepository.kt | 2 ++ .../form/data/metadata/EnrollmentConfiguration.kt | 1 + .../java/org/dhis2/form/data/EventRepositoryTest.kt | 11 +++++++++++ 5 files changed, 17 insertions(+) diff --git a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialRepositoryImpl.kt b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialRepositoryImpl.kt index 1672ed3d2a0..180a1523caf 100644 --- a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialRepositoryImpl.kt +++ b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialRepositoryImpl.kt @@ -315,6 +315,7 @@ class EventInitialRepositoryImpl internal constructor( .programStageSections() .byProgramStageUid() .eq(stage!!.uid()) + .orderBySortOrder(RepositoryScope.OrderByDirection.ASC) .blockingGet() stageSections @@ -369,6 +370,7 @@ class EventInitialRepositoryImpl internal constructor( .withDataElements() .byProgramStageUid() .eq(event.programStage()) + .orderBySortOrder(RepositoryScope.OrderByDirection.ASC) .blockingGet() val stageDataElements = d2 diff --git a/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventMapper.kt b/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventMapper.kt index 896f7665d49..0538363ac81 100644 --- a/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventMapper.kt +++ b/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventMapper.kt @@ -275,6 +275,7 @@ class ProgramEventMapper( .byProgramStageUid() .eq(programStage) .withDataElements() + .orderBySortOrder(RepositoryScope.OrderByDirection.ASC) .blockingGet() private fun getCategoryOptionCombo(attributeOptionCombo: String?) = diff --git a/form/src/main/java/org/dhis2/form/data/EventRepository.kt b/form/src/main/java/org/dhis2/form/data/EventRepository.kt index 3b61ebeab03..359cd4d3d12 100644 --- a/form/src/main/java/org/dhis2/form/data/EventRepository.kt +++ b/form/src/main/java/org/dhis2/form/data/EventRepository.kt @@ -150,6 +150,7 @@ class EventRepository( .byProgramStageUid() .eq(event?.programStage()) .withDataElements() + .orderBySortOrder(RepositoryScope.OrderByDirection.ASC) .blockingGet() .associateBy { section -> section.uid() } } @@ -174,6 +175,7 @@ class EventRepository( .byProgramStageUid() .eq(programStage?.uid()) .withDataElements() + .orderBySortOrder(RepositoryScope.OrderByDirection.ASC) .get() .flatMap { programStageSection -> if (programStageSection.isEmpty()) { diff --git a/form/src/main/java/org/dhis2/form/data/metadata/EnrollmentConfiguration.kt b/form/src/main/java/org/dhis2/form/data/metadata/EnrollmentConfiguration.kt index 6143bd41d88..5d9b754a887 100644 --- a/form/src/main/java/org/dhis2/form/data/metadata/EnrollmentConfiguration.kt +++ b/form/src/main/java/org/dhis2/form/data/metadata/EnrollmentConfiguration.kt @@ -46,6 +46,7 @@ class EnrollmentConfiguration( .withAttributes() .byProgramUid() .eq(enrollment()?.program()) + .orderBySortOrder(RepositoryScope.OrderByDirection.ASC) .blockingGet() fun orgUnit(orgUnitUid: String) = diff --git a/form/src/test/java/org/dhis2/form/data/EventRepositoryTest.kt b/form/src/test/java/org/dhis2/form/data/EventRepositoryTest.kt index f5fb706e9be..8b51b6ef16a 100644 --- a/form/src/test/java/org/dhis2/form/data/EventRepositoryTest.kt +++ b/form/src/test/java/org/dhis2/form/data/EventRepositoryTest.kt @@ -10,6 +10,7 @@ import org.dhis2.form.model.EventMode import org.dhis2.form.ui.FieldViewModelFactory import org.dhis2.mobile.commons.customintents.CustomIntentRepository import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.arch.repositories.scope.RepositoryScope import org.hisp.dhis.android.core.category.CategoryCombo import org.hisp.dhis.android.core.common.Geometry import org.hisp.dhis.android.core.event.Event @@ -258,6 +259,16 @@ class EventRepositoryTest { .byProgramStageUid() .eq(anyOrNull()) .withDataElements() + .orderBySortOrder(RepositoryScope.OrderByDirection.ASC), + ) doReturn mock() + whenever( + d2 + .programModule() + .programStageSections() + .byProgramStageUid() + .eq(anyOrNull()) + .withDataElements() + .orderBySortOrder(RepositoryScope.OrderByDirection.ASC) .blockingGet(), ) doReturn listOf(mockedFirstSection, mockedSecondSection) } From 49a8189f99f4ec30168deb4fff47769f7e87372c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Thu, 26 Feb 2026 09:31:59 +0100 Subject: [PATCH 069/260] feat: check minCharacters to search and display warning (#4682) * feat: check minCharacters to search and display warning * test: add SearchParametersViewModelTest.kt * test: fix copilot feedback in SearchParametersViewModelTest.kt * fix: Make suspend functions inside SearchParametersViewModel.kt internal --- .../SearchParametersScreenProvider.kt | 2 +- ...t => DrawableResourcesProvider.android.kt} | 0 ...ources.kt => DrawableResourcesProvider.kt} | 0 .../resources/StringResourceProvider.kt | 11 ++ ...t => DrawableResourcesProvider.desktop.kt} | 0 tracker/build.gradle.kts | 2 - .../composeResources/values/strings.xml | 2 +- .../tracker/search/di/TrackerSearchModule.kt | 13 +- .../ui/screen/SearchParametersScreen.kt | 27 ++- .../ui/viewmodel/SearchParametersViewModel.kt | 72 ++++++++ .../SearchParametersViewModelTest.kt | 165 ++++++++++++++++++ 11 files changed, 286 insertions(+), 8 deletions(-) rename commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/resources/{Resources.android.kt => DrawableResourcesProvider.android.kt} (100%) rename commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/resources/{Resources.kt => DrawableResourcesProvider.kt} (100%) create mode 100644 commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/resources/StringResourceProvider.kt rename commonskmm/src/desktopMain/java/org/dhis2/mobile/commons/resources/{Resources.desktop.kt => DrawableResourcesProvider.desktop.kt} (100%) create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/viewmodel/SearchParametersViewModel.kt create mode 100644 tracker/src/commonTest/kotlin/org/dhis2/tracker/search/ui/viewmodel/SearchParametersViewModelTest.kt diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreenProvider.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreenProvider.kt index f75a1882e43..d65d6591b1e 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreenProvider.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreenProvider.kt @@ -114,7 +114,7 @@ fun provideSearchScreen( val isLandscape = configuration.orientation == Configuration.ORIENTATION_LANDSCAPE SearchParametersScreen( - uiState = viewModel.searchParametersUiState, + externalUiState = viewModel.searchParametersUiState, onSearchScreenUiEvent = { when (it) { is SearchScreenUiEvent.OnSearchButtonClicked -> diff --git a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/resources/Resources.android.kt b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/resources/DrawableResourcesProvider.android.kt similarity index 100% rename from commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/resources/Resources.android.kt rename to commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/resources/DrawableResourcesProvider.android.kt diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/resources/Resources.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/resources/DrawableResourcesProvider.kt similarity index 100% rename from commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/resources/Resources.kt rename to commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/resources/DrawableResourcesProvider.kt diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/resources/StringResourceProvider.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/resources/StringResourceProvider.kt new file mode 100644 index 00000000000..6003c0e8ae4 --- /dev/null +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/resources/StringResourceProvider.kt @@ -0,0 +1,11 @@ +package org.dhis2.mobile.commons.resources + +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.getString + +class StringResourceProvider { + suspend fun provideString( + resource: StringResource, + number: Int, + ): String = getString(resource, number) +} diff --git a/commonskmm/src/desktopMain/java/org/dhis2/mobile/commons/resources/Resources.desktop.kt b/commonskmm/src/desktopMain/java/org/dhis2/mobile/commons/resources/DrawableResourcesProvider.desktop.kt similarity index 100% rename from commonskmm/src/desktopMain/java/org/dhis2/mobile/commons/resources/Resources.desktop.kt rename to commonskmm/src/desktopMain/java/org/dhis2/mobile/commons/resources/DrawableResourcesProvider.desktop.kt diff --git a/tracker/build.gradle.kts b/tracker/build.gradle.kts index 857e11e1cd6..9a9ab870e3e 100644 --- a/tracker/build.gradle.kts +++ b/tracker/build.gradle.kts @@ -48,8 +48,6 @@ kotlin { implementation(kotlin("test")) // Koin Test features implementation(libs.koin.test) - implementation(libs.koin.test.junit5) - implementation(libs.koin.test.junit4) implementation(libs.test.turbine) implementation(libs.test.kotlinCoroutines) implementation(libs.test.mockitoKotlin) diff --git a/tracker/src/commonMain/composeResources/values/strings.xml b/tracker/src/commonMain/composeResources/values/strings.xml index e47fae5fd7b..e41770e623f 100644 --- a/tracker/src/commonMain/composeResources/values/strings.xml +++ b/tracker/src/commonMain/composeResources/values/strings.xml @@ -25,5 +25,5 @@ Must match the end of the value yes no - + Enter at least %1$d characters \ No newline at end of file diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.kt index 1ae532b442d..8018e82997f 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.kt @@ -1,9 +1,12 @@ package org.dhis2.tracker.search.di +import org.dhis2.mobile.commons.resources.StringResourceProvider import org.dhis2.tracker.search.domain.FetchOptionSetOptions import org.dhis2.tracker.search.domain.SearchTrackedEntities +import org.dhis2.tracker.search.ui.viewmodel.SearchParametersViewModel import org.koin.core.module.Module import org.koin.core.module.dsl.factoryOf +import org.koin.core.module.dsl.viewModelOf import org.koin.dsl.module /** @@ -20,7 +23,8 @@ val trackerSearchModule = // Include platform-specific repository implementations includes(trackerSearchRepositoryModule) - // SearchTrackedEntities - factory with teType parameter + // Use cases + // With teType parameter factory { params -> SearchTrackedEntities( repository = get(), @@ -28,6 +32,11 @@ val trackerSearchModule = teType = params.get(), ) } - // FetchOptionSetOptions use case factoryOf(::FetchOptionSetOptions) + + // Providers + single { StringResourceProvider() } + + // ViewModels + viewModelOf(::SearchParametersViewModel) } diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/screen/SearchParametersScreen.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/screen/SearchParametersScreen.kt index 368e69323d0..e29700ffe6b 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/screen/SearchParametersScreen.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/screen/SearchParametersScreen.kt @@ -23,6 +23,8 @@ import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment @@ -49,6 +51,7 @@ import org.dhis2.tracker.input.ui.state.loadOptionSetConfiguration import org.dhis2.tracker.search.ui.action.SearchScreenUiEvent import org.dhis2.tracker.search.ui.provider.provideParameterSelectorItem import org.dhis2.tracker.search.ui.state.SearchParametersUiState +import org.dhis2.tracker.search.ui.viewmodel.SearchParametersViewModel import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItemColor import org.hisp.dhis.mobile.ui.designsystem.component.Button import org.hisp.dhis.mobile.ui.designsystem.component.ButtonStyle @@ -59,16 +62,26 @@ import org.hisp.dhis.mobile.ui.designsystem.theme.Shape import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor import org.hisp.dhis.mobile.ui.designsystem.theme.TextColor import org.jetbrains.compose.resources.stringResource +import org.koin.compose.viewmodel.koinViewModel @Composable fun SearchParametersScreen( - uiState: SearchParametersUiState, + externalUiState: SearchParametersUiState, onSearchScreenUiEvent: (SearchScreenUiEvent) -> Unit, onTrackerInputUiEvent: (TrackerInputUiEvent) -> Unit, isLandscape: Boolean, getOptionSetFlow: (fieldUid: String, optionSetUid: String) -> Flow>?, onOptionSetSearch: (fieldUid: String, query: String) -> Unit, ) { + val viewModel = koinViewModel() + + LaunchedEffect(externalUiState) { + viewModel.updateFromExternal(externalUiState) + } + + val uiState by viewModel.uiState.collectAsState() + val validationResult by viewModel.validationResult.collectAsState() + val snackBarHostState = remember { SnackbarHostState() } val coroutineScope = rememberCoroutineScope() val focusManager = LocalFocusManager.current @@ -93,6 +106,16 @@ fun SearchParametersScreen( } } + LaunchedEffect(validationResult) { + validationResult?.let { isValid -> + if (isValid) { + onSearchScreenUiEvent(SearchScreenUiEvent.OnSearchButtonClicked) + } + + viewModel.resetValidationResult() + } + } + val backgroundShape = getBackgroundShape(isLandscape) Scaffold( @@ -229,7 +252,7 @@ fun SearchParametersScreen( }, ) { focusManager.clearFocus() - onSearchScreenUiEvent(SearchScreenUiEvent.OnSearchButtonClicked) + viewModel.onValidateSearch() } } } diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/viewmodel/SearchParametersViewModel.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/viewmodel/SearchParametersViewModel.kt new file mode 100644 index 00000000000..3ea6a59c0cb --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/viewmodel/SearchParametersViewModel.kt @@ -0,0 +1,72 @@ +package org.dhis2.tracker.search.ui.viewmodel + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import org.dhis2.mobile.commons.resources.StringResourceProvider +import org.dhis2.mobile.tracker.resources.Res +import org.dhis2.mobile.tracker.resources.min_characters_warning +import org.dhis2.tracker.search.ui.state.SearchParametersUiState + +class SearchParametersViewModel( + private val resourceProvider: StringResourceProvider, +) : ViewModel() { + private val _uiState = MutableStateFlow(SearchParametersUiState()) + val uiState: StateFlow = _uiState.asStateFlow() + + private val _validationResult = MutableStateFlow(null) + val validationResult: StateFlow = _validationResult.asStateFlow() + + fun updateFromExternal(externalState: SearchParametersUiState) { + _uiState.value = externalState + } + + fun onValidateSearch() { + viewModelScope.launch { + _validationResult.value = onValidateMinCharacters() + } + } + + private suspend fun onValidateMinCharacters(): Boolean { + val items = _uiState.value.items + // Check if there are invalid items to later check the warning + val invalidItems = + items.filter { item -> + val min = item.minCharactersToSearch ?: return@filter false + val value = item.value + !value.isNullOrEmpty() && value.length < min + } + + if (invalidItems.isNotEmpty()) { + val updatedItems = + items.map { item -> + val min = item.minCharactersToSearch + if (min != null && !item.value.isNullOrEmpty() && item.value.length < min) { + item.copy( + error = + resourceProvider.provideString( + resource = Res.string.min_characters_warning, + min, + ), + ) + } else { + item.copy(error = null) + } + } + _uiState.update { it.copy(items = updatedItems) } + return false + } + + val clearedItems = items.map { it.copy(error = null) } + _uiState.update { it.copy(items = clearedItems) } + return true + } + + fun resetValidationResult() { + _validationResult.value = null + } +} diff --git a/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/ui/viewmodel/SearchParametersViewModelTest.kt b/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/ui/viewmodel/SearchParametersViewModelTest.kt new file mode 100644 index 00000000000..f334b522772 --- /dev/null +++ b/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/ui/viewmodel/SearchParametersViewModelTest.kt @@ -0,0 +1,165 @@ +package org.dhis2.tracker.search.ui.viewmodel + +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.resetMain +import kotlinx.coroutines.test.runTest +import kotlinx.coroutines.test.setMain +import org.dhis2.mobile.commons.resources.StringResourceProvider +import org.dhis2.tracker.input.ui.state.TrackerInputUiState +import org.dhis2.tracker.search.ui.state.SearchParametersUiState +import org.junit.Assert +import org.mockito.kotlin.any +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever +import kotlin.test.AfterTest +import kotlin.test.BeforeTest +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNotEquals +import kotlin.test.assertNull + +@ExperimentalCoroutinesApi +class SearchParametersViewModelTest { + private val testingDispatcher = StandardTestDispatcher() + private val resourceProvider = mock() + private lateinit var viewModel: SearchParametersViewModel + + @BeforeTest + fun setUp() { + Dispatchers.setMain(testingDispatcher) + viewModel = SearchParametersViewModel(resourceProvider) + } + + @AfterTest + fun tearDown() { + Dispatchers.resetMain() + } + + @Test + fun `onValidateSearch should set validationResult to true when all items are valid`() = + runTest(testingDispatcher) { + // Given + val validItems = + listOf( + provideItem( + uid = "test1", + label = "Test 1", + value = "validvalue", + minCharactersToSearch = 3, + ), + provideItem( + uid = "test2", + label = "Test 2", + value = "another", + minCharactersToSearch = null, + ), + provideItem( + uid = "test3", + label = "Test 3", + value = null, + minCharactersToSearch = 3, + ), + ) + + viewModel.updateFromExternal(SearchParametersUiState(items = validItems)) + + // When + viewModel.onValidateSearch() + advanceUntilIdle() + + // Then + val validationResult = viewModel.validationResult.first() + assertEquals(true, validationResult) + } + + @Test + fun `onValidateSearch should set validationResult to false when items have insufficient characters`() = + runTest(testingDispatcher) { + // Given + val invalidItems = + listOf( + provideItem( + uid = "test1", + value = "ab", + minCharactersToSearch = 3, + ), + provideItem( + uid = "test2", + label = "Test 2", + value = "abcde", + minCharactersToSearch = 5, + ), + provideItem( + uid = "test3", + label = "Test 3", + value = "a", + minCharactersToSearch = 2, + ), + ) + whenever( + resourceProvider.provideString(any(), any()), + ).thenReturn("Minimum characters required") + + viewModel.updateFromExternal(SearchParametersUiState(items = invalidItems)) + + // When + viewModel.onValidateSearch() + advanceUntilIdle() + + // Then + val validationResult = viewModel.validationResult.first() + assertNotEquals(true, validationResult) + + val uiState = viewModel.uiState.first() // Also check that error is set on the item + assertEquals(3, uiState.items.size) + Assert.assertTrue(uiState.items[0].error?.isNotEmpty() == true) // Error should be set + } + + @Test + fun `resetValidationResult should set validationResult to null`() = + runTest(testingDispatcher) { + // Given + viewModel.updateFromExternal(SearchParametersUiState(items = listOf())) + viewModel.onValidateSearch() + advanceUntilIdle() + + // When + viewModel.resetValidationResult() + + // Then + val validationResult = viewModel.validationResult.first() + assertNull(validationResult) + } + + private fun provideItem( + uid: String = "test1", + label: String = "Test 1", + value: String?, + minCharactersToSearch: Int?, + ): TrackerInputUiState = + TrackerInputUiState( + uid = uid, + label = label, + value = value, + focused = false, + valueType = mock(), + optionSet = null, + error = null, + warning = null, + description = null, + mandatory = false, + editable = true, + legend = null, + orientation = mock(), + optionSetConfiguration = null, + customIntentUid = null, + displayName = null, + orgUnitSelectorScope = null, + searchOperator = null, + minCharactersToSearch = minCharactersToSearch, + ) +} From 9f2870573430c53efdb7fa1e449ccce9f3f576b6 Mon Sep 17 00:00:00 2001 From: Ferdy Rodriguez Date: Thu, 26 Feb 2026 10:41:20 +0100 Subject: [PATCH 070/260] feat: [ANDROAPP-7226] Support of search operators [skip size] (#4683) * Adds supports for Search Operators * update condition to check dataValues size greater than one in search repository implementation * fix ktlint errors * Correctly updates existing QueryData item's value. Adds test to check for null or empty values in AddToQuery * dynamically shows search operator supporting text when field is focused. --- .../searchTrackEntity/SearchTEActivity.kt | 2 +- .../searchTrackEntity/SearchTEIViewModel.kt | 148 +++++++++++++----- .../listView/SearchTEList.kt | 2 +- .../SearchTEIViewModelTest.kt | 66 ++++---- .../data/SearchTrackedEntityRepositoryImpl.kt | 28 ++-- .../SearchTrackedEntityRepositoryImplTest.kt | 57 ++++++- .../input/ui/state/TrackerInputUiState.kt | 14 +- .../data/SearchTrackedEntityRepository.kt | 6 +- .../search/domain/SearchTrackedEntities.kt | 53 +++---- .../dhis2/tracker/search/model/QueryData.kt | 7 + .../model/SearchTrackedEntitiesInput.kt | 2 +- .../domain/SearchTrackedEntitiesTest.kt | 113 +++++++++---- 12 files changed, 337 insertions(+), 161 deletions(-) create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/QueryData.kt diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.kt index 6c71aadcef9..6aa087ef3fa 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.kt @@ -299,7 +299,7 @@ class SearchTEActivity : override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - outState.putSerializable(Constants.QUERY_DATA, viewModel.queryData as Serializable) + outState.putSerializable(Constants.QUERY_DATA, viewModel.queryDataAsMap() as Serializable) outState.putString(CURRENT_SCREEN, currentContent?.name) } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt index c0076d8155a..c6fc35f741d 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt @@ -64,6 +64,7 @@ import org.dhis2.tracker.search.domain.FetchOptionSetOptions import org.dhis2.tracker.search.domain.FetchSearchParameters import org.dhis2.tracker.search.domain.SearchTrackedEntities import org.dhis2.tracker.search.model.FetchSearchParametersData +import org.dhis2.tracker.search.model.QueryData import org.dhis2.tracker.search.model.SearchTrackedEntitiesInput import org.dhis2.tracker.search.ui.state.SearchParametersUiState import org.dhis2.usescases.searchTrackEntity.listView.SearchResult @@ -111,11 +112,6 @@ class SearchTEIViewModel( val navigationBarUIState: MutableState> = _navigationBarUIState - val queryData = - mutableMapOf?>().apply { - initialQuery?.let { putAll(it) } - } - private val _legacyInteraction = MutableLiveData() val legacyInteraction: LiveData = _legacyInteraction @@ -154,6 +150,11 @@ class SearchTEIViewModel( var searchParametersUiState by mutableStateOf(SearchParametersUiState()) + val queryDataList = + mutableListOf().apply { + initialQuery?.let { addAll(it.toQueryDataList()) } + } + var mapManager: MapManager? = null private var fetchJob: Job? = null @@ -328,7 +329,7 @@ class SearchTEIViewModel( isSearching = searching, searchForm = SearchForm( - queryHasData = queryData.isNotEmpty(), + queryHasData = queryDataList.isNotEmpty(), minAttributesToSearch = searchRepository .getProgram(initialProgramUid) @@ -365,7 +366,7 @@ class SearchTEIViewModel( isSearching = searching, searchForm = SearchForm( - queryHasData = queryData.isNotEmpty(), + queryHasData = queryDataList.isNotEmpty(), minAttributesToSearch = searchRepository .getProgram(initialProgramUid) @@ -405,7 +406,7 @@ class SearchTEIViewModel( isSearching = searching, searchForm = SearchForm( - queryHasData = queryData.isNotEmpty(), + queryHasData = queryDataList.isNotEmpty(), minAttributesToSearch = searchRepository .getProgram(initialProgramUid) @@ -448,9 +449,24 @@ class SearchTEIViewModel( values: List?, ) { if (values.isNullOrEmpty()) { - queryData.remove(uid) + queryDataList.removeIf { it.attributeId == uid } } else { - queryData[uid] = values + if (queryDataList.none { it.attributeId == uid }) { + queryDataList.add( + QueryData( + attributeId = uid, + values = values, + searchOperator = searchParametersUiState.items.firstOrNull { it.uid == uid }?.searchOperator, + ), + ) + } else { + queryDataList + .indexOfFirst { it.attributeId == uid } + .takeIf { it != -1 } + ?.let { index -> + queryDataList[index] = queryDataList[index].copy(values = values) + } + } } updateSearchParameters(uid, values) @@ -484,7 +500,7 @@ class SearchTEIViewModel( } fun clearQueryData() { - queryData.clear() + queryDataList.clear() clearSearchParameters() updateSearch() performSearch() @@ -510,13 +526,13 @@ class SearchTEIViewModel( currentSearchList.copy( searchForm = currentSearchList.searchForm.copy( - queryHasData = queryData.isNotEmpty(), + queryHasData = queryDataList.isNotEmpty(), ), ), ) } searchParametersUiState = - searchParametersUiState.copy(searchEnabled = queryData.isNotEmpty()) + searchParametersUiState.copy(searchEnabled = queryDataList.isNotEmpty()) } private fun loadSearchResults(): Flow> = @@ -529,7 +545,7 @@ class SearchTEIViewModel( val allowCache = searchRepositoryKt.saveSearchValuesAndGetAllowCache( - queryData, + queryDataAsMap(), selectedProgram?.uid(), ) val newTrackerSearchModel = @@ -539,7 +555,7 @@ class SearchTEIViewModel( excludeValues = excludeValues, hasStateFilters = filterManager.stateFilters.isNotEmpty(), isOnline = isOnline, - queryData = queryData, + queryDataList = queryDataList, ) val results = searchTrackedEntities.invoke(newTrackerSearchModel) @@ -572,7 +588,7 @@ class SearchTEIViewModel( val allowCache = searchRepositoryKt.saveSearchValuesAndGetAllowCache( - queryData, + queryDataAsMap(), selectedProgram?.uid(), ) val newTrackerSearchModel = @@ -582,7 +598,7 @@ class SearchTEIViewModel( excludeValues = excludeValues, hasStateFilters = filterManager.stateFilters.isNotEmpty(), isOnline = false, - queryData = queryData, + queryDataList = queryDataList, ) val results = searchTrackedEntities.invoke(newTrackerSearchModel) @@ -616,7 +632,7 @@ class SearchTEIViewModel( val allowCache = searchRepositoryKt.saveSearchValuesAndGetAllowCache( - queryData, + queryDataAsMap(), selectedProgram?.uid(), ) val newTrackerSearchModel = @@ -626,7 +642,7 @@ class SearchTEIViewModel( excludeValues = excludeValues, hasStateFilters = filterManager.stateFilters.isNotEmpty(), isOnline = isOnline, - queryData = queryData, + queryDataList = queryDataList, ) val results = searchTrackedEntities.invoke(newTrackerSearchModel) @@ -663,7 +679,7 @@ class SearchTEIViewModel( val data = mapDataRepository.getTrackerMapData( searchRepository.getProgram(initialProgramUid), - queryData, + queryDataAsMap(), layersVisibility, ) _mapResults.send(data) @@ -685,10 +701,10 @@ class SearchTEIViewModel( viewModelScope.launch(dispatchers.io()) { try { if (canPerformSearch()) { - searching = queryData.isNotEmpty() + searching = queryDataList.isNotEmpty() searchParametersUiState = searchParametersUiState.copy( - clearSearchEnabled = queryData.isNotEmpty(), + clearSearchEnabled = queryDataList.isNotEmpty(), searchedItems = getFriendlyQueryData(), ) @@ -734,12 +750,12 @@ class SearchTEIViewModel( private fun minAttributesToSearchCheck(): Boolean = searchRepository.getProgram(initialProgramUid)?.let { program -> - (program.minAttributesRequiredToSearch() ?: 0) <= queryData.size + (program.minAttributesRequiredToSearch() ?: 0) <= queryDataList.size } ?: true private fun displayFrontPageList(): Boolean = searchRepository.getProgram(initialProgramUid)?.let { program -> - program.displayFrontPageList() == true && queryData.isEmpty() + program.displayFrontPageList() == true && queryDataList.isEmpty() } ?: false private fun canDisplayResult( @@ -760,10 +776,10 @@ class SearchTEIViewModel( } fun queryDataByProgram(programUid: String?): MutableMap> = - searchRepository.filterQueryForProgram(queryData, programUid) + searchRepository.filterQueryForProgram(queryDataAsMap(), programUid) fun onEnrollClick() { - _legacyInteraction.postValue(LegacyInteraction.OnEnrollClick(queryData)) + _legacyInteraction.postValue(LegacyInteraction.OnEnrollClick(queryDataAsMap())) } fun onAddRelationship( @@ -801,7 +817,7 @@ class SearchTEIViewModel( LegacyInteraction.OnEnroll( initialProgramUid, downloadResult.teiUid, - queryData, + queryDataAsMap(), ), ) } else { @@ -888,7 +904,7 @@ class SearchTEIViewModel( hasGlobalResults == null && searchRepository.getProgram(initialProgramUid) != null && - searchRepository.filterQueryForProgram(queryData, null).isNotEmpty() && + searchRepository.filterQueryForProgram(queryDataAsMap(), null).isNotEmpty() && searchRepository.filtersApplyOnGlobalSearch() -> { listOf( SearchResult( @@ -1078,13 +1094,22 @@ class SearchTEIViewModel( ), ).fold( onSuccess = { searchParameters -> + val newItems = + searchParameters.map { searchParameter -> + searchParameter.toTrackerInputUiState() + } searchParametersUiState = searchParametersUiState.copy( - items = - searchParameters.map { searchParameter -> - searchParameter.toTrackerInputUiState() - }, + items = newItems, ) + + queryDataList.forEachIndexed { index, entry -> + val searchOperator = + newItems + .firstOrNull { it.uid == entry.attributeId } + ?.searchOperator + queryDataList[index] = entry.copy(searchOperator = searchOperator) + } }, onFailure = { // TODO(Implement error) @@ -1103,10 +1128,10 @@ class SearchTEIViewModel( value?.let { listOf(it) }, ) - searching = queryData.isNotEmpty() + searching = queryDataList.isNotEmpty() searchParametersUiState = searchParametersUiState.copy( - clearSearchEnabled = queryData.isNotEmpty(), + clearSearchEnabled = queryDataList.isNotEmpty(), searchedItems = getFriendlyQueryData(), ) @@ -1123,7 +1148,7 @@ class SearchTEIViewModel( excludeValues = excludeValues, hasStateFilters = filterManager.stateFilters.isNotEmpty(), isOnline = isOnline, - queryData = queryData, + queryDataList = queryDataList, ) // Use invokeImmediate for QR code scanning to get immediate non-paginated results @@ -1340,4 +1365,57 @@ class SearchTEIViewModel( ) } } + + /** + * + * Converts the internal queryDataList to a map representation. + * + * Since the previous map representation of queryData (Map>) is used outside + * of the SearchTEIViewModel, this function helps to represent the new and refactor. + * + * QueryData list into the Map> on those places. + * We will continue to refactor the map from other places it was used in the future. And these + * methods will help us do a smooth refactor without breaking changes. + * + * After all QueryData maps are refactored, this function will be removed. + * + * @return A mutableMap with attribute IDs as keys and their corresponding value lists + * + */ + fun queryDataAsMap() = queryDataList.toMap() + + /** + * + * Converts the mutableList of [QueryData] to a mutableMap where keys are attribute IDs + * and values are lists of strings. + * + * @return A mutableMap with attribute IDs as keys and their corresponding value lists + * + */ + private fun MutableList.toMap(): MutableMap?> = + this + .associate { queryData -> + val valueList = queryData.values + queryData.attributeId to valueList + }.toMutableMap() + + /** + * + * Converts a mutableMap to a mutableList of [QueryData] where map keys are attribute IDs + * and map values are lists of strings. + * + * @return A mutableList of [QueryData] objects + * + */ + private fun MutableMap?>.toQueryDataList() = + this + .map { (attributeId, valuesList) -> + QueryData( + attributeId = attributeId, + values = valuesList, + searchOperator = null, + ) + }.toMutableList() + + // } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt index b0193d2f4a3..e585a6c3950 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt @@ -266,7 +266,7 @@ class SearchTEList : FragmentGlobalAbstract() { val teTypeName by viewModel.teTypeName.observeAsState() val hasQueryData = remember(viewModel.searchParametersUiState) { - viewModel.queryData.isNotEmpty() + viewModel.queryDataList.isNotEmpty() } updateLayoutParams { diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt index 15c0e38e256..3c7e0dd9e23 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt @@ -49,6 +49,7 @@ import org.junit.Rule import org.junit.Test import org.maplibre.geojson.BoundingBox import org.mockito.kotlin.any +import org.mockito.kotlin.anyOrNull import org.mockito.kotlin.doReturn import org.mockito.kotlin.eq import org.mockito.kotlin.mock @@ -214,12 +215,12 @@ class SearchTEIViewModelTest { value = "testingValue", ) - val queryData = viewModel.queryData + val queryData = viewModel.queryDataList assertTrue(queryData.isNotEmpty()) - assertTrue(queryData["testingUid"]?.size == 1) - val values = queryData["testingUid"] - assertTrue(values?.contains("testingValue") == true) + assertTrue(queryData.size == 1) + val data = queryData.first { it.attributeId == "testingUid" } + assertTrue(data.values?.get(0) == "testingValue") } @Test @@ -229,14 +230,14 @@ class SearchTEIViewModelTest { value = "testingValue,testingValue2", ) - val queryData = viewModel.queryData + val queryData = viewModel.queryDataList assertTrue(queryData.isNotEmpty()) - assertTrue(queryData.containsKey("testingUid")) - val values = queryData["testingUid"] - assertTrue(values?.size == 2) - assertTrue(values?.contains("testingValue") == true) - assertTrue(values?.contains("testingValue2") == true) + assertTrue(queryData.any { it.attributeId == "testingUid" }) + val data = queryData.first { it.attributeId == "testingUid" } + assertTrue(data.values?.size == 2) + assertTrue(data.values?.contains("testingValue") == true) + assertTrue(data.values?.contains("testingValue2") == true) } @Test @@ -250,20 +251,20 @@ class SearchTEIViewModelTest { value = "testingValue,testingValue2", ) - val queryData = viewModel.queryData + val queryData = viewModel.queryDataList assertTrue(queryData.isNotEmpty()) - assertTrue(queryData.containsKey("testingUid")) - val values1 = queryData["testingUid"] - assertTrue(values1?.size == 2) - assertTrue(values1?.contains("testingValue") == true) - assertTrue(values1?.contains("testingValue2") == true) - - assertTrue(queryData.containsKey("testingUid")) - val values2 = queryData["testingUid2"] - assertTrue(values2?.size == 2) - assertTrue(values2?.contains("testingValue") == true) - assertTrue(values2?.contains("testingValue2") == true) + assertTrue(queryData.any { it.attributeId == "testingUid" }) + val data1 = queryData.first { it.attributeId == "testingUid" } + assertTrue(data1.values?.size == 2) + assertTrue(data1.values?.contains("testingValue") == true) + assertTrue(data1.values?.contains("testingValue2") == true) + + assertTrue(queryData.any { it.attributeId == "testingUid2" }) + val data2 = queryData.first { it.attributeId == "testingUid2" } + assertTrue(data2.values?.size == 2) + assertTrue(data2.values?.contains("testingValue") == true) + assertTrue(data2.values?.contains("testingValue2") == true) } @ExperimentalCoroutinesApi @@ -279,7 +280,7 @@ class SearchTEIViewModelTest { eq( SearchTrackedEntitiesInput( selectedProgram = testingProgram.uid(), - queryData = mutableMapOf(), + queryDataList = mutableListOf(), allowCache = true, excludeValues = emptySet(), hasStateFilters = false, @@ -326,7 +327,7 @@ class SearchTEIViewModelTest { whenever( mapDataRepository.getTrackerMapData( testingProgram(), - viewModel.queryData, + viewModel.queryDataAsMap(), ), ) doReturn trackerMapData @@ -370,7 +371,7 @@ class SearchTEIViewModelTest { whenever( mapDataRepository.getTrackerMapData( testingProgram(), - viewModel.queryData, + viewModel.queryDataAsMap(), ), ) doReturn TrackerMapData( @@ -400,14 +401,14 @@ class SearchTEIViewModelTest { assertTrue(viewModel.refreshData.value != null) verify(mapDataRepository).getTrackerMapData( testingProgram(), - viewModel.queryData, + viewModel.queryDataAsMap(), ) } @Test fun `Should filter query data for new program`() { viewModel.queryDataByProgram("programUid") - verify(repository).filterQueryForProgram(viewModel.queryData, "programUid") + verify(repository).filterQueryForProgram(viewModel.queryDataAsMap(), "programUid") } @Test @@ -499,8 +500,11 @@ class SearchTEIViewModelTest { setCurrentProgram(testingProgram(maxTeiCountToReturn = 1)) setAllowCreateBeforeSearch(false) whenever( - repository.filterQueryForProgram(viewModel.queryData, null), - ) doReturn mapOf("field" to listOf("value")) + repository.filterQueryForProgram( + any(), + anyOrNull(), + ), + ) doReturn mapOf("testingUid" to listOf("testingValue")) performSearch() viewModel.onDataLoaded(1) @@ -515,7 +519,7 @@ class SearchTEIViewModelTest { fun `Should return unable to search outside result for search`() { setCurrentProgram(testingProgram(maxTeiCountToReturn = 1)) setAllowCreateBeforeSearch(false) - whenever(repository.filterQueryForProgram(viewModel.queryData, null)) doReturn mapOf() + whenever(repository.filterQueryForProgram(viewModel.queryDataAsMap(), null)) doReturn mapOf() whenever(repository.trackedEntityTypeFields()) doReturn listOf("Field_1", "Field_2") performSearch() @@ -731,7 +735,7 @@ class SearchTEIViewModelTest { viewModel.searchParametersUiState.copy(items = getTrackerInputModels()) performSearch() viewModel.clearQueryData() - assert(viewModel.queryData.isEmpty()) + assert(viewModel.queryDataList.isEmpty()) assert(viewModel.searchParametersUiState.items.all { it.value == null }) assert(viewModel.searchParametersUiState.searchedItems.isEmpty()) } diff --git a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImpl.kt b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImpl.kt index a4bfd48d5e4..0782420f8e5 100644 --- a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImpl.kt +++ b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImpl.kt @@ -5,6 +5,7 @@ import androidx.paging.map import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import org.dhis2.commons.filters.data.FilterPresenter +import org.dhis2.tracker.search.model.SearchOperator import org.dhis2.tracker.search.model.SearchTrackedEntityAttribute import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult import org.hisp.dhis.android.core.D2 @@ -46,25 +47,30 @@ class SearchTrackedEntityRepositoryImpl( override suspend fun addToQuery( dataId: String, - dataValues: List, - isUnique: Boolean, - isOptionSet: Boolean, + dataValues: List?, + searchOperator: SearchOperator?, ) { + if (dataValues.isNullOrEmpty()) return + trackedEntityInstanceQuery = if (dataValues.size > 1) { // return any tracked entities with attributes that match the values in the list trackedEntityInstanceQuery?.byFilter(dataId)?.`in`(dataValues) } else { - if (dataValues.size == 1) { - if (isUnique || isOptionSet) { - // If the attribute is unique or an option set, we want an exact match - trackedEntityInstanceQuery?.byFilter(dataId)?.eq(dataValues[0]) - } else { - // return tracked entities that contain the data value + when (searchOperator) { + SearchOperator.LIKE -> { trackedEntityInstanceQuery?.byFilter(dataId)?.like(dataValues[0]) } - } else { - trackedEntityInstanceQuery + SearchOperator.SW -> { + trackedEntityInstanceQuery?.byFilter(dataId)?.sw(dataValues[0]) + } + SearchOperator.EW -> { + trackedEntityInstanceQuery?.byFilter(dataId)?.ew(dataValues[0]) + } + SearchOperator.EQ -> { + trackedEntityInstanceQuery?.byFilter(dataId)?.eq(dataValues[0]) + } + else -> trackedEntityInstanceQuery?.byFilter(dataId)?.like(dataValues[0]) } } } diff --git a/tracker/src/androidUnitTest/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImplTest.kt b/tracker/src/androidUnitTest/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImplTest.kt index 7bc2c81871d..6cad077b456 100644 --- a/tracker/src/androidUnitTest/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImplTest.kt +++ b/tracker/src/androidUnitTest/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImplTest.kt @@ -2,6 +2,7 @@ package org.dhis2.tracker.search.data import kotlinx.coroutines.test.runTest import org.dhis2.commons.filters.data.FilterPresenter +import org.dhis2.tracker.search.model.SearchOperator import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.arch.repositories.`object`.ReadOnlyOneObjectRepositoryFinalImpl import org.hisp.dhis.android.core.trackedentity.TrackedEntityAttribute @@ -223,8 +224,7 @@ class SearchTrackedEntityRepositoryImplTest { repository.addToQuery( dataId = dataId, dataValues = dataValues, - isUnique = false, - isOptionSet = false, + searchOperator = null, ) // Then - verify the filter was applied @@ -248,8 +248,7 @@ class SearchTrackedEntityRepositoryImplTest { repository.addToQuery( dataId = dataId, dataValues = dataValues, - isUnique = true, - isOptionSet = false, + searchOperator = SearchOperator.EQ, ) // Then - verify the filter was applied @@ -273,8 +272,7 @@ class SearchTrackedEntityRepositoryImplTest { repository.addToQuery( dataId = dataId, dataValues = dataValues, - isUnique = false, - isOptionSet = true, + searchOperator = SearchOperator.EQ, ) // Then - verify the filter was applied @@ -298,14 +296,57 @@ class SearchTrackedEntityRepositoryImplTest { repository.addToQuery( dataId = dataId, dataValues = dataValues, - isUnique = false, - isOptionSet = false, + searchOperator = SearchOperator.LIKE, ) // Then - verify the filter was applied verify(mockQuery).byFilter(dataId) } + @Test + fun `addToQuery should do nothing when dataValues is null`() = + runTest { + // Given + val dataId = "attr1" + val mockQuery: TrackedEntitySearchCollectionRepository = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) + + whenever(filterPresenter.filteredTrackedEntityInstances(any(), any())) doReturn mockQuery + + repository.addFiltersToQuery(programUid, teType) + + // When + repository.addToQuery( + dataId = dataId, + dataValues = null, + searchOperator = null, + ) + + // Then - byFilter should never be called, query remains unchanged + verify(mockQuery, Mockito.never()).byFilter(any()) + } + + @Test + fun `addToQuery should do nothing when dataValues is empty`() = + runTest { + // Given + val dataId = "attr1" + val mockQuery: TrackedEntitySearchCollectionRepository = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) + + whenever(filterPresenter.filteredTrackedEntityInstances(any(), any())) doReturn mockQuery + + repository.addFiltersToQuery(programUid, teType) + + // When + repository.addToQuery( + dataId = dataId, + dataValues = emptyList(), + searchOperator = null, + ) + + // Then - byFilter should never be called, query remains unchanged + verify(mockQuery, Mockito.never()).byFilter(any()) + } + @Test fun `addFiltersToQuery should initialize query with filter presenter`() = runTest { diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerInputUiState.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerInputUiState.kt index 85f029905fc..d0aefc2e87d 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerInputUiState.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerInputUiState.kt @@ -62,11 +62,15 @@ fun TrackerInputUiState.supportingText(): List? = ) }, searchOperator?.let { operator -> - operator.supportingTextString()?.let { text -> - SupportingTextData( - text, - SupportingTextState.DEFAULT, - ) + if (focused) { + operator.supportingTextString()?.let { text -> + SupportingTextData( + text, + SupportingTextState.DEFAULT, + ) + } + } else { + null } }, description?.let { diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepository.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepository.kt index 2cd934ed16d..a1d605d507f 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepository.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepository.kt @@ -2,6 +2,7 @@ package org.dhis2.tracker.search.data import androidx.paging.PagingData import kotlinx.coroutines.flow.Flow +import org.dhis2.tracker.search.model.SearchOperator import org.dhis2.tracker.search.model.SearchTrackedEntityAttribute import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult @@ -15,9 +16,8 @@ interface SearchTrackedEntityRepository { suspend fun addToQuery( dataId: String, - dataValues: List, - isUnique: Boolean, - isOptionSet: Boolean, + dataValues: List? = null, + searchOperator: SearchOperator?, ) suspend fun addFiltersToQuery( diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntities.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntities.kt index c313d045951..a96ff91a770 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntities.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntities.kt @@ -67,40 +67,29 @@ class SearchTrackedEntities( // Add filters from FilterManager repository.addFiltersToQuery(input.selectedProgram, teType) - input.queryData?.let { queryData -> - // iterate through the query data and add to the repository query - for ((dataId, dataValues) in queryData) { - // checks if the dataId is an attribute of the teType - val isTETypeAttribute = getIsTETypeAttribute(input.selectedProgram, dataId, teType) + input.queryDataList?.forEach { data -> + val isTETypeAttribute = getIsTETypeAttribute(input.selectedProgram, data.attributeId, teType) - if (input.selectedProgram != null || isTETypeAttribute) { - // fetches the teAttribute details (isUnique, isOptionSet) - - dataValues?.let { values -> - // normalize values: if the attribute doesn't have custom intent that returns multiple values - // and there are multiple values, join them into a single comma-separated value - val normalizedValues = - if (values.size > 1 && - !customIntentRepository.attributeHasCustomIntentAndReturnsAListOfValues( - dataId, - CustomIntentActionTypeModel.SEARCH, - ) - ) { - mutableListOf(values.joinToString(",")) - } else { - values - } - - val teAttribute = repository.getTEAttribute(dataId) - - repository.addToQuery( - dataId, - normalizedValues, - teAttribute.isUnique, - teAttribute.isOptionSet, - ) + if (input.selectedProgram != null || isTETypeAttribute) { + val normalizedValues = + data.values?.let { + if (it.size > 1 && + !customIntentRepository.attributeHasCustomIntentAndReturnsAListOfValues( + data.attributeId, + CustomIntentActionTypeModel.SEARCH, + ) + ) { + mutableListOf(it.joinToString(",")) + } else { + it + } } - } + + repository.addToQuery( + data.attributeId, + normalizedValues, + data.searchOperator, + ) } } } diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/QueryData.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/QueryData.kt new file mode 100644 index 00000000000..a306466dda0 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/QueryData.kt @@ -0,0 +1,7 @@ +package org.dhis2.tracker.search.model + +data class QueryData( + val attributeId: String, + val values: List?, + val searchOperator: SearchOperator?, +) diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchTrackedEntitiesInput.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchTrackedEntitiesInput.kt index 07c69077884..48d8061fc59 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchTrackedEntitiesInput.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchTrackedEntitiesInput.kt @@ -6,5 +6,5 @@ data class SearchTrackedEntitiesInput( val excludeValues: Set?, val hasStateFilters: Boolean, val isOnline: Boolean, - val queryData: Map?>?, + val queryDataList: List? = null, ) diff --git a/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntitiesTest.kt b/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntitiesTest.kt index d8c89db0806..3cf9ce9cb6d 100644 --- a/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntitiesTest.kt +++ b/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntitiesTest.kt @@ -8,6 +8,8 @@ import org.dhis2.mobile.commons.customintents.CustomIntentRepository import org.dhis2.mobile.commons.error.DomainError import org.dhis2.mobile.commons.model.CustomIntentActionTypeModel import org.dhis2.tracker.search.data.SearchTrackedEntityRepository +import org.dhis2.tracker.search.model.QueryData +import org.dhis2.tracker.search.model.SearchOperator import org.dhis2.tracker.search.model.SearchTrackedEntitiesInput import org.dhis2.tracker.search.model.SearchTrackedEntityAttribute import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult @@ -44,7 +46,19 @@ class SearchTrackedEntitiesTest { fun `invoke should successfully return flow when query has data`() = runTest { // Given - val queryData = mutableMapOf?>("attr1" to listOf("value1"), "attr2" to listOf("value2")) + val queryDataList = + mutableListOf( + QueryData( + attributeId = "attr1", + values = listOf("value1"), + searchOperator = null, + ), + QueryData( + attributeId = "attr2", + values = listOf("value2"), + searchOperator = null, + ), + ) val searchParams = SearchTrackedEntitiesInput( selectedProgram = "programUid", @@ -52,7 +66,7 @@ class SearchTrackedEntitiesTest { excludeValues = hashSetOf(), hasStateFilters = false, isOnline = true, - queryData = queryData, + queryDataList = queryDataList, ) val mockPagingData: PagingData = PagingData.empty() @@ -81,14 +95,12 @@ class SearchTrackedEntitiesTest { verify(repository).addToQuery( dataId = "attr1", dataValues = listOf("value1"), - isUnique = false, - isOptionSet = false, + searchOperator = null, ) verify(repository).addToQuery( dataId = "attr2", dataValues = listOf("value2"), - isUnique = false, - isOptionSet = false, + searchOperator = null, ) verify(repository).fetchResults( isOnline = true, @@ -108,7 +120,7 @@ class SearchTrackedEntitiesTest { excludeValues = hashSetOf(), hasStateFilters = false, isOnline = false, - queryData = null, + queryDataList = null, ) val mockPagingData: PagingData = PagingData.empty() @@ -122,7 +134,7 @@ class SearchTrackedEntitiesTest { // Then assertTrue(result.isSuccess) verify(repository).addFiltersToQuery("programUid", teType) - verify(repository, never()).addToQuery(any(), any(), any(), any()) + verify(repository, never()).addToQuery(any(), any(), any()) verify(repository).fetchResults( isOnline = false, hasStateFilters = false, @@ -142,7 +154,7 @@ class SearchTrackedEntitiesTest { excludeValues = excludedValues, hasStateFilters = false, isOnline = false, - queryData = null, + queryDataList = null, ) val mockPagingData: PagingData = PagingData.empty() @@ -170,7 +182,7 @@ class SearchTrackedEntitiesTest { excludeValues = excludedValues, hasStateFilters = false, isOnline = false, - queryData = null, + queryDataList = null, ) val mockPagingData: PagingData = PagingData.empty() @@ -190,7 +202,14 @@ class SearchTrackedEntitiesTest { fun `invoke should add query for unique attributes`() = runTest { // Given - val queryData = mutableMapOf?>("uniqueAttr" to listOf("exactValue")) + val queryData = + mutableListOf( + QueryData( + attributeId = "uniqueAttr", + values = listOf("exactValue"), + searchOperator = SearchOperator.EQ, + ), + ) val searchParams = SearchTrackedEntitiesInput( selectedProgram = "programUid", @@ -198,7 +217,7 @@ class SearchTrackedEntitiesTest { excludeValues = hashSetOf(), hasStateFilters = false, isOnline = true, - queryData = queryData, + queryDataList = queryData, ) val mockPagingData: PagingData = PagingData.empty() @@ -226,8 +245,7 @@ class SearchTrackedEntitiesTest { verify(repository).addToQuery( dataId = "uniqueAttr", dataValues = listOf("exactValue"), - isUnique = true, - isOptionSet = false, + searchOperator = SearchOperator.EQ, ) } @@ -235,7 +253,14 @@ class SearchTrackedEntitiesTest { fun `invoke should add query for option set attributes`() = runTest { // Given - val queryData = mutableMapOf?>("optionSetAttr" to listOf("optionValue")) + val queryData = + mutableListOf( + QueryData( + attributeId = "optionSetAttr", + values = listOf("optionValue"), + searchOperator = SearchOperator.EQ, + ), + ) val searchParams = SearchTrackedEntitiesInput( selectedProgram = "programUid", @@ -243,7 +268,7 @@ class SearchTrackedEntitiesTest { excludeValues = hashSetOf(), hasStateFilters = false, isOnline = true, - queryData = queryData, + queryDataList = queryData, ) val mockPagingData: PagingData = PagingData.empty() @@ -271,8 +296,7 @@ class SearchTrackedEntitiesTest { verify(repository).addToQuery( dataId = "optionSetAttr", dataValues = listOf("optionValue"), - isUnique = false, - isOptionSet = true, + searchOperator = SearchOperator.EQ, ) } @@ -280,7 +304,14 @@ class SearchTrackedEntitiesTest { fun `invoke should join multiple values when custom intent does not return list`() = runTest { // Given - val queryData = mutableMapOf?>("attr1" to listOf("value1", "value2", "value3")) + val queryData = + mutableListOf( + QueryData( + attributeId = "attr1", + values = listOf("value1", "value2", "value3"), + searchOperator = null, + ), + ) val searchParams = SearchTrackedEntitiesInput( selectedProgram = "programUid", @@ -288,7 +319,7 @@ class SearchTrackedEntitiesTest { excludeValues = hashSetOf(), hasStateFilters = false, isOnline = true, - queryData = queryData, + queryDataList = queryData, ) val mockPagingData: PagingData = PagingData.empty() @@ -316,8 +347,7 @@ class SearchTrackedEntitiesTest { verify(repository).addToQuery( dataId = "attr1", dataValues = listOf("value1,value2,value3"), - isUnique = false, - isOptionSet = false, + searchOperator = null, ) } @@ -325,7 +355,14 @@ class SearchTrackedEntitiesTest { fun `invoke should keep multiple values when custom intent returns list`() = runTest { // Given - val queryData = mutableMapOf?>("attr1" to listOf("value1", "value2", "value3")) + val queryData = + mutableListOf( + QueryData( + attributeId = "attr1", + values = listOf("value1", "value2", "value3"), + searchOperator = null, + ), + ) val searchParams = SearchTrackedEntitiesInput( selectedProgram = "programUid", @@ -333,7 +370,7 @@ class SearchTrackedEntitiesTest { excludeValues = hashSetOf(), hasStateFilters = false, isOnline = true, - queryData = queryData, + queryDataList = queryData, ) val mockPagingData: PagingData = PagingData.empty() @@ -361,8 +398,7 @@ class SearchTrackedEntitiesTest { verify(repository).addToQuery( dataId = "attr1", dataValues = listOf("value1", "value2", "value3"), - isUnique = false, - isOptionSet = false, + searchOperator = null, ) } @@ -370,7 +406,19 @@ class SearchTrackedEntitiesTest { fun `invoke should skip attributes not belonging to teType when no program selected`() = runTest { // Given - val queryData = mutableMapOf?>("attr1" to listOf("value1"), "attr2" to listOf("value2")) + val queryData = + mutableListOf( + QueryData( + attributeId = "attr1", + values = listOf("value1"), + searchOperator = SearchOperator.EQ, + ), + QueryData( + attributeId = "attr2", + values = listOf("value2"), + searchOperator = SearchOperator.LIKE, + ), + ) val searchParams = SearchTrackedEntitiesInput( selectedProgram = null, @@ -378,7 +426,7 @@ class SearchTrackedEntitiesTest { excludeValues = hashSetOf(), hasStateFilters = false, isOnline = false, - queryData = queryData, + queryDataList = queryData, ) val mockPagingData: PagingData = PagingData.empty() @@ -407,8 +455,7 @@ class SearchTrackedEntitiesTest { verify(repository).addToQuery( dataId = "attr1", dataValues = listOf("value1"), - isUnique = false, - isOptionSet = false, + SearchOperator.EQ, ) verify(repository, never()).getTEAttribute("attr2") } @@ -424,7 +471,7 @@ class SearchTrackedEntitiesTest { excludeValues = hashSetOf(), hasStateFilters = false, isOnline = true, - queryData = null, + queryDataList = null, ) val domainError = DomainError.UnexpectedError("Test error") @@ -451,7 +498,7 @@ class SearchTrackedEntitiesTest { excludeValues = hashSetOf(), hasStateFilters = true, isOnline = true, - queryData = null, + queryDataList = null, ) val mockPagingData: PagingData = PagingData.empty() @@ -482,7 +529,7 @@ class SearchTrackedEntitiesTest { excludeValues = hashSetOf(), hasStateFilters = false, isOnline = false, - queryData = null, + queryDataList = null, ) val mockPagingData: PagingData = PagingData.empty() From 0282fc64003a8105e5ce4587a418048fe0619f8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20G=C3=B3mez?= Date: Thu, 26 Feb 2026 15:56:32 +0100 Subject: [PATCH 071/260] feat: Use new Indicator component for feedback [ANDROAPP-7511] (#4689) * feat: [ANDROAPP-7511] Use new Indicator component for feedback - Enable Markdown with useMarkdown flag - For DisplayText use title only with no content * fix: [ANDROAPP-7511] Update default color and value for Indicators --- .../dashboardfragments/indicators/BaseIndicatorRepository.kt | 4 ++-- .../java/dhis2/org/analytics/charts/ui/IndicatorViewHolder.kt | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/BaseIndicatorRepository.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/BaseIndicatorRepository.kt index 7c1f1e179af..d3194241c19 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/BaseIndicatorRepository.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/BaseIndicatorRepository.kt @@ -131,9 +131,9 @@ abstract class BaseIndicatorRepository( ProgramIndicator .builder() .uid(UidGeneratorImpl().generate()) - .displayName(resourceManager.defaultIndicatorLabel()) + .displayName("${ruleAction.content() ?: ""}${ruleEffect.data}") .build(), - "${ruleAction.content() ?: ""}${ruleEffect.data}", + "", null, ruleAction.values["location"] ?: DEFAULT_LOCATION, resourceManager.defaultIndicatorLabel(), diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/IndicatorViewHolder.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/IndicatorViewHolder.kt index 1d21a5552be..13b12ac6e41 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/IndicatorViewHolder.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/IndicatorViewHolder.kt @@ -54,7 +54,7 @@ class IndicatorViewHolder( if (!programIndicatorModel.color.isNullOrEmpty()) { Color(programIndicatorModel.color()) } else { - SurfaceColor.Container + SurfaceColor.ContainerHigh }, content = programIndicatorModel.value ?: "", modifier = @@ -69,6 +69,7 @@ class IndicatorViewHolder( Modifier }, ), + useMarkdown = true, ) Spacer(modifier = Modifier.size(16.dp)) } From f4b9f2e5ba5cf62e0a400b21e53b32288e98c0f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Fri, 27 Feb 2026 12:24:59 +0100 Subject: [PATCH 072/260] test: Implement SearchParametersIntegrationTest.kt (#4684) * test: add SearchParametersViewModelTest.kt * fix: Make suspend functions inside SearchParametersViewModel.kt internal * test: Implement SearchParametersIntegrationTest.kt * ci: add verification metadata * ci: ktlintFormat * test: add copilot feedback --- gradle/verification-metadata.xml | 257 +++++++++++++++++- .../search/SearchParametersIntegrationTest.kt | 138 ++++++++++ 2 files changed, 383 insertions(+), 12 deletions(-) create mode 100644 tracker/src/commonTest/kotlin/org/dhis2/tracker/search/SearchParametersIntegrationTest.kt diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 91c1498ba12..3790393031a 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -4023,6 +4023,11 @@ + + + + + @@ -4031,11 +4036,24 @@ + + + + + + + + + + + + + @@ -4044,11 +4062,24 @@ + + + + + + + + + + + + + @@ -4057,6 +4088,14 @@ + + + + + + + + @@ -4086,6 +4125,14 @@ + + + + + + + + @@ -4110,6 +4157,14 @@ + + + + + + + + @@ -4118,6 +4173,14 @@ + + + + + + + + @@ -4158,6 +4221,14 @@ + + + + + + + + @@ -4174,6 +4245,14 @@ + + + + + + + + @@ -4190,6 +4269,14 @@ + + + + + + + + @@ -4198,6 +4285,14 @@ + + + + + + + + @@ -4230,6 +4325,14 @@ + + + + + + + + @@ -4246,6 +4349,14 @@ + + + + + + + + @@ -4262,6 +4373,14 @@ + + + + + + + + @@ -11053,6 +11172,14 @@ + + + + + + + + @@ -11069,6 +11196,14 @@ + + + + + + + + @@ -11101,6 +11236,14 @@ + + + + + + + + @@ -11109,6 +11252,14 @@ + + + + + + + + @@ -11117,6 +11268,14 @@ + + + + + + + + @@ -11125,6 +11284,14 @@ + + + + + + + + @@ -11133,6 +11300,14 @@ + + + + + + + + @@ -11141,6 +11316,14 @@ + + + + + + + + @@ -12966,18 +13149,15 @@ - - - - - - - - - + + + + + + + + + @@ -14037,6 +14217,11 @@ + + + + + @@ -14053,6 +14238,14 @@ + + + + + + + + @@ -14080,6 +14273,14 @@ + + + + + + + + @@ -14107,6 +14308,14 @@ + + + + + + + + @@ -14123,6 +14332,14 @@ + + + + + + + + @@ -14150,6 +14367,14 @@ + + + + + + + + @@ -14177,6 +14402,14 @@ + + + + + + + + diff --git a/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/SearchParametersIntegrationTest.kt b/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/SearchParametersIntegrationTest.kt new file mode 100644 index 00000000000..debc6b3ef70 --- /dev/null +++ b/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/SearchParametersIntegrationTest.kt @@ -0,0 +1,138 @@ +package org.dhis2.tracker.search + +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.resetMain +import kotlinx.coroutines.test.runTest +import kotlinx.coroutines.test.setMain +import org.dhis2.mobile.commons.coroutine.Dispatcher +import org.dhis2.mobile.commons.resources.StringResourceProvider +import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.input.ui.mapper.toTrackerInputUiState +import org.dhis2.tracker.search.data.SearchParametersRepository +import org.dhis2.tracker.search.domain.FetchSearchParameters +import org.dhis2.tracker.search.model.FetchSearchParametersData +import org.dhis2.tracker.search.model.SearchOperator +import org.dhis2.tracker.search.model.SearchParameterModel +import org.dhis2.tracker.search.ui.state.SearchParametersUiState +import org.dhis2.tracker.search.ui.viewmodel.SearchParametersViewModel +import org.mockito.kotlin.any +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever +import kotlin.test.AfterTest +import kotlin.test.BeforeTest +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNull +import kotlin.test.assertTrue + +@ExperimentalCoroutinesApi +class SearchParametersIntegrationTest { + private val testDispatcher = StandardTestDispatcher() + private val dispatcher = + Dispatcher( + io = testDispatcher, + main = testDispatcher, + default = testDispatcher, + ) + + private val repository: SearchParametersRepository = mock() + private val resourceProvider: StringResourceProvider = mock() + + private lateinit var fetchSearchParameters: FetchSearchParameters + private lateinit var viewModel: SearchParametersViewModel + + @BeforeTest + fun setUp() { + Dispatchers.setMain(testDispatcher) + fetchSearchParameters = FetchSearchParameters(dispatcher, repository) + viewModel = SearchParametersViewModel(resourceProvider) + } + + @AfterTest + fun tearDown() { + Dispatchers.resetMain() + } + + @Test + fun `given min character limit is configured, when user enters exactly min characters, then search proceeds successfully`() = + runTest(testDispatcher) { + // Given + val min = 2 + val teiTypeUid = "teiType123" + val searchParameter = buildSearchParameter(minCharactersToSearch = min) + whenever(repository.getSearchParametersByTrackedEntityType(teiTypeUid)) + .thenReturn(listOf(searchParameter)) + + val fetchResult = + fetchSearchParameters(FetchSearchParametersData(teiTypeUid = teiTypeUid)) + assertTrue(fetchResult.isSuccess) + + // When - user enters exactly min characters + val itemWithExactMinChars = + fetchResult + .getOrNull()!! + .map { it.toTrackerInputUiState().copy(value = "a".repeat(min)) } + viewModel.updateFromExternal(SearchParametersUiState(items = itemWithExactMinChars)) + viewModel.onValidateSearch() + advanceUntilIdle() + + // Then - search proceeds successfully + val validationResult = viewModel.validationResult.first() + assertEquals(true, validationResult) + + // And no error message is shown + val uiState = viewModel.uiState.first() + assertTrue(uiState.items.all { it.error == null }) + } + + @Test + fun `given min character limit, when user enters fewer than min characters, then search fails and error is shown`() = + runTest(testDispatcher) { + // Given + val min = 3 + val teiTypeUid = "teiType123" + val errorMessage = "Minimum $min characters required" + val searchParameter = buildSearchParameter(minCharactersToSearch = min) + whenever(repository.getSearchParametersByTrackedEntityType(teiTypeUid)) + .thenReturn(listOf(searchParameter)) + whenever(resourceProvider.provideString(any(), any())).thenReturn(errorMessage) + + val fetchResult = + fetchSearchParameters(FetchSearchParametersData(teiTypeUid = teiTypeUid)) + assertTrue(fetchResult.isSuccess) + + // When - user enters fewer than min characters + val itemWithInsufficientChars = + fetchResult + .getOrNull()!! + .map { it.toTrackerInputUiState().copy(value = "a".repeat(min - 1)) } + viewModel.updateFromExternal(SearchParametersUiState(items = itemWithInsufficientChars)) + viewModel.onValidateSearch() + advanceUntilIdle() + + // Then - search proceeds unsuccessfully + val validationResult = viewModel.validationResult.first() + assertEquals(false, validationResult) + + // And an error message is shown + val uiState = viewModel.uiState.first() + assertNull(uiState.items.firstOrNull { it.error == null }) + assertEquals(errorMessage, uiState.items.first().error) + } + + private fun buildSearchParameter(minCharactersToSearch: Int): SearchParameterModel = + SearchParameterModel( + uid = "field1", + label = "First Name", + inputType = TrackerInputType.TEXT, + optionSet = null, + customIntentUid = null, + minCharactersToSearch = minCharactersToSearch, + searchOperator = SearchOperator.LIKE, + isUnique = false, + ) +} From ee9bff4964ef0d09e753a7c6e93320c51c0de782 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Tar=C3=AD?= Date: Mon, 2 Mar 2026 14:57:24 +0100 Subject: [PATCH 073/260] chore: [ANDROAPP-7525] adapt to changes in sdk event service and enrollment aoc (#4691) * chore: [ANDROAPP-7525] update sdk and dependency metadata # Conflicts: # gradle/verification-metadata.xml * chore: [ANDROAPP-7525] update non editable status code and string * chore: [ANDROAPP-7525] add new mandatory attributeOptionCombo to enrollments * chore: [ANDROAPP-7525] fix format * chore: [ANDROAPP-7525] fix test * chore: [ANDROAPP-7525] change string code name in all languages --- .../scheduling/SchedulingDialogUiTest.kt | 6 +++- .../EventCaptureFormPresenter.kt | 4 +-- .../providers/EventDetailResourcesProvider.kt | 4 +-- app/src/main/res/values-ar/strings.xml | 2 +- app/src/main/res/values-cs/strings.xml | 2 +- app/src/main/res/values-es-rES/strings.xml | 2 +- app/src/main/res/values-es/strings.xml | 2 +- app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-lo/strings.xml | 2 +- app/src/main/res/values-nl/strings.xml | 2 +- app/src/main/res/values-pt/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-uk/strings.xml | 2 +- app/src/main/res/values-vi/strings.xml | 2 +- app/src/main/res/values-zh-rCN/strings.xml | 2 +- app/src/main/res/values-zh/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- .../data/dhislogic/DhisEnrollmentUtilsTest.kt | 2 ++ .../dhislogic/EnrollmentEventGeneratorTest.kt | 1 + .../sorting/SearchSortingValueSetterTest.kt | 1 + ...pCoordinateFieldToFeatureCollectionTest.kt | 3 ++ .../MapDataElementToFeatureTest.kt | 3 ++ .../EventCaptureRepositoryImplTest.kt | 1 + .../usescases/notes/NotesRepositoryTest.kt | 7 ++++- .../noteDetail/NoteDetailRepositoryTest.kt | 7 ++++- .../searchTrackEntity/SearchRepositoryTest.kt | 1 + .../ui/mapper/TEICardMapperTest.kt | 2 ++ .../DashboardRepositoryImplTest.kt | 2 ++ .../teiDashboard/TeiDashboardPresenterTest.kt | 7 ++++- .../EventIndicatorRepositoryTest.kt | 7 ++++- .../TrackerAnalyticsRepositoryTest.kt | 7 ++++- .../RelationshipPresenterTest.kt | 1 + .../scheduling/SchedulingViewModelTest.kt | 7 ++++- .../TeiProgramListRepositoryImplTest.kt | 2 ++ .../ui/mapper/InfoBarMapperTest.kt | 1 + .../ui/mapper/QuickActionsMapperTest.kt | 1 + .../ui/mapper/TEIDetailMapperTest.kt | 1 + .../analytics/charts/ChartsRepositoryTest.kt | 2 ++ gradle/libs.versions.toml | 2 +- gradle/verification-metadata.xml | 31 +++++++++++++++++++ 40 files changed, 115 insertions(+), 26 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/dialogs/scheduling/SchedulingDialogUiTest.kt b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/dialogs/scheduling/SchedulingDialogUiTest.kt index 439cd182a0d..63bb99534cd 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/dialogs/scheduling/SchedulingDialogUiTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/dialogs/scheduling/SchedulingDialogUiTest.kt @@ -34,7 +34,11 @@ class SchedulingDialogUiTest : BaseTest() { val composeTestRule = createAndroidComposeRule() private val viewModel: SchedulingViewModel = mock() - private val enrollment = Enrollment.builder().uid("enrollmentUid").build() + private val enrollment = Enrollment + .builder() + .uid("enrollmentUid") + .attributeOptionCombo("attributeOptionComboUid") + .build() private val overdueSubtitle = "Overdue subtitle" diff --git a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/eventCaptureFragment/EventCaptureFormPresenter.kt b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/eventCaptureFragment/EventCaptureFormPresenter.kt index 86ca05bc1c7..4bf38c2a121 100644 --- a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/eventCaptureFragment/EventCaptureFormPresenter.kt +++ b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/eventCaptureFragment/EventCaptureFormPresenter.kt @@ -72,8 +72,8 @@ class EventCaptureFormPresenter( 1, ) to false - EventNonEditableReason.ORGUNIT_IS_NOT_IN_CAPTURE_SCOPE -> - resourceManager.getString(R.string.edition_orgunit_capture_scope) to + EventNonEditableReason.ORGUNIT_IS_NOT_IN_USER_SCOPE -> + resourceManager.getString(R.string.edition_orgunit_user_scope) to false } view.showNonEditableMessage(reason, canBeReOpened) diff --git a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventDetails/providers/EventDetailResourcesProvider.kt b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventDetails/providers/EventDetailResourcesProvider.kt index 5057dbcf06d..5fe7fc1a62f 100644 --- a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventDetails/providers/EventDetailResourcesProvider.kt +++ b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventDetails/providers/EventDetailResourcesProvider.kt @@ -46,8 +46,8 @@ class EventDetailResourcesProvider( R.string.edition_enrollment_is_no_open_V2, 1, ) - EventNonEditableReason.ORGUNIT_IS_NOT_IN_CAPTURE_SCOPE -> - resourceManager.getString(R.string.edition_orgunit_capture_scope) + EventNonEditableReason.ORGUNIT_IS_NOT_IN_USER_SCOPE -> + resourceManager.getString(R.string.edition_orgunit_user_scope) } fun provideButtonUpdate() = resourceManager.getString(R.string.update) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 178250337e8..795f1ac441b 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -799,7 +799,7 @@ ليس لديك إذن لتحرير هذه البيانات هذه البيانات غير قابلة للتعديل لأنه تم اغلاق الوحدة التنظيمية ليس لديك إذن لتحرير هذه البيانات - لا يمكنك تحرير البيانات من هذه الوحدة التنظيمية + لا يمكنك تحرير البيانات من هذه الوحدة التنظيمية إعادة البحث البحث عبر الإتصال بالسيرفر عن طريق الإنترنت ارجع الرسالة التالية: تحذير قواعد البرنامج diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 52e7f792fb0..7c95d05181f 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -817,7 +817,7 @@ K úpravě těchto údajů nemáte oprávnění Tato data nelze upravovat, protože organizační jednotka je zavřená K úpravě těchto údajů nemáte oprávnění - Data z této organizační jednotky nemůžete upravovat + Data z této organizační jednotky nemůžete upravovat Obnovit vyhledávání Online vyhledávání vrátilo následující zprávu: Upozornění na pravidla programu diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 4040f9348fb..15df8b14832 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -775,7 +775,7 @@ No tiene permisos de edición para estos datos. Los datos no son editables por que la unidad organizativa está cerrada. No tiene permisos de edición para estos datos. - No puede editar datos en esta unidad organizativa. + No puede editar datos en esta unidad organizativa. Reiniciar búsqueda La búsqueda online a devuelto este mensaje: Advertencia de reglas del programa diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index d4332bf6a1b..8b22f556b2a 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -811,7 +811,7 @@ No tiene permisos de edición para estos datos. Los datos no son editables por que la unidad organizativa está cerrada. No tiene permisos de edición para estos datos. - No puede editar datos en esta unidad organizativa. + No puede editar datos en esta unidad organizativa. Reiniciar búsqueda La búsqueda online a devuelto este mensaje: Advertencia de reglas del programa diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 0267efee3d4..9cdc56e5576 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -779,7 +779,7 @@ Cette donnée n\'est pas modifiable car son heure d\'édition est expirée Vous n\'êtes pas autorisé à modifier ces données Vous n\'êtes pas autorisé à modifier ces données - Vous ne pouvez pas modifier les données de cette unité organisationnelle + Vous ne pouvez pas modifier les données de cette unité organisationnelle Réinitialiser la recherche La recherche en ligne a renvoyé le message suivant : Avertissement relatif aux règles du programme diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index fca80f9df6a..c6ab3e8edc6 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -773,7 +773,7 @@ ທ່ານບໍ່ໄດ້ຮັບອານຸຍາດໃນການແກ້ໄຂຂໍ້ມູນນີ້ ຂໍ້ມູນນີ້ບໍ່ສາມາດແກ້ໄຂໄດ້ເນື່ອງຈາກຫົວຫນ່ວຍການຈັດຕັ້ງຖືກປິດໃວ້ຢູ່ ທ່ານບໍ່ໄດ້ຮັບອານຸຍາດໃນການແກ້ໄຂຂໍ້ມູນນີ້ - ທ່ານບໍ່ສາມາດແກ້ໄຂຂໍ້ມູນຈາກຫົວຫນ່ວຍການຈັດຕັ້ງນີ້ໄດ້ + ທ່ານບໍ່ສາມາດແກ້ໄຂຂໍ້ມູນຈາກຫົວຫນ່ວຍການຈັດຕັ້ງນີ້ໄດ້ ລີເຊັດການຄົ້ນຫາ ການຄົ້ນຫາອອນໄລນ໌ສົ່ງຂໍ້ຄວາມຕໍ່ໄປນີ້: ຂໍ້ຄວນລະວັງກົດຂອງສາຍງານ diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 5ca9c9d85ca..0a62a1985e0 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -782,7 +782,7 @@ U heeft geen toestemming om deze gegevens te bewerken Deze gegevens zijn niet bewerkbaar omdat de organisatie-eenheid gesloten is U heeft geen toestemming om deze gegevens te bewerken - U kunt gegevens van deze organisatie-eenheid niet bewerken + U kunt gegevens van deze organisatie-eenheid niet bewerken Zoeken resetten De online zoekopdracht leverde het volgende bericht op: Waarschuwing programmaregels diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 022335f6705..d3ab2b35547 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -808,7 +808,7 @@ Não tem permissão para editar estes dados Estes dados não são editáveis porque a unidade organizacional está encerrada Não tem permissão para editar estes dados - Não é possível editar dados desta unidade organizacional + Não é possível editar dados desta unidade organizacional Repor a pesquisa A pesquisa em linha deu a seguinte mensagem: Aviso de regras do programa diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 026770ee294..f24f2038586 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -776,7 +776,7 @@ У Вас нет прав на редактирование этих данных Эти данные нельзя редактировать, потому что организационное подразделение закрыто У вас нет прав на редактирование этих данных - Вы не можете редактировать данные из этой Организационной единицы + Вы не можете редактировать данные из этой Организационной единицы Сброс поиска Онлайн поиск дал следующее сообщение: Предупреждение о правилах программы diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 2a103ab6774..5d026635f3f 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -795,7 +795,7 @@ Ви не маєте дозволу редагувати ці дані Ці дані не можна редагувати, оскільки організаційний підрозділ закрито Ви не маєте дозволу редагувати ці дані - Ви не можете редагувати дані з цього організаційного підрозділу + Ви не можете редагувати дані з цього організаційного підрозділу Скинути пошук Онлайн-пошук дав таке повідомлення: Попередження про правила програми diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 1e16d6b8b29..30f4c979edc 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -804,7 +804,7 @@ Bạn không có quyền chỉnh sửa dữ liệu này Dữ liệu này không thể sửa bởi vì đơn vị đã bị đóng Bạn không có quyền chỉnh sửa dữ liệu này - Bạn không thể chỉnh sửa dữ liệu từ đơn vị này + Bạn không thể chỉnh sửa dữ liệu từ đơn vị này Đặt lại Tìm Kiếm Tìm kiếm trực tuyến trả về tin nhắn sau: Cảnh báo quy tắc chương trình diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 59694fa102e..580b97a7e34 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -804,7 +804,7 @@ 您无权编辑此数据 此数据不可修改,因为单位部门已关闭 您无权编辑此数据 - 您无法编辑此机构的数据 + 您无法编辑此机构的数据 重置搜索 网上搜索返回如下信息: 项目规则警告 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 6ab1c89314f..8a0f0c97aa0 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -811,7 +811,7 @@ 您无权编辑此数据 此数据不可修改,因为单位部门已关闭 您无权编辑此数据 - 您无法编辑此机构的数据 + 您无法编辑此机构的数据 重置搜索 网上搜索返回如下信息: 项目规则警告 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 43c1d6df602..f4aa3019257 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -827,7 +827,7 @@ You do not have permission to edit this data This data is not editable because the organization unit is closed You do not have permission to edit this data - You cannot edit data from this organisation unit + You cannot edit data from this organisation unit Reset search The online search returned the following message: Program rules warning diff --git a/app/src/test/java/org/dhis2/data/dhislogic/DhisEnrollmentUtilsTest.kt b/app/src/test/java/org/dhis2/data/dhislogic/DhisEnrollmentUtilsTest.kt index 0fe12fafebd..bc018e273e9 100644 --- a/app/src/test/java/org/dhis2/data/dhislogic/DhisEnrollmentUtilsTest.kt +++ b/app/src/test/java/org/dhis2/data/dhislogic/DhisEnrollmentUtilsTest.kt @@ -47,6 +47,7 @@ class DhisEnrollmentUtilsTest { .builder() .uid("enrollmentUid") .status(EnrollmentStatus.CANCELLED) + .attributeOptionCombo("attributeOptionComboUid") .build() val result = dhisEnrollmentUtils.isEventEnrollmentOpen( @@ -92,6 +93,7 @@ class DhisEnrollmentUtilsTest { .builder() .uid("enrollmentUid") .status(EnrollmentStatus.ACTIVE) + .attributeOptionCombo("attributeOptionComboUid") .build() val result = dhisEnrollmentUtils.isEventEnrollmentOpen( diff --git a/app/src/test/java/org/dhis2/data/dhislogic/EnrollmentEventGeneratorTest.kt b/app/src/test/java/org/dhis2/data/dhislogic/EnrollmentEventGeneratorTest.kt index 10e238194b7..77fc808aa2d 100644 --- a/app/src/test/java/org/dhis2/data/dhislogic/EnrollmentEventGeneratorTest.kt +++ b/app/src/test/java/org/dhis2/data/dhislogic/EnrollmentEventGeneratorTest.kt @@ -164,6 +164,7 @@ class EnrollmentEventGeneratorTest { GregorianCalendar(2019, 0, 1).time, ).program(PROGRAM_UID) .organisationUnit(ENROLLMENT_ORG_UNIT) + .attributeOptionCombo("attributeOptionComboUid") .build() private fun mockedProgram(useFirstStage: Boolean) = diff --git a/app/src/test/java/org/dhis2/data/sorting/SearchSortingValueSetterTest.kt b/app/src/test/java/org/dhis2/data/sorting/SearchSortingValueSetterTest.kt index 089d9537808..3770540ec16 100644 --- a/app/src/test/java/org/dhis2/data/sorting/SearchSortingValueSetterTest.kt +++ b/app/src/test/java/org/dhis2/data/sorting/SearchSortingValueSetterTest.kt @@ -547,6 +547,7 @@ class SearchSortingValueSetterTest { .status(EnrollmentStatus.ACTIVE) .program("programUid") .enrollmentDate(Date.from(Instant.parse("2020-01-01T00:00:00.00Z"))) + .attributeOptionCombo("attributeOptionComboUid") .build(), ) tei = diff --git a/app/src/test/java/org/dhis2/uicomponents/map/geometry/MapCoordinateFieldToFeatureCollectionTest.kt b/app/src/test/java/org/dhis2/uicomponents/map/geometry/MapCoordinateFieldToFeatureCollectionTest.kt index 24c0aa71ddc..55bcaa81c08 100644 --- a/app/src/test/java/org/dhis2/uicomponents/map/geometry/MapCoordinateFieldToFeatureCollectionTest.kt +++ b/app/src/test/java/org/dhis2/uicomponents/map/geometry/MapCoordinateFieldToFeatureCollectionTest.kt @@ -76,6 +76,7 @@ class MapCoordinateFieldToFeatureCollectionTest { .builder() .uid("enrollmentUid") .trackedEntityInstance("teiUid") + .attributeOptionCombo("attributeOptionComboUid") .build(), Geometry .builder() @@ -104,6 +105,7 @@ class MapCoordinateFieldToFeatureCollectionTest { .builder() .uid("enrollmentUid") .trackedEntityInstance("teiUid") + .attributeOptionCombo("attributeOptionComboUid") .build(), Geometry .builder() @@ -132,6 +134,7 @@ class MapCoordinateFieldToFeatureCollectionTest { .builder() .uid("enrollmentUid") .trackedEntityInstance("teiUid") + .attributeOptionCombo("attributeOptionComboUid") .build(), Geometry .builder() diff --git a/app/src/test/java/org/dhis2/uicomponents/map/geometry/mapper/featurecollection/MapDataElementToFeatureTest.kt b/app/src/test/java/org/dhis2/uicomponents/map/geometry/mapper/featurecollection/MapDataElementToFeatureTest.kt index 109afa7ac23..4945cb931f5 100644 --- a/app/src/test/java/org/dhis2/uicomponents/map/geometry/mapper/featurecollection/MapDataElementToFeatureTest.kt +++ b/app/src/test/java/org/dhis2/uicomponents/map/geometry/mapper/featurecollection/MapDataElementToFeatureTest.kt @@ -85,6 +85,7 @@ class MapDataElementToFeatureTest { .builder() .uid("enrollmentUid") .trackedEntityInstance("teiUid") + .attributeOptionCombo("attributeOptionComboUid") .build(), Geometry .builder() @@ -113,6 +114,7 @@ class MapDataElementToFeatureTest { .builder() .uid("enrollmentUid") .trackedEntityInstance("teiUid") + .attributeOptionCombo("attributeOptionComboUid") .build(), Geometry .builder() @@ -141,6 +143,7 @@ class MapDataElementToFeatureTest { .builder() .uid("enrollmentUid") .trackedEntityInstance("teiUid") + .attributeOptionCombo("attributeOptionComboUid") .build(), Geometry .builder() diff --git a/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImplTest.kt b/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImplTest.kt index 263ca795f01..6329a7dbeb8 100644 --- a/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImplTest.kt +++ b/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImplTest.kt @@ -130,6 +130,7 @@ class EventCaptureRepositoryImplTest { .builder() .uid(trackerEventEnrollmentUid) .status(EnrollmentStatus.CANCELLED) + .attributeOptionCombo("attributeOptionComboUid") .build() val repository = diff --git a/app/src/test/java/org/dhis2/usescases/notes/NotesRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/notes/NotesRepositoryTest.kt index c51061d5fca..87cb0762bcd 100644 --- a/app/src/test/java/org/dhis2/usescases/notes/NotesRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/usescases/notes/NotesRepositoryTest.kt @@ -174,6 +174,11 @@ class NotesRepositoryTest { .eq(teiUid) .one() .blockingGet(), - ) doReturn Enrollment.builder().uid(enrollmentUid).build() + ) doReturn + Enrollment + .builder() + .uid(enrollmentUid) + .attributeOptionCombo("attributeOptionComboUid") + .build() } } diff --git a/app/src/test/java/org/dhis2/usescases/notes/noteDetail/NoteDetailRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/notes/noteDetail/NoteDetailRepositoryTest.kt index e228758c385..c8c2fd556ae 100644 --- a/app/src/test/java/org/dhis2/usescases/notes/noteDetail/NoteDetailRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/usescases/notes/noteDetail/NoteDetailRepositoryTest.kt @@ -153,6 +153,11 @@ class NoteDetailRepositoryTest { .eq(teiUid) .one() .blockingGet(), - ) doReturn Enrollment.builder().uid("EnrollmentUid").build() + ) doReturn + Enrollment + .builder() + .uid("EnrollmentUid") + .attributeOptionCombo("attributeOptionComboUid") + .build() } } diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryTest.kt index 248187774ea..e67ade57eed 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryTest.kt @@ -465,6 +465,7 @@ class SearchRepositoryTest { .organisationUnit(orgUnitUid) .program(programUid) .status(status) + .attributeOptionCombo("attributeOptionComboUid") .build() private fun createEvent( diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapperTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapperTest.kt index 54ab9118a00..8e4c670254d 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapperTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapperTest.kt @@ -135,6 +135,7 @@ class TEICardMapperTest { .uid("EnrollmentUid") .program("programUid") .status(EnrollmentStatus.COMPLETED) + .attributeOptionCombo("attributeOptionComboUid") .build(), ) setAttributeValues(attributeValues) @@ -167,6 +168,7 @@ class TEICardMapperTest { .builder() .uid("EnrollmentUid") .followUp(true) + .attributeOptionCombo("attributeOptionComboUid") .build(), ) } diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/DashboardRepositoryImplTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/DashboardRepositoryImplTest.kt index 8e81092c0b1..3fe08ab4fac 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/DashboardRepositoryImplTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/DashboardRepositoryImplTest.kt @@ -102,6 +102,7 @@ class DashboardRepositoryImplTest { .uid("enrollment_1") .deleted(true) .trackedEntityInstance(teiUid) + .attributeOptionCombo("attributeOptionComboUid") .build() val enrollment2 = getMockingEnrollment() @@ -588,6 +589,7 @@ class DashboardRepositoryImplTest { Enrollment .builder() .uid("enrollmentUid") + .attributeOptionCombo("attributeOptionComboUid") .build() private fun getMockSingleEvent(): Event = diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiDashboardPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiDashboardPresenterTest.kt index fdc8041f68f..ed5c643f437 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiDashboardPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiDashboardPresenterTest.kt @@ -74,7 +74,12 @@ class TeiDashboardPresenterTest { .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() val trackedEntityInstance = TrackedEntityInstance.builder().uid(teiUid).build() - val enrollment = Enrollment.builder().uid("enrollmentUid").build() + val enrollment = + Enrollment + .builder() + .uid("enrollmentUid") + .attributeOptionCombo("attributeOptionComboUid") + .build() val programStages = listOf(ProgramStage.builder().uid("programStageUid").build()) val trackedEntityAttributes = listOf( diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/EventIndicatorRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/EventIndicatorRepositoryTest.kt index 6ef547a9758..c3623f11e80 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/EventIndicatorRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/EventIndicatorRepositoryTest.kt @@ -70,7 +70,12 @@ class EventIndicatorRepositoryTest { .eq("programUid") .one() .blockingGet(), - ) doReturn Enrollment.builder().uid("enrollmentUid").build() + ) doReturn + Enrollment + .builder() + .uid("enrollmentUid") + .attributeOptionCombo("attributeOptionComboUid") + .build() whenever( resourceManager.sectionIndicators(), ) doReturn "Indicators" diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/TrackerAnalyticsRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/TrackerAnalyticsRepositoryTest.kt index a9ae3d0ccb1..818520bae8e 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/TrackerAnalyticsRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/TrackerAnalyticsRepositoryTest.kt @@ -76,7 +76,12 @@ class TrackerAnalyticsRepositoryTest { .eq("programUid") .one() .blockingGet(), - ) doReturn Enrollment.builder().uid("enrollmentUid").build() + ) doReturn + Enrollment + .builder() + .uid("enrollmentUid") + .attributeOptionCombo("attributeOptionComboUid") + .build() whenever( resourceManager.sectionCharts(), ) doReturn "Charts" diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/relationships/RelationshipPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/relationships/RelationshipPresenterTest.kt index bbc4d713712..36fb4159bd1 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/relationships/RelationshipPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/relationships/RelationshipPresenterTest.kt @@ -245,6 +245,7 @@ class RelationshipPresenterTest { Enrollment .builder() .uid("enrollmentUid") + .attributeOptionCombo("attributeOptionComboUid") .build(), ) diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/dialogs/scheduling/SchedulingViewModelTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/dialogs/scheduling/SchedulingViewModelTest.kt index 7ad7accf8d9..14400aa54d3 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/dialogs/scheduling/SchedulingViewModelTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/dialogs/scheduling/SchedulingViewModelTest.kt @@ -33,7 +33,12 @@ class SchedulingViewModelTest { private val testingDispatcher = UnconfinedTestDispatcher() - private val enrollment = Enrollment.builder().uid(ENROLLMENT_UID).build() + private val enrollment = + Enrollment + .builder() + .uid(ENROLLMENT_UID) + .attributeOptionCombo("attributeOptionComboUid") + .build() private val programStage = ProgramStage.builder().uid(STAGE).build() private val enrollmentObjectRepository: EnrollmentObjectRepository = diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListRepositoryImplTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListRepositoryImplTest.kt index 74d2256fe3b..ec2de96bd51 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListRepositoryImplTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListRepositoryImplTest.kt @@ -76,6 +76,7 @@ class TeiProgramListRepositoryImplTest { Enrollment .builder() .uid("enrollmentUid") + .attributeOptionCombo("attributeOptionComboUid") .build() val testObservable = @@ -142,6 +143,7 @@ class TeiProgramListRepositoryImplTest { Enrollment .builder() .uid("enrollmentUid") + .attributeOptionCombo("attributeOptionComboUid") .build() val testObservable = diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/InfoBarMapperTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/InfoBarMapperTest.kt index 8a4ee17d24d..b52bee833c6 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/InfoBarMapperTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/InfoBarMapperTest.kt @@ -165,6 +165,7 @@ class InfoBarMapperTest { .status(status) .followUp(followup) .program("Program1Uid") + .attributeOptionCombo("attributeOptionComboUid") .build() private fun setPrograms() = diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/QuickActionsMapperTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/QuickActionsMapperTest.kt index af590ae0550..2343906cd72 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/QuickActionsMapperTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/QuickActionsMapperTest.kt @@ -117,6 +117,7 @@ class QuickActionsMapperTest { .status(status) .followUp(followup) .program("Program1Uid") + .attributeOptionCombo("attributeOptionComboUid") .build() val tei = TrackedEntityInstance diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/TEIDetailMapperTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/TEIDetailMapperTest.kt index d3ec64daaa7..f8c2e9e03d4 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/TEIDetailMapperTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/TEIDetailMapperTest.kt @@ -124,6 +124,7 @@ class TEIDetailMapperTest { .status(EnrollmentStatus.COMPLETED) .program("Program1Uid") .organisationUnit("orgUnitUid") + .attributeOptionCombo("attributeOptionComboUid") .build() private fun setPrograms() = diff --git a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ChartsRepositoryTest.kt b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ChartsRepositoryTest.kt index 416e55b4a47..f9f6a6001eb 100644 --- a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ChartsRepositoryTest.kt +++ b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ChartsRepositoryTest.kt @@ -80,6 +80,7 @@ class ChartsRepositoryTest { .uid("enrollmentUid") .program("programUid") .trackedEntityInstance(null) + .attributeOptionCombo("attributeOptionComboUid") .build() val result = repository.getAnalyticsForEnrollment("enrollmentUid") assertTrue( @@ -539,6 +540,7 @@ class ChartsRepositoryTest { .uid("enrollmentUid") .program("programUid") .trackedEntityInstance("teiUid") + .attributeOptionCombo("attributeOptionComboUid") .build() } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index dcf4cf283ef..677c0a4a363 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -11,7 +11,7 @@ kotlin = '2.2.21' dagger = '2.57.2' jacoco = '0.8.14' designSystem = "0.7.0-SNAPSHOT" -dhis2sdk = "1.14.0-20260219.101444-21" +dhis2sdk = "1.14.0-20260226.083755-24" ruleEngine = "3.6.0" expressionParser = "1.3.1" appcompat = "1.7.1" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 3790393031a..702f5acb887 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -10045,6 +10045,11 @@ + + + + + @@ -10089,6 +10094,14 @@ + + + + + + + + @@ -10161,6 +10174,11 @@ + + + + + @@ -10201,6 +10219,14 @@ + + + + + + + + @@ -14119,6 +14145,11 @@ + + + + + From 1b295263d9705dafca75a3b3e45af97e28662d90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Tue, 3 Mar 2026 12:36:51 +0100 Subject: [PATCH 074/260] fix: Replace .height(columnHeightDp) from MainContent.kt by fillMaxHeight() (#4679) --- .../java/org/dhis2/composetable/ui/TextInput.kt | 4 +--- .../ui/home/screens/components/MainContent.kt | 16 +++------------- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/compose-table/src/main/java/org/dhis2/composetable/ui/TextInput.kt b/compose-table/src/main/java/org/dhis2/composetable/ui/TextInput.kt index 749d73e0856..c9d8d98657c 100644 --- a/compose-table/src/main/java/org/dhis2/composetable/ui/TextInput.kt +++ b/compose-table/src/main/java/org/dhis2/composetable/ui/TextInput.kt @@ -9,7 +9,6 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentHeight @@ -76,8 +75,7 @@ fun TextInput( .background( color = Color.White, shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp), - ).padding(start = 16.dp, end = 4.dp, top = 16.dp, bottom = 4.dp) - .imePadding(), + ).padding(start = 16.dp, end = 4.dp, top = 16.dp, bottom = 4.dp), verticalArrangement = spacedBy(8.dp), ) { InputTitle(textInputModel.mainLabel, textInputModel.secondaryLabels) diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/MainContent.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/MainContent.kt index 127195531c1..257a1281000 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/MainContent.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/MainContent.kt @@ -8,8 +8,8 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.absolutePadding +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size @@ -38,9 +38,6 @@ import androidx.compose.ui.draw.shadow import androidx.compose.ui.focus.onFocusChanged import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.FirstBaseline -import androidx.compose.ui.layout.onGloballyPositioned -import androidx.compose.ui.layout.onSizeChanged -import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -89,8 +86,6 @@ fun MainContent( val focusManager = LocalFocusManager.current val search by manageStockViewModel.scanText.collectAsState() val settingsUiState by viewModel.settingsUiState.collectAsState() - var columnHeightDp by remember { mutableStateOf(0.dp) } - val localDensity = LocalDensity.current val tablePadding = getTablePadding(backdropState.isRevealed) var tableResizeActions by remember { mutableStateOf(null) @@ -99,12 +94,7 @@ fun MainContent( Column( modifier = Modifier - .fillMaxWidth() - .onGloballyPositioned { coordinates -> - columnHeightDp = with(localDensity) { coordinates.size.height.toDp() } - }.onSizeChanged { coordinates -> - columnHeightDp = with(localDensity) { coordinates.height.toDp() } - }, + .fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally, ) { Row( @@ -265,7 +255,7 @@ fun MainContent( modifier = Modifier .padding(bottom = tablePadding) - .height(columnHeightDp), + .fillMaxHeight(), ) { if (( manageStockViewModel.dataEntryUiState From 04cb2ef40cd4d18bb2700b0e551636f54bd19fbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Thu, 5 Mar 2026 06:44:04 +0100 Subject: [PATCH 075/260] Androapp 7534 refactor data set table view model to improve asynchrony (#4705) * test: add withContext when render datasets in the UI * fix: Pre compute overwrittenWidths in IO thread before in main context. * fix: Preserve user resize while loading * fix: Removed async {...}.await * fix: Use launchUseCase extension to handle idling resources * refactor: remove loading state when loading dataset tables * test: improve DataSetTableViewModelTest.kt with two sections stub * test: improve SchedulingDialogUiTest.kt * refactor: Make updateFileLoadingState in line without a coroutine given that it is already called from a coroutine --- .../ui/viewModel/DataSetTableViewModel.kt | 248 +++++++++--------- .../ui/viewModel/DataSetTableViewModelTest.kt | 20 +- .../usescases/datasets/DataSetTableRobot.kt | 4 +- .../scheduling/SchedulingDialogUiTest.kt | 12 +- 4 files changed, 144 insertions(+), 140 deletions(-) diff --git a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/viewModel/DataSetTableViewModel.kt b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/viewModel/DataSetTableViewModel.kt index fce2ed7f0ff..3c3511eba23 100644 --- a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/viewModel/DataSetTableViewModel.kt +++ b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/viewModel/DataSetTableViewModel.kt @@ -121,65 +121,51 @@ internal class DataSetTableViewModel( } else { dataSetInstanceData.dataSetSections.firstOrNull()?.uid ?: NO_SECTION_UID } - _dataSetScreenState.value = - DataSetScreenState.Loaded( - dataSetDetails = - dataSetInstanceData.dataSetDetails.copy( - customTitle = - dataSetInstanceData.dataSetDetails.customTitle.copy( - header = dataSetSectionTitle, - ), - ), - dataSetSections = dataSetInstanceData.dataSetSections, - renderingConfig = dataSetInstanceData.dataSetRenderingConfig, - dataSetSectionTable = - DataSetSectionTable( - sectionToLoad, - emptyList(), - overridingDimensions = overwrittenWidths(sectionToLoad), - loading = true, - ), - initialSection = dataSetInstanceData.initialSectionToLoad, - selectedCellInfo = CellSelectionState.Default(TableSelection.Unselected()), - ) - - val sectionTable = async { sectionData(sectionToLoad) } + val initialDimensions = overwrittenWidths(sectionToLoad) + withContext(dispatcher.main()) { + _dataSetScreenState.value = + DataSetScreenState.Loaded( + dataSetDetails = + dataSetInstanceData.dataSetDetails.copy( + customTitle = + dataSetInstanceData.dataSetDetails.customTitle.copy( + header = dataSetSectionTitle, + ), + ), + dataSetSections = dataSetInstanceData.dataSetSections, + renderingConfig = dataSetInstanceData.dataSetRenderingConfig, + dataSetSectionTable = + DataSetSectionTable( + sectionToLoad, + emptyList(), + overridingDimensions = initialDimensions, + loading = true, + ), + initialSection = dataSetInstanceData.initialSectionToLoad, + selectedCellInfo = CellSelectionState.Default(TableSelection.Unselected()), + ) + } - _dataSetScreenState.update { - when (it) { - is DataSetScreenState.Loaded -> - it.copy( - dataSetDetails = - dataSetInstanceData.dataSetDetails.copy( - customTitle = - dataSetInstanceData.dataSetDetails.customTitle.copy( - header = dataSetSectionTitle, - ), - ), - dataSetSectionTable = - DataSetSectionTable( - sectionToLoad, - sectionTable.await(), - overridingDimensions = overwrittenWidths(sectionToLoad), - loading = false, - ), - ) + val tableModels = sectionData(sectionToLoad) - DataSetScreenState.Loading -> - DataSetScreenState.Loaded( - dataSetDetails = dataSetInstanceData.dataSetDetails, - dataSetSections = dataSetInstanceData.dataSetSections, - renderingConfig = dataSetInstanceData.dataSetRenderingConfig, - dataSetSectionTable = - DataSetSectionTable( - sectionToLoad, - sectionTable.await(), - overridingDimensions = overwrittenWidths(sectionToLoad), - loading = true, - ), - initialSection = initialSection, - selectedCellInfo = CellSelectionState.Default(TableSelection.Unselected()), - ) + withContext(dispatcher.main()) { + _dataSetScreenState.update { + (it as? DataSetScreenState.Loaded)?.copy( + dataSetDetails = + dataSetInstanceData.dataSetDetails.copy( + customTitle = + dataSetInstanceData.dataSetDetails.customTitle.copy( + header = dataSetSectionTitle, + ), + ), + dataSetSectionTable = + DataSetSectionTable( + sectionToLoad, + tableModels, + overridingDimensions = it.dataSetSectionTable.overridingDimensions, + loading = false, + ), + ) ?: it } } } @@ -189,65 +175,69 @@ internal class DataSetTableViewModel( if (_dataSetScreenState.value.currentSection() == sectionUid) return sectionChangeJob?.takeIf { it.isActive }?.cancel() sectionChangeJob = - viewModelScope.launch(dispatcher.io()) { + launchUseCase(dispatcher.io()) { val selectedSectionIndex = (dataSetScreenState.value as? DataSetScreenState.Loaded) ?.dataSetSections ?.indexOfFirst { it.uid == sectionUid } - CoroutineTracker.increment() - _dataSetScreenState.update { - if (it is DataSetScreenState.Loaded) { - val dataSetSectionTitle = - if (it.dataSetDetails.customTitle.isConfiguredTitle) { - it.dataSetDetails.customTitle.header - } else { - it.dataSetSections.firstOrNull { section -> section.uid == sectionUid }?.title - } - it.copy( - dataSetDetails = - it.dataSetDetails.copy( - customTitle = - DataSetCustomTitle( - header = dataSetSectionTitle, - subHeader = it.dataSetDetails.customTitle.subHeader, - textAlignment = it.dataSetDetails.customTitle.textAlignment, - isConfiguredTitle = it.dataSetDetails.customTitle.isConfiguredTitle, - ), - ), - dataSetSectionTable = - it.dataSetSectionTable.copy( - id = sectionUid, - tableModels = emptyList(), - overridingDimensions = overwrittenWidths(sectionUid), - loading = true, - ), - selectedCellInfo = CellSelectionState.Default(TableSelection.Unselected()), - initialSection = selectedSectionIndex ?: 0, - ) - } else { - it + val initialDimensions = overwrittenWidths(sectionUid) + withContext(dispatcher.main()) { + _dataSetScreenState.update { + if (it is DataSetScreenState.Loaded) { + val dataSetSectionTitle = + if (it.dataSetDetails.customTitle.isConfiguredTitle) { + it.dataSetDetails.customTitle.header + } else { + it.dataSetSections.firstOrNull { section -> section.uid == sectionUid }?.title + } + it.copy( + dataSetDetails = + it.dataSetDetails.copy( + customTitle = + DataSetCustomTitle( + header = dataSetSectionTitle, + subHeader = it.dataSetDetails.customTitle.subHeader, + textAlignment = it.dataSetDetails.customTitle.textAlignment, + isConfiguredTitle = it.dataSetDetails.customTitle.isConfiguredTitle, + ), + ), + dataSetSectionTable = + it.dataSetSectionTable.copy( + id = sectionUid, + tableModels = emptyList(), + overridingDimensions = initialDimensions, + loading = true, + ), + selectedCellInfo = CellSelectionState.Default(TableSelection.Unselected()), + initialSection = selectedSectionIndex ?: 0, + ) + } else { + it + } } } - val sectionData = async { sectionData(sectionUid) } - _dataSetScreenState.update { - if (it is DataSetScreenState.Loaded) { - it.copy( - dataSetSectionTable = - it.dataSetSectionTable.copy( - id = sectionUid, - tableModels = sectionData.await(), - overridingDimensions = overwrittenWidths(sectionUid), - loading = false, - ), - initialSection = selectedSectionIndex ?: 0, - ) - } else { - it + val tableModels = sectionData(sectionUid) + withContext(dispatcher.main()) { + _dataSetScreenState.update { + if (it is DataSetScreenState.Loaded) { + it.copy( + dataSetSectionTable = + it.dataSetSectionTable.copy( + id = sectionUid, + tableModels = tableModels, + // Preserve any resize the user applied while loading + overridingDimensions = it.dataSetSectionTable.overridingDimensions, + loading = false, + ), + initialSection = selectedSectionIndex ?: 0, + ) + } else { + it + } } } - CoroutineTracker.decrement() } } @@ -585,22 +575,20 @@ internal class DataSetTableViewModel( } private fun updateFileLoadingState(state: UploadFileState) { - viewModelScope.launch(dispatcher.io()) { - _dataSetScreenState.update { - (it as? DataSetScreenState.Loaded)?.copy( - selectedCellInfo = - if (it.selectedCellInfo is CellSelectionState.InputDataUiState) { - it.selectedCellInfo.copy( - inputExtra = - it.selectedCellInfo.fileExtras().copy( - fileState = state, - ), - ) - } else { - it.selectedCellInfo - }, - ) ?: it - } + _dataSetScreenState.update { + (it as? DataSetScreenState.Loaded)?.copy( + selectedCellInfo = + if (it.selectedCellInfo is CellSelectionState.InputDataUiState) { + it.selectedCellInfo.copy( + inputExtra = + it.selectedCellInfo.fileExtras().copy( + fileState = state, + ), + ) + } else { + it.selectedCellInfo + }, + ) ?: it } } @@ -626,13 +614,15 @@ internal class DataSetTableViewModel( ?.dataSetSectionTable ?.id ?: return@launch val updatedDimensions = overwrittenWidths(currentSectionId) - _dataSetScreenState.update { state -> - (state as? DataSetScreenState.Loaded)?.copy( - dataSetSectionTable = - state.dataSetSectionTable.copy( - overridingDimensions = updatedDimensions, - ), - ) ?: state + withContext(dispatcher.main()) { + _dataSetScreenState.update { state -> + (state as? DataSetScreenState.Loaded)?.copy( + dataSetSectionTable = + state.dataSetSectionTable.copy( + overridingDimensions = updatedDimensions, + ), + ) ?: state + } } } } diff --git a/aggregates/src/commonTest/kotlin/org/dhis2/mobile/aggregates/ui/viewModel/DataSetTableViewModelTest.kt b/aggregates/src/commonTest/kotlin/org/dhis2/mobile/aggregates/ui/viewModel/DataSetTableViewModelTest.kt index 781babd905d..d1a838d8d67 100644 --- a/aggregates/src/commonTest/kotlin/org/dhis2/mobile/aggregates/ui/viewModel/DataSetTableViewModelTest.kt +++ b/aggregates/src/commonTest/kotlin/org/dhis2/mobile/aggregates/ui/viewModel/DataSetTableViewModelTest.kt @@ -182,8 +182,13 @@ internal class DataSetTableViewModelTest : KoinTest { dataSetSections = listOf( DataSetSection( - uid = "sectionUid", - title = "sectionTitle", + uid = "section_uid1", + title = "sectionTitle1", + misconfiguredRows = emptyList(), + ), + DataSetSection( + uid = "section_uid2", + title = "sectionTitle2", misconfiguredRows = emptyList(), ), ), @@ -437,8 +442,8 @@ internal class DataSetTableViewModelTest : KoinTest { if (this is DataSetScreenState.Loaded) { assertTrue(this.selectedCellInfo is InputDataUiState) require(this.selectedCellInfo is InputDataUiState) - assertEquals("Legend label 2", this.selectedCellInfo?.legendData?.title) - assertEquals("#CD5C5C".toColor(), this.selectedCellInfo?.legendData?.color) + assertEquals("Legend label 2", this.selectedCellInfo.legendData?.title) + assertEquals("#CD5C5C".toColor(), this.selectedCellInfo.legendData?.color) } else { assertTrue(false) } @@ -965,16 +970,15 @@ internal class DataSetTableViewModelTest : KoinTest { runTest { viewModel.dataSetScreenState.test { awaitInitialization() - viewModel.onSectionSelected("section_uid1") + viewModel.onSectionSelected("section_uid2") with(awaitItem()) { assertTrue(this is DataSetScreenState.Loaded) assertTrue((this as DataSetScreenState.Loaded).dataSetSectionTable.loading) - assertTrue(this.currentSection() == "section_uid1") + assertTrue(this.currentSection() == "section_uid2") } - viewModel.onSectionSelected("section_uid2") with(awaitItem()) { assertTrue(this is DataSetScreenState.Loaded) - assertTrue((this as DataSetScreenState.Loaded).dataSetSectionTable.loading) + assertTrue(!(this as DataSetScreenState.Loaded).dataSetSectionTable.loading) assertTrue(this.currentSection() == "section_uid2") } viewModel.onSectionSelected("section_uid1") diff --git a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTableRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTableRobot.kt index dac099e47cc..1805133dbdf 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTableRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTableRobot.kt @@ -253,7 +253,7 @@ internal class DataSetTableRobot( fun assertTableIsDisplayed() { composeTestRule.waitUntilExactlyOneExists( hasTestTag("TABLE_SCROLLABLE_COLUMN"), - timeoutMillis = 10000 + timeoutMillis = TIMEOUT ) } @@ -261,7 +261,7 @@ internal class DataSetTableRobot( fun assertImmunizationTableIsDisplayed() { composeTestRule.waitUntilAtLeastOneExists( hasText("Fixed"), - timeoutMillis = 5000 + timeoutMillis = TIMEOUT ) } diff --git a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/dialogs/scheduling/SchedulingDialogUiTest.kt b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/dialogs/scheduling/SchedulingDialogUiTest.kt index 63bb99534cd..7406d43880b 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/dialogs/scheduling/SchedulingDialogUiTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/dialogs/scheduling/SchedulingDialogUiTest.kt @@ -1,10 +1,13 @@ package org.dhis2.usescases.teidashboard.dialogs.scheduling import androidx.compose.ui.test.ExperimentalTestApi +import androidx.compose.ui.test.hasAnyAncestor import androidx.compose.ui.test.hasTestTag +import androidx.compose.ui.test.isSelectable import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.compose.ui.test.onAllNodesWithTag import androidx.compose.ui.test.onFirst +import androidx.compose.ui.test.onLast import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick @@ -149,7 +152,14 @@ class SchedulingDialogUiTest : BaseTest() { ) { } } - composeTestRule.onNodeWithText("No").performClick() + composeTestRule.waitForIdle() + composeTestRule + .onAllNodes( + matcher = hasAnyAncestor(hasTestTag("YES_NO_OPTIONS")) and isSelectable(), + useUnmergedTree = true, + ) + .onLast() + .performClick() composeTestRule.onNodeWithText("Program stage").assertDoesNotExist() composeTestRule.onNodeWithText("Date").assertDoesNotExist() composeTestRule.onNodeWithText("CatCombo *").assertDoesNotExist() From 2e0ac971c026bc31851a9469dfdd5a69649c6466 Mon Sep 17 00:00:00 2001 From: Ferdy Rodriguez Date: Thu, 5 Mar 2026 08:12:46 +0100 Subject: [PATCH 076/260] fix: [ANDROAPP-7522] Handles Yes Only value when checked (#4707) * Correctly manage Yes Only value when checked * Correctly manage Yes Only value when checked * fix: [ANDROAPP-7522] maintain toggle logic --------- Co-authored-by: Xavier Molloy --- .../org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt index 2f81fb85c54..0a344595e7f 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt @@ -622,7 +622,7 @@ fun TrackerInputProvider( onUiEvent( TrackerInputUiEvent.OnValueChange( uid = inputModel.uid, - value = getYesOnlyValue(isChecked), + value = if (isChecked) "true" else null, ), ) }, From f7556c3bf370bd5bc8bee1ed39b8e0b80ac4dd78 Mon Sep 17 00:00:00 2001 From: Ferdy Rodriguez Date: Thu, 5 Mar 2026 09:50:38 +0100 Subject: [PATCH 077/260] test: Search operators automation tests (#4704) * Automate test regarding search operators * Added comments --- .../input/ui/state/TrackerInputUiState.kt | 48 ++++-- .../tracker/search/model/SearchOperator.kt | 16 ++ .../search/SearchParametersIntegrationTest.kt | 162 +++++++++++++++++- 3 files changed, 202 insertions(+), 24 deletions(-) diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerInputUiState.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerInputUiState.kt index d0aefc2e87d..41d7768f940 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerInputUiState.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerInputUiState.kt @@ -47,7 +47,27 @@ data class TrackerInputUiState( ) @Composable -fun TrackerInputUiState.supportingText(): List? = +fun TrackerInputUiState.supportingText(): List? { + val label = + searchOperator?.let { operator -> + if (focused) operator.supportingTextString() else null + } + return supportingTextList(searchOperatorLabel = label) +} + +fun TrackerInputUiState.inputState(): InputShellState = + when { + !editable -> InputShellState.DISABLED + error != null -> InputShellState.ERROR + focused -> InputShellState.FOCUSED + else -> InputShellState.UNFOCUSED + } + +/** + * Non-composable function to be used wherever a composable context is not available. For example, + * Unit Tests. Should use the [TrackerInputUiState.supportingText] method instead. + */ +fun TrackerInputUiState.supportingTextList(searchOperatorLabel: String?): List? = listOfNotNull( error?.let { SupportingTextData( @@ -61,17 +81,15 @@ fun TrackerInputUiState.supportingText(): List? = SupportingTextState.WARNING, ) }, - searchOperator?.let { operator -> - if (focused) { - operator.supportingTextString()?.let { text -> - SupportingTextData( - text, - SupportingTextState.DEFAULT, - ) - } - } else { - null + if (focused && searchOperator != null) { + searchOperatorLabel?.let { text -> + SupportingTextData( + text, + SupportingTextState.DEFAULT, + ) } + } else { + null }, description?.let { SupportingTextData( @@ -81,14 +99,6 @@ fun TrackerInputUiState.supportingText(): List? = }, ).ifEmpty { null } -fun TrackerInputUiState.inputState(): InputShellState = - when { - !editable -> InputShellState.DISABLED - error != null -> InputShellState.ERROR - focused -> InputShellState.FOCUSED - else -> InputShellState.UNFOCUSED - } - @Composable private fun SearchOperator.supportingTextString() = when (this) { diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchOperator.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchOperator.kt index 7f886bd1054..ab6ccf44e7a 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchOperator.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchOperator.kt @@ -1,8 +1,24 @@ package org.dhis2.tracker.search.model +import androidx.annotation.VisibleForTesting + enum class SearchOperator { LIKE, SW, EW, EQ, } + +/** + * Method use explicitly for testing purposes. Simulating that the search operator + * has a label assigned. + */ +@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) +fun SearchOperator.hasLabel(): Boolean = + when (this) { + SearchOperator.EQ, + SearchOperator.SW, + SearchOperator.EW, + -> true + else -> false + } diff --git a/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/SearchParametersIntegrationTest.kt b/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/SearchParametersIntegrationTest.kt index debc6b3ef70..881b0f3364f 100644 --- a/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/SearchParametersIntegrationTest.kt +++ b/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/SearchParametersIntegrationTest.kt @@ -12,13 +12,16 @@ import org.dhis2.mobile.commons.coroutine.Dispatcher import org.dhis2.mobile.commons.resources.StringResourceProvider import org.dhis2.tracker.input.model.TrackerInputType import org.dhis2.tracker.input.ui.mapper.toTrackerInputUiState +import org.dhis2.tracker.input.ui.state.supportingTextList import org.dhis2.tracker.search.data.SearchParametersRepository import org.dhis2.tracker.search.domain.FetchSearchParameters import org.dhis2.tracker.search.model.FetchSearchParametersData import org.dhis2.tracker.search.model.SearchOperator import org.dhis2.tracker.search.model.SearchParameterModel +import org.dhis2.tracker.search.model.hasLabel import org.dhis2.tracker.search.ui.state.SearchParametersUiState import org.dhis2.tracker.search.ui.viewmodel.SearchParametersViewModel +import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextState import org.mockito.kotlin.any import org.mockito.kotlin.mock import org.mockito.kotlin.whenever @@ -26,6 +29,7 @@ import kotlin.test.AfterTest import kotlin.test.BeforeTest import kotlin.test.Test import kotlin.test.assertEquals +import kotlin.test.assertNotNull import kotlin.test.assertNull import kotlin.test.assertTrue @@ -63,7 +67,11 @@ class SearchParametersIntegrationTest { // Given val min = 2 val teiTypeUid = "teiType123" - val searchParameter = buildSearchParameter(minCharactersToSearch = min) + val searchParameter = + buildSearchParameter( + uid = "field1", + minCharactersToSearch = min, + ) whenever(repository.getSearchParametersByTrackedEntityType(teiTypeUid)) .thenReturn(listOf(searchParameter)) @@ -96,7 +104,11 @@ class SearchParametersIntegrationTest { val min = 3 val teiTypeUid = "teiType123" val errorMessage = "Minimum $min characters required" - val searchParameter = buildSearchParameter(minCharactersToSearch = min) + val searchParameter = + buildSearchParameter( + uid = "field1", + minCharactersToSearch = min, + ) whenever(repository.getSearchParametersByTrackedEntityType(teiTypeUid)) .thenReturn(listOf(searchParameter)) whenever(resourceProvider.provideString(any(), any())).thenReturn(errorMessage) @@ -124,15 +136,155 @@ class SearchParametersIntegrationTest { assertEquals(errorMessage, uiState.items.first().error) } - private fun buildSearchParameter(minCharactersToSearch: Int): SearchParameterModel = + @Test + fun `given a configured search operator, when user clicks field, then search operator message is shown`() = + runTest(testDispatcher) { + // Given + val teiTypeUid = "teiType123" + val searchParameters = + listOf( + buildSearchParameter( + uid = "field1", + minCharactersToSearch = 0, + searchOperator = SearchOperator.EQ, + ), + buildSearchParameter( + uid = "field2", + minCharactersToSearch = 0, + searchOperator = SearchOperator.LIKE, + ), + buildSearchParameter( + uid = "field3", + minCharactersToSearch = 0, + searchOperator = SearchOperator.SW, + ), + buildSearchParameter( + uid = "field4", + minCharactersToSearch = 0, + searchOperator = SearchOperator.EW, + ), + ) + + whenever(repository.getSearchParametersByTrackedEntityType(teiTypeUid)) + .thenReturn(searchParameters) + + val fetchResult = + fetchSearchParameters(FetchSearchParametersData(teiTypeUid = teiTypeUid)) + assertTrue(fetchResult.isSuccess) + + fetchResult + .getOrNull() + ?.forEach { searchParam -> + // Simulate the user clicking the field (focused = true) + val item = searchParam.toTrackerInputUiState().copy(focused = true) + val operator = searchParam.searchOperator + + // Mimic what the Composable layer does: resolve a label only when the + // operator has one (stringResource is not available in unit tests). + val operatorLabel = if (operator?.hasLabel() == true) "operator label" else null + val supportingText = item.supportingTextList(searchOperatorLabel = operatorLabel) + + if (operator?.hasLabel() == true) { + // EQ, SW, EW – a DEFAULT supporting text entry must be present + assertNotNull(supportingText) + assertTrue(supportingText.any { it.state == SupportingTextState.DEFAULT }) + } else { + // LIKE – no label, no error/warning/description → null + assertNull(supportingText) + } + } + } + + @Test + fun `given a configured search operator with error, when user clicks field, supporting text color in Red`() = + runTest(testDispatcher) { + // Given + val teiTypeUid = "teiType123" + val searchParameters = + listOf( + buildSearchParameter( + uid = "field1", + minCharactersToSearch = 0, + searchOperator = SearchOperator.EQ, + ), + ) + + whenever(repository.getSearchParametersByTrackedEntityType(teiTypeUid)) + .thenReturn(searchParameters) + + val fetchResult = + fetchSearchParameters(FetchSearchParametersData(teiTypeUid = teiTypeUid)) + assertTrue(fetchResult.isSuccess) + + val itemWithError = + fetchResult + .getOrNull()!! + .map { searchParam -> + searchParam.toTrackerInputUiState().copy(error = "any Error", focused = true) + } + viewModel.updateFromExternal(SearchParametersUiState(items = itemWithError)) + val uiState = viewModel.uiState.first() + val supportingListData = + uiState + .items + .first() + .supportingTextList(null) + ?.firstOrNull() + assertNotNull(supportingListData) + assertEquals(SupportingTextState.ERROR, supportingListData.state) + } + + @Test + fun `given a configured search operator with warning, when user clicks field, supporting text color in Orange`() = + runTest(testDispatcher) { + // Given + val teiTypeUid = "teiType123" + val searchParameters = + listOf( + buildSearchParameter( + uid = "field1", + minCharactersToSearch = 0, + searchOperator = SearchOperator.EQ, + ), + ) + + whenever(repository.getSearchParametersByTrackedEntityType(teiTypeUid)) + .thenReturn(searchParameters) + + val fetchResult = + fetchSearchParameters(FetchSearchParametersData(teiTypeUid = teiTypeUid)) + assertTrue(fetchResult.isSuccess) + + val itemWithError = + fetchResult + .getOrNull()!! + .map { searchParam -> + searchParam.toTrackerInputUiState().copy(warning = "any Warning", focused = true) + } + viewModel.updateFromExternal(SearchParametersUiState(items = itemWithError)) + val uiState = viewModel.uiState.first() + val supportingListData = + uiState.items + .first() + .supportingTextList(null) + ?.firstOrNull() + assertNotNull(supportingListData) + assertEquals(SupportingTextState.WARNING, supportingListData.state) + } + + private fun buildSearchParameter( + uid: String, + minCharactersToSearch: Int, + searchOperator: SearchOperator? = null, + ): SearchParameterModel = SearchParameterModel( - uid = "field1", + uid = uid, label = "First Name", inputType = TrackerInputType.TEXT, optionSet = null, customIntentUid = null, minCharactersToSearch = minCharactersToSearch, - searchOperator = SearchOperator.LIKE, + searchOperator = searchOperator, isUnique = false, ) } From f221b3d3a41ae1217cd4abea6e031e7c4da21bad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Thu, 5 Mar 2026 10:59:15 +0100 Subject: [PATCH 078/260] test: update NoteRobot.kt (#4709) --- .../usescases/teidashboard/robot/NoteRobot.kt | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt index d77699f8755..ed7f3e92a96 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt @@ -5,12 +5,10 @@ import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.intent.Intents import androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent -import androidx.test.espresso.matcher.RootMatchers.isDialog import androidx.test.espresso.matcher.ViewMatchers.Visibility import androidx.test.espresso.matcher.ViewMatchers.hasDescendant import androidx.test.espresso.matcher.ViewMatchers.isDisplayed import androidx.test.espresso.matcher.ViewMatchers.isEnabled -import androidx.test.espresso.matcher.ViewMatchers.isRoot import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText @@ -50,17 +48,13 @@ class NoteRobot : BaseRobot() { } fun clickYesOnAlertDialog() { - waitForView(isRoot()) - .inRoot(isDialog()) - .perform(searchFor(withId(android.R.id.button1))) - waitForView(withId(android.R.id.button1)) - .inRoot(isDialog()) + waitForView(withId(android.R.id.button1), waitMillis = DIALOG_WAIT_TIMEOUT_MS) .check(matches(isDisplayed())) .perform(click()) } fun checkNoteWasNotCreated(text: String) { - waitForView(withId(R.id.notes_recycler)).check( + waitForView(withId(R.id.notes_recycler), waitMillis = NOTES_WAIT_TIMEOUT_MS).check( matches( not( atPosition( @@ -79,7 +73,8 @@ class NoteRobot : BaseRobot() { isDisplayed(), isNotEmpty(), atPosition(0, hasDescendant(withText(text))) - ) + ), + waitMillis = NOTES_WAIT_TIMEOUT_MS ) } @@ -90,7 +85,8 @@ class NoteRobot : BaseRobot() { } fun checkNoteDetails(user: String, noteText: String) { - waitForView(withId(R.id.notes_recycler)).check(matches(isDisplayed())) + waitForView(withId(R.id.notes_recycler), waitMillis = NOTES_WAIT_TIMEOUT_MS) + .check(matches(isDisplayed())) waitForView( allOf( withId(R.id.storeBy), @@ -108,4 +104,9 @@ class NoteRobot : BaseRobot() { ) .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) } + + companion object { + private const val DIALOG_WAIT_TIMEOUT_MS = 10000 + private const val NOTES_WAIT_TIMEOUT_MS = 15000 + } } From 70fca84c927f464c390f5f9517368a1f9dceb67d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Thu, 5 Mar 2026 13:13:52 +0100 Subject: [PATCH 079/260] build: ANDROAPP-7529 update-gradle-9 [skip size] (#4694) * build: update gradle to 9.0.1 * build: apply plugins to kmp build.gradle.kts files * build: Sentry initialization * build: add desugar library to login * build: update unit test executions with testAndroidHostTest * build: removing multidex * build: android.newDsl=false to support sonarqube * build: android.newDsl=false to support sonarqube * fix: Remove attachBaseContext from App to inherit it. * fix: update verification-metadata.xml * build: update version name to test apks * build:sentry * fix: sonarcloud code smell, indexed accessors * build: use compileOnly for debug dependencies * refactor: AndroidSyncRepositoryTest.kt to AndroidHostTests * build: update AGP to 9.1.0 * build: remove testing version name * ci: Update sonar version * build: downgrade AGP to 9.0.1 because of sonar --- Jenkinsfile | 2 +- aggregates/build.gradle.kts | 49 +- .../data/DataSetInstanceRepositoryImplTest.kt | 0 app/build.gradle.kts | 142 +- app/src/main/java/org/dhis2/App.java | 14 +- .../java/org/dhis2/di/KoinInitialization.kt | 7 + .../datasetDetail/DataSetDetailActivity.java | 14 +- build.gradle.kts | 4 + commons/build.gradle.kts | 28 +- .../commons/reporting/CrashReportModule.kt | 5 +- commonskmm/build.gradle.kts | 67 +- .../validators/FieldMaskValidatorTest.kt | 0 .../commons/di/CommonsModule.android.kt | 2 +- .../reporting/CrashReportControllerImpl.kt | 38 +- compose-table/build.gradle.kts | 1 - dhis2-mobile-program-rules/build.gradle.kts | 1 - dhis2_android_maps/build.gradle.kts | 6 +- dhis_android_analytics/build.gradle.kts | 7 +- form/build.gradle.kts | 7 +- .../main/java/org/dhis2/form/di/Injector.kt | 2 +- gradle.properties | 11 +- gradle/libs.versions.toml | 15 +- gradle/verification-metadata.xml | 2138 ++++++++++++++++- gradle/wrapper/gradle-wrapper.properties | 2 +- login/build.gradle.kts | 92 +- .../kotlin/screen/TwoFAToEnableScreenTest.kt | 74 - .../data/repository/AccountRepositoryImpl.kt | 7 +- .../login/main/di/LoginModule.android.kt | 6 + run_tests.sh | 2 +- stock-usecase/build.gradle.kts | 2 - sync/build.gradle.kts | 70 +- .../sync/data}/AndroidSyncRepositoryTest.kt | 0 .../res/drawable/ic_sync.xml | 0 tracker/build.gradle.kts | 66 +- .../AndroidRelationshipFakeModels.kt | 0 .../TrackerRelationshipsRepositoryTest.kt | 0 .../SearchTrackedEntityRepositoryImplTest.kt | 0 37 files changed, 2444 insertions(+), 437 deletions(-) rename aggregates/src/{androidUnitTest => androidHostTest}/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepositoryImplTest.kt (100%) rename commonskmm/src/{androidUnitTest => androidHostTest}/kotlin/org/dhis2/commons/validation/validators/FieldMaskValidatorTest.kt (100%) delete mode 100644 login/src/androidInstrumentedTest/kotlin/screen/TwoFAToEnableScreenTest.kt rename sync/src/{androidUnitTest/kotlin/org.dhis2.mobile.sync.data => androidHostTest/kotlin/org/dhis2/mobile/sync/data}/AndroidSyncRepositoryTest.kt (100%) rename sync/src/{main => androidMain}/res/drawable/ic_sync.xml (100%) rename tracker/src/{androidUnitTest => androidHostTest}/kotlin/org/dhis2/tracker/relationships/AndroidRelationshipFakeModels.kt (100%) rename tracker/src/{androidUnitTest => androidHostTest}/kotlin/org/dhis2/tracker/relationships/data/TrackerRelationshipsRepositoryTest.kt (100%) rename tracker/src/{androidUnitTest => androidHostTest}/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImplTest.kt (100%) diff --git a/Jenkinsfile b/Jenkinsfile index ca2ad64efda..10854742886 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -77,7 +77,7 @@ pipeline { steps { script { echo 'Running unit tests' - sh './gradlew --dependency-verification lenient testDebugUnitTest testDhis2DebugUnitTest --stacktrace --no-daemon' + sh './gradlew --dependency-verification lenient testDebugUnitTest testDhis2DebugUnitTest testAndroidHostTest --stacktrace --no-daemon' } } } diff --git a/aggregates/build.gradle.kts b/aggregates/build.gradle.kts index 9eedb8161a5..b7e394b50bf 100644 --- a/aggregates/build.gradle.kts +++ b/aggregates/build.gradle.kts @@ -1,16 +1,22 @@ import kotlin.text.set plugins { - kotlin("multiplatform") + alias(libs.plugins.kotlin.multiplatform) alias(libs.plugins.compose) - id("com.android.library") + alias(libs.plugins.android.kotlin.multiplatform.library) alias(libs.plugins.kotlin.compose.compiler) } kotlin { - androidTarget { - compilerOptions { - jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17) + androidLibrary { + namespace = "org.dhis2.mobile.aggregates" + compileSdk = libs.versions.sdk.get().toInt() + minSdk = libs.versions.minSdk.get().toInt() + compilerOptions { jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17) } + androidResources { enable = true } + withHostTestBuilder {}.configure {} + withDeviceTestBuilder {}.configure { + instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } } @@ -65,9 +71,12 @@ kotlin { implementation(libs.koin.androidx.compose) implementation(project(":commons")) implementation(project(":dhis2_android_maps")) + compileOnly(libs.androidx.compose.uitooling) } - androidUnitTest.dependencies { } + getByName("androidHostTest") { + dependencies { implementation(libs.junit.jupiter) } + } val desktopMain by getting { dependencies { @@ -83,30 +92,6 @@ compose.resources { generateResClass = always } -android { - namespace = "org.dhis2.mobile.aggregates" - compileSdk = libs.versions.sdk.get().toInt() - - sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml") - sourceSets["main"].res.srcDirs("src/androidMain/res") - - defaultConfig { - minSdk = libs.versions.minSdk.get().toInt() - } - compileOptions { - isCoreLibraryDesugaringEnabled = true - - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - - dependencies { - coreLibraryDesugaring(libs.desugar) - } -} - dependencies { - testImplementation(libs.junit.jupiter) - debugImplementation(libs.androidx.compose.preview) - debugImplementation(libs.androidx.compose.uitooling) -} \ No newline at end of file + coreLibraryDesugaring(libs.desugar) +} diff --git a/aggregates/src/androidUnitTest/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepositoryImplTest.kt b/aggregates/src/androidHostTest/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepositoryImplTest.kt similarity index 100% rename from aggregates/src/androidUnitTest/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepositoryImplTest.kt rename to aggregates/src/androidHostTest/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepositoryImplTest.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 7068334b38f..96701323e44 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,5 +1,3 @@ -@file:Suppress("UnstableApiUsage") - import com.android.build.api.variant.impl.VariantOutputImpl import org.jetbrains.kotlin.gradle.dsl.JvmTarget import java.text.SimpleDateFormat @@ -7,8 +5,7 @@ import java.util.Date plugins { id("com.android.application") - kotlin("android") - kotlin("kapt") + alias(libs.plugins.legacy.kapt) id("com.google.devtools.ksp") id("kotlin-parcelize") alias(libs.plugins.kotlin.serialization) @@ -17,48 +14,52 @@ plugins { } apply(from = "${project.rootDir}/jacoco/jacoco.gradle.kts") -android { - - val getBuildDate by extra { - fun(): String { - return SimpleDateFormat("yyyy-MM-dd HH:mm").format(Date()) - } +val getBuildDate by extra { + fun(): String { + return SimpleDateFormat("yyyy-MM-dd HH:mm").format(Date()) } +} - val getCommitHash by extra { - fun(): String { - return try { - val process = ProcessBuilder("git", "rev-parse", "--short", "HEAD") - .redirectOutput(ProcessBuilder.Redirect.PIPE) - .redirectError(ProcessBuilder.Redirect.PIPE) - .start() - process.inputStream.bufferedReader().readText().trim() - } catch (e: Exception) { - "unknown" - } +val getCommitHash by extra { + fun(): String { + return try { + val process = ProcessBuilder("git", "rev-parse", "--short", "HEAD") + .redirectOutput(ProcessBuilder.Redirect.PIPE) + .redirectError(ProcessBuilder.Redirect.PIPE) + .start() + process.inputStream.bufferedReader().readText().trim() + } catch (e: Exception) { + "unknown" } } +} - val getBranchName by extra { - fun(): String { - val envBranchName = System.getenv("GITHUB_HEAD_REF") - ?: System.getenv("GITHUB_REF_NAME") +val getBranchName by extra { + fun(): String { + val envBranchName = System.getenv("GITHUB_HEAD_REF") + ?: System.getenv("GITHUB_REF_NAME") - return try { - if (!envBranchName.isNullOrBlank()) { - return envBranchName.replace(Regex("[/\\\\:*?\"<>|]"), "-") - } - val process = ProcessBuilder("git", "rev-parse", "--abbrev-ref", "HEAD") - .redirectOutput(ProcessBuilder.Redirect.PIPE) - .redirectError(ProcessBuilder.Redirect.PIPE) - .start() - val branchName = process.inputStream.bufferedReader().readText().trim() - branchName.replace(Regex("[/\\\\:*?\"<>|]"), "-") - } catch (e: Exception) { - "unknown" + return try { + if (!envBranchName.isNullOrBlank()) { + return envBranchName.replace(Regex("[/\\\\:*?\"<>|]"), "-") } + val process = ProcessBuilder("git", "rev-parse", "--abbrev-ref", "HEAD") + .redirectOutput(ProcessBuilder.Redirect.PIPE) + .redirectError(ProcessBuilder.Redirect.PIPE) + .start() + val branchName = process.inputStream.bufferedReader().readText().trim() + branchName.replace(Regex("[/\\\\:*?\"<>|]"), "-") + } catch (e: Exception) { + "unknown" } } +} + +base { + archivesName.set("dhis2-v" + libs.versions.vName.get()) +} + +android { signingConfigs { create("release") { @@ -104,23 +105,18 @@ android { } } + compileSdk = libs.versions.sdk.get().toInt() namespace = "org.dhis2" testNamespace = "org.dhis2.test" - base { - archivesName.set("dhis2-v" + libs.versions.vName.get()) - } - defaultConfig { applicationId = "com.dhis2" - compileSdk = libs.versions.sdk.get().toInt() targetSdk = libs.versions.sdk.get().toInt() minSdk = libs.versions.minSdk.get().toInt() versionCode = libs.versions.vCode.get().toInt() versionName = libs.versions.vName.get() testInstrumentationRunner = "org.dhis2.Dhis2Runner" vectorDrawables.useSupportLibrary = true - multiDexEnabled = true val bitriseSentryDSN = System.getenv("SENTRY_DSN") ?: "" @@ -153,6 +149,9 @@ android { "META-INF/gradle/incremental.annotation.processors" ) ) + // Compose Multiplatform string resources from KMP modules can duplicate + // when multiple modules package the same locale strings.xml as Java resources. + pickFirsts.addAll(listOf("values*/**")) } } @@ -229,42 +228,42 @@ android { abortOnError = false checkReleaseBuilds = false } +} - androidComponents { - onVariants { variant -> - val buildType = variant.buildType - val flavorName = variant.flavorName +androidComponents { + onVariants { variant -> + val buildType = variant.buildType + val flavorName = variant.flavorName - // Apply suffix only for training flavor in release buildType - if (buildType == "release" && flavorName == "dhis2Training") { - variant.applicationId.set("${variant.applicationId.get()}.training") - } - - variant.outputs.forEach { output -> - if (output is VariantOutputImpl) { - val suffix = when { - buildType == "release" && flavorName == "dhis2Training" -> "-training" - buildType == "release" && flavorName == "dhis2PlayServices" -> "-googlePlay" - buildType == "debug" -> "-${getBranchName()}" - else -> "" - } + // Apply suffix only for training flavor in release buildType + if (buildType == "release" && flavorName == "dhis2Training") { + variant.applicationId.set("${variant.applicationId.get()}.training") + } - output.outputFileName = "dhis2-v${libs.versions.vName.get()}$suffix.apk" + variant.outputs.forEach { output -> + if (output is VariantOutputImpl) { + val suffix = when { + buildType == "release" && flavorName == "dhis2Training" -> "-training" + buildType == "release" && flavorName == "dhis2PlayServices" -> "-googlePlay" + buildType == "debug" -> "-${getBranchName()}" + else -> "" } - } + output.outputFileName = "dhis2-v${libs.versions.vName.get()}$suffix.apk" + } } - } - ksp { - arg("room.schemaLocation", "$projectDir/schemas") - arg("room.incremental", "true") - arg("room.expandProjection", "true") - // Enable debug logs - arg("ksp.logging.level", "DEBUG") } } +ksp { + arg("room.schemaLocation", "$projectDir/schemas") + arg("room.incremental", "true") + arg("room.expandProjection", "true") + // Enable debug logs + arg("ksp.logging.level", "DEBUG") +} + kotlin { compilerOptions { jvmTarget.set(JvmTarget.JVM_17) @@ -273,6 +272,10 @@ kotlin { } } +kapt { + correctErrorTypes = true +} + dependencies { implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) implementation(project(":dhis_android_analytics")) @@ -296,7 +299,6 @@ dependencies { implementation(libs.androidx.annotation) implementation(libs.androidx.cardview) implementation(libs.androidx.legacy.support.v4) - implementation(libs.androidx.multidex) implementation(libs.androidx.constraintlayout) implementation(libs.androidx.work) implementation(libs.androidx.workrx) diff --git a/app/src/main/java/org/dhis2/App.java b/app/src/main/java/org/dhis2/App.java index ddf0b0cac60..74aa75c7115 100644 --- a/app/src/main/java/org/dhis2/App.java +++ b/app/src/main/java/org/dhis2/App.java @@ -11,8 +11,6 @@ import androidx.lifecycle.LifecycleObserver; import androidx.lifecycle.OnLifecycleEvent; import androidx.lifecycle.ProcessLifecycleOwner; -import androidx.multidex.MultiDex; -import androidx.multidex.MultiDexApplication; import org.dhis2.commons.di.dagger.PerActivity; import org.dhis2.commons.di.dagger.PerServer; @@ -71,7 +69,7 @@ import io.sentry.android.core.SentryAndroid; import timber.log.Timber; -public class App extends MultiDexApplication implements Components, LifecycleObserver { +public class App extends android.app.Application implements Components, LifecycleObserver { @NonNull @Singleton @@ -120,6 +118,10 @@ public void onCreate() { public void initCrashController() { if (areTrackingPermissionGranted()) { + if (BuildConfig.SENTRY_DSN.isEmpty()) { + Timber.w("Sentry DSN is empty. Skipping Sentry initialization."); + return; + } SentryAndroid.init(this, options -> { options.setDsn(BuildConfig.SENTRY_DSN); options.setAnrReportInDebug(true); @@ -154,12 +156,6 @@ private void initCustomCrashActivity() { .apply(); } - @Override - protected void attachBaseContext(Context base) { - super.attachBaseContext(base); - MultiDex.install(this); - } - private void setUpAppComponent() { appComponent = prepareAppComponent().build(); appComponent.inject(this); diff --git a/app/src/main/java/org/dhis2/di/KoinInitialization.kt b/app/src/main/java/org/dhis2/di/KoinInitialization.kt index c2aa800c550..3eec9f862f9 100644 --- a/app/src/main/java/org/dhis2/di/KoinInitialization.kt +++ b/app/src/main/java/org/dhis2/di/KoinInitialization.kt @@ -1,6 +1,7 @@ package org.dhis2.di import android.app.Application +import org.dhis2.BuildConfig import org.dhis2.android.rtsm.di.stockModule import org.dhis2.commons.di.filterModule import org.dhis2.commons.di.resourceManagerModule @@ -25,6 +26,12 @@ object KoinInitialization { startKoin { androidLogger() androidContext(this@invoke) + properties( + mapOf( + "sentryDsn" to BuildConfig.SENTRY_DSN, + "isTrainingFlavor" to (BuildConfig.FLAVOR == "dhis2Training"), + ), + ) modules( serverModule(d2Configuration), commonsModule, diff --git a/app/src/main/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailActivity.java b/app/src/main/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailActivity.java index 5bc7f3c3c27..054df4253f6 100644 --- a/app/src/main/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailActivity.java +++ b/app/src/main/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailActivity.java @@ -105,14 +105,12 @@ private void configureBottomNavigation() { binding.navigationBar.setOnItemSelectedListener(item -> { Fragment newFragment = null; - switch (item.getItemId()) { - case R.id.navigation_list_view: - newFragment = DataSetListFragment.newInstance(dataSetUid, accessWriteData); - break; - case R.id.navigation_analytics: - presenter.trackDataSetAnalytics(); - newFragment = GroupAnalyticsFragment.Companion.forDataSet(dataSetUid); - break; + int itemId = item.getItemId(); + if (itemId == R.id.navigation_list_view) { + newFragment = DataSetListFragment.newInstance(dataSetUid, accessWriteData); + } else if (itemId == R.id.navigation_analytics) { + presenter.trackDataSetAnalytics(); + newFragment = GroupAnalyticsFragment.Companion.forDataSet(dataSetUid); } FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); if (fragment == null ||(newFragment != null && !fragment.getClass().toString().equals(newFragment.getClass().toString()))) { diff --git a/build.gradle.kts b/build.gradle.kts index 0f749f4a086..b751339a98c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -18,6 +18,8 @@ plugins { alias(libs.plugins.kotlin.compose.compiler) apply false alias(libs.plugins.ksp) apply false alias(libs.plugins.cyclonedx) + alias(libs.plugins.kotlin.multiplatform) apply false + alias(libs.plugins.android.kotlin.multiplatform.library) apply false } @@ -96,6 +98,8 @@ allprojects { } tasks.withType { + // ensures test results are not cached between test runs + outputs.upToDateWhen { false } afterSuite( KotlinClosure2({ desc: TestDescriptor, result: TestResult -> if (result.resultType == TestResult.ResultType.FAILURE) { diff --git a/commons/build.gradle.kts b/commons/build.gradle.kts index e7f6e7c3bd6..3d207288041 100644 --- a/commons/build.gradle.kts +++ b/commons/build.gradle.kts @@ -2,8 +2,7 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { id("com.android.library") - kotlin("android") - kotlin("kapt") + alias(libs.plugins.legacy.kapt) id("com.google.devtools.ksp") id("kotlin-parcelize") alias(libs.plugins.kotlin.compose.compiler) @@ -61,6 +60,10 @@ kotlin { } } +kapt { + correctErrorTypes = true +} + dependencies { implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) implementation(project(":commonskmm")) @@ -80,6 +83,7 @@ dependencies { api(libs.androidx.viewModelKtx) api(libs.androidx.recyclerView) debugApi(libs.androidx.compose.uitooling) + api(libs.androidx.compose.preview) api(libs.androidx.compose.ui) api(libs.androidx.compose.livedata) api(libs.androidx.compose.paging) @@ -102,16 +106,16 @@ dependencies { api(libs.barcodeScanner.zxing.android) { exclude("com.google.zxing", "core") } - testApi(libs.test.junit) - testApi(libs.test.mockitoCore) - testApi(libs.test.mockitoKotlin) - testApi(libs.test.mockitoInline) - androidTestApi(libs.test.mockitoCore) - androidTestApi(libs.test.mockitoKotlin) - androidTestApi(libs.test.dexmaker.mockitoInline) - androidTestApi(libs.test.junit.ext) - androidTestApi(libs.test.espresso) - androidTestApi(libs.test.espresso.idlingresource) + testImplementation(libs.test.junit) + testImplementation(libs.test.mockitoCore) + testImplementation(libs.test.mockitoKotlin) + testImplementation(libs.test.mockitoInline) + androidTestImplementation(libs.test.mockitoCore) + androidTestImplementation(libs.test.mockitoKotlin) + androidTestImplementation(libs.test.dexmaker.mockitoInline) + androidTestImplementation(libs.test.junit.ext) + androidTestImplementation(libs.test.espresso) + androidTestImplementation(libs.test.espresso.idlingresource) api(libs.test.espresso.idlingresource) api(libs.test.espresso.idlingconcurrent) api(libs.analytics.sentry) diff --git a/commons/src/main/java/org/dhis2/commons/reporting/CrashReportModule.kt b/commons/src/main/java/org/dhis2/commons/reporting/CrashReportModule.kt index 31f48c6c5a1..c90bd0f6ce4 100644 --- a/commons/src/main/java/org/dhis2/commons/reporting/CrashReportModule.kt +++ b/commons/src/main/java/org/dhis2/commons/reporting/CrashReportModule.kt @@ -11,5 +11,8 @@ import javax.inject.Singleton class CrashReportModule internal constructor() { @Provides @Singleton - fun provideCrashReportController(context: Context): CrashReportController = CrashReportControllerImpl(context) + fun provideCrashReportController(context: Context): CrashReportController = CrashReportControllerImpl( + context = context, + sentryDsn = "", + ) } diff --git a/commonskmm/build.gradle.kts b/commonskmm/build.gradle.kts index 909d0454f74..bd3c8f6b8e3 100644 --- a/commonskmm/build.gradle.kts +++ b/commonskmm/build.gradle.kts @@ -1,12 +1,9 @@ -@file:OptIn(ExperimentalKotlinGradlePluginApi::class) - -import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { - kotlin("multiplatform") + alias(libs.plugins.kotlin.multiplatform) alias(libs.plugins.compose) - id("com.android.library") + alias(libs.plugins.android.kotlin.multiplatform.library) alias(libs.plugins.kotlin.compose.compiler) alias(libs.plugins.kotlin.atomicfu) alias(libs.plugins.kotlin.serialization) @@ -15,22 +12,22 @@ plugins { kotlin { compilerOptions { freeCompilerArgs.add("-Xcontext-parameters") + freeCompilerArgs.add("-Xexpect-actual-classes") } - androidTarget { - compilations.all { - compileTaskProvider.configure { - compilerOptions { - jvmTarget.set(JvmTarget.JVM_17) - } - } + + androidLibrary { + namespace = "org.dhis2.mobile.commons" + compileSdk = libs.versions.sdk.get().toInt() + minSdk = libs.versions.minSdk.get().toInt() + compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } + androidResources { enable = true } + withHostTestBuilder {}.configure {} + withDeviceTestBuilder {}.configure { + instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } } - jvm("desktop") - @OptIn(ExperimentalKotlinGradlePluginApi::class) - compilerOptions { - freeCompilerArgs.add("-Xexpect-actual-classes") - } + jvm("desktop") sourceSets { commonMain.dependencies { @@ -78,13 +75,16 @@ kotlin { // Sentry api(libs.analytics.sentry) implementation(libs.androidx.work) + compileOnly(libs.androidx.compose.preview) + compileOnly(libs.androidx.compose.uitooling) } - androidUnitTest.dependencies { - + getByName("androidHostTest") { + dependencies { + } } - androidInstrumentedTest.dependencies { + getByName("androidDeviceTest") { dependencies { implementation(libs.test.junit.ext) implementation(libs.test.espresso) @@ -107,31 +107,6 @@ compose.resources { generateResClass = always } -android { - namespace = "org.dhis2.mobile.commons" - compileSdk = libs.versions.sdk.get().toInt() - defaultConfig { - minSdk = libs.versions.minSdk.get().toInt() - val bitriseSentryDSN = System.getenv("SENTRY_DSN") ?: "" - buildConfigField("String", "SENTRY_DSN", "\"${bitriseSentryDSN}\"") - } - buildFeatures { - buildConfig = true - } - compileOptions { - isCoreLibraryDesugaringEnabled = true - - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - - dependencies { - coreLibraryDesugaring(libs.desugar) - } -} - dependencies { - debugImplementation(libs.androidx.compose.preview) - debugImplementation(libs.androidx.compose.uitooling) + coreLibraryDesugaring(libs.desugar) } - diff --git a/commonskmm/src/androidUnitTest/kotlin/org/dhis2/commons/validation/validators/FieldMaskValidatorTest.kt b/commonskmm/src/androidHostTest/kotlin/org/dhis2/commons/validation/validators/FieldMaskValidatorTest.kt similarity index 100% rename from commonskmm/src/androidUnitTest/kotlin/org/dhis2/commons/validation/validators/FieldMaskValidatorTest.kt rename to commonskmm/src/androidHostTest/kotlin/org/dhis2/commons/validation/validators/FieldMaskValidatorTest.kt diff --git a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/di/CommonsModule.android.kt b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/di/CommonsModule.android.kt index 46e9edc6b33..fecd0e199fa 100644 --- a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/di/CommonsModule.android.kt +++ b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/di/CommonsModule.android.kt @@ -41,7 +41,7 @@ actual val commonsModule: Module FileHandlerImpl() } single { - CrashReportControllerImpl(get()) + CrashReportControllerImpl(get(), getProperty("sentryDsn", "")) } single { diff --git a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/reporting/CrashReportControllerImpl.kt b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/reporting/CrashReportControllerImpl.kt index ac505a6d64b..1979a81096f 100644 --- a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/reporting/CrashReportControllerImpl.kt +++ b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/reporting/CrashReportControllerImpl.kt @@ -1,13 +1,13 @@ package org.dhis2.mobile.commons.reporting import android.content.Context +import android.content.pm.ApplicationInfo import io.sentry.Breadcrumb import io.sentry.Sentry import io.sentry.SentryLevel import io.sentry.SentryOptions.BeforeSendCallback import io.sentry.android.core.SentryAndroid import io.sentry.android.core.SentryAndroidOptions -import org.dhis2.mobile.commons.BuildConfig import org.hisp.dhis.android.core.D2Manager import timber.log.Timber @@ -15,20 +15,27 @@ const val DATA_STORE_CRASH_PERMISSION_KEY = "analytics_permission" class CrashReportControllerImpl( private val context: Context, + private val sentryDsn: String, + private val isDebug: Boolean = context.applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE != 0, ) : CrashReportController { override fun init() { + val resolvedDsn = resolveSentryDsn() + if (resolvedDsn.isBlank()) { + Timber.w("Sentry DSN is empty. Skipping Sentry initialization.") + return + } SentryAndroid.init(context) { options: SentryAndroidOptions? -> - options!!.setDsn(BuildConfig.SENTRY_DSN) + options!!.setDsn(resolvedDsn) options.isAnrReportInDebug = true options.beforeSend = BeforeSendCallback { event, _ -> if (SentryLevel.DEBUG == event.level) null else event } - options.environment = if (BuildConfig.DEBUG) "debug" else "production" - options.isDebug = BuildConfig.DEBUG + options.environment = if (isDebug) "debug" else "production" + options.isDebug = isDebug options.isAttachViewHierarchy = true - options.setTracesSampleRate(if (BuildConfig.DEBUG) 1.0 else 0.1) - options.setProfilesSampleRate(if (BuildConfig.DEBUG) 1.0 else 0.1) + options.setTracesSampleRate(if (isDebug) 1.0 else 0.1) + options.setProfilesSampleRate(if (isDebug) 1.0 else 0.1) } } @@ -97,4 +104,23 @@ class CrashReportControllerImpl( Timber.d("Tracking is disabled") } } + + private fun resolveSentryDsn(): String { + if (sentryDsn.isNotBlank()) { + return sentryDsn + } + + return try { + val buildConfigClass = Class.forName("${context.packageName}.BuildConfig") + (buildConfigClass.getField("SENTRY_DSN")[null] as? String).orEmpty() + } catch (_: ClassNotFoundException) { + "" + } catch (_: NoSuchFieldException) { + "" + } catch (_: IllegalAccessException) { + "" + } catch (_: SecurityException) { + "" + } + } } diff --git a/compose-table/build.gradle.kts b/compose-table/build.gradle.kts index 7e05c3b3414..215c0241340 100644 --- a/compose-table/build.gradle.kts +++ b/compose-table/build.gradle.kts @@ -2,7 +2,6 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { id("com.android.library") - kotlin("android") alias(libs.plugins.kotlin.serialization) alias(libs.plugins.kotlin.compose.compiler) } diff --git a/dhis2-mobile-program-rules/build.gradle.kts b/dhis2-mobile-program-rules/build.gradle.kts index 470b75ce8f0..7f2f277ed4c 100644 --- a/dhis2-mobile-program-rules/build.gradle.kts +++ b/dhis2-mobile-program-rules/build.gradle.kts @@ -2,7 +2,6 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { id("com.android.library") - kotlin("android") } apply(from = "${project.rootDir}/jacoco/jacoco.gradle.kts") diff --git a/dhis2_android_maps/build.gradle.kts b/dhis2_android_maps/build.gradle.kts index c5dc169b4bb..c39c2c4290a 100644 --- a/dhis2_android_maps/build.gradle.kts +++ b/dhis2_android_maps/build.gradle.kts @@ -2,7 +2,7 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { id("com.android.library") - kotlin("android") + alias(libs.plugins.legacy.kapt) id("com.google.devtools.ksp") alias(libs.plugins.kotlin.compose.compiler) alias(libs.plugins.kotlin.serialization) @@ -52,6 +52,10 @@ kotlin { } } +kapt { + correctErrorTypes = true +} + dependencies { implementation(project(":commons")) implementation(project(":commonskmm")) diff --git a/dhis_android_analytics/build.gradle.kts b/dhis_android_analytics/build.gradle.kts index 6ebb32d5980..2c659157427 100644 --- a/dhis_android_analytics/build.gradle.kts +++ b/dhis_android_analytics/build.gradle.kts @@ -2,8 +2,7 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { id("com.android.library") - kotlin("android") - kotlin("kapt") + alias(libs.plugins.legacy.kapt) id("com.google.devtools.ksp") alias(libs.plugins.kotlin.compose.compiler) } @@ -53,6 +52,10 @@ kotlin { } } +kapt { + correctErrorTypes = true +} + dependencies { implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) implementation(project(":commons")) diff --git a/form/build.gradle.kts b/form/build.gradle.kts index 21683e3fb79..cd63a9bcdf5 100644 --- a/form/build.gradle.kts +++ b/form/build.gradle.kts @@ -2,7 +2,6 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { id("com.android.library") - kotlin("android") id("com.google.devtools.ksp") alias(libs.plugins.kotlin.compose.compiler) } @@ -69,9 +68,9 @@ dependencies { testImplementation(libs.bundles.form.test) testImplementation(libs.test.junit) androidTestImplementation(libs.test.compose.ui.test) - androidTestApi(libs.test.mockitoCore) - androidTestApi(libs.test.mockitoKotlin) - androidTestApi(libs.test.dexmaker.mockitoInline) + androidTestImplementation(libs.test.mockitoCore) + androidTestImplementation(libs.test.mockitoKotlin) + androidTestImplementation(libs.test.dexmaker.mockitoInline) debugImplementation(libs.androidx.compose.uitooling) debugImplementation(libs.test.ui.test.manifest) diff --git a/form/src/main/java/org/dhis2/form/di/Injector.kt b/form/src/main/java/org/dhis2/form/di/Injector.kt index e0e481eaae0..87da96a7f7a 100644 --- a/form/src/main/java/org/dhis2/form/di/Injector.kt +++ b/form/src/main/java/org/dhis2/form/di/Injector.kt @@ -237,7 +237,7 @@ object Injector { private fun provideEnrollmentObjectRepository(enrollmentUid: String): EnrollmentObjectRepository = provideD2().enrollmentModule().enrollments().uid(enrollmentUid) - private fun provideCrashReportController(context: Context) = CrashReportControllerImpl(context) + private fun provideCrashReportController(context: Context) = CrashReportControllerImpl(context, sentryDsn = "") private fun provideNetworkUtils(context: Context) = NetworkUtils(context) diff --git a/gradle.properties b/gradle.properties index e13a05e180a..7d5c150076d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,6 +17,10 @@ org.gradle.jvmargs=-Xmx4096M -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF # org.gradle.parallel=true android.useAndroidX=true android.enableJetifier=true +# TODO: Remove when SonarQube Gradle plugin supports AGP 9.x new DSL (AppExtension removal) +# NOTE: AGP 9.1.0 also removed getCDirectories() from SourceProvider, breaking sonar-scanner-gradle +# 7.2.3.7755. Pinned to AGP 9.0.1 until SonarQube Gradle plugin 7.3 adds AGP 9.1+ support. +android.newDsl=false #disable firebase performance. Should be enabled for release firebasePerformanceInstrumentationEnabled=false @@ -35,13 +39,12 @@ org.gradle.caching=true android.suppressUnsupportedCompileSdk=32 android.nonTransitiveRClass=false -android.nonFinalResIds=false - -android.enableR8.fullMode=false # Kotlin compiler flags -kotlin.daemon.jvmargs=-Xmx2048M +kotlin.daemon.jvmargs=-Xmx4096M kotlin.incremental=true # Enable dependency verification org.gradle.dependency.verification.mode=lenient +android.r8.strictFullModeForKeepRules=false +kotlinx.atomicfu.enableJvmIrTransformation=true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 677c0a4a363..043aeb6f504 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -6,8 +6,8 @@ sdk = "36" minSdk = "23" vCode = "151" vName = "3.4.0-DEV" -gradle = "8.13.2" -kotlin = '2.2.21' +gradle = "9.0.1" +kotlin = '2.3.10' dagger = '2.57.2' jacoco = '0.8.14' designSystem = "0.7.0-SNAPSHOT" @@ -44,8 +44,8 @@ rxandroid = "2.1.1" maplibremarkerview = "3.0.2" maplibreannotation = "3.0.2" matomo = "4.4" -sentry = "8.29.0" -sentryPlugin = "5.12.2" +sentry = "8.33.0" +sentryPlugin = "6.1.0" timber = "5.0.1" rxlint = "1.7.8" crashactivity = "2.4.0" @@ -89,10 +89,10 @@ ktxml = "1.0.0" atomicfu = "0.29.0" playservicesauth = "21.4.0" playservicesphone = "18.0.2" #Can not be updated to latest due minSDK requirement of 23 -ksp = "2.2.21-2.0.4" +ksp = "2.3.6" commonsText = "1.14.0" ktlint = "13.1.0" -sonarqube = "7.0.1.6134" +sonarqube = "7.2.3.7755" browser = "1.9.0" biometric = "1.1.0" coil = "3.3.0" @@ -224,11 +224,14 @@ coil-network = { module = "io.coil-kt.coil3:coil-network-okhttp", version.ref = androidx-work-runtime-ktx = { group = "androidx.work", name = "work-runtime-ktx", version.ref = "workRuntimeKtx" } [plugins] +kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } +android-kotlin-multiplatform-library = { id = "com.android.kotlin.multiplatform.library", version.ref = "gradle" } kotlin-compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } kotlin-serialization = { id = "kotlinx-serialization" } compose = { id = "org.jetbrains.compose", version.ref = "composePluginVersion" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } kotlin-atomicfu = { id = "org.jetbrains.kotlinx.atomicfu", version.ref = "atomicfu" } +legacy-kapt = { id = "com.android.legacy-kapt", version.ref = "gradle" } ktlint = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlint" } sonarqube = { id = "org.sonarqube", version.ref = "sonarqube" } sentry = { id = "io.sentry.android.gradle", version.ref = "sentryPlugin" } diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 702f5acb887..575fc7e0c70 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -131,6 +131,11 @@ + + + + + @@ -519,6 +524,11 @@ + + + + + @@ -973,6 +983,11 @@ + + + + + @@ -1089,6 +1104,19 @@ + + + + + + + + + + + + + @@ -1115,6 +1143,19 @@ + + + + + + + + + + + + + @@ -1158,6 +1199,14 @@ + + + + + + + + @@ -1272,6 +1321,11 @@ + + + + + @@ -1530,6 +1584,11 @@ + + + + + @@ -1636,6 +1695,11 @@ + + + + + @@ -1741,6 +1805,11 @@ + + + + + @@ -1831,6 +1900,11 @@ + + + + + @@ -1889,6 +1963,11 @@ + + + + + @@ -1944,6 +2023,11 @@ + + + + + @@ -2076,6 +2160,11 @@ + + + + + @@ -2134,6 +2223,11 @@ + + + + + @@ -2192,6 +2286,11 @@ + + + + + @@ -2250,6 +2349,11 @@ + + + + + @@ -2355,6 +2459,11 @@ + + + + + @@ -2444,6 +2553,11 @@ + + + + + @@ -2785,6 +2899,22 @@ + + + + + + + + + + + + + + + + @@ -2809,6 +2939,22 @@ + + + + + + + + + + + + + + + + @@ -2825,6 +2971,22 @@ + + + + + + + + + + + + + + + + @@ -2841,6 +3003,22 @@ + + + + + + + + + + + + + + + + @@ -2865,6 +3043,22 @@ + + + + + + + + + + + + + + + + @@ -2889,6 +3083,22 @@ + + + + + + + + + + + + + + + + @@ -2913,6 +3123,22 @@ + + + + + + + + + + + + + + + + @@ -3089,6 +3315,14 @@ + + + + + + + + @@ -3216,6 +3450,9 @@ + + + @@ -3260,6 +3497,9 @@ + + + @@ -3323,6 +3563,9 @@ + + + @@ -3367,6 +3610,9 @@ + + + @@ -3553,6 +3799,9 @@ + + + @@ -3605,6 +3854,9 @@ + + + @@ -3627,6 +3879,16 @@ + + + + + + + + + + @@ -3681,6 +3943,9 @@ + + + @@ -3777,6 +4042,9 @@ + + + @@ -3818,6 +4086,9 @@ + + + @@ -3858,6 +4129,11 @@ + + + + + @@ -3929,6 +4205,9 @@ + + + @@ -5213,6 +5492,11 @@ + + + + + @@ -5370,6 +5654,22 @@ + + + + + + + + + + + + + + + + @@ -5386,6 +5686,22 @@ + + + + + + + + + + + + + + + + @@ -5402,6 +5718,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -5418,6 +5770,22 @@ + + + + + + + + + + + + + + + + @@ -5434,6 +5802,22 @@ + + + + + + + + + + + + + + + + @@ -5466,6 +5850,22 @@ + + + + + + + + + + + + + + + + @@ -5498,6 +5898,22 @@ + + + + + + + + + + + + + + + + @@ -5514,6 +5930,22 @@ + + + + + + + + + + + + + + + + @@ -5530,6 +5962,22 @@ + + + + + + + + + + + + + + + + @@ -5546,6 +5994,22 @@ + + + + + + + + + + + + + + + + @@ -5562,6 +6026,22 @@ + + + + + + + + + + + + + + + + @@ -5578,6 +6058,22 @@ + + + + + + + + + + + + + + + + @@ -5594,6 +6090,22 @@ + + + + + + + + + + + + + + + + @@ -5618,6 +6130,22 @@ + + + + + + + + + + + + + + + + @@ -5634,6 +6162,22 @@ + + + + + + + + + + + + + + + + @@ -5650,6 +6194,22 @@ + + + + + + + + + + + + + + + + @@ -5666,6 +6226,22 @@ + + + + + + + + + + + + + + + + @@ -5682,6 +6258,22 @@ + + + + + + + + + + + + + + + + @@ -5698,6 +6290,22 @@ + + + + + + + + + + + + + + + + @@ -5714,6 +6322,22 @@ + + + + + + + + + + + + + + + + @@ -5722,6 +6346,14 @@ + + + + + + + + @@ -5738,6 +6370,22 @@ + + + + + + + + + + + + + + + + @@ -5754,7 +6402,23 @@ - + + + + + + + + + + + + + + + + + @@ -5770,6 +6434,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -5786,6 +6482,22 @@ + + + + + + + + + + + + + + + + @@ -5802,6 +6514,22 @@ + + + + + + + + + + + + + + + + @@ -5842,6 +6570,22 @@ + + + + + + + + + + + + + + + + @@ -5858,6 +6602,22 @@ + + + + + + + + + + + + + + + + @@ -5922,6 +6682,22 @@ + + + + + + + + + + + + + + + + @@ -6002,6 +6778,22 @@ + + + + + + + + + + + + + + + + @@ -6018,6 +6810,22 @@ + + + + + + + + + + + + + + + + @@ -6034,6 +6842,22 @@ + + + + + + + + + + + + + + + + @@ -6050,6 +6874,22 @@ + + + + + + + + + + + + + + + + @@ -6098,6 +6938,22 @@ + + + + + + + + + + + + + + + + @@ -6114,6 +6970,22 @@ + + + + + + + + + + + + + + + + @@ -6130,6 +7002,22 @@ + + + + + + + + + + + + + + + + @@ -6146,6 +7034,22 @@ + + + + + + + + + + + + + + + + @@ -6162,6 +7066,22 @@ + + + + + + + + + + + + + + + + @@ -6178,6 +7098,22 @@ + + + + + + + + + + + + + + + + @@ -6194,6 +7130,22 @@ + + + + + + + + + + + + + + + + @@ -6210,6 +7162,22 @@ + + + + + + + + + + + + + + + + @@ -6226,6 +7194,22 @@ + + + + + + + + + + + + + + + + @@ -6242,6 +7226,22 @@ + + + + + + + + + + + + + + + + @@ -6258,6 +7258,22 @@ + + + + + + + + + + + + + + + + @@ -6274,6 +7290,22 @@ + + + + + + + + + + + + + + + + @@ -6290,6 +7322,22 @@ + + + + + + + + + + + + + + + + @@ -6306,6 +7354,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -6322,6 +7418,22 @@ + + + + + + + + + + + + + + + + @@ -6720,6 +7832,14 @@ + + + + + + + + @@ -6874,6 +7994,14 @@ + + + + + + + + @@ -6932,6 +8060,11 @@ + + + + + @@ -6948,6 +8081,11 @@ + + + + + @@ -6964,6 +8102,14 @@ + + + + + + + + @@ -6988,6 +8134,14 @@ + + + + + + + + @@ -7020,6 +8174,14 @@ + + + + + + + + @@ -7036,6 +8198,14 @@ + + + + + + + + @@ -7049,6 +8219,11 @@ + + + + + @@ -7058,6 +8233,9 @@ + + + @@ -7101,6 +8279,11 @@ + + + + + @@ -7362,6 +8545,21 @@ + + + + + + + + + + + + + + + @@ -7378,6 +8576,19 @@ + + + + + + + + + + + + + @@ -7402,6 +8613,22 @@ + + + + + + + + + + + + + + + + @@ -7410,6 +8637,14 @@ + + + + + + + + @@ -7438,6 +8673,21 @@ + + + + + + + + + + + + + + + @@ -7446,6 +8696,14 @@ + + + + + + + + @@ -7454,6 +8712,14 @@ + + + + + + + + @@ -7462,6 +8728,14 @@ + + + + + + + + @@ -7470,6 +8744,14 @@ + + + + + + + + @@ -7478,6 +8760,14 @@ + + + + + + + + @@ -7486,6 +8776,14 @@ + + + + + + + + @@ -8104,6 +9402,14 @@ + + + + + + + + @@ -8128,6 +9434,14 @@ + + + + + + + + @@ -8330,6 +9644,24 @@ + + + + + + + + + + + + + + + + + + @@ -8348,6 +9680,14 @@ + + + + + + + + @@ -9655,6 +10995,14 @@ + + + + + + + + @@ -9671,6 +11019,14 @@ + + + + + + + + @@ -9687,6 +11043,14 @@ + + + + + + + + @@ -9695,6 +11059,14 @@ + + + + + + + + @@ -9711,6 +11083,14 @@ + + + + + + + + @@ -9727,6 +11107,14 @@ + + + + + + + + @@ -9743,6 +11131,14 @@ + + + + + + + + @@ -9759,6 +11155,14 @@ + + + + + + + + @@ -9775,11 +11179,24 @@ + + + + + + + + + + + + + @@ -10094,6 +11511,14 @@ + + + + + + + + @@ -10102,6 +11527,14 @@ + + + + + + + + @@ -10118,6 +11551,14 @@ + + + + + + + + @@ -10219,6 +11660,11 @@ + + + + + @@ -10517,6 +11963,14 @@ + + + + + + + + @@ -10864,6 +12318,14 @@ + + + + + + + + @@ -12376,6 +13838,14 @@ + + + + + + + + @@ -12384,6 +13854,22 @@ + + + + + + + + + + + + + + + + @@ -12392,6 +13878,14 @@ + + + + + + + + @@ -12400,6 +13894,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -12408,6 +13926,14 @@ + + + + + + + + @@ -12424,11 +13950,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -12437,6 +13987,22 @@ + + + + + + + + + + + + + + + + @@ -12445,6 +14011,22 @@ + + + + + + + + + + + + + + + + @@ -12453,6 +14035,14 @@ + + + + + + + + @@ -12469,6 +14059,22 @@ + + + + + + + + + + + + + + + + @@ -12477,6 +14083,14 @@ + + + + + + + + @@ -12485,6 +14099,22 @@ + + + + + + + + + + + + + + + + @@ -12493,6 +14123,14 @@ + + + + + + + + @@ -12509,6 +14147,22 @@ + + + + + + + + + + + + + + + + @@ -12517,6 +14171,22 @@ + + + + + + + + + + + + + + + + @@ -12525,6 +14195,25 @@ + + + + + + + + + + + + + + + + + + + @@ -12536,6 +14225,22 @@ + + + + + + + + + + + + + + + + @@ -12544,6 +14249,22 @@ + + + + + + + + + + + + + + + + @@ -12552,6 +14273,22 @@ + + + + + + + + + + + + + + + + @@ -12560,6 +14297,14 @@ + + + + + + + + @@ -12568,6 +14313,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -12576,6 +14345,14 @@ + + + + + + + + @@ -12584,6 +14361,14 @@ + + + + + + + + @@ -12608,6 +14393,22 @@ + + + + + + + + + + + + + + + + @@ -12616,6 +14417,14 @@ + + + + + + + + @@ -12624,6 +14433,14 @@ + + + + + + + + @@ -12640,6 +14457,14 @@ + + + + + + + + @@ -12688,6 +14513,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -12704,6 +14553,14 @@ + + + + + + + + @@ -12712,6 +14569,14 @@ + + + + + + + + @@ -12720,6 +14585,14 @@ + + + + + + + + @@ -12728,6 +14601,14 @@ + + + + + + + + @@ -12736,6 +14617,14 @@ + + + + + + + + @@ -12744,6 +14633,14 @@ + + + + + + + + @@ -12752,6 +14649,14 @@ + + + + + + + + @@ -12840,6 +14745,9 @@ + + + @@ -12877,6 +14785,17 @@ + + + + + + + + + + + @@ -12964,6 +14883,11 @@ + + + + + @@ -12979,6 +14903,11 @@ + + + + + @@ -13197,6 +15126,17 @@ + + + + + + + + + + + @@ -13205,6 +15145,22 @@ + + + + + + + + + + + + + + + + @@ -13213,6 +15169,22 @@ + + + + + + + + + + + + + + + + @@ -13221,6 +15193,22 @@ + + + + + + + + + + + + + + + + @@ -13229,6 +15217,22 @@ + + + + + + + + + + + + + + + + @@ -13237,6 +15241,14 @@ + + + + + + + + @@ -13245,11 +15257,21 @@ + + + + + + + + + + @@ -14215,10 +16237,29 @@ + + + + + + + + + + + + + + + + + + + @@ -14606,6 +16647,14 @@ + + + + + + + + @@ -14622,6 +16671,14 @@ + + + + + + + + @@ -14696,6 +16753,14 @@ + + + + + + + + @@ -14712,6 +16777,14 @@ + + + + + + + + @@ -14849,11 +16922,26 @@ + + + + + + + + + + + + + + + @@ -14870,6 +16958,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -14878,6 +16993,14 @@ + + + + + + + + @@ -14886,11 +17009,24 @@ + + + + + + + + + + + + + diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ff96c38feaf..ac6cfd349c9 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Tue Jul 22 10:02:18 CEST 2025 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/login/build.gradle.kts b/login/build.gradle.kts index 47cc88ba03d..9bfcdae9e18 100644 --- a/login/build.gradle.kts +++ b/login/build.gradle.kts @@ -1,10 +1,7 @@ -import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi -import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetTree - plugins { - kotlin("multiplatform") + alias(libs.plugins.kotlin.multiplatform) alias(libs.plugins.compose) - id("com.android.library") + alias(libs.plugins.android.kotlin.multiplatform.library) alias(libs.plugins.kotlin.compose.compiler) alias(libs.plugins.kotlin.serialization) } @@ -14,12 +11,22 @@ kotlin { compilerOptions { freeCompilerArgs.add("-Xcontext-parameters") } - androidTarget { - compilerOptions { - jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17) + + androidLibrary { + namespace = "org.dhis2.mobile.login" + compileSdk = libs.versions.sdk.get().toInt() + minSdk = libs.versions.minSdk.get().toInt() + enableCoreLibraryDesugaring = true + compilerOptions { jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17) } + packaging { + resources { + pickFirsts.add("values*/**") + } + } + withHostTestBuilder {}.configure {} + withDeviceTestBuilder { sourceSetTreeName = "test" }.configure { + instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } - @OptIn(ExperimentalKotlinGradlePluginApi::class) - instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) } jvm("desktop") @@ -74,6 +81,20 @@ kotlin { implementation(libs.koin.androidx.compose) implementation(libs.androidx.activity.compose) implementation(libs.androidx.browser) + compileOnly(libs.androidx.compose.uitooling) + } + } + + getByName("androidHostTest") { + dependencies { + implementation(libs.junit.jupiter) + } + } + + getByName("androidDeviceTest") { + dependencies { + implementation(libs.test.compose.ui.test.junit4.android) + implementation(libs.test.ui.test.manifest) } } @@ -92,57 +113,6 @@ compose.resources { generateResClass = always } -android { - namespace = "org.dhis2.mobile.login" - compileSdk = libs.versions.sdk.get().toInt() - - sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml") - sourceSets["main"].res.srcDirs("src/androidMain/res") - - defaultConfig { - minSdk = libs.versions.minSdk.get().toInt() - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } - compileOptions { - isCoreLibraryDesugaringEnabled = true - - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - - buildTypes { - getByName("debug") { - - } - getByName("release") { - - } - } - buildFeatures.buildConfig = true - - flavorDimensions += listOf("default") - productFlavors { - create("dhis2") { - buildConfigField("String", "LOGIN_TEST", "\"test\"") - } - create("dhis2PlayServices") { - buildConfigField("String", "LOGIN_TEST", "\"test\"") - - } - create("dhis2Training") { - buildConfigField("String", "LOGIN_TEST", "\"test\"") - } - } -} - dependencies { coreLibraryDesugaring(libs.desugar) } - -dependencies { - testImplementation(libs.junit.jupiter) - debugImplementation(libs.androidx.compose.preview) - debugImplementation(libs.androidx.compose.uitooling) - androidTestImplementation(libs.test.compose.ui.test.junit4.android) - debugImplementation(libs.test.ui.test.manifest) -} \ No newline at end of file diff --git a/login/src/androidInstrumentedTest/kotlin/screen/TwoFAToEnableScreenTest.kt b/login/src/androidInstrumentedTest/kotlin/screen/TwoFAToEnableScreenTest.kt deleted file mode 100644 index 51b89b75804..00000000000 --- a/login/src/androidInstrumentedTest/kotlin/screen/TwoFAToEnableScreenTest.kt +++ /dev/null @@ -1,74 +0,0 @@ -package screen - -import androidx.compose.ui.test.ExperimentalTestApi -import androidx.compose.ui.test.assertIsDisplayed -import androidx.compose.ui.test.assertIsNotEnabled -import androidx.compose.ui.test.hasTestTag -import androidx.compose.ui.test.hasText -import androidx.compose.ui.test.junit4.createComposeRule -import androidx.compose.ui.test.onNodeWithTag -import androidx.compose.ui.test.runComposeUiTest -import org.dhis2.mobile.login.authentication.ui.screen.TURN_ON_BUTTON_TEST_TAG -import org.dhis2.mobile.login.authentication.ui.screen.TwoFAToEnableScreen -import org.dhis2.mobile.login.authentication.ui.state.TwoFAUiState -import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme -import org.junit.Rule -import kotlin.test.Test - -@OptIn(ExperimentalTestApi::class) -class TwoFAToEnableScreenTest { - @get:Rule - val composeTestRule = createComposeRule() - - private val secretCode = "secret_code" - - @Test - fun should_init_with_disabled_button() { - with(composeTestRule) { - setContent { - DHIS2Theme { - TwoFAToEnableScreen( - enableUiState = - TwoFAUiState.Enable( - secretCode = secretCode, - isEnabling = false, - enableErrorMessage = null, - ), - onAuthenticatorButtonClicked = {}, - onCopyCodeButtonClicked = {}, - onEnableButtonClicked = {}, - ) - } - } - - onNodeWithTag(TURN_ON_BUTTON_TEST_TAG).assertIsNotEnabled() - } - } - - @Test - fun should_set_error_if_code_is_wrong() = - runComposeUiTest { - with(composeTestRule) { - setContent { - DHIS2Theme { - TwoFAToEnableScreen( - enableUiState = - TwoFAUiState.Enable( - secretCode = secretCode, - isEnabling = false, - enableErrorMessage = "Error code", - ), - onAuthenticatorButtonClicked = {}, - onCopyCodeButtonClicked = {}, - onEnableButtonClicked = {}, - ) - } - } - - onNode( - hasTestTag("INPUT_TEXT_SUPPORTING_TEXT") and - hasText("two_fa_failed_to_turn_on"), - ).assertIsDisplayed() - } - } -} diff --git a/login/src/androidMain/kotlin/org/dhis2/mobile/login/accounts/data/repository/AccountRepositoryImpl.kt b/login/src/androidMain/kotlin/org/dhis2/mobile/login/accounts/data/repository/AccountRepositoryImpl.kt index 173dafcd054..4b6f786a65d 100644 --- a/login/src/androidMain/kotlin/org/dhis2/mobile/login/accounts/data/repository/AccountRepositoryImpl.kt +++ b/login/src/androidMain/kotlin/org/dhis2/mobile/login/accounts/data/repository/AccountRepositoryImpl.kt @@ -1,7 +1,6 @@ package org.dhis2.mobile.login.accounts.data.repository import org.dhis2.mobile.commons.providers.PreferenceProvider -import org.dhis2.mobile.login.BuildConfig import org.dhis2.mobile.login.accounts.data.credentials.defaultTestingCredentials import org.dhis2.mobile.login.accounts.data.credentials.trainingTestingCredentials import org.dhis2.mobile.login.accounts.domain.model.AccountModel @@ -12,6 +11,8 @@ import org.hisp.dhis.android.core.configuration.internal.DatabaseAccount class AccountRepositoryImpl( private val d2: D2, private val preferenceProvider: PreferenceProvider, + private val isDebug: Boolean, + private val isTrainingFlavor: Boolean, ) : AccountRepository { override suspend fun getLoggedInAccounts(): List = d2.userModule().accountManager().getAccounts().map { @@ -20,9 +21,9 @@ class AccountRepositoryImpl( override suspend fun availableServers(): List { val providedServers = - if (BuildConfig.DEBUG) { + if (isDebug) { defaultTestingCredentials - } else if (BuildConfig.FLAVOR == "dhis2Training") { + } else if (isTrainingFlavor) { trainingTestingCredentials } else { emptyList() diff --git a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.android.kt b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.android.kt index 67f3de6957d..75e5b511142 100644 --- a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.android.kt +++ b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.android.kt @@ -1,5 +1,7 @@ package org.dhis2.mobile.login.main.di +import android.content.Context +import android.content.pm.ApplicationInfo import org.dhis2.mobile.commons.auth.OpenIdController import org.dhis2.mobile.commons.auth.OpenIdControllerImpl import org.dhis2.mobile.login.accounts.data.repository.AccountRepository @@ -14,9 +16,13 @@ import org.koin.dsl.module internal actual val accountModule = module { factory { + val context = get() + val isDebug = context.applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE != 0 AccountRepositoryImpl( get(), get(), + isDebug = isDebug, + isTrainingFlavor = getProperty("isTrainingFlavor", false), ) } diff --git a/run_tests.sh b/run_tests.sh index 1aaa083608d..1907444367b 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -6,6 +6,6 @@ echo "Running Ktlint check..." ./gradlew ktlintCheck echo "Running Unit Tests..." -./gradlew testDebugUnitTest testDhis2DebugUnitTest +./gradlew testDebugUnitTest testDhis2DebugUnitTest testAndroidHostTest echo "All tasks completed!" diff --git a/stock-usecase/build.gradle.kts b/stock-usecase/build.gradle.kts index 76a74d878a7..bc413a81117 100644 --- a/stock-usecase/build.gradle.kts +++ b/stock-usecase/build.gradle.kts @@ -2,7 +2,6 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { id("com.android.library") - kotlin("android") id("kotlin-parcelize") alias(libs.plugins.kotlin.serialization) alias(libs.plugins.kotlin.compose.compiler) @@ -20,7 +19,6 @@ android { defaultConfig { minSdk = libs.versions.minSdk.get().toInt() testOptions.targetSdk = libs.versions.sdk.get().toInt() - multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") diff --git a/sync/build.gradle.kts b/sync/build.gradle.kts index 4912fafc6f4..75f8fc6f4e2 100644 --- a/sync/build.gradle.kts +++ b/sync/build.gradle.kts @@ -1,10 +1,9 @@ -import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { - kotlin("multiplatform") + alias(libs.plugins.kotlin.multiplatform) alias(libs.plugins.compose) - id("com.android.library") + alias(libs.plugins.android.kotlin.multiplatform.library) alias(libs.plugins.kotlin.compose.compiler) alias(libs.plugins.kotlin.serialization) } @@ -13,22 +12,22 @@ kotlin { compilerOptions { freeCompilerArgs.add("-Xcontext-parameters") - @OptIn(ExperimentalKotlinGradlePluginApi::class) freeCompilerArgs.add("-Xexpect-actual-classes") } - androidTarget { - compilations.all { - compileTaskProvider.configure { - compilerOptions { - jvmTarget.set(JvmTarget.JVM_17) - } - } + androidLibrary { + namespace = "org.dhis2.mobile.sync" + compileSdk = libs.versions.sdk.get().toInt() + minSdk = libs.versions.minSdk.get().toInt() + compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } + androidResources { enable = true } + withHostTestBuilder {}.configure {} + withDeviceTestBuilder {}.configure { + instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } } - jvm("desktop") - + jvm("desktop") sourceSets { @@ -64,20 +63,23 @@ kotlin { implementation(libs.dhis2.android.sdk) api(libs.analytics.timber) implementation(libs.androidx.work) + compileOnly(libs.androidx.compose.preview) + compileOnly(libs.androidx.compose.uitooling) } - androidUnitTest.dependencies { - implementation(kotlin("test")) - implementation(libs.junit.jupiter) - implementation(libs.test.turbine) - implementation(libs.test.kotlinCoroutines) - implementation(libs.test.mockitoKotlin) + getByName("androidHostTest") { + dependencies { + implementation(kotlin("test")) + implementation(libs.junit.jupiter) + implementation(libs.test.turbine) + implementation(libs.test.kotlinCoroutines) + implementation(libs.test.mockitoKotlin) + } } - androidInstrumentedTest.dependencies { + getByName("androidDeviceTest") { dependencies { implementation(libs.test.junit.ext) - } } @@ -95,30 +97,6 @@ compose.resources { generateResClass = always } -android { - namespace = "org.dhis2.mobile.sync" - compileSdk = libs.versions.sdk.get().toInt() - defaultConfig { - minSdk = libs.versions.minSdk.get().toInt() - val bitriseSentryDSN = System.getenv("SENTRY_DSN") ?: "" - buildConfigField("String", "SENTRY_DSN", "\"${bitriseSentryDSN}\"") - } - buildFeatures { - buildConfig = true - } - compileOptions { - isCoreLibraryDesugaringEnabled = true - - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - - dependencies { - coreLibraryDesugaring(libs.desugar) - } -} - dependencies { - debugImplementation(libs.androidx.compose.preview) - debugImplementation(libs.androidx.compose.uitooling) + coreLibraryDesugaring(libs.desugar) } diff --git a/sync/src/androidUnitTest/kotlin/org.dhis2.mobile.sync.data/AndroidSyncRepositoryTest.kt b/sync/src/androidHostTest/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepositoryTest.kt similarity index 100% rename from sync/src/androidUnitTest/kotlin/org.dhis2.mobile.sync.data/AndroidSyncRepositoryTest.kt rename to sync/src/androidHostTest/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepositoryTest.kt diff --git a/sync/src/main/res/drawable/ic_sync.xml b/sync/src/androidMain/res/drawable/ic_sync.xml similarity index 100% rename from sync/src/main/res/drawable/ic_sync.xml rename to sync/src/androidMain/res/drawable/ic_sync.xml diff --git a/tracker/build.gradle.kts b/tracker/build.gradle.kts index 9a9ab870e3e..6c026c526b3 100644 --- a/tracker/build.gradle.kts +++ b/tracker/build.gradle.kts @@ -1,14 +1,22 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { - kotlin("multiplatform") + alias(libs.plugins.kotlin.multiplatform) alias(libs.plugins.compose) - id("com.android.library") + alias(libs.plugins.android.kotlin.multiplatform.library) alias(libs.plugins.kotlin.compose.compiler) } kotlin { - androidTarget { - compilerOptions { - jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17) + androidLibrary { + namespace = "org.dhis2.mobile.tracker" + compileSdk = libs.versions.sdk.get().toInt() + minSdk = libs.versions.minSdk.get().toInt() + compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } + androidResources { enable = true } + withHostTestBuilder {}.configure {} + withDeviceTestBuilder {}.configure { + instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } } @@ -62,14 +70,17 @@ kotlin { implementation(libs.koin.androidx.compose) implementation(project(":commons")) implementation(project(":dhis2_android_maps")) + compileOnly(libs.androidx.compose.uitooling) } - androidUnitTest.dependencies { - implementation(kotlin("test")) - implementation(libs.junit.jupiter) - implementation(libs.test.turbine) - implementation(libs.test.kotlinCoroutines) - implementation(libs.test.mockitoKotlin) + getByName("androidHostTest") { + dependencies { + implementation(kotlin("test")) + implementation(libs.junit.jupiter) + implementation(libs.test.turbine) + implementation(libs.test.kotlinCoroutines) + implementation(libs.test.mockitoKotlin) + } } val desktopMain by getting { @@ -86,35 +97,6 @@ compose.resources { generateResClass = always } -android { - namespace = "org.dhis2.mobile.tracker" - compileSdk = libs.versions.sdk.get().toInt() - - sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml") - sourceSets["main"].res.srcDirs("src/androidMain/res") - - defaultConfig { - minSdk = libs.versions.minSdk.get().toInt() - - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") - } - - compileOptions { - isCoreLibraryDesugaringEnabled = true - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - - dependencies { - coreLibraryDesugaring(libs.desugar) - } -} - - - dependencies { - testImplementation(libs.junit.jupiter) - debugImplementation(libs.androidx.compose.preview) - debugImplementation(libs.androidx.compose.uitooling) -} \ No newline at end of file + coreLibraryDesugaring(libs.desugar) +} diff --git a/tracker/src/androidUnitTest/kotlin/org/dhis2/tracker/relationships/AndroidRelationshipFakeModels.kt b/tracker/src/androidHostTest/kotlin/org/dhis2/tracker/relationships/AndroidRelationshipFakeModels.kt similarity index 100% rename from tracker/src/androidUnitTest/kotlin/org/dhis2/tracker/relationships/AndroidRelationshipFakeModels.kt rename to tracker/src/androidHostTest/kotlin/org/dhis2/tracker/relationships/AndroidRelationshipFakeModels.kt diff --git a/tracker/src/androidUnitTest/kotlin/org/dhis2/tracker/relationships/data/TrackerRelationshipsRepositoryTest.kt b/tracker/src/androidHostTest/kotlin/org/dhis2/tracker/relationships/data/TrackerRelationshipsRepositoryTest.kt similarity index 100% rename from tracker/src/androidUnitTest/kotlin/org/dhis2/tracker/relationships/data/TrackerRelationshipsRepositoryTest.kt rename to tracker/src/androidHostTest/kotlin/org/dhis2/tracker/relationships/data/TrackerRelationshipsRepositoryTest.kt diff --git a/tracker/src/androidUnitTest/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImplTest.kt b/tracker/src/androidHostTest/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImplTest.kt similarity index 100% rename from tracker/src/androidUnitTest/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImplTest.kt rename to tracker/src/androidHostTest/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImplTest.kt From db30687b4585d0cc1fe9a96efc4f2f57ffd6cde7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manu=20Mu=C3=B1oz?= Date: Fri, 6 Mar 2026 17:34:52 +0100 Subject: [PATCH 080/260] feat: [ANDROAPP-7189] implement InputSegmentedShell on TFA (#4677) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: [ANDROAPP-7189] implement InputSegmentedShell on TFA Signed-off-by: Manu Muñoz * feat: [ANDROAPP-7189] add input style Signed-off-by: Manu Muñoz * feat: [ANDROAPP-7189] add input style Signed-off-by: Manu Muñoz * feat: disable input on loading Signed-off-by: Manu Muñoz * build: update gradle verification metadata with new compose and kotlin library versions * fix: [ANDROAPP-7189] fix tests --------- Signed-off-by: Manu Muñoz Co-authored-by: andresmr Co-authored-by: Xavier Molloy --- .../aggregates/ui/states/InputDataUiState.kt | 2 +- .../ui/provider/inputfield/AgeProviderTest.kt | 15 +- .../CategorySelectorProviderTest.kt | 4 +- .../provider/inputfield/DateProviderTest.kt | 6 +- .../ui/provider/inputfield/FieldProvider.kt | 2 +- .../InputsForTextValueTypeProvider.kt | 2 +- gradle/verification-metadata.xml | 675 ++++++++++++++++++ .../ui/screen/TwoFADisableScreen.kt | 45 +- .../ui/screen/TwoFAToEnableScreen.kt | 40 +- .../provider/ParameterSelectorItemProvider.kt | 4 +- 10 files changed, 735 insertions(+), 60 deletions(-) diff --git a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/states/InputDataUiState.kt b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/states/InputDataUiState.kt index 0cdcbd9608c..89593684995 100644 --- a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/states/InputDataUiState.kt +++ b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/states/InputDataUiState.kt @@ -28,7 +28,7 @@ internal sealed class CellSelectionState( val inputType: InputType, private val inputExtra: InputExtra, val inputShellState: InputShellState, - val inputStyle: InputStyle = InputStyle.DataInputStyle(), + val inputStyle: InputStyle = InputStyle.DarkInputStyle(), val supportingText: List?, val legendData: LegendData?, val isRequired: Boolean, diff --git a/form/src/androidTest/kotlin/org/dhis2/form/ui/provider/inputfield/AgeProviderTest.kt b/form/src/androidTest/kotlin/org/dhis2/form/ui/provider/inputfield/AgeProviderTest.kt index 8ca5bc97189..f2435faa967 100644 --- a/form/src/androidTest/kotlin/org/dhis2/form/ui/provider/inputfield/AgeProviderTest.kt +++ b/form/src/androidTest/kotlin/org/dhis2/form/ui/provider/inputfield/AgeProviderTest.kt @@ -53,7 +53,7 @@ class AgeProviderTest { composeTestRule.setContent { ProvideInputAge( modifier = Modifier.testTag(INPUT_AGE_TEST_TAG), - inputStyle = InputStyle.DataInputStyle(), + inputStyle = InputStyle.DarkInputStyle(), fieldUiModel = dateValueTypeFieldUiModel, intentHandler = {}, resources = resourceManager, @@ -72,7 +72,7 @@ class AgeProviderTest { composeTestRule.setContent { ProvideInputAge( modifier = Modifier.testTag(INPUT_AGE_TEST_TAG), - inputStyle = InputStyle.DataInputStyle(), + inputStyle = InputStyle.DarkInputStyle(), fieldUiModel = dateValueTypeFieldUiModel, intentHandler = {}, resources = resourceManager, @@ -91,8 +91,7 @@ class AgeProviderTest { composeTestRule.setContent { ProvideInputAge( modifier = Modifier.testTag(INPUT_AGE_TEST_TAG), - - inputStyle = InputStyle.DataInputStyle(), + inputStyle = InputStyle.DarkInputStyle(), fieldUiModel = dateValueTypeFieldUiModel, intentHandler = {}, resources = resourceManager, @@ -113,7 +112,7 @@ class AgeProviderTest { composeTestRule.setContent { ProvideInputAge( modifier = Modifier.testTag(INPUT_AGE_TEST_TAG), - inputStyle = InputStyle.DataInputStyle(), + inputStyle = InputStyle.DarkInputStyle(), fieldUiModel = dateValueTypeFieldUiModel, intentHandler = {}, resources = resourceManager, @@ -135,7 +134,7 @@ class AgeProviderTest { composeTestRule.setContent { ProvideInputAge( modifier = Modifier.testTag(INPUT_AGE_TEST_TAG), - inputStyle = InputStyle.DataInputStyle(), + inputStyle = InputStyle.DarkInputStyle(), fieldUiModel = dateValueTypeFieldUiModel, intentHandler = {}, resources = resourceManager, @@ -162,7 +161,7 @@ class AgeProviderTest { composeTestRule.setContent { ProvideInputAge( modifier = Modifier.testTag(INPUT_AGE_TEST_TAG), - inputStyle = InputStyle.DataInputStyle(), + inputStyle = InputStyle.DarkInputStyle(), fieldUiModel = dateValueTypeFieldUiModel, intentHandler = {}, resources = resourceManager, @@ -183,7 +182,7 @@ class AgeProviderTest { composeTestRule.setContent { ProvideInputAge( modifier = Modifier.testTag(INPUT_AGE_TEST_TAG), - inputStyle = InputStyle.DataInputStyle(), + inputStyle = InputStyle.DarkInputStyle(), fieldUiModel = dateValueTypeFieldUiModel, intentHandler = {}, resources = resourceManager, diff --git a/form/src/androidTest/kotlin/org/dhis2/form/ui/provider/inputfield/CategorySelectorProviderTest.kt b/form/src/androidTest/kotlin/org/dhis2/form/ui/provider/inputfield/CategorySelectorProviderTest.kt index f9523db29c0..a95b10169b4 100644 --- a/form/src/androidTest/kotlin/org/dhis2/form/ui/provider/inputfield/CategorySelectorProviderTest.kt +++ b/form/src/androidTest/kotlin/org/dhis2/form/ui/provider/inputfield/CategorySelectorProviderTest.kt @@ -63,7 +63,7 @@ class CategorySelectorProviderTest { composeTestRule.setContent { ProvideCategorySelectorInput( fieldUiModel = uiModel, - inputStyle = InputStyle.DataInputStyle(), + inputStyle = InputStyle.DarkInputStyle(), ) } @@ -115,7 +115,7 @@ class CategorySelectorProviderTest { Column { ProvideCategorySelectorInput( fieldUiModel = uiModel, - inputStyle = InputStyle.DataInputStyle(), + inputStyle = InputStyle.DarkInputStyle(), ) } } diff --git a/form/src/androidTest/kotlin/org/dhis2/form/ui/provider/inputfield/DateProviderTest.kt b/form/src/androidTest/kotlin/org/dhis2/form/ui/provider/inputfield/DateProviderTest.kt index a01ca035fd3..f43b1eb108b 100644 --- a/form/src/androidTest/kotlin/org/dhis2/form/ui/provider/inputfield/DateProviderTest.kt +++ b/form/src/androidTest/kotlin/org/dhis2/form/ui/provider/inputfield/DateProviderTest.kt @@ -40,7 +40,7 @@ class DateProviderTest { generateFieldUiModel(FIELD_UI_MODEL_UID, DATE_VALUE, DATE_VALUE, ValueType.DATE) composeTestRule.setContent { ProvideInputDate( - inputStyle = InputStyle.DataInputStyle(), + inputStyle = InputStyle.DarkInputStyle(), modifier = Modifier.testTag(INPUT_DATE_TEST_TAG), fieldUiModel = dateValueTypeFieldUiModel, intentHandler = {}, @@ -65,7 +65,7 @@ class DateProviderTest { ) composeTestRule.setContent { ProvideInputDate( - inputStyle = InputStyle.DataInputStyle(), + inputStyle = InputStyle.DarkInputStyle(), modifier = Modifier.testTag(INPUT_DATE_TEST_TAG), fieldUiModel = dateValueTypeFieldUiModel, intentHandler = {}, @@ -88,7 +88,7 @@ class DateProviderTest { composeTestRule.setContent { ProvideInputDate( modifier = Modifier.testTag(INPUT_DATE_TEST_TAG), - inputStyle = InputStyle.DataInputStyle(), + inputStyle = InputStyle.DarkInputStyle(), fieldUiModel = dateValueTypeFieldUiModel, intentHandler = {}, onNextClicked = {}, diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/FieldProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/FieldProvider.kt index b04c8cc3728..07b5e50839e 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/FieldProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/FieldProvider.kt @@ -59,7 +59,7 @@ import org.hisp.dhis.mobile.ui.designsystem.component.model.RegExValidations @Composable fun FieldProvider( modifier: Modifier, - inputStyle: InputStyle = InputStyle.DataInputStyle(), + inputStyle: InputStyle = InputStyle.DarkInputStyle(), fieldUiModel: FieldUiModel, uiEventHandler: (RecyclerViewUiEvents) -> Unit, intentHandler: (FormIntent) -> Unit, diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/InputsForTextValueTypeProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/InputsForTextValueTypeProvider.kt index 8d4d0541424..5fae08416fc 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/InputsForTextValueTypeProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/InputsForTextValueTypeProvider.kt @@ -159,7 +159,7 @@ private fun ProvideQRInput( @Composable private fun ProvideDefaultTextInput( modifier: Modifier, - inputStyle: InputStyle = InputStyle.DataInputStyle(), + inputStyle: InputStyle = InputStyle.DarkInputStyle(), fieldUiModel: FieldUiModel, intentHandler: (FormIntent) -> Unit, focusManager: FocusManager, diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 575fc7e0c70..2da1716887d 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -777,6 +777,11 @@ + + + + + @@ -847,6 +852,14 @@ + + + + + + + + @@ -855,6 +868,11 @@ + + + + + @@ -902,6 +920,11 @@ + + + + + @@ -962,6 +985,14 @@ + + + + + + + + @@ -1268,6 +1299,14 @@ + + + + + + + + @@ -1321,6 +1360,19 @@ + + + + + + + + + + + + + @@ -1355,6 +1407,14 @@ + + + + + + + + @@ -1395,6 +1455,14 @@ + + + + + + + + @@ -1419,6 +1487,14 @@ + + + + + + + + @@ -1435,6 +1511,19 @@ + + + + + + + + + + + + + @@ -1459,6 +1548,14 @@ + + + + + + + + @@ -1488,6 +1585,14 @@ + + + + + + + + @@ -1496,6 +1601,22 @@ + + + + + + + + + + + + + + + + @@ -1506,6 +1627,14 @@ + + + + + + + + @@ -1574,6 +1703,14 @@ + + + + + + + + @@ -1613,6 +1750,14 @@ + + + + + + + + @@ -1642,6 +1787,11 @@ + + + + + @@ -1687,6 +1837,14 @@ + + + + + + + + @@ -1737,6 +1895,11 @@ + + + + + @@ -1792,6 +1955,14 @@ + + + + + + + + @@ -1847,6 +2018,11 @@ + + + + + @@ -1892,6 +2068,14 @@ + + + + + + + + @@ -1934,6 +2118,11 @@ + + + + + @@ -1963,6 +2152,14 @@ + + + + + + + + @@ -1994,6 +2191,11 @@ + + + + + @@ -2023,6 +2225,14 @@ + + + + + + + + @@ -2060,6 +2270,14 @@ + + + + + + + + @@ -2097,6 +2315,11 @@ + + + + + @@ -2147,6 +2370,14 @@ + + + + + + + + @@ -2194,6 +2425,11 @@ + + + + + @@ -2223,6 +2459,14 @@ + + + + + + + + @@ -2257,6 +2501,11 @@ + + + + + @@ -2286,6 +2535,14 @@ + + + + + + + + @@ -2320,6 +2577,11 @@ + + + + + @@ -2349,6 +2611,14 @@ + + + + + + + + @@ -2391,6 +2661,11 @@ + + + + + @@ -2446,6 +2721,14 @@ + + + + + + + + @@ -2493,6 +2776,11 @@ + + + + + @@ -2540,6 +2828,14 @@ + + + + + + + + @@ -3163,6 +3459,14 @@ + + + + + + + + @@ -4375,6 +4679,22 @@ + + + + + + + + + + + + + + + + @@ -4935,6 +5255,11 @@ + + + + + @@ -12877,6 +13202,14 @@ + + + + + + + + @@ -12901,6 +13234,14 @@ + + + + + + + + @@ -12925,6 +13266,14 @@ + + + + + + + + @@ -12941,6 +13290,14 @@ + + + + + + + + @@ -12962,6 +13319,14 @@ + + + + + + + + @@ -12991,6 +13356,14 @@ + + + + + + + + @@ -13020,6 +13393,14 @@ + + + + + + + + @@ -13036,6 +13417,14 @@ + + + + + + + + @@ -13052,6 +13441,14 @@ + + + + + + + + @@ -13116,6 +13513,11 @@ + + + + + @@ -13132,6 +13534,14 @@ + + + + + + + + @@ -13148,6 +13558,14 @@ + + + + + + + + @@ -13172,6 +13590,14 @@ + + + + + + + + @@ -13188,6 +13614,14 @@ + + + + + + + + @@ -13212,6 +13646,14 @@ + + + + + + + + @@ -13228,6 +13670,11 @@ + + + + + @@ -13244,6 +13691,14 @@ + + + + + + + + @@ -13292,6 +13747,11 @@ + + + + + @@ -13308,6 +13768,14 @@ + + + + + + + + @@ -13356,6 +13824,14 @@ + + + + + + + + @@ -13385,6 +13861,14 @@ + + + + + + + + @@ -13401,6 +13885,14 @@ + + + + + + + + @@ -13430,6 +13922,14 @@ + + + + + + + + @@ -13446,6 +13946,14 @@ + + + + + + + + @@ -13475,6 +13983,14 @@ + + + + + + + + @@ -13515,6 +14031,14 @@ + + + + + + + + @@ -13531,6 +14055,14 @@ + + + + + + + + @@ -13547,6 +14079,14 @@ + + + + + + + + @@ -13576,6 +14116,14 @@ + + + + + + + + @@ -13592,6 +14140,14 @@ + + + + + + + + @@ -13621,6 +14177,14 @@ + + + + + + + + @@ -13637,6 +14201,14 @@ + + + + + + + + @@ -13666,6 +14238,14 @@ + + + + + + + + @@ -13682,6 +14262,11 @@ + + + + + @@ -13698,6 +14283,14 @@ + + + + + + + + @@ -13714,6 +14307,14 @@ + + + + + + + + @@ -13743,6 +14344,14 @@ + + + + + + + + @@ -13772,6 +14381,14 @@ + + + + + + + + @@ -13793,6 +14410,14 @@ + + + + + + + + @@ -13822,6 +14447,14 @@ + + + + + + + + @@ -15006,6 +15639,14 @@ + + + + + + + + @@ -15104,6 +15745,14 @@ + + + + + + + + @@ -15733,6 +16382,11 @@ + + + + + @@ -15749,6 +16403,11 @@ + + + + + @@ -16119,6 +16778,14 @@ + + + + + + + + @@ -16135,6 +16802,14 @@ + + + + + + + + diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/ui/screen/TwoFADisableScreen.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/ui/screen/TwoFADisableScreen.kt index ad17df82cf1..171f81c9a22 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/ui/screen/TwoFADisableScreen.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/ui/screen/TwoFADisableScreen.kt @@ -19,11 +19,10 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier -import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.unit.dp import org.dhis2.mobile.login.authentication.ui.state.TwoFAUiState import org.dhis2.mobile.login.resources.Res -import org.dhis2.mobile.login.resources.two_fa_code +import org.dhis2.mobile.login.resources.two_fa_authentication_code import org.dhis2.mobile.login.resources.two_fa_disable_button import org.dhis2.mobile.login.resources.two_fa_disable_desc_1 import org.dhis2.mobile.login.resources.two_fa_disable_desc_2 @@ -35,8 +34,9 @@ import org.hisp.dhis.mobile.ui.designsystem.component.Button import org.hisp.dhis.mobile.ui.designsystem.component.ButtonStyle import org.hisp.dhis.mobile.ui.designsystem.component.ColorStyle import org.hisp.dhis.mobile.ui.designsystem.component.InfoBar +import org.hisp.dhis.mobile.ui.designsystem.component.InputSegmentedShell import org.hisp.dhis.mobile.ui.designsystem.component.InputShellState -import org.hisp.dhis.mobile.ui.designsystem.component.InputText +import org.hisp.dhis.mobile.ui.designsystem.component.InputStyle import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextData import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextState import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor @@ -49,7 +49,7 @@ fun TwoFADisableScreen( onAuthCodeUpdated: (String) -> Unit, onDisable: (String) -> Unit, ) { - var authCode: TextFieldValue by remember(twoFADisableUiState) { mutableStateOf(TextFieldValue("")) } + var authCode by remember(twoFADisableUiState) { mutableStateOf("") } Column(verticalArrangement = Arrangement.spacedBy(16.dp)) { InfoBar( @@ -77,27 +77,28 @@ fun TwoFADisableScreen( stepNumber = "2.", text = stringResource(Res.string.two_fa_disable_desc_2), ) { - InputText( - inputTextFieldValue = authCode, - onValueChanged = { - it?.let { - authCode = it - onAuthCodeUpdated(it.text) - } - }, - title = stringResource(Res.string.two_fa_code), - state = twoFADisableUiState.state, - supportingText = + Text( + text = stringResource(Res.string.two_fa_authentication_code), + style = MaterialTheme.typography.bodyMedium, + ) + InputSegmentedShell( + segmentCount = 6, + inputStyle = InputStyle.BrightInputStyle(), + enabled = !twoFADisableUiState.isDisabling, + supportingTextData = if (twoFADisableUiState.state == InputShellState.ERROR) { - listOf( - SupportingTextData( - text = stringResource(Res.string.two_fa_disable_error), - state = SupportingTextState.ERROR, - ), + SupportingTextData( + text = stringResource(Res.string.two_fa_disable_error), + state = SupportingTextState.ERROR, ) } else { null }, + initialValue = authCode, + onValueChanged = { + authCode = it.replace("-", "") + onAuthCodeUpdated(authCode) + }, ) Button( modifier = Modifier.fillMaxWidth().padding(top = 8.dp), @@ -108,8 +109,8 @@ fun TwoFADisableScreen( }, colorStyle = ColorStyle.ERROR, style = ButtonStyle.FILLED, - enabled = authCode.text.length >= 6 && twoFADisableUiState.isDisabling.not(), - onClick = { onDisable(authCode.text) }, + enabled = authCode.length >= 6 && twoFADisableUiState.isDisabling.not(), + onClick = { onDisable(authCode) }, icon = { Icon( imageVector = Icons.Outlined.KeyOff, diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/ui/screen/TwoFAToEnableScreen.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/ui/screen/TwoFAToEnableScreen.kt index 47f548a0a78..b72adec67f8 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/ui/screen/TwoFAToEnableScreen.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/ui/screen/TwoFAToEnableScreen.kt @@ -26,7 +26,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.testTag import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import org.dhis2.mobile.login.authentication.ui.state.TwoFAUiState @@ -51,8 +50,8 @@ import org.hisp.dhis.mobile.ui.designsystem.component.ButtonStyle import org.hisp.dhis.mobile.ui.designsystem.component.IconButton import org.hisp.dhis.mobile.ui.designsystem.component.IconButtonStyle import org.hisp.dhis.mobile.ui.designsystem.component.InfoBar -import org.hisp.dhis.mobile.ui.designsystem.component.InputShellState -import org.hisp.dhis.mobile.ui.designsystem.component.InputText +import org.hisp.dhis.mobile.ui.designsystem.component.InputSegmentedShell +import org.hisp.dhis.mobile.ui.designsystem.component.InputStyle import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextData import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextState import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme @@ -215,8 +214,8 @@ fun TwoFAAuthStepThree( enableUiState: TwoFAUiState.Enable, onEnableButtonClicked: (String) -> Unit, ) { - var textValue by rememberSaveable(stateSaver = TextFieldValue.Saver) { - mutableStateOf(TextFieldValue("")) + var textValue by rememberSaveable { + mutableStateOf("") } Column( @@ -247,24 +246,25 @@ fun TwoFAAuthStepThree( .padding(top = 16.dp), verticalArrangement = spacedBy(12.dp), ) { - InputText( - title = stringResource(Res.string.two_fa_authentication_code), - supportingText = + Text( + text = stringResource(Res.string.two_fa_authentication_code), + style = MaterialTheme.typography.bodyMedium, + ) + InputSegmentedShell( + segmentCount = 6, + inputStyle = InputStyle.BrightInputStyle(), + enabled = !enableUiState.isEnabling, + supportingTextData = enableUiState.enableErrorMessage?.let { - listOf( - SupportingTextData( - text = stringResource(Res.string.two_fa_failed_to_turn_on), - state = SupportingTextState.ERROR, - ), + SupportingTextData( + text = stringResource(Res.string.two_fa_failed_to_turn_on), + state = SupportingTextState.ERROR, ) }, - inputTextFieldValue = textValue, + initialValue = textValue, onValueChanged = { - if (it != null) { - textValue = it - } + textValue = it.replace("-", "") }, - state = InputShellState.FOCUSED, ) Button( @@ -272,7 +272,7 @@ fun TwoFAAuthStepThree( when (enableUiState.isEnabling) { true -> false else -> { - textValue.text.length == 6 + textValue.length == 6 } }, modifier = @@ -297,7 +297,7 @@ fun TwoFAAuthStepThree( contentDescription = "Status Icon", ) }, - onClick = { onEnableButtonClicked(textValue.text) }, + onClick = { onEnableButtonClicked(textValue) }, ) } } diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/provider/ParameterSelectorItemProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/provider/ParameterSelectorItemProvider.kt index f7aa6f5a9ab..b9652e9e481 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/provider/ParameterSelectorItemProvider.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/provider/ParameterSelectorItemProvider.kt @@ -10,7 +10,7 @@ import org.dhis2.tracker.input.model.TrackerInputType import org.dhis2.tracker.input.ui.action.TrackerInputUiEvent import org.dhis2.tracker.input.ui.provider.TrackerInputProvider import org.dhis2.tracker.input.ui.state.TrackerInputUiState -import org.hisp.dhis.mobile.ui.designsystem.component.InputStyle +import org.hisp.dhis.mobile.ui.designsystem.component.parameter.ParameterInputStyle import org.hisp.dhis.mobile.ui.designsystem.component.parameter.model.ParameterSelectorItemModel import org.hisp.dhis.mobile.ui.designsystem.resource.provideDHIS2Icon import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor @@ -38,7 +38,7 @@ fun provideParameterSelectorItem( inputField = { TrackerInputProvider( modifier = Modifier, - inputStyle = InputStyle.ParameterInputStyle(), + inputStyle = ParameterInputStyle(), inputModel = inputModel, onNextClicked = onNextClicked, onUiEvent = onUiEvent, From 821f462239a443d3f15dc8697ca92a059d6d44b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Mon, 9 Mar 2026 14:58:37 +0100 Subject: [PATCH 081/260] build: update dhis2sdk to 1.14.0-SNAPSHOT (#4715) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 043aeb6f504..ff9b87eaaab 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -11,7 +11,7 @@ kotlin = '2.3.10' dagger = '2.57.2' jacoco = '0.8.14' designSystem = "0.7.0-SNAPSHOT" -dhis2sdk = "1.14.0-20260226.083755-24" +dhis2sdk = "1.14.0-SNAPSHOT" ruleEngine = "3.6.0" expressionParser = "1.3.1" appcompat = "1.7.1" From f9e35a5168589674339bb607492c5d913916eccd Mon Sep 17 00:00:00 2001 From: Xavier Molloy Date: Tue, 10 Mar 2026 08:04:41 +0100 Subject: [PATCH 082/260] fix: [ANDROAPP-7510] Update compose android and multiplatform [skip size] (#4711) * fix: [ANDROAPP-7510] Update compose multiplatform plugin and android compose version * fix: [ANDROAPP-7510] remove design system SNAPSHOTLOCAL from verification metadata file * fix: [ANDROAPP-7510] update verification metadata file * fix: [ANDROAPP-7510] fix tests --- app/build.gradle.kts | 1 + gradle/libs.versions.toml | 4 +- gradle/verification-metadata.xml | 990 ++++++++++++++++++++++++++++++- login/build.gradle.kts | 1 + 4 files changed, 974 insertions(+), 22 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 96701323e44..7b2c4bc3e44 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -352,6 +352,7 @@ dependencies { androidTestImplementation(libs.test.hamcrest) androidTestImplementation(libs.koin.test) androidTestImplementation(libs.koin.test.junit4) + debugImplementation(libs.test.ui.test.manifest) } sentry { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ff9b87eaaab..7d61b86524a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -26,8 +26,8 @@ exif = "1.4.2" corektx = "1.17.0" fragmentktx = "1.8.9" recyclerview = "1.4.0" -compose = "1.9.5" -composePluginVersion = "1.9.3" +compose = "1.10.4" +composePluginVersion = "1.10.1" composePaging = "3.4.1" pagingTesting = "3.4.1" composeConstraintLayout = "1.1.1" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 2da1716887d..5dadef7326a 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -868,11 +868,6 @@ - - - - - @@ -1051,6 +1046,14 @@ + + + + + + + + @@ -1077,6 +1080,14 @@ + + + + + + + + @@ -1307,6 +1318,14 @@ + + + + + + + + @@ -1368,9 +1387,12 @@ - - - + + + + + + @@ -1415,6 +1437,14 @@ + + + + + + + + @@ -1463,6 +1493,14 @@ + + + + + + + + @@ -1495,6 +1533,14 @@ + + + + + + + + @@ -1520,6 +1566,9 @@ + + + @@ -1556,6 +1605,14 @@ + + + + + + + + @@ -1593,6 +1650,14 @@ + + + + + + + + @@ -1609,6 +1674,14 @@ + + + + + + + + @@ -1635,6 +1708,14 @@ + + + + + + + + @@ -1711,6 +1792,14 @@ + + + + + + + + @@ -1792,6 +1881,14 @@ + + + + + + + + @@ -1845,6 +1942,14 @@ + + + + + + + + @@ -1900,6 +2005,14 @@ + + + + + + + + @@ -1963,6 +2076,14 @@ + + + + + + + + @@ -2023,6 +2144,14 @@ + + + + + + + + @@ -2076,6 +2205,14 @@ + + + + + + + + @@ -2123,6 +2260,14 @@ + + + + + + + + @@ -2160,9 +2305,12 @@ - - - + + + + + + @@ -2196,6 +2344,14 @@ + + + + + + + + @@ -2233,9 +2389,12 @@ - - - + + + + + + @@ -2278,6 +2437,14 @@ + + + + + + + + @@ -2320,6 +2487,14 @@ + + + + + + + + @@ -2378,6 +2553,14 @@ + + + + + + + + @@ -2430,6 +2613,14 @@ + + + + + + + + @@ -2467,9 +2658,12 @@ - - - + + + + + + @@ -2506,6 +2700,14 @@ + + + + + + + + @@ -2543,9 +2745,12 @@ - - - + + + + + + @@ -2582,6 +2787,14 @@ + + + + + + + + @@ -2619,6 +2832,14 @@ + + + + + + + + @@ -2666,6 +2887,14 @@ + + + + + + + + @@ -2729,6 +2958,14 @@ + + + + + + + + @@ -2781,6 +3018,14 @@ + + + + + + + + @@ -2836,6 +3081,14 @@ + + + + + + + + @@ -3740,6 +3993,11 @@ + + + + + @@ -3761,6 +4019,14 @@ + + + + + + + + @@ -4004,6 +4270,11 @@ + + + + + @@ -4107,6 +4378,11 @@ + + + + + @@ -4193,6 +4469,14 @@ + + + + + + + + @@ -4227,6 +4511,11 @@ + + + + + @@ -4251,6 +4540,11 @@ + + + + + @@ -4394,6 +4688,14 @@ + + + + + + + + @@ -4438,6 +4740,14 @@ + + + + + + + + @@ -4466,6 +4776,11 @@ + + + + + @@ -4540,6 +4855,11 @@ + + + + + @@ -4553,6 +4873,14 @@ + + + + + + + + @@ -5213,6 +5541,17 @@ + + + + + + + + + + + @@ -5234,6 +5573,14 @@ + + + + + + + + @@ -5259,6 +5606,9 @@ + + + @@ -5273,6 +5623,19 @@ + + + + + + + + + + + + + @@ -5290,6 +5653,9 @@ + + + @@ -5320,6 +5686,14 @@ + + + + + + + + @@ -11296,6 +11670,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -12796,6 +13196,14 @@ + + + + + + + + @@ -12857,6 +13265,11 @@ + + + + + @@ -12881,6 +13294,11 @@ + + + + + @@ -12905,6 +13323,11 @@ + + + + + @@ -12921,6 +13344,14 @@ + + + + + + + + @@ -12953,6 +13384,11 @@ + + + + + @@ -13025,6 +13461,11 @@ + + + + + @@ -13137,6 +13578,11 @@ + + + + + @@ -13150,6 +13596,11 @@ + + + + + @@ -13163,6 +13614,14 @@ + + + + + + + + @@ -13176,6 +13635,14 @@ + + + + + + + + @@ -13192,6 +13659,11 @@ + + + + + @@ -13218,6 +13690,11 @@ + + + + + @@ -13250,6 +13727,11 @@ + + + + + @@ -13274,6 +13756,19 @@ + + + + + + + + + + + + + @@ -13303,6 +13798,14 @@ + + + + + + + + @@ -13340,6 +13843,11 @@ + + + + + @@ -13377,6 +13885,11 @@ + + + + + @@ -13401,6 +13914,11 @@ + + + + + @@ -13449,6 +13967,14 @@ + + + + + + + + @@ -13465,6 +13991,14 @@ + + + + + + + + @@ -13481,6 +14015,14 @@ + + + + + + + + @@ -13497,6 +14039,14 @@ + + + + + + + + @@ -13517,6 +14067,14 @@ + + + + + + + + @@ -13542,6 +14100,14 @@ + + + + + + + + @@ -13558,6 +14124,16 @@ + + + + + + + + + + @@ -13574,6 +14150,11 @@ + + + + + @@ -13598,6 +14179,14 @@ + + + + + + + + @@ -13630,6 +14219,11 @@ + + + + + @@ -13654,6 +14248,19 @@ + + + + + + + + + + + + + @@ -13670,11 +14277,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -13699,6 +14410,14 @@ + + + + + + + + @@ -13748,10 +14467,23 @@ + + + + + + + + + + + + + @@ -13776,6 +14508,19 @@ + + + + + + + + + + + + + @@ -13792,6 +14537,11 @@ + + + + + @@ -13800,6 +14550,14 @@ + + + + + + + + @@ -13845,6 +14603,14 @@ + + + + + + + + @@ -13869,6 +14635,14 @@ + + + + + + + + @@ -13906,6 +14680,11 @@ + + + + + @@ -13930,6 +14709,14 @@ + + + + + + + + @@ -13967,6 +14754,11 @@ + + + + + @@ -13999,6 +14791,11 @@ + + + + + @@ -14039,6 +14836,19 @@ + + + + + + + + + + + + + @@ -14063,6 +14873,14 @@ + + + + + + + + @@ -14100,6 +14918,11 @@ + + + + + @@ -14124,6 +14947,14 @@ + + + + + + + + @@ -14161,6 +14992,11 @@ + + + + + @@ -14185,6 +15021,19 @@ + + + + + + + + + + + + + @@ -14222,6 +15071,11 @@ + + + + + @@ -14246,6 +15100,19 @@ + + + + + + + + + + + + + @@ -14263,10 +15130,18 @@ + + + + + + + + @@ -14291,6 +15166,14 @@ + + + + + + + + @@ -14365,6 +15248,11 @@ + + + + + @@ -14389,11 +15277,24 @@ + + + + + + + + + + + + + @@ -14431,6 +15332,11 @@ + + + + + @@ -14455,6 +15361,14 @@ + + + + + + + + @@ -16091,6 +17005,9 @@ + + + @@ -16197,6 +17114,9 @@ + + + @@ -16366,6 +17286,14 @@ + + + + + + + + @@ -16386,6 +17314,9 @@ + + + @@ -16404,6 +17335,9 @@ + + + @@ -16810,6 +17744,22 @@ + + + + + + + + + + + + + + + + diff --git a/login/build.gradle.kts b/login/build.gradle.kts index 9bfcdae9e18..18660c8ff9d 100644 --- a/login/build.gradle.kts +++ b/login/build.gradle.kts @@ -18,6 +18,7 @@ kotlin { minSdk = libs.versions.minSdk.get().toInt() enableCoreLibraryDesugaring = true compilerOptions { jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17) } + androidResources { enable = true } packaging { resources { pickFirsts.add("values*/**") From 770148325b8e652d5d7551538e26c45186569204 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Tue, 10 Mar 2026 10:03:10 +0100 Subject: [PATCH 083/260] fix: escape special characters in string resources (#4716) --- .../composeResources/values/strings.xml | 18 +++++++++--------- .../composeResources/values/strings.xml | 4 ++-- .../composeResources/values/strings.xml | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/commonskmm/src/commonMain/composeResources/values/strings.xml b/commonskmm/src/commonMain/composeResources/values/strings.xml index 2503658a720..3f0da35116c 100644 --- a/commonskmm/src/commonMain/composeResources/values/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values/strings.xml @@ -30,7 +30,7 @@ Years Months Days - %s can't be parsed as a date + %s can\'t be parsed as a date Polygon Latitude Longitude @@ -95,9 +95,9 @@ Value is neither true or false This field can only be true Invalid character 1 - DataValues can't be saved using these arguments. Use the other one. + DataValues can\'t be saved using these arguments. Use the other one. Leading zero numbers are not allowed - Couldn't retrieve data + Couldn\'t retrieve data Attributes - %s Coordinates for the There are no more reserved values. Contact your system administrator @@ -139,7 +139,7 @@ Search to find more Done Not supported - Password is missing. Please enter password. @@ -165,7 +165,7 @@ Creation aborted. The object already exists. Deletion aborted. The object does not exist. Unable to instantiate keystore. - We couldn´t reserve values for these record. Please contact your admin. + We couldn\'t reserve values for these record. Please contact your admin. Please login to export the database. Exporting an encrypted database is not supported. You are importing an already existing database. @@ -184,15 +184,15 @@ There are no reserved values available. Go to settings and refill values when you have internet connection. The object could not be updated. The object could not be inserted. - You don't have access. + You don\'t have access. The server URL is missing. Please enter URL. The server URL is not well formed. Please check it. This version of the Settings Web App is not supported. The Settings Web App is not installed in the server. The server took too much time to respond. We canceled the request. - The relationship can't be updated. + The relationship can\'t be updated. There are too many periods. - We couldn´t find the URL. Please verify it. + We couldn\'t find the URL. Please verify it. Your user account have been disabled. If this is an error, contact your administrator. Your user account is locked. If this is an error, contact your administrator. The value could not be set. @@ -209,7 +209,7 @@ Invalid file Not in TOTP 2FA enrollment mode Authentication cancelled - OR diff --git a/login/src/commonMain/composeResources/values/strings.xml b/login/src/commonMain/composeResources/values/strings.xml index 12f33c513f6..a663386ac72 100644 --- a/login/src/commonMain/composeResources/values/strings.xml +++ b/login/src/commonMain/composeResources/values/strings.xml @@ -1,8 +1,8 @@ - + Add new account Two factor authentication - Can't connect to network + Can\'t connect to network You need an internet connection to turn two-factor authentication on or off. Try to reconnect Checking status... diff --git a/tracker/src/commonMain/composeResources/values/strings.xml b/tracker/src/commonMain/composeResources/values/strings.xml index e41770e623f..42c4e967930 100644 --- a/tracker/src/commonMain/composeResources/values/strings.xml +++ b/tracker/src/commonMain/composeResources/values/strings.xml @@ -1,6 +1,6 @@ - There are no relationships, click "+" to add a new one. + There are no relationships, click \"+\" to add a new one. Relation created on Remove %1$s? The %1$s will be deleted. This action cannot be undone. From 3c5c8a862008f8db423f740445db688cb3c0c164 Mon Sep 17 00:00:00 2001 From: Pablo Date: Tue, 10 Mar 2026 11:23:14 +0100 Subject: [PATCH 084/260] feat: [ANDROAPP-7507] Support hybrid basemaps (#4708) * feat: [ANDROAPP-7507] Support hybrid basemaps * fix test --- .../maps/attribution/AttributionManager.kt | 4 +- .../dhis2/maps/layer/basemaps/BaseMapStyle.kt | 42 ++++-- .../org/dhis2/maps/managers/MapManager.kt | 10 +- .../maps/usecases/MapStyleConfiguration.kt | 34 ++++- .../java/org/dhis2/maps/usecases/MapMocks.kt | 60 ++++++++ .../maps/usecases/MapSelectorViewModelTest.kt | 21 +-- .../usecases/MapStyleConfigurationTest.kt | 139 +++++++++++++----- 7 files changed, 246 insertions(+), 64 deletions(-) create mode 100644 dhis2_android_maps/src/test/java/org/dhis2/maps/usecases/MapMocks.kt diff --git a/dhis2_android_maps/src/main/java/org/dhis2/maps/attribution/AttributionManager.kt b/dhis2_android_maps/src/main/java/org/dhis2/maps/attribution/AttributionManager.kt index 0caf0c55c9c..26101f2933e 100644 --- a/dhis2_android_maps/src/main/java/org/dhis2/maps/attribution/AttributionManager.kt +++ b/dhis2_android_maps/src/main/java/org/dhis2/maps/attribution/AttributionManager.kt @@ -22,7 +22,7 @@ class AttributionManager( ) : AttributionDialogManager(context, maplibreMap) { override fun showAttributionDialog(attributionTitles: Array) { val attributions: Array = - currentBaseMapStyle.sources.attribution + currentBaseMapStyle.attribution .split(", ") .map { HtmlCompat.fromHtml(it, HtmlCompat.FROM_HTML_MODE_LEGACY).toString() @@ -34,7 +34,7 @@ class AttributionManager( dialog: DialogInterface?, which: Int, ) { - val selectedAttribution = currentBaseMapStyle.sources.attribution.split(", ")[which] + val selectedAttribution = currentBaseMapStyle.attribution.split(", ")[which] val url = HtmlCompat .fromHtml(selectedAttribution, HtmlCompat.FROM_HTML_MODE_LEGACY) diff --git a/dhis2_android_maps/src/main/java/org/dhis2/maps/layer/basemaps/BaseMapStyle.kt b/dhis2_android_maps/src/main/java/org/dhis2/maps/layer/basemaps/BaseMapStyle.kt index 08fd2af2170..c89a1ed5192 100644 --- a/dhis2_android_maps/src/main/java/org/dhis2/maps/layer/basemaps/BaseMapStyle.kt +++ b/dhis2_android_maps/src/main/java/org/dhis2/maps/layer/basemaps/BaseMapStyle.kt @@ -1,25 +1,31 @@ package org.dhis2.maps.layer.basemaps -import com.google.gson.annotations.SerializedName - object BaseMapStyleBuilder { fun build( id: String, tileUrls: List, attribution: String, + overlays: List, isDefault: Boolean, ) = BaseMapStyle( version = 8, sources = - StyleSources( - rasterTiles = + mapOf( + "raster-tiles" to RasterTiles( type = "raster", tiles = tileUrls, tileSize = 256, ), - attribution = attribution, - ), + ) + + overlays.associate { overlay -> + overlay.id to + RasterTiles( + type = "raster", + tiles = overlay.tiles, + tileSize = 256, + ) + }, layers = listOf( StyleLayers( @@ -29,10 +35,23 @@ object BaseMapStyleBuilder { minZoom = 0, maxZoom = 22, ), - ), + ) + + overlays.map { overlay -> + StyleLayers( + id = overlay.id, + type = "raster", + source = overlay.id, + minZoom = 0, + maxZoom = 22, + ) + }, id = id, glyphs = DEFAULT_GLYPH_URL, isDefault = isDefault, + attribution = + (listOf(attribution) + overlays.map { overlay -> overlay.attribution }).joinToString( + separator = ", ", + ), ) fun internalBaseMap(): BaseMapStyle = @@ -47,20 +66,23 @@ object BaseMapStyleBuilder { ), attribution = DEFAULT_ATTRIBUTION, isDefault = true, + overlays = emptyList(), ) } data class BaseMapStyle( val version: Int, - val sources: StyleSources, + val sources: Map, val layers: List, val id: String, var glyphs: String, val isDefault: Boolean, + val attribution: String, ) -data class StyleSources( - @SerializedName("raster-tiles") val rasterTiles: RasterTiles, +data class Overlay( + val id: String, + val tiles: List, val attribution: String, ) diff --git a/dhis2_android_maps/src/main/java/org/dhis2/maps/managers/MapManager.kt b/dhis2_android_maps/src/main/java/org/dhis2/maps/managers/MapManager.kt index 16e88425ca3..4ed02238894 100644 --- a/dhis2_android_maps/src/main/java/org/dhis2/maps/managers/MapManager.kt +++ b/dhis2_android_maps/src/main/java/org/dhis2/maps/managers/MapManager.kt @@ -3,6 +3,7 @@ package org.dhis2.maps.managers import android.annotation.SuppressLint import android.app.Activity import android.os.Bundle +import android.view.Gravity import androidx.core.content.ContextCompat import androidx.core.location.LocationListenerCompat import androidx.lifecycle.Lifecycle @@ -143,6 +144,7 @@ abstract class MapManager( ), ) uiSettings.isLogoEnabled = false + uiSettings.attributionGravity = Gravity.TOP or Gravity.START uiSettings.setAttributionMargins( defaultUiIconLeftMargin, uiSettings.attributionMarginTop, @@ -265,7 +267,9 @@ abstract class MapManager( permissionsManager = PermissionsManager( object : PermissionsListener { - override fun onExplanationNeeded(permissionsToExplain: MutableList?) {} + override fun onExplanationNeeded(permissionsToExplain: MutableList?) { + // no-op + } override fun onPermissionResult(granted: Boolean) { if (granted) { @@ -320,7 +324,9 @@ abstract class MapManager( permissionsManager = PermissionsManager( object : PermissionsListener { - override fun onExplanationNeeded(permissionsToExplain: MutableList?) {} + override fun onExplanationNeeded(permissionsToExplain: MutableList?) { + // no-op + } override fun onPermissionResult(granted: Boolean) { if (granted) { diff --git a/dhis2_android_maps/src/main/java/org/dhis2/maps/usecases/MapStyleConfiguration.kt b/dhis2_android_maps/src/main/java/org/dhis2/maps/usecases/MapStyleConfiguration.kt index 344fa8d6dab..24cdbad8a33 100644 --- a/dhis2_android_maps/src/main/java/org/dhis2/maps/usecases/MapStyleConfiguration.kt +++ b/dhis2_android_maps/src/main/java/org/dhis2/maps/usecases/MapStyleConfiguration.kt @@ -3,9 +3,11 @@ package org.dhis2.maps.usecases import org.dhis2.commons.data.ProgramConfigurationRepository import org.dhis2.maps.layer.basemaps.BaseMapStyle import org.dhis2.maps.layer.basemaps.BaseMapStyleBuilder.build +import org.dhis2.maps.layer.basemaps.Overlay import org.dhis2.maps.model.MapScope import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.map.layer.MapLayerImageryProvider +import org.hisp.dhis.android.core.map.layer.MapLayerPosition const val DEFAULT_FORCED_LOCATION_ACCURACY = -1 @@ -61,6 +63,8 @@ class MapStyleConfiguration( .mapsModule() .mapLayers() .withImageryProviders() + .byMapLayerPosition() + .eq(MapLayerPosition.BASEMAP) .blockingGet() .map { mapLayer -> val id = mapLayer.displayName() @@ -71,7 +75,35 @@ class MapStyleConfiguration( mapLayer.subdomains(), ) val attribution = mapLayer.imageryProviders().mapAttribution() - build(id, tileUrls, attribution, defaultMap == mapLayer.uid()) + + val overlays = + d2 + .mapsModule() + .mapLayers() + .withImageryProviders() + .byLinkedLayerUid() + .eq(mapLayer.uid()) + .byMapLayerPosition() + .eq(MapLayerPosition.OVERLAY) + .blockingGet() + + val basemapOverlays = + overlays.map { overlay -> + val id = overlay.displayName() + val tileUrls = + overlay.imageUrl().mapTileUrls( + overlay.subdomainPlaceholder(), + overlay.subdomains(), + ) + val attribution = overlay.imageryProviders().mapAttribution() + Overlay( + id = id, + tiles = tileUrls, + attribution = attribution, + ) + } + + build(id, tileUrls, attribution, basemapOverlays, defaultMap == mapLayer.uid()) } } diff --git a/dhis2_android_maps/src/test/java/org/dhis2/maps/usecases/MapMocks.kt b/dhis2_android_maps/src/test/java/org/dhis2/maps/usecases/MapMocks.kt new file mode 100644 index 00000000000..3982f0da4db --- /dev/null +++ b/dhis2_android_maps/src/test/java/org/dhis2/maps/usecases/MapMocks.kt @@ -0,0 +1,60 @@ +package org.dhis2.maps.usecases + +import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.arch.repositories.filters.internal.EnumFilterConnector +import org.hisp.dhis.android.core.arch.repositories.filters.internal.StringFilterConnector +import org.hisp.dhis.android.core.map.layer.MapLayer +import org.hisp.dhis.android.core.map.layer.MapLayerCollectionRepository +import org.hisp.dhis.android.core.map.layer.MapLayerPosition +import org.mockito.kotlin.any +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever + +private val stringFilterConnector: StringFilterConnector = mock() +private val enumFilterConnector: EnumFilterConnector = + mock() + +fun mockBasemaps( + d2: D2, + mockedBasemap: List, +) { + val mockedMapLayerCollectionRepository: MapLayerCollectionRepository = mock() + + whenever(d2.mapsModule().mapLayers()) doReturn mockedMapLayerCollectionRepository + whenever(mockedMapLayerCollectionRepository.withImageryProviders()) doReturn mockedMapLayerCollectionRepository + whenever( + mockedMapLayerCollectionRepository.byMapLayerPosition(), + ) doReturn enumFilterConnector + whenever( + enumFilterConnector.eq(MapLayerPosition.BASEMAP), + ) doReturn mockedMapLayerCollectionRepository + whenever( + mockedMapLayerCollectionRepository.blockingGet(), + ) doReturn mockedBasemap +} + +fun mockOverlays( + d2: D2, + mockedOverlays: List, +) { + val mockedMapLayerCollectionRepository: MapLayerCollectionRepository = mock() + + whenever(d2.mapsModule().mapLayers()) doReturn mockedMapLayerCollectionRepository + whenever(mockedMapLayerCollectionRepository.withImageryProviders()) doReturn mockedMapLayerCollectionRepository + whenever( + mockedMapLayerCollectionRepository.byLinkedLayerUid(), + ) doReturn stringFilterConnector + whenever( + stringFilterConnector.eq(any()), + ) doReturn mockedMapLayerCollectionRepository + whenever( + mockedMapLayerCollectionRepository.byMapLayerPosition(), + ) doReturn enumFilterConnector + whenever( + enumFilterConnector.eq(MapLayerPosition.OVERLAY), + ) doReturn mockedMapLayerCollectionRepository + whenever( + mockedMapLayerCollectionRepository.blockingGet(), + ) doReturn mockedOverlays +} diff --git a/dhis2_android_maps/src/test/java/org/dhis2/maps/usecases/MapSelectorViewModelTest.kt b/dhis2_android_maps/src/test/java/org/dhis2/maps/usecases/MapSelectorViewModelTest.kt index 43c3d378d43..79385c218f8 100644 --- a/dhis2_android_maps/src/test/java/org/dhis2/maps/usecases/MapSelectorViewModelTest.kt +++ b/dhis2_android_maps/src/test/java/org/dhis2/maps/usecases/MapSelectorViewModelTest.kt @@ -25,7 +25,6 @@ import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.common.FeatureType import org.hisp.dhis.android.core.map.layer.MapLayer import org.hisp.dhis.android.core.map.layer.MapLayerPosition -import org.hisp.dhis.android.core.settings.SystemSetting import org.hisp.dhis.mobile.ui.designsystem.component.model.LocationItemModel import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue @@ -133,20 +132,8 @@ class MapSelectorViewModelTest { @Test fun shouldFetchBaseMaps() = runTest { - whenever( - d2 - .settingModule() - .systemSetting() - .defaultBaseMap() - .blockingGet(), - ) doReturn SystemSetting.builder().value("defaultBaseMapUid").build() - whenever( - d2 - .mapsModule() - .mapLayers() - .withImageryProviders() - .blockingGet(), - ) doReturn + mockBasemaps( + d2, listOf( MapLayer .builder() @@ -160,7 +147,9 @@ class MapSelectorViewModelTest { .external(false) .mapLayerPosition(MapLayerPosition.BASEMAP) .build(), - ) + ), + ) + mockOverlays(d2, emptyList()) val baseMaps = mapSelectorViewModel.fetchMapStyles() assertTrue(baseMaps.isNotEmpty()) } diff --git a/dhis2_android_maps/src/test/java/org/dhis2/maps/usecases/MapStyleConfigurationTest.kt b/dhis2_android_maps/src/test/java/org/dhis2/maps/usecases/MapStyleConfigurationTest.kt index e83d7e29b02..2dd2378f71c 100644 --- a/dhis2_android_maps/src/test/java/org/dhis2/maps/usecases/MapStyleConfigurationTest.kt +++ b/dhis2_android_maps/src/test/java/org/dhis2/maps/usecases/MapStyleConfigurationTest.kt @@ -3,7 +3,10 @@ package org.dhis2.maps.usecases import org.dhis2.commons.data.ProgramConfigurationRepository import org.dhis2.maps.model.MapScope import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.arch.repositories.filters.internal.EnumFilterConnector +import org.hisp.dhis.android.core.arch.repositories.filters.internal.StringFilterConnector import org.hisp.dhis.android.core.map.layer.MapLayer +import org.hisp.dhis.android.core.map.layer.MapLayerCollectionRepository import org.hisp.dhis.android.core.map.layer.MapLayerImageryProvider import org.hisp.dhis.android.core.map.layer.MapLayerPosition import org.hisp.dhis.android.core.settings.DataSetConfigurationSetting @@ -18,7 +21,7 @@ import org.mockito.kotlin.mock import org.mockito.kotlin.whenever class MapStyleConfigurationTest { - private val d2: D2 = Mockito.mock(D2::class.java, Mockito.RETURNS_DEEP_STUBS) + private val d2: D2 = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) private val uid = "uid" private val programConfigurationSetting: ProgramConfigurationSetting = mock() private val dataSetConfigurationSetting: DataSetConfigurationSetting = mock() @@ -35,17 +38,14 @@ class MapStyleConfigurationTest { programConfigurationRepository, ) + private val stringFilterConnector: StringFilterConnector = mock() + private val enumFilterConnector: EnumFilterConnector = + mock() + @Test fun shouldFetchMapStyles() { - whenever(d2.mapsModule().mapLayers()) doReturn mock() - whenever(d2.mapsModule().mapLayers().withImageryProviders()) doReturn mock() - whenever( - d2 - .mapsModule() - .mapLayers() - .withImageryProviders() - .blockingGet(), - ) doReturn + mockBasemaps( + d2, listOf( mockMapLayer( displayName = "basemap 1", @@ -68,36 +68,46 @@ class MapStyleConfigurationTest { mockImaginaryProvider("© Carto"), ), ), - ) + ), + ) + + mockOverlays(d2, emptyList()) mapStyleConfiguration.fetchMapStyles().let { result -> assertTrue(result.size == 2) assertTrue( result[0] - .sources.rasterTiles.tiles.size == 2, + .sources.entries + .first() + .value.tiles.size == 2, + ) + assertTrue( + result[0] + .sources.entries + .first() + .value.tiles[0] == "http://a.test.test/x/y/z", + ) + assertTrue(result[0].attribution == "© Maplibre") + assertTrue( + result[0] + .sources.entries + .first() + .value.tiles[1] == "http://b.test.test/x/y/z", ) - assertTrue(result[0].sources.rasterTiles.tiles[0] == "http://a.test.test/x/y/z") - assertTrue(result[0].sources.attribution == "© Maplibre") - assertTrue(result[0].sources.rasterTiles.tiles[1] == "http://b.test.test/x/y/z") assertTrue( result[1] - .sources.rasterTiles.tiles.size == 1, + .sources.entries + .first() + .value.tiles.size == 1, ) - assertTrue(result[1].sources.attribution == "© Maplibre, © Carto") + assertTrue(result[1].attribution == "© Maplibre, © Carto") } } @Test fun shouldFetchCustomMaps() { - whenever(d2.mapsModule().mapLayers()) doReturn mock() - whenever(d2.mapsModule().mapLayers().withImageryProviders()) doReturn mock() - whenever( - d2 - .mapsModule() - .mapLayers() - .withImageryProviders() - .blockingGet(), - ) doReturn + mockBasemaps( + d2, listOf( mockMapLayer( displayName = "basemap 1", @@ -120,22 +130,85 @@ class MapStyleConfigurationTest { mockImaginaryProvider("© Carto"), ), ), - ) + ), + ) + + mockOverlays(d2, emptyList()) mapStyleConfiguration.fetchMapStyles().let { result -> assertTrue(result.size == 2) assertTrue( result[0] - .sources.rasterTiles.tiles.size == 4, + .sources.entries + .first() + .value.tiles.size == 4, + ) + assertTrue( + result[0] + .sources.entries + .first() + .value.tiles[0] == "http://a.test.test/x/y/z", + ) + assertTrue(result[0].attribution == "© Maplibre") + assertTrue( + result[0] + .sources.entries + .first() + .value.tiles[1] == "http://b.test.test/x/y/z", ) - assertTrue(result[0].sources.rasterTiles.tiles[0] == "http://a.test.test/x/y/z") - assertTrue(result[0].sources.attribution == "© Maplibre") - assertTrue(result[0].sources.rasterTiles.tiles[1] == "http://b.test.test/x/y/z") assertTrue( result[1] - .sources.rasterTiles.tiles.size == 4, + .sources.entries + .first() + .value.tiles.size == 4, + ) + assertTrue(result[1].attribution == "© Maplibre, © Carto") + } + } + + @Test + fun shouldFetchBasemapWithOverlay() { + mockBasemaps( + d2, + listOf( + mockMapLayer( + displayName = "basemap 1", + imageUrl = "http://{s}.test.test/x/y/z", + subDomainPlaceHolder = null, + subdomains = null, + imaginaryProviders = + listOf( + mockImaginaryProvider("© Maplibre"), + ), + ), + ), + ) + + mockOverlays( + d2, + listOf( + mockMapLayer( + displayName = "overlay 1", + imageUrl = "http://{s}.overlay.test/x/y/z", + subdomains = null, + subDomainPlaceHolder = null, + imaginaryProviders = + listOf( + mockImaginaryProvider("© Overlay"), + ), + ), + ), + ) + + mapStyleConfiguration.fetchMapStyles().let { result -> + assertTrue(result[0].sources.size == 2) + assertTrue( + result[0] + .sources.keys + .toList()[1] == "overlay 1", ) - assertTrue(result[1].sources.attribution == "© Maplibre, © Carto") + assertTrue(result[0].sources["overlay 1"]?.tiles[0] == "http://a.overlay.test/x/y/z") + assertEquals("© Maplibre, © Overlay", result[0].attribution) } } From 0d364ddd0be1495bd164da4e045b2fdfb5ca0ae4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Tue, 10 Mar 2026 15:32:51 +0100 Subject: [PATCH 085/260] fix: Wrap OpenID login response handling in IO context in LoginRepositoryImpl.kt (#4720) --- .../login/main/data/LoginRepositoryImpl.kt | 72 ++++++++++--------- 1 file changed, 38 insertions(+), 34 deletions(-) diff --git a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt index b6ae1019e9c..99e15bb519e 100644 --- a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt +++ b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt @@ -366,46 +366,50 @@ class LoginRepositoryImpl( ), ) openIdController.handleIntent(intent) { resultIntent -> - val result = - when { - resultIntent.isFailure -> { - kotlin.Result.failure( - resultIntent.exceptionOrNull() - ?: Exception(getString(Res.string.openid_process_cancelled)), - ) - } - - resultIntent.isSuccess and (resultIntent.getOrNull() !is IntentWithRequestCode) -> { - kotlin.Result.failure(Exception(getString(Res.string.openid_invalid_auth_result))) - } + withContext(dispatcher.io) { + val result = + when { + resultIntent.isFailure -> { + kotlin.Result.failure( + resultIntent.exceptionOrNull() + ?: Exception(getString(Res.string.openid_process_cancelled)), + ) + } - else -> { - try { - val intent = resultIntent.getOrNull() as IntentWithRequestCode - d2 - .userModule() - .openIdHandler() - .blockingHandleLogInResponse( - serverUrl = serverUrl, - intent = intent.intent, - requestCode = intent.requestCode, - ) + resultIntent.isSuccess and (resultIntent.getOrNull() !is IntentWithRequestCode) -> { + kotlin.Result.failure(Exception(getString(Res.string.openid_invalid_auth_result))) + } - kotlin.Result.success(Unit) - } catch (e: Exception) { - kotlin.Result.failure( - Exception( - d2ErrorMessageProvider.getErrorMessage( - e, - isNetworkAvailable, + else -> { + try { + val intent = + resultIntent.getOrNull() as IntentWithRequestCode + + d2 + .userModule() + .openIdHandler() + .blockingHandleLogInResponse( + serverUrl = serverUrl, + intent = intent.intent, + requestCode = intent.requestCode, + ) + + kotlin.Result.success(Unit) + } catch (e: Exception) { + kotlin.Result.failure( + Exception( + d2ErrorMessageProvider.getErrorMessage( + e, + isNetworkAvailable, + ), ), - ), - ) + ) + } } } - } - continuation.resume(value = result) { _, _, _ -> } + continuation.resume(value = result) { _, _, _ -> } + } } continuation.invokeOnCancellation { kotlin.Result.failure(Exception("")) From 402f2e22b0c70a3e405e5e39b05e5f102533ef9f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Mar 2026 07:07:39 +0100 Subject: [PATCH 086/260] build(deps): bump actions/upload-artifact from 6.0.0 to 7.0.0 (#4713) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6.0.0 to 7.0.0. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v6.0.0...v7.0.0) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-version: 7.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-release-candidate.yml | 6 +++--- .github/workflows/continuous-delivery.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-release-candidate.yml b/.github/workflows/build-release-candidate.yml index 3ada0d64493..2255793e356 100644 --- a/.github/workflows/build-release-candidate.yml +++ b/.github/workflows/build-release-candidate.yml @@ -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 \ No newline at end of file diff --git a/.github/workflows/continuous-delivery.yml b/.github/workflows/continuous-delivery.yml index 7488214edaa..0915084b71a 100644 --- a/.github/workflows/continuous-delivery.yml +++ b/.github/workflows/continuous-delivery.yml @@ -69,7 +69,7 @@ jobs: # 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: ${{ steps.apk-path.outputs.apk_path }} From 8abb993a1cd355b1f936151df6ba99b2a94f0fac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Wed, 11 Mar 2026 10:54:24 +0100 Subject: [PATCH 087/260] build: update composePluginVersion to 1.10.2 and refresh verification-metadata.xml (#4721) --- gradle/libs.versions.toml | 2 +- gradle/verification-metadata.xml | 441 +++++++++++++++++++++++++++++++ 2 files changed, 442 insertions(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7d61b86524a..c83770c603a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -27,7 +27,7 @@ corektx = "1.17.0" fragmentktx = "1.8.9" recyclerview = "1.4.0" compose = "1.10.4" -composePluginVersion = "1.10.1" +composePluginVersion = "1.10.2" composePaging = "3.4.1" pagingTesting = "3.4.1" composeConstraintLayout = "1.1.1" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 5dadef7326a..a55c258636b 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -782,6 +782,11 @@ + + + + + @@ -860,6 +865,14 @@ + + + + + + + + @@ -920,6 +933,11 @@ + + + + + @@ -988,6 +1006,14 @@ + + + + + + + + @@ -1533,6 +1559,14 @@ + + + + + + + + @@ -1565,6 +1599,14 @@ + + + + + + + + @@ -1690,6 +1732,14 @@ + + + + + + + + @@ -1847,6 +1897,14 @@ + + + + + + + + @@ -13643,6 +13701,14 @@ + + + + + + + + @@ -13664,6 +13730,11 @@ + + + + + @@ -13682,6 +13753,14 @@ + + + + + + + + @@ -13719,6 +13798,14 @@ + + + + + + + + @@ -13756,6 +13843,14 @@ + + + + + + + + @@ -13793,6 +13888,14 @@ + + + + + + + + @@ -13830,6 +13933,14 @@ + + + + + + + + @@ -13872,6 +13983,14 @@ + + + + + + + + @@ -13914,6 +14033,14 @@ + + + + + + + + @@ -13943,6 +14070,14 @@ + + + + + + + + @@ -13967,6 +14102,14 @@ + + + + + + + + @@ -13999,6 +14142,14 @@ + + + + + + + + @@ -14023,6 +14174,14 @@ + + + + + + + + @@ -14047,6 +14206,14 @@ + + + + + + + + @@ -14071,6 +14238,14 @@ + + + + + + + + @@ -14100,6 +14275,14 @@ + + + + + + + + @@ -14124,6 +14307,16 @@ + + + + + + + + + + @@ -14142,6 +14335,14 @@ + + + + + + + + @@ -14179,6 +14380,14 @@ + + + + + + + + @@ -14211,6 +14420,14 @@ + + + + + + + + @@ -14248,6 +14465,14 @@ + + + + + + + + @@ -14381,6 +14606,14 @@ + + + + + + + + @@ -14410,6 +14643,14 @@ + + + + + + + + @@ -14474,6 +14715,14 @@ + + + + + + + + @@ -14508,6 +14757,14 @@ + + + + + + + + @@ -14590,6 +14847,14 @@ + + + + + + + + @@ -14635,6 +14900,14 @@ + + + + + + + + @@ -14667,6 +14940,14 @@ + + + + + + + + @@ -14709,6 +14990,14 @@ + + + + + + + + @@ -14741,6 +15030,14 @@ + + + + + + + + @@ -14783,6 +15080,14 @@ + + + + + + + + @@ -14836,6 +15141,14 @@ + + + + + + + + @@ -14873,6 +15186,14 @@ + + + + + + + + @@ -14905,6 +15226,14 @@ + + + + + + + + @@ -14947,6 +15276,14 @@ + + + + + + + + @@ -14979,6 +15316,14 @@ + + + + + + + + @@ -15021,6 +15366,14 @@ + + + + + + + + @@ -15058,6 +15411,14 @@ + + + + + + + + @@ -15100,6 +15461,14 @@ + + + + + + + + @@ -15137,6 +15506,14 @@ + + + + + + + + @@ -15166,6 +15543,14 @@ + + + + + + + + @@ -15198,6 +15583,14 @@ + + + + + + + + @@ -15235,6 +15628,14 @@ + + + + + + + + @@ -15277,6 +15678,14 @@ + + + + + + + + @@ -15319,6 +15728,14 @@ + + + + + + + + @@ -15361,6 +15778,14 @@ + + + + + + + + @@ -17744,6 +18169,22 @@ + + + + + + + + + + + + + + + + From 1f67d3d6b1c340c9d74564a30b6d779d70019699 Mon Sep 17 00:00:00 2001 From: Pablo Date: Wed, 11 Mar 2026 14:07:37 +0100 Subject: [PATCH 088/260] build: [ANDROAPP-7497] Move data sync to sync module [skip size] (#4690) --- .../java/org/dhis2/DBTestLoader.kt | 7 +- app/src/main/java/org/dhis2/AppModule.kt | 8 + .../org/dhis2/data/server/ServerModule.kt | 7 - .../dhis2/data/service/SyncDataWorker.java | 206 ---------- .../data/service/SyncDataWorkerComponent.java | 13 - .../data/service/SyncDataWorkerModule.kt | 35 -- .../data/service/SyncGranularRxModule.kt | 14 +- .../dhis2/data/service/SyncGranularWorker.kt | 4 +- .../org/dhis2/data/service/SyncPresenter.java | 24 -- .../dhis2/data/service/SyncPresenterImpl.kt | 324 +--------------- .../data/service/SyncStatusController.kt | 190 ---------- .../workManager/WorkManagerController.kt | 5 - .../workManager/WorkManagerControllerImpl.kt | 24 +- .../data/service/workManager/WorkerType.kt | 1 - .../org/dhis2/data/user/UserComponent.java | 5 - .../java/org/dhis2/di/KoinInitialization.kt | 4 + .../general/SessionManagerActivity.kt | 24 +- .../org/dhis2/usescases/main/MainActivity.kt | 6 + .../org/dhis2/usescases/main/MainModule.kt | 11 +- .../org/dhis2/usescases/main/MainPresenter.kt | 45 ++- .../usescases/main/data/HomeRepository.kt | 2 - .../usescases/main/data/HomeRepositoryImpl.kt | 8 +- .../main/domain/LaunchInitialSync.kt | 5 +- .../dhis2/usescases/main/domain/LogoutUser.kt | 8 +- .../usescases/main/program/ProgramFragment.kt | 9 +- .../usescases/main/program/ProgramModule.kt | 4 +- .../main/program/ProgramRepository.kt | 2 +- .../main/program/ProgramRepositoryImpl.kt | 2 +- .../dhis2/usescases/main/program/ProgramUi.kt | 2 +- .../main/program/ProgramViewModel.kt | 6 +- .../main/program/ProgramViewModelFactory.kt | 2 +- .../searchTrackEntity/SearchTEActivity.kt | 1 + .../searchTrackEntity/SearchTEModule.java | 9 +- .../searchTrackEntity/SearchTEPresenter.java | 7 +- .../usescases/settings/SyncManagerModule.kt | 3 - .../usescases/settings/domain/LaunchSync.kt | 94 +---- .../TeiProgramListActivity.java | 2 +- .../TeiProgramListInteractor.java | 2 +- .../teiProgramList/TeiProgramListModule.java | 12 +- .../granularsync/GranularSyncPresenter.kt | 10 +- .../dhis2/data/services/SyncPresenterTest.kt | 43 ++- .../dhis2/usescases/main/MainPresenterTest.kt | 5 +- .../main/domain/LaunchInitialSyncTest.kt | 8 + .../usescases/main/domain/LogoutUserTest.kt | 14 +- .../main/program/ProgramRepositoryImplTest.kt | 2 +- .../main/program/ProgramViewModelTest.kt | 4 +- .../SearchTEPresenterTest.kt | 2 +- .../settings/domain/LaunchSyncTest.kt | 51 +-- .../granularsync/GranularSyncPresenterTest.kt | 2 - .../notifications/NotificationManagerImpl.kt | 31 +- .../notifications/NotificationManager.kt | 2 + .../commons/providers/PreferenceConstants.kt | 9 + gradle/libs.versions.toml | 1 + gradle/verification-metadata.xml | 33 ++ sync/build.gradle.kts | 1 + sync/src/androidMain/AndroidManifest.xml | 15 +- .../data/AndroidSyncBackgroundJobAction.kt | 64 +++- .../mobile/sync/data/AndroidSyncRepository.kt | 355 ++++++++++++++++++ .../dhis2/mobile/sync/data/SyncDataWorker.kt | 77 ++++ .../mobile/sync/data/SyncMetadataWorker.kt | 10 +- .../mobile/sync/data/SyncSettingsWorker.kt | 12 +- .../mobile/sync/di/SyncModule.android.kt | 16 + .../composeResources/values/strings.xml | 1 + .../sync/data/SyncBackgroundJobAction.kt | 4 + .../dhis2/mobile/sync/data/SyncRepository.kt | 27 ++ .../org/dhis2/mobile/sync/domain/SyncData.kt | 83 +++- .../sync/domain/SyncStatusController.kt | 154 ++++++++ .../mobile/sync/model/DataSyncProgress.kt | 6 + .../sync/model/DataSyncProgressStatus.kt | 15 + .../dhis2/mobile/sync/model/DataSyncTask.kt | 19 + .../org/dhis2/mobile/sync/model/SyncResult.kt | 11 + .../dhis2/mobile/sync/model/SyncStatusData.kt | 33 ++ 72 files changed, 1175 insertions(+), 1082 deletions(-) delete mode 100644 app/src/main/java/org/dhis2/data/service/SyncDataWorker.java delete mode 100644 app/src/main/java/org/dhis2/data/service/SyncDataWorkerComponent.java delete mode 100644 app/src/main/java/org/dhis2/data/service/SyncDataWorkerModule.kt delete mode 100644 app/src/main/java/org/dhis2/data/service/SyncStatusController.kt create mode 100644 sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncDataWorker.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncStatusController.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/DataSyncProgress.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/DataSyncProgressStatus.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/DataSyncTask.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncResult.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncStatusData.kt diff --git a/app/src/androidTest/java/org/dhis2/DBTestLoader.kt b/app/src/androidTest/java/org/dhis2/DBTestLoader.kt index cff717391f2..e294aa278cf 100644 --- a/app/src/androidTest/java/org/dhis2/DBTestLoader.kt +++ b/app/src/androidTest/java/org/dhis2/DBTestLoader.kt @@ -23,7 +23,10 @@ class DBTestLoader(private val context: Context) { Timber.tag("RUNNER_LOG").d("Copying database") val input = InstrumentationRegistry.getInstrumentation() .context.assets.open("databases/$DB_NAME_TEST") - val output = FileOutputStream("$databasePath/$DB_NAME") + + file.parentFile?.mkdirs() + + val output = FileOutputStream(file) writeExtractedFileToDisk(input, output) Timber.d("Database copy done") } catch (e: IOException) { @@ -51,4 +54,4 @@ class DBTestLoader(private val context: Context) { const val DB_NAME_TEST = "dhis_test.db" const val DB_NAME = "127-0-0-1-8080_android_unencrypted.db" } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/dhis2/AppModule.kt b/app/src/main/java/org/dhis2/AppModule.kt index 0373cade8fa..32f408bfa99 100644 --- a/app/src/main/java/org/dhis2/AppModule.kt +++ b/app/src/main/java/org/dhis2/AppModule.kt @@ -4,6 +4,9 @@ import android.content.Context import dagger.Module import dagger.Provides import org.dhis2.commons.resources.ColorUtils +import org.dhis2.data.service.SyncGranularWorker +import org.koin.androidx.workmanager.dsl.workerOf +import org.koin.dsl.module import javax.inject.Singleton @Module @@ -18,3 +21,8 @@ class AppModule( @Singleton fun colorUtils(): ColorUtils = ColorUtils() } + +val appModule = + module { + workerOf(::SyncGranularWorker) + } diff --git a/app/src/main/java/org/dhis2/data/server/ServerModule.kt b/app/src/main/java/org/dhis2/data/server/ServerModule.kt index 1021d00743e..8cd45791161 100644 --- a/app/src/main/java/org/dhis2/data/server/ServerModule.kt +++ b/app/src/main/java/org/dhis2/data/server/ServerModule.kt @@ -21,8 +21,6 @@ import org.dhis2.commons.resources.EventResourcesProvider import org.dhis2.commons.resources.MetadataIconProvider import org.dhis2.commons.resources.ResourceManager import org.dhis2.commons.schedulers.SchedulerProvider -import org.dhis2.commons.viewmodel.DispatcherProvider -import org.dhis2.data.service.SyncStatusController import org.dhis2.data.service.VersionRepository import org.dhis2.form.data.OptionsRepository import org.dhis2.form.data.RulesUtilsProvider @@ -123,11 +121,6 @@ class ServerModule { colorUtils, ) - @Provides - @PerServer - fun providesSyncStatusController(dispatcherProvider: DispatcherProvider): SyncStatusController = - SyncStatusController(dispatcherProvider) - @Provides @PerServer fun providesVersionStatusController(d2: D2): VersionRepository = VersionRepository(d2) diff --git a/app/src/main/java/org/dhis2/data/service/SyncDataWorker.java b/app/src/main/java/org/dhis2/data/service/SyncDataWorker.java deleted file mode 100644 index ebb30c9b4e5..00000000000 --- a/app/src/main/java/org/dhis2/data/service/SyncDataWorker.java +++ /dev/null @@ -1,206 +0,0 @@ -package org.dhis2.data.service; - -import static org.dhis2.utils.analytics.AnalyticsConstants.DATA_TIME; - -import android.app.NotificationChannel; -import android.app.NotificationManager; -import android.content.Context; -import android.content.pm.ServiceInfo; -import android.os.Build; - -import androidx.annotation.NonNull; -import androidx.core.app.NotificationCompat; -import androidx.core.app.NotificationManagerCompat; -import androidx.work.Data; -import androidx.work.ForegroundInfo; -import androidx.work.Worker; -import androidx.work.WorkerParameters; - -import org.dhis2.App; -import org.dhis2.R; -import org.dhis2.commons.Constants; -import org.dhis2.commons.date.DateUtils; -import org.dhis2.commons.network.NetworkUtils; -import org.dhis2.commons.prefs.PreferenceProvider; - -import java.util.Calendar; -import java.util.Objects; - -import javax.inject.Inject; - -import timber.log.Timber; - -public class SyncDataWorker extends Worker { - - private static final String DATA_CHANNEL = "sync_data_notification"; - private static final int SYNC_DATA_ID = 8071986; - - @Inject - SyncPresenter presenter; - - @Inject - PreferenceProvider prefs; - - public SyncDataWorker( - @NonNull Context context, - @NonNull WorkerParameters workerParams) { - super(context, workerParams); - } - - @NonNull - @Override - public Result doWork() { - Objects.requireNonNull(((App) getApplicationContext()).userComponent()) - .plus(new SyncDataWorkerModule()) - .inject(this); - - presenter.initSyncControllerMap(); - - triggerNotification( - getApplicationContext().getString(R.string.app_name), - getApplicationContext().getString(R.string.syncing_data), - 0); - - boolean isEventOk = true; - boolean isTeiOk = true; - boolean isDataValue = true; - - long init = System.currentTimeMillis(); - - triggerNotification( - getApplicationContext().getString(R.string.app_name), - getApplicationContext().getString(R.string.syncing_events), - 20); - - try { - presenter.syncAndDownloadEvents(); - } catch (Exception e) { - if (!new NetworkUtils(getApplicationContext()).isOnline()) { - presenter.setNetworkUnavailable(); - } - Timber.e(e); - isEventOk = false; - } - - triggerNotification( - getApplicationContext().getString(R.string.app_name), - getApplicationContext().getString(R.string.syncing_teis), - 40); - - try { - presenter.syncAndDownloadTeis(); - } catch (Exception e) { - if (!new NetworkUtils(getApplicationContext()).isOnline()) { - presenter.setNetworkUnavailable(); - } - Timber.e(e); - isTeiOk = false; - } - - triggerNotification( - getApplicationContext().getString(R.string.app_name), - getApplicationContext().getString(R.string.syncing_data_sets), - 60); - - try { - presenter.syncAndDownloadDataValues(); - } catch (Exception e) { - if (!new NetworkUtils(getApplicationContext()).isOnline()) { - presenter.setNetworkUnavailable(); - } - Timber.e(e); - isDataValue = false; - } - - triggerNotification( - getApplicationContext().getString(R.string.app_name), - getApplicationContext().getString(R.string.syncing_resources), - 80); - - try { - presenter.downloadResources(); - } catch (Exception e) { - Timber.e(e); - } - - triggerNotification( - getApplicationContext().getString(R.string.app_name), - "syncing reserved values", - 95 - - ); - - try { - presenter.syncReservedValues(); - } catch (Exception e) { - Timber.e(e); - } - - triggerNotification( - getApplicationContext().getString(R.string.app_name), - getApplicationContext().getString(R.string.syncing_done), - 100); - - presenter.logTimeToFinish(System.currentTimeMillis() - init, DATA_TIME); - - String lastDataSyncDate = DateUtils.dateTimeFormat().format(Calendar.getInstance().getTime()); - SyncResult syncResult = presenter.checkSyncStatus(); - - prefs.setValue(Constants.LAST_DATA_SYNC, lastDataSyncDate); - prefs.setValue(Constants.LAST_DATA_SYNC_STATUS, isEventOk && isTeiOk && isDataValue && syncResult == SyncResult.SYNC); - prefs.setValue(Constants.SYNC_RESULT, syncResult.name()); - - cancelNotification(); - - presenter.startPeriodicDataWork(); - - presenter.finishSync(); - - return Result.success(createOutputData(true)); - } - - @Override - public void onStopped() { - cancelNotification(); - super.onStopped(); - } - - private Data createOutputData(boolean state) { - return new Data.Builder() - .putBoolean("DATA_STATE", state) - .build(); - } - - private void triggerNotification(String title, String content, int progress) { - NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - NotificationChannel mChannel = new NotificationChannel(DATA_CHANNEL, "DataSync", NotificationManager.IMPORTANCE_HIGH); - notificationManager.createNotificationChannel(mChannel); - } - - NotificationCompat.Builder notificationBuilder = - new NotificationCompat.Builder(getApplicationContext(), DATA_CHANNEL) - .setSmallIcon(R.drawable.ic_sync) - .setContentTitle(title) - .setContentText(content) - .setOngoing(true) - .setOnlyAlertOnce(true) - .setAutoCancel(false) - .setProgress(100, progress, false) - .setPriority(NotificationCompat.PRIORITY_DEFAULT); - - setForegroundAsync(new ForegroundInfo( - SyncDataWorker.SYNC_DATA_ID, - notificationBuilder.build(), - Build.VERSION.SDK_INT >= Build.VERSION_CODES.R ? ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC : 0 - )); - - } - - private void cancelNotification() { - NotificationManagerCompat notificationManager = - NotificationManagerCompat.from(getApplicationContext()); - notificationManager.cancel(SYNC_DATA_ID); - } -} diff --git a/app/src/main/java/org/dhis2/data/service/SyncDataWorkerComponent.java b/app/src/main/java/org/dhis2/data/service/SyncDataWorkerComponent.java deleted file mode 100644 index 3938520a51d..00000000000 --- a/app/src/main/java/org/dhis2/data/service/SyncDataWorkerComponent.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.dhis2.data.service; - -import androidx.annotation.NonNull; - -import org.dhis2.commons.di.dagger.PerService; - -import dagger.Subcomponent; - -@PerService -@Subcomponent(modules = SyncDataWorkerModule.class) -public interface SyncDataWorkerComponent { - void inject(@NonNull SyncDataWorker syncDataWorker); -} diff --git a/app/src/main/java/org/dhis2/data/service/SyncDataWorkerModule.kt b/app/src/main/java/org/dhis2/data/service/SyncDataWorkerModule.kt deleted file mode 100644 index 66758840961..00000000000 --- a/app/src/main/java/org/dhis2/data/service/SyncDataWorkerModule.kt +++ /dev/null @@ -1,35 +0,0 @@ -package org.dhis2.data.service - -import dagger.Module -import dagger.Provides -import org.dhis2.commons.di.dagger.PerService -import org.dhis2.commons.prefs.PreferenceProvider -import org.dhis2.data.service.workManager.WorkManagerController -import org.dhis2.utils.analytics.AnalyticsHelper -import org.hisp.dhis.android.core.D2 - -@Module -class SyncDataWorkerModule { - @Provides - @PerService - fun syncRepository(d2: D2): SyncRepository = SyncRepositoryImpl(d2) - - @Provides - @PerService - internal fun syncPresenter( - d2: D2, - preferences: PreferenceProvider, - workManagerController: WorkManagerController, - analyticsHelper: AnalyticsHelper, - syncStatusController: SyncStatusController, - syncRepository: SyncRepository, - ): SyncPresenter = - SyncPresenterImpl( - d2, - preferences, - workManagerController, - analyticsHelper, - syncStatusController, - syncRepository, - ) -} diff --git a/app/src/main/java/org/dhis2/data/service/SyncGranularRxModule.kt b/app/src/main/java/org/dhis2/data/service/SyncGranularRxModule.kt index 64dc7834207..3875821b4c7 100644 --- a/app/src/main/java/org/dhis2/data/service/SyncGranularRxModule.kt +++ b/app/src/main/java/org/dhis2/data/service/SyncGranularRxModule.kt @@ -4,12 +4,13 @@ import dagger.Module import dagger.Provides import org.dhis2.commons.di.dagger.PerService import org.dhis2.commons.prefs.PreferenceProvider -import org.dhis2.data.service.workManager.WorkManagerController -import org.dhis2.utils.analytics.AnalyticsHelper +import org.dhis2.mobile.sync.domain.SyncStatusController import org.hisp.dhis.android.core.D2 @Module -class SyncGranularRxModule { +class SyncGranularRxModule( + private val syncStatusController: SyncStatusController, +) { @Provides @PerService fun syncRepository(d2: D2): SyncRepository = SyncRepositoryImpl(d2) @@ -19,17 +20,12 @@ class SyncGranularRxModule { internal fun syncPresenter( d2: D2, preferences: PreferenceProvider, - workManagerController: WorkManagerController, - analyticsHelper: AnalyticsHelper, - syncStatusController: SyncStatusController, syncRepository: SyncRepository, ): SyncPresenter = SyncPresenterImpl( d2, preferences, - workManagerController, - analyticsHelper, - syncStatusController, syncRepository, + syncStatusController, ) } diff --git a/app/src/main/java/org/dhis2/data/service/SyncGranularWorker.kt b/app/src/main/java/org/dhis2/data/service/SyncGranularWorker.kt index e15ffa40ae0..6ce7392a572 100644 --- a/app/src/main/java/org/dhis2/data/service/SyncGranularWorker.kt +++ b/app/src/main/java/org/dhis2/data/service/SyncGranularWorker.kt @@ -44,6 +44,7 @@ import org.dhis2.commons.Constants.ORG_UNIT import org.dhis2.commons.Constants.PERIOD_ID import org.dhis2.commons.Constants.UID import org.dhis2.commons.sync.ConflictType +import org.dhis2.mobile.sync.domain.SyncStatusController import javax.inject.Inject private const val GRANULAR_CHANNEL = "sync_granular_notification" @@ -52,6 +53,7 @@ private const val SYNC_GRANULAR_ID = 8071988 class SyncGranularWorker( context: Context, workerParams: WorkerParameters, + private val syncStatusController: SyncStatusController, ) : Worker(context, workerParams) { @Inject internal lateinit var presenter: SyncPresenter @@ -59,7 +61,7 @@ class SyncGranularWorker( override fun doWork(): Result { (applicationContext as App) .userComponent() - ?.plus(SyncGranularRxModule()) + ?.plus(SyncGranularRxModule(syncStatusController)) ?.inject(this) val uid = inputData.getString(UID) ?: return Result.failure() diff --git a/app/src/main/java/org/dhis2/data/service/SyncPresenter.java b/app/src/main/java/org/dhis2/data/service/SyncPresenter.java index 593091270dc..297ca06c001 100644 --- a/app/src/main/java/org/dhis2/data/service/SyncPresenter.java +++ b/app/src/main/java/org/dhis2/data/service/SyncPresenter.java @@ -10,16 +10,6 @@ import io.reactivex.Observable; interface SyncPresenter { - void syncAndDownloadEvents() throws Exception; - - void syncAndDownloadTeis() throws Exception; - - void syncAndDownloadDataValues() throws Exception; - - void syncReservedValues(); - - SyncResult checkSyncStatus(); - Observable syncGranularEvent(String eventUid); ListenableWorker.Result blockSyncGranularProgram(String programUid); @@ -54,19 +44,5 @@ interface SyncPresenter { List messageTrackerImportConflict(String uid); - void startPeriodicDataWork(); - - void downloadResources(); - ListenableWorker.Result blockSyncGranularDataValues(String dataSetUid, String orgUnitUid, String attrOptionCombo, String periodId, String[] catOptionCombo); - - void logTimeToFinish(long millisToFinish, String eventName); - - void updateProyectAnalytics(); - - void initSyncControllerMap(); - - void finishSync(); - - void setNetworkUnavailable(); } diff --git a/app/src/main/java/org/dhis2/data/service/SyncPresenterImpl.kt b/app/src/main/java/org/dhis2/data/service/SyncPresenterImpl.kt index 7a380dd0ad9..f4df0fcb443 100644 --- a/app/src/main/java/org/dhis2/data/service/SyncPresenterImpl.kt +++ b/app/src/main/java/org/dhis2/data/service/SyncPresenterImpl.kt @@ -2,123 +2,34 @@ package org.dhis2.data.service import androidx.annotation.VisibleForTesting import androidx.work.Data -import androidx.work.ExistingWorkPolicy import androidx.work.ListenableWorker import io.reactivex.Completable import io.reactivex.Observable -import org.dhis2.bindings.toSeconds +import kotlinx.coroutines.runBlocking import org.dhis2.commons.bindings.enrollment import org.dhis2.commons.bindings.program import org.dhis2.commons.date.DateUtils -import org.dhis2.commons.prefs.Preference.Companion.DATA import org.dhis2.commons.prefs.Preference.Companion.EVENT_MAX import org.dhis2.commons.prefs.Preference.Companion.EVENT_MAX_DEFAULT import org.dhis2.commons.prefs.Preference.Companion.LIMIT_BY_ORG_UNIT import org.dhis2.commons.prefs.Preference.Companion.LIMIT_BY_PROGRAM -import org.dhis2.commons.prefs.Preference.Companion.TEI_MAX -import org.dhis2.commons.prefs.Preference.Companion.TEI_MAX_DEFAULT -import org.dhis2.commons.prefs.Preference.Companion.TIME_DAILY -import org.dhis2.commons.prefs.Preference.Companion.TIME_DATA import org.dhis2.commons.prefs.PreferenceProvider -import org.dhis2.data.service.workManager.WorkManagerController -import org.dhis2.data.service.workManager.WorkerItem -import org.dhis2.data.service.workManager.WorkerType -import org.dhis2.utils.analytics.AnalyticsHelper +import org.dhis2.mobile.sync.domain.SyncStatusController import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.arch.call.D2Progress -import org.hisp.dhis.android.core.arch.call.D2ProgressStatus import org.hisp.dhis.android.core.common.State -import org.hisp.dhis.android.core.fileresource.FileResourceDomainType import org.hisp.dhis.android.core.imports.TrackerImportConflict import org.hisp.dhis.android.core.program.ProgramType -import org.hisp.dhis.android.core.settings.GeneralSettings import org.hisp.dhis.android.core.settings.LimitScope import org.hisp.dhis.android.core.settings.ProgramSettings -import org.hisp.dhis.android.core.systeminfo.DHISVersion -import timber.log.Timber import java.util.Calendar class SyncPresenterImpl( private val d2: D2, private val preferences: PreferenceProvider, - private val workManagerController: WorkManagerController, - private val analyticsHelper: AnalyticsHelper, - private val syncStatusController: SyncStatusController, private val syncRepository: SyncRepository, + private val syncStatusController: SyncStatusController, ) : SyncPresenter { - override fun initSyncControllerMap() { - Completable - .fromCallable { - val programMap: Map = - d2 - .programModule() - .programs() - .blockingGetUids() - .map { programUid -> - programUid to D2ProgressStatus(false, null) - }.toMap() - val aggregateMap: Map = - d2.dataSetModule().dataSets().blockingGetUids().associateWith { - D2ProgressStatus(false, null) - } - val allMap = - programMap - .toMutableMap() - .apply { - putAll(aggregateMap) - }.toMap() - syncStatusController.initDownloadProcess(allMap) - }.blockingAwait() - } - - override fun finishSync() { - syncStatusController.finishSync() - } - - override fun setNetworkUnavailable() { - syncStatusController.onNetworkUnavailable() - } - - override fun syncAndDownloadEvents() { - val (eventLimit, limitByOU, limitByProgram) = getDownloadLimits() - val programEventUids = - d2 - .programModule() - .programs() - .byProgramType() - .eq(ProgramType.WITHOUT_REGISTRATION) - .blockingGetUids() - syncStatusController.startDownloadingEvents() - Completable - .fromObservable(d2.eventModule().events().upload()) - .andThen( - Completable - .fromObservable( - d2 - .eventModule() - .eventDownloader() - .limit(eventLimit) - .limitByOrgunit(limitByOU) - .limitByProgram(limitByProgram) - .download() - .doOnNext { d2Progress -> - syncStatusController.updateDownloadProcess( - d2Progress.programs().filter { entry -> - programEventUids.contains(entry.key) - }, - ) - }, - ).doOnError { - Timber.d("error while downloading Events") - }.onErrorComplete() - .doOnComplete { - syncStatusController.finishDownloadingEvents( - programEventUids, - ) - }, - ).blockingAwait() - } - @VisibleForTesting fun getDownloadLimits(): Triple { val programSettings = getProgramSetting() @@ -144,174 +55,6 @@ class SyncPresenterImpl( return Triple(eventLimit, limitByOU, limitByProgram) } - override fun syncAndDownloadTeis() { - val programSettings = getProgramSetting() - val globalProgramSettings = programSettings?.globalSettings() - - val teiLimit = - globalProgramSettings?.teiDownload() ?: preferences.getInt(TEI_MAX, TEI_MAX_DEFAULT) - val limitByOU = - globalProgramSettings?.settingDownload()?.let { - it == LimitScope.PER_ORG_UNIT || it == LimitScope.PER_OU_AND_PROGRAM - } ?: preferences.getBoolean(LIMIT_BY_ORG_UNIT, false) - val limitByProgram = - globalProgramSettings?.settingDownload()?.let { - it == LimitScope.PER_PROGRAM || it == LimitScope.PER_OU_AND_PROGRAM - } ?: preferences.getBoolean(LIMIT_BY_PROGRAM, false) - - val trackerProgramUids = - d2 - .programModule() - .programs() - .byProgramType() - .eq(ProgramType.WITH_REGISTRATION) - .blockingGetUids() - - syncStatusController.startDownloadingTracker() - - Completable - .fromObservable(d2.trackedEntityModule().trackedEntityInstances().upload()) - .andThen( - Completable - .fromObservable( - d2 - .trackedEntityModule() - .trackedEntityInstanceDownloader() - .limit(teiLimit) - .limitByOrgunit(limitByOU) - .limitByProgram(limitByProgram) - .download() - .doOnNext { data -> - val percentage = data.percentage() - val callsDone = data.doneCalls().size - val totalCalls = data.totalCalls() - Timber.d("$percentage% $callsDone/$totalCalls") - syncStatusController.updateDownloadProcess( - data.programs().filter { entry -> - trackerProgramUids.contains(entry.key) - }, - ) - }, - ).doOnError { Timber.d("error while downloading TEIs") } - .onErrorComplete() - .doOnComplete { - syncStatusController.finishDownloadingTracker( - trackerProgramUids, - ) - }, - ).blockingAwait() - } - - override fun syncAndDownloadDataValues() { - val dataSetUids = d2.dataSetModule().dataSets().blockingGetUids() - if (dataSetUids.isNotEmpty()) { - syncStatusController.startDownloadingDataSets() - Completable - .fromObservable(d2.dataValueModule().dataValues().upload()) - .doOnError { Timber.d("error while downloading Datasets") } - .andThen( - Completable.fromObservable( - d2.dataSetModule().dataSetCompleteRegistrations().upload(), - ), - ).doOnError { Timber.d("error while downloading Datasets") } - .andThen( - Completable - .fromObservable( - d2 - .aggregatedModule() - .data() - .download() - .doOnNext { - syncStatusController.updateDownloadProcess(it.dataSets()) - }, - ).doOnError { Timber.d("error while downloading Datasets") } - .onErrorComplete() - .doOnComplete { - syncStatusController.finishDownloadingTracker( - dataSetUids, - ) - }, - ).blockingAwait() - } - } - - override fun downloadResources() { - if (d2.systemInfoModule().versionManager().isGreaterThan(DHISVersion.V2_32)) { - syncStatusController.initDownloadMedia() - Completable - .fromObservable( - d2 - .fileResourceModule() - .fileResourceDownloader() - .byDomainType() - .eq(FileResourceDomainType.DATA_VALUE) - .download(), - ).blockingAwait() - } - } - - override fun syncReservedValues() { - val maxNumberOfValuesToReserve = - getSettings()?.let { - it.reservedValues() ?: 100 - } ?: 100 - Completable - .fromObservable( - d2 - .trackedEntityModule() - .reservedValueManager() - .downloadAllReservedValues(maxNumberOfValuesToReserve), - ).doOnError { - Timber.d("error while downloading reserved values") - }.blockingAwait() - } - - override fun checkSyncStatus(): SyncResult { - val eventsOk = - d2 - .eventModule() - .events() - .byAggregatedSyncState() - .notIn(State.SYNCED) - .blockingGet() - .isEmpty() - val teiOk = - d2 - .trackedEntityModule() - .trackedEntityInstances() - .byAggregatedSyncState() - .notIn(State.SYNCED, State.RELATIONSHIP) - .blockingGet() - .isEmpty() - - if (eventsOk && teiOk) { - return SyncResult.SYNC - } - - val anyEventsToPostOrToUpdate = - d2 - .eventModule() - .events() - .byAggregatedSyncState() - .`in`(State.TO_POST, State.TO_UPDATE) - .blockingGet() - .isNotEmpty() - val anyTeiToPostOrToUpdate = - d2 - .trackedEntityModule() - .trackedEntityInstances() - .byAggregatedSyncState() - .`in`(State.TO_POST, State.TO_UPDATE) - .blockingGet() - .isNotEmpty() - - if (anyEventsToPostOrToUpdate || anyTeiToPostOrToUpdate) { - return SyncResult.INCOMPLETE - } - - return SyncResult.ERROR - } - override fun syncGranularEvent(eventUid: String): Observable { Completable.fromObservable(syncRepository.uploadEvent(eventUid)).blockingAwait() return syncRepository @@ -327,7 +70,9 @@ class SyncPresenterImpl( return if (!checkSyncProgramStatus(programUid)) { ListenableWorker.Result.failure() } else { - syncStatusController.updateSingleProgramToSuccess(programUid) + runBlocking { + syncStatusController.updateSingleProgramToSuccess(programUid) + } ListenableWorker.Result.success() } } @@ -658,7 +403,7 @@ class SyncPresenterImpl( .byTrackedEntityInstanceUid() .eq(uid) .blockingGet() - if (trackerImportConflicts != null && trackerImportConflicts.isNotEmpty()) { + if (!trackerImportConflicts.isNullOrEmpty()) { return trackerImportConflicts } @@ -669,7 +414,7 @@ class SyncPresenterImpl( .byEventUid() .eq(uid) .blockingGet() - if (trackerImportConflicts != null && trackerImportConflicts.isNotEmpty()) { + if (trackerImportConflicts.isNotEmpty()) { return trackerImportConflicts } @@ -680,54 +425,15 @@ class SyncPresenterImpl( .byEnrollmentUid() .eq(uid) .blockingGet() - return if (trackerImportConflicts != null && trackerImportConflicts.isNotEmpty()) { - trackerImportConflicts - } else { + return trackerImportConflicts.ifEmpty { null } } - override fun startPeriodicDataWork() { - val seconds = - getSettings()?.dataSync()?.toSeconds() ?: preferences.getInt(TIME_DATA, TIME_DAILY) - workManagerController.cancelUniqueWork(DATA) - - if (seconds != 0) { - val workerItem = - WorkerItem( - DATA, - WorkerType.DATA, - seconds.toLong(), - policy = ExistingWorkPolicy.REPLACE, - ) - - workManagerController.syncDataForWorker(workerItem) - } - } - - private fun getSettings(): GeneralSettings? = d2.settingModule().generalSetting().blockingGet() - - private fun getProgramSetting(): ProgramSettings? = d2.settingModule().programSetting().blockingGet() - - override fun logTimeToFinish( - millisToFinish: Long, - eventName: String, - ) { - analyticsHelper.setEvent( - eventName, - (millisToFinish / 60000.0).toString(), - eventName, - ) - } - - override fun updateProyectAnalytics() { - getSettings()?.let { - if (it.matomoID() != null && it.matomoURL() != null) { - analyticsHelper.updateMatomoSecondaryTracker( - it.matomoURL()!!, - it.matomoID()!!, - ) - } - } ?: analyticsHelper.clearMatomoSecondaryTracker() - } + private fun getProgramSetting(): ProgramSettings? = + d2 + .settingModule() + .synchronizationSettings() + .blockingGet() + ?.programSettings() } diff --git a/app/src/main/java/org/dhis2/data/service/SyncStatusController.kt b/app/src/main/java/org/dhis2/data/service/SyncStatusController.kt deleted file mode 100644 index 19373e1a7b9..00000000000 --- a/app/src/main/java/org/dhis2/data/service/SyncStatusController.kt +++ /dev/null @@ -1,190 +0,0 @@ -package org.dhis2.data.service - -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.launch -import org.dhis2.commons.viewmodel.DispatcherProvider -import org.hisp.dhis.android.core.arch.call.D2ProgressStatus -import org.hisp.dhis.android.core.arch.call.D2ProgressSyncStatus -import timber.log.Timber - -class SyncStatusController( - private val dispatcher: DispatcherProvider, -) { - private var progressStatusMap: Map = emptyMap() - private val downloadStatus = MutableStateFlow(SyncStatusData(isInitialSync = true)) - - fun observeDownloadProcess(): StateFlow = downloadStatus - - fun initDownloadProcess(programDownload: Map) { - Timber.tag("SYNC").d("INIT DATA SYNC") - progressStatusMap = programDownload - CoroutineScope(dispatcher.io()).launch { - downloadStatus.emit( - SyncStatusData( - running = true, - downloadingEvents = false, - downloadingTracker = false, - downloadingDataSetValues = false, - false, - progressStatusMap, - ), - ) - } - } - - fun updateDownloadProcess(programDownload: Map) { - Timber.tag("SYNC").d("Updating PROGRAM") - progressStatusMap = - progressStatusMap.toMutableMap().also { - it.putAll(programDownload) - } - CoroutineScope(dispatcher.io()).launch { - downloadStatus.emit( - downloadStatus.value.copy(programSyncStatusMap = progressStatusMap), - ) - } - } - - fun finishSync() { - Timber.tag("SYNC").d("FINISH DATA SYNC") - progressStatusMap = progressStatusMap.toMutableMap() - CoroutineScope(dispatcher.io()).launch { - downloadStatus.emit( - downloadStatus.value.copy( - running = false, - programSyncStatusMap = progressStatusMap, - ), - ) - } - } - - fun onNetworkUnavailable() { - progressStatusMap = - progressStatusMap.toMutableMap().mapValues { entry -> - if (entry.value.isComplete) { - entry.value - } else { - entry.value.copy(isComplete = true, D2ProgressSyncStatus.ERROR) - } - } - CoroutineScope(dispatcher.io()).launch { - downloadStatus.emit( - SyncStatusData(true, programSyncStatusMap = progressStatusMap), - ) - } - } - - fun startDownloadingEvents() { - CoroutineScope(dispatcher.io()).launch { - downloadStatus.emit( - downloadStatus.value.copy(running = true, downloadingEvents = true), - ) - } - } - - fun finishDownloadingEvents(eventProgramUids: List) { - Timber.tag("SYNC").d("FINISHED EVENTS") - progressStatusMap = - progressStatusMap.toMutableMap().mapValues { entry -> - if (!eventProgramUids.contains(entry.key) || entry.value.isComplete) { - entry.value - } else { - entry.value.copy(isComplete = true, D2ProgressSyncStatus.ERROR) - } - } - CoroutineScope(dispatcher.io()).launch { - downloadStatus.emit( - downloadStatus.value.copy( - downloadingEvents = false, - programSyncStatusMap = progressStatusMap, - ), - ) - } - } - - fun startDownloadingTracker() { - CoroutineScope(dispatcher.io()).launch { - downloadStatus.emit( - downloadStatus.value.copy(downloadingTracker = true), - ) - } - } - - fun finishDownloadingTracker(trackerProgramUids: List) { - Timber.tag("SYNC").d("FINISHED TRACKER") - - progressStatusMap = - progressStatusMap.toMutableMap().mapValues { entry -> - if (!trackerProgramUids.contains(entry.key) || entry.value.isComplete) { - entry.value - } else { - entry.value.copy(isComplete = true, D2ProgressSyncStatus.ERROR) - } - } - CoroutineScope(dispatcher.io()).launch { - downloadStatus.emit( - downloadStatus.value.copy( - downloadingTracker = false, - programSyncStatusMap = progressStatusMap, - ), - ) - } - } - - fun updateSingleProgramToSuccess(programUid: String) { - progressStatusMap = - progressStatusMap.toMutableMap().mapValues { entry -> - if (programUid != entry.key) { - entry.value - } else { - entry.value.copy(isComplete = true, D2ProgressSyncStatus.SUCCESS) - } - } - CoroutineScope(dispatcher.io()).launch { - downloadStatus.emit( - SyncStatusData(false, programSyncStatusMap = progressStatusMap), - ) - } - } - - fun initDownloadMedia() { - Timber.tag("SYNC").d("INIT FILES") - CoroutineScope(dispatcher.io()).launch { - downloadStatus.emit( - downloadStatus.value.copy(downloadingMedia = true), - ) - } - } - - fun restore() { - CoroutineScope(dispatcher.io()).launch { - downloadStatus.emit(SyncStatusData()) - } - } - - fun startDownloadingDataSets() { - CoroutineScope(dispatcher.io()).launch { - downloadStatus.emit( - downloadStatus.value.copy(downloadingDataSetValues = true), - ) - } - } - - fun finishDownloadingDataSets(dataSetUids: List) { - progressStatusMap = - progressStatusMap.toMutableMap().mapValues { entry -> - if (!dataSetUids.contains(entry.key) || entry.value.isComplete) { - entry.value - } else { - entry.value.copy(isComplete = true, D2ProgressSyncStatus.ERROR) - } - } - CoroutineScope(dispatcher.io()).launch { - downloadStatus.emit( - downloadStatus.value.copy(downloadingDataSetValues = false, programSyncStatusMap = progressStatusMap), - ) - } - } -} diff --git a/app/src/main/java/org/dhis2/data/service/workManager/WorkManagerController.kt b/app/src/main/java/org/dhis2/data/service/workManager/WorkManagerController.kt index 6ef8ddc5a98..f583c04b714 100644 --- a/app/src/main/java/org/dhis2/data/service/workManager/WorkManagerController.kt +++ b/app/src/main/java/org/dhis2/data/service/workManager/WorkManagerController.kt @@ -34,11 +34,6 @@ import androidx.work.WorkInfo interface WorkManagerController { fun syncDataForWorker(workerItem: WorkerItem) - fun syncDataForWorker( - dataWorkerTag: String, - workName: String, - ) - fun beginUniqueWork(workerItem: WorkerItem) fun enqueuePeriodicWork(workerItem: WorkerItem) diff --git a/app/src/main/java/org/dhis2/data/service/workManager/WorkManagerControllerImpl.kt b/app/src/main/java/org/dhis2/data/service/workManager/WorkManagerControllerImpl.kt index 029f9b27af2..ceef5322de2 100644 --- a/app/src/main/java/org/dhis2/data/service/workManager/WorkManagerControllerImpl.kt +++ b/app/src/main/java/org/dhis2/data/service/workManager/WorkManagerControllerImpl.kt @@ -30,14 +30,12 @@ package org.dhis2.data.service.workManager import androidx.lifecycle.LiveData import androidx.lifecycle.MediatorLiveData -import androidx.work.ExistingWorkPolicy import androidx.work.OneTimeWorkRequest import androidx.work.PeriodicWorkRequest import androidx.work.WorkInfo import androidx.work.WorkManager import androidx.work.await import org.dhis2.data.service.CheckVersionWorker -import org.dhis2.data.service.SyncDataWorker import org.dhis2.data.service.SyncGranularWorker import java.util.concurrent.TimeUnit @@ -54,19 +52,6 @@ class WorkManagerControllerImpl( } } - override fun syncDataForWorker( - dataWorkerTag: String, - workName: String, - ) { - val workerTwoBuilder = OneTimeWorkRequest.Builder(SyncDataWorker::class.java) - workerTwoBuilder - .addTag(dataWorkerTag) - - workManager - .beginUniqueWork(workName, ExistingWorkPolicy.KEEP, workerTwoBuilder.build()) - .enqueue() - } - override fun beginUniqueWork(workerItem: WorkerItem) { val request = createOneTimeBuilder(workerItem).build() workerItem.policy?.let { @@ -118,7 +103,6 @@ class WorkManagerControllerImpl( private fun createOneTimeBuilder(workerItem: WorkerItem): OneTimeWorkRequest.Builder { val syncBuilder = when (workerItem.workerType) { - WorkerType.DATA -> OneTimeWorkRequest.Builder(SyncDataWorker::class.java) WorkerType.GRANULAR -> OneTimeWorkRequest.Builder(SyncGranularWorker::class.java) WorkerType.NEW_VERSION -> OneTimeWorkRequest.Builder(CheckVersionWorker::class.java) } @@ -140,13 +124,6 @@ class WorkManagerControllerImpl( val syncBuilder = when (workerItem.workerType) { - WorkerType.DATA -> { - PeriodicWorkRequest.Builder( - SyncDataWorker::class.java, - seconds, - TimeUnit.SECONDS, - ) - } WorkerType.GRANULAR -> { PeriodicWorkRequest.Builder( SyncGranularWorker::class.java, @@ -154,6 +131,7 @@ class WorkManagerControllerImpl( TimeUnit.SECONDS, ) } + WorkerType.NEW_VERSION -> PeriodicWorkRequest.Builder( CheckVersionWorker::class.java, diff --git a/app/src/main/java/org/dhis2/data/service/workManager/WorkerType.kt b/app/src/main/java/org/dhis2/data/service/workManager/WorkerType.kt index 067b2a45e11..050519a6e2c 100644 --- a/app/src/main/java/org/dhis2/data/service/workManager/WorkerType.kt +++ b/app/src/main/java/org/dhis2/data/service/workManager/WorkerType.kt @@ -29,7 +29,6 @@ package org.dhis2.data.service.workManager enum class WorkerType { - DATA, GRANULAR, NEW_VERSION, } diff --git a/app/src/main/java/org/dhis2/data/user/UserComponent.java b/app/src/main/java/org/dhis2/data/user/UserComponent.java index 283f3d9d1e4..945eda6e50d 100644 --- a/app/src/main/java/org/dhis2/data/user/UserComponent.java +++ b/app/src/main/java/org/dhis2/data/user/UserComponent.java @@ -8,8 +8,6 @@ import org.dhis2.commons.featureconfig.di.FeatureConfigActivityComponent; import org.dhis2.commons.featureconfig.di.FeatureConfigActivityModule; import org.dhis2.commons.filters.data.FilterPresenter; -import org.dhis2.data.service.SyncDataWorkerComponent; -import org.dhis2.data.service.SyncDataWorkerModule; import org.dhis2.data.service.SyncGranularRxComponent; import org.dhis2.data.service.SyncGranularRxModule; import org.dhis2.usescases.about.AboutComponent; @@ -129,9 +127,6 @@ public interface UserComponent { @NonNull ReservedValueComponent plus(ReservedValueModule reservedValueModule); - @NonNull - SyncDataWorkerComponent plus(SyncDataWorkerModule syncDataWorkerModule); - @NonNull EventCaptureComponent plus(EventCaptureModule eventCaptureModule); diff --git a/app/src/main/java/org/dhis2/di/KoinInitialization.kt b/app/src/main/java/org/dhis2/di/KoinInitialization.kt index 3eec9f862f9..be3b7cb076c 100644 --- a/app/src/main/java/org/dhis2/di/KoinInitialization.kt +++ b/app/src/main/java/org/dhis2/di/KoinInitialization.kt @@ -3,6 +3,7 @@ package org.dhis2.di import android.app.Application import org.dhis2.BuildConfig import org.dhis2.android.rtsm.di.stockModule +import org.dhis2.appModule import org.dhis2.commons.di.filterModule import org.dhis2.commons.di.resourceManagerModule import org.dhis2.commons.filters.periods.di.filterPeriodsModule @@ -19,6 +20,7 @@ import org.dhis2.utils.analytics.matomo.matomoModule import org.hisp.dhis.android.core.D2Configuration import org.koin.android.ext.koin.androidContext import org.koin.android.ext.koin.androidLogger +import org.koin.androidx.workmanager.koin.workManagerFactory import org.koin.core.context.startKoin object KoinInitialization { @@ -32,7 +34,9 @@ object KoinInitialization { "isTrainingFlavor" to (BuildConfig.FLAVOR == "dhis2Training"), ), ) + workManagerFactory() modules( + appModule, serverModule(d2Configuration), commonsModule, aggregatesModule, diff --git a/app/src/main/java/org/dhis2/usescases/general/SessionManagerActivity.kt b/app/src/main/java/org/dhis2/usescases/general/SessionManagerActivity.kt index 9ccd6cd9450..6e4af775015 100644 --- a/app/src/main/java/org/dhis2/usescases/general/SessionManagerActivity.kt +++ b/app/src/main/java/org/dhis2/usescases/general/SessionManagerActivity.kt @@ -7,9 +7,8 @@ import android.view.WindowManager import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityOptionsCompat import androidx.lifecycle.lifecycleScope -import io.reactivex.Observable import io.reactivex.subjects.BehaviorSubject -import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import org.dhis2.App import org.dhis2.R import org.dhis2.bindings.app @@ -18,10 +17,9 @@ import org.dhis2.commons.ActivityResultObserver import org.dhis2.commons.locationprovider.LocationProvider import org.dhis2.commons.service.SessionManagerServiceImpl import org.dhis2.commons.ui.extensions.handleInsets -import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.server.OpenIdSession.LogOutReason -import org.dhis2.data.service.SyncStatusController import org.dhis2.data.service.workManager.WorkManagerController +import org.dhis2.mobile.sync.domain.SyncStatusController import org.dhis2.usescases.login.LoginActivity import org.dhis2.usescases.login.LoginActivity.Companion.bundle import org.dhis2.usescases.main.MainActivity @@ -32,6 +30,7 @@ import org.dhis2.utils.analytics.CLICK import org.dhis2.utils.analytics.FORGOT_CODE import org.dhis2.utils.session.PIN_DIALOG_TAG import org.dhis2.utils.session.PinDialog +import org.koin.android.ext.android.inject import javax.inject.Inject abstract class SessionManagerActivity : @@ -46,8 +45,6 @@ abstract class SessionManagerActivity : @Inject lateinit var locationProvider: LocationProvider - fun observableLifeCycle(): Observable = lifeCycleObservable - open var handleEdgeToEdge = true @Inject @@ -58,16 +55,7 @@ abstract class SessionManagerActivity : private var lifeCycleObservable: BehaviorSubject = BehaviorSubject.create() - var syncStatusController: SyncStatusController = - SyncStatusController( - object : DispatcherProvider { - override fun io() = Dispatchers.IO - - override fun computation() = Dispatchers.Default - - override fun ui() = Dispatchers.Main - }, - ) + val syncStatusController: SyncStatusController by inject() override fun onCreate(savedInstanceState: Bundle?) { val serverComponent = (applicationContext as App).serverComponent @@ -223,7 +211,9 @@ abstract class SessionManagerActivity : this !is LoginActivity ) { workManagerController.cancelAllWork() - syncStatusController.restore() + lifecycleScope.launch { + syncStatusController.restore() + } } } diff --git a/app/src/main/java/org/dhis2/usescases/main/MainActivity.kt b/app/src/main/java/org/dhis2/usescases/main/MainActivity.kt index 9526973f96b..69801d886e7 100644 --- a/app/src/main/java/org/dhis2/usescases/main/MainActivity.kt +++ b/app/src/main/java/org/dhis2/usescases/main/MainActivity.kt @@ -47,6 +47,7 @@ import org.dhis2.commons.orgunitselector.OUTreeFragment import org.dhis2.commons.sync.OnDismissListener import org.dhis2.commons.sync.SyncContext import org.dhis2.databinding.ActivityMainBinding +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.usescases.development.DevelopmentActivity import org.dhis2.usescases.general.ActivityGlobalAbstract import org.dhis2.usescases.login.LoginActivity @@ -60,6 +61,7 @@ import org.dhis2.utils.granularsync.SyncStatusDialog import org.dhis2.utils.session.PIN_DIALOG_TAG import org.dhis2.utils.session.PinDialog import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBar +import org.koin.android.ext.android.inject import java.io.File import javax.inject.Inject @@ -87,6 +89,8 @@ class MainActivity : @Inject lateinit var pageConfigurator: NavigationPageConfigurator + private val syncBackgroundJobAction: SyncBackgroundJobAction by inject() + private val getDevActivityContent = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { // no-op @@ -148,6 +152,8 @@ class MainActivity : it.plus( MainModule( view = this, + syncStatusController = syncStatusController, + syncBackgroundJobAction = syncBackgroundJobAction, forceToNotSynced = intent.getBooleanExtra(AVOID_SYNC, false), ), ) diff --git a/app/src/main/java/org/dhis2/usescases/main/MainModule.kt b/app/src/main/java/org/dhis2/usescases/main/MainModule.kt index 04ce3cab5f2..323fe43e729 100644 --- a/app/src/main/java/org/dhis2/usescases/main/MainModule.kt +++ b/app/src/main/java/org/dhis2/usescases/main/MainModule.kt @@ -15,7 +15,6 @@ import org.dhis2.commons.schedulers.SchedulerProvider import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.biometric.CryptographyManager import org.dhis2.data.server.UserManager -import org.dhis2.data.service.SyncStatusController import org.dhis2.data.service.VersionRepository import org.dhis2.data.service.workManager.WorkManagerController import org.dhis2.mobile.commons.biometrics.CryptographicActions @@ -25,6 +24,8 @@ import org.dhis2.mobile.commons.network.NetworkStatusProvider import org.dhis2.mobile.commons.network.NetworkStatusProviderImpl import org.dhis2.mobile.commons.resources.D2ErrorMessageProvider import org.dhis2.mobile.commons.resources.D2ErrorMessageProviderImpl +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.domain.SyncStatusController import org.dhis2.usescases.login.SyncIsPerformedInteractor import org.dhis2.usescases.main.domain.LogoutUser import org.dhis2.usescases.settings.DeleteUserData @@ -35,6 +36,8 @@ import org.hisp.dhis.android.core.D2 class MainModule( val view: MainView, private val forceToNotSynced: Boolean, + private val syncStatusController: SyncStatusController, + private val syncBackgroundJobAction: SyncBackgroundJobAction, ) { @Provides @PerActivity @@ -49,7 +52,6 @@ class MainModule( userManager: UserManager, deleteUserData: DeleteUserData, syncIsPerformedInteractor: SyncIsPerformedInteractor, - syncStatusController: SyncStatusController, versionRepository: VersionRepository, dispatcherProvider: DispatcherProvider, logoutUser: LogoutUser, @@ -67,6 +69,7 @@ class MainModule( deleteUserData, syncIsPerformedInteractor, syncStatusController, + syncBackgroundJobAction, versionRepository, dispatcherProvider, forceToNotSynced, @@ -77,13 +80,11 @@ class MainModule( @PerActivity fun provideLogoutUser( homeRepository: HomeRepository, - workManagerController: WorkManagerController, - syncStatusController: SyncStatusController, filterManager: FilterManager, ): LogoutUser = LogoutUser( homeRepository, - workManagerController, + syncBackgroundJobAction, syncStatusController, filterManager, ) diff --git a/app/src/main/java/org/dhis2/usescases/main/MainPresenter.kt b/app/src/main/java/org/dhis2/usescases/main/MainPresenter.kt index 4f8396c2463..00b7764dd44 100644 --- a/app/src/main/java/org/dhis2/usescases/main/MainPresenter.kt +++ b/app/src/main/java/org/dhis2/usescases/main/MainPresenter.kt @@ -16,6 +16,7 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import org.dhis2.BuildConfig import org.dhis2.commons.Constants import org.dhis2.commons.filters.FilterManager @@ -34,13 +35,14 @@ import org.dhis2.commons.prefs.PreferenceProvider import org.dhis2.commons.schedulers.SchedulerProvider import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.server.UserManager -import org.dhis2.data.service.SyncStatusController -import org.dhis2.data.service.SyncStatusData import org.dhis2.data.service.VersionRepository import org.dhis2.data.service.workManager.WorkManagerController import org.dhis2.data.service.workManager.WorkerItem import org.dhis2.data.service.workManager.WorkerType import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.domain.SyncStatusController +import org.dhis2.mobile.sync.model.SyncStatusData import org.dhis2.usescases.login.SyncIsPerformedInteractor import org.dhis2.usescases.main.domain.LogoutUser import org.dhis2.usescases.settings.DeleteUserData @@ -73,6 +75,7 @@ class MainPresenter( private val deleteUserData: DeleteUserData, private val syncIsPerformedInteractor: SyncIsPerformedInteractor, private val syncStatusController: SyncStatusController, + private val syncBackgroundJobAction: SyncBackgroundJobAction, private val versionRepository: VersionRepository, val dispatcherProvider: DispatcherProvider, private val forceToNotSynced: Boolean, @@ -250,21 +253,26 @@ class MainPresenter( fun onDeleteAccount() { view.showProgressDeleteNotification() - try { - repository.checkDeleteBiometricsPermission() - workManagerController.cancelAllWork() - syncStatusController.restore() - deleteUserData.wipeCacheAndPreferences(view.obtainFileView()) - userManager.d2?.wipeModule()?.wipeEverything() - userManager.d2 - ?.userModule() - ?.accountManager() - ?.deleteCurrentAccount() - view.cancelNotifications() - - view.goToLogin(repository.accountsCount(), isDeletion = true) - } catch (exception: Exception) { - Timber.e(exception) + launch(dispatcherProvider.io()) { + try { + repository.checkDeleteBiometricsPermission() + syncBackgroundJobAction.cancelAll() + syncStatusController.restore() + deleteUserData.wipeCacheAndPreferences(view.obtainFileView()) + userManager.d2?.wipeModule()?.wipeEverything() + userManager.d2 + ?.userModule() + ?.accountManager() + ?.deleteCurrentAccount() + + view.cancelNotifications() + + withContext(dispatcherProvider.ui()) { + view.goToLogin(repository.accountsCount(), isDeletion = true) + } + } catch (exception: Exception) { + Timber.e(exception) + } } } @@ -309,8 +317,7 @@ class MainPresenter( fun launchInitialDataSync() { checkVersionUpdate() - workManagerController - .syncDataForWorker(Constants.DATA_NOW, Constants.INITIAL_SYNC) + syncBackgroundJobAction.launchDataSync(0) } fun observeDataSync(): StateFlow = syncStatusController.observeDownloadProcess() diff --git a/app/src/main/java/org/dhis2/usescases/main/data/HomeRepository.kt b/app/src/main/java/org/dhis2/usescases/main/data/HomeRepository.kt index 86b2849f635..5b3f7ec6aa3 100644 --- a/app/src/main/java/org/dhis2/usescases/main/data/HomeRepository.kt +++ b/app/src/main/java/org/dhis2/usescases/main/data/HomeRepository.kt @@ -38,6 +38,4 @@ interface HomeRepository { suspend fun stopBackgroundSync() suspend fun restoreSyncStatus() - - suspend fun syncData() } diff --git a/app/src/main/java/org/dhis2/usescases/main/data/HomeRepositoryImpl.kt b/app/src/main/java/org/dhis2/usescases/main/data/HomeRepositoryImpl.kt index 7408dccbe0f..64ea8dc8aa4 100644 --- a/app/src/main/java/org/dhis2/usescases/main/data/HomeRepositoryImpl.kt +++ b/app/src/main/java/org/dhis2/usescases/main/data/HomeRepositoryImpl.kt @@ -2,18 +2,17 @@ package org.dhis2.usescases.main.data import dhis2.org.analytics.charts.Charts import kotlinx.coroutines.withContext -import org.dhis2.commons.Constants import org.dhis2.commons.bindings.dataSet import org.dhis2.commons.bindings.dataSetInstanceSummaries import org.dhis2.commons.bindings.isStockProgram import org.dhis2.commons.bindings.programs import org.dhis2.commons.prefs.Preference import org.dhis2.commons.prefs.Preference.Companion.PIN -import org.dhis2.data.service.SyncStatusController import org.dhis2.data.service.workManager.WorkManagerController import org.dhis2.mobile.commons.coroutine.Dispatcher import org.dhis2.mobile.commons.error.DomainErrorMapper import org.dhis2.mobile.commons.providers.PreferenceProvider +import org.dhis2.mobile.sync.domain.SyncStatusController import org.dhis2.usescases.main.HomeItemData import org.dhis2.usescases.settings.deleteCache import org.dhis2.usescases.sync.WAS_INITIAL_SYNC_DONE @@ -201,9 +200,4 @@ class HomeRepositoryImpl( override suspend fun restoreSyncStatus() { syncStatusController.restore() } - - override suspend fun syncData() { - workManagerController - .syncDataForWorker(Constants.DATA_NOW, Constants.INITIAL_SYNC) - } } diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/LaunchInitialSync.kt b/app/src/main/java/org/dhis2/usescases/main/domain/LaunchInitialSync.kt index 72db6f550c7..886d645c9ff 100644 --- a/app/src/main/java/org/dhis2/usescases/main/domain/LaunchInitialSync.kt +++ b/app/src/main/java/org/dhis2/usescases/main/domain/LaunchInitialSync.kt @@ -3,12 +3,14 @@ package org.dhis2.usescases.main.domain import org.dhis2.data.service.VersionRepository import org.dhis2.mobile.commons.domain.UseCase import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.usescases.main.data.HomeRepository class LaunchInitialSync( private val skipSync: Boolean, private val homeRepository: HomeRepository, private val versionRepository: VersionRepository, + private val syncBackgroundJobAction: SyncBackgroundJobAction, ) : UseCase { override suspend fun invoke(input: Unit): Result = try { @@ -16,8 +18,7 @@ class LaunchInitialSync( Result.success(InitialSyncAction.Skip) } else { versionRepository.checkVersionUpdates() - homeRepository.syncData() - + syncBackgroundJobAction.launchDataSync(0) Result.success(InitialSyncAction.Syncing) } } catch (domainError: DomainError) { diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/LogoutUser.kt b/app/src/main/java/org/dhis2/usescases/main/domain/LogoutUser.kt index 4961f4589d9..7ce9f53b918 100644 --- a/app/src/main/java/org/dhis2/usescases/main/domain/LogoutUser.kt +++ b/app/src/main/java/org/dhis2/usescases/main/domain/LogoutUser.kt @@ -1,21 +1,21 @@ package org.dhis2.usescases.main.domain import org.dhis2.commons.filters.FilterManager -import org.dhis2.data.service.SyncStatusController -import org.dhis2.data.service.workManager.WorkManagerController import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.domain.SyncStatusController import org.dhis2.usescases.main.HomeRepository typealias AccountCount = Int class LogoutUser( private val repository: HomeRepository, - private val workManagerController: WorkManagerController, + private val syncBackgroundJobAction: SyncBackgroundJobAction, private val syncStatusController: SyncStatusController, private val filterManager: FilterManager, ) : UseCase { override suspend operator fun invoke(input: Unit): Result { - workManagerController.cancelAllWorkAndWait() + syncBackgroundJobAction.cancelAll() syncStatusController.restore() filterManager.clearAllFilters() diff --git a/app/src/main/java/org/dhis2/usescases/main/program/ProgramFragment.kt b/app/src/main/java/org/dhis2/usescases/main/program/ProgramFragment.kt index 9b3511c0f0b..6340a06b260 100644 --- a/app/src/main/java/org/dhis2/usescases/main/program/ProgramFragment.kt +++ b/app/src/main/java/org/dhis2/usescases/main/program/ProgramFragment.kt @@ -21,6 +21,7 @@ import org.dhis2.App import org.dhis2.R import org.dhis2.commons.sync.OnDismissListener import org.dhis2.commons.sync.SyncContext +import org.dhis2.mobile.sync.domain.SyncStatusController import org.dhis2.usescases.general.FragmentGlobalAbstract import org.dhis2.usescases.main.navigateTo import org.dhis2.usescases.main.toHomeItemData @@ -28,12 +29,15 @@ import org.dhis2.utils.HelpManager import org.dhis2.utils.analytics.SELECT_PROGRAM import org.dhis2.utils.analytics.TYPE_PROGRAM_SELECTED import org.dhis2.utils.granularsync.SyncStatusDialog +import org.koin.android.ext.android.inject import timber.log.Timber import javax.inject.Inject class ProgramFragment : FragmentGlobalAbstract(), ProgramView { + private val syncStatusController: SyncStatusController by inject() + @Inject lateinit var programViewModelFactory: ProgramViewModelFactory @@ -51,7 +55,10 @@ class ProgramFragment : override fun onAttach(context: Context) { super.onAttach(context) activity?.let { - (it.applicationContext as App).userComponent()?.plus(ProgramModule(this))?.inject(this) + (it.applicationContext as App) + .userComponent() + ?.plus(ProgramModule(this, syncStatusController)) + ?.inject(this) } } diff --git a/app/src/main/java/org/dhis2/usescases/main/program/ProgramModule.kt b/app/src/main/java/org/dhis2/usescases/main/program/ProgramModule.kt index f69e5d56660..72536aa84bd 100644 --- a/app/src/main/java/org/dhis2/usescases/main/program/ProgramModule.kt +++ b/app/src/main/java/org/dhis2/usescases/main/program/ProgramModule.kt @@ -13,12 +13,13 @@ import org.dhis2.commons.resources.ResourceManager import org.dhis2.commons.schedulers.SchedulerProvider import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.dhislogic.DhisProgramUtils -import org.dhis2.data.service.SyncStatusController +import org.dhis2.mobile.sync.domain.SyncStatusController import org.hisp.dhis.android.core.D2 @Module class ProgramModule( private val view: ProgramView, + private val syncStatusController: SyncStatusController, ) { @Provides @PerFragment @@ -28,7 +29,6 @@ class ProgramModule( featureConfigRepository: FeatureConfigRepository, matomoAnalyticsController: MatomoAnalyticsController, filterManager: FilterManager, - syncStatusController: SyncStatusController, schedulerProvider: SchedulerProvider, ): ProgramViewModelFactory = ProgramViewModelFactory( diff --git a/app/src/main/java/org/dhis2/usescases/main/program/ProgramRepository.kt b/app/src/main/java/org/dhis2/usescases/main/program/ProgramRepository.kt index 8070022df75..e670e95e689 100644 --- a/app/src/main/java/org/dhis2/usescases/main/program/ProgramRepository.kt +++ b/app/src/main/java/org/dhis2/usescases/main/program/ProgramRepository.kt @@ -1,7 +1,7 @@ package org.dhis2.usescases.main.program import io.reactivex.Flowable -import org.dhis2.data.service.SyncStatusData +import org.dhis2.mobile.sync.model.SyncStatusData interface ProgramRepository { fun homeItems(syncStatusData: SyncStatusData): Flowable> diff --git a/app/src/main/java/org/dhis2/usescases/main/program/ProgramRepositoryImpl.kt b/app/src/main/java/org/dhis2/usescases/main/program/ProgramRepositoryImpl.kt index f6bcd648454..fb87f283a06 100644 --- a/app/src/main/java/org/dhis2/usescases/main/program/ProgramRepositoryImpl.kt +++ b/app/src/main/java/org/dhis2/usescases/main/program/ProgramRepositoryImpl.kt @@ -8,7 +8,7 @@ import org.dhis2.commons.resources.MetadataIconProvider import org.dhis2.commons.resources.ResourceManager import org.dhis2.commons.schedulers.SchedulerProvider import org.dhis2.data.dhislogic.DhisProgramUtils -import org.dhis2.data.service.SyncStatusData +import org.dhis2.mobile.sync.model.SyncStatusData import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.program.Program diff --git a/app/src/main/java/org/dhis2/usescases/main/program/ProgramUi.kt b/app/src/main/java/org/dhis2/usescases/main/program/ProgramUi.kt index 65e761d05d2..bbfcca25910 100644 --- a/app/src/main/java/org/dhis2/usescases/main/program/ProgramUi.kt +++ b/app/src/main/java/org/dhis2/usescases/main/program/ProgramUi.kt @@ -57,9 +57,9 @@ import org.dhis2.R import org.dhis2.commons.bindings.addIf import org.dhis2.commons.date.toDateSpan import org.dhis2.commons.ui.icons.toIconData -import org.dhis2.data.service.SyncStatusData import org.dhis2.mobile.commons.extensions.toColorInt import org.dhis2.mobile.commons.model.MetadataIconData +import org.dhis2.mobile.sync.model.SyncStatusData import org.hisp.dhis.android.core.common.State import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItem import org.hisp.dhis.mobile.ui.designsystem.component.Avatar diff --git a/app/src/main/java/org/dhis2/usescases/main/program/ProgramViewModel.kt b/app/src/main/java/org/dhis2/usescases/main/program/ProgramViewModel.kt index 007acb62cf5..cc0ccd829d6 100644 --- a/app/src/main/java/org/dhis2/usescases/main/program/ProgramViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/main/program/ProgramViewModel.kt @@ -18,7 +18,8 @@ import org.dhis2.commons.matomo.Labels.Companion.CLICK_ON import org.dhis2.commons.matomo.MatomoAnalyticsController import org.dhis2.commons.schedulers.SchedulerProvider import org.dhis2.commons.viewmodel.DispatcherProvider -import org.dhis2.data.service.SyncStatusController +import org.dhis2.mobile.sync.domain.SyncStatusController +import org.koin.core.component.KoinComponent import timber.log.Timber import java.util.concurrent.TimeUnit @@ -31,7 +32,8 @@ class ProgramViewModel internal constructor( private val filterManager: FilterManager, private val syncStatusController: SyncStatusController, private val schedulerProvider: SchedulerProvider, -) : ViewModel() { +) : ViewModel(), + KoinComponent { private val _programs = MutableLiveData>() val programs: LiveData> = _programs private val refreshData = PublishProcessor.create() diff --git a/app/src/main/java/org/dhis2/usescases/main/program/ProgramViewModelFactory.kt b/app/src/main/java/org/dhis2/usescases/main/program/ProgramViewModelFactory.kt index 1ac164a3b1c..e3b2f78c0ad 100644 --- a/app/src/main/java/org/dhis2/usescases/main/program/ProgramViewModelFactory.kt +++ b/app/src/main/java/org/dhis2/usescases/main/program/ProgramViewModelFactory.kt @@ -7,7 +7,7 @@ import org.dhis2.commons.filters.FilterManager import org.dhis2.commons.matomo.MatomoAnalyticsController import org.dhis2.commons.schedulers.SchedulerProvider import org.dhis2.commons.viewmodel.DispatcherProvider -import org.dhis2.data.service.SyncStatusController +import org.dhis2.mobile.sync.domain.SyncStatusController class ProgramViewModelFactory( private val view: ProgramView, diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.kt index 6aa087ef3fa..e91d4083cb6 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.kt @@ -230,6 +230,7 @@ class SearchTEActivity : initialProgram, context, initialQuery, + syncStatusController, ), ) searchComponent?.inject(this) diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java index 7f7dc950b7c..7289b6ecca1 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java @@ -28,7 +28,6 @@ import org.dhis2.data.enrollment.EnrollmentUiDataHelper; import org.dhis2.data.forms.dataentry.SearchTEIRepository; import org.dhis2.data.forms.dataentry.SearchTEIRepositoryImpl; -import org.dhis2.data.service.SyncStatusController; import org.dhis2.data.sorting.SearchSortingValueSetter; import org.dhis2.form.data.metadata.FileResourceConfiguration; import org.dhis2.form.data.metadata.OptionSetConfiguration; @@ -68,6 +67,7 @@ import org.dhis2.mobile.commons.reporting.CrashReportController; import org.dhis2.mobile.commons.resources.D2ErrorMessageProvider; import org.dhis2.mobile.commons.resources.D2ErrorMessageProviderImpl; +import org.dhis2.mobile.sync.domain.SyncStatusController; import org.dhis2.tracker.data.ProfilePictureProvider; import org.dhis2.tracker.search.data.OptionSetRepository; import org.dhis2.tracker.search.data.OptionSetRepositoryImpl; @@ -100,17 +100,21 @@ public class SearchTEModule { private final String initialProgram; private final Context moduleContext; private final Map> initialQuery; + private final SyncStatusController syncStatusController; public SearchTEModule(SearchTEContractsModule.View view, String tEType, String initialProgram, Context context, - Map> initialQuery) { + Map> initialQuery, + SyncStatusController syncStatusController + ) { this.view = view; this.teiType = tEType; this.initialProgram = initialProgram; this.moduleContext = context; this.initialQuery = initialQuery; + this.syncStatusController = syncStatusController; } @Provides @@ -128,7 +132,6 @@ SearchTEContractsModule.Presenter providePresenter(D2 d2, PreferenceProvider preferenceProvider, FilterRepository filterRepository, MatomoAnalyticsController matomoAnalyticsController, - SyncStatusController syncStatusController, ResourceManager resourceManager, ColorUtils colorUtils) { return new SearchTEPresenter(view, d2, searchRepository, schedulerProvider, diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEPresenter.java b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEPresenter.java index ac7cef1d4e2..f1fc82c79a4 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEPresenter.java +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEPresenter.java @@ -27,7 +27,6 @@ import org.dhis2.commons.filters.data.FilterRepository; import org.dhis2.commons.matomo.MatomoAnalyticsController; import org.dhis2.commons.orgunitselector.OUTreeFragment; -import org.dhis2.mobile.commons.orgunit.OrgUnitSelectorScope; import org.dhis2.commons.prefs.Preference; import org.dhis2.commons.prefs.PreferenceProvider; import org.dhis2.commons.resources.ColorUtils; @@ -36,8 +35,9 @@ import org.dhis2.commons.schedulers.SchedulerProvider; import org.dhis2.commons.schedulers.SingleEventEnforcer; import org.dhis2.commons.schedulers.SingleEventEnforcerImpl; -import org.dhis2.data.service.SyncStatusController; import org.dhis2.maps.model.StageStyle; +import org.dhis2.mobile.commons.orgunit.OrgUnitSelectorScope; +import org.dhis2.mobile.sync.domain.SyncStatusController; import org.dhis2.utils.analytics.AnalyticsHelper; import org.hisp.dhis.android.core.D2; import org.hisp.dhis.android.core.common.FeatureType; @@ -84,7 +84,6 @@ public class SearchTEPresenter implements SearchTEContractsModule.Presenter { private final DisableHomeFiltersFromSettingsApp disableHomeFilters; private final MatomoAnalyticsController matomoAnalyticsController; private final SyncStatusController syncStatusController; - private final ColorUtils colorUtils; public SearchTEPresenter(SearchTEContractsModule.View view, @@ -320,7 +319,7 @@ public void enroll(String programUid, String uid, HashMap> ); } - private void enrollInOrgUnit(String orgUnitUid, String programUid, String uid, HashMap> queryData) { + private void enrollInOrgUnit(String orgUnitUid, String programUid, String uid, HashMap> queryData) { compositeDisposable.add( searchRepository.saveToEnroll(trackedEntity.uid(), orgUnitUid, programUid, uid, queryData, view.fromRelationshipTEI()) .subscribeOn(schedulerProvider.computation()) diff --git a/app/src/main/java/org/dhis2/usescases/settings/SyncManagerModule.kt b/app/src/main/java/org/dhis2/usescases/settings/SyncManagerModule.kt index c690c727e2f..61678bfba2c 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/SyncManagerModule.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/SyncManagerModule.kt @@ -10,7 +10,6 @@ import org.dhis2.commons.prefs.PreferenceProvider import org.dhis2.commons.resources.ResourceManager import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.service.VersionRepository -import org.dhis2.data.service.workManager.WorkManagerController import org.dhis2.mobile.commons.files.FileHandlerImpl import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.usescases.settings.domain.CheckVersionUpdate @@ -153,12 +152,10 @@ class SyncManagerModule( @Provides @PerFragment fun provideLaunchSync( - workManagerController: WorkManagerController, preferenceProvider: PreferenceProvider, analyticsHelper: AnalyticsHelper, ) = LaunchSync( syncBackgroundJobAction, - workManagerController, preferenceProvider, analyticsHelper, ) diff --git a/app/src/main/java/org/dhis2/usescases/settings/domain/LaunchSync.kt b/app/src/main/java/org/dhis2/usescases/settings/domain/LaunchSync.kt index d08e2991053..cf92469b58e 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/domain/LaunchSync.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/domain/LaunchSync.kt @@ -1,9 +1,5 @@ package org.dhis2.usescases.settings.domain -import androidx.lifecycle.asFlow -import androidx.work.ExistingPeriodicWorkPolicy -import androidx.work.ExistingWorkPolicy -import androidx.work.WorkInfo import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge @@ -12,9 +8,6 @@ import org.dhis2.commons.Constants import org.dhis2.commons.matomo.Actions import org.dhis2.commons.matomo.Categories import org.dhis2.commons.prefs.PreferenceProvider -import org.dhis2.data.service.workManager.WorkManagerController -import org.dhis2.data.service.workManager.WorkerItem -import org.dhis2.data.service.workManager.WorkerType import org.dhis2.mobile.commons.providers.TIME_DATA import org.dhis2.mobile.commons.providers.TIME_META import org.dhis2.mobile.sync.data.SyncBackgroundJobAction @@ -26,7 +19,6 @@ import org.dhis2.mobile.sync.model.SyncStatus as Status class LaunchSync( private val syncBackgroundJobAction: SyncBackgroundJobAction, - private val workManagerController: WorkManagerController, private val preferenceProvider: PreferenceProvider, private val analyticsHelper: AnalyticsHelper, ) { @@ -48,19 +40,30 @@ class LaunchSync( Status.Running, Status.Blocked, -> syncStatus.update { it.copy(metadataSyncProgress = SyncStatus.InProgress) } + Status.Cancelled -> syncStatus.update { it.copy(metadataSyncProgress = SyncStatus.Cancelled) } + null -> syncStatus.update { it.copy(dataSyncProgress = SyncStatus.None) } else -> syncStatus.update { it.copy(metadataSyncProgress = SyncStatus.Finished) } } syncStatus.value } private val dataWorkInfo = - workManagerController - .getWorkInfosByTagLiveData(Constants.DATA_NOW) - .asFlow() + syncBackgroundJobAction + .observeDataJob() .map { workStatuses -> - var workState: WorkInfo.State? = workStatuses.getOrNull(0)?.state - onWorkStatusesUpdate(workState, Constants.DATA_NOW) + var workState = workStatuses.firstOrNull()?.status + when (workState) { + Status.Enqueue, + Status.Running, + Status.Blocked, + -> syncStatus.update { it.copy(dataSyncProgress = SyncStatus.InProgress) } + + Status.Cancelled -> syncStatus.update { it.copy(dataSyncProgress = SyncStatus.Cancelled) } + null -> syncStatus.update { it.copy(dataSyncProgress = SyncStatus.None) } + else -> syncStatus.update { it.copy(dataSyncProgress = SyncStatus.Finished) } + } + syncStatus.value } val syncWorkInfo = merge(metadataWorkInfo, dataWorkInfo) @@ -111,57 +114,10 @@ class LaunchSync( } } - private fun onWorkStatusesUpdate( - workState: WorkInfo.State?, - workerTag: String, - ): SyncStatusProgress { - if (workState != null) { - when (workState) { - WorkInfo.State.CANCELLED -> - when (workerTag) { - Constants.DATA_NOW -> syncStatus.update { it.copy(dataSyncProgress = SyncStatus.Cancelled) } - else -> syncStatus - } - - WorkInfo.State.ENQUEUED, - WorkInfo.State.RUNNING, - WorkInfo.State.BLOCKED, - -> - when (workerTag) { - Constants.DATA_NOW -> syncStatus.update { it.copy(dataSyncProgress = SyncStatus.InProgress) } - else -> syncStatus - } - - else -> - when (workerTag) { - Constants.DATA_NOW -> syncStatus.update { it.copy(dataSyncProgress = SyncStatus.Finished) } - else -> syncStatus - } - } - } else { - when (workerTag) { - Constants.META_NOW -> syncStatus.update { it.copy(metadataSyncProgress = SyncStatus.Finished) } - Constants.DATA_NOW -> syncStatus.update { it.copy(dataSyncProgress = SyncStatus.Finished) } - else -> syncStatus - } - } - - return syncStatus.value - } - private fun syncData() { analyticsHelper.trackMatomoEvent(Categories.SETTINGS, Actions.SYNC_CONFIG, CLICK) analyticsHelper.setEvent(SYNC_DATA_NOW, CLICK, SYNC_DATA_NOW) - val workerItem = - WorkerItem( - Constants.DATA_NOW, - WorkerType.DATA, - null, - null, - ExistingWorkPolicy.KEEP, - null, - ) - workManagerController.syncDataForWorker(workerItem) + syncBackgroundJobAction.launchDataSync(0) } private fun syncMeta() { @@ -169,12 +125,12 @@ class LaunchSync( syncBackgroundJobAction.launchMetadataSync(0) } - private fun updateSyncDataPeriod(seconds: Int) { + private suspend fun updateSyncDataPeriod(seconds: Int) { if (seconds != Constants.TIME_MANUAL) { syncData(seconds) } else { preferenceProvider.setValue(TIME_DATA, 0) - workManagerController.cancelUniqueWork(Constants.DATA) + syncBackgroundJobAction.cancelDataSync() } } @@ -195,16 +151,6 @@ class LaunchSync( private fun syncData(seconds: Int) { preferenceProvider.setValue(TIME_DATA, seconds) - workManagerController.cancelUniqueWork(Constants.DATA) - val workerItem = - WorkerItem( - Constants.DATA, - WorkerType.DATA, - seconds.toLong(), - null, - null, - ExistingPeriodicWorkPolicy.REPLACE, - ) - workManagerController.enqueuePeriodicWork(workerItem) + syncBackgroundJobAction.launchDataSync(seconds.toLong()) } } diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListActivity.java b/app/src/main/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListActivity.java index d9535cdf9fd..70df38985c7 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListActivity.java +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListActivity.java @@ -34,7 +34,7 @@ public class TeiProgramListActivity extends ActivityGlobalAbstract implements Te @Override public void onCreate(@Nullable Bundle savedInstanceState) { String trackedEntityId = getIntent().getStringExtra("TEI_UID"); - ((App) getApplicationContext()).userComponent().plus(new TeiProgramListModule(this, trackedEntityId)).inject(this); + ((App) getApplicationContext()).userComponent().plus(new TeiProgramListModule(this, trackedEntityId, getSyncStatusController())).inject(this); super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_tei_program_list); binding.setPresenter(presenter); diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListInteractor.java b/app/src/main/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListInteractor.java index 3f389a6a94a..a2d2f905f16 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListInteractor.java +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListInteractor.java @@ -8,7 +8,7 @@ import org.dhis2.commons.dialogs.calendarpicker.OnDatePickerListener; import org.dhis2.commons.orgunitselector.OUTreeFragment; import org.dhis2.mobile.commons.orgunit.OrgUnitSelectorScope; -import org.dhis2.data.service.SyncStatusController; +import org.dhis2.mobile.sync.domain.SyncStatusController; import org.dhis2.usescases.main.program.ProgramDownloadState; import org.dhis2.usescases.main.program.ProgramUiModel; import org.hisp.dhis.android.core.organisationunit.OrganisationUnit; diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListModule.java b/app/src/main/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListModule.java index 91d1b696c16..bd6a5e6c556 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListModule.java +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListModule.java @@ -4,10 +4,8 @@ import org.dhis2.commons.di.dagger.PerActivity; import org.dhis2.commons.prefs.PreferenceProvider; -import org.dhis2.commons.resources.ColorUtils; import org.dhis2.commons.resources.MetadataIconProvider; -import org.dhis2.commons.resources.ResourceManager; -import org.dhis2.data.service.SyncStatusController; +import org.dhis2.mobile.sync.domain.SyncStatusController; import org.dhis2.usescases.main.program.ProgramViewModelMapper; import org.dhis2.utils.analytics.AnalyticsHelper; import org.hisp.dhis.android.core.D2; @@ -22,9 +20,12 @@ public class TeiProgramListModule { private final TeiProgramListContract.View view; private final String teiUid; - TeiProgramListModule(TeiProgramListContract.View view, String teiUid) { + private final SyncStatusController syncStatusController; + + TeiProgramListModule(TeiProgramListContract.View view, String teiUid, SyncStatusController syncStatusController) { this.view = view; this.teiUid = teiUid; + this.syncStatusController = syncStatusController; } @Provides @@ -45,8 +46,7 @@ TeiProgramListContract.Presenter providesPresenter(TeiProgramListContract.Intera @Provides @PerActivity - TeiProgramListContract.Interactor provideInteractor(@NonNull TeiProgramListRepository teiProgramListRepository, - SyncStatusController syncStatusController) { + TeiProgramListContract.Interactor provideInteractor(@NonNull TeiProgramListRepository teiProgramListRepository) { return new TeiProgramListInteractor(teiProgramListRepository, syncStatusController); } diff --git a/app/src/main/java/org/dhis2/utils/granularsync/GranularSyncPresenter.kt b/app/src/main/java/org/dhis2/utils/granularsync/GranularSyncPresenter.kt index 0448e4f7353..cadabacca57 100644 --- a/app/src/main/java/org/dhis2/utils/granularsync/GranularSyncPresenter.kt +++ b/app/src/main/java/org/dhis2/utils/granularsync/GranularSyncPresenter.kt @@ -59,9 +59,12 @@ import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.service.workManager.WorkManagerController import org.dhis2.data.service.workManager.WorkerItem import org.dhis2.data.service.workManager.WorkerType +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.usescases.sms.SmsSendingService import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.common.State +import org.koin.core.component.KoinComponent +import org.koin.core.component.inject import timber.log.Timber class GranularSyncPresenter( @@ -73,7 +76,8 @@ class GranularSyncPresenter( private val syncContext: SyncContext, private val workManagerController: WorkManagerController, private val smsSyncProvider: SMSSyncProvider, -) : ViewModel() { +) : ViewModel(), + KoinComponent { private val workerName: String private var disposable: CompositeDisposable = CompositeDisposable() private lateinit var states: MutableLiveData> @@ -82,6 +86,8 @@ class GranularSyncPresenter( private val _currentState = MutableStateFlow(null) val currentState: StateFlow = _currentState + private val syncBackgroundJobAction: SyncBackgroundJobAction by inject() + init { workerName = workerName() } @@ -172,7 +178,7 @@ class GranularSyncPresenter( workManagerController.beginUniqueWork(workerItem) } else { - workManagerController.syncDataForWorker(Constants.DATA_NOW, Constants.INITIAL_SYNC) + syncBackgroundJobAction.launchDataSync(0) } } return observeWorkInfo() diff --git a/app/src/test/java/org/dhis2/data/services/SyncPresenterTest.kt b/app/src/test/java/org/dhis2/data/services/SyncPresenterTest.kt index de07880d1f8..32d7b2e1199 100644 --- a/app/src/test/java/org/dhis2/data/services/SyncPresenterTest.kt +++ b/app/src/test/java/org/dhis2/data/services/SyncPresenterTest.kt @@ -6,9 +6,7 @@ import org.dhis2.commons.prefs.PreferenceProvider import org.dhis2.data.service.SyncPresenterImpl import org.dhis2.data.service.SyncRepository import org.dhis2.data.service.SyncResult -import org.dhis2.data.service.SyncStatusController -import org.dhis2.data.service.workManager.WorkManagerController -import org.dhis2.utils.analytics.AnalyticsHelper +import org.dhis2.mobile.sync.domain.SyncStatusController import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.arch.call.D2Progress import org.hisp.dhis.android.core.arch.call.D2ProgressStatus @@ -20,6 +18,7 @@ import org.hisp.dhis.android.core.program.ProgramType import org.hisp.dhis.android.core.settings.LimitScope import org.hisp.dhis.android.core.settings.ProgramSetting import org.hisp.dhis.android.core.settings.ProgramSettings +import org.hisp.dhis.android.core.settings.SynchronizationSettings import org.hisp.dhis.android.core.trackedentity.TrackedEntityInstance import org.hisp.dhis.android.core.tracker.exporter.TrackerD2Progress import org.junit.Assert.assertTrue @@ -35,8 +34,6 @@ class SyncPresenterTest { private val d2: D2 = Mockito.mock(D2::class.java, Mockito.RETURNS_DEEP_STUBS) private val preferences: PreferenceProvider = mock() - private val workManagerController: WorkManagerController = mock() - private val analyticsHelper: AnalyticsHelper = mock() private val syncStatusController: SyncStatusController = mock() private val syncRepository: SyncRepository = mock() @@ -46,10 +43,8 @@ class SyncPresenterTest { SyncPresenterImpl( d2, preferences, - workManagerController, - analyticsHelper, - syncStatusController, syncRepository, + syncStatusController, ) } @@ -61,8 +56,14 @@ class SyncPresenterTest { 200, LimitScope.GLOBAL, ) + val mockedSyncSettings = + mock { + on { programSettings() } doReturn mockedProgramSettings + } - whenever(d2.settingModule().programSetting().blockingGet()) doReturn mockedProgramSettings + whenever( + d2.settingModule().synchronizationSettings().blockingGet(), + ) doReturn mockedSyncSettings val (eventLimit, limitByOU, limitByProgram) = presenter.getDownloadLimits() @@ -78,8 +79,14 @@ class SyncPresenterTest { LimitScope.PER_OU_AND_PROGRAM, ) - whenever(d2.settingModule().programSetting().blockingGet()) doReturn mockedProgramSettings + val mockedSyncSettings = + mock { + on { programSettings() } doReturn mockedProgramSettings + } + whenever( + d2.settingModule().synchronizationSettings().blockingGet(), + ) doReturn mockedSyncSettings val (eventLimit, limitByOU, limitByProgram) = presenter.getDownloadLimits() assertTrue(eventLimit == 200 && limitByOU && limitByProgram) @@ -94,8 +101,14 @@ class SyncPresenterTest { LimitScope.PER_PROGRAM, ) - whenever(d2.settingModule().programSetting().blockingGet()) doReturn mockedProgramSettings + val mockedSyncSettings = + mock { + on { programSettings() } doReturn mockedProgramSettings + } + whenever( + d2.settingModule().synchronizationSettings().blockingGet(), + ) doReturn mockedSyncSettings val (eventLimit, limitByOU, limitByProgram) = presenter.getDownloadLimits() assertTrue(eventLimit == 200 && !limitByOU && limitByProgram) @@ -110,8 +123,14 @@ class SyncPresenterTest { LimitScope.PER_ORG_UNIT, ) - whenever(d2.settingModule().programSetting().blockingGet()) doReturn mockedProgramSettings + val mockedSyncSettings = + mock { + on { programSettings() } doReturn mockedProgramSettings + } + whenever( + d2.settingModule().synchronizationSettings().blockingGet(), + ) doReturn mockedSyncSettings val (eventLimit, limitByOU, limitByProgram) = presenter.getDownloadLimits() assertTrue(eventLimit == 200 && limitByOU && !limitByProgram) diff --git a/app/src/test/java/org/dhis2/usescases/main/MainPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/main/MainPresenterTest.kt index af876ab2d4e..2a717b07015 100644 --- a/app/src/test/java/org/dhis2/usescases/main/MainPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/main/MainPresenterTest.kt @@ -25,10 +25,11 @@ import org.dhis2.commons.schedulers.SchedulerProvider import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.schedulers.TrampolineSchedulerProvider import org.dhis2.data.server.UserManager -import org.dhis2.data.service.SyncStatusController import org.dhis2.data.service.VersionRepository import org.dhis2.data.service.workManager.WorkManagerController import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.domain.SyncStatusController import org.dhis2.usescases.login.SyncIsPerformedInteractor import org.dhis2.usescases.main.domain.LogoutUser import org.dhis2.usescases.settings.DeleteUserData @@ -68,6 +69,7 @@ class MainPresenterTest { private val deleteUserData: DeleteUserData = mock() private val syncIsPerfomedInteractor: SyncIsPerformedInteractor = mock() private val syncStatusController: SyncStatusController = mock() + private val syncBackgroundJobAction: SyncBackgroundJobAction = mock() private val versionRepository: VersionRepository = mock() private val testingDispatcher = UnconfinedTestDispatcher() private val dispatcherProvider: DispatcherProvider = @@ -102,6 +104,7 @@ class MainPresenterTest { deleteUserData, syncIsPerfomedInteractor, syncStatusController, + syncBackgroundJobAction, versionRepository, dispatcherProvider, forceToNotSynced, diff --git a/app/src/test/java/org/dhis2/usescases/main/domain/LaunchInitialSyncTest.kt b/app/src/test/java/org/dhis2/usescases/main/domain/LaunchInitialSyncTest.kt index f217f744cf3..17d861dfa9a 100644 --- a/app/src/test/java/org/dhis2/usescases/main/domain/LaunchInitialSyncTest.kt +++ b/app/src/test/java/org/dhis2/usescases/main/domain/LaunchInitialSyncTest.kt @@ -4,6 +4,7 @@ import kotlinx.coroutines.test.runTest import org.dhis2.data.service.VersionRepository import org.dhis2.mobile.commons.domain.invoke import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.usescases.main.data.HomeRepository import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue @@ -18,6 +19,7 @@ import org.mockito.kotlin.whenever class LaunchInitialSyncTest { private val homeRepository: HomeRepository = mock() private val versionRepository: VersionRepository = mock() + private val syncBackgroundJobAction: SyncBackgroundJobAction = mock() private lateinit var launchInitialSync: LaunchInitialSync @Test @@ -28,6 +30,7 @@ class LaunchInitialSyncTest { skipSync = true, homeRepository = homeRepository, versionRepository = versionRepository, + syncBackgroundJobAction = syncBackgroundJobAction, ) val result = launchInitialSync() @@ -47,6 +50,7 @@ class LaunchInitialSyncTest { skipSync = false, homeRepository = homeRepository, versionRepository = versionRepository, + syncBackgroundJobAction = syncBackgroundJobAction, ) val result = launchInitialSync() @@ -65,6 +69,7 @@ class LaunchInitialSyncTest { skipSync = false, homeRepository = homeRepository, versionRepository = versionRepository, + syncBackgroundJobAction = syncBackgroundJobAction, ) val result = launchInitialSync() @@ -83,6 +88,7 @@ class LaunchInitialSyncTest { skipSync = false, homeRepository = homeRepository, versionRepository = versionRepository, + syncBackgroundJobAction = syncBackgroundJobAction, ) val result = launchInitialSync() @@ -106,6 +112,7 @@ class LaunchInitialSyncTest { skipSync = false, homeRepository = homeRepository, versionRepository = versionRepository, + syncBackgroundJobAction = syncBackgroundJobAction, ) val result = launchInitialSync() @@ -126,6 +133,7 @@ class LaunchInitialSyncTest { skipSync = false, homeRepository = homeRepository, versionRepository = versionRepository, + syncBackgroundJobAction = syncBackgroundJobAction, ) val result = launchInitialSync() diff --git a/app/src/test/java/org/dhis2/usescases/main/domain/LogoutUserTest.kt b/app/src/test/java/org/dhis2/usescases/main/domain/LogoutUserTest.kt index 775290b5914..7c3b8170f4f 100644 --- a/app/src/test/java/org/dhis2/usescases/main/domain/LogoutUserTest.kt +++ b/app/src/test/java/org/dhis2/usescases/main/domain/LogoutUserTest.kt @@ -2,10 +2,10 @@ package org.dhis2.usescases.main.domain import kotlinx.coroutines.test.runTest import org.dhis2.commons.filters.FilterManager -import org.dhis2.data.service.SyncStatusController -import org.dhis2.data.service.workManager.WorkManagerController import org.dhis2.mobile.commons.domain.invoke import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.domain.SyncStatusController import org.dhis2.usescases.main.HomeRepository import org.junit.Assert.assertTrue import org.junit.Assert.fail @@ -19,8 +19,8 @@ import org.mockito.kotlin.whenever class LogoutUserTest { private val repository: HomeRepository = mock() - private val workManagerController: WorkManagerController = mock() private val syncStatusController: SyncStatusController = mock() + private val syncBackgroundJobAction: SyncBackgroundJobAction = mock() private val filterManager: FilterManager = mock() private lateinit var logoutUser: LogoutUser @@ -30,7 +30,7 @@ class LogoutUserTest { logoutUser = LogoutUser( repository, - workManagerController, + syncBackgroundJobAction, syncStatusController, filterManager, ) @@ -42,7 +42,7 @@ class LogoutUserTest { whenever(repository.logOut()) doReturn Result.success(Unit) whenever(repository.accountsCount()) doReturn 1 val result = logoutUser() - verify(workManagerController).cancelAllWorkAndWait() + verify(syncBackgroundJobAction).cancelAll() verify(syncStatusController).restore() verify(filterManager).clearAllFilters() verify(repository).clearSessionLock() @@ -58,7 +58,7 @@ class LogoutUserTest { val testException = DomainError.UnexpectedError("test") whenever(repository.clearSessionLock()) doReturn Result.failure(testException) val result = logoutUser() - verify(workManagerController).cancelAllWorkAndWait() + verify(syncBackgroundJobAction).cancelAll() verify(syncStatusController).restore() verify(filterManager).clearAllFilters() verify(repository).clearSessionLock() @@ -81,7 +81,7 @@ class LogoutUserTest { assertTrue(e == testException) } - verify(workManagerController).cancelAllWorkAndWait() + verify(syncBackgroundJobAction).cancelAll() verify(syncStatusController).restore() verify(filterManager).clearAllFilters() verify(repository).clearSessionLock() diff --git a/app/src/test/java/org/dhis2/usescases/main/program/ProgramRepositoryImplTest.kt b/app/src/test/java/org/dhis2/usescases/main/program/ProgramRepositoryImplTest.kt index ec78a168082..00994f23b3f 100644 --- a/app/src/test/java/org/dhis2/usescases/main/program/ProgramRepositoryImplTest.kt +++ b/app/src/test/java/org/dhis2/usescases/main/program/ProgramRepositoryImplTest.kt @@ -12,8 +12,8 @@ import org.dhis2.commons.resources.MetadataIconProvider import org.dhis2.commons.resources.ResourceManager import org.dhis2.data.dhislogic.DhisProgramUtils import org.dhis2.data.schedulers.TrampolineSchedulerProvider -import org.dhis2.data.service.SyncStatusData import org.dhis2.mobile.commons.model.MetadataIconData +import org.dhis2.mobile.sync.model.SyncStatusData import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.common.Access import org.hisp.dhis.android.core.common.DataAccess diff --git a/app/src/test/java/org/dhis2/usescases/main/program/ProgramViewModelTest.kt b/app/src/test/java/org/dhis2/usescases/main/program/ProgramViewModelTest.kt index 0b3804dde34..5f8271dc73c 100644 --- a/app/src/test/java/org/dhis2/usescases/main/program/ProgramViewModelTest.kt +++ b/app/src/test/java/org/dhis2/usescases/main/program/ProgramViewModelTest.kt @@ -16,10 +16,10 @@ import org.dhis2.commons.filters.FilterManager import org.dhis2.commons.matomo.MatomoAnalyticsController import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.schedulers.TestSchedulerProvider -import org.dhis2.data.service.SyncStatusController -import org.dhis2.data.service.SyncStatusData import org.dhis2.mobile.commons.extensions.toColor import org.dhis2.mobile.commons.model.MetadataIconData +import org.dhis2.mobile.sync.domain.SyncStatusController +import org.dhis2.mobile.sync.model.SyncStatusData import org.dhis2.utils.MainCoroutineScopeRule import org.hisp.dhis.android.core.common.State import org.hisp.dhis.mobile.ui.designsystem.component.ImageCardData diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEPresenterTest.kt index 65283d5003a..449ecab97c9 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEPresenterTest.kt @@ -10,7 +10,7 @@ import org.dhis2.commons.prefs.PreferenceProvider import org.dhis2.commons.resources.ColorUtils import org.dhis2.commons.resources.ResourceManager import org.dhis2.data.schedulers.TestSchedulerProvider -import org.dhis2.data.service.SyncStatusController +import org.dhis2.mobile.sync.domain.SyncStatusController import org.dhis2.utils.analytics.AnalyticsHelper import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.common.ObjectWithUid diff --git a/app/src/test/java/org/dhis2/usescases/settings/domain/LaunchSyncTest.kt b/app/src/test/java/org/dhis2/usescases/settings/domain/LaunchSyncTest.kt index 3efadfffb87..1a8b4951a7d 100644 --- a/app/src/test/java/org/dhis2/usescases/settings/domain/LaunchSyncTest.kt +++ b/app/src/test/java/org/dhis2/usescases/settings/domain/LaunchSyncTest.kt @@ -1,10 +1,6 @@ package org.dhis2.usescases.settings.domain import androidx.arch.core.executor.testing.InstantTaskExecutorRule -import androidx.lifecycle.MutableLiveData -import androidx.work.ExistingPeriodicWorkPolicy -import androidx.work.ExistingWorkPolicy -import androidx.work.WorkInfo import app.cash.turbine.test import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -15,9 +11,6 @@ import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.setMain import org.dhis2.commons.Constants import org.dhis2.commons.prefs.PreferenceProvider -import org.dhis2.data.service.workManager.WorkManagerController -import org.dhis2.data.service.workManager.WorkerItem -import org.dhis2.data.service.workManager.WorkerType import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.mobile.sync.model.SyncJobStatus import org.dhis2.mobile.sync.model.SyncStatus @@ -43,23 +36,21 @@ class LaunchSyncTest { private val testingDispatcher = UnconfinedTestDispatcher() private lateinit var launchSync: LaunchSync - private val workManagerController: WorkManagerController = mock() private val preferenceProvider: PreferenceProvider = mock() private val analyticsHelper: AnalyticsHelper = mock() private val mockedMetadataWorkInfo = MutableStateFlow>(emptyList()) - private val mockedDataWorkInfo = MutableLiveData>() + private val mockedDataWorkInfo = MutableStateFlow>(emptyList()) private val syncBackgroundJobAction: SyncBackgroundJobAction = mock() @Before fun setUp() { Dispatchers.setMain(testingDispatcher) whenever(syncBackgroundJobAction.observeMetadataJob()) doReturn mockedMetadataWorkInfo - whenever(workManagerController.getWorkInfosByTagLiveData(Constants.DATA_NOW)) doReturn mockedDataWorkInfo + whenever(syncBackgroundJobAction.observeDataJob()) doReturn mockedDataWorkInfo launchSync = LaunchSync( syncBackgroundJobAction = syncBackgroundJobAction, - workManagerController = workManagerController, preferenceProvider = preferenceProvider, analyticsHelper = analyticsHelper, ) @@ -80,36 +71,17 @@ class LaunchSyncTest { @Test fun shouldStartSyncData() = runTest { - val expectedWorkerItem = - WorkerItem( - Constants.DATA_NOW, - WorkerType.DATA, - null, - null, - ExistingWorkPolicy.KEEP, - null, - ) launchSync(LaunchSync.SyncAction.SyncData) - verify(workManagerController, times(1)).syncDataForWorker(expectedWorkerItem) + verify(syncBackgroundJobAction, times(1)).launchDataSync(0) } @Test fun shouldUpdateSyncDataPeriod() = runTest { val newPeriod = 13 - val expectedWorkerItem = - WorkerItem( - Constants.DATA, - WorkerType.DATA, - newPeriod.toLong(), - null, - null, - ExistingPeriodicWorkPolicy.REPLACE, - ) launchSync(LaunchSync.SyncAction.UpdateSyncDataPeriod(newPeriod)) verify(preferenceProvider, times(1)).setValue(Constants.TIME_DATA, newPeriod) - verify(workManagerController, times(1)).cancelUniqueWork(Constants.DATA) - verify(workManagerController, times(1)).enqueuePeriodicWork(expectedWorkerItem) + verify(syncBackgroundJobAction, times(1)).launchDataSync(newPeriod.toLong()) } @Test @@ -126,7 +98,7 @@ class LaunchSyncTest { runTest { launchSync(LaunchSync.SyncAction.UpdateSyncDataPeriod(0)) verify(preferenceProvider, times(1)).setValue(Constants.TIME_DATA, 0) - verify(workManagerController, times(1)).cancelUniqueWork(Constants.DATA) + verify(syncBackgroundJobAction, times(1)).cancelDataSync() } @Test @@ -145,22 +117,23 @@ class LaunchSyncTest { on { status } doReturn SyncStatus.Running } val startedDataWorkInfo = - mock { - on { state } doReturn WorkInfo.State.RUNNING + mock { + on { status } doReturn SyncStatus.Running } val finishedMetadataWorkInfo = mock { on { status } doReturn SyncStatus.Succeed } val finishedDataWorkInfo = - mock { - on { state } doReturn WorkInfo.State.SUCCEEDED + mock { + on { status } doReturn SyncStatus.Succeed } launchSync.syncWorkInfo.test { + awaitItem() awaitItem() mockedMetadataWorkInfo.emit(listOf(startedMetadataWorkInfo)) assertState(awaitItem(), LaunchSync.SyncStatus.InProgress, LaunchSync.SyncStatus.None) - mockedDataWorkInfo.postValue(listOf(startedDataWorkInfo)) + mockedDataWorkInfo.emit(listOf(startedDataWorkInfo)) with(awaitItem()) { assertState( this, @@ -179,7 +152,7 @@ class LaunchSyncTest { ) assertTrue(this.hasSyncFinished(metadataWasRunning = true, dataWasRunning = true)) } - mockedDataWorkInfo.postValue(listOf(finishedDataWorkInfo)) + mockedDataWorkInfo.emit(listOf(finishedDataWorkInfo)) assertState(awaitItem(), LaunchSync.SyncStatus.Finished, LaunchSync.SyncStatus.Finished) cancelAndIgnoreRemainingEvents() } diff --git a/app/src/test/java/org/dhis2/utils/granularsync/GranularSyncPresenterTest.kt b/app/src/test/java/org/dhis2/utils/granularsync/GranularSyncPresenterTest.kt index e1fd0ebf854..ae77334adfb 100644 --- a/app/src/test/java/org/dhis2/utils/granularsync/GranularSyncPresenterTest.kt +++ b/app/src/test/java/org/dhis2/utils/granularsync/GranularSyncPresenterTest.kt @@ -14,7 +14,6 @@ import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.setMain -import org.dhis2.commons.Constants import org.dhis2.commons.sync.ConflictType import org.dhis2.commons.sync.SyncContext import org.dhis2.commons.viewmodel.DispatcherProvider @@ -512,7 +511,6 @@ class GranularSyncPresenterTest { val resultLiveData = presenter.initGranularSync() resultLiveData.observeForever(workInfoObserver) - verify(workManager).syncDataForWorker(Constants.DATA_NOW, Constants.INITIAL_SYNC) verify(workInfoObserver).onChanged(anyList()) } diff --git a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationManagerImpl.kt b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationManagerImpl.kt index aacb93b5319..483d1a4b107 100644 --- a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationManagerImpl.kt +++ b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationManagerImpl.kt @@ -34,9 +34,17 @@ class NotificationManagerImpl( contentTitle: String, contentText: String, progress: Int, - ): NotificationModel { - TODO("Not yet implemented") - } + ) = WorkerNotificationInfo( + createForegroundInfo( + notificationId = SYNC_DATA_NOTIFICATION_ID, + channelId = SYNC_DATA_CHANNEL_ID, + channelName = SYNC_DATA_CHANNEL_NAME, + smallIcon = smallIcon, + contentTitle = contentTitle, + contentText = contentText, + progress = progress, + ), + ) override fun displayDataSyncNotification( smallIcon: Int, @@ -44,7 +52,18 @@ class NotificationManagerImpl( contentText: String, progress: Int, ) { - TODO("Not yet implemented") + val foregroundInfo = + createForegroundInfo( + notificationId = SYNC_DATA_NOTIFICATION_ID, + channelId = SYNC_DATA_CHANNEL_ID, + channelName = SYNC_DATA_CHANNEL_NAME, + smallIcon = smallIcon, + contentTitle = contentTitle, + contentText = contentText, + progress = progress, + ) + + notify(foregroundInfo) } override fun getMetadataSyncNotification( @@ -126,6 +145,10 @@ class NotificationManagerImpl( notificationManager.cancel(SYNC_SETTINGS_NOTIFICATION_ID) } + override fun cancelDataSyncNotification() { + notificationManager.cancel(SYNC_DATA_NOTIFICATION_ID) + } + private fun createForegroundInfo( notificationId: Int, channelId: String, diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationManager.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationManager.kt index 178ecef144d..7d6c4951ab7 100644 --- a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationManager.kt +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationManager.kt @@ -44,4 +44,6 @@ interface NotificationManager { fun cancelMetadataSyncNotification() fun cancelSyncSettingsNotification() + + fun cancelDataSyncNotification() } diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/providers/PreferenceConstants.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/providers/PreferenceConstants.kt index 297a5a768c9..4b3694afcb3 100644 --- a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/providers/PreferenceConstants.kt +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/providers/PreferenceConstants.kt @@ -10,4 +10,13 @@ const val TIME_META = "timeMeta" const val LAST_META_SYNC_STATUS = "last_meta_sync_status" const val LAST_DATA_SYNC = "last_data_sync" const val TIME_DATA = "timeData" +const val LAST_DATA_SYNC_STATUS = "last_data_sync_status" +const val SYNC_RESULT = "sync_result" const val BIOMETRIC_CREDENTIALS = "biometric_credentials" +const val EVENT_MAX = "EVENT_MAX" +const val EVENT_MAX_DEFAULT = 1000 +const val TEI_MAX = "TEI_MAX" +const val TEI_MAX_DEFAULT = 500 +const val LIMIT_BY_ORG_UNIT = "LIMIT_BY_ORG_UNIT" +const val LIMIT_BY_PROGRAM = "LIMIT_BY_PROGRAM" +const val MAX_RESERVED_VALUES = 100 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c83770c603a..0ca11cf5b17 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -212,6 +212,7 @@ koin-android = { group = "io.insert-koin", name = "koin-android", version.ref = koin-androidx-compose = { module = "io.insert-koin:koin-androidx-compose", version.ref = "koin" } koin-compose = { module = "io.insert-koin:koin-compose", version.ref = "koin" } koin-composeVM = { module = "io.insert-koin:koin-compose-viewmodel", version.ref = "koin" } +koin-work = { module = "io.insert-koin:koin-androidx-workmanager", version.ref = "koin" } koin-test = { module = "io.insert-koin:koin-test", version.ref = "koin" } koin-test-junit5 = { module = "io.insert-koin:koin-test-junit5", version.ref = "koin" } koin-test-junit4 = { module = "io.insert-koin:koin-test-junit4", version.ref = "koin" } diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index a55c258636b..38fbff1307e 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -6270,6 +6270,22 @@ + + + + + + + + + + + + + @@ -10636,6 +10652,16 @@ + + + + + + + + @@ -14321,6 +14347,13 @@ + + + + + diff --git a/sync/build.gradle.kts b/sync/build.gradle.kts index 75f8fc6f4e2..ee7b03718fb 100644 --- a/sync/build.gradle.kts +++ b/sync/build.gradle.kts @@ -65,6 +65,7 @@ kotlin { implementation(libs.androidx.work) compileOnly(libs.androidx.compose.preview) compileOnly(libs.androidx.compose.uitooling) + api(libs.koin.work) } getByName("androidHostTest") { diff --git a/sync/src/androidMain/AndroidManifest.xml b/sync/src/androidMain/AndroidManifest.xml index a5918e68abc..628b10ec008 100644 --- a/sync/src/androidMain/AndroidManifest.xml +++ b/sync/src/androidMain/AndroidManifest.xml @@ -1,4 +1,17 @@ - + + + + + + \ No newline at end of file diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncBackgroundJobAction.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncBackgroundJobAction.kt index cd2c78a81b2..eb2c8ae402f 100644 --- a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncBackgroundJobAction.kt +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncBackgroundJobAction.kt @@ -60,7 +60,39 @@ class AndroidSyncBackgroundJobAction( } override fun launchDataSync(syncingPeriod: Long) { - // implement later + if (syncingPeriod == 0L) { + val request = + OneTimeWorkRequest + .Builder( + workerClass = SyncDataWorker::class.java, + ).addTag( + DATA_SYNC_NOW, + ).build() + workManager.enqueueUniqueWork( + uniqueWorkName = DATA_SYNC_NOW, + existingWorkPolicy = ExistingWorkPolicy.KEEP, + request = request, + ) + } else { + val request = + PeriodicWorkRequest + .Builder( + workerClass = SyncDataWorker::class.java, + repeatInterval = syncingPeriod, + repeatIntervalTimeUnit = TimeUnit.SECONDS, + ).addTag( + DATA_SYNC, + ).setInitialDelay( + syncingPeriod, + TimeUnit.SECONDS, + ).build() + + workManager.enqueueUniquePeriodicWork( + uniqueWorkName = DATA_SYNC, + existingPeriodicWorkPolicy = ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE, + request = request, + ) + } } override fun launchSyncSettings() { @@ -107,6 +139,31 @@ class AndroidSyncBackgroundJobAction( } } + override fun observeDataJob() = + workManager + .getWorkInfosFlow( + WorkQuery.fromUniqueWorkNames( + DATA_SYNC, + DATA_SYNC_NOW, + ), + ).map { workInfos -> + workInfos.map { workInfo -> + SyncJobStatus( + tags = workInfo.tags.toList(), + status = + when (workInfo.state) { + WorkInfo.State.ENQUEUED -> SyncStatus.Enqueue + WorkInfo.State.RUNNING -> SyncStatus.Running + WorkInfo.State.SUCCEEDED -> SyncStatus.Succeed + WorkInfo.State.FAILED -> SyncStatus.Failed + WorkInfo.State.BLOCKED -> SyncStatus.Blocked + WorkInfo.State.CANCELLED -> SyncStatus.Cancelled + }, + message = null, + ) + } + } + override suspend fun cancelSyncSettings() { workManager.cancelUniqueWork(SYNC_SETTINGS).await() } @@ -118,4 +175,9 @@ class AndroidSyncBackgroundJobAction( override suspend fun cancelDataSync() { workManager.cancelUniqueWork(DATA_SYNC).await() } + + override suspend fun cancelAll() { + val operation = workManager.cancelAllWork() + operation.await() + } } diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt index 9d95846eec5..dc77ae328f5 100644 --- a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt @@ -1,5 +1,6 @@ package org.dhis2.mobile.sync.data +import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext import kotlinx.datetime.TimeZone import kotlinx.datetime.format @@ -7,14 +8,31 @@ import kotlinx.datetime.toLocalDateTime import org.dhis2.mobile.commons.coroutine.Dispatcher import org.dhis2.mobile.commons.dates.dateTimeFormat import org.dhis2.mobile.commons.error.DomainErrorMapper +import org.dhis2.mobile.commons.providers.EVENT_MAX +import org.dhis2.mobile.commons.providers.EVENT_MAX_DEFAULT +import org.dhis2.mobile.commons.providers.LAST_DATA_SYNC +import org.dhis2.mobile.commons.providers.LAST_DATA_SYNC_STATUS import org.dhis2.mobile.commons.providers.LAST_META_SYNC import org.dhis2.mobile.commons.providers.LAST_META_SYNC_STATUS +import org.dhis2.mobile.commons.providers.LIMIT_BY_ORG_UNIT +import org.dhis2.mobile.commons.providers.LIMIT_BY_PROGRAM +import org.dhis2.mobile.commons.providers.MAX_RESERVED_VALUES import org.dhis2.mobile.commons.providers.PreferenceProvider +import org.dhis2.mobile.commons.providers.SYNC_RESULT +import org.dhis2.mobile.commons.providers.TEI_MAX +import org.dhis2.mobile.commons.providers.TEI_MAX_DEFAULT import org.dhis2.mobile.commons.reporting.AnalyticActions +import org.dhis2.mobile.sync.model.DataSyncProgressStatus +import org.dhis2.mobile.sync.model.SyncResult import org.dhis2.mobile.sync.model.toSyncPeriod import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.arch.call.D2ProgressStatus +import org.hisp.dhis.android.core.arch.call.D2ProgressSyncStatus +import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.fileresource.FileResourceDomainType import org.hisp.dhis.android.core.maintenance.D2Error +import org.hisp.dhis.android.core.program.ProgramType +import org.hisp.dhis.android.core.settings.LimitScope import kotlin.math.ceil import kotlin.time.Clock import kotlin.time.ExperimentalTime @@ -35,6 +53,13 @@ class AndroidSyncRepository( } } + private suspend fun run(block: suspend () -> Result): Result = + try { + block() + } catch (d2Error: D2Error) { + Result.failure(domainErrorMapper.mapToDomainError(d2Error)) + } + override suspend fun currentMetadataSyncPeriod() = withContext(dispatcher.io) { d2 @@ -86,6 +111,130 @@ class AndroidSyncRepository( preferences.setValue(LAST_META_SYNC_STATUS, isSuccess) } + @OptIn(ExperimentalTime::class) + override suspend fun saveDataSyncState(isSuccess: Boolean) = + run { + preferences.setValue( + LAST_DATA_SYNC, + Clock.System + .now() + .toLocalDateTime(TimeZone.currentSystemDefault()) + .format(dateTimeFormat), + ) + val syncResult = syncResult() + preferences.setValue( + LAST_DATA_SYNC_STATUS, + isSuccess && syncResult == SyncResult.Sync, + ) + preferences.setValue( + SYNC_RESULT, + syncResult.name, + ) + Result.success(Unit) + } + + override suspend fun getAllProgramsInitialStatus() = + run { + val programMap = + d2 + .programModule() + .programs() + .blockingGetUids() + .associateWith { + DataSyncProgressStatus.None + } + val aggregateMap = + d2.dataSetModule().dataSets().blockingGetUids().associateWith { + DataSyncProgressStatus.None + } + + Result.success(programMap + aggregateMap) + } + + override suspend fun getAllEventPrograms() = + run { + val uids = + d2 + .programModule() + .programs() + .byProgramType() + .eq(ProgramType.WITHOUT_REGISTRATION) + .blockingGetUids() + Result.success(uids) + } + + override suspend fun getAllTrackerPrograms() = + run { + val uids = + d2 + .programModule() + .programs() + .byProgramType() + .eq(ProgramType.WITH_REGISTRATION) + .blockingGetUids() + Result.success(uids) + } + + override suspend fun getAllDataSets() = + run { + val uids = + d2 + .dataSetModule() + .dataSets() + .blockingGetUids() + Result.success(uids) + } + + private suspend fun syncResult(): SyncResult { + val eventsOk = + d2 + .eventModule() + .events() + .byAggregatedSyncState() + .notIn(State.SYNCED) + .blockingGet() + .isEmpty() + val teiOk = + d2 + .trackedEntityModule() + .trackedEntityInstances() + .byAggregatedSyncState() + .notIn( + State.SYNCED, + State.RELATIONSHIP, + ).blockingGet() + .isEmpty() + + if (eventsOk && teiOk) { + return SyncResult.Sync + } + + val anyEventsToPostOrToUpdate = + d2 + .eventModule() + .events() + .byAggregatedSyncState() + .`in`( + State.TO_POST, + State.TO_UPDATE, + ).blockingGet() + .isNotEmpty() + val anyTeiToPostOrToUpdate = + d2 + .trackedEntityModule() + .trackedEntityInstances() + .byAggregatedSyncState() + .`in`(State.TO_POST, State.TO_UPDATE) + .blockingGet() + .isNotEmpty() + + if (anyEventsToPostOrToUpdate || anyTeiToPostOrToUpdate) { + return SyncResult.Incomplete + } + + return SyncResult.Error + } + override suspend fun downloadMapMetadata(): Result = execute { d2 @@ -155,4 +304,210 @@ class AndroidSyncRepository( } Result.success(Unit) } + + override suspend fun uploadEvents(): Result = + run { + d2.eventModule().events().blockingUpload() + Result.success(Unit) + } + + override suspend fun uploadTEIs(): Result = + run { + d2.trackedEntityModule().trackedEntityInstances().blockingUpload() + Result.success(Unit) + } + + override suspend fun uploadDataValues(): Result = + run { + d2.dataValueModule().dataValues().blockingUpload() + d2.dataSetModule().dataSetCompleteRegistrations().blockingUpload() + Result.success(Unit) + } + + override suspend fun downloadEvents( + onProgressUpdate: suspend (progressData: Map) -> Unit, + ): Result = + run { + val eventProgramUids = + d2 + .programModule() + .programs() + .byProgramType() + .eq(ProgramType.WITHOUT_REGISTRATION) + .blockingGetUids() + + val globalSettings = + d2 + .settingModule() + .synchronizationSettings() + .blockingGet() + ?.programSettings() + ?.globalSettings() + + val eventLimit = + globalSettings?.eventsDownload() ?: preferences.getInt( + EVENT_MAX, + EVENT_MAX_DEFAULT, + ) + + val limitByOrgUnit = + globalSettings?.settingDownload()?.let { + it == LimitScope.PER_ORG_UNIT || it == LimitScope.PER_OU_AND_PROGRAM + } ?: preferences.getBoolean( + LIMIT_BY_ORG_UNIT, + false, + ) + + val limitByProgram = + globalSettings?.settingDownload()?.let { + it == LimitScope.PER_PROGRAM || it == LimitScope.PER_OU_AND_PROGRAM + } ?: preferences.getBoolean( + LIMIT_BY_PROGRAM, + false, + ) + + d2 + .eventModule() + .eventDownloader() + .limit(eventLimit) + .limitByOrgunit(limitByOrgUnit) + .limitByProgram(limitByProgram) + .download() + .blockingForEach { progress -> + val progressData = + progress + .programs() + .filter { entry -> + eventProgramUids.contains(entry.key) + }.mapValues { (_, programProgress) -> + programProgress.toSycStatus() + } + runBlocking { + onProgressUpdate(progressData) + } + } + + Result.success(Unit) + } + + override suspend fun downloadTEIs(onProgressUpdate: suspend (progressData: Map) -> Unit): Result = + run { + val trackerProgramUids = + d2 + .programModule() + .programs() + .byProgramType() + .eq(ProgramType.WITH_REGISTRATION) + .blockingGetUids() + + val globalSettings = + d2 + .settingModule() + .synchronizationSettings() + .blockingGet() + ?.programSettings() + ?.globalSettings() + + val teiLimit = + globalSettings?.teiDownload() ?: preferences.getInt( + TEI_MAX, + TEI_MAX_DEFAULT, + ) + + val limitByOrgUnit = + globalSettings?.settingDownload()?.let { + it == LimitScope.PER_ORG_UNIT || it == LimitScope.PER_OU_AND_PROGRAM + } ?: preferences.getBoolean( + LIMIT_BY_ORG_UNIT, + false, + ) + + val limitByProgram = + globalSettings?.settingDownload()?.let { + it == LimitScope.PER_PROGRAM || it == LimitScope.PER_OU_AND_PROGRAM + } ?: preferences.getBoolean( + LIMIT_BY_PROGRAM, + false, + ) + + d2 + .trackedEntityModule() + .trackedEntityInstanceDownloader() + .limit(teiLimit) + .limitByOrgunit(limitByOrgUnit) + .limitByProgram(limitByProgram) + .download() + .blockingForEach { progress -> + val progressData = + progress + .programs() + .filter { entry -> + trackerProgramUids.contains(entry.key) + }.mapValues { (_, programProgress) -> + programProgress.toSycStatus() + } + runBlocking { + onProgressUpdate(progressData) + } + } + Result.success(Unit) + } + + override suspend fun downloadDataValues(onProgressUpdate: (progressData: Map) -> Unit): Result = + run { + d2 + .aggregatedModule() + .data() + .download() + .blockingForEach { progress -> + val progressData = + progress.dataSets().mapValues { (_, dataSetProgress) -> + dataSetProgress.toSycStatus() + } + onProgressUpdate(progressData) + } + Result.success(Unit) + } + + override suspend fun downloadDataFileResources(onProgressUpdate: (progress: Double?) -> Unit): Result = + run { + d2 + .fileResourceModule() + .fileResourceDownloader() + .byDomainType() + .eq(FileResourceDomainType.DATA_VALUE) + .download() + .blockingForEach { progress -> + onProgressUpdate(progress.percentage()) + } + Result.success(Unit) + } + + override suspend fun downloadReservedValues(onProgressUpdate: (progress: Double?) -> Unit): Result = + run { + val maxNumberOfValuesToFillUp = + d2 + .settingModule() + .generalSetting() + .blockingGet() + ?.reservedValues() ?: MAX_RESERVED_VALUES + + d2 + .trackedEntityModule() + .reservedValueManager() + .downloadAllReservedValues(maxNumberOfValuesToFillUp) + .blockingForEach { progress -> + onProgressUpdate(progress.percentage()) + } + Result.success(Unit) + } + + private fun D2ProgressStatus.toSycStatus() = + when { + isComplete.not() -> DataSyncProgressStatus.InProgress + syncStatus == D2ProgressSyncStatus.SUCCESS -> DataSyncProgressStatus.Success + syncStatus == D2ProgressSyncStatus.ERROR -> DataSyncProgressStatus.Failed + syncStatus == D2ProgressSyncStatus.PARTIAL_ERROR -> DataSyncProgressStatus.PartiallyFailed + else -> DataSyncProgressStatus.None + } } diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncDataWorker.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncDataWorker.kt new file mode 100644 index 00000000000..0d828dc9548 --- /dev/null +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncDataWorker.kt @@ -0,0 +1,77 @@ +package org.dhis2.mobile.sync.data + +import android.content.Context +import androidx.work.CoroutineWorker +import androidx.work.ForegroundInfo +import androidx.work.WorkerParameters +import org.dhis2.mobile.commons.notifications.NotificationManager +import org.dhis2.mobile.commons.notifications.WorkerNotificationInfo +import org.dhis2.mobile.sync.R +import org.dhis2.mobile.sync.domain.SyncData +import org.dhis2.mobile.sync.model.DataSyncTask +import org.dhis2.mobile.sync.resources.Res +import org.dhis2.mobile.sync.resources.app_name +import org.dhis2.mobile.sync.resources.syncing_data +import org.jetbrains.compose.resources.getString + +class SyncDataWorker( + context: Context, + workerParams: WorkerParameters, + private val syncData: SyncData, + private val notificationManager: NotificationManager, +) : CoroutineWorker(context, workerParams) { + override suspend fun doWork(): Result { + setForegroundAsync(getForegroundInfo()) + + val notificationTitle = getString(Res.string.app_name) + val notificationText = getString(Res.string.syncing_data) + + notificationManager.displayDataSyncNotification( + smallIcon = R.drawable.ic_sync, + contentTitle = notificationTitle, + contentText = notificationText, + 0, + ) + + val result = + syncData { progressData -> + notificationManager.displayDataSyncNotification( + smallIcon = R.drawable.ic_sync, + contentTitle = notificationTitle, + contentText = + when (progressData.dataSyncTask) { + DataSyncTask.DownloadDataValue -> "Downloading data values" + DataSyncTask.DownloadEvent -> "Downloading events" + DataSyncTask.DownloadFileResource -> "Downloading file resources" + DataSyncTask.DownloadTEI -> "Downloading TEIs" + DataSyncTask.SyncReservedValues -> "Downloading reserved values" + DataSyncTask.UploadDataValue -> "Uploading data values" + DataSyncTask.UploadEvent -> "Uploading events" + DataSyncTask.UploadTEI -> "Uploading TEIs" + }, + progress = progressData.progress?.toInt() ?: -1, + ) + } + notificationManager.cancelDataSyncNotification() + return when { + result.isSuccess -> Result.success() + else -> Result.failure() + } + } + + override suspend fun getForegroundInfo(): ForegroundInfo { + val notificationModel = + notificationManager.getDataSyncNotification( + smallIcon = R.drawable.ic_sync, + contentTitle = getString(Res.string.app_name), + contentText = getString(Res.string.syncing_data), + progress = -1, + ) + val notificationInfo = + notificationModel as? WorkerNotificationInfo + ?: throw IllegalStateException( + "Expected WorkerNotificationInfo but got ${notificationModel::class.qualifiedName}", + ) + return notificationInfo.foregroundInfo + } +} diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncMetadataWorker.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncMetadataWorker.kt index 5ff78101410..07edcda20ae 100644 --- a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncMetadataWorker.kt +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncMetadataWorker.kt @@ -13,19 +13,15 @@ import org.dhis2.mobile.sync.resources.Res import org.dhis2.mobile.sync.resources.app_name import org.dhis2.mobile.sync.resources.syncing_configuration import org.jetbrains.compose.resources.getString -import org.koin.core.component.KoinComponent -import org.koin.core.component.inject const val METADATA_MESSAGE = "METADATA_MESSAGE" class SyncMetadataWorker( context: Context, workerParams: WorkerParameters, -) : CoroutineWorker(context, workerParams), - KoinComponent { - private val syncMetadata: SyncMetadata by inject() - private val notificationManager: NotificationManager by inject() - + private val syncMetadata: SyncMetadata, + private val notificationManager: NotificationManager, +) : CoroutineWorker(context, workerParams) { override suspend fun doWork(): Result { setForegroundAsync(getForegroundInfo()) diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncSettingsWorker.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncSettingsWorker.kt index bb0b9c33c93..4f4a897fcea 100644 --- a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncSettingsWorker.kt +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncSettingsWorker.kt @@ -13,17 +13,13 @@ import org.dhis2.mobile.sync.resources.Res import org.dhis2.mobile.sync.resources.app_name import org.dhis2.mobile.sync.resources.syncing_settings import org.jetbrains.compose.resources.getString -import org.koin.core.component.KoinComponent -import org.koin.core.component.inject class SyncSettingsWorker( - private val context: Context, + context: Context, workerParams: WorkerParameters, -) : CoroutineWorker(context, workerParams), - KoinComponent { - private val syncSettings: SyncSettings by inject() - private val notificationManager: NotificationManager by inject() - + private val syncSettings: SyncSettings, + private val notificationManager: NotificationManager, +) : CoroutineWorker(context, workerParams) { override suspend fun doWork(): Result { setForegroundAsync(getForegroundInfo()) notificationManager.displaySyncSettingsNotification( diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.android.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.android.kt index fedff786cb3..d35a2be4aec 100644 --- a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.android.kt +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.android.kt @@ -4,14 +4,24 @@ import androidx.work.WorkManager import org.dhis2.mobile.sync.data.AndroidSyncBackgroundJobAction import org.dhis2.mobile.sync.data.AndroidSyncRepository import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.data.SyncDataWorker +import org.dhis2.mobile.sync.data.SyncMetadataWorker import org.dhis2.mobile.sync.data.SyncRepository +import org.dhis2.mobile.sync.data.SyncSettingsWorker +import org.dhis2.mobile.sync.domain.SyncData import org.dhis2.mobile.sync.domain.SyncMetadata import org.dhis2.mobile.sync.domain.SyncSettings +import org.dhis2.mobile.sync.domain.SyncStatusController +import org.koin.androidx.workmanager.dsl.workerOf import org.koin.core.module.dsl.factoryOf +import org.koin.core.module.dsl.singleOf import org.koin.dsl.module actual val syncModule = module { + + singleOf(::SyncStatusController) + factory { WorkManager.getInstance(get()) } @@ -27,5 +37,11 @@ actual val syncModule = factoryOf(::SyncMetadata) + factoryOf(::SyncData) + factoryOf(::SyncSettings) + + workerOf(::SyncDataWorker) + workerOf(::SyncMetadataWorker) + workerOf(::SyncSettingsWorker) } diff --git a/sync/src/commonMain/composeResources/values/strings.xml b/sync/src/commonMain/composeResources/values/strings.xml index 7fee4c96904..3ec3434da4f 100644 --- a/sync/src/commonMain/composeResources/values/strings.xml +++ b/sync/src/commonMain/composeResources/values/strings.xml @@ -4,5 +4,6 @@ Dhis2 Checking web settings Syncing your configuration + Syncing your data diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncBackgroundJobAction.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncBackgroundJobAction.kt index a429afecf1e..74c15de185a 100644 --- a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncBackgroundJobAction.kt +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncBackgroundJobAction.kt @@ -12,9 +12,13 @@ interface SyncBackgroundJobAction { fun observeMetadataJob(): Flow> + fun observeDataJob(): Flow> + suspend fun cancelSyncSettings() suspend fun cancelMetadataSync() suspend fun cancelDataSync() + + suspend fun cancelAll() } diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt index 1f8f7db3bc9..a403d6044f7 100644 --- a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt @@ -1,5 +1,6 @@ package org.dhis2.mobile.sync.data +import org.dhis2.mobile.sync.model.DataSyncProgressStatus import org.dhis2.mobile.sync.model.SyncPeriod interface SyncRepository { @@ -20,4 +21,30 @@ interface SyncRepository { suspend fun downloadFileResources(): Result suspend fun saveMetadataSyncState(isSuccess: Boolean) + + suspend fun uploadEvents(): Result + + suspend fun downloadEvents(onProgressUpdate: suspend (progressData: Map) -> Unit): Result + + suspend fun uploadTEIs(): Result + + suspend fun downloadTEIs(onProgressUpdate: suspend (progressData: Map) -> Unit): Result + + suspend fun uploadDataValues(): Result + + suspend fun downloadDataValues(onProgressUpdate: (progressData: Map) -> Unit): Result + + suspend fun downloadDataFileResources(onProgressUpdate: (progress: Double?) -> Unit): Result + + suspend fun downloadReservedValues(onProgressUpdate: (progress: Double?) -> Unit): Result + + suspend fun saveDataSyncState(isSuccess: Boolean): Result + + suspend fun getAllProgramsInitialStatus(): Result> + + suspend fun getAllEventPrograms(): Result> + + suspend fun getAllTrackerPrograms(): Result> + + suspend fun getAllDataSets(): Result> } diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncData.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncData.kt index 31a78c2eb08..d01f2af3031 100644 --- a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncData.kt +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncData.kt @@ -1,17 +1,86 @@ package org.dhis2.mobile.sync.domain import org.dhis2.mobile.commons.domain.UseCase -import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.commons.error.DomainError import org.dhis2.mobile.sync.data.SyncRepository +import org.dhis2.mobile.sync.model.DataSyncProgress +import org.dhis2.mobile.sync.model.DataSyncTask class SyncData( private val repository: SyncRepository, - private val syncBackgroundJobAction: SyncBackgroundJobAction, -) : UseCase<(progress: Int) -> Unit, Unit> { - override suspend fun invoke(input: (progress: Int) -> Unit): Result = + private val syncStatusController: SyncStatusController, +) : UseCase<(progress: DataSyncProgress) -> Unit, Unit> { + override suspend fun invoke(input: (progress: DataSyncProgress) -> Unit): Result = try { - TODO("Not yet implemented") - } catch (e: Exception) { - Result.failure(e) + syncStatusController.initDownloadProcess( + repository.getAllProgramsInitialStatus().getOrNull() ?: emptyMap(), + ) + input(DataSyncProgress(DataSyncTask.UploadEvent, null)) + val uploadEventResult = repository.uploadEvents() + syncStatusController.startDownloadingEvents() + val downloadEventResult = + repository.downloadEvents { progressData -> + val done = progressData.count { (_, value) -> value.isComplete() } + val progress = 100.0 * done / progressData.size + input(DataSyncProgress(DataSyncTask.DownloadEvent, progress)) + syncStatusController.updateDownloadProcess(progressData) + } + syncStatusController.finishDownloadingEvents( + repository.getAllEventPrograms().getOrNull() ?: emptyList(), + ) + + input(DataSyncProgress(DataSyncTask.UploadTEI, null)) + val uploadTEIResult = repository.uploadTEIs() + syncStatusController.startDownloadingTracker() + val downloadTEIResult = + repository.downloadTEIs { progressData -> + val done = progressData.count { (_, value) -> value.isComplete() } + val progress = 100.0 * done / progressData.size + input(DataSyncProgress(DataSyncTask.DownloadTEI, progress)) + syncStatusController.updateDownloadProcess(progressData) + } + syncStatusController.finishDownloadingTracker( + repository.getAllTrackerPrograms().getOrNull() ?: emptyList(), + ) + + input(DataSyncProgress(DataSyncTask.UploadDataValue, null)) + val uploadDataValueResult = repository.uploadDataValues() + syncStatusController.startDownloadingDataSets() + val downloadDataValueResult = + repository.downloadDataValues { progressData -> + val done = progressData.count { (_, value) -> value.isComplete() } + val progress = 100.0 * done / progressData.size + input(DataSyncProgress(DataSyncTask.DownloadDataValue, progress)) + } + syncStatusController.finishDownloadingDataSets( + repository.getAllDataSets().getOrNull() ?: emptyList(), + ) + + syncStatusController.initDownloadMedia() + repository.downloadDataFileResources { progress -> + input(DataSyncProgress(DataSyncTask.DownloadFileResource, progress)) + } + + repository.downloadReservedValues { progress -> + input(DataSyncProgress(DataSyncTask.SyncReservedValues, progress)) + } + + val isSuccess = + uploadEventResult.isSuccess && + downloadEventResult.isSuccess && + uploadTEIResult.isSuccess && + downloadTEIResult.isSuccess && + uploadDataValueResult.isSuccess && + downloadDataValueResult.isSuccess + + repository.saveDataSyncState(isSuccess) + + syncStatusController.finishSync() + Result.success(Unit) + } catch (domainError: DomainError) { + if (domainError is DomainError.NetworkError) { + syncStatusController.onNetworkUnavailable() + } + Result.failure(domainError) } } diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncStatusController.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncStatusController.kt new file mode 100644 index 00000000000..7f8db975878 --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncStatusController.kt @@ -0,0 +1,154 @@ +package org.dhis2.mobile.sync.domain + +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import org.dhis2.mobile.sync.model.DataSyncProgressStatus +import org.dhis2.mobile.sync.model.SyncStatusData + +class SyncStatusController { + private var progressStatusMap: Map = emptyMap() + private val downloadStatus = MutableStateFlow(SyncStatusData(isInitialSync = true)) + + fun observeDownloadProcess() = downloadStatus.asStateFlow() + + suspend fun initDownloadProcess(programDownload: Map) { + progressStatusMap = programDownload + downloadStatus.emit( + SyncStatusData( + running = true, + downloadingEvents = false, + downloadingTracker = false, + downloadingDataSetValues = false, + false, + progressStatusMap, + ), + ) + } + + suspend fun updateDownloadProcess(programDownload: Map) { + progressStatusMap = + progressStatusMap.toMutableMap().also { + it.putAll(programDownload) + } + downloadStatus.emit( + downloadStatus.value.copy(programSyncStatusMap = progressStatusMap), + ) + } + + suspend fun finishSync() { + progressStatusMap = progressStatusMap.toMutableMap() + downloadStatus.emit( + downloadStatus.value.copy( + running = false, + programSyncStatusMap = progressStatusMap, + ), + ) + } + + suspend fun startDownloadingEvents() { + downloadStatus.emit( + downloadStatus.value.copy(running = true, downloadingEvents = true), + ) + } + + suspend fun finishDownloadingEvents(eventProgramUids: List) { + progressStatusMap = + progressStatusMap.toMutableMap().mapValues { entry -> + if (!eventProgramUids.contains(entry.key) || entry.value.isComplete()) { + entry.value + } else { + DataSyncProgressStatus.Failed + } + } + downloadStatus.emit( + downloadStatus.value.copy( + downloadingEvents = false, + programSyncStatusMap = progressStatusMap, + ), + ) + } + + suspend fun startDownloadingTracker() { + downloadStatus.emit( + downloadStatus.value.copy(downloadingTracker = true), + ) + } + + suspend fun finishDownloadingTracker(trackerProgramUids: List) { + progressStatusMap = + progressStatusMap.toMutableMap().mapValues { entry -> + if (!trackerProgramUids.contains(entry.key) || entry.value.isComplete()) { + entry.value + } else { + DataSyncProgressStatus.Failed + } + } + downloadStatus.emit( + downloadStatus.value.copy( + downloadingTracker = false, + programSyncStatusMap = progressStatusMap, + ), + ) + } + + suspend fun startDownloadingDataSets() { + downloadStatus.emit( + downloadStatus.value.copy(downloadingDataSetValues = true), + ) + } + + suspend fun finishDownloadingDataSets(dataSetUids: List) { + progressStatusMap = + progressStatusMap.toMutableMap().mapValues { entry -> + if (!dataSetUids.contains(entry.key) || entry.value.isComplete()) { + entry.value + } else { + DataSyncProgressStatus.Failed + } + } + downloadStatus.emit( + downloadStatus.value.copy( + downloadingDataSetValues = false, + programSyncStatusMap = progressStatusMap, + ), + ) + } + + suspend fun initDownloadMedia() { + downloadStatus.emit( + downloadStatus.value.copy(downloadingMedia = true), + ) + } + + suspend fun restore() { + downloadStatus.emit(SyncStatusData()) + } + + suspend fun onNetworkUnavailable() { + progressStatusMap = + progressStatusMap.toMutableMap().mapValues { entry -> + if (entry.value.isComplete()) { + entry.value + } else { + DataSyncProgressStatus.Failed + } + } + downloadStatus.emit( + SyncStatusData(true, programSyncStatusMap = progressStatusMap), + ) + } + + suspend fun updateSingleProgramToSuccess(programUid: String) { + progressStatusMap = + progressStatusMap.toMutableMap().mapValues { entry -> + if (programUid != entry.key) { + entry.value + } else { + DataSyncProgressStatus.Success + } + } + downloadStatus.emit( + SyncStatusData(false, programSyncStatusMap = progressStatusMap), + ) + } +} diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/DataSyncProgress.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/DataSyncProgress.kt new file mode 100644 index 00000000000..1f5f61fafe4 --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/DataSyncProgress.kt @@ -0,0 +1,6 @@ +package org.dhis2.mobile.sync.model + +data class DataSyncProgress( + val dataSyncTask: DataSyncTask, + val progress: Double?, +) diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/DataSyncProgressStatus.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/DataSyncProgressStatus.kt new file mode 100644 index 00000000000..d233e0e5b51 --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/DataSyncProgressStatus.kt @@ -0,0 +1,15 @@ +package org.dhis2.mobile.sync.model + +sealed interface DataSyncProgressStatus { + data object InProgress : DataSyncProgressStatus + + data object Success : DataSyncProgressStatus + + data object Failed : DataSyncProgressStatus + + data object PartiallyFailed : DataSyncProgressStatus + + data object None : DataSyncProgressStatus + + fun isComplete() = this == Success || this == Failed || this == PartiallyFailed +} diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/DataSyncTask.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/DataSyncTask.kt new file mode 100644 index 00000000000..c7b4729747f --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/DataSyncTask.kt @@ -0,0 +1,19 @@ +package org.dhis2.mobile.sync.model + +sealed interface DataSyncTask { + data object UploadEvent : DataSyncTask + + data object DownloadEvent : DataSyncTask + + data object UploadTEI : DataSyncTask + + data object DownloadTEI : DataSyncTask + + data object UploadDataValue : DataSyncTask + + data object DownloadDataValue : DataSyncTask + + data object DownloadFileResource : DataSyncTask + + data object SyncReservedValues : DataSyncTask +} diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncResult.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncResult.kt new file mode 100644 index 00000000000..1fc194ceec2 --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncResult.kt @@ -0,0 +1,11 @@ +package org.dhis2.mobile.sync.model + +sealed class SyncResult( + val name: String, +) { + data object Sync : SyncResult("SYNC") + + data object Incomplete : SyncResult("INCOMPLETE") + + data object Error : SyncResult("ERROR") +} diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncStatusData.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncStatusData.kt new file mode 100644 index 00000000000..bede24b66fb --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncStatusData.kt @@ -0,0 +1,33 @@ +package org.dhis2.mobile.sync.model + +data class SyncStatusData( + val running: Boolean? = null, + val downloadingEvents: Boolean = false, + val downloadingTracker: Boolean = false, + val downloadingDataSetValues: Boolean = false, + val downloadingMedia: Boolean = false, + val programSyncStatusMap: Map = emptyMap(), + val isInitialSync: Boolean = false, +) { + fun isProgramDownloading(uid: String): Boolean = programSyncStatusMap.isNotEmpty() && programSyncStatusMap[uid]?.isComplete() == false + + fun hasDownloadError(uid: String): Boolean = + programSyncStatusMap.isNotEmpty() && + ( + programSyncStatusMap[uid] is DataSyncProgressStatus.Failed || + programSyncStatusMap[uid] is DataSyncProgressStatus.PartiallyFailed + ) + + fun isProgramDownloaded(uid: String): Boolean = programSyncStatusMap[uid]?.isComplete() == true && running == true + + fun canDisplayMessage() = + when { + running == false or + downloadingEvents or + downloadingTracker or + downloadingDataSetValues or + downloadingMedia -> true + + else -> false + } +} From 5ea695eecff7baa81ac557720d3278f492c81f11 Mon Sep 17 00:00:00 2001 From: rohit Date: Wed, 11 Mar 2026 19:22:11 +0530 Subject: [PATCH 089/260] test: update testing DB to include search operators --- .../androidTest/assets/databases/dhis_test.db | Bin 10506240 -> 10883072 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/app/src/androidTest/assets/databases/dhis_test.db b/app/src/androidTest/assets/databases/dhis_test.db index 3e6c7f617d0e09beb7a55ca8f443c3643e189b42..401d0461abfe0eb72283da3c987662293c88d92d 100644 GIT binary patch literal 10883072 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�&MF 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

7W_=$fHJc1z$Xa=OYMian=4w@GjYixD zRcZw<=Vy(OMH~e*qDmF7)PYiIDx9I{r(|D^SFzMN!Dy*m|9 zO=084`D$7+ZX_<&Dm8_b5bM>{^6ql|s#-3CT~{j8CtK4;_97Xy+2(px7H1!PZnd>6 zDp6h2uTBjxv{x#GNmK<7?Zh2rWoTC!JJ5LzjB`t~Ia_44+${Xf=z=9jlE4_I6#Z=Qnk}qPrNN81sja}QGI+_9R-3)glz6owSQTP{AhJ(TA+z<$ znQYB+JxK+uCKFjJ+>}SPa_1C+n$A47pGv`ViR+>BR`h3W%E`$g0 z;enQL&?L7t1KuCTP;hnFP-B%9J^SzsT)vHbio)ENf%6bl~Pc_+a`9ovb~z>OEx0Rb5yeqPcEuOspA1m ztcS*eE!^hR#m0hgfF)z0$8!XmM=%Ig=Mi4Av0yHA%sRZ#c``cdVF8Sh?c%km6R<$; zmO~-Aw}fzSA$)ZySm2Rag-0Ahqjv@#QU*3A%Cr6NqjC&9e|G#EEo41 zC&q_xHKz0%JnpmcamCc3amCoEFjdTE-5F!n*;LlU!WAQ7*qqwgU50RorZkf?20926 zp^gK*WCOuePns-eG{^JktOo^@Mq=Tf+5ijWe|o02ko->*zT0FhjJQeQ{Wly95i<-d zT)@5))-G6afy~qqE-PhZVuZYZFxKy8JjAY4?8@}dSca@bh=kHMwE~nV?#Y7(vc5}- zdqQ}rQ=nW;6st68pUVm4V*|--Y=Rm0x>ZVD2}hv*G%&*FB#IwSzYS1CX7Dp>Sjh~Y zaK)#fh?O7b$sy13D`aD1$Q-!@Df-C@g{}f2u=o@RE-VN>oPNv(kZ?6911R88=R6@+ z?9Xb81Pgm(VfvhDKLvmbtBA<-BLEONTc2(4@_3dcTq!C5;_2aB0O#}jidoq$k-6Fu z;41bCqpcJc46kWc?r`G*DD`RKVbK0!ZW6V-AY5dyrMWyP_;FTg}KCCu_3Nb`zi3F7ddGEe|_Uc z&Gp~j{k3aKz+$GyZ|2KwjGSr3hcg~aAG&c=cWRG?s?qWwTv$jb*d7HW$IGjj`IvYdhWd34sp zVqs12+B61OFf^3{8P|b4+?t9h3O>>STLp+BEp7@g+WF4!GXB=(mT7l zX0O?Ju-7P3^wec&XN8?ZYjsR!C6d$23)2uA6(TH%f{Myehs#x0=g(fVQDJW(q)3!1 zsH{M1O;k{cBr2QJAiLiXu}qYHqoOcGVyjMu@=G=%Oce=)TU2id=h0aYjipI9z{Y|I zyP~uZm4yKkS9LO!Uox>UsSKqmllv-k*27|H()9xtj7gV>5TjtBa^!${JZsV=GB7bQ zt1QY?CS9U9^#&yG#n;4UdD6W&^#MK%bv_Z`M!`o#kB#_Mn-8UTY*d)NM&QqADQ8nz z4~xZV_eiD7%){^~Fr3k?Ri|Bq1H5Dd!BlQpbY~3S=h0aYilu4S3s^9wT_R$Tf`v+D z;qzieiN8E2%w99`Ffo@Q7QM$vj>+s3VuC^Y|7#a&X#f9Dul>`Vzq9?T zTfemVzg+#1E5CmEzrFM-ymLhqd7iR}S!cGyAxZ(b`G-&oCgkRS`5ewDsb~m-l+U#}vx>#3wqB|) zu(-k(XK4Qj()lNVix?Tesb+R&cRH^v$?lZ!d8^dc;&t5>$S)gGE@1IQWh~T}`MwSU zI`hoQ$SB<~CqPq0f5z+LmE9G-_}uDi#>C8~ny9epbJMTF1jo2@PB;)&Y70*~>Q=(2 z9@O8`2=kWvg5khmVk#|-(k@%Qtg|Vdft-4g1SY4>=_9~ofB*1se;-BDzP)>UA0Jo| zK93bl@VYgLO$;0TdQQ6HNj{Tu8&NzCgK%KRuJM;tPY~+`Nk)FX_>3ZAFPnLhUl4-8 zO|pj|h;sIe1(D8v3E#?!Ab9l>%+^J)eTLgPoi4bs%{Lo`e!hn;=oFi^T64JHZy}CW z$hIW5UN|sv%+-u6_6mirNSh7P3gr{nK|JgSfSt*7cxW==MxeQE!XecOx6ulAcoQ8E zd*vpMgAK6tviTn3b}4ZI7sGvs9B&X*aKUx5R0OkJw#-Z4CLPIKHI#Jaa&bafaIO0l z5LVgwV1Gf9x{+{UEeXq6@R%JRw{Sy&sOjJ^2-*jsT2gyA6J3aN7Kq$)U#~kbn%H_J z6JGGEm4pybdv`|fSNnuO;&eFu1d#anW5UVs$GGnkzP1%4RCx@jF^C-X&zv{UF<`C> z1oIP=zozs7LiFja=`o0|>~(M>kZfZKFW`#kc;Cms6MVD16FQ3DQvpDE&4z)!308$c zDeN3t>p`LvN&o}iv@!q;!pq%DF7Rw3cOYhi&_qFG%TO;U(PXbO&bkTG=3ZNMshHCj7dxQ|5dxOjAUk zAne77`0KLhf{Mxvowb~ycAvdw!oWV&RX>eck=E+_{~3EkhuDU_U3c?TbK{?F{(Com z{l?$E@e?jkj*xx^e0H?_B?l>;L`rpT7Q=um9ln@4EiS zt~ahfydK>AYu7)zesKMb>$|)E&+h-e`}cQ$e)m7y{n6d;+x_;<|8RG_Ti#9Wx;FpL zuCV*1-J81?uKkN^|MRt9y!MmV{?fG{xc2W{``WeYwc~5vYvyZruf25b%Fe&q`CoT_ zW#?yi{_4&*cfNb)kMA@$e{SdDPGIN5o%eQL+u7Ov-R;KsLwXI*+`deGy+C1I*#@2UkO|~jqnJw>@dF!36FKk`i z{69B;^K;tBJ}c%K0?!b5hQKofo+0oIfu}>@xr=)j#_3Vn7*2b0UFXKnqlAVzVBz)p za**q6{5L3p2o1dPGbn)wB)jpSqXZ)G>&8!@1R@IQ#^1bgac^VNYessxetOdN-oei& zqd_vrnIrw~N9cozn4hG|Ctx$&*r?(RA?MiCFOMDWNgO}B8>MkDcoOmrwD^O0jLnT7 zM;XS0q`o&Q$L!<$W&B);r-m+n!3^-lh zn}s00#f@!L#He>-9ogKGU@$4*3=MB7XBy;7{AA-#;e>fe>5UFfsPN@dEuT-!3?C(}OCd=n?=Ik@lc@bG+I^M9i<2ZPM0->TWi#Zd}n z7}WT&*O)Un>y-@;PN)P&X{#w5hNImIHBv) zIa9s3q1Mp+4V+L*c9Su^@wiprco`?mBZ+SOWt?ylHkN$xaHQ|id?!vgF8Ry_TR|+v zHGdWH1@WqRlaTI?nt=y6gQeXxcExbP6W+LqGw7{>aK8-K%t~ea%)15+yTfkFJ2>NUlKR|1Wsr~I-FnUG^Nv; zzkp=z7Bf{t$2a86wtbvI?1{EYFQU`)n%}_*1-_LIINX_HW#c<=LNe0G9&-i$zNC{TWFW>}!D(kZd-S&XnxPuc6<-R+cZfBi^jWA-P z)2`+m@)@jBj?5oD52esb%KF`y*jaNT*3*} zVAbV{MpKoejX#NsXs1u?@j^V^4_8O{IoUMvAyI#n6Aq>4wAI>@hID;u;ADSE|jigue z%P65)&m`h}M=%x28y}%Bn#JC6*I&vxtWiJCkQ-EVW@|;?%x@%dhLph-FPX+3&MV>! z$yB*uh~%1LQG>_8rV!BOgMp+kqu=-f%0YzY+xUi*U~ZilnxTx@xban-(661Cbh$~| zpV0gqPACREZEMWlJ4$H&BSf{4&u7dVrx5sIB>JoZ$B-J!SXAeH7i`5RrO+G&IEAlf>}o z0y_WS(LB;z`_-K*TVI6Oe~&L$FBLC-$Axcgd;rN$`*)g|)LA#h_HVv7pG zeVzWmj8*QesMYRsMi){E-O02%t-Z9DN+b>sQz~;(bH?U3|q1uTz$TfjvxFZfK&3;$g?_x!J7lO4l3j11c7$Is4oqnmSo@u>21UyJ5 z&)wHq4s`f{ii8I#t07RmPMzvXtdW^W7|$11fp&$Q1l*^eOshm&y1RMn-tBuB?pn(u z#zI!JJCT&yl3+1{a6O2H*F%2kz*$JAu#`Z9#ToB&`~jG>sU$CbzLend`kjxW&R8fB zwL4LJiqrI^=0qow;-#l2FYVpoxWhw^L#I@?c5id|l*&`DrW>B45lqY=9>)nfgJ1yi zc5s2Bb%;ecwdsLdj*e@&HOemjp*h=8g z?Zh#t=M1@Gzc_tyT7GG7HxM{H3s6O4ExHg6C(>DI+8_*1OpJI!vs z*&1tmVz;Ml_IvqeT|Do-RJX=`-W=y(fP`9ygE_riKUTNpP zUuq6#GViTh!o8@wRdA$8Tt1kVpkFKZANMzJX>LnSQpbL87}l}Tk~l{FTCi9wCKgN5 zX+1jZ?zY5y1-krdxfZ~J{$V@-N6ae8tChK0E~sdy+ZlZXyC`qmo0Nu&S)W=0aalkT zzfY#cm-gO5hkYM@h}zZ7Pj7#U+toPkXu5}M#f5RJTMoHgkGw&L3|^>+!pao1S#7@DL_UY0 zZB`@$3|QH~LoJ&Fm%du?o+^%@&4PE!9uZsk^C<;<3ioJ>A`YYsfr!dtw$>|ahs{nE8l5)V)8be)9e4#ZG=S8o zjStrULT)qRXegi!%q*kiwy=;|X-~}F%F!?t_LFrSnHFB%drJ@w5AWVRef{+H+nYB} zpTB)7#inrB6OQ9iJ2Xl(iEhLb{bbevS!rZ7z>o}`!*F1 zsNEi3&&<1Ru>%3Ca~)C4m$kj7HZOvsmKp?;Y<0x05-~^aE>hn)_`J%og+hL(H7NJi z8PD3>Sc*6W%|BP^Kz(O>z;pq%@PG8}KdjZ8a2M{PUI1=Uq?kTL$9=kjh)Vqvccyu$ zRJ5Sl+k4!8j5_Wq*qiR+t{Vvm1zouq%lWEArE)|CLMumocsXUELU}mnmX}p@ztS1O z?hsd~TokHK`KP0)Z8UpIP2-WQQq&f+`AQ8IbKoroIaY=^Z5?f+yuvGqG!e|n3DY|s9lA@B@= zX9zq);28qX5O{{bA3g*gK2BcW1GWwiH#avoHuv`GrDQ-zIEVg92o~;ebYPa1V{m|A z;12|(9OJotodxZabtYuAs<#|)W`4)v17mVvBbKkJtp%D*0k(+&T%G?MWR^OAw$5Bn?(yubiovPx@>EDiG-} zq@De-S>Miu1_45X2ao-80$b3N2{R!!0l0g?s$@f<;<0#hzIe-XLY426%ir39u>wYl zh$&zctl5$?$u3__fLh95ZKdES*V!h@fB5)l&OaK72&*P2e|7`|Iw3fFLfTTeIz;hr zfH!cl&Tu6m^mBD%IGpJOj;lFqx)w=fj@%C)dual(eB0fLOsYd~l}P~k17Z@m95$9q zNxm2J4k{D@4^6<=@%hV<6ThY9WD|h#gGt~LaokH0aMJ|xx={b96KW+rfb|R_be72@ z<-E?k*pC&6E)qws6ag1a;3R%*oMb$r$LFF6!1-UAaN;*^gn-!U&AHBy^75{O#|K``uD zt9(6i(ngez_Ww6DKc%^`cm1Q?FJCk4+}`>JoB!|TyI1dAxpVo>r57%~z45Q%^&i^5 z>EZNiaI%P;G@~>4S2k~I-jtj)yW-IfgsEDmVE86ym-aO1T4^kX&yF;=rE8_c z;wPQf2CRN<)DhRlqdvHn5{08#(EK44B~oId^GUcjxMDT{jGo=}<^wZ_?u)UKi9%PP ztCmI9#K~G_qRg}8Az*@dZ4-bAonK2gNN;Lxe~i`0#1f8CEGUqnfvLV=%ZzRiGN2HM zVvw9mWzQ4O6<7N9IA2TIgFJ-l6$x1(n(!E8MaR@mr`#muW9s>8lHf&xaBkKRsEowI zdGA$3R7oaE+t;d7T6%X54htpO?X_@c7%W>W83GQtF*pJ^klV|TKbGNe(`!zbeccFA|8Spr0P>^Lbvw9kgfk=vGb5iM&2|n1Uy}TeO19K! zqKO6FZ#?I{laPpsBUYMX`>DM2%pyl-{ z195tP+6D1aDJkg7`>5@vuz19lj$lL*FA34-vJh+w&hDaOR|-PBQYIBiRg#G!_rXub znKaoMLQ%Ih=#5$9-caySBIreiBWhr=2%LxBt!W3)i$o3&ywNul3H)!3Joh713GL_O(lI&*>*i`O_YIovXxj;hvrV>$Ed%12A^`A^gd}*fB7~ zMtezYw0u-SWd7e z6Wf1+wA38t1FPh}%Ziqw1)WnIG@U*Ilhf?938s5`{o$cr zuhHDzytOa8*C8|($aD|PyE$ZU?C~a*?Si(@Y#?*S#UubgQH@}~BH(fBz+ym~X;w0$ z07jB*s)8(67s<&3#$qxlWMd#=9)r~gs7 zr~kEU*LJ>h=hpVOw(VO#z2)2d2b8c^{@BE-961)Zyg?P>}l?3G~rBXI7#ZnNUA$ul81}rZ>d)ZSaT1^ zpp7=Nt&x&Rg}xr#&={@|TDX`ql5hs&UaNm}2dLh=r%<&=UH)1qZ!^Zz^Tv)=YxL84 zlrJ+W=d?ii=1qliIFs)gCncwCS6MS`~98;g5`?$hgU0A(~8KyAJPwP_thW5v42};3!~?N4@E#LRF zL=5}0Irtxt0Hq|{2{0m~P=gWd{|~^h8Yj=qcd?U0qfwX3`Ff2}^w{SNS6_vK@7~2y zLBV3VG~_y2uRT<^_d6YAm55!JQ4b5mfSwt2xJb22TFQY_MX*2>c!F5=6(IKd>k6^L zIGnP2$8oRMfUFmrjciT%7s|qlHl9aHR-6UC7k~u1m?Qxe5@YSIsa5s0z1Bj#f=yPn1u&tj)VfOvl3eBHTFGNuOk}6m zl6Y7x*H>QxQEuPH{T>>`aje1hEYXTiC`-M)EB^zmL$@*R>#>FuDoMv37?DpPP=iB@ z(_svCa94>xfK|f9{vhBBHMnMKP-xr&3i5~z6xx&C$YX4#ntVJ7R*;~5w1aoHPP0Zo ztw-+yLGSA?0zI^-m6}AZRJBDNI*TPm%n)c4oy|=1{!1mV#{t1W^(HVd?_*78B;sq7 z93f}b)y!AW^10P)bVcgniHS8{pwJzkoS3aS!`Rk~(wA=NCz>3bmqV9^dl@RVdC8v2 zTJw>NFWG9ho(FpJ3WP&np-qguFKHm_Xos4KB9e(_tez z9p+e6FA-E9UInVJz+E1xax0l&nL9a3nj>5cT^2_(@WNm5_9R2&*BsBo_!urOPrUsllWjV|~FX z8cqHpF20VPm=ZtNqeKv@Ujjm?VMs&FNh4zN*~PRqIK~%7VZ|a{N}!*B9BgQndEWpN zJh(?SstHDrJH31n=pi4Cl3APaxIlUjR1HfG&xhuy&8?uJJI#O_qr*rzm7~#yAhM>ydX@ z=!NH#t!@C>`63{fJDK=}QcD*+wrA1Rj-J+ruGLTvP%5#ihk+GVo)&a39+?`zZBQ6h zVMxV`V?FY_=qL{A?p8OdNBjRv*KcWVe8-LJ;MwmMnnIraJwxCb0?!b5hQKofo+0oI zfoBLjL*N+#&k%Tqz#kC=PB-6%EvUtUbtG^=n`upwCh)#zHQL#xzwA`lluDW*@I`d~ zq3t$tjy6Bes=WoApo1XL)&M7>#bV=*(#b#|qFBHx|E@=Ei%D(rC7>p&sDWB&(o8s_ z_TIQ=o2mTa3=`~I7arH6y~(8A+XLG3L-DaQ+;Z`a2%kHi6AKT>-|JDm%A|_+|1WC3 zS92qJ{a1E>fA{7!ar;-cZ*E05fA;EcUbSB7T>idG-*fR_Ui|pN_iy}98z#v3|Ht3y zn=jsxbab!4-|prfs3qWr4*bFSvgVaro0{i0^WsTr94e+uq7ja(3Svk4FJJ;nUv!-h z2d05jIOBo9&z!9wD}7K>!Yw}z><7%`m*nr3T_3c-m90cQj_hQ}SIEfXlLx2To4_Gb zdf$O|0wB&fgh$OC%%N{!DAqkm>tvV)bw9ZOLs5(7zkpLk;ScIdUWeSmm;`jYj8;p5 z0G!S!eb<Q3p&63#N$wn1-GN1KVU@s2!xGGB%yTFp zKYuRB@nXRv_y(?eU@U!(LB>U*U%(&m49aQHLIcR4gaeRSI!JIAC&+BmCCpi*(`6R* z&jE`_S$Fp?w1Z8}%SuayN6lTS9n_tP5?}T>dm|^f*s5u>g#u`SyVL^)60VUTr9J4g z^>Ah6K*0Lu1$?31ay<1Z{SdH%8$wkwGS{!&0Ipwt`S9@Nm+#&Mu4kr5;-P3?tjd6{CTdE^!UsU}RV8Ob@6@xkds;BOMu%;6&fQ^+wMI>0btdn~#mf|nm?BTl7Qt)pq99%gn}=Mg;beJl}x5hl3{ASjk~fj_2-Ww79q(flaU0XlHCE$-{9~TJl-viIg+T10$53K^@x?cTq|9*d_=3bP77SLx!e;1xa9V6?F8s z^b_h%bc)R7@it5bXm#-x{E;*2TfpU8n9F>n%_m|(i=la>Oa`&I)m|CEkOkJ|y?&Sc zE%B^O2yj5g84mP3gJ&49^c?x+D!)f3R>5frRO*2Q7D*=ktILz3X}?iCnf#$)MHoXu5`vqrcf`b1v=9OSAGwngRx zXm5~APd3u3Zv`4FWC@Ov*?c(;#_T#&^DBJuxrr;csCO?zeV{XOWG@eM87$-RN)#Wg z?%hTcdfO36c%UxQ)wmT-{k88@>)rM};^zW#9N5SlfL*y7a?CR1SZU06awt}qc}tgo z+YdjK+^ItAfqpA-3+oWgo4ECq`dqQytv3_qjc4sHHbDfpN+i({T=4AmNXDAK@BTSe$(&*GuB!tX^PN z&}hJY>|(uueRQMY3Y6;hDi{xI-x-5HL1_H*pTIj_Q-Et>IOjHC=i(NQam-XreIx(Z?Ua5fjeXZKrFJH4k$`t1^6A9Z}9IZ4BgpB#ve?ESTg9@X5qXl~f9*LQz$S9`6!^Udww+;(jJ+nYan^@pw$FUK$axr@Jc@y3PX z#`i`?GK(IY5m?PvU z6*@ww$q&GB?f@j~XuS^hPpLr}upurs$pViWf}XKtgJq^kV3)y8MGcJoMwaC5w`Kzk z-X_mBoO4Nz^R{p&?aP+ie7FhgP4EfaEQrKUU>|H;W?N)X?SSKH9U5pD{Xs{3Nc_Z% zGE0{k^?wN%ov)KMusoJV#Q8co%;$%Gceh#^HNs`M!=#mig%iIeq!+YM*g9>2RY2OT zQ!7O^-2-dQN77uTmPZ!nqrG$2qE^GmgM?uUy@^CvQegfl?9@>H} zvGC;~6Tb35ueqdMFYzJqbKLOs#(qaqJPIL>i8sVgdngf%fAU~@&bpQ z-@04-VSl3}l>IrUQh*i>OFf8nAa+(uTBs1vT^J8cdek96TyXmhn->UC55~k0-oa#8 zt<2SOkr152HddET&045Ng1G!+p+3>!8>r$7%GjGgm#Ulv^bQa|i+@h1`qY>upOE`)ZfenV$qkydGD1wd#_84<@MLeMvfbcR1;0$YkXon&Nuup zqvJNd@Gl4h+qKzZ1X?(+sxmckYNaUYnDGS)GQ0a<0Q6^la$|mqHt&-YM>)~AW;&yw z-Jg|D&SpP=QF7G^J7l;5X<#3m84R<}&iHXb;&zdc%G@J_B}iWC`x$dos?1#UCD6K)!&|fdi4mV| zKXL!W`~5-OS7{{!I(Iki4#!YHj7}v7j_9Zd31YaLga;M~*af;?3yw#|LZ14RdYErD zsbuQG;dEI+J@m-~wEy3^`kv`yJQ5x${@H|M9kIE429+ul_?we)jhafoBLj zL*N+#&k*<{kH9I%(@WRc@{!Z~xp(nt)7t$247Ij*#@3Ul$_*^)&%?FUmI9ULwr z=Mk{*nw>erT|F@T;tY#lFFs34l%-TynmF-kw2On)$=OS;&>&+-Cd)C0c$AtgxvC}d zH}Fgw{vfBV*jQ~@L0~qLU#{|7l0hw}yms8vooi>2^b`|fx|JQ)ok_7=$=5{sp9SQ> z&H|!f;-ji%DFmMWmVQF3TslSOQhXm2u4udPKK#8aot=Z#-PY!O`CU79*GHLL*J7F} zDZGwEqtfn+pt_&^keHq6CP3Y7IN-rQH8d1_n-#QsV1EV8#00mydHJ)s3i0fO3V48} za-f8$HRuQh-a$tW@OKZ%IOAsaLza^}m~Atds)}3BZ*=;RNTX=%bcbzlVkK!`W`2QHWj8?c=(cZ=^?E z2yx$w9A$JUCi5Ik>H&C%Y5^qx*y<@Ko_akxiI$S#B0OwGpu%{tbg)pLQV%rV3glE4 z>OqFS{vL>djFjJnKNL+@5#wDLq2I+DXz+U-Yvm@#mAEZ7hLC~vnTBEE5qQSR3}kr( ztqDZ~J}}{6p7fqWQf4fCyw;;EY&xCBtxIZNXP2OKsdqtMNp*AY9x3l!byI}E5@~eYyy8HYI z@g$iu-MI(wONZ(E`=oMjewc2r*22eyP{HWoW)97uE6mJpv6YL#vaEEMlnBx{l94r1 z`%A8!7N5(Nh(6*fixE9OfssCvpqrZC0UnXV04w~#mKFwE>D0~&UBZeDMsr7^&)~{N zeU6xX-YRJps3QgSH)PX+fR7N~7A8P!h(&i4Nh0-fKHoPplhY?D7Mq!({r^o(SaU;v z{X2JmdUxZRuw&f*Gh08rIlgMU62JVd%e$9C7r*1e|F-e-8#f@^xqqi0+}zpIJa_<( zLEU?rl0R1OW{={21LtbiYR%z(zoi{WzMH_03G&^f1vgYEo+W=@o2z9T;OJ0Q=KA z*uOa|`moKwjic!HKn2c(Bri)iMmCr$eS{{3d2&m38r-E)&&#aHft-6GA20X>g<<_8 z$??wKr>Jy%g$7RLKhwUel~Te*`msts*6GJ4{Ww66_dp)GbV*K>NY?Bd&q2*1H-(yy z!MNNf+A{t`D&}ywyb#gA15>?L^8C_8(R8!bLUY(S;}yt_-OhmrIPfpWo6#wNp5cE+ zsXsLED{h#?f)zwxYI?RCz##I~ta-Gj>BYl=YGpD>9G4s-L|ZMuR-%rNJ|V_ywpD@% z@nGZLM;BkT6S31=DHAXalOK3Of%#9ma-u&lpe3aw3yOb*f<&WB5(01D`xMiG81xTlJ-iM=plBQ#>z-!VbmXGBX4h?RP?pnRDTj>o z?`yN*X0HUXYzdREl`|?W4;)E>7c#KihqF5Y*#q)05rX4CTrqI(3GnQ_a$yVy`#}j)2&V;Zt&`5XBzJFL zQ(ACnPt){I+UD4x;;#yGCa?o%Hh)X6*5z>S9Qs^Ft2;0bRVo1EDR5kFh0G%t>DdP?7pG+4|?bZo7vG!^Toxn`$<+DcyXhB|94T8_V` z{o2>G+SR}LNDE*QSe-UDp+n)R;Z)euoE#hDzMwr?F7ya_vyy=)!U>jB187qy1~|S9a2V){Zwtt0{JnlXy3YP#;>UpZk0Qe%fIFsm0P2&z^z$`$` zfhSXNG}?H_`YDz1v-j?P@|CX)wGZCae&s8LckfaHzkU@44rD>4d9bJP7CMezq#kv5 z29msW(h!4@M92b{6~Ub%`0q8M%@8>hfGo&=uYhD(W>q5bnfATA2VWLoY58TEzpq_^ z3PDkmG^gG@&0sLf+Woy)y6wdqyqQBZnBrQUCR%R7lz~DeNw(o)Va03;$7qg&O2KZu zc%Awzf{FzveUdk}&$MWb0qa{WYJPj4GG5*dTVpXa&9JkeB}&w3wJ*&?-pf!uc$SCi zY1D(0WIdia4&|^|`5Kzm!Hlf{^E)6=sB~Mk>=->%z;z**R5igE1pK(Ik`WNV3JM)~ zFauo|IBx@^LxypPG>=lv644-+TvE#{W@}xMoK-)%1hU`_ix0y5_#1iWu#g@$@)V2m z#gO~hX1KOom5L~5LSpgg2u?Oju=P^Zy+3s!o5LCkhd;? zASm3%76$=$q5)?znG;94wmn*%MX#fBG#vjw%uwI|; zzP$6ToiA-?w*JQEZ(QwO`QFQa^U^=L^wGs{T=<;}0m$;~?{i1s)c+-D^8G$ECDWcJ z7LWV+aHN|rxIE2%S1dPc1#Mld=fLH;v^E4IPuTBCp1Q&CrVc8UGK{czOw&HeH@JbJ z3*EXnc&J3qTfrNzuxxuL4X<}#7V&soh>0*5{sa*D&&aX#OM4&=UZ=oCuU?3A82P46 z*K6bLHC&gfVh6Tx_Z@d)Eo^1+q$s^uDHHA}$S*6b@;MX;LI?Nc@h!0Bj-of*+51$c z`We}Qzw||UpwYa)rx}Grp>3Z;W4eqA2YI+flNW2SfG?e&0~o~XD7YdI+Yqp_LvGEn zy%&Q)JuoqC%P_(Sl3b;FA^aeG}Miw}D*?OqKnb*lcvb zxdxBff)z`x(AD;ucym84!iq(?HwTKA8njy6^KgAh3Zu2Yz_`mT7un<^vwS1Id(Xff zM4S=-3?zanGb48IlCospP-MxFvKSe%R6rKVF1(BSF8Gkef{jtz$u_#{e?iLvejqsh zfLD`++xrv~muSnRu{&$fg0W@$X%{Y-C`G z4;?}*+?DngbPm{aV08+VU8ulB(X3VSIdsn*2CZ(lkJX7EYAv7;0G$im4EYqohh%H8 zPk^|x(1Rfn((>g_6Er4exET-Y)kYU~_t0FVciDcgS*h3ipfsUB0&+Rn|8%M0K6+be zO+Kh*9a3|5`Y)&v#~Qdg0An6V)D7P9-l z@hS*~CkL3rTCGC7)sNUs5vhw&Kat^$1Luv#)`WWTi_Z&bC>MrsG{&l( zeB(55JOtFIAKZf8rJNXt?9OWNxSH;o+vg!|Sn<$Q&)fI>IZQ9|3@ypdEuuv z{E*=f#oy^|1AvY98&2q+4I7v0IfB*-51~+`cr3D~B4tyomM(z_6B=9z#(v@8_+4*V zK7Ln@=Vs*~3z@#OZiOYeGe#<~rfoes(lDKxV2C~)!uhB7WCC$xxU?@C7Mm@&g9tN4 z1DROnn*B~0IsQ=&aC}{i{h7}Br ztH%>0g@fH93hM+1@i-bWtO=!2|Lkm^;e&j39u&+(ERZUP=~s9ds1pgan7*~A5nbu= zpgt~%BRj>4f|zn{3+Lp*0x8hSF51GUt{KxZ_FkQ#oYI2i4b- zC4}m0$udHE%_?0ol~8|=Z6~Br0e!xx9e;d$zX_PDKVA+ z{z%JyuQc>7`}N%3g#CW@xl%1sR5`f##lv|OBdUv3EwB@z%A3~Nc;Nl8JqnE) zjS+H09CQ%a5K*|Xfw)p8KooYkaHSH~{>UgDO)y4m9YUM9DGgoj-l$KWYY`B8AGpUB z0kEMz7My`(`nb~*A^|X`kgacU&Ce7SaGHsC0-)%}duyyPTramI503i-r+_fbgApr_ z;tnoYdn)q40j5kcfHVo1BGSER?}p+Y@Qmt+Cfw9`e<~b+RCw%xL%>kzq#3M~a;1|X z!ROp+0;&a_VZZ>6^-Qbek=nRqL;~|Y9Dae*RZjh^WfqRm23vW=c))9qhGOu9ECzKSUH4rD zE}(xXS+od}qUj(BLZn3+qN$+61Q{Vq6ikc3(=sU@wgd!aQKm&Ic!fwy3iBrAFY~Ye zudJ#+`MV)iECA{-Ju!bo5l2m ztf^|WG450o{!t?_>zxZDLOB+B{x`+;K+YkY&(vx_ltxPtP?Sc6}zU zX^|kPiJ0`10?Ze9RniK4&qyRgwg7w{T6){>d0RC`FOKWY44maPR50B{b!f5xvdVfV zKpiV4ylM-sy@WZ4WJB>LN;1q)8PN&F<_etiweyZXX@4NydP#1;WTv@=z0LKPAUU~P za_#lQwWDOWU5r=i4PAk3;d_$a(HmzWC=OXvuoyDNO=vKppkN~}$aMH=QcP^tsIc~E z8pDl+32gHQKF{on+f8L8Y$XJyp$ptf!Rw<%1Bu9`Wx)|^eAuoz`qSV}n zpGM9CA|2E*i78dX%suy#A0@`o!@|SFI6^2mkPT0chNhOqnv;WZB#H1OYL z^DysKUL=ZrN&u?v+P!BGA$9xWZZobm&Ie9Y3vGBY`R2W7_X5Q%su=KqxOY#Z04+7M zLKh~?CH2_R#l+klc-5tB#QFTY^fq73Y&mDEn(Y4{S^J;Xu9dI;!a;K1x%ZLXuk2pl z`L8a2Zu>X3es61ivwrDYH@>v~m+POxOJ8R{!t*Xn170sW3Bq}e{OF_@A18uF6IoHv z0df4c0lSp>f0%yHRf^iFbl zzlN2f*&_LR$OVwm4j3>1N!V#eL^#F{hMkhQx()mp-AIo29bv^63 zG%RL@65@mKRZ*w6(#*55Ff1f-#WAq5n7(a?$i*Vs9DZ4kEma7+0)}+I!-@oe?U_R9 zwcO|p(w<1%_Fv>(sVZ8a!@~dv0y8cq=I)A4smbA|XEq7pKHo4cE^KexP&;~pqjR{H z&TGp#lg8jNsQD7lY!8YcjqXmo8W(zbseb71vc=)FlQx-0BL z|411?&YHhB_82C0*NU(t!-!j1Db~%c>V>{7*NW!Lkb8p6w~Z94Od;HEn8imW5thR3 zWPV$&_02cX=ja|CNri=MW#FraO|__&*16d2!kbDwsueh80s1Y+^XPnho_8QW8{b0@ zMLG@jBrD55=Rp={%R+$f((Cf(?*#kuu*a{~d7Y`Dg9|qL=qBvPSO|g<8Z(z?;^gfOTdmixlYqt*9 z{HAni60if_c!&d^m>(L*K$?FNl`mc~jXF`BJ0mwg+WKjHQyd!stAFuqjsIg%J>BUD zH*sX8(o1H{tyV5O6`7TA2CH6tRRy4Da{fc3QL42VPv2DI-rVn9D90El2sz$Ut$Zft^vE84YBWo7>Vs2r#IIJQ8QPrgQTW_f5U%>=dkx~=q)c05rv_k`PWQoOz zf28#paQ=)$>y@m9<$X$w)F43;;DSYX9f$@O`mV<#3p)2ncsvVVlk8;q&Bg7=vleuY z(TM0WfqeHsqgm4jbJ}5EexJITuo^JI8I11vV`aVdMLYF8Us}`=ISF7w_BbzKwX7q? z@;F;V^6riK))@-AYKDS7`&pu(7vZrfKM_ZOEG z1&0n&KeRlr?@~{h)mU=CLsvu@WGB1yMA8SVBF56W*ENyx_ohIO5>iKA;H1{mYdrmY zZ(cLDQ_#U!$<70Uv$IY#*H;>kV!rR${px)#cu}Rmj>INctG{61lM{w#N?p>ttQB^Q zN=lb=jnQdHW5_Qr3{&9=BUX-Ex1e&I!ta&V19J`BGY2I%#XW3?lG<)5({;HV)@C}b!Y)=t zFfwkb9A2wC7>apgs;CpOIYJ5#&wfKPHq~YVuMUqNxfYkYDX>R0-y(ZNgx-1$SITh$RPl~=#PGdexJ2c_z zTrVwZ5s76u;H;-7HqNcZb1G4xzfduu)%)&*{4yCe3ThvABjg0qE>N!ek+8wq&HHQV zFh@ZFXWSEVU;v{9&+*El2H^xF5b|c?&r#4IT)NEQ6h|<6*A3EHSdpDa5SixrApdPz z9`(DHLM$1zo+S@CtRx0R&j0381>i#s|` z?66o@AqtPHu1Q1($Si~)hc?f6F3Bu914+6qusalP>{f_JiJa~NexiR@qrFSLB~nrj zCcD|=e(SE0`lX2{n1Evt7Z2PD^T%5GF$K?9d9KllMT-Tneplg+dp58rfRra>&N&O6 zW~3iqt~ElwB167nR$mcygRFJrpTPr&wNZCl1Rhm#l#Ee3IK+kPe!ttPW$+D~ zk0|r2ne`S=EM87mWB17~qtWMWK3Aew)-(L>z4h?pvkoJqNKbi%_89WHUF+6P#>HXR z6p>gipbK)lOdL^55hj>mYe^0@DOpek^DU@)h+zO)AxC35#KXG!Ey+zSgHDmxO2963 zMx&upj-6+TQPZl7W*(HpL(lqS@P|?Y~w(!en3WbbDZWIO}xyJn;q6I-BXF zlPl9sH^VxRvG|lT81x3Cgm|X{@E^^oK$pvw@R9aK3jT)iOa>q>-o{CBdN(L;02Fi6 zZ#$=zWHBBy4aa)9^NsW;6QlDanXUL4_`&zc=-!Kaa@`H2?&MDEwKV~s!?u`fnDS_A zdf#H*MeIEbJtn&nXV)7{WTsFOYX&!g(FWi=pdn6Vd_Laj6ikpPYgr*F zYc%K$x*3%)2!$U6|9iVvWIf@E1X)k`+_zR^Lrve(Y5NuRq>NEG)6=Q7CdXYAlqU8g zNyAHBWu}>oFP*QNVh#0iXGt^fo#VaK?o1c&2ybG#A{~bGnK#$gT(+jgRxY~&;iWz! zf)5(ZtAKSBe30NZF69R(V-J$HrCB@}P6R3uz<`533I5Zu)Fjw|GZ@9&suY2qBwcF` zxHub)uZklN1&n5^=4)k-d(s{G!qZ|+S)&Y=;|C^$klB%@+LO6rPuA9&UP~h!at=M| z1o{|F&Y6Q6;vPips$L1Gp~)Ps6Z{Er7E)z#l9a$2(t|Hp`3ZiFm{XdanG4J%-pX2F za2hXIwD87dscvtR?jrtsdu?rK>o@zx^e~eSF?E}P90IV?Oak4^JTn71)SHtO4{`xG z5qa{+Ovm<^AaRqU2*5dHF3==%>1=>70F37>r@1Z3PZuV6J75bPYo}=w!1S}Cpk{Jf z2q_^<~`+vG8Uef09v|(-Ii~V&Xh(PTZ#b^y!X($ zyfBf=GG^0;fX_p{PTwj#^*O~;%i^mKlhF_a&wo7q%&I;pNkg1deAEs4Hhzw(rH0F?>;*vqve_7WI3Df z7Uf(xl1xW|wZy|mBVe7%=TJ`BZ8G1-{7ZU8lRZE$o3qJ~H|-pBY;l{HISTVNm8Gdx zo<1@TZKzXr*c~<(9U;qLf(my5EY0Xndo5cU9d*Zk1A~Bg&w590ycpU}+GyZ&#UFBp z6X9ObIizEC2@a5hb%ovS3}sK1mk|ibDOY$V3ACShE|&~udJjdh@G8b+J_{U1+AwlD zG~9A^+`Nq4NtVq6Cpd$}E^B+sJGan@B@}5_`?W}y!9@HT2-Cc++-8+gc@i>MVzKc6 z3S`rl3BUml@JSEsCdnzsREfb)oZMph%~}j?=j}Gy&AhEQX~$`UEujxuG@QxRTreGb z{jprQoTWKpiY!6H}LX^dnY{Vw7(MHxuTsBOM{7C%z3jEOJu!#Ny131qA;Wd^g%uh0(l z`zB8!lFqXHZl1-DoRV7Nr-QwHX8n$Hj&LzEP4y~TmfuTf@go&k?u!+vB9`mFC_JeGJ}Em^;(1Gi)Zx?lI6eBJ9PBu;Ob~&dSjqs zYWmCxU+XwL?;V=vN0j+hM{aA%H;nb;eadeMtWQfXZ&TnmAKi>y$>0Vy50&}JvzKA1 z_v2_JxlD}0Q7G`6uN8@i_PAxXcL!mcTt9=M`NCQJmPR-D;a(aJX1Cs`mq*)l>JH|L zfo8m5WcfXR7C(|G!L%RYXSl6d_7+G(ZO$*E8Dnax3`VXX%TIL{KjMa1;ioky&z8oy zBRJ_Qm9jcb%vbZU{GL0DA31Qp!q223-BzLfw6Z>Xg?y#zO?&h963g$|Gx$+Z<`sSh z8h%#bH?Q9~9B-DR{z$wzVE768XC#IZvaXA+G<@t0VitF^o3)QgO;}?Fo_{2&bLL7I zGfStv2vj@uIa9X?agH%AkfAkbO^^EiQ9iB=04W~eT`8jZv?MhVdTta1ePNBR6!&Uo zC$LytMMS)n0JoOnqGe;>qc(W^9%qArf^0s;;g_z|wY6e)+$G%r8y*S!jNDFSzHKp) zZnwD0U*cD?I=tCFaF(@Ymfw@g{OY}4tZZ-($F*7hk;D&IWdUEqpmf#QV%#^}F!a); zVl+2xGw_SeCzSb}*fb&gw0Uffcg6Z$IPM!6=1f87IMAsbGa!V`$Cde&3n^pLVsl0e zvHRrL>?W;6qdM5M9kKi#Q|4D{Hv^Gy&+N$0^m*a>l|0d2+}Ws`+8rj2ez0M{`Tu{p zcJMO?@%`W0*8u;&z4N7=o0ot5vUdBYwxe7BX7jr*{p9-3t|#yk`#;*9zn=dy@v@qn zZ$`RhS8tkY*rufjT5jp!2T;eA&I(Z%WUU!7`Rv8CH8_#y#^ZXor8T(Y`Jj(EaMJX! ztmlK?=Jr-Cz*-1dMAtH@=sD}!)pubk*kwPv8b*Ih>D5J}Um%r9Z9 z2CW5y&Tb@Y4KwKBZKZ&RWX4<^^h^9Qdgn>jg%#DGVbB(LRqNmU_1yIT8ObIjoKo9Q zNVVb0#J(3FamQd<@2LihgIU1YNWd-uVK755r1upowY{~EI2ux@aEnxtd&EN8X{iVXr%E zotdYJg;GSKiPC9Z?!r>ZOl&4sB4#K?oAE%{Y^`a!87m`3^G#NY`5F_B`Qin?GkqK* z`$LQl2`C0vK}|AYUWLj!`wGHXD?VxZRH2oAe(Z`kjSiVX+@_nd*+fOvG4WO>idcFZU& z_~WUO+S73(?_Dv=Ytao-$5|W+pC?Yc$&_`}oYuS~^#Zt}f<-58s}|P)Dcev^S|ku; zh$^0)r$|oD_vAPcla0tgN4~GT1hr|_fOib@NIO!XIw!3}(&z0NsYi$|%NJ}w2{=e< zJ=W?twfVxQLqs->%5%na;4+o`g~?<{9M@PO#AF1_lW@$dZ(FG6U~%SJ+7lN`!-A`q z(G(g*2G_A^Q0CV$lsgl1!Vqtdr8!E2<4ki%MBYp(uYgB`c>7438FdUf292?)SLRoa zO#7wdZdjj9F7gAg8C+>vHQ7oo)^BNr_gRh6jNXPz#9a)(wYBwMJjYOf@XG%OG(h72 z*VhtjSHI&Ry#LIVzjNjJ-5=dG?)=>4pSirXeZ2K^TglB|-t=6$v5{Q=d+Ua^pT(|T+#yr#%p|GFXzZ4%IN&63W&$*?1+dqd9nv+%Yl?Vu0vK*U3ew%yYR}yNW;6N|oB0GLtA@euYkoqR->`ZV_Z5fEx}C(r#r-xl zsn5-iF{v4T!tJ+b3=b{yIoE=;Q-@^`YmBX?`fP(QFPb9cp3=RX)Z{$;w0I^8xP{Ve zOI8vU?pi`*hrnx{me|A~1uB1A2p&rsIw9Rfbk^eIB+*Oe4UTTio)a~MT`3E!NAKuS znv%q{mu^wK(+G*?*q3Jes!3}wJ3xcID6K)4p6+Bkw@eckWJ*pRhX zs&*T6e_p6&%S~Lf&|BJcGTn&*6Z{|;3!7=F#c6}fyP`}s98w~`o2{&sOKJVT7` zwBm_%e7bt1!-&yLvQo@*cprW-5JZIY^f>f*z|BFbNAMx^#5%{L!! z3D=}%v7AghxFTrg4AD?9Y~)1)KuxD$;V)Uhj#06dcKGd;dYQo@oP=3^^VotnShu9q znyEiZ`Y??xknNxZO=wnvz~#Dt7~ea?x*1|w&#O9!gzLR}^vDt-Mh*4*%&H1sKe4Td zg>dTB!c>*PKb!l==YPx!^=$X}4v?FBnK<-4kxEF@8K#v7d^z}X&vl6%=#baZ^5s~$;43BuqCY@ir zJn)$v7K73Fbt2_GwO?ugAuw+M^0{b8XgWT(YnqoG9}Dn}7j6Jzyurd@u@K*zW+w*I z$w^@{(isX2Vk1wp?-%=fZ~0`Ey~C&spRJ>$w>9-PGv-+cUh1=Y5u}i2VknJJp3IWD zD0`1iQP{j=OBaf-)>!V8opH)q_F7BF)(V5=__Y$_UhPOy;l0aq6_U@rhEG#SC3_

>Gf+O8`=Nw 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

_~7u>+7&?y!Qyk`34I8n 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

ll5mkUvk&a1OnurVPEO4+dkXjn z-AR0LCF9(dpDpguF&h9FiW{fg;VjBvoi5u)pu2+^O;mAr27zfaeI#xpzMxA_-tx^1 z2F2je*FZB&!&i^+Uo*6XbNCk*h_KGQ@)slcyhlR54POu;|IrQ z$7lJL>a@6>OxELX7+przdrc?=>a+`LGT;W2%D{(vX~f&f+7$?0#yZHNQo!;>+xf@*qklx zHvg=a!J070-1vLRpvNzQn!aZ`aw(g6{dh^PNBxSra8{>1e(IB2v}t${DX z+O;S!8$sAuOKZp_N|-LI!fLPP);y#K+O;gbKSA+Sf5m_Q_m(zH>-Vo8Q0HM+{!v){ zf1mRAO5I8uV*V+Xleo}c zCq|XL0WC3T011>m787@+*ogSR8yW*Q>Aoas@uZL4d)XGlj{CN;jqgtb+b~pfLJYH! z%LtY)FmTzs?4ow5R_ikLY%X8Ql)wfy+zEGlD?E$agdfIaY=k!-=OxO=y8`pej%!8x zfAr?!>*V0Lv{hr@2gk;2jCgn-#B6a#qtJ=8L2j|V>nM7q!HWWMw6BJL+9*c`uV}}>mO)(vfVd8eF7l@~R6h45Hb?YPZJ|{$a?&HXM>Y z7Sn|wMp;N<4&9z5yFWqkRIeOAZmR%PyIsC32TfSYfD&yw8U^iacZU517p~d8(|a-3 zh%dn5@#D832gIR%pD#ezj-xJ@n+&Acml4h$iwlq$!nTAQ1ohjQo=!HHh`C675v~B^ zW)6xlF>baaeM_NTYC1gZGl2OEy9?pM&mhfzMS`V&GO%((j;QOz7vvB;i|ov^2%xc4 z8^fw5YZ3~Vc(i}0wiVT;W~(QNYl zbZCy$akF=nE5o9T0qi)Cicuh|%(Ms-BPI78#v7S0^$PLi4~$p0AZx|J$u6u$-)yTo z92U11%&)+oTC`4hfm7nytitPsO<6JdAZ$V)<%ZE$rw9+|gVq3fBNwb&?pbWxr=WPM z8(_VI)D=_foi#YHK@`Hg-3~TuFq6QsVwR;KL8!~(F51?-*R+zrP%BW; z^uP2g#FJlRzyA*|J#J~^nEGM$$+fiVS*tHpeqX6xi7UFxZTXjEKb8JMdI~W}DodXQ zvE6^h2eu&+@APqWdqg$cPDTr0@W;U=4i1fJ&kOtf(0jqN;!8w~4{akr%H!dOEqgEN zNm%uzB*PM7iGh#69#WIZGW$lj$a(R^@Ue4S!hVKJ#uA=dQ%f2QWSt=zKn*6DmXNych z3hFvI92JL;%w5D6^E5d5L+ItHlYgULsw4~9X0(t8YA^~ClZ90FJ7xL_qM2lXyQqM8 zYPXD^ymco#a%jg|{t2`zHTy81>UrG>BRDdGALAc3a-8pG=dF;B{5{3jz>VYEw?=Fm zg#Y*&a0E@E-oTq^VSXq+*c|Zv7^^0w)9^Xa^Cei4%vIaDelgd|Jreg2U&NciP!6%I zr-t%ox|MKtZ7#~-1!C+ozQ736Pq7;&AbR~yI>Jkn7Ek)*II=ZhpUX6nc(qGfGnC66 ztU|W|M^!i$f7tWO5hWN7*`+Bc0&EqnP7QI~+~NkOKOxP-ESY?49 z(PISrW-2hS4_U+H>WyluU4se6BYHdW<-Qgy!CkfmPA$Q)Vy1;hTA`p39u?R#;8^^q zW|t-Ai}{CKE51lKj7?h*#r)8nck&O?JQ~=_kz5kb!0Q%1#o<_7pdCxF;1d&bnfPK{ z4{=o5?30m|Nl=*8@crltsjNle;aGhSX)-zv--_dhw__BdgWCsaz%XkBg;qR zJ=wp?mZf#%V~A1m9*JS;pLQDq{?~uIa~mSu9O5z%!3!c*XIj-xtlmbWkXH?74^5QY z0{}~6?1yAq01{tup0RWrLfgRnjUU!VL@}n*mz`~$8}wl8p$XR8ZA}pJPMi;fB@BzF z;l5`Z;@cdWcqf;zW~pUw6l%#LFhJQuV`)J4pBi+(+7R-2z-~?G^bse&UX{l+yvWeCN5+r|DcP-7s@t1 zybU3Grk}u8eG?rSx&fl^14b}Fz&az}G$*mmb{FEJ0^+Gz$H%rIs?XGm*FushXV~N` zV;0Z~g9of1nsz;UO}3lUbm|(;!T{^HT^P;wAtaunWqfM;a-cX#Cf}$B-9u{}7691B z!1ilY;{xkPr@p(^1c~lfR6Jetcx@YE_DlnKF!h|DcKclBOy9_UPwO=fCZB`Rhx5^` z!<)F9spi1+=p3fhRPi{lpp6RY7>quKn`opxv-vos)jfc%uix}-5k@hVqo~&_v zbo&61okWDm7Z|I)ldc5gY|X(GeY(YJVklxAo%dAYWMo<-BAy;SKC%r7bEivEOn2yw zC9KUPWdmyPEeJc8_FDA!vb%_ccydpGy4#qkyM!kfN)4-(dI+rGu+Iq&jg3ve2sW8% z2-m&rE+!(L-sAJzkO}u77p4p*NnX9Pl=OdN zLMGG7@q1Ypz~X5<253O0+9{2kP3x<*yS|h;2D;!Q2lij_G$zI%ZVo35i>Gn!o^8lc zJDtp0!_9ytAMtpD;8g=#rr_9NF|$cr2o%r2aOd_4FqnK(jJjC5Q_*%qUX}rLX4u8V z*F(Jp8?!l+-W()eJ2hV2RzPo^I4!^q;f602jzldm4uj8}c5axPx<4&EC7um7KCunC zZl_KQ#iZ70E!DkQEwoM8Y6Qn3K6~C^`xF#URR_IX4pb*EFh?z!>N8rR5`tC(af9HP zI4$g1`JI^1_aP#lo)%`JGN3n!xRh(+2Hn7AuIs?n7^2(2F;|nj`};)%#8V^L{C^)n zez&yo(8kv{KC$u78*kWn@y4HS3?Q>#bi=aZ*&sKLZ#-&4vi_6xZ$N&(cdq}<`b*aT zY<;+1T#v0=*R|`{uOE~iTdA)j>Yu8=xpJTSQ|foA{}!_SJxx7QmsYM)$JI8qPJM&= za>ST!0l-Qsq!lsuQX!RPxndtbS+pv#al2eIxR_)xTVQ=IY&w zhgWN>Ph54ao?AV+dgZD@`Jc+~DL=QORK8#NCgm%Xf3Cbo$tZ7Id92c{e2nsDr=hrA;Z;0Naf{-pVs-h~%RgBD;_`=<-@5#&<>xNn zyWE7#fWGBFT0Xse^|DI-8~KCMb@`X%AC|vO{%ZO2pJU zvM86!~v~Jt7XZj?Pv#o84twEj$*RZL5r$Y9tc??mR1PM=MH|I2VBj7-R5g( zZKuD@19mN;L%o%b^}yFSpxFt8GiJ}I>bUILJkYYEX|K1P>7PEz1BHIQ?Q-}NC6$x| z8dZI~615id_+bqP)Vn2TD4$Ejw5l=>bOy0V-WP9%v2#3-b~{YkLOR`0f0hU0*({xR z+d_uJFXjPzr{&I8efZ$o-|~Pp7LEH{q&9y;ZwCl?Nursycu#+W1DK){r+mI@*tGQD zJWz1cjT%uYgm2+1naQRjncSc}be?(_FX8Tv%9(_XsmT6<2k?9$+U#YMxV*^$wHOg0 z!|}M*DEVg&sJ4>$pxcaEEjM&|plBLY(UQxb*S?(xOrBo8kGTi+)BnH&x_H#6*Lh2R z?B_h7)%qDSAM4>aJ;(u-cD0X>DyFtq-Qj_TF=J?Zd+nI=BRr5djsk{}E7v_X=7F3& z7wgpR1@cC|3My>Qf(Ag7q1NPfQ4+EdM5p- zeCR$NAdT*T)8MKzr{2N?L@E{P5@t(@TIYarzc>itouSXOaz78aJr;KxvIOU`|KI^9 zV{FBJBeHY+)f`YNR1##(H7t5=ehCjmtPO43JTMaK-|;}Gg%(I_s^vPFxmc-q)VoFz*fPkH}jn^?;qy1 zRf{%ZzWQ;z1Tk_YooJa%YaYV^xgL%ty@{YRp}Cd^n%b1hRLc<|$?JF^YsbQ)kiXzt zG4g<))S}TYW)G6j;Q?=ahG+XSn2Ki{Yjo)|~Cy~uX zbS4I`54hURE**{Z!dLOsv(|Q{KWfJ!gEc=dffhP;Tdmp;U3EJLWJa{!6?2)r zp{pA_kn-hHzGBTWB%jLz!D=TPDWYkU{5Bpib+CLT!$e9aha8X&#hY<*)M)0<{D21x zjXK#db+q(NU*&*UP@g73oxYQ%uH%4&)nCt!+N3F_=XP~Zjxm@gb^bu32p;K^xKT(eM<5@CZ)>b&c<}(?x19Vsq zlmE#9KC0*|B@=$sNq&$6yy12tNV~GAgLs$&?5(P<1A$;;d4lhR-g?2Cv0;8kkN9&= zBB0A=8)jR*gA-5V0Jo>APm=+izew<{Fx4yKu~8yK>2CZaCy}a+XnHt`B!j1S%2Ey+ z=!U)(LM40$g0J>OS{pP(`s+{SFUi%6jZ((vv|e#J4}@CvNEGuK`zK$@1A!4d$~IHA zp2B!Q@9&hEa>+B;_z4FjyQ5l%G+|!+;InujgX-KvUpOB+@>?D-4KsmZj0i?=coGkw zLEXseL&GKPwH%P}XOk9#D~+YrtvuijJFqI9CQEB>9w3K#hp~`rdsK%xAfEN%)w-VU z;aHXjQt@D~PrGCEVZJQ!2-@!^+u3XjJI+fOGWC|1sxpIhzTw6Obg$+uq%4W6uI40S z#cs}@?3xTi)rWW>ZS1*Y8FR0vDDgnj?k%Pa0ej?#WJ7vfVv50#gHvdoIHDF;NO&2G`z>IYkz`*QeqWg^jL^%NXfvb?9B3L@3{mcrmj!9l7aN9`I^|L1)mM$z6XH z4_Ip@tkJ3UTuc0GE*N)|@L0*_3*GV>P9kVTy;To^wF${G2Ly@^EYftC-JUD>)({99 z9Hp|WRj4oXuc(0DNMe$o@j#_pYZ(H=Ol;#J z9!N&$%rIsPy4Hg{;LZh6pVi~>9PCTZLYp=>PX36yhf~*%Ra40U+~W`jIFj*LY+#P}dzXEI2NL}elgoxXbt!*|!-M8W zCB|#$5F5ONdteUdwFSy@nx9)aY}pu5X^x!zgM6LZiAX8gGnq0?#S6JhY$;cODAR_P zZ{sCA;CE*TZ^ftA-oQ^`Y^LzYVC?CunG>JlCFnL*4|!vT)KR_)ZB&2;M@Ot{zlrZ+ zHatPc3_i4NR(+Ja#M+65Bi2q#XOzB+2N*QU^rPOE<+|tbKrIu`#4UkDRn2R$R!TKI zjTHj+t8U~a9K9$()kA^CE&Ld5b;Jwt%E<2tUB!>$R->cd@q1~z>Ew&}OQ;ykv-4F8 zCb^Oah>E@zV%&^x`6(P=8I|JEPBtI);{3C&erx>(zGs`dL37FAXvX|EDtU>7-4xDh2lnI@{ODlv>5P_WD>(9; zGvgKajmUH@I$i6?r-$5wo7NOD*XsQo%J)i>)!a=CsH`b=`HR`_ z{})KLOB+9uJs^9h?6tCI%kGlpWq#Q?+4Zt@>BG|RNIxNcyYv;(r%Aig+ojHp&u_eY zRC?8QD%I*QArs+8SKqSw^3^|CZNWFbZ53NRx++&br2Mk-1IqiAFH+vCtSX~Q zT6s!&Xyx}S53W40^3IjltvqMtu9f_Xf92fD^(*U&Un{<&_=Mu^iu)8#SM(HjC|nAy z;+R6Y{EOwUgLlK5mS48~RQSTbb=kU%EgxN$%O8?|S^fd}{qh&d@0Hi&F*z+iB|jwl zz3f4$R(edTM1GEZ4f!zg_sC0;ry@<{R>XpwMXo~Rl7}Q;mb_o`w~`lvqfm7w34rnc z<`3=vkClCIE>5GClHNQA5+w5ay-7F0`GP|JN&qF1zZ5_TQR$KS+v=oO&x>je(!&BMF1P*i&PyfUry%6X8K9-P0P zpri)`P)vH60E$XC=5I?#A2lzE8>DIhl#;Fqpr}+ee_LF-J}-(Hq)GvllCB7#s8lh3 zTTHq-FNzwZ@FF>W2$_93Xi-Wk6F^a^bpE!eba_sc)ZtQz0E$VM1W*+D{oHLyofMfD zg*4;86F@2CzXVV{@>>CvKz<{D;>fQBPz-rk07a2s&C}H)|2;2C8jxQKpcL{80aTCt zTmZ$9p9!EC@>2m6MSe0*j70u(UX(B({~>@<$d3h39Qk(v6hnR_fTG9`=P3}#L-V4L zSp5eAD22==-ZqlB9+}H;4Jd}prQ-$^MZP;v0Y@I3R|YB6=dy7dNsL0iB_OLuzA1pB z$XqsVxC1hm`rAmt3vDhNH=qXfZ5p52Lw<8`K$nnBcBmKG33(%D2jY)jxIFax#ZzSf-)eV zn7;uXDBNpd|7!0hB;KDuCk1M+8s|`LF5zY%7lrrCn*>k_`FjCWhrCe$)gpf2(4qg}hb(C6U(%pak-20Tf4GC4gecD+N## zxo?gx4D!!q{r`_HRhKqO>wmQ_QPnoJvFBI1-zjFDM{BPx_ zWp9?<2zG#VWQ-^!&ypO1%P#59_=asZgU%!yk%vq~T~sC3!NKble6irz@zOZIfs>00 z&W59doph6cQ2Ue|98q_ z?p1VVJ(^|93?9kgdlfD*xs-+}6}Ter`dz%<+*r8{iE^eXR?>M-hwSDYc4rHef}b(? zSNThwA*5^tXI%~KrGSLau=$)jD||*gne1pA66GA6xPJxm&4^Lo2^k5mk^#= zt~ZL{M#TCK&qLysC%{XH&4x4a67tZgMA2XHhYNks0}TM&sP^dJ?Pql{0rAw*@Q`Nn z;G`-wui29_njp3w0sd8R?DX91Yz0B^wuNWJlS%cr*)%wl-Wf-UP8p@5Zchia>DXhZ zrDj^)7Wa&H1L8H`arZWx#YU^;`$&K?#|dpOsgE$Am2Dr|9nB?(0nMg{g`r^{6R-dF zJGa>cHk0PrD;3(saH=0IK?{Y{b8t*bUT-z(eA)Lx;Y! z0nG$^>}YR5&N%kT@A_T5-rM@yx6C~6PO-`KI{IMG3LCA!c@B;py%52)3n^3g0^&74 zakza7G-DY5yp!=nvRY*FZc6}^z?cZ(ZTK;<%M`jLPW2u{yzX1UrSWD^K5=O*r-lhF z?!-)Kw#&h|2w`k^<>?e8&dzb0D`D3>jL?}>gWqCxQ4#UXBmJY^(Lsq$&hNdRC3m+G2M$nC6X|t zl9N4QQ=WT<)Qbp+rxqU*+b4k9B$bibtoQ0#O)4L80WBC($;prkyM1;=30zQQ5qe+=jeo>s$_Y|pN)*RowWFpC-*XlZQV%VVpEoZ`-U*Up}0T*0NEmxb2arLZUcC{>v^m*@ z$wIW{Kx^;Y(rJ0n`2YI3ch0TfzxJs$qw?*_BdddzPp_C1?@*jse$n#0{CP{?S~|CQ ze&M?dZv0L75|)+ygY2&PK0NZj`Db+Zc|WA4-~_qk_cd6$Kd9BApwm!w(y9&Lb{5DN zKo)}Y^nwO$sDA`<0&Kf5)h1p1Gt$$21kJw>A|N#Xy_DUsZY-Vh!=t(LpqO+> zP{V8LhTVvV90biNn8b!3Xk$|;@ZVi4q-)$16B@jTq0%{YMn}&hNhCq&wrtC}x@ki@ zl?NXQ;Qtja5f)R~bAKD@1RsLN(**>D{*qngaE2R%JLp7-gi=Xp1+w7Uk8@^{5=*rM zSV<@OAf%#mA{9%TvbXMLnN}(X1a;`zFoRneaCTAUe9VYa+}B1r!3W@=vI7VT%2(x{ zr)t)^hnXZy5P)nATq2(tB%`X}?TjC??PnpK+z`e>Nccw>3;CkSvdbOwC;CuyL6ior z4O6EL(pBh)ylB$xZ6KZ6U__p`0X0EYB}o(mk-oMQ_drb!ZhhgJsLf}oO&64lu$E4` z562@XMSdcbrycRP1La5&2ty4%;r91JWjIUzz=qPP_MiuEf%FvyZT?Cxo9n8Fj0-wZ zAe#%$0|os9+r2aO9jK;hE~WiL=~fq@t2j7=PuPNW2LE9WNWRvaZQJIL9} zRwHx|p-#{W^B72IdS*#^_nXogrNGS-4M`J?@&%HO20+#+pvn~?e}hjHxHf{*Yzi>q zpO`2=kdbtX1>XN(Yi>Qb_WHHM$_JJ6tLc>wuUx0tT>jy5SpI%Fv-BD`3GZ5X?ZUPA zbFgn=F4`Mb9A8gMJh=6!MT3f`&rT zYV2ga7H}VEfq-drO@+QQ&+c>a)f#GZAk_-{nx!}p)1hnU_;iNap7*5_dkM_(W`LM5$7`>{IaoIp zG22mAg6s|Mk6oOWCWy#y4FG4j?PnsL-ix6Njzp-0F1XV@2&KG+xV51LYEbgPFd0(MWzi1%*#&VSRS0Zz=0p3sHy7rtpJSk64kx+^%<|b9p{&n?h1j!nP@6 z8oV6n%G#PQ07RfLf=6g^HdBT2V0O}p{wDN4kzkb2|Fqb^PlRb$iTCV45(+1HdghlB zwhJdx%M?w;16oQa`$9-n5Qy4N)zrXJY&Bu07i?vqz?(B%I}7WsR1ah)o#+do6M?j& zgib`X6mJEswrJgpK0lNWket0xI(B8bzmar`ztKGpl2M0*9XVZs4n!+)lck)2&C>9L zcFUoj9};wg$<=8o9ac zicrGPAxEmJR@$UxJAI%81!3FE>vlm%PNmRH{@-CBo!avt#qOO*G1lXcR#dinwdw;} zknKSwb;lg)j&S$6EuGe{LFX$0w1m!Axt!M*TNy^BN<)}XBEkLag~`cjPP^WdPUu%* zb}tTu1jROEQg3%?Q$-6bi^2f_bWN1H9fYRy*ue~?Q++Osq+>u;7)dh??_j{%94UGL zG@-FVeqy(@+AhrR?Vx-R8|egp1v+g}ASiU&l6h0xoE&P}9w!8hDu~&6#c6u`SV$+g z**_nd=w(Nv!;Hg7vaL)27PH`I!?t7ba2Ams^fRHq7>0Ba`in+~qhKhf85MLXkb*3!L7C+39!VP=blT>v`??YhW&KuhUlpABRK6J!I;rln4o{ow&x z+J%unt=?J1?y;(SKuhUlAK};kzdpBaUwg~iwaU`!$5+p+{Pqf_$S;3>IVS&zoLc&w zrK=VP3twF@fj2uEdkwZAd%^s>=e{m+^#4En*eE>4k!SO5NguaH$HXELj}hka;M66$ zgt?y#>@MdwQf~XE1w|zvl8C9LVSndFmMy0W(8Yp(g7yU{ZL^p7xbzSAC!^pPLlIjZ zE%Or=9d*9kGF7TBLk(CF=-Qh*@A4MpOENISQidhJNw2q;^tAM7{c&>);*HyDK;b}{ zwGFBUH)?iaG^pK3400Dbk~@Bt9_U*}*N^9+#0m|RClZVHo%La>0Ieq+yMPOPIJaPP z4pMeP+EkESl@9nu+V0ZsXCa;3AB_%;=YX8h$8~s;l_*^bTAM>4h6sYtM7~h1ZGXrq zW_#V1PU{axE9a3KqTs96l8c*-cA{i!!mtF+ZNN3rL7Jkp+b!vI-r7I^%!y_^VW7srV;5uzaE zcQ)hu+?P)5&Cu^c8h}E!_G=T}6qPb32hh)lQyXwikH=Fxc zOFEt3hsm)4&=Drbx;CAI?b(X1VFjo_-Gp2NZ_nDzB+~9TrBiw%bPxMLN$4JCgVkcp zr_Mxd(4U8M5pZpowp*3yB--_!bV6@{H0n*HQLw<83e|itTty`i>LNG@abb#NCXIH# zDV@^qb8O3a+#kJnF6E-{1^=IJCGJabJ3{= z9l?qrbLhmoG>L~^m?+kbV*P7pjC(C4scD^MeI}x z?QI~P+Up?2S`#T|C~9IvFD>#n z4AZpsv5-#gcVL#Z4&;Pc(h3oxd+}aEopb>)r~+Wp(O&Js8PYBsp50y>pXRr}k#vf$ z9-TU0gE~PN#Fh%~;?R?9J0s9zf_4RFu_hN4xs48>Omtx#^uh}00WGC-{VgaH)rm4u ziQ3Edc&;anQ9Bv#b%Ok&->DeeR6c=_8L(zN5o*_0)~zt znUvg()*g4Illnw=48nZdYgqkqn^m>-VZSe9grnVXirbYbwDNGocq?yB0n!8hFpTf7 zh13u_Y-L+EMEkBxtd0#rQkB*dMq@5@9iyZBYE}B+Hv&}Y;f^3aOAG?y;^`3M>9~rHT zky4&86OziR+(}}d(E$MXrd?Xtmf}AV}lNO6?eweLB z%W0DloCJW6fN=G~QNHbIOi@@miw}+N9E1MdA>p7<#G0l<5p6hJ%Nk)2jmFU2p+dA? z4SP<(p+^qt@N#(o(~#9{0o1M2baZ?L&=*z#qrF_s-R`GK6`1CRU3GA6xcND2L87r$fQGWV z!5@rEqq*$;ZKMn5h!;RJa(Gm!;$zbT#4 z2S!(okvg7G^$v^vnlF@zRI39cs^Vbf_QKr%R!N!QwC8QF;<`i4FYVw+k=<5zMhnaq(|X>BkLHc?mhf4ABC7VQ|`1<)v^;>Q`n{l*S=BM zI@2(XNq9(@05F;dge^}PEH;P$@ZUjSbhUOeezOMBnZ0eK9xp)B3giE1 zAZ!WPy%kqB473ot9hrMJ=&5e~MVU*d{dUFb^X5J^|H=8)2jm}KEiS!gHNI*?N_?w_ z=fA@1@U47){*xDU_^_LlF?kiK@hJHp8ge_s5n#g8oh$>M8eFIoJ}#nEDY@#%}6#k&{p z0B`+@h5uUk_QGE)KezDFg|{!fZsAez+22rpec>4k-i4mwiw6w@ZJy^yf=|EWcmwl0Qj)yZm~&eCen1 z-;uvS{-s$}MWq$#Dk|T65M9MJncuO-sZE&u$Q&?4 z%brk?wkNh8QFWZXq%An;9Om^zx;c&8-b{l!62*!7n7zqiDdS0$BC#WPaPRacs`@DD zW$CD#Q^qlS<5h~ZH3l~O9be-uqUNf~W3053H@=exym3#NspWKqvz+9W*%Mb0af`Lw zGo0k~yv!bVi7`>tLP~Y>zjBYb8-%&lY9*t^WAQ?CK0}VQZ%X)@sgG z-1s67kX}pO(y2!3hd#;yu4b(qP?-mb`r7aEK&e}#3O-N6d4y-`D%5i^i#2Jip5&Bq z%r2TtYP^&xow~EfJ>pCk2jP^(TQT1h;{Zp^o{PHm`Ly%;?`#29yQ%I@o4Qx?Ddxze za;aJ(5gW=lQ6IB|jgf}5G1|;t`$7H@Zzj}kvUb|HzV%X*(-@7{JzDMU4|5iFw#9-7 zqf<{Tznur-!D`8xX{Pifr_W@zlSZq>q=!>q%k!LtEnze}L#f`Np!xt0r~?CYFWc#M z<~RWwvyEh(j6Tfx-Sc1PEUX49NDg95HF+f`-(|Ma36I~DFtUvs-osf~+Oblt*euyY zxA7m!k|@9_Wwur7T+64JB})5D38I#@-SAcZ5pT^A)%nW|bLiVVppK_{y@bJ@z2R{V zU`kFR*7tRT{u4LwfS2l;yLk`OUA&nGTydh(%;uZwRX+NR!*4U&1~sRBoezaEn>5;X zo~}o(Okt$vB}g zvngRSI0iW~m$>~rXJHEG8uomlqoHxW%o$^0bE}{oMD@x~a~4Kwz_4~QQ8tsD?v2@~ z^3v)uNz^UZD|rhdnd!%iHC6Y_$2h=HO4KcGYsBR^!pR_+4f=t}F)XSgi3LuM$xP=} zY`-42^y!=VRHq{mvT6W@O^rIqy@O`7o?@rwh{x9WdW=@(>X}L=Ue@2X!dd9`6<^w< zr(M2doVt!#H*Cf8ZC||7IK)R^*REu3od)C9t@F_b@1Ko|*;Poj@8nCiuBGi(iB!o* z9DY9cQe8`&0xLU_q1O_>?tIf33{hR)r2l{T7 zZ2L_mLUWu4nnhnk1xM3ziq|5*Gzj{g!I&oJ?vrohEJE>IJzLRa0>vAxJYbJjv;Bxa zMw0x83faAM(KImV>^HuJvk0;w2V?aF!@<>0@_?V^oXfvD^(*6BCqYAeKiLRUG4&<)>gH~vt#b1kq~32O;JB#(hNBu z+|V^m*`%pyzstxyGAPINOehj#?04|*Xwi*CgXqMnmOGxtzau^{4|+zu)qms1IY4J2 zjkYjp9I}UA#R1wv!O7FEQtH*$|qNtX$fw~9^AqMZj4kx0Z5@@3p7p2Y(`7g?igowP>rJq}P; zn=py*vFT$QJP*|%UybF=jerCHC(c6EOq#;sIF)1MALfBXJD#J;_C)!Zf(JZFXiTYA zsd@W-96&ZTIa|bFPWEr$^C?;C<*7upngp>U-Xi7Ivkg#KE!-gE07Bm-OAcGyq*>>S zDFG`Dj=U}v3EslzQ-bn1U3IFQNnQH}^oVI#wluP7yQ^wjc`*;9OIbs|WN2h$Tro8b z9kqTs)62Iiryk@i2CZn)t#w#(#gklKHw~KUIyh^v+HJSid5fyf-_gWKM;!kV4|DJT54A^6YHBS;p4vwz1sJP^=$tiz)5C7FSsoI(mAd)n0gF2Zw~Y*ZHDHx>U!;t!Q7~1ELr*;+#{A;wCuICG(nbrDF^7> zg`_6VBvS^OFZ$&E{?ANC9>4IA4u%_s&0jE#gat6>q*i~Idzn`U@LAz&QTz`#ED0^N7z!oly|qNI&t>7 zJdiEJRyuXZtiQv?1Ma#b(C?%j;J?Afum4-;)|s{EC_lLRPpj)IPf>hO zK`p;=Ss@=ReQ4^ZXU&i{B`HfNnGlQ2t)ytoUqq$Rp$(B=pI zMlx&E!c;n38^IKJ&_P(97gixI!0bj5JjcR-2RtcX>;uwgK)yMujn!x){mIcuernHL zR}nsj?78}W;6bA6Amm|fxCQJt?w!~q-r5=G`!DCaq(}K5M~$%xMftYTZG4mm8K;HP z7D`U=TcU-DG`J2DW!Rkr?mTKqbT;B%aJJ4n+?726#VR17p;S5h1#$NE4Ev1PWLsC&g|>J3_RLzPihAHRL*DWRm$y}5w=6XZiub5 z(rHdxzCrghkk0HYqZ8x1pjZoz!|H7}lgt(zk%SFs>Cv^t?ZS%kOv<$mXeOQJ*Lq{* z7hgDkoYu7rOR0y zZ*SBw5;_$$kKURGmLgyoMh}}}`xl(O&H&N_{vvGD0hjmN8+F{Is~#;hJk>!FLV;L= zgU%gcPtEA>d0RTIzk!7Z;NcK zyR~u`rb?=?h32BnrPKa0Y~#5NXbanTER|$U8#RTa1=ywn?kM4!*t6fB`lh?ylTPTb zM>mX-XM4d(imlnS59@_WH;c%?ZUAsXx&3+BEk|y(OcfN;^K6-OX|=zJbb5a^S{k1O zdV=>o)){NX)4fJm69Q_mnhWkGC+Oufu-d#uO8ka&Dt|dz9^V2~1m`H8b~DauD-DY` z3N&C94%|sjP=PICWnt}mw>#3wd}%la=k(i>Jz;-x&^6iYO^??Ir-3M+zHZd<&3^#5Dnr!EbLsI)L*(xTYCwoI-n&p__YppOPr~QRxx- z0-P#6jv};usx(LIELp-u>6{&i4D266P6T%*>2!pu84y+gAF?f|{WF!FwacYEEj?PF zA4SI-C|b&qlK)NtM>@h#_DHnhhA2S^NA3pqj#j#mLuWtX{D5f0F6nvcQTq$nErcB8 z3%iB-p=tqUic8)|8X^VN7IIU#cf|4;w%MNgOc(!<^eB7|b|oO!_`ONiD z0o%L5ogrLX?rEnZ(kry{wN86OECv_-jPwY67Dm5EAp*kax7sb}l3o)l!DRRn_j z3b6=?vcI?oq*MQlLjJM2m(KUF#ot~0jm5!YYSF#$(?z}f74osXE>FlAIUzqH$CtjZ z_=e(Binl9Xt@zcYFTd`M_AHv>*y#%`*D`8>m9@+b_t7ZQ!`?l;0vNy;co&TBaAz4o5mpw^#Qno(-?)h)d ze^&ms`Pa_>`h0KwyX#+CfB*U$)=#eg=K6!{*>&Igx%Dg7*tMUneRJ)zYwucn&D!(U zy2_8QIoC96$JUmW|E~NyYX-!j6U?F8}TFN0#5Z{9DVA9uz@U*aIRci48?i0vpT{Be4DqsH3soEU3r2GcVQY zX{;lH>aey5N@6V$l)##^f$6ZutSRuSi=cX}CV~=Jb@sJdtTJl~n($>2RF9QJP!cPO zpafQ!4NQaOXF&?f%|1`jSXKnpV;K>Y!qOtB8cT_wDl932k{Bz364*0l>8i1(&w?uK zX|o`S-9P(M(0RX41l42ril8Kx5J3qnJ{uT;#b!+j5{rtU1QwZj0etfCjH#BUv5*L= z$ATg#i3LPZ0`t!VrlGMjv!+mTydo%xd1hXqB`{*f6vo8ZX%SS9of1LS*li-H3cFPV zC9#t;6le;2D^#(wxC(pYEJ$Lrs=PEoW3&3ZG@-|4^>=APg}rX}wFEXR>#K!N`P7+6 zXtjFm9uZW7Jw*hiu)9T2HTGl?RE0fB1SPR^v#3UeQ6eabsYOr%Q_VzJtHJcMAcc{$ z&qFfaC4#E3J4H|uJ1c?`*c~&0>D3r49nQb`LhJhf|Mh=$3e0?0T1#T@nL)KsrO-29 zTdTzkv!+me=|oUHrWHZem}Um0A+SH435?cavr6!^Mvu+PrPCT6HY=A-YqZ#`Tsp1M zV6$@Rw1&d|WR{pljm?UR(@<___0nk#iOuSz(;5Q%!`Y~5uvsN|8XEaoxpbP+W3zJU zG^N63<vJ0+25IYt6q=2dgiTq zFnvq})nl&`LDkqRMNk#?3K5jVUM_+X*l*7g(_z0gYYN}@Wg@5^d#MOYVJ{Iu)!2(g zP!;wf5tPIp6+sE?H)rW;u@}yQ8tetL&qMkB4G~n0JzoS>VZSbdlGyV^Py+k4SyWA9 z&lN%S*sqA76t*dXstGbo$ziNWduo*;p z&_5cT9wR9;!54_#oeop2uESYoAYd9@Q=#9nb$$rMJa))K9N1Di*`EVhBx@#+4W%1h zO_u7b8Q9zbdPH!|keyJl0Or|^GR&Jc4{j-)?9WD~F_JlZ-~oQ3x38vQH+H^kGFu^d z^jRmrE6h??I^}kuj20=tpX09TwbCAw9*zGRJ$-CLGuH6m){J%2So396lqEKVNNCYD zk?MO!gkS4JIfsiZoZH&c`MC`5kRHYVgag-B_)@}w>v}HJbVTT0J{^F_Y0!1B2u|j& zi+w~o{htDTB&sIRk3^G>j#=dhf$woGER?{tlYXuV`t;!L3qI8@63G|;h;;ftfh7@U z$C60IQPt*3uAwQ6$g9zHkO=INxi0B>=~4Ufh#Z^Y%LsCU6~?Ra_KId!6^2N`eh^p^ zxlpyk=MeicC{rbC)y&0NODFvwKpKg@38ZWKTG=*Cd&^|K-k%K3+>W zR2Eq3*Fw!IC`Dzf2e1fOc@P_`1Fx(r!!0xf9wwX?gwM3QWOBk2@>@X#2E$Z0fu z8(FW^tnToTF+v{HYM}|yYBnrvD^&phBK6kR_N!S;didXeV2m{4)M`F_Z&BOobbN(g z2W2FvMqyW>4?LXYV7Y(GDb*|_J@kL=jgbtTufg&G#zA)5=SCiI;%Wg+ZoNP6i1G8mtO&;?~IU%zOq zsM_fq>O8}76Sy`^CGw zuITfVq0eB_!~f3cy0ISWF2M_9I6-)=4L4gdLV<)FubJ7mdvCH(&a=%SmlS9R@;(;Q zxqSobG94t2P?vd}wv4LODn`3dVZgpXxTeFNs>}8#P-ymGVPS(lo%OIz^>mBK2{t5PSX@HEdm#bHDI2+zrvB}0DI4HQ_9tj-if@o<0 zZ9vX61~dwU;f5&O8y2}CgI;a}e$ zgG%1^1VT3EsT-XdRfeUEFn)pIO9&hj!W2Sg%ggT!B0cD9>*E{*efl)t@R+;FSj|t` z`$LNn#vU;AuoO6b0yKHD<2UI+uEYEdlD8A)Z|Zc?(NLRGPSy=U(CC^7b!WleNWYh%$3w_teSp;U4#-^O3{GbfhLHY)p?7 z>KPYXNJJ7|AOrO-IKeVabD64s_cf7DZxzl6Aw@aij8HeHE9Qf}UO5Hd2^?d=CG@Q7 znN%TL0MCx1Np}!4=`>e*;{>o2dMQa;NYe`DBIa-#7^1IA!ic3lC>OvHBG+h60n$TO zJTOK|azY~kZsq;?OgmHX^dVFz^WbyKHh{AiwQ{B|ggp&O4}E#GF$Q(GL-9CY<+MC% zCpb9t$JwqCW@uo72BMuGKo2DeGkJU$jdMfY0ymd%ID|XCb090}92Yv{D5TKYvpmHp z9S9G@ZcW>QD8jdaQ&hnnY;g-t zvDh7h4BYmKrf8~IGPbMTimPWt6F^Y9VIzG3RkQpVt|>rzz;ke-DFpEs{9k7ER7$JX zhLSBgoYP5bQEi_llPeX$% zSu|wZ$3QwY3`TB9+f5j`CFEiQm(8AW(VQG9$XiKnabL` z-jYt|m*Do?19Swp=V3#qJS@k1Ry17)C%E9+UjJruaF)6az2=D(@ICHIC-vWG{C{Nb zdvoixwJ)ssm9JX;@oIYIM=LS#0dULm=CWM=Liv%U*DS3sju*bO;J{ys{RlJ5UOE5s z`7%88|Ja|0HgQOQVd~BrRn@EDWS)fiVm)|BhHJwLsh*#hE)c;ar!_{6RyMJT{1|cu z{H!6ZXNL|5oIuxvqj0v_g;RzFv^Le+d{S`NNZ1+-Vc`IWG5X7SGtrD&O5?! z$4N)w6HX1FDMmiK3$4n5jHENXYjk20>GBC(%Ya`SONJRsI?#ZSX>@_8%eErl1ztM~ z^TEud(pxO+7YyW>5ofhgqKyDj}$Y_|eV8_nsh}*>X8>Ff-{aPmS&xgPz}E!F_xp(CQGr zu$S$ofTA8kuVul=)>q|52E{- zNT+ueG%hE_08N@^ClroW{B!`QsnIo=N!e-+JO+T`WiN}{-QB4@x!Jre&DoYePCwtlJRjrI*Fg%BBX zGL=ANn3LZU5@`3E(kb2E86*8aVQ^Hgb!x$Gmvq*N87(N=Rg%(>9NbLAsdbp?C zV-Wc}B!p{s*W6S)+bu+)o`7Isr5h?x`h2n&tSlJS&)5=<>X0kU7{x`^=F^S*RqH`m7v$mqhtk+I=(`j}qd-E$dXcO-0% zG_<&NM{W*m@;B*09)*P?q|GNR9JL~Lcg~yd8*Gpks8B-o-TAgBweyeA6?>706%0qFhGfHue48&>#p)7O+gD-LTbar5-3} z3l2G8O-=-qPT)GIt&k9(P?g4_>PpDQXh};DLW0}|6Kc~Ort;i=7ShSx2t}bZQ53of zbyE{lvk?j<59GY!$QH^^UIHME)#<`O9Q-*wpHq;zM>_3o zAf1|PbZisJJPLCo#b&Bh?Q1K63=HPbFd5C&!A4uI7rJq83-;D$%Ncf(-u(wMl1|b2 z&?ZuM6nd;Nnr_neA))o=Az2-?lg-8$E0!e|S7=@&8=F_Qe*__gQix4o>Ca^`o!?tSRAgwv5<}y22 z>~>2!9p-_}tAUNM&>GYY(^b&eXsCn01gaC*HQ?or`Anq6G$cKA^I#KX7q>q|+!67B zRtecjq#mhP)3 zNJ}Hu&zVu4*TBz)FOvpO!m#%b4t1fUPxU-Zxo%Ax?0s80t8=5{o9pl$gvIt4EN+#3 zen&C_X#nDzaBa;2*7sz004wPv@9AuU=;8K+QpB8h1e?R6wG6E;Y(9l+!?z=?cKj|q z+^0ZKO$h-DJvD!X%IHX)abSl!9DGE>HTlt|>hV2pN~d)9h~7jxg@PhomQF@(jxbfT zLz4oYpW&LMB{iIfS2jTcU)V4(s&OG6!kr7rl{ z>bmS$dDsP(&O$Xhw2AZxh3yX&oukq7X8XBt1HytF04nyjJr-;Bye*v;J-U7qDGdq( z*ghTUs^SSUiAFOZL<`r<@L@Wk_OXyoP7ec!B_JmZAbNpB%n}|H;t8ld)KJ5zDQ;d% zWB{?-9qD9rolOt}+^)&$NjsH^(sfYY0UjtDsW*bq?_js~eoy@_JzVX`x{0*@1bNeH zw^#EPa*PgD^J=Kc)GC;hpI$)Ou07E5>DFvAsye_uG;9#Aq6s&t4@!@U295s@&)qY( z{@~g_tQ}W2SKkS$f3)I_iffl&xV$LOEq!+J2a7i@P`C!u%5?KuFrEA}YHd>J6zS>F z)=u(n>QcSw%^ zWqzad=qDliB+B;N(eJm6ZFNXbciRq#I?4mEM{)A|3(+@9kN#zTqx9&r5Pf1t^owzG zBkoL9>~S+hoj{j(^bOLZf0^GXJ^IfWr8nwIwrj%6^cv~$jE}sVccRa{Fk0Z_**7!3 z!7$k%B9O!3$PZjQV!BKGYR%c`UCOi4qx7`Vy_;uIl&&0I$w$eRwYI9&SVJF50wq1V zc0`G9fObyQreG#{ug`XgZ;&3n`$va2ks5@s>KIq2x-bJ0wRU|FF_br<3Z2NA-2$2! zy5K8*pZn5@-8Z^n69gl+H^;;rElaguZHEUa6QRrmmD>!l9nSUlH<3>7UYK44QHky8 z#cJM?bel`jf+r2spgM!YHk0&V4=wCPsj$1=kWM85LnBa`*d7`+n>uH!o2VypKn1?w z&JPGj2AZ|jU>8_Ai`Zyw6GSBr31jt;#p^Z}m}WB>Gr~4!*vvec9CdKlRI3c&s5cr$ z?sZc-qv&XL^EO~4EFxRIwp_$o(PbTRBkXpD&CZjI+MOh9m*;1H_PQsXj~~VWNG?Jc z1K9ljs=eUwR?;R25OOsLcuz8FW?FS9ZEy;9z}5GYRpk_0X%9+|N@R4`CX$vAR+$}4 z&Zn=I^L`L42G^(P+7XpWx)<6vPD%v6{zVu|ryPd44*I8+?MYHXJ+4}7geEn9=B6qr$=cWiT>>4xoVAf1_SG`G0{%!FC{bU0#*q*-^x zUxnp6_}LmbPpx^1pwc91h5|Lse!TY7Zq*-OnOcFDJN z&(fVsN0(L?f4=&_;&&JSX7S^T?_7NS;)_=n)_<`0oW<5+a?!tX&EiuR?^?WRQMvGo zg@0N2+l5ak{&C@53%|GUl7;i&^*^-`Sbg4tVS!jUwy=gjj(-pT%4!_{B>ryv4fsn} z9s~t|&gx-2jR$d~;tM#5Z{X|Le`EiOeN|q?J_WlC-njDX*vqg@tczu^5N5(u*m3L% z*)L_^m;IgW)3W!hena;Avfq;ZimWHg$|9>DkTEh!c0zWQY<~WS^Ix0)?CM+Q-?#qv z>z`SF@A@CC|MvQG*Zb?a^~gH2POYC+@?rRQ$)<*FYoSeQR%8d->Y0t_{}m zYtc0e=mgxdc4$qudaLqB%C9Rwr+mNi&B|A-{+sgGltX1f8BQ z|FH7;l@G4`;mTtxrIo~r9n=DDgHsfLsCZ2Ae8oeGvf^HaLqRJ}DXs<8fFCb^bNP$Q zA6ovSxU4O}2um%HLY0;Ec`CmK`Gixj6pd~;Y;gmWV z!qd-ExwvZ19pRDSh|guy&jNtd&F+1sq`^E*nY)Y)P$<6#eeMU z+#~&x$}?a?_E7c||BimanV@t`haTSkLEa+n(&p8ge1*8y%L87g%B!l^1I?Rd9MFrW z67l??V#qA>YV5tB#nJ9sXf?60z*{hJs*upYP*;xjIg56c z9+HNFI%-(uC1+c0$Iw`BbP~;_uW%NvYO`F`#rx^3l24CT+)-;MrAXva{9vNW~K22+f^ z<798Bf&jV54I!iw7N`{u4?drvys);eAaaP z@H!7{>w#i?dejn;PN9$}lykS1Ig6TmKoN#Psbs(XE*?;~hn_*pQFO2HIk`HZ%brR- zSk)ip%AmQLAlxK7s6>4#757Lr7;%|1{eYu&=g)Y+X$rB~29XZm_&FX>hk6ZH%r;cd zf0Y9&-45w&^dpH5{?9xR%f<$p09zRxei{dqhv`n2=~b!0iQnUZQX^T2#hflfb?vWt zpx9?4q`{L5o$>HMSi>6HR&zIhP)6o_Bfv{^Mh==Z7_Lk zZoJ67BcI9XV)4k(WF`0n%BM(+vydGQZREYY1u=|=Ri%>Iyz(Os$aSKFy0cjz9LEpy zKq;&ZII0dxa|@?GZO+9l+F>FXP1f)F3*N$FqZ4{vq*TAf%mLY?W{?SMyq(}No>(?9 zbZS`rz&yOQ$6L_qTC&-58eGTU%>kK;&5@2LD~>G5D>7%Y+J;>hkC!dC6nKju;cMm` zRJ6awhmtW@DlI+f@TO1wC8{jV=_V7>IJ*6TOU^x!W*Z*L6)I808NSG+S!Z|1`e{e_ zti-ij>=`j}rkc+vRK1l%^C-r?rWGiMWq{f(n3ada&qj-@;24 zr^tRa+0Yo1sZ)Q(StKigB&pWY>h^UHt>SZ`$*KO!@oz4WZhZiUxQ0aAO#dbV82>Qi ziC5TMH$Tr2W&Gt**_=q4hiL^@tQmjU)gkOXzlTw7Sp=wjw5_#vY;(gSN@X+LOzd^OxtobB`4R- z_$b2eYqdju4?f^5ycumb?DJ7Mx03q^jMv}obh~bKwSEO3tk<41H8T~zr@HuF?h%i( zoy=PMaYLH?5DzdRugzMlG?GU+g>S~AWsE*+A`%OecXAePf8CuA0Q$7s^<}H@$+lNW>hv0%>--PCk_fXlp5HNjY5E zD}TBLs3L`g#%D+_a&0T)(o|SeP#3KCZ$8IaID3X>BGwC6^2hk}aAqS+Umd9Uiu2#( zEwc7_#t@_uiK{t2S2Cjs&UexyFTYw8>(;6tDJ7)ZM&A zq15T5dXE-vPL#YyY4 zlq#swabM0{NE;YKq^zf+y613@*ouK5-O;A4`di+|16iY|ThBSEz%?)8foMM7@(jS& z@e)@PFg91h*&zDy;BbMru$D9JL7_s$)hEA(9x=C^X4;jq5Uq-CjRX4bP*5Gn=6nY2 zx8}IFTIrC}pbo0cDE?e8y(5Y0KuX8WeH_R3~ zr;0j~8m>KJ%+|JQST=ff4$Z4pi(>Dncl{PxWpmaFn)2#jh*{*kOkV4@mrX3iLCsw^B#St*-;lg6xU!ggnPi)1{zPUK0E^rnigLh5s6g8U5k4&BfX8l<+2&3KxRi>}1FNIGi?F~{D@ zTevH(bTP^jIW=De>uhy@ES1al*;`I>7TTDp8nGGNj{fz}=K;T|s>zhiTEkU*dT8~b zuB~1j)HSD?yoFlhq+5QsBX#9Vc|Zkwm*N#u&Ah_(i5V^7_O-)AJMTWlCy)jT3v>aT zI?Z*j=N{46-SJkNsYGfkxAK4nw#yA_y{_*FpU0@4*<#P;x>@^OeDz7iNl#%Ib#?Vu z@SlP5v1MbvU$&bTxZWy5QLH0m@)k)(#@BS}T7eq+GEBLAn2(FPl7Vh?uu%3~af%C8 zUC5{Cd`fS#9EtKksv9Tkj3!cEq&Pqo@DJ7bW}}|Ij;q)hl{X&gx5MUGarOJWg;kR$ zlNNupuezh#SYQ1%wEn+7cV=$w z@im!pc@{VOxV*llRpY%zR!XwH}BU&{wjZFNi5mRp%%33zxgssjr zoZEm)*yXV8o~m0(vF0}mUdKYgoJ|q1<0**6I|j!);U#yRVDE7TWCQ#aceMz z!fDBA^Mt%tdQwy$xqkC*loZ~Pm(MqCW5(~&IMR6<agXqvNLJimnUhS(DzGEn&KmhO&WD&x0~mNt6SHYw2h`Z3!B&AXXo}c-Xmh0 zMV=BbbqDJc^k(U)@pPz2^gAjNS03tAOQYL}!43fMjtvHjCU~B`@&>d?c7ASd*a{M{zN!$8XpM|9Q_jJ-aO*GN zuRlwWXGwjCq|Q;qITdjy1-%!7q|Xxivnnz~s?QO+a~kqaHK`g@ZS8@}9LYGm*F0kr zJjZSakq$FXC+oAMB4J}3-pw{Ut*yTiz#f8ae7&Huo=DU=u}ja28<^f^*{ zCqWRqz-CsLgroF5>#&jC1Rt+g9zV|WZxdNdKi*TDa+J|*1UFx0Hl1nZFZ}Cb;-H%R z7Kfg(30_;bzeOrVIv97C06`q1%?MK^Y@xdK*Tn=uPJWB4p0NquSGR+(TBA{KCpGYE zT*e^0o2{_$DY(BbDhO)gb6+{SbJGu>Lf8yfuT~nZ!O$9rb&TK=7d+x_ovPn`JGXF@ z<)Vyt`Hs85nQ%f!r^+$ifW)5l$m*sKb!N6_r=kNYVsSP!=}6TG{&K+^F3(wf7xN`e z(LG_W-X-F@z?13m(5SZQMYa0L(UvlT-IuBQ%?zyiLW2h08{h&*o5^OOw$bgBt8myT zCA~4beDB&NZo9yfQGWQ5?0jY3Ru5 z;OnD}@0T_^eL3E;OLTUDCu7+fH8x%7lixPla;Th%7u@@ghAK8#M8j2I~st=rd(BMrAE+jA4tzB9~Fa0IE#AX+G zGLpm5{hM|a$wMR5_ko(rXQPebejuX@L4yl2N^oriGM5;|OMS&IG1jNsrAY?Bl6 zrAJ%NIXs4@!_Txs7Pk{32eY~0q9rhKI-oTG&8jw9J-f8e`UJdnm-y}iPbNbjGP89@ zW^UN+##p1_&)FDA0+`9wsUaEQT=b>I`qE#rOKf(5CnMP#r8X@nlG`m$S=(^uSg+1r zMRhXF$bt_VQw_Z8USi#J8Q!u>e0G5+quGUMa?-)u(F|MlOgsWR2HP-f24^>LZMlcN zw2yfi-m*)4c7Z3O*?}x;-jQX!umIEa73*0T@zLN`2d)i68kAcuEtZ%5l3il63p^Rg zwgN`-FU4-2gI)Q5h5s4;`}m9SXW|9ei+?wM8-6ABbL?B#=dgEUuf?8^^|2)8UjLW% zzg+*o`Wx3DU4IDn(fik*w0?5^inX7weQWJ=Ywuor?b@%e_14%m*P3>1V@;v_vGQxm zPbmLb`AX%lD4WXrlolnSJfd7!{lV(rtbTa)&8sh6ePp$=8eKK4o>@J-I=AxOl`pNl zf8`A;kFGqll3VewJZa_R%DUpe6yH>QR`D*yYZT8@bQRA~I2BsOhC;FYAIpEg{PE>K zUVbGg6*OQ6y=9qLKC+CW7?|Be3dN`W0;5C+^P6-D5+tMLf$yd;8Bcu@pZ;{_2^h37?363>aC1fHFxtHLX@rlcNEi=ZkzC4!Q8QUoP%b~Z2) z&&+}Z{)`!rr17WEyp+__`28ZN9=}fn)#3Mwpjtd3f@<)%2uk5G5mb#wMNkzU5kW~j zJR3DV{Rdi+)ql)_JnplbXU5mW_zz{zeP>MoE3iQg=O68Q01x&(e|#+0CG{Fn%;$8Qor zN&Kh?O5iun1O}4C-_7M?Ok6$l>lK6EZD1l!)8<-xyVHVWk*UUZ-wb<1ns2)Eg zf~xSVL{JjHQUoRND`qKZ@x!yGP}{7Dpn6;>f~xRU5tPJNL{I`(%u>+c>$9d5jmt$) zJ-#G@lK7$sO5h8#fl>JKtSQtWm|2O7dF}MEM`cv2bZtcM}OgUct;c8;#Z&unX z3yRk%?pgl8@>%&i1q!`^oW$Z}NYZs^_|5LZH38ljBRk>FU01*IB&ui{1tvi*PI~~L_AH0foTllPFuYZ z4H~5~{DNG)T*y@sKoNwNoEIC3N0Lf%Aq5duG1p;Ens3Ht$qX^Sq9+E}$0Jw{;Vj~V z9XD^mEv~>&T^rC4js-}{ObhG` za>Ugc+GmI-LG2<;HX$o8ia|%2xPW;dDv+1X*U_m?55ocV@JC zh7cF=ah9?kMYYW6Ex9adH%gKuu38UZ@Svt}&Ac{4^9=DMpvM6a7>mY$GJ}+N;I|K? zgATwbNRou>IA0`~^Q-wg2#eKW+9F#ZNG z2w@Qqqr`;GLyJC{s*-vkV@(5P`hTZ8*s|Cnknr64**Z@Bsb~ObZzlW5h|`F-Y}>QuRRth z$kWNJ+F`KZyGx)NmRLa3F!}d6DVy{HyC!v}0A;+pT-xfYnMxt8T3Iw$4V`i>iF1Mc z|IbOuWQneBpUFeXZMShH(wChcN5mvGG`a?l0d>X{Bqrkf*GiU?l_|lws6F7}c5l4s zbI{B7eAJ{P9GA%y4yDoSvU?3p68$cZ=+~J-vI?dN2LFbbCd7#OcJ$SALZq1RR=eu- zne6)2H{C>BmI26?3p0^QH&gI+3{8ef=Wh$3~ z3Rq@xl%k|-6l}_b!l|wpB8FP0%d{o-RvA%R4}3Tmbu!h&L%T9{CIxkT7s(~%@^*I^ zx0w@$sG-(w^^(;j|NnDRGTBA0c;uNRl(17BlqsH-T2s1eqTrVq^oCjsaj4ld4K}7Z zWO6WI5|u*Ia{@5wt9dyXI_>}hHWn!mbUTGadzk9dS!Y;S;E$_A-;mDvh0_(%?1Vd{h?|bAzwU#@i!=VQ|BM z?|Ylf25&s>`njNzPd=vm5LoyT|%)Z#ZP~dIJUw zF_aQ25$_M{?uJHF z4@(!iXCAtK_4RD)$7{_JHfCJ8qH5@J>?^l>CUh676RNonQ<|0VOa^(^v6>%t<{@|# ze7_EO!sbpfWK!xqhL9oOX(y}PzxbjPzxd>nqvIuaoVgte#t!KA5aX8>HIB;A;5IPL zN+*-t|KGW&kjWXS;NG8Z)@;MiUmGTguCq(C>J;6k$gzjW@UbK8}zpKV1ppSgMA#v>5R z?$WhauPG3n?#h)XE&q8rwDhi}Q?P?yO}(AEZ1L#}e_R;N|6zWJ+y44Lqwvlt;)St3 zT1OqjL9FNLxpFwd=F(!mt;SN4oV^!ZN^-HA4+q{xh)0AZz)G`%ew4qPx1-|E;mtWY zM}76_9YWc}^S1@HU3FZo&oUk>AYrzQvzx3tRHcSv43cD%Neaot>wnc~aR+=&m2thlgu-+SH9aqizQW zK!61Ujwl-Q3{#R+I%ymRpAv}I{EE@}J0NR1#Rto-$=hbF*W4cD4MwsKSIyYAsbf;v z#&4vFpk#Uyxtd$uGs-C(sJIu(C5=u~wa<|sg+-+*F3xZg}w;mI^c0HyF7} znD``K=d&6+^AkEVxnMtLkVQ-eq7UstA>H2t=5$Vc60h@_qtMPAIY%^}c@BfRRw$V; z62f8J9)d*-MU?Txt=hh&)kK||5pC1Vz{QSb4tTE)X zhZ#ee7K%skBru>30D(6Y_ocF)rysBT$*WDyCW)!mY|W?@>CB7bAw7|-|1X|<-`w_K z>*bq&+H7z9YD2gF3`DJ$u8vlIxbo2D4=wwb-n?`v{U~~ldg$UO7jIs8>ilo!Z^teF zPyAqwLKu(uF@%Y$yha1lspVQm?9G#OwyX3IIgC791Q^@rr0yS^L44J|5A##PdBo38 zZ8C$;ku=o(Z8x;aNgB_sgpnP2T|BV&jxOFIY)3r7Xf{)45?a43?F#`ET+?JSi4URs zxM`L!v}1CJ2lpO4Q1Bm(AE;5|Fx0aNf211*FeyorUdfR5I7d>--m-ip~XD3ZprXD?$cgpx8%t5}0# z9Z3@J7|X$z`w`c~1A5o!${oUy6peBfHs~UPa8p%i*gF8DC27V&=s=YnpGiE#cb?uM z)JOa-TsT`$d1Wc4SC0dok|YU?OH~p+tqf{XCfgR0iP!&+Xzql_h#$XV-DbsMw&b01 zH56g|!V+V;FCM6#qcezy_Kwl19YR#Z(<6sE_E=4CNish2^e}#5{>!fo`Hpx1*io0o z!+QJZ(j7ub#QV><^nu!-70$?AtWzyu$Y3Z=iAR$r&O$g&EIy!@RXm1|fv~xM2rPJIPX)()<*^I~BxA*`H(^Ams zh1ewqF$0jm2Ke6%aCv0kfQX68zo>6Khpgh^{{88l%Yc?2FRNLNH0Q{8bj=>rV+IQz zzO!g?PL}N0Ps_yXf79rWolD80d>j-Zn$^@pQk}*YuNjGBp>{@N7haTCl10oTFyk(C zlg)ty(U7W{)?egH#Fz1JM_27!f=Z6Zxh7GuF(IShCJPNQfV0dkfcsD>HtCoO_3Pi z(BF9!f^zXdUN^e;&b{#7xczqS83ujBaK6>A$O=KD6t51=jIM;ug<89i;bEO9n|PG3 z9R+qSAYFcSw94TuXU%R)vEm$NoUjMtcLq-3EE}x!`dzeydi>&V79YOw?uDD?A3uNj+;jfA%m2~*jv3X%yJ|O0K1DgwscQ`e zqYTz*B#8yik?dT3)@#*Rpb2w1Vw;8q zu7HW$_)qcLzKrFiabkH{P}BqdV$l-HyNogwerL5)hTYA`buh6#K96{OpThFefa>6l zGu~oKZu4YPemJhnV3$Ucc*j@{Hrpevi3jvWEHCu{#4j&hHm#Wn*bRe<7htfwoN1q~ zjbWZBlX!?<7@fECU_j(ILL=>(r&3{}KJ10cROF$m_KhX%7A|Sa2e2J+RXnKAV`29o zfZ`W+45R5Nf`O`>Y)q-J=vBdVTgYVK_92YwsLSGE{VVF~ffIFAYHPA;kBaGpe1L?d zu!?u)7e;l&Rq>!chn2$v0E%BZG-I|-*OZnvK?Ny;rvZ{gp8{(E94O1&uKVFWJg{X59~7lcE1T=jj~o{s3ngQ0(+!oc0p%NAC|9P~%qe5lz_ODF1 zDl=(RLs^@^!wdp`3bwOo4prC@7sW&R7}nZKK;qZh$(&l@@x~Qe@`6^N8z^SA=Y!RD zf?VQ3eiQ~91wir!8<#%Dc>CIXD^&zQv~q=9V3YVDz+-ZV2ltVYY)1}og#tH_v>erL zR1->P@h8iGHFzBw3gzosSGS~+vGCws0sR+wSQmBIaVH+hlS$3ot`09>#~@Y9~dPPaPkUoH++S-8bZ~wL=a|O(0C8DE zt8%0g?tINChtU-Y)}Bu5-~$zuim#;K!oG3`nm<3&E=TjVa3bk0H|#h~ir*P6yNScv za0EQ&x_Df_9?5rbnCVoh#0|Z!@SvkNWz70c!${ivEV~ZDRcjS;6*9CHJJmEf=yZt{oh*8gJPLG8%J4 zF(}ymc=c#uSJkQ|CZ?5UuwRbTalHCzp?CzpIK6{&SmR}e#S@R|bxLMX#MYb^+c;YA zMb*nV?}gb-ndu{Xgpf?U{-58q6Pu_3r@m<(R3pAlfYdzJty-ld1UH2iY?z3B!q>pG zP&|TvJG~Q~sDWYM;x@PXMf(tYMp{hYwV=sEAdU8c8kmxa*Z;HAJD_11KY@NG)6?Wj zWu*!0EG?!=T5PjSHGwIac>O=E?SP@>0``<7PMkD{#fUDTmHJZ|=qBwDvs}b8KojgA z_#j^6Pe#}6gfLF>#|W&9T$+$ob@n1AU3l)Z%r2mEgPR-9)sn+oRW!sCW)zR~JJ=)x z^~-pZ%&RWzHI1C9sKCy+24km2CkY-zb!ZelCWClrKN{V*1Im~Sl1XmdGHPluuRP0C z)M&FBjHiSoLD2F)U5zKqDIV+(N2@!2fYtAF#?~FOh&$#SdgN$R8Uh&0b0%G4%Gk@u z6aX9Dty9JnW9Aj{V17{8@c|2e#HyorHgj@=y(Ei38#){!nd9s z!E&K8_#Lc*qOGm^gW25B16TwdIxlBmJJe}sTo4cC+t}xD0t&y+k+z#1ZB4^e7{Z`~ zlfFo^I_uZ~cuWrQ;J$@@4hO*T`yA!E+|iVK5-OD)z{n$1ORPAh3&$Kuy3_0?+xs!3 z_Mgz<$~%YL;z56NblZ*{pm{c{X0{S+>xVg&94iDhCN7{|b}_Bi2{E5Mvv|ngsO;E) zm>&z=3O(Z)CMvQXL5!&m;XWqZMP%RO?BC+`ef`cIEA;V4J*p9_-l4A6nr33v#h43% zVOAd|Ht@P?k`ZA_BwqX1PVZQto!`IiGaXmFQqHtoSaskOI1&yeWCjO~+*2~~`oBun z|Ch|YVs3kHdu7YG`P9v&jr95t)?;fQS-WEO*()Dexpw(k%jYkZ=+9HXpvsFsUCb~1 zcp*9enRyv*`d|9NYmuBL;a`hPxa4&Nhly|*Yio?3NH`E(O{4Q2-Upaj0x92~;7O8g^Q%49t|=W1Jxt4`bu> zP7f&feipMj;OEyhl`vbE!?ujXHzBfu$#f89Pe3MK|N31!lMxy7vN)5-z|>LmLyw#! zNhn!hPp3@O!L(33g0;JLNI*v3@2y>FX1pP3z}JaDyNsmqNHc+8S|}dD>RmhS2?UKn zu%6f0nu-*82G~X;2ilorhKzL+2&RSN5v+_-J1t@W9y8bIZ90|H+;Ll~R`5FDcg8g9 ztO0l;m>+9ZXC07Ig>r%TkK#ldX*qw1ZxLV01^9Q65RUu?TgMTL+q(hfV2H z?uVHBIm{Qi~;O3v($S~D++hqDOt528AbEz50>-V&>HG!AbSWEuFK(P?tnh)987 z7H29?lu10o`H^dHs#HF@@}SuFcY0i{{*?EnwDFwSDT2=YT+S5Pb(1~rE+i|CZ&E?buBOW6Wr zawQ1_%qHagjNvS`Y&zLY7pm~bWCupJdQX~9G|llm*Z)VDL=@z+j^tN=7w^N z>ll)~@X{f!{>}7Za5Jxo2lPLfvmy@Wc+Q&EMg}g2&aF~l9!B~MdxRTC<$XM4B;o6d zoLCjOA|A}2?%YAR%<&S(WhgYO9yL>SmVtxx4LP@WTSI4MSE~Xd@!J0zZkmXiId;=* z*$XaLAYpX7EzpDU6bG;Ef_)F3RQqk|M47}x{3G^25Jz*o2hx<5@@`$ntxu8~!gvc4 z9^2g{X$E_%ldyy@h==lr(XBfOsX6AK_Ss^+$RMQd;Xoj%tXZb^B#fZ!Foxif1R?%C zr_ACJ|7N7$$)NHE18(H)>2DWT05Qa5utP2UnBlulw2T?&UU_-fL542?} zcx|S}!g( z%h#4yf3^Dc)eo<}Y4v%lk6o>;##c>aKEE@YjWM4ewegFMFN4qT?>3$TKELutWaGh9 zf-*0@p1O^?m|9%?`Qn!r-@h1MeAeQl7K;n-UVPBvjf5`wPprEMK@hzx1>1pKf1wkd=_`&A)i*8B32`$}a_$?!R>1(mm)uEPavwKK&{B z9rVknZ!W!eewR+tPFh7@Nqv-hGxY-M3{|IBsb6p0XXE_!|5^X>`sdc)z5eR;r>@_* z&a8Xab?eu#OoZQCy><1X)y0*cuY76c{a`-)!`An~eE80-S8hFdYp|8xa&Kw2uG(7P z{Ox>u{^94aK{CbJpw!8zpH53PQtGSIQiX#0M**pvdWV2iM!j7?Dy9BmiXlQNquw^1 z6%0Oa6_9GFw+Kj;)SCsQ3hM6#q;l#_0#X_EMgggm`nzekQtA!US;1)YdI71HdYyn& zLH(_OR8GBCKq{kNBOsMhubu)1CY4uBWmSN|=am9dE%gcksg!#8^w(;smrZBYYN?kB zNR`w}1f&Y;#R5_}^&$bOjC!GfR7$;I8kmN9{&ZH5*F1Mhs**~nUr*DnsHD_1#fuU( zHcf=0)M=?{A{3=gP5p8T7$8jZtEi-MYMQr21%{?+-WH`!Mg3x`5K5hr`niBqLH(P6 zR8IYD8kmOq-jq3f{RMcyKN672sUHeRWz-J@q*Chp(^4?leOExLrM@E|Ra4&< zkgBL}2}qUHHwB~$>Kg)5IrVh`sf_yCRP87g)cdBh>ZH_9rkfKu)_y#lSEZpoEg+Rs zpAwMDsDBZVN~upy15;9;n9ho(_i+KKmim~0R6~7KK&qxbA|O>!9~O`*sSgQA71Tcq zNafTA1*9_S0|HVhHO0hfRAPL4?{r>;mU@qXR73rffK*MrTR^I!-X$PaQt#aS?OgX9 z-mZV4tW#K23N5`f)c_PS>hV)q6&O$cMnEd19zFd9QtB~NS>>QWdz64wOWh?Pl~Ior zkV>i3Q_AFOYBZe{WM_8@NVU{ZK&qhz0#YT_7mzBbo`6(Nbp@m{sv{tkQtfFex>r*` zs-+rJQg|-Yw18AfQ&W|rQqU{YLODH6jHZ(5==teym1*heAzUSsQ-2o7E2I8LKq{sF zGz~#UPqVP8Fx8o+KvPMz)HDT}N~)%QKdnrvqNeH2R8l4NJAu3kYMKO1fuZ&}Q+X8_ zte-6)l~d0WkjkiM3P`2YGp4FRp`@NSEmTlXpS~XizE2g9YN@9PNEOtR1*CH7Ndi(C z^+W-wlzPH6Fgf+K>8zMe?+Hk?)UJS3LG1`g<D@fK*C7c5V*l+yDP_@*0?W zl1er8m8rT_Vu1d#fK*F;NkFQhz9=A7P+t&`%Bjx_NM+Q&3P`2Y=ceJRsLxJk#Ss4) zV*kH%t~|G$+4`p~@8(N3zPGWu{^a$G*P^RmT8*xJZ6&_^n&r)nfFbqXLKZkoa@Q@eW#vSgPvQHmdn_6>4Q9@ib$zupOO2JhU4JyXONL z?|RL|b0J$qRY}2=r+_gC3APQKLglM#S|VQe4WoPQo|^Dm3(1;>e!Q)3cPvJQ0>3lN zD#Q?)2W7!=8N?&IZgl=G2o%PLGBWa^$`MrHfn|(16Ne*l!ePo0PX&iDkGn1&*OeoB z_dGlvC#+|2%RAp59C_3XhN;Px9En)%0#`+Y;fQK2rWr7 zJXOY3baV#s(5^upfqG$FN3m+t)N-W3oMHzoG%Hv~*g9g524cItT_`7Wr2Yiu;(=V< z+9gyA{HAL);K<{&e27t~p^G#kxdf4T__%QgKZ@6S@80evwDO!6gGR-yX?hiPKl%&y z_>rKs-b|j=dr%-=^Hr5y!kfT5*R|vxkHKZE6yOS|fSm(LV%-mtH}SW4eUj0Ac0rzS zijQuVR40P{9FBvAG)9~a#nDjVPMS=o;gty9H132W(>jN&;?Z7&9z!S>_#P9?mdZ(s z!W#gY)6NxKId zXFE^M-%V(rl8M)U$?09fqrmIWSmhRHx#IGcNh3x-XXDWJ*_S}*MF5^e?l&CsmtA}O`EpYjlmq~4_D6!W->rUc?O z-)j`vohKeNo1;zcnMM7oh_+Dl7$UIY!uUMvh{9RdxXIWknL>`7Kk6c|dozcVX?OR2 z@g=**NVhwON^LZ_a_N0TXVKwtYW?t~!2t&(oMbs1)umTJlp!v%%h{r|28fDXIrlrn zgFhePK?zv{{{kdhH*os13PeS;$rNHZpJ0;o@#RXp5Nr5(cPz(-88nyZeOU&@5T z@UBGEHYE0(Bm=*(@t@+g-E(yH4xwq_;}@m}p&sLiC3Ep6z8`jTL}i0#340C>eTH?; z6re^pSvK)7&l_E|13HIO{IM3tu$hmjJX*io4X0Q9&KL|QoM4a1As*W@S^r-+mzdjT zw%)pR;bvjuvm4C%SJ&NO05Gf$R^GDwKg-uHW$61-PhR}PVs7Dcu+Gbo{RBUw(C#f{ zKsigFVvr{4<$w;(*G8;c*=1|FkgMWYg`~>V>To`)5I?9CoGUn27Vdl-0$`4p0Gyvx zCDpo{w~Mc_`;PRxgmHj(ckxFQ3Z1^$H)}1xq$3HA)W?_L;LK6fUE&Mz;8Aq&X z9_?+?a-~#|n+wqril8NF#=vsY$8)#t7hkjojn3O8>;`RFZOCqEOBb!cZwE32^{%cwHFN?2FzpWImk3 zL3br4KuD5cItk}%j=mW27$)lM0KSuD6c6=&kG^jAIx@aJbo5YeVqvjpo#}dCZAoK= zfr<94@EgJtrUSv`noO%+XeJ4BxP+T@oOMxd^D+JQCszMUdc@b1dh~!@LbAZq8M$pi zt9y{kw8%yj!oVXPJpr4p4KeqKFMw_o-o54k2W{P&)64r6PspFyODYTk_L9g5oeJBh5VoV!#KxPb+r*dR zwvl<45Jj9m%?%#@tg+i}#WF^97Fb9zW;Kc9$|34L@dZ(pb|okWKjm+PE4jAGt~3tH zD1(wDiI1;h{!j7Rl&~QYN(p{0?Q;&Ya!aX`vXe)MeI>*pai4v{0<-;NbBG707_IIS znhE}(YE{{n>ZQh>rdJ0rIY|?7`X(CU>?`8I$Vbb&gjj+<*Kbhuf?7)_;Z~TS4*Llt zVhPWsc@T^61@Ta1g-rso)S)R2sz8BJ2J!B3@UPiE`axX{zNeSeRB-rJL4Ie94()M306Ug|jP{=Pq#FTjw7ZZhl0 zAaB%T$EtlJ=!_yvWfhP1dUP|w?!b35W7X9e7SnNSwFIbmWs@U>hpe*)7c|G_5D)Ga z?1f(haQt3)xngTtozY&x>wXHvG-MRVwP2uEdP(mGE(i5*!nzuNH$W4pj`!GL%mUnDnXJ2 zOW1(Je!$uJvf$ZU!XA09`NdaQY;@Z$qV$g=YE(j=ayw~us}ebYz)B8I3_Ng*X>7M; z`Zyv=&Tb?-h$qT2dT|4SCgSK940xnj1aBUbv9x&ws zqO%sN>2ik)r-tnr_+XqYmw1qo&Mt}N&$Fz@8GBuBR%$wqJ~U(DhutC`BO*y3{w!W^ zcyy252V-33w+q^)puy9ZD!sin+*G|r>1ipONf07nA!^8;Ka zktxY)fo8IiCa$(59f9iLID8Iy#RCqGZrUZG`}tjJCL8nzvc-N4>?}&m$&n6hCRM<< z#O?bDROv~xiiaD(f|LaH=NF`9Ss|qLM&gD9wmvXPK$=m%Me&U;*qtN` z2-muif-J0SsNFzAp2y_&_+)cIEFR28j=3%#m={}7_eCA^TTw=ZAu%w;%((_eB+S^5 zX4G*Dyasi4;IATB+le!Zhw2#xcXeccV$6`_Hyf?tpj?(7kkNt+W3$Gw6TMvT&fVgR z|Vh+u@%TL4;E##d7M@5atvUZULcq z1g6?9SPjNuK%?2XA?9#O%RSO*$hbiU4no4n*238j;x!sao4bUjfDg~sv}M~aYdCcDXI~Q!$UxTr7tg(6Zo9Gd+bzrHOE=dx;_Gi;zhUjE ztN*q7@Rg6R1ef2peC5&({Uh2!y^xw)94&lmfu6VEmjC@9%oRzDc7AWKUM)+_)k05c zf)y3|IU?Qr#w=|QDaZWmzJ<6RF=m`^;=5~cto zIz2xHC_4Imf48WtRU=aYr698LMOHkv zNL!(rEDtL6yrhay*sYV~5f89{ISPW^kLM`)W;YY^4l-RMdMyIsA_)SlC(DSxcg$t+ zu=1!k64{=Au=QT2>5#Y4)rcl{XA_?=vvC*s!R`Y~C=Zd77F2irMdUqvjo zasgYZhd+x~`*5sHNx*u3BUi6#**ZpPQq%E32}Ux+0-n@-XcRl@s(4Tt%veZddw#~^ z&Dle}xW|`BWAuVW66pY_v*wQdLE-4@;(?_BjD*1FfhD6lQ?jl!hT0eq5RevW3RoRe zD>!0i3W$My%ysd=QWyvjD1ST<3>pQCT@mXm>}4oLk3*c=$;U`)i~wuHnUBSF)MfFo zlB4xq5+$FH$m!ObqkeUBC@UKQ3H=PgYo}mwZV$6BiHCE?=!#uL${$DM%p`}+h7yMi z4a5qC-~DKZXE)mUeUJT>1uS`fmYk;l6@^$m62xbMsTK}BQJ}G^-vh^NIZPr zco*vVn55h1w5m*igb_punkCd2sktLo6DP?f9^^w{{~BZe6;0>qcKQ!Enr z=4K&2G(Mg@uXwc=#hUHAD$*UXK-MXa0n6_(o-m_$sE-IDX?wKI70GH=MO>abC>u+ zoF18W5kveGzeQX&TN!h=r1Ph+{=wis%X_}bw41fF>oazD_3THn_lYk@51un57&-4b zW2$sJGH0V7Npt{)6lB&5>DZEpyHR{m?u0Fg1TE)nNhbLqUybEVjR1~U!rL5)-R$O8 z#)n>7v#*HVoRb~jCCua}Q5=Z3gk$fcAgGre8` z6DTa?CVkE(*TbZK4qCLx^flSRbFEciR3>Jw8iHi)A5Q-ZeUJE(R&cg7MF#Wn+0vS{ z6-hbr>Oc>Z6!3u}37BDyD%GLZd-v`aU$pM1u$v@ByK;0T_Ye!pLcfq|D1t6*^nyX+U!hrcH@zK}C18c$mAB^W?|Nl&`+$n;Rq@}_PK!cgE zhIoh^?&YY-@dWso4C0|R*VcYB_nG;3&8>ZJ?Q?7IU-==<{l9qaNo%JU4!rJZg z?^?I7)Ycqpy2Z@q8`f^ve9zj2E05Y#uPv?qcJ=$K|GN5t)xTeT$?B6=AGvT9P7J(k z<5vs+vv7}f?SgUT3kyGAeaNbF^}ee&u3oedT3ufG-O5{59=0f1aj)Ee<)($NZ+vIv zlJ(O3FIHBU|7-b2%U@jn(B^RYt;;W8e%j*pqG5ToTwi|pvS;}L%Qr7yy6}nRwWZ%L z{dnn1OCMf(+tMqRp1$yGs!gS-0Hvp- z)RolM;-5A@z4&j4br{@y!Q#gk|8em(i_czs+`^ef+1A3!Q&;|Z`f72UFI zskW}!jBQ#s&tK>+ymqm(@m}yIyl~?Q8+UFLH{u(%4b8@N8y9R)>%U(A?)qof-?#q8 z^%t!_@g9p;FPO7!yH^vmWFqVq3@ZvbmGY3!mW?R1KV}8(jLg<|CzPeMV#o>_R&T*l zvxR&;dG+A8H0427Q16#R@}5>~D#{q6_Ft zTDhyFt6ujURv>L?`#q~k5o%x6WN)cP9SxbLSMe65pXF`|S9OJkKJV0@_XsveBQ5hZ z^fpzlEOoGgVldrnG}V!!^S1wF1)1tVsYni5mDFv&Vg<=urWj%3a)sfxpR$64Hqw^& zWLjPNw(qinyrpGROBL!&{WcDICTJ@piaDRfb(@jout;0MEYoQz4bsb=$=*`P7b4k+ zJ7}-ob_**Q*qeq>zcY|aZ{@xtBA4bP0i!LIyY(sTcjy>tuG3Q_bkTJ;_ocyDG}x_~ zDy>^a>~{AX*{f?lW;GzZgxisAeiCkRA6m4aqyN^i2I zHTV1lb+%uK_(RwKnag2TsS7z>-IKmC&kDLZX+09C=jHhuAHWG@gQncV*p2>+?#T)| z1#2;xaEFYsD=*^&4xh*3R=X?uOa90StZ8e-*a)Ze_xS}YXt#5Th`JbTX)gVHPEeD2 zqds#nWVv~d6KJz#r6Ch)1#h{X6R1Fu6}P8*j?Hhdf>zzqbo(nkN9x8;ae_)(p0PAc z*6IacWChJw(C+LF(pBv|r={sEI(@@z%Qv|9x40a-bS7kmHLE$UsfmcO|52;>vMIR+NaI>RHo7uT;s1BB4JZX z--|G7Cia$^yW0=<0(w>I;;(Z8XGb5h*<4!HsoOY#A>Mc9Nz)ZQCRLcrE9x z-S`Dg&}cjSTD?j$ypBU!>9j43O%|5h7q~`OsrzFEf1r?%UjOy&#jEGd6~DC`Ea#+F z(+2w$6}>5%Gv51vA$y*j#K{?qAyG*u##jyGvPLPl))s>vuX`p?u&D*pj1^h3ITs3qrCVdoS>j-C4mGu9*rn+x07l>~|C$s+KCz zk9vdm{un2)M>6V=BAgjsRp12HdeQ9YWn8B9Gn_zQY!p*wr^&ahWCexRFlnY`T-O#;*4+(r;{0p4 z966;lVh`!s9tnpum+3`~o_^fYzwjPhj+B&7JdqN;||snW|MOI-1DL6^6Z zkPbERt5(?@jJvAVNxk)W{t~VMWy4G6jpsE6}tAT>@684tTdG@ zbyf4`&v62`LZOY?3!cEWTn`H?9aXKf6qdVh;remZIW$`wShz}W{yn+HBJDYH*}*vm~tdxrzHyyCd!nD!caBjj!Tv>9^fl#uH>J*RbDVPKHh8u2knN zDb;tew*)=raMl%4JB&BHhHa+lil(i|#}k7jH=3qZjbvKxj`_`3aXl`Tts9*xg+DU9 z;3w=?q~sn)A*yZ}^4GG1xH;L)nd8+&tEW75Up7aw#+cJVCakb8a>$d#a6w-U+e+<= z88%1U7mB&Md1>~R zXuGKnhmy{s;gb9B3)IF^uTn`RFVJuTxF2d#9dD<(a3d$Ebrk7vS{-%LT&s*0EyYYp zX|xPhx$Y8;>-)`8+MV;B{|D|Cd7+_p#G%6}%@Ov>DoJg~U=3WrJ%x})uL$=1ZDr{E0GlJ&Ef`(dgfr-)xm$vDZK>i8nUcv( zZWIeLO6^b^%vVa6$GKaQOsw6M?Xo!n znv7Dd3@V0$D=y~*Di5PggR-)4*(){|=S+9kh{b+sBEqyfesc@QY#zl5LNSjlZS)0w zejWR;E%LChnhnN0s)ml6Yh~jNov&@NhB`X-$ypTjNX6Tgs;Ua@f0FO8nB~T7#$)bV zd=v}aVv1Wk8AmhaXsBMm<}i7jYE3+gNy_>>Cr|~Xm9RRcE8U0fau#D(=FIEM^_FS- z1~!M$6U-RfzJ|`S^=?k!h-g&`cQU5B@-v*k+6cN@J?k)Y;T@d7l+>A=O-D6-O^*}E z$g4rsN)PY-Mpj@Ls$Bj=u|2G5-_Hrs%CgVXYDkm!_-9TKV+s|m$?2+WeuxuT0`^?M zkh5iJc3NaHXa_}etrRQ;Bm)q^D|&B|1ut-l5kd*zbr2V~M=Um{!WwPvCAb zsj96?+TgHU`+82GP*wujfTHTVl&wN@NZvJi4J~)kq2~H+uBEA)y1G_0slH+JKLl`? z2VJ+#VF?9>G8Ok~h=eOHRY4UUC{$e*M8Tqr8@dE-wdC;c%!P?I=FR3bdWJ%aAYG3iV4>oS-Vp z*Sq?XvwHzM<+W&CE=|R2tU5cFKZwg=2$kBdcFh&qWG7A*O+z}=b^MB+ci~xV4o%VM z8#e2zVDvI}reM*eknLe z+uG%;FJHZJ#+FKO)| zsP{NFZl~SuDs0+(qvU}SIY|=t0G8W!leh{V{3u@Qi#vNHI5+QCYK@t@_NuN^Es!T7 zBS~Ve5`!_X_P}THdS5iyBaydxZy~oq-btV*GbufEN=cH~TL|VnQPGDa;&s1pB-uk4 z?Nhw>SFBj6^j(N8&fh~o?QvWtr&?xl%8Z?o3TiQC%%bb)CUb>q^0@2b zaXo8v&pm|PKE=CzcAfsHub9^;2L>bDjfuDMI9SDG59@ZyUBEi>vUpTa87=P3<00J- zKUaedIOR1k8d*GCiKd_veF`UZBLu;r&Lk)n5967m3-(CpY~D*e9x?h8@whVHCpCj! zH1mWmUp=$B4|`oauxHeENmT6Xuji^K+vpDC?%XP#|9O(|Wrk$ThDyRCA^HUK^jRdadAHUhJ(5h7pzZNck@OdXL?}B|J)npK1@wn^a zaXk+7F?XU$c#54=qv$OLr9Nqy;6m>pA(&YVhq{NbTs)8`!>~655I(S%W6*^gvCD6* z5+LXwvx6w}RWz%EaCImi+LPcNG5|E*J0!2t*~+^3(5LPLmYO7qo@an)Cktib7B+rx zGp~sU^u*DnyL|u(2Dv^PQ>QfkMAc<4RRKmt5*GyRmKvGrOB$VIrb$ABPvSZ*i+FfX z0KDD=yjI_@t?BGeMa=kAGZy2v|#JWbp6t#-Lwq*&TqP6)j6MQE<;;ML1JEQsC7C`BAT!*N2o!Ur3 zZ))di07QmYkbM;Db%82F8*Ng)3ATPeDR5ky~Wg`dr`Cf)9uf1zi0b3+fUzq$lI_ z`s3CQwm!Y}k6SO_dJ-(%nJw>@ZtLo;&CTC!erNL&n{V5E@#gMkYx7~7woUowWt&SI z|FQA4jSp?SapSogf3s29h;HaNZrZrl#@zZ(*FV4h-u2h6KYji5dT!mne!ul=*SFVx z5C4Qut-WLIWou7Z>#p4ae+1>)6>F=jzghj}>PJ`Ky!yh`Gpmi&+gHu2x2;~hy14T5 zl`pS+VCD5I&surZN^vE$^1ziFR!%Md30?-DU4GZ{E0>?VJXlV{w?Mmm@8yl9|6Ka^ z(#MzHy7Z!@ou$^&Lzk>evZYIxXmB2Wh5jJ@2Kw3bqvRROl@zHEwjQ!S;hni8tC^rchxt28?LVgad^zDPi-p)VAWD(QO(NEP%20#Z4B zzJOFlpAwKt>3dEWLPK9NEmYIzO$$}@J*K}@siU_9q*{7YK&qfO1f+6$T|g?M*94?e zdUYC@lHQ)ms+Gy<7Yaya^a})}Qu_H*U#peTFPqLP)zQxtkV@(2On-rte%@48jZQ~T zQzdJ3T6&r)S)tkJ3HX-;B|PDxLbC2MpFdYUX*qm$FqWXT$xjGiV- z*65`46Q>G{ra#RMt5dYUX*qgBzlAb0@)@T*7r@rCrp0<3OvoYuF+`eX?k~!MnzB4yK6K`dYax{qfyYO z1+>ZOM+it|^fbS_MkA$%(}mE`kDmSlwU+J+NHug%K&qm<0#YU25s)hAX?k~!T28kF z^2+FG(svC;-Ntkw)bwEb3sgF~CLq<)RRO7rt_Vn#bXh>Epi2T$Ib9Tx%IJcCR7&Tk z3!$Rx(^)Z=W(A}&nh}sn>CE)kD(T#`P(i1s@0aW7q<~aQ-ytAX(GM4pD(Qy_NEP%$ z1*CHNAp%kveY=2EN++fZA*WN*S!FspCLq<)Q30ujjtEHAbXY*DqC)~wB^?xyD(HZK zR8IQ^q%ztkAeGYI=>p5>_;gmhecS?48SN5~N@?fx*Gg&6R8}?KNp=CLmbM8<)wESW zs-i6dQYCE`kSb`CfK*N!1*9_CARv{}`l+I+b+ltTt5!!pNIg!T3RO{)zDf2shZXZNL932K&qrw0#XI76p+ekg@9B>%LSxTS~gu^ z4Sm09p_-OX3sv-O(?TVE>$E0?j=otys-OhMl= zofV_wwE|KZeT{%rN?$$wwQ~BpX`zh1_w@bf(-HxxmcCLzDyOdykjm)GiT(f5xi`&i zKV<7ATWgz7*xcH9%Em?Oci}X^#jEX=r!42<2IQLT`ZBnhUQwKnX|6Mu`}ANi*{_XtUvLc#6P zv;qTT)>lv3aAr#l1051M($=gb+c=2@^FR1|rbObkzq_?Z*wA$_m8yKZ9J-&d5?{Oy{lT8tXisN-3tI+kb?Fpj=19@jsN z=)G%E9sIU`$y0Htqj`_dTY^#@Ns_vJUA%pe_#|{(fs)KxgL?T5r}`Z4$Tb*c{@qy$yz45NwSNyNPti zX3j;O%81d3z-S14CTzT_GgZ=;j=U@$)f@5P2wfKc;F3~lqUH)q-8MUPq7B1DbGhCeb>N)bdcwlcC>=6bn-q|Kt^R#3} ztus-q0~5v`*bxl1%zzk$cqE4;;&s2dvquQCcn2d()T@eVt>&+A!|yQ)d1pzC?T(UpcyJkC1EePF>}8psEVH|m`HtfNp4+ou*W{eQCs{EYtiwFMt z(T#f-0yrObhEbNKekNOUM`2RakOrjL502Lw$0C>o`Gh&egMA&w;d=orKMrT)(V9#) zw05&G0EN{V2Y58&&WZnPe22bcCyQlg+^~ zm&K!c#Ynq%51?u^xVM25hgQN-N2?$98C7r^nIs3AL`7UkI+#S&K`S}=LOAz3#AAOs zoOic@oge3I>Poj>bT+GlD7=R8J7WfV$cy|0xx{090k{57&22}wUbZ#AdDX_l*Wa~% z_1X*8E?a&4%73k-mw&RHTl(Eng8nqEqCSN6|I-)#d*QnIzng#X+~?*}Ct3bi_6X4* zKf7`1opyJvV-K5DMl}L!AxVs2w5}DfbUypH_!51&v`6^)cs|;JwdynFWX4*5fbYi) z67j7N=!N){p8Zq2wl9_T2(=!sEvYutDpj?~>MY>vF=u3>PBp6x(FQM)8u?Sawl8+} zCQ0(5QkSFcuZ4=5F1{W!MJ^^(u~Q{s4v9)OvK0SWyxuR20(%c8v$8S4l&9zG)Z*1Z z#Njt05<3F13$LbxXJw#4tYXyQr(<{PZtuWP7^u^o|PxgRXMDm(9Z?M;$eKYvPanP_#vjMx7wq1#62KG3Sv7U z;W@GhCjS<%?=z!&?cEOpJMZ?{aVaywl)7GaH;jn(k3jyyogr0DW(dpPaT&xT`{&W} z9wDvcNuTu!Y1!Q_H8Kc+qsGz#Nn+qo9BRxnE{KQnsnNxIIzZv~hH~=0D_^L{ohCJ4 zpc&6xK%A|nS?zZ}hj?)RQrXi^w3t-WBJ(ivjE!tFV2yx;7L!a9-qVS{#q0azU3(hn z<97@T`eeXea(Hl<6yHzkL(R5OO!U(j6cHeetn~$i;t_nJw?~-UcrWteu%=Tvo#8?b zJr%K$kobmyfMQ@RJS-5e`Qtbrq=IVR`7&lK4H`;)L+T*CMM=^GD|!zzT-N1x+*gjc zDjw9wM%#OYFpcL;C=3f~g|ey(v@!N$frE6G9eo6xDH%tn5zV|N9?(Zl?-5=zK4e}^-b}Xw?u<>J1r`kMSPhwQ-0tAh znv#jv|6#mcWB|awUAk$xsnd$|MOJzdH26UeEHrvx_s|ubTXdd z#@(n-)t-#3!&-2{L%?>Wg1z+W%VsI+$niN|@>=qj#rrseH+*=n(9Jq@Eqt|e(k>j14JSTl&dfa|Da zr-&s-AvO;3jy)7t^)L2K;vd#;uree8F8P&VBB!dDt5R9pEJHz6B<;7V!)A~)PEr;2 z%LFQ~lV%hT_1Aaqk%*W4KCV|Tx0Zr3c~RbjawSO;eHu|~iQ5Fr(o z?_L|zfpR+&&Px%jS|eAGB=OcKRUh~)UhjXL-Xk=S{EVsVF*hT=U{b-fp;Jzh#9Ic- zAP%Mu#>JkJiP!({y}jF^pP%HHm8x2!TZu9TD|C}Kf-R_ICzF&gjSkrXJ1h{d`IntN zLcGY=_^=Ct~KFL@ogj+5-|Q8e2)r? z#l!eFSeK%J!OvWqKAo!(b7jIF4)w=R zNN{OL;;M%b5?2m=6tDHCtv$kl$ZIu*GcmIz(N3poP@yJ?#HnCXOc`9mhdzqe`V+JT z!feR5g{)VT&i6ezT_y${7_?>z5%JEu$DJuK_8uvk2dAK$r0hz$7wIc3YaQ}u}5 zJ*)x&24oOWd(-Jcoi&q}YcMWNi^OaH(O{3T6!LBzB}3S))Al3ANET`^AcKM0muwao zVx!+zen=u-_YVhq{t4YFsZHxpd;Kks8+tJ)BUV6&so>b>S>1;u;&uO^x95Xyen9qA zoZUuMXJ?Wr=q1CGOk!!);8QU!_CbMo&EJO^oG=gaX7E5#?QQ2>s+x>cIT?mv8(^DV zr!rn=k*aU8bE0uW#AM;5ImLth9z0S!7{$kXg>ADkKJ*R}Y19$0&T__r0k}}jkqOOl zImBc8=4f?~5EAP3+zhjl%Qh-K#2bu9p%!B~T(jK!I1UZxv#y8-^PSUsgoTiwV7MGs zTXw)iI$1Apkh&u7sO)QYqH3mO;`M)fG`|Pl!SR{pY&cO<4-mOEWq@+>r1(~a7Ciw$ zKq?-@w?^0Ofm-kszqs-g{mp@2*|b*OFnQs3#yg)G?4P7&9Vt$lPdv`g-?c{w1^G?i zysDh<=Ynx2pM!3KQztPGn1gLbNGKk`H?UwJSP(kL;ZSTk1z;cwZD$5CtFoUHB5TUCZNPF8>qRw%~SzfTl`<*b$tyxtrjTbcUlMi zNI%#2mTKAnz8>2O;Kp(#)6D{w8KwB;3A<>_yAm;;GkKESPI<%R)Azo z$B^wh%PvheaD`}&PL@q{`ROfeP$Epqc!M(0a{66uN5LKl8DW@#2}XGRaCURAP%ht+ zVY2Yh0;gaB-rk~a5?=ypq~9ZPRd{--zO&|3X?!i)|6%Vvz$3Y;v|*`RRSGS&JRXnJ zILIE`6Fi|(cXf|V=$vzI$L{K!bFz(Tvm~p@VPVNRn_!YjOJ-q#1(Soxc!4D>3kxhu z_)k@-q?WpRB$eU${_lCdd8THhw@%f4@2wloz4zR6ywD}X);wHO+W5KiAmJ(LnOKGv z*&S<4dRV6I-Jm{gYr3%-^%7$2RPrWCdkfM1n>uyDuEA%mUscdq1bY=GQg3=D_ z=A63~utO_@F1PJh>8UO??`6HH2&sC)RHj`uX`DK?6hKLb^>WUOijeB~uhLUpEZ)mH zM-gmTs;*SRlA*%BQVdcg*$Yh4xuAhtKT1z+p?ojv^+edLx8gKbE@K#GvqDOsj>GX0 z-A3HMv7e=X4jpM#WGe zGTCswlZvxhgKiHF7Fg4X)X6ni2IAEbZo72~E}aN6Ox;^!_bm<&5A%v^pjYW?@kT76 zEgE3!3O0Pt)wRLll`4#Yu(ih7Z1A&!M!EzWkkHRT989JK8(h#D{wA-HoX@%c9bR-V z8`D#;#i&zmOqXHQx_Aw^fqD*s-8pxLTY1^8aqT7`nHnM=p1QXJ)Pw*^#bPc_l=_9X z1LoXdXb;z#w**EzTnV>JiN;#K(y5j@Y0#WoJ6Y~oRytuB7^brkI|YNq+JM$4(%OpI z4(q01Z3)+!j&+a3aB9f*#q&fqQOSaivNtK|Bxk$#vVl4UUCF4<=j~mr<|)9u7OX1a zf;CP!0hmwmy3$TSddf51dy8W!m(&iO&YT4cJXkCOXRL6od7;4wI^zT&Ipw*(!W^^! zNegq(o;_9W+CoXEHU+6b&jRi<4eSzswUz@V5vIgIf>T$g-jPn`FL&L`hO-prpovhR z9<9e!o&XF|;4u>}D27%W7Lq_+FzM<48Rno6igI%fnlF1`d9~>=c0u6*w}fzU zMrW;DpS3F8q#%MyC-JA@)%QXi$%BG=Yt(7_2K%5ugyROVX#tZK@y-=|+Hu?O8|AVm zG3hLS4;GFYC@NufJYw?d0ucAm8|eT==p4blwr-r!j!x&Cx24niBN*SLftFx=V+k3s zV7z3t5ikgYD`&W1NhQ@Tl@jc{U}u?4zbT#4|9}F@#)lN9gaKUBN>)f`iB*EY%QIZ8 z^=>QO6Js>>o^(QgfC|QpRj{xz&zQ_qxZs6P2c69{tAic2eotc3S^n;x3+{zjj|Yd2 zp<`ot3~ywE*1nNwgO&k3)3n3D&8^*_lWW_zC%2C)yKKr%X=i_v*Gn&#U%>u<0;-d+ zL}jA9iIP6oE7{l`NN9L)R9SF1xP6~_M+@AWoOGi9&CdT1&D=J#T2wx$JihYy9`7=Da4o4t17oc1^#@{eU1HQ7; z0Dhy`Yb}t5Snnxzuz=+jk*&IBF%SCE9t9xprOF$24zAA@sjjG?(4IE|I zO9W$nxOOGGVVOEsg?Dbn?=aH-d%RS7AzVH5tgouFlk9i%bLaMvZFM48rU;n}+!>=PrXi?F!ATk%mPEm|Q)g$E9cN zvf-oF=b@Ul+kCc6kssNik zR5RzsFrSkwvnyLLV2qC!I~6u@t+ceYcl8J#m!7Yc;mSH2B}ACC8jZS^Dc@`oeb|zK z(_V0m?Xm5cSxmntozS7->j4`m1WUFLZYt0fjCYGvQaPQCVI_)60Cpqav&j+Gx7!rXf;|teI zwOq*`Zv#mfN!SBZLOcns39;_}#fa`nPCC&8VDtz@+#NtnI0x4wjo{})({{&AKni+#FjnP=wb<<_1{T@3 z(>ljp>7-WK`Ts>T>6z7QmDjD@w0xi9*I@b2EWTyoM+=7eC!qg{7LkXM*xV~27C=Mx zYngxcIkR&hzP~@i!|UKsZZq_U+ha==v+hBmt~O}E9viMTbG1~;Gu$Q!m+fjfv6gKl zQt36D&6e1Mi1aczJ5;P+3-k;IUSrUweZ4^_>kiR6NS9zQFb84PQwB^!Vdrj>>N##n zr=uO-uzn5DX*PK}=?0}qc>69pXagFs;)ZL@mG80JaGY|ab5~p595t@eOXNfsAKH47T88ygzj!4(&^EUTW3Ai2}W7EYAIkXV(MTU zzB809zGkhavasTGvU9cRGEG&eG06nb8Ac~(QM`!7&13VZb+1&BiWa@blT)_ah>&KCv4e8 z^nGu?o`@6z0pP$=hiE*k4$0DnzCM)(C5R0?GyRTqGQ@Cpopo&|gqrE8a8#$C!BBf#Zl=ba3I0@xf4hXN|{IlHzi_Z0g_@XKfdO!!mbbOgEyg5 z10Rv#h*1=kP68XQt{(;x!q!uvr!lp>S*^ANJrkHk!?o?R)Ea4CNvOby{BzxuPU+0> z#`Q~~OA?kD>R5k3k_lb819aHGVp|;DJZK5+*4l;-GY0(6Rx9k*6l;Pe@=%j{=!`G!*~4>oWHs~OG+nubZA*;{rTN}H(za9MANSugfyfD)?UHN9Ijo-CRyJW ztYXjo0KHM83M(lRAC#Vz>xOr%A7I-6KE(OVLKonL#z;oSh+2_twa@l8u z<9=HwWFFb`(zA9A8~^Y5avbLWtEyz;%^32>zBC~sHVm6ZH@^3TZMDSxT_ zDe{K=X1Q5;rE+oQH!BaVd}`(GD=%7k;!1TTzG7TCy>ju2Z21?gDbAOt9cEorv!PD1lDI_W=|~C*u16 zilL^R!~jJ-lf+0ZIuYK-h>;p}BD@cvG^!JMgBqO(xdXB)bRxbFpcFb0-v>|mG%m>~}pc9dF0L9UX5I=xo==GDCz|n~q zMMexG(1{2?fa2&xgdadLbRxnJpy-L6X&JOMI=?ex2CZ6)A|j{;ofAQ6R4#(5QJDy; zLT5!#3Y`%_3FNOLD2DuHG81YPofL&ocz+T>Y2<%JP#pQA2#O*9GntqQ`SYYGMI*l# zLDk6bL{JL(ZxNJ4ek+0!$ZteY4Ee7~VifX+Nm1yx|5F5|kza|RB=SoU6i0p`f?~+e zCn=D~uO~$zh}6$SPz~}^5tK%LB7&-se-}Yj$ipHih5T3qC6OPApak+m5fn#$AcA7Z z_a`$f!@+A=zLmr$=3`4#;A*z9xbzcxcY2@ETPzw3H2udQK6F~{& zvmz*l{ObfU2-^C^Nl~>L`LqbCLjFYrrI1gFpd|815tKkaA%fz_$3;*K`Pd{~HS(EB zQRoRjB7)M$hec2V`DYOnM?N%}mZ1ciKXQWUzZH;JG$@QA}EQxRse7`_kjE_a)a!-vp=3C;eo&NpW#L8tP^zMSZ8ryvIYi3DB^{!GdN`i*P8wmyIaLu zNr1V)wsqoN1*9*T_=l(0!Rh(IY?faOs&%w&s^*Ut`b7g+g@RG27yLNaV6AJzWQS?D z65xBR-CPT9XAIj9`w*7S*a{|*tb=sHB+_M3hiGlH60lc+0qoGgIWJd&JG0Iwd8tTvyH9FV4Op#_e8x0TeTb1_xFHw>Mp1xtP6LcPPe+MOt$J7G!0Rptzxe! zzA!}^;a)|h({&CHuG2tQIEiW2oBg(|U!S#RfGXQ-Z0iYjaNOm#bXpGBlV{z+3w!b& zGM_88aR;5ZLYmOc!b!})$KEi2ZP0Op7%@~j2|JKr9mESHEP;4MV@Y%~emf9={aHAB z>FP7AIlx*5EQaAwFE}0$MWvIl4KH2?hwz&&$U@n+wL0jVy^bC%nZe&RV?L8`uU?X0wRby?YQS*YoB3Ni-uU**f=oR-TFP*prHXB(N z^1^1LH)hkijkSo^3tc1lZiZ{4k+%9Z@H_|h3#r{od7n>6CvU!c9S81$rC6rY(`H?` zD-1^$HQ>S-t~GtTQOvhm&@|wjO10e(1*J1Efh`tzp5L^^%0{DxI&M@Iv@S>q`ZyB2 z&~P?HaO{v9T#juN-|=(ZlTOGuoL@f!goN-S5pN_^j5}(oBHKc^Ys^w|ZJZ5QJ8ha! zZrzYh#Q+K-c$VK(5VM+E+sHT_Y4C5Tfym5oiI^E~rM#aXLaBz{9W6&+ZNfOq#zixG3Y+-=%}S&D)V6zsl;al6}_D!ld8 zEmOO=eThqFtp!APzixGX9be8j2$?t>#0ZvcDHO^bSL*CKl?fVhw^dB>P%sT7* zT?l%RqJm{xq?5A;9Y7s=4ni=K-0bzXOp2$M{r(@4o`pvbkF2wC)&=(#Atv5o{26y6 z4Yqm&Yqbr&ayM0Qo;{r5;9RGtH}%>*ib<#WsNt3CYGW=3 z=l>VZJbPx&WBr9dD9YUg zq!(5WYqTP718SDMAQTQ3jt#Q}0M8lf8SLb*U_< zCtV9wh!`-lUss0IF!ow=31_Ry{d5V6N)(jNATvC+4xW_{3f5SIbfX@qsdI4?s3)M@ zjmHGcm&@%+72>{^@)=kd;m*!)*w@2Iv{y;#TyGs3)>%)?cih4E6#k0MUvzb>39BBG zham-G{cRbko`da)LWK&=g16O z^!s~2I(6or!|QI=h{`wg@!udF?`pfalWDUyxa`UqtcID`whVd*ES-V1Tb4VWHDHb4 zb}aU>Q-yLH=7fn;VCr9G@|<5fzV`&5Pc1kF*-o$BC_X$1M93;YT;m8!*2 z8h{X6;jpzxqLfNkz?tF4-d%<{9E>Q9Y8HH;w@Xm(xPE(2QqoD@2I@KM$yzYzE@9mq zp24docf0+217wf3>`Poa>o8bE+qPLmcha~$VD3~& z8&p(?i3Zo2cf)#qYxUb;B(YP%QlYRGJ~kwPBNdc<*AGfQe>+FSjD!JTQ#7Ts8rZPp0HTlJXOjU zVZUMfW`l%Bq|=YX>XZrS3#(JLgw;hh2LopU4z7SJTDZVL25iOIwV9aV@kpcYL!Uc|Ifq1nE2g{(;Mab?VA)Q=w zh_ACjxP_Q)VO7mxC5_&aISRy}^93)sVhW zeNeF1x6}-+es>VghG0brx`An%1e;y5_&S8-2c_r4H$1b>#t9d8D4CcllO~8>EeRST z_{4<^PTGmBVsF!KH%fmW!qO>+z}L=WfwFK2u4Pn5{FEk-*(^Ypr7h^GB4gpyg5UQu z(lZc*W2%pV3{(~|eo0yX;>^eE*#bA02-_73%SpW@PK z2iW=lB{L7stTvTzQYu&K%imcJC_b(@u=KdaFD()a_bpsL{}lAsXdU@7qMGZ-e=J{< z4P`U4MR?@@r++md)!dB&U!l*qANrRb1@vxo01_Dq^n^s;iK&=s5SPCE=*FvzYREr2JaE6J`BZ) zCc7LYi;LS>RI zPZfKO(--Y!b`_CMZvd)c8t4hCp{=GXFeb)lgrx*6EIGrqK@TQh+|nTLf?&Lf?;;_c zT>q~16mS!~ho>@*pthUVcw8yqMY7jsb8jXZ47X}IiAhht2Zk8nS9#MA!&bBC5@r+K zFS7;1c6s0)uANNq9kEDrIM;3Iw7M`jB!QMNIOxshmK~#lShfU|VANtmcM7AH2&;44 zl}@Sy{RZpBSm-xW_E4i4_XR5L7!ZOH3tYKuj94O+rrwiIs6Cunza54v!BV7ctaLi& zgrytJ8o)s>_~+%f!?%xDVyJWu1#ow88x)G*?!aFPV^}V4h{d1=gZ~z|L|E(?v38e{ zPOu4%`PkUILeMX#*6nHxVwqGJnioX}nK4s$0qhOaPpiUw3!rkD1b`#GQkLlZ;^ z^};qrzYMV!b}EnTs`SQ8mYccmM_4-L8u+hb!~P2XtHRZR)i|*987qvY5MdN9@bV9O zh`?>U45!_aPNxdy4{@L)7>St81t(?fxIBprP=Q_+Jn&c(`9^zAFCprh{c$5>*};e&S^zQgCK32UL_6>1j=>Ewz- z<2pnQJ}9_xsrcwxhHM0iQ5cPY+vI*Hci4VwBaBtPVH1Kg8W&Ex&Js)YNk4b#s55`{~@*W$%??bDx@f_x$f?e?Iq`x#!M3Va2wBK-9p5a&Gx;bKb?9=N>b6 zT6y2>XOxAx%U6Cgw=Dl(^qumbEnYnPfbu2sZ^-`zeYX5POUITUlX_Z<%vV7Odoy&8p=da3?|E2uC@(atyl>aQda#_3RkSXOW zvOmfGLw-iylqcoB1?R#IiyvJ$f&M}9n}ti!e_vQwc*PRB@XVE`DGx2&z3^kj7Zo2? zyjAg1#nTjbE}mWafuguvQp6QDg=X>XilgYO6c;LxrQa^TeDO<5KU{in=_5;TTY4G# z)upE|-L+Iw(n~ij*_X8Q56^#P{^Rra&%bj1S@VxyDb80{zBqsD;^XFB^Eb|4KYuBl zw-|!Qg4<9x`Y7}ydKg_o{s;Lf@-_4m_S5H|CqE)Ha|z2Izcwt3HdGAK)%&IR^cQZOrKEEU1K|O^2Dn*vO zmMj0j0m*Vt6QcXtLF2k>IKbY`*wryxN@det&jEqBwW+E=+{&1Cl>cmM(or=x+oxhY%YfMDHc%7k2Qe^~ZZ9w@14 zTPA9DL=U`=1MCf#rr>usEykfIdR?^*N-U&d<1Ww-J`0M9o1 zZLLLp;8{H2btD}T8`bPys^tJ*GtewBSr1jZ=qDWD%{i)JN5|Tz9g6WluuByEZaiN< zXyE`)tFCJeNZip}{5=P_V^N)!O7{!SIsOs1&RS{UX$tdP#OKAW?YsQ6ITyAn|BZXZ z+0Rw;NqxiQz3i7fkYb2TzG%YZ=e?B!99@QKHJMJQdu5ad>gBeX2xoiL#r&sq6&zqs#M}B}U86TBLp%^mJJVi&pj(^g zzpdTPIFn?=6c}9k9!|n$?06ESA=fTn`4tYZR@JGJw&?SC51;0NLO!BaSIl0k@+KZI zN5Y0dIo7qwzRv?XyoqVBLcTcnbq=t!s-b$tr?)s4_(o_crL3(&uw3e0{A6At>-85x z=}u*E{#SXxZ>iRsjeatQ{tpLiX;H{Gc|hY}YCW}?@yxxJ15720-sklX2D$^^;eaOP zD#og5UBqzp&t_KTM`q29frfFW{2^#poJ1p9x2RHCCRjMZGi`)yB`>WD`QlgeRlA|F zr#zvqHlw1S$vskUr@{e$v}87);hEN3{!*>zY-`ho9ft)cGJH!=y#oAW9)oP@t@&{vwZc22MTGzSzN(MEv`L@Kzp z%mKbsz*C`Ut0AfR8V58rK2?zDn!MfB-*G^xANS`AB~?MEc^n61^;pQ#N|*~xO^*XI zHo6=(*Mb&}W`zUl25?+g(RNziqZtmUb=@Au)X0WxD_`V+dJS5$cIt~ z2u`9>(PveeTCt8F&GA4n6m<4=wYp(du>nxdZjMf8HHz=?K*7dDe7ZrpE#v#3N%cu-xP&bPhFMESsByqi^E?hu=h`%w03-C;1kYjT!YetY~fcWq;)>OqR;kX=eg= zxi9A)$zVN`HJ0n->PM3tkS+`ga1bHm^PJ#QNi%&~<*8Bn%ptyIhYOxyo~aFzx(iQn zkA&l`UX`>niR9Iv>wI1P_MhGkBaCfq?n&RpFOH=h^Em7C?L)Y^iThx&wh`6ep zvL4|_v8Xv_>KXlci+$xh?h(H>?!&Tib)a^JAET^ASI(PhWa6eX{I@NH%Xm-Y&v;U2 zzRW$s6q!geZpmrV6kqw>Iy~s;=^?=BnYVBfwn)oZFFGLn=b6`YK($^sXM^F6vq145 z+u~!$fjiyxR?obclPHEAJ=}sttJIn2b3maUPNphBUr&9;#{uaQ5zHC;et|D;-_jhc`&i!e@CPo{Vb4 zu3*W3{7XDQwA-y>u-0p=K8FV|s+=7}>PFY1j01`pqcdj5!db@&{<{=IriR+C2cu>M z-zOJ?bz9jL3*i2>AM%el;{Gz@PpYcd^GZ!oTQt^FW^a9PK0h`T%F%(}Xz0XDm-4+- zp``a!i|t-hbMgOj?}AUznK`g+pOKSrC1WKW zK>(E#7cKu#OajayT>Y>!h*2kBxbjvp36tGr3za%W62FcwRVNd7_Wi*`+pXejnXS-j zn4+dg$&B+K!fJFzRVkNUAG?+xwye%%r-QZWFrk)n#GHX}yH?2rTXr?CUxZ1O&Fdfy znc^{ulc>7;?XWS`z-wy0O(j%zJf`YdDE~FQ{+Tnjob^<|n^dd$I%LL-rg+v$IlR}r zKxq}ri-pmcVn&U&Si6QV^=ep8(F4NYFVTDrfqp7JFlW^Tl71A&!;8BxQ^nEp+3_Fn zW$O2L-IlPkYsLAxoU_{Fc*>tEVK_fJ*jj3c1Y4+OX13YyrS~8k6Fsld;RI(IZb~v@J3tq$nMciey(FT)Ub}ZJs2qjb#+ zYCMo7;?9UeXA2!z=Ye!k+Y9tn7IJxRN&dc>FV22oX7)R?pObxdZdLYv*&AgqocoOI zDYC9CBMZrlGE(+exdC07`#JI_`CpL#K)#858hJ1BI^_At6Ok6eAbx(Hz3`~jBQVFF zox_#?sr>Hj2NvEr7f^nF;Z@2HD&MSpk@8+dsq8Cr%E(+>X;!M{)|A&Q+@?IJl+FEl z<<~3UTlu$@53Rgq<;5%OD}$B%N_54tqF%Xn<$@JCa;5C*<^Pfs%imxA!ostc|9LL8 z@YUt}mS3_wlApJH$8ury1F~N()DYcr4Cen&UA8XM%hxR*S{N?R&HhU9Tg49*56U~M zJ;g`nzNL7Z;$@1bEACR15KM8C!miLNj;+2)aghRD`tPM5EqzHIT>9wJ+m~Lk^vtEZ zmnw6w2cLw_r5om+v~*(W68X2678ZXmziRPe+05cs7C*jt|KckbpC$jr;^P;qi?=Si z7H?dQOBt(PXQEC0k^|gf7oF`z@vv=o&mSC+bObbqJGOt*r;HmqUjlJssi;Z?vY$RM>X)c4cDr;PTK18Rcv{? zr<^j#U&~4OJX(ie)rr_zmvZ&c>Z3j0%D`Aj#4hIsX{(P&76>fEnDjH8;$!u;F_qUv zla@L@%e})}%@y+cf!}34#A$|BPu}Wt3?Oz>?wE&@@Ps_1F=fb#2k2TlKm2s@hIEvT zQVwW(NVBfcA2e$ir%c-DhNT_OGmdip4A;k4Yc_Sw6l4tU%;`_DkJu<0=HB^il`)=v z5(i-JMp4TQbSe93uBWqUv3fESQ8Qiq)K3=NGgogL8Yh0?cyv`YtfVs}dSUIqazLNX zWvgDTsb1D{U9dF}ZAKdQYz&WRpUz3Ri-ou?R4Ay_S|tZ0oyM+>(RSN4?Ft7(nWTmc zXR>%w^KBNektL>(v)E0ZrY6rx#9X+U%-ebimF5fw6!229=vHN6vc+lJ)1Bs!K#CREh586C}47#rCxq?{&9tE6Yp|hI{Mb#5HiJU)0SF`qFq^II$AJ&FCUJry5ORpJQ$5Qb#}k%EC+-g zq$ygr>6n3>>vOGPjVYH^b%KeDYtaqT0=s+)HG9PVo5}{%a zBfX42-9OAX!e9VmG1y|!X7t3DIfet)559z#pq&0J;Ua>@qwipcQ=2BxcbL0au<4{Z0gXRxPlS_c zt#*;qzHJ&E?V|>HJZ4)d@DhZos|j}P$=p(y187oPsO2@zV*FT>1JpUPU~%_SHq$bv z2iVlUaFgni>8J{Q7cXJMB0)nVQ?{M=Qw~t|{5@60lGIgC-ogW2OQ{vsL+F`HZs&nU zAJf)+C8O>;{$mvdF!Mg{6wwZH3S7=%;lZIm@eRfEZFH+hAVdxT85Dp7mH(=S}j)dm|GREK*S zGj1y`^G%))5g>E!Le!FuEPR6p9M-1OY4w=NYd8(gM%W#pI_3&E z7};le32P=j@MrYt>J?mvYr}i?K-pQM>S@I*I0-!7O3(#;wV+XO-IxuJ(Yn4V8IL&* z^M#CK4P(JtsaL7%I0e>*4H5&Ul`{L{vwXdcDtWE6K~`miBl(;o7J0 z5>yszRMbgF@@no=TDv8z!F0{;wBtOUM>pJaQ}$X0Yoc6xv3BCFn3>MUE4b_)?j0Rh zs*vi&9A=|Dzyl^L;Ry|5*7%W2c|fHu*vh_A3X}08LA&7crdmPV5I->DBwD&u(@I6H zt>UHJYKFC?aRZXtE?^Z&~BC)Q>y5a?&?tp>?8Icu{Nad;V` znk*k7`6v9rScR~xl%#{)qZyulvH>gMj}0k1w5 z&YAL!)CC{q0f*J#3k72F+%aDHs#mM(Ub!37;}>#0pS7NXNHw`ez=|DwCie*J6qHrL zjLi`}ax)KD>fvs@XekXALmPlePrH0nC3Y!4Ai>%h!L> zQN6*%pX7mxPGfg~rqEqF#RHLO$*=R7oq^@cc!17U)qcIbZ&z|1pS4IQYB{~G9kQXk zCXw$4>#(gKYhV}g+F70=J59eg*6S_)oO?%}aFTH<*V5=Ndp8H94Clx!vwT;OWz_ke26jR^*Lb;iWJBq2 zxs%F!+wzAu0K1RMSbd?$!5k0hbh=n*Q1V;PyNd%dHBUc)`8$2@QGR^RWCm>)OwC&6 zYq?I#nu#-kMi+LMjPw7&J(8{#8~JFuoiQDKJP(9Qc2M~3OnUW39#D1YthU%|*>&Gh>)Omo=w+$h^(L^2iAO|EeQDP7&v|Gt*`9~6gS~AtMkf!dnydIgbXF57p z8S6O?srg6LCWg*N+%enSk2nC`GodtHyM zsrWGWNUT=R`R%aUlfC%WJdjie;#hQ0EUnr(Aet-K)Ug4qL>+t<52SnUZh|hW=(!j1 zKsYlXk~&i>u)--U)~Lo~RC%dREqdKUoJ6Ei8+Zd$IAOnzR~sYQ0B9^Vd!TlHoR^3> z$wD!g^?9#;KL>=pc0w2F*pt51_Uf<1MyQ&-*o(V#+8XTCaF0~N6~^nMv6hbFCQ&x3 z5!afWxf0nTxkUwQqm)S7j8!ITC7;hdQnGhDJw~S^2@>Pq;iI*+SliRIlgC-WMnm>} zR4-4f$zv1CG_3vqMKiEHbd&Ov$|EZ;S^nj+L-A3?qn28W4=tWqxO4s!^XH>aK)#Fk z=iWazBfnmD=WG+i|1bPAL`HL9cJZi3@u!a+O_EVX2LXc~?Do`P7N^#%S@YmUXTzv# z)B02#mu_43KL7F?U9Pd;0B{|HJH7r1$*qR!!BE9ESsh)thJe7 z7k6?k2PanHv{$W~hcIFcXZq4em$+lm{AuXF(`%&{#6J$NAIad02rk?_W~^Zk=&MGm z3tYj}4o;DVD)~&64dmubRI=$tE>UUnW@9Jf(JcGj=7;keP6TR$ zK`EgR!*V5%1w%VH0?PSZ;3@NwPV&uuvjvBVnO(CW{bA{udft#8&A>Mhj-C6X5x?7& zsX7xi$PO6m!Ku;!Z->o!=So*n5E~9M!&*@_*N!C^CJpEBAxahp9N+f?(y2ceEV=In z>ViwXoTh?ly6R*i0rp^Ou;hm0o372cV`XrV#hZR@xavChZRxb01Lj?9L|?(Ys}+m6 zd-f`&YJ-yyIQt0Knls&kW2NcFsX)F9=R!8(OisNcoy@a`YwHlT_n>eJzFeY7Qe%&i zH8@=Z6&C!53FepV=WWB5dz#5-@(@mxGn3=3Sob0&o#P11SJ{BQg88c5z?f^G4)+ov zAP5H4Z~$?W z2Wv%Im4q=Lyw1YKp8?u9Fej)p+)*VsvNY*J=;Rt`PEwzfo{@XOacLVeA{<9ahGOch zCfo2u<3NV34x7iQ5*3a;8_`r0l}_TRLu9=LBm}*7;ISF$ZqQ8nrJ-7xK{vbkpE{7A~;_ zcZ}3~5Ry*uAK>&{6(|a)=X@1Mzi%lTyL}7LgN_b-welUE=vmBj-IY%23E+XK0;B}p zOK@0zura)DPm{g}Q%_#y8;^bM3KC8k{lens1v9|h7V>oU1oQ;nluKR&QhxjCnCJ)%4 zc5-f0#}G2Wc~17)&&x5`58QmY_Vy8kY~SSHa#pBZgbXI#ajW0ZsDeAY#KwR7Ndm{m zlF*b!5O)2*(W5;7e7C4h6*?ZhJ8ZBSs^AnLb=20W<{Rm4zw9eH^;mLrW&}ai4_tK> zpIk)W3FZgMTq5c<_zhJEaJ=S+Rq3st_Lb21cTpEc5C;9gwb$|q`Fohkp3wq^+?%FXeg_m$XqA*zNKjv&tY0q$@WRJ3rV9Cm?mX}Rk(7!6f$9lmzVm@Zct z)&n84=1BcW93cVJc8Kg2QIpZF9t)O3ML|Wu35|)EL^hO zKl^(9cm*YIA039*3k}TaFE|_8sw<7V94IN;+=0~?+hLAY=i=Rjm}W~KmJ2~>piI_yP*(-Sb=7WCX^ zavM!9o8dN{-=w?km|GXLdE7eZaYG6AkJeh%HCQI$mV6S8bYksT1!`Nhk|^zZA2_Q| z;lwGN4C44%iaLvtr%3{iS#Rt8G-pZbG=Y)6n7gbdJo;Fb9zJGtk>W^%Q@xyyT<$5;OM}h%9eQZoHxg* zs?L&Zd7q}qDO5>IIaqbJU^lFyNskUGjvN-+TGyv9sp zrap_~r&ZXLWC*v-oC?6!rK9PQH%1pgQ#f^sZ*XO8$B?l)uqHS#jDjlwSpS4It&K*o z^LIYcy$z$=M!GXMk08MIRzKzQYi;?0qmiu|+=d*uMdbe3&+GB=_I>*15ro9ve0|av zCFxYi7t}#Lg*TVd+&}wy{kHDoRD5&*UN0yC4Sf-Y>H^sb#ezmdE|Frd{k(iz(VWbV z&Qlz@oa+Fgg4Wb!a5>+?JsRAQuH|5%k=gk_Bt>yr3l_wQvlM)K>NLcf1Xy(n$4=oC ztIUupxN};g!Lu5yXljIg+Dc_88?8bNIU6>Z4N$k)$U?eI14ih| z<{&l=-%oxCVyrK|zA{n*iQ~ul`d9PiTERC47S5_Ot08*X$m+327}80 z9;6%9YDM^eUx|$CAjgs;#aJRGO~j9tNsFbe2TOni9GCzfV8Z|VNn~3^KRT3;mJ~yisgM64q{gcF#92~%7FTby3Xa4MxaNxx`8eZB z5-C|`v;ZY5=&ZGzn`)+8MO&tB2pbZ~>RLG6NTs)a+E3}?RFxBmZ=da)h$^G7U|9zLJE^RMXo@Yn$DefWI5lWPa;vYu)m1vitaV zd$;rwdDif*5yI~2kwcO%5eKO@hl=HXFUIca!Rm&3+%dTDt=SpFKDJ(WtcCo|Un#u+ zUdYb>FP(W{X7y#Ok5+z8NvwQe#ko9KRzlT3xODI0*T4thGvLVQ(Z<_P68Yl>flH>=aXXWif?dS%`ir`u|jZyiqC8Et40>B1mFY&B^ zAE|umBz!KW)K0-HkIg|V*KY3r3F+kDHe4B<1@eO1t6I}vQ^f~y6GRxoNQ}Ki$(QoA zbKR3p=&eKhNXz!yv%^`wu6uh`Lp|m(Y07<)j|46sR`-&xhm`BVx<9if6W(#={P zmOj|+dfqBQ`jgUg^ZMcCBQ|oM;6TffP3P??yFcsF109OJK&joybXym?7a8dU-!i;v zL<2!#;nvr7Q#uTc)_O)r7&;d4N5`)wZ+04@CA$YH=_KDgoE?ov?h9!gX*D>q2zFIK zkgXELnjXBIGSGOq-k}7M^TbiG^uu@S+hLl~0JU6CD^T zK^s{7IN>wlTK0mdN!!ToXnnf~NT>F?;gusCs0n+BB~2scuhDp?&Hyc%y*8TOmToFi zuDc6Kr}$dv9WbCM^bTPP=@v)ES>VJ z!9MdeP!{&Ft7UuKW9_>0X)`c@UKf0|=_(tY8LQR^%8fWKoye<-qf@{`=wzI}QX=V! z_#&DJaDa{#Ct!GDz=~|_N9n1(a=18x2z{I8VkI^{7{r#W`ql7$wo2h#a$x3|Ewhf8 z3+)Owt)G5JI+<7GM{L|ZZiWs0`Ix0Wqz3&fxPN1p_$ymKNl)wLL-*(e+q-Tm@Xnee zP%wAu*}Tb!L28hgXz$9deldv-c>O)OR!uj-4`U*`Q7@WoL@);Gxb$bG=jcV{(Qzm} zVKi(te5wXT_FXnN@PUd0T3TR}-{#NK(|c)ibPUqF{(62i3}EGAGSo@?LoP@QY7Puf zp3UOf@vHPyUjn1YQAk!8J(@A5+zICibsE|S_t{_&&e!16Y<(wA0fEoN56$p#&Ltq7 z+KVfr>tKOMSg{N+sUitcp<_5Bv-|^f28>G1RP3Q3?(i?9bT?+{cE0zq? z#Ebc2KOP_rF+;!BXgB$P_m#l-O4JRvj;>K0xro~~gf-`gMW?SP&CQ$#gZ=V!YU>|J zfo7MQN!TD)oy7>)XgICb&;U>Fn-gR-(Y2@j~`A6lCl%H3=SNTfiNZC=|uCyyD}4e%|uk%lYNN@}riIEuXLWlj32;7ZmSPyc*8w_Y_HmQ$Z`PQYhej z{&$x?y>$Q5OO~FzRA0Jz$-IOu9bQ5ff3^6H#g8rCxA=m^dlt)!kwqPx!aua|*M*-h zd}-l>3$I^z_QIVDnFa5{*@bHsl=FX>|H1s{=HD~_iuv{V_WW)0ws~^?^7(o6ztD%^ z?ETx(7okrC&wFvyh@M6-M&-yak*^~kMcxda4jzvbkr472U{$JXE(-Jr| zcjVBvyRE6Fqf>P+MA}ER8B7zd=%_1m{-XwxzXnc|`jV2~V)mk(vg3@S2 z1jW(t1WITr^gl#U68)J7N}xX#L2>jaA}EIb`$Q%PE&9tzQH>V;u?R||KN3L+^oJrS zj{ZOd#nA6hQqZ6ePl7c1y~*dHaK9sh(&$4XD2{$x1jW#AO(v#BzdI?a(xTrGK?(Hh zA}Ef2O$5czuTCbWLcci)Qs`GEpC`5Gmqbt+eNY5dqhAz3Rp=K)PzwDw5tKwfFM<;2 z=R{B({j3Ozq5nFWH4^>uq$t$8Pm7>5`Y$4=8vT?AszN_0f>P)wL{Jj_xClz19}_`w z^rIpuhJIu+YXth4Nl{#j{<8?GMn5Eis?ZOLpcMK65tKyVFM<;2`$SM2eLw`o(DzPe z0!KeQDGKAsyG2k8eb?j*F!VhWqBx8v_lux3`VJ8kN8c`jV(8l@5`)5h=cK3xNAD9s zG4w5yFVLWGofM_D=$k}P8hxV(sz%=+f~wHhi=Y(xIuVpaUn_zV=xan!9DTJ2ilMKX z%o>fpc~TVm%vXq@8uaBND2={M1XZIi6+u<#OGHo#eX$5iqAwCb3G|;tP#k@s2#TRE zn9Q&medVMm^xMxDL22}PA}E1AR|Lh;=ZK&f`s_&xD)b*GMJWn>rU*)+&k#Wg^ywlf zjy_EU#n90t1qyxEq$rFX_llr2`cx5AjXp&LRiRH7K`Hb}A}EPIQ3NH>e-J@&^a&y; zhTb!oH4P)mA}EOtL{I|li=a5#6G1Vw zJDFhu9Zrfur`HxiX|yGRVrX;nwK&?D6a{^|E`ri%O$1e=RS{H$Rzy$=EsLNeS`tAC zw8-!Or)E}T%8#%7dF8RoFI$!=o&YoM%;NnEe_SZe|7!lRFfTqIdD`6n&Sm7EmR}>Q z&wgt*J@f0C)Ly4mu*4aG6(iw9tjB0ITFJ1=)Pp5dH7x3H9(Ui|Ph--JP9An~rrm*c z4KZV(De$-r%xCK(2qJNaTO)!c&RV~uindh^X9f0l)v#y=VN*@L>Sp?5zfF1h6nH$% ze{GIJV+(b9I#~&mu1;1Bi=6xgab{Cni9&GH&0nXyehNIE>Su=MkAiS|NI3mxi8$T4 zbR&^4!umh#Q>et3SCe41)okr@drIS)jtM z)H$T4u$cmnll;{1l93Nc3UOs3!GXT2x4T?D*i~0S#fCG$Hr8^K-GAa1(0AAi>@G2d z#T0m)+$VJvld z$OG*|2tHMy{9a3vN+k2Je*jH{60e8NVjlKC&T(@}(o^7ZMi0QAz8i{3I8U02R{d$h z)ysFGE2N-pP};QsB)_8(h@n$bn*xuM_!#WNxqyVQ4`iA;gV)Bfk7Vq}BF z1wRi)D(N(I=u)8p`(qT_;K0?$#`kQ3%aC608Z~?}V+P7&axHDe!pm_krSIfP4#zLz$pytm}yB z%^gSx1|9a~_6{@J9RtvA5>r@Afyc?c7iGv`U_?SJ%N^t< z2BzI*rZAZTj}v?k7`p0!pkV0Q(4^{`9AO*Sq5mggkb<-2VgyUm2dw=*F@@z6c%1yZ zhlbH(f&3kJY*-MGQPSy5_WIov5Qo8w1VLb9vM9vNZoW3U$*6#yWTT2G>tZl z^dyXSBqd5}=g7Awu_=6}z~eOUXXpQy&D=Ay+Esorf5P%-mTy)3TtP1}i@#a4 zE_`o6JAV)QL-Yvpe#ABRZ*$kk-z~pN_68X~``Vemz=MzYPk+RE4G~llJ#GvavUq>M zU`8Blj^JAJCK}+aG_{sxPl`_>Q?fY)9?$(xhS!Y1AIQO5Zs9+YL)S7y1Ejibh{3Kd z{9V(7dxmUfZT#Fvx!Q)f?yTLMV9~NixhaIEz~ek08qSaEP)I^Z)l9g|s0i?UZ3DNS z7=%l~v}<18yk>jXJnhDmG^fDhR32`RSZ5%@DCuQF{ahys^UNHupxJB9+OM%TS)8%Y zj^C#wFa;h@_s8u~bu8Vkx#2Ul)M1AcDg>rxuQhjqvjy8ociZn%5|{#yr~4!5Tv#t2 zLg&)OQmrxQa>z?%D_o5Q8YQVL^vN;d38zP zL$TLd5RO0ROJhGydF>QHsHW!TAapmGfhHbB|(E_)LMvX?`<3N{uy=xINWx$L$cz zR0m1JTvO^-g;U`1biM(7Bm)TveWb$_W$fmL%c8Ht%VCDA1!G*%gNJZd zuL5J`=An>13QplP1sy{UHU;PE_teu$55heFKf zHx$Q#)ld&-nSKq9h|w@}qR(-X8Y=(JJnTby3cD%rIO(rcN4EiI&czhF^%XD{@Qyu` zF~c?n4V?|GTJwUVpceRy-uBCsS5JY*Q~Yv%bStDNoF{-7m5ri*kimm&iZBPFsWmSY z1#|<#Pg7nx1s+f9OR%1I3nV72=UKOcS-|U|L!zf?DH(8_4F_{3KFYr2r!brXj}w2e zIJy~l3(8y*518?~K8G^};0#?9O{|3zS?DCjew^~!De!n|U(Ang8v7)DvQBmDc&IgC znGii(1O0YOp3ECMQmAbcnyN{}o_@_SC*zSXC@?(Q%%uzuJ7&Aex=>gS$& z_jAs@C+)M(-s^kKLW>DI{6##JfO%Q(Z9Wo#ENQLKLJZSN(bI8u+0)U}=*5lBVzN=o zvg0(z|0VNW5yz#B1=^pS#3RGQ@ZeBqjBow2UKy>cfE;I)Y)@oBB&5B z&+sp>$r3`A(F6LE19-g|?S6%;%~A>)lf62YF;K`O$((4FMTvqFFjpUQGsOX%-i!uE zldq!GnzlDhnKzV%YHK00ePoW&iv zd#`7477rm*E`AHalYn{pll|CWiOnRg?=v4k7{i(&cP+3Pj@jZ_E6xbwD4>kO=4d67 zEfg*%k}1qTp}dhCJ{+ANJvwBbD;T-fnQyuWQ(gP)b1| zkF@UO3NoDc51pT3FBDTu_>-5;?v4s{!8-_+1k98FpZ@d!E`i{MQ+z?Oot!d>VP&i8 z0deSupxquCw+t5nm1rr>%uNWGkVn8gjc=C+a1}I~>TGXBy)J~54?-KPgkl>BO2v`v zqd$m86EH9FTm6-R0Fjc@2(QDHie)>xR67lEOsp1$MX8ATZUq~wO;mda=< zCo}TZy|URFi-#Mj6EH9Jt9|=m67w+0p^Y=Bf`Td@QRShu zMZLm9#khJs&JGygw_Y0_vAz$Z&iIkBlwz>;)0{pct0SOVsyeHoUU zd@Pepw_~)%^Rc>q3!>1QtMtU-bn*%zm4JCNUxLpHTE%{tZ*UO~*VLf_S6*_el z=Jn#o!^JTnU_u@N^EAHLeS}3Tk@l+`if+1&Kjm?R5JJGb z>@Ph35f++6uNMbbF0wPEpihVA9BZ;3hn8*VI%#-RUk)Th5irl-^Ur^z$1!MTogVX+ zJJQtTARQe&T;pJVT&lzW1w7$O6)+AGq6nC0@VSQ`VL?MAbBT>~-II2>YD9+vo8=`H+rgp;|uF^B<^ zFjbSMUMCn3Fi-41*!ut4i659)d-m#2tlqQo`zyBPS1x^Z>Bhy%!iTZ@|K|DI5WD`i zxtGm;YF0bbo~}&2X!4cF{&@cP@TI{MnI}JI-zk1_IhV&6FI63uddRAT>JCZz=wNvT z4TqgzLB@Ef}{q^6s78YS8LIr;UMB zCshI8$YW*f8?rVG&CSTaC4Ls7Y3!(9_!fdD0rTva`^o|0fsA&4+U}IX>PnbADGZU& z-Xg7=Pa%6^=($L4f*k?#q_64UG(d!rktyX?Pwx!5165^t7lg5NK%CR9WTAy{7_6e} z_hC3kbhF~H#^dF9yo>qF*?9;i1k4k>x_@bam?WcUWj24b<|r#w1)N?{Vz&?pK}lka z81r)~F)P3mRJ_1GfYUA$@(Gxy^*zrYAb`ne&b_VNOZUtj#daAQVIBKab3@$xqfS@KLqn1roaidUI2VHrrdvsWFAnK@RXil1owukRd1|q}| zFfaWoD7Fx~WTe4JSJ6?%SvfK3MubrIv5S%J@=a)QSQ{PM#Gi7FkW9clp)31W z4iM~QWRc~L?v?Yth&5lpu&BdqK?lSAOu5z&zvJV_Lr%X+NGD*P)D``;!3`iK9VV*u z(u$JPx2wot0MlWtMlezjY<~z&^hH880rQmBP)~@ZGODNCUff-)yPE;CA9Prof|BWY zJslbLo_>{(PQW~=)&5p)7flh}1Su-Vv3=e(@j#OR0UsQ!4gf}>!=&j`98uFj6} zJ6}eE69My7SNfsBwQRRxt-mG?)$VL8n(Q@w8}*76o*v=oQAU4twA;XGA(&zlj(1Vp z(Kw4YBsu_ntPdaxLBM?3=K8k`5N&1TXEUL;?OM~`%%;(aV&PTbVCC?%;Bm?)2Cj2t zBDfGRPjLxf%GKPLVoL|LRkvGfQtg2rhJ(?m%OevgqL!t#)9D!rP6W(TU2F~zsb#d! z9gLM4j!j20t%Isvi?*+2e!CI&fw|LUtMuc469NdBm%ET1AXv*t#UIhSJgS_gpxVQn zo(-Bf^69_{Aj~VJU&KQRn3px5A0TqeND0x^+AN_BPsFQ(;s+-t%EBuKa@g*W}8lh%N*G88|~O}#6P)~cec0dM|mGXn1K0mOkmQ5pfRIKSJ;{G zRx^q~FT(b;SwYVBb$yOJ1QP=03C^*EeICu(M-(r>~4w@SYmAhzYtHR1SSg2S!7jgQ8)MI`E zQ4Rv;i+6uNIe;hrtNS$Z%g0pOF@1kf*md;hYqp1vkVtI5J`0;rRQ6d87 z3;N`~Z(v{r9eL;NX&e}8plW6Mf9PVycbSWDj0{_uLKcg5 zQB8dAj07bD=9%7s*?<~VC7ovVcoRi!d&}VUGNz0wJ8FB9*ojH^*?9;i1k4k>yMOC| zMFx=eQapP9W+`WFYd51HhdDQkTs21UNWp%nP(M#Df(-%lB=5r7g^v;7cj?0QRHNWw zQ)`&oBM~IIc6y#n1Q!D4DL%1(?SRDykbGp9qRuT-+uSg)?K;@lBT*C)VZ6pF`}7P1 z2Lk4)-Pyl;fXD!sqEWFA%w&^QW!926=3qewEudlDfvD%vQaa1RCb9X@FwWH>!0a&) zI|fnA&YzPYMZi4QTl-4`77{@67}4?>^8Se16|TZC$AC9&fOTZIh{JXw-DB*iON3kk z=IPwtUl_2+0Foc8&bHlXuy2G?0jx+3c&i2lUwOya5LXDP1k97Ut$)P;aRV+%=Mr3HbGo*FdBEZaNL$Cgaxt;z-AYHAd5A>+rXTgi zGOSMYbLY=XFe6}|@H!Ov_kyr=jH44%)D`B8qS?X+rf0QyS~ZUKdl$(~up?le^euh; zfW;Xom&F!r)}-~Zcqr9~!3GFtPmoS|_lz|3AT?~FLJ<`&*I-0&!5avU1k6*vxxX=B zAqymfFn^^~-r92LY#vtE(5T@E%ISMwLk-X6;c5&gB1Wfx9_@_;X9DJna#P z-wBPPNgb_k?)VGrJIBf%CtA)?l;ip}C{G^MZ3JHe=8N$JasU676Kl@Z&dS@CKe4>C z^zy}b!LPo3{td#v33tu?;G8gfF!QMy{q*yuJ~vgLeAnbH6R-SkC;)IAz>f-+oMF{M z7SCR<8Pz)tRu#;kk%sQUwl@O;dX|oy!jLXK z&XtQ`L%=-AjsBAc%=Me(gUZ_q`F51K=%(Kcf;yH)B+puQo;xeSi-38$_U?fBf|CsB z?CPBqygO_pyX?JU%>YAb$X_MFAG#k)l0K-;m5X3Qz&uG)bHKdGNhjvA;h^8Q<;FhZ9{6D`4Lfa# zBW6%1|0VW*I3k3wMZfc3R(K@LZf zQ!f+p37Dt#)c&0V<~vUEBV>@p`YelaaO)a?h0dXm2H$6EI&OHTG+thPNT@*H$_Ph05fMCHB~+F-9gB`<$mZ6=s52 zzhHKP9|7~URb2ePznyvevG{+t&#Vyf|K7j$jW!Yw2P9zbCF;x%!ROPprOY z^{uPFusT?6uSQqhtJ>A|)y0)BuY7dn&sW~O^6HhBtW;MXT(Pa(zjFP`^zvtyKe+tP z<<~F2V)+Hjx#hs}1Iza;Ut0Rs(kGYRxAeB9Ut0R%rQT9v$-87+x_xP7@vDpfy!cm( zzqR% z_46 z+>1x?|E@>;zt7HoVD^s=yccli#;%KNeNzV2%zZ-!RnL80 z235`dw+yPB`gT>JgKFl!B!jBwz9@sL=Dr|GeWZ2Gt4~8B`;T$Mw|c)j~=puS!VDph_VjgDQmhcp>yc zemtwrC`4sYz3}}qs7`pc45}5LC4*{&XUd=|;rnDzrSPB(su0HGdTMmScx+OQRtS&Z zuQ3Wi8Pp)`$)I{+R|eGy0U1;)_+?Oyup@)2g>4yBC2Yx{O2H?CDg^KNtJDag@vLg2 z;E_S~f?EdF2rd~^EjVRRmEe#;mBNM$su1ksbk)MeVg&e$M>>IJGK&3IPy@t0*#t#F?Vsu7+f zgQ|slWl)uHj|{35?v_Cn!d>HZ4Z@Shv!ai`QwG%wcgUbR;dU8RE8Hf7YJ^*5P_?iw zgQ|pEWKgAWvka;bZW=F|UU=eoR`mQg%Ak7T1{qW-TrYzvgzLtI>4YbYXVn^oYh+M^ zaJ3Ao7rsXZ)d`nmP_1y445|^XltIu2Q|X-`2A=S zi!!KQSdc+A!n_Qs76choCCtg7N?}$8RR}ZVbk)Mrcvke#Q=0_TE3a7o z>T+P|Za6rVE*1EKU%#ytnfpnz0wx;OO4ofF=9JEj^Gh64ds3l4<=w<-uKrB%)`56VVw)N zRmz6NmPYVG6`Wopt=lTuL^jbaG9})zKZ(Z^FfaAl`2q9vF14BsQ_hmxGPQD@U5LQ$ z2Ao$1k~mz(BuYPt#}Y6v?OEjk+`W$++?bmse=feWO|=nt*wU z&&&>(gLcVPow;7y#+ScQ$(JDwI|eX@72O1nei08PU|!bu^&^86+Y1;SP;sbtc6WN= z?UL1Eg$pfs(2}tim*4%8_Z<9~pFk9Yfcetx!pMPnWtR-NcQkvsw3*JPqc|?sK#M&6 zI>CT|d19gbfVpv(I)#qTUk-SUrkDZ8tY90BB)N?~`bj*NfO%=b>>vthQWJF-d^UYg zWz#lcJOk5bq(isSqhG{B37D6)*IypMx%wr^mFAvNzoB$!4Lj+8RfW%EWRuGe+hyi> z>a=TwU;^g(1o}@Hz;XH|X=paPw*snqz#LMitju^qa^5btdB~he<4o*1@(@G_nCIt% zb3*23U2;xnN?J6rs6T0QCmC)$MT4DL)ig%c79m?z?gfjo1;E*Z$TP5M-B zr`Ywtcex54Jdh5j2qUw#QT-5C2&n|jli6txm|OMx?-#ch6P1o_&(*AZ&G=&B{QwF3 zakUEEL@^GqgE;{ZA_$n5yxkr!7weMblqr>n7rlWkM|5HK%! zt3Ne>$Ms8+_uWRbH-od;7h}o1~2ukfWFK221W(Ahp%Sj1MRKkwo_lMI08Q=$(~? z;6cDVJx~Ao0Slrog^X;(H3_vR-{?irjNl9aiPc`Q8E0PD% z3r_qy>=fn3k2)+;&(1-RAYh)`(-#-tIq|ELzc(@Y*~x#JT3dJ%_OV|#^_l6_X~py_ zre6dzv5N3)!7DsXxKFrISe*OsxqqMgz}%nC{np%T=UzVd@LYB7`xoz76y|($56oSj zd&1n(?AK@iWA=mdKeF)m^Dme$&p&H^6MOGZn!jOwLHHWt2>iqRyXN1#Fu&kgcPoCbHy=khsa`o);%r_RFxA4rFPfdMz`3*Dw zIQ7<*cg+0x)VCI|6Ml5@`(}P;$q3tqA72RzZ<%@FOno^r6PwvydG-9itvqM`{Ywum zJ7=D;@WV6r&)f`~hi@+2yPTi?^t5UDUlv}o{4>)Zn*NIw{rp!azdilC)4x2mK9!jA zPbsHfyma@}UoL)S`j&<3*FLxQ(Y1H4y?ya1YrnQoT6^W%OBaj6pR9ER@8UhexRQ_kIHvlmXsI-ZW^=Z8Qrv=K??LNR;vPX7=vnZ4$4H6AeZRE{BFY$*fgOhE11 zTY2UXDC8a5J!das3*PjD;w{Bk#vThB&AA)DX9yH+F=e&1QMPTZ{;UXuwksy*Mk>^~ z?Kwlh>Pd>{+s{gsyFOT-^`>M&3#A z_Wb5>Y*SqRN-t|fmFl;t* z&Z?$r5X?iMP|bzPRbzbDa;5l;Le-jd8G3$KWNAmt5!lRHx^<5tb0(;@@y4w`)EQ%Er=~+XbtUI9Cy<%#ZBjWS9HBEQG zrJ49+5m0aJD0htEc5nKIArMY(nj`uxXTEfm_>6E!9dI>lo_Klw)?toNEv+xBwDnkR zMn43O{G88;-`HM8=X2x?hO%Z-Y%l(5&Yg{y{but*Z+MGe9}SgS+CViSd}0XfSp2Py zH(XP0O^G?STcJWqrL;sc%fB|vv0cr_ZQHSWAvl>5fuc6P71#<@{a5|>5ZE*o(X z!=No1i>Y0Y>fX2rXw;Ep!saY>XUaohqi8c|tiHOrdEcEPkcenDt9p&zq4}r?1a~%K z4Q*W$Sh-CE?B1L!ug+xjH(WCW>|Kjpmq@3)^&5Uj1PZNkNfC_}w3o!@VK3O4mVjRu z=`4Ox%(1i4s&o|%Yv4}tW!se|l{easMbmdwhdFEojka5LZ`SRXzgGlycWvELE}qtKGZ4LZQ~aEWT`C zre^Tw)plL-35{V6pJ&t9ZH9dz-*uuCpH8x+4OKT}{2^au;mVVz=c_Y&SAht236o zy*5sEpO&u`22gUGaYL zOD<$K{UvoJQqVv7)x(EwsZ@o8r{ylEZura)DDPRTp^o1bkKa=p0(nb2mNy2=$@<-Y zB;I0)m3Jedh`Dt02SmW=%Y# zQq?tUyN+04QvCR{U9H#GQr6qs_diz@n>KZImiUe}f4|sko4TrQrBLYk^}4qYbNH1m zTW+sdFza=%83LOby&=#{1PvZtdI;>sT4tppZV1#=R}F#S#&$lUx7mGNrP#qbt+~xo zRh=%F4Nn{9NE*G~q}i+QIP{+$0*fG9V*#+R=b(Cx8n-KFo(a}Q$+S6 zZF^U7v-k{mQ{&L*c0!(8#Wz>Q&H0V(PTqB^W|$+gUC@+FUHxv-urma9^EjDRuGqEq zb+J$0DXH7tS~F;ltc(4}wz?P2rqzke=8b>4RG7H(*e=xY89PCpWxK7@x%9^OiGa3V z)#TE)Qb+yzAy7)E@-=iaCdZSWHw412dbk%-ZkEmWeqjjg))e)g z_8WK0yZ8S3Fh>%R%tB4I%CoDvb_fIu$&|HjY5C&!ibG>q;c5r1yGp;~-pQqXIi^{~ zhC>%`xm&J#-nabRiMJgq%m1D~hQ-h7)qbb4R%@DWdC3q+7mCJ=Yqzd5+!7fAc}IM2 z$8Fj($8P@G@*m38$97_K+hj3jHAln zDEEwzXVcZ{ZI&vP+r(*LJ|6Pud|OqQ>j@tkKEv;HC7Sw@CvLt?H3YE3ux+*ZgR$JS z_-Ti`_F~!TFJxLzxMsy6C#4XNZ|%ixduscQA707Ha}fVoz7OdUL0>K8>Xn;rtcOtvmY08m~wGjeB0{L&WZzJMHTFAYWA$o{M0Ad{{KxA z?uoS*uU)tLx>duKb8I;M28$I0Us8 z({mjLTYFrdLKKI9`BHZJckZ+3aneylPqUzN)l@wzcE;6kn}7uEvmEo|`qy*jBN!1d zPxSfyr|q*yaZ*_ET~*rMQioibd>bV7EFJ2_j&=dhuKNq$Log*^z5vf_?$3k2bXL2Z z-ieqrkydM?2JZOYnJa}Gm%YEoM`z+9$6yx5a)+NKc0du3b1)1zC zhGR&C;9;K4*r$mYjpGm@hJbnL&+Sj|v$%577DF$fZtdiX6;rJOIVzSAr4vo&a{r}3Qr!aj>QCv7$PHuSYz(G#i!*_WeaNurT0rQmuQpM1H7I-#!+QVEzR(*qe6 zKu#hPF6b2wr#oN@dne=GQ<@^DgpCky8Wy65nJw(bVRzO=o#C3V<4r% z3&Q&u#SG!~-`J~0#3=TuoO+oMPry8@2C9ffpp&Y|VbX-sE>ktHLTiC777|W{iX={a zIn)(GDgpCk+7Indf{Wy_a3h(CIdmzNYc~TP_;zp{^swb}^)iMLf(V$G-|A29vuJXX zYa91Qdppxr!Z;;sVn_jwf(%MXBVe9Hvw!mdq2xwElHK8C*XM|CI28D3 zQ3<1fEBtqYBgRAfhA3?GI?;1wBB&5B&oKY|0Si7SIi>I!b=LNt#_RFzK`=fUoL04U zlPA6w8ITY~z&wLGqM7m`=Q=G_IMcEza{=@+IHQWR?yJSJjgutgU_u@N^E7G*!N6k9 zNd^&>&bHICv*RiD*n48H3p=<7){%wfofvy-_>vOMIKC(P8X=j0c|z6pfW@JccDRG7 zfXCF#*?j&S`}pKl({L zmVkL_rTl=!mXo9%u zjE+<#3!y?Q{;n}O(346V3+*b8AVD^iD za?|i8EUeh~bQn6}Jede81k5vx!_7z&RU?g|L2uCD+bHU4wI1l9>rud>h9`8Q{hxZ7 zkWauotz2Iiuqbj*f4XSX68GeKmd=(tRKk>5fi6iQO@GH~Oa1~OlYn_D+2WuMCQ>`} z))kvJy*uYDZGr`Q0EGq>lx$?+%ar>~JeYuad70v%#>v~=$w#d_<&DyI0MAFeS77Z{ zh$a$AOec%tfO*MDw*J3yqB*hl!qxv-eg4W9 zS2~CR5MKK2rCSzXxbVgW!+clxj9{62$?RulpF8u-nID?DdHRjhOH{r>MQ$7vE39y+uJ^i z!nD;kSlLQbzwS+zD}`viIJAl?#SzbmE&37CvRTTP%I(s6ESW)^sdBT%av+KeLOtQ{ zMpqnYM*-KR-s$mvB2i2N=1c!0{cHE{L}g2^h`YwP)f3dXN|`(gj;;)TR;|bRpXkia z$Utx)V4m75`%C+GfSTmqx7_UNA`MkHTESqhXYWPowT>d%k1CkDM93vzp3YD8Z{5Eg zbR^s9jbgG_Zn>?SUGy>VtBNE>OuuhEjacO|vAY?509-8hbLAq~5HL^jC-eJ=n>T7Y z9(8#)Rg83%Ma+reKow~ikQwJ4j(!r4C176KPh|IRg*3_Pw-vItGNrUJ>E6NP(aXbG z=`iB*(J$hm1kB5NMR}ivr<3C9=JQU!tFe=;7yNiSItIP^D6TI52k~eE<|Y34L;Eb= zoU{x~giM?2xULn9pbJ8HO{8@{X4C~PD!mLw2qIu!{*M*+S!6kB3{5pE$)I|tgbi!R zMz4>Umr@XT?l^+BfVY$lN8#mr>5WV-8fi#;61D0Znh@(U@P1%Ad&)eb8U{4uT{B^V}bS z#+AjRlQga!i`iqddTklRXI8`f8cB9STRPHf4jrnWGatc-fO(=n3>^%MQ77qOI?8mn z+ESLxwIE2Mza5!pA7@sluMkoRm?v}4f9gJqPA7ReOKWY;WI~tK$1#J1eKyiCSVbk1 zl$7j;XDgyjgx)9@nIp;*n)eIeLhvMDp8kGwpM|lL)=nE~txmI-ExJoCFh^5@jrY(q z{d%dKU~0AFe-i=-n3p@~Z|x6*(v2MW?WmNSnXTAP96Elu&xQ9~nN1A&rh*{lWoQj> za^)~!_hY%4AWy)2nfmCLSTH)NU+TIP+ge3guWzF9z+N0_-FBSni7Cn%83+yp%u{<= z|I$7SLMJT*Hxrv1VVyFSs$r?B#q3dwps59{wuTjmpoKLI7Oirjm4w=^amHmrJ^}Nz zeyD%TK8rXft)Si8DOcCK)lenSc(iEAGO_VwUbZxcI%@7GGZ9<}n5Xzs%%)gyI%ziL zGjHnst&GOt!FaAkm#)>Vn-HWE&6uf(hSR9g23s_Zhz`&noi7)`hJbmJKiJ-9LG7e< zSKX`(z#DzZgM(;lEo)2KbxRb-N3)4TJ=O_;5JAAa&ESJn z%&fGU^({0^NuM_c5F!Yem;7Rk0#`t^Gz$2)tl@CMm5Y?akb;Sp_Hh5GEDrl=MnY62 zQdbD61k96p(L?)d;37@I8kKIXYBg6>7|FlF$&?J#a5I>?(8z1;)sF_N=PGMp2QDy_gBC{a)_R++O`eJ zT*^|x`~jyakk(C!+Hn0ZRlx~_5JJGb?1#nm|Eng}vhd*d1FKiBJiPqzrFSfCFMeXN zzVM+1?fj^CsBJp3T0&JG$rThmkId<%+va%PR@n8bx<-IAt&thXrdbr(owxL%Q zvMqHEvQ#WdO3tI7#A6AVm-d_O{ii~jG}s1p1((9UXKH%Aki<%OLdkg&AVd%_FZqr6 z{ikr{ETwZ>`eGwjEVUpN{RlQT4!w>X{Ujbsz`V3K^uK=}F(NPZukBwe_865|I=B-y zsf*?fs|NBE7wj?Q9BMos4UhL*yx5w8>DsL(0#<{7x7R6=4Jh2ejni# zM{T^iRkP%~iJfGe)i@^e@MRA6-{uHr!gX)A#WrsZ&_oz?*fXhD zvRLMovCJH9F`ZB_otcH;LBKq{pYN~jBaq`LUcy#6p>+HGp>z`ZJOh*v2JK-xt(_zZ zz2Yes3E2e9Q+iE)pM`Oh#woAXoC~#_(MH=2fly8uH0yy(w+O!`M?Z0A=bHO0 z2BV}(-QIR6&AD7FWQ47z0s0673rLd4M&aP9#P+q0|4j%WU|#Oe=J#0`MX8h_XV6np z!1I&}{SX}cAfX=`Mq@qtNj#Q-d1*g`)z;k*C#|*$`O0q177TVm=oH|u2WdS}i^dTy z`@Z#9tz3#{U{gNyCDbgX&$vv;Ct#k|tJ(VhhKXlQti53MORIOT{N&2g@(Y*emiFOq z->~o$_|P{Czb`y(?u~Q0*|*PLJM)6+PfQC_KQQ_B$t!Wwng8|g-)Bx(q%dJYS1rAh zb%%EyA*)7*6^4$PPr*DlK5ThWM3yRMqw83QWY&|Nc(OhWz=56CIy@;|Br{QR0_H2^ zef_)k9|UD7nsmU>QJC$WPP%Rd15DDe$v{!AXJLO*9??BtMuHOo^Hks4x9mqiRSH4r z^%+c6qt$Q0G(>|<2qcPXx!FJz-y^p7t=G%z!>M56QQk)IC1Ac7@99tM!(GfJNzLPF zE6nYp%aHA6tr{)YrH!U9U8KgaIHxpEO~2$(1Nm+gJHl^H2i0_~jN88z&6_t0o?N*C$)?!`%f5JAAa z%tfO*M(j@=6ukX72f=;(vKq&H|c zXvz@F+9^y@*y)$C-3#&xA(eo6GJp2aK8w35?OyC{*&?=pKjLf!!2|j_je2bNLIxuQ z5il?RPoW^+0s*P#-1Wq~HK$G)D1;%LH6To3#&$1cQ9>F4^CbSHyU!x3O1l>>-JSvG zxHHP04e~KwLce`{_hJkogb*+<`(53A7Cu#y9oW(MG&WVK8p8B~DcYbU!$g(axfw$U zAq33J{$rRGZn7a`WLAh{^F~cltLv!It>X2oFF0fzoirql7C!DzB#KGEeCdA=MlURy zs$}#Muh_O?if%QOMb$&ogLJNAhUd&jFd|@{=pXg(*=HeDC1<0la5U*qD)%BzDBWQE ziFCNUszhrIG2ol*@yPS%Bv=tJPxcR+`v}82S_<`=hHTX7+jHkJ6T*=~B56-Oorc*|vm)3NOZZ5WSiN&U2~q^ibNys`pPk9L7pi?7r%wzNx(e)kHaXAMNp88;$qo~PM6VWH?6SKfQAi;onI>@ z*>N`U7^`S-RxhU->+qgmZ(<|t9GM6%1k6+X7c9hC3<7AGd-!!p(o(!G&PjB5WoFN3HG z0_JPz0}o%`&#{oT@qS#ap|a8%^rrR-7R45-2O|fL%3SOu(FH2!_>RPPPZUuz1k6|1 z|9M!upJf%6@8`t|vjk)2mM0juwqSXI6Fx|XlkX!F)bHr$_1zRl)DQvl75CA8a6iK; zZe(+|;VwG1lVL||3&R`E`5@t(Gj<8kj*{hiwghzt4qV6KY`K{i)uaz*x)>;qU95LY ziCVdseCA`lpC|(X^F{jz=K3twhcwr>8Dn}y$xzd}&;#N~5z@M^-blhpd9qMWWw8@d zM_dzmn2<-nJdJFm8a`{FR>;?$EP zi_Jy$LJxXqi2{LkhzS&57 zoV`87w!tJ7AGU6NleMZux6Tf`vcgI|0$SK97YWe>%rp8MXkS>|5J~&eNVwhInx?g# zbweUXOq`9PIGq^q&YP29MZi4Se}GXN;*N}r+PuD+rkL;8G6+Ye!TBhp!_jK^K@-(@ zW*&kG0rLdk-!JYzn|;i;_iqABI64 zJMJpKe_U)98rjPQwhfU^t{=WE94UDe_Yh18m@mNJ;gez!Q6xJ_kE7#lSX`NC1ln;O zhC7``rT{0u{4?_qObD1K__vE#%m2jmtrKfcUAuGbiq)^L{_E=Btp4um&#w+v+pE!4 z_o{aKz0<#kn12V;-Rb!B=CpqGmeqxoFRy%b<IDlOTV=A!%MxT#FBT(uyotf%Hr1+ z|7G#77k_8*HH$A>Y%V@~(YdHzylHWM;Y$l2UHFTIH!r+;;Ux>zg$EaG3->Qvzc4-j zpYtD_f9L$`=U;)?0=fCX`~&lM&tDS0E&PY@cd%0UW#LDJ=L#udOL&TKhp;;LwYh(p z`|G*inS0IL%jTMM-#_P?)6CsGH$VHO*^eORz;DjJYW5|w)!7GUZL{~!UOziM^VyjX z%>2>Jug$z-<^?mknZV2gGk4Eiwf3pCzhC=IbLlQ_q~*Kumxer{*R=FQ5n=A{Kyz; zP$}oHkwF#nSC6Ag?fiHMRfAG9KOREWpj6MV$UH$cKOQdCpj6I}M z$79AC6vp}S7^((^VSYS@szITjACIAGQ0V5zW2hPw+WDFBLMSxz(=w=feo6*a%}>gp z%J~TyR3ZG&c!3r33u7Q+&wqRDem%aiZ_1!5;TtljQuzA#V|Bu}#A2O&y`1kQbsD;muXGNIaf0IEC!Y5=(*vOhMS)nF9fFM}F{zn4LE!r#fDTH$YHP>t|D8B{I2R|ZuH?~y^3!r#cC z3gO-3MKcKhFb?X4za9s5!e5PpTH!CpC83@ExeRI${!9kd2!ASrs)aw1K~=)LWKgB> z$1jqn%aS=9#N4`on=@Q(2ZsD(co2UWr!jNh*`3U8M|4Z_=GP_^)TGN?*; zs|>0Xepd!n2){Ey=C7AQ)$`ZMpsM+6$0!(7^G_Jhsx;1Dl0gmg zSIMCI`732m-TW2e{{L$y*6OQ2xAOYs_b)q^er567iuO7f%`$#2Rj%4ixvnw3Y=B)5>0bd&Sp*~QS(mEc9dJl(JNZ#kF&UCFATw4w7A zcFjqb-wCR)jX<<_Ujt66)>BkP*3XrR;6lJW#s5Z)!sGj>MhiJ_YzMIv8v$0MXdf^l zveugE%h?kAxL~)PWO{+D1TO;S>3$8(nYn_OnzP9i^2HbqDYfKZ@BJHT9}`n_d;rb*u=$3%4+Pa7t4|V>ZJ}f?R_>D+fV> zfO&48>uV2~`}kr}+yrQZGkIe}t5Yb=AchtM#~r7$JJF0TmY-lqz&!D@lK4g&z>4GrnGUqe`wf za9%B0IJD*BYaZKI(O4ak-La!v68F5Y^~}ay_=|~thaXSW00HwA^M!tV|2eE;uJ2!e z*sP7#vL@PWMV0J>L%#?&C8sxQsbbh6?QE%zDNt&7vhw(=eH@-bl!t)%Vt&5AxDN;Z zmn5IR?P$^$4-^&MCf+>Cs91Nxs)ZwbG(#dU5n>6LXY(l>_GIq;rNf@4cy@csku#ga zWl%v+3O6PMpA%i^IWrQR2$-k(pE$+NVgpF0*tZjfjBqzvr>tP4FjRzF42`SN5CCMDwoxU1G5|HK|m3+qmaq);~Bbc~NH%@@_#z54w-% z!-&EWFkj}6^?myd_9|!lvtpSG+xl{8YulKq<8X=rCM1T77+oH3wvXXnf;$28Mfwjk z6&5=|YAXIrCQ($V>}?JFt{GrvVvtNoj*KFuS3+DNq!KVs=HJ=+|GJ5{Ppmy>^}VZ? zSAJ^wjY}V1dctCG;dS$$o8K1xQn1avW$yB9YUU#|j_LPJE2dtG{q0@c@c)7T`d1$? zm*J9!n~jdG9qgtxErZpn)uT()OI;#{!h9ild1%oE%d>I~C*RQ@o_?LEJp$$`Rk*r8 zdB8l2OXo6M=4{v%H6wlrRyeROL_%kHLF1V(0r;9x&hHlD{=iCFLsCs|9bU4WXDx!F-RGe7qk%^(rBqfO%4D{n-QN zWBh4P6NiqnrWp<9i$0$Q>mVIE2%XeHz_-MxQt%PU~X<01sD!8Cu)2WZW-Yp;|I}cC#RWo(bMyOa=IKK3O4h zFd>hCc^V7-8xG+2`;xRyX%tQMg25Z#)CH|@sSO9(rb913hpYHxsn;#SK=Wu=J~InJ zgMfK+ZeH0#lp8)jZM}{7!US7t2pDBw(JnfYF>e43|dpM7ZI} zH1!sDvkTJb%HW7zR6`#QjCDyFAXC5R%}VehV4m(=-*j*V=ytne&ui^kP0e66w}W7S zS~wX;I$6)74}f)frDnX4WPaC^>qRu27>*9qi;wOuf-M2_g_!L>^$d-5IhN(r$5u*K3HW-r%|W~SJTk0 z_iBN7HwGr?m!QTzQ2=p8c%m3h_z2BFn|9)5Jo=jn_5{oqYPz31SYd@4xfsnG!z#DK zR^IHPvt=qI<}Uqs7n3eD)vrbC%VjYWFoi_Fh^0C=-+j~!k5V!XGBmVZ|LSu8Ar{4Cd*O$lk64rSAcyZ(9wnp^Fi+y!Z2f=j#4{(>TB{#l^{%{i`RmJ;rJr8>S9kz; z?)=B+RYG{~xwG$|y=~@^>5oj`JN3}yyC%Mk?C1LrizPiuD4l-j^s=5_Et1oeVpbhA z+DPm~HclcnP)6|+mQE%~8Cm0q~7Z$5xW=1bDNJY#fNLJ^I+W$9WmWnwd? zc(s|u#C*NdtR>gkkD(GF%4ot<;e*K<{L&rz{KLU~L|uR8qr8ovOTc_7o`^{e^YkoD zYTSE8OQUJ?*lIa&F|u?!fyObF+`4e?5r#7#9Ab~M(brxLzUW`Y|5 z^OWz#q>;IRmL`pRmPl{MT1{gH00!*)M*9<$+Gi6!Z&rdA0rPb4>R)vL&(NdD^|iRI zQKM&+73d7kq(oyRg z=XJbkT_iKXjevQ|cS4tTKPXGOw0gc<^cg+zN*D`dBL+d^Si2f0j#AmZxGqjy zlO1R>*;FVVZPpQY?Xf<9CSkPq|ae{wn5LLp6j#z!!VzG&(gZvkE?z{vu0_F+difsbs z&RW_guy+lfCJgYbCiWg!BUXza*|0yk+^jLx=+V*Wv#t{i2$(0f-ZvgF&(~7W%aFRH z%^{FLqk{<`JmDi9x7#|aLN9&?!IFS^^0#23&D>{86YY&kIj6VS;LyYY8dzI0r~1Rs z;LLB}d>IK&1k6*txvxH8uDA1tUPwalr)27RBSyrz(ZVM`((!semGK3$6Z{C6r+riZ zjst|rz9hL=tadWGovhF94uUe;n$(BG_E1tB%eJxedoZ>zL>kS zWeJx+5(6YQXgTHfIL8x1m{0Nw*eIv9xcY?O0-SNjAVT(7a_rdF+*1+mls<@+- z;+a)_(OU?f1kBUF0UIuNfWD+3*b91^9v}1>acn8TSr^h_`{Ra_p*xT)8y8QzN=PSQ zp49aq#X@LHq?*bNL%3qIr45V}It6&w;ywj9*vM8I%V^9J zd*`nd9+>-u*{{teXFfFZ?CIxEePrtCldqp#!VP2p^`Ca&Lp4jj8p^T6rZ&G9Xa;;% z9X?1TzM46cS?GJk*;~9&ZXn1*`p|3*%esr-LzJ0-`Kqu&Tfw{uOWKNhCAa0@*b9eZ zX%N8z@A$`iXj&IKW;l6{JOmR0<_TKxA#ZXYa>Ll!tnRs0+BmCSEa&hc@4#%6`H6!=Qv+WjHBJ?C*#*z;r}s1PvE@ag^U zJ8&_RF8nX{PIgx~=}B(w__1LR4<~SNVufcy%t%W^M|s2eJFRH_&@o^+nudqKp{47C ztVP9O_bL7)i>M=ipCwP#yloZ!v z2qA-jdC|JQaKO9@OMPrPW{=jwy{5&MgQnpI9@s!tvSxR7ypfI6M$Yf* zfu@=zsrHT{njC4&Sq+|^f#5*EJhi9veFs*y$RAlJZl^Tq`c}f5R;D1AyknAO;q7g)IIeIaqfC23sv@=_aC8%iFV3NZQno2Knp~ZggJ40xJUI;x zq9F+J=pb6B>gnb5IbCMcY=x~8Or1>eCib%{h~zn3=^eVM9Bmk$nS&rfz&tlqfAIhT zi${k!EZ)*?r?9uzX=8qcu41IvIkBmSu8q7zh$Ud2&6DsNSvX_qHKq(%O)Rou?i9n2 zhXEhQ+)O8!oEZ7f%0aLoV4j>3haOqo2#sHiFmJm$t!gmlX379AUWPFz_ zR|sY!E@?oK{mvgZ?aE6m(s z29&tm=#2 zLhvMDo_?f#z`PVo-(@AO@h5wFb1l{bb0tgbwj=-9(J_D!LBPD^Fw{wLh?dkzrEob_ z?A9W!P4-=)N#L0KMzVD13ZJ=Og<_Vyc;>>J=^vq{Jx3mb2?6s2Lw)-J^A`O4=Zn*x zbSGb}W>vjJaMOwd7dUTWhj;%&yPRXMv;wO}_``-V-Ox@mT3bgP3>KIIKFC4(QQk;U zCSblKd%XiV8NMWiFUpw1xuB_ADtnSv9Ld0m3{x7~ux4ST)g6ZjDFn<5-|av70A7PH zNp>M7jUu(H*ib4q+*TZXz`2L5W)0RuQOw8^hl%Iv zZBSH=@uGJJBr$0k87Lf0n&_$>?{tW~1TzBW3HveBGk3qzP@l3l_jImKb-RkiGwd0V za6m%x9xvL9ovhO{au6&Cm?yUb4>c?pujHYo_QdGisB2$(18!wLgobVn-;*M_~J zE9X_wydT0bM}{?lI1_>y!6`J)k&9qMz&uGWba^3=lyrHWszI-J1SY#^3_!2(XJjSi*7Ij#SwUZmbl z<{}}QfO$qH%wbpA-OtEGe!Y~RTirUukj&?+axI#!J zV4lnd3{+VJUCBT-=t|k@rEuPu!!85@tsx!RR`Ty{+^@;`vl6@rn5S!px_|4Kx_>uT z_eLF-VnTyn0x{Zu$Kq9Yu7R!$J*J5|92~f;$28MY4(K{~w%K zdm-%qpSAL_m0kGnzkTUvmnIgo3xB%sjQKar-wYoB4R`@un(<7(Vd~c>e|d6h;=yB! zfB8T9xBoD6QzcoU=7R22#p$i$0D#p1gK4C7Z@H9$|DghlvV(XB(~pr~Mp-!ULro+B5*hJbmJjfbZWp2zly zjeVmyK6$tI%BDcsu$P36Lyv!l-G}tS4VRLlf`hF)hQBVS5Z!~>SCngMczO; z)MBu;8e4G>!|I74|Ax!5L$I9T0s+;#ID!pL)#Lw6qNoJS*FXsijOXHGl@=JajZoTQ z->gMWVRoSB1QLBKq@DpW1YA>%<`T7PVyEdd zHw)Mj*JC>aX^g)3Ngb=}^X4NM5in1*j15G1tr~40nnH?p!>H12M;cbdhC^t$k;YSO z+fXW<-V;2UdkCTg%=6D;1F>^#1JSn`Hx%-PPFI1d#!(L>rVC~4nMUk%^2eu}kN#GI zIRWzpD#F&k%?dQK^$*s3>W($2itU9_7-&gH*1AWUic!~lW(gnT?L-L(m@ilXo)%hY z5|XEdwB4OgZRJy`LK&RUByfQENM*p(f@sxDs{+4Xr(7c>6EIIG4?<0jkY{IiH=U>( zO*%gWLf41GzjkRtacHq3nR1?Tjgb6**?SK-Nv`T#e5Si+x@vlYR;$%YTCH|gtFWsL zs?brO&^hPak`SG9&MgGA4ESM#)w2eSNygYs5vaIb|+!)WMN1EUnjWucnLfgD+(4<^%`+8N=K}g@IA|l0VNVe+E2B zD+|^qlvJ9tJ~`a5Et5|*)N(JB2@MMTMJD{9c(~0WGK0qqc#>XbxbRpFniqFQ*xqWC zqHfw5G~{3l4gTS}NoKl-cGuF-gYuy>3Y!5>a(Do$s5((aov_Itj%fxabq0!p#svqu zCpv4E#GaYJr2aRxJI{ZJ(D02opNhR^{V<_P? zw>8p))j~S$$Rrbp3G`1ixcR|6cNd4f(2Qbcz>}rN;fQ+?iszcIB@;{f8{KHoY=ELs z`vqsGL^GL&@QRbQz=O^xZ3a9^;)!6yDgX)2h-I<66N-49Dta710H&pI&Yn933p*Xz zG@M6={NU)7R3KR{M3nE(BQt}^40w{@L;c6{z>jm1byU=3&#i>`-AO1H23ZJi4}0ej z6KZGkd=E0CkQwk~*-t?E|DGo%7g1h2CI{fg`Y*;g0H4L?02IGO{J+Ev@dN8hv1xsC zePuiQ-`}pic;V(o@C31t8K{OWsGU$grB)kjxLtD)8VR_|E7M)q6Tw`HG{ zygNAX4MyV$3(cVd5q zJqLR-mcxA506|KCVjTFD~(I-Qib${6kq=F@;@(sVEOgSFIs-a za&0-bY*@aqeBH8W>3d6`U3%BjtCpU-^pvIil7H#$rQ4SdNq!~ySINgE|6B5M$zzhf zBq?!9RN}vroRrAKKNWvP{K0V+z>6DC5|iR%;w8}!M4uPENAw!e^F@z}N}`bHKG7Yb zBa6RX{PyA}7vByxlC8yu7c=~Zk^hJO53Yf|**T09h5h4nZVe5A-8qdaHQ0F`RE?eE zL22wP4@zNoOj97RcT9sM_P(iXb4Chs=1pY|0#uDnr8EMR#HLaj0ZL#~DUFOIs5X_n z2v9ZlroBo4D#xZ03IR%EQ`w6ErLd{&MSzmnRQ4i332Z8R5un&xrYZ+g8cyZ?F_Ll( z_S$K-ay2%Uya;4f*i`Z&K$X~3@*+SL*i`Z&K;_s}@*+TKY$|yXpcM8>9%dvql{yGy z3G5Zq3d^ynY)wXz)?ib~ivU$)Q^|_}Rbelira&vPsnkIrtH7qR7Xd2Arm`0SN@G*m zivXptsq967lGuxQI1tzirxm8LsccO~lG0#P*^2;GW6z&{ETzJxa(9BP5_=wxtO9#3 z4=Tr=!-LY;R8k{&E`?p>ktMM$9+bdF(+X4ARJtZ330Z=sk}UzM#-2U>SW<;er8)vx zB{r392~Y(#m2C-7IX0DT2~ZlF%C-b3h5arM2NHV*4@zK9pH`T}9-9`0{_S^oP&M`_ z530h3Jg5?TDi5l_p2CC5u_yDOH1-G&N?}jpK}qak9+bca(+U&VRC*~Rq0(TzsRs}$ zHP+=pNvy+z5?FhxFvyqMpB9B)zR80sum%q*$Lc&Njn#Ni3aj#U()m zIrbhNl*Zo8gHqVLcu*4idmfa)-ih}AuURlGY-raDYp+`Ug6tn}7ZClAk#AQ17`x1`*X)B0}J>`Ta@Obxnb^6Kw4 zU(PQ&gVzjrlJ5T+o*bdb#GD&KqN4~I6iuB`7XhkjbZwh4lb5W_IizN=nE_9d{N15> zgrX30F5|UQ*;ny5dvMwU2&&Mv>5LbujZL&AS_P(XR4AVS|BhCF6a7~y-D6KMZtgy1 zFZ9M4oM*t3syt(89H9usk37P95|s2kN}(L2d#)s?p+wi*s!YZ+5P07V#xvkaMV>yq zcZ8x8ce|`29jDDt1T@;7s{=|X(1kqE;q%*$s*KLOZnA-JtBpP!Cx!609+ziV^jje} z&EPr%o>bv!L-A-GRNywzjHb3S>UVqeL<#7l&sDzZN)OVdY6c=&a4rKg;2Gu3fG27E z&hYlp8qna*#5+lkna-wDnIh_?Xmo9AQ(zQsqRLFAQQ|bF_Ou4=p4yvFa0aIt@Fdko zht1I{+HpQJJj1?rk1yQzSyKK6#1v4&$uhWLYqkTYgVBe_+xzx6@AvDi5cas6Z{;Az zQ5XDzAPijtMWfTP$x-q2CO6QtjceJdz=`PYq9PI{Qq4z((UBCXIS$;JDMOq`Wja!l8$m^wt&Ai0PS5z}e0AJJ zM%V*pXfXqxRPISb#RxJckE1Ea^o_D6Q!OYIR!|G(ID~2<&M&_^DB8>ff3`Secs{87 z42Cn{N#YMbDjO}Kx1t?t+0N1Bf{oUwGUbFsz-j{KG=vfY8SH!{ToP)g|F5Lujq}^R zKU?RVA1>_8HrSU2+NQxb9DR!1kDQb4f76p^=sg3Ttd7CZIg+627>B9ol}xT`Al3-^ zvQQN;Ga_KOowr}fSCS3ne8w$UIAu4ToA+C@&Id2!))~xaz>^B~hmRYHp<#0Fl}Qhw zE;Q<;PC5>JV3tJ4VI<&EqK?;CeWo$)dS?@A9Q2kMJZHd@^m{}9NQBGK*m!M ztxFd`4&gArA|Nf=d-)GdDvWUMT?ZuqQ-U5TW0W_0Z-EJp!NTeg{LlTl-Iw$es=AS)u+f_vhqIs zH`te?A7B3Z@|{Z!$tNU7#VyfCM8x7t7mtGI75y_jJVIe)Ikzx}k<@hu5k)8#HmJer z7OqV{ILcJ>DaMf*I#$N#7Urob^wKZ+^9=oGz?0STlHt+_g^cBn>kQmwYc{KMlHeAm zhRgtPP0?yspj+X`XOuVto+R?(;pzwlf#p0f1Ewkki6H`%OKX4wGH^bI_4S<|B`@{c zjDlytlYIVYc>M?kd*vL^^L3xKQTDVAYCRMP^BZs?+}o$_nY-*KF@wbnc#_-;;lv3F z>B^lr@%zeJi`z_6@f;9?S;^RmaK{Umx8k_D$ECz(@R(-P#=q@0{7F>|Oj5+U!j%Yv-MR|Z8w104mbo9$$ML>ZHHZ$9S0+=Z{tSQcuoA*0R+Vdo{EC#p!1K%)%;|zF` z`tyf3jv(CYVb0wvl*pRH72UvQ3K-yo796tDSIcDxli7(wIC+%*a!(V0Dck-sGl!q)+?FDge8JYKvl#O>@o?0cCZm!b{mcuTN2kJ z{(n%!jGCAMPgc-HFuOo9+p*cDQ!WwqmahkZs_zOxDs6Z>oTduo*wqHZl9sS z40uwp(eT014M?$Zcwn!^r>^7*jSS%erJ%!w@Jn;Pq@Bskq@w6`UG5`hXfgwyRPZq{ zxuXodoXNfE?>iKlK|QT*056!|Qji#T+UT%pL`x+jtpEBINa9xpE8(1iGdRtFC#n9y z@R8AV=v~l5n(a+$zLq6iaEIi@D3lLV3kpJk?6oIkswJ?jqvNM2Qs;JpU-nBuUgnK- zvj!Q^(r7F(*5JTtzH(j{Z!|VL`371+UhzlH&~yeoSpm-;(xapBuEqh(((YDekS~)N zC-6kw1euPs%` zJ9}Ex#9%mt5MYKpgyMoj(dk{=OEZ3$QRWPIlFIK7H%2H=Fn3hNrs@U!?O0!vC<6@` zjvyphINvNn6#VnrQmO%|ekNP^>>p>8Jp-Pk^m{9^M;1Q5_~FHM(dxr1H%NZH_*>ky z8kOEF`|-vPHa>#iy%Ab{r>rEqfB6IJCefFc?p*zv%(ni*^^dN-NT!jU7Ppu0lO5eS zwfx-Wr)_*$`t8LJum7HGd9{FlX62`nzgYg2==tk!7r%1tW71!W0^-zqfARa$=WM)c zU4fs&-mv!j8`+g_tch1XweifA_lVMxH?O>2)LBlf{Hf%FlGd_!WrY3P`hVc>TY1Xr zvm{>-U4{RArLyrhv2NuF5}!!F;#_(B#?{ie=&ho^Tz~cQcd*Yc-M9G9E4YMM4@*u+ z*2TY(9v6R4{6+DH#BY&2Px9TRwWS1jGrVHyyURD>53S#V{~3M}|JKUcRn_WkVsiD! zs$}(_R)4gnT)TDcnzaG`cWe2z$cB9R^J{;-_Cx6f5hXe)`d!gKiZ{g@qW=>8yVx)O zBk?mNS~w~2^rf4Yyl|S}X-mzeFD!jvd2Q*}%XiAYzT8}X)AB2%t5T2jcccyJ=cMnK zzES#e?9Z`3#2&@!*b^}~b`N$QyAhLN|9~IESFm4zU92Yixa{v`ua&(-_Uu&)oTGU0 zntAOVYhPVIyq;VCipW;z0yJ6Gtn_#XIpAy+(sfeTGbcU*>tAEV^WgnsS`RH1+ za`ej#kZd;-*@8vy?W)=g;A@vl4pNZ{CT@5y1LWoIygOrxM2a`On*nwb$4dWz1(YF2 zyq5FYDu-Xo06W}n_zVLi`kr)E>9N|p7an1Nj4z+DBqDI%2EhPXqFAqW+r^Uh!rwAL zTdOR^ymc~@z3SiCXD9=ts^c+JxsB@?pqTEe!tq2c7~I%kfuy};R}!99?v@h!3=ic@ zEhkDgXT_d11W;coq(1`hB;Z{=~9mpSMfPzV`_1kOCME}@V*oOu~cB>)f2+=oh z*ScC+^3r*SxkkK$k%;OGi9*9bmTEUXhXK02hCCpzSA*fxA7cU9kWDyJ4LZO4eg;T{ z1_PDGTvK{CpUnW3iZ+&}2Z>S$`$rZiB@~rdsh4oeR$0JlQI-Rqpx1NL{Vbr@q$~kP zrszF?mI2B=UniZ2b{d8|Z)Sn2Qx{5^92zb8{B6KS88qH@x4-r*7KqzYrkFMEqK}_q zfUe&Q=cF11x_9gM8K6*8bV@OmvgxJ%gp~-UTO?5_^)okqlL4~9tTSJuQ{5o>Vpbw& zqSY}&TopatVSq}-+#R?=RWH4wXMlJm?-_*JmX!U}D;XdYBXjDYW#E#Zx|IR4{(;8O zst0S$8`&DmRmqNW;3`MF8-L6`w572J$|=7}aoxKZz?ZCr>n(H8QaUMPfU2U_%na0p zQdrbwfNn7eW{yD4={)v&1_%|ySz9Dt4i=6)jsZ&9hTCFs#w^)WA7pQ-yQ!F`M*0$` z-^u{hcFtAvtGjaRp~tfly=dP|tK@q5o#$AfS#sJ7M!ku;`Xmc9ROQGZXB(JRW(KH5 zDOETUth=o@1X+MEbZB{^T-M0gciXdRYX&-Ecj|9@Y=IH!5k8xvpDn7Q*RpTB*3x?h zR=Lt_J?>&9n)On%Xzv&uH-3!;>H)}HANB^S=RV5-bxSK!a4X9V^PO@A=*yM9bSV}$ zl`njR0isd2Pj7d$&E)k@Vt{N!L&zbhi@bY%iv^VRuDKjiR+Y!uFS&1s<}5}_h3?(< zMn)p$X~!yREuAx5$MT4o!#P99)yXTa`zj;RkM!f6j>}C@=ibKxVR=C5Nd|+Z3*Tda zkVao<)^iy{OYs^8XxaL?OxEA2yA*5{uebPd1_;=wsxepeRk|n24A9ROQqEeq zK@!TRF+kBvq{v7-FRsfvnnf@(BpAlZ}?VET`nf?rDapovcPHMw7dhPHZrpvYpJg zOzNnr(54odkIqhp{aU@-=`5#jWIA>`X(_h4hN>}TI*hRoHCO4NJ!EUw*VGI^H1v@i zS?}ho*L{iws>xi$7wN0q%RUweg$EWpA@??K{|f}z28~=u;Zl2@P6^w_(y3x6XNY%d z?X}M_w@`9Nwv{YJ6lIESbR|nA;SXp^gyQT?%rkO|maU+X4@#;#e$C$EuaYS@r7{+- z9&H2KK`NOwwYuxfS7@hn19PUQ(f6H4zRx@(9qrilwL;6TJ^e!l2n_UPts|uGq)vZ= z0eqc~iq3S)gWhSjQ?6U>Wh0qTr@OZ>!>OGbm?KK9eGrl#varRrwQZ{@Nk_{!+`~Mh z4qz-W~B4|$0M^Zir7U+6rb()bDdc zugkoATfS!O`TS;8u(HV3PcG{*LJom+*|rv99+B#>0)wP3!C}`gE_K(3jGl+djhrN>i{{?)Rd$w>9cl4M8gj90cXl)RYg5!ulgs9MAJi?Lmg#IL0tPI7LeCdZhPMtDO|&jwvBMs zn6iXAR{FZPF%peXL#6hHJPp^KvB2G^5#}6aL&iv63?XN z4M(UD8=PZ#c>BIqxD!g%2WQzfnJd<8zJgkt?wl#r*qkxk(%DJ{81K2g&nG_UKw`Y#C(!= zxxMGNCe_hsbEVEo47~A*MoX&_M}N)&eY>HYa<;u63IlvZBA8Ngyojo86d7p^fJk~lPJ(O1_)b?g<`PW3|p>Q zVSp0Vs&tj9cFS}t#Q+JrzF1cdlwQM0W*o4E`+B=cnb(v^4g0+)=!hz895~FG^9*3i z>AUe&K(NjJTIM*SvYM<&^+jq9%m3)$kr0*pQ;C#6^WDv%GZ3RbS| zzh@XG09KqQ)aMCU_Q~%e$-CtA1%gnwQ$<(;K};9}EqZWdoOpi8WU51))_mAeB$?-L z|2^OHsk=zk1&vBk9Av$|oLe7Hr9=;m4BYeag$0YTP|uVr`IxpL;Q8cTwBmw7shHsZ zz(_yw_+}&%Yx`22TnR!Kq3YTGdv5wrJv2Q*zcYf|M~9d|5>Wg4bjm^o27XW0ZEzdV zMovB%uWb6#wRWNe`H!a%C>JW9JWr}o{mY5FDB^-#qXbxkUJFGANct{9b(ey?KvQJD zVrlgqhEUq(zArI?j7Eo!A7@{?6IS)+K}1*677b3W81DZMQV2O&$i0cteG`Rvoc@wr zMK{vLuEAy~fahnsmFNEdK!qqKG`XiZf>c1qPok|tXaN0mHKk~|BekN(={6Xwe!T@k z-6V5yuob3u{tb$gqZ&dLN8Lqh?jn`YaETdk-eB_BYo@HxeI!~z1Q=kZFp}LEZU(iq_z|$>&q%1m`_H`VcP%MpsAsSBjs>-_*#04caqp?m>U4CGM(gYoW;|8dYYBzcYO-bLioBRgI zs>NOGnPflnta9p!D||A2rC3z3lO)x0jF8$CAzjm0Eh@2vYPMI(Ce$))rB&(`~iil^q!DhI9oYw->kn4~m$(n;|q4ALrf0 z5hT(%apDA9L^oac1ohEcKU6ZL<0)twhBMRuaxjG~e$60TiMA+f9L56GL_2ZT%Jv-L zFt)O7R0ww+?D6_i!0k#KqYW!98Xg)cWv6bv^;V?K^^c2ajm=UJ7A3y8Ar4W98k^00 z7T(>Ae`hNZI%THIp`h1+_9;hSD%9;HthfL%q+`iaSnr}pl_xFAWHPFRCJv#@TMxCs z1*VcMr5}RSJg}YJNe^`+1?&hv{4kIbEiAb0w6S28$ELnw?Nu+sSlx!mA=b zCB~H|y;)8}7m4!xoZEC6!7)tGZ3nB_$xV$vgJWuPcy-({wQ^07HFj(T7hwS|NR5e9 zJNqfnu8cQM1>Y!KmA@R`KcdmDR4DcW0 zqTgQX^<3r?gsb<;;js|~Z;A`Q*Ug$c&4{()faDKq$gThvyQPYDN+CEGgyw3&Fc02a zJ3GJoiU_Co7ci=kK#$v=?r2&ex?a*{3g93CITheyx2LD$R_}2jm{U+V)mID`M+8vi zLanv^fs(T|a7P2+`v{p8;M&wT`g{HM`B32`UJeeJcLE8{0n=HJc+*84nic^8*x-aD z3LX?Cv{bFI5x*gy0#C^Axx|Fi{PV`>0(5d`&$3@ss%X*rwPsg33m$lINYb;E7`x(2>*-5!mGb>O}aiGtvoEO$@)xx|mcDZOlXesm5fart%J4#%Kd z@x~|;_M;)=1YDDp&_M#$-v>n$PjaUUVc=jqvFDZ*PWVs3E&D7G=G?LaB~_-GOEyc! z0g#360>WSK@fL3u^Kc5C9~VyKrEq%q4j{rEShMZeBcU+p7$DU39wH_14`+R*nwRot z7j&O+Mg9b>|F2zm`@+UcH||^i>bh)AzFL*Na^=5PRCo&8lD=g5tq?QMD7h&9YgqR; z7k|1K0^$E#{tSJ>;UDUG{_bZu&xY;w%erR_S| zJRMKMDi>U+&g?HCoZMT197<5ckuyW8v8)vg(u5C+rO^c=7)(R9qt&;YOx}uJFK!8`;*m1=o+abx1Oc04obAZdy(+lt zS3wInNd=x+6$r(8MIItt$v1()hW}B2DZ1crqrnK1}F%r=@%=X)|9GQ z@QEWoN(M6i7&0ywWi4AE|5M9IKtmxnt$W#?Z=_L1u@oGtVTOc>l@glM#7mHb6HRTn zjEq<0A;NWh?XWuXp%4DnA+i#n1$ipvO%N%sEtUjs&|iEddpcc#VJn|Jv;8UUnnz#Gy~0&`J*c!h zZB&OQV`e9;eFEbSPze-f-GRH(L=?!2km)^F7S@L7YPg zp&Qjw6_RCwoo8Ds;WrCc>QxVptlW+(Y?Xv`=19gL$=U`Tn%QyP{(E)-lN-|1U6ksA zT24*uxJn)zStg!eN+f7=&=>51!`s214;$X93$#W#v0*HJaAcl%exyM-6@6o_RSO8% zPzV0h1vp6eX#%kZd`^9q~Df4VflT_w=TVO z>4?N5ewX-y=#NFqi(3o-2{+CEXDAz?L_&H!+p-b?zrUM^hAd|ISX9ilY3QSKB4xB7 zVUnVAQ(?#_&i~Wwm&Uh)HMv3X+2PR7klOX5a7v$o?J<-u$ZBO<%%Ea4yoX-6q?yu)8-1pW0k5rVVFn-JclTH6_a zHrceY2NV}h`vYKn%m8i9_}GovHJxb88SYwu1N68GYA<8Zf&Lj1Qt~OlnLx%>K987in(rGfkCM=Xa~+Yh)6Yee z7Kcg=7Has`xG++cYK3hV9IqKa2xsyRn0hCm!nmn--`0+Vsdh_FI)MiC)es&EvVu>t z*wb0>BOsjGdxpnHaiGRU4l0H8q`WvNHuYJc1-&&-_^9a$<7}uq-Z*)ZG&& z>dxJ71jF^Bt7Jn2;Zv7WJ9WqVW$z;(oZ7o!$MYee#yRrTtO08+8i}dRFb$Q%hYT^T z#; zkenxjOQQ?Mjgg+V4P;=f8K?2yyDPlCZ@hcgML3T)p!NUZ1@pp2aQ*e`H?752FUsDq z@=^R>uy06zEWK*^_9c(xuf*RJuZzws-UVW_{tT;I_^yqLfY$m}DQVm(^VXmKoC|qf9Apx&J*nVk&6>K{m>4XIdHlb_avd+4*Udd+(uet9G zi(5>r-*H^2XojpuQaxiAcFy3?7rG9naJOw8Z$ zc3YaTXcLiGOKmfNsua2orfwsRoWS<$ep4u0hv4 zOvj!Kd%lm$xm&ne-x#L1nBcv~hRDAkc5YIJXw$6IrhE1{sH8^M+-hx3IAQJm{;$Ym zge&?l!-uvO(ffn{v5K1P%Dk^$&H3aeP*R1i`4wd*VUYD?O3TZBhHw?XJ}hr7AQi_+ z6sk^F$sH;M3ra1hr$pEMDzc75JG0%r?e$7MO1Q#b8$LXG3R0LHlI%O}$LdN~h>AFB zK~PqKuK5*4A<%0O%nOZO`9>0U<-tg@o!(|=#J))x8| zvQ?gyLRa8F(S<&B%I>s;n+|YC~|H^ zX4=}zDK!?I3v65}FeIs_jYQy`zI~!@hx6Qm!l`}^t^W@#d~IR<7wZdaM^_+LG%l9m4Bsy_aR9JjAi2Tp|Gd#U@12o}yob62fhH|%?v6;0BShYe&NkNvk zQl$+CA<;Jf*k^LeC^5gJ@R#u)!|2xayZZHd%LSp=JoSdc4+LQG0D)-d<2!5paG4Jf zuG}xdUc$sr9otKcWYb&HTT7039TbCs3j)y|K)Fk;BCgbvgsb}tSTP+%?{d6iD(S_-}Zq z@JjekSV~@lDq*~o>`;ZSJf`Y3wGi=)f+-HfWj;tH?D8Ajvy{AIj}or%Plx%f!${#1 zLllGn)>0*>qwBIX`Z+@zl!XNbL~K5Y!n4;HSLi{)mHi3WLas*2j%^{{u9=Fa&D0>& z2Sw57Iq&evc453Ljmv+Aa20<%^llwODvo_#9bvsS)OKnt$vmhBiw%eZeUSILd%bZP zHw#zlN5gx!P-WzE(LZu${Ws`w$0y;c6g#_1u)VtKw?TS50xWeBbX1AE^ zx?_u(J);wddeMD^7WMuue@>P zr7OR;(q4IJ#kxYT9AA;*Kg7R?zYl*M{sR1Icmt`6 zT2?RLyu7;fv!$;uePrp)OD|h`)>3EbiA%O6ImGbCBtMdTN%DTl-$-64dAg)3iAfBS z3zF+3BFG}}894XwYVq^LPZbx$0r5TJGvdRd--x~?`nc$Si(Vnx5Wgj|Wgzu2BKnH-UvIwDF>!T%5VzrF^pk(@d#nm9yaRI2bK`#OU$l?LKY ztNNr-snp;P@Stk^ejb#~E{M|n^Jk4#fg;tx)P3Oqc0zg&X{c~CVT;6Z8J&x2C9 zj|U}jFAqxKo@ruoJTxszYj772s>Yo>D2Y3GPy)A47e?dmX;D&xTX|45Zs9>yxS0o4 z;wBzcfg5>HId0%VXC2=heO5pcRD@@|HX^_D0odOja{GMr0jo&?0k^)-u z<9JXteisi);u;>5z}3@*De=coivlkt4@%&Q=?5rq)ifx_<S>s79}+J?L4R&zl{e~;kWXj zO8gccRDqx3LFM?(JSdHy)^J!7F2Kx~Ys>XiEgVNZ4 z@Sqg-10IybzR!aa*uPH`Q)54#7FB7m@A9B(>^nTD0{b=(D#!kf2c@xZ@t_p;uRJJ; zeUk?zuy0H&p~Aj5EvnRDU*|#9*w=Va68kC-N?>1^E=-C2%e1IMgZ(oPs>Z&=gA&*m zryr}pzC0}|*I=LLLDksjcu+a^Sss+eKEs1j*r$0=68jVnN?@OyrYpz3FfB@}u#fYg zO6;F_P#XIf4@zMl|Em|i zxv*hgfAZSPSKlrB;>uU?ALG|xcS;|CwKKkCk#xl`61{!#Lm>1&^$+;2pF;-B9pCkS zmkQQ<6+#Cdk8&__$(5VIoj|{{&Lr$(+PVS{5p2o9*5C-nS)}ARR+O($auGeM7_@=G z5>m6kHII_>nX#_ivxKX>3U>E9cG=xC-l)B-$&nT}oH~Il8*t5|@}+hiFZT(;)sqdw zTW64ZYr{3xL>U`&{knoZYwv(Nh#YM1a(W*1X74dx-u=Q=TNygHP9xRCLoutGx$G}` zOPx|r-vzZ`YY~pB&GAL@?kEbrRk%X<@b0bKVb6^_$ZBb+U4Bn0c4G!<)8lg)KtP z53o1z#e8{BC1Hjdhfjk$LAT?X&g0WHhmc@~(q9eTTeqM_J`QD93tGx_)7!PVqCgO~ z1tCDK8v?UKtp8d%na`l$gHtSLd2$KASFlRh5{#s$kV@l`R97`P0|~t@?1P<72yF}3 zoGM*v6YvT=M7WX?7*=jZN{+X4dw~L+=e89Hc?T4P(Uj&qU-x@&GdKP&_X)z)6N3-S zNu=J`hefZ>>jNEqwU)4fYA_q3mGi#CeP%>g=t07j6%D&vn@HL7!}IJw)6*Fn);V znjqHmoNDc!ISIQ@xFWw9Dz=V+B3uyVo`vki3^|j{l>;SU_5=~2=TwB9K^;t9IPqVj z_5aa@H!N(NS$C}c&g!>Uow66n4zD~3cHr;9($eQFe`;B^^yf>5BsJIv_lsUFI=a{b z@&AAS3?H`zdGwAno9x$Mpc)B%Fc_6*jYbM$4Zy`y+Y{$2YH`SnwH*OETY|{X0&Wpp z=h!X76I+m{Z+wC!WYk4!bkoqx>wpK1E;jn$1kI`31@j0Ar+8|3XbUp>jic|G+Wnf# zm~=n}YoJG=YrBS-NME~&Uiw$zq;4Lb+JX##<5)WlOH%Jwc6(||2#O@pwdqG$f>Lof zkI6%f$woD&m~fgWhex&`hu}CGnYS7kL|X%ONA85O33P3G8hJ>F#!GU)--Q#~94>4@ zw!y<(EV-7g((-sb5lsQw9q?jeURL+MOFmRMhZ}~+w;)g8IL1yoVNAdQm%QBo4GT`k z!^I>p*v(@1;jKAjgcH1JxUq%O19G7-{asa}(C;Ne*)EV%qid(-PgmCLAB9so4wN1@ zLCI?LxVwQ;!3!&0cq+O!JCMRkMLWCD|9`~Usb#2ueOd+TU0h0Dmxf!lwdW0OjFbIqg^BRrC-nG+%8

)boZz*?!&@j#qutI< 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

YDw%xOtuDxS<33i$|Q&Y-u3 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

vERhcuZe!N5R7NdWxS)kiKlSestrdZnunND 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

_8=bln3 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%0De|v-i|P%^FH1l*$}dSk)ygkQ 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

lG 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

9=^in;Qmzw!J1HknZPPL+5Q=6sF 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

  • UGKwD88hS%O5B6NlSBYnf^p;Qk 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
    *?5XPPwuPTJ@SmRQK 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

    $60x=0C0iZj;po{W@@? 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

    0)FK6za>H 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

  • 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 z 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%0DFk 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%0DJQQtZe#nX?J`S4B4p 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

      1#`gh*@3hH<52& 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πG5 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

        e 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

        ;pQJr%Exz9#GjCl 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 DSROk7 delta 2282813 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

        )2>EUeS#hU(>ifRcI;wxCLDE9x%xSJjj! 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 _}wJ^_~^T)rC# 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

        *sfV74O3*PK4*Sa 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 saq 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

        YP`cV|( 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%0A=}~+M`|)@qNT~uo*i9$sbbz%2KO} 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%0A8Ooad@Jc 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

        7UP!Sut6|tsTU}4* zbsXbS93nPdB>zIFJ&uC+B=O@Y{Bcd8$UL9oeEb=K26NvAG){2{#}jOgT&z^+xRwg{ z$fx`1b)5U%t+G(^AbRUwE(6(#J&+GBjk#%g5b|%ey_eJY_tR%}pGK@EraU zApS^W=f8q@a0af#f!q&;LM4XDpCd}5xEMbP=h2Wy7A9Rp1-C4G^EY5;yWhc)z3E|$ z%ltQ}OD)vde9=KB>Eq7=0#Gpy%{}@m&fn?t0n;~($Vi`;JvQwus8miDZ4V${UGu~B z*@6T<%L`{adUq_8d4()cwr4Bj8aYruUbHxnco-2)GM}P`5awgID2}1Kp>6bwklXhH zj0k-u3%z5Aur_xr?32gD@QROAit7+CzG)YW2eg&(qqBdvB8%P$myv_1W zU%DM?h1?%xp}jxi8|Hp53&#qnut)6pGsbw$4M>cfyHgf|6R8jv6K+7-!-2n0BUO0h z3_o-YnUBjxF1ZhLAoBrut*#%}FvQah!SNM@k$evm>9gtjuasbe_n2lsWr3rCa3-bi z((u4R@7#<78L6pnXIlFp`0sVyllE)cJ$TWlUFhb*q=s3a`O- zwWu-u)EN+tS5IHoO?)tY83diU#@m(XacL{mkxPKu*Dk?PWljB3xLL(b)V)ygz-Sol zWS7M?;4b~fm^@|)#tx==&(?EK46q&1M(Xrl6Nzh}U2U&xP9{Xb-t|h%^>Gp`ViIJ8 zsFB{d0kY#*@m$L3J8q)uV&_+CuYoAf*t)p#W5JooUtNHhkmPU@jx(|@ie5u3p>M8l zMHX11kp&^fO2g`Mtk_kod^tSd_^=^$v*6O`y2&MV@EA-JR!>&K;yBB|k+_D{%_<

        NTr%5=C#2J4FNTfPF6Sg?zZ`HEDBpcqvi`A4c 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 a=p8KVwO z0=%~5+|@nBh_8*BWh@WRcH2fAGSmR?9gB*&O{^LyekrP?6j}*S4llY1&xpj_i_1_h81JjBy!tUf){ZOkb(@6Yrzmo4lh480~S% zTp*@jgzwM%#j`W>CC`eCy70>xuX`qY0zgrtz)`)yJwR4}9qb9Tb#wL&2m*c>;hgRY zObZnF-}7(sU+y22)t zrw#5$Uh@!w2b8-ETj(oP=sqemc5qWa&+DrFsnw%Z=1vGzi??II$J4I~^s9z`eTiQl z7<@j7rQ@1k6OdIUiQ3-)>zXqV=- z0vg=Z*YlYC9x^joj>vj|%5W2K(;0-kZIir)At=`>zgsS%3=lIzQCsd%Y^3X{sspD1 zEz9fMgkXR}(VsWz+A~AZA6Uas$=WmMxlgD_UnGVNgKhi{`F#!jepY_(Eu=!vNa6r8 zRMU36;NAN+4O4HIqsB}6!kzxJW$4+IGBk2SUpy+;O{N@b+6yxFdHvAl7v=XendsZV z?I0qimcgXQ|24s$zo)!nl^3RGA~aJOCiM?;tydWyecvz`WZ^Mkbv!23vs={-Y8s`M zb;Afv8Gx(d7wN`fs%ijg=`{cX+h773Iq$;fC~qj`!58B3GADVesz2H^oTjU*T7Ew@ z_9RK%{QxC^M^nx}P)a@f_4;g@NMN63xCu&Dl=a-L=*ZOL@YW1^620-3qvV7#2w9vw z1xdtfMRVxqy#nm;6b< zP4-oo%bvjE>+_!z_?C%9Yj=g0~m zG0tieW4;`6LboY@>^gdyt$1OAPLv^z&PUbUXj}DyZ9*UT4uX|FJs8Cc89WAln@PQT zI>iy!Qn^vQkTPr*`j1&qSEn)^ha_A7f&t*F8PJyDngk5QbanPo%@}abNv4cOfovrV z#(?McgDQy@A#EiLhJSlK$IeIOl%B9vFjzys>94T0(lWNu!;sFb_9l!kn1ro;0j+%K zRnsW!W^W(~qjn*pHJ?r9CIOTPES0d;F8C1n=Y8PPd5{Ec!*to&7p#!qb{bUWxs-vp z61EBkwDSAVCTK+E!PbkxkZ*4vU`{F`7AY#z!`Kb;u z=n^jG(Su@SAW#`7uDysAG`GiU#2rl-xI=EduJ>xZY;WPl+QdBbCGd^Nf#>f1tbq9S z`ns{G*(Gy23Q*1X-r{d?4Tj8-x>r1dM@RkzZ9ScB7#%meR4ur2RgrnV;d9(djI%S^eGB?~M+$hg9^%~};)7{)-w@EH@ z!}oJYytdcsprwFr1JKkBce$HmO40Djqn0IH?#3!Z+|9fmtH9BBv6S(A@TsAV491JOMcZ`}iH?@Q3d z)97C}mGcjLdmN4&x(Mb9ZaH2O2QI;BKTm$oo`JFYvOmez7h~vVUjylM&vkf^Ng`wu zM>_wSI$ErnUTN;@WW3`haKJ#X)&AqmE&K05>|O4B#!e}PE4bwuN&GoV+0^EYP3{$B zH%a2m8I+Ac>ZfPiPLgk*jJi(24|9&@EDs$GEemA?Zx4F2@5&A!_+ik0pFfm!UsedD zevbEkpgi|y<~R>Hd7f3!LHMZmZPUWFEe3{?#cty2^`Pxe#31dvWBoY)(iVqSUzL;H zI3Dl*Z6TPC%+GE_z`Yix&?sYodLbLp;&kr!$jw>WVi>e=H+9>KK;~ahfDS6lg+a&d zLApJ`NW+g(s zCYEyZ_%gdOBxi+k-#cqomKM||T!zfVy800|=5>=GP0e^$jVoB1FdSL9qd=wl_+2#? zwKF}Y7HnRL7<8Lf=BmptgE2kAleKPIS)#^oT1o9?hRiL~S3S0g8^*ktdl>;kFGZt~ z*Hc~C%pI!cmUq_b~UEoJm6sSN<<4xEHe8aMZY4}s_JbxhC1|4U044}H!r^V zmMgAT=QY%ISGT6>!aYV0tsGtm1@REd~ z(K0yH*6v?7c2O@Zf^OZsML4PVtX`dsGKNNzG9S%u>{7o0p9&QzsW|B*dHRxs;nJko z@K4FCpqg;-MXQIYFGsHqp(;bDNtv?HgN5pmd!ar@WqMT(J#qL5Q=6gHxFn6jswpvS zl8aUk?O8c$=;)JAHU$m6CI!`=jjIu48^wB5jvRW@Nu#9LvV@`8bnsh>*}H2i0_j#g zQdi`RKH2QyhG~vR7nhz&Txp|2Dsq_1mmW-yIwvF)Q<~%q-_F$LF~d5w)u-HcZ4C zV|Xoj(5?5xVV6G-garjZN48U+qWJf-MVw27;H6H-WNXQ&l^V@*4!ue!OoSk%U`%c7AY28E6rp zcI5Z4^M`Lo(Dt_Nx(+IXWs=z}il5j+&HZ*mIYsD`Ac`$aWJwUkb6x{jJ3@y_T-w4M zmIP5e_kHN;tlql@t5FN{RuU(%Z6R=jlkXB(+NnbT|^GbRu^HnPTECM0kzXPxh*t{>B zD1+%LHM}RR4d3tCNJ<6sdNfi7b5wLkkNTNw(fThDl=H*SRFQvK3sY0-g~!*7SGWCc z-Epe<@ioO5B&MX)uH)c%Cp3F42cx8ln1!M>biCTJnO4;n=A6{(eke#*jOYZ%t^D!x zrefqW=S1Zz)sTlV0;fK_lHL-RYvQ+L!r;bIHEd90k$U{*^*9=}7{W>35oGsKZQWoG z2ef7JdPE6qVZup`3N?qf6?3N`k|&4y-@o8uR*2i$StdU~l1!{p}ZeN|^0 znn`E(hq1u)3n8}Cwu`$B&17f8%8s^XU490Wft%>2D~B)sJA%vzCkdRC6_4PS$Aj;|kB zsE56u0_$E7E(TpiWED|WL{vdm;Xl<{4DHYlyFyX-E>#zSHs$$U@sVFr2*uS8i}0&I z{rV$adw=nUeySV&x+ovldK^dUlMyJ%dZ8q%RvrhKl9SypB{cFDs;#TqKdia0=Vtjm z>@v!@NfOU+VjC2`O2VQ=S0M zzoU55aL=6zH;?w*LH|hq6-qY4hGGCdErQ;w@4pbR@^;C3z6es`Bt#-FO5@FPFSwHuYqw>Q=m|Jo_Hh z9iYcZk$%tN&UNy;@iGFOl{|TNH+1wm8jZGYoBDQJGtS?)2OQTs)e9>Zo_pdI7u00u66r%*3 z9pNxQZ`+|#ylsbmfB>2`tJ9VCKjOx$i`*-4$hIG55L3#UBXmoynsCEYuuyb{08?nRwy1)wO5C!cb&-DHhPkYw>tQZ1y zffRNI`@ZnCdY<&%f*@Q`iouof5`5iH%ey#ycW|R8BUBiC5AJAR2~8)qnpo)^FS)QK zSGIx4d8NcOhjKR)bxp*zU#-6FcyP?%09MW+vqmNxC%{@A4pBMejKnLdM7*LVxc}@0 zh4lAMZOT_CWD(<70@vTTJoOSduHwsQp9vb|7sS#62g97>*Qgubuh@SY`~plu>76s6 zP#>6xO4uWXIGNjna^2M4i4c(^u=-Km&&QJno&#}PJgc_Cr8w>#^aiZVf0)>GqNfjT z0GHXr+y`DEXin4QCfG9Vr9QzM8ihp+K8e@lmA8;LdmbDa_-3gE@8bdC*|5+@lmA`= zdNlKW?kq+Peep;}?K?Q#lcV)Hvq`SowE4#970v3lg9HSQIZ`#|lQjM|QT z0d!xir{D-!Unx@?Zp8q6Itc@?;vhuCnaeN*9rHwfFPz9V?yFIzF1{Jv!|=ju9Q&2O z-OU4QO`(XUeg(4Yy*E*S0(q%>p9OY-WTg{1NJZgJ__xvvwGH4w{vt^<90j`aVb|3~ zPUZr2%iB$3e8E3~6jc*r>juD5?G#V_KD@4fe;SeG+Xq1Fpz9Dgl)yL&r+%ec@g8a} zx`>`&==5nka7WIjQU6v-3%9+I5_qqVfSKl=liutpk(cP0-`)8pBfLECXx_5iUvg`6 ze$H7E`YCj4@NjT(_K(?%@j=!2|K(qVP+W_A-@<9fKfO0+{xkDt=Npi>+Z_l$=5e!)@DqRBMxn0G&0x8R%1T)&&7DL#Ge8B|{HN?7#@Lk(t2%ApX z<4%L{tYveTtKsTDY{G*pj^_s(enxIYjy?^L)LpQwWn||TPc{D*_(0IryQ~bgOP7%PFszQ|q3>vSr^Jh<$O8K@QW9;}3v zugB3aFVby{G_qwb@B}`&Eo*V97jAg==bfMKaxNyX)6>y#L%c}C@4Ka=&-8q}orZRi z)}sLWyo67MeLKHE3a3r#GqtFG!P>xbC^ilBm*iH!7tQ{hrJiW^r@8ZeUxZ)E`8IQ{ zCnIM^_M=&`9B*(geB7|E6*Q{Ip?YbsAN=4z<0|WN=vR$nPw7c^n+|O%ia}}gsK|GY zZ&ct1h`@JugvKPjs_X>_hnb135yoy~*w8idbfVHJZX?su66LyHaw79p#Q~VPesJZ3 zZ1@U$p*$GC54sfV!$TjyHkM9>!Tbi}Kt~OKWF=yK?CqTHsSfUcuxl{?b^9WLWVti0 zy=vm7VyPb(qVxMCoIN|tP|?@IA^8 za$}=8;Xg>}vpzr*^FNb>c>no?5{P>_6Sk~;7vc=}#RjyNTbqwy-5aq9u)|qwb2P|g z_u@p}k_1^(IFUa}q9eG(mgBKQpgO)E@jUxeav3?eU09#121kLoUwed}xQv2V&Qhhz z5K)mXJK>8dQKBkp>S0%Uo+NhFQsP&V*tiTBK=v|8EPVpUAAlQm6X-ZTR2eYoso$t{smpl#@p^-HAhrt>L#O~x2)h#=vks12 zxf+Tit#z{W>xT)2b4Cx^UUaV9$5$j~=bdr|O~u1mI*7V;!(jPaNpSCE-^TpWqj3f8 zSR*gyto<}>-^i2=>`rQRO>QDbz1W?ey-{v7ajpx)+iCOmWqg&9vk)p=6TPoye1*^c zK;U;XS|&yaQg{B=bjs6b{jI4!GjP{UEmeH&)gN%J@W-Z#OhD+al1H&ZG=U=3XGTLw zXwt$<=bwAo`88);u~_AN+cY-tyCE&7@V(Q1#=Yx)Zn`cr@VijUc)oV^N4WO*M@?sD zj-uw2WHe>ubPqL#dITGTJ+d3KdjuK-J^YRSo>@&%F*8cJ z`jG(mDPvg+GootnM{2w?a)dhXZ)$90X^Wvig=kR29$DF&*Juo6>tjITe%`XOFNzr| zw4>NbYTIJ~_3nCv^9>E!k>8smIOTL&)hngO$fGN1+?Wy->V(5KRdP1;tsW%;qlF1k z%C5|vanqv3i%vRc;aQ`mnL-1$av>%~r4Ba&m1D|0A!V2jl`?KfDfQT6pgbl#MwCa( z89aePc|5ifRLNru>M;WaGq- zfyo_DL3Je@*-8qWxEeJqZDCa|K^wpS)!M%P;hG0o*cHOC&-+Q+=khwCm z(AnUWdeWZ38BgGInjfxdVbTZ)f@Y4-hV9JbXOo^;3-d;94m05#{r96Z`D$%p*2v9f z5*#rADEf{leYF_2NNQ%KFOC3EhcIZsZg-!Q014jWGD8wuuPeBj#aqCfaj8nJX4YcJ zAWcnAMJw~q;#L|8NVi|d04P(WRfdUX>PMY3-h3F~R!(WmQmx~`@GWg&(nsws#Ru8` z8vw19s;nGv?762j`qhL}8hfJ%vprITBnDNs3Gw1l$3Rrh1P@`r16Z0s*Re=&Za`fy zp^;uRCU;b?{*B`uygjJBSS{<%pF8t8l!G+{e(%)R{Tm6TXBLNEi2>qfke^p~9GKI>+L8xtE{)XxpAkGd?jm_D$;ss6!2Keo=XnI*&m2H5=E_(#bkQl6|xZK6ZFfhLe&e&SjM$T3BIr zUk|*tbkjOQ|5;T?Zi>8&I){&>I*ZkRZ(2u>yqNoqM`G5o>Qc^m&73ofbGW{?jZNjw zaBfVoI)H3!Znn12c?TL`$#$S&TzzYucXDY)YlrgIrrdrxTRJIky_S7m;N8G%|6l#r zWPO!&i|`rOPlnZ?dVrwkwc2^p>U=&ue(lT7R2+ZDwU)&|*C1J?^^4S$x= zBr`m23DyM>!##50fIjWJ6N;VDq+xudB31_Jx*UoN!xih4M3aW|kpjkc4+el-57r7& zBaJ2v=_AFU*#jd9lt4WbU&3k=O)~f6w#OLqK`zzxunJK$$xM)2Obq&@9@a9ACYcd( z3v@E+<9bdMRitQ=*&(->G3)EpY|?9uCYddAiy8Aij3X4oNT(^9Wa7vz(aE?E&r`!H z*PM(pOeMKxj3)zf5XUQVG|6m|TL9WUGCJ;KYLYIo#H%PKv=4=&bTy}vL3-^_gI+(o zV-qDVj8_lYX%%?m2n+G)n86C0U`w?KRIHIr!to0D59&;v_4VxP^EE;o%RVVM(binl#!a(oUW` zIQRRv4%M`*S9+BnomZtZ(8L;ja?GhTN@C8q~t-CvGYJGCAfDZI~*4F{yvI zEVYJ)=aVB2ahb=@=Q2yIGCZA#H$--YGT$vm9Yw~Fr;~#X>HS;p@~oKRHU~2bZBN?Z zD|scUU$KT3u4j&2xGF;1LnaymX`Rl|3)dpwVc!a{_xE`tnd>rpIB{oyXRGJLjAyWL zEi9->x=ZcfVPYST7nb@(_no3^1zKMoHml@ zqu~|u@eFvm_jM3^daR?D--Y_PZkk~ZxJ>tpCSx>dpgy@76Wmd~?xlhH+!^iy zCpu8L94(6S(WHUr zz?yWmRk%6qqF~b{=0Un+Mqx$j88!+I2)MN;tA$grwbdkz-imH5&EM8c;;X3VBhC8R z)0zc*YPy<{`T&qLsw+|re`+}g%>cTkSb3#mnQ`bvkO^Sr6*mVHC=XDN@7*wRToA^T zqa==H07{2F{jX)VIfn=W^+Y}6U|zc4lR?&{883lKO!~gaTuY#7aIS9@LT6W1BnK5Z zSCf&dGnkx=6PXy?s8+-_POC55Sfa+K6R*kBN&!8HGc^G|2?8CZ$#ka@4;Yg zK5iq>b?9O{Maxv(09@V~0O`e-S^H|k1^`M(LIZY*ntsAY*e-S1;?ZGwX=cl z-92z4xWOC2;*l{V9FN1c71zKbJq%&22+@e?zT6=jao?MCAAnErOHP;j)QW+~!L1<3 zmZ`aekZAuBq)*XXlqgYw3xLth%p*_LgEmIg&qFqrJ2}6Tyx1^G+@-3}87KG|UBv%S zFW?X zwsb?ca7RRawHGLscLdC?P*L}P0z8Z!kDiecuM_#eZ9frcFvR`*ZRvWYFANIIQDqh5 zegXy7+k>i$)fq!J_H~Nht}jcB^(0m7I5gye{)hoRb{^4y$DtueqNZ1&Tik?kO285} zMgK8g*&y>W(@>E`Cj(l% zWVAT=hI^sh3BIY?=`DG#9MuGNPy)aB799?2`)b?~l-3dj~@um}hPBub`|mb10x$PX4V7QK|F7GKr-FVI}l= zf0OtAzIgeRya)jZr5Rg~-IRxgo(zo+z7RY$`%l^D2Ht{V&WHXhvi_d6(DyIj5?_Y* zPH!-C6(EH5PH#_(XP_#rJO3)I#0GSe6%+yqJj9NKLuPXO*CD_g^i4{!NW$J(bSe5; zQJ2Bqq!h1!@XrGGX5)F$XWR|nx@1EnVaF`kkI2Iygl=9(qe%wf++w^0R@6XmLf67D zoSV(7A3JD~TErZoAev-6&J-gsk$tq-?PXNXlug@Aa^nV#$$^q<_>^C?xdLU+(IXc6%P}5lQhsBFS@*^!GSwi`XH9> zQAUVnv<_|3D>F?j{J58)fR>G?T5CJcY28Gq=QK6w~qEW5*pn`Sa-=T^bf$^P4^GcdK_U6Y|Yw+#HZ1LfMv z0z6}MZvB|SLIua|Why_!ZyY0ZZZ=OJdu->*xew9gBs~l=+L${?X>#{OD+kjBVjHb; z8y`(pStWR;;IduDh>D4+NYX{%T^WQ!6S3rbl8BQv$y2Q9;13bOiClTJCOO_J!1IO3 zMCFW?VJ^m5**sqyl!ztgi5HNSX3|jg@=ox4aY!QF5`FwKe7%(7NjowQv+4@zhOw6d zJZA_dE2v#C7+8^UGB$1BEo4DbS{k~afyEe&wsF3{ka5wB4n2w1kVHw2+tA5$}}A&j86V=xiTaKg1pOI z*!nksZMxOHh>wbNHU`~yM6aaBK8_0YC-x#`Znu zsr<~D4m;*t_jhug&I_kA;yR!csI?Ruw!#*a3O1* zN7IG>lik_HT&{&*4m^ldo}5UjBt((xWJ+L`uZPPEOanQ=n|T9_V&2Qd5D z9Z%W-KjR&bo(L!LaQlKM@qs3q zWT@XQ0Z)B^GRWaFO6aFB;O~}TXMG2j!+mc@3C8=~66~+9^)7gx0w8)`Vk8g@hW$~1 zS3Z&|N*@A*LC-OJ6*B;)gkoQPXJ_MF#bxxa#Y}+v81~hdOMyhVjNX=*6mZL6<_ha) z!{wjpk{({B2i&LeEV{0y&G6PFnI>>c@nqgGOIId4X-$$z0=EoL<)#@+kYuvJ&E_e5j^Z71Sl!1-KCDSHTi}-ANnEfS-i)LSTW2PjFmTIY8gYu= zhIX861P0~|+yam%z;~gXKvGn7)kDd*q|nvK5)y>%&F_{>s$%52pt9J({nwM3v^PGG*p6Y zv6wQL?o&53P!LTTB3(W`cw8L80y05%lS(tT9D6#bfT8%9;ETb@*?ahOa1l-imuG#J zb%XDpzNq(z_ja!zMt%8Cz0<=J^Ym9$r3hmdP1#ff&no;+;j=qgWSeNprW$xoThk~} zS)o6>l+7~mjKYN`jK|>(run&@u*1-+5dc} z0=Sg2*#_~aN!fCMNZBj{PqKK^L>VJvM^iS{z%vbhn$jFKtc4$B^9(%GaH?r~rY(h| zDVt~DkJNP{?+kZ~*<=HMrEs#TpSa*|exgk_@K=f`6tdtl7n8Et2L4PDfr6J(Sq4*v zZIB`4IW3)nFO^;GV=ZJ@Fq$%?gB0V5MHC7trrJ_yPEE>Y9(ZaIiUOfl;kDn)m?0jd z9-dbYNI_-v!iqUF?1MY62v19{|FHwe`ku1M2Lz@tC19k*7U(I%I>Vcn|Et$Np>KuBzJiv+s6az`N30n7JXd)Jfwk@q}ko z#tV>@s_`;f?1D0pgCVjMi$6ccJySNp07j^bI&>C0WE40&WwQ$=d@%c6l^Sezfnx{L zBb1!6QYTrG69@IV{v&dEh_K^C>9G@=l+7;i3|E{1FGsqRexnV=Ag{^p&&Y=%s?kn< zQifoV?0pp7=aM}Lj-=Prnv~5mP<$U%TaAESf<~td#~}B!cgEV|5G#hCA^UpDW*Ojc zp$qH}A;57N@oAJYM1y{tN8mB-BXyUx-=owqEW>1!ITD8zuVC6Kn`+?6>-jfRg)U=L z4m@>_o=OfII}M4U9Hc3jJw0N&$A)*1Y`AMIRI@(#x5=@&heIEs5(ccqj?Jt%ynph%kWFpgs{VtDEp0)nRS`tM-`=~iNM4?KnEOwpB~ zlzwS#?!ogC+)y(0UX!vJ2cExk-bZv7ZiE~oQa0%TADhSa_ZY^3Chz)v|JDebbKp6g zU4m6s`pX1J%BCH74zmxM=IAl8NeBJ{+vdS58rLJTUdrYjcp}^X($ONJ=u(Dvkky#C zOZeb48?@%KqA5c{=(U~r^*LKQq#P|%ZU1+fs)Gi-zzqujO;*(R3yhevu~2o%Y=91A z0yOBO*y^gP?pc7X?ij>%59TWW)eR)L*eEN{H9V?zI-sO%gw^;{MG3vLL{m1%%JU6x zs^HE^^Ft#z(bNT&7-hVwg7~IV8k>uzj)7VyZ-8C`6*$ode-_9}ORg?ZX$sf~D^EB1 zSUsj18)Y>Ue6$KEp;EF?iR2Rl z$SKr+%0g0QNj*}9&z?76fi6Rkt$drwt^5^yCPzs(# z`@5(trfdwACuSpUh+53h3$l%&^8Cyhp&N>p2r!&F21uo8+Up^EJ9^%}lrl2Xb0QgFLOCkr~fHM!E$h@a0v1O zH>8v1R87hPm=t`9L!xH~Tqzq^;;E}U1^A0_Bq@U_NgK{Pyis~#zBvOYNj7E-Un6^p zOxX|;&(hXEV2`8_cn0aKN!bt*JAHqC5-liH%3WM-5DD|e*ou7FHh#pjRXhQcsW)^R zKf+v514&0CWur#y?Y-Ave3ZI@0^Ou++=wS>*j@kDKpQ;5OkvSQ56oED2oldzpKlSZ zhs$UY(#DV2>w8lnfp=05H`&IKc&;kWz{;unYNJT}kGVm{ zphzOLV7qhoLtb2>DFY#Ol4{@vUhlmIHci<$5(}wt1nbBwgn-#g>&X%bWJ#CL)uEeUSk!(mbO`o5 zL`KLr*H@}*b3uv(7Sx(Vb!{*zMFDoW~ZP< z)zy$qQkeetV^O5wT`C0-e-Xr+@Gp{}V}(=DsunD!hf|!(!!JScA-WidFCXU%?m=KQ zYVCn_JlJm?-vuoY0GUp~rE2;TdcH&dK_w6jR#301 zmLd^5AKX?Ln*rZ#i~&}vVs1iA;dryOhJ$}Bv$kWL=u@m322*)N9#6MV+6ij z1`I~R0Nz7)b(1Tk+T#>pd#5X3%>uMUAxoUdcb%>fu?_kJEgn^iejfS(CduKCRYfhH z#u{1$Lsi?&NKhPQC-ML%NDa~{@MGQ(x&BV*JkDK+ag0=UTp*=FC;u?bNk6q|C9PD-8@f7*z-|e>`}yyQ2!M9~OS6;OqK@3IqBi{$U6?$mWCmo8&L2V2`{p zy=t&s@46Ka+8JG|UoE=EF*a|V2E`wK+i(eU`n>y=L38FIuz?LV7(I%Y=@iB&4>2AW zgY!f1_Zdr&Lop?t!b|8?LC&w_J(4(%$tN*7J>WiQ94M2orS?@+Qx!S zj1DYs`Yaz!+i)yQ+DyR!GQHPy%i!2htQ%juH2M1D6o_=A++$eQz;N7OlG7F5-g>#;X?0R zs*wXz+5o{)fM>L}8mksJNH*WJL4liX1LEel4|HvY>qxwQ*4(|{1m(JpP{zdVx&*)8?xLrdBq z!SXELdOIv+MZG3%kYFjp)5)Q`b$dj1Pa8m3xB3DIEP?>04F;_5r%5C)7p{JC+D3nQ z{xKY*MKoV)#Nh^nt&@Y5Iy~(2dA@!o5=FVut~sgf|H-31h(U(n*MkE&n~3@CF<_QkUysX z9{L&nM!9n6?})9m-*wkOGdIzqBe?z~=I9W5Kz?bhL3a~e+D!zn+pFe-Gsjm|n z?IvQ~5r?(45&Kr)3sw3Lw0Qq>c%!pml1zysUxJ*@>O~1e zPkjk~W(NKPHypYWdvX?n8GVUnw*CW+^47Qs(QXjTCB``3*X81_J@AD3K{a;&tG8fKSNwuK-rGiZcT+XnfCF zGGgy8iO6Tr@$30V=yOCr+Z0hqLhjy+@z3r_1)zS@LjSe;O@eQ#{~Y(sJV<({xCbd1 zbyJI$>~Dm)@Cjnl)_#I9%!{hnCm2v9aJK#)Aj{{cK@}ARDxJKgl!urc*pTyT)rwE? zVjLPs!ro*kir)Px6}eT_{Vy)horjsq&89?u73&X|F1ZL&^1qmzsbNyW{TyXOSJS)D zP4(We9s^$>iJBeI3d)9Kw!fnmQn;CtT_l_HljdMwn7bjjG$)-i7!f>1L5q`k+UbFJ z0vG!~@?V+tMb=He?|rqMY{HtHa?fV?*e#7rz9C$bwz&^1eE|B?@U5(k6>8Ep?SXX< z^c9Tc0cq>S)22NT5ezRFsmbt~7EK${!yG1Jh3eq7Sm?>F-c{46NuOkqAMoT3XB;S@ z4Fb}J^^jT+yi;ehSwu8#=nlzdH|`T!;^rYnk0Whp4=Kj(+}lHNIWKK7=w;fFA5x56 zx_|W(G<|??>LuLfKd|<7QI969A9bTqKu%(5Lx1S@(EiobtgCUA zOKQ?K0|Ni5sa%n>&vAX`A%mIqdy5yx0pc znYQ^3%$=^=sCT4~;X7zf`lJxLPAfjtq;0B$!m6sK%dsPI6AdAfwrLOEk=mZaj--34 zMI@W}V3+%>|E0UDUjUo^;E$`%Rlu3F4n$4bCO&wATn7^_N0YXx51yi4)6C!-y^gdY zKV%{yC5p7Etqs$L_mFH8e9y?m8la1&ZQ_F^3=YC4QnntYXxb(|Sj3n+6EehbCZaV# zyX`;o9=n;KCA-y*HR=bfQI7X_u+>4jhpDhA0uu=*G+tIX5g5VuN$Yk;v;;OBrFZd4!hv(rNC-N64 zHb>Jo^T97h^JSQFw+%M)!S4jZFj4`2(W7ab`QUc~K2@~u5~zgpyA@5_)Q1VgXgbWS zLo{tuAN<)OZZeC$q8yPn+=sjtCTOyD1t&&lX`A^lk&|^9y$IRNhY6p|j50?FNZSMm z&mlr5OC@H>jHV3%BF!-ol%ol3$sT0eOMrEMuex8qA80@J=X7vrVTA3HSx^4K4_@b z`W-a%h!o?`eaKlcsBW_AeA=c*cuwnn;ixanUDl*+mV~GD#zu@Z?aD+C%OTI^OL$V< zaAZ`9vDdUsn_yb?<}Qp$+Gb36Qh!;YAEo_Cq;1lKr?k(d_#)hv*xU(EX79%_3EW=8 zoTqK}gjer#el)#ug%O)Q;R!wTEUn(U@6s!qJ>e-`_6CMfxKKJ#oPMG=2Nq%!_%Lf= zcv>LfyM_G8W?fDmWqn`3f#hUgYwpMXI$)HWv-W$ZSng8(k zhJ5wQeAsRkov!BYL>W**?u`7{Z2os~nHvsgkr-m3ivU}u-XbY-?^CETY z{b=9SJ2xQe;*D-=pm}|%+Ylr!G;P4|DXQ(i(B`YgBRuNP2AGSz@+3O<@^l1U3f=*) zQ=Dvi5k+qQ$V?B*>ZT>e@V1rt*0|kC_8y!+U zq{J8%yafpH-8)dp$XVbe2i;_nXFmhU6>9dyo`Z55F5sC|yyQi=`4g@G_d1OmnF~0P zT6eUxdBNe2(ajmpqV@SF$|SR=&JSM3;qJZ5*5{jm?`lv1uu5Dp-Z&S~=;ADZ_u1(( zmS<92a$=w^$4qu9cjtn`AUXNR(bNOAERt7%rRtpxWPW%hY9&XHQzI|Pp#qL3NTX_1 z-v525_#gjOSzq#@VyVyLy~`WQtjjEdcbPt(BsOeuG*Oeb*+O3FTo+iHkxko#A;*7e zJp=11y=hn+^fqS*Ls<+tW>;$wy^rMT3u~q>W*9@gv@S-#Dk-6nhG_a0Yv1O`T^v_Z zifM{Bnl{9tR0P4Mi+biaFeVgTzqDZvB^%fYw8?MktZ$w+)S;9Bc+#bQ5DWoHgMt>H zXxgxbQh=j&#jfboBVEjJhf<7VceP*V7DE&*(kY9k4TGo~l$j`0rQS}(G|*`ChzRHf zc$WLH zp2q2mpifRMFo2)UE7C-&-i7cD%&kOCBG%X(qlZrfPWVK`(X!D6YTeGh1XrO+I%_#C@!Sfy&`|Go;%_;JCm~(oJBscvg z8bVPfl0vY#QYKABG;I@#ZWK0Ga@KN~f(WLL+C4jRV}Q3+rKAE zs$xkT+6*8u_!f|>SNg#hrVl7#zeIo4{PxNs$A>kuf1+RgA7SIwOh3nZVlXpi3=H1D zUxJs%Kv@F5nJ;ZB_QU~fZR}Q`4V|` z#RZ9q+=zsP)>>;7vJViJ1Sz@qW+Ajz5K)8Tt{7X}TG!x;Rw3?)3*YaYnR)M>==1e^ zp6{RJ&dhmdU(TH0nR6(UD?b2h%NE1EPsp4QgDVP|4fpP`V^H@F{Yl9fK$wBw$TS4d z(mjy*1+Gbn>3$WW*&&bP#N$#V)fd!Um@^)Sfgm?f5X+B49X*hXj-@Bu-yjZ%Ed9=a z`zTS-0>p3i*iFMl>6|)@A#9h9#lWS}xDFP*`*7%cV6008a2`LmGWVQpc>uQm^o{i~ zxXB|+OaJm;?(5~Z(Pf@5Jxkq3U~)A8^J-bvYFI1WSC^eiE;4`0zZzjmQ(|IxVD-=7jGeCpAzQ=;~wR$CeX!ONH=XE`te1p ziF0Ac2ct@+3UGkSrQfPCE_GVaZogp!&IC=Ss-j^oNtPE?8QDizt46pa0dM_#<1O%# zz{SC!F`4%%Zw(uL!UsTeC7t7nqlmVe7#ELV@3DAQzk)?;ts35v%1lQW^>7Pg*t5CCT!yQN>9PDB9W&bWjoEC5Qm(FWam0@p>3XW|Dx=FU#F1Ry>ckEPob4=d11CxuSPa zb;$V}8PPs^Re^Jc{TqJk;lR&%j*PhRIea<6{+-M2```kRvt9Q&EVPpEKIZ^CqQD6q zroAY$^C|RI+KqOAOk-eR(iWw}%x=W7l2%4BFh?^8Lp5&iMqDeeh8@H3_Y@6}^$P)P zhQE`6-WYl={Da7N5l%otSI~b@ya?DPG?xN+RsSLc4HBTc(vHcuLi1#RuKiZ1RCerZ z_pHHi24vvPJupCX%wqs1dFT)XdDQKDp8yFxGq(akNrD(; z2%v)J*gb2o$1`X2WJ-+WjGnM#B9b$D%8oz|dt~77lgQ4u(hh{h!8y3~_^MN4dY^8| zIor2N@(KXs^<{ZYWJq`|>>4+R#su4gMS&fGQ~Z1UGkiV1i{Y~5D$jn;Lik0v&2_}} zdsoP+v2vVE&OA}rJE1f^+G-+j(4&JA!<#V3cCy%30aK~vtr~&T`!-%M!#^rKG2MsW zfD*$?e`YQ~<8YFU?Y8}AF?c;vbGVQXJrjz9d4_BOH>pg)MMYaDt7B0qAdvYzI7tPo zhoZ#%OGrhrRYP%-hD|A++zG_+B#~c)Vxp}YjFSXxL=kRM>Grkl4RV0ms$n=u00VqD zC~hJHZLJ!4lPU9WN~V~I8ynnXpQuzbbQKp}-l`Ed*$3Jms;oa9gsb3yv*c!So!Y9g zH(8YSj7nn3%*`3>7_B7#=ttKFcR{&t?R@LSM zkW*DP0XZI1xOLALyYJ`kO(c#7bHgm%64V5fX+TA*M&fM06?wU<$w}evqwA(-RJ3Xc zP9_WI{dHMl^}IS(>Ia2ySu103V%8Vyrwajl=2&nVZ+F3j}cm2Y-)kNEv<$b?*=KzXYPw(-CoD8s-)@r`DEd8>)D@xWd=10$!h;Yn8BYGQ2|UvQH5!ZK>K^+IFm zky%rybir1#+9fo`CYKAZOjtD~buHK$R@-K@RRe93ikBxDHYIEKL|UB@KO^#O19f#Kx-4{`EvQ@)svI;z6ux3iycHCp?d@xZp z9yT&+%2f6-5^dF}nrhFzw8PxPU7|Kd6IDwZG|jjVvj|WPokr1CjjPFQcobpKl#B(b zJ<5dCcmQF|lnB)Rq46}C13y)UDN`_pC`UM7r6)tJ8cdTkytT5{cU}=6W+s@1(IZrf zk0KLA!#)c8f>eK8A?5jC0%*L2!cICY)yP)P|9T^}(ge_W=$dIK#a%;YV?t;=axj<9 z`;+V^6F=jzgQav_A!Gwh^bCV0>nT(NP1uY#(TXK_oUU4F;$?8|J_RrIx&0}Q&597k)y)*g~x?DLX(0I22Tw<5jfZXlK&Fl8@^w`WW*u}O;QcY zkxhDn`4wu=+8;H5*{qTiVOqgH-Zf-kvpBE=_YZLNL?z~ZO#pnW2^e5RmF-fZp-Z)z zI~p*M^8%Kr?6TDCTWst>FkxyFC|<)v3NW(Dj;SmN_Gf5(%Ueyv;L`yrACY+zi(pK+ z0QOAbM2OaGd8>&NXgj9ZSSD(2$Ak#94O4JC+*HLFMq4#Rz)jVLObI~&3u5zR8X%DU zf#J>;ofpICo6YTLY(Nt5YGhNUl#M(XqOJXb0cprIB@>Ma$V}LbnEhNsvrHyBzykU`n=U729G013YGIyOjIlWWDj2=m6U;H9O0M29mZ* znaXBwOlaU!3nQ<}Q3r#G5McbKKrxI@SPc!xiOxG{*;I9a!X6=+4{z1zfTZCC3RCSk z6jTMuTQxu+DR{`vybESHRR$UvkjcD#9?8Qo%Fkso+PDx64oDgd7@3>E6`K_4<@`3$ z0Y3lEJ4scQ$kf?lVg#_zjtu_9MVPPv@1x_}AeL4&Ffjq%Kr>*{Th@~Jg-UW1TjXdA zI`4GO#M9{u-9ucxt}U(`Tt(I)>k;b?Yli0@&o4ZK`~%>Uw#OMvKR^A+(BDI=BSqnz z@Sky3I2<^^|DFFa|6Ts`orj&>?q_{#eWkuJP@epYx7>S**YZ3`UMR^&C8R6sT(4OB zt@hw6q3raG;5yGhH~EqDl%(I~Sr+~RCN>>Tzhj!n7_~N6q>l!ezJ4_9kUl+X?L;`y zsm?>}`cZ2OJnveQ9e&Z12kd$4xV594hehc)r2Ti?+5+ddqN`x-$znpRa5 zs$8zP;qJ}(-a-HLz3j*q-Cab$t89S(D#d|dve5rhf((It$2E~IuAAbcqBwWALm2umV0&B<_XIWJiwSE-dR_^XIZlCe9!6g6E<6Xdb^SMVk0_%S zomYVRz9xUOlioL|cgiWRKi^E%e_f_sdpzjgpx-CEUk$Fqz% zx74z;sAZ$XJqU&F%u!-bMR3g9;p!-45v4P1CD8o zBzXw39SCU(L{A}pcG>{3cK5fnZZVGmW4DWIPwz8FzNJVnfePyU9p z(dO&RVB9lDM|i6 zX2K;rZtK%AZd{j1x-KSk!ovo;sH(=2YCtq*z$msC1lcGldyAPE3XdVYAS5f?Y62)c zfN+73>>DYeGjSANp7X8&_RM`Fd%4v_QFw7mR|r(0N&0$YLMc3;ePo-A+poBTXsZFH zutx;qVZrz-?m@#SYElhROf*eibw$=lilm^?gkuD-I&TOt2=GdNs-p>pW#MER8hyca z8~Px(19}Y2<<-v2jETqU5o_Aa$9b#{7dVfR8I*WY zhxzh%SsuWPv+dux;8;-7&t*g(RjBaD%8>IcJEFjOru;qIgJO@|4ae(4b45U0+u4#K z5Qi4!Acy5PQGv5U{zkE3k&cFNYsB26;Afq`(g``vU)hwZW3GZZtPw4~{S{i^Lqx7!okd^y;9a~`K!bYv6kezAe!k#T64tBQWa>-Wibvgpn*YfZ5 z13+SED6HHCIs%E;z=G_?<3;tpRUyl1z0xqJe>qaz>bY~xgclzd6uKf!W zRerY;ZQUf>9RXyL+oIzE*!%!bcr*vB+-4&dS#FeBZoCzBluD5+Qep@-wX#$3pueTx^Tl?|NU?MpbYQrcVgKA1kqVcO$aF;D^U*RubFUFD&nq*J z35LcwraRU-f*%LFf{TME1-=V(2kr=*9SHk-{Pq4zJu^KS?w8%G-E-Y}u6JEA+*b;% zFRUHbGXF3rnQZnguu3eq^J(94klWtxyvI4)neBMRu?{zqXzfITJ+R`eXX7jtTZaR>+!ql6#SkmfA{(~<~lE@-^a_P;Ji$9HEfzHmV0m& zIJI#TT+q_Yb^;=9#J8nREcTEa{B*2w6FlEx*;~#6N}KA$x!r(U!N#j`z+{|&GGKDw zj+kxX!*A)s9Sz{0L6oBkgf~A$RUld;cxTwNV^x9W_*fK1@NBR-Oe^lc6i`ibd_)1P z$qz;0dX(357vN*sLB-7tn}&$$8mJm{O~ul5ZY6@_MROM>va^!{qr|CL?_99h&?u>M zMc(O~K+taYl-gjNODG2Y!i~I@0>$F9Flsoj9@BET3*5i+msESesi&g7CH8ORfGyQ> zo=P!#NKT=8!-IzpJ6PX|w0HEFF{)h0i*_{nhzfV?wPW%v#|tu$=RrOtcS34&eh6g59t)T}M+PD~f_ZEFA_q^3cEUGDV1TtyVzjH+M z_bWqQM+5H3gZ`H3%65v`P3Vc{b(?aXkJIm|&c{T_Iz)9fZNmMt272P>tlL!N>~5^V zUFyKh`$k#0kMi#~n>LMhJ_6@_7|xX+R^tkJlMH;n9=l}IVZ7xWw*h)>?nNSFBQorP z9}mmF2Kg8XbHHJ0gqW$6mFgmm zbwp$R;9)W!k<8YqWp%-cfkuPFij&jUsfncVFbQyD8XZ;? zWG|I1Qxi$Q`;~@^RoC2)0@*yZZo6WNP3)MB`Tg)ZtdX7|uXNFvhK*(CuqZ9>Y*jx0iARcMQOyF#^@G@os#5|U;SFHi!mdTCUIRzz(P(=$OWj6@fBR&Hi{8ri_^gGLIn4Q>(2%8q?6R{2n7W1tI{|114U~ zyKC2z*c~S+j6G)J#k@vglNvITpJB(hB`GFe%wxueshMiBF3bdtwP|WFJd~F$`!SJY z9yZvgmQ>=j&7`^$Gm&H7ZegODfLSF#GO=S=rv^eur9k(Dk=s~52$^=;g+2(>RJ##|I?C-+!bF;RU`xIN&M)`E#_C%4FOT(n z>_}dB{C>Ldr12d`UVHp!gm;9O`Kn1a<9(f^Grs4^Z=df%^4#YeMDUIG*972rJ|=5) z-e$5!=N;!46MK%Dg?Az)p2il)4$`k(1Nl8{gjv~dit20VpI;7gT)mK@Kj^=W4N?tCq&5&YoPr45T4X6xDHS1$S|1r{$*Uz5yV>wSnnj$Usm?- zMBzeY*)tf5j@e7Z?CU9T4v5<~kwLO8Fu=B99{O9__?j!4x4qN1`E6`(!(3eo=NU z(xi2>1ETag1TxM7 zQ;)zH${VY+eF49Y6gtvS?P5Yz?0T-GLju^Ts8q>0^PxA$Prlr_coc) z6HC|8BbO~?V2usw9UuaXJ|-%hG?DAZEsaIi09>S75MA=GdOVsG1|~v}CQ}*x?ZN4R z#{=j1U-Vz(d(AiB`+;{MJZ9X6HzVXvPd}PWv2qa8>JM^ZC5@`nd{O6tsQ>|`6t<}j z)a&1n&PQWf_d)H#wmEgmK`kd7ep>ZGl|!~;*B`|2LcFe+9j*HyDYQ*>Vj+?ml;yEo zj6)QPDOmzm)p3YU)NHTTeUSBGo9bK@`ODx(?c2y4{K8F|FnxCkvk%Y$~00F@^ER zw5Efk;n9MfbO;Q|njx`?tmhUp)gJh~fYTUFrW9ezW2WYVr($2bWFmyD&&H` zK_nT(VTq&CS4{#z--UEsdYcL0@O(^?LhtJYW_W*1Zf?Ef$k8p_;I0dny1Pl=!P6CJ z50rUM3QYDNa)0OF<*yRUsy21wyqqB4mb^Y;UAm}xSd6p=+$A!Ohfh* zlMh@rZ*Uc*!OrL>*oE1v?ZGy@l;IceJDm39 zMSC{mi1|I9Ny6vg+G9}4s2P;mXJM1`myE4@-y=+h^JJW@HFxSGmN|`}9fLEy4-ErZ#$V|_S)w58 zsn1ZSj*^B`XS|434mzG{PX^5|O9TJ4V>E{9;YJ)(>6>V5Um} zcW!ao;<~u0*+AX~q%~Kv+`}4EaZ{@y>284MmOebo5_nn^c^zZPnSXYB;X4LE}A@}qH$A|0prNkQ5wQ=Q;EU$ zO<OM)gV)ifrqgS ztR?zR$rMaA1|Gw`F?r8Q-oH&P2KZZojEt0~%VS!1L9QI_Y6(k2>;1=;8Fyh`eQ>j+ zFQv#rt1QSY;9&`wla5R@rj-@c;M0)7xe~ZaaN%0l$W&Kgo)Z3*6b;Q&I@5!rp)}yT z5V`};(<{$0ZZdhWy{vhi--#nQ+sn^84>@a#ENcM#lh)$g@dG8buxldF=%e3wsW%UX zeFmR?NAZ90%|f<%C%F)L;D+m z&0GnSIc!ZQgJN;m-roR}@P3^{MnQw_tf{_{gCTjf#7mhQi>z>y*n<{{A%Dg3eQ3_w z4AcZlfRWoo-<-9B#HBSY2$WL*j~3sNk?Sr5MR2kV9Q*)+zThMZ1lqUO%QC>! zW$EY<>vGvPWNX~&Oo_?xQp^%N23Z`k0}yMjrsUah-dkIIwsn;}tWu1Bnpe(g zfyV-8`}g`U^u6jU^}g@D!SflMH2wfH1$5=i!C{qZ{4=hhB{@@Jc`IAIaRi>D_0=V= z!6iwc{ZmM02~_fe5;w6WHoC=5Du|`BuTgOWTM{tC3}AwIE|$Yb<0iJmPocZd!_KWT zQ5&mX2U1vDXS!Peov2N<4Jzw}PqcY)nik>A6BtsZKG0B_6?&v#@Dv32xlP zlwg1$Tfloo@=OOzyT zLQCMCvIV?XK-Ni?_hI@%;t2765Yw|ZH>WX+xCt=vP7c>wG9#&cS{^qsCO&~zKCWq` zHh$a$nD_wBgZnL2A+;jQ<0inw$MEnQ$ZQPiZQm>7!wkl*2L89~e0X}5#|?amj$wdq z?~;mV+(ef6?1kqo@SXZP8aELpK71FQYxkYp78K6Z{l8x(zVExi`6n|m{OK3?B5f@A*DERjV(z6Hf;LFtQsOv zi{1p5uw==(6G>R&8cdR(Vy(h2)C$1fW&F-HuE8Xk%q!Kta@vnw;~G$sRJ>N%;5}VT zCEgj0YcxsHu(^9m#`dK)1rto-<;n){nMw=P;~G;^MO}>g!r;BU1M5m_WJ%KSVr7%} zTpcMJiksLHuU9sCpGspQOWNdpzIqW9H*qEBh1lj;qAp*j#Z6S{CS~v*vl&u%@NsHn zOmHb_^`3K*&*0)F$iy2iY~J_J$wZoXBw_kqQ7IMXXxv1actF|yy;&<0Y2pEe{rmnU znn;s2gHMly)sUJn6AvjY;HNO&Cd>rm_iz`$2vyv~mv{`}lM7o0^`3s|7B}%F9>wb4 zVP)6^CceZ&SbDc4U`^?`i7@e@33psdWTF;@T6_;Wm?B%OL zB{gN0M=rAn6HVg5W2aoqA*jtM8aL4-3|mS=Bc_m^ zw@>!w!)=j|TH>aVp2x5|f^Cp#R6cVJhDdw!G5f@n*7J6H!=G^Fhh=V-8pKU$J;o0_ zJ7L9;*(t8d6x8!p%Km&LncVZUJ$MH2NBjw#Y5zK-?$q2tb?4;<<|iYQG|9N1`X%Yk z(0Oq%8Q1TN0GCur#XDBnf2!$M@=r2>e=#xtSxj{N=T`c~e>lj^v8xa;esE=z zCux%1z`tft*8kssrcy5arfm!~4!lK|lHmR%S%6GZbTy?I&)&^^&GwwVd zemc%ulpalJv9jEU*~aFvUTmgHr7W7zQe{byG}2D${_0JCLW`6ojW*Jbr{JK`$5MI1 z6e}k!wG&lxt|v_Ka?(^g7bxYV2`ylj1!7@m3D{|ev3!1Um(UVsb(4cf2HSMCRBw$Y zw2WEiz>9mA59anIYo5^JWtpsvvs1Uo3tYmKE%VL{yX^VOT0p{-Df5=hCfT_WQo}Z3 z%9MFmj(kDxK$NmrG@&KRvKHDTJJcDz#$7$LjeypKmMBY_q*ZpJv02@ODOlE4*|o8U zgeg~MbL{GSc?VCJGUcQ}cBY!FaQTEORMsZhWqoZaNTQ!qnFf#TvU6Vg=~lv&E^E8& zBBv8@}Q^L$+3coeB;g@LKlrCdH6_2KL>dND$kQrmC2n;QXxE3_aHNb0< zUDptwrgXgHrmUGq6@F{*Zi2NL<67V>v*6)`zZx*l$bx36I)wYloM}ASX$^CPDV3@W zhD#h%$#Z8PJZ$z7>`Q`Y(xeKz-QAIx>r#3VM;b$A+w0f|p+}jiq&)?nx>vJ&U`))n3z4u_2FO=EX&|GYVhhQ z_6zV1MjbPc{sX6eACbPfGO+MOu-(^v59oi#d+3YxCnNamQ|KD*;L6iskT66(u<%{; z$0%sVBIs3d8ug+T^3gz#5+DDU0$vJWBs?;*3z6d4v9Jkn_Q$Ar$VGhzSYx~F!z1gl zSdRGxYz>b)K*gQ?v2kwBcOmT*I{vi74sAtK}p(VX^A|_o_On@HY596`? z{Qr_IK5jp?Dk!Q}(`@}S&sG|Fad#8x792o_RUIG_yh)-S>O;{pLLpnl?9Oxorw78> z*NE`u@X?`8SlHPC6|=|w=Y=&z#Vnx({&J_lUW~rE9kzt^QC6PN5`Rg-21{WmzMtw> zLQDK56|>4P6kj0tb`edOqJG|jVIbZ<_O+;A?N`%af0bNZC=Ks~DdSI?hbN~O_T@2Q ziu&358qC83K_e=C2Thprewbi`auyNjJ9xqr_2Zh8C15I^Y)Nu9@-m$;<^8zkWQpqK zu+wH|W6Jw+!BNKIRh`vQXbSydEMC?|>0%{Jkw2TAwY`1d7OCoD3jHyLDibM)Nthyk z9zYn4xBEptNJ*G-e;z>Cj;E`rD#aA}^AN&pyy_RbE~dzz4L|R?2D9ZP&3h138&3E`k?_n5AS@d|zNHL@in#TU! zEt#VGSZJ!HkHZOw=gXA`AcrpbSzRs$AQ{p3Z@hvmv?IW)-2}_+-Xc3DUo2aJQ)$N& zEih7lwCH-G1!oV;|61O$G9c~#j*|g0`73r_iVEEIbPN1szJ}ZjybQSU4GJ%xTx z1=C&q6h$2ZB<>we0ca6TBeOG4;j5niAd`FI2p-yvAQ=r7tNs9GGXy8WN^jXSEu+Oz zUr;@dqrg-=o-d57W&j=Uuc5GXQe-u{Em^+Gx4xC+)N!B%? zu^CCm+bfK*OEP7eB%x6nNt3k5PFX3HsDy@UBn@_0DX=Y1Xmm!^gAT@f{{{|QijNW+ zn32ga!H#Y0CK6pGG$JEYcq3)g>#_lm_>isG@`Q$DBpEM6w!N;~DJ|I~G%6#>@~=TT z>PR)Qn42!Zu3z{C_AzZvF<}BRI1eR(lGY|nAV!;Dr)!#&1Sd==h6jvo4X9g{iNWwd z!SFi4lYD(u$BK!<@Hnykb(6|OVc7n=uM(I^2 zOyotIUI#uyG!mOgnBWVK9_+8nR_T09{Dp_^$W?e=tUAU7VfYASH%8ndt=XI?F%A*t zY1oYs^F2~kE}?N4HAim4;7j>vLIW@|g$HkV7&g|}F&G5Dd}fy?GzKHdcnAlRxdwC_3uJ>8*xt`}e=eb{SpXYksHPd?Dn(2Jrd9LF* zWZ-aABs2iS)_q0I%hlk~$-VPSFIP`XuSjSZ#!d!!K`F}ePtHzkCgDOHZ!^ z1G}brIzH6+i~LY0<5mduDV!UhuBo01DhKjy}Dp8Tp;ESCy zf(sBWf3Kc4V0prZUZ{@r1a#&rtBQyVqU4H%#$Whrm5k>rRKpW=*&2e8CA{^0H9gCt zdij;`CHMW^S9k~W-z)CJg8HJ~CV zTGCK6Yn|h*EbmI?2@R`AGHs|C@)0Pft5>rL6IRi-nk7y08F0eHR(OfQU^C8U(sKuU z#v539!h~0NsljZsBvY@K6DGjIdu7Ja@Dzr6tJA;)S9qBX-$imADlAD>YV0k%+^*O` z?|Jld7JdFrY9V#+*QrX6j9Zg~#&z+vo->(RG(;;r=j;8_m!xC+;|uG_7{)@{zO zol6{FI>d_8iVD*!+O$kvE}!{-uZE#|nt99HY)Lxr9}^p~f7s6DiM!^tzr0P0(lZS* z=D(SuvdxyF8x-JxNe^=(^j+WQ@@zr6BwK>=dY-Qa)cFGR5qZ;E-lnDLvakb8MSHQxt*4>AEOmoYOV_2_E0sf zh3`@om8=Cmq1c_M2Oxt*fU zBRPE5yk@Hu!}slc{U35Oq*qPTnW zSy+QwWG1tIY4_^v#^2!{O|nNEcN1@01CF9i3(h3b4Uen=uW-j2nlf5u#wmWWZ7Ozv z7hY<@lnJh-bS*Sf>8I^moh9C!vxZg$uoF~ z6D#~p)3Kj(!agLRI$Ag;t5b7_st!`LK+I0TZDTP+v{W19$l@^Zcu4064kFxCfCQF+ ziT{L~ri=VY)6@aW+iam1FMDt~eS_Pj3aN>p)=3x(ot{vXG7Fx?s(8(AeTGrkT19E!}ntQYzZCh)cE|yiAc2rBd8@_Y6LYI-g#cY z&CpUWIkO*Gf{JhkKyEGqK}DOEcgdQ9V2W6A(;6BMmT`$$n$?rc+YoW*(Aqqt=Ft+D zskHL3vYE9@A682v#)2(Mg^{@-aG%mOoTFKsB|qX#iP^*_jv_X(jb&IOGDLrJ;}HIY zWmXhDRy;ZccXDJ$hl7?;>2`mLy=q}Do*}8tP)n%#rH5oDycsTUv&B?Ae!I5d?30VV zO#|n$S8#^QD}rJ%v827HECaXj6U+L}pf7M&AmG2-AM)Mp3wZDH`aE}fJV3l$uHU+x zRu!y2E_dKzT<@5Ze9PNdMj_@OSU*ghGkzUO%xiY7A19h0TAz(nmQKjjzE7a}GG}1Z z7%}(Y`dp;3R6@+(TRT*Q$CHb>KQurbmDA)F6V|V$k6Ah)2`aK+)e;}WkEF9{AktVg zA=8TQY$y=Bd&C&=;>rffn1vHEE${b8L&isoG;clS$r6dis~d)hRdcFGqB~l)qqg%7 za&1`-(a_s8Ox(5>GW8M{93Pw@Y6djHFQqJ&zFU z){nF%PZ9ZlSw9s8vIK%shJsaET_ENSZJLf~mOIGku1-XA9jotbpgOY9K}_6+%%1wq z>XFnoNVOhX?-p-nts?@KHxR*4arcL!K)m#kpgdW?K+(fQ@I`pF;XaxDU~MiYC(9PZ zA1v%Znck+sV!y>36H62*dMx`ilWDiOIE^IXD71iT`J92h^bn_=H zG!UnFjI?YIr?JF<(o_vL%IFeahHrV%=?gD`k1=G2`&b)G1;lkeM3;H7-y?dc*zRqj zmCJGgfloLm*xmE-e$H|L`b0%PE2H`TFV4r_i@g!s{2;MaZpwV)7r&0^gj}&F!u!9z z=gYNYpIMBy@$OsErtkVm5>d4QPD|+^z`m*hC%I{<92jp>C!WTelHc>OSovEBX=q=g z1$yfBj`Yg3@6(n=4oAwvUx%ZiuR^y5zYN|Q_%g8A|GEEW->1GZ??G5nJK(v|ebBwg zbeDLd)Cq zy&UXaK2FKYU#}~0O_@ANf57*0@yR>LX7ZFGj>R@+UdP462U@^#Jnn+w1gTj!PJ?5F4ORp98aCNGm_itTT@OD2Q!*Z1})#kMax52F&j&0+1C7WNESSfYli!{|~nE3t$;7}(R z9l=*_#kTv^`6f_wSp?0@1*?7U;R z8kIqJx8p?89=YFI0KJbss}~v~J+69B7qmj4F@gt;u&5lG4fT#4;gZM=X{#fJWTGHF z14aw>ILn<5=QPJ2_u1ZNveXk?7kM{yPw$OF7*6Bwf~BEs z&&SUDp`CJeBp4(62jMT$Ube((%?)E4@KO@CXanLuKWiK+dUrJBIxi7DKWm)oyqNxt z5;yLIIz{e9qVF^Wc3p`J*4iKx3ChobF_@ln@D4xcZBcd((yHI6L*QKwG|q%ZNX|R- z8=3+8MA!-4Qv&pFOxsSpC@?D3TiagmPU<-*|4sferNjgm&HLxK9AQAcv8DEL& zpQH5fPPEfQzl*J0myGNCd1HE*|8lgrXPl~4LOIhvRnV52JU;W0IA%hk6J0fR3jEVN&Q7SulG!%-Swye+$YD z6KZoj=@nt}h5@Gw$sRa(xM`%Au@R8p{?D3VQDG5GTV=RVodE^hqQ-oP%d0vunga&P ztY+VgK;{{u_cJg7pwG9m{wteNeFe>dolug2#otVP34=i&(nrOftOQ&%B#VCVOqx=c zg8c4>V6b4vndq6Who}>!;w3kx|cr<^= z!*H;dm8>^K_Zc8vbPQC4a!-oxFlwaE1!bGL1cfU2QuL5tYUz~xa_NWo66ysqO$(=F+WkGN zA)tF@H7-N#X{mAxamPWV)V#qdhA>L-eX)5XoJe(FhgUOpsahH(bJkRJt5lUX#Zb7n z&UVABR!Sylm?4NF5j|*%R2J#W+qEo8F-K$JeXj31$V@pC2;g4h`kGRymlPGLYN(o+ zaw(LOF$gzMvnHlkO48Uhsc6>%sm#Fyhm^VS8nDZ?79d2s7DdU+D?S|d94~nQ}E`JJ_Apx0jn%A>$i9$f6^^5PwND`iaIe^C48tU)c?fvv*hZ&U5db~ z(j1Yhh$CE;A_89#aQavHosd;Iy(_#Ou(#^hB6iz@Oo0 zI?I#n5yXvfgy`6Vrpxu*&T=I)nG`p5GK-eXWKyQpyZ$g^*XPVh(^G!Eyj_c$)QsDW zLm~6A)ijR{A(P+_Ntag_tHn#Q+c}xEdm%_u2azddVggcXRofVP-GGvm{PsVu!`6a4 z1wo-9B{eQA!999oy{14VHJT)AkvwVNcrw{R8c#B5+<@1vGWjW7xSXB zl{ezOTl4eqY#wZq1c=GEf@@`9LIcbo1y@s`*b1(v|ESQ1;H!e`Bt?e{^$u=;!w#y* zH>BU~M7}R{gR$YmF9+gVCkjSPzLgV{f%R@u*S-gyJ&>>eZu$@2|9WhfOJ|}Vk%g2D zTLWYC0rZz!#q1Dr`Dh{@F*M(Rj`L;8QCe^rtf!S#g0;Nt5$LER2-7F8iPFnp67A;? zP%phofkC3|F_<$6O%t;(N6Pri*X4`DZg?BJ^m2UQKPaQC9zneZ{tbp+Ky$?1# zrvMD4y$>$fx0C|KmhUzqA0+PlYh8im&6k0mxxl2oaL7g}2!tDR(f{6&FzSL&+)H7( z1qmDK;f~h-iVSpLflvJZp#Ze>J-Ao+eno*|vG-S`?0n_A46%QHeSzgUB0uQ55+Atd z+W{!xz!Hq}Dp7q2$_PxM|D#0YkKlsSajBue599F?Akqq}Hpq6!>|09yGqw z-J0;2bdt)AE zQpe(rIcKGZ<-xjGON)PqEDwJlUKaW`v^01)xHND$u+)Fpzts1QuiSgc8})qcSpv3s zvFmf!E!OAOV&@mm#f~q;O^a>^wA{{OTYDqB#|?wYc(e3vBk{v5w$*9GBIJpBvcgZv z_>?8LI$2;F$P%xHVNcm6IN#U>=UU0Um$kFp79VHkD)yu2^4cO%JWEi)EWFh@Gr#&S zIC1PyC>T2wOK|OEantV_v&7d0Y(|=EzPz1{ zudRnH_}fN0_gS24CkKPD1g}z9qHCux6MWBaFiR(c3zogYa$TZe7Pj!KM&cP7i4$Sb zuKn%TX*$=6b{6a+MQ)aKNQ;BtL#siy7@x9;*Zy?QczjwjUQkt8z?)2=gSfC2;_EW6 zn2w%g8L!TnI^w$6W+(%C1)csZ>D7tixqOTdxP93S7Wdj|I7r|y{!h>x>G~6VU#J6~ z#lAm5LoXA6-Y|Pr(auufpP-^gF({20jcLYA(WNO?VR<_XhLMFFPU$?oasnQOKxRdy z;C`S*#P*0UYru%Bbo7&!56dH$Cu?3gmVPn^LqtqnwW|e&mURvl?WTly=80g2RygbF zZlWPoyX+fs@QlJ{^e_wto=SOxqDV7%8d8;2!xb-EJe7xIM6sF%qDpf$TkQCEn7NokcL)LRM4#j7m z!Ul~bm_CD7tt@2Oy_RZfiM~wKOALcPrYz}3@LRj^OkUE#03azQg&m;k23dBbj zL0$xcBFpy%MGqDy+>UphzBeUJX*M!BrU25ar?ZjCIs`30-kxQnp5FWEKMvgYaB$}h zgaW1auXaqn<^78c+&d6@Sb=#W{rn$)2HIc@tbw>$ zY)*f`CertZO(f#jeRLh2BRBqd@e@^}LBx=Qxr>0PKy)9?8wf)WKS~bE$99T_afqLw zAr4x!6mdQbOZ)_lVxpshIOP8t#qZB_%4&$L3 z7_?81<$5qwVbk3H%epC?g0dN*&?!{*TpVqmtR$gD{jjdx?jWWSe zU79+!>V^vvJOiQ{$y#FyFnnRxsCRlDG@gvgFqV-@Ao~L)FpQy7)HU+>I1H5a4g$I( z#{^_^&5H1C6J+e)URISMjbuij?!bL?_A*qJGUBmAHjHfim?&S54nrJB=T4*1DSW@7 zNPIJfZ?ufLB7-G2E|fB-dE!9av*~Lr|==k8_6oe?&$5v^wt@`~ML^Smfc6 zr{)(J{{IOY)*X^L$xB1{xS9;nJ-!B)_Gh3z7^;VTT{!A$o(vu~V+^i0p*mRZg?F^- z@z|LIjWW;`0*4-`r$Djz$b-wnpyO+btU#T}+glBVkFhoR;+R@+*yHwAXNtZTaN!9E znbte127%Rf0K4obs|Q+vwH(tpl2SLw)IJWZ(+N;sug9(R)kc*sXrVC{fjZzvXX2#~ ziYgMX{tI=%uVEtZpH#(-^f4;`0@@a6mVv4?O4%ebUPMYy9N*s^!n4vrFXF3=CyDSe zO2aK;H(nE=IrGNS^=FqI2#N2f(;euMl$eZvA)jYIfJpz)ZZsL6z*5L#IDKb~ptrHR zk$2a(bgkh$aiVt9$DOs1PcQX1g611`Psg`z6-stdP_a;dltIC za4&_-?oLNso4Dfw_FLRnuLYEzY|Qcuwi9O*Av}Kdy!Q+YT){ zH>pT%Wp~) z8)XuBnp&Wiv#a{AM$OLK1Bex>$D22)YAxxoh3%YIjiL$*s+O2Prr9R6CGPzQsprJ* z2{@8f7u&M;euUg_7>yKCTNuxzbDpflb>vC1F43VS@Urqq86nCRfrVLy`&}aDKuT(7&>g_pC?Dzq4smtOWjn^li<9j=n-kx68TgLRE6?MHlr{P|5IeDKFM~qvk3o3 zq_|+(?P78Mk0@|6Lnn#6kGWpuX7AAK=-SON{lqLiHKOe-;kR?*In=xeYk)=!(=C-$ zi~Us>P==BeeT5!PPPk}0!vH_Zm1en}A=pN#12cRy6qCA1kz=yR-+)Z3$256G$5`km zRkTZm7$)hv1SD|hK_rvLHH||mE60eMQOJN(CzI?K+V7_zgEvp*45Wh0`O}jmoB@-J zn%-0}m-f4S$9azQKcq*}>e2>BHbzE=+rkq=+e6cXj|a~QycoF1|C)ck?*rdL@8{mz zJV&5-7jf6Qhq#(uW33KrvhyM5X^y9mg~Ji;&>)2DBuswXna{;5uD(mEsrI~|^?o5} zKeJH@x!Afv8tH_PJFNqzYI(8I-e@Be29>=Pa9&F~G)j?fP(i(ACatWGsTNe|k`5cR z=toHPqb-z*v~dfj!Hmup%i954P{rgjRhik?g+T}%x6e5r8?`W!!DFIQw3X4`u5z*w zjDDnCt=c`c14MOA!${OkV;S}&%oZEBs=869QOQd>Y)pf*!>neid^!76kv6bl(8$`Q z)GgYfagP2)a@|VDU~lIfqa7OTNE!Q{nGoTm?%L4~jd_?Hn&!djHou-q*O`0k!yIw zq=EVk?~5H89x;R5`$n2Qax*G5bm%;^T*hDpmsCdlKb19Y8&`Amv57$d4CXY7_p4c=v zOjh&Zs38-Xf)R&#*Ym*fF~2n4;BmCBgGt(-Y0|n5Ce=?cO-nj5RWHarBw02c{({$F z-|pIxjfJcA3;U{?`V0{~egkCw_rpsrOul@wp&lZL-vB!ZJz&S=gOP`D)Z}*?mdSe=z){!k@SnE!_c0fcV#px*?*f z7MHjI=i*oO8mwDJIJ}!gUrqg}Mkw4{-WE~1wjMW~_wbT_+y>O`g6ETbd@bp)A%}i6R5^V#+0cVQ z!;5FaYC1t|_<;#lAd*-{O0kg#oiaj}&KtL?rp6xRQo`4yaDdWzJ5e+me@LOBPSM3^ z{6U@Q#BKHM1b5Ip0asOZz}iRzSB053(C|x0c@AnIqJJh_ndGs$q(kEp{Rz27$(BVs zG)$2kPSH1`v4CztnRN|x3$k$vt`r|ypa_e~?=VFBz9M7s9X4XokEZKf<_uB`)aZp- zAg0=NIN#I;%{?0JC^5EiOrR00LkX(nG>dj zVJAZ?LN-mq7%~Mz507>i;sGLf6S}&o>}@ndPoiw`!W=x``-z&^s7621pXe(a;4nzJ zY{`+GWb}}nFxP?GCk07#lj8q0$|0M;RNY?#)KlzLw8I8FxE!4gPJTM$R0}oSk&;Ot z6{W_F7gMyu#yvPEo-AOOAtsgGtZ@&SiB3i)OTi?dIyMIx?I<#umLz3n6W0dK12^{7 zx-ZFh%=~|4_?Pl#7C-qs$ z%N0&)B5wcYAJ>lwNjDdBkL$;zOFH<@@)LRH{SC($uiC0&yorc*u-x6|{UBYz74H@> zbfm~j90fK|Dtt+YErgc?W)pHPxffL}wH#iJnj++(rwg;9(t>!C3W7qaV6xn3hZf08 z!hPprdMr8@;vcG@UJ{a@nM$;G~EvmP_9wBRj$(z!lT4FD$cot=x z!#9W2nrNB5NfjpjZ{l~=Xh%D2seN)$AvXwONrN0hgs#a=v{Bol`+j8Im!S>Z#At_> z-K*-;d}v;b8Akf&;L`bMR+B=@@B5K*?I4n{Yp2EdCLR2S(oIU`r3LyX4c0wXO%1e` z=1Uq(7(522+ezyD)AD?q1~0(mG|@tQI|WZE(LJ>B*tM_)`Fcv?6h{U0d7|pd68+>N zq%Cme6zKFMJ6cQiRcjPQhVE(91xKP=3(xU!;dC7{UZX?kSE$^44 zG^xO&*)ka3rk8YFpthyt{>6+O^Ha1(({>5d!8>WY^rhXI7LL?L28B0-M}-oh!r%ii zQ*V0tVaKu_hx<-<1g3+BSk2ZL_-LOb@~Uzcr!VQ$mlj#vitJ{n$eu;pWg5&(@?5X} zY&~|Y&H+ZfcKbJAbV(QfG}i`*C_43BMYaveurCnUfc4*LN}TyadJCYFO;Ix^bJ=`! zsj{`8Sys~N(q$*>7wt49%uGY?5agi*HnGzbE`wl-uDdBs=1-{#_!N8(eX8Zis*}=m z`KQUYnZ{-6uBxL9^B4^rXJdFJq*r3x@* z#hOaVF_g$dk(#pNBq_ZDk?U0vnxf+*Ve>BDyjA^72{OhIYS>=bDpg#JqB3R3nhLK0 zY5l44ObN24fjS*kYlN#ZqAl&q=935KkB zhbd9k1hQ5bKRFFLOo4KeO4Wl6x zBi><(m6N1gImHU|7%cCw#mf9#8s7ZV{uR&Ss^Au13k+73W zkz}jS@{E>&=I4R>c}BwEEv1|TQ-fRS_h@na_>BWCR~H3}EmtS30yjXHatpLv4_}DV z7kt!^DK7cv%6u!b0tRi7_Q5tlh29M^uzUi{80O5Rz#y^mm(V@SxmpIMebfN$#at>efKdMec2DNn*0301_)FjML0n1 z+z+@m0uQhUQ1gZERRgUEoW~wO%_FzKKrQ`;2l@XJ#j}dI11{IjlK2h>9z7M@63O_;Sr7ar_qxMT9iEue0*JuEF|u0fRfEVbc25~4FYtF_MsaXwe_DMW6Iv4 zhYwufn^+cJG_cQ#=RKXL|k;nCv~qQ%rWK@yc*ETp+JYo2y+8B0gdyz?LH3re)5j z|D)L!m6Zwg9uFRAv6-68tDw+}2Xq!7^cI7nm! zaJowst9xWjPZ;6?Yhp^W^b~om9aA7?R6<=U=55RnU1|89RIV&*lO#Y4zQ5HD0I#i~ zp8q8zIG8 z?ZXQ?iI#I)(56>q5mN1Juid*?m>CopElxeR9yU0kmhHxy&KqUtk@~P}p?{Ys%ouVO zUVu(uSDC2XFzLZ@?F``f=yzBX#f~;|(;4DvH`2)ABs?brwqFoLnvZLbJ?1Gu&fYXC zPHsRRZzR0KDe`BZ`aA4pM>!jJ!(jBP{DzTMq!zA*vCgmbwLpG32i>ytc?eTuW3aa% z4tqGuAx?oHO|?ID+V);(N0qmfKwPS-|!6>d%Qq2SO`-NkR+tn ziJJL|c1|>IlE!Y;W;pHBlvBpD9j>Ws#D`~HfIUem7c6J z_OJR<<8mo9^o|vGh-AZ}ohB%Ug225pzt(A@a6GhKM`5PW8&|qyQawxzE=fa`!JJba zW5RDqs-LKiiNa}8>X_8-GXXdr((WrTpQvhhzmrO80&q!E?k?2|6M)k+{R=g5I8B8U z@uJiPVIpxn37Q|pMB%ELU2np1nzVp0J)5yM5jjmmmOHUr)j*lpT#|+=#uFxEd8duc zN%g|hUV;#6eR5DRGja97^a5ykrARLojJx*!yMtuW`VwDX%tSaANwv! zmnlu7@wompe5E87n|R8MvEJ7mNQWpK`2D?zbKDJ`i}?u52KFG1{t`)jkCX=eh(IJECJBuyxk69JyGSIOJ&SL-^P4V zOj#HDV3d620321$avTpEr#egNpRV3K3XBrNU8;JP^GZ7gkBriwfBvGsdZgt%1Lqt* z{+TEXfW9k)s+?~B#u4>B437+Pfqa#7<0zPd?sMYz3;S20mQV?y!0<4%&&Q|)C*1w~ z&b@IEo}7UkN*VYH%ms1j zpjYIbkJ7$B4;&-wW%>gtF|3^F_t`PPK=B^ve3a|Qc5*(-DtR1=iN|b03FFSMgJL4o zDlI=`uarg#m6ks!GG@^Sne-o(gEFP~=+C6*ISU`KI;B5Nrm;GuA4;TWfUqnbgfs64 zTle%CAY?sB?^a4H7MGm@z8}%U8?S5x`_%=T29z~D_VRYf0P%5`d)p)sIwJ{${%>WU z-+Mxk{SR_&VA=mf=XU3G$K#F}OFFf9O>Pam<@XN7IWzlo$PQRa-_^2-4stDGlLuOo z5cWTqIiTxl@1HjTBU3N^ zluRkLYfaRZj};C9NX^acj$g4>Op@JN36L00w?iq$zM)i^> zu9`X~?8<~?E%2hjG9J6@P2e?|9oI=QD=I@1c-5q&F20*aLs6NSD-V0g#n}9~-&iI@ zy=!8wOx3dkFE?0LuW~XGSDh0#U^DlWiMeV5x?Q3xpsPuXqaXT;iZ&8x&b^gdSU>z# z(gAjqx%7ivbuQ+>^#fZq5!VJB4uDXapi4S6=4!JL(54&E9Fms^DW&T)5m!tpMZ;`* z4QT->=J*6-gGdr8UOkmVHUU^oN;17vK6A2>A&)ZOtLTaY(wjbAuOWaxCwI-25qJ2H z;q*{LXjpJl@aVwSz!d*O{?mO=`_A|N(|ft+ZO;Pt0lYRn?5cA4tb462=Nc!Zdeuwk zVTcwRCBF3FN<4huxsnF&mi{Tn$hTsX#l!)t06aaolJ-awNS$AWlsEUU#3_x}Xn0-4 zIcWq{E-Fn^AU?eW)O{^0XGO6nm?}Pd2A7`VXKT+w3`3{l z56>dz#b;~JME{yFDYhd>B2FXO9Eo^L#ru)6vu zcP6B~!>mn^QFS;cImE=C%$w57w`QyQr1aVG?_znPyD|>bEZeH_Pq`GhS3!XpgewHb zn`dm{x7g>(w`v4bX0~D^20fz!wh1OC`ySijRuc);WVxbhCsx?*3-p4IZZ&~X?7P|G zwH;WdQ&JXGbgPMvYN{O0&N@L&@$#){MoW2vO&<=!D)eI5HF2VzFT^X{7d!baIB*v?&fA~MmasVqp-*bOS*s=-s432&RHc9H-#fM;$nzc}Zw z+$4hCPG66oIVyl+r zOFWmYl#^u-X@z&I7U0Y8ay;}MTUXy|3+)*xUV5~EZwP751DV>gdX^O8)$O|bVBZdx z6@Fm8RZHk)uKK;Re6x$GKjFunn6ZyK@g^)IULa6@qkTEL)s)N24fp>L_a5L;7u)~v z_FfVsK&S~t5D9EA2_+!CgwTu9R1}aBdI=D~-Y8yW0IAtvyF#*9Ktv4cRV)bHW<|kk zzZR_5itp#l%y+ZNE`NW??(@8{?3_6>pYNGIbLPy7dYrpaqNO1mQ^a+`533O zh#eiap)r%O6+OKO!+X+QA0QvGB!3Ncn1@d_72gV5Tc zsniUqODk(@=@ANJ-|u{EsI8d?2j@gCU;uUff&b;sM%$J0)Yi)@0bzglH2OkbLzYx3 zdimI-w9RJYE}H4`;#^j#Xyir8(KX^4_}|ezMTc#axwEvgjz0bZ5=63~sq*Qstc!J2 z@fVPwV;7L1C6$T-K5h;={1fD^tW(P>745qaf_H+?e#EnX+LJZeAJe}J6F8a`BNWue zO6H*2V~mMaKt&lZ>av2$!@~rN77a2V72UiDs7!=xJfi|MAjcpTHGQ3sJj*mbksj*0 z3frijtho+po!wx&!{)HwW4*+3uO-X8+1%8$#njTc+t}Xlkf94M0QTt)>AGvHwLLXY zXuRqu-h3=9ynTUjX(j3Fve@QHkplMq$Ox{}uOzix7F%@{d~&XeG-YpJ73q{wR;g&> zviS9hY|WG9KKAUBN*7f4hvI&AvZa-od!Ml55*o@5joUv7##?9oXDH5OjGZ*Q^Qedk4T<{aATxwtGmV zIe1*7CU_?{;qH3yC<@n~3GXkr3GY}Gt~wLE-};HKv|`&=;<}UF2g)-MnQP6M`vAn~ z*{4Pft|1fNKeyUbTMVuh6Fh%w!6Pxa8ccYvS(VPaV;3G*AijQ++Ut7%<@XE+G1;l z1IM0?LXgGDwOPX3R<}60221b`4-y$h`N&mQ!n-`9PH}RLmEaAMUx~{{+v-Y1Rh8L- zo$kD`DLc6sBNkoPV|II{&AoQPyqVXs(>h#S@KKwMEil9@YAZ3QV(X2b|An5O#(C%J z%9yf>kJp9gw$j^2d~a@5rJ|h@QNa^dU;KfQGP^dcYN`G~rTNs@7iVtE4I^NLU#Xvr zGf78uH{j&$%i3l3hg}otxOQ}mM*BU>$!Ssw!;RKj!!`|bpY1wFU$nljMa8DPR6Z2WD}*zf zb$PWso1J~Byg5Ak!1H&(zYNaqC%`&!vfQgP-lysX-~xmRfDwI_WB4tq&98Bn51zw? z(<_`DxFySfu{@KNG+SywOb-v9&93T<%6#Ir@>cM3i_efmE;#Qz!Qr|IC*=APTL>lZ zl1b$D|9!c3Up^B z(rQYj{d=wdiA=3q3r-<8Lysfa}eIJ?972AuYy^#uw5rh2D;FYiccGcemL96euQ;>uB=uYaZ7izs2m z7g2Wqh$uPFAv<<=k5G1m0DXxlj3AsS7n!~HcaOBvs#NNOxmB5m)Ck!dY@}!CwRWdn z)luV7Ii7S(a_H=TwU4y@3=5Y5)~}!$?e2WgS!DT-&LFY z0iR$0R{3Z+X9;IEyYNu^cj>% zn|I3F!1FrcNyyU`eyd-Bbbmpl13a%)JUM)~zahVmzs+M_1I~_j0YBwkF38n_CZuT! z%YKHlrh*=FhKoN%II|gqAfYBJG_QA^-Ych%PJ(Cgdp!JA!kNvg-{ax01bsoUCJHAG zYrfA}6BJqzRnN}8U!G$fyMDZ^1g+Sn6Q~;dt9kfw2>(Sj|H@e5MCl*ntT76$)KLek zeyhAKL>mpxH^+FSQNqcaY74fzAd&<9]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 From b3931e7b4c9a16e8930155bb4af96f3ee491567e Mon Sep 17 00:00:00 2001 From: Ferdy Rodriguez Date: Thu, 12 Mar 2026 07:19:44 +0100 Subject: [PATCH 090/260] add focus change handler to input fields for ui event triggering (#4718) --- .../input/ui/provider/TrackerInputProvider.kt | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt index 0a344595e7f..4cbe893f4de 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt @@ -102,6 +102,13 @@ fun TrackerInputProvider( }, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, + onFocusChanged = { isFocused -> + handleOnFocusChange( + isFocused = isFocused, + inputModelId = inputModel.uid, + onUiEvent = onUiEvent, + ) + }, ) } @@ -124,6 +131,13 @@ fun TrackerInputProvider( }, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, + onFocusChanged = { isFocused -> + handleOnFocusChange( + isFocused = isFocused, + inputModelId = inputModel.uid, + onUiEvent = onUiEvent, + ) + }, ) } @@ -146,6 +160,13 @@ fun TrackerInputProvider( }, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, + onFocusChanged = { isFocused -> + handleOnFocusChange( + isFocused = isFocused, + inputModelId = inputModel.uid, + onUiEvent = onUiEvent, + ) + }, ) } @@ -169,6 +190,13 @@ fun TrackerInputProvider( }, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, + onFocusChanged = { isFocused -> + handleOnFocusChange( + isFocused = isFocused, + inputModelId = inputModel.uid, + onUiEvent = onUiEvent, + ) + }, ) } @@ -192,6 +220,13 @@ fun TrackerInputProvider( }, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, + onFocusChanged = { isFocused -> + handleOnFocusChange( + isFocused = isFocused, + inputModelId = inputModel.uid, + onUiEvent = onUiEvent, + ) + }, ) } @@ -215,6 +250,13 @@ fun TrackerInputProvider( }, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, + onFocusChanged = { isFocused -> + handleOnFocusChange( + isFocused = isFocused, + inputModelId = inputModel.uid, + onUiEvent = onUiEvent, + ) + }, ) } @@ -237,6 +279,13 @@ fun TrackerInputProvider( }, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, + onFocusChanged = { isFocused -> + handleOnFocusChange( + isFocused = isFocused, + inputModelId = inputModel.uid, + onUiEvent = onUiEvent, + ) + }, ) } @@ -259,6 +308,13 @@ fun TrackerInputProvider( }, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, + onFocusChanged = { isFocused -> + handleOnFocusChange( + isFocused = isFocused, + inputModelId = inputModel.uid, + onUiEvent = onUiEvent, + ) + }, ) } @@ -281,6 +337,13 @@ fun TrackerInputProvider( }, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, + onFocusChanged = { isFocused -> + handleOnFocusChange( + isFocused = isFocused, + inputModelId = inputModel.uid, + onUiEvent = onUiEvent, + ) + }, ) } @@ -303,6 +366,13 @@ fun TrackerInputProvider( }, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, + onFocusChanged = { isFocused -> + handleOnFocusChange( + isFocused = isFocused, + inputModelId = inputModel.uid, + onUiEvent = onUiEvent, + ) + }, ) } @@ -325,6 +395,13 @@ fun TrackerInputProvider( }, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, + onFocusChanged = { isFocused -> + handleOnFocusChange( + isFocused = isFocused, + inputModelId = inputModel.uid, + onUiEvent = onUiEvent, + ) + }, ) } @@ -347,6 +424,13 @@ fun TrackerInputProvider( }, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, + onFocusChanged = { isFocused -> + handleOnFocusChange( + isFocused = isFocused, + inputModelId = inputModel.uid, + onUiEvent = onUiEvent, + ) + }, ) } @@ -774,3 +858,13 @@ fun manageOnValueChange( } private fun getYesOnlyValue(checked: Boolean): String? = if (!checked) "true" else null + +private fun handleOnFocusChange( + isFocused: Boolean, + inputModelId: String, + onUiEvent: (TrackerInputUiEvent) -> Unit, +) { + if (isFocused) { + onUiEvent(TrackerInputUiEvent.OnItemClick(inputModelId)) + } +} From 0565c52cd34a137ebe03f511c291abd423685be5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Thu, 12 Mar 2026 09:58:43 +0100 Subject: [PATCH 091/260] feat: Add ColorMatcher.kt to find the closest color palette [skip size] (#4700) * feat: Add ColorMatcher.kt to find the closest color palette * fix: [ANDROAPP-7521] Use configuration theme colour * fix: [ANDROAPP-7521] set background compose color to theme color correctly in settings screen * fix: [ANDROAPP-7521] update warnings in colorUtils file * fix: [ANDROAPP-7521] copilot review comments * fix: [ANDROAPP-7521] remember color property to avoid recompositions --------- Co-authored-by: Xavier Molloy --- .../org/dhis2/data/server/ServerModule.kt | 5 +- .../data/server/ServerSettingsRepository.kt | 43 ++++++- .../dhis2/data/server/SystemStyleMapper.kt | 17 --- .../usescases/settings/ui/SettingsScreen.kt | 10 +- .../org/dhis2/commons/resources/ColorUtils.kt | 110 +++--------------- .../dhis2/commons/resources/PaletteThemes.kt | 90 ++++++++++++++ .../mobile/commons/color/ColorMatcher.kt | 88 ++++++++++++++ .../mobile/commons/color/PaletteColor.kt | 21 ++++ .../mobile/commons/color/ColorMatcherTest.kt | 70 +++++++++++ 9 files changed, 339 insertions(+), 115 deletions(-) delete mode 100644 app/src/main/java/org/dhis2/data/server/SystemStyleMapper.kt create mode 100644 commons/src/main/java/org/dhis2/commons/resources/PaletteThemes.kt create mode 100644 commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/color/ColorMatcher.kt create mode 100644 commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/color/PaletteColor.kt create mode 100644 commonskmm/src/commonTest/kotlin/org/dhis2/mobile/commons/color/ColorMatcherTest.kt diff --git a/app/src/main/java/org/dhis2/data/server/ServerModule.kt b/app/src/main/java/org/dhis2/data/server/ServerModule.kt index 8cd45791161..d1ae9f3e71f 100644 --- a/app/src/main/java/org/dhis2/data/server/ServerModule.kt +++ b/app/src/main/java/org/dhis2/data/server/ServerModule.kt @@ -102,7 +102,10 @@ class ServerModule { @Provides @PerServer - fun providesRepository(d2: D2): ServerSettingsRepository = ServerSettingsRepository(d2) + fun providesRepository( + d2: D2, + colorUtils: ColorUtils, + ): ServerSettingsRepository = ServerSettingsRepository(d2, colorUtils) @Provides @PerServer diff --git a/app/src/main/java/org/dhis2/data/server/ServerSettingsRepository.kt b/app/src/main/java/org/dhis2/data/server/ServerSettingsRepository.kt index 735da2d5033..92bfcd7b3b5 100644 --- a/app/src/main/java/org/dhis2/data/server/ServerSettingsRepository.kt +++ b/app/src/main/java/org/dhis2/data/server/ServerSettingsRepository.kt @@ -2,11 +2,18 @@ package org.dhis2.data.server import io.reactivex.Single import org.dhis2.BuildConfig +import org.dhis2.R +import org.dhis2.commons.resources.ColorUtils +import org.dhis2.commons.resources.paletteThemes +import org.dhis2.mobile.commons.color.ColorMatcher +import org.dhis2.mobile.commons.color.PaletteColor import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.settings.SystemSetting +import timber.log.Timber class ServerSettingsRepository( private val d2: D2, + private val colorUtils: ColorUtils, ) { fun getTheme(): Single> = d2 @@ -14,19 +21,49 @@ class ServerSettingsRepository( .systemSetting() .get() .map { systemSettings -> - val style = + val customColor = systemSettings .firstOrNull { - it.key() == SystemSetting.SystemSettingKey.STYLE + it.key() == SystemSetting.SystemSettingKey.CUSTOM_COLOR }?.value() val flag = systemSettings .firstOrNull { it.key() == SystemSetting.SystemSettingKey.FLAG }?.value() - Pair(flag, SystemStyleMapper(style)) + if (customColor.isNullOrEmpty()) { + Pair(flag, R.style.AppTheme) + } else { + try { + val customColorPalette = PaletteColor.fromHex(customColor) + val closestColor = + ColorMatcher.findClosest( + selectedR = customColorPalette.r, + selectedG = customColorPalette.g, + selectedB = customColorPalette.b, + palette = + paletteThemes.map { (color, _) -> + PaletteColor.fromHex(color) + }, + ) + Pair(flag, getThemeFromClosestColor(closestColor)) + } catch (e: Exception) { + Timber.e(e, "Error parsing custom color, using default theme") + Pair(flag, R.style.AppTheme) + } + } } + private fun getThemeFromClosestColor(color: PaletteColor?): Int = + color?.let { + val serverTheme = colorUtils.getThemeFromColor(it.hex) + if (serverTheme != -1) { + serverTheme + } else { + R.style.AppTheme + } + } ?: R.style.AppTheme + fun allowScreenShare(): Boolean = BuildConfig.DEBUG || d2 diff --git a/app/src/main/java/org/dhis2/data/server/SystemStyleMapper.kt b/app/src/main/java/org/dhis2/data/server/SystemStyleMapper.kt deleted file mode 100644 index a00ceaede9b..00000000000 --- a/app/src/main/java/org/dhis2/data/server/SystemStyleMapper.kt +++ /dev/null @@ -1,17 +0,0 @@ -package org.dhis2.data.server - -import org.dhis2.R - -object SystemStyleMapper { - private const val SERVER_GREEN_THEME = "green" - private const val SERVER_INDIA_THEME = "india" - private const val SERVER_MYANMAR_THEME = "myanmar" - - operator fun invoke(serverStyle: String?): Int = - when { - serverStyle?.contains(SERVER_GREEN_THEME) == true -> R.style.GreenTheme - serverStyle?.contains(SERVER_INDIA_THEME) == true -> R.style.OrangeTheme - serverStyle?.contains(SERVER_MYANMAR_THEME) == true -> R.style.RedTheme - else -> R.style.AppTheme - } -} diff --git a/app/src/main/java/org/dhis2/usescases/settings/ui/SettingsScreen.kt b/app/src/main/java/org/dhis2/usescases/settings/ui/SettingsScreen.kt index 2feb5e357de..a8e058bac17 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/ui/SettingsScreen.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/ui/SettingsScreen.kt @@ -7,7 +7,6 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Snackbar import androidx.compose.material3.SnackbarDefaults @@ -22,7 +21,9 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp +import org.dhis2.commons.resources.ColorUtils import org.dhis2.usescases.settings.SettingItem import org.dhis2.usescases.settings.SyncManagerPresenter import org.dhis2.usescases.settings.models.DeleteDataState @@ -172,12 +173,17 @@ private fun SettingItemList( exportingDatabase: Boolean, onSettingsUiAction: (SettingsUiAction) -> Unit, ) { + val context = LocalContext.current + val primaryColor = remember(context) { + ColorUtils().getThemePrimaryColor(context) + } + LazyColumn( modifier = modifier .fillMaxSize() .imePadding() - .background(MaterialTheme.colorScheme.primary) + .background(primaryColor) .background(Color.White, RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp)) .clip(RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp)), contentPadding = PaddingValues(8.dp), diff --git a/commons/src/main/java/org/dhis2/commons/resources/ColorUtils.kt b/commons/src/main/java/org/dhis2/commons/resources/ColorUtils.kt index cea91e1e319..0cf64b8f39a 100644 --- a/commons/src/main/java/org/dhis2/commons/resources/ColorUtils.kt +++ b/commons/src/main/java/org/dhis2/commons/resources/ColorUtils.kt @@ -8,8 +8,11 @@ import android.graphics.PorterDuff import android.graphics.drawable.Drawable import android.util.TypedValue import androidx.core.graphics.ColorUtils +import androidx.core.graphics.toColorInt import org.dhis2.commons.R import java.util.Objects +import kotlin.math.pow +import androidx.compose.ui.graphics.Color as ComposeColor class ColorUtils { companion object { @@ -24,16 +27,7 @@ class ColorUtils { val b = hexColor[3] newHexColor = "#$r$r$g$g$b$b" // formatted to #ffff } - return Color.parseColor(newHexColor) - } - - fun getPrimaryColorWithAlpha( - context: Context, - primaryLight: ColorType, - alpha: Float, - ): Int { - val primaryColor = getPrimaryColor(context, primaryLight) - return ColorUtils.setAlphaComponent(primaryColor, 155) + return newHexColor.toColorInt() } fun withAlpha(color: Int): Int = ColorUtils.setAlphaComponent(color, 155) @@ -67,27 +61,18 @@ class ColorUtils { return drawableToTint } - fun tintDrawableWithColor( - drawableToTint: Drawable, - tintColor: Int, - ): Drawable { - drawableToTint.setTint(tintColor) - drawableToTint.setTintMode(PorterDuff.Mode.SRC_IN) - return drawableToTint - } - fun getContrastColor(color: Int): Int = if (getContrast(color) > 0.179) { - Color.parseColor("#b3000000") + "#b3000000".toColorInt() } else { - Color.parseColor("#e6ffffff") + "#e6ffffff".toColorInt() } fun getAlphaContrastColor(color: Int): Int = if (getContrast(color) > 0.500) { - Color.parseColor("#b3000000") + "#b3000000".toColorInt() } else { - Color.parseColor("#e6ffffff") + "#e6ffffff".toColorInt() } private fun getContrast(color: Int): Double { @@ -99,7 +84,7 @@ class ColorUtils { var green: Double? = null var blue: Double? = null rgb.forEach { - if (it <= 0.03928) it / 12.92 else Math.pow((it + 0.055) / 1.055, 2.4) + if (it <= 0.03928) it / 12.92 else ((it + 0.055) / 1.055).pow(2.4) if (red == null) { red = it } else if (green == null) { @@ -111,80 +96,21 @@ class ColorUtils { return 0.2126 * red!! + 0.7152 * green!! + 0.0722 * blue!! } - fun getThemeFromColor(color: String?): Int = - when (color) { - "#ffcdd2" -> R.style.colorPrimary_Pink - "#e57373" -> R.style.colorPrimary_e57 - "#d32f2f" -> R.style.colorPrimary_d32 - "#f06292" -> R.style.colorPrimary_f06 - "#c2185b" -> R.style.colorPrimary_c21 - "#880e4f" -> R.style.colorPrimary_880 - "#f50057" -> R.style.colorPrimary_f50 - "#e1bee7" -> R.style.colorPrimary_e1b - "#ba68c8" -> R.style.colorPrimary_ba6 - "#8e24aa" -> R.style.colorPrimary_8e2 - "#aa00ff" -> R.style.colorPrimary_aa0 - "#7e57c2" -> R.style.colorPrimary_7e5 - "#4527a0" -> R.style.colorPrimary_452 - "#7c4dff" -> R.style.colorPrimary_7c4 - "#6200ea" -> R.style.colorPrimary_620 - "#c5cae9" -> R.style.colorPrimary_c5c - "#7986cb" -> R.style.colorPrimary_798 - "#3949ab" -> R.style.colorPrimary_394 - "#304ffe" -> R.style.colorPrimary_304 - "#e3f2fd" -> R.style.colorPrimary_e3f - "#64b5f6" -> R.style.colorPrimary_64b - "#1976d2" -> R.style.colorPrimary_197 - "#0288d1" -> R.style.colorPrimary_028 - "#40c4ff" -> R.style.colorPrimary_40c - "#00b0ff" -> R.style.colorPrimary_00b - "#80deea" -> R.style.colorPrimary_80d - "#00acc1" -> R.style.colorPrimary_00a - "#00838f" -> R.style.colorPrimary_008 - "#006064" -> R.style.colorPrimary_006 - "#e0f2f1" -> R.style.colorPrimary_e0f - "#80cbc4" -> R.style.colorPrimary_80c - "#00695c" -> R.style.colorPrimary_0069 - "#64ffda" -> R.style.colorPrimary_64f - "#c8e6c9" -> R.style.colorPrimary_c8e - "#66bb6a" -> R.style.colorPrimary_66b - "#2e7d32" -> R.style.colorPrimary_2e7 - "#60ad5e" -> R.style.colorPrimary_60a - "#00e676" -> R.style.colorPrimary_00e - "#aed581" -> R.style.colorPrimary_aed - "#689f38" -> R.style.colorPrimary_689 - "#33691e" -> R.style.colorPrimary_336 - "#76ff03" -> R.style.colorPrimary_76f - "#64dd17" -> R.style.colorPrimary_64d - "#cddc39" -> R.style.colorPrimary_cdd - "#9e9d24" -> R.style.colorPrimary_9e9 - "#827717" -> R.style.colorPrimary_827 - "#fff9c4" -> R.style.colorPrimary_fff - "#fbc02d" -> R.style.colorPrimary_fbc - "#f57f17" -> R.style.colorPrimary_f57 - "#ffff00" -> R.style.colorPrimary_ffff - "#ffcc80" -> R.style.colorPrimary_ffc - "#ffccbc" -> R.style.colorPrimary_ffcc - "#ffab91" -> R.style.colorPrimary_ffa - "#bcaaa4" -> R.style.colorPrimary_bca - "#8d6e63" -> R.style.colorPrimary_8d6 - "#4e342e" -> R.style.colorPrimary_4e3 - "#fafafa" -> R.style.colorPrimary_faf - "#bdbdbd" -> R.style.colorPrimary_bdb - "#757575" -> R.style.colorPrimary_757 - "#424242" -> R.style.colorPrimary_424 - "#cfd8dc" -> R.style.colorPrimary_cfd - "#b0bec5" -> R.style.colorPrimary_b0b - "#607d8b" -> R.style.colorPrimary_607 - "#37474f" -> R.style.colorPrimary_374 - else -> -1 - } + fun getThemeFromColor(color: String?): Int = paletteThemes[color] ?: -1 // fun getPrimaryColor( context: Context, colorType: ColorType, ): Int = context.getPrimaryColor(colorType) + + fun getThemePrimaryColor(context: Context): ComposeColor { + val typedValue = TypedValue() + val a = context.theme.obtainStyledAttributes(typedValue.data, intArrayOf(android.R.attr.colorPrimary)) + val color = a.getColor(0, 0) + a.recycle() + return ComposeColor(color) + } } enum class ColorType { diff --git a/commons/src/main/java/org/dhis2/commons/resources/PaletteThemes.kt b/commons/src/main/java/org/dhis2/commons/resources/PaletteThemes.kt new file mode 100644 index 00000000000..a3a9c88ed45 --- /dev/null +++ b/commons/src/main/java/org/dhis2/commons/resources/PaletteThemes.kt @@ -0,0 +1,90 @@ +package org.dhis2.commons.resources + +import org.dhis2.commons.R + +/** + * Maps each hex color to its corresponding Android theme style resource. + */ +val paletteThemes: Map = + mapOf( + // Reds / Pinks + "#ffcdd2" to R.style.colorPrimary_Pink, + "#e57373" to R.style.colorPrimary_e57, + "#d32f2f" to R.style.colorPrimary_d32, + "#f06292" to R.style.colorPrimary_f06, + "#c2185b" to R.style.colorPrimary_c21, + "#880e4f" to R.style.colorPrimary_880, + "#f50057" to R.style.colorPrimary_f50, + // Purples + "#e1bee7" to R.style.colorPrimary_e1b, + "#ba68c8" to R.style.colorPrimary_ba6, + "#8e24aa" to R.style.colorPrimary_8e2, + "#aa00ff" to R.style.colorPrimary_aa0, + // Deep Purples / Indigos + "#7e57c2" to R.style.colorPrimary_7e5, + "#4527a0" to R.style.colorPrimary_452, + "#7c4dff" to R.style.colorPrimary_7c4, + "#6200ea" to R.style.colorPrimary_620, + "#c5cae9" to R.style.colorPrimary_c5c, + "#7986cb" to R.style.colorPrimary_798, + "#3949ab" to R.style.colorPrimary_394, + "#304ffe" to R.style.colorPrimary_304, + // Blues + "#e3f2fd" to R.style.colorPrimary_e3f, + "#64b5f6" to R.style.colorPrimary_64b, + "#1976d2" to R.style.colorPrimary_197, + "#0288d1" to R.style.colorPrimary_028, + "#40c4ff" to R.style.colorPrimary_40c, + "#00b0ff" to R.style.colorPrimary_00b, + // Cyans / Teals + "#80deea" to R.style.colorPrimary_80d, + "#00acc1" to R.style.colorPrimary_00a, + "#00838f" to R.style.colorPrimary_008, + "#006064" to R.style.colorPrimary_006, + "#e0f2f1" to R.style.colorPrimary_e0f, + "#80cbc4" to R.style.colorPrimary_80c, + "#00695c" to R.style.colorPrimary_0069, + "#64ffda" to R.style.colorPrimary_64f, + // Greens + "#c8e6c9" to R.style.colorPrimary_c8e, + "#66bb6a" to R.style.colorPrimary_66b, + "#2e7d32" to R.style.colorPrimary_2e7, + "#60ad5e" to R.style.colorPrimary_60a, + "#00e676" to R.style.colorPrimary_00e, + // Light Greens / Limes + "#aed581" to R.style.colorPrimary_aed, + "#689f38" to R.style.colorPrimary_689, + "#33691e" to R.style.colorPrimary_336, + "#76ff03" to R.style.colorPrimary_76f, + "#64dd17" to R.style.colorPrimary_64d, + "#cddc39" to R.style.colorPrimary_cdd, + "#9e9d24" to R.style.colorPrimary_9e9, + "#827717" to R.style.colorPrimary_827, + // Yellows + "#fff9c4" to R.style.colorPrimary_fff, + "#fbc02d" to R.style.colorPrimary_fbc, + "#f57f17" to R.style.colorPrimary_f57, + "#ffff00" to R.style.colorPrimary_ffff, + // Oranges / Browns + "#ffcc80" to R.style.colorPrimary_ffc, + "#ffccbc" to R.style.colorPrimary_ffcc, + "#ffab91" to R.style.colorPrimary_ffa, + "#bcaaa4" to R.style.colorPrimary_bca, + "#8d6e63" to R.style.colorPrimary_8d6, + "#4e342e" to R.style.colorPrimary_4e3, + // Greys + "#fafafa" to R.style.colorPrimary_faf, + "#bdbdbd" to R.style.colorPrimary_bdb, + "#757575" to R.style.colorPrimary_757, + "#424242" to R.style.colorPrimary_424, + // Blue Greys + "#cfd8dc" to R.style.colorPrimary_cfd, + "#b0bec5" to R.style.colorPrimary_b0b, + "#607d8b" to R.style.colorPrimary_607, + "#37474f" to R.style.colorPrimary_374, + // User settings old styles + "#ea5911" to R.style.OrangeTheme, + "#467e4a" to R.style.GreenTheme, + "#276696" to R.style.AppTheme, + "#b40303" to R.style.RedTheme, + ) diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/color/ColorMatcher.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/color/ColorMatcher.kt new file mode 100644 index 00000000000..4aafb3ea226 --- /dev/null +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/color/ColorMatcher.kt @@ -0,0 +1,88 @@ +package org.dhis2.mobile.commons.color + +import kotlin.math.pow +import kotlin.math.sqrt + +/** + * CIE L*a*b* color representation for perceptually uniform distance calculations. + */ +private data class Lab( + val l: Double, + val a: Double, + val b: Double, +) + +/** + * Finds the closest color from the palette to the given selected color + * using the CIE76 Delta E in L*a*b* color space, + * which is more perceptually accurate than simple RGB Euclidean distance. + */ +object ColorMatcher { + fun findClosest( + selectedR: Int, + selectedG: Int, + selectedB: Int, + palette: List, + ): PaletteColor? { + if (palette.isEmpty()) return null + val selectedLab = rgbToLab(selectedR, selectedG, selectedB) + return palette.minByOrNull { color -> + val lab = rgbToLab(color.r, color.g, color.b) + deltaE(selectedLab, lab) + } + } + + /** + * CIE76 Delta E — Euclidean distance in L*a*b* space. + */ + private fun deltaE( + c1: Lab, + c2: Lab, + ): Double = + sqrt( + (c1.l - c2.l).pow(2) + + (c1.a - c2.a).pow(2) + + (c1.b - c2.b).pow(2), + ) + + /** + * Convert sRGB to CIE L*a*b* via XYZ intermediate. + */ + private fun rgbToLab( + r: Int, + g: Int, + b: Int, + ): Lab { + // sRGB -> linear RGB + var rr = r / 255.0 + var gg = g / 255.0 + var bb = b / 255.0 + + rr = if (rr > 0.04045) ((rr + 0.055) / 1.055).pow(2.4) else rr / 12.92 + gg = if (gg > 0.04045) ((gg + 0.055) / 1.055).pow(2.4) else gg / 12.92 + bb = if (bb > 0.04045) ((bb + 0.055) / 1.055).pow(2.4) else bb / 12.92 + + // Linear RGB -> XYZ (D65 illuminant) + val x = (rr * 0.4124564 + gg * 0.3575761 + bb * 0.1804375) / 0.95047 + val y = (rr * 0.2126729 + gg * 0.7151522 + bb * 0.0721750) / 1.00000 + val z = (rr * 0.0193339 + gg * 0.1191920 + bb * 0.9503041) / 1.08883 + + // XYZ -> L*a*b* + val fx = labF(x) + val fy = labF(y) + val fz = labF(z) + + val l = 116.0 * fy - 16.0 + val a = 500.0 * (fx - fy) + val bLab = 200.0 * (fy - fz) + + return Lab(l, a, bLab) + } + + private fun labF(t: Double): Double = + if (t > 0.008856) { + t.pow(1.0 / 3.0) + } else { + (7.787 * t) + (16.0 / 116.0) + } +} diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/color/PaletteColor.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/color/PaletteColor.kt new file mode 100644 index 00000000000..cbdea388636 --- /dev/null +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/color/PaletteColor.kt @@ -0,0 +1,21 @@ +package org.dhis2.mobile.commons.color + +/** + * Represents a color in RGB space, parsed from a hex string. + */ +data class PaletteColor( + val hex: String, + val r: Int, + val g: Int, + val b: Int, +) { + companion object { + fun fromHex(hex: String): PaletteColor { + val clean = hex.removePrefix("#") + val r = clean.substring(0, 2).toInt(16) + val g = clean.substring(2, 4).toInt(16) + val b = clean.substring(4, 6).toInt(16) + return PaletteColor(hex = "#$clean", r = r, g = g, b = b) + } + } +} diff --git a/commonskmm/src/commonTest/kotlin/org/dhis2/mobile/commons/color/ColorMatcherTest.kt b/commonskmm/src/commonTest/kotlin/org/dhis2/mobile/commons/color/ColorMatcherTest.kt new file mode 100644 index 00000000000..2b8d91aa0ac --- /dev/null +++ b/commonskmm/src/commonTest/kotlin/org/dhis2/mobile/commons/color/ColorMatcherTest.kt @@ -0,0 +1,70 @@ +package org.dhis2.mobile.commons.color + +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNull + +class ColorMatcherTest { + // Palette sampled from PaletteThemes covering distinct hue regions + private val palette = + listOf( + PaletteColor.fromHex("#d32f2f"), // Red + PaletteColor.fromHex("#1976d2"), // Blue + PaletteColor.fromHex("#2e7d32"), // Green + PaletteColor.fromHex("#fbc02d"), // Amber/Yellow + PaletteColor.fromHex("#424242"), // Dark Grey + ) + + @Test + fun returnsNullWhenPaletteIsEmpty() { + assertNull(ColorMatcher.findClosest(128, 128, 128, emptyList())) + } + + @Test + fun returnsOnlyColorWhenPaletteHasSingleEntry() { + val single = PaletteColor.fromHex("#1976d2") + assertEquals(single, ColorMatcher.findClosest(255, 0, 0, listOf(single))) + } + + @Test + fun exactColorMatchReturnsItself() { + // #d32f2f = rgb(211, 47, 47) + val result = ColorMatcher.findClosest(211, 47, 47, palette) + assertEquals(PaletteColor.fromHex("#d32f2f"), result) + } + + @Test + fun pureRedIsMatchedToRedPaletteEntry() { + // rgb(255, 0, 0) should be perceptually closest to #d32f2f among the palette + val result = ColorMatcher.findClosest(255, 0, 0, palette) + assertEquals(PaletteColor.fromHex("#d32f2f"), result) + } + + @Test + fun pureBlueIsMatchedToBluePaletteEntry() { + // rgb(0, 0, 255) should be perceptually closest to #1976d2 among the palette + val result = ColorMatcher.findClosest(0, 0, 255, palette) + assertEquals(PaletteColor.fromHex("#1976d2"), result) + } + + @Test + fun pureGreenIsMatchedToGreenPaletteEntry() { + // rgb(0, 128, 0) should be perceptually closest to #2e7d32 among the palette + val result = ColorMatcher.findClosest(0, 128, 0, palette) + assertEquals(PaletteColor.fromHex("#2e7d32"), result) + } + + @Test + fun yellowIsMatchedToAmberPaletteEntry() { + // rgb(255, 200, 0) should be perceptually closest to #fbc02d among the palette + val result = ColorMatcher.findClosest(255, 200, 0, palette) + assertEquals(PaletteColor.fromHex("#fbc02d"), result) + } + + @Test + fun darkGreyIsMatchedToGreyPaletteEntry() { + // rgb(64, 64, 64) should be perceptually closest to #424242 among the palette + val result = ColorMatcher.findClosest(64, 64, 64, palette) + assertEquals(PaletteColor.fromHex("#424242"), result) + } +} From b4abb3c6e5a66803c00ce1d2350e93da37b5a20e Mon Sep 17 00:00:00 2001 From: Pablo Date: Thu, 12 Mar 2026 10:47:38 +0100 Subject: [PATCH 092/260] build: Allow rooted devices for training app (#4719) --- .../dhis2/usescases/splash/SplashActivity.kt | 51 ++++++++++--------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/org/dhis2/usescases/splash/SplashActivity.kt b/app/src/main/java/org/dhis2/usescases/splash/SplashActivity.kt index dfe8ad83645..18cc352356a 100644 --- a/app/src/main/java/org/dhis2/usescases/splash/SplashActivity.kt +++ b/app/src/main/java/org/dhis2/usescases/splash/SplashActivity.kt @@ -55,23 +55,38 @@ class SplashActivity : override fun onResume() { super.onResume() - if (BuildConfig.DEBUG || !RootBeer(this).isRootedWithoutBusyBoxCheck) { - if (!isDebuggerEnable() || !detectDebugger()) { - presenter.init() - } else { - showRootedDialog( - getString(R.string.security_title), - getString(R.string.security_debugger_message), - ) - } - } else { - showRootedDialog( + val isRooted = !BuildConfig.DEBUG && RootBeer(this).isRootedWithBusyBoxCheck + val isDebuggerActive = isDebuggerEnable() && detectDebugger() + + when { + isRooted -> showRootedDialog( getString(R.string.security_title), getString(R.string.security_rooted_message), ) + + isDebuggerActive -> showRootedDialog( + getString(R.string.security_title), + getString(R.string.security_debugger_message), + ) + + else -> presenter.init() } } + private fun isDebuggerEnable(): Boolean = + if (!BuildConfig.DEBUG && BuildConfig.FLAVOR != "dhis2Training") { + context.applicationContext.applicationInfo.flags and FLAG_DEBUGGABLE != 0 + } else { + false + } + + private fun detectDebugger(): Boolean = + if (!BuildConfig.DEBUG && BuildConfig.FLAVOR != "dhis2Training") { + Debug.isDebuggerConnected() + } else { + false + } + override fun onPause() { presenter.destroy() super.onPause() @@ -153,18 +168,4 @@ class SplashActivity : ) } } - - private fun isDebuggerEnable(): Boolean = - if (!BuildConfig.DEBUG) { - context.applicationContext.applicationInfo.flags and FLAG_DEBUGGABLE != 0 - } else { - false - } - - private fun detectDebugger(): Boolean = - if (!BuildConfig.DEBUG) { - Debug.isDebuggerConnected() - } else { - false - } } From 0df74ceba68c821fc94060ca2f7b7d8fa2612fb2 Mon Sep 17 00:00:00 2001 From: Ferdy Rodriguez Date: Thu, 12 Mar 2026 12:11:05 +0100 Subject: [PATCH 093/260] Updates Rule engine. (#4724) --- gradle/libs.versions.toml | 2 +- gradle/verification-metadata.xml | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0ca11cf5b17..2b2a37089f8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -12,7 +12,7 @@ dagger = '2.57.2' jacoco = '0.8.14' designSystem = "0.7.0-SNAPSHOT" dhis2sdk = "1.14.0-SNAPSHOT" -ruleEngine = "3.6.0" +ruleEngine = "3.6.1" expressionParser = "1.3.1" appcompat = "1.7.1" annotation = "1.9.1" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 38fbff1307e..2dd792fdd34 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -13230,6 +13230,14 @@ + + + + + + + + From 079c3c7a21a7ca45e3670aac3f6ee923d08aa056 Mon Sep 17 00:00:00 2001 From: Pablo Date: Thu, 12 Mar 2026 12:59:14 +0100 Subject: [PATCH 094/260] fix: [ANDROAPP-7494] Remove compose animation forced version (#4723) --- .../org/dhis2/usescases/login/LoginRobot.kt | 5 + build.gradle.kts | 4 - gradle/verification-metadata.xml | 354 ++++++++++++++++++ 3 files changed, 359 insertions(+), 4 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/login/LoginRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/login/LoginRobot.kt index a3fffd53c88..25863c4453c 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/login/LoginRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/login/LoginRobot.kt @@ -43,7 +43,12 @@ class LoginRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { composeTestRule.onNodeWithTag(SERVER_VALIDATION_CONTENT_BUTTON_TAG).performClick() } + @OptIn(ExperimentalTestApi::class) fun typeServerToValidate(server: String) { + composeTestRule.waitUntilExactlyOneExists( + hasTestTag("INPUT_QR_CODE_FIELD"), + TIMEOUT + ) composeTestRule.onNodeWithTag("INPUT_QR_CODE_FIELD").performTextReplacement(server) } diff --git a/build.gradle.kts b/build.gradle.kts index b751339a98c..a923bc4363b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -61,10 +61,6 @@ allprojects { eachDependency { if (requested.group == "org.jacoco") useVersion("0.8.10") - // Force androidx.compose.animation to 1.9.5 to maintain compatibility with sharedElement API - if (requested.group == "androidx.compose.animation") { - useVersion("1.9.3") - } } } } diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 2dd792fdd34..778c65281a3 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -557,6 +557,18 @@ + + + + + + + + + + @@ -565,6 +577,12 @@ + + + + + @@ -616,6 +634,26 @@ + + + + + + + + + + + + + + + + @@ -632,6 +670,12 @@ + + + + + @@ -667,6 +711,18 @@ + + + + + + + + + + @@ -721,6 +777,26 @@ + + + + + + + + + + + + + + + + @@ -781,6 +857,12 @@ + + + + + @@ -873,6 +955,16 @@ + + + + + + + + @@ -880,6 +972,12 @@ + + + + + @@ -937,6 +1035,12 @@ + + + + + @@ -1005,6 +1109,17 @@ + + + + + + + + @@ -1566,6 +1681,16 @@ + + + + + + + + @@ -1606,6 +1731,16 @@ + + + + + + + + @@ -13795,6 +13930,16 @@ + + + + + + + + @@ -13839,6 +13984,16 @@ + + + + + + + + @@ -13975,6 +14130,17 @@ + + + + + + + + @@ -14024,6 +14190,17 @@ + + + + + + + + @@ -14112,6 +14289,17 @@ + + + + + + + + @@ -14279,6 +14467,12 @@ + + + + + @@ -14384,6 +14578,16 @@ + + + + + + + + @@ -14460,6 +14664,17 @@ + + + + + + + + @@ -14513,6 +14728,17 @@ + + + + + + + + @@ -14655,6 +14881,12 @@ + + + + + @@ -14683,6 +14915,16 @@ + + + + + + + + @@ -15030,6 +15272,17 @@ + + + + + + + + @@ -15129,6 +15382,16 @@ + + + + + + + + @@ -15189,6 +15452,16 @@ + + + + + + + + @@ -15275,6 +15548,16 @@ + + + + + + + + @@ -15406,6 +15689,16 @@ + + + + + + + + @@ -15459,6 +15752,16 @@ + + + + + + + + @@ -15510,6 +15813,16 @@ + + + + + + + + @@ -15592,6 +15905,17 @@ + + + + + + + + @@ -15727,6 +16051,16 @@ + + + + + + + + @@ -15777,6 +16111,16 @@ + + + + + + + + @@ -15818,6 +16162,16 @@ + + + + + + + + From 8ef16e6ecb62a7633789d065640dd1bd0bc5f990 Mon Sep 17 00:00:00 2001 From: Pablo Date: Fri, 13 Mar 2026 07:44:31 +0100 Subject: [PATCH 095/260] remove legacy unused code --- .../org/dhis2/common/db/TestingDatabase.kt | 61 ------------------- app/src/main/AndroidManifest.xml | 1 - .../java/org/dhis2/utils/WebViewActivity.kt | 57 ----------------- 3 files changed, 119 deletions(-) delete mode 100644 app/src/androidTest/java/org/dhis2/common/db/TestingDatabase.kt delete mode 100644 app/src/main/java/org/dhis2/utils/WebViewActivity.kt diff --git a/app/src/androidTest/java/org/dhis2/common/db/TestingDatabase.kt b/app/src/androidTest/java/org/dhis2/common/db/TestingDatabase.kt deleted file mode 100644 index 6bf505b016c..00000000000 --- a/app/src/androidTest/java/org/dhis2/common/db/TestingDatabase.kt +++ /dev/null @@ -1,61 +0,0 @@ -package org.dhis2.common.db - -import android.os.Environment -import androidx.test.core.app.ApplicationProvider -import androidx.test.ext.junit.runners.AndroidJUnit4 -import org.dhis2.AppTest -import org.dhis2.data.server.ServerModule -import org.dhis2.usescases.BaseTest -import org.hisp.dhis.android.core.D2Manager -import org.junit.Ignore -import org.junit.Test -import org.junit.runner.RunWith -import timber.log.Timber -import java.io.File -import java.io.FileInputStream -import java.io.FileOutputStream - -@RunWith(AndroidJUnit4::class) -class TestingDatabase : BaseTest() { - - companion object { - const val url = "https://play.dhis2.org/android-current/" - const val username = "android" - const val password = "Android123" - } - - @Ignore("This tests exports the Database to SD card, uncomment to use it locally") - @Test - fun copyDatabase() { - - /* Download db */ - val d2 = - D2Manager.blockingInstantiateD2(ServerModule.getD2Configuration(ApplicationProvider.getApplicationContext())) - d2?.userModule() - ?.logIn(username, password, url) - ?.blockingGet() - d2?.metadataModule()?.blockingDownload() - - /* Export Db to sdcard */ - try { - val sd = Environment.getExternalStorageDirectory() - - if (sd.canWrite()) { - val currentDB = - context.getDatabasePath("play-dhis2-org-android-current_android_unencrypted.db") - val backupDBPath = "dhis_test.db" - val backupDB = File(sd, backupDBPath) - - if (currentDB.exists()) { - val src = FileInputStream(currentDB).channel - val dst = FileOutputStream(backupDB).channel - dst.transferFrom(src, 0, src.size()) - src.close() - dst.close() - } - } - } catch (e: Exception) { - Timber.e(e) - } - } -} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e9f21c33902..40613e869a7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -94,7 +94,6 @@ - diff --git a/app/src/main/java/org/dhis2/utils/WebViewActivity.kt b/app/src/main/java/org/dhis2/utils/WebViewActivity.kt deleted file mode 100644 index 386312314cf..00000000000 --- a/app/src/main/java/org/dhis2/utils/WebViewActivity.kt +++ /dev/null @@ -1,57 +0,0 @@ -package org.dhis2.utils - -import android.annotation.SuppressLint -import android.app.Activity -import android.os.Bundle -import android.view.View -import android.webkit.WebResourceRequest -import android.webkit.WebView -import android.webkit.WebViewClient -import androidx.databinding.DataBindingUtil -import org.dhis2.R -import org.dhis2.databinding.ActivityWebviewBinding - -class WebViewActivity : Activity() { - companion object { - const val WEB_VIEW_URL = "url" - } - - @SuppressLint("SetJavaScriptEnabled") - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - val binding: ActivityWebviewBinding = - DataBindingUtil.setContentView(this, R.layout.activity_webview) - - val url = intent?.extras?.getString(WEB_VIEW_URL) - - url?.let { - // Avoid the WebView to automatically redirect to a browser - binding.webView.webViewClient = - object : WebViewClient() { - override fun shouldOverrideUrlLoading( - view: WebView?, - request: WebResourceRequest, - ): Boolean = super.shouldOverrideUrlLoading(view, request) - - // Compatibility with APIs below 24 - @Deprecated("Deprecated in Java") - override fun shouldOverrideUrlLoading( - view: WebView?, - url: String?, - ): Boolean = super.shouldOverrideUrlLoading(view, url) - } - - binding.webView.settings.javaScriptEnabled = true - binding.webView.loadUrl(it) - } - } - - fun backToLogin(view: View) { - finish() - } - - @Deprecated("Deprecated in Java") - override fun onBackPressed() { - finish() - } -} From 81a8636dedfe7a73029ad39b6b2cf5b02c18c34f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manu=20Mu=C3=B1oz?= Date: Fri, 13 Mar 2026 09:39:41 +0100 Subject: [PATCH 096/260] feat: [ANDROAPP-7445] adapt to mandatory dataset for value (#4717) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: [ANDROAPP-7445] adapt to mandatory dataset for value Signed-off-by: Manu Muñoz * feat: [ANDROAPP-7445] adapt to mandatory dataset for value Signed-off-by: Manu Muñoz * sonarcloud depecrated networkutils Signed-off-by: Manu Muñoz --------- Signed-off-by: Manu Muñoz --- .../dhis2/data/forms/dataentry/ValueStore.kt | 9 -- .../data/forms/dataentry/ValueStoreImpl.kt | 93 ++++--------------- .../development/ConflictGenerator.kt | 49 ++++++---- .../usescases/enrollment/EnrollmentModule.kt | 16 ++-- .../SearchRepositoryImpl.java | 20 ++-- .../searchTrackEntity/SearchTEModule.java | 10 +- .../data/forms/dataentry/ValueStoreTest.kt | 22 +++-- .../searchTrackEntity/SearchRepositoryTest.kt | 4 +- 8 files changed, 90 insertions(+), 133 deletions(-) diff --git a/app/src/main/java/org/dhis2/data/forms/dataentry/ValueStore.kt b/app/src/main/java/org/dhis2/data/forms/dataentry/ValueStore.kt index 337621dc51a..60faa114c38 100644 --- a/app/src/main/java/org/dhis2/data/forms/dataentry/ValueStore.kt +++ b/app/src/main/java/org/dhis2/data/forms/dataentry/ValueStore.kt @@ -15,15 +15,6 @@ interface ValueStore { value: String?, ): Flowable - suspend fun save( - orgUnitUid: String, - periodId: String, - attributeOptionComboUid: String, - dataElementUid: String, - categoryOptionComboUid: String, - value: String?, - ): Flowable - fun deleteOptionValues(optionCodeValuesToDelete: List) fun deleteOptionValueIfSelected( diff --git a/app/src/main/java/org/dhis2/data/forms/dataentry/ValueStoreImpl.kt b/app/src/main/java/org/dhis2/data/forms/dataentry/ValueStoreImpl.kt index c505471e2c0..a6203eadaf0 100644 --- a/app/src/main/java/org/dhis2/data/forms/dataentry/ValueStoreImpl.kt +++ b/app/src/main/java/org/dhis2/data/forms/dataentry/ValueStoreImpl.kt @@ -1,16 +1,19 @@ package org.dhis2.data.forms.dataentry import io.reactivex.Flowable +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.stateIn import org.dhis2.bindings.blockingSetCheck import org.dhis2.bindings.withValueTypeCheck import org.dhis2.commons.data.EntryMode -import org.dhis2.commons.network.NetworkUtils import org.dhis2.commons.resources.ResourceManager +import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.dhislogic.DhisEnrollmentUtils import org.dhis2.form.R import org.dhis2.form.model.StoreResult import org.dhis2.form.model.ValueStoreResult -import org.dhis2.mobile.commons.providers.FieldErrorMessageProvider +import org.dhis2.mobile.commons.network.NetworkStatusProvider import org.dhis2.mobile.commons.reporting.CrashReportController import org.dhis2.utils.DhisTextUtils import org.hisp.dhis.android.core.D2 @@ -28,14 +31,22 @@ class ValueStoreImpl( private val entryMode: EntryMode, private val dhisEnrollmentUtils: DhisEnrollmentUtils, private val crashReportController: CrashReportController, - private val networkUtils: NetworkUtils, private val searchTEIRepository: SearchTEIRepository, - private val fieldErrorMessageProvider: FieldErrorMessageProvider, private val resourceManager: ResourceManager, + networkStatusProvider: NetworkStatusProvider, + dispatcherProvider: DispatcherProvider, ) : ValueStore { var enrollmentRepository: EnrollmentObjectRepository? = null var overrideProgramUid: String? = null + private val isNetworkOnline = + networkStatusProvider.connectionStatus + .stateIn( + CoroutineScope(dispatcherProvider.io()), + SharingStarted.Eagerly, + false, + ) + override fun overrideProgram(programUid: String?) { overrideProgramUid = programUid } @@ -67,78 +78,6 @@ class ValueStoreImpl( ) } - override suspend fun save( - orgUnitUid: String, - periodId: String, - attributeOptionComboUid: String, - dataElementUid: String, - categoryOptionComboUid: String, - value: String?, - ): Flowable { - val dataValueObject = - d2.dataValueModule().dataValues().value( - periodId, - orgUnitUid, - dataElementUid, - categoryOptionComboUid, - attributeOptionComboUid, - ) - - val validator = - d2 - .dataElementModule() - .dataElements() - .uid(dataElementUid) - .blockingGet() - ?.valueType() - ?.validator - - return if (!value.isNullOrEmpty()) { - if (dataValueObject.blockingExists() && - dataValueObject.blockingGet()?.value() == value - ) { - Flowable.just(StoreResult("", ValueStoreResult.VALUE_HAS_NOT_CHANGED)) - } else { - when (val validation = validator?.validate(value)) { - is Result.Failure -> - Flowable.just( - StoreResult( - uid = "", - valueStoreResult = ValueStoreResult.ERROR_UPDATING_VALUE, - valueStoreResultMessage = - fieldErrorMessageProvider - .getFriendlyErrorMessage(validation.failure), - ), - ) - - is Result.Success -> - dataValueObject - .set(value) - .andThen(Flowable.just(StoreResult("", ValueStoreResult.VALUE_CHANGED))) - - else -> - Flowable.just( - StoreResult( - uid = "", - valueStoreResult = ValueStoreResult.ERROR_UPDATING_VALUE, - valueStoreResultMessage = - fieldErrorMessageProvider - .defaultValidationErrorMessage(), - ), - ) - } - } - } else { - if (dataValueObject.blockingExists()) { - dataValueObject - .deleteIfExist() - .andThen(Flowable.just(StoreResult("", ValueStoreResult.VALUE_CHANGED))) - } else { - Flowable.just(StoreResult("", ValueStoreResult.VALUE_HAS_NOT_CHANGED)) - } - } - } - override fun saveWithTypeCheck( uid: String, value: String?, @@ -304,7 +243,7 @@ class ValueStoreImpl( value: String?, teiUid: String, ): Boolean = - if (!networkUtils.isOnline()) { + if (!isNetworkOnline.value) { dhisEnrollmentUtils.isTrackedEntityAttributeValueUnique(uid, value, teiUid) } else { val programUid = overrideProgramUid ?: enrollmentRepository?.blockingGet()?.program() diff --git a/app/src/main/java/org/dhis2/usescases/development/ConflictGenerator.kt b/app/src/main/java/org/dhis2/usescases/development/ConflictGenerator.kt index b8b9243cbdb..99c7dced63c 100644 --- a/app/src/main/java/org/dhis2/usescases/development/ConflictGenerator.kt +++ b/app/src/main/java/org/dhis2/usescases/development/ConflictGenerator.kt @@ -128,24 +128,37 @@ class ConflictGenerator( dataValueConflict.categoryOptionCombo() != null && dataValueConflict.attributeOptionCombo() != null ) { - val dataValue = - d2 - .dataValueModule() - .dataValues() - .value( - dataValueConflict.period()!!, - dataValueConflict.orgUnit()!!, - dataValueConflict.dataElement()!!, - dataValueConflict.categoryOptionCombo()!!, - dataValueConflict.attributeOptionCombo()!!, - ).blockingGet() - val dv = - dataValue?.toBuilder()?.syncState(State.SYNCED)?.build() - dv?.let { - runBlocking { - d2.databaseAdapter().upsertObject(it, DataValue::class) + d2 + .dataSetModule() + .dataSetCompleteRegistrations() + .byPeriod() + .eq(dataValueConflict.period()!!) + .byOrganisationUnitUid() + .eq(dataValueConflict.orgUnit()!!) + .byAttributeOptionComboUid() + .eq(dataValueConflict.attributeOptionCombo()!!) + .blockingGet() + .forEach { + val dataValue = + d2 + .dataValueModule() + .dataValues() + .value( + dataValueConflict.period()!!, + dataValueConflict.orgUnit()!!, + dataValueConflict.dataElement()!!, + dataValueConflict.categoryOptionCombo()!!, + dataValueConflict.attributeOptionCombo()!!, + it.dataSet(), + ).blockingGet() + val dv = + dataValue?.toBuilder()?.syncState(State.SYNCED)?.build() + dv?.let { + runBlocking { + d2.databaseAdapter().upsertObject(it, DataValue::class) + } + } } - } } }.also { runBlocking { @@ -534,7 +547,7 @@ class ConflictGenerator( syncState: String, ): String = "UPDATE Enrollment SET syncState = '$syncState'," + - " aggregatedSyncState = '$syncState' where uid = '$enrollmentUid'" + " aggregatedSyncState = '$syncState' where uid = '$enrollmentUid'" private fun updateTei( teiUid: String, diff --git a/app/src/main/java/org/dhis2/usescases/enrollment/EnrollmentModule.kt b/app/src/main/java/org/dhis2/usescases/enrollment/EnrollmentModule.kt index 53ecfd232e1..d0324b7a46d 100644 --- a/app/src/main/java/org/dhis2/usescases/enrollment/EnrollmentModule.kt +++ b/app/src/main/java/org/dhis2/usescases/enrollment/EnrollmentModule.kt @@ -8,7 +8,6 @@ import io.reactivex.processors.PublishProcessor import org.dhis2.commons.data.EntryMode import org.dhis2.commons.di.dagger.PerActivity import org.dhis2.commons.matomo.MatomoAnalyticsController -import org.dhis2.commons.network.NetworkUtils import org.dhis2.commons.prefs.PreferenceProvider import org.dhis2.commons.resources.DhisPeriodUtils import org.dhis2.commons.resources.EventResourcesProvider @@ -39,7 +38,7 @@ import org.dhis2.form.ui.provider.LegendValueProviderImpl import org.dhis2.form.ui.provider.UiEventTypesProviderImpl import org.dhis2.mobile.commons.customintents.CustomIntentRepository import org.dhis2.mobile.commons.customintents.CustomIntentRepositoryImpl -import org.dhis2.mobile.commons.providers.FieldErrorMessageProvider +import org.dhis2.mobile.commons.network.NetworkStatusProvider import org.dhis2.mobile.commons.reporting.CrashReportController import org.dhis2.usescases.teiDashboard.TeiAttributesProvider import org.dhis2.utils.analytics.AnalyticsHelper @@ -187,23 +186,22 @@ class EnrollmentModule( d2: D2, enrollmentRepository: EnrollmentObjectRepository, crashReportController: CrashReportController, - networkUtils: NetworkUtils, searchTEIRepository: SearchTEIRepository, resourceManager: ResourceManager, - ): ValueStore { - val fieldErrorMessageProvider = FieldErrorMessageProvider() - return ValueStoreImpl( + networkStatusProvider: NetworkStatusProvider, + dispatcherProvider: DispatcherProvider, + ): ValueStore = + ValueStoreImpl( d2, enrollmentRepository.blockingGet()?.trackedEntityInstance()!!, EntryMode.ATTR, DhisEnrollmentUtils(d2), crashReportController, - networkUtils, searchTEIRepository, - fieldErrorMessageProvider, resourceManager, + networkStatusProvider, + dispatcherProvider, ) - } @Provides @PerActivity diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImpl.java b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImpl.java index f994e09b025..ce0ebbcecbb 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImpl.java +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImpl.java @@ -15,6 +15,7 @@ import org.dhis2.commons.network.NetworkUtils; import org.dhis2.commons.resources.MetadataIconProvider; import org.dhis2.commons.resources.ResourceManager; +import org.dhis2.commons.viewmodel.DispatcherProvider; import org.dhis2.data.dhislogic.DhisEnrollmentUtils; import org.dhis2.data.forms.dataentry.SearchTEIRepository; import org.dhis2.data.forms.dataentry.ValueStore; @@ -26,6 +27,7 @@ import org.dhis2.metadata.usecases.TrackedEntityInstanceConfiguration; import org.dhis2.mobile.commons.customintents.CustomIntentRepository; import org.dhis2.mobile.commons.model.CustomIntentActionTypeModel; +import org.dhis2.mobile.commons.network.NetworkStatusProvider; import org.dhis2.mobile.commons.providers.FieldErrorMessageProvider; import org.dhis2.mobile.commons.reporting.CrashReportController; import org.dhis2.tracker.data.ProfilePictureProvider; @@ -72,6 +74,7 @@ import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItemAttribute; import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItemHelper; import org.jetbrains.annotations.NotNull; +import org.matomo.sdk.dispatcher.Dispatcher; import java.util.ArrayList; import java.util.Collections; @@ -94,13 +97,14 @@ public class SearchRepositoryImpl implements SearchRepository { private final ResourceManager resources; private final D2 d2; private final SearchSortingValueSetter sortingValueSetter; + private final DispatcherProvider dispatcherProvider; private TrackedEntitySearchCollectionRepository trackedEntityInstanceQuery; private FilterPresenter filterPresenter; private String currentProgram; private final Charts charts; private final CrashReportController crashReportController; private DateUtils dateUtils; - private final NetworkUtils networkUtils; + private final NetworkStatusProvider networkStatusProvider; private final SearchTEIRepository searchTEIRepository; private TrackedEntityInstanceDownloader downloadRepository = null; private ThemeManager themeManager; @@ -127,13 +131,14 @@ public class SearchRepositoryImpl implements SearchRepository { SearchSortingValueSetter sortingValueSetter, Charts charts, CrashReportController crashReportController, - NetworkUtils networkUtils, + NetworkStatusProvider networkStatusProvider, SearchTEIRepository searchTEIRepository, ThemeManager themeManager, MetadataIconProvider metadataIconProvider, ProfilePictureProvider profilePictureProvider, DateUtils dateUtils, - CustomIntentRepository customIntentRepository + CustomIntentRepository customIntentRepository, + DispatcherProvider dispatcherProvider ) { this.teiType = teiType; this.d2 = d2; @@ -144,7 +149,7 @@ public class SearchRepositoryImpl implements SearchRepository { this.crashReportController = crashReportController; this.dateUtils = dateUtils; this.currentProgram = initialProgram; - this.networkUtils = networkUtils; + this.networkStatusProvider = networkStatusProvider; this.searchTEIRepository = searchTEIRepository; this.themeManager = themeManager; this.teiDownloader = new TeiDownloader( @@ -156,6 +161,7 @@ public class SearchRepositoryImpl implements SearchRepository { this.metadataIconProvider = metadataIconProvider; this.profilePictureProvider = profilePictureProvider; this.customIntentRepository = customIntentRepository; + this.dispatcherProvider = dispatcherProvider; } @@ -275,10 +281,10 @@ public Observable> saveToEnroll(@NonNull String teiType, EntryMode.ATTR, new DhisEnrollmentUtils(d2), crashReportController, - networkUtils, searchTEIRepository, - new FieldErrorMessageProvider(), - resources + resources, + networkStatusProvider, + dispatcherProvider ); if (queryData.containsKey(Constants.ENROLLMENT_DATE_UID)) diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java index 7289b6ecca1..48630a68fb2 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java @@ -170,12 +170,13 @@ SearchRepository searchRepository(@NonNull D2 d2, SearchSortingValueSetter searchSortingValueSetter, Charts charts, CrashReportController crashReportController, - NetworkUtils networkUtils, + NetworkStatusProvider networkStatusProvider, SearchTEIRepository searchTEIRepository, ThemeManager themeManager, MetadataIconProvider metadataIconProvider, DateUtils dateUtils, - CustomIntentRepository customIntentRepository) { + CustomIntentRepository customIntentRepository, + DispatcherProvider dispatcherProvider) { ProfilePictureProvider profilePictureProvider = new ProfilePictureProvider(d2); return new SearchRepositoryImpl(teiType, initialProgram, @@ -185,13 +186,14 @@ SearchRepository searchRepository(@NonNull D2 d2, searchSortingValueSetter, charts, crashReportController, - networkUtils, + networkStatusProvider, searchTEIRepository, themeManager, metadataIconProvider, profilePictureProvider, dateUtils, - customIntentRepository); + customIntentRepository, + dispatcherProvider); } @Provides diff --git a/app/src/test/java/org/dhis2/data/forms/dataentry/ValueStoreTest.kt b/app/src/test/java/org/dhis2/data/forms/dataentry/ValueStoreTest.kt index 68189846a02..d686b14769a 100644 --- a/app/src/test/java/org/dhis2/data/forms/dataentry/ValueStoreTest.kt +++ b/app/src/test/java/org/dhis2/data/forms/dataentry/ValueStoreTest.kt @@ -1,10 +1,13 @@ package org.dhis2.data.forms.dataentry +import kotlinx.coroutines.Dispatchers import org.dhis2.commons.data.EntryMode import org.dhis2.commons.network.NetworkUtils import org.dhis2.commons.resources.ResourceManager +import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.dhislogic.DhisEnrollmentUtils import org.dhis2.form.model.ValueStoreResult +import org.dhis2.mobile.commons.network.NetworkStatusProvider import org.dhis2.mobile.commons.providers.FieldErrorMessageProvider import org.dhis2.mobile.commons.reporting.CrashReportController import org.hisp.dhis.android.core.D2 @@ -28,11 +31,14 @@ class ValueStoreTest { private lateinit var dvValueStore: ValueStore private val d2: D2 = Mockito.mock(D2::class.java, Mockito.RETURNS_DEEP_STUBS) private val dhisEnrollmentUtils: DhisEnrollmentUtils = DhisEnrollmentUtils(d2) - private val fieldErrorMessageProvider: FieldErrorMessageProvider = mock() private val crashReportController: CrashReportController = mock() - private val networkUtils: NetworkUtils = mock() + private val networkStatusProvider: NetworkStatusProvider = mock() private val searchTEIRepository: SearchTEIRepository = mock() private val resourceManager: ResourceManager = mock() + private val dispatchers: DispatcherProvider = + mock { + on { io() } doReturn Dispatchers.IO + } @Before fun setUp() { @@ -43,10 +49,10 @@ class ValueStoreTest { EntryMode.ATTR, dhisEnrollmentUtils, crashReportController, - networkUtils, searchTEIRepository, - fieldErrorMessageProvider, resourceManager, + networkStatusProvider, + dispatchers, ) deValueStore = ValueStoreImpl( @@ -55,10 +61,10 @@ class ValueStoreTest { EntryMode.DE, dhisEnrollmentUtils, crashReportController, - networkUtils, searchTEIRepository, - fieldErrorMessageProvider, resourceManager, + networkStatusProvider, + dispatchers, ) dvValueStore = ValueStoreImpl( @@ -67,10 +73,10 @@ class ValueStoreTest { EntryMode.DV, dhisEnrollmentUtils, crashReportController, - networkUtils, searchTEIRepository, - fieldErrorMessageProvider, resourceManager, + networkStatusProvider, + dispatchers, ) } diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryTest.kt index e67ade57eed..ff3113ab982 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryTest.kt @@ -16,6 +16,7 @@ import org.dhis2.form.model.FieldUiModel import org.dhis2.form.model.FieldUiModelImpl import org.dhis2.form.model.UiRenderType import org.dhis2.mobile.commons.customintents.CustomIntentRepository +import org.dhis2.mobile.commons.network.NetworkStatusProvider import org.dhis2.mobile.commons.reporting.CrashReportController import org.dhis2.tracker.data.ProfilePictureProvider import org.dhis2.ui.ThemeManager @@ -95,7 +96,7 @@ class SearchRepositoryTest { private val sortingValueSetter: SearchSortingValueSetter = mock() private val charts: Charts = mock() private val crashReporterController: CrashReportController = mock() - private val networkUtils: NetworkUtils = mock() + private val networkUtils: NetworkStatusProvider = mock() private val searchTEIRepository: SearchTEIRepository = mock() private val themeManager: ThemeManager = mock() private val profilePictureProvider: ProfilePictureProvider = mock() @@ -147,6 +148,7 @@ class SearchRepositoryTest { profilePictureProvider, dateUtils, customIntentRepository, + dispatchers ) } From 36d86fb75edaa98b4b9888e3208983f11b60307e Mon Sep 17 00:00:00 2001 From: Pablo Date: Fri, 13 Mar 2026 12:41:49 +0100 Subject: [PATCH 097/260] fix: [ANDROAPP-7530] Sync config status not updating occasionally (#4722) * fix: [ANDROAPP-7530] Sync config status not updating occasionally * added test * fix rebase --- .../usescases/settings/domain/LaunchSync.kt | 44 ++++------- .../settings/domain/LaunchSyncTest.kt | 73 ++++++++++++++++++- 2 files changed, 85 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/org/dhis2/usescases/settings/domain/LaunchSync.kt b/app/src/main/java/org/dhis2/usescases/settings/domain/LaunchSync.kt index cf92469b58e..20d213fb8c1 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/domain/LaunchSync.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/domain/LaunchSync.kt @@ -3,7 +3,7 @@ package org.dhis2.usescases.settings.domain import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge -import kotlinx.coroutines.flow.update +import kotlinx.coroutines.flow.updateAndGet import org.dhis2.commons.Constants import org.dhis2.commons.matomo.Actions import org.dhis2.commons.matomo.Categories @@ -11,6 +11,7 @@ import org.dhis2.commons.prefs.PreferenceProvider import org.dhis2.mobile.commons.providers.TIME_DATA import org.dhis2.mobile.commons.providers.TIME_META import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.model.SyncJobStatus import org.dhis2.utils.analytics.AnalyticsHelper import org.dhis2.utils.analytics.CLICK import org.dhis2.utils.analytics.SYNC_DATA_NOW @@ -34,36 +35,16 @@ class LaunchSync( syncBackgroundJobAction .observeMetadataJob() .map { workStatuses -> - var workState = workStatuses.firstOrNull()?.status - when (workState) { - Status.Enqueue, - Status.Running, - Status.Blocked, - -> syncStatus.update { it.copy(metadataSyncProgress = SyncStatus.InProgress) } - - Status.Cancelled -> syncStatus.update { it.copy(metadataSyncProgress = SyncStatus.Cancelled) } - null -> syncStatus.update { it.copy(dataSyncProgress = SyncStatus.None) } - else -> syncStatus.update { it.copy(metadataSyncProgress = SyncStatus.Finished) } - } - syncStatus.value + val currentSyncStatus = combinedStatus(workStatuses) + syncStatus.updateAndGet { it.copy(metadataSyncProgress = currentSyncStatus) } } private val dataWorkInfo = syncBackgroundJobAction .observeDataJob() .map { workStatuses -> - var workState = workStatuses.firstOrNull()?.status - when (workState) { - Status.Enqueue, - Status.Running, - Status.Blocked, - -> syncStatus.update { it.copy(dataSyncProgress = SyncStatus.InProgress) } - - Status.Cancelled -> syncStatus.update { it.copy(dataSyncProgress = SyncStatus.Cancelled) } - null -> syncStatus.update { it.copy(dataSyncProgress = SyncStatus.None) } - else -> syncStatus.update { it.copy(dataSyncProgress = SyncStatus.Finished) } - } - syncStatus.value + val currentSyncStatus = combinedStatus(workStatuses) + syncStatus.updateAndGet { it.copy(dataSyncProgress = currentSyncStatus) } } val syncWorkInfo = merge(metadataWorkInfo, dataWorkInfo) @@ -100,9 +81,9 @@ class LaunchSync( metadataWasRunning: Boolean, dataWasRunning: Boolean, ) = metadataSyncProgress == SyncStatus.Finished && - metadataWasRunning || - dataSyncProgress == SyncStatus.Finished && - dataWasRunning + metadataWasRunning || + dataSyncProgress == SyncStatus.Finished && + dataWasRunning } suspend operator fun invoke(syncAction: SyncAction) { @@ -153,4 +134,11 @@ class LaunchSync( preferenceProvider.setValue(TIME_DATA, seconds) syncBackgroundJobAction.launchDataSync(seconds.toLong()) } + + private fun combinedStatus(workStatuses: List) = when { + workStatuses.any { (it.status is Status.Running) or (it.status is Status.Blocked) } -> SyncStatus.InProgress + workStatuses.all { it.status is Status.Enqueue } -> SyncStatus.None + workStatuses.all { it.status is Status.Cancelled } -> SyncStatus.Cancelled + else -> SyncStatus.Finished + } } diff --git a/app/src/test/java/org/dhis2/usescases/settings/domain/LaunchSyncTest.kt b/app/src/test/java/org/dhis2/usescases/settings/domain/LaunchSyncTest.kt index 1a8b4951a7d..36d38577a53 100644 --- a/app/src/test/java/org/dhis2/usescases/settings/domain/LaunchSyncTest.kt +++ b/app/src/test/java/org/dhis2/usescases/settings/domain/LaunchSyncTest.kt @@ -132,7 +132,11 @@ class LaunchSyncTest { awaitItem() awaitItem() mockedMetadataWorkInfo.emit(listOf(startedMetadataWorkInfo)) - assertState(awaitItem(), LaunchSync.SyncStatus.InProgress, LaunchSync.SyncStatus.None) + assertState( + awaitItem(), + LaunchSync.SyncStatus.InProgress, + LaunchSync.SyncStatus.None + ) mockedDataWorkInfo.emit(listOf(startedDataWorkInfo)) with(awaitItem()) { assertState( @@ -140,7 +144,12 @@ class LaunchSyncTest { LaunchSync.SyncStatus.InProgress, LaunchSync.SyncStatus.InProgress, ) - assertFalse(this.hasSyncFinished(metadataWasRunning = true, dataWasRunning = false)) + assertFalse( + this.hasSyncFinished( + metadataWasRunning = true, + dataWasRunning = false + ) + ) } mockedMetadataWorkInfo.emit(listOf(finishedMetadataWorkInfo)) @@ -150,14 +159,70 @@ class LaunchSyncTest { LaunchSync.SyncStatus.Finished, LaunchSync.SyncStatus.InProgress, ) - assertTrue(this.hasSyncFinished(metadataWasRunning = true, dataWasRunning = true)) + assertTrue( + this.hasSyncFinished( + metadataWasRunning = true, + dataWasRunning = true + ) + ) } mockedDataWorkInfo.emit(listOf(finishedDataWorkInfo)) - assertState(awaitItem(), LaunchSync.SyncStatus.Finished, LaunchSync.SyncStatus.Finished) + assertState( + awaitItem(), + LaunchSync.SyncStatus.Finished, + LaunchSync.SyncStatus.Finished + ) cancelAndIgnoreRemainingEvents() } } + @Test + fun shouldCombineMetadataProgress() = + runTest { + launchSync.syncWorkInfo.test { + awaitItem() + awaitItem() + syncStatuses.forEach { metadataSyncStatus -> + syncStatuses.forEach { metadataNowSyncStatus -> + mockedMetadataWorkInfo.emit( + listOf( + metadataSyncStatus, + metadataNowSyncStatus + ) + ) + val expectedValue = when { + (metadataSyncStatus.status is SyncStatus.Running) or (metadataNowSyncStatus.status is SyncStatus.Running) -> LaunchSync.SyncStatus.InProgress + (metadataSyncStatus.status is SyncStatus.Blocked) or (metadataNowSyncStatus.status is SyncStatus.Blocked) -> LaunchSync.SyncStatus.InProgress + (metadataSyncStatus.status is SyncStatus.Enqueue) and (metadataNowSyncStatus.status is SyncStatus.Enqueue) -> LaunchSync.SyncStatus.None + (metadataSyncStatus.status is SyncStatus.Cancelled) and (metadataNowSyncStatus.status is SyncStatus.Cancelled) -> LaunchSync.SyncStatus.Cancelled + else -> LaunchSync.SyncStatus.Finished + + + } + + assertState( + awaitItem(), + expectedValue, + LaunchSync.SyncStatus.None + ) + } + } + } + } + + private val syncStatuses = listOf( + mockedMetadataSyncJobStatus(SyncStatus.Enqueue), + mockedMetadataSyncJobStatus(SyncStatus.Running), + mockedMetadataSyncJobStatus(SyncStatus.Succeed), + mockedMetadataSyncJobStatus(SyncStatus.Failed), + mockedMetadataSyncJobStatus(SyncStatus.Blocked), + mockedMetadataSyncJobStatus(SyncStatus.Cancelled), + ) + + private fun mockedMetadataSyncJobStatus(mockedStatus: SyncStatus) = mock { + on { status } doReturn mockedStatus + } + private fun assertState( syncStatusProgress: LaunchSync.SyncStatusProgress, metadataSyncProgress: LaunchSync.SyncStatus, From 83d3dbb7e3c8d69fd0da54ae1202cfc38b05e509 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manu=20Mu=C3=B1oz?= Date: Fri, 13 Mar 2026 13:58:17 +0100 Subject: [PATCH 098/260] fix: [ANDROAPP-7496] hide enrolled orgunit (#4726) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Manu Muñoz --- .../usescases/searchTrackEntity/ui/mapper/TEICardMapper.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapper.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapper.kt index 0ff1b4721e9..794ba07e04d 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapper.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapper.kt @@ -148,7 +148,7 @@ class TEICardMapper( ownerOrgUnit = searchTEIModel.ownerOrgUnit, ) } - if (searchTEIModel.displayOrgUnit) { + if (searchTEIModel.displayOrgUnit && searchTEIModel.enrolledOrgUnit != null) { checkEnrolledIn( list = list, enrolledOrgUnit = searchTEIModel.enrolledOrgUnit, From e229decccfc23796c5f4f8823e09adb6cc9c818e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Mon, 16 Mar 2026 13:32:26 +0100 Subject: [PATCH 099/260] ANDROAPP-7448 Replace Pin layout [skip size] (#4712) * feat: Modify PinBottomSheet file to use fullScreenDialog component * feat: Remove old PinView.kt and replace it by PinBottomSheet * test: remove pin test * refactor: update ViewCompositionStrategy in PinBottomSheetLauncher (#4707) * fix: manage PIN bottom sheet lifecycle in MainActivity * feat: refactor PinBottomSheet to support previews and improve landscape layout * refactor: rename PinBottomSheet to PinDialog and reorganize PIN models * refactor: update PIN UI state management and resource handling * feat: add key icon to PIN dialog primary button when in SET mode * refactor: simplify PinDialog by passing uiState to PinInputBlock and renaming components * fix: Set contentDescription to null for Pin Icon in PinDialog.kt * fix: enable vertical scrolling and update layout constraints in PinDialog * refactor: update PinDialog layout to use a Row with side-by-side scrollable columns --------- Co-authored-by: Xavier Molloy --- app/build.gradle.kts | 1 - .../org/dhis2/usescases/UseCaseTestsSuite.kt | 2 - .../org/dhis2/usescases/main/MainRobot.kt | 4 - .../java/org/dhis2/usescases/pin/PinRobot.kt | 40 -- .../java/org/dhis2/usescases/pin/PinTest.kt | 35 -- app/src/main/java/org/dhis2/App.java | 14 - .../org/dhis2/data/user/UserComponent.java | 5 - .../general/SessionManagerActivity.kt | 63 +-- .../org/dhis2/usescases/main/MainActivity.kt | 33 +- .../java/org/dhis2/utils/session/PinDialog.kt | 142 ----- .../org/dhis2/utils/session/PinExtensions.kt | 23 - .../java/org/dhis2/utils/session/PinModule.kt | 42 -- .../org/dhis2/utils/session/PinPresenter.kt | 58 -- .../java/org/dhis2/utils/session/PinView.kt | 7 - .../dhis2/utils/session/SessionComponent.kt | 33 -- app/src/main/res/layout-land/layout_pin.xml | 89 --- app/src/main/res/layout/activity_main.xml | 5 - app/src/main/res/layout/dialog_pin.xml | 87 --- app/src/main/res/layout/layout_pin.xml | 101 ---- .../dhis2/utils/session/PinPresenterTest.kt | 165 ------ gradle.properties | 1 - gradle/libs.versions.toml | 2 - gradle/verification-metadata.xml | 59 +- login/build.gradle.kts | 2 +- .../login/pin/PinBottomSheetLauncher.kt | 45 ++ .../login/main/ui/screen/CredentialsScreen.kt | 6 +- .../dhis2/mobile/login/pin/di/PinModule.kt | 11 +- .../mobile/login/pin/domain/model/PinMode.kt | 16 + .../mobile/login/pin/domain/model/PinState.kt | 41 -- .../login/pin/ui/components/PinBottomSheet.kt | 363 ------------- .../login/pin/ui/components/PinDialog.kt | 511 ++++++++++++++++++ .../pin/ui/provider/PinResourceProvider.kt | 94 +++- .../mobile/login/pin/ui/state/PinUiState.kt | 31 ++ .../login/pin/ui/viewmodel/PinViewModel.kt | 124 +++-- .../pin/ui/viewmodel/PinViewModelTest.kt | 247 ++++----- 35 files changed, 965 insertions(+), 1537 deletions(-) delete mode 100644 app/src/androidTest/java/org/dhis2/usescases/pin/PinRobot.kt delete mode 100644 app/src/androidTest/java/org/dhis2/usescases/pin/PinTest.kt delete mode 100644 app/src/main/java/org/dhis2/utils/session/PinDialog.kt delete mode 100644 app/src/main/java/org/dhis2/utils/session/PinExtensions.kt delete mode 100644 app/src/main/java/org/dhis2/utils/session/PinModule.kt delete mode 100644 app/src/main/java/org/dhis2/utils/session/PinPresenter.kt delete mode 100644 app/src/main/java/org/dhis2/utils/session/PinView.kt delete mode 100644 app/src/main/java/org/dhis2/utils/session/SessionComponent.kt delete mode 100644 app/src/main/res/layout-land/layout_pin.xml delete mode 100644 app/src/main/res/layout/dialog_pin.xml delete mode 100644 app/src/main/res/layout/layout_pin.xml delete mode 100644 app/src/test/java/org/dhis2/utils/session/PinPresenterTest.kt create mode 100644 login/src/androidMain/kotlin/org/dhis2/mobile/login/pin/PinBottomSheetLauncher.kt create mode 100644 login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/domain/model/PinMode.kt delete mode 100644 login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/domain/model/PinState.kt delete mode 100644 login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/components/PinBottomSheet.kt create mode 100644 login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/components/PinDialog.kt create mode 100644 login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/state/PinUiState.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 7b2c4bc3e44..2c6219b2902 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -306,7 +306,6 @@ dependencies { implementation(libs.androidx.biometric) implementation(libs.androidx.material3) implementation(libs.google.guava) - implementation(libs.github.pinlock) implementation(libs.github.fancyshowcase) implementation(libs.lottie) implementation(libs.network.okhttp) diff --git a/app/src/androidTest/java/org/dhis2/usescases/UseCaseTestsSuite.kt b/app/src/androidTest/java/org/dhis2/usescases/UseCaseTestsSuite.kt index 84e2ac1e94f..fa9ddbf28ff 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/UseCaseTestsSuite.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/UseCaseTestsSuite.kt @@ -6,7 +6,6 @@ import org.dhis2.usescases.event.EventTest import org.dhis2.usescases.eventsWithoutRegistration.eventDetails.EventInitialTest import org.dhis2.usescases.login.LoginTest import org.dhis2.usescases.main.MainTest -import org.dhis2.usescases.pin.PinTest import org.dhis2.usescases.programevent.ProgramEventTest import org.dhis2.usescases.searchte.SearchTETest import org.dhis2.usescases.settings.SettingsTest @@ -23,7 +22,6 @@ import org.junit.runners.Suite EventInitialTest::class, EventTest::class, MainTest::class, - PinTest::class, ProgramEventTest::class, SearchTETest::class, SettingsTest::class, diff --git a/app/src/androidTest/java/org/dhis2/usescases/main/MainRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/main/MainRobot.kt index 3ab5103fef8..daa49524a31 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/main/MainRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/main/MainRobot.kt @@ -37,10 +37,6 @@ class MainRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { waitToDebounce(FRAGMENT_TRANSITION) } - fun clickOnPin() = apply { - onView(withId(R.id.nav_view)).perform(NavigationViewActions.navigateTo(R.id.block_button)) - } - fun clickAbout() = apply { onView(withId(R.id.nav_view)).perform(NavigationViewActions.navigateTo(R.id.menu_about)) waitToDebounce(FRAGMENT_TRANSITION) diff --git a/app/src/androidTest/java/org/dhis2/usescases/pin/PinRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/pin/PinRobot.kt deleted file mode 100644 index a77476e6560..00000000000 --- a/app/src/androidTest/java/org/dhis2/usescases/pin/PinRobot.kt +++ /dev/null @@ -1,40 +0,0 @@ -package org.dhis2.usescases.pin - -import androidx.test.espresso.Espresso.onView -import androidx.test.espresso.action.ViewActions.click -import androidx.test.espresso.assertion.ViewAssertions.matches -import androidx.test.espresso.intent.Intents -import androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent -import androidx.test.espresso.matcher.ViewMatchers.isDisplayed -import androidx.test.espresso.matcher.ViewMatchers.withId -import androidx.test.espresso.matcher.ViewMatchers.withText -import org.dhis2.R -import org.dhis2.common.BaseRobot -import org.dhis2.common.matchers.isToast -import org.dhis2.usescases.main.MainActivity -import org.hamcrest.CoreMatchers.allOf - -fun pinRobot(pinBody: PinRobot.() -> Unit) { - PinRobot().apply { - pinBody() - } -} - -class PinRobot : BaseRobot() { - - fun clickForgotCode() { - onView(withId(R.id.forgotCode)).perform(click()) - } - - fun clickPinButton(button: String) { - onView(withText(button)).perform(click()) - } - - fun checkRedirectToHome() { - Intents.intended(allOf(hasComponent(MainActivity::class.java.name))) - } - - fun checkToastDisplayed(toastText: String) { - onView(withText(toastText)).inRoot(isToast()).check(matches(isDisplayed())) - } -} diff --git a/app/src/androidTest/java/org/dhis2/usescases/pin/PinTest.kt b/app/src/androidTest/java/org/dhis2/usescases/pin/PinTest.kt deleted file mode 100644 index d05622e8d83..00000000000 --- a/app/src/androidTest/java/org/dhis2/usescases/pin/PinTest.kt +++ /dev/null @@ -1,35 +0,0 @@ -package org.dhis2.usescases.pin - -import androidx.compose.ui.test.junit4.createComposeRule -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.rule.ActivityTestRule -import org.dhis2.usescases.BaseTest -import org.dhis2.usescases.main.MainActivity -import org.dhis2.usescases.main.homeRobot -import org.junit.Rule -import org.junit.Test -import org.junit.runner.RunWith - -@RunWith(AndroidJUnit4::class) -class PinTest : BaseTest() { - - @get:Rule - val rule = ActivityTestRule(MainActivity::class.java, false, false) - - @get:Rule - val composeTestRule = createComposeRule() - - @Test - fun openPin() { - startActivity() - - homeRobot(composeTestRule) { - clickOnNavigationDrawerMenu() - clickOnPin() - } - } - - private fun startActivity() { - rule.launchActivity(null) - } -} diff --git a/app/src/main/java/org/dhis2/App.java b/app/src/main/java/org/dhis2/App.java index 74aa75c7115..d1fc1043f4e 100644 --- a/app/src/main/java/org/dhis2/App.java +++ b/app/src/main/java/org/dhis2/App.java @@ -45,8 +45,6 @@ import org.dhis2.usescases.teiDashboard.TeiDashboardModule; import org.dhis2.utils.analytics.AnalyticsModule; import org.dhis2.utils.granularsync.SyncStatusDialogProvider; -import org.dhis2.utils.session.PinModule; -import org.dhis2.utils.session.SessionComponent; import org.dhis2.utils.timber.DebugTree; import org.hisp.dhis.android.core.D2Manager; import org.hisp.dhis.android.core.datastore.KeyValuePair; @@ -87,9 +85,6 @@ public class App extends android.app.Application implements Components, Lifecycl @PerActivity private TeiDashboardComponent dashboardComponent; - @Nullable - private SessionComponent sessionComponent; - private boolean fromBackGround = false; private boolean recreated; @@ -274,15 +269,6 @@ public void releaseDashboardComponent() { } } - @NotNull - public SessionComponent createSessionComponent(PinModule pinModule) { - return (sessionComponent = userComponent.plus(pinModule)); - } - - public void releaseSessionComponent() { - sessionComponent = null; - } - @OnLifecycleEvent(Lifecycle.Event.ON_STOP) public void onAppBackgrounded() { Timber.tag("BG").d("App in background"); diff --git a/app/src/main/java/org/dhis2/data/user/UserComponent.java b/app/src/main/java/org/dhis2/data/user/UserComponent.java index 945eda6e50d..821e61f4cd7 100644 --- a/app/src/main/java/org/dhis2/data/user/UserComponent.java +++ b/app/src/main/java/org/dhis2/data/user/UserComponent.java @@ -64,8 +64,6 @@ import org.dhis2.usescases.teiDashboard.dialogs.scheduling.SchedulingModule; import org.dhis2.usescases.teiDashboard.teiProgramList.TeiProgramListComponent; import org.dhis2.usescases.teiDashboard.teiProgramList.TeiProgramListModule; -import org.dhis2.utils.session.PinModule; -import org.dhis2.utils.session.SessionComponent; import dagger.Subcomponent; import dhis2.org.analytics.charts.ui.di.AnalyticsFragmentComponent; @@ -170,9 +168,6 @@ public interface UserComponent { @NonNull EventDetailsComponent plus(EventDetailsModule eventDetailsModule); - @NonNull - SessionComponent plus(PinModule pinModule); - @NonNull SchedulingComponent plus(SchedulingModule schedulingModule); } diff --git a/app/src/main/java/org/dhis2/usescases/general/SessionManagerActivity.kt b/app/src/main/java/org/dhis2/usescases/general/SessionManagerActivity.kt index 6e4af775015..a8bd1f4a477 100644 --- a/app/src/main/java/org/dhis2/usescases/general/SessionManagerActivity.kt +++ b/app/src/main/java/org/dhis2/usescases/general/SessionManagerActivity.kt @@ -28,8 +28,8 @@ import org.dhis2.usescases.splash.SplashActivity import org.dhis2.utils.analytics.AnalyticsHelper import org.dhis2.utils.analytics.CLICK import org.dhis2.utils.analytics.FORGOT_CODE -import org.dhis2.utils.session.PIN_DIALOG_TAG -import org.dhis2.utils.session.PinDialog +import org.dhis2.mobile.login.pin.addPinBottomSheet +import org.dhis2.mobile.login.pin.domain.model.PinMode import org.koin.android.ext.android.inject import javax.inject.Inject @@ -50,7 +50,7 @@ abstract class SessionManagerActivity : @Inject lateinit var analyticsHelper: AnalyticsHelper - private var pinDialog: PinDialog? = null + private var pinComposeView: androidx.compose.ui.platform.ComposeView? = null private var lifeCycleObservable: BehaviorSubject = BehaviorSubject.create() @@ -135,23 +135,27 @@ abstract class SessionManagerActivity : this.activityResultObserver = activityResultObserver } - private fun initPinDialog() { - pinDialog = - PinDialog( - PinDialog.Mode.ASK, - (this is LoginActivity), - { - startActivity(MainActivity::class.java, null, true, true, null) - null - }, - { - analyticsHelper.setEvent(FORGOT_CODE, CLICK, FORGOT_CODE) - if (this !is LoginActivity) { - startActivity(LoginActivity::class.java, null, true, true, null) - } - null - }, - ) + private fun showPinBottomSheet() { + if (pinComposeView != null) return + pinComposeView = addPinBottomSheet( + mode = PinMode.ASK, + onSuccess = { + startActivity(MainActivity::class.java, null, true, true, null) + }, + onDismiss = { + analyticsHelper.setEvent(FORGOT_CODE, CLICK, FORGOT_CODE) + if (this !is LoginActivity) { + startActivity(LoginActivity::class.java, null, true, true, null) + } + }, + ) + } + + private fun removePinBottomSheet() { + pinComposeView?.let { view -> + (window?.decorView as? android.view.ViewGroup)?.removeView(view) + } + pinComposeView = null } override fun unsubscribe() { @@ -184,10 +188,6 @@ abstract class SessionManagerActivity : if (finishCurrent) finish() } - private fun showPinDialog() { - pinDialog!!.show(supportFragmentManager, PIN_DIALOG_TAG) - } - @Deprecated("Deprecated in Java") override fun onActivityResult( requestCode: Int, @@ -219,8 +219,7 @@ abstract class SessionManagerActivity : override fun onStop() { super.onStop() - val dialog = pinDialog - dialog?.dismissAllowingStateLoss() + removePinBottomSheet() } override fun onDestroy() { @@ -244,11 +243,8 @@ abstract class SessionManagerActivity : comesFromImageSource = false } else { if (this.app().isSessionBlocked && this !is SplashActivity && this !is LoginActivity) { - if (pinDialog == null) { - initPinDialog() - showPinDialog() - } else if (pinDialog?.isVisible == false) { - showPinDialog() + if (pinComposeView == null) { + showPinBottomSheet() } } else { if (this !is LoginActivity && this !is SplashActivity) { @@ -260,9 +256,8 @@ abstract class SessionManagerActivity : private fun sessionAction(accountsCount: Int) { if (this.app().isSessionBlocked && this !is SplashActivity) { - if (pinDialog == null) { - initPinDialog() - showPinDialog() + if (pinComposeView == null) { + showPinBottomSheet() } } else { navigateToLogin(accountsCount) diff --git a/app/src/main/java/org/dhis2/usescases/main/MainActivity.kt b/app/src/main/java/org/dhis2/usescases/main/MainActivity.kt index 69801d886e7..a457e2570ab 100644 --- a/app/src/main/java/org/dhis2/usescases/main/MainActivity.kt +++ b/app/src/main/java/org/dhis2/usescases/main/MainActivity.kt @@ -21,6 +21,7 @@ import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.remember +import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ViewCompositionStrategy import androidx.constraintlayout.widget.ConstraintSet import androidx.core.app.NotificationCompat @@ -58,8 +59,8 @@ import org.dhis2.utils.customviews.navigationbar.NavigationPage import org.dhis2.utils.customviews.navigationbar.NavigationPageConfigurator import org.dhis2.utils.extension.navigateTo import org.dhis2.utils.granularsync.SyncStatusDialog -import org.dhis2.utils.session.PIN_DIALOG_TAG -import org.dhis2.utils.session.PinDialog +import org.dhis2.mobile.login.pin.addPinBottomSheet +import org.dhis2.mobile.login.pin.domain.model.PinMode import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBar import org.koin.android.ext.android.inject import java.io.File @@ -97,6 +98,7 @@ class MainActivity : } private var backDropActive = false + private var pinComposeView: ComposeView? = null private val requestWritePermissions = registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted -> @@ -114,8 +116,6 @@ class MainActivity : } } - private var isPinLayoutVisible = false - private lateinit var mainNavigator: MainNavigator private val navigationLauncher = @@ -265,6 +265,7 @@ class MainActivity : override fun onPause() { presenter.onDetach() + removePinBottomSheet() super.onPause() } @@ -514,23 +515,31 @@ class MainActivity : override fun onLockClick() { if (!presenter.isPinStored()) { + if (pinComposeView != null) return binding.mainDrawerLayout.closeDrawers() - PinDialog( - PinDialog.Mode.SET, - true, - { presenter.blockSession() }, - {}, - ).show(supportFragmentManager, PIN_DIALOG_TAG) - isPinLayoutVisible = true + pinComposeView = addPinBottomSheet( + mode = PinMode.SET, + onSuccess = { + removePinBottomSheet() + presenter.blockSession() + }, + onDismiss = { removePinBottomSheet() }, + ) } else { presenter.blockSession() } } + private fun removePinBottomSheet() { + pinComposeView?.let { view -> + (window?.decorView as? android.view.ViewGroup)?.removeView(view) + } + pinComposeView = null + } + private fun backPressed() { when { !mainNavigator.isHome() -> presenter.onNavigateBackToHome() - isPinLayoutVisible -> isPinLayoutVisible = false else -> back() } } diff --git a/app/src/main/java/org/dhis2/utils/session/PinDialog.kt b/app/src/main/java/org/dhis2/utils/session/PinDialog.kt deleted file mode 100644 index caa274c6db8..00000000000 --- a/app/src/main/java/org/dhis2/utils/session/PinDialog.kt +++ /dev/null @@ -1,142 +0,0 @@ -package org.dhis2.utils.session - -import android.app.Dialog -import android.os.Bundle -import android.os.Handler -import android.os.Process -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.view.Window -import android.widget.Toast -import androidx.fragment.app.DialogFragment -import androidx.fragment.app.FragmentManager -import org.dhis2.R -import org.dhis2.bindings.app -import org.dhis2.databinding.DialogPinBinding -import javax.inject.Inject - -const val PIN_DIALOG_TAG: String = "PINDIALOG" - -class PinDialog( - val mode: Mode, - private val canBeClosed: Boolean, - private val unlockCallback: () -> Unit, - private val forgotPinCallback: () -> Unit, -) : DialogFragment(), - PinView { - private lateinit var binding: DialogPinBinding - - @Inject - lateinit var presenter: PinPresenter - - enum class Mode { - SET, - ASK, - } - - private var pinAttempts = 0 - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setStyle(STYLE_NO_TITLE, android.R.style.Theme_DeviceDefault_Light_NoActionBar) - app().createSessionComponent(PinModule(this)).inject(this) - } - - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val dialog = super.onCreateDialog(savedInstanceState) - dialog.window!!.apply { - requestFeature(Window.FEATURE_NO_TITLE) - setBackgroundDrawableResource(android.R.color.transparent) - setWindowAnimations(R.style.pin_dialog_animation) - isCancelable = false - } - return dialog - } - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle?, - ): View? { - binding = DialogPinBinding.inflate(layoutInflater, container, false) - binding.closeButton.apply { - visibility = if (canBeClosed) View.VISIBLE else View.GONE - setOnClickListener { closeDialog() } - } - - when (mode) { - Mode.ASK -> { - binding.title.text = getString(R.string.unblock_session) - binding.forgotCode.apply { - visibility = View.VISIBLE - setOnClickListener { recoverPin() } - } - } - Mode.SET -> { - binding.title.text = getString(R.string.set_pin) - binding.forgotCode.visibility = View.GONE - } - } - - binding.pinLockView.attachIndicatorDots(binding.indicatorDots) - binding.pinLockView.onPinSet { - when (mode) { - Mode.SET -> { - presenter.savePin(it) - blockSession() - } - Mode.ASK -> - presenter.unlockSession( - it, - attempts = pinAttempts, - onPinCorrect = unlockCallback, - onError = { - pinAttempts += 1 - Toast - .makeText( - context, - getString(R.string.wrong_pin), - Toast.LENGTH_LONG, - ).show() - binding.pinLockView.resetPinLockView() - }, - onTwoManyAttempts = { recoverPin() }, - ) - } - } - - return binding.root - } - - private fun blockSession() { - Handler().postDelayed( - { Process.killProcess(Process.myPid()) }, - 1500, - ) - } - - override fun closeDialog() { - dismissAllowingStateLoss() - } - - override fun dismiss() { - app().releaseSessionComponent() - dismissAllowingStateLoss() - } - - override fun recoverPin() { - presenter.logOut() - forgotPinCallback.invoke() - dismissAllowingStateLoss() - } - - override fun show( - manager: FragmentManager, - tag: String?, - ) { - if (manager.findFragmentByTag(tag) == null) { - manager.beginTransaction().add(this, tag).commitAllowingStateLoss() - } - } -} diff --git a/app/src/main/java/org/dhis2/utils/session/PinExtensions.kt b/app/src/main/java/org/dhis2/utils/session/PinExtensions.kt deleted file mode 100644 index 68c0f5319f3..00000000000 --- a/app/src/main/java/org/dhis2/utils/session/PinExtensions.kt +++ /dev/null @@ -1,23 +0,0 @@ -package org.dhis2.utils.session - -import com.andrognito.pinlockview.PinLockListener -import com.andrognito.pinlockview.PinLockView - -inline fun PinLockView.onPinSet(crossinline continuation: (String) -> Unit) { - setPinLockListener( - object : PinLockListener { - override fun onEmpty() { - } - - override fun onComplete(pin: String) { - continuation(pin) - } - - override fun onPinChange( - pinLength: Int, - intermediatePin: String?, - ) { - } - }, - ) -} diff --git a/app/src/main/java/org/dhis2/utils/session/PinModule.kt b/app/src/main/java/org/dhis2/utils/session/PinModule.kt deleted file mode 100644 index b09629983b3..00000000000 --- a/app/src/main/java/org/dhis2/utils/session/PinModule.kt +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2004 - 2019, University of Oslo - * All rights reserved. - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * Neither the name of the HISP project nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package org.dhis2.utils.session - -import dagger.Module -import dagger.Provides -import org.dhis2.commons.prefs.PreferenceProvider -import org.hisp.dhis.android.core.D2 - -@Module -class PinModule( - val view: PinView, -) { - @Provides - fun providesPresenter( - d2: D2, - preferenceProvider: PreferenceProvider, - ): PinPresenter = PinPresenter(view, preferenceProvider, d2) -} diff --git a/app/src/main/java/org/dhis2/utils/session/PinPresenter.kt b/app/src/main/java/org/dhis2/utils/session/PinPresenter.kt deleted file mode 100644 index ddbd8e97112..00000000000 --- a/app/src/main/java/org/dhis2/utils/session/PinPresenter.kt +++ /dev/null @@ -1,58 +0,0 @@ -package org.dhis2.utils.session - -import org.dhis2.commons.prefs.Preference -import org.dhis2.commons.prefs.PreferenceProvider -import org.hisp.dhis.android.core.D2 -import timber.log.Timber - -class PinPresenter( - val view: PinView, - val preferenceProvider: PreferenceProvider, - val d2: D2, -) { - fun unlockSession( - pin: String, - attempts: Int, - onPinCorrect: () -> Unit, - onError: () -> Unit, - onTwoManyAttempts: () -> Unit, - ) { - val pinStored = - d2 - .dataStoreModule() - .localDataStore() - .value(Preference.PIN) - .blockingGet() - ?.value() - when { - pinStored == pin -> { - onPinCorrect() - } - attempts < 2 -> onError() - else -> onTwoManyAttempts() - } - } - - fun savePin(pin: String) { - d2 - .dataStoreModule() - .localDataStore() - .value(Preference.PIN) - .blockingSet(pin) - preferenceProvider.setValue(Preference.SESSION_LOCKED, true) - } - - fun logOut() { - try { - d2 - .dataStoreModule() - .localDataStore() - .value(Preference.PIN) - .blockingDelete() - d2.userModule().blockingLogOut() - preferenceProvider.setValue(Preference.SESSION_LOCKED, false) - } catch (e: Exception) { - Timber.e(e) - } - } -} diff --git a/app/src/main/java/org/dhis2/utils/session/PinView.kt b/app/src/main/java/org/dhis2/utils/session/PinView.kt deleted file mode 100644 index 1f5df61eb7d..00000000000 --- a/app/src/main/java/org/dhis2/utils/session/PinView.kt +++ /dev/null @@ -1,7 +0,0 @@ -package org.dhis2.utils.session - -interface PinView { - fun closeDialog() - - fun recoverPin() -} diff --git a/app/src/main/java/org/dhis2/utils/session/SessionComponent.kt b/app/src/main/java/org/dhis2/utils/session/SessionComponent.kt deleted file mode 100644 index ea6b8372ca4..00000000000 --- a/app/src/main/java/org/dhis2/utils/session/SessionComponent.kt +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2004 - 2019, University of Oslo - * All rights reserved. - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * Neither the name of the HISP project nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package org.dhis2.utils.session - -import dagger.Subcomponent - -@Subcomponent(modules = [PinModule::class]) -interface SessionComponent { - fun inject(pinDialog: PinDialog) -} diff --git a/app/src/main/res/layout-land/layout_pin.xml b/app/src/main/res/layout-land/layout_pin.xml deleted file mode 100644 index 3a8dd114cc2..00000000000 --- a/app/src/main/res/layout-land/layout_pin.xml +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index c8565416d31..046b0745396 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -193,11 +193,6 @@ app:itemTextColor="@color/text_black_333" app:menu="@menu/main_menu" /> - - diff --git a/app/src/main/res/layout/dialog_pin.xml b/app/src/main/res/layout/dialog_pin.xml deleted file mode 100644 index 2a7ee79489a..00000000000 --- a/app/src/main/res/layout/dialog_pin.xml +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/layout_pin.xml b/app/src/main/res/layout/layout_pin.xml deleted file mode 100644 index 284544d1295..00000000000 --- a/app/src/main/res/layout/layout_pin.xml +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/test/java/org/dhis2/utils/session/PinPresenterTest.kt b/app/src/test/java/org/dhis2/utils/session/PinPresenterTest.kt deleted file mode 100644 index 09e73782e96..00000000000 --- a/app/src/test/java/org/dhis2/utils/session/PinPresenterTest.kt +++ /dev/null @@ -1,165 +0,0 @@ -package org.dhis2.utils.session - -import org.dhis2.commons.prefs.Preference -import org.dhis2.commons.prefs.PreferenceProvider -import org.hisp.dhis.android.core.D2 -import org.junit.Before -import org.junit.Test -import org.mockito.Mockito -import org.mockito.kotlin.doReturn -import org.mockito.kotlin.mock -import org.mockito.kotlin.times -import org.mockito.kotlin.verify -import org.mockito.kotlin.whenever - -class PinPresenterTest { - lateinit var presenter: PinPresenter - private var pinView: PinView = mock() - private var preferenceProvider: PreferenceProvider = mock() - private val d2: D2 = Mockito.mock(D2::class.java, Mockito.RETURNS_DEEP_STUBS) - - private val onPinCorrect: () -> Unit = mock() - private val onError: () -> Unit = mock() - private val onTwoManyAttempts: () -> Unit = mock() - - @Before - fun setUp() { - presenter = PinPresenter(pinView, preferenceProvider, d2) - } - - @Test - fun `Should return true if pin is correct`() { - val testPin = "testPin" - - whenever(d2.dataStoreModule()) doReturn mock() - whenever(d2.dataStoreModule().localDataStore()) doReturn mock() - whenever( - d2.dataStoreModule().localDataStore().value(Preference.PIN), - ) doReturn mock() - whenever( - d2 - .dataStoreModule() - .localDataStore() - .value(Preference.PIN) - .blockingGet(), - ) doReturn mock() - whenever( - d2 - .dataStoreModule() - .localDataStore() - .value(Preference.PIN) - .blockingGet() - ?.value(), - ) doReturn testPin - - presenter.unlockSession( - testPin, - attempts = 0, - onError = onError, - onPinCorrect = onPinCorrect, - onTwoManyAttempts = onTwoManyAttempts, - ) - - // SESSION_LOCKED stays true (PIN is still configured), no state change - verify(onPinCorrect).invoke() - } - - @Test - fun `Should return false if pin is wrong`() { - val testPin = "testPin" - val wrongPin = "wrongPin" - - whenever(d2.dataStoreModule()) doReturn mock() - whenever(d2.dataStoreModule().localDataStore()) doReturn mock() - whenever( - d2.dataStoreModule().localDataStore().value(Preference.PIN), - ) doReturn mock() - whenever( - d2 - .dataStoreModule() - .localDataStore() - .value(Preference.PIN) - .blockingGet(), - ) doReturn mock() - whenever( - d2 - .dataStoreModule() - .localDataStore() - .value(Preference.PIN) - .blockingGet() - ?.value(), - ) doReturn testPin - - presenter.unlockSession( - wrongPin, - attempts = 0, - onError = onError, - onPinCorrect = onPinCorrect, - onTwoManyAttempts = onTwoManyAttempts, - ) - - verify(onError).invoke() - } - - @Test - fun `Should call onTwoManyAttempts when try 3 times`() { - val testPin = "testPin" - val wrongPin = "wrongPin" - - whenever(d2.dataStoreModule()) doReturn mock() - whenever(d2.dataStoreModule().localDataStore()) doReturn mock() - whenever( - d2.dataStoreModule().localDataStore().value(Preference.PIN), - ) doReturn mock() - whenever( - d2 - .dataStoreModule() - .localDataStore() - .value(Preference.PIN) - .blockingGet(), - ) doReturn mock() - whenever( - d2 - .dataStoreModule() - .localDataStore() - .value(Preference.PIN) - .blockingGet() - ?.value(), - ) doReturn testPin - - presenter.unlockSession( - wrongPin, - attempts = 3, - onError = onError, - onPinCorrect = onPinCorrect, - onTwoManyAttempts = onTwoManyAttempts, - ) - - verify(onTwoManyAttempts).invoke() - } - - @Test - fun `Should save pin and block session`() { - val testPin = "testPin" - - whenever(d2.dataStoreModule()) doReturn mock() - whenever(d2.dataStoreModule().localDataStore()) doReturn mock() - whenever(d2.dataStoreModule().localDataStore().value(Preference.PIN)) doReturn mock() - - presenter.savePin(testPin) - verify(d2.dataStoreModule().localDataStore().value(Preference.PIN)).blockingSet(testPin) - verify(preferenceProvider, times(1)).setValue(Preference.SESSION_LOCKED, true) - } - - @Test - fun `Should clear pin and block session when logout`() { - whenever(d2.dataStoreModule()) doReturn mock() - whenever(d2.dataStoreModule().localDataStore()) doReturn mock() - whenever(d2.dataStoreModule().localDataStore().value(Preference.PIN)) doReturn mock() - - presenter.logOut() - - verify(d2.dataStoreModule().localDataStore().value(Preference.PIN)).blockingDelete() - verify(preferenceProvider, times(1)).setValue(Preference.SESSION_LOCKED, false) - } -} diff --git a/gradle.properties b/gradle.properties index 7d5c150076d..70e8c2b5087 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,7 +16,6 @@ org.gradle.jvmargs=-Xmx4096M -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true android.useAndroidX=true -android.enableJetifier=true # TODO: Remove when SonarQube Gradle plugin supports AGP 9.x new DSL (AppExtension removal) # NOTE: AGP 9.1.0 also removed getCDirectories() from SourceProvider, breaking sonar-scanner-gradle # 7.2.3.7755. Pinned to AGP 9.0.1 until SonarQube Gradle plugin 7.3 adds AGP 9.1+ support. diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2b2a37089f8..93622073e88 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -36,7 +36,6 @@ viewModelCompose = "2.9.4" material = "1.13.0" material3 = "1.4.0" themeAdapter = "0.36.0" -pinlock = "2.1.0" fancyshowcase = "1.4.0" lottie = "6.6.10" rxjava = "2.2.21" @@ -157,7 +156,6 @@ dagger-compiler = { group = "com.google.dagger", name = "dagger-compiler", versi rx-java = { group = "io.reactivex.rxjava2", name = "rxjava", version.ref = "rxjava" } rx-android = { group = "io.reactivex.rxjava2", name = "rxandroid", version.ref = "rxandroid" } rx-relay = { group = "com.jakewharton.rxrelay2", name = "rxrelay", version.ref = "rxrelay" } -github-pinlock = { group = "com.github.aritraroy", name = "PinLockView", version.ref = "pinlock" } github-fancyshowcase = { group = "com.github.faruktoptas", name = "FancyShowCaseView", version.ref = "fancyshowcase" } github-glide = { group = "com.github.bumptech.glide", name = "glide", version.ref = "glide" } github-glide-compiler = { group = "com.github.bumptech.glide", name = "compiler", version.ref = "glide" } diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 778c65281a3..3d18c6a6663 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -6405,22 +6405,19 @@ - - - + + + + + + + + + + + - - - - - - - - @@ -6662,6 +6659,14 @@ + + + + + + + + @@ -10787,16 +10792,14 @@ - - - - - - - - + + + + + + + + @@ -14550,11 +14553,9 @@ - - - + + + diff --git a/login/build.gradle.kts b/login/build.gradle.kts index 18660c8ff9d..2f0a3fa1a72 100644 --- a/login/build.gradle.kts +++ b/login/build.gradle.kts @@ -82,7 +82,7 @@ kotlin { implementation(libs.koin.androidx.compose) implementation(libs.androidx.activity.compose) implementation(libs.androidx.browser) - compileOnly(libs.androidx.compose.uitooling) + implementation(libs.androidx.compose.uitooling) } } diff --git a/login/src/androidMain/kotlin/org/dhis2/mobile/login/pin/PinBottomSheetLauncher.kt b/login/src/androidMain/kotlin/org/dhis2/mobile/login/pin/PinBottomSheetLauncher.kt new file mode 100644 index 00000000000..8a2da1bea2c --- /dev/null +++ b/login/src/androidMain/kotlin/org/dhis2/mobile/login/pin/PinBottomSheetLauncher.kt @@ -0,0 +1,45 @@ +package org.dhis2.mobile.login.pin + +import android.view.ViewGroup +import android.view.ViewGroup.LayoutParams.MATCH_PARENT +import androidx.compose.ui.platform.ComposeView +import androidx.compose.ui.platform.ViewCompositionStrategy +import androidx.fragment.app.FragmentActivity +import org.dhis2.mobile.login.pin.domain.model.PinMode +import org.dhis2.mobile.login.pin.ui.components.PinDialog +import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme + +/** + * Adds a [PinDialog] composable as an overlay on the Activity's decor view. + * + * Returns the [ComposeView] that was added, so the caller can remove it if needed + * (e.g., on Activity stop). The [PinDialog] is displayed via [FullScreenDialog] internally, + * which creates its own dialog window on top of the Activity. + * + * @param mode PIN mode: SET (create PIN) or ASK (verify PIN). + * @param onSuccess Invoked when the PIN operation completes successfully. + * @param onDismiss Invoked when the dialog is dismissed (back press, forgot PIN, too many attempts). + * @return The [ComposeView] added to the window, or null if the decor view is unavailable. + */ +fun FragmentActivity.addPinBottomSheet( + mode: PinMode, + onSuccess: () -> Unit, + onDismiss: () -> Unit, +): ComposeView? { + val decorView = window?.decorView as? ViewGroup ?: return null + return ComposeView(this).apply { + setViewCompositionStrategy( + ViewCompositionStrategy.DisposeOnDetachedFromWindowOrReleasedFromPool, + ) + setContent { + DHIS2Theme { + PinDialog( + mode = mode, + onSuccess = onSuccess, + onDismiss = onDismiss, + ) + } + } + decorView.addView(this, MATCH_PARENT, MATCH_PARENT) + } +} diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/CredentialsScreen.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/CredentialsScreen.kt index bdf7cc64e90..491f5ca2de5 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/CredentialsScreen.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/CredentialsScreen.kt @@ -60,8 +60,8 @@ import org.dhis2.mobile.login.main.ui.state.CredentialsUpdate import org.dhis2.mobile.login.main.ui.state.LoginState import org.dhis2.mobile.login.main.ui.state.OidcInfo import org.dhis2.mobile.login.main.ui.viewmodel.CredentialsViewModel -import org.dhis2.mobile.login.pin.ui.components.PinBottomSheet -import org.dhis2.mobile.login.pin.ui.components.PinMode +import org.dhis2.mobile.login.pin.domain.model.PinMode +import org.dhis2.mobile.login.pin.ui.components.PinDialog import org.dhis2.mobile.login.resources.Res import org.dhis2.mobile.login.resources.action_log_in import org.dhis2.mobile.login.resources.action_manage_account @@ -252,7 +252,7 @@ fun CredentialsScreen( } if (screenState.isSessionLocked) { - PinBottomSheet( + PinDialog( mode = PinMode.ASK, onSuccess = { viewModel.onPinUnlocked() diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/di/PinModule.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/di/PinModule.kt index f5bcb514cb0..5f9529f4db6 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/di/PinModule.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/di/PinModule.kt @@ -1,15 +1,16 @@ package org.dhis2.mobile.login.pin.di +import org.dhis2.mobile.login.pin.domain.model.PinMode import org.dhis2.mobile.login.pin.domain.usecase.ForgotPinUseCase import org.dhis2.mobile.login.pin.domain.usecase.GetIsSessionLockedUseCase import org.dhis2.mobile.login.pin.domain.usecase.SavePinUseCase import org.dhis2.mobile.login.pin.domain.usecase.ValidatePinUseCase import org.dhis2.mobile.login.pin.ui.provider.PinResourceProvider +import org.dhis2.mobile.login.pin.ui.provider.PinResourceProviderImpl import org.dhis2.mobile.login.pin.ui.viewmodel.PinViewModel import org.koin.core.module.Module import org.koin.core.module.dsl.factoryOf -import org.koin.core.module.dsl.singleOf -import org.koin.core.module.dsl.viewModelOf +import org.koin.core.module.dsl.viewModel import org.koin.dsl.module /** @@ -24,10 +25,10 @@ internal val pinModule = factoryOf(::GetIsSessionLockedUseCase) // PIN resource provider - singleOf(::PinResourceProvider) + single { PinResourceProviderImpl() } - // PIN ViewModel - viewModelOf(::PinViewModel) + // PIN ViewModel — receives PinMode as a runtime parameter via Koin parametersOf + viewModel { params -> PinViewModel(params.get(), get(), get(), get(), get()) } } /** diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/domain/model/PinMode.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/domain/model/PinMode.kt new file mode 100644 index 00000000000..e7b48108cf3 --- /dev/null +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/domain/model/PinMode.kt @@ -0,0 +1,16 @@ +package org.dhis2.mobile.login.pin.domain.model + +/** + * PIN mode enumeration for different bottom sheet behaviors. + */ +enum class PinMode { + /** + * SET mode - Used when creating/setting a new PIN. + */ + SET, + + /** + * ASK mode - Used when verifying/entering an existing PIN. + */ + ASK, +} diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/domain/model/PinState.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/domain/model/PinState.kt deleted file mode 100644 index 57c49ff0cb2..00000000000 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/domain/model/PinState.kt +++ /dev/null @@ -1,41 +0,0 @@ -package org.dhis2.mobile.login.pin.domain.model - -/** - * Represents the different states of PIN operations in the UI. - */ -sealed class PinState { - /** - * Initial/Idle state - waiting for user interaction. - */ - data object Idle : PinState() - - /** - * PIN operation in progress. - */ - data object Loading : PinState() - - /** - * PIN validation or save was successful. - */ - data object Success : PinState() - - /** - * The PIN entry UI was dismissed. - */ - data object Dismissed : PinState() - - /** - * PIN validation failed with an error message. - * @param message The error message to display. - * @param remainingAttempts Number of remaining attempts before forced logout (null if not applicable). - */ - data class Error( - val message: String, - val remainingAttempts: Int? = null, - ) : PinState() - - /** - * Too many failed attempts - will trigger forgot PIN flow. - */ - data object TooManyAttempts : PinState() -} diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/components/PinBottomSheet.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/components/PinBottomSheet.kt deleted file mode 100644 index 24f56f4246a..00000000000 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/components/PinBottomSheet.kt +++ /dev/null @@ -1,363 +0,0 @@ -package org.dhis2.mobile.login.pin.ui.components - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.RowScope -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi -import androidx.compose.material3.windowsizeclass.WindowSizeClass -import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.focus.FocusRequester -import androidx.compose.ui.focus.focusRequester -import androidx.compose.ui.text.style.TextAlign -import org.dhis2.mobile.commons.extensions.getWindowSizeClass -import org.dhis2.mobile.login.pin.domain.model.PinState -import org.dhis2.mobile.login.pin.ui.viewmodel.PinViewModel -import org.dhis2.mobile.login.resources.Res -import org.dhis2.mobile.login.resources.create_pin -import org.dhis2.mobile.login.resources.create_pin_button -import org.dhis2.mobile.login.resources.create_pin_description -import org.dhis2.mobile.login.resources.enter_pin -import org.dhis2.mobile.login.resources.enter_pin_button -import org.dhis2.mobile.login.resources.enter_pin_description -import org.dhis2.mobile.login.resources.forgot_pin_button -import org.dhis2.mobile.login.resources.pin_error_remaining_attempts -import org.hisp.dhis.mobile.ui.designsystem.component.BottomSheetShell -import org.hisp.dhis.mobile.ui.designsystem.component.Button -import org.hisp.dhis.mobile.ui.designsystem.component.ButtonStyle -import org.hisp.dhis.mobile.ui.designsystem.component.InputSegmentedShell -import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextData -import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextState -import org.hisp.dhis.mobile.ui.designsystem.component.model.SegmentedShellType -import org.hisp.dhis.mobile.ui.designsystem.component.state.BottomSheetShellDefaults -import org.hisp.dhis.mobile.ui.designsystem.component.state.BottomSheetShellUIState -import org.hisp.dhis.mobile.ui.designsystem.theme.Spacing -import org.jetbrains.compose.resources.stringResource -import org.koin.compose.viewmodel.koinViewModel - -/** - * PIN mode enumeration for different bottom sheet behaviors. - */ -enum class PinMode { - /** - * SET mode - Used when creating/setting a new PIN. - */ - SET, - - /** - * ASK mode - Used when verifying/entering an existing PIN. - */ - ASK, -} - -/** - * DHIS2 PIN Bottom Sheet component with integrated ViewModel. - * - * A modal bottom sheet that displays a PIN input interface using DHIS2 Mobile UI components. - * Supports both SET (creating PIN) and ASK (verifying PIN) modes. - * Uses [BottomSheetShell] as container and [InputSegmentedShell] for PIN input. - * - * State management is handled internally by [PinViewModel], automatically injected via Koin, - * including PIN validation, attempt tracking, and error messages. - * - * @param mode The PIN mode (SET for creation, ASK for verification). - * @param onSuccess Callback invoked when PIN operation succeeds. - * @param onDismiss Callback invoked when the bottom sheet is dismissed. - * @param modifier Optional modifier for customization. - * @param windowSizeClass Window size class for layout adjustments. - */ -@OptIn(ExperimentalMaterial3WindowSizeClassApi::class) -@Composable -fun PinBottomSheet( - mode: PinMode, - onSuccess: () -> Unit, - onDismiss: () -> Unit, - modifier: Modifier = Modifier, - windowSizeClass: WindowSizeClass = getWindowSizeClass(), -) { - val viewModel: PinViewModel = koinViewModel() - val uiState by viewModel.uiState.collectAsState() - var currentPin by remember { mutableStateOf("") } - val focusRequester = remember { FocusRequester() } - - // Handle state changes from ViewModel - LaunchedEffect(uiState) { - when (uiState) { - is PinState.Success -> { - onSuccess() - } - - is PinState.TooManyAttempts -> { - viewModel.onForgotPin() - } - - is PinState.Dismissed -> { - viewModel.resetAttempts() - viewModel.resetState() - onDismiss() - } - - else -> { // Do nothing for Idle, Loading, Error - } - } - } - - // Reset attempts when dismissed - LaunchedEffect(Unit) { - return@LaunchedEffect - } - - LaunchedEffect(Unit) { - focusRequester.requestFocus() - } - - val (title, subtitle) = - when (mode) { - PinMode.SET -> stringResource(Res.string.create_pin) to stringResource(Res.string.create_pin_description) - PinMode.ASK -> stringResource(Res.string.enter_pin) to stringResource(Res.string.enter_pin_description) - } - - val primaryButtonText = - when (mode) { - PinMode.SET -> stringResource(Res.string.create_pin_button) - PinMode.ASK -> stringResource(Res.string.enter_pin_button) - } - - val secondaryButtonText = - when (mode) { - PinMode.SET -> null - PinMode.ASK -> stringResource(Res.string.forgot_pin_button) - } - - // Get error message from ViewModel state - val errorMessage = - when (val state = uiState) { - is PinState.Error -> { - state.remainingAttempts?.let { attempts -> - "${state.message}. ${ - stringResource( - Res.string.pin_error_remaining_attempts, - attempts, - ) - }" - } ?: state.message - } - - else -> null - } - - val pinLength = 4 - val isLoading = uiState is PinState.Loading - - fun onPrimaryClick() { - viewModel.onPinComplete( - pin = currentPin.replace("-", ""), - mode = mode, - ) - } - - fun onSecondaryClick() { - viewModel.onForgotPin() - } - - val primaryButtonIsEnabled = - currentPin - .replace( - "-", - "", - ).length == pinLength && !isLoading - - val secondaryButtonIsEnabled = !isLoading - - BottomSheetShell( - uiState = - BottomSheetShellUIState( - title = title, - subtitle = null, - description = subtitle, - showTopSectionDivider = false, - showBottomSectionDivider = false, - headerTextAlignment = TextAlign.Center, - animateHeaderOnKeyboardAppearance = false, - scrollableContainerMinHeight = Spacing.Spacing40, - scrollableContainerMaxHeight = Spacing.Spacing840, - contentPadding = - PaddingValues( - horizontal = Spacing.Spacing24, - vertical = Spacing.Spacing0, - ), - ), - modifier = modifier, - content = { - Column( - modifier = Modifier.fillMaxWidth(), - verticalArrangement = Arrangement.spacedBy(Spacing.Spacing16), - ) { - Spacer(modifier = Modifier.height(Spacing.Spacing8)) - - // PIN Input using InputSegmentedShell - InputSegmentedShell( - modifier = - Modifier - .fillMaxWidth() - .focusRequester(focusRequester), - segmentCount = pinLength, - initialValue = null, - supportingTextData = - errorMessage?.let { - SupportingTextData( - text = it, - state = SupportingTextState.ERROR, - ) - }, - segmentedShellType = SegmentedShellType.Numeric, - onValueChanged = { newPin -> - currentPin = newPin - // Clear error when user starts typing - if (uiState is PinState.Error) { - viewModel.resetState() - } - }, - ) - - Spacer(modifier = Modifier.height(Spacing.Spacing8)) - } - }, - buttonBlock = { - when (windowSizeClass.widthSizeClass) { - WindowWidthSizeClass.Compact -> - VerticalButtonBlock( - primaryButton = { - PinPrimaryButton( - modifier = Modifier.fillMaxWidth(), - enabled = primaryButtonIsEnabled, - buttonText = primaryButtonText, - onClick = ::onPrimaryClick, - ) - }, - secondaryButton = - secondaryButtonText?.let { buttonText -> - { - PinSecondaryButton( - modifier = Modifier.fillMaxWidth(), - enabled = secondaryButtonIsEnabled, - buttonText = buttonText, - onClick = ::onSecondaryClick, - ) - } - }, - ) - - else -> - HorizontalButtonBlock( - primaryButton = { - PinPrimaryButton( - modifier = Modifier.weight(1f), - enabled = primaryButtonIsEnabled, - buttonText = primaryButtonText, - onClick = ::onPrimaryClick, - ) - }, - secondaryButton = - secondaryButtonText?.let { buttonText -> - { - PinSecondaryButton( - modifier = Modifier.weight(1f), - enabled = secondaryButtonIsEnabled, - buttonText = buttonText, - onClick = ::onSecondaryClick, - ) - } - }, - ) - } - }, - onDismiss = { - viewModel.resetAttempts() - viewModel.resetState() - onDismiss() - }, - ) -} - -@Composable -private fun VerticalButtonBlock( - primaryButton: @Composable () -> Unit, - secondaryButton: (@Composable () -> Unit)?, -) { - Column( - modifier = - Modifier - .fillMaxWidth() - .padding(BottomSheetShellDefaults.buttonBlockPaddings()), - verticalArrangement = Arrangement.spacedBy(Spacing.Spacing8), - horizontalAlignment = Alignment.CenterHorizontally, - ) { - primaryButton() - secondaryButton?.invoke() - } -} - -@Composable -private fun HorizontalButtonBlock( - primaryButton: @Composable RowScope.() -> Unit, - secondaryButton: (@Composable RowScope.() -> Unit)?, -) { - Row( - modifier = - Modifier - .fillMaxWidth() - .padding(BottomSheetShellDefaults.buttonBlockPaddings()), - horizontalArrangement = Arrangement.spacedBy(Spacing.Spacing8), - verticalAlignment = Alignment.CenterVertically, - ) { - secondaryButton?.invoke(this) - primaryButton() - } -} - -@Composable -private fun PinPrimaryButton( - modifier: Modifier, - enabled: Boolean, - buttonText: String, - onClick: () -> Unit, -) { - Button( - modifier = modifier, - enabled = enabled, - style = ButtonStyle.FILLED, - text = buttonText, - onClick = onClick, - ) -} - -@Composable -private fun PinSecondaryButton( - modifier: Modifier, - enabled: Boolean, - buttonText: String, - onClick: () -> Unit, -) { - Button( - modifier = modifier, - enabled = enabled, - style = ButtonStyle.OUTLINED, - text = buttonText, - onClick = onClick, - ) -} diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/components/PinDialog.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/components/PinDialog.kt new file mode 100644 index 00000000000..59aaa8ed19d --- /dev/null +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/components/PinDialog.kt @@ -0,0 +1,511 @@ +package org.dhis2.mobile.login.pin.ui.components + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Key +import androidx.compose.material.icons.outlined.Pin +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.VerticalDivider +import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi +import androidx.compose.material3.windowsizeclass.WindowSizeClass +import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.unit.DpSize +import androidx.compose.ui.unit.dp +import org.dhis2.mobile.commons.extensions.deviceIsInLandscapeMode +import org.dhis2.mobile.commons.extensions.getWindowSizeClass +import org.dhis2.mobile.login.pin.domain.model.PinMode +import org.dhis2.mobile.login.pin.ui.state.PinUiState +import org.dhis2.mobile.login.pin.ui.viewmodel.PinViewModel +import org.hisp.dhis.mobile.ui.designsystem.component.Button +import org.hisp.dhis.mobile.ui.designsystem.component.ButtonStyle +import org.hisp.dhis.mobile.ui.designsystem.component.FullScreenDialog +import org.hisp.dhis.mobile.ui.designsystem.component.InputSegmentedShell +import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextData +import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextState +import org.hisp.dhis.mobile.ui.designsystem.component.model.SegmentedShellType +import org.hisp.dhis.mobile.ui.designsystem.component.state.BottomSheetShellDefaults +import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme +import org.hisp.dhis.mobile.ui.designsystem.theme.Spacing +import org.jetbrains.compose.ui.tooling.preview.Preview +import org.koin.compose.viewmodel.koinViewModel +import org.koin.core.parameter.parametersOf + +/** + * DHIS2 PIN Bottom Sheet component with integrated ViewModel. + * + * A modal bottom sheet that displays a PIN input interface using DHIS2 Mobile UI components. + * Supports both SET (creating PIN) and ASK (verifying PIN) modes. + * Uses [FullScreenDialog] as container and [InputSegmentedShell] for PIN input. + * + * State management is handled internally by [PinViewModel], automatically injected via Koin, + * including PIN validation, attempt tracking, and error messages. + * + * @param mode The PIN mode (SET for creation, ASK for verification). + * @param onSuccess Callback invoked when PIN operation succeeds. + * @param onDismiss Callback invoked when the bottom sheet is dismissed. + * @param modifier Optional modifier for customization. + * @param windowSizeClass Window size class for layout adjustments. + */ +@OptIn(ExperimentalMaterial3WindowSizeClassApi::class) +@Composable +fun PinDialog( + mode: PinMode, + onSuccess: () -> Unit, + onDismiss: () -> Unit, + modifier: Modifier = Modifier, + windowSizeClass: WindowSizeClass = getWindowSizeClass(), +) { + val viewModel: PinViewModel = koinViewModel { parametersOf(mode) } + val uiState by viewModel.uiState.collectAsState() + val isLandscape = deviceIsInLandscapeMode() + + LaunchedEffect(uiState.isSuccess, uiState.isDismissed, uiState.isTooManyAttempts) { + when { + uiState.isSuccess -> onSuccess() + uiState.isTooManyAttempts -> viewModel.onForgotPin() + uiState.isDismissed -> { + viewModel.resetAttempts() + viewModel.resetState() + onDismiss() + } + } + } + + PinContent( + uiState = uiState, + mode = mode, + isLandscape = isLandscape, + windowSizeClass = windowSizeClass, + onPinChanged = viewModel::onPinChanged, + onPrimaryClick = viewModel::onPinComplete, + onSecondaryClick = viewModel::onForgotPin, + onDismiss = { + viewModel.resetAttempts() + viewModel.resetState() + onDismiss() + }, + modifier = modifier, + ) +} + +/** + * Stateless UI content for the PIN bottom sheet. + * + * Renders the [FullScreenDialog] with either a portrait (stacked) or landscape (side-by-side) + * layout depending on [isLandscape]. This composable holds no business logic and is safe + * to use in Compose Previews. + * + * @param uiState The current UI state containing display content and button states. + * @param isLandscape Whether the device is in landscape orientation. + * @param windowSizeClass Window size class used to choose the button layout. + * @param onPinChanged Callback invoked on every PIN value change. + * @param onPrimaryClick Callback for the primary button click. + * @param onSecondaryClick Callback for the secondary button click. + * @param onDismiss Callback invoked when the dialog is dismissed. + * @param modifier Optional modifier for customization. + */ +@OptIn(ExperimentalMaterial3WindowSizeClassApi::class) +@Composable +internal fun PinContent( + uiState: PinUiState, + mode: PinMode, + isLandscape: Boolean, + windowSizeClass: WindowSizeClass, + onPinChanged: (String) -> Unit, + onPrimaryClick: () -> Unit, + onSecondaryClick: () -> Unit, + onDismiss: () -> Unit, + modifier: Modifier = Modifier, +) { + val focusRequester = remember { FocusRequester() } + + FullScreenDialog( + onDismiss = onDismiss, + content = { + if (!isLandscape) { + Column( + modifier = + Modifier + .fillMaxSize() + .imePadding() + .verticalScroll(rememberScrollState()), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Top, + ) { + PinHeader( + title = uiState.title, + subtitle = uiState.subtitle, + ) + + PinInputBlock( + uiState = uiState, + focusRequester = focusRequester, + windowSizeClass = windowSizeClass, + showPrimaryButtonIcon = mode == PinMode.SET, + onPinChanged = onPinChanged, + onPrimaryClick = onPrimaryClick, + onSecondaryClick = onSecondaryClick, + ) + } + } else { + Row( + modifier = + Modifier + .fillMaxSize() + .imePadding() + .padding(horizontal = Spacing.Spacing56), + horizontalArrangement = Arrangement.spacedBy(Spacing.Spacing56), + verticalAlignment = Alignment.CenterVertically, + ) { + Column( + modifier = + Modifier + .weight(1f) + .fillMaxHeight() + .verticalScroll(rememberScrollState()) + .padding(vertical = Spacing.Spacing32), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + ) { + PinHeader( + title = uiState.title, + subtitle = uiState.subtitle, + ) + } + + VerticalDivider( + modifier = Modifier.padding(vertical = Spacing.Spacing32), + thickness = Spacing.Spacing1, + color = MaterialTheme.colorScheme.outlineVariant, + ) + + Column( + modifier = + Modifier + .weight(1f) + .fillMaxHeight() + .verticalScroll(rememberScrollState()) + .padding(vertical = Spacing.Spacing32), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + ) { + PinInputBlock( + uiState = uiState, + focusRequester = focusRequester, + windowSizeClass = windowSizeClass, + showPrimaryButtonIcon = mode == PinMode.SET, + onPinChanged = onPinChanged, + onPrimaryClick = onPrimaryClick, + onSecondaryClick = onSecondaryClick, + ) + } + } + } + }, + ) +} + +/** + * Displays the PIN screen header: a PIN icon, a title, and a subtitle. + * + * @param title The main heading text. + * @param subtitle The descriptive text shown below the title. + * @param modifier Optional modifier for customization. + */ +@Composable +private fun PinHeader( + title: String, + subtitle: String, + modifier: Modifier = Modifier, +) { + Column( + modifier = modifier, + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Icon( + imageVector = Icons.Outlined.Pin, + contentDescription = null, + tint = MaterialTheme.colorScheme.primary, + ) + + Text( + text = title, + style = MaterialTheme.typography.headlineSmall, + color = MaterialTheme.colorScheme.onSurface, + modifier = Modifier.padding(vertical = Spacing.Spacing16), + ) + + Text( + text = subtitle, + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(bottom = Spacing.Spacing16), + ) + } +} + +/** + * Displays the PIN input field and action buttons. + * + * Renders [InputSegmentedShell] for PIN entry and adapts the button layout + * (vertical vs horizontal) based on [windowSizeClass]. + * + * @param focusRequester Focus requester to autofocus the input field. + * @param windowSizeClass Window size class used to choose the button layout. + * @param onPinChanged Callback invoked on every PIN value change. + * @param onPrimaryClick Callback for the primary button click. + * @param onSecondaryClick Callback for the secondary button click. + * @param modifier Optional modifier for customization. + */ +@OptIn(ExperimentalMaterial3WindowSizeClassApi::class) +@Composable +private fun PinInputBlock( + uiState: PinUiState, + focusRequester: FocusRequester, + windowSizeClass: WindowSizeClass, + showPrimaryButtonIcon: Boolean, + onPinChanged: (String) -> Unit, + onPrimaryClick: () -> Unit, + onSecondaryClick: () -> Unit, + modifier: Modifier = Modifier, +) { + // Stabilize supportingTextData to prevent recomposition issues + val supportingTextData = + remember(uiState.errorMessage) { + uiState.errorMessage?.let { + SupportingTextData( + text = it, + state = SupportingTextState.ERROR, + ) + } + } + + // Request focus on initial composition only + LaunchedEffect(Unit) { + focusRequester.requestFocus() + } + + Column( + modifier = modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + ) { + InputSegmentedShell( + modifier = + Modifier + .fillMaxWidth() + .padding(horizontal = Spacing.Spacing16) + .focusRequester(focusRequester), + segmentCount = uiState.pinLength, + initialValue = null, + supportingTextData = supportingTextData, + segmentedShellType = SegmentedShellType.Numeric, + onValueChanged = onPinChanged, + ) + + Spacer(modifier = Modifier.height(Spacing.Spacing32)) + + when (windowSizeClass.widthSizeClass) { + WindowWidthSizeClass.Compact -> + VerticalButtonBlock( + primaryButton = { + PinPrimaryButton( + modifier = Modifier.fillMaxWidth(), + enabled = uiState.primaryButtonIsEnabled, + buttonText = uiState.primaryButtonText, + showIcon = showPrimaryButtonIcon, + onClick = onPrimaryClick, + ) + }, + secondaryButton = + uiState.secondaryButtonText?.let { buttonText -> + { + PinSecondaryButton( + modifier = Modifier.fillMaxWidth(), + enabled = !uiState.isLoading, + buttonText = buttonText, + onClick = onSecondaryClick, + ) + } + }, + ) + + else -> + HorizontalButtonBlock( + primaryButton = { + PinPrimaryButton( + modifier = Modifier.weight(1f), + enabled = uiState.primaryButtonIsEnabled, + buttonText = uiState.primaryButtonText, + showIcon = showPrimaryButtonIcon, + onClick = onPrimaryClick, + ) + }, + secondaryButton = + uiState.secondaryButtonText?.let { buttonText -> + { + PinSecondaryButton( + modifier = Modifier.weight(1f), + enabled = !uiState.isLoading, + buttonText = buttonText, + onClick = onSecondaryClick, + ) + } + }, + ) + } + } +} + +@Composable +private fun VerticalButtonBlock( + primaryButton: @Composable () -> Unit, + secondaryButton: (@Composable () -> Unit)?, +) { + Column( + modifier = + Modifier + .fillMaxWidth() + .padding(BottomSheetShellDefaults.buttonBlockPaddings()), + verticalArrangement = Arrangement.spacedBy(Spacing.Spacing8), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + primaryButton() + secondaryButton?.invoke() + } +} + +@Composable +private fun HorizontalButtonBlock( + primaryButton: @Composable RowScope.() -> Unit, + secondaryButton: (@Composable RowScope.() -> Unit)?, +) { + Row( + modifier = + Modifier + .fillMaxWidth() + .padding(BottomSheetShellDefaults.buttonBlockPaddings()), + horizontalArrangement = Arrangement.spacedBy(Spacing.Spacing8), + verticalAlignment = Alignment.CenterVertically, + ) { + secondaryButton?.invoke(this) + primaryButton() + } +} + +@Composable +private fun PinPrimaryButton( + modifier: Modifier, + enabled: Boolean, + buttonText: String, + showIcon: Boolean, + onClick: () -> Unit, +) { + Button( + modifier = modifier, + enabled = enabled, + style = ButtonStyle.FILLED, + text = buttonText, + icon = + if (showIcon) { + { + Icon( + imageVector = Icons.Outlined.Key, + contentDescription = null, + ) + } + } else { + null + }, + onClick = onClick, + ) +} + +@Composable +private fun PinSecondaryButton( + modifier: Modifier, + enabled: Boolean, + buttonText: String, + onClick: () -> Unit, +) { + Button( + modifier = modifier, + enabled = enabled, + style = ButtonStyle.OUTLINED, + text = buttonText, + onClick = onClick, + ) +} + +@OptIn(ExperimentalMaterial3WindowSizeClassApi::class) +@Preview(showBackground = true, widthDp = 360, heightDp = 800) +@Composable +fun PinAskPortraitPreview() { + val windowSizeClass = WindowSizeClass.calculateFromSize(DpSize(360.dp, 800.dp)) + DHIS2Theme { + PinContent( + uiState = + PinUiState( + title = "Enter your PIN", + subtitle = "Enter your 4-digit PIN to access your account.", + primaryButtonText = "Unlock", + secondaryButtonText = "Forgot your PIN?", + ), + mode = PinMode.ASK, + isLandscape = false, + windowSizeClass = windowSizeClass, + onPinChanged = {}, + onPrimaryClick = {}, + onSecondaryClick = {}, + onDismiss = {}, + ) + } +} + +@OptIn(ExperimentalMaterial3WindowSizeClassApi::class) +@Preview(showBackground = true, widthDp = 1280, heightDp = 800) +@Composable +fun PinAskLandscapePreview() { + val windowSizeClass = WindowSizeClass.calculateFromSize(DpSize(1280.dp, 800.dp)) + DHIS2Theme { + PinContent( + uiState = + PinUiState( + title = "Enter your PIN", + subtitle = "Enter your 4-digit PIN to access your account.", + primaryButtonText = "Unlock", + secondaryButtonText = "Forgot your PIN?", + ), + mode = PinMode.ASK, + isLandscape = true, + windowSizeClass = windowSizeClass, + onPinChanged = {}, + onPrimaryClick = {}, + onSecondaryClick = {}, + onDismiss = {}, + ) + } +} diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/provider/PinResourceProvider.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/provider/PinResourceProvider.kt index d31006d250c..4dd47b49af4 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/provider/PinResourceProvider.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/provider/PinResourceProvider.kt @@ -1,34 +1,86 @@ package org.dhis2.mobile.login.pin.ui.provider +import org.dhis2.mobile.login.pin.domain.model.PinMode import org.dhis2.mobile.login.resources.Res +import org.dhis2.mobile.login.resources.create_pin +import org.dhis2.mobile.login.resources.create_pin_button +import org.dhis2.mobile.login.resources.create_pin_description +import org.dhis2.mobile.login.resources.enter_pin +import org.dhis2.mobile.login.resources.enter_pin_button +import org.dhis2.mobile.login.resources.enter_pin_description +import org.dhis2.mobile.login.resources.forgot_pin_button import org.dhis2.mobile.login.resources.pin_error_incorrect import org.dhis2.mobile.login.resources.pin_error_no_pin +import org.dhis2.mobile.login.resources.pin_error_remaining_attempts import org.dhis2.mobile.login.resources.pin_error_reset_failed import org.dhis2.mobile.login.resources.pin_error_save_failed import org.jetbrains.compose.resources.getString /** * Provides string resources for PIN feature. - * This class decouples resource access from ViewModels, making testing easier. + * Extracted as an interface to allow test-friendly mocking. */ -class PinResourceProvider { - /** - * Returns the error message for incorrect PIN. - */ - suspend fun getPinErrorIncorrect(): String = getString(Res.string.pin_error_incorrect) - - /** - * Returns the error message when no PIN is stored. - */ - suspend fun getPinErrorNoPinStored(): String = getString(Res.string.pin_error_no_pin) - - /** - * Returns the error message when PIN save fails. - */ - suspend fun getPinErrorSaveFailed(): String = getString(Res.string.pin_error_save_failed) - - /** - * Returns the error message when PIN reset fails. - */ - suspend fun getPinErrorResetFailed(): String = getString(Res.string.pin_error_reset_failed) +interface PinResourceProvider { + suspend fun getPinTitle(mode: PinMode): String + + suspend fun getPinSubtitle(mode: PinMode): String + + suspend fun getPrimaryButtonText(mode: PinMode): String + + suspend fun getSecondaryButtonText(mode: PinMode): String? + + suspend fun getPinErrorIncorrect(): String + + suspend fun getPinErrorWithAttempts( + message: String, + attempts: Int, + ): String + + suspend fun getPinErrorNoPinStored(): String + + suspend fun getPinErrorSaveFailed(): String + + suspend fun getPinErrorResetFailed(): String +} + +/** + * Default implementation of [PinResourceProvider] using Compose Multiplatform string resources. + */ +class PinResourceProviderImpl : PinResourceProvider { + override suspend fun getPinTitle(mode: PinMode): String = + when (mode) { + PinMode.SET -> getString(Res.string.create_pin) + PinMode.ASK -> getString(Res.string.enter_pin) + } + + override suspend fun getPinSubtitle(mode: PinMode): String = + when (mode) { + PinMode.SET -> getString(Res.string.create_pin_description) + PinMode.ASK -> getString(Res.string.enter_pin_description) + } + + override suspend fun getPrimaryButtonText(mode: PinMode): String = + when (mode) { + PinMode.SET -> getString(Res.string.create_pin_button) + PinMode.ASK -> getString(Res.string.enter_pin_button) + } + + override suspend fun getSecondaryButtonText(mode: PinMode): String? = + when (mode) { + PinMode.SET -> null + PinMode.ASK -> getString(Res.string.forgot_pin_button) + } + + override suspend fun getPinErrorIncorrect(): String = getString(Res.string.pin_error_incorrect) + + override suspend fun getPinErrorWithAttempts( + message: String, + attempts: Int, + ): String = "$message. ${getString(Res.string.pin_error_remaining_attempts, attempts)}" + + override suspend fun getPinErrorNoPinStored(): String = getString(Res.string.pin_error_no_pin) + + override suspend fun getPinErrorSaveFailed(): String = getString(Res.string.pin_error_save_failed) + + override suspend fun getPinErrorResetFailed(): String = getString(Res.string.pin_error_reset_failed) } diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/state/PinUiState.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/state/PinUiState.kt new file mode 100644 index 00000000000..b35c311ab8a --- /dev/null +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/state/PinUiState.kt @@ -0,0 +1,31 @@ +package org.dhis2.mobile.login.pin.ui.state + +/** + * UI state for the PIN dialog content. + * Exposed by [org.dhis2.mobile.login.pin.ui.viewmodel.PinViewModel] and consumed by composables. + * + * @param title The main heading text. + * @param subtitle The descriptive text shown below the title. + * @param primaryButtonText Label for the primary action button. + * @param secondaryButtonText Optional label for the secondary action button. + * @param errorMessage Optional error message shown below the PIN input field. + * @param primaryButtonIsEnabled Whether the primary action button is enabled. + * @param isLoading Whether a PIN operation is in progress. + * @param isSuccess Whether the PIN operation completed successfully. + * @param isDismissed Whether the PIN dialog was dismissed (e.g. after forgot-PIN flow). + * @param isTooManyAttempts Whether the user exceeded the maximum number of PIN attempts. + * @param pinLength Number of PIN digits. + */ +data class PinUiState( + val title: String = "", + val subtitle: String = "", + val primaryButtonText: String = "", + val secondaryButtonText: String? = null, + val errorMessage: String? = null, + val primaryButtonIsEnabled: Boolean = false, + val isLoading: Boolean = false, + val isSuccess: Boolean = false, + val isDismissed: Boolean = false, + val isTooManyAttempts: Boolean = false, + val pinLength: Int = 4, +) diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/viewmodel/PinViewModel.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/viewmodel/PinViewModel.kt index 6b848e02497..adc127c3872 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/viewmodel/PinViewModel.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/viewmodel/PinViewModel.kt @@ -8,101 +8,131 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import org.dhis2.mobile.commons.domain.invoke import org.dhis2.mobile.login.pin.domain.model.PinError -import org.dhis2.mobile.login.pin.domain.model.PinState +import org.dhis2.mobile.login.pin.domain.model.PinMode import org.dhis2.mobile.login.pin.domain.model.ValidatePinInput import org.dhis2.mobile.login.pin.domain.usecase.ForgotPinUseCase import org.dhis2.mobile.login.pin.domain.usecase.SavePinUseCase import org.dhis2.mobile.login.pin.domain.usecase.ValidatePinUseCase -import org.dhis2.mobile.login.pin.ui.components.PinMode import org.dhis2.mobile.login.pin.ui.provider.PinResourceProvider +import org.dhis2.mobile.login.pin.ui.state.PinUiState /** * ViewModel for managing PIN operations. * Coordinates between the UI and use cases for PIN creation, validation, and recovery. + * + * @param mode The PIN mode (SET for creation, ASK for verification). */ class PinViewModel( + private val mode: PinMode, private val savePinUseCase: SavePinUseCase, private val validatePinUseCase: ValidatePinUseCase, private val forgotPinUseCase: ForgotPinUseCase, private val resourceProvider: PinResourceProvider, ) : ViewModel() { - private val _uiState = MutableStateFlow(PinState.Idle) - val uiState: StateFlow = _uiState.asStateFlow() + private val _uiState = MutableStateFlow(PinUiState()) + val uiState: StateFlow = _uiState.asStateFlow() private var pinAttempts = 0 + private var currentPin = "" + + init { + viewModelScope.launch { + _uiState.value = + _uiState.value.copy( + title = resourceProvider.getPinTitle(mode), + subtitle = resourceProvider.getPinSubtitle(mode), + primaryButtonText = resourceProvider.getPrimaryButtonText(mode), + secondaryButtonText = resourceProvider.getSecondaryButtonText(mode), + ) + } + } + + /** + * Updates the current PIN value and recomputes button enablement. + * Clears any existing error message when the user starts typing. + * + * @param pin The current PIN value from the input field. + */ + fun onPinChanged(pin: String) { + currentPin = pin + _uiState.value = + _uiState.value.copy( + errorMessage = null, + primaryButtonIsEnabled = pin.replace("-", "").length == _uiState.value.pinLength, + ) + } /** * Handles PIN completion based on the current mode. - * @param pin The PIN entered by the user. - * @param mode The current PIN mode (SET or ASK). */ - fun onPinComplete( - pin: String, - mode: PinMode, - ) { + fun onPinComplete() { + val pin = currentPin.replace("-", "") when (mode) { PinMode.SET -> savePin(pin) PinMode.ASK -> validatePin(pin) } } - /** - * Saves a new PIN. - * @param pin The PIN to save. - */ private fun savePin(pin: String) { viewModelScope.launch { - _uiState.value = PinState.Loading + _uiState.value = _uiState.value.copy(isLoading = true, primaryButtonIsEnabled = false) savePinUseCase(pin) .onSuccess { - _uiState.value = PinState.Success + _uiState.value = _uiState.value.copy(isLoading = false, isSuccess = true) }.onFailure { error -> _uiState.value = - PinState.Error( - message = error.message ?: resourceProvider.getPinErrorSaveFailed(), + _uiState.value.copy( + isLoading = false, + errorMessage = error.message ?: resourceProvider.getPinErrorSaveFailed(), + primaryButtonIsEnabled = currentPin.replace("-", "").length == _uiState.value.pinLength, ) } } } - /** - * Validates the entered PIN against the stored PIN. - * @param pin The PIN to validate. - */ private fun validatePin(pin: String) { viewModelScope.launch { - _uiState.value = PinState.Loading + _uiState.value = _uiState.value.copy(isLoading = true, primaryButtonIsEnabled = false) validatePinUseCase(ValidatePinInput(pin, pinAttempts)).fold( onSuccess = { - _uiState.value = PinState.Success + _uiState.value = _uiState.value.copy(isLoading = false, isSuccess = true) pinAttempts = 0 }, - onFailure = { failure: Throwable -> + onFailure = { failure -> when (failure) { is PinError.Failed -> { pinAttempts++ + val message = resourceProvider.getPinErrorIncorrect() + val fullMessage = + resourceProvider.getPinErrorWithAttempts(message, failure.attemptsLeft) _uiState.value = - PinState.Error( - message = resourceProvider.getPinErrorIncorrect(), - remainingAttempts = failure.attemptsLeft, + _uiState.value.copy( + isLoading = false, + errorMessage = fullMessage, + primaryButtonIsEnabled = currentPin.replace("-", "").length == _uiState.value.pinLength, ) } is PinError.TooManyAttempts -> { - _uiState.value = PinState.TooManyAttempts + _uiState.value = + _uiState.value.copy(isLoading = false, isTooManyAttempts = true) } is PinError.NoPinStored -> { _uiState.value = - PinState.Error( - message = resourceProvider.getPinErrorNoPinStored(), + _uiState.value.copy( + isLoading = false, + errorMessage = resourceProvider.getPinErrorNoPinStored(), + primaryButtonIsEnabled = currentPin.replace("-", "").length == _uiState.value.pinLength, ) } else -> { _uiState.value = - PinState.Error( - message = failure.message ?: "Unknown error occurred", + _uiState.value.copy( + isLoading = false, + errorMessage = failure.message ?: "Unknown error occurred", + primaryButtonIsEnabled = currentPin.replace("-", "").length == _uiState.value.pinLength, ) } } @@ -116,26 +146,40 @@ class PinViewModel( * This will log out the user and clear the PIN. */ fun onForgotPin() { + if (_uiState.value.isLoading) return viewModelScope.launch { - _uiState.value = PinState.Loading + _uiState.value = _uiState.value.copy(isLoading = true, primaryButtonIsEnabled = false) forgotPinUseCase() .onSuccess { - _uiState.value = PinState.Dismissed + _uiState.value = + _uiState.value.copy( + isLoading = false, + isDismissed = true, + isTooManyAttempts = false, + ) }.onFailure { error -> _uiState.value = - PinState.Error( - message = error.message ?: resourceProvider.getPinErrorResetFailed(), + _uiState.value.copy( + isLoading = false, + errorMessage = error.message ?: resourceProvider.getPinErrorResetFailed(), + primaryButtonIsEnabled = currentPin.replace("-", "").length == _uiState.value.pinLength, ) } } } /** - * Resets the UI state to idle. - * Useful for clearing error messages. + * Resets transient UI state flags (error, success, dismissed, tooManyAttempts). + * Useful when the dialog is dismissed or re-shown. */ fun resetState() { - _uiState.value = PinState.Idle + _uiState.value = + _uiState.value.copy( + errorMessage = null, + isSuccess = false, + isDismissed = false, + isTooManyAttempts = false, + ) } /** diff --git a/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/ui/viewmodel/PinViewModelTest.kt b/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/ui/viewmodel/PinViewModelTest.kt index bd68b60dfaa..1ef3fb35d45 100644 --- a/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/ui/viewmodel/PinViewModelTest.kt +++ b/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/ui/viewmodel/PinViewModelTest.kt @@ -1,27 +1,29 @@ package org.dhis2.mobile.login.pin.ui.viewmodel -import app.cash.turbine.test import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.setMain import org.dhis2.mobile.login.pin.domain.model.PinError -import org.dhis2.mobile.login.pin.domain.model.PinState +import org.dhis2.mobile.login.pin.domain.model.PinMode import org.dhis2.mobile.login.pin.domain.model.ValidatePinInput import org.dhis2.mobile.login.pin.domain.usecase.ForgotPinUseCase import org.dhis2.mobile.login.pin.domain.usecase.SavePinUseCase import org.dhis2.mobile.login.pin.domain.usecase.ValidatePinUseCase -import org.dhis2.mobile.login.pin.ui.components.PinMode import org.dhis2.mobile.login.pin.ui.provider.PinResourceProvider +import org.mockito.kotlin.any import org.mockito.kotlin.mock import org.mockito.kotlin.whenever import kotlin.test.AfterTest import kotlin.test.BeforeTest import kotlin.test.Test import kotlin.test.assertEquals +import kotlin.test.assertFalse +import kotlin.test.assertNull import kotlin.test.assertTrue @OptIn(ExperimentalCoroutinesApi::class) @@ -36,6 +38,12 @@ class PinViewModelTest { @BeforeTest fun setUp() { Dispatchers.setMain(testDispatcher) + runBlocking { + whenever(resourceProvider.getPinTitle(any())).thenReturn("") + whenever(resourceProvider.getPinSubtitle(any())).thenReturn("") + whenever(resourceProvider.getPrimaryButtonText(any())).thenReturn("") + whenever(resourceProvider.getSecondaryButtonText(any())).thenReturn(null) + } } @AfterTest @@ -44,277 +52,252 @@ class PinViewModelTest { } @Test - fun `initial state is Idle`() = + fun `initial state has no error and no active flags`() = runTest { - // Given viewModel = createViewModel() - // Then - assertEquals(PinState.Idle, viewModel.uiState.value) + val state = viewModel.uiState.value + assertNull(state.errorMessage) + assertFalse(state.isLoading) + assertFalse(state.isSuccess) + assertFalse(state.isDismissed) + assertFalse(state.isTooManyAttempts) } @Test fun `onPinComplete with SET mode saves PIN successfully`() = runTest { - // Given - viewModel = createViewModel() + viewModel = createViewModel(PinMode.SET) val pin = "1234" whenever(savePinUseCase(pin)).thenReturn(Result.success(Unit)) - // When - viewModel.onPinComplete(pin, PinMode.SET) + viewModel.onPinChanged(pin) + viewModel.onPinComplete() advanceUntilIdle() - // Then - assertTrue(viewModel.uiState.value is PinState.Success) + assertTrue(viewModel.uiState.value.isSuccess) } @Test fun `onPinComplete with SET mode shows error when save fails`() = runTest { - // Given - viewModel = createViewModel() + viewModel = createViewModel(PinMode.SET) val pin = "1234" - val error = Exception("Save failed") - whenever(savePinUseCase(pin)).thenReturn(Result.failure(error)) + whenever(savePinUseCase(pin)).thenReturn(Result.failure(Exception("Save failed"))) - // When - viewModel.onPinComplete(pin, PinMode.SET) + viewModel.onPinChanged(pin) + viewModel.onPinComplete() advanceUntilIdle() - // Then - val state = viewModel.uiState.value - assertTrue(state is PinState.Error) - assertEquals("Save failed", state.message) + assertEquals("Save failed", viewModel.uiState.value.errorMessage) } @Test fun `onPinComplete with SET mode uses resource provider when error message is null`() = runTest { - // Given - viewModel = createViewModel() + viewModel = createViewModel(PinMode.SET) val pin = "1234" - val error = Exception() - whenever(savePinUseCase(pin)).thenReturn(Result.failure(error)) + whenever(savePinUseCase(pin)).thenReturn(Result.failure(Exception())) whenever(resourceProvider.getPinErrorSaveFailed()).thenReturn("Failed to save PIN") - // When - viewModel.onPinComplete(pin, PinMode.SET) + viewModel.onPinChanged(pin) + viewModel.onPinComplete() advanceUntilIdle() - // Then - val state = viewModel.uiState.value - assertTrue(state is PinState.Error) - assertEquals("Failed to save PIN", state.message) + assertEquals("Failed to save PIN", viewModel.uiState.value.errorMessage) } @Test fun `onPinComplete with ASK mode validates PIN successfully`() = runTest { - // Given - viewModel = createViewModel() + viewModel = createViewModel(PinMode.ASK) val pin = "1234" whenever(validatePinUseCase(ValidatePinInput(pin, 0))).thenReturn(Result.success(Unit)) - // When - viewModel.onPinComplete(pin, PinMode.ASK) + viewModel.onPinChanged(pin) + viewModel.onPinComplete() advanceUntilIdle() - // Then - assertTrue(viewModel.uiState.value is PinState.Success) + assertTrue(viewModel.uiState.value.isSuccess) } @Test fun `onPinComplete with ASK mode shows error when PIN is incorrect`() = runTest { - // Given - viewModel = createViewModel() + viewModel = createViewModel(PinMode.ASK) val pin = "0000" - whenever(validatePinUseCase(ValidatePinInput(pin, 0))).thenReturn(Result.failure(PinError.Failed(attemptsLeft = 2))) + whenever(validatePinUseCase(ValidatePinInput(pin, 0))).thenReturn( + Result.failure(PinError.Failed(attemptsLeft = 2)), + ) whenever(resourceProvider.getPinErrorIncorrect()).thenReturn("Incorrect PIN") + whenever(resourceProvider.getPinErrorWithAttempts("Incorrect PIN", 2)) + .thenReturn("Incorrect PIN. 2 attempts remaining") - // When - viewModel.onPinComplete(pin, PinMode.ASK) + viewModel.onPinChanged(pin) + viewModel.onPinComplete() advanceUntilIdle() - // Then - val state = viewModel.uiState.value - assertTrue(state is PinState.Error) - assertEquals("Incorrect PIN", state.message) - assertEquals(2, state.remainingAttempts) + assertEquals("Incorrect PIN. 2 attempts remaining", viewModel.uiState.value.errorMessage) } @Test fun `onPinComplete with ASK mode shows TooManyAttempts after 3 failed attempts`() = runTest { - // Given - viewModel = createViewModel() + viewModel = createViewModel(PinMode.ASK) val pin = "0000" whenever(resourceProvider.getPinErrorIncorrect()).thenReturn("Incorrect PIN") - // First attempt - whenever(validatePinUseCase(ValidatePinInput(pin, 0))).thenReturn(Result.failure(PinError.Failed(attemptsLeft = 2))) - viewModel.onPinComplete(pin, PinMode.ASK) + whenever(validatePinUseCase(ValidatePinInput(pin, 0))).thenReturn( + Result.failure(PinError.Failed(attemptsLeft = 2)), + ) + viewModel.onPinChanged(pin) + viewModel.onPinComplete() advanceUntilIdle() - // Second attempt - whenever(validatePinUseCase(ValidatePinInput(pin, 1))).thenReturn(Result.failure(PinError.Failed(attemptsLeft = 1))) - viewModel.onPinComplete(pin, PinMode.ASK) + whenever(validatePinUseCase(ValidatePinInput(pin, 1))).thenReturn( + Result.failure(PinError.Failed(attemptsLeft = 1)), + ) + viewModel.onPinChanged(pin) + viewModel.onPinComplete() advanceUntilIdle() - // Third attempt - whenever(validatePinUseCase(ValidatePinInput(pin, 2))).thenReturn(Result.failure(PinError.TooManyAttempts)) - viewModel.onPinComplete(pin, PinMode.ASK) + whenever(validatePinUseCase(ValidatePinInput(pin, 2))).thenReturn( + Result.failure(PinError.TooManyAttempts), + ) + viewModel.onPinChanged(pin) + viewModel.onPinComplete() advanceUntilIdle() - // Then - assertTrue(viewModel.uiState.value is PinState.TooManyAttempts) + assertTrue(viewModel.uiState.value.isTooManyAttempts) } @Test fun `onPinComplete with ASK mode shows error when no PIN is stored`() = runTest { - // Given - viewModel = createViewModel() + viewModel = createViewModel(PinMode.ASK) val pin = "1234" - whenever(validatePinUseCase(ValidatePinInput(pin, 0))).thenReturn(Result.failure(PinError.NoPinStored)) + whenever(validatePinUseCase(ValidatePinInput(pin, 0))).thenReturn( + Result.failure(PinError.NoPinStored), + ) whenever(resourceProvider.getPinErrorNoPinStored()).thenReturn("No PIN stored") - // When - viewModel.onPinComplete(pin, PinMode.ASK) + viewModel.onPinChanged(pin) + viewModel.onPinComplete() advanceUntilIdle() - // Then - val state = viewModel.uiState.value - assertTrue(state is PinState.Error) - assertEquals("No PIN stored", state.message) + assertEquals("No PIN stored", viewModel.uiState.value.errorMessage) } @Test fun `onForgotPin executes successfully`() = runTest { - // Given viewModel = createViewModel() whenever(forgotPinUseCase(Unit)).thenReturn(Result.success(Unit)) - // When viewModel.onForgotPin() advanceUntilIdle() - // Then - assertTrue(viewModel.uiState.value is PinState.Dismissed) + assertTrue(viewModel.uiState.value.isDismissed) } @Test fun `onForgotPin shows error when it fails`() = runTest { - // Given viewModel = createViewModel() - val error = Exception("Logout failed") - whenever(forgotPinUseCase(Unit)).thenReturn(Result.failure(error)) + whenever(forgotPinUseCase(Unit)).thenReturn(Result.failure(Exception("Logout failed"))) - // When viewModel.onForgotPin() advanceUntilIdle() - // Then - val state = viewModel.uiState.value - assertTrue(state is PinState.Error) - assertEquals("Logout failed", state.message) + assertEquals("Logout failed", viewModel.uiState.value.errorMessage) } @Test fun `onForgotPin uses resource provider when error message is null`() = runTest { - // Given viewModel = createViewModel() - val error = Exception() - whenever(forgotPinUseCase(Unit)).thenReturn(Result.failure(error)) + whenever(forgotPinUseCase(Unit)).thenReturn(Result.failure(Exception())) whenever(resourceProvider.getPinErrorResetFailed()).thenReturn("Failed to reset PIN") - // When viewModel.onForgotPin() advanceUntilIdle() - // Then - val state = viewModel.uiState.value - assertTrue(state is PinState.Error) - assertEquals("Failed to reset PIN", state.message) + assertEquals("Failed to reset PIN", viewModel.uiState.value.errorMessage) } @Test - fun `resetState changes state to Idle`() = + fun `resetState clears error and active flags`() = runTest { - // Given - viewModel = createViewModel() + viewModel = createViewModel(PinMode.ASK) val pin = "0000" - whenever(validatePinUseCase(ValidatePinInput(pin, 0))).thenReturn(Result.failure(PinError.Failed(attemptsLeft = 2))) + whenever(validatePinUseCase(ValidatePinInput(pin, 0))).thenReturn( + Result.failure(PinError.Failed(attemptsLeft = 2)), + ) whenever(resourceProvider.getPinErrorIncorrect()).thenReturn("Incorrect PIN") - viewModel.onPinComplete(pin, PinMode.ASK) + viewModel.onPinChanged(pin) + viewModel.onPinComplete() advanceUntilIdle() - // When viewModel.resetState() - // Then - assertEquals(PinState.Idle, viewModel.uiState.value) + val state = viewModel.uiState.value + assertNull(state.errorMessage) + assertFalse(state.isLoading) + assertFalse(state.isSuccess) + assertFalse(state.isDismissed) + assertFalse(state.isTooManyAttempts) } @Test fun `resetAttempts resets the attempt counter`() = runTest { - // Given - viewModel = createViewModel() + viewModel = createViewModel(PinMode.ASK) val pin = "0000" whenever(resourceProvider.getPinErrorIncorrect()).thenReturn("Incorrect PIN") - - // Make a failed attempt - whenever(validatePinUseCase(ValidatePinInput(pin, 0))).thenReturn(Result.failure(PinError.Failed(attemptsLeft = 2))) - viewModel.onPinComplete(pin, PinMode.ASK) + whenever(resourceProvider.getPinErrorWithAttempts("Incorrect PIN", 2)) + .thenReturn("Incorrect PIN. 2 attempts remaining") + + // First failed attempt (attempt index 0) + whenever(validatePinUseCase(ValidatePinInput(pin, 0))).thenReturn( + Result.failure(PinError.Failed(attemptsLeft = 2)), + ) + viewModel.onPinChanged(pin) + viewModel.onPinComplete() advanceUntilIdle() - // When + // Reset attempt counter viewModel.resetAttempts() - // Try again - should use attempts = 0 - whenever(validatePinUseCase(ValidatePinInput(pin, 0))).thenReturn(Result.failure(PinError.Failed(attemptsLeft = 2))) - viewModel.onPinComplete(pin, PinMode.ASK) + // Second attempt should restart from index 0 + whenever(validatePinUseCase(ValidatePinInput(pin, 0))).thenReturn( + Result.failure(PinError.Failed(attemptsLeft = 2)), + ) + viewModel.onPinChanged(pin) + viewModel.onPinComplete() advanceUntilIdle() - // Then - should still have 2 attempts left - val state = viewModel.uiState.value - assertTrue(state is PinState.Error) - assertEquals(2, state.remainingAttempts) + assertEquals("Incorrect PIN. 2 attempts remaining", viewModel.uiState.value.errorMessage) } @Test - fun `state changes are emitted correctly`() = + fun `state transitions through loading to success`() = runTest { - // Given - viewModel = createViewModel() + viewModel = createViewModel(PinMode.SET) val pin = "1234" whenever(savePinUseCase(pin)).thenReturn(Result.success(Unit)) - // When/Then - viewModel.uiState.test { - // Initial state - assertEquals(PinState.Idle, awaitItem()) - - // Trigger save - viewModel.onPinComplete(pin, PinMode.SET) - - // Loading state - assertEquals(PinState.Loading, awaitItem()) - - advanceUntilIdle() + viewModel.onPinChanged(pin) + viewModel.onPinComplete() + advanceUntilIdle() - // Success state - assertEquals(PinState.Success, awaitItem()) - } + val state = viewModel.uiState.value + assertFalse(state.isLoading) + assertTrue(state.isSuccess) } - private fun createViewModel() = + private fun createViewModel(mode: PinMode = PinMode.ASK) = PinViewModel( + mode = mode, savePinUseCase = savePinUseCase, validatePinUseCase = validatePinUseCase, forgotPinUseCase = forgotPinUseCase, From 9e28875e88639ecf05e5ee56cc5dd586f53f9326 Mon Sep 17 00:00:00 2001 From: Pablo Date: Tue, 17 Mar 2026 08:38:09 +0100 Subject: [PATCH 100/260] build: [ANDROAPP-7455] Improve Program Rule performance in forms [skip size] (#4733) * add way to skip display related actions in rules * fix rebase * fix: [ANDROAPP-7455] Improve program rules performance * fix test * fix tests * remove parameter --- .../mobileProgramRules/RulesRepository.kt | 6 +- form/build.gradle.kts | 1 + .../kotlin/org/dhis2/form/ui/FormTest.kt | 2 - .../ui/provider/inputfield/AgeProviderTest.kt | 11 - .../org/dhis2/form/data/FormRepository.kt | 3 - .../org/dhis2/form/data/FormRepositoryImpl.kt | 16 +- .../main/java/org/dhis2/form/di/Injector.kt | 4 +- .../java/org/dhis2/form/model/FormSection.kt | 2 +- form/src/main/java/org/dhis2/form/ui/Form.kt | 15 +- .../main/java/org/dhis2/form/ui/FormView.kt | 43 +-- .../java/org/dhis2/form/ui/FormViewModel.kt | 75 ++--- .../org/dhis2/form/ui/FormViewModelFactory.kt | 3 + .../ui/provider/inputfield/AgeProvider.kt | 13 +- .../provider/inputfield/CheckBoxProvider.kt | 7 +- .../inputfield/CoordinatesProvider.kt | 9 +- .../ui/provider/inputfield/FieldProvider.kt | 10 - .../provider/inputfield/ImageInputProvider.kt | 9 +- .../provider/inputfield/InputFileProvider.kt | 5 +- .../inputfield/RadioButtonProvider.kt | 7 +- form/src/main/res/values/strings.xml | 1 - .../form/integration/ProgramRulesTest.kt | 301 +++++++++--------- .../dhis2/form/ui/DataEntryIntegrationTest.kt | 240 +++++++------- .../org/dhis2/form/ui/FormViewModelTest.kt | 10 +- 23 files changed, 371 insertions(+), 422 deletions(-) diff --git a/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RulesRepository.kt b/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RulesRepository.kt index ad8d50388a1..2274b85a44f 100644 --- a/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RulesRepository.kt +++ b/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RulesRepository.kt @@ -68,9 +68,9 @@ class RulesRepository( ?.programStage() } - return queryRules(programUid).toRuleList().filter { - it.programStage == null || it.programStage == programStage - } + return queryRules(programUid) + .filter { it.programStage() == null || it.programStage()?.uid() == programStage } + .toRuleList() } suspend fun ruleVariables(programUid: String): List = diff --git a/form/build.gradle.kts b/form/build.gradle.kts index cd63a9bcdf5..97deb6fcfc0 100644 --- a/form/build.gradle.kts +++ b/form/build.gradle.kts @@ -67,6 +67,7 @@ dependencies { implementation(libs.androidx.activity.compose) testImplementation(libs.bundles.form.test) testImplementation(libs.test.junit) + testImplementation(libs.test.turbine) androidTestImplementation(libs.test.compose.ui.test) androidTestImplementation(libs.test.mockitoCore) androidTestImplementation(libs.test.mockitoKotlin) diff --git a/form/src/androidTest/kotlin/org/dhis2/form/ui/FormTest.kt b/form/src/androidTest/kotlin/org/dhis2/form/ui/FormTest.kt index 5153e9dfe2c..aa44b59425c 100644 --- a/form/src/androidTest/kotlin/org/dhis2/form/ui/FormTest.kt +++ b/form/src/androidTest/kotlin/org/dhis2/form/ui/FormTest.kt @@ -10,7 +10,6 @@ import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.mobile.ui.designsystem.component.SectionState import org.junit.Rule import org.junit.Test -import org.mockito.Mockito.mock class FormTest { @@ -75,7 +74,6 @@ class FormTest { sections = sections, intentHandler = {}, uiEventHandler = {}, - resources = mock(), ) } composeTestRule.onNodeWithTag(FORM_VIEW).assertIsDisplayed() diff --git a/form/src/androidTest/kotlin/org/dhis2/form/ui/provider/inputfield/AgeProviderTest.kt b/form/src/androidTest/kotlin/org/dhis2/form/ui/provider/inputfield/AgeProviderTest.kt index f2435faa967..b7ff3d891b8 100644 --- a/form/src/androidTest/kotlin/org/dhis2/form/ui/provider/inputfield/AgeProviderTest.kt +++ b/form/src/androidTest/kotlin/org/dhis2/form/ui/provider/inputfield/AgeProviderTest.kt @@ -10,8 +10,6 @@ import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performTextInput import androidx.compose.ui.test.printToLog -import androidx.test.platform.app.InstrumentationRegistry -import org.dhis2.form.di.Injector import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.mobile.ui.designsystem.component.InputStyle import org.junit.Rule @@ -19,8 +17,6 @@ import org.junit.Test class AgeProviderTest { - private val resourceManager = - Injector.provideResourcesManager(InstrumentationRegistry.getInstrumentation().getContext()) companion object { @@ -56,7 +52,6 @@ class AgeProviderTest { inputStyle = InputStyle.DarkInputStyle(), fieldUiModel = dateValueTypeFieldUiModel, intentHandler = {}, - resources = resourceManager, onNextClicked = {}, ) } @@ -75,7 +70,6 @@ class AgeProviderTest { inputStyle = InputStyle.DarkInputStyle(), fieldUiModel = dateValueTypeFieldUiModel, intentHandler = {}, - resources = resourceManager, onNextClicked = { }, ) } @@ -94,7 +88,6 @@ class AgeProviderTest { inputStyle = InputStyle.DarkInputStyle(), fieldUiModel = dateValueTypeFieldUiModel, intentHandler = {}, - resources = resourceManager, onNextClicked = {}, ) } @@ -115,7 +108,6 @@ class AgeProviderTest { inputStyle = InputStyle.DarkInputStyle(), fieldUiModel = dateValueTypeFieldUiModel, intentHandler = {}, - resources = resourceManager, onNextClicked = {}, ) @@ -137,7 +129,6 @@ class AgeProviderTest { inputStyle = InputStyle.DarkInputStyle(), fieldUiModel = dateValueTypeFieldUiModel, intentHandler = {}, - resources = resourceManager, onNextClicked = {}, ) } @@ -164,7 +155,6 @@ class AgeProviderTest { inputStyle = InputStyle.DarkInputStyle(), fieldUiModel = dateValueTypeFieldUiModel, intentHandler = {}, - resources = resourceManager, onNextClicked = {}, ) } @@ -185,7 +175,6 @@ class AgeProviderTest { inputStyle = InputStyle.DarkInputStyle(), fieldUiModel = dateValueTypeFieldUiModel, intentHandler = {}, - resources = resourceManager, onNextClicked = {}, ) } diff --git a/form/src/main/java/org/dhis2/form/data/FormRepository.kt b/form/src/main/java/org/dhis2/form/data/FormRepository.kt index dc06bc1a2f8..7955f56acf6 100644 --- a/form/src/main/java/org/dhis2/form/data/FormRepository.kt +++ b/form/src/main/java/org/dhis2/form/data/FormRepository.kt @@ -21,9 +21,6 @@ interface FormRepository { suspend fun runDataIntegrityCheck(backPressed: Boolean): DataIntegrityCheckResult fun completedFieldsPercentage(value: List): Float - - fun calculationLoopOverLimit(): Boolean - fun backupOfChangedItems(): List fun updateErrorList(action: RowAction) diff --git a/form/src/main/java/org/dhis2/form/data/FormRepositoryImpl.kt b/form/src/main/java/org/dhis2/form/data/FormRepositoryImpl.kt index fe05870549d..d120016492c 100644 --- a/form/src/main/java/org/dhis2/form/data/FormRepositoryImpl.kt +++ b/form/src/main/java/org/dhis2/form/data/FormRepositoryImpl.kt @@ -25,8 +25,6 @@ import org.hisp.dhis.android.core.common.ValueType.LONG_TEXT import org.hisp.dhis.android.core.event.EventStatus import org.hisp.dhis.rules.models.RuleEffect -private const val LOOP_THRESHOLD = 5 - class FormRepositoryImpl( private val formValueStore: FormValueStore, private val fieldErrorMessageProvider: FieldErrorMessageProvider, @@ -47,7 +45,6 @@ class FormRepositoryImpl( private var ruleEffects: List = emptyList() private var ruleEffectsResult: RuleUtilsProviderResult? = null private var runDataIntegrity: Boolean = false - private var calculationLoop: Int = 0 private var backupList: List = emptyList() private val fieldsWithOptionEffects = mutableListOf() @@ -75,7 +72,6 @@ class FormRepositoryImpl( } override suspend fun composeList(skipProgramRules: Boolean): List { - calculationLoop = 0 return itemList .applyRuleEffects(skipProgramRules) .mergeListWithErrorFields(itemsWithError) @@ -449,9 +445,6 @@ class FormRepositoryImpl( ) override fun completedFieldsPercentage(value: List): Float = completionPercentage - - override fun calculationLoopOverLimit(): Boolean = calculationLoop == LOOP_THRESHOLD - override fun backupOfChangedItems() = backupList.minus(itemList.applyRuleEffects()) private suspend fun getFieldsWithError() = @@ -528,14 +521,7 @@ class FormRepositoryImpl( } } - return if (ruleEffectsResult?.fieldsToUpdate?.isNotEmpty() == true && - calculationLoop < LOOP_THRESHOLD - ) { - calculationLoop += 1 - ArrayList(fieldMap.values).applyRuleEffects(skipProgramRules) - } else { - ArrayList(fieldMap.values) - } + return ArrayList(fieldMap.values) } private fun List.setFocusedItem(): List = diff --git a/form/src/main/java/org/dhis2/form/di/Injector.kt b/form/src/main/java/org/dhis2/form/di/Injector.kt index 87da96a7f7a..f9493c16132 100644 --- a/form/src/main/java/org/dhis2/form/di/Injector.kt +++ b/form/src/main/java/org/dhis2/form/di/Injector.kt @@ -31,6 +31,7 @@ import org.dhis2.form.model.coroutine.FormDispatcher import org.dhis2.form.ui.FieldViewModelFactory import org.dhis2.form.ui.FieldViewModelFactoryImpl import org.dhis2.form.ui.FormViewModelFactory +import org.dhis2.form.ui.mapper.FormSectionMapper import org.dhis2.form.ui.provider.AutoCompleteProviderImpl import org.dhis2.form.ui.provider.DisplayNameProviderImpl import org.dhis2.form.ui.provider.EnrollmentFormLabelsProvider @@ -67,6 +68,7 @@ object Injector { provideDispatchers(), openErrorLocation, provideFormResultDialogProvider(context), + FormSectionMapper(), ) private fun provideFormResultDialogProvider(context: Context) = @@ -241,7 +243,7 @@ object Injector { private fun provideNetworkUtils(context: Context) = NetworkUtils(context) - fun provideResourcesManager(context: Context) = + private fun provideResourcesManager(context: Context) = ResourceManager( context, provideColorUtils(), diff --git a/form/src/main/java/org/dhis2/form/model/FormSection.kt b/form/src/main/java/org/dhis2/form/model/FormSection.kt index 093db60ac6a..6543f3045ab 100644 --- a/form/src/main/java/org/dhis2/form/model/FormSection.kt +++ b/form/src/main/java/org/dhis2/form/model/FormSection.kt @@ -8,7 +8,7 @@ data class FormSection( val description: String? = null, val state: SectionState, val fields: List, - var warningMessage: Int? = null, + val warningMessage: Int? = null, val completeFields: Int = 0, val totalFields: Int = 0, val warnings: Int = 0, diff --git a/form/src/main/java/org/dhis2/form/ui/Form.kt b/form/src/main/java/org/dhis2/form/ui/Form.kt index cedc99d03b9..d9cc15a9ff3 100644 --- a/form/src/main/java/org/dhis2/form/ui/Form.kt +++ b/form/src/main/java/org/dhis2/form/ui/Form.kt @@ -26,8 +26,8 @@ import androidx.compose.ui.focus.FocusManager import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.testTag +import androidx.compose.ui.res.stringResource import kotlinx.coroutines.launch -import org.dhis2.commons.resources.ResourceManager import org.dhis2.form.R import org.dhis2.form.model.FieldUiModel import org.dhis2.form.model.FormSection @@ -46,7 +46,6 @@ fun Form( sections: List = emptyList(), intentHandler: (FormIntent) -> Unit, uiEventHandler: (RecyclerViewUiEvents) -> Unit, - resources: ResourceManager, ) { val scrollState = rememberLazyListState() val focusManager = LocalFocusManager.current @@ -77,7 +76,8 @@ fun Form( bottomStart = Spacing.Spacing0, bottomEnd = Spacing.Spacing0, ), - ).clickable( + ) + .clickable( interactionSource = remember { MutableInteractionSource() @@ -118,7 +118,7 @@ fun Form( state = section.state, errorCount = section.errors, warningCount = section.warnings, - warningMessage = section.warningMessage?.let { resources.getString(it) }, + warningMessage = section.warningMessage?.let { stringResource(it) }, onNextSection = onNextSection, onSectionClick = { intentHandler.invoke(FormIntent.OnSection(section.uid)) @@ -132,7 +132,6 @@ fun Form( fieldUiModel = fieldUiModel, uiEventHandler = uiEventHandler, intentHandler = intentHandler, - resources = resources, focusManager = focusManager, onNextClicked = { manageOnNextEvent( @@ -164,7 +163,7 @@ fun Form( } } if (shouldDisplayNoFieldsWarning(sections)) { - NoFieldsWarning(resources) + NoFieldsWarning() } } @@ -190,7 +189,7 @@ fun shouldDisplayNoFieldsWarning(sections: List): Boolean = } @Composable -fun NoFieldsWarning(resources: ResourceManager) { +fun NoFieldsWarning() { Column( modifier = Modifier @@ -201,7 +200,7 @@ fun NoFieldsWarning(resources: ResourceManager) { Modifier .clip(shape = RoundedCornerShape(Radius.Full)) .background(SurfaceColor.WarningContainer), - text = resources.getString(R.string.form_without_fields), + text = stringResource(R.string.form_without_fields), icon = { Icon( imageVector = Icons.Outlined.ErrorOutline, diff --git a/form/src/main/java/org/dhis2/form/ui/FormView.kt b/form/src/main/java/org/dhis2/form/ui/FormView.kt index 443da35b29d..1e57d0abb68 100644 --- a/form/src/main/java/org/dhis2/form/ui/FormView.kt +++ b/form/src/main/java/org/dhis2/form/ui/FormView.kt @@ -13,8 +13,8 @@ import android.view.ViewGroup import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue -import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue @@ -46,8 +46,8 @@ import org.dhis2.form.data.RulesUtilsProviderConfigurationError import org.dhis2.form.data.scan.ScanContract import org.dhis2.form.data.toMessage import org.dhis2.form.di.Injector -import org.dhis2.form.model.FieldUiModel import org.dhis2.form.model.FormRepositoryRecords +import org.dhis2.form.model.FormSection import org.dhis2.form.model.InfoUiModel import org.dhis2.form.model.RowAction import org.dhis2.form.model.UiRenderType @@ -193,12 +193,7 @@ class FormView : Fragment() { ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed, ) setContent { - val items by viewModel.items.observeAsState() - val sections = - items?.let { - formSectionMapper.mapFromFieldUiModelList(it) - } ?: emptyList() - + val items by viewModel.items.collectAsState(emptyList()) var resultDialogData: FormViewModel.FormActions.ShowResultDialog? by remember { mutableStateOf(null) } @@ -216,12 +211,14 @@ class FormView : Fragment() { } Form( - sections = sections, + sections = items, intentHandler = ::intentHandler, uiEventHandler = ::uiEventHandler, - resources = Injector.provideResourcesManager(context), ) + LaunchedEffect(items) { + render(items) + } resultDialogData?.let { DataEntryBottomSheet( model = it.model, @@ -267,12 +264,6 @@ class FormView : Fragment() { onItemChangeListener?.let { it(rowAction) } } - viewModel.items.observe( - viewLifecycleOwner, - ) { items -> - render(items) - } - viewModel.loading.observe( viewLifecycleOwner, ) { loading -> @@ -308,14 +299,6 @@ class FormView : Fragment() { ) { percentage -> completionListener?.invoke(percentage) } - - viewModel.calculationLoop.observe( - viewLifecycleOwner, - ) { displayLoopWarning -> - if (displayLoopWarning) { - showLoopWarning() - } - } } private fun showInfoDialog(infoUiModel: InfoUiModel) { @@ -330,15 +313,6 @@ class FormView : Fragment() { ).show() } - private fun showLoopWarning() { - MaterialAlertDialogBuilder(requireContext(), R.style.DhisMaterialDialog) - .setTitle(getString(R.string.program_rules_loop_warning_title)) - .setMessage(getString(R.string.program_rules_loop_warning_message)) - .setPositiveButton(R.string.action_accept) { _, _ -> } - .setCancelable(false) - .show() - } - private fun uiEventHandler(uiEvent: RecyclerViewUiEvents) { when (uiEvent) { is RecyclerViewUiEvents.RequestLocationByMap -> requestLocationByMap(uiEvent) @@ -465,10 +439,9 @@ class FormView : Fragment() { } } - private fun render(items: List) { + private fun render(items: List) { viewModel.calculateCompletedFields() viewModel.updateConfigurationErrors() - viewModel.displayLoopWarningIfNeeded() viewModel.onItemsRendered() onFieldItemsRendered?.invoke(items.isEmpty()) } diff --git a/form/src/main/java/org/dhis2/form/ui/FormViewModel.kt b/form/src/main/java/org/dhis2/form/ui/FormViewModel.kt index e1eb21e6108..5c09c57329b 100644 --- a/form/src/main/java/org/dhis2/form/ui/FormViewModel.kt +++ b/form/src/main/java/org/dhis2/form/ui/FormViewModel.kt @@ -13,11 +13,15 @@ import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.channels.consumeEach import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.receiveAsFlow +import kotlinx.coroutines.flow.shareIn import kotlinx.coroutines.launch import org.dhis2.commons.date.DateUtils import org.dhis2.commons.dialogs.bottomsheet.BottomSheetDialogUiModel @@ -49,6 +53,7 @@ import org.dhis2.form.model.ValueStoreResult import org.dhis2.form.ui.event.RecyclerViewUiEvents import org.dhis2.form.ui.idling.FormCountingIdlingResource import org.dhis2.form.ui.intent.FormIntent +import org.dhis2.form.ui.mapper.FormSectionMapper import org.dhis2.form.ui.provider.FormResultDialogProvider import org.dhis2.mobile.commons.model.CustomIntentRequestArgumentModel import org.dhis2.mobile.commons.providers.CustomIntentFailure @@ -74,6 +79,7 @@ class FormViewModel( private val geometryController: GeometryController = GeometryController(GeometryParserImpl()), private val openErrorLocation: Boolean = false, private val resultDialogUiProvider: FormResultDialogProvider, + private val formSectionMapper: FormSectionMapper, ) : ViewModel() { val loading = MutableLiveData(true) val showToast = MutableLiveData() @@ -81,8 +87,12 @@ class FormViewModel( val showInfo = MutableLiveData() val confError = MutableLiveData>() var dateFormatConfig: String = "ddMMyyyy" - private val _items = MutableLiveData>() - val items: LiveData> = _items + + private val _items = MutableSharedFlow>() + + val items = _items.map { items -> + formSectionMapper.mapFromFieldUiModelList(items) + }.shareIn(viewModelScope, SharingStarted.Eagerly, 0) var previousActionItem: RowAction? = null @@ -107,9 +117,6 @@ class FormViewModel( private val _completionPercentage = MutableLiveData() val completionPercentage = _completionPercentage - private val _calculationLoop = MutableLiveData(false) - val calculationLoop = _calculationLoop - private val pendingIntents = MutableSharedFlow() private val fieldListChannel = @@ -143,7 +150,7 @@ class FormViewModel( fieldListChannel.consumeEach { fieldListConfiguration -> FormCountingIdlingResource.increment() val result = repository.composeList(fieldListConfiguration.skipProgramRules) - _items.postValue(result) + _items.emit(result) if (fieldListConfiguration.finish) { runDataIntegrityCheck() } @@ -436,26 +443,26 @@ class FormViewModel( false } else { valueType.isNumeric || - valueType.isText && - renderType?.isPolygon() != true || - valueType == ValueType.URL || - valueType == ValueType.EMAIL || - valueType == ValueType.PHONE_NUMBER + valueType.isText && + renderType?.isPolygon() != true || + valueType == ValueType.URL || + valueType == ValueType.EMAIL || + valueType == ValueType.PHONE_NUMBER } private fun getLastFocusedTextItem() = repository.currentFocusedItem()?.takeIf { it.optionSet == null && - ( - valueTypeIsTextField( - it.valueType, - it.renderingType, - ) || - it.valueType == ValueType.AGE || - it.valueType == ValueType.DATETIME || - it.valueType == ValueType.DATE || - it.valueType == ValueType.TIME - ) + ( + valueTypeIsTextField( + it.valueType, + it.renderingType, + ) || + it.valueType == ValueType.AGE || + it.valueType == ValueType.DATETIME || + it.valueType == ValueType.DATE || + it.valueType == ValueType.TIME + ) } private fun rowActionFromIntent(intent: FormIntent): RowAction = @@ -833,7 +840,7 @@ class FormViewModel( Timber.e(e) } finally { val list = repository.composeList() - _items.postValue(list) + _items.emit(list) FormCountingIdlingResource.decrement() } } @@ -874,7 +881,7 @@ class FormViewModel( EventStatus.SCHEDULE, EventStatus.VISITED, EventStatus.OVERDUE, - -> FormActions.OnFinish + -> FormActions.OnFinish } private fun provideShowResultDialog(result: DataIntegrityCheckResult): FormActions.ShowResultDialog? = @@ -941,7 +948,9 @@ class FormViewModel( viewModelScope.launch { val result = async(dispatcher.io()) { - repository.completedFieldsPercentage(_items.value ?: emptyList()) + repository.completedFieldsPercentage( + value = _items.firstOrNull() ?: emptyList() + ) } try { _completionPercentage.postValue(result.await()) @@ -969,20 +978,6 @@ class FormViewModel( } } - fun displayLoopWarningIfNeeded() { - viewModelScope.launch { - val result = - async(dispatcher.io()) { - repository.calculationLoopOverLimit() - } - try { - _calculationLoop.postValue(result.await()) - } catch (e: Exception) { - Timber.e(e) - } - } - } - fun discardChanges() { repository.backupOfChangedItems().forEach { submitIntent( @@ -1022,10 +1017,10 @@ class FormViewModel( repository.getDateFormatConfiguration() }.await() try { - _items.postValue(result) + _items.emit(result) } catch (e: Exception) { Timber.e(e) - _items.postValue(emptyList()) + _items.emit(emptyList()) } finally { FormCountingIdlingResource.decrement() } diff --git a/form/src/main/java/org/dhis2/form/ui/FormViewModelFactory.kt b/form/src/main/java/org/dhis2/form/ui/FormViewModelFactory.kt index aecfa9def13..ec0773d9b5e 100644 --- a/form/src/main/java/org/dhis2/form/ui/FormViewModelFactory.kt +++ b/form/src/main/java/org/dhis2/form/ui/FormViewModelFactory.kt @@ -4,6 +4,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.form.data.FormRepository +import org.dhis2.form.ui.mapper.FormSectionMapper import org.dhis2.form.ui.provider.FormResultDialogProvider class FormViewModelFactory( @@ -11,6 +12,7 @@ class FormViewModelFactory( private val dispatcher: DispatcherProvider, private val openErrorLocation: Boolean, private val resultDialogUiProvider: FormResultDialogProvider, + private val formSectionMapper: FormSectionMapper, ) : ViewModelProvider.Factory { override fun create(modelClass: Class): T = FormViewModel( @@ -18,5 +20,6 @@ class FormViewModelFactory( dispatcher = dispatcher, openErrorLocation = openErrorLocation, resultDialogUiProvider = resultDialogUiProvider, + formSectionMapper = formSectionMapper, ) as T } diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/AgeProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/AgeProvider.kt index ed9ff8f3c5e..f7bae8c565b 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/AgeProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/AgeProvider.kt @@ -7,9 +7,9 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.input.TextFieldValue -import org.dhis2.commons.resources.ResourceManager import org.dhis2.form.R import org.dhis2.form.extensions.inputState import org.dhis2.form.extensions.legend @@ -34,7 +34,6 @@ fun ProvideInputAge( inputStyle: InputStyle, fieldUiModel: FieldUiModel, intentHandler: (FormIntent) -> Unit, - resources: ResourceManager, onNextClicked: () -> Unit, ) { var inputType by remember { @@ -96,11 +95,11 @@ fun ProvideInputAge( title = fieldUiModel.label, inputStyle = inputStyle, isRequired = fieldUiModel.mandatory, - dateOfBirthLabel = resources.getString(R.string.date_birth), - orLabel = resources.getString(R.string.or), - ageLabel = resources.getString(R.string.age), - cancelText = resources.getString(R.string.cancel), - acceptText = resources.getString(R.string.ok), + dateOfBirthLabel = stringResource(R.string.date_birth), + orLabel = stringResource(R.string.or), + ageLabel = stringResource(R.string.age), + cancelText = stringResource(R.string.cancel), + acceptText = stringResource(R.string.ok), selectableDates = fieldUiModel.selectableDates, ), inputType = inputType, diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/CheckBoxProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/CheckBoxProvider.kt index 5d90a72c3ed..2e920ed081a 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/CheckBoxProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/CheckBoxProvider.kt @@ -2,8 +2,8 @@ package org.dhis2.form.ui.provider.inputfield import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource import androidx.paging.compose.collectAsLazyPagingItems -import org.dhis2.commons.resources.ResourceManager import org.dhis2.form.R import org.dhis2.form.extensions.inputState import org.dhis2.form.extensions.legend @@ -77,7 +77,6 @@ internal fun ProvideYesNoCheckBoxInput( inputStyle: InputStyle, fieldUiModel: FieldUiModel, intentHandler: (FormIntent) -> Unit, - resources: ResourceManager, ) { val data = listOf( @@ -85,13 +84,13 @@ internal fun ProvideYesNoCheckBoxInput( uid = "true", checked = fieldUiModel.isAffirmativeChecked, enabled = true, - textInput = resources.getString(R.string.yes), + textInput = stringResource(R.string.yes), ), CheckBoxData( uid = "false", checked = fieldUiModel.isNegativeChecked, enabled = true, - textInput = resources.getString(R.string.no), + textInput = stringResource(R.string.no), ), ) diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/CoordinatesProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/CoordinatesProvider.kt index 7b7a677e104..8b07c757062 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/CoordinatesProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/CoordinatesProvider.kt @@ -2,7 +2,7 @@ package org.dhis2.form.ui.provider.inputfield import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import org.dhis2.commons.resources.ResourceManager +import androidx.compose.ui.res.stringResource import org.dhis2.form.R import org.dhis2.form.extensions.inputState import org.dhis2.form.extensions.legend @@ -42,7 +42,6 @@ fun ProvideInputCoordinate( fieldUiModel: FieldUiModel, intentHandler: (FormIntent) -> Unit, uiEventHandler: (RecyclerViewUiEvents) -> Unit, - resources: ResourceManager, ) { InputCoordinate( title = fieldUiModel.label, @@ -50,9 +49,9 @@ fun ProvideInputCoordinate( supportingText = fieldUiModel.supportingText(), legendData = fieldUiModel.legend(), coordinates = mapGeometry(fieldUiModel.value, FeatureType.POINT), - latitudeText = resources.getString(R.string.latitude), - longitudeText = resources.getString(R.string.longitude), - addLocationBtnText = resources.getString(R.string.add_location), + latitudeText = stringResource(R.string.latitude), + longitudeText = stringResource(R.string.longitude), + addLocationBtnText = stringResource(R.string.add_location), isRequired = fieldUiModel.mandatory, modifier = modifier, onResetButtonClicked = { diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/FieldProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/FieldProvider.kt index 07b5e50839e..4de80f0d5d8 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/FieldProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/FieldProvider.kt @@ -26,7 +26,6 @@ import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.TextFieldValue import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import org.dhis2.commons.resources.ResourceManager import org.dhis2.form.data.EventRepository.Companion.EVENT_ORG_UNIT_UID import org.dhis2.form.extensions.autocompleteList import org.dhis2.form.extensions.inputState @@ -63,7 +62,6 @@ fun FieldProvider( fieldUiModel: FieldUiModel, uiEventHandler: (RecyclerViewUiEvents) -> Unit, intentHandler: (FormIntent) -> Unit, - resources: ResourceManager, focusManager: FocusManager, onNextClicked: () -> Unit, onFileSelected: (String) -> Unit, @@ -150,7 +148,6 @@ fun FieldProvider( fieldUiModel = fieldUiModel, intentHandler = intentHandler, uiEventHandler = uiEventHandler, - resources = resources, focusRequester = focusRequester, onNextClicked = onNextClicked, focusManager = focusManager, @@ -166,7 +163,6 @@ fun ProvideByValueType( fieldUiModel: FieldUiModel, intentHandler: (FormIntent) -> Unit, uiEventHandler: (RecyclerViewUiEvents) -> Unit, - resources: ResourceManager, focusRequester: FocusRequester, onNextClicked: () -> Unit, focusManager: FocusManager, @@ -309,7 +305,6 @@ fun ProvideByValueType( ProvideInputFileResource( modifier = modifier, fieldUiModel = fieldUiModel, - resources = resources, onFileSelected = onFileSelected, uiEventHandler = uiEventHandler, ) @@ -337,7 +332,6 @@ fun ProvideByValueType( inputStyle = inputStyle, fieldUiModel = fieldUiModel, intentHandler = intentHandler, - resources = resources, ) } @@ -347,7 +341,6 @@ fun ProvideByValueType( inputStyle = inputStyle, fieldUiModel = fieldUiModel, intentHandler = intentHandler, - resources = resources, ) } } @@ -429,7 +422,6 @@ fun ProvideByValueType( fieldUiModel = fieldUiModel, intentHandler = intentHandler, uiEventHandler = uiEventHandler, - resources = resources, onFileSelected = onFileSelected, ) } @@ -451,7 +443,6 @@ fun ProvideByValueType( fieldUiModel = fieldUiModel, intentHandler = intentHandler, uiEventHandler = uiEventHandler, - resources = resources, ) } } @@ -463,7 +454,6 @@ fun ProvideByValueType( inputStyle = inputStyle, fieldUiModel = fieldUiModel, intentHandler = intentHandler, - resources = resources, onNextClicked = onNextClicked, ) } diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/ImageInputProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/ImageInputProvider.kt index b419091e208..713c1cc5d66 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/ImageInputProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/ImageInputProvider.kt @@ -12,8 +12,8 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.painter.BitmapPainter import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource import androidx.core.content.ContextCompat -import org.dhis2.commons.resources.ResourceManager import org.dhis2.form.R import org.dhis2.form.extensions.inputState import org.dhis2.form.extensions.legend @@ -32,7 +32,6 @@ import org.hisp.dhis.mobile.ui.designsystem.component.UploadState internal fun ProvideInputImage( modifier: Modifier, fieldUiModel: FieldUiModel, - resources: ResourceManager, intentHandler: (FormIntent) -> Unit, uiEventHandler: (RecyclerViewUiEvents) -> Unit, onFileSelected: (filePath: String) -> Unit, @@ -75,7 +74,7 @@ internal fun ProvideInputImage( state = fieldUiModel.inputState(), supportingText = fieldUiModel.supportingText(), legendData = fieldUiModel.legend(), - addImageBtnText = resources.getString(R.string.add_image), + addImageBtnText = stringResource(R.string.add_image), isRequired = fieldUiModel.mandatory, uploadState = uploadState, painterFor = { remember { it!! } }, @@ -113,8 +112,8 @@ internal fun ProvideInputImage( ImagePickerOptionsDialog( title = fieldUiModel.label, showImageOptions = showImageOptions, - cameraButtonLabel = resources.getString(R.string.take_photo), - galleryButtonLabel = resources.getString(R.string.from_gallery_v2), + cameraButtonLabel = stringResource(R.string.take_photo), + galleryButtonLabel = stringResource(R.string.from_gallery_v2), onDismiss = { showImageOptions = false }, onTakePicture = { if (ContextCompat.checkSelfPermission( diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/InputFileProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/InputFileProvider.kt index 87dc4266e68..7e20ff9d99d 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/InputFileProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/InputFileProvider.kt @@ -7,7 +7,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier -import org.dhis2.commons.resources.ResourceManager +import androidx.compose.ui.res.stringResource import org.dhis2.form.R import org.dhis2.form.extensions.inputState import org.dhis2.form.extensions.legend @@ -24,7 +24,6 @@ import java.text.DecimalFormat internal fun ProvideInputFileResource( modifier: Modifier, fieldUiModel: FieldUiModel, - resources: ResourceManager, onFileSelected: (filePath: String) -> Unit, uiEventHandler: (RecyclerViewUiEvents) -> Unit, ) { @@ -45,7 +44,7 @@ internal fun ProvideInputFileResource( title = fieldUiModel.label, inputShellState = fieldUiModel.inputState(), supportingText = fieldUiModel.supportingText(), - buttonText = resources.getString(R.string.add_file), + buttonText = stringResource(R.string.add_file), uploadFileState = uploadState, fileName = file?.name, fileWeight = file?.length()?.let { fileSizeLabel(it) }, diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/RadioButtonProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/RadioButtonProvider.kt index 5769e35abc8..d0cb1b28b11 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/RadioButtonProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/RadioButtonProvider.kt @@ -2,8 +2,8 @@ package org.dhis2.form.ui.provider.inputfield import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource import androidx.paging.compose.collectAsLazyPagingItems -import org.dhis2.commons.resources.ResourceManager import org.dhis2.form.R import org.dhis2.form.extensions.inputState import org.dhis2.form.extensions.legend @@ -76,7 +76,6 @@ internal fun ProvideYesNoRadioButtonInput( inputStyle: InputStyle, fieldUiModel: FieldUiModel, intentHandler: (FormIntent) -> Unit, - resources: ResourceManager, ) { val data = listOf( @@ -84,13 +83,13 @@ internal fun ProvideYesNoRadioButtonInput( uid = "true", selected = fieldUiModel.isAffirmativeChecked, enabled = true, - textInput = resources.getString(R.string.yes), + textInput = stringResource(R.string.yes), ), RadioButtonData( uid = "false", selected = fieldUiModel.isNegativeChecked, enabled = true, - textInput = resources.getString(R.string.no), + textInput = stringResource(R.string.no), ), ) diff --git a/form/src/main/res/values/strings.xml b/form/src/main/res/values/strings.xml index dbb9e7fa1de..d6a292f9f03 100644 --- a/form/src/main/res/values/strings.xml +++ b/form/src/main/res/values/strings.xml @@ -61,7 +61,6 @@ Camera permission is denied.\nYou need to enable it to use this feature. Close Program rules warning - There is a configuration issue causing a loop in the rules. Contact you administrator. Copied No info for this field Take Photo diff --git a/form/src/test/java/org/dhis2/form/integration/ProgramRulesTest.kt b/form/src/test/java/org/dhis2/form/integration/ProgramRulesTest.kt index e82111ac419..252ec89ee86 100644 --- a/form/src/test/java/org/dhis2/form/integration/ProgramRulesTest.kt +++ b/form/src/test/java/org/dhis2/form/integration/ProgramRulesTest.kt @@ -2,6 +2,7 @@ package org.dhis2.form.integration import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.databinding.ObservableField +import app.cash.turbine.test import io.reactivex.Flowable import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers @@ -31,6 +32,7 @@ import org.dhis2.form.model.StoreResult import org.dhis2.form.model.ValueStoreResult import org.dhis2.form.ui.FormViewModel import org.dhis2.form.ui.intent.FormIntent +import org.dhis2.form.ui.mapper.FormSectionMapper import org.dhis2.form.ui.provider.FormResultDialogProvider import org.dhis2.mobileProgramRules.RuleEngineHelper import org.hisp.dhis.android.core.D2 @@ -110,10 +112,10 @@ class ProgramRulesTest { } whenever(formValueStore.save(any(), anyOrNull(), anyOrNull())) doReturn - StoreResult( - "", - ValueStoreResult.VALUE_CHANGED, - ) + StoreResult( + "", + ValueStoreResult.VALUE_CHANGED, + ) repository = FormRepositoryImpl( @@ -142,6 +144,7 @@ class ProgramRulesTest { }, geometryController, resultDialogUiProvider = resultDialogUiProvider, + formSectionMapper = FormSectionMapper(), ) testingDispatcher.scheduler.advanceUntilIdle() @@ -158,17 +161,17 @@ class ProgramRulesTest { fun `Should assign a value`() = runTest { whenever(ruleEngineHelper.evaluate()) doReturn - listOf( - RuleEffect( - "", - RuleAction( - "assignedValue", - ProgramRuleActionType.ASSIGN.name, - mutableMapOf(Pair("field", "uid001")), + listOf( + RuleEffect( + "", + RuleAction( + "assignedValue", + ProgramRuleActionType.ASSIGN.name, + mutableMapOf(Pair("field", "uid001")), + ), + "newValue", ), - "newValue", - ), - ) + ) val intent = FormIntent.OnSave( @@ -177,12 +180,13 @@ class ProgramRulesTest { valueType = ValueType.TEXT, ) - formViewModel.submitIntent(intent) - advanceUntilIdle() + formViewModel.items.test { + formViewModel.submitIntent(intent) + val items = awaitItem() - val items = formViewModel.items.value ?: emptyList() + assert(items.find { it -> it.fields.find { field -> field.uid == "uid001" }?.value == "newValue" } != null) + } - assert(items.find { it.uid == "uid001" }?.value == "newValue") } @OptIn(ExperimentalCoroutinesApi::class) @@ -190,19 +194,19 @@ class ProgramRulesTest { fun `Should hide field`() = runTest { whenever(ruleEngineHelper.evaluate()) doReturn - listOf( - RuleEffect( - "ruleUid", - RuleAction( - "data", - ProgramRuleActionType.HIDEFIELD.name, - mutableMapOf( - "content" to "content", - "field" to "uid001", + listOf( + RuleEffect( + "ruleUid", + RuleAction( + "data", + ProgramRuleActionType.HIDEFIELD.name, + mutableMapOf( + "content" to "content", + "field" to "uid001", + ), ), ), - ), - ) + ) val intent = FormIntent.OnSave( @@ -211,15 +215,17 @@ class ProgramRulesTest { valueType = ValueType.TEXT, ) - formViewModel.submitIntent(intent) - advanceUntilIdle() - - val items = formViewModel.items.value ?: emptyList() + formViewModel.items.test { + formViewModel.submitIntent(intent) + val sections = awaitItem() - items.forEach { - assert(it.uid != "uid001") + sections.forEach { + assert(it.fields.size == 6) + it.fields.forEach { field -> + assert(field.uid != "uid001") + } + } } - assert(items.size == 6) } @OptIn(ExperimentalCoroutinesApi::class) @@ -227,20 +233,20 @@ class ProgramRulesTest { fun `Should hide section`() = runTest { whenever(ruleEngineHelper.evaluate()) doReturn - listOf( - RuleEffect( - "ruleUid", - RuleAction( - "data", - ProgramRuleActionType.HIDESECTION.name, - mutableMapOf( - "content" to "content", - "programStageSection" to "section1", + listOf( + RuleEffect( + "ruleUid", + RuleAction( + "data", + ProgramRuleActionType.HIDESECTION.name, + mutableMapOf( + "content" to "content", + "programStageSection" to "section1", + ), ), + "data", ), - "data", - ), - ) + ) val intent = FormIntent.OnSave( @@ -249,16 +255,18 @@ class ProgramRulesTest { valueType = ValueType.TEXT, ) - formViewModel.submitIntent(intent) - advanceUntilIdle() + formViewModel.items.test { + formViewModel.submitIntent(intent) + val sections = awaitItem() - val items = formViewModel.items.value ?: emptyList() + assert(sections.size == 1) + assertTrue(sections.first().fields.size == 4) + assertTrue(sections.first().fields[0].uid == "uid004") + assertTrue(sections.first().fields[1].uid == "uid005") + assertTrue(sections.first().fields[2].uid == "uid006") + assertTrue(sections.first().fields[3].uid == "uid007") + } - assertTrue(items.size == 4) - assertTrue(items[0].uid == "uid004") - assertTrue(items[1].uid == "uid005") - assertTrue(items[2].uid == "uid006") - assertTrue(items[3].uid == "uid007") } @OptIn(ExperimentalCoroutinesApi::class) @@ -266,32 +274,32 @@ class ProgramRulesTest { fun `Should show warning and error message`() = runTest { whenever(ruleEngineHelper.evaluate()) doReturn - listOf( - RuleEffect( - "ruleUid", - RuleAction( - "data", - ProgramRuleActionType.SHOWWARNING.name, - mutableMapOf( - "content" to "content", - "field" to "uid002", + listOf( + RuleEffect( + "ruleUid", + RuleAction( + "data", + ProgramRuleActionType.SHOWWARNING.name, + mutableMapOf( + "content" to "content", + "field" to "uid002", + ), ), + "warning message", ), - "warning message", - ), - RuleEffect( - "ruleUid2", - RuleAction( - "data", - ProgramRuleActionType.SHOWERROR.name, - mutableMapOf( - "content" to "content", - "field" to "uid005", + RuleEffect( + "ruleUid2", + RuleAction( + "data", + ProgramRuleActionType.SHOWERROR.name, + mutableMapOf( + "content" to "content", + "field" to "uid005", + ), ), + "error message", ), - "error message", - ), - ) + ) val intent = FormIntent.OnSave( @@ -300,19 +308,21 @@ class ProgramRulesTest { valueType = ValueType.TEXT, ) - formViewModel.submitIntent(intent) - advanceUntilIdle() - - val items = formViewModel.items.value ?: emptyList() - - items.forEach { - if (it.uid == "uid002") { - assertNotNull(it.warning) - assertEquals(it.warning, "content warning message") - } - if (it.uid == "uid005") { - assertNotNull(it.error) - assertEquals(it.error, "content error message") + formViewModel.items.test { + formViewModel.submitIntent(intent) + + val sections = awaitItem() + assertTrue(sections.size == 1) + + sections.first().fields.forEach { + if (it.uid == "uid002") { + assertNotNull(it.warning) + assertEquals(it.warning, "content warning message") + } + if (it.uid == "uid005") { + assertNotNull(it.error) + assertEquals(it.error, "content error message") + } } } } @@ -322,20 +332,20 @@ class ProgramRulesTest { fun `Should set mandatory field`() = runTest { whenever(ruleEngineHelper.evaluate()) doReturn - listOf( - RuleEffect( - "ruleUid", - RuleAction( - "data", - ProgramRuleActionType.SETMANDATORYFIELD.name, - mutableMapOf( - "content" to "content", - "field" to "uid003", + listOf( + RuleEffect( + "ruleUid", + RuleAction( + "data", + ProgramRuleActionType.SETMANDATORYFIELD.name, + mutableMapOf( + "content" to "content", + "field" to "uid003", + ), ), + "data", ), - "data", - ), - ) + ) val intent = FormIntent.OnSave( @@ -344,16 +354,17 @@ class ProgramRulesTest { valueType = ValueType.TEXT, ) - formViewModel.submitIntent(intent) - advanceUntilIdle() - - val items = formViewModel.items.value ?: emptyList() - - items.forEach { - if (it.uid == "uid003") { - assertTrue(it.mandatory) + formViewModel.items.test { + formViewModel.submitIntent(intent) + val sections = awaitItem() + assertTrue(sections.size == 1) + sections.first().fields.forEach { + if (it.uid == "uid003") { + assertTrue(it.mandatory) + } } } + } @OptIn(ExperimentalCoroutinesApi::class) @@ -361,21 +372,21 @@ class ProgramRulesTest { fun `Should show option`() = runTest { whenever(ruleEngineHelper.evaluate()) doReturn - listOf( - RuleEffect( - "ruleUid", - RuleAction( - "data", - ProgramRuleActionType.SHOWOPTIONGROUP.name, - mutableMapOf( - "content" to "content", - "field" to "uid006", - "optionGroup" to "optionGroupId", + listOf( + RuleEffect( + "ruleUid", + RuleAction( + "data", + ProgramRuleActionType.SHOWOPTIONGROUP.name, + mutableMapOf( + "content" to "content", + "field" to "uid006", + "optionGroup" to "optionGroupId", + ), ), + "data", ), - "data", - ), - ) + ) whenever( dataEntryRepository.options( @@ -394,10 +405,10 @@ class ProgramRulesTest { ) whenever(formValueStore.deleteOptionValueIfSelected(any(), any())) doReturn - StoreResult( - "uid006", - ValueStoreResult.VALUE_CHANGED, - ) + StoreResult( + "uid006", + ValueStoreResult.VALUE_CHANGED, + ) formViewModel.submitIntent(intent) advanceUntilIdle() @@ -415,21 +426,21 @@ class ProgramRulesTest { fun `Should hide option`() = runTest { whenever(ruleEngineHelper.evaluate()) doReturn - listOf( - RuleEffect( - "ruleUid", - RuleAction( - "data", - ProgramRuleActionType.HIDEOPTION.name, - mutableMapOf( - "content" to "content", - "field" to "uid007", - "option" to "Option2", + listOf( + RuleEffect( + "ruleUid", + RuleAction( + "data", + ProgramRuleActionType.HIDEOPTION.name, + mutableMapOf( + "content" to "content", + "field" to "uid007", + "option" to "Option2", + ), ), + "data", ), - "data", - ), - ) + ) whenever( dataEntryRepository.options( @@ -448,10 +459,10 @@ class ProgramRulesTest { ) whenever(formValueStore.deleteOptionValueIfSelected(any(), any())) doReturn - StoreResult( - "uid007", - ValueStoreResult.VALUE_HAS_NOT_CHANGED, - ) + StoreResult( + "uid007", + ValueStoreResult.VALUE_HAS_NOT_CHANGED, + ) formViewModel.submitIntent(intent) advanceUntilIdle() diff --git a/form/src/test/java/org/dhis2/form/ui/DataEntryIntegrationTest.kt b/form/src/test/java/org/dhis2/form/ui/DataEntryIntegrationTest.kt index a2baa1d88c9..88b11944b12 100644 --- a/form/src/test/java/org/dhis2/form/ui/DataEntryIntegrationTest.kt +++ b/form/src/test/java/org/dhis2/form/ui/DataEntryIntegrationTest.kt @@ -2,8 +2,8 @@ package org.dhis2.form.ui import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.databinding.ObservableField -import androidx.lifecycle.Observer import androidx.paging.PagingData +import app.cash.turbine.test import io.reactivex.Flowable import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -30,6 +30,7 @@ import org.dhis2.form.model.SectionUiModelImpl import org.dhis2.form.model.StoreResult import org.dhis2.form.model.ValueStoreResult import org.dhis2.form.ui.intent.FormIntent +import org.dhis2.form.ui.mapper.FormSectionMapper import org.dhis2.form.ui.provider.DisplayNameProvider import org.dhis2.form.ui.provider.FormResultDialogProvider import org.dhis2.form.ui.provider.LegendValueProvider @@ -164,140 +165,143 @@ class DataEntryIntegrationTest { geometryController = geometryController, openErrorLocation = false, resultDialogUiProvider = resultDialogUiProvider, + formSectionMapper = FormSectionMapper(), ) } @Test fun shouldAllowDataEntryCorrectly() = runTest { - val observedItems = mutableListOf>() - val observer = - Observer> { items -> - observedItems.add(items) - } - - formViewModel.items.observeForever(observer) - - val focusOnReportDateIntent = - FormIntent.OnFocus( - uid = "EVENT_REPORT_DATE_UID", - value = "", + formViewModel.items.test { + + val focusOnReportDateIntent = + FormIntent.OnFocus( + uid = "EVENT_REPORT_DATE_UID", + value = "", + ) + formViewModel.submitIntent(focusOnReportDateIntent) + + assert( + awaitItem().first().fields + .find { it.uid == "EVENT_REPORT_DATE_UID" } + ?.value + .isNullOrEmpty(), ) - formViewModel.submitIntent(focusOnReportDateIntent) - - assert( - observedItems - .last() - .find { it.uid == "EVENT_REPORT_DATE_UID" } - ?.value - .isNullOrEmpty(), - ) - - val enterReportDateIntent = - FormIntent.OnTextChange( - uid = "EVENT_REPORT_DATE_UID", - value = "2024-03-20", - valueType = ValueType.DATE, - ) - formViewModel.submitIntent(enterReportDateIntent) - - val focusOnOrgUnitIntent = - FormIntent.OnFocus( - uid = "EVENT_ORG_UNIT_UID", - value = "", - ) - formViewModel.submitIntent(focusOnOrgUnitIntent) - val enterOrgUnitIntent = - FormIntent.OnTextChange( - uid = "EVENT_ORG_UNIT_UID", - value = "g8upMTyEZGZ", - valueType = ValueType.ORGANISATION_UNIT, + val enterReportDateIntent = + FormIntent.OnTextChange( + uid = "EVENT_REPORT_DATE_UID", + value = "2024-03-20", + valueType = ValueType.DATE, + ) + formViewModel.submitIntent(enterReportDateIntent) + + val focusOnOrgUnitIntent = + FormIntent.OnFocus( + uid = "EVENT_ORG_UNIT_UID", + value = "", + ) + formViewModel.submitIntent(focusOnOrgUnitIntent) + + assert( + awaitItem().first().fields + .find { it.uid == "EVENT_REPORT_DATE_UID" }?.value == "2024-03-20", ) - formViewModel.submitIntent(enterOrgUnitIntent) - val focusOnCoordinatesIntent = - FormIntent.OnFocus( - uid = "EVENT_COORDINATE_UID", - value = "", + val enterOrgUnitIntent = + FormIntent.OnTextChange( + uid = "EVENT_ORG_UNIT_UID", + value = "g8upMTyEZGZ", + valueType = ValueType.ORGANISATION_UNIT, + ) + formViewModel.submitIntent(enterOrgUnitIntent) + + val focusOnCoordinatesIntent = + FormIntent.OnFocus( + uid = "EVENT_COORDINATE_UID", + value = "", + ) + formViewModel.submitIntent(focusOnCoordinatesIntent) + + assert( + awaitItem().first().fields + .find { it.uid == "EVENT_ORG_UNIT_UID" }?.value == "g8upMTyEZGZ", ) - formViewModel.submitIntent(focusOnCoordinatesIntent) - // Change section - formViewModel.submitIntent(FormIntent.OnSection(sectionUid = "EVENT_DATA_SECTION_UID")) - - // Focus on age - val focusOnAgeIntent = - FormIntent.OnFocus( - uid = "qrur9Dvnyt5", - value = "", - ) - formViewModel.submitIntent(focusOnAgeIntent) - - // Enter age - val enterAgeIntent = - FormIntent.OnTextChange( - uid = "qrur9Dvnyt5", - value = "20", - valueType = ValueType.AGE, + // Change section + formViewModel.submitIntent(FormIntent.OnSection(sectionUid = "EVENT_DATA_SECTION_UID")) + + awaitItem() + + // Focus on age + val focusOnAgeIntent = + FormIntent.OnFocus( + uid = "qrur9Dvnyt5", + value = "", + ) + formViewModel.submitIntent(focusOnAgeIntent) + + // Enter age + val enterAgeIntent = + FormIntent.OnTextChange( + uid = "qrur9Dvnyt5", + value = "20", + valueType = ValueType.AGE, + ) + formViewModel.submitIntent(enterAgeIntent) + + awaitItem() + + // focus on input field with legend + val focusOnLegendFieldIntent = + FormIntent.OnFocus( + uid = "INPUT_NUMBER_WITH_LEGEND_UID", + value = "", + ) + formViewModel.submitIntent(focusOnLegendFieldIntent) + + assert( + awaitItem()[1].fields + .find { it.uid == "qrur9Dvnyt5" }?.value == "20", ) - formViewModel.submitIntent(enterAgeIntent) - // focus on input field with legend - val focusOnLegendFieldIntent = - FormIntent.OnFocus( - uid = "INPUT_NUMBER_WITH_LEGEND_UID", - value = "", - ) - formViewModel.submitIntent(focusOnLegendFieldIntent) - - // enter value on input field with legend - val enterValueOnLegendFieldIntent = - FormIntent.OnTextChange( - uid = "INPUT_NUMBER_WITH_LEGEND_UID", - value = "25", - valueType = ValueType.NUMBER, + // enter value on input field with legend + val enterValueOnLegendFieldIntent = + FormIntent.OnTextChange( + uid = "INPUT_NUMBER_WITH_LEGEND_UID", + value = "25", + valueType = ValueType.NUMBER, + ) + + formViewModel.submitIntent(enterValueOnLegendFieldIntent) + + // Focus on gender + val focusOnGenderIntent = + FormIntent.OnFocus( + uid = "oZg33kd9taw", + value = "", + ) + formViewModel.submitIntent(focusOnGenderIntent) + + assert( + awaitItem()[1].fields + .find { it.uid == "INPUT_NUMBER_WITH_LEGEND_UID" } + ?.legend == legendValueItem, ) - formViewModel.submitIntent(enterValueOnLegendFieldIntent) - - // Focus on gender - val focusOnGenderIntent = - FormIntent.OnFocus( - uid = "oZg33kd9taw", - value = "", + val enterGenderIntent = + FormIntent.OnSave( + uid = "oZg33kd9taw", + value = "Female", + valueType = ValueType.MULTI_TEXT, + ) + formViewModel.submitIntent(enterGenderIntent) + + assert( + awaitItem()[1].fields + .find { it.uid == "oZg33kd9taw" }?.value == "Female", ) - formViewModel.submitIntent(focusOnGenderIntent) - - val enterGenderIntent = - FormIntent.OnSave( - uid = "oZg33kd9taw", - value = "Female", - valueType = ValueType.MULTI_TEXT, - ) - formViewModel.submitIntent(enterGenderIntent) - - assert( - observedItems.last().find { it.uid == "EVENT_REPORT_DATE_UID" }?.value == "2024-03-20", - ) - assert( - observedItems.last().find { it.uid == "EVENT_ORG_UNIT_UID" }?.value == "g8upMTyEZGZ", - ) - assert( - observedItems - .last() - .find { it.uid == "INPUT_NUMBER_WITH_LEGEND_UID" } - ?.legend == legendValueItem, - ) - assert( - observedItems.last().find { it.uid == "qrur9Dvnyt5" }?.value == "20", - ) - assert( - observedItems.last().find { it.uid == "oZg33kd9taw" }?.value == "Female", - ) - - // Clean up - formViewModel.items.removeObserver(observer) + } } private fun provideMalariaCaseRegistrationEventItems(): List { diff --git a/form/src/test/java/org/dhis2/form/ui/FormViewModelTest.kt b/form/src/test/java/org/dhis2/form/ui/FormViewModelTest.kt index d18234f3660..f10c4d96255 100644 --- a/form/src/test/java/org/dhis2/form/ui/FormViewModelTest.kt +++ b/form/src/test/java/org/dhis2/form/ui/FormViewModelTest.kt @@ -4,6 +4,7 @@ import android.content.Intent import androidx.arch.core.executor.testing.InstantTaskExecutorRule import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest @@ -16,6 +17,7 @@ import org.dhis2.form.model.FieldUiModel import org.dhis2.form.model.RowAction import org.dhis2.form.ui.event.RecyclerViewUiEvents import org.dhis2.form.ui.intent.FormIntent +import org.dhis2.form.ui.mapper.FormSectionMapper import org.dhis2.form.ui.provider.FormResultDialogProvider import org.dhis2.mobile.commons.model.CustomIntentRequestArgumentModel import org.hisp.dhis.android.core.common.ValueType @@ -37,7 +39,10 @@ class FormViewModelTest { @get:Rule val instantExecutorRule = InstantTaskExecutorRule() - private val repository: FormRepository = mock() + private val repository: FormRepository = mock { + on { runBlocking { fetchFormItems(any()) } } doReturn emptyList() + on { runBlocking { composeList(any()) } } doReturn emptyList() + } private val testingDispatcher = StandardTestDispatcher() private val dispatcher: DispatcherProvider = mock { @@ -46,6 +51,8 @@ class FormViewModelTest { private val geometryController: GeometryController = mock() private val resultDialogUiProvider: FormResultDialogProvider = mock() + private val formSectionMapper = FormSectionMapper() + private lateinit var viewModel: FormViewModel @Before @@ -58,6 +65,7 @@ class FormViewModelTest { dispatcher, geometryController, resultDialogUiProvider = resultDialogUiProvider, + formSectionMapper = formSectionMapper, ) whenever(repository.getDateFormatConfiguration()) doReturn "ddMMyyyy" } From 50b5004ad0bfb1e637caa79e1e11f60c28320358 Mon Sep 17 00:00:00 2001 From: Xavier Molloy Date: Tue, 17 Mar 2026 09:13:03 +0100 Subject: [PATCH 101/260] fix: [ANDROAPP-7539] optimize data loading in stock management (#4736) * fix: [ANDROAPP-7539] optimize data loading in stock management * fix: [ANDROAPP-7539] fix tests --- .../android/rtsm/services/StockManagerImpl.kt | 71 +++++++++++-------- .../android/rtsm/services/StockManagerTest.kt | 42 +++++++---- 2 files changed, 69 insertions(+), 44 deletions(-) diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/services/StockManagerImpl.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/services/StockManagerImpl.kt index 2333f7ec820..589d3a5bf1e 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/services/StockManagerImpl.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/services/StockManagerImpl.kt @@ -33,7 +33,6 @@ import org.hisp.dhis.android.core.trackedentity.TrackedEntityInstance import org.hisp.dhis.android.core.usecase.stock.StockUseCase import org.hisp.dhis.rules.models.RuleEffect import timber.log.Timber -import java.util.Collections class StockManagerImpl( val d2: D2, @@ -67,14 +66,14 @@ class StockManagerImpl( if (!query.name.isNullOrEmpty()) { teiRepository - .byQuery() + .byFilter(config.itemDescription) .like(query.name) .also { teiRepository = it } } if (!query.code.isNullOrEmpty()) { teiRepository - .byQuery() + .byFilter(config.itemCode) .eq(query.code) .also { teiRepository = it } } @@ -134,37 +133,29 @@ class StockManagerImpl( tei: TrackedEntityInstance, stockOnHandUid: String, ): String? { + + val activeEnrollments = + d2.enrollmentModule().enrollments().byTrackedEntityInstance().eq(tei.uid()).byStatus() + .eq(EnrollmentStatus.ACTIVE) + .blockingGetUids() + val events = d2 .eventModule() .events() - .byTrackedEntityInstanceUids(Collections.singletonList(tei.uid())) - .byDataValue(stockOnHandUid) - .like("") + .byEnrollmentUid().`in`(activeEnrollments) .byDeleted() .isFalse - .withTrackedEntityDataValues() .blockingGet() .sortForRuleEngine() - events - .filter { - d2 - .enrollmentModule() - .enrollments() - .uid(it.enrollment()) - .blockingGet() - ?.status() == EnrollmentStatus.ACTIVE - }.forEach { event -> - event.trackedEntityDataValues()?.forEach { dataValue -> - dataValue.dataElement().let { dv -> - if (dv.equals(stockOnHandUid)) { - return dataValue.value() - } - } - } + events.forEach { event -> + val dataValue = d2.trackedEntityModule().trackedEntityDataValues() + .value(event.uid(), stockOnHandUid).blockingGet() + dataValue?.let { + return it.value() } - + } return null } @@ -176,9 +167,9 @@ class StockManagerImpl( ): String { Timber.tag("EVENT_CREATION").i( "Enrollment: ${enrollment.uid()}\n" + - "Program: ${programUid}\n" + - "Stage: ${programStage.uid()}\n" + - "OU: ${facility.uid}\n", + "Program: ${programUid}\n" + + "Stage: ${programStage.uid()}\n" + + "OU: ${facility.uid}\n", ) return d2.eventModule().events().blockingAdd( EventCreateProjection @@ -210,7 +201,14 @@ class StockManagerImpl( items.forEach { entry -> getEnrollment(entry.item.id)?.let { enrollment -> - createEvent(entry, programStage, enrollment, transaction, stockUseCase, hasErrorOnComplete) + createEvent( + entry, + programStage, + enrollment, + transaction, + stockUseCase, + hasErrorOnComplete + ) } } return Single.just(Unit) @@ -310,7 +308,14 @@ class StockManagerImpl( try { Timber.i("event:$eventUid") - Timber.i("de:${getTransactionDataElement(transaction.transactionType, stockUseCase)}") + Timber.i( + "de:${ + getTransactionDataElement( + transaction.transactionType, + stockUseCase + ) + }" + ) Timber.i("data to save:${item.qty}") d2 .trackedEntityModule() @@ -355,7 +360,13 @@ class StockManagerImpl( } try { - updateStockOnHand(item, stockUseCase.programUid, transaction, eventUid, stockUseCase) + updateStockOnHand( + item, + stockUseCase.programUid, + transaction, + eventUid, + stockUseCase + ) } catch (e: Exception) { if (e is D2Error) { Timber.e(e.originalException()) diff --git a/stock-usecase/src/test/java/org/dhis2/android/rtsm/services/StockManagerTest.kt b/stock-usecase/src/test/java/org/dhis2/android/rtsm/services/StockManagerTest.kt index 004feaa75f7..bd36314e0c3 100644 --- a/stock-usecase/src/test/java/org/dhis2/android/rtsm/services/StockManagerTest.kt +++ b/stock-usecase/src/test/java/org/dhis2/android/rtsm/services/StockManagerTest.kt @@ -15,6 +15,7 @@ import org.dhis2.android.rtsm.data.models.StockEntry import org.dhis2.android.rtsm.data.models.Transaction import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.arch.repositories.filters.internal.BooleanFilterConnector +import org.hisp.dhis.android.core.arch.repositories.filters.internal.EnumFilterConnector import org.hisp.dhis.android.core.arch.repositories.filters.internal.StringFilterConnector import org.hisp.dhis.android.core.arch.repositories.`object`.ReadOnlyOneObjectRepositoryFinalImpl import org.hisp.dhis.android.core.arch.repositories.scope.RepositoryScope @@ -22,6 +23,7 @@ import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.enrollment.EnrollmentCollectionRepository import org.hisp.dhis.android.core.enrollment.EnrollmentStatus +import org.hisp.dhis.android.core.event.EventCollectionRepository import org.hisp.dhis.android.core.event.EventObjectRepository import org.hisp.dhis.android.core.event.EventStatus import org.hisp.dhis.android.core.option.Option @@ -46,7 +48,6 @@ import org.mockito.kotlin.mock import org.mockito.kotlin.times import org.mockito.kotlin.verify import org.mockito.kotlin.whenever -import java.util.Collections @OptIn(ExperimentalCoroutinesApi::class) class StockManagerTest { @@ -227,19 +228,32 @@ class StockManagerTest { } private fun mockStockOnHand() { - whenever( - d2 - .eventModule() - .events() - .byTrackedEntityInstanceUids(Collections.singletonList(any())) - .byDataValue(any()) - .like("") - .byDeleted() - .isFalse - .withTrackedEntityDataValues() - .orderByEventDate(RepositoryScope.OrderByDirection.DESC) - .blockingGet(), - ) doReturn emptyList() + // Mock enrollment chain for getStockOnHand + val enrollmentRepo1: EnrollmentCollectionRepository = mock() + val enrollmentRepo2: EnrollmentCollectionRepository = mock() + val enrollmentStatusFilter: EnumFilterConnector = mock() + val enrollmentTeiFilter: StringFilterConnector = mock() + + whenever(d2.enrollmentModule().enrollments()) doReturn enrollmentRepo1 + whenever(enrollmentRepo1.byTrackedEntityInstance()) doReturn enrollmentTeiFilter + whenever(enrollmentTeiFilter.eq("teiUid")) doReturn enrollmentRepo2 + whenever(enrollmentRepo2.byStatus()) doReturn enrollmentStatusFilter + whenever(enrollmentStatusFilter.eq(EnrollmentStatus.ACTIVE)) doReturn enrollmentRepo2 + whenever(enrollmentRepo2.blockingGetUids()) doReturn listOf("enrollmentUid") + + // Mock event chain for getStockOnHand + val eventRepo1 = mock() + val eventRepo2 = mock() + val eventRepo3 = mock() + val eventUidFilter = mock>() + val eventDeletedFilter = mock>() + + whenever(d2.eventModule().events()) doReturn eventRepo1 + whenever(eventRepo1.byEnrollmentUid()) doReturn eventUidFilter + whenever(eventUidFilter.`in`(listOf("enrollmentUid"))) doReturn eventRepo2 + whenever(eventRepo2.byDeleted()) doReturn eventDeletedFilter + whenever(eventDeletedFilter.isFalse) doReturn eventRepo3 + whenever(eventRepo3.blockingGet()) doReturn emptyList() } @Test From db543107f9f94f47840364470427f70ee6c4b6d4 Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Tue, 17 Mar 2026 12:34:48 +0100 Subject: [PATCH 102/260] fix(translations): sync translations from transifex (develop) [skip size] (#4731) * fix(translations): sync translations from transifex (develop) WARNING: This automated sync from transifex removed more lines than it added. Please check carefully before merging! * fix(translations): fix ellipsis character entities in vi and uz-rUZ strings * fix(translations): remove unnecessary backslash escapes from question marks in strings.xml * fix(translations): remove `data_sync_warning_program` string from multiple locales and fix character escaping in Spanish translation. --------- Co-authored-by: andresmr --- app/src/main/res/values-ar/strings.xml | 3 - app/src/main/res/values-cs/strings.xml | 7 +- app/src/main/res/values-en-rUS/strings.xml | 1 + app/src/main/res/values-es-rES/strings.xml | 3 - app/src/main/res/values-es/strings.xml | 3 - app/src/main/res/values-fr/strings.xml | 13 +-- app/src/main/res/values-id/strings.xml | 2 - app/src/main/res/values-km/strings.xml | 1 - app/src/main/res/values-lo/strings.xml | 3 - app/src/main/res/values-nb/strings.xml | 3 - app/src/main/res/values-nl/strings.xml | 3 - app/src/main/res/values-pt/strings.xml | 3 - app/src/main/res/values-ru/strings.xml | 3 - app/src/main/res/values-sv/strings.xml | 1 - app/src/main/res/values-uk/strings.xml | 3 - app/src/main/res/values-uz-rUZ/strings.xml | 3 - app/src/main/res/values-uz/strings.xml | 3 - app/src/main/res/values-vi/strings.xml | 5 +- app/src/main/res/values-zh-rCN/strings.xml | 3 - app/src/main/res/values-zh/strings.xml | 3 - app/src/main/res/values/strings.xml | 1 - commons/src/main/res/values-vi/strings.xml | 2 +- .../values-ar-rEG/strings.xml | 7 +- .../values-ar-rIQ/strings.xml | 7 +- .../composeResources/values-ar/strings.xml | 11 +- .../composeResources/values-ckb/strings.xml | 5 +- .../composeResources/values-cs/strings.xml | 11 +- .../composeResources/values-da/strings.xml | 5 +- .../values-en-rUS/strings.xml | 11 +- .../values-es-rES/strings.xml | 9 +- .../composeResources/values-es/strings.xml | 11 +- .../composeResources/values-fr/strings.xml | 100 +++++++++--------- .../values-hi-rIN/strings.xml | 5 +- .../composeResources/values-id/strings.xml | 5 +- .../composeResources/values-km/strings.xml | 5 +- .../composeResources/values-lo/strings.xml | 9 +- .../composeResources/values-my/strings.xml | 5 +- .../composeResources/values-nb/strings.xml | 5 +- .../composeResources/values-ne/strings.xml | 7 +- .../composeResources/values-nl/strings.xml | 9 +- .../composeResources/values-prs/strings.xml | 5 +- .../composeResources/values-ps/strings.xml | 5 +- .../values-pt-rBR/strings.xml | 5 +- .../composeResources/values-pt/strings.xml | 9 +- .../composeResources/values-ro/strings.xml | 7 +- .../composeResources/values-ru/strings.xml | 11 +- .../composeResources/values-sv/strings.xml | 5 +- .../composeResources/values-tet/strings.xml | 5 +- .../composeResources/values-tg/strings.xml | 5 +- .../composeResources/values-uk/strings.xml | 35 +++--- .../composeResources/values-ur/strings.xml | 5 +- .../values-uz-rUZ/strings.xml | 5 +- .../composeResources/values-uz/strings.xml | 7 +- .../composeResources/values-vi/strings.xml | 9 +- .../values-zh-rCN/strings.xml | 9 +- .../composeResources/values-zh/strings.xml | 11 +- form/src/main/res/values-vi/strings.xml | 2 +- .../values-ar-rIQ/strings.xml | 2 +- .../composeResources/values-ar/strings.xml | 2 +- .../composeResources/values-bn/strings.xml | 2 +- .../composeResources/values-ckb/strings.xml | 2 +- .../composeResources/values-cs/strings.xml | 12 +-- .../composeResources/values-da/strings.xml | 2 +- .../values-en-rUS/strings.xml | 2 +- .../values-es-rES/strings.xml | 2 +- .../composeResources/values-id/strings.xml | 2 +- .../composeResources/values-km/strings.xml | 2 +- .../composeResources/values-my/strings.xml | 2 +- .../composeResources/values-nb/strings.xml | 2 +- .../composeResources/values-or/strings.xml | 2 +- .../composeResources/values-prs/strings.xml | 2 +- .../composeResources/values-ps/strings.xml | 2 +- .../values-pt-rBR/strings.xml | 2 +- .../composeResources/values-ro/strings.xml | 2 +- .../composeResources/values-si/strings.xml | 2 +- .../composeResources/values-sv/strings.xml | 2 +- .../composeResources/values-tet/strings.xml | 2 +- .../composeResources/values-tg/strings.xml | 2 +- .../composeResources/values-ur/strings.xml | 2 +- .../values-uz-rUZ/strings.xml | 2 +- .../composeResources/values-uz/strings.xml | 2 +- .../values-zh-rCN/strings.xml | 2 +- .../composeResources/values-zh/strings.xml | 5 +- .../src/main/res/values-cs/strings.xml | 26 ++--- .../src/main/res/values-es/strings.xml | 10 +- .../src/main/res/values-lo/strings.xml | 5 +- .../src/main/res/values-nl/strings.xml | 16 +-- .../src/main/res/values-pt/strings.xml | 10 +- .../src/main/res/values-uz-rUZ/strings.xml | 13 ++- .../src/main/res/values-vi/strings.xml | 12 +-- .../src/main/res/values-zh/strings.xml | 16 ++- .../composeResources/values-ar/strings.xml | 4 +- .../composeResources/values-ckb/strings.xml | 2 + .../composeResources/values-cs/strings.xml | 5 +- .../values-en-rUS/strings.xml | 1 + .../values-es-rES/strings.xml | 4 +- .../composeResources/values-es/strings.xml | 5 +- .../composeResources/values-fr/strings.xml | 5 +- .../values-hi-rIN/strings.xml | 3 +- .../composeResources/values-id/strings.xml | 4 +- .../composeResources/values-km/strings.xml | 2 + .../composeResources/values-lo/strings.xml | 4 +- .../composeResources/values-my/strings.xml | 2 + .../composeResources/values-nb/strings.xml | 4 +- .../composeResources/values-nl/strings.xml | 2 +- .../composeResources/values-or/strings.xml | 5 + .../values-pt-rBR/strings.xml | 2 + .../composeResources/values-pt/strings.xml | 4 +- .../composeResources/values-ru/strings.xml | 4 +- .../composeResources/values-sv/strings.xml | 2 + .../composeResources/values-uk/strings.xml | 5 +- .../values-uz-rUZ/strings.xml | 2 +- .../composeResources/values-uz/strings.xml | 4 +- .../composeResources/values-vi/strings.xml | 4 +- .../values-zh-rCN/strings.xml | 2 + .../composeResources/values-zh/strings.xml | 8 +- 116 files changed, 337 insertions(+), 364 deletions(-) create mode 100644 tracker/src/commonMain/composeResources/values-or/strings.xml diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 795f1ac441b..14a40bf0707 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -37,7 +37,6 @@ خطأ في المزامنة حدث خطأ أثناء المزامنة. يرجى اعادة المحاولة. انتهت المزامنة ولكن لم نتلق تأكيدًا من الخادم لجميع السجلات. هذه السجلات لا تزال تحمل علامة \"غير مزامن\" في التطبيق. نوصي بإعادة محاولة المزامنة. - تحذير: تم مزامنة معظم البيانات الخاصة بك ولكن يوجد تعارضات في بعض الحقول. قم بعمل مزامنة للتكوين الخاص بك وحاول مرة أخرى. إذا استمر التحذير ، فتحقق من حالة المزامنة: يتم وضع علامة @ على البرامج و TEI والأحداث المتعارضة. حدث خطأ ولم يستجب الخادم. تواصل مع مديرك. تم العثور على %s نتيجة @@ -301,7 +300,6 @@ تحتاج إلى ادخال %d على الأقل من السمات للقيام بالبحث تحتاج إلى ادخال واحدة على الأقل من السمات للقيام بالبحث هناك أكثر من %d نتيجة. يرجى إدخال معايير بحث أخرى - لم يتم ايجاد أي نتيجة لمعايير البحث التي ادخلتها.\n راجعها أو قم بتسجيل %s جديد ادخل معايير البحث التي تريد @@ -714,7 +712,6 @@ هذا الحقل إلزامي لأسباب أمنية ، لا يُسمح باستخدام هذه النسخة من التطبيق مع adb. الرجاء استخدام نسخة هذا التطبيق المخصصة للتدريب. - للأسف! شيء ما لم يسير كما هو مخطط له.\n دعنا نعيدك إلى العمل. رجوع إغلاق التطبيق تفاصيل أكثر diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 7c95d05181f..53fc3b952ff 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -37,7 +37,6 @@ Synchronizace dokončena, ale neobdrželi jsme potvrzení serveru pro všechny záznamy. Tyto záznamy jsou v aplikaci stále označeny jako „offline“. Doporučujeme synchronizaci zopakovat. CHYBA: V procesu synchronizace se něco pokazilo. Pokud máte připojení, zkuste to prosím znovu. Pokud chyba přetrvává, obraťte se na správce. Ve vašich datech jsou rozpory. Synchronizujte prosím svou konfiguraci, zkontrolujte svá data a zkuste synchronizaci provést znovu. - UPOZORNĚNÍ: Většina vašich dat je synchronizována, ale některá pole vykazovala konflikty. Synchronizujte svou konfiguraci a zkuste to znovu. Pokud varování přetrvává, zkontrolujte jejich stav synchronizace: programy, TEI a události s konflikty jsou označeny jako @. Některá vaše data se nepodařilo synchronizovat. Došlo k chybě a server neodpovídá. Kontaktujte svého správce. @@ -311,7 +310,6 @@ Chcete-li provést vyhledávání, musíte zadat alespoň %d atributy Chcete-li provést vyhledávání, musíte zadat alespoň jeden z atributů Je toho víc než %d výsledků. Zadejte prosím další kritéria hledání - Vaše vyhledávací kritéria nevrátila žádný výsledek.\nOpravte svá kritéria nebo zapište nová %s Zadejte kritéria hledání @@ -688,9 +686,9 @@ Detaily Komentáře Uloženo! - Chcete zkontrolovat kvalitu dat? + Chcete zkontrolovat kvalitu dat\? Všechno vypadá dobře! - Chcete také vyplnit soubor dat? + Chcete také vyplnit soubor dat\? Označit jak dokončené Název Vzorec @@ -726,7 +724,6 @@ Toto pole je povinné Z bezpečnostních důvodů není možné tuto verzi aplikace používat s adb. Použijte tréninkovou verzi. - Jejda! Něco nevyšlo podle plánu. \nDáme vás zpět do akce. Zpět Zavřít aplikaci Více detailů diff --git a/app/src/main/res/values-en-rUS/strings.xml b/app/src/main/res/values-en-rUS/strings.xml index a28a6cbd146..cdfded1b7ba 100644 --- a/app/src/main/res/values-en-rUS/strings.xml +++ b/app/src/main/res/values-en-rUS/strings.xml @@ -85,4 +85,5 @@ %s details Not now Coordinates + Show less diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 15df8b14832..5efc9389b6f 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -34,7 +34,6 @@ Error en sincronizacion La sincronizacion ha fallado. Intentelo de nuevo. La sincronización ha terminado pero no se ha recibido confirmación del servidor en algunos rescursos. Éstos estarán marcados como \"no sincronizados\" en la App. Recomendamos reintentar la sincronización. - WARNING: la mayoría de sus datos se han sincronizado, pero algunos generaron conflictos. Sincronice su configuración y pruebe otra vez. Si el error persiste, revise el estado de sincronización: los programas, TEIs y events con conflictos tienen el icono @ Hubo un error y el serivdor no respondío. Contacte su administrador. %s resultados @@ -280,7 +279,6 @@ Es necesario introducir al menos %d de los atributos para iniciar una búsqueda Hay que rellenar al menos un atributo para buscar Hay más de %d resultados. Por favor, especifique más su búsqueda - Sus criterios de búsqueda no devolvieron ningún resultado. \nModifíquelos o cree una nueva %s Introduzca algún criterio de búsqueda @@ -688,7 +686,6 @@ El campo es obligatorio Por razones de seguridad, esta versión de la app no permite el uso de adb. Por favor use la versión de formación. - ¡Vaya! Algo no ha ido como estaba previsto.\nDéjenos poner todo en marcha de nuevo. Ir atrás Cerrar app Más detalles diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 8b22f556b2a..bb2fb3d0c75 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -34,7 +34,6 @@ Error en sincronizacion La sincronizacion ha fallado. Intentelo de nuevo. La sincronización ha terminado pero no se ha recibido confirmación del servidor en algunos rescursos. Éstos estarán marcados como \"no sincronizados\" en la App. Recomendamos reintentar la sincronización. - WARNING: la mayoría de sus datos se han sincronizado, pero algunos generaron conflictos. Sincronice su configuración y pruebe otra vez. Si el error persiste, revise el estado de sincronización: los programas, TEIs y events con conflictos tienen el icono @ Hubo un error y el serivdor no respondío. Contacte su administrador. %s resultados @@ -305,7 +304,6 @@ Es necesario introducir al menos %d de los atributos para iniciar una búsqueda Hay que rellenar al menos un atributo para buscar Hay más de %d resultados. Por favor, especifique más su búsqueda - Sus criterios de búsqueda no devolvieron ningún resultado. \nModifíquelos o cree una nueva %s Introduzca algún criterio de búsqueda @@ -720,7 +718,6 @@ El campo es obligatorio Por razones de seguridad, esta versión de la app no permite el uso de adb. Por favor use la versión de formación. - ¡Vaya! Algo no ha ido como estaba previsto.\nDéjenos poner todo en marcha de nuevo. Ir atrás Cerrar app Más detalles diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 9cdc56e5576..d9e83ec2069 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -34,7 +34,6 @@ Problème de synchronisation Une erreur s´est produite pendant sync. Essayez à nouveau. La synchronisation est terminée, mais nous n\'avons pas reçu de confirmation du serveur pour tous les enregistrements. Ces enregistrements sont toujours marqués comme \"hors ligne\" dans l\'application. Nous vous recommandons de réessayer la synchronisation. - AVERTISSEMENT: La plupart de vos données ont été syncrhonisées mais certains champs ont eu des conflits. Synchronisez votre configuration et ressayez, Si l\'erreur persiste, vérifiez le statut de synchronisation: les programmes, TEIs et évènements avec conflits sont marqués avec @. Une erreur s\'est produite et le serveur n\'a pas répondu. Contactez votre administrateur. %s résultats trouvé @@ -112,7 +111,7 @@ Mettre à jour Date Unités d´Organisation - Il n\'y a pas d\'Unité d\'organisation Ouvert pour la date sélectionnée. Merci de sélectionner une autre date ou une autre Unité d\'Organisation. + Il n\'y a pas d\'unité d\'organisation ouverte pour la date sélectionnée. Merci de sélectionner une autre date ou une autre unité d\'organisation. Options de catégorie Latitude Longitude @@ -286,7 +285,6 @@ Vous devez entrer au moins %d des attributs pour lancer une recherche Vous devez renseigner au moins un des attributs afin d\'effectuer la recherche il y a plus de %d des résultats. Veuillez entrer les autres critères de recherche - Vos critères de recherche ne renvoient aucun résultat.\nVérifiez-les ou créez une nouvelle inscription %s Entrez vos critères de recherche @@ -303,7 +301,7 @@ Aucune donnée Code QR invalide Cet attribut ne peut pas être ajouté - Cette inscription ne peu pas être ajoutée + Cette entité ne peut pas être enrôlée À propos Programmes disponibles pour l´admission @@ -493,7 +491,7 @@ Maintenant vous pouvez vérifier l\'information de synchronisation en cliquant ici Cette donnée est enregistrée seulement sur votre appareil et n\'a pas été synchronisée avec le serveur. Vous êtes à jour! Toutes vos données ont été envoyées au serveur. - Vous ne pouvez pas établir de relation une donnée avec elle-même + Vous ne pouvez pas établir de relation entre une donnée et elle-même Dévérouiller la session Terminer Ouvrir @@ -505,7 +503,7 @@ Hebdomadaire Semaine Paramètre de synchronisation: %s - La donnée à laquelle vous essayer d\'acceéer n\'a pas d\'enrôlement. Vous ne pouvez pas accéder au tableau de bord. + La donnée à laquelle vous essayer d\'accéder n\'a pas d\'enrôlement. Vous ne pouvez pas accéder au tableau de bord. Erreur de formattage Supprimer 1%s Vous n\'avez pas l\'autorité pour supprimer cette donnée @@ -696,7 +694,6 @@ Ce champ est obligatoire Pour des raisons de sécurité, cette version de l\'application ne peut pas être utilisée avec adb. Veuillez utiliser la version de formation. - Oups! Quelque chose ne s\'est pas déroulé comme prévu.\nLaissez-nous vous remettre en action. Précédent Fermer l\'application Plus de détails @@ -772,7 +769,7 @@ Valeurs Semaine %d %s à %s Ne pas montrer de nouveau - 1%s ne peut pas être analysé comme une date + %s ne peut pas être analysé comme une date Ce champ n\'a pas pu être mis à jour. Veuillez réessayer Disponible Ces données ne sont pas modifiables car elles sont marquées comme terminées diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 820b42c2ed8..944211ac917 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -31,7 +31,6 @@ Sync error Terjadi kesalahan saat sinkronisasi. Silakan coba kembali. - PERINGATAN: Sebagian besar data telah tersinkronisasi tapi terdapat beberapa konflik. Sinkronisasi konfigurasi Anda dan coba kembali. Jika status sinkronisasi: program, TEI, dan event yang berkonflik ditandai sebagai @. Terjadi kesalahan dan server tidak merespon. Hubungi administrator anda. %s hasil ditemukan @@ -785,7 +784,6 @@ Bidang ini wajib Untuk alasan keamanan, versi aplikasi ini tidak diizinkan untuk digunakan dengan adb. Silakan gunakan versi pelatihan. - Ups! Sesuatu tidak berjalan sesuai rencana.\nIzinkan kami mengembalikan Anda ke tindakan. Kembali Tutup aplikasi Keterangan lebih lanjut diff --git a/app/src/main/res/values-km/strings.xml b/app/src/main/res/values-km/strings.xml index 1d212968e7a..43297c9e28d 100644 --- a/app/src/main/res/values-km/strings.xml +++ b/app/src/main/res/values-km/strings.xml @@ -197,7 +197,6 @@ បន្ទាប់ អ្នកត្រូវបញ្ចូលយ៉ាងហោចណាស់ %d នៃលក្ខណៈ (Attributes) ដើម្បីធ្វើការស្វែងរក មានលទ្ធផលច្រើនជាង %d សូមបញ្ចូលលក្ខខណ្ឌផ្សេងទៀតដើម្បីស្វែងរកបន្ថែម - លក្ខខណ្ឌក្នុងការស្វែងរករបស់អ្នកមិនមានលទ្ធផល\nកំណត់លក្ខខណ្ឌម្ដងទៀត រឺ ចុះឈ្មោះថ្មី %s បញ្ចូលលក្ខខណ្ឌដើម្បីស្វែងរក diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index c6ab3e8edc6..08ec9f2f8b3 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -32,7 +32,6 @@ ຄໍາຜິດທີ່ເກີດຈາກການທໍາງານຮ່ວມກັນຂອງລະບົບ ມີຄໍາຜິດເກີດຂື້ນໃນຂະນະທີ່ລະບົບທໍາງານຮ່ວມກັນ. ກະລຸນາ, ທົດລອງເບີ່ງອີກ... ອັບເດດຂໍ້ມູນໃຫ້ຄືກັນສຳເລັດແລ້ວ ແຕ່ພວກເຮົາບໍ່ໄດ້ຮັບການຢືນຢັນຈາກເຄື່ອງຄອມພິວເຕິ້ໜ່ວຍແມ່ສຳລັບບັນທຶກທັງໝົດ. ເຫຼົ່ານັ້ນຍັງຖືກໝາຍເປັນ \"ອອບລາຍ\" ໃນແອັບ. ພວກເຮົາແນະນຳໃຫ້ລອງການຕັ້ງຄ່າການຊິ້ງຂໍ້ມູນອີກຄັ້ງ. - ຂໍ້ຄວນລະວັງ: ຂໍ້ມູນຂອງທ່ານໄດ້ຖຶກຊິ້ງແລ້ວ ແຕ່ບາງຂໍ້ມູນມີຂໍ້ຂັດແຍ້ງ. ກົດການຕັ້ງຄ່າການຊິ້ງຂໍ້ມູນ ແລະ ລອງໃໝ່ອີກຄັ້ງ. ຖ້າຂໍ້ຄວນລະວັງຍັງຄົງຢູ່ ໃຫ້ກວດເບີ່ງສະຖານະການຊິິ້ງຂອງ: ໂປຣແກຣມ, TEI\'s ແລະ ເຫດການທີ່ມີການຂັດແຍ້ງຈະຖຶກໝາຍເປັນ @. ເກີດຂໍ້ຜິດພາດ ແລະເຄື່ອງຄອມພິວເຕິ້ໜ່ວຍແມ່ບໍ່ຕອບສະໜອງ. ຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ. %sຜົນໄດ້ຮັບທີ່ຖືກພົບເຫັນ @@ -288,7 +287,6 @@ ທ່ານຕ້ອງປ້ອນຢ່າງໜອຍ %d ຂອງ ຄຸນລັກສະນະເຂົ້າເພື່ອຊອກຫາ ທ່ານຕ້ອງໃສ່ຢ່າງຫນ້ອຍຫນຶ່ງ ຂອງຄຸນລັກສະນະເພື່ອເຮັດການຄົ້ນຫາ ມີຫຼາຍກ່ວາ %d ຂອງຜົນໄດ້ຮັບ. ກະລຸນາເພີ່ມເງື່ອນໄຂໃນການຄົ້ນຫາເຂົ້າຕື່ມ - ເງື່ອນໄຂການຄົ້ນຫາຂອງທ່ານບໍ່ໄດ້ຜົນຫຍັງກັບຄືນມາໃ\nທົບທວນເບີ່ງເງື່ອນໄຂຂອງທ່ານ ຫຼື ຂື້ນທະບຽນໃໝ່ %s ປ້ອນເງື່ອນໄຂການຊອກຫາຂອງທ່ານ @@ -688,7 +686,6 @@ ຊ່ອງປ້ອນຂໍ້ມູນນີ້ແມ່ນຈໍາເປັນຕ້ອງປ້ອນຂໍ້ມູນໃສ່ ເຫດຜົນດ້ານຄວາມປອດໄພ, ແອັບເວີຊັ່ນນີ້ບໍ່ອະນຸຍາດໃຫ້ໃຊ້ກັບ adb. ກະລຸນາໃຊ້ເວີຊັ່ນທີ່ໃຊ້ສະເພາະການຝຶກອົບຮົມ. - ມີບາງຢ່າງບໍ່ເປັນໄປຕາມແຜນທີ່ວາງໄວ້.\nໃຫ້ພວກເຮົານຳທ່ານກັບມາເພື່ອດຳເນີນການຄືນ. ກັບຄືນ ປິດແອັບ ລາຍ​ລະ​ອຽດ​ເພີ່ມ​ເຕີມ diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index f37faac1a69..608ab50834e 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -32,7 +32,6 @@ Synkroniseringsfeil En feil har oppstått under synkronisering. Vennligst prøv på nytt - ADVARSEL: Mesteparten av dine data er synkroniserte men noen felter presenterte konflinkter. Synkroniser din konfigurasjon og prøv igjen. Hvis advarselen vedvarer, sjekk deres synkroniseringsstatus: programmer, TEI\'s og hendelser med konflikter er merket som @. %sresultater funnet Legg til ny Legg til @@ -275,7 +274,6 @@ Du må legge inn minst %dav attributtene for å foreta et søk Du må legge inn minst en av attributtene for å foreta et søk Det er mer enn%dresultater. Vennligst legg inn flere søkekriterier - Ditt søkekriterie returnerte ingen resultater.\nRevurder dine kriterier eller registrer en ny%s Skriv inn søkekriterier @@ -676,7 +674,6 @@ Dette feltet er obligatorisk Av sikkerhetsgrunner, så er denne versjonen av appen ikke tillatt til å bli brukt med adb. Vennligst bruk treningsversjonen. - Beklager! Noe gikk ikke som planlagt. La oss få deg tilbake i aksjon. Gå tilbake Lukk app Flere detaljer diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 0a62a1985e0..7975fc4772d 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -33,7 +33,6 @@ Synchronisatiefout Er is een fout opgetreden tijdens de synchronisatie. Probeer het opnieuw. De synchronisatie is voltooid, maar we hebben geen serverbevestiging ontvangen voor alle records. Die gegevens zijn nog steeds gemarkeerd als \"offline\" in de app. We raden aan om de synchronisatie opnieuw te proberen. - WAARSCHUWING: de meeste van uw gegevens zijn gesynchroniseerd, maar sommige velden leverden problemen op. Synchroniseer uw configuratie en probeer het opnieuw. Als de waarschuwing aanhoudt, controleer dan hun synchronisatiestatus: programma\'s, TEI\'s en gebeurtenissen met conflicten zijn gemarkeerd als @. Er is een fout opgetreden en de server heeft niet gereageerd. Neem contact op met uw beheerder. %s resultaten gevonden @@ -283,7 +282,6 @@ U moet minimaal %d van de attributen invoeren om een zoekopdracht uit te voeren U moet ten minste één van de kenmerken invoeren om een zoekopdracht uit te voeren Er zijn meer dan %d resultaten. Vul a.u.b. verdere zoekcriteria in - Uw zoekcriteria hebben geen resultaat opgeleverd.\nHerzie uw criteria of schrijf een nieuwe %s in Voer uw zoekcriteria in @@ -694,7 +692,6 @@ Dit veld is verplicht Om veiligheidsredenen mag deze versie van de app niet worden gebruikt met adb. Gebruik de trainingsversie. - Oeps! Er is iets niet gegaan zoals gepland.\nLaat ons je weer aan het werk helpen. Ga terug App sluiten Meer details diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index d3ab2b35547..fe689450992 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -34,7 +34,6 @@ Erro de sincronização Ocorreu um erro durante a sincronização. Por favor tente novamente. A sincronização foi concluída, mas não recebemos a confirmação do servidor para todos os registos. Esses registos ainda estão marcados como “offline” na aplicação. Recomendamos que tente novamente a sincronização. - AVISO: A maioria dos seus dados é sincronizada, mas alguns campos apresentaram conflitos. Sincronize sua configuração e tente novamente. Se o aviso persistir, verifique o status de sincronização: programas, TEIs e eventos com conflitos são marcados como @. Ocorreu um erro e o servidor não respondeu. Contacte o seu administrador. %s resultados encontrados @@ -303,7 +302,6 @@ Você precisa inserir pelo menos %d dos atributos para fazer uma pesquisa Você precisa inserir pelo menos um dos atributos para fazer uma pesquisa Há mais de %d resultados. Digite mais critérios de pesquisa - Seus critérios de pesquisa não retornaram nenhum resultado.\nReveja seus critérios ou inscreva um novo %s Digite seu critério de pesquisa @@ -717,7 +715,6 @@ Este campo é obrigatório Por razões de segurança, esta versão do aplicativo não pode ser usada com o adb. Por favor, use a versão de treinamento. - Ops! Algo não saiu como planejado.\nDeixe-nos colocar você de volta em ação. Voltar Fechar aplicativo Mais detalhes diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index f24f2038586..dd8681952be 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -35,7 +35,6 @@ Ошибка синхронизации Во время синхронизации произошла ошибка. Пожалуйста, повторите попытку. Синхронизация завершена, но мы не получили подтверждения сервера для всех записей. Эти записи по-прежнему отмечены в приложении как \"оффлайн\". Мы рекомендуем повторить синхронизацию. - ВНИМАНИЕ: Большая часть данных синхронизирована, но некоторые поля представлены с конфликтами. Синхронизируйте конфигурацию и повторите попытку. Если предупреждение сохраняется, проверьте статус синхронизации: программы, отслеживаемые объекты и события с конфликтами отмечены как @. Произошла ошибка, и сервер не ответил. Обратитесь к своему администратору. %s результатов найдено @@ -297,7 +296,6 @@ Для поиска необходимо ввести как минимум %d атрибутов. Чтобы выполнить поиск, необходимо ввести хотя бы один из атрибутов Есть больше, чем %d результатов. Пожалуйста, введите дополнительные критерии поиска - Ваши критерии поиска не дали результатов.Пересмотрите свои критерии или введите новые %s Введите критерии поиска @@ -689,7 +687,6 @@ Это поле обязательно для заполнения По соображениям безопасности эта версия приложения не может быть использована с adb. Пожалуйста, используйте учебную версию. - Упс! Что-то пошло не по плану. Позвольте нам вернуть Вас назад в действии. Вернуться Закрыть приложение Подробнее diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index b60cf960f3b..476e7c3003e 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -196,7 +196,6 @@ Nästa Du måste ange minst %d av attributen för att göra en sökning Det finns mer än %d resultat. Vänligen ange ytterligare sökkriterier - Dina sökvillkor gav inget resultat\nÄndra dina kriterier eller registrera en ny %s Definiera sökkriterier diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 5d026635f3f..aa67ed0f9a5 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -35,7 +35,6 @@ Помилка синхронізації Під час синхронізації сталася помилка. Будь ласка, повторіть спробу. Синхронізацію завершено, але ми не отримали підтвердження від серверу для усіх записів. Ці записи все ще позначено як \"офлайн\" у програмі. Рекомендуємо повторити спробу синхронізації. - ПОПЕРЕДЖЕННЯ: Більшість Ваших даних синхронізовано, але виникли конфлікти в деяких полях. Синхронізуйте конфігурацію та повторіть спробу. Якщо попередження не зникає, перевірте стан синхронізації: програм, об’єктів, які відстежуються та випадків з конфліктами позначені як @. Сталася помилка, і сервер не відповідає. Зверніться до свого адміністратора. %s результатів знайдено @@ -296,7 +295,6 @@ Для пошуку потрібно ввести принаймні %d атрибутів Для пошуку потрібно ввести принаймні один із атрибутів Є більше ніж %d результатів. Будь ласка, введіть додаткові критерії пошуку - Ваші критерії пошуку не дали результатів.Перегляньте свої критерії або зареєструйте новий %s Введіть критерії пошуку @@ -706,7 +704,6 @@ Це поле обов\'язкове для заповнення З міркувань безпеки цю версію додатку не можна використовувати з adb. Будь ласка, використовуйте навчальну версію. - Ой! Щось пішло не так, як планувалося. Дозвольте нам повернути Вас у попередню дію. Повернутися Закрити додаток Детальніше diff --git a/app/src/main/res/values-uz-rUZ/strings.xml b/app/src/main/res/values-uz-rUZ/strings.xml index 81af89fe43f..c451ecc3382 100644 --- a/app/src/main/res/values-uz-rUZ/strings.xml +++ b/app/src/main/res/values-uz-rUZ/strings.xml @@ -26,7 +26,6 @@ Sinxronlashda xatolik Sinxronlash paytida xatolik yuz berdi. Iltimos, qayta urinib koʼring - OGOHLАNTIRISh: Maʼlumotlarning aksariyat qismi sinxronlashtirildi. Lekin, baʼzi ziddiyatlar kelib chiqdi. Konfiguratsiyani sinxronlang va qaytadan urinib koʼring. Аgar ogohlantirish davom etsa, ularning sinxronlash holatini tekshiring: @ sifatida belgilangan dasturlar, TEIni va hodisa/tadbirlarni. 1 %s natijalar topildi Янгисини қўшиш Qoʼshish @@ -259,7 +258,6 @@ Qidiruv uchun kamida %d atributni kiritish kerak Qidiruv uchun kamida 1 ta atributni kiritish kerak %d dan ortiq natijalar mavjud. Iltimos, qoʼshimcha qidiruv mezonlarini kiriting - Siz tanlangan qidiruv mezonlari hech qanday natija bermadi. \n. Kriteriyalarni qayta koʼrib chiqing yoki yangi %s yozing Qidiruv mezonlarini kiriting @@ -653,7 +651,6 @@ Maydon toʼldirilishi majburiy Xavfsizlik sababli ushbu versiyadan adb formatidan foydalanishga ruxsat berilmagan.Ilitmos, mashq versiyasidan foydalaning. - Аfsus! Rejalashtirilganidek amalga oshmadi. \N Hozir sizni harakatga qaytaramiz Orqaga qayting Ilovani yopish Batafsil maʼlumot diff --git a/app/src/main/res/values-uz/strings.xml b/app/src/main/res/values-uz/strings.xml index 5e84cfba12b..714451bfe01 100644 --- a/app/src/main/res/values-uz/strings.xml +++ b/app/src/main/res/values-uz/strings.xml @@ -31,7 +31,6 @@ Синхронлашда хатолик Синхронлаш пайтида хатолик юз берди. Илтимос, қайта уриниб кўринг - ОГОҲЛАНТИРИШ: Маълумотларнинг аксарият қисми синхронлаштирилди. Лекин, баъзи зиддиятлар келиб чиқди. Конфигурацияни синхронланг ва қайтадан уриниб кўринг. Агар огоҳлантириш давом этса, уларнинг синхронлаш ҳолатини текширинг: @ сифатида белгиланган дастурлар, TEIни ва ҳодиса/тадбирларни. Бу ерда хатолик юз берди ва сервер жавоб бермади. Ўз администраторингиз билан алоқа боғланг. 1 %s натижалар топилди @@ -275,7 +274,6 @@ Қидирув учун камида %d атрибутни киритиш керак Қидирув учун камида 1 та атрибутни киритиш керак %d дан ортиқ натижалар мавжуд. Илтимос, қўшимча қидирув мезонларини киритинг - Сиз танланган қидирув мезонлари ҳеч қандай натижа бермади. \n. Критерияларни қайта кўриб чиқинг ёки янги %s ёзинг Қидирув мезонларини киритинг @@ -678,7 +676,6 @@ Майдон тўлдирилиши мажбурий Хавфсизлик сабабли ушбу версиядан adb форматидан фойдаланишга рухсат берилмаган.Илитмос, машқ версиясидан фойдаланинг. - Афсус! Режалаштирилганидек амалга ошмади. \N Ҳозир сизни ҳаракатга қайтарамиз Орқага қайтинг Иловани ёпиш Батафсил маълумот diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 30f4c979edc..1a718fa79fb 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -32,7 +32,6 @@ Lỗi đồng bộ Xảy ra lỗi trong quá trình đồng bộ. Vui lòng thử lại. Đồng bộ đã hoàn tất nhưng chúng tôi không nhận được xác nhận máy chủ cho tất cả dữ liệu. Các dữ liệu vẫn được đánh dấu là \"Ngoại tuyến\" trong Ứng dụng. Chúng tôi khuyên bạn thử đồng bộ lại. - CẢNH BÁO: Hầu hết dữ liệu của bạn đã được đồng bộ nhưng một vài dữ liệu vẫn bị xung đột. Hãy thử đồng bộ cấu hình và thử lại. Nếu cảnh báo vẫn tiếp diễn, kiểm tra trạng thái đồng bộ của chương trình, các Đối Tượng Theo Dõi và các sự kiện với các dấu hiệu xung đột là @. Có lỗi và máy chủ không phản hồi. Liên hệ quản trị viên của bạn. Tìm thấy %s kết quả @@ -299,7 +298,6 @@ Bạn cần nhập ít nhất %d thuộc tính để thực hiện tìm kiếm Bạn cần nhập ít nhất một thuộc tính để tìm kiếm Có nhiều hơn %d kết quả. Vui lòng nhập thêm thông số tìm kiếm khác - Thông số tìm kiếm của bạn không trả về kết quả nào. \n Sửa lại thông số tìm kiếm hoặc đăng ký %s mới Nhập thông số tìm kiếm của bạn @@ -713,7 +711,6 @@ Trường dữ liệu này bắt buộc Vì lí do bảo mật, phiên bản ứng dụng này không cho phép sử dụng với adb. Vui lòng sử dụng phiên bản đào tạo. - Ồ! Có gì đó không xảy ra như dự kiến.\nHãy quay trở lại hành động trước. Quay lại Đóng ứng dụng Thêm chi tiết @@ -795,7 +792,7 @@ Xem Radar Không thể cài đặt kiểu tọa độ Đã theo dõi %s - %s không thể chuyển đổi thành Ngày + %s không thể chuyển đổi dữ liệu Ngày Không thể cập nhật trường dữ liệu này. Xin vui lòng thử lại. Chỉnh sửa Hiện có diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 580b97a7e34..ba54cdf804a 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -32,7 +32,6 @@ 同步错误 同步中发生错误,请重试 同步完成,但我们没有收到所有记录的服务器确认。这些记录在应用程序中仍被标记为“离线”状态。我们建议重试同步。 - 警告:你的大多数数据已经同步,但是有些字段存在冲突,同步你的配置再试。如果警告仍然存在,检查你的同步状态:项目、跟踪实体和事件如果有冲突会标记为@。 发生错误,服务器未响应。与您的管理员联系。 发现结果:1%s @@ -299,7 +298,6 @@ 你至少需要输入 %d个属性便于搜索 你至少需要输入 一个属性便于搜索 有多余%d个结果,请再细化搜索条件 - 你的搜索没有返回任何结果,修改你的条件或者注册一个新的 %s 输入你的搜索条件 @@ -713,7 +711,6 @@ 此字段是必填字段 出于安全原因,此版本的应用程序不允许与adb一起使用。请使用培训版本。 - 糟糕!某些事情并没有按计划进行。\ n 我们让您重新执行。 回退 关闭应用 更多细节 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 8a0f0c97aa0..1936f3925c6 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -34,7 +34,6 @@ 同步完成,但我们没有收到所有记录的服务器确认。这些记录在应用程序中仍被标记为“离线”状态。我们建议重试同步。 失败:同步过程中出了问题。如果有连接,请重试。如果错误仍然存在,请联系您的管理员。 您的数据存在冲突。请同步您的配置,查看数据并尝试再次同步。 - 警告:你的大多数数据已经同步,但是有些字段存在冲突,同步你的配置再试。如果警告仍然存在,检查你的同步状态:项目、跟踪实体和事件如果有冲突会标记为@。 您的部分数据未能同步。 发生错误,服务器未响应。与您的管理员联系。 @@ -305,7 +304,6 @@ 你至少需要输入 %d个属性便于搜索 你至少需要输入 一个属性便于搜索 有多余%d个结果,请再细化搜索条件 - 你的搜索没有返回任何结果,修改你的条件或者加入一个新的 %s 输入你的搜索条件 @@ -720,7 +718,6 @@ 此字段是必填字段 出于安全原因,此版本的应用程序不允许与adb一起使用。请使用培训版本。 - 糟糕!某些事情并没有按计划进行。\ n 让我们返回想办法。 后退 关闭应用 更多细节 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f4aa3019257..e9a55d33666 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -37,7 +37,6 @@ Sync finished but we did not receive server confirmation for all records. Those record are still marked as \"offline\" in the App. We recommend to retry the synchronization. FAIL: Something went wrong in the sync process. If you have connection please try again. If the error persists, contact your administrator. There are conflicts in your data. Please sync your configuration, review your data and try syncing again. - WARNING: Most of your data is synced but some fields presented conflicts. Sync your configuration and try again. If warning persists, check their sync status: programs, TEI\'s and events with conflicts are marked as @. Some of your data failed to sync. There was an error and the server did not respond. Contact your administrator. diff --git a/commons/src/main/res/values-vi/strings.xml b/commons/src/main/res/values-vi/strings.xml index d5d27531d7b..32c878e2fb8 100644 --- a/commons/src/main/res/values-vi/strings.xml +++ b/commons/src/main/res/values-vi/strings.xml @@ -202,7 +202,7 @@ Phiên bản của Cài Đặt Ứng Dụng Web này không hỗ trợ Cài Đặt Ứng Dụng Web không được cài trong máy chủ. Máy chủ mất quá nhiều thời gian để trả lời. Chúng tôi đã hủy yêu cầu. - Không thể cập nhật mối quan hệ với bệnh nhân + Mối quan hệ không thể cập nhật. Có quá nhiều thời điểm Chúng tôi không thể tìm thấy đường dẫn liên kết. Vui lòng kiểm tra nó. Tài khoảng của bạn đã bị vô hiệu. Nếu đây là lỗi, vui lòng liên hệ quản lý của bạn. diff --git a/commonskmm/src/commonMain/composeResources/values-ar-rEG/strings.xml b/commonskmm/src/commonMain/composeResources/values-ar-rEG/strings.xml index ccf89c85128..d7e0718e1c0 100644 --- a/commonskmm/src/commonMain/composeResources/values-ar-rEG/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-ar-rEG/strings.xml @@ -7,8 +7,5 @@ إلغاء لم يتم العثور على نتائج ابحث للعثور على المزيد - - - \ No newline at end of file + إلغاء + \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-ar-rIQ/strings.xml b/commonskmm/src/commonMain/composeResources/values-ar-rIQ/strings.xml index 8e50096d019..f029f4b5e88 100644 --- a/commonskmm/src/commonMain/composeResources/values-ar-rIQ/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-ar-rIQ/strings.xml @@ -14,8 +14,5 @@ تنزيل قبول إلغاء - - - \ No newline at end of file + إلغاء + \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-ar/strings.xml b/commonskmm/src/commonMain/composeResources/values-ar/strings.xml index 70b8ee21dfc..83e3ebf920f 100644 --- a/commonskmm/src/commonMain/composeResources/values-ar/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-ar/strings.xml @@ -20,7 +20,7 @@ إختر وحدة تنظيمية هذا الحقل إلزامي لديك بعض الرسائل التحذيرية. - لديك بعض الرسائل التحذيرية.\nهل تريد وضع علامة "مكتمل" على هذا النموذج؟ + لديك بعض الرسائل التحذيرية.\nهل تريد وضع علامة \"مكتمل\" على هذا النموذج؟ مطلوب التاريخ السنوات @@ -119,7 +119,7 @@ ابحث للعثور على المزيد تم غير مدعوم - كلمة المرور مفقودة. الرجاء إدخال كلمة المرور. @@ -142,7 +142,6 @@ لم يتم تعيين إصدار التطبيق. الغاء الإنشاء. الكائن موجود مسبقًا. احباط عملية الحذف، الكائن غير موجود. - لم نتمكن من الاحتفاظ بقيم لهذه السجلات. يرجى الاتصال بالمسؤول الخاص بك. الرجاء تسجيل الدخول لتصدير قاعدة البيانات. تصدير قاعدة بيانات مشفرة غير مدعوم. أنت تستورد قاعدة بيانات موجودة مسبقًا. @@ -167,7 +166,6 @@ استغرق الخادم وقتًا طويلاً للاستجابة. لقد ألغينا الطلب. لا يمكن تحديث العلاقة. هناك فترات كثيرة جدا. - لم نتمكن من العثور على URL. الرجاء التحقق منه. تم تعطيل حساب المستخدم الخاص بك. إذا كان هذا خطأ ، اتصل بالمسؤول. حساب المستخدم الخاص بك مغلق. إذا كان هذا خطأ ، اتصل بالمسؤول. تعذر تعيين القيمة. @@ -178,8 +176,11 @@ البحث على الإنترنت متاح فقط للوحدات التنظيمية المتاحة للمستخدم للبحث. الخادم غير متوفر حالياً. حاول مرة أخرى في وقت لاحق. أنت غير متصل بالإنترنت. اتصل بالإنترنت وحاول مرة أخرى. - + أو + إلغاء + موافق \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-ckb/strings.xml b/commonskmm/src/commonMain/composeResources/values-ckb/strings.xml index 3e62754b89b..6a9892c930a 100644 --- a/commonskmm/src/commonMain/composeResources/values-ckb/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-ckb/strings.xml @@ -15,8 +15,7 @@ پەسندکردن لابردن تةواو كرا - + لابردن + تةواو \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-cs/strings.xml b/commonskmm/src/commonMain/composeResources/values-cs/strings.xml index 5e8d38ae346..22916eb7e5c 100644 --- a/commonskmm/src/commonMain/composeResources/values-cs/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-cs/strings.xml @@ -138,7 +138,7 @@ Hledat pro nalezení dalších Hotovo Není podporováno - Chybí heslo. Prosím vložte heslo. @@ -164,7 +164,6 @@ Vytváření přerušeno. Objekt již existuje. Mazání přerušeno. Objekt neexistuje. Nelze vytvořit instanci úložiště klíčů. - Pro tyto záznamy jsme nemohli vyhradit hodnoty. Kontaktujte prosím svého administrátora. Pro export databáze se prosím přihlaste. Export šifrované databáze není podporován. Importujete již existující databázi. @@ -191,7 +190,6 @@ Serveru trvalo příliš dlouho, než odpověděl. Žádost jsme zrušili. Vztah nelze aktualizovat. Období je příliš mnoho. - Adresu URL jsme nenašli. Prosím ověřte to. Váš uživatelský účet byl deaktivován. Pokud se jedná o chybu, kontaktujte svého správce. Váš uživatelský účet je uzamčen. Pokud se jedná o chybu, kontaktujte svého správce. Hodnotu nelze nastavit. @@ -207,8 +205,13 @@ Neplatný soubor Není v režimu registrace TOTP 2FA Ověřování zrušeno - + OR + VĚK + DATUM NAROZENÍ + Zrušit + OK \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-da/strings.xml b/commonskmm/src/commonMain/composeResources/values-da/strings.xml index 1bf475e2ded..0a9e6fa0ffe 100644 --- a/commonskmm/src/commonMain/composeResources/values-da/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-da/strings.xml @@ -8,8 +8,7 @@ Incident date Cancel No results found - + Cancel + OK \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-en-rUS/strings.xml b/commonskmm/src/commonMain/composeResources/values-en-rUS/strings.xml index 451502a78b9..64b9f608a19 100644 --- a/commonskmm/src/commonMain/composeResources/values-en-rUS/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-en-rUS/strings.xml @@ -110,7 +110,7 @@ Search to find more Done Not supported - Password is missing. Please enter password. @@ -136,7 +136,6 @@ Creation aborted. The object already exists. Deletion aborted. The object does not exist. Unable to instantiate keystore. - We couldn´t reserve values for these record. Please contact your admin. Please login to export the database. Exporting an encrypted database is not supported. You are importing an already existing database. @@ -163,7 +162,6 @@ The server took too much time to respond. We canceled the request. The relationship can\'t be updated. There are too many periods. - We couldn´t find the URL. Please verify it. Your user account have been disabled. If this is an error, contact your administrator. Your user account is locked. If this is an error, contact your administrator. The value could not be set. @@ -178,8 +176,5 @@ Database import failed Invalid file Not in TOTP 2FA enrollment mode - - - \ No newline at end of file + Cancel + \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-es-rES/strings.xml b/commonskmm/src/commonMain/composeResources/values-es-rES/strings.xml index 8e63a0b0b46..ea31a79c61e 100644 --- a/commonskmm/src/commonMain/composeResources/values-es-rES/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-es-rES/strings.xml @@ -103,7 +103,7 @@ Añadir imagen No se han encontrado resultados Terminado - La contraseña está vacía. Ingrese la contraseña. @@ -129,7 +129,6 @@ No se puede crear un objeto que ya existe. No se puede eliminar un objeto que no existe. No se puede inicializar el almacén de llaves. - No se pudo reservar los valores. Por favor contacte a su administrador Inicie sesión para exportar la base de datos. Exportar una base de datos encriptada no está soportado. Está intentando importar una base de datos que ya existe. @@ -156,7 +155,6 @@ El servidor ha tardado mucho en responder. Se ha cancelado la petición. La relación no puede actualizarse. Hay demasiados periodos. - No pudimos encontrar la URL. Por favor revísela. Su cuenta de usuario ha sido desactivada. Si esto es un error, contacte con su administrador. Su cuenta de usuario ha sido bloqueada. Si es un error, contacte con su administrador. No se ha podido cambiar el valor. @@ -166,8 +164,7 @@ No hay suficientes atributos para realizar la búsqueda. Por favor redefina la búsqueda añadiendo más atributos. La búsqueda online solo está disponible para las unidades organizativas de búsqueda. El query contiene caracteres invalidos. Por favor contacte a su administrador para verificar la configuración del servidor (relaxedQueryChars,...). - + Cancelar + Correcto \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-es/strings.xml b/commonskmm/src/commonMain/composeResources/values-es/strings.xml index 734e809d218..a1aea5f6b2e 100644 --- a/commonskmm/src/commonMain/composeResources/values-es/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-es/strings.xml @@ -137,7 +137,7 @@ Busca para ver más Hecho No soportado - La contraseña está vacía. Ingrese la contraseña. @@ -163,7 +163,6 @@ No se puede crear un objeto que ya existe. No se puede eliminar un objeto que no existe. No se puede inicializar el almacén de llaves. - No se pudo reservar los valores. Por favor contacte a su administrador Inicie sesión para exportar la base de datos. Exportar una base de datos encriptada no está soportado. Está intentando importar una base de datos que ya existe. @@ -190,7 +189,6 @@ El servidor ha tardado mucho en responder. Se ha cancelado la petición. La relación no puede actualizarse. Hay demasiados periodos. - No pudimos encontrar la URL. Por favor revísela. Su cuenta de usuario ha sido desactivada. Si esto es un error, contacte con su administrador. Su cuenta de usuario ha sido bloqueada. Si es un error, contacte con su administrador. No se ha podido cambiar el valor. @@ -204,8 +202,9 @@ Estas desconectado. Conéctese a Internet e inténtelo nuevamente. Importación de la base de datos fallida Archivo no válido - + EDAD + FECHA DE NACIMIENTO + Cancelar + Aceptar \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-fr/strings.xml b/commonskmm/src/commonMain/composeResources/values-fr/strings.xml index 68a7c39666e..61235128076 100644 --- a/commonskmm/src/commonMain/composeResources/values-fr/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-fr/strings.xml @@ -9,20 +9,20 @@ Seuls les nombres négatifs sont autorisés Seuls les nombres positifs ou zéro sont autorisés Seules les valeurs de 0 à 1 sont autorisées - Ceci n'est pas un lien URL valide + Ceci n\'est pas un lien URL valide La valeur doit être un entier - Ceci n'est pas le format correcte. + Ceci n\'est pas le format correcte. Le modèle configuré 1%s est erroné. - Ce champ n'a pas pu être mis à jour. Veuillez réessayer + Ce champ n\'a pas pu être mis à jour. Veuillez réessayer Erreur - La valeur doit être unique, une coincidence a été trouvée. Elle n'a pas été sauvegardée. Veuillez vérifier. - Sélectionnez l'heure + La valeur doit être unique, une coincidence a été trouvée. Elle n\'a pas été sauvegardée. Veuillez vérifier. + Sélectionnez l\'heure Choisissez une date - Choisissez l'unité d'organisation - La règle du programme 1%s tente d'attribuer une valeur 1%s qui n'appartient pas au jeu d'options 1%s - La valeur du champ 1%s n'appartient pas à l'option définie dans 1%s + Choisissez l\'unité d\'organisation + La règle du programme 1%s tente d\'attribuer une valeur 1%s qui n\'appartient pas au jeu d\'options 1%s + La valeur du champ 1%s n\'appartient pas à l\'option définie dans 1%s Ce champ est obligatoire - Vous avez des messages d'avertissement. + Vous avez des messages d\'avertissement. Requis Date Années @@ -47,7 +47,7 @@ Entrez une lettre Saisir texte long Saisir du texte - Date d'échéance + Date d\'échéance Champ obligatoire Non enregistré! Vérifier @@ -66,31 +66,31 @@ Avertissement relatif aux règles du programme Il y a un problème de configuration provoquant une boucle dans les règles. Contactez votre administrateur. Copié - Pas d'information pour ce champ + Pas d\'information pour ce champ Prendre une photo Attention. Vérifiez ceci! Ne pas montrer de nouveau - la valeur fournie n'est pas autorisée pour ce champ + la valeur fournie n\'est pas autorisée pour ce champ Caractère invalide 0 Caractère invalide 1 - La valeur n'est ni vraie ni fausse - Ce format de date n'est pas valide - Ce format de date et d'heure n'est pas valide - Ce format d'heure n'est pas valide + La valeur n\'est ni vraie ni fausse + Ce format de date n\'est pas valide + Ce format de date et d\'heure n\'est pas valide + Ce format d\'heure n\'est pas valide La valeur est vide - La valeur contient plus d'une lettre - La valeur n'est pas une lettre + La valeur contient plus d\'une lettre + La valeur n\'est pas une lettre Le texte est trop long - La valeur n'est ni vraie ni fausse + La valeur n\'est ni vraie ni fausse Ce champ ne peut être vrai Caractère invalide 1 - Les DataValues ne peuvent pas être enregistrées à l'aide de ces arguments. Utilisez l'autre. + Les DataValues ne peuvent pas être enregistrées à l\'aide de ces arguments. Utilisez l\'autre. Les zéros non significatifs ne sont pas autorisés Attributs - %s Coordonnées pour - Il n'y a plus de valeurs réservées. Veuillez contacter votre administrateur système. + Il n\'y a plus de valeurs réservées. Veuillez contacter votre administrateur système. Date de l´incident - L'autorisation de localisation est nécessaire pour capturer les coordonnées. Veuillez les activer dans les paramètres de l'application + L\'autorisation de localisation est nécessaire pour capturer les coordonnées. Veuillez les activer dans les paramètres de l\'application Ouvrir avec Aucune option trouvée Télécharger @@ -98,10 +98,10 @@ Code QR Code-barre Ajouter un lieu - Ce formulaire n'a pas de champs configurés + Ce formulaire n\'a pas de champs configurés %s détails %s donnée - Unité d'organisation + Unité d\'organisation Coordonnées La combo de catégories Aucune option disponible @@ -121,40 +121,44 @@ Aucun résultat trouvé Terminé Non supporté - Le mot de passe est manquant. Veuillez entrer le mot de passe. - Le nom d'utilisateur est manquant. Veuillez entrer le nom d'utilisateur. - Ce serveur a une version différente de 2.29. Mettre à jour la version ou utiliser un environnement d'essai pour continuer - L'URL fournie n'est pas un serveur DHIS2. - Nom d'utilisateur ou le mot de passe sont incorrects + Le nom d\'utilisateur est manquant. Veuillez entrer le nom d\'utilisateur. + Ce serveur a une version différente de 2.29. Mettre à jour la version ou utiliser un environnement d\'essai pour continuer + L\'URL fournie n\'est pas un serveur DHIS2. + Nom d\'utilisateur ou le mot de passe sont incorrects Serveur inconnu - Erreur lors de l'analyse des résultats - Un probème inattendu s'est produit - Votre utilisateur possède plusieurs unités d'organisation . Vérifiez votre configuration ou contactez votre administrateur. + Erreur lors de l\'analyse des résultats + Un probème inattendu s\'est produit + Votre utilisateur possède plusieurs unités d\'organisation . Vérifiez votre configuration ou contactez votre administrateur. Le serveur est un peu occupé en ce moment. Veuillez essayer un peu plus tard. - L'utilisateur est déjà connecté - La requête du serveur n'est pas valide. - Nous ne pouvions pas réserver de valeurs pour ces enregistrements. Veuillez contacter votre administrateur. + L\'utilisateur est déjà connecté + La requête du serveur n\'est pas valide. Veuillez vous déconnecter pour importer une nouvelle base de données. Vous êtes peut-être à court de valeurs disponibles. - Il n'y a pas d'utilisateur authentifié. - Aucun utilisateur n'est authentifié hors ligne. - Il n'y a pas assez de valeurs à réserver sur le serveur. Veuillez contacter votre administrateur. + Il n\'y a pas d\'utilisateur authentifié. + Aucun utilisateur n\'est authentifié hors ligne. + Il n\'y a pas assez de valeurs à réserver sur le serveur. Veuillez contacter votre administrateur. Vous essayez de vous connecter hors ligne avec un autre utilisateur. - Aucune valeur réservée n'est disponible. Accédez aux paramètres et remplissez les valeurs lorsque vous disposez d'une connexion Internet. - Vous n'avez pas accès. - L'URL du serveur est manquante. Veuillez saisir l'URL. - L'URL du serveur n'est pas bien formée. S'il te plaît vérifie l' addresse - Votre compte utilisateur a été désactivé. S'il s'agit d'une erreur, contactez votre administrateur. - Votre compte utilisateur est verrouillé. S'il s'agit d'une erreur, contactez votre administrateur. + Aucune valeur réservée n\'est disponible. Accédez aux paramètres et remplissez les valeurs lorsque vous disposez d\'une connexion Internet. + Vous n\'avez pas accès. + L\'URL du serveur est manquante. Veuillez saisir l\'URL. + L\'URL du serveur n\'est pas bien formée. S\'il te plaît vérifie l\' addresse + Votre compte utilisateur a été désactivé. S\'il s\'agit d\'une erreur, contactez votre administrateur. + Votre compte utilisateur est verrouillé. S\'il s\'agit d\'une erreur, contactez votre administrateur. Il y a un problème avec les certificats du serveur. Veuillez contacter votre administrateur. - Il n'y a pas assez d'attributs pour effectuer la recherche. Veuillez affiner votre recherche avec plus d'attributs. - La recherche en ligne n'est disponible que pour vos unités organisationnelles de recherche d'utilisateurs. - Vous n'êtes pas connecté. Veuillez-vous connecter et réssayer. - + OR + ÂGE + DATE DE NAISSANCE + Annuler + Ok \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml b/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml index 7b6e0115917..ce60d43e806 100644 --- a/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml @@ -68,8 +68,7 @@ खोजें और अधिक पाएं पूरा हुआ सपोर्टेड नहीं है - + रद्द करें + ठीक है \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-id/strings.xml b/commonskmm/src/commonMain/composeResources/values-id/strings.xml index ac6327ee130..4b1c57297c4 100644 --- a/commonskmm/src/commonMain/composeResources/values-id/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-id/strings.xml @@ -76,8 +76,7 @@ Tidak didukung Server ini menjalankan versi dhis yang berbeda dari 2.29. Perbarui versi server Anda atau gunakan pengujian lingkungan untuk melanjutkan. Kesalahan saat penguraian hasil - + Batal + OK \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-km/strings.xml b/commonskmm/src/commonMain/composeResources/values-km/strings.xml index 5ba0a42556a..f43b201d40c 100644 --- a/commonskmm/src/commonMain/composeResources/values-km/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-km/strings.xml @@ -46,8 +46,7 @@ មិនគាំទ្រ​ / មិនអាចធ្វើឡើងបានទេ ម៉ាស៊ីនមេនេះកំពុងដំណើរការខុសពី DHIS ២.២៩។ សូមធ្វើបច្ចុប្បន្នភាពលើម៉ាស៊ីនមេរបស់អ្នក​ កំហុសខណៈពេលញែកលទ្ធផល - + បោះបង់ + យល់ព្រម \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-lo/strings.xml b/commonskmm/src/commonMain/composeResources/values-lo/strings.xml index 8bacfa370ce..b2a003396cf 100644 --- a/commonskmm/src/commonMain/composeResources/values-lo/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-lo/strings.xml @@ -103,7 +103,7 @@ ບໍ່ພົບຜົນການຊອກຫາ ສຳເລັດ ບໍ່ຮອງຮັບ - ບໍ່ມີລະຫັດຜ່ານ. ກະລຸນາໃສ່ລະຫັດຜ່ານ. @@ -128,7 +128,6 @@ ບໍ່ສາມາດເຂົ້າເຖິງທີ່ເກັບຂອງອຸປະກອນໄດ້. ການສ້າງຖືກຍົກເລີກ. ມີວັດຖຸຢູ່ແລ້ວ. ຍົກເລິກການລົບແລ້ວ. ບໍ່ມີວັດຖຸຢູ່ - ພວກເຮົາບໍ່ສາມາດຈອງຄ່າສໍາລັບບັນທຶກເຫຼົ່ານີ້. ກະລຸນາຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ. ກະລຸນາເຂົ້າສູ່ລະບົບເພື່ອສົ່ງອອກຖານຂໍ້ມູນ. ບໍ່ຮອງຮັບການສົ່ງອອກຖານຂໍ້ມູນທີ່ຖືກເຂົ້າລະຫັດ. ທ່ານກໍາລັງນໍາເຂົ້າຖານຂໍ້ມູນທີ່ມີຢູ່ແລ້ວ. @@ -154,7 +153,6 @@ ເຄື່ອງຄອມພິວເຕີໜ່ວຍແມ່ໃຊ້ເວລາຕອບສະໜອງດົນເກີນໄປ. ພວກເຮົາຍົກເລິກການຮ້ອງຂໍ ບໍ່ສາມາດອັບເດດຄວາມສຳພັນໄດ້. ຊ່ວງເວລາມີຫຼາຍເກີນໄປ - ພວກເຮົາບໍ່ສາມາດຊອກຫາ URL ໄດ້. ກະລຸນາກວດສອບມັນ. ບັນຊີຂອງທ່ານຖືກປິດການນຳໃຊ້ແລ້ວ. ຖ້ານີ້ແມ່ນຄວາມຜິດພາດ, ກະລຸນາຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ. ບັນຊີຜູ້ໃຊ້ຂອງທ່ານຖືກລັອກ. ຖ້າຫາກນີ້ແມ່ນຂໍ້ຜິດພາດ, ຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ. ບໍ່ສາມາດຕັ້ງຄ່າໄດ້. @@ -164,8 +162,11 @@ ຄຸນລັກສະນະບໍ່ພຽງພໍທີ່ຈະດໍາເນີນການຄົ້ນຫາ. ກະລຸນາປັບປຸງການຄົ້ນຫາຂອງທ່ານດ້ວຍຄຸນລັກສະນະເພີ່ມເຕີມ. ການຄົ້ນຫາອອນລາຍໃຊ້ໄດ້ກັບຫົວຫນ່ວຍການຈັດຕັ້ງທີ່ຄົ້ນຫາຜູ້ໃຊ້ຂອງທ່ານເທົ່ານັ້ນ. ທ່ານອອຟລາຍຢູ່. ເຊື່ອມຕໍ່ອິນເຕີເນັດ ແລະ ລອງໃໝ່ອີກຄັ້ງ - + OR + ຍົກເລີກ + ​ຕົກ​ລົງ \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-my/strings.xml b/commonskmm/src/commonMain/composeResources/values-my/strings.xml index 3f240d322a6..a302e05d7c1 100644 --- a/commonskmm/src/commonMain/composeResources/values-my/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-my/strings.xml @@ -18,8 +18,7 @@ ပယ်ဖျက်သည် No results found Done - + ပယ်ဖျက်သည် + လက်ခံသည် \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-nb/strings.xml b/commonskmm/src/commonMain/composeResources/values-nb/strings.xml index 368486d6897..7c8635f1aae 100644 --- a/commonskmm/src/commonMain/composeResources/values-nb/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-nb/strings.xml @@ -77,8 +77,11 @@ Ikke støttet Denne serveren kjører en dhis versjon som er forskjellig fra 2.29. Oppdater din serverversjon eller bruk testmiljøet for å fortsette. Feil under analyse av resultater - + ELLER + Avbryt + OK \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-ne/strings.xml b/commonskmm/src/commonMain/composeResources/values-ne/strings.xml index 67d960618f7..ff683920192 100644 --- a/commonskmm/src/commonMain/composeResources/values-ne/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-ne/strings.xml @@ -4,8 +4,5 @@ स्वीकार रद्द गर्नुहोस् कुनै पनि नतिजा भेटिएन - - - \ No newline at end of file + रद्द गर्नुहोस् + \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-nl/strings.xml b/commonskmm/src/commonMain/composeResources/values-nl/strings.xml index 206c502aa19..0eb2bbc0ad3 100644 --- a/commonskmm/src/commonMain/composeResources/values-nl/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-nl/strings.xml @@ -109,7 +109,7 @@ Geen resultaten gevonden Klaar Niet ondersteund - Wachtwoord ontbreekt. Voer wachtwoord in alstublieft. @@ -135,7 +135,6 @@ Creatie afgebroken. Het object bestaat al. Verwijdering afgebroken. Het voorwerp bestaat niet. Kan sleutelarchief niet instantiëren. - We konden geen waarden voor deze plaat reserveren. Neem contact op met uw beheerder. Log in om de database te exporteren. Het exporteren van een versleutelde database wordt niet ondersteund. U importeert een reeds bestaande database. @@ -162,7 +161,6 @@ De server nam te veel tijd om te reageren. We hebben het verzoek geannuleerd. De relatie kan niet worden bijgewerkt. Er zijn te veel periodes. - We konden de URL niet vinden. Controleer het alstublieft. Uw gebruikersaccount is uitgeschakeld. Neem contact op met uw beheerder als dit een fout is. Uw gebruikersaccount is vergrendeld. Neem contact op met uw beheerder als dit een fout is. De waarde kon niet worden ingesteld. @@ -172,8 +170,7 @@ Er zijn niet genoeg attributen om de zoekopdracht uit te voeren. Verfijn uw zoekopdracht met meer attributen. Online zoeken is alleen beschikbaar voor uw organisatie-eenheden voor het zoeken van gebruikers. Er zijn ongeldige tekens in de vraag. Vraag de beheerder om de serverconfiguratie te verifiëren (relaxedQueryChars,...). - + Annuleren + OK \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-prs/strings.xml b/commonskmm/src/commonMain/composeResources/values-prs/strings.xml index 385fef3c969..b791b633594 100644 --- a/commonskmm/src/commonMain/composeResources/values-prs/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-prs/strings.xml @@ -27,8 +27,11 @@ طول البلد هیج نتیجه ی یافت نشد انجام شد - + یا + انصراف + تأیید \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-ps/strings.xml b/commonskmm/src/commonMain/composeResources/values-ps/strings.xml index 2b86d6ececd..51825c9dc24 100644 --- a/commonskmm/src/commonMain/composeResources/values-ps/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-ps/strings.xml @@ -24,8 +24,7 @@ لانګېټيوډ هېڅ پایله ترلاسه نه شوه ترسره شو - + رد یې کړئ [ ژباړه ـ ردول ] + سم دی \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-pt-rBR/strings.xml b/commonskmm/src/commonMain/composeResources/values-pt-rBR/strings.xml index 86e2dbfc597..7caad5b8e83 100644 --- a/commonskmm/src/commonMain/composeResources/values-pt-rBR/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-pt-rBR/strings.xml @@ -29,8 +29,7 @@ Longitude Nenhum resultado encontrado Concluído - + Cancelar + Aprovado \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-pt/strings.xml b/commonskmm/src/commonMain/composeResources/values-pt/strings.xml index b40e2d571b2..b947ca885da 100644 --- a/commonskmm/src/commonMain/composeResources/values-pt/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-pt/strings.xml @@ -124,7 +124,7 @@ Nenhum resultado encontrado Feito Não suportado - A palavra-passe está em falta. Introduza a palavra-passe. @@ -150,7 +150,6 @@ Criação abortada. O objeto já existe. Eliminação abortada. O objeto não existe. Não foi possível instanciar o keystore. - Não foi possível reservar valores para este registo. Por favor, contacte o seu administrador. Inicie sessão para exportar a base de dados. A exportação de uma base de dados encriptada não é suportada. Está a importar uma base de dados já existente. @@ -177,7 +176,6 @@ O servidor demorou demasiado tempo a responder. Cancelamos a requisição. O relacionamento não pode ser actualizado. Existem muitos períodos. - Não foi possível encontrar a URL. Por favor, verifique-o. A sua conta de utilizador foi desactivada. Se isto for um erro, contacte o seu administrador. A sua conta de utilizador está bloqueada. Se isto for um erro, contacte o seu administrador. O valor não pode ser definido. @@ -189,8 +187,11 @@ Existem caracteres inválidos na consulta. Por favor, peça ao administrador para verificar a configuração do servidor (relaxedQueryChars,...). O servidor está indisponível do momento. Tente novamente mais tarde. Está off-line. Ligue-se à Internet e tente novamente. - + OR + Cancelar + OK \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-ro/strings.xml b/commonskmm/src/commonMain/composeResources/values-ro/strings.xml index 8e2f5f540a6..901c7f098ad 100644 --- a/commonskmm/src/commonMain/composeResources/values-ro/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-ro/strings.xml @@ -13,8 +13,5 @@ Anulare Nu au fost găsite rezultate Terminat - - - \ No newline at end of file + Anulare + \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-ru/strings.xml b/commonskmm/src/commonMain/composeResources/values-ru/strings.xml index 9477e859482..2c17acd492e 100644 --- a/commonskmm/src/commonMain/composeResources/values-ru/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-ru/strings.xml @@ -128,7 +128,7 @@ Искать, чтобы найти больше Готово Не поддерживается - Пароль отсутствует. Пожалуйста, введите пароль. @@ -152,7 +152,6 @@ Невозможно получить доступ к хранилищу ключей устройства. Создание прервано. Объект уже существует. Удаление прервано. Объект не существует. - Мы не смогли зарезервировать значения для этих записей. Пожалуйста, свяжитесь с вашим администратором. Пожалуйста, войдите в систему, чтобы экспортировать базу данных. Экспорт зашифрованной базы данных не поддерживается. Вы импортируете уже существующую базу данных. @@ -171,7 +170,6 @@ Серверу потребовалось слишком много времени для ответа. Мы отменили запрос. Связь не может быть обновлена. Слишком много периодов. - Мы не смогли найти URL-адрес. Пожалуйста, проверьте его. Ваша учетная запись пользователя была отключена. Если это ошибка, обратитесь к своему администратору. Ваша учетная запись заблокирована. Если это ошибка, обратитесь к своему администратору. Значение не удалось установить. @@ -180,8 +178,13 @@ Онлайн-поиск доступен только для подразделений вашей организации по поиску пользователей. Сервер в настоящее время недоступен. Повторите попытку позже. Вы находитесь оффлайн. Подключитесь к Интернету и повторите попытку. - + ИЛИ + ВОЗРАСТ + ДАТА РОЖДЕНИЯ + Отменить + ОК \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-sv/strings.xml b/commonskmm/src/commonMain/composeResources/values-sv/strings.xml index 7dfff1d44f2..d5751363d53 100644 --- a/commonskmm/src/commonMain/composeResources/values-sv/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-sv/strings.xml @@ -45,8 +45,7 @@ Inga resultat hittades Den här servern kör en dhis-version som skiljer sig från 2.29. Uppdatera din serverversion eller använd testmiljön för att fortsätta. Fel vid tolkning av resultat - + Avbryt + ok \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-tet/strings.xml b/commonskmm/src/commonMain/composeResources/values-tet/strings.xml index 548c1951621..f7f9abb5148 100644 --- a/commonskmm/src/commonMain/composeResources/values-tet/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-tet/strings.xml @@ -10,8 +10,7 @@ Taka Hatun Kansela - + Kansela + OK \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-tg/strings.xml b/commonskmm/src/commonMain/composeResources/values-tg/strings.xml index f1ff83d2524..877496fe1aa 100644 --- a/commonskmm/src/commonMain/composeResources/values-tg/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-tg/strings.xml @@ -22,8 +22,11 @@ Тӯл Арз Иҷро шуд - + Ё + Бекор кардан + OK \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-uk/strings.xml b/commonskmm/src/commonMain/composeResources/values-uk/strings.xml index 3aec6ebbf39..543f1adaa55 100644 --- a/commonskmm/src/commonMain/composeResources/values-uk/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-uk/strings.xml @@ -21,8 +21,8 @@ Оберіть організаційний підрозділ Правило програми %s намагається призначити значення %s, яке не належить до набору параметрів %s Значення для поля %s не належить параметру, встановленому в %s - Це поле обов'язкове для заповнення - Обов'язкове поле + Це поле обов\'язкове для заповнення + Обов\'язкове поле Дата Роки Місяці @@ -47,7 +47,7 @@ Введіть довгий текст Введіть текст Запланована дата - Обов'язкове поле + Обов\'язкове поле Широта: Довгота: Не збережено @@ -112,33 +112,32 @@ Результатів не знайдено Зроблено Не підтримується - Пароль відсутній. Будь ласка, введіть пароль. - Ім'я користувача відсутнє. Будь ласка, введіть ім'я користувача. + Ім\'я користувача відсутнє. Будь ласка, введіть ім\'я користувача. На цьому сервері працює інша версія dhis, ніж 2.29. Щоб продовжити, оновіть версію серверу або скористайтеся середовищем тестування. На цьому сервері працює версія DHIS2, що відрізняється від %s. Оновіть версію серверу або сконтактуйте з системним адміністратором. Сталася помилка. Будь ласка, перевірте правильність URL-адреси серверу, імені користувача та пароля і повторіть спробу. Вибачте! На сервері сталася помилка. Надана URL-адреса не є сервером DHIS2. - Ім'я користувача або пароль неправильні + Ім\'я користувача або пароль неправильні Невідомий сервер Помилка аналізу результатів Неочікувана помилка. Ваш користувач має більше одного кореневого організаційного підрозділу. Перегляньте свою конфігурацію або зверніться до адміністратора. - Онлайн-результати перевищують максимальну кількість об'єктів, які можливо показати. Будь ласка, уточніть свій пошук. + Онлайн-результати перевищують максимальну кількість об\'єктів, які можливо показати. Будь ласка, уточніть свій пошук. На даний момент сервер трохи зайнятий. Будь ласка, спробуйте пізніше. Користувач уже авторизований. Запит уже виконано. Запит на сервер недійсний. - Ім'я додатку не встановлено. + Ім\'я додатку не встановлено. Версію додатку не встановлено. Неможливо отримати доступ до сховища ключів пристрою. - Створення перервано. Об'єкт вже існує. - Видалення перервано. Об'єкт не існує. + Створення перервано. Об\'єкт вже існує. + Видалення перервано. Об\'єкт не існує. Не вдалося створити екземпляр сховища ключів. - Ми не змогли зарезервувати значення для цих записів. Будь ласка, зверніться до свого адміністратора. Увійдіть в систему, щоб експортувати базу даних. Експорт зашифрованої бази даних не підтримується. Ви імпортуєте вже існуючу базу даних. @@ -154,8 +153,8 @@ На сервері недостатньо значень для резервування. Будь ласка, зверніться до свого адміністратора. Ви намагаєтесь увійти в систему, перебуваючи офлайн, під іншим користувачем. Значення геометрії недійсне. - Немає доступних зарезервованих значень. Перейдіть до налаштувань і поповніть значення, коли у Вас з'явиться підключення до Інтернету. - Об'єкт не вдалося оновити. + Немає доступних зарезервованих значень. Перейдіть до налаштувань і поповніть значення, коли у Вас з\'явиться підключення до Інтернету. + Об\'єкт не вдалося оновити. Не вдалося вставити об’єкт. Ви не маєте доступу. Відсутня URL-адреса сервера. Будь ласка, введіть URL-адресу. @@ -163,9 +162,8 @@ Ця версія налаштувань веб-програми не підтримується. Налаштування веб-програми не встановлено на сервері. Сервер надто довго відповідав. Ми скасували запит. - Зв'язки не можна оновити. + Зв\'язки не можна оновити. Надто багато періодів. - Не вдалося знайти URL-адресу. Будь ласка, перевірте це. Ваш обліковий запис користувача вимкнено. Якщо це помилка, зверніться до адміністратора. Ваш обліковий запис користувача заблоковано. Якщо це помилка, зверніться до адміністратора. Не вдалося встановити значення. @@ -175,8 +173,9 @@ Недостатньо атрибутів для виконання пошуку. Уточніть пошук за допомогою додаткових атрибутів. Онлайн-пошук доступний лише для організаційних підрозділів користувача. У запиті є недійсні символи. Попросіть адміністратора перевірити конфігурацію сервера (relaxedQueryChars,...). - + ВІК + ДАТА НАРОДЖЕННЯ + Скасувати + ОК \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-ur/strings.xml b/commonskmm/src/commonMain/composeResources/values-ur/strings.xml index 2732a5b0808..30391151185 100644 --- a/commonskmm/src/commonMain/composeResources/values-ur/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-ur/strings.xml @@ -26,8 +26,11 @@ لمبائی کوئی نتیجہ نہیں ملا ہو گیا - + یا + منسوخ + ٹھیک \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-uz-rUZ/strings.xml b/commonskmm/src/commonMain/composeResources/values-uz-rUZ/strings.xml index d72ae5ff712..85c7a70918e 100644 --- a/commonskmm/src/commonMain/composeResources/values-uz-rUZ/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-uz-rUZ/strings.xml @@ -74,8 +74,7 @@ Ushbu server 2.29 dan farqli versiyani ishlatmoqda. Server versiyasini yangilang yoki davom etish uchun sinov muddatidan foydalaning. Nimadir notoʼgʼri bajarildi. Server URL manzili, foydalanuvchi nomi va parol toʼgʼri ekanligini tekshiring va qaytadan urining. Natijalarni tahlil qilishda xatolik yuz berdi - + Бекор қилиш + OK \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-uz/strings.xml b/commonskmm/src/commonMain/composeResources/values-uz/strings.xml index 8f26c0404fd..26de626e199 100644 --- a/commonskmm/src/commonMain/composeResources/values-uz/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-uz/strings.xml @@ -83,8 +83,13 @@ Қўллаб қувватланмайди Ушбу сервер 2.29 дан фарқли версияни ишлатмоқда. Сервер версиясини янгиланг ёки давом этиш учун синов муддатидан фойдаланинг. Натижаларни таҳлил қилишда хатолик юз берди - + ЁКИ + ЁШИ + ТУҒИЛГАН КУНИ + Рад этиш + ЯХШИ \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-vi/strings.xml b/commonskmm/src/commonMain/composeResources/values-vi/strings.xml index 5de626561f2..d0cd5c9d1e0 100644 --- a/commonskmm/src/commonMain/composeResources/values-vi/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-vi/strings.xml @@ -137,7 +137,7 @@ Tìm kiếm để tìm thêm Hoàn thành Không được hỗ trợ - Thiếu mật khẩu. Xin vui lòng nhập mật khẩu @@ -163,7 +163,6 @@ Không thể tạo. Đối tượng đang tồn tại. Xóa bị từ chối. Đối tượng không tồn tại Không thể tạo kho khóa - Chúng ta không thể đặt trước giá trị cho các dữ liệu này. Vui lòng liên hệ quản lý của bạn. Vui lòng đăng nhập để xuất cơ sở dữ liệu. Xuất dữ liệu mã hóa không hỗ trợ Bạn đang nhập cơ sở dữ liệu đang tồn tại @@ -190,7 +189,6 @@ Máy chủ mất quá nhiều thời gian để trả lời. Chúng tôi đã hủy yêu cầu. Mối quan hệ không thể cập nhật. Có quá nhiều thời điểm - Chúng tôi không thể tìm thấy đường dẫn liên kết. Vui lòng kiểm tra lại. Tài khoảng của bạn đã bị vô hiệu hóa. Nếu đây là lỗi, vui lòng liên hệ quản lý của bạn. Tài khoảng của bạn đã bị khóa. Nếu đây là lỗi, vui lòng liên hệ quản lý của bạn. Giá trị không thể được thiết lập @@ -205,8 +203,11 @@ Nhập cơ sở dữ liệu không thành công Tệp không hợp lệ Không ở chế độ đăng ký TOTP 2FA - + HOẶC + Hủy + OK \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-zh-rCN/strings.xml b/commonskmm/src/commonMain/composeResources/values-zh-rCN/strings.xml index 3013da7eafc..d21528424cd 100644 --- a/commonskmm/src/commonMain/composeResources/values-zh-rCN/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-zh-rCN/strings.xml @@ -125,7 +125,7 @@ 没有结果 完成 不支持 - 密码丢失。请输入密码。 @@ -151,7 +151,6 @@ 创作中止。对象已经存在。 删除已中止。对象不存在。 无法实例化密钥库。 - 我们无法为这些记录保留值。请联系您的管理员。 请登录以导出数据库。 不支持导出加密数据库。 您正在导入一个已经存在的数据库。 @@ -178,7 +177,6 @@ 服务器花费了太多时间来响应。我们取消了请求。 关系无法更新。 期间太多了。 - 我们找不到 URL。请验证一下。 您的用户帐户已被禁用。如果这是错误,请联系您的管理员。 您的用户帐户被锁定。如果这是错误,请联系您的管理员。 无法设置该值。 @@ -190,8 +188,11 @@ 查询中有无效字符。请让管理员验证服务器配置(relaxedQueryChars,...)。 服务器当前不可用。稍后再试。 您已离线。连接到互联网并重试。 - + OR + 取消 + OK \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-zh/strings.xml b/commonskmm/src/commonMain/composeResources/values-zh/strings.xml index fb0c24ba6bc..b3e356705b9 100644 --- a/commonskmm/src/commonMain/composeResources/values-zh/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-zh/strings.xml @@ -138,7 +138,7 @@ 搜索查找更多信息 完成 不支持 - 密码丢失。请输入密码。 @@ -164,7 +164,6 @@ 创作中止。对象已经存在。 删除已中止。对象不存在。 无法实例化密钥库。 - 我们无法为这些记录保留值。请联系您的管理员。 请登录以导出数据库。 不支持导出加密数据库。 您正在导入一个已经存在的数据库。 @@ -191,7 +190,6 @@ 服务器花费了太多时间来响应。我们取消了请求。 关系无法更新。 期间太多了。 - 我们找不到 URL。请验证一下。 您的用户帐户已被禁用。如果这是错误,请联系您的管理员。 您的用户帐户被锁定。如果这是错误,请联系您的管理员。 无法设置该值。 @@ -207,8 +205,13 @@ 无效文件 未进入 TOTP 2FA 注册模式 认证取消 - + OR + 年龄 + 出生日期 + 取消 + \ No newline at end of file diff --git a/form/src/main/res/values-vi/strings.xml b/form/src/main/res/values-vi/strings.xml index 68de45cb60a..2ec97e83842 100644 --- a/form/src/main/res/values-vi/strings.xml +++ b/form/src/main/res/values-vi/strings.xml @@ -16,7 +16,7 @@ Năm Tháng Ngày - %s không thể chuyển đổi thành Ngày + %s không thể chuyển đổi dữ liệu Ngày Bản đồ Vĩ độ Kinh độ diff --git a/login/src/commonMain/composeResources/values-ar-rIQ/strings.xml b/login/src/commonMain/composeResources/values-ar-rIQ/strings.xml index 9bd139301f0..54c20417320 100644 --- a/login/src/commonMain/composeResources/values-ar-rIQ/strings.xml +++ b/login/src/commonMain/composeResources/values-ar-rIQ/strings.xml @@ -1,4 +1,4 @@ - + التالي اسم المستخدم diff --git a/login/src/commonMain/composeResources/values-ar/strings.xml b/login/src/commonMain/composeResources/values-ar/strings.xml index aff9209a9cc..4aabf6b8e45 100644 --- a/login/src/commonMain/composeResources/values-ar/strings.xml +++ b/login/src/commonMain/composeResources/values-ar/strings.xml @@ -1,4 +1,4 @@ - + التالي تسجيل الدخول السريع diff --git a/login/src/commonMain/composeResources/values-bn/strings.xml b/login/src/commonMain/composeResources/values-bn/strings.xml index 7713f637a38..b413e40faef 100644 --- a/login/src/commonMain/composeResources/values-bn/strings.xml +++ b/login/src/commonMain/composeResources/values-bn/strings.xml @@ -1,4 +1,4 @@ - + হ্যাঁ \ No newline at end of file diff --git a/login/src/commonMain/composeResources/values-ckb/strings.xml b/login/src/commonMain/composeResources/values-ckb/strings.xml index 8a027b413b2..c7e2cab6921 100644 --- a/login/src/commonMain/composeResources/values-ckb/strings.xml +++ b/login/src/commonMain/composeResources/values-ckb/strings.xml @@ -1,4 +1,4 @@ - + داهاتوو بەڵێ diff --git a/login/src/commonMain/composeResources/values-cs/strings.xml b/login/src/commonMain/composeResources/values-cs/strings.xml index 2598d71c8c1..23259f8bfec 100644 --- a/login/src/commonMain/composeResources/values-cs/strings.xml +++ b/login/src/commonMain/composeResources/values-cs/strings.xml @@ -1,4 +1,4 @@ - + Přidat nový účet Dvoufaktorové ověřování @@ -22,7 +22,7 @@ Zpět na nastavení Další Navázání spojení... - Ke kterému serveru se chcete připojit? + Ke kterému serveru se chcete připojit\? URL serveru Je zapnuté dvoufaktorové ověřování. Vypnutí dvoufaktorového ověřování @@ -34,7 +34,7 @@ Nepodařilo se vypnout dvoufaktorové ověřování. Není platná URL serveru Rychlé přihlášení - Chcete se přihlásit pomocí otisku prstu nebo jiné biometrické metody? + Chcete se přihlásit pomocí otisku prstu nebo jiné biometrické metody\? Pověření již byla uložena Pověření nebyla uložena Uživatelské jméno @@ -45,7 +45,7 @@ Nebo Přihlášení pomocí openID Správa účtů - Chcete nám pomoci vylepšit tuto aplikaci? + Chcete nám pomoci vylepšit tuto aplikaci\? Pokud řeknete ano, aplikace bude odesílat anonymní statistiky a protokoly o chybách, které nám pomáhají zlepšovat uživatelský komfort a výkon. Další podrobnosti naleznete v našem Zásady ochrany osobních údajů @@ -57,7 +57,7 @@ Zadejte svůj kód PIN Pro přístup k účtu zadejte čtyřmístný kód PIN. Odemknout - Zapomněli jste kód PIN? + Zapomněli jste kód PIN\? Nesprávný kód PIN Není nakonfigurován žádný kód PIN Nepodařilo se uložit kód PIN @@ -67,4 +67,4 @@ Import byl úspěšný Přihlášení bylo zrušeno Neplatný výsledek autorizace - \ No newline at end of file + \ No newline at end of file diff --git a/login/src/commonMain/composeResources/values-da/strings.xml b/login/src/commonMain/composeResources/values-da/strings.xml index e48cd4774df..9ae14a93640 100644 --- a/login/src/commonMain/composeResources/values-da/strings.xml +++ b/login/src/commonMain/composeResources/values-da/strings.xml @@ -1,4 +1,4 @@ - + Next Username diff --git a/login/src/commonMain/composeResources/values-en-rUS/strings.xml b/login/src/commonMain/composeResources/values-en-rUS/strings.xml index 3b3f80dc158..1df60655540 100644 --- a/login/src/commonMain/composeResources/values-en-rUS/strings.xml +++ b/login/src/commonMain/composeResources/values-en-rUS/strings.xml @@ -1,4 +1,4 @@ - + Not now \ No newline at end of file diff --git a/login/src/commonMain/composeResources/values-es-rES/strings.xml b/login/src/commonMain/composeResources/values-es-rES/strings.xml index bda435c5146..4d9ff87946b 100644 --- a/login/src/commonMain/composeResources/values-es-rES/strings.xml +++ b/login/src/commonMain/composeResources/values-es-rES/strings.xml @@ -1,4 +1,4 @@ - + Siguiente Nombre de usuario diff --git a/login/src/commonMain/composeResources/values-id/strings.xml b/login/src/commonMain/composeResources/values-id/strings.xml index 0337aae27b2..4c0f15d42d9 100644 --- a/login/src/commonMain/composeResources/values-id/strings.xml +++ b/login/src/commonMain/composeResources/values-id/strings.xml @@ -1,4 +1,4 @@ - + Selanjutnya Nama pengguna diff --git a/login/src/commonMain/composeResources/values-km/strings.xml b/login/src/commonMain/composeResources/values-km/strings.xml index 8b653396bbe..1fa4a3e05f6 100644 --- a/login/src/commonMain/composeResources/values-km/strings.xml +++ b/login/src/commonMain/composeResources/values-km/strings.xml @@ -1,4 +1,4 @@ - + បន្ទាប់ ឈ្មោះ​គណនី diff --git a/login/src/commonMain/composeResources/values-my/strings.xml b/login/src/commonMain/composeResources/values-my/strings.xml index c3b11bebb24..27b9d88841a 100644 --- a/login/src/commonMain/composeResources/values-my/strings.xml +++ b/login/src/commonMain/composeResources/values-my/strings.xml @@ -1,4 +1,4 @@ - + ရှေ့သို့ အသုံးပြုသူအမည် diff --git a/login/src/commonMain/composeResources/values-nb/strings.xml b/login/src/commonMain/composeResources/values-nb/strings.xml index 0696e46c4da..90b1cbf0a1f 100644 --- a/login/src/commonMain/composeResources/values-nb/strings.xml +++ b/login/src/commonMain/composeResources/values-nb/strings.xml @@ -1,4 +1,4 @@ - + Neste Brukernavn diff --git a/login/src/commonMain/composeResources/values-or/strings.xml b/login/src/commonMain/composeResources/values-or/strings.xml index d367006546e..1c06fa0a994 100644 --- a/login/src/commonMain/composeResources/values-or/strings.xml +++ b/login/src/commonMain/composeResources/values-or/strings.xml @@ -1,4 +1,4 @@ - + ହଁ \ No newline at end of file diff --git a/login/src/commonMain/composeResources/values-prs/strings.xml b/login/src/commonMain/composeResources/values-prs/strings.xml index 5ade5633f41..9e8b90fdcca 100644 --- a/login/src/commonMain/composeResources/values-prs/strings.xml +++ b/login/src/commonMain/composeResources/values-prs/strings.xml @@ -1,4 +1,4 @@ - + بعدی نام کاربر diff --git a/login/src/commonMain/composeResources/values-ps/strings.xml b/login/src/commonMain/composeResources/values-ps/strings.xml index 90974f871eb..f2bcae60ce4 100644 --- a/login/src/commonMain/composeResources/values-ps/strings.xml +++ b/login/src/commonMain/composeResources/values-ps/strings.xml @@ -1,4 +1,4 @@ - + راتلونکی کارېدونکی نوم diff --git a/login/src/commonMain/composeResources/values-pt-rBR/strings.xml b/login/src/commonMain/composeResources/values-pt-rBR/strings.xml index ca68c9dc9c7..166a5d8ac0a 100644 --- a/login/src/commonMain/composeResources/values-pt-rBR/strings.xml +++ b/login/src/commonMain/composeResources/values-pt-rBR/strings.xml @@ -1,4 +1,4 @@ - + Autenticação de dois fatores Próximo diff --git a/login/src/commonMain/composeResources/values-ro/strings.xml b/login/src/commonMain/composeResources/values-ro/strings.xml index 65017cbfb6b..0b73c7adfd0 100644 --- a/login/src/commonMain/composeResources/values-ro/strings.xml +++ b/login/src/commonMain/composeResources/values-ro/strings.xml @@ -1,4 +1,4 @@ - + Următorul Da diff --git a/login/src/commonMain/composeResources/values-si/strings.xml b/login/src/commonMain/composeResources/values-si/strings.xml index 0b5cc8a3adf..7b6f94ddda7 100644 --- a/login/src/commonMain/composeResources/values-si/strings.xml +++ b/login/src/commonMain/composeResources/values-si/strings.xml @@ -1,4 +1,4 @@ - + රහස්‍ය පදය ඔව් diff --git a/login/src/commonMain/composeResources/values-sv/strings.xml b/login/src/commonMain/composeResources/values-sv/strings.xml index 79e10deb0e0..63cc6c99538 100644 --- a/login/src/commonMain/composeResources/values-sv/strings.xml +++ b/login/src/commonMain/composeResources/values-sv/strings.xml @@ -1,4 +1,4 @@ - + Nästa Användarnamn diff --git a/login/src/commonMain/composeResources/values-tet/strings.xml b/login/src/commonMain/composeResources/values-tet/strings.xml index 6156f69b5c4..722b475abe2 100644 --- a/login/src/commonMain/composeResources/values-tet/strings.xml +++ b/login/src/commonMain/composeResources/values-tet/strings.xml @@ -1,4 +1,4 @@ - + Próximu Utilizador nia Naran diff --git a/login/src/commonMain/composeResources/values-tg/strings.xml b/login/src/commonMain/composeResources/values-tg/strings.xml index cc2ba39fd04..e25c4e713a5 100644 --- a/login/src/commonMain/composeResources/values-tg/strings.xml +++ b/login/src/commonMain/composeResources/values-tg/strings.xml @@ -1,4 +1,4 @@ - + Навбатӣ Номи корбар diff --git a/login/src/commonMain/composeResources/values-ur/strings.xml b/login/src/commonMain/composeResources/values-ur/strings.xml index c6cb378cc79..654509a9567 100644 --- a/login/src/commonMain/composeResources/values-ur/strings.xml +++ b/login/src/commonMain/composeResources/values-ur/strings.xml @@ -1,4 +1,4 @@ - + اگلہ صارف کا نا٠diff --git a/login/src/commonMain/composeResources/values-uz-rUZ/strings.xml b/login/src/commonMain/composeResources/values-uz-rUZ/strings.xml index 30f62d9def1..35a442dcafd 100644 --- a/login/src/commonMain/composeResources/values-uz-rUZ/strings.xml +++ b/login/src/commonMain/composeResources/values-uz-rUZ/strings.xml @@ -1,4 +1,4 @@ - + Кейинги Фойдаланувчи исми diff --git a/login/src/commonMain/composeResources/values-uz/strings.xml b/login/src/commonMain/composeResources/values-uz/strings.xml index 2418950d2c2..3d8d9ab6f7b 100644 --- a/login/src/commonMain/composeResources/values-uz/strings.xml +++ b/login/src/commonMain/composeResources/values-uz/strings.xml @@ -1,4 +1,4 @@ - + Аутентификация коди Кейинги diff --git a/login/src/commonMain/composeResources/values-zh-rCN/strings.xml b/login/src/commonMain/composeResources/values-zh-rCN/strings.xml index 5a8748d3738..5b78cdec196 100644 --- a/login/src/commonMain/composeResources/values-zh-rCN/strings.xml +++ b/login/src/commonMain/composeResources/values-zh-rCN/strings.xml @@ -1,4 +1,4 @@ - + 验证码 下一个 diff --git a/login/src/commonMain/composeResources/values-zh/strings.xml b/login/src/commonMain/composeResources/values-zh/strings.xml index 034612438d4..b1d62951c8f 100644 --- a/login/src/commonMain/composeResources/values-zh/strings.xml +++ b/login/src/commonMain/composeResources/values-zh/strings.xml @@ -1,8 +1,7 @@ - + 添加新账户 双重身份验证 - 无法连接网络 您需要连接互联网才能打开或关闭双因素身份验证。 尝试重新连接 检查状态... @@ -67,4 +66,4 @@ 导入成功 登录被取消 授权结果无效 - \ No newline at end of file + \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-cs/strings.xml b/stock-usecase/src/main/res/values-cs/strings.xml index fb96d36b933..3d44027ed80 100644 --- a/stock-usecase/src/main/res/values-cs/strings.xml +++ b/stock-usecase/src/main/res/values-cs/strings.xml @@ -24,7 +24,7 @@ Pouze pro zaměstnance ICRC Uživatelské jméno Heslo - Zapomenuté heslo? + Zapomenuté heslo\? Načítání nedávných aktivit… Ještě jste nevykonali žádnou činnost @@ -88,23 +88,21 @@ Než budete moci pokračovat, musí být vyplněno pole zařízení - \n Před pokračováním je třeba vyplnit pole \"Distribuováno do\". - - Než budete moci pokračovat, musí být vyplněno pole „Distribuováno do“. - - \n Opravdu se chcete vrátit na předchozí obrazovku?\n Pokud se rozhodnete pokračovat, ztratíte právě zadané údaje.\n + \\n Před pokračováním je třeba vyplnit pole \"Distribuováno do\". + \n Než budete moci pokračovat, musí být vyplněno pole „Distribuováno do“.\n + \n Opravdu se chcete vrátit na předchozí obrazovku\?\n Pokud se rozhodnete pokračovat, ztratíte právě zadané údaje.\n Transakce byla úspěšně dokončena! Transakce byla úspěšně zrušena! - \n Opravdu chcete vynutit synchronizaci?\n - Opravdu se chcete odhlásit? + \n Opravdu chcete vynutit synchronizaci\?\n + Opravdu se chcete odhlásit\? - \n Opravdu chcete trvale odstranit záznam pro opravu \"%1$s\"?\n Tuto akci nelze vzít zpět.\n - \n Opravdu chcete trvale odstranit položku pro distribuci \"%1$s\"?\n Tuto akci nelze vzít zpět.\n - \n Opravdu chcete trvale odstranit položku pro vyřazení \"%1$s\"?\n Tuto akci nelze vrátit zpět.\n + \\n Opravdu chcete trvale odstranit záznam pro opravu \"%1$s\"\?\\n Tuto akci nelze vzít zpět.\\n + \\n Opravdu chcete trvale odstranit položku pro distribuci \"%1$s\"\?\\n Tuto akci nelze vzít zpět.\\n + \\n Opravdu chcete trvale odstranit položku pro vyřazení \"%1$s\"\?\\n Tuto akci nelze vrátit zpět.\\n %d položka @@ -165,7 +163,7 @@ Vyberte požadovaný jazyk Restartovat později - \n Aby se však změny projevily, je třeba aplikaci restartovat,\n všechny neuložené změny budou ztraceny.\n\nChcete pokračovat v restartu?\n + \n Aby se však změny projevily, je třeba aplikaci restartovat,\n všechny neuložené změny budou ztraceny.\n\nChcete pokračovat v restartu\?\n Potvrdit restart Skenování zrušeno! @@ -200,9 +198,7 @@ Nebyl zjištěn žádný hlasový vstup Nastala neznámá chyba. Nenumerický vstup není povolen: \"%s\" - - Zadání záporného čísla není povoleno: \"%s\" - + \n Zadání záporného čísla není povoleno: \"%s\"\n Nelze načíst konfiguraci OpenID diff --git a/stock-usecase/src/main/res/values-es/strings.xml b/stock-usecase/src/main/res/values-es/strings.xml index 2159037a0c9..1667ef2199e 100644 --- a/stock-usecase/src/main/res/values-es/strings.xml +++ b/stock-usecase/src/main/res/values-es/strings.xml @@ -24,7 +24,7 @@ Solo para miembros del personal del CICR Nombre de usuario Contraseña - ¿Has olvidado tu contraseña? + ¿Has olvidado tu contraseña\? Cargando actividades recientes… Aún no has realizado ninguna actividad @@ -88,9 +88,7 @@ Debe seleccionar el establecimiento antes de poder continuar - - Se debe completar el campo \"Distribuido a\" antes de poder continuar - + \n Se debe completar el campo \"Distribuido a\" antes de poder continuar\n ¡La transacción se completó exitosamente! @@ -190,9 +188,7 @@ android.permission.RECORD_AUDIO No se detectó entrada de voz Se ha producido un error desconocido. No se permiten entradas no numéricas: \"%s\" - - No se permite la entrada de números negativos: \"%s\" - + \n No se permite la entrada de números negativos: \"%s\"\n No se puede cargar la configuración de OpenID diff --git a/stock-usecase/src/main/res/values-lo/strings.xml b/stock-usecase/src/main/res/values-lo/strings.xml index 9abac5c86e1..06659f9ef60 100644 --- a/stock-usecase/src/main/res/values-lo/strings.xml +++ b/stock-usecase/src/main/res/values-lo/strings.xml @@ -15,7 +15,7 @@ ເຂົ້າສູ່ລະບົບດ້ວຍບັນຊີ ICRC ຊື່ຜູ້ໃຊ້ ລະຫັດຜ່ານ - ລຶມລະຫັດຜ່ານ? + ລຶມລະຫັດຜ່ານ\? ດຳເນີນ @@ -64,8 +64,7 @@ ບໍ່ຖືກຕ້ອງ ຂໍ້ຜິດພາດທາງເຄື່ອຂ່າຍ ການເຮັດວຽກຂອງອິນເຕີເນັດໝົດເວລາແລ້ວ - -ບໍ່ອະນຸຍາດໃຫ້ປ້ອນຕົວເລກລົບ:\"%s\" + \nບໍ່ອະນຸຍາດໃຫ້ປ້ອນຕົວເລກລົບ:\"%s\" ບໍ່ມີການເຊື່ອມຕໍ່ອິນເຕີເນັດ diff --git a/stock-usecase/src/main/res/values-nl/strings.xml b/stock-usecase/src/main/res/values-nl/strings.xml index 4c2f1bd7345..97e65126ff9 100644 --- a/stock-usecase/src/main/res/values-nl/strings.xml +++ b/stock-usecase/src/main/res/values-nl/strings.xml @@ -24,7 +24,7 @@ Alleen voor ICRC-personeelsleden Gebruikersnaam Wachtwoord - Wachtwoord vergeten? + Wachtwoord vergeten\? Recente activiteiten laden… U moet nog enige activiteit uitvoeren @@ -81,15 +81,15 @@ Er moet een transactietype worden geselecteerd en alle velden moeten zijn ingevuld voordat u verder kunt gaan Het faciliteitsveld moet worden ingevuld voordat u verder kunt gaan Het veld \"Gedistribueerd naar\" moet zijn ingevuld voordat u verder kunt gaan - Weet u zeker dat u terug wilt naar het vorige scherm? U verliest de zojuist ingevoerde gegevens als u besluit door te gaan. + Weet u zeker dat u terug wilt naar het vorige scherm\? U verliest de zojuist ingevoerde gegevens als u besluit door te gaan. De transactie is succesvol afgerond! De transactie is succesvol geannuleerd! - Weet u zeker dat u synchronisatie wilt forceren? - Weet u zeker dat u wilt uitloggen? + Weet u zeker dat u synchronisatie wilt forceren\? + Weet u zeker dat u wilt uitloggen\? - Weet u zeker dat u de invoer voor de correctie van \"%1$s permanent wilt verwijderen\"? Deze actie kan niet ongedaan gemaakt worden. - Weet u zeker dat u het item voor de distributie van \"%1$s permanent wilt verwijderen\"? Deze actie kan niet ongedaan gemaakt worden. - Weet u zeker dat u de invoer voor het weggooien van \"%1$s permanent wilt verwijderen\"? Deze actie kan niet ongedaan gemaakt worden. + Weet u zeker dat u de invoer voor de correctie van \"%1$s permanent wilt verwijderen\"\? Deze actie kan niet ongedaan gemaakt worden. + Weet u zeker dat u het item voor de distributie van \"%1$s permanent wilt verwijderen\"\? Deze actie kan niet ongedaan gemaakt worden. + Weet u zeker dat u de invoer voor het weggooien van \"%1$s permanent wilt verwijderen\"\? Deze actie kan niet ongedaan gemaakt worden. %d item @@ -132,7 +132,7 @@ Selecteer uw gewenste taal Later opnieuw opstarten - De toepassing moet opnieuw worden gestart om de wijzigingen door te voeren, maar alle niet-opgeslagen wijzigingen gaan verloren.\n\nWilt u doorgaan met de herstart? + De toepassing moet opnieuw worden gestart om de wijzigingen door te voeren, maar alle niet-opgeslagen wijzigingen gaan verloren.\n\nWilt u doorgaan met de herstart\? Bevestig opnieuw opstarten Scan geannuleerd! Er is een fout opgetreden tijdens het uitloggen. Probeer het later opnieuw. diff --git a/stock-usecase/src/main/res/values-pt/strings.xml b/stock-usecase/src/main/res/values-pt/strings.xml index e6acc163129..4d68792affe 100644 --- a/stock-usecase/src/main/res/values-pt/strings.xml +++ b/stock-usecase/src/main/res/values-pt/strings.xml @@ -24,7 +24,7 @@ Apenas para membros do ICRC Nome de utilizador Senha - Esqueceu a password? + Esqueceu a password\? Carregar actividades recentes… Ainda não realizou nenhuma atividade @@ -87,9 +87,7 @@ O campo da instalação deve ser preenchido antes de prosseguir - - The ‘Distributed to’ field must be filled in before proceeding - + \n The ‘Distributed to’ field must be filled in before proceeding\n A transação foi concluída com êxito! @@ -186,9 +184,7 @@ Não foi detectada qualquer entrada de voz Ocorreu um erro desconhecido.  Não é permitida a introdução de dados não numéricos: \"%s\" - - A introdução de números negativos não é permitida:\"%s\" - + \n A introdução de números negativos não é permitida:\"%s\"\n Não é possível carregar a configuração do OpenID diff --git a/stock-usecase/src/main/res/values-uz-rUZ/strings.xml b/stock-usecase/src/main/res/values-uz-rUZ/strings.xml index 5fabe313339..774489d1f0f 100644 --- a/stock-usecase/src/main/res/values-uz-rUZ/strings.xml +++ b/stock-usecase/src/main/res/values-uz-rUZ/strings.xml @@ -24,15 +24,15 @@ Faqat ICRC xodimlar uchun Фойдаланувчи исми Parol - Parolni unutdingizmi? + Parolni unutdingizmi\? - Oxirgi harakatlar yuklanmoqda & # 8230; + Oxirgi harakatlar yuklanmoqda… Siz hali hech qanday faoliyatni amalga oshirmayapsiz - Metadata sinxronlanmoqda & # 8230; + Metadata sinxronlanmoqda… Meta-maʼlumotlarni sinxronlash tugallanmadi - Ma\'lumotlarni sinxronlash & # 8230; + Ma\'lumotlarni sinxronlash… Maʼlumotlarni sinxronlash tugallanmadi Metadata sinxronlash tugallandi! Sinxronlash tugallandi! @@ -42,7 +42,7 @@ Ko‘rib chiqish Shtrix-kodni skanerlash - Skanerlash & # 8230; + Skanerlash… Elementni qidirish Излаш... Oʼchirib tashlash @@ -157,8 +157,7 @@ Ovozli matn aniqlanmadi Номаълум хатолик юз берди Raqamsiz kiritishga ruxsat berilmagan: \"%s\" - Raqamni salbiy kiritish mumkin emas: \"%s\" - + Raqamni salbiy kiritish mumkin emas: \"%s\"\n OpenID konfiguratsiyasini yuklab boʻlmadi OpenID bilan autentifikatsiya qilishda kutilmagan xatolik yuz berdi diff --git a/stock-usecase/src/main/res/values-vi/strings.xml b/stock-usecase/src/main/res/values-vi/strings.xml index 1939695e9d3..742d15dc515 100644 --- a/stock-usecase/src/main/res/values-vi/strings.xml +++ b/stock-usecase/src/main/res/values-vi/strings.xml @@ -24,13 +24,13 @@ Chỉ dành cho nhân viên ICRC Tên đăng nhập Mật khẩu - Quên mật khẩu? + Quên mật khẩu\? Đang tải các hoạt động gần đây… Bạn chưa thực hiện bất kỳ hoạt động nào - Đang đồng bộ siêu dữ liệu… + Đang đồng bộ siêu dữ liệu&#8230 Không thể hoàn thành đồng bộ siêu dữ liệu Đang đồng bộ dữ liệuಞ Không thể hoàn thành đồng bộ dữ liệu @@ -88,9 +88,7 @@ Điền đầy đủ các trường dữ liệu cơ sở trước khi bạn có thể tiếp tục - - Trường \"Phân bổ đến\" phải được điền đầy đủ trước khi tiếp tục - + \n Điền đầy đủ Trường \"Phân bổ đến\" trước khi tiếp tục\n Giao dịch vưa được hoàn thành! @@ -187,9 +185,7 @@ Không nhận được đầu vào bằng giọng nói Một lỗi không xác định đã xuất hiện. Không chấp nhận đầu vào không phải là số: \"%s\" - - Không chấp nhận đầu vào là số âm: \"%s\" - + \n Không chấp nhận đầu vào là số âm: \"%s\"\n Không thể tải cấu hình OpenID diff --git a/stock-usecase/src/main/res/values-zh/strings.xml b/stock-usecase/src/main/res/values-zh/strings.xml index a3a4ec3c734..e09555bad0b 100644 --- a/stock-usecase/src/main/res/values-zh/strings.xml +++ b/stock-usecase/src/main/res/values-zh/strings.xml @@ -88,10 +88,8 @@ 必须先填写设施字段,然后才能继续 - \n 必须填写 \"分发至 \"字段后才能继续操作 - - 必须填写“分发给”字段才能继续 - + \\n 必须填写 \"分发至 \"字段后才能继续操作 + \n 必须填写“分发给”字段才能继续\n \n 您确定要返回上一屏幕吗?\n 如果您决定继续,您将丢失刚刚输入的数据。\n 交易成功完成! @@ -102,9 +100,9 @@ \n 您确定要强制同步吗?\n 您确定要退出吗? - \n 您确定要永久删除更正“%1$s”\的条目吗?\n 此操作无法撤消。\n - \n 您确定要永久删除“%1$s”\ 的分发条目吗?\n 此操作无法撤消。\n - \n 您确定要永久删除“%1$s”\的丢弃条目吗?\n 此操作无法撤消。\n + \\n 您确定要永久删除更正“%1$s”\的条目吗?\\n 此操作无法撤消。\\n + \\n 您确定要永久删除“%1$s”\ 的分发条目吗?\\n 此操作无法撤消。\\n + \\n 您确定要永久删除“%1$s”\的丢弃条目吗?\\n 此操作无法撤消。\\n %d 项目 @@ -195,9 +193,7 @@ 未检测到语音输入 出现未知错误。 不允许非数字输入:“%s” - - 不允许输入负数:“%s” - + \n 不允许输入负数:“%s”\n 无法加载 OpenID 配置 diff --git a/tracker/src/commonMain/composeResources/values-ar/strings.xml b/tracker/src/commonMain/composeResources/values-ar/strings.xml index 49ad9b39dd4..16ef803b527 100644 --- a/tracker/src/commonMain/composeResources/values-ar/strings.xml +++ b/tracker/src/commonMain/composeResources/values-ar/strings.xml @@ -1,6 +1,6 @@ - لا توجد علاقات ، انقر فوق "+" لإضافة علاقة جديدة. + لا توجد علاقات ، انقر فوق \"+\" لإضافة علاقة جديدة. العلاقة لا توجد بيانات مزامنة... @@ -10,4 +10,6 @@ إزلة بحث اختياري + نعم + لا \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-ckb/strings.xml b/tracker/src/commonMain/composeResources/values-ckb/strings.xml index 194e179ced2..cc9373697a2 100644 --- a/tracker/src/commonMain/composeResources/values-ckb/strings.xml +++ b/tracker/src/commonMain/composeResources/values-ckb/strings.xml @@ -3,4 +3,6 @@ لابردن لابردن گەڕان + بەڵێ + نەخێر \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-cs/strings.xml b/tracker/src/commonMain/composeResources/values-cs/strings.xml index 23c94f46bf8..d005c9bff96 100644 --- a/tracker/src/commonMain/composeResources/values-cs/strings.xml +++ b/tracker/src/commonMain/composeResources/values-cs/strings.xml @@ -19,5 +19,6 @@ Hledat Volitelný Spustit - - \ No newline at end of file + ano + ne + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-en-rUS/strings.xml b/tracker/src/commonMain/composeResources/values-en-rUS/strings.xml index b2079e4cc5a..3e959f67e0a 100644 --- a/tracker/src/commonMain/composeResources/values-en-rUS/strings.xml +++ b/tracker/src/commonMain/composeResources/values-en-rUS/strings.xml @@ -1,4 +1,5 @@ + Show less Cancel \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-es-rES/strings.xml b/tracker/src/commonMain/composeResources/values-es-rES/strings.xml index 83326a8a023..70c2bef51df 100644 --- a/tracker/src/commonMain/composeResources/values-es-rES/strings.xml +++ b/tracker/src/commonMain/composeResources/values-es-rES/strings.xml @@ -1,10 +1,12 @@ - No hay relaciones, haga click en "+" para crear una nueva. + No hay relaciones, haga click en \"+\" para crear una nueva. Relación No hay datos Sincronizando... Cancelar Eliminar Buscar + + no \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-es/strings.xml b/tracker/src/commonMain/composeResources/values-es/strings.xml index 5f312bc0403..302f58c87a9 100644 --- a/tracker/src/commonMain/composeResources/values-es/strings.xml +++ b/tracker/src/commonMain/composeResources/values-es/strings.xml @@ -1,6 +1,6 @@ - No hay relaciones, haga click en "+" para crear una nueva. + No hay relaciones, haga click en \"+\" para crear una nueva. Relación creada el ¿Eliminar %1$s? El %1$s se eliminará. Esta acción no puede deshacerse. @@ -17,4 +17,7 @@ Borrar búsqueda Buscar Opcional + Solo coincidencias exactas + + no \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-fr/strings.xml b/tracker/src/commonMain/composeResources/values-fr/strings.xml index d1753b587c8..f4f756a26d1 100644 --- a/tracker/src/commonMain/composeResources/values-fr/strings.xml +++ b/tracker/src/commonMain/composeResources/values-fr/strings.xml @@ -1,6 +1,6 @@ - Il n\'y a pas de relations, cliquez "+" pour en ajouter une nouvelle. + Il n\'y a pas de relations, cliquez \"+\" pour en ajouter une nouvelle. Relation créée le Supprimer %1$s? Le fichier %1$s sera supprimé. Cette action est irréversible. @@ -15,4 +15,7 @@ Supprimer Rechercher Optional + Correspondances exactes uniquement + oui + non \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-hi-rIN/strings.xml b/tracker/src/commonMain/composeResources/values-hi-rIN/strings.xml index 27cb0420f55..6845fc86503 100644 --- a/tracker/src/commonMain/composeResources/values-hi-rIN/strings.xml +++ b/tracker/src/commonMain/composeResources/values-hi-rIN/strings.xml @@ -19,5 +19,4 @@ सर्च करें / खोजें वैकल्पिक लॉन्च - - \ No newline at end of file + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-id/strings.xml b/tracker/src/commonMain/composeResources/values-id/strings.xml index 181e9438838..cba81ebfdd6 100644 --- a/tracker/src/commonMain/composeResources/values-id/strings.xml +++ b/tracker/src/commonMain/composeResources/values-id/strings.xml @@ -1,6 +1,6 @@ - Tidak ada hubungan, klik "+" untuk menambahkan yang baru. + Tidak ada hubungan, klik \"+\" untuk menambahkan yang baru. Hubungan Tidak ada data Sedang sinkronisasi... @@ -9,4 +9,6 @@ Batal Hapus Pencarian + ya + tidak \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-km/strings.xml b/tracker/src/commonMain/composeResources/values-km/strings.xml index d49b5cb7837..e7b153c7e3d 100644 --- a/tracker/src/commonMain/composeResources/values-km/strings.xml +++ b/tracker/src/commonMain/composeResources/values-km/strings.xml @@ -6,4 +6,6 @@ លុបចេញ ស្វែងរក មិនមានក៏បាន + យល់ព្រម + មិនព្រម \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-lo/strings.xml b/tracker/src/commonMain/composeResources/values-lo/strings.xml index d56ad65951f..fd5c7b8566f 100644 --- a/tracker/src/commonMain/composeResources/values-lo/strings.xml +++ b/tracker/src/commonMain/composeResources/values-lo/strings.xml @@ -1,6 +1,6 @@ - ບໍ່ມີຄວາມສຳພັນ, ຄລິກ "+" ເພື່ອເພີ່ມໃໝ່ + ບໍ່ມີຄວາມສຳພັນ, ຄລິກ \"+\" ເພື່ອເພີ່ມໃໝ່ ຄວາມສໍາພັນ ບໍ່ມີຂໍ້ມູນ ກຳລັງຊິ້ງຂໍ້ມູນ @@ -10,4 +10,6 @@ ລົບອອກ ຄົ້ນຫາ ​ຢ່າງ​ຕ່ຳ ມີ​ ທັງ​ໝົດ 8 ຄຳ ໃນ​ນັ້ນ​ຕ້ອງ​ມີ​ໂຕ​ໃຫ​ຍ່ 1 ໂຕ ແລະ ໂຕ​ເລກ 1 ໂຕ + ແມ່ນ + ບໍ່ແມ່ນ \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-my/strings.xml b/tracker/src/commonMain/composeResources/values-my/strings.xml index 6b9d631e693..68f2b75e23b 100644 --- a/tracker/src/commonMain/composeResources/values-my/strings.xml +++ b/tracker/src/commonMain/composeResources/values-my/strings.xml @@ -4,4 +4,6 @@ ပယ်ဖျက်သည် ဖယ်ရှားခြင်း မဖြစ်မနေလုပ်ရန်မလိုပါ။ + ဟုတ်ပါသည် + မဟုတ်ပါ \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-nb/strings.xml b/tracker/src/commonMain/composeResources/values-nb/strings.xml index 2de83b014cf..be6710e566e 100644 --- a/tracker/src/commonMain/composeResources/values-nb/strings.xml +++ b/tracker/src/commonMain/composeResources/values-nb/strings.xml @@ -1,6 +1,6 @@ - Det er ingen relasjoner, klikk "+" for å legge til en ny. + Det er ingen relasjoner, klikk \"+\" for å legge til en ny. Relasjon Ingen data Synkroniserer... @@ -10,4 +10,6 @@ Fjern Søk Valgfri + ja + nei \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-nl/strings.xml b/tracker/src/commonMain/composeResources/values-nl/strings.xml index d3556058f1f..c9721c270f8 100644 --- a/tracker/src/commonMain/composeResources/values-nl/strings.xml +++ b/tracker/src/commonMain/composeResources/values-nl/strings.xml @@ -1,6 +1,6 @@ - Er zijn geen relaties, klik op "+" om een nieuwe toe te voegen. + Er zijn geen relaties, klik op \"+\" om een nieuwe toe te voegen. Relatie Geen gegevens Synchroniseren... diff --git a/tracker/src/commonMain/composeResources/values-or/strings.xml b/tracker/src/commonMain/composeResources/values-or/strings.xml new file mode 100644 index 00000000000..a3a33ce7773 --- /dev/null +++ b/tracker/src/commonMain/composeResources/values-or/strings.xml @@ -0,0 +1,5 @@ + + + ହଁ + ନାହିଁ + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-pt-rBR/strings.xml b/tracker/src/commonMain/composeResources/values-pt-rBR/strings.xml index d6c05ff6e29..158f9908b30 100644 --- a/tracker/src/commonMain/composeResources/values-pt-rBR/strings.xml +++ b/tracker/src/commonMain/composeResources/values-pt-rBR/strings.xml @@ -6,4 +6,6 @@ Remover Pesquisar Opcional + sim + não \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-pt/strings.xml b/tracker/src/commonMain/composeResources/values-pt/strings.xml index 18e93aa987d..69ff5bb063e 100644 --- a/tracker/src/commonMain/composeResources/values-pt/strings.xml +++ b/tracker/src/commonMain/composeResources/values-pt/strings.xml @@ -1,6 +1,6 @@ - Não há relacionamentos, clique em "+" para adicionar um novo. + Não há relacionamentos, clique em \"+\" para adicionar um novo. Relação criada em Remover %1$s? O ficheiro %1$s será eliminado. Esta ação não pode ser anulada. @@ -17,4 +17,6 @@ Limpar pesquisa Procurar Opcional + sim + não \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-ru/strings.xml b/tracker/src/commonMain/composeResources/values-ru/strings.xml index 80ee1d781ad..d633f802f9c 100644 --- a/tracker/src/commonMain/composeResources/values-ru/strings.xml +++ b/tracker/src/commonMain/composeResources/values-ru/strings.xml @@ -1,6 +1,6 @@ - Нет никаких связей, нажмите "+", чтобы добавить новую. + Нет никаких связей, нажмите \"+\", чтобы добавить новую. Связь создана Удалить %1$s? %1$s будет удален. Это действие нельзя отменить. @@ -17,4 +17,6 @@ Очистить поиск Поиск Опционно + Да + нет \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-sv/strings.xml b/tracker/src/commonMain/composeResources/values-sv/strings.xml index a8be5c79de8..111a92dc1c3 100644 --- a/tracker/src/commonMain/composeResources/values-sv/strings.xml +++ b/tracker/src/commonMain/composeResources/values-sv/strings.xml @@ -6,4 +6,6 @@ Ta bort Sök Frivillig + ja + nej \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-uk/strings.xml b/tracker/src/commonMain/composeResources/values-uk/strings.xml index 6d354930f7b..00580e190b5 100644 --- a/tracker/src/commonMain/composeResources/values-uk/strings.xml +++ b/tracker/src/commonMain/composeResources/values-uk/strings.xml @@ -1,6 +1,6 @@ - Немає зв’язків, натисніть «+», щоб додати новий. + Немає зв\'язків, натисніть «+», щоб додати новий. Зв\'язок Немає даних Синхронізація... @@ -11,4 +11,7 @@ Очистити пошук Пошук Необов\'язково + Тільки точне збіги + так + ні \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-uz-rUZ/strings.xml b/tracker/src/commonMain/composeResources/values-uz-rUZ/strings.xml index 6c653b2157b..54847a12554 100644 --- a/tracker/src/commonMain/composeResources/values-uz-rUZ/strings.xml +++ b/tracker/src/commonMain/composeResources/values-uz-rUZ/strings.xml @@ -1,6 +1,6 @@ - Oʼzaro aloqalar mavjud emas, yangisini qoʼshish uchun "+" tugmasini bosing. + Oʼzaro aloqalar mavjud emas, yangisini qoʼshish uchun \"+\" tugmasini bosing. Oʼzaro aloqa Maʼlumot yoʼq Sinxronizatsiyalanmoqda... diff --git a/tracker/src/commonMain/composeResources/values-uz/strings.xml b/tracker/src/commonMain/composeResources/values-uz/strings.xml index 1849a1ca653..01af292fd63 100644 --- a/tracker/src/commonMain/composeResources/values-uz/strings.xml +++ b/tracker/src/commonMain/composeResources/values-uz/strings.xml @@ -1,6 +1,6 @@ - Ўзаро алоқалар мавжуд эмас, янгисини қўшиш учун "+" тугмасини босинг. + Ўзаро алоқалар мавжуд эмас, янгисини қўшиш учун \"+\" тугмасини босинг. Муносабат яратилган сана Ўзаро алоқа Маълумот йўқ @@ -11,4 +11,6 @@ Олиб ташлаш Излаш Ихтиёрий + ҳа + йўқ \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-vi/strings.xml b/tracker/src/commonMain/composeResources/values-vi/strings.xml index 55e0c4c892a..fe6852f210a 100644 --- a/tracker/src/commonMain/composeResources/values-vi/strings.xml +++ b/tracker/src/commonMain/composeResources/values-vi/strings.xml @@ -1,6 +1,6 @@ - Không có mối quan hệ, bấm vào "+" để thêm một mối quan hệ. + Không có mối quan hệ, bấm vào \"+\" để thêm một mối quan hệ. Mối quan hệ đã được tạo trên Bỏ %1$s? %1$s sẽ bị xóa. Hành động này không thể hoàn lại. @@ -17,4 +17,6 @@ Bỏ tìm kiếm Tìm kiếm Không bắt buộc + + không \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-zh-rCN/strings.xml b/tracker/src/commonMain/composeResources/values-zh-rCN/strings.xml index 10588f2a543..44faee14fa9 100644 --- a/tracker/src/commonMain/composeResources/values-zh-rCN/strings.xml +++ b/tracker/src/commonMain/composeResources/values-zh-rCN/strings.xml @@ -17,4 +17,6 @@ 清除搜索 搜索 可选项描述 + + \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-zh/strings.xml b/tracker/src/commonMain/composeResources/values-zh/strings.xml index 1809d042178..de3de53e75a 100644 --- a/tracker/src/commonMain/composeResources/values-zh/strings.xml +++ b/tracker/src/commonMain/composeResources/values-zh/strings.xml @@ -19,5 +19,9 @@ 搜索 可选项描述 启动 - - \ No newline at end of file + 仅限完全匹配 + 必须与值的起始部分相匹配 + 必须与数值的末尾一致 + + + \ No newline at end of file From 921680a6ff93261fcc06141cf98c9b6f5d895ba3 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 13:12:04 +0100 Subject: [PATCH 103/260] Update rule engine to 3.7.0 (#4740) * Update rule engine version to 3.7.0 Co-authored-by: andresmr <3330344+andresmr@users.noreply.github.com> * Add rule-engine-jvm 3.7.0 checksums to verification-metadata.xml Co-authored-by: andresmr <3330344+andresmr@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: andresmr <3330344+andresmr@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- gradle/verification-metadata.xml | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 93622073e88..892a30bb843 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -12,7 +12,7 @@ dagger = '2.57.2' jacoco = '0.8.14' designSystem = "0.7.0-SNAPSHOT" dhis2sdk = "1.14.0-SNAPSHOT" -ruleEngine = "3.6.1" +ruleEngine = "3.7.0" expressionParser = "1.3.1" appcompat = "1.7.1" annotation = "1.9.1" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 3d18c6a6663..d379659e84a 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -13376,6 +13376,14 @@ + + + + + + + + From 26d284734092b5357384e8e41e2c39e9367b918c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Garc=C3=ADa?= Date: Tue, 17 Mar 2026 15:31:20 +0100 Subject: [PATCH 104/260] feat: [ANDROAPP-7456] Legend evaluation for rule actions (#4727) * feat: [ANDROAPP-7456] Legend evaluation for rule actions Implement legend evaluation for Display KeyValue Pair rule actions * fix: [ANDROAPP-7456] Update regex for legend sets + use RuleConstants * Add test class for value parser; identify negative numbers --------- Co-authored-by: Fernando Gomez --- .../indicators/BaseIndicatorRepository.kt | 40 ++++++++++++++++++- .../indicators/BaseIndicatorRepositoryTest.kt | 19 +++++++++ gradle/verification-metadata.xml | 26 ++++++++++++ 3 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/BaseIndicatorRepositoryTest.kt diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/BaseIndicatorRepository.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/BaseIndicatorRepository.kt index d3194241c19..3b9159c663e 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/BaseIndicatorRepository.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/BaseIndicatorRepository.kt @@ -9,6 +9,7 @@ import dhis2.org.analytics.charts.ui.SectionType import io.reactivex.Flowable import io.reactivex.Observable import org.dhis2.commons.resources.ResourceManager +import org.dhis2.mobileProgramRules.RuleConstants import org.dhis2.mobileProgramRules.RuleEngineHelper import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.arch.helpers.UidGeneratorImpl @@ -111,6 +112,8 @@ abstract class BaseIndicatorRepository( val ruleAction = ruleEffect.ruleAction if (ruleEffect.data?.contains("#{") == false) { if (ruleAction.type == ProgramRuleActionType.DISPLAYKEYVALUEPAIR.name) { + val legendSet = ruleAction.values[RuleConstants.LEGENDSET_LABEL] + val color = getLegendColor(ruleEffect.data, legendSet) val indicator = IndicatorModel( ProgramIndicator @@ -119,7 +122,7 @@ abstract class BaseIndicatorRepository( .displayName((ruleAction).content()) .build(), ruleEffect.data, - null, + color, ruleAction.values["location"] ?: DEFAULT_LOCATION, resourceManager.defaultIndicatorLabel(), ) @@ -147,6 +150,29 @@ abstract class BaseIndicatorRepository( return indicators } + private fun getLegendColor( + data: String?, + legendSet: String?, + ): String? { + if (data.isNullOrEmpty() || legendSet.isNullOrEmpty()) return null + + val legendValue = getNumberValue(data) ?: return null + + val legends = + d2 + .legendSetModule() + .legends() + .byStartValue() + .smallerThan(legendValue) + .byEndValue() + .biggerOrEqualTo(legendValue) + .byLegendSet() + .eq(legendSet) + .blockingGet() + + return legends.firstOrNull()?.color() + } + private fun getLegendColorForIndicator( indicator: ProgramIndicator, value: String?, @@ -240,4 +266,16 @@ abstract class BaseIndicatorRepository( } } } + + companion object { + private val NUMBER_REGEX = """-?\b(\d{1,3}(,\d{3})*(\.\d+)?|\d+(\.\d+)?)\b""".toRegex() + + internal fun getNumberValue(data: String): Double? { + return NUMBER_REGEX + .find(data) + ?.value + ?.replace(",", "") + ?.toDoubleOrNull() + } + } } diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/BaseIndicatorRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/BaseIndicatorRepositoryTest.kt new file mode 100644 index 00000000000..4fef338aebb --- /dev/null +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/BaseIndicatorRepositoryTest.kt @@ -0,0 +1,19 @@ +package org.dhis2.usescases.teiDashboard.dashboardfragments.indicators + +import org.dhis2.usescases.teiDashboard.dashboardfragments.indicators.BaseIndicatorRepository.Companion.getNumberValue +import org.junit.Test + +class BaseIndicatorRepositoryTest { + + @Test + fun `Should parse number value`() { + assert(getNumberValue("54") == 54.0) + assert(getNumberValue("54.3") == 54.3) + assert(getNumberValue("-12.2") == -12.2) + assert(getNumberValue("23456.6") == 23456.6) + assert(getNumberValue("23,456.6") == 23456.6) + assert(getNumberValue("54.1%") == 54.1) + assert(getNumberValue("54.1 %") == 54.1) + assert(getNumberValue("<14322>") == 14322.0) + } +} diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index d379659e84a..e3ec308658d 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -14546,6 +14546,16 @@ + + + + + + + + + + @@ -18573,6 +18583,22 @@ + + + + + + + + + + + + + + + + From 2da3def51a629634a3244b11a237779b9853e712 Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Wed, 18 Mar 2026 08:44:02 +0100 Subject: [PATCH 105/260] Update version to 3.4.0-RC --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 892a30bb843..dc0b49a18f9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ navigationCompose = "2.9.2" sdk = "36" minSdk = "23" vCode = "151" -vName = "3.4.0-DEV" +vName = "3.4.0-RC" gradle = "9.0.1" kotlin = '2.3.10' dagger = '2.57.2' From f7830ce111ba2f77569f15210dcf453284616db9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 11:10:01 +0100 Subject: [PATCH 106/260] Update version to 3.4.1-Dev (#4743) Co-authored-by: @dhis2-bot --- gradle/libs.versions.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 892a30bb843..2bb4f07c4cb 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,13 +5,13 @@ navigationCompose = "2.9.2" sdk = "36" minSdk = "23" vCode = "151" -vName = "3.4.0-DEV" +vName = "3.4.1-Dev" gradle = "9.0.1" kotlin = '2.3.10' dagger = '2.57.2' jacoco = '0.8.14' -designSystem = "0.7.0-SNAPSHOT" -dhis2sdk = "1.14.0-SNAPSHOT" +designSystem = "0.7.1-SNAPSHOT" +dhis2sdk = "1.14.1-SNAPSHOT" ruleEngine = "3.7.0" expressionParser = "1.3.1" appcompat = "1.7.1" From b21f24b03cbc494461c888aae38d03976851c47d Mon Sep 17 00:00:00 2001 From: Pablo Date: Wed, 18 Mar 2026 11:46:42 +0100 Subject: [PATCH 107/260] feat: [ANDROAPP-7340] Implement new MainViewModel [skip size] (#4714) * feat: [ANDROAPP-7340] Implement new MainViewModel * feat: [ANDROAPP-7340] Implement new MainViewModel * fix test * fix MainNavigator * refactor init block * rebase * fix dependencies * add unit tests * fix tests --- .../org/dhis2/usescases/main/MainNavigator.kt | 17 + .../org/dhis2/usescases/main/MainPresenter.kt | 3 - .../org/dhis2/usescases/main/MainViewModel.kt | 411 ++++++++++++++++++ .../usescases/main/ui/model/HomeEvent.kt | 35 ++ .../main/ui/model/HomeScreenState.kt | 39 ++ .../dhis2/usescases/main/MainViewModelTest.kt | 214 +++++++++ gradle/verification-metadata.xml | 272 ------------ 7 files changed, 716 insertions(+), 275 deletions(-) create mode 100644 app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/ui/model/HomeEvent.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/ui/model/HomeScreenState.kt create mode 100644 app/src/test/java/org/dhis2/usescases/main/MainViewModelTest.kt diff --git a/app/src/main/java/org/dhis2/usescases/main/MainNavigator.kt b/app/src/main/java/org/dhis2/usescases/main/MainNavigator.kt index 798f60cc68a..0b45b03ad7a 100644 --- a/app/src/main/java/org/dhis2/usescases/main/MainNavigator.kt +++ b/app/src/main/java/org/dhis2/usescases/main/MainNavigator.kt @@ -11,6 +11,11 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import dhis2.org.analytics.charts.ui.GroupAnalyticsFragment import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.dhis2.R @@ -35,6 +40,7 @@ class MainNavigator( @StringRes val title: Int, @IdRes val navViewId: Int, ) { + NONE(-1, -1), PROGRAMS(R.string.done_task, R.id.menu_home), VISUALIZATIONS(R.string.done_task, R.id.menu_home), QR(R.string.QR_SCANNER, R.id.qr_scan), @@ -45,8 +51,15 @@ class MainNavigator( private var currentScreen = MutableLiveData(null) var selectedScreen: LiveData = currentScreen + + private var _currentScreen = MutableStateFlow(MainScreen.NONE) + var selectedScreenFlow: StateFlow = _currentScreen.asStateFlow() + private var currentFragment: Fragment? = null + private val _transitionChannel = Channel() + val transitionChannel = _transitionChannel.receiveAsFlow() + fun isHome(): Boolean = isPrograms() || isVisualizations() fun isPrograms(): Boolean = currentScreen.value == MainScreen.PROGRAMS @@ -90,6 +103,7 @@ class MainNavigator( languageSelectorOpened: Boolean = false, ) { when (MainScreen.valueOf(screenToRestoreName)) { + MainScreen.NONE -> return MainScreen.PROGRAMS -> openPrograms() MainScreen.VISUALIZATIONS -> openVisualizations() MainScreen.QR -> openQR() @@ -132,6 +146,9 @@ class MainNavigator( ) } + /*** + * Replace with _transitionChannel.send(Unit) once the MainViewModel is used + * */ private fun beginTransaction( fragment: Fragment, screen: MainScreen, diff --git a/app/src/main/java/org/dhis2/usescases/main/MainPresenter.kt b/app/src/main/java/org/dhis2/usescases/main/MainPresenter.kt index 00b7764dd44..d1b2cccb56e 100644 --- a/app/src/main/java/org/dhis2/usescases/main/MainPresenter.kt +++ b/app/src/main/java/org/dhis2/usescases/main/MainPresenter.kt @@ -56,9 +56,6 @@ import kotlin.concurrent.atomics.AtomicBoolean import kotlin.concurrent.atomics.ExperimentalAtomicApi import kotlin.coroutines.CoroutineContext -const val DEFAULT = "default" -const val SERVER_ACTION = "Server" -const val DHIS2 = "dhis2_server" const val PLAY_FLAVOR = "dhisPlayServices" @OptIn(ExperimentalAtomicApi::class) diff --git a/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt b/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt new file mode 100644 index 00000000000..f7cb517ffc2 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt @@ -0,0 +1,411 @@ +package org.dhis2.usescases.main + +import android.content.Context +import android.net.Uri +import androidx.core.net.toUri +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.flow.onStart +import kotlinx.coroutines.flow.receiveAsFlow +import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import kotlinx.coroutines.reactive.asFlow +import org.dhis2.commons.filters.FilterManager +import org.dhis2.commons.matomo.Actions.Companion.BLOCK_SESSION_PIN +import org.dhis2.commons.matomo.Actions.Companion.OPEN_ANALYTICS +import org.dhis2.commons.matomo.Actions.Companion.QR_SCANNER +import org.dhis2.commons.matomo.Actions.Companion.SETTINGS +import org.dhis2.commons.matomo.Categories.Companion.HOME +import org.dhis2.commons.matomo.Labels.Companion.CLICK +import org.dhis2.commons.matomo.MatomoAnalyticsController +import org.dhis2.commons.prefs.Preference +import org.dhis2.commons.prefs.PreferenceProvider +import org.dhis2.commons.resources.ResourceManager +import org.dhis2.data.service.VersionRepository +import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.commons.extensions.launchUseCase +import org.dhis2.mobile.sync.domain.SyncStatusController +import org.dhis2.mobile.sync.model.SyncStatusData +import org.dhis2.usescases.main.domain.CheckSingleNavigation +import org.dhis2.usescases.main.domain.ConfigureHomeNavigationBar +import org.dhis2.usescases.main.domain.DeleteAccount +import org.dhis2.usescases.main.domain.DownloadNewVersion +import org.dhis2.usescases.main.domain.GetHomeFilters +import org.dhis2.usescases.main.domain.GetLockAction +import org.dhis2.usescases.main.domain.GetUserName +import org.dhis2.usescases.main.domain.InitialSyncAction +import org.dhis2.usescases.main.domain.LaunchInitialSync +import org.dhis2.usescases.main.domain.LogoutUser +import org.dhis2.usescases.main.domain.ScheduleNewVersionAlert +import org.dhis2.usescases.main.domain.UpdateInitialSyncStatus +import org.dhis2.usescases.main.domain.model.DownloadMethod +import org.dhis2.usescases.main.domain.model.LockAction +import org.dhis2.usescases.main.ui.model.HomeEvent +import org.dhis2.usescases.main.ui.model.HomeScreenState +import org.dhis2.usescases.main.ui.model.VersionToUpdateState +import org.dhis2.usescases.main.ui.model.defaultHomeScreenState +import org.dhis2.utils.analytics.CLOSE_SESSION +import org.hisp.dhis.android.core.organisationunit.OrganisationUnit +import timber.log.Timber + +const val DEFAULT = "default" +const val SERVER_ACTION = "Server" +const val DHIS2 = "dhis2_server" + +class MainViewModel( + private val preferences: PreferenceProvider, + private val filterManager: FilterManager, + private val matomoAnalyticsController: MatomoAnalyticsController, + syncStatusController: SyncStatusController, + versionRepository: VersionRepository, + private val resourceManager: ResourceManager, + private val mainNavigator: MainNavigator, + private val getUserName: GetUserName, + private val configureHomeNavigationBar: ConfigureHomeNavigationBar, + private val getHomeFilters: GetHomeFilters, + private val downloadNewVersion: DownloadNewVersion, + private val logOutUser: LogoutUser, + private val deleteAccount: DeleteAccount, + private val getLockAction: GetLockAction, + private val updateInitialSyncStatus: UpdateInitialSyncStatus, + private val checkSingleNavigation: CheckSingleNavigation, + private val launchInitialSync: LaunchInitialSync, + private val scheduleNewVersionAlert: ScheduleNewVersionAlert, +) : ViewModel() { + private val _homeScreenState = MutableStateFlow(defaultHomeScreenState) + + private val _homeEvents = Channel() + val homeEvents = _homeEvents.receiveAsFlow() + + val homeScreenState = + _homeScreenState + .onStart { + loadData() + }.stateIn( + viewModelScope, + SharingStarted.WhileSubscribed(5000), + defaultHomeScreenState, + ) + + init { + + launchUseCase { + preferences.removeValue(Preference.CURRENT_ORG_UNIT) + } + + syncStatusController + .observeDownloadProcess() + .onEach(::handleDownloadProcess) + .launchIn(viewModelScope) + + mainNavigator.selectedScreenFlow + .filter { it != MainNavigator.MainScreen.NONE } + .onEach(::handleScreen) + .launchIn(viewModelScope) + + versionRepository.newAppVersion + .onEach(::onNewVersionAvailable) + .launchIn(viewModelScope) + + filterManager + .asFlow(viewModelScope) + .onEach { + _homeScreenState.update { + it.copy(activeFilters = filterManager.totalFilters) + } + }.launchIn(viewModelScope) + + filterManager.periodRequest + .asFlow() + .onEach { + _homeEvents.send(HomeEvent.PeriodFilterRequest(it.first)) + }.launchIn(viewModelScope) + + filterManager + .ouTreeFlowable() + .asFlow() + .onEach { + _homeEvents.send(HomeEvent.OrgUnitFilterRequest) + }.launchIn(viewModelScope) + + launchUseCase { + launchInitialSync().fold( + onSuccess = ::handleInitialSyncResult, + onFailure = { + Timber.e(it) + }, + ) + } + } + + private fun handleInitialSyncResult(result: InitialSyncAction) { + when (result) { + InitialSyncAction.Skip -> shouldNavigateToSingleProgram() + InitialSyncAction.Syncing -> { + // Do nothing + } + } + } + + private fun onNewVersionAvailable(version: String?) { + _homeScreenState.update { + it.copy( + versionToUpdate = + when { + version.isNullOrEmpty() -> VersionToUpdateState.None + else -> VersionToUpdateState.New(version) + }, + ) + } + } + + private fun handleScreen(selectedScreen: MainNavigator.MainScreen) { + when (selectedScreen) { + MainNavigator.MainScreen.VISUALIZATIONS -> + trackHomeAnalytics() + + MainNavigator.MainScreen.QR -> + trackQRScanner() + + else -> { + // do nothing + } + } + _homeScreenState.update { + it.copy( + title = resourceManager.getString(selectedScreen.title), + filterButtonVisible = mainNavigator.isPrograms(), + bottomNavigationBarVisible = mainNavigator.isHome(), + syncButtonVisible = mainNavigator.isHome(), + ) + } + } + + private fun loadData() { + launchUseCase { + val userName = getUserName().getOrDefault("") + val navigationBarItems = configureHomeNavigationBar().getOrDefault(emptyList()) + val homeFilters = getHomeFilters().getOrDefault(emptyList()) + val currentScreen = mainNavigator.selectedScreenFlow.value + + _homeScreenState.update { + HomeScreenState( + userName = userName, + title = resourceManager.getString(currentScreen.title), + navigationBarItems = navigationBarItems, + homeFilters = homeFilters, + activeFilters = filterManager.totalFilters, + versionToUpdate = VersionToUpdateState.None, + filterButtonVisible = mainNavigator.isPrograms(), + bottomNavigationBarVisible = mainNavigator.isHome(), + syncButtonVisible = mainNavigator.isHome(), + ) + } + } + } + + private fun handleDownloadProcess(syncStatusData: SyncStatusData) { + when (syncStatusData.running) { + true -> + _homeScreenState.update { + it.copy( + filterButtonVisible = false, + bottomNavigationBarVisible = false, + syncButtonVisible = false, + ) + } + + false -> { + _homeScreenState.update { + it.copy( + filterButtonVisible = true, + bottomNavigationBarVisible = true, + syncButtonVisible = true, + ) + } + onDataSuccess() + if (syncStatusData.isInitialSync) { + shouldNavigateToSingleProgram() + } + } + + else -> { + // do nothing + } + } + } + + private fun shouldNavigateToSingleProgram() { + launchUseCase { + checkSingleNavigation().fold( + onSuccess = { homeItemData -> + _homeEvents.send(HomeEvent.SingleProgramNavigation(homeItemData)) + }, + onFailure = { + Timber.e(it) + }, + ) + } + } + + fun setOrgUnitFilters(selectedOrgUnits: List) { + filterManager.addOrgUnits(selectedOrgUnits) + } + + fun logOut() { + launchUseCase { + matomoAnalyticsController.trackEvent(HOME, CLOSE_SESSION, CLICK) + logOutUser().fold( + onSuccess = { accountCount -> + _homeEvents.send(HomeEvent.GoToLogin(accountCount, false)) + }, + onFailure = { + Timber.e(it) + }, + ) + } + } + + context(context: Context) + fun onDeleteAccount() { + launchUseCase { + _homeEvents.send(HomeEvent.ShowDeleteNotification) + deleteAccount(context.cacheDir).fold( + onSuccess = { accountCount -> + _homeEvents.send(HomeEvent.CancelAllNotifications) + _homeEvents.send(HomeEvent.GoToLogin(accountCount, true)) + }, + onFailure = { + Timber.e(it) + }, + ) + } + } + + fun onSyncAllClick() { + viewModelScope.launch { + _homeEvents.send(HomeEvent.ShowGranularSync) + } + } + + fun showFilter() { + viewModelScope.launch { + _homeEvents.send(HomeEvent.ToggleFilters) + _homeScreenState.update { + it.copy( + bottomNavigationBarVisible = !it.bottomNavigationBarVisible, + ) + } + } + } + + fun onMenuClick() { + viewModelScope.launch { + _homeEvents.send(HomeEvent.ToggleSideMenu) + } + } + + fun onClickSyncManager() { + viewModelScope.launch { + matomoAnalyticsController.trackEvent(HOME, SETTINGS, CLICK) + } + } + + fun onDataSuccess() { + launchUseCase { + updateInitialSyncStatus().fold( + onSuccess = { + // Do nothing + }, + onFailure = { + Timber.e(it) + }, + ) + } + } + + fun trackHomeAnalytics() { + viewModelScope.launch { + matomoAnalyticsController.trackEvent(HOME, OPEN_ANALYTICS, CLICK) + } + } + + fun onBlockSession() { + launchUseCase { + getLockAction().fold( + onSuccess = { result -> + when (result) { + LockAction.BlockSession -> + _homeEvents.send(HomeEvent.BlockSession) + + LockAction.CreatePin -> + _homeEvents.send(HomeEvent.ShowPinDialog) + } + }, + onFailure = { Timber.e(it) }, + ) + } + matomoAnalyticsController.trackEvent(HOME, BLOCK_SESSION_PIN, CLICK) + } + + fun trackQRScanner() { + viewModelScope.launch { + matomoAnalyticsController.trackEvent(HOME, QR_SCANNER, CLICK) + } + } + + fun remindLaterAlertNewVersion() { + _homeScreenState.update { + it.copy( + versionToUpdate = VersionToUpdateState.None, + ) + } + launchUseCase { + scheduleNewVersionAlert() + } + } + + context(context: Context) + fun downloadVersion( + onDownloadCompleted: (Uri) -> Unit, + onLaunchUrl: (Uri) -> Unit, + ) { + launchUseCase { + _homeScreenState.update { + it.copy( + versionToUpdate = VersionToUpdateState.Downloading, + ) + } + downloadNewVersion(context).fold( + onSuccess = { result -> + when (result) { + is DownloadMethod.File -> onDownloadCompleted(result.path.toUri()) + is DownloadMethod.Url -> onLaunchUrl(result.url.toUri()) + } + _homeScreenState.update { + it.copy( + versionToUpdate = VersionToUpdateState.None, + ) + } + }, + onFailure = Timber::e, + ) + } + } + + fun onBackPressed() { + viewModelScope.launch { + when { + !mainNavigator.isHome() -> mainNavigator.openHome() + else -> _homeEvents.send(HomeEvent.BlockSession) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/org/dhis2/usescases/main/ui/model/HomeEvent.kt b/app/src/main/java/org/dhis2/usescases/main/ui/model/HomeEvent.kt new file mode 100644 index 00000000000..bcd4df86591 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/ui/model/HomeEvent.kt @@ -0,0 +1,35 @@ +package org.dhis2.usescases.main.ui.model + +import org.dhis2.commons.filters.FilterManager +import org.dhis2.usescases.main.HomeItemData + +sealed interface HomeEvent { + data class SingleProgramNavigation( + val homeItemData: HomeItemData, + ) : HomeEvent + + data class GoToLogin( + val accountsCount: Int, + val isDeletion: Boolean, + ) : HomeEvent + + data object ShowDeleteNotification : HomeEvent + + data object CancelAllNotifications : HomeEvent + + data object ShowGranularSync : HomeEvent + + data object BlockSession : HomeEvent + + data object ShowPinDialog : HomeEvent + + data class PeriodFilterRequest( + val periodRequest: FilterManager.PeriodRequest, + ) : HomeEvent + + data object OrgUnitFilterRequest : HomeEvent + + data object ToggleSideMenu : HomeEvent + + data object ToggleFilters : HomeEvent +} diff --git a/app/src/main/java/org/dhis2/usescases/main/ui/model/HomeScreenState.kt b/app/src/main/java/org/dhis2/usescases/main/ui/model/HomeScreenState.kt new file mode 100644 index 00000000000..82a05a193b4 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/ui/model/HomeScreenState.kt @@ -0,0 +1,39 @@ +package org.dhis2.usescases.main.ui.model + +import org.dhis2.commons.filters.FilterItem +import org.dhis2.usescases.main.domain.model.BottomNavigationItem + +data class HomeScreenState( + val userName: String, + val title: String, + val navigationBarItems: List, + val homeFilters: List, + val activeFilters: Int, + val versionToUpdate: VersionToUpdateState, + val filterButtonVisible: Boolean, + val bottomNavigationBarVisible: Boolean, + val syncButtonVisible: Boolean, +) + +val defaultHomeScreenState = + HomeScreenState( + userName = "", + title = "", + navigationBarItems = emptyList(), + homeFilters = emptyList(), + activeFilters = 0, + versionToUpdate = VersionToUpdateState.None, + filterButtonVisible = false, + bottomNavigationBarVisible = false, + syncButtonVisible = false, + ) + +sealed class VersionToUpdateState { + data object None : VersionToUpdateState() + + data class New( + val version: String, + ) : VersionToUpdateState() + + data object Downloading : VersionToUpdateState() +} diff --git a/app/src/test/java/org/dhis2/usescases/main/MainViewModelTest.kt b/app/src/test/java/org/dhis2/usescases/main/MainViewModelTest.kt new file mode 100644 index 00000000000..f52dc355fdb --- /dev/null +++ b/app/src/test/java/org/dhis2/usescases/main/MainViewModelTest.kt @@ -0,0 +1,214 @@ +package org.dhis2.usescases.main + +import android.content.Context +import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import app.cash.turbine.test +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.runTest +import org.dhis2.commons.filters.FilterManager +import org.dhis2.commons.matomo.Actions.Companion.BLOCK_SESSION_PIN +import org.dhis2.commons.matomo.Actions.Companion.SETTINGS +import org.dhis2.commons.matomo.Categories.Companion.HOME +import org.dhis2.commons.matomo.Labels +import org.dhis2.commons.matomo.Labels.Companion.CLICK +import org.dhis2.commons.matomo.MatomoAnalyticsController +import org.dhis2.commons.prefs.PreferenceProvider +import org.dhis2.commons.resources.ResourceManager +import org.dhis2.data.service.VersionRepository +import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.sync.domain.SyncStatusController +import org.dhis2.mobile.sync.model.SyncStatusData +import org.dhis2.usescases.main.domain.CheckSingleNavigation +import org.dhis2.usescases.main.domain.ConfigureHomeNavigationBar +import org.dhis2.usescases.main.domain.DeleteAccount +import org.dhis2.usescases.main.domain.DownloadNewVersion +import org.dhis2.usescases.main.domain.GetHomeFilters +import org.dhis2.usescases.main.domain.GetLockAction +import org.dhis2.usescases.main.domain.GetUserName +import org.dhis2.usescases.main.domain.InitialSyncAction +import org.dhis2.usescases.main.domain.LaunchInitialSync +import org.dhis2.usescases.main.domain.LogoutUser +import org.dhis2.usescases.main.domain.ScheduleNewVersionAlert +import org.dhis2.usescases.main.domain.UpdateInitialSyncStatus +import org.dhis2.usescases.main.domain.model.LockAction +import org.dhis2.usescases.main.ui.model.HomeEvent +import org.dhis2.utils.MainCoroutineScopeRule +import org.dhis2.utils.analytics.CLOSE_SESSION +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.mockito.kotlin.any +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock +import org.mockito.kotlin.times +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever +import java.io.File + +@OptIn(ExperimentalCoroutinesApi::class) +class MainViewModelTest { + + @get:Rule + val instantExecutorRule = InstantTaskExecutorRule() + + @get:Rule + val coroutineScopeRule = MainCoroutineScopeRule() + + private val preferences: PreferenceProvider = mock() + private val filterManager: FilterManager = mock() + private val matomoAnalyticsController: MatomoAnalyticsController = mock() + private val syncStatusController: SyncStatusController = mock() + private val versionRepository: VersionRepository = mock() + private val resourceManager: ResourceManager = mock() + private val mainNavigator: MainNavigator = mock() + private val getUserName: GetUserName = mock() + private val configureHomeNavigationBar: ConfigureHomeNavigationBar = mock() + private val getHomeFilters: GetHomeFilters = mock() + private val downloadNewVersion: DownloadNewVersion = mock() + private val logOutUser: LogoutUser = mock() + private val deleteAccount: DeleteAccount = mock() + private val getLockAction: GetLockAction = mock() + private val updateInitialSyncStatus: UpdateInitialSyncStatus = mock() + private val checkSingleNavigation: CheckSingleNavigation = mock() + private val launchInitialSync: LaunchInitialSync = mock() + private val scheduleNewVersionAlert: ScheduleNewVersionAlert = mock() + + private lateinit var viewModel: MainViewModel + + private val mockedFilterManagerMock = MutableStateFlow(0) + + private val syncStatusFlow = MutableStateFlow(SyncStatusData()) + private val screenFlow = MutableStateFlow(MainNavigator.MainScreen.NONE) + private val newVersionFlow = MutableSharedFlow() + + @Before + fun setUp() = runTest { + whenever(syncStatusController.observeDownloadProcess()) doReturn syncStatusFlow + whenever(mainNavigator.selectedScreenFlow) doReturn screenFlow + whenever(versionRepository.newAppVersion) doReturn newVersionFlow + whenever(filterManager.asFlow(any())) doReturn mockedFilterManagerMock + whenever(filterManager.periodRequest) doReturn mock() + whenever(filterManager.ouTreeFlowable()) doReturn mock() + whenever(launchInitialSync()) doReturn Result.success(InitialSyncAction.Skip) + whenever(checkSingleNavigation()) doReturn Result.failure(Exception("no single navigation")) + + viewModel = MainViewModel( + preferences = preferences, + filterManager = filterManager, + matomoAnalyticsController = matomoAnalyticsController, + syncStatusController = syncStatusController, + versionRepository = versionRepository, + resourceManager = resourceManager, + mainNavigator = mainNavigator, + getUserName = getUserName, + configureHomeNavigationBar = configureHomeNavigationBar, + getHomeFilters = getHomeFilters, + downloadNewVersion = downloadNewVersion, + logOutUser = logOutUser, + deleteAccount = deleteAccount, + getLockAction = getLockAction, + updateInitialSyncStatus = updateInitialSyncStatus, + checkSingleNavigation = checkSingleNavigation, + launchInitialSync = launchInitialSync, + scheduleNewVersionAlert = scheduleNewVersionAlert + ) + } + + @Test + fun `Should save default settings and render user name when the activity is resumed`() = + runTest { + whenever(getUserName()) doReturn Result.success("mocked_user_name") + whenever(configureHomeNavigationBar()) doReturn Result.success(emptyList()) + whenever(getHomeFilters()) doReturn Result.success(emptyList()) + whenever(resourceManager.getString(-1)) doReturn "" + whenever(filterManager.totalFilters) doReturn 0 + whenever(mainNavigator.isPrograms()) doReturn false + whenever(mainNavigator.isHome()) doReturn true + + viewModel.homeScreenState.test { + awaitItem() + assertTrue(awaitItem().userName == "mocked_user_name") + } + } + + @Test + fun `Should log out`() = + runTest { + whenever(logOutUser()) doReturn Result.success(1) + viewModel.homeEvents.test { + viewModel.logOut() + advanceUntilIdle() + verify(matomoAnalyticsController).trackEvent(HOME, CLOSE_SESSION, CLICK) + assertTrue(awaitItem() == HomeEvent.GoToLogin(1, false)) + } + } + + @Test + fun `Should block session`() = runTest { + + whenever(getLockAction()) doReturn Result.success(LockAction.BlockSession) + + viewModel.homeEvents.test { + viewModel.onBlockSession() + assertTrue(awaitItem() == HomeEvent.BlockSession) + verify(matomoAnalyticsController).trackEvent( + HOME, BLOCK_SESSION_PIN, Labels.CLICK + ) + } + } + + @Test + fun `Should open drawer when menu is clicked`() = runTest { + viewModel.homeEvents.test { + viewModel.onMenuClick() + assertTrue(awaitItem() == HomeEvent.ToggleSideMenu) + } + } + + @Test + fun `should return to home section when user taps back in a different section`() = runTest { + whenever(mainNavigator.isHome()) doReturn false + viewModel.onBackPressed() + advanceUntilIdle() + verify(mainNavigator, times(1)).openHome() + } + + @Test + fun `should close app when user taps back in a home section`() = runTest { + whenever(mainNavigator.isHome()) doReturn true + viewModel.homeEvents.test { + viewModel.onBackPressed() + assertTrue(awaitItem() is HomeEvent.BlockSession) + } + } + + @Test + fun `Should track event when clicking on SyncManager`() = runTest { + viewModel.onClickSyncManager() + advanceUntilIdle() + verify(matomoAnalyticsController).trackEvent(HOME, SETTINGS, CLICK) + } + + @Test + fun `Should go to delete account`() = runTest { + + whenever(deleteAccount(any())) doReturn Result.success(1) + + viewModel.homeEvents.test { + val mockedContext = mock() + whenever(mockedContext.cacheDir) doReturn File("random") + with(mockedContext) { + viewModel.onDeleteAccount() + } + + assertTrue(awaitItem() == HomeEvent.ShowDeleteNotification) + assertTrue(awaitItem() == HomeEvent.CancelAllNotifications) + assertTrue(awaitItem() == HomeEvent.GoToLogin(1, true)) + + } + } +} diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index e3ec308658d..fa92bd1a7dd 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -857,12 +857,6 @@ - - - - - @@ -955,16 +949,6 @@ - - - - - - - - @@ -1035,12 +1019,6 @@ - - - - - @@ -1109,17 +1087,6 @@ - - - - - - - - @@ -1681,16 +1648,6 @@ - - - - - - - - @@ -1731,16 +1688,6 @@ - - - - - - - - @@ -13941,16 +13888,6 @@ - - - - - - - - @@ -13995,16 +13932,6 @@ - - - - - - - - @@ -14141,17 +14068,6 @@ - - - - - - - - @@ -14201,17 +14117,6 @@ - - - - - - - - @@ -14300,17 +14205,6 @@ - - - - - - - - @@ -14478,12 +14372,6 @@ - - - - - @@ -14597,16 +14485,6 @@ - - - - - - - - @@ -14683,17 +14561,6 @@ - - - - - - - - @@ -14747,17 +14614,6 @@ - - - - - - - - @@ -14900,12 +14756,6 @@ - - - - - @@ -14934,16 +14784,6 @@ - - - - - - - - @@ -15291,17 +15131,6 @@ - - - - - - - - @@ -15401,16 +15230,6 @@ - - - - - - - - @@ -15471,16 +15290,6 @@ - - - - - - - - @@ -15567,16 +15376,6 @@ - - - - - - - - @@ -15708,16 +15507,6 @@ - - - - - - - - @@ -15771,16 +15560,6 @@ - - - - - - - - @@ -15832,16 +15611,6 @@ - - - - - - - - @@ -15924,17 +15693,6 @@ - - - - - - - - @@ -16070,16 +15828,6 @@ - - - - - - - - @@ -16130,16 +15878,6 @@ - - - - - - - - @@ -16181,16 +15919,6 @@ - - - - - - - - From 846943496b6a85692dcce58d54e570516ecfc78c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Wed, 18 Mar 2026 12:49:19 +0100 Subject: [PATCH 108/260] translations: remove-unused-strings-resources [skip size] (#4742) * fix(translations): sync translations and update gradle verification metadata * fix: remove unused strings from modules --- .../composeResources/values-ar/strings.xml | 2 - .../composeResources/values-cs/strings.xml | 2 - .../composeResources/values-es/strings.xml | 2 - .../values-hi-rIN/strings.xml | 2 - .../composeResources/values-nb/strings.xml | 1 - .../composeResources/values-ru/strings.xml | 2 - .../composeResources/values-vi/strings.xml | 2 - .../composeResources/values-zh/strings.xml | 2 - .../composeResources/values/strings.xml | 2 - app/src/main/res/values-ar-rIQ/strings.xml | 40 -- app/src/main/res/values-ar/strings.xml | 407 ++--------------- app/src/main/res/values-bn/strings.xml | 16 - app/src/main/res/values-ckb/strings.xml | 45 -- app/src/main/res/values-cs/strings.xml | 406 +---------------- app/src/main/res/values-da/strings.xml | 28 -- app/src/main/res/values-en-rUS/strings.xml | 26 -- app/src/main/res/values-es-rES/strings.xml | 354 +------------- app/src/main/res/values-es/strings.xml | 399 +--------------- app/src/main/res/values-fr/strings.xml | 378 +-------------- app/src/main/res/values-hi-rIN/strings.xml | 63 --- app/src/main/res/values-id/strings.xml | 430 +----------------- app/src/main/res/values-km/strings.xml | 165 ------- app/src/main/res/values-lo/strings.xml | 355 +-------------- app/src/main/res/values-my/strings.xml | 46 -- app/src/main/res/values-nb/strings.xml | 321 +------------ app/src/main/res/values-ne/strings.xml | 7 - app/src/main/res/values-nl/strings.xml | 383 +--------------- app/src/main/res/values-or/strings.xml | 10 - app/src/main/res/values-prs/strings.xml | 63 --- app/src/main/res/values-ps/strings.xml | 61 --- app/src/main/res/values-pt-rBR/strings.xml | 70 --- app/src/main/res/values-pt/strings.xml | 401 +--------------- app/src/main/res/values-ro/strings.xml | 27 -- app/src/main/res/values-ru/strings.xml | 386 +--------------- app/src/main/res/values-si/strings.xml | 23 - app/src/main/res/values-sv/strings.xml | 145 ------ app/src/main/res/values-tet/strings.xml | 32 -- app/src/main/res/values-tg/strings.xml | 44 -- app/src/main/res/values-uk/strings.xml | 366 +-------------- app/src/main/res/values-ur/strings.xml | 63 --- app/src/main/res/values-uz-rUZ/strings.xml | 298 ------------ app/src/main/res/values-uz/strings.xml | 339 +------------- app/src/main/res/values-vi/strings.xml | 387 +--------------- app/src/main/res/values-zh-rCN/strings.xml | 386 +--------------- app/src/main/res/values-zh/strings.xml | 385 +--------------- app/src/main/res/values/strings.xml | 396 +--------------- .../src/main/res/values-ar-rIQ/strings.xml | 5 - commons/src/main/res/values-ar/strings.xml | 14 - commons/src/main/res/values-bn/strings.xml | 1 - commons/src/main/res/values-ckb/strings.xml | 2 - commons/src/main/res/values-cs/strings.xml | 23 +- commons/src/main/res/values-da/strings.xml | 3 - .../src/main/res/values-en-rUS/strings.xml | 1 - .../src/main/res/values-es-rES/strings.xml | 11 - commons/src/main/res/values-es/strings.xml | 23 +- commons/src/main/res/values-fr/strings.xml | 14 - .../src/main/res/values-hi-rIN/strings.xml | 4 - commons/src/main/res/values-id/strings.xml | 10 - commons/src/main/res/values-km/strings.xml | 8 - commons/src/main/res/values-lo/strings.xml | 12 - commons/src/main/res/values-my/strings.xml | 5 - commons/src/main/res/values-nb/strings.xml | 12 - commons/src/main/res/values-ne/strings.xml | 2 - commons/src/main/res/values-nl/strings.xml | 11 - commons/src/main/res/values-or/strings.xml | 2 - commons/src/main/res/values-prs/strings.xml | 6 - commons/src/main/res/values-ps/strings.xml | 5 - .../src/main/res/values-pt-rBR/strings.xml | 5 - commons/src/main/res/values-pt/strings.xml | 14 - commons/src/main/res/values-ro/strings.xml | 1 - commons/src/main/res/values-ru/strings.xml | 23 +- commons/src/main/res/values-si/strings.xml | 3 - commons/src/main/res/values-sv/strings.xml | 8 - commons/src/main/res/values-tet/strings.xml | 5 - commons/src/main/res/values-tg/strings.xml | 5 - commons/src/main/res/values-uk/strings.xml | 12 - commons/src/main/res/values-ur/strings.xml | 6 - .../src/main/res/values-uz-rUZ/strings.xml | 10 - commons/src/main/res/values-uz/strings.xml | 14 - commons/src/main/res/values-vi/strings.xml | 16 +- .../src/main/res/values-zh-rCN/strings.xml | 23 +- commons/src/main/res/values-zh/strings.xml | 23 +- commons/src/main/res/values/strings.xml | 23 +- .../values-ar-rIQ/strings.xml | 5 - .../composeResources/values-ar/strings.xml | 18 - .../composeResources/values-bn/strings.xml | 1 - .../composeResources/values-ckb/strings.xml | 5 - .../composeResources/values-cs/strings.xml | 21 - .../composeResources/values-da/strings.xml | 1 - .../values-en-rUS/strings.xml | 20 - .../values-es-rES/strings.xml | 18 - .../composeResources/values-es/strings.xml | 21 - .../composeResources/values-fr/strings.xml | 18 - .../values-hi-rIN/strings.xml | 8 - .../composeResources/values-id/strings.xml | 9 - .../composeResources/values-km/strings.xml | 5 - .../composeResources/values-lo/strings.xml | 13 - .../composeResources/values-my/strings.xml | 3 - .../composeResources/values-nb/strings.xml | 9 - .../composeResources/values-ne/strings.xml | 1 - .../composeResources/values-nl/strings.xml | 18 - .../composeResources/values-prs/strings.xml | 4 - .../composeResources/values-ps/strings.xml | 4 - .../values-pt-rBR/strings.xml | 5 - .../composeResources/values-pt/strings.xml | 20 - .../composeResources/values-ro/strings.xml | 5 - .../composeResources/values-ru/strings.xml | 18 - .../composeResources/values-si/strings.xml | 4 - .../composeResources/values-sv/strings.xml | 5 - .../composeResources/values-tet/strings.xml | 3 - .../composeResources/values-tg/strings.xml | 3 - .../composeResources/values-uk/strings.xml | 17 - .../composeResources/values-ur/strings.xml | 4 - .../values-uz-rUZ/strings.xml | 9 - .../composeResources/values-uz/strings.xml | 10 - .../composeResources/values-vi/strings.xml | 21 - .../values-zh-rCN/strings.xml | 20 - .../composeResources/values-zh/strings.xml | 21 - .../composeResources/values/strings.xml | 21 - .../src/main/res/values-ar/strings.xml | 1 - .../src/main/res/values-cs/strings.xml | 1 - .../src/main/res/values-es-rES/strings.xml | 1 - .../src/main/res/values-es/strings.xml | 1 - .../src/main/res/values-fr/strings.xml | 1 - .../src/main/res/values-id/strings.xml | 1 - .../src/main/res/values-nb/strings.xml | 1 - .../src/main/res/values-nl/strings.xml | 1 - .../src/main/res/values-pt/strings.xml | 1 - .../src/main/res/values-uk/strings.xml | 1 - .../src/main/res/values-uz-rUZ/strings.xml | 1 - .../src/main/res/values-uz/strings.xml | 1 - .../src/main/res/values-vi/strings.xml | 1 - .../src/main/res/values-zh-rCN/strings.xml | 1 - .../src/main/res/values-zh/strings.xml | 1 - .../src/main/res/values/strings.xml | 1 - .../src/main/res/values-ar-rIQ/strings.xml | 1 - .../src/main/res/values-ar/strings.xml | 2 - .../src/main/res/values-ckb/strings.xml | 1 - .../src/main/res/values-cs/strings.xml | 3 - .../src/main/res/values-da/strings.xml | 1 - .../src/main/res/values-es-rES/strings.xml | 3 - .../src/main/res/values-es/strings.xml | 3 - .../src/main/res/values-fr/strings.xml | 1 - .../src/main/res/values-hi-rIN/strings.xml | 1 - .../src/main/res/values-id/strings.xml | 1 - .../src/main/res/values-km/strings.xml | 1 - .../src/main/res/values-lo/strings.xml | 3 - .../src/main/res/values-my/strings.xml | 1 - .../src/main/res/values-nb/strings.xml | 1 - .../src/main/res/values-nl/strings.xml | 3 - .../src/main/res/values-prs/strings.xml | 1 - .../src/main/res/values-ps/strings.xml | 1 - .../src/main/res/values-pt-rBR/strings.xml | 1 - .../src/main/res/values-pt/strings.xml | 3 - .../src/main/res/values-ru/strings.xml | 2 - .../src/main/res/values-sv/strings.xml | 1 - .../src/main/res/values-tet/strings.xml | 1 - .../src/main/res/values-tg/strings.xml | 1 - .../src/main/res/values-uk/strings.xml | 3 - .../src/main/res/values-ur/strings.xml | 1 - .../src/main/res/values-uz-rUZ/strings.xml | 1 - .../src/main/res/values-uz/strings.xml | 1 - .../src/main/res/values-vi/strings.xml | 3 - .../src/main/res/values-zh-rCN/strings.xml | 1 - .../src/main/res/values-zh/strings.xml | 3 - .../src/main/res/values/strings.xml | 3 - form/src/main/res/values-ar-rIQ/strings.xml | 5 - form/src/main/res/values-ar/strings.xml | 17 - form/src/main/res/values-bn/strings.xml | 1 - form/src/main/res/values-ckb/strings.xml | 5 - form/src/main/res/values-cs/strings.xml | 19 - form/src/main/res/values-da/strings.xml | 1 - form/src/main/res/values-en-rUS/strings.xml | 18 - form/src/main/res/values-es-rES/strings.xml | 17 - form/src/main/res/values-es/strings.xml | 19 - form/src/main/res/values-fr/strings.xml | 17 - form/src/main/res/values-hi-rIN/strings.xml | 8 - form/src/main/res/values-id/strings.xml | 8 - form/src/main/res/values-km/strings.xml | 4 - form/src/main/res/values-lo/strings.xml | 11 - form/src/main/res/values-my/strings.xml | 3 - form/src/main/res/values-nb/strings.xml | 8 - form/src/main/res/values-ne/strings.xml | 1 - form/src/main/res/values-nl/strings.xml | 17 - form/src/main/res/values-prs/strings.xml | 4 - form/src/main/res/values-ps/strings.xml | 4 - form/src/main/res/values-pt-rBR/strings.xml | 5 - form/src/main/res/values-pt/strings.xml | 19 - form/src/main/res/values-ro/strings.xml | 5 - form/src/main/res/values-ru/strings.xml | 16 - form/src/main/res/values-si/strings.xml | 4 - form/src/main/res/values-sv/strings.xml | 4 - form/src/main/res/values-tet/strings.xml | 3 - form/src/main/res/values-tg/strings.xml | 3 - form/src/main/res/values-uk/strings.xml | 16 - form/src/main/res/values-ur/strings.xml | 4 - form/src/main/res/values-uz-rUZ/strings.xml | 8 - form/src/main/res/values-uz/strings.xml | 9 - form/src/main/res/values-vi/strings.xml | 19 - form/src/main/res/values-zh-rCN/strings.xml | 19 - form/src/main/res/values-zh/strings.xml | 19 - form/src/main/res/values/strings.xml | 19 - gradle/verification-metadata.xml | 146 +++--- .../composeResources/values-cs/strings.xml | 1 - .../composeResources/values-fr/strings.xml | 1 - .../values-hi-rIN/strings.xml | 1 - .../composeResources/values-nl/strings.xml | 1 - .../composeResources/values-uz/strings.xml | 1 - .../composeResources/values-vi/strings.xml | 1 - .../values-zh-rCN/strings.xml | 1 - .../composeResources/values-zh/strings.xml | 1 - .../composeResources/values/strings.xml | 1 - .../src/main/res/values-ar-rIQ/strings.xml | 1 - .../src/main/res/values-ar/strings.xml | 54 --- .../src/main/res/values-ckb/strings.xml | 3 - .../src/main/res/values-cs/strings.xml | 138 ------ .../src/main/res/values-da/strings.xml | 3 - .../src/main/res/values-en-rUS/strings.xml | 1 - .../src/main/res/values-es-rES/strings.xml | 10 - .../src/main/res/values-es/strings.xml | 128 ------ .../src/main/res/values-fr/strings.xml | 32 -- .../src/main/res/values-hi-rIN/strings.xml | 10 - .../src/main/res/values-id/strings.xml | 12 - .../src/main/res/values-km/strings.xml | 5 - .../src/main/res/values-lo/strings.xml | 43 -- .../src/main/res/values-my/strings.xml | 5 - .../src/main/res/values-nb/strings.xml | 16 - .../src/main/res/values-ne/strings.xml | 3 - .../src/main/res/values-nl/strings.xml | 105 ----- .../src/main/res/values-prs/strings.xml | 13 - .../src/main/res/values-ps/strings.xml | 12 - .../src/main/res/values-pt-rBR/strings.xml | 7 - .../src/main/res/values-pt/strings.xml | 127 ------ .../src/main/res/values-ro/strings.xml | 1 - .../src/main/res/values-ru/strings.xml | 67 --- .../src/main/res/values-si/strings.xml | 5 - .../src/main/res/values-sv/strings.xml | 10 - .../src/main/res/values-tet/strings.xml | 7 - .../src/main/res/values-tg/strings.xml | 7 - .../src/main/res/values-uk/strings.xml | 17 - .../src/main/res/values-ur/strings.xml | 13 - .../src/main/res/values-uz-rUZ/strings.xml | 104 ----- .../src/main/res/values-uz/strings.xml | 72 --- .../src/main/res/values-vi/strings.xml | 126 ----- .../src/main/res/values-zh-rCN/strings.xml | 18 - .../src/main/res/values-zh/strings.xml | 133 ------ stock-usecase/src/main/res/values/strings.xml | 161 ------- .../composeResources/values/strings.xml | 1 - 248 files changed, 328 insertions(+), 10246 deletions(-) diff --git a/aggregates/src/commonMain/composeResources/values-ar/strings.xml b/aggregates/src/commonMain/composeResources/values-ar/strings.xml index a0ae43f4fd9..c7fe2d34814 100644 --- a/aggregates/src/commonMain/composeResources/values-ar/strings.xml +++ b/aggregates/src/commonMain/composeResources/values-ar/strings.xml @@ -16,8 +16,6 @@ خارج النطاق تنسيق غير صحيح غير مدعوم - كل شيء يبدو جيدا - هل تريد أيضاً إكمال مجموعة البيانات؟ كل شيء يبدو جيدا هل تريد أيضاً تعيين حزمة البيانات كمكتملة؟ ليس الان diff --git a/aggregates/src/commonMain/composeResources/values-cs/strings.xml b/aggregates/src/commonMain/composeResources/values-cs/strings.xml index 7f61c5f1b0e..3d7e271b474 100644 --- a/aggregates/src/commonMain/composeResources/values-cs/strings.xml +++ b/aggregates/src/commonMain/composeResources/values-cs/strings.xml @@ -16,8 +16,6 @@ Mimo rozsah Nesprávný formát Není podporováno - Vše vypadá dobře - Chcete také doplnit datovou sadu? Vše vypadá dobře Chcete také vyplnit soubor dat? Teď ne diff --git a/aggregates/src/commonMain/composeResources/values-es/strings.xml b/aggregates/src/commonMain/composeResources/values-es/strings.xml index ad88a405f9c..ffbbe42bc21 100644 --- a/aggregates/src/commonMain/composeResources/values-es/strings.xml +++ b/aggregates/src/commonMain/composeResources/values-es/strings.xml @@ -16,8 +16,6 @@ Fuera de rango Formato incorrecto No soportado - Todo se ve bien - ¿También deseas completar el conjunto de datos? Todo se ve bien ¿Quiere completar también el set de datos? Ahora no diff --git a/aggregates/src/commonMain/composeResources/values-hi-rIN/strings.xml b/aggregates/src/commonMain/composeResources/values-hi-rIN/strings.xml index 8abd1a6dddf..cd9dbf45529 100644 --- a/aggregates/src/commonMain/composeResources/values-hi-rIN/strings.xml +++ b/aggregates/src/commonMain/composeResources/values-hi-rIN/strings.xml @@ -16,8 +16,6 @@ सीमा से बाहर गलत फ़ॉर्मैट सपोर्टेड नहीं है - सब ठीक है - क्या आप डेटा सेट पूरा करना चाहते हैं? सब ठीक है क्या आप डेटा सेट पूरा करना चाहते हैं? अभी नहीं diff --git a/aggregates/src/commonMain/composeResources/values-nb/strings.xml b/aggregates/src/commonMain/composeResources/values-nb/strings.xml index 8b5aad1dfc8..e39b890960e 100644 --- a/aggregates/src/commonMain/composeResources/values-nb/strings.xml +++ b/aggregates/src/commonMain/composeResources/values-nb/strings.xml @@ -12,7 +12,6 @@ Breddegrad Lengdegrad Ikke støttet - Alt ser bra ut Alt ser bra ut Vil du også fullføre datasettet? Fullfør diff --git a/aggregates/src/commonMain/composeResources/values-ru/strings.xml b/aggregates/src/commonMain/composeResources/values-ru/strings.xml index 01f9d546603..723005f01f7 100644 --- a/aggregates/src/commonMain/composeResources/values-ru/strings.xml +++ b/aggregates/src/commonMain/composeResources/values-ru/strings.xml @@ -16,8 +16,6 @@ Вне спектра Неверный формат Не поддерживается - Все выглядит хорошо - Вы также хотите завершить набор данных? Все выглядит хорошо Вы также хотите завершить набор данных? Не сейчас diff --git a/aggregates/src/commonMain/composeResources/values-vi/strings.xml b/aggregates/src/commonMain/composeResources/values-vi/strings.xml index 159448a4796..6277c585fc2 100644 --- a/aggregates/src/commonMain/composeResources/values-vi/strings.xml +++ b/aggregates/src/commonMain/composeResources/values-vi/strings.xml @@ -16,8 +16,6 @@ Ngoài phạm vi Định dạng không chính xác Không được hỗ trợ - Mọi thứ đều ổn - Bạn cũng muốn hoàn tất biểu nhập phải không? Mọi thứ đều ổn Bạn cũng muốn hoàn tất biểu nhập phải không? Không phải bây giờ diff --git a/aggregates/src/commonMain/composeResources/values-zh/strings.xml b/aggregates/src/commonMain/composeResources/values-zh/strings.xml index 96c9eb79402..381fce55659 100644 --- a/aggregates/src/commonMain/composeResources/values-zh/strings.xml +++ b/aggregates/src/commonMain/composeResources/values-zh/strings.xml @@ -16,8 +16,6 @@ 超出范围 格式不正确 不支持 - 所有都很好 - 您还想完成数据集吗? 所有都很好 你要完成数据集? 现在不要 diff --git a/aggregates/src/commonMain/composeResources/values/strings.xml b/aggregates/src/commonMain/composeResources/values/strings.xml index 7a7b077647f..4f631732d2c 100644 --- a/aggregates/src/commonMain/composeResources/values/strings.xml +++ b/aggregates/src/commonMain/composeResources/values/strings.xml @@ -16,8 +16,6 @@ Out of range Incorrect format Not supported - Everything looks good - Do you also want to complete the dataset? Everything looks good Do you also want to complete the data set? Not now diff --git a/app/src/main/res/values-ar-rIQ/strings.xml b/app/src/main/res/values-ar-rIQ/strings.xml index f99c6b87d72..72f34cc8efc 100644 --- a/app/src/main/res/values-ar-rIQ/strings.xml +++ b/app/src/main/res/values-ar-rIQ/strings.xml @@ -1,8 +1,6 @@ خطأ - إضافة جديد - اسم المستخدم يومي أسبوعي @@ -19,10 +17,7 @@ خطأ - إنشاء تحديث - التاريخ - حدث جديد تاريخ الاستحقاق إلغاء @@ -34,44 +29,19 @@ الحالة - تاريخ التسجيل - البحث - ‏‏الأيام - الأشهر - السنوات - الأسابيع تاريخ الواقعة - مسح التالي - حفظ السمات علاقات حول مشاركة - الأعلى - تحذير - خطأ حفظ الرئيسية - علاقات - المؤشرات - التفاصيل - المؤشرات - إنهاء - متأخر - الجدول - قبول تحذير إغلاق - مكتمل - فتح - يومي - أسبوعي - مكتمل - الحالة اليوم الأمس الأسبوع الحالي @@ -84,19 +54,11 @@ تم التخطي حزم البيانات الأمس - التفاصيل - التعليقات - الاسم حالة الحدث - تاريخ التسجيل فتح مكتمل تم الإلغاء - البيانات - هل أنت متأكد؟ التاريخ - بيانات الحدث - إغلاق المخططات البيانية الخريطة البرامج @@ -114,8 +76,6 @@ السنة المالية الماضية التغذية الراجعة المؤشرات - القيمة - متوفر تزامن تم التخطي البرامج diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 14a40bf0707..ac4bc6a211a 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -1,65 +1,27 @@ Dhis2 - dhis - 2 خطأ - - أخطاء - خطأ - خطأين - أخطاء - أخطاء - أخطاء - - رابط الخادم غير صحيح - خطأ في الإعتمادات - خطأ غير متوقع - خطأ داخلي في الخادم - لاتوجد قيمة لا يوجد المزيد من القيم المحجوزة. اتصل بمسؤول النظام - لا يوجد المزيد من القيم المحجوزة. اتصل بالشبكة لإعادة تعبئتها - أخطاء حدث خطأ ما - مزامنة الآن - مزامنة مع الخادم - تتم المزامنة الآن - البيانات الوصفية الأحداث - الكيانات المتعقبة - - اكتمل - اكتملت المزامنة خطأ في المزامنة حدث خطأ أثناء المزامنة. يرجى اعادة المحاولة. انتهت المزامنة ولكن لم نتلق تأكيدًا من الخادم لجميع السجلات. هذه السجلات لا تزال تحمل علامة \"غير مزامن\" في التطبيق. نوصي بإعادة محاولة المزامنة. - حدث خطأ ولم يستجب الخادم. تواصل مع مديرك. - تم العثور على %s نتيجة - إضافة جديد - إضافة - جدولة جديدة إحالة - رابط الخادم - اسم المستخدم - كلمة المرور - تسجيل الدخول - الغاء القفل عن الجلسة مزامنة التكوين الخاص بك سيتم مزامنة بياناتك بعد لحظات مزامنة بياناتك التكوين الخاص بك جاهز بياناتك جاهزة - فشل مزامنة التكوين - فشل مزامنة البيانات استرداد الحساب - يلزم وجود اتصال بالشبكة لاسترداد حسابك. يومي @@ -80,138 +42,81 @@ أدخل نصًا أدخل نصًا طويلاً ادخل رقمًا - أدخل عددًا صحيحًا أدخل عددًا صحيحًا سالبًا أدخل عددًا صحيحًا موجبًا أو صفر أدخل عددًا صحيحًا موجبًا - خيارات التصفية اختر التاريخ - تغيير طريقة عرض التقويم - تم اكمال البرنامج - البرنامج غير نشط مفتوح لم يكتمل الحدث مكتمل للقراءة فقط - انهاء ومكتمل مكتمل تم الإلغاء إعادة فتح - تنشيط فعال حالة المزامنة للإرسال للتحديث - للحذف خطأ - مزامنة - إرسال - مزامنة sms - الإكمال - إنشاء تحديث - التاريخ الوحدة التنظيمية لا توجد أي وحدات تنظيمية مفتوحة للتاريخ المحدد. يرجى تحديد تاريخ آخر أو وحدة تنظيمية أخرى. - خيار الفئة خط العرض خط الطول - حدث جديد - مرة واحدة - دائم الفترة الزمنية للتقرير - خيار فئة - إذا قمت بتعيين قيمة ، فإن الصف بأكمله يحتاج إلى كل القيم لإكمال مجموعة البيانات. - بعض القيم المطلوبة مفقودة. تحتاج إلى إدخال القيم الإلزامية لتتمكن من الإكمال. - هناك حقول إلزامية مفقودة. من فضلك قم بملؤها لإكمال حزمة البيانات. - تم حفظ القيمة! - لا توجد فترات متاحة للاختيار. تاريخ الاستحقاق تجميع فئة - DD/MM/YYYY إلغاء حذف - الإجمالي تاريخ أحدث حدث لا تتوفر خيارات البرامج النشطة - برامج للتسجيل تسجيل - آخر زيارة: - تطبيق - انظر التفاصيل - عرض المزيد تعديل - متابعة - تم تمكين المتابعة - تم ايقاف المتابعة إلغاء التنشيط هذا البرنامج لا يسمح بإضافة أحداث أكثر - لا توجد بيانات الأحداث الرئيسية - معلومات التطبيق تسجيل الخروج - حظر الجلسة عرض %s المزيد... عرض أقل... - 1 دقيقة - 15 دقيقة 30 دقيقة 1 ساعة 6 ساعات 1 يوم (افتراضي) 12 ساعة - المزامنة التلقائية للبيانات كل: يدوياً - المزامنة التلقائية للتكوين كل: 1 أسبوع - عوامل المزامنة الحالية: - إعادة التعيين إلى الافتراضي سيتم حذف قاعدة البيانات. سيُطلب منك تسجيل الدخول مرة أخرى. قبول إلغاء مزامنة البيانات الآن مزامنة التكوين الآن الإعدادات - آخر عملية مزامنة في: %s - آخر عملية مزامنة في: %s إعادة ملء - وحدة sms: بوابة sms مرسل نتيجة sms - ثواني - رقم - رقم تمكين إرسال SMS انتظر لرد ونتيجة SMS - - يوجد %s برامج ذات إعدادات محددة - يوجد %s برنامج مع إعدادات محددة - يوجد %s برامج ذات إعدادات محددة - يوجد %s برامج ذات إعدادات محددة - يوجد %s برامج ذات إعدادات محددة - يوجد %s برامج ذات إعدادات محددة - الإعدادات محدودة شامل لكل برنامج @@ -229,19 +134,14 @@ يحتوي هذا السجل على جميع الأخطاء الناتجة عن مزامنة بياناتك والبيانات الوصفية. حذف البيانات المحفوظة محلياً في هذا الجهاز سيتم حذف جميع بيانات التطبيق المخزنة في الجهاز. سيتم فقدان البيانات التي لم يتم مزامنتها مع الخادم. - إعادة تعيين بيانات التطبيق و معلومات التكوين - سيتم حذف بيانات التكوين والتطبيق المخزنة في الجهاز. سيُطلب منك تسجيل الدخول مرة أخرى وستفقد البيانات التي لم يتم مزامنتها مع الخادم. إعدادات SMS فحص وتعديل العوامل المتعلقة ببوابة sms تحديث البرنامج - البرمجيات قاعدة بيانات التصدير قم بتصدير قاعدة البيانات الخاصة بك ومشاركتها مع المسؤول عنك الحالة - تاريخ التسجيل - بحث @@ -250,43 +150,19 @@ كتابة ملاحظة جديدة تصفية أضف ملاحظة - العودة - نشط - بعض الحقول الإلزامية مفقودة - بعض الحقول الإلزامية مفقودة. إذا كنت تريد الرجوع الآن ، فسيتم حذف جميع المعلومات المحفوظة. - بعض الحقول الإلزامية مفقودة. إذا كنت تريد العودة ، يرجى ملؤها. - تحتاج بعض الحقول إلى إطلاعك.\n هل تريد مراجعة النموذج؟ لم يتم حفظ بياناتك - إذا رجعت الآن سيتم حذف جميع المعلومات التي تم إدخالها. - الحذف والرجوع للخلف - تحتوي بعض الحقول على أخطاء:\n%s\n يرجى التحقق منها. - بعض الحقول الإلزامية مفقودة. يمكنك إنهاء إدخال البيانات والخروج، لكن لا يمكن تعيين الحدث كمكتمل. إحداثيات لـ - قائمة الأقسام - تم إكمال %s سؤال من %s - إكتمال %s من %s - مكتمل ومغلق - ‏‏الأيام - الأشهر - السنوات - الأسابيع تاريخ وقوع الحدث - النتائج المحفوظة محلياً - النتائج المحفوظة على الإنترنت البرامج الماضية ليس لديك الإذن المطلوب للقيام بهذا الإجراء - إضافة كـ ... - مسح الفترة الزمنية - (%d) وحدة تنظيمية - المستوى %d مرحباً بكم في dhis2 هنا يمكنك رؤية أنشطتك يمكنك تطبيق عامل تصفية... @@ -295,16 +171,11 @@ الق نظرة على الإجراءات الأخرى في القائمة الرئيسية - إنشاء علاقة التالي تحتاج إلى ادخال %d على الأقل من السمات للقيام بالبحث - تحتاج إلى ادخال واحدة على الأقل من السمات للقيام بالبحث - هناك أكثر من %d نتيجة. يرجى إدخال معايير بحث أخرى - ادخل معايير البحث التي تريد إستيراد بيانات من رمز QR - حفظ موافق التعريف السمات @@ -316,33 +187,18 @@ لا وجود لبيانات رمز QR غير صالح هذه السمة لايمكن إضافتها - هذا التسجيل لايمكن إضافته حول التطبيق برامج للتسجيل - تحديد الكل - الغاء التحديد - لا توجد معلومات لعوامل التصفية المحددة. يرجى محاولة تغييرها. مشاركة مشاركة رمز الـ QR - البحث حسب النوع غير ممكن للبحث عبر الإنترنت.\n يرجى تحديد برنامج من القائمة. - الأعلى - الحالي TEI TEIs - ضع حداً حسب الوحدة التنظيمية - ضع حداً حسب البرنامج - قائمة البرنامج إعادة تعيين بيانات التطبيق و التكوين - من غير الممكن إضافة هذه العلاقة تحقق من هذا! - تحذير - خطأ حفظ القيم المحجوزة - هل تريد إضافة المزيد من البيانات من رمز QR؟ - إصدار التطبيق: %s إصدار SDK: %s @@ -353,148 +209,45 @@ يتم تطويره وصيانته عبر مشروع DHIS2، وهو جزء من جامعة أوسلو ، قسم المعلوماتية. لمزيد من المعلومات أو الأسئلة حول هذا التطبيق ، يرجى الكتابة إلى android@dhis2.org - كلمة المرور مفقودة. يرجى ملء هذا الحقل. - اسم المستخدم مفقود. يرجى ملء هذا الحقل. - يقوم هذا الخادم بتشغيل إصدار dhis مختلف عن 2.29. قم بتحديث إصدار الخادم الخاص بك أو استخدم بيئة الاختبار للمتابعة. - هذا الخادم يقوم بتشغيل إصدار dhis يختلف عن %s. قم بتحديث إصدار الخادم الخاص بك أو استخدم بيئة الاختبار للمتابعة. - حدث خطأ ما. يرجى التحقق من صحة عنوان url للخادم واسم المستخدم وكلمة المرور وحاول مرة أخرى. - تعذر على الخادم إكمال هذا الطلب. - حدثت مشكلة أثناء محاولة تسجيل الدخول إلى الخادم. - خطأ في تسجيل الدخول - بعض الحقول الإلزامية مفقودة - خطأ غير متوقع أثناء البحث عبر الإنترنت - خطأ أثناء تحليل النتائج - أعاد البحث عبر الإنترنت خطأ - حدث خطأ في الخادم حدد برنامجاً لتمكين التسجيل ليس لديك الإذن المطلوب - هذه الوظيفة ليست جاهزة بعد. - خطأ في الحصول على تسمية العلاقة كل %s هذه ليست صيغة رقم هاتف سليمة - هذه ليست صيغة بريد إلكتروني سليمة - يُسمح فقط بالأرقام السالبة يُسمح فقط بالأرقام الموجبة - يُسمح فقط بالأرقام الموجبة - يُسمح فقط بقيمة بين 0 و 1 - يُسمح فقط بقيمة بين 0 و 100 - حدد التواريخ للتصفية تحديد الخيار - تم الإبلاغ عن المشكلة - توليد حدث جديد - هل تريد إنشاء حدث جديد اكتملت الأحداث اكتمال جميع الأحداث في هذا البرنامج. هل ترغب أيضاً في تعيين البرنامج كمغلق؟ - هل ترغب أيضاً في تعيين هذا التسجيل كمكتمل؟ هل ترغب في إكمال %s أيضاً؟ تحقق الرئيسية مثال - إضافة أداة إظهار المساعدة - مزامنة بياناتك... - ...التكوين الخاص بك... - ...تعيين عدد السجلات التي يتم تحميلها من الخادم ... - التحقق من وإدارة عدد القيم المحجوزة المتبقية - تحقق مما إذا فشل الاتصال بالخادم - حرر بعض المساحة في الذاكرة - ... أو احذف كل شيء للبدء من جديد. - ابحث عن الكيانات الخاصة بك المحفوظة في جهازك وفي خادم الإنترنت. - يمكنك التبديل إلى برامج أخرى - بحث أو إضافة كيانات جديدة. تحتاج إلى البحث قبل أن تتمكن من إضافة أي جديد! - انقر هنا لتنظيف الحقول وإعادة البحث. هذه لوحة معلومات الكيان المسجل الإطلاع على المعلومات الخاصة بالكيانات... - ...مشاركة المعلومات عبر QR أو SMS... - ...أو ضع علامة على الكيان للمتابعة - انقر لإنشاء أو جدولة حدث أو الإحالة إلى وحدة تنظيمية أخرى. هنا سترى جميع الأحداث. انقر لرؤية تفاصيل حدث. تنقل خلال القائمة لإضافة العلاقات أو مشاهدة المؤشرات أو كتابة الملاحظات. - انقر لرؤية جميع التسجيلات أو إنشاء تسجيل جديد. - انقر لحذف هذا الحدث. لا يمكن التراجع عن هذا الإجراء. - إكمال الحدث. - سيتم سرد جميع الأحداث المتعلقة بهذا البرنامج هنا. - انقر لإضافة حدث جديد أدخل جميع البيانات لإنشاء الحدث انقر للتحقق من حالة إكتمال الحدث - انقر لإكمال أو لإعادة فتح حدث - قراءة وتخزين المعلومات من أجهزة أخرى عبر QR - مزامنة بياناتك مع الخادم - حظر العمل برمز مكون من 4 أرقام. لا تنس الرمز الخاص بك! - قم بتسجيل الخروج لتغيير المستخدم أو الخادم. ستتمكن من تسجيل الدخول مرة أخرى حتى إذا لم يكن هناك اتصال بالإنترنت. - %s: العلاقات لا توجد أحداث مسجلة، انقر على \"+\" لإضافة حدث جديد. - لا توجد أحداث مسجلة قيم البيانات معلومات تعذر قراءة رقم التعريف هذا حذف البيانات المحفوظة محلياً في هذا الجهاز نظرة عامة - العلاقات - المؤشرات - التحليلات لا توجد مؤشرات لهذا البرنامج. - الملاحظات - غير قادر على الإكمال - لا يمكن حفظه - هناك تحذيرات في النموذج - ماذا تريد ان تفعل؟ - تحتوي بعض الحقول على أخطاء. من فضلك، تحقق منها حتى تتمكن من الإكمال كل التسجيلات عرض لوحة معلومات بجميع البرامج النشطة - فتح سجل أخطاء المزامنة سجل أخطاء المزامنة مشاركة مع... - فشلت مزامنة التكوين الخاص بك. قد يكون هناك أخطاء في الخادم الخاص بك. انقر هنا للمزيد من المعلومات. - السابق - التالي - التفاصيل - المؤشرات - ملاحظات - - الإكمال لاحقاً - - إنهاء - الحقول التي بها أخطاء - تحتوي بعض الحقول على أخطاء. لم يتم حفظها. يرجى التحقق منها. يجب أن تكون القيمة فريدة، يوجد تعارض تكرار لنفس القيمة. لم يتم الحفظ. يرجى التحقق. - وجد تعارض في حقل ذو قيمة فريدة. لحفظ التسجيل، يرجي التحقق من النموذج. الرجاء الانتظار تخطى - اعادة جدولة لا توجد معلومات عن هذه الشاشة - متأخر - هناك قاعدة برنامج واحدة غير معتمدة. يرجى زيارة التوثيق للتحقق - لا توجد معلومات عن هذا الحقل - إعتمادات فارغة - لتتمكن من تسجيل الدخول باستخدام ماسح بصمة الإصبع، تحتاج أولاً إلى تسجيل الدخول بإستخدام الطريقة الافتراضية - الأمن البيومتري - تسجيل الدخول السريع - هل ترغب في استخدام بصمة إصبعك أو طريقة بيومترية أخرى لتسجيل الدخول؟ - جداول - الجدول - https:// سيتم فقدان البيانات التي لم يتم مزامنتها. هل تريد حقاً المتابعة؟ - قبول تعذر حذف البيانات. يرجى اعادة المحاولة. انتهاء عملية حذف البيانات المحلية بنجاح. - يجب تحديد وحدة تنظيمية واحدة على الأقل - إرسال البيانات - ساعد DHIS2 في تحسين هذا التطبيق من خلال مشاركة سجلات الأخطاء المرتبطة بمعرف المستخدم الخاص بك. - هل تريد مساعدتنا في تحسين هذا التطبيق؟ - إذا قلت نعم، سيرسل التطبيق إحصائيات مجهولة المصدر وسجلات الأخطاء التي تساعدنا على تحسين تجربة المستخدم والأداء. \nلمزيد من التفاصيل، يُرجى الرجوع إلى سياسة الخصوصية الخاصة بنا. - سياسة الخصوصية - تحقق من الحقول - فقدان الإتصال بالإنترنت أثناء عملية مزامنة التكوين. يرجى معاودة المحاولة في وقت لاحق - قبول - متابعة - رابط الخادم - أدخل عنوان URL لخادم DHIS 2 لمؤسستك على النحو الذي حصلت عليه من مسؤول النظام.\n\n أو بدلاً من ذلك ، يمكنك مسح رمز الـ QR الذي يحتوي على عنوان URL لخادمك - نسيت الرمز الخاص بك؟ - ما الذي تريد فعله لهذا الحدث؟ - إنهاء لم يتم العثور على %s السجل الذي تحاول الوصول إليه غير متوفر. هل تود البحث عنه؟ تم التزامن عبر sms @@ -502,33 +255,16 @@ رفع العلاقة مرسل عن طريق sms - لا توجد أي تعارضات لهذا البرنامج - اتصال الشبكة غير متاح ، ولكن يبدو أن هناك خدمات هاتفية - يمكنك استخدام الرسائل القصيرة. - اتصال الشبكة غير متوفر. إغلاق الآن يمكنك التحقق من معلومات المزامنة بالضغط هنا - يتم تخزين هذه البيانات في جهازك فقط، ولم يتم مزامنتها مع الخادم. - لديك آخر التحديثات حتى الآن! كل بياناتك تم ارسالها إلى السيرفر لا يمكنك ربط سجل مع نفسه - رفع الحظر عن الجلسة - مكتمل - مفتوح - نوع القيمة غير مدعوم تغيير طريقة عرض التقويم - 15 دقيقة - كل ساعة - يومي - أسبوعي - أسبوع - إعداد المزامنة: %s السجل الذي تحاول الوصول إليه ليس لديه تسجيل. لا يمكنك الوصول إلى لوحة المعلومات. خطأ في التنسيق حذف %s ليس لديك الصلاحية لحذف هذا السجل - هذا ليس عنوان url صالحاً تسوية وضبط النموذج - رقم المستلم هل تقبل بإرسال %d رسالة؟ ارسال %1$d/%2$d مقدار انتظار التأكيد - %d @@ -546,51 +282,29 @@ لم يتم تعيين بوابة عبور sms المستخدم لم يقم بتسجيل الدخول وحدة الرسائل القصيرة غير مفعلة - جاري إرسال رسالة SMS أخرى لم تبدأ وحدة الرسائل القصيرة، لم يتم العثور على البيانات الوصفية المطلوبة - مكتمل لم يتم قبول عدد الرسائل القصيرة بدء إرسال الرسالة القصيرة تم قراءة البيانات وتحويلها. الرقم المعرف للإرسال: %d - خطأ في إرسال الرسالة القصيرة تسجيل وضم TEI عبر SMS إرسال الحدث sms إرسال حزمة البيانات SMS - البدء - قيد العمل - تم الإرسال - فشل - بدء المزامنة مزامنة... - اكتمال عملية المزامنة - حدث خطأ أثناء المزامنة. - حدث خطأ أثناء المزامنة. انقر هنا للتحقق من سجلات الأخطاء - تزامن ملغي. تم النسخ - تم تحديد الصورة - إظهار على الخريطة - إظهار القائمة - %s إلزامي ولكن لم يتم توفيره. - تم التقاط المضلع مضلع - البصمة - من فضلك ، ضع إصبعك في قارئ بصمة الإصبع الخاص بك. الأمان لأسباب أمنية ، لا يُسمح باستخدام هذا الإصدار من التطبيق في الأجهزة الـ rooted. يرجى استخدام النسخة التدريبية. - هناك بعض الأخطاء. يرجى إصلاحها قبل المتابعة. تطبيق عوامل تصفية لم يتم تطبيق عوامل تصفية الفترة الزمنية الوحدة التنظيمية - جار الفرز - الحالة مزامنة تم تعيينه لي اليوم @@ -605,25 +319,18 @@ من - إلى أخرى في أي وقت - فشلت المزامنة. تحقق من قيم البيانات وحاول اصلاح المشكلة ثم حاول مرة أخرى. إذا استمرت المشكلة بالظهور اتصل بمسؤول النظام - تم إرسال هذه البيانات إلى الخادم ولكن ليس مضموناً أنه تم تخزينها المفتوحة المجدولة زمنياً المتأخرة تم زيارته المكتملة التي تم تخطيها - الأحداث:%s حد أعلى:%s%s حالي:%s TEI:%s حد أعلى:%s%s حالي:%s - الإعدادات محدودة %s\n الأحداث: %s/%s، TEI: %s/%s - إخفاء بيانات التسجيل - إظهار بيانات التسجيل وحدة الرسائل القصيرة مفعلة وحدة الرسائل القصيرة غير مفعلة تحميل البيانات لوحدة الرسائل القصيرة. يرجى الإنتظار لايمكن ترك بوابة عبور رسائل sms فارغ لا توجد تسجيلات ليتم رفعها هذه الـ convertTask غير مدعومة - لا تظهر قفل الشاشة مرة أخرى تعيين رمز تعارض غير التاريخ @@ -648,11 +355,7 @@ إختر وحدة تنظيمية أدخل رابط url أدخل قيمة - اختر صورة - مسح الرمز - إختر خياراً القيم المحجوزة التي يتم تنزيلها لكل سمة TEI - القيم المحجوزة التي يتم تنزيلها لكل سمة TEI بقي %s من القيم المحجوزة إدارة القيم المحجوزة الأحداث التي يتم تنزيلها @@ -672,56 +375,27 @@ الغير متزامنة تحوي أخطاء في المزامنة التي تم مزامنتها عبر SMS - التفاصيل - التعليقات تم الحفظ! - هل تريد التحقق من جودة البيانات؟ - كل شيء يبدو جيدا! - هل تريد أيضاً تعيين حزمة البيانات كمكتملة؟ - تعيين كمكتمل - الإسم - الصيغة - إكمال على أية حال %s%s مفقود من %s%s حالة الحدث - تاريخ التسجيل لا توجد بيانات. انقر فوق \"+\" لإضافة سجل جديد لا توجد بيانات. ليس لديك إذن بإضافة سجلات جديدة. لم يتم تعيين وصف أو تعليمات بيانات للمراجعة - محفوظ ومكتمل يوجد مسبقاً تسجيل نشط مفتوح مكتمل تم الإلغاء - بيانات تعذر تنزيل %s المحددة - تم الإكمال من قبل %s:%s - تم التحديث: %s - تم - لم نتمكن من التحقق من جودة البيانات. تواصل مع مديرك - هل أنت متأكد؟ - هل تريد إعادة فتح حزمة البيانات؟ التاريخ - بيانات الحدث - %s لا يملك أي سمات عامة، يرجى تحديد برنامج سياسة الخصوصية إنقر هنا للإطلاع على سياسة الخصوصية الخاصة بنا - قيم الإحداثيات غير صالحة - لا يمكنك تسجيل TEIs من وحدات تنظيمية أخرى في هذا البرنامج لأنه محمي. \n اتصل بالمسؤول. هذا الحقل إلزامي لأسباب أمنية ، لا يُسمح باستخدام هذه النسخة من التطبيق مع adb. الرجاء استخدام نسخة هذا التطبيق المخصصة للتدريب. رجوع - إغلاق التطبيق - تفاصيل أكثر - تفاصيل أكثر - إغلاق نسخ إلى الحافظة - تم النسخ إلى الحافظة - معلومات الخطأ وجدنا خطأ عند المزامنة مع الخادم الخاص بك. شارك الخطأ مع مسؤول النظام إن أمكن. - لم نتمكن من بدء الجلسة مع المستخدم الخاص بك هناك أحداث مخطط لها لن تتم إعادة جدولتها المخططات البيانية عرض @@ -769,42 +443,24 @@ التغذية الراجعة المؤشرات تم رفض إذن الكاميرا.\n تحتاج إلى تمكينها لاستخدام هذه الميزة. - القيمة الرسوم البيانية والمؤشرات التقط صورة - اختر من استوديو الصور - تم الإنتهاء! هذا البرنامج محمي صف السبب هنا - تتم المصادقة - عنوان url للخادم ليس نسخة dhis - خطأ في الإعتمادات - خادم غير معروف - يجب أن تكون القيمة عدداً صحيحاً انتهت الجلسة لقد انتهت جلستك الحالية. لأسباب أمنية ، ستحتاج إلى تقديم بيانات الاعتماد الخاصة بك مرة أخرى - القيم الأسابيع %d %s إلى %s لا تظهر مرة أخرى - لا يمكن تعيين نوع الإحداثيات تمت المتابعة %s - لا يمكن تحليل %s كتاريخ لا يمكن تحديث هذا الحقل. حاول مرة اخرى - متوفر هذه البيانات غير قابلة للتحرير لأنه تم تعليمها على أنها مكتملة هذه البيانات غير قابلة للتعديل لأن وقت إصدارها قد انتهى ليس لديك إذن لتحرير هذه البيانات هذه البيانات غير قابلة للتعديل لأنه تم اغلاق الوحدة التنظيمية ليس لديك إذن لتحرير هذه البيانات لا يمكنك تحرير البيانات من هذه الوحدة التنظيمية - إعادة البحث البحث عبر الإتصال بالسيرفر عن طريق الإنترنت ارجع الرسالة التالية: - تحذير قواعد البرنامج - إعادة التجديد - غير معروف - قم بتحديث كافة البيانات حذف الحساب - إدارة الحسابات استكشاف أخطاء التكوين وإصلاحها اللغة انقر هنا لتغيير لغة التطبيق @@ -820,8 +476,6 @@ لا توجد نتائج لهذا البحث نتائج كثيرة جدًا حاول تغيير البحث لتضييق نطاق النتائج. - إنشاء جديد - من الضروري إدخال سمات %s على الأقل للبحث موافق\! ابدأ بحثًا للعثور على أي %s يمكنك البحث أو إنشاء %s جديد @@ -830,7 +484,6 @@ بعض الحقول بها أخطاء ولم يتم حفظها. \n هل تريد مراجعة النموذج؟ هل تريد وضع علامة على هذا النموذج كمكتمل؟ لديك بعض رسائل الخطأ. \nهل تريد مراجعتها؟ - إذا قمت بالخروج الآن سيتم تجاهل التغييرات. أعيد فتحه الحساب معطل تم تعطيل حسابك من قبل المسؤول. @@ -838,18 +491,7 @@ التاريخ الحالي: %s الجهاز: %s إصدار نظام التشغيل: %s - افتح تفاصيل %s مزامنة %s ... - تم إرسال الرسالة القصيرة. في انتظار استجابة الخادم. - تم تأكيد وصول الرسالة القصيرة إلى الخادم. تحديث الحالة - لا يمكننا تأكيد وصول الرسالة القصيرة إلى الخادم. تحديث الحالة - تم إرسال الرسالة القصيرة. تحديث الحالة. - لم يتم إرسال الرسالة القصيرة. - فتح تطبيق الرسائل القصيرة. لا تعدل الرسالة من فضلك. - في انتظار التأكيد اليدوي - مزامنة الأحداث - تمت المزامنة - دبوس خاطئ مسجل في مملوكة من قبل المزامنة مطلوبة @@ -862,27 +504,10 @@ إرسال تحديث ليس الان - - %s الأخطاء - %s الخطأ - %s الأخطاء - %s الأخطاء - %s الأخطاء - %s الأخطاء - - - %s التحذيرات - %s تحذير - %s التحذيرات - %s التحذيرات - %s التحذيرات - %s التحذيرات - تحديث البرنامج في وقت لاحق حمّل الآن تحقق من وجود تحديثات - التحقق من وجود تحديثات لا توجد تحديثات جديدة إصدار التطبيق غير متزامن @@ -905,15 +530,39 @@ مرحلة البرنامج حدث الجدول الزمني - اختياري إظهار المزيد إظهار أقل حالة التزامن - إظهار الحقول - إخفاء الحقول مزامنة ناجحة مزامنة %s ... إظهار الوصف إخفاء الوصف استخدام كلمة المرور - + + + %s الأخطاء + %s الخطأ + %s الأخطاء + %s الأخطاء + %s الأخطاء + %s الأخطاء + + + + %s التحذيرات + %s تحذير + %s التحذيرات + %s التحذيرات + %s التحذيرات + %s التحذيرات + + + + يوجد %s برامج ذات إعدادات محددة + يوجد %s برنامج مع إعدادات محددة + يوجد %s برامج ذات إعدادات محددة + يوجد %s برامج ذات إعدادات محددة + يوجد %s برامج ذات إعدادات محددة + يوجد %s برامج ذات إعدادات محددة + + diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 15ac9b5cbaa..0b0ac6d887a 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -1,33 +1,17 @@ ভুল - - ভুলগুলো - ভুলগুলো - - ভুল সার্ভার - যোগ করুন সম্পন্ন ভুল - তারিখ নির্ধারিত তারিখ অবস্থা - নিবন্ধনের তারিখ - পরিদর্শনের তারিখ - ভুল - মন্তব্য - মন্তব্য - সম্পন্ন - অবস্থা সম্পন্ন - নিবন্ধনের তারিখ তারিখ মন্তব্য তথ্যের অন্তর্ভুক্তি - অবশ্যই সংখ্যা হতে হবে diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index e8002220ed6..5b119203d87 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -1,34 +1,13 @@ Dhis2 - dhis - 2 هەڵە - - هەڵە - هەڵە - - بەستەری ڕاژە دروست نییە - زانیارییەکان دروست نین - هەڵەی چاوەڕواننەکراو - هەڵەی ناوەکیی ڕاژە - هیچ نرخێک هیچ نرخێکی دیکەی تەرخانکراو نەما. پەیوەندی بە بەڕێوەبەری سیستەمەکەتەوە بکە - هیچ نرخێکی دیکەی تەرخانکراو نەما. پەیوەندی بە تۆڕەکەوە بکە بۆ دووبارە پڕکردنەوەیان - هەڵە هەڵەیەک ڕووی دا - هاوکاتگەری بکە ئێستا - لەگەڵ ڕاژەکە هاوکاتگەر دەکرێت - هاوکاتگەر دەکرێت - داتا پەیوەندیدارەکان ڕووداوەکان - پێکهاتە چاودێریکراوەکان - - تەواوکرا - هاوکاتگەریکردن تەواو بوو هەڵە لە هاوکاتگەری هەڵەیەک لە کاتی هاوکاتگەری کردن ڕووی دا. تکایە دووبارەی بکەوە. @@ -40,11 +19,8 @@ هەڵە نويَ كردنةوة - داتا - رووداوي نوي لابردن سرينةوة - كؤي طشتي دةستكاري ماڵةوة پەسندکردن @@ -54,31 +30,16 @@ طةران - رۆژەکان - مانگەکان - ساڵەکان - باك ماوة داهاتوو - خةزن كردن تةواو ڕووداوەکان پەیوەندیەکان دةربارةي - زیاترین - هەڵە خةزن كردن ماڵةوة - پەیوەندیەکان - نیشاندەر - نیشاندەر - تەواکردن - پەسندکردن داخستن - تەواوبکە - تەواوبوو ماوة - پێگە ئەمڕۆ ئەم هەفتەیە هەفتەی پێشووتر @@ -87,18 +48,12 @@ تەواوبوو بؤ دواوة هەڵە لە هاوکاتگەری - کۆمێنتەکان تەواوبکە - تةواو كرا بەروار - بيركاري داتا بؤ دواوة - داخستن بةرنامةكان ڕاووبۆچون نیشاندەر - بةها - زانیارییەکان دروست نین هاوتاکردن بةرنامةكان هەڵە لە هاوکاتگەری diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 53fc3b952ff..5cc1d3598dc 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -1,36 +1,13 @@ Dhis2 - dhis - 2 Chyba - - Chyba - Chyby - Chyb - Chyb - - Chybné URL serveru - Chybné registrační údaje - Neočekávaná chyba - Interní chyba serveru - žádná hodnota Neexistují žádné další rezervované hodnoty. Obraťte se na správce systému - Neexistují žádné další rezervované hodnoty. Připojte se k síti a doplňte je - chyby Něco se pokazilo - Synchronizovat nyní - Synchronizace se serverem - Probíhá synchronizace - Metadata Události - Trasované entity - - Dokončeno - Synchronizace dokončena Chyba synchronizace Během synchronizace došlo k chybě. Zkuste to prosím znovu. @@ -38,31 +15,18 @@ CHYBA: V procesu synchronizace se něco pokazilo. Pokud máte připojení, zkuste to prosím znovu. Pokud chyba přetrvává, obraťte se na správce. Ve vašich datech jsou rozpory. Synchronizujte prosím svou konfiguraci, zkontrolujte svá data a zkuste synchronizaci provést znovu. Některá vaše data se nepodařilo synchronizovat. - Došlo k chybě a server neodpovídá. Kontaktujte svého správce. - Nalezeno %s výsledků - Přidat nový - Přidat Zadat %s Zadat / přeskočit %s - Naplánovat nový Doporučení - URL serveru - Uživatelské jméno - Heslo - Přihlásit se - Odemkněte relaci Synchronizuje se vaše konfigurace Vaše data budou brzy synchronizována Synchronizace vašich dat Vaše konfigurace je připravena Vaše data jsou připravena - Synchronizace konfigurace selhala - Synchronizace dat selhala Obnovení účtu - K obnovení účtu je potřeba připojení k síti. Denně @@ -83,142 +47,86 @@ Zadejte text Zadejte dlouhý text Zadejte číslo - Zadejte celé číslo Zadejte záporné celé číslo Zadejte kladné celé číslo nebo nulu Zadejte kladné celé číslo - Možnosti filtru Zvolte datum - Změnit kalendář - Program dokončen - Program neaktivní Otevřít Není dokončeno Událost dokončena Pouze ke čtení - Hotovo a dokončit Dokončeno Zrušeno Znovu otevřít - Znovu otevřít formulář - Aktivovat Aktivní Synchronizace Poslat Aktualizovat - Smazat Chyba - SYNCHRONIZOVAT - ODESLAT - SYNCHRONIZOVAT SMS - Dokončení - Vytvořit Aktualizovat - Datum Org. jednotka Pro vybrané datum nejsou k dispozici žádné otevřené organizační jednotky. Vyberte prosím jiné datum nebo jinou organizační jednotku. - Možnosti kategorie Zeměpisná šířka Zeměpisná délka - Nová událost - Jednou - Trvale Období hlášení zpráv - Možnosti kategorie - Pokud nastavíte hodnotu, celý řádek potřebuje k dokončení datové sady všechny hodnoty. - Některé požadované hodnoty chybí. K dokončení datové sady je třeba zadat povinné hodnoty. - Chybí povinná pole. Chcete-li vyplnit soubor dat, vyplňte je prosím. - Hodnota je uložena! - Nejsou k dispozici žádná období k výběru. Poslední termín Další %1$s Kombinace kategorií - DD/MM/RRRR Zrušit Smazat - Celkem Datum poslední události K dispozici nejsou žádné možnosti Seznam zápisů Aktivní programy - Programy k zápisu Zapsat - Poslední návštěva: - použít - Prohlednout detaily - UKÁZAT VÍCE Upravit - Následovat - Sledování povoleno - Sledování zakázáno Deaktivovat Tento program neumožňuje více událostí - Nejsou data události Úvodní strana - Info o aplikaci Odhlášení - Blokovat relaci Zobrazit %s dalších... Zobrazit méně... - 1 minuta - 15 minut 30 minut 1 hodina 6h 1 den (výchozí) 12h - Automatická synchronizace dat každých: Ručně - Konfigurace automatické synchronizace každých: 1 týden - Aktuální parametry synchronizace: - Obnovit do základního nastavení Databáze bude smazána.\nBudete požádán o opětovné přihlášení. Přijmout Zrušit SYNCHRONIZOVAT Data teď SYNCHRONIZOVAT Konfiguraci teď Nastavení - Poslední synchronizace: %s Poslední synchronizace v - Poslední synchronizace: %s Doplňte - SMS modul: SMS brána Odesílatel výsledků SMS Časový limit výsledku SMS (s) - vteřin - číslo - číslo Povolit odesílání SMS Počkejte na odpověď na výsledek SMS - - Je tu %s program se specifickým nastavením - Jsou tu %sprogramy se specifickým nastavením - Je tu %s programů se specifickým nastavením - Jsou tu %s programy se specifickým nastavením - Doba synchronizace Nastavení omezeno Globálně @@ -237,12 +145,9 @@ Tento protokol obsahuje všechny chyby způsobené synchronizací vašich dat a metadat. Odstranit místní data Všechna data aplikace Capture uložená ve vašem zařízení budou smazána. Data, která nejsou synchronizována se serverem, budou ztracena. - Resetovat data aplikace a konfiguraci - Vaše konfigurace a data aplikace uložená v zařízení budou smazána. Budete požádáni o opětovné přihlášení a data, která nejsou synchronizována se serverem, budou ztracena. SMS nastavení Zkontrolujte a upravte parametry týkající se brány SMS Aktualizace softwaru - Software Export databáze Export databáze a její sdílení se správcem Dvoufaktorové ověřování @@ -250,8 +155,6 @@ Ověřování můžete povolit nebo zakázat ve dvou krocích. - Datum zápisu - Hledat @@ -260,43 +163,19 @@ Napište novou poznámku vymazat Přidat poznámku - Vrátit zpět - Aktivováno - Chybí povinná pole - Některá povinná pole chybí. Pokud se chcete vrátit zpět, budou všechny uložené informace odstraněny. - Některá povinná pole chybí. Pokud se chcete vrátit, vyplňte je prosím. - Některá pole vyžadují vaši pozornost.\nChcete formulář zkontrolovat? Vaše data nejsou uložena - Pokud se nyní vrátíte zpět, všechny zadané informace budou smazány. - Smazat a vrátit se zpět - Některá pole obsahují chyby:\n%s\nProsím zkontrolujte je. - Některá povinná pole chybí. Zadávání a ukončení dat můžete dokončit, ale událost nelze dokončit. Souřadnice pro - Seznam oddílů - %s otázek z %s dokončeno - %s z %s dokončeno - Dokončit a zavřít - Dny - Měsíce - Roky - Týdny Datum incidentu - Místní výsledky - Výsledky online Minulé programy K provedení této akce nemáte požadované oprávnění - Přidat jako… - Vymazat Období - (%d) Org jednotek - Úroveň %d Vítejte na dhis2 Zde můžete vidět své aktivity Můžete použít filtr ... @@ -305,16 +184,11 @@ Zkontrolujte další akce v hlavní nabídce - Vytvořit vztah Další Chcete-li provést vyhledávání, musíte zadat alespoň %d atributy - Chcete-li provést vyhledávání, musíte zadat alespoň jeden z atributů - Je toho víc než %d výsledků. Zadejte prosím další kritéria hledání - Zadejte kritéria hledání Importovat QR data - Uložit OK Identifikace Atributy @@ -326,33 +200,18 @@ žádná data Neplatný QR kód Tento atribut nelze přidat - Tento zápis nelze přidat O nás Programy k zápisu - vybrat vše - vymazat výběr - O vybraných filtrech nejsou žádné informace. Zkuste je změnit. Sdílet Sdílet QR - Vyhledávání podle typu není pro online vyhledávání možné. \nVyberte program ze seznamu. - Max - stávající TEI TEIs - Omezit podle organizační jednotky - Omezit podle programu - Seznam programů Resetovat data aplikace a konfiguraci - Tento vztah není možné přidat Zkontrolovat to! - Varování - Chyba Uložit Rezervované hodnoty - Chcete přidat více dat z QR? - Verze aplikace: %s Verze SDK: %s @@ -363,148 +222,45 @@ Vyvinuto a udržováno projektem DHIS2, který je součástí University of Oslo, oddělení informatiky. Další informace nebo dotazy týkající se této aplikace získáte na android@dhis2.org - Chybí heslo. Vyplňte prosím toto pole. - Chybí uživatelské jméno. Vyplňte prosím toto pole. - Tento server používá jinou verzi DHIS než 2.29. Aktualizujte verzi serveru nebo pokračujte testovacím prostředím. - Tento server používá jinou verzi dhis než je %s. Aktualizujte verzi serveru nebo pokračujte testovacím prostředím. - Něco se pokazilo. Zkontrolujte správnost adresy URL serveru, uživatelského jména a hesla a zkuste to znovu. - Server nemohl tento požadavek dokončit. - Při pokusu o přihlášení k serveru došlo k problému. - Chyba přihlášení - Chybí povinná pole - Neočekávaná chyba při online vyhledávání - Chyba při analýze výsledků - Hledání online vrátilo chybu - Na serveru se něco pokazilo Vyberte program, který umožní registraci Nemáte požadované povolení - Tato funkce ještě není připravena. - Chyba při získávání štítku vztahu Vše %s Toto není platné telefonní číslo - Toto není platný e-mail - Povolena jsou pouze záporná čísla Povolena pouze kladná čísla nebo nula - Povolena jsou pouze kladná čísla - Povoleny jsou pouze hodnoty od 0 do 1 - Povoleny jsou pouze hodnoty od 0 do 100 - Vyberte data, která chcete filtrovat Vyberte možnost - Problém byl nahlášen - Generovat novou událost - Chcete vytvořit další událost? Události byly dokončeny Všechny události v tomto programu jsou dokončeny. Chcete také ukončit program? - Chcete také dokončit zápis? Chtěli byste také vyplnit stránku %s? Zkontrolovat Úvodní strana PŘÍKLAD - Přidat widget Zobrazit nápovědu - Synchronizujte svá data… - ... vaši konfiguraci ... - ... nastavte, kolik záznamů se má stáhnout ze serveru ... - Zkontrolujte a spravujte, kolik zbývajících rezervovaných hodnot zbývá - Zkontrolujte, zda připojení k serveru neselhalo - Uvolněte místo na disku - … nebo odstraňte vše a začněte znovu. - Najděte své entity ve svém místním zařízení i na online serveru. - Můžete přepnout na jiné programy - Vyhledejte nebo přidejte nové entity. Musíte hledat, než budete moci přidat nový! - Kliknutím sem pole vyčistíte a znovu spustíte vyhledávání. Toto je řídicí panel entity Zobrazte informace o profilu entit ... - … Sdílejte informace prostřednictvím QR kódu nebo SMS… - … Nebo označte entitu pro další sledování - Kliknutím vytvoříte nebo naplánujete událost nebo přejdete na jinou organizační jednotku. Zde uvidíte všechny události. Kliknutím zobrazíte podrobnosti události. V nabídce můžete přidávat vztahy, zobrazovat indikátory nebo psát poznámky. - Kliknutím zobrazíte všechny registrace své entity nebo vytvoříte novou. - Kliknutím tuto událost smažete. Tuto akci nelze vrátit zpět. - Dokončete událost. - Zde budou uvedeny všechny události související s tímto programem. - Kliknutím přidáte novou událost Zadejte všechna data k vytvoření události Klepnutím zkontrolujete stav dokončení události. - Kliknutím událost dokončíte nebo znovu otevřete - Čtěte a ukládejte informace z jiných zařízení pomocí QR kódu - Synchronizujte svá data se serverem - Blokujte relaci pomocí 4místného kódu. Nezapomeňte svůj kód! - Odhlaste se a změňte uživatele nebo server. Budete se moci znovu přihlásit, i když nemáte připojení k internetu. - %s: vztahy Nejsou zaregistrovány žádné události, kliknutím na „+“ přidáte novou. - Nejsou registrovány žádné události. Datové hodnoty Info Toto ID se nepodařilo přečíst Odstranit místní data Přehled - Vztahy - Indikátory - Analytiky Pro tento program neexistují žádné ukazatele. - Poznámky - Nelze dokončit - Nelze uložit - Ve formuláři jsou varování - co chcete dělat? - Některá pole obsahují chyby. Zkontrolujte je prosím, abyste je mohli dokončit Všechny zápisy Zobrazit řídicí panel se všemi aktivními programy - Otevřít protokol chyb synchronizace Protokol chyb synchronizace Sdílet s... - Vaše synchronizace konfigurace se nezdařila. Na vašem serveru mohou být chyby. Další informace získáte kliknutím sem. - ZPĚT - VPŘED - Detaily - Indikátory - Poznámky - - Dokončit později - - Dokončit - Pole s chybami - Některá pole obsahují chyby. Nebyla uložena. Prosím, zkontrolujte je. Hodnota by měla být jedinečná, byla nalezena koincidence. Nebylo uloženo. Prosím zkontrolujte to. - Byla nalezena koincidence v jedinečném poli. Pro uložení zápisu prosím zkontrolujte formulář. Prosím, čekejte Přeskočit - Přeplánovat O této obrazovce nejsou žádné informace - Vypršelo - Existuje jedno programové pravidlo, které není podporováno. Zkontrolujte dokumentaci - Žádné informace pro toto pole - Prázdné pověření - Abyste se mohli přihlásit pomocí snímače otisků prstů, musíte nejprve použít výchozí způsob - Biometrické zabezpečení - Rychlé přihlášení - Chcete se přihlásit pomocí otisku prstu nebo jiné biometrické metody? - Tabulky - Tabulka - https:// Nesynchronizovaná data budou ztracena. Opravdu chcete pokračovat? - Přijmout Data nelze smazat. Zkuste to prosím znovu. Odstranění místních dat bylo úspěšně dokončeno. - Musí být vybrána alespoň jedna organizační jednotka - Odeslat data - Pomozte DHIS2 vylepšit tuto aplikaci sdílením protokolů chyb spojených s vaším ID uživatele. - Chcete nám pomoci vylepšit tuto aplikaci? - Pokud řeknete ano, aplikace odešle anonymní statistiky a protokoly chyb, které nám pomohou zlepšit uživatelský dojem a výkon.\n\nDalší podrobnosti naleznete v našich zásadách ochrany osobních údajů. - Zásady ochrany osobních údajů - Zkontrolujte pole - Při synchronizaci konfigurace jste ztratili připojení k internetu. Prosím zkuste to znovu později - Souhlasit - Pokračovat - URL serveru - Zadejte url serveru DHIS 2 pro vaši organizaci, kterou vám poskytl správce systému.\n\nPřípadně můžete naskenovat QR kód obsahující URL adresu vašeho serveru. - Zapomněli jste kód? - Co byste chtěli udělat pro tuto akci? - KONEC %s nenalezeno Záznam, ke kterému se pokoušíte získat přístup, není k dispozici. Chcete jej vyhledat? Synchronizováno pomocí SMS @@ -512,33 +268,16 @@ Nahrávám Vztah Odesláno sms - U tohoto programu nejsou žádné konflikty - Síťové připojení není k dispozici, ale vypadá to, že existují telefonní služby - můžete použít SMS. - Síťové připojení není k dispozici. Zavřít Nyní můžete zkontrolovat informace o synchronizaci kliknutím sem - Tato data jsou uložena pouze ve vašem zařízení, nejsou synchronizována se serverem. - Jste aktuální! Všechna vaše data jsou odeslána na server. Nemůžete spojit záznam sám se sebou - Odblokovat relaci - Dokončit - Otevřít - Nepodporovaný typ hodnoty Změnit zobrazení kalendáře - 15 minut - Každou hodinu - Denně - Týdně - Týden - Nastavení synchronizace: %s Záznam, ke kterému se pokoušíte získat přístup, nemá žádnou registraci. K hlavnímu panelu nemáte přístup. Chyba formátování Smazat %s Nemáte oprávnění tento záznam mazat - Toto není platné URL Úprava formuláře… - Číslo příjemce Souhlasíte s odesláním %d zpráv? Odesílání %1$d/%2$d Čeká množství potvrzení - %d @@ -556,51 +295,29 @@ Nenastavena žádná brána Uživatel není přihlášen SMS modul je deaktivován - Probíhá další odesílání SMS SMS modul nebyl spuštěn, nenalezena požadovaná metadata - Dokončeno Počet SMS není přijat Zahájeno odesílání SMS Přečtená a převedená data. ID příspěvku: %d - Chyba při odesílání SMS zprávy SMS TEI registrace a zápis Odeslání události SMS Odeslání SMS datové sady - Začíná - Probíhá - Odesláno - Selhalo - Spouštění synchronizace. Probíhá synchronizace ... - Synchronizace dokončena. - Během synchronizace došlo k chybě. - Během synchronizace došlo k chybě. Kliknutím sem zkontrolujete protokoly chyb - Zrušená synchronizace. Zkopírováno - Obrázek vybrán - Zobrazit na mapě - Zobrazit seznam - %s je povinné, ale nebylo poskytnuto. - Polygon zachycen Polygon - Otisk prstu - Položte prst na čtečku otisků prstů. Zabezpečení Z bezpečnostních důvodů není možné tuto verzi aplikace používat v rootovaných zařízeních. Použijte tréninkovou verzi. - Došlo k několika chybám. Než budete pokračovat, opravte je. Filtry se používají Nejsou použity žádné filtry Období Org. jednotka - Třídění - Status Synchronizace Přiděleno mně Dnes @@ -615,26 +332,19 @@ Od - Do Ostatní Kdykoli - Synchronizace se nezdařila. Zkontrolujte hodnoty dat, pokuste se problém vyřešit a zkuste to znovu. Pokud stále selhává, obraťte se na správce systému - Tato data byla odeslána na server, ale není zaručeno, že budou uložena Otevřít Plán Vypršelo Navštíveno Dokončeno Přeskočeno - Události:%smax:%s%saktuální:%s TEI:%smax:%s%saktuální:%s - Nastavení omezeno %s\nUdálosti: %s/%s TEI: %s/%s Omezené nastavení %s - Skrýt údaje o zápisu - Zobrazit údaje o zápisu SMS modul povolen SMS modul deaktivován Stahování dat pro modul SMS. Prosím, čekejte Brána SMS nemůže být prázdná Nejsou žádné zápisy k nahrání Tento convertTask není podporován - Nezobrazovat znovu zamykací obrazovku Nastavit PIN Konflikt Změnit datum @@ -659,11 +369,7 @@ Vyberte organizační jednotku Zadejte url Zadejte hodnotu - Vyberte obrázek - naskenovat kód - Vyberte možnost Stažené rezervované hodnoty podle atributu TEI - Stažené rezervované hodnoty podle atributu TEI zbývá %s rezervovaných hodnot Spravovat vyhrazené hodnoty Události ke stažení @@ -683,57 +389,28 @@ Nesynchronizováno Chyba synchronizace SMS synchronizováno - Detaily - Komentáře Uloženo! - Chcete zkontrolovat kvalitu dat\? - Všechno vypadá dobře! - Chcete také vyplnit soubor dat\? - Označit jak dokončené - Název - Vzorec - Přesto dokončit Chybí %s %s z %s %s Stav události - Datum zápisu Nejsou k dispozici žádná data. Kliknutím na „+“ přidáte nový záznam Nejsou k dispozici žádná data. Nemáte oprávnění k přidávání nových záznamů. Nebyl poskytnut žádný popis ani instrukce Data ke kontrole - Uloženo a dokončeno! Již tu je aktivní zápis Otevřít Dokončit Zrušeno - Data Vybraný %s nelze stáhnout. - Dokončeno %s : %s - Aktualizováno: %s - Hotovo - Nemohli jsme zkontrolovat kvalitu dat. Kontaktujte svého správce - Jste si jist? - Chcete znovu otevřít soubor dat? Datum - Datum události - %s nemá žádné veřejné atributy. Vyberte program Zásady ochrany osobních údajů Kliknutím sem zobrazíte naše zásady ochrany osobních údajů - Hodnoty souřadnic nejsou platné - Do tohoto programu nemůžete zapsat TEI z jiných organizačních jednotek, protože je chráněn. \nKontaktujte svého správce. Do tohoto programu nemůžete zapsat %s z jiných organizačních jednotek, protože je chráněný.\nKontaktujte svého správce. Toto pole je povinné Z bezpečnostních důvodů není možné tuto verzi aplikace používat s adb. Použijte tréninkovou verzi. Zpět - Zavřít aplikaci - Více detailů - Více detailů - Zavřít Zkopírovat do schránky - Zkopírováno do schránky - Informace o chybě Při synchronizaci se serverem jsme našli chybu. Pokud je to možné, sdílejte chybu se správcem systému. - Nemohli jsme zahájit relaci s vaším uživatelem Jsou plánované události, které nebudou znovu naplánovány Grafy Seznam @@ -784,47 +461,26 @@ Zpětná vazba Indikátory Povolení fotoaparátu bylo odepřeno.\nPro použití této funkce je nutné ji povolit. - Hodnota Grafy a indikátory Vyfotit - Vybrat z galerie - Hotovo! Tento program je chráněn Zde popište důvod - Ověření - Zadaná adresa URL serveru není instance dhis - Chybné registrační údaje - Neznámý server - Hodnota musí být celé číslo Platnost relace vypršela Vaše aktuální relace vypršela. Z bezpečnostních důvodů budete muset znovu zadat své přihlašovací údaje - Hodnoty Týden %d %s až %s Znovu nezobrazovat Konfigurace funkcí Zobrazit jako radar - Nelze nastavit typ souřadnic Navázalo na %s - %s nelze analyzovat jako datum Toto pole nelze aktualizovat. Prosím zkuste to znovu - Vydání - Dostupné Tato data nelze upravovat, protože jsou označena jako dokončená Tato data nelze upravovat, protože vypršel čas jejich vydání K úpravě těchto údajů nemáte oprávnění Tato data nelze upravovat, protože organizační jednotka je zavřená K úpravě těchto údajů nemáte oprávnění Data z této organizační jednotky nemůžete upravovat - Obnovit vyhledávání Online vyhledávání vrátilo následující zprávu: - Upozornění na pravidla programu - Došlo k problému s konfigurací, který způsobuje smyčku v pravidlech. Kontaktujte svého správce. - OBNOVIT - Neznámý - Obnovit všechna data - Dosáhli jste maximálního počtu účtů (%d). Chcete-li přidat nový účet, přihlaste se a smažte jeden ze svých účtů Smazat účet - Spravovat účty Odstraňování problémů s konfigurací Jazyk Klepnutím sem změníte jazyk aplikace @@ -843,9 +499,7 @@ Pro toto hledání nejsou žádné výsledky Příliš mnoho výsledků Zkuste změnit vyhledávání a zúžit výsledky. - Vytvořit nový Nový %s - Pro vyhledávání je nutné zadat alespoň atributy %s Ok Spusťte vyhledávání a najděte jakýkoli %s Můžete vyhledat nebo vytvořit nový %s @@ -854,7 +508,6 @@ Některá pole obsahují chyby a neuloží se. \nChcete zkontrolovat formulář? Chcete tento formulář označit jako vyplněný? Máte nějaké chybové zprávy.\nChcete je zkontrolovat? - Pokud nyní skončíte, změny budou zahozeny. Znovu otevřeno Účet zakázán Váš účet byl zakázán správcem. @@ -864,27 +517,10 @@ Aktuální datum: %s Zařízení: %s Verze OS: %s - Otevřete podrobnosti %s - Podrobnosti %s Synchronizace %s… - SMS odeslána. Čekání na odpověď serveru. - SMS potvrzena pro spojení se serverem. Aktualizace stavu - Nemůžeme potvrdit, že SMS dorazila na server. Aktualizace stavu - SMS odeslána. Aktualizace stavu. - SMS nebyla odeslána. - Otevření aplikace SMS. Zprávu prosím neupravujte. Poslat SMS s Poslal jste sms? - Čeká se na ruční potvrzení - Synchronizace událostí - Synchronizace trasovaných entit - Synchronizace datových sad - Synchronizace zdrojů - Synchronizace dokončena - Synchronizace SMS je k dispozici, ale musí být přístupná pro každý jednotlivý záznam Stahování obrázků... - Popis programu - Špatný pin Zapsáno v Ve vlastnictví Je nutná synchronizace @@ -904,24 +540,11 @@ Obnovit Teď ne Klepnutím sem prozkoumejte - - %s chyba - %s chyby - %s chyb - %s chyb - - - %s varování - %s varování - %s varování - %s varování - Nyní je k dispozici verze aplikace %s . Chcete si ji stáhnout? Aktualizace softwaru Později Stáhnout teď Kontrola aktualizací - Kontrola aktualizací Nejsou žádné nové aktualizace Oprávnění k neznámým zdrojům je odepřeno.\nAbyste mohli nainstalovat verzi, musíte jej povolit. Oprávnění úložiště je odepřeno.\nAbyste mohli nainstalovat verzi, musíte jej povolit. @@ -963,18 +586,10 @@ Programová fáze událost Časová osa - Vymazat hledání - Volitelný Databáze stažena - Importování databáze - Nejsou nakonfigurována žádná pole pro vyhledávání.\nObraťte se na správce. Zobrazit více Zobrazit méně Synchronizace - Zobrazit pole - Skrýt pole - Import byl úspěšný - Tato část je špatně nakonfigurovaná.\nObraťte se na správce. Úspěšná synchronizace Synchronizace %s… zdroje souborů @@ -991,4 +606,25 @@ Dokončeno %s Deaktivovat %s Znovu otevřít %s + + + %s chyba + %s chyby + %s chyb + %s chyb + + + + %s varování + %s varování + %s varování + %s varování + + + + Je tu %s program se specifickým nastavením + Jsou tu %sprogramy se specifickým nastavením + Je tu %s programů se specifickým nastavením + Jsou tu %s programy se specifickým nastavením + diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 3598c37b99f..348da469704 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -2,10 +2,6 @@ Error Events - Add new - Add - Username - Password Account recovery Daily @@ -18,10 +14,7 @@ Error - Create Update - Date - Category option Due date Cancel @@ -31,48 +24,27 @@ Status - Enrollment date - Incident date - Clear Next - Save OK Events About - Max - Warning - Error Save - Indicators - Details - Indicators Please wait Warning Close - Open - Daily - Weekly - Status Last week Last month Other Open Data sets - Details - Name - Enrollment date Open Date - Close Charts Programs Charts Details Feedback Indicators - Value must be an integer - Available Programs - Optional diff --git a/app/src/main/res/values-en-rUS/strings.xml b/app/src/main/res/values-en-rUS/strings.xml index cdfded1b7ba..6f9807a2bf9 100644 --- a/app/src/main/res/values-en-rUS/strings.xml +++ b/app/src/main/res/values-en-rUS/strings.xml @@ -12,7 +12,6 @@ Enter positive integer Choose date Error - Date Org unit Latitude Longitude @@ -28,31 +27,15 @@ Coordinates for the - Days - Months - Years Incident date Share Check this! - Error - This server is running a dhis version different than 2.29. Update your server version or use the testing environment to proceed. - Error while parsing results This is not a valid phone number - This is not a valid email - Only negative numbers are allowed Only positive numbers or zero allowed - Only positive numbers are allowed - Only values from 0 to 1 are allowed - Only values from 0 to 100 are allowed The value should be unique, a coincidence has been found. It has not been saved. Please check it. - No info for this field - Accept Close - Complete Formatting error - This is not a valid url Copied - Polygon captured Polygon Attributes - %s Select time @@ -66,23 +49,14 @@ Enter value Saved! Complete - Done Date - Coordinates values are not valid This field is mandatory - Close Take Photo - Unknown server - Value must be an integer Do not show again - %s can\'t be parsed as a date This field could not be updated. Please try again - Program rules warning - There is a configuration issue causing a loop in the rules. Contact you administrator. Not saved You have some warning messages. Do you want to mark this form as complete\? - %s details Not now Coordinates Show less diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 5efc9389b6f..b4a835b479b 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -1,62 +1,27 @@ DHIS 2 - DHIS - 2 Error - - Error - Errores - Errores - - URL incorrecta - Credenciales incorrectas - Error desconocido - Error interno - sin valor No quedan valores reservados. Contacte con el administrador del sistema. - No quedan valores reservados. Conéctese a internet para recargarlos. - errores Algo ha ido mal - Sincronizar ahora - Sincronizando con el servidor - Sincronizando - Metadatos Eventos - Entidades monitoreadas - - Terminado - Sincronizacion completa Error en sincronizacion La sincronizacion ha fallado. Intentelo de nuevo. La sincronización ha terminado pero no se ha recibido confirmación del servidor en algunos rescursos. Éstos estarán marcados como \"no sincronizados\" en la App. Recomendamos reintentar la sincronización. - Hubo un error y el serivdor no respondío. Contacte su administrador. - %s resultados - Agregar nuevo - Añadir - Programar Remitir - URL de servidor - Nombre de usuario - Contraseña - Iniciar sesion - Desbloquear sesion Sincronizando tu configuracion Sus datos estaran disponibles pronto Sincronizando sus datos Su configuracion esta lista Sus datos están disponibles - Error en la sincronizacion de configuracion - Error en la sincronizacion de datos Recuperación de cuenta - Necesita conexión de datos si desea recuperar su cuenta. Diario @@ -74,127 +39,73 @@ Introducir texto Introducir texto largo Introducir numero - Introducir entero Introducir entero negativo Introducir entero o cero Introducir entero positivo - Opciones Introducir fecha - Cambiar calendario - Programa Completado - Programa suspendido Abrir Evento completado Sólo lectura - Acabar y completar Completado Cancelar - Activar Activo Sincronizado Por enviar Para actualizar - Para borrar Error - Sincronizar - ENVIAR - Sincronizar SMS - Completado - Crear Actualizar - Fecha Unidad Organizativa No hay Unidades Organizativas abiertas para la fecha seleccionada. Seleccione otra fecha u otra Unidad Organizativa. - Opcion de categoria Latitud Longitud - Evento nuevo - Una vez - Permanente Periodo de presentacion de informe - Opción de categoría - Si introduce un valor, tendrá que completar toda la fila para poder marcar como Completado el Data Set. - Hay campos obligatorios vacíos. Deben tener valor para poder marcar como Completado el Data Set. - Hay campos obligatorios vacíos. Por favor, rellénelos para poder completar el set de datos. - Guardado! - No hay periodos disponibles. Fecha de vencimiento Cat Combo - DD/MM/YYYY Cancelar Borrar - Total Fecha de evento más reciente Programas activos - Programas disponibles para inscripción Admitir - Ultima visita: - Aplicar - Ver detalles - Ver mas - Seguimiento - Seguimiento activado - Seguimiento desactivado Desactivar Este programa no admite más eventos - No hay datos Eventos Inicio - Información de la App Cerrar Sesion - Bloquear sesion - 1 minuto - 15 minutos 30 minutos 1 hora 6h 1 día (por defecto) 12h - Sincronizacion de datos automatica cada: Manual - Sincronizacion de configuracion automatica cada: Semanal - Ajustes actuales de sincronización: - Volver a los valores por defecto Se borrará la base de datos. \nTendrá que volver a iniciar sesión. Aceptar Cancelar Sincronizar datos Ahora Sincronizar configuracion ahora Configuración - Última sincronización: %s - Última sincronización: %s Recargar - Modulo SMS: SMS gateway Emisor del SMS de resultado - segundos - numero - numero Permitir envío por SMS Esperar confirmación por SMS - - Hay %s programa con una configuración específica - Hay %s programas con configuraciones específicas - Hay %s programas con configuraciones específicas - Configuración limitada Globalmente por programa @@ -212,15 +123,11 @@ Aquí están todos los errores encontrados durante la sincronización de datos y metadatos. Borrar datos locales Se borrarán todos los datos guardados por la App. Los datos que no se hayan enviado al servidor se perderán. - Reiniciar app - Se borrará la configuración y todos los datos guardados por la App. Tendrá que iniciar sesión de nuevo y los datos que no se hayan enviado al servidor se perderán. Configuración SMS Verifique los parámetros relacionados con la SMS gateway Estado - Fecha de inscripción - Buscar @@ -229,43 +136,19 @@ Escribir nota nueva Limpiar Añadir nota - Deshacer - Activado - Los campos obligatorios no pueden estar vacios - Algunos campos obligatorios están vacíos. Si desea ir atrás ahora, toda la información guardada se borrará. - Faltan campos obligatorios. Rellénelos para ir atrás. - Algunos campos necesitan su atención.\n¿Desea revisar el formulario? Los datos no se han guardado - Si vuelve ahora la información registrada se perderá - Borrar y salir. - Algunos campos tienen errores:\n%s\nRevíselos, por favor. - Algunos campos obligatorios están vacíos. Puede terminar la entrada de datos y salir, pero el evento no podrá ser completado. Coordenadas para - Lista de secciones - %s preguntas de %s completadas - %s de %s completados - Completar y cerrar - Días - Meses - Años - Semanas Fecha del incidente - Resultados locales - Resultados online Programas pasados No tiene los permisos necesarios para realizar esta acción - Añadir como… - Limpiar Periodo - (%d) Unidad Org. - Nivel %d Bienvenido a dhis2 Aquí aparecerán sus actividades Puedes aplicar un filtro… @@ -274,16 +157,11 @@ En el menú principal podrá realizar más acciones - Añadir relación Siguiente Es necesario introducir al menos %d de los atributos para iniciar una búsqueda - Hay que rellenar al menos un atributo para buscar - Hay más de %d resultados. Por favor, especifique más su búsqueda - Introduzca algún criterio de búsqueda Importar datos QR - Guardar Correcto Identificación Atributos @@ -295,33 +173,18 @@ sin datos Código QR no válido Este atributo no puede ser añadido - Esta admisión no puede ser añadida Acerca de Programas disponibles para admisión - Selecionar todo - Borrar selección - No hay información para los filtros seleccionados. Pruebe modificándolos. Compartir Compartir QR - La búsqueda por tipo no está disponible de manera online.\nPor favor, seleccione un programa de la lista. - Máx - En uso TEI TEIs - Limitar por unid. organizativa - Limitado por programa - Listado de programas Reiniciar app - No es posible añadir esta relación ¡Importante! - Advertencia - Error Guardar Valores Reservados - Quiere añadir más información de códigos QR? - Versión de la app: %s Versión del SDK: %s @@ -332,142 +195,44 @@ \"Desarrollada y mantenida por el proyecto \"DHIS2\", parte de la Universidad de Oslo, \"departamento de informática. \"Para más información o preguntas sobre la aplicación, por favor escriba a \"android\@dhis2.org - La contraseña está vacía. Complete este campo por favor. - El usuario está vacío. Complete este campo por favor. - Este servidor trabaja sobre una versión de dhis distinta a 2.29. Actualice el servidor o utilice el entorno de pruebas para continuar. - Este servidor tiene una version de dhis diferente de %s. Actualice su servidor o use el servidor de testing para continuar. - Algo ha ido mal. Por favor, compruebe que tanto la url del servidor como el usuario y contraseña son correctos y pruebe otra vez. - El servidor no ha podido completar su solicitur. - Ha habido un problema intentando conectarse al servidor. - Error de Acceso - Los campos obligatorios no pueden estar vacios - Error inesperado mientras se ejecutaba la búsqueda online - Error al obtener los resultados - La busqueda online devolvió un error - Algo fue mal al conectar con el servidor Seleccione un programa para habilitar nuevas admisiones No tiene los permisos necesarios - Esta funcionalidad no está lista. - Error al recuperar la etiqueta de la relación Todo %s Este no es un número de teléfono válido - Este no es un email válido - Solo se permiten números negativos Solo se permiten números positivos o cero - Solo se permiten números positivos - Solo se permiten valores entre 0 y 1 - Solo se permiten valores entre 0 y 100 - Selecciona las fechas para filtrar Seleccionar opción - Incidencia reportada - Generar nuevo evento - ¿Quiere crear un nuevo evento? Eventos Completados Todos los eventos de este programa están completados. ¿Quiere completar el programa también? - ¿ Completar también la inscripción? Ver Inicio EJEMPLO - Añadir Widget Ver ayuda - Sincronice sus datos... - ... sincronive su configuracion... - Configure el almacenamiento local - Ver y gestionar cuantos valores reservados quedan - Compruebe si la conexión con el servidor ha fallado - Liberar memoria - o borre todo y empiece de cero. - Encuentre sus entidades tanto en tu dispositivo local como en el servidor. - Puede cambiar de programa - Buscar o añadir nuevas entidades. ¡ Hay que buscar antes de añadir nuevas entidades ! - Click aquí para limpiar los campos y reiniciar la búsqueda. Este es el Dashboard de entidad Puede ver la información de perfil - Compartir información via QR o SMS - O marcar una entidad para seguimiento - Puede crear o programar un evento, o referir a otra Org. Unit Aquí estan todos los eventos. Pulse para ver los detalles. Navegue el menú para añadir relaciones, ver indicadores o escribir notas. - Aqui puede ver todos los enrolments o crear uno nuevo. - Pulse para borrar este evento. Esta acción no se puede deshacer. - Completar el evento. - Todos los eventos de este programa seran listados aqui. - Haga click para añadir un nuevo evento Complete todos los campos para crear el evento Aqui puedes ver el % de campos completos en el evento. - Haga click para completar o re-abrir un evento - Lea y almacene información de otros dispositivos a través de códigos QR - Sincronice sus datos con el servidor - Bloquee la session con un digito de 4 cifras. ¡No olvide su codigo! - Cierre sesión para cambiar de usuario o de servidor. Podrá volver a entrar con el mismo usuario si no hay internet. - %s: relaciones No hay eventos registrados, haga click en \"+\" para añadir uno. - No hay eventos registrados. Valores de datos Información No se ha podido leer este Id Borrar datos General - Relaciones - Indicadores - Analíticas No hay indicadores para este programa. - Notas - No se puede completar - No se pudo guardar - Hay mensajes de aviso en el formulario - ¿Qué quiere hacer? - Algunos campos contienen errores. Por favor, revíselos para poder completar. Deseleccionar inscripción Mostrar todos los programas activos - Comprobar errores de sincronización Lista de errores de sincronización Compartir con... - La sincronización de configuración ha fallado. Puede haber fallos en el servidor. Haga click aquí para mas información. - ANTERIOR - SIGUIENTE - Detalles - Indicadores - Notas - - Completar mas tarde - - Acabar - Campos con errores - Algunos campos presentan errores. No se han guardado. Revíselos por favor. El valor debe ser único, se ha encontrado una coincidencia. El campo no se ha guardado, revíselo. - Se ha encontrado una coincidencia en un campo único. Por favor compruebe el formulario para guardar el registro. Por favor, espere Omitir - Reprogramar No hay información sobre esta pantalla - Atrasado - Hay alguna program rule no soportada. Revise la documentación. - No hay información para este campo - Vaciar credenciales - Para poder iniciar sesión por huella dactilar debe entrar primero por el modo normal - Seguridad biométrica - Tablas - Tabla - https:// Los datos no sincronizados se perderán. Continuar? - Aceptar Los datos no se pudieron borrar. Inténtelo de nuevo. Los datos locales se borraron correctamente. - Debe seleccionar al menos una unidad organizativa. - Enviar datos - Ayude a DHIS2 a mejorar esta app compartiendo errores asociados a su usuario. - Comprobar campos - Se perdió la conexión a internet durante la sincronización. Inténtelo mas tarde. - Confirmar - Seguir - URL de servidor - Introduzca la URL del servidor DHIS 2 de su organización proporcionada por su administrador. También puede escanear un código QR con la URL de su servidor. - ¿Olvido su código? - ¿Que quiere hacer con este evento? - FIN %s no encontrado Este registro no esta disponible. ¿Quiere buscarlo? Sincronizado por SMS @@ -475,33 +240,16 @@ Subiendo Relación Enviado por mensaje de texto - Este programa no tiene conflictos - No hay conexión a internet, pero hay señal telefónica - puede utilizar SMS. - Conexión no disponible. Cerrar Puede ver la información de configuración haciendo click aquí - Estos datos están guardados en su dispositivo solamente, no se han enviado al servidor. - ¡Esta al día! Todos tus datos se han enviado al servidor. No se puede relacionar un registro con el mismo - Desbloquear sesión - Completar - Abierto - Tipo de valor no admitido Cambiar vista - 15 minutos - Cada hora - Diario - Semanal - Semana - Parámetros de configuración: %s Este registro no tiene ninguna inscripción. No se puede acceder al dashboard. Error de formato Eliminar %s No tienes permisos para borrar este registro - La URL no es válida Adaptando el formulario... - Numero receptor Quiere enviar %d SMS? Enviando %1$d/%2$d Esperando confirmación - %d @@ -519,51 +267,29 @@ Puerta de acceso no definida El usuario no ha iniciado sesión Modulo SMS desabilitado - Se está enviando otro SMS en este momento Modulo SMS no inicializado. No se encontraron los metadatos necesarios. - Completado No se ha aceptado el número de SMS Inicio del envío de sms Datos leídos y convertidos. Id de envío: 1%d - Error al enviar sms SMS para registro de TEI SMS para evento SMS para conjunto de datos - Iniciando - En proceso - Enviado - Ha fallado - Iniciando sincronización. Sincronizando... - Sincronización completada - Ocurrió un error en la sincronización - Se ha producido un error durante la sincronización. Pulse aquí para ver el listado de errores - Cancelar sincronización Copiado - Imagen seleccionada - Mostrar en el Mapa - Mostrar lista - %s es obligatorio y no tiene valor - Polígono guardado Polígono - Huella dactilar - Por favor, toque con el dedo el lector de huellas. Seguridad Por motivos de seguridad, esta versión de la aplicación no permite su uso en dispositivos root. Por favor use la versión de formación. - Hay algunos errores. Por favor corríjalos antes de continuar. Filtros activos Filtros desactivados Periodo Unidad Org. - Orden - Estado Sincronizado Asignado a mí Hoy @@ -578,25 +304,18 @@ Desde - hasta Otro Cualquier momento - La sincronización falló. Compruebe los valores para tratar de resolver el problema e inténtelo otra vez. Si el fallo persiste contacte con su administrador del sistema. - Los datos se han enviado al servidor pero no se puede garantizar que se hayan guardado Abierto Planificado Atrasado Visitado Completado Omitido - Eventos:%smax:%s%sactual:%sEntidades:%smax:%s%sactual:%s - Configuración limitada %s\nEventos: %s/%s Entidades: %s/%s - Ocultar datos de registro - Mostrar datos de registro Módulo de SMS activado Módulo de SMS desactivado Descargando datos para el módulo de SMS. Por favor espere. El gateway de SMS no puede estar vacío No hay registros que sincronizar La conversión elegida no está soportada - No volver a mostrar la pantalla de bloqueo Establecer pin Conflicto Cambiar fecha @@ -621,11 +340,7 @@ Elija unidad organizativa Introduzca url Introduzca valor - Elija una imagen - Escanear código - Elija una opción Valores reservados descargados por atributo de entidad - Valores reservados descargados por atributo de entidad Quedan %s valores reservados Gestionar valores reservados Eventos a descargar @@ -645,57 +360,28 @@ No Sincronizado Error en la sincronización Sincronización de SMS - Detalles - Comentarios ¡Guardado! - ¿Quieree validar la calidad de los datos\? - ¡Parece que todo está bien! - ¿Quiere completar también el set de datos\? - Marcar como completado - Nombre - Fórmula - Completar de todas formas No se ha encontrado %s %s en %s %s Estado del evento - Fecha de inscripción No hay datos. Pulse \"+\" para añadir un nuevo registro No hay datos. No tiene permisos para añadir un nuevo registro. No se han proporcionado descripción o instrucciones Datos a revisar - ¡Guardado y completado! Ya existe un registro activo Abierto Completar Cancelar - Datos El %s seleccionado no puede ser descargado. - Completado por %s: %s - Actualizado: %s - Terminado - No hemos podido verificar la calidad de los datos. Contacte con su administrador - ¿Está seguro? - ¿Quiere reabrir este set de datos? Fecha - Fecha de evento - %s no tiene atributos públicos. Por favor seleccione un programa Política de privacidad Pulse aquí para comprobar nuestra política de privacidad - El valor de las coordenadas no es válido - No puede registrar TEIs de otras unidades organizativas en este programa porque está protegido.\nContacte con su administrador. No puede registrar un/una %s desde otras unidades organizativas en este programa por que está protegido.\nContacte con su administrador. El campo es obligatorio Por razones de seguridad, esta versión de la app no permite el uso de adb. Por favor use la versión de formación. Ir atrás - Cerrar app - Más detalles - Más detalles - Cerrar Copiar al portapapeles - Copiado al portapapeles - Información del error Encontramos un error al sincronizar con su servidor. Comparta el error con el administrador del sistema si es posible. - No pudimos iniciar la sesión con su usuario Hay eventos planificados que no serán reprogramados Gráficas Vista de tabla @@ -742,47 +428,26 @@ Retroalimentación Indicadores El permiso de la cámara está denegado.\nDebe habilitarlo para usar esta función. - Valor Gráficos e indicadores Tomar foto - Elija de la galería - ¡Listo! Este programa está protegido Describe aquí la razón - Autentificando - El enlace del servidor proporcionada no es una instancia de dhis - Credenciales incorrectas - Servidor desconocido - El valor debe ser un entero La sesión ha terminado Su sesión actual ha terminado. Por razones de seguridad, tendrá que volver a proporcionar sus credenciales - Valores Semana %d %s a %s No volver a mostrar Configuración de funciones Ver como gráfico de radar - No se pudo modificar las coordenadas Seguido %s - %s no es una fecha válida No se ha podido actualizar este campo. Prueba otra vez. - Edición - Disponible Los datos no son editables por que está marcado como completado. Los datos no son editables por que el tiempo de edición ha expirado. No tiene permisos de edición para estos datos. Los datos no son editables por que la unidad organizativa está cerrada. No tiene permisos de edición para estos datos. No puede editar datos en esta unidad organizativa. - Reiniciar búsqueda La búsqueda online a devuelto este mensaje: - Advertencia de reglas del programa - Hay un problema de configuración que provoca un bucle en las reglas. Póngase en contacto con su administrador. - Recarga - Desconocido - Recarga todos los datos - Se ha alcanzado el nunero máximo de cuentas de usuario (%d). Para agregar una nueva cuenta, inicie sesion y elimine una de las existentes. Eliminar una cuenta - Administrar cuenta Revisión de configuración Idioma Toque aquí para cambiar el idioma de la aplicación @@ -801,8 +466,6 @@ No hay más resultados para esta búsqueda Demasiados resultados Intente cambiar su búsqueda para restringir los resultados. - Crear nuevo - Es necesario que ingrese al menos %s atributos para iniciar la búsqueda De acuerdo Empieza una búsqueda para encontrar %s Puedes buscar o crear un nuevo %s @@ -810,7 +473,6 @@ Algunos campos tienen errores y no serán guardados. \n¿Desea revisar el formulario? ¿Desea marcar este formulario como completo? Tiene algunos mensajes de error. \n¿Desea revisarlos? - Si sales los cambios serán descartados. Reabrir Cuenta deshabilitada Tu cuenta ha sido deshabilitada por un administrador @@ -820,16 +482,8 @@ Fecha actual: %s Dispositivo: %s Versión del SO: %s - Abrir detalles de %s Sincronizando %s... - SMS enviado. Esperando respuesta del servidor. - Se ha confirmado que el SMS llegó al servidor. Actualizando estado - No podemos confirmar que el SMS llegó al servidor. Actualizando estado - SMS enviado. Actualizando estado. - SMS no enviado. - Abriendo aplicación de SMS. Por favor, no modifique el mensaje. Enviar SMS con - Esperando confirmación manual Sincronizado Sincronizando Ahora no @@ -841,4 +495,10 @@ evento Sincronizado Sincronizando %s... - + + + Hay %s programa con una configuración específica + Hay %s programas con configuraciones específicas + Hay %s programas con configuraciones específicas + + diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index bb2fb3d0c75..ffd064991e9 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1,64 +1,29 @@ DHIS 2 - DHIS - 2 Error - - Error - Errores - Errores - - URL incorrecta - Credenciales incorrectas - Error desconocido - Error interno - sin valor No quedan valores reservados. Contacte con el administrador del sistema. - No quedan valores reservados. Conéctese a internet para recargarlos. - errores Algo ha ido mal - Sincronizar ahora - Sincronizando con el servidor - Sincronizando - Metadatos Eventos - Entidades monitoreadas - - Terminado - Sincronizacion completa Error en sincronizacion La sincronizacion ha fallado. Intentelo de nuevo. La sincronización ha terminado pero no se ha recibido confirmación del servidor en algunos rescursos. Éstos estarán marcados como \"no sincronizados\" en la App. Recomendamos reintentar la sincronización. - Hubo un error y el serivdor no respondío. Contacte su administrador. - %s resultados - Agregar nuevo - Añadir Ingresar %s Editar / Omitir %s - Programar Remitir - URL de servidor - Nombre de usuario - Contraseña - Iniciar sesion - Desbloquear sesion Sincronizando tu configuracion Sus datos estaran disponibles pronto Sincronizando sus datos Su configuracion esta lista Sus datos están disponibles - Error en la sincronizacion de configuracion - Error en la sincronizacion de datos Recuperación de cuenta - Necesita conexión de datos si desea recuperar su cuenta. Diario @@ -79,141 +44,86 @@ Introducir texto Introducir texto largo Introducir numero - Introducir entero Introducir entero negativo Introducir entero o cero Introducir entero positivo - Opciones Introducir fecha - Cambiar calendario - Programa Completado - Programa suspendido Abrir No completado Evento completado Sólo lectura - Acabar y completar Completado Cancelar Reabrir - Reabrir formulario - Activar Activo Sincronizado Por enviar Para actualizar - Para borrar Error - Sincronizar - ENVIAR - Sincronizar SMS - Completado - Crear Actualizar - Fecha Unidad Organizativa No hay Unidades Organizativas abiertas para la fecha seleccionada. Seleccione otra fecha u otra Unidad Organizativa. - Opcion de categoria Latitud Longitud - Evento nuevo - Una vez - Permanente Periodo de presentacion de informe - Opción de categoría - Si introduce un valor, tendrá que completar toda la fila para poder marcar como Completado el Data Set. - Hay campos obligatorios vacíos. Deben tener valor para poder marcar como Completado el Data Set. - Hay campos obligatorios vacíos. Por favor, rellénelos para poder completar el set de datos. - Guardado! - No hay periodos disponibles. Fecha de vencimiento Siguiente %1$s Cat Combo - DD/MM/YYYY Cancelar Borrar - Total Fecha de evento más reciente No hay opciones disponibles Lista de inscripción Programas activos - Programas disponibles para inscripción Admitir - Ultima visita: - Aplicar - Ver detalles - Ver mas Editar - Seguimiento - Seguimiento activado - Seguimiento desactivado Desactivar Este programa no admite más eventos - No hay datos Eventos Inicio - Información de la App Cerrar Sesion - Bloquear sesion Mostrar %s más... Mostrar menos... - 1 minuto - 15 minutos 30 minutos 1 hora 6h 1 día (por defecto) 12h - Sincronizacion de datos automatica cada: Manual - Sincronizacion de configuracion automatica cada: Semanal - Ajustes actuales de sincronización: - Volver a los valores por defecto Se borrará la base de datos. \nTendrá que volver a iniciar sesión. Aceptar Cancelar Sincronizar datos Ahora Sincronizar configuracion ahora Configuración - Última sincronización: %s Última sincronización - Última sincronización: %s Recargar - Modulo SMS: SMS gateway Emisor del SMS de resultado Tiempo de espera para SMS (seg) - segundos - numero - numero Permitir envío por SMS Esperar confirmación por SMS - - Hay %s programa con una configuración específica - Hay %s programas con configuraciones específicas - Hay %s programas con configuraciones específicas - Periodo de sincronización Configuración limitada Globalmente @@ -232,20 +142,15 @@ Aquí están todos los errores encontrados durante la sincronización de datos y metadatos. Borrar datos locales Se borrarán todos los datos guardados por la App. Los datos que no se hayan enviado al servidor se perderán. - Reiniciar app - Se borrará la configuración y todos los datos guardados por la App. Tendrá que iniciar sesión de nuevo y los datos que no se hayan enviado al servidor se perderán. Configuración SMS Verifique los parámetros relacionados con la SMS gateway Actualización de software - Software Exportar base de datos Exporta tu base de datos y compártela con tu administrador Autenticación de dos factores Estado - Fecha de inscripción - Buscar @@ -254,43 +159,19 @@ Escribir nota nueva Limpiar Añadir nota - Deshacer - Activado - Los campos obligatorios no pueden estar vacios - Algunos campos obligatorios están vacíos. Si desea ir atrás ahora, toda la información guardada se borrará. - Faltan campos obligatorios. Rellénelos para ir atrás. - Algunos campos necesitan su atención.\n¿Desea revisar el formulario? Los datos no se han guardado - Si vuelve ahora la información registrada se perderá - Borrar y salir. - Algunos campos tienen errores:\n%s\nRevíselos, por favor. - Algunos campos obligatorios están vacíos. Puede terminar la entrada de datos y salir, pero el evento no podrá ser completado. Coordenadas para - Lista de secciones - %s preguntas de %s completadas - %s de %s completados - Completar y cerrar - Días - Meses - Años - Semanas Fecha del incidente - Resultados locales - Resultados online Programas pasados No tiene los permisos necesarios para realizar esta acción - Añadir como… - Limpiar Periodo - (%d) Unidad Org. - Nivel %d Bienvenido a dhis2 Aquí aparecerán sus actividades Puedes aplicar un filtro… @@ -299,16 +180,11 @@ En el menú principal podrá realizar más acciones - Añadir relación Siguiente Es necesario introducir al menos %d de los atributos para iniciar una búsqueda - Hay que rellenar al menos un atributo para buscar - Hay más de %d resultados. Por favor, especifique más su búsqueda - Introduzca algún criterio de búsqueda Importar datos QR - Guardar Correcto Identificación Atributos @@ -320,33 +196,18 @@ sin datos Código QR no válido Este atributo no puede ser añadido - Esta admisión no puede ser añadida Acerca de Programas disponibles para admisión - Selecionar todo - Borrar selección - No hay información para los filtros seleccionados. Pruebe modificándolos. Compartir Compartir QR - La búsqueda por tipo no está disponible de manera online.\nPor favor, seleccione un programa de la lista. - Máx - En uso TEI TEIs - Limitar por unid. organizativa - Limitado por programa - Listado de programas Reiniciar app - No es posible añadir esta relación ¡Importante! - Advertencia - Error Guardar Valores Reservados - Quiere añadir más información de códigos QR? - Versión de la app: %s Versión del SDK: %s @@ -357,148 +218,45 @@ \"Desarrollada y mantenida por el proyecto \"DHIS2\", parte de la Universidad de Oslo, \"departamento de informática. \"Para más información o preguntas sobre la aplicación, por favor escriba a \"android\@dhis2.org - La contraseña está vacía. Complete este campo por favor. - El usuario está vacío. Complete este campo por favor. - Este servidor trabaja sobre una versión de dhis distinta a 2.29. Actualice el servidor o utilice el entorno de pruebas para continuar. - Este servidor tiene una version de dhis diferente de %s. Actualice su servidor o use el servidor de testing para continuar. - Algo ha ido mal. Por favor, compruebe que tanto la url del servidor como el usuario y contraseña son correctos y pruebe otra vez. - El servidor no ha podido completar su solicitur. - Ha habido un problema intentando conectarse al servidor. - Error de Acceso - Los campos obligatorios no pueden estar vacios - Error inesperado mientras se ejecutaba la búsqueda online - Error al obtener los resultados - La busqueda online devolvió un error - Algo fue mal al conectar con el servidor Seleccione un programa para habilitar nuevas admisiones No tiene los permisos necesarios - Esta funcionalidad no está lista. - Error al recuperar la etiqueta de la relación Todo %s Este no es un número de teléfono válido - Este no es un email válido - Solo se permiten números negativos Solo se permiten números positivos o cero - Solo se permiten números positivos - Solo se permiten valores entre 0 y 1 - Solo se permiten valores entre 0 y 100 - Selecciona las fechas para filtrar Seleccionar opción - Incidencia reportada - Generar nuevo evento - ¿Quiere crear un nuevo evento? Eventos Completados Todos los eventos de este programa están completados. ¿Quiere completar el programa también? - ¿ Completar también la inscripción? ¿Le gustaría completar %s también? Ver Inicio EJEMPLO - Añadir Widget Ver ayuda - Sincronice sus datos... - ... sincronive su configuracion... - Configure el almacenamiento local - Ver y gestionar cuantos valores reservados quedan - Compruebe si la conexión con el servidor ha fallado - Liberar memoria - o borre todo y empiece de cero. - Encuentre sus entidades tanto en tu dispositivo local como en el servidor. - Puede cambiar de programa - Buscar o añadir nuevas entidades. ¡ Hay que buscar antes de añadir nuevas entidades ! - Click aquí para limpiar los campos y reiniciar la búsqueda. Este es el Dashboard de entidad Puede ver la información de perfil - Compartir información via QR o SMS - O marcar una entidad para seguimiento - Puede crear o programar un evento, o referir a otra Org. Unit Aquí estan todos los eventos. Pulse para ver los detalles. Navegue el menú para añadir relaciones, ver indicadores o escribir notas. - Aqui puede ver todos los enrolments o crear uno nuevo. - Pulse para borrar este evento. Esta acción no se puede deshacer. - Completar el evento. - Todos los eventos de este programa seran listados aqui. - Haga click para añadir un nuevo evento Complete todos los campos para crear el evento Aqui puedes ver el % de campos completos en el evento. - Haga click para completar o re-abrir un evento - Lea y almacene información de otros dispositivos a través de códigos QR - Sincronice sus datos con el servidor - Bloquee la session con un digito de 4 cifras. ¡No olvide su codigo! - Cierre sesión para cambiar de usuario o de servidor. Podrá volver a entrar con el mismo usuario si no hay internet. - %s: relaciones No hay eventos registrados, haga click en \"+\" para añadir uno. - No hay eventos registrados. Valores de datos Información No se ha podido leer este Id Borrar datos General - Relaciones - Indicadores - Analíticas No hay indicadores para este programa. - Notas - No se puede completar - No se pudo guardar - Hay mensajes de aviso en el formulario - ¿Qué quiere hacer? - Algunos campos contienen errores. Por favor, revíselos para poder completar. Deseleccionar inscripción Mostrar todos los programas activos - Comprobar errores de sincronización Lista de errores de sincronización Compartir con... - La sincronización de configuración ha fallado. Puede haber fallos en el servidor. Haga click aquí para mas información. - ANTERIOR - SIGUIENTE - Detalles - Indicadores - Notas - - Completar mas tarde - - Acabar - Campos con errores - Algunos campos presentan errores. No se han guardado. Revíselos por favor. El valor debe ser único, se ha encontrado una coincidencia. El campo no se ha guardado, revíselo. - Se ha encontrado una coincidencia en un campo único. Por favor compruebe el formulario para guardar el registro. Por favor, espere Omitir - Reprogramar No hay información sobre esta pantalla - Atrasado - Hay alguna program rule no soportada. Revise la documentación. - No hay información para este campo - Vaciar credenciales - Para poder iniciar sesión por huella dactilar debe entrar primero por el modo normal - Seguridad biométrica - Acceso rápido - ¿Te gustaría usar tu huella o algún otro método biométrico para acceder? - Tablas - Tabla - https:// Los datos no sincronizados se perderán. Continuar? - Aceptar Los datos no se pudieron borrar. Inténtelo de nuevo. Los datos locales se borraron correctamente. - Debe seleccionar al menos una unidad organizativa. - Enviar datos - Ayude a DHIS2 a mejorar esta app compartiendo errores asociados a su usuario. - ¿Desea ayudarnos a mejorar esta aplicación? - Si seleccionas sí, la aplicación enviará estadísticas anónimas y registros de errores que nos ayudarán a mejorar la experiencia del usuario y el rendimiento. Para obtener más detalles, consulta nuestra política de privacidad. - política de privacidad - Comprobar campos - Se perdió la conexión a internet durante la sincronización. Inténtelo mas tarde. - Confirmar - Seguir - URL de servidor - Introduzca la URL del servidor DHIS 2 de su organización proporcionada por su administrador. También puede escanear un código QR con la URL de su servidor. - ¿Olvido su código? - ¿Que quiere hacer con este evento? - FIN %s no encontrado Este registro no esta disponible. ¿Quiere buscarlo? Sincronizado por SMS @@ -506,33 +264,16 @@ Subiendo Relación Enviado por mensaje de texto - Este programa no tiene conflictos - No hay conexión a internet, pero hay señal telefónica - puede utilizar SMS. - Conexión no disponible. Cerrar Puede ver la información de configuración haciendo click aquí - Estos datos están guardados en su dispositivo solamente, no se han enviado al servidor. - ¡Esta al día! Todos tus datos se han enviado al servidor. No se puede relacionar un registro con el mismo - Desbloquear sesión - Completar - Abierto - Tipo de valor no admitido Cambiar vista - 15 minutos - Cada hora - Diario - Semanal - Semana - Parámetros de configuración: %s Este registro no tiene ninguna inscripción. No se puede acceder al dashboard. Error de formato Eliminar %s No tienes permisos para borrar este registro - La URL no es válida Adaptando el formulario... - Numero receptor Quiere enviar %d SMS? Enviando %1$d/%2$d Esperando confirmación - %d @@ -550,51 +291,29 @@ Puerta de acceso no definida El usuario no ha iniciado sesión Modulo SMS desabilitado - Se está enviando otro SMS en este momento Modulo SMS no inicializado. No se encontraron los metadatos necesarios. - Completado No se ha aceptado el número de SMS Inicio del envío de sms Datos leídos y convertidos. Id de envío: 1%d - Error al enviar sms SMS para registro de TEI SMS para evento SMS para conjunto de datos - Iniciando - En proceso - Enviado - Ha fallado - Iniciando sincronización. Sincronizando... - Sincronización completada - Ocurrió un error en la sincronización - Se ha producido un error durante la sincronización. Pulse aquí para ver el listado de errores - Cancelar sincronización Copiado - Imagen seleccionada - Mostrar en el Mapa - Mostrar lista - %s es obligatorio y no tiene valor - Polígono guardado Polígono - Huella dactilar - Por favor, toque con el dedo el lector de huellas. Seguridad Por motivos de seguridad, esta versión de la aplicación no permite su uso en dispositivos root. Por favor use la versión de formación. - Hay algunos errores. Por favor corríjalos antes de continuar. Filtros activos Filtros desactivados Periodo Unidad Org. - Orden - Estado Sincronizado Asignado a mí Hoy @@ -609,26 +328,19 @@ Desde - hasta Otro Cualquier momento - La sincronización falló. Compruebe los valores para tratar de resolver el problema e inténtelo otra vez. Si el fallo persiste contacte con su administrador del sistema. - Los datos se han enviado al servidor pero no se puede garantizar que se hayan guardado Abierto Planificado Atrasado Visitado Completado Omitido - Eventos:%smax:%s%sactual:%sEntidades:%smax:%s%sactual:%s - Configuración limitada %s\nEventos: %s/%s Entidades: %s/%s Configuración limitada %s - Ocultar datos de registro - Mostrar datos de registro Módulo de SMS activado Módulo de SMS desactivado Descargando datos para el módulo de SMS. Por favor espere. El gateway de SMS no puede estar vacío No hay registros que sincronizar La conversión elegida no está soportada - No volver a mostrar la pantalla de bloqueo Establecer pin Conflicto Cambiar fecha @@ -653,11 +365,7 @@ Elija unidad organizativa Introduzca url Introduzca valor - Elija una imagen - Escanear código - Elija una opción Valores reservados descargados por atributo de entidad - Valores reservados descargados por atributo de entidad Quedan %s valores reservados Gestionar valores reservados Eventos a descargar @@ -677,57 +385,28 @@ No Sincronizado Error en la sincronización Sincronización de SMS - Detalles - Comentarios ¡Guardado! - ¿Quieree validar la calidad de los datos\? - ¡Parece que todo está bien! - ¿Quiere completar también el set de datos\? - Marcar como completado - Nombre - Fórmula - Completar de todas formas No se ha encontrado %s %s en %s %s Estado del evento - Fecha de inscripción No hay datos. Pulse \"+\" para añadir un nuevo registro No hay datos. No tiene permisos para añadir un nuevo registro. No se han proporcionado descripción o instrucciones Datos a revisar - ¡Guardado y completado! Ya existe un registro activo Abierto Completar Cancelar - Datos El %s seleccionado no puede ser descargado. - Completado por %s: %s - Actualizado: %s - Terminado - No hemos podido verificar la calidad de los datos. Contacte con su administrador - ¿Está seguro? - ¿Quiere reabrir este set de datos? Fecha - Fecha de evento - %s no tiene atributos públicos. Por favor seleccione un programa Política de privacidad Pulse aquí para comprobar nuestra política de privacidad - El valor de las coordenadas no es válido - No puede registrar TEIs de otras unidades organizativas en este programa porque está protegido.\nContacte con su administrador. No puede registrar un/una %s desde otras unidades organizativas en este programa por que está protegido.\nContacte con su administrador. El campo es obligatorio Por razones de seguridad, esta versión de la app no permite el uso de adb. Por favor use la versión de formación. Ir atrás - Cerrar app - Más detalles - Más detalles - Cerrar Copiar al portapapeles - Copiado al portapapeles - Información del error Encontramos un error al sincronizar con su servidor. Comparta el error con el administrador del sistema si es posible. - No pudimos iniciar la sesión con su usuario Hay eventos planificados que no serán reprogramados Gráficas Mostrar @@ -778,47 +457,26 @@ Retroalimentación Indicadores El permiso de la cámara está denegado.\nDebe habilitarlo para usar esta función. - Valor Gráficos e indicadores Tomar foto - Elija de la galería - ¡Listo! Este programa está protegido Describe aquí la razón - Autentificando - El enlace del servidor proporcionada no es una instancia de dhis - Credenciales incorrectas - Servidor desconocido - El valor debe ser un entero La sesión ha terminado Su sesión actual ha terminado. Por razones de seguridad, tendrá que volver a proporcionar sus credenciales - Valores Semana %d %s a %s No volver a mostrar Configuración de funciones Ver como gráfico de radar - No se pudo modificar las coordenadas Seguido %s - %s no es una fecha válida No se ha podido actualizar este campo. Prueba otra vez. - Edición - Disponible Los datos no son editables por que está marcado como completado. Los datos no son editables por que el tiempo de edición ha expirado. No tiene permisos de edición para estos datos. Los datos no son editables por que la unidad organizativa está cerrada. No tiene permisos de edición para estos datos. No puede editar datos en esta unidad organizativa. - Reiniciar búsqueda La búsqueda online a devuelto este mensaje: - Advertencia de reglas del programa - Hay un problema de configuración que provoca un bucle en las reglas. Póngase en contacto con su administrador. - Recarga - Desconocido - Recarga todos los datos - Se ha alcanzado el nunero máximo de cuentas de usuario (%d). Para agregar una nueva cuenta, inicie sesion y elimine una de las existentes. Eliminar una cuenta - Administrar cuenta Revisión de configuración Idioma Toque aquí para cambiar el idioma de la aplicación @@ -837,9 +495,7 @@ No hay más resultados para esta búsqueda Demasiados resultados Intente cambiar su búsqueda para restringir los resultados. - Crear nuevo Nuevo %s - Es necesario que ingrese al menos %s atributos para iniciar la búsqueda De acuerdo Empieza una búsqueda para encontrar %s Puedes buscar o crear un nuevo %s @@ -848,7 +504,6 @@ Algunos campos tienen errores y no serán guardados. \n¿Desea revisar el formulario? ¿Desea marcar este formulario como completo? Tiene algunos mensajes de error. \n¿Desea revisarlos? - Si sales los cambios serán descartados. Reabrir Cuenta deshabilitada Tu cuenta ha sido deshabilitada por un administrador @@ -858,27 +513,10 @@ Fecha actual: %s Dispositivo: %s Versión del SO: %s - Abrir detalles de %s - %s detalles Sincronizando %s... - SMS enviado. Esperando respuesta del servidor. - Se ha confirmado que el SMS llegó al servidor. Actualizando estado - No podemos confirmar que el SMS llegó al servidor. Actualizando estado - SMS enviado. Actualizando estado. - SMS no enviado. - Abriendo aplicación de SMS. Por favor, no modifique el mensaje. Enviar SMS con ¿Ha enviado el sms? - Esperando confirmación manual - Sincronizando eventos - Sincronizando entidades monitoreadas - Sincronizando set de datos - Sincronizando recursos - Sincronización completada - La sincronización de SMS está disponible, pero se debe acceder a cada registro. Descargando imágenes... - Descripción del programa - Pin Incorrecto Inscrito en Propiedad de Sincronización necesaria @@ -898,22 +536,11 @@ Actualizar Ahora no Toca aquí para explorar - - %s error - %s errores - %s errores - - - %s advertencia - %s advertencias - %s advertencias - La versión %s de la app está disponible. ¿Quieres descargarla? Actualización de software Más tarde Descarga ahora Comprobar actualizaciones - Buscando actualizaciones No hay nuevas actualizaciones El permiso de fuentes desconocidas está denegado.\nDebes habilitarlo para instalar la versión. El permiso de almacenamiento está denegado.\nDebes habilitarlo para instalar la versión. @@ -953,18 +580,10 @@ Etapa de programa evento Línea de tiempo - Borrar búsqueda - Opcional Base de datos descargada - Importando base de datos - No hay campos de búsqueda configurados.\nContacte con su administrador por favor. Mostrar más Mostrar menos Sincronizar - Mostrar campos - Ocultar campos - Importado con éxito - Esta sección está mal configurada.\nContacte con su administrador. Sincronizado con éxito Sincronizando %s... archivos @@ -981,4 +600,22 @@ Completar %s Desactivar %s Reabrir %s + + + %s error + %s errores + %s errores + + + + %s advertencia + %s advertencias + %s advertencias + + + + Hay %s programa con una configuración específica + Hay %s programas con configuraciones específicas + Hay %s programas con configuraciones específicas + diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index d9e83ec2069..b1d833b6380 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1,60 +1,26 @@ Dhis2 - dhis - 2 Erreur - - Erreur - Erreurs - Erreurs - - URL incorrecte - références incorrectes - Erreur inattendue - Erreur interne - pas de valeur Il n\'y a plus de valeurs réservées. Veuillez contacter votre administrateur système. - Il n\'y a plus de valeurs réservées. Veuillez vous connecter pour en obtenir d\'autres. - erreurs Quelque chose a mal tourné - Synchronisez_maintenant - Synchronisation avec le serveur - Synchronise maintenant - Méta-données Événements - Entités suivies - - Fini - Synchronisation complète Problème de synchronisation Une erreur s´est produite pendant sync. Essayez à nouveau. La synchronisation est terminée, mais nous n\'avons pas reçu de confirmation du serveur pour tous les enregistrements. Ces enregistrements sont toujours marqués comme \"hors ligne\" dans l\'application. Nous vous recommandons de réessayer la synchronisation. - Une erreur s\'est produite et le serveur n\'a pas répondu. Contactez votre administrateur. - %s résultats trouvé - Nouveau - Ajouter - planifier nouveau référence - URL du serveur - Nom d\'utilisateur - Mot de passe - Se connecter - Déverrouiller la session Sync votre configuration Vos données seront sync sous peu Synchronisation des données La configuration est prête vos données sont prêtes - La configuration a échoué - Synchronisation a échoue Récupération de compte Quotidien @@ -72,130 +38,76 @@ Saisir du texte Saisir texte long Saisir un nombre - Saisir un nombre entier Saisir un entier négatif Saisir un entier ou zéro Saisir un entier positif - Options de filtre Choisissez une date - Changer de calendrier - Programme complété - Programme inactif Ouvrir Événement terminé Lecture seule - Terminer et Compléter Terminé Annulé - Activer Actif Synchronisé Envoyer Prêts à actualiser - Prêts de supprimer Erreur - Synchroniser - ENVOYER - SYNC SMS - Terminé - Créer Mettre à jour - Date Unités d´Organisation Il n\'y a pas d\'unité d\'organisation ouverte pour la date sélectionnée. Merci de sélectionner une autre date ou une autre unité d\'organisation. - Options de catégorie Latitude Longitude - Nouvel événement - Une fois - Définitif Période du rapport - Option de catégorie - Si vous saisissez une valeur, la ligne entière doit être remplie pour compléter l\'ensemble de données. - Des valeurs obligatoires sont manquantes. Vous devez spécifier les valeurs obligatoires pour compléter l\'ensemble de données. - Il manque des champs obligatoires. Veuillez les remplir pour compléter l\'ensemble de données. - La valeur a été enregistrée - Aucune période disponible pour sélectionner Date d\'échéance Combinaison de catégories - JJ/MM/AAAA Annuler Supprimer - Total Date de l\'événement le plus récent Aucune option disponible Programmes en cours - Programmes disponibles pour l´admission Inscrire - Dernière visite - Appliquer - Voir les détails - Afficher plus Modifier - Suivi - Suivi activé - Suivi désactivé Désactiver Ce programme ne permet pas plus d\'événements - Aucune donnée événements Accueil - Information de l´Appli Déconnecter - Bloquer la session - 1 Minute - 15 Minutes 30 Minutes 1 Heure 6h 1 jour (par défaut) 12h - Données de synchronisation automatique (chaque:) Manuel - Configuration automatique de la synchronisation (chaque:) 1 Semaine - Paramètres de synchronisation actuels - Retour aux valeurs par défaut La base de données sera supprimée.\nVous devez donc entrer de nouveau Accepter Annuler Synchroniser les données mainténant Synchroniser la configuration mainténant Paramètres - Dernière synchronisation sur: %s - Dernière synchronisation sur: %s Remplir - Module SMS: Passerelle SMS Résultat de l\'origine du SMS - secondes - nombre - nombre Activer soumission SMS En attente du résultat de la réponse SMS - - Il y a %s programme avec des paramètres spécifiques - Il y a %s programmes avec des paramètres spécifiques - Il y a %s programmes avec des paramètres spécifiques - Paramètres limités Globalement par programme @@ -213,20 +125,15 @@ Ce registre contient toutes les erreurs causées par la synchronisation de vos données et métadonnées. Suprimmer les données Toutes les données de l\'application enregistrées sur votre appareil seront supprimées. Les données non synchronisées avec le serveur seront perdues. - Redémarrer l´application - Votre configuration et les données de l\'application enregistrées sur l\'appareil seront supprimées. Vous devrez vous connecter de nouveau et les données non synchronisées avec le serveur seront perdues. Paramètres SMS Cliquez et éditez les paramètres de la passerelle SMS Mise à jour du logiciel - Logiciel Exportation de la base des données Exporter votre base de données et le partager avec l\'administrateur Authentification à deux facteurs Statut - Date d\'enrôlement - Chercher @@ -235,43 +142,19 @@ écrire une nouvelle note Effacer Ajouter une note - Annuler - Activé - Les champs obligatoires sont manquant - Certains des champs obligatoires sont manquant. Si vous voulez retourner, tout l´information sera supprimer - Certains champs obligatoires sont vides. Si vous voulez retourner, veuillez les renseigner. - Certains champs nécessitent votre attention. \n Voulez-vous revoir le formulaire ? Vos données n\'ont pas été sauvegardées - Si vous retournez maintenant, toute information saisie sera supprimée. - Supprimer et retourner - Certains champs ont des erreurs:\n%s\nVeuillez les vérifier. - Des champs obligatoires ne sont pas renseignés. Vous pouvez terminer la saisie et quitter, mais l\'évènement ne peut être complété. Coordonnées pour - Liste des sections - %s questions de %s complétées - %s de %s complété - Completé et fermer - Jours - Mois - Années - Semaines Date d\'incident - Résultats locaux - Résultats en ligne Programmes antérieurs Vous n\'êtes pas autorisé à effectuer cette action - Ajouter comme... - Effacer Période - (%d) L´unité d´Organisation - Niveau %d Bienvenue à dhis2 Ici vous pouvez voir vos activités Vous pouvez appliquer un filtre... @@ -280,16 +163,11 @@ Vérifiez les autres actions dans le menu principal - Créer une relation Suivant Vous devez entrer au moins %d des attributs pour lancer une recherche - Vous devez renseigner au moins un des attributs afin d\'effectuer la recherche - il y a plus de %d des résultats. Veuillez entrer les autres critères de recherche - Entrez vos critères de recherche Importer des données QR - Enregistrer Ok Identification Attributs @@ -301,33 +179,18 @@ Aucune donnée Code QR invalide Cet attribut ne peut pas être ajouté - Cette entité ne peut pas être enrôlée À propos Programmes disponibles pour l´admission - Tout sélectionner - Dégager sélection - Il n\'y a pas d\'information pour les critères choisis. Veuillez les changer Partager Partager le QR - La recherche par type n\'est pas disponible en ligne.\nVeuillez sélectionner un programme dans la liste - Max - Courant TEI TEIs - Limite par l´unité organizationnelle - Limite par porgramme - Liste de Programmes Redémarrer l´application - Il n\'est pas possible d\'ajouter cette relation Attention. Verifiez ça! - Attention - Erreur Enregistrer Valeurs réservées - Voulez-vous ajouter plus de données de QR - Version de l´appli: %s Version de SDK: %s @@ -338,145 +201,44 @@ \"Développé et entretenu par le \"DHIS2\" projet, partie de l\'Université d\'Oslo, \"département d\'informatique. \"Pour plus d\'informations ou des questions sur cette application, veuillez écrire à \"android\@dhis2.org - Le mot de passe est manquant. Veuillez compléter ce champ - Le nom d\'utilisateur est manquant. Veuillez compléter ce champ - Ce serveur a une version différente de 2.29. Mettre à jour la version ou utiliser un environnement d\'essai pour continuer - Ce serveur utilise une version différente que %s. Veuillez mettre à jour votre serveur ou utilisez l\'environnement test pour continuer. - Quelque chose a mal tourné. veuillez vérifier l\'url du serveur, le nom d\'utilisateur et le mot de passe sont corrects et réessayez - Le serveur ne peut pas terminer cette requête - Il y a un problème en essayant de se connecter au serveur - Erreur d\'accès - Les champs obligatoires sont manquant - Erreur inattendue lors d\'une recherche en ligne - Erreur lors de l\'analyse des résultats - La recherche en ligne a renvoyé une erreur - Quelque chose a mal tourné dans le serveur Sélectionnez un programme pour permettre l\'inscription Vous n\'avez pas l\'autorisation requise - Cette fonctionnalité n\'est pas encore prête - Erreur lors de l\'obtention de l\'étiquette de relation Tous %s N´est pas un numéro de téléphone valide - Ce n´est pas une adresse e-mail - Seuls les nombres négatifs sont autorisés seuls les nombres positifs ou zéro sont autorisés - Seuls les nombres positifs sont autorisés - Seules les valeurs de 0 à 1 sont autorisés - Seules les valeurs de 0 à 100 sont autorisés - sélectionner des dates pour filtrer Sélectionnez une option - Problème signalé - Générer un nouvel événement - Voulez-vous créer un nouvel événement événements terminés Tous les événements de ce programme sont terminés. Voulez-vous fermer le programme aussi? - Souhaitez-vous également compléter l\'enrôlement? Vérifier Accueil Exemple - Ajouter un widget Montrer l´aide - Synchronisation des données - Synchroniser votre configuration - Définir votre capacité de stockage locale - Vérifiez et gérez le nombre de valeurs réservées restantes - Vérifiez si la connexion au serveur a échoué - Libérer de l\'espace de stockage - ...ou supprimer tout pour recommencer. - Trouvez les entités suivies aussi bien dans votre appareil mobile que dans le serveur - Passer à un autre programme - Recherchez ou Ajouter de nouvelles entités. Vous devez effectuer une recherche avant de pouvoir en ajouter une nouvelle. - Cliquer ici pour réinitialiser les champs et pour recommencer la recherche C\'est le tableau de bord de l\'entité Voir les informations sur le profil des entités - ...Partager des informations via QR ou SMS... - ...Ou maqué l´entité pour le suivi - Cliquer pour planifier un événement ou faire référence à une autre unité d\'organisation Ici, vous verrez tous les événements. Cliquez pour voir un détail de l\'événement. Naviguer dans le menu pour ajouter des relations, voir des indicateurs ou écrire des notes - Cliquez pour voir toutes les inscriptions de votre entité ou en créer une nouvelle. - Cliquez ici pour supprimmer cet événement. Cette action ne peut pas être annulée - Completér l´événement - Tous les événements liés à ce programme seront listés ici - cliquez ici pour ajouter un nouvel événement Entrez toutes les données pour créer l\'événement Cliquez ici pour vérifier l\'état d\'achèvement de l\'événement - Cliquez ici pour complèter ou rouvrir un événement - Lire et stocker des informations provenant d\'autres appareils via QR - Synchroniser avec le serveur - Bloquer la session avec un code à 4 chiffres. N\'oubliez pas votre code! - Déconnectez-vous pour changer d\'utilisateur ou de serveur. Vous pourrez vous reconnecter même s\'il n\'y a pas de connexion internet - %s: Relation Aucun évènement n\'a été enregistré, cliquez \"+\" pour en ajouter un nouveau. - Aucun évènement enregistré. Valeurs de données Info Impossible de lire cet Id Suprimmer les données Général - Relations - Indicateurs - Analytiques Il n\'y a pas d\'indicateurs pour ce programme. - Notes - Impossible de terminer - Impossible de sauvegarder - Il y a des avertissements dans le formulaire - Certains champs comportent des erreurs. Merci de les vérifier pour compléter. Désélectionner l\'inscription Montrer le tableau de bord avec tous les programmes actifs - Vérifier les erreurs de synchronisation Registre d\'erreur de synchronisation Partager avec... - Votre synchronisation a échoué. Il pourrait y avoir des erreurs dans le serveur. Cliquez ici pour plus d\'informations. - PREC - SUIV. - Détails - Indicateurs - Notes - - Compléter plus tard - - Terminer - Champs avec erreurs - Certains champs ont des erreurs. Les valeurs n\'ont pas été enregistrées. Veuillez les vérifier. La valeur doit être unique, une coincidence a été trouvée. Elle n\'a pas été sauvegardée. Veuillez vérifier. - Une coïncidence dans un domaine unique a été trouvée. Veuillez vérifier le formulaire pour enregistrer l\'inscription. Veuillez patienter Ignorer - Re-agender Il n\'y a pas d\'information pour cet écran - En retard - Il y a une règle de programme dont le fonctionnement n\'est pas encore actif. Veuillez vérifiez la documentation - Pas d\'information pour ce champ - Références vides - Afin d\'utiliser la connexion par le scanner d\'empreinte digitale vous devez d\'abord vous connecter normalement - Sécurité biométrique - Voudriez-vous utiliser l\'empreinte digitale ou autre méthode biométrique pour se connecter - Tables - Tableau - https:// Les données non synchronisées seront perdues. Voulez-vous vraiment continuer? - Accepter Les données n\'ont pu être supprimées. Veuillez ressayer. Suppression des données locales terminée avec succès. - Au moins une unité d\'organisation doit être sélectionnée - Envoyer les données - Aidez DHIS2 à améliorer cette appli en partageant les registres d\'erreurs associés avec votre identifiant utilisateur. - Voudriez-vous nous aider à améliorer cette application? - Si vous selectionnez oui, l\'application envoyera des statistiques annonymes et journaux des erreurs qui permettront d\'améliorer l\'experience et la performance de l\'utilisation. Pour plus de détails, veuillez-vous référer à notre politique de confidentialité. - Politique de confidentialité - Vérifier les champs - Vous avez perdu la connexion lors de la synchronisation de la configuration. Veuillez ressayer plus tard. - Accord - Continuer - URL du serveur - Saisissez l\'URL du serveur DHIS 2 de votre organisation tel que fourni par votre administrateur système.\n\nVous pouvez également scanner le code QR avec le lien URL du serveur - Oublié le code? - Que souhaitez-vous faire pour cet évènement? - FIN %s non trouvé La donnée à laquelle vous essayez d\'accéder n\'est pas disponible. Voulez-vous la rechercher? Synchronisé par SMS @@ -484,33 +246,16 @@ Téléchargement en cours Relation Envoyé par sms - Il n\'y a pas de conflits pour ce programme - La connexion réseau non disponible, mais apparemment le réseau mobile fonctionne - vous pouvez utiliser le SMS. - Connection réseau non disponible Fermer Maintenant vous pouvez vérifier l\'information de synchronisation en cliquant ici - Cette donnée est enregistrée seulement sur votre appareil et n\'a pas été synchronisée avec le serveur. - Vous êtes à jour! Toutes vos données ont été envoyées au serveur. Vous ne pouvez pas établir de relation entre une donnée et elle-même - Dévérouiller la session - Terminer - Ouvrir - Type de valeur non supporté Changer de vue calendrier - 15 minutes - Toutes les heures - Quotidien - Hebdomadaire - Semaine - Paramètre de synchronisation: %s La donnée à laquelle vous essayer d\'accéder n\'a pas d\'enrôlement. Vous ne pouvez pas accéder au tableau de bord. Erreur de formattage Supprimer 1%s Vous n\'avez pas l\'autorité pour supprimer cette donnée - Ceci n\'est pas un lien URL valide Adapter le formulaire... - Numéro du destinataire Acceptez-vous d\'envoyer %d messages? Envoi de %1$d/%2$d En attent de confirmation du montant - %d @@ -528,51 +273,29 @@ Aucune passerelle définie Utilisateur non connecté Le module SMS est désactivé - Une autre soumission SMS est en cours Le module SMS n\'a pas été initié, metadata requises non trouvées - Terminé Le compte SMS n\'a pas été accepté La soumission SMS a débuté Données lues et converties. Identifiant de soumission: %d - Erreur avec l\'envoi de la soumission SMS SMS TEI enregistrement et enrôlement Soumission SMS de l\'évènement Soumission SMS de l\'ensemble de données - Démarrage - En cours - Envoyé - Echoué - Démarrage de la synchronisation. Synchronisation... - Synchronisation terminée - Une erreur s\'est produite lors de la synchronisation. - Une erreur s\'est produite lors de la synchronisation. Cliquez ici pour vérifier les journaux d\'erreurs. - Synchronisation annulée Copié - Image sélectionnée - Afficher sur la carte - Afficher la liste - %s est obligatoire mais n\'a pas été spécifié. - Le polygône a été défini Polygone - Empreinte digitale - Veuillez passer votre doigt dans le lecteur d\'empreintes digitales. Securité Pour des raisons de sécurité, cette version de l\'application n\'est pas autorisée à être utilisée sur des appareils enracinés. Veuillez utiliser la version de formation. - Il y a des erreurs. Veuillez les corriger avant de continuer. Application des filtres Aucun flitre n\'est appliqué Période Unité d\'org. - Trier - Statut Synchronisation Assigné à moi Aujourd\'hui @@ -587,25 +310,18 @@ De - à Autre A tout moment - La synchronisation a échoué. La synchronisation a échoué. Vérifiez les valeurs des données pour essayer de résoudre le problème et réessayez. S\'il échoue, contactez votre administrateur système - Ces données ont été envoyées au serveur mais il n\'est pas garanti qu\'elles aient été stockées Ouvrir Planning En retard Visité Terminé Sauté - Événements: %s max:%s %s courant:%s TEI:%s max:%s%s courant:%s - Paramètres limités %s \nEvénements: %s/%s TEI: %s/%s - Masquer les données d\'inscription - Afficher les données d\'inscription Le module SMS est activé Le module SMS est désactivé Téléchargement des données pour le module SMS. S\'il vous plaît, attendez La passerelle SMS ne peut pas être vide Il n\'y a aucune inscription à télécharger Cette tâche de conversion n\'est pas prise en charge - Ne plus afficher l\'écran de verrouillage Définir la broche Conflit Date de modification @@ -630,11 +346,7 @@ Choisissez l\'unité d\'organisation Entrez url Entrez une valeur - Choisissez l\'image - Scanner le code - Choisissez une option Valeurs réservées téléchargées par attribut TEI - Valeurs réservées téléchargées par attribut TEI %s valeurs réservées restantes Gérer les valeurs réservées Événements à télécharger @@ -654,56 +366,27 @@ Non synchronisé Erreur de synchronisation SMS synchronisé - Details - Commentaires Enregistré! - Voulez-vous vérifier la qualité des données\? - Tout a l\'air bien! - Voulez-vous également compléter l\'ensemble de données\? - Marquer comme terminé - Nom - Formule - Terminer quand même Disparu%s%sde%s%s Statut de l\'événement - Date d\'enrôlement Il n\'y a pas de données. Cliquez \"+\" pour ajouter un nouvel enregistrement Il n\'y a pas de données. Vous n\'êtes pas autorisé à ajouter de nouveaux enregistrements. Pas de description ou instruction fournie Données à examiner - Enregistré et terminé! Il y a déjà une enrôlement active Ouvrir Terminer Annulé - Données La sélection %s n\'a pas pu être téléchargé. - Terminé par %s: %s - Mis à jour: %s - Terminé - Nous n\'avons pas pu vérifier la qualité des données. Contactez votre administrateur - Etes-vous sûre ? - Voulez-vous rouvrir l\'ensemble de données? Date - Date d´événement - %s n\'a pas d\'attributs publics. Veuillez sélectionner un programme Politique de confidentialité Cliquez ici pour consulter notre politique de confidentialité - Les valeurs des coordonnées ne sont pas valides - Vous ne pouvez pas inscrire des TEI d\'autres unités organisationnelles dans ce programme parce qu\'il est protégé.\nContactez votre administrateur. Ce champ est obligatoire Pour des raisons de sécurité, cette version de l\'application ne peut pas être utilisée avec adb. Veuillez utiliser la version de formation. Précédent - Fermer l\'application - Plus de détails - Plus de détails - Fermer Copier dans le presse-papier - Copié dans le presse-papier - Informations d\'erreur Nous avons trouvé une erreur lors de la synchronisation avec votre serveur. Partagez l\'erreur avec votre administrateur système si c\'est possible - Nous n\'avons pas pu connecter la session avec votre nom d\'utilisateur Il y a des événements planifiés qui ne seront pas reprogrammés Graphiques Lister @@ -752,46 +435,27 @@ Réaction Indicateurs L\'autorisation de la caméra est refusée. \nVous devez l\'activer pour utiliser cette fonctionnalité. - Valeur Graphiques et indicateurs Prendre une photo - Choisir depuis la galerie - Terminé! Ce programme est protégé Décrivez la raison ici - En cours d\'authentification - L\'URL du serveur fournie n\'est pas une instance dhis - références incorrectes - Serveur inconnu - La valeur doit être un entier La session a expiré Votre session actuelle a expiré. Pour des raisons de sécurité, vous devrez fournir à nouveau vos informations d\'identification - Valeurs Semaine %d %s à %s Ne pas montrer de nouveau - %s ne peut pas être analysé comme une date Ce champ n\'a pas pu être mis à jour. Veuillez réessayer - Disponible Ces données ne sont pas modifiables car elles sont marquées comme terminées Cette donnée n\'est pas modifiable car son heure d\'édition est expirée Vous n\'êtes pas autorisé à modifier ces données Vous n\'êtes pas autorisé à modifier ces données Vous ne pouvez pas modifier les données de cette unité organisationnelle - Réinitialiser la recherche La recherche en ligne a renvoyé le message suivant : - Avertissement relatif aux règles du programme - Il y a un problème de configuration provoquant une boucle dans les règles. Contactez votre administrateur. - Actualiser - Inconnu - Actualiser toutes les données Supprimer compte - Gérer les comptes Langue Non enregistré! Certains champs nécessitent votre attention. \n Voulez-vous revoir le formulaire ? Il n\'y a pas de résultats pour cette recherche Résultats trop nombreux - Créer nouveau Ok Lancez une recherche pour trouver 1%s Vous pouvez rechercher ou créer un nouveau 1%s @@ -800,20 +464,11 @@ Certains champs contiennent des erreurs et ils ne sont pas enregistrés. \ nVoulez-vous revoir le formulaire ? Voulez-vous marquer ce formulaire comme complet? Vous avez des messages d\'erreur.\nVoulez-vous les consulter ? - Si vous quittez maintenant, les modifications seront ignorées. Réouvert Compte désactivé Votre compte a été désactivé par votre administrateur. Pour rechercher en dehors de ce programme, ouvrez le formulaire de recherche et remplissez l\'un des champs 1%s suivants : - Ouvrir détails %s - %s détails - SMS confirmé pour atteindre le serveur. Mise à jour du statut - SMS envoyé. Mise à jour du statut. - SMS non envoyé. Envoyer des SMS avec - Synchroniser les événements - Synchronisation des entités suivies - Synchronisation des ensembles de données Téléchargement d\'images ... Synchronisation nécessaire Erreur de synchronisation @@ -824,16 +479,6 @@ Envoyer Actualiser Pas maintenant - - %s erreur - %s erreurs - %s erreurs - - - %s avertissement - %s avertissements - %s avertissements - Mise à jour du logiciel Vérifier les mises à jour Pas de nouvelles mises à jour @@ -857,14 +502,29 @@ Étape du programme événement Chronologie - Optional Afficher plus Afficher moins Synchronisation - Afficher les champs - Masquer les champs Synchronisation réussie Afficher la description Masquer la description Transférer - + + + %s erreur + %s erreurs + %s erreurs + + + + %s avertissement + %s avertissements + %s avertissements + + + + Il y a %s programme avec des paramètres spécifiques + Il y a %s programmes avec des paramètres spécifiques + Il y a %s programmes avec des paramètres spécifiques + + diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml index d8deda45566..85568cd2f96 100644 --- a/app/src/main/res/values-hi-rIN/strings.xml +++ b/app/src/main/res/values-hi-rIN/strings.xml @@ -1,23 +1,13 @@ त्रुटि - गलत सर्वर - गलत लॉगिन जानकारी कुछ गलत हुआ - अभी सिंक करें - सिंक हो रहा है - सिंक हो रहा है इवेंट्स - खत्म - सिंक पूरा हुआ सिंक की गलती सिंक के दौरान एक त्रुटि हुई है। कृपया फिर से प्रयास करें। - जोड़ें - यूज़रनेम - पासवर्ड रोज़ाना साप्ताहिक @@ -36,65 +26,32 @@ पूरा हुआ त्रुटि - बनाएँ अपडेट करें - तारीख अक्षांश देशांतर - नया इवेंट - यदि आप कोई वैल्यू दर्ज करते हैं, तो डेटा सेट पूरा करने के लिए पूरी पंक्ति के सभी वैल्यू आवश्यक हैं। - कुछ अनिवार्य फ़ील्ड खाली हैं। डेटा सेट पूरा करने के लिए उन्हें भरें। रद्द करें हटाएं संपादन करें - कोई डेटा नहीं इवेंट्स स्वीकार करें रद्द करें सेटिंग्स - सॉफ्टवेयर सर्च करें / खोजें फ़ाइल जोड़ें - दिन - महीने - वर्ष - सप्ताह - साफ़ करें आगे - सहेजें ठीक है इवेंट्स साझा करें - अधिकतम - त्रुटि सहेजें यह मान्य फ़ोन नंबर नहीं है - यह मान्य ईमेल नहीं है - केवल नेगेटिव संख्या ही अनुमति है केवल शून्य या पॉजिटिव संख्या ही अनुमति है - केवल पॉजिटिव संख्या ही अनुमति है - केवल 0 से 1 के मान ही अनुमति हैं - केवल 0 से 100 के वैल्यूज़ अनुमति हैं - नया इवेंट जनरेट करें - क्या आप एक और इवेंट बनाना चाहते हैं\? - इंडिकेटर्स - इंडिकेटर्स - खत्म मान अद्वितीय होना चाहिए। समान मान मिला है। इसे सहेजा नहीं गया। कृपया जाँच करें छोड़ें - अतिदेय - स्वीकार करें संबंध बंद करें - पूरा हुआ - खोलें - रोज़ाना - साप्ताहिक - यह मान्य URL नहीं है - पूरा हुआ सिंक हो रहा है… आज कल (बिता हुआ) @@ -119,39 +76,23 @@ मान दर्ज करें सिंक की गलती सेव - क्या आप डेटा क्वालिटी चेक करना चाहते हैं\? - क्या आप डेटा सेट पूरा करना चाहते हैं\? - नाम - फिर भी पूरा करें रिव्यू के लिए डेटा - सेव और कंप्लीटेड खोलें पूरा हुआ - डेटा - पूरा हुआ - क्या आप सुनिश्चित हैं\? तारीख यह फ़ील्ड आवश्यक है पीछे जाएं - बंद करें इस वर्ष पिछली तिमाही पिछला वर्ष इंडिकेटर्स - वैल्यू फ़ोटो लें यह प्रोग्राम सुरक्षित है - गलत लॉगिन जानकारी - वैल्यू - %s डेट के रूप में पढ़ा नहीं जा सकता यह फ़ील्ड अपडेट नहीं हो सका। कृपया फिर से प्रयास करें - उपलब्ध इस डेटा को संपादित करने की अनुमति नहीं है इस डेटा को संपादित करने की अनुमति नहीं है - अज्ञात भाषा सेव नहीं - नया बनाएँ आपके पास कुछ चेतावनी संदेश हैं आपके पास कुछ चेतावनी संदेश हैं\nक्या आप इस फ़ॉर्म को कम्प्लीट मार्क करना चाहते हैं\? सिंक हो रहा है @@ -160,10 +101,6 @@ सिंक की गलती रेफर करें इवेंट - खोज साफ़ करें - वैकल्पिक - उपयोग के लिए कोई खोज फ़ील्ड कॉन्फ़िगर नहीं है और दिखाएँ कम दिखाएँ - यह सेक्शन सही तरह से कॉन्फ़िगर नहीं है\n अपने एडमिन से संपर्क करें diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 944211ac917..0e94737b601 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -1,57 +1,25 @@ DHIS2 - dhis - 2 Error - - Kesalahan - - URL Server salah - Kredensial salah - Kesalahan tak terduga - Kesalahan internal server - tidak ada nilai Tidak ada nilai lainnya. Hubungi admin sistem Anda. - Tidak ada nilai lainnya. Sambungkan ke Internet untuk mengisi. - Kesalahan Terjadi kesalahan - Sinkronkan sekarang - Mensinkronkan dengan server - Sedang mensinkronkan - Metadata Event - Entitas terlacak - - Selesai - Sync lengkap Sync error Terjadi kesalahan saat sinkronisasi. Silakan coba kembali. - Terjadi kesalahan dan server tidak merespon. Hubungi administrator anda. - %s hasil ditemukan - Tambahkan baru - Tambah - Penjadwalan baru Rujukan - URL server - User name - Password - Masuk - Buka sesi Mensinkronkan konfigurasi Anda Data Anda segera disinkronkan Mensinkronkan data Anda Konfigurasi Anda siap digunakan Data Anda tersedia - Konfigurasi sinkron gagal - Sinkronisasi data gagal Penyelamatan akun Harian @@ -69,126 +37,74 @@ Masukkan teks Masukkan teks panjang Masukkan angka - Masukkan angka positif Masukkan angka bulat negatif Masukkan bilangan bulat positif atau nol Masukkan bilangan bulat - Pilihan penyaringan Pilih tanggal - Ganti kalender - Program selesai - Program tidak aktif Buka Even selesai Baca saja - Selesai dan lengkap Selesai Dibatalkan - Aktivasi Aktif Sinkronisasi Untuk dikirim Untuk diperbarui - Untuk dihapus Error - SINKRONISASI - KIRIM - SINKRONISASI SMS - Melengkapi - Buat perbarui - Tanggal Unit Organisasi Tidak ada unit organisasi yang terbuka untuk tanggal terpilih. Mohon pilih tanggal atau unit organisasi lain - Kategori opsi Lintang Bujur - Event baru - Satu kali - Permanen Periode pelaporan - Opsi kategori - Jika Anda mengisi, semua baris harus terisi untuk menyelesaikan data set - Beberapa data yang diperlukan tidak ada. Anda perlu menetapkan data wajib terisi untuk menyelesaikan Data.Set - Terdapat hal penting yang hilang. Harap mengisinya untuk melengkapi data.set - Data tersimpan! - Tidak ada periode yang dapat dipilih. Tanggal jatuh tempo Cat Combo - DD/MM/YYYY batal hapus - Total hal yang paling terbaru Aktifkan program - Program untuk didaftarkan Daftar - Kunjungan terakhir: - Terapkan - Lihat rincian - LIHAT LAINNYA Sunting - Tindak lanjut - Tindak lanjut diterapkan - Tindak lanjut ditutup Deaktivasi Program ini tidak diperbolehkan menambah even - Tidak ada data Even Beranda - Informasi App Keluar - Tutup sesi - 1 Menit - 15 Menit 30 Menit 1 Jam 6 Jam 1 Hari (Default) 12 Jam - Sinkronisasi data otomatis setiap: Manual - Sinkronisasi konfigurasi otomasi setiap: 1 Minggu - Parameter sinkronisasi saat ini: - Kembalikan ke default Database akan dihapus. Anda akan diminta masuk lagi Terima batal Sinkronkan Data Sekarang Sinkronkan Konfigurasi Sekarang Setting - Sinkronisasi terakhir pada: %s - Sinkronisasi terakhir pada: %s Isi ulang - Modul SMS: SMS Gateway Pengirim hasil SMS - Kedua - Nomor - Nomor Fungsikan pengiriman SMS Tunggu balasan hasil SMS - - Terdapat %s program dengan pengaturan khusus - pengaturan terbatas Secara global berdasarkan program @@ -206,15 +122,11 @@ Log ini berisi semua kesalahan yang disebabkan karena sinkronisasi data dan metadata Anda Menghapus data local Semua data aplikasi yang tersimpan pada perangkat Anda akan dihapus. Data yang belum tersinkron pada server akan hilang. - Setel ulang app data & konfigurasi - Konfigurasi dan aplikasi penyimpan data pada perangkat Anda akan dihapus. Anda akan diminta untuk masuk kembali dan data yang belum disinkronkan pada server akan hilang. Pengaturan SMS Periksa dan edit parameter yang terkait dengan SMS gateway Status - Tanggal pendaftaran - Pencarian @@ -223,42 +135,19 @@ Tulis catatan baru Kosongkan Tambah catatan - Kembali - Diaktifkan - Bidang wajib tidak ada - Beberapa bidang wajib tidak ada. Jika Anda ingin kembali sekarang, semua informasi yang disimpan akan dihapus. - Beberapa bidang wajib tidak ada. Jika Anda ingin kembali, silakan isi. Data Anda tidak disimpan - Jika Anda kembali sekarang, semua informasi yang dimasukkan akan dihapus. - Hapus dan kembali - Beberapa parameter terjadi kesalahan:\n 1 %s \n Mohon, diperiksa - Beberapa bidang wajib tidak ada. Anda dapat menyelesaikan entri data dan keluar, tetapi even tidak dapat diselesaikan. Koordinat untuk - Daftar bagian - %s pertanyaan %s selesai - %s dari %s selesai - Selesai dan tutup - Hari - Bulan - Tahun - Minggu Tanggal insiden - Hasil lokal - Hasil online Program sebelumnya Anda tidak memiliki izin yang dibutuhkan untuk melakukan tindakan ini - Tambahkan sebagai… - Hapus Periode - (%d) Unit Organisasi - Tingkat %d Selamat datang di dhis2 Di sini Anda dapat melihat aktivitas Anda Anda dapat menerapkan filter… @@ -267,17 +156,11 @@ Periksa tindakan lain di menu utama - Buat hubungan Se;lanjutnya Anda harus memasukkan setidaknya %d atribut untuk melakukan pencarian - Anda harus memasukkan setidaknya satu atribut untuk melakukan pencarian - Ada lebih dari %d hasil. Silakan masukkan kriteria pencarian lebih lanjut - Kriteria penelusuran Anda tidak memberikan hasil apa pun.\nRevisi kriteria Anda atau daftarkan %s baru - Masukkan kriteria pencarian Anda Impor data QR - Simpan OK Identifikasi Atribut @@ -289,33 +172,18 @@ tidak ada data Kode QR tidak valid Atribut ini tidak dapat ditambahkan - Pendaftaran ini tidak dapat ditambahkan Tentang Program untuk didaftarkan - Pilih Semua - hapus pilihan - Tidak ada informasi untuk filter yang dipilih. Silakan coba mengubahnya. Bagikan Bagikan QR - Pencarian menurut jenis tidak dimungkinkan untuk pencarian online.\nSilakan pilih program dari daftar. - Maks - Saat ini TEI TEI - Batasi menurut unit organisasi - Batasi menurut program - Daftar program Setel ulang app data & konfigurasi - Tidak mungkin untuk menambahkan hubungan ini Periksa ini! - Peringatan - Error Simpan Nilai Cadangan - Apakah Anda ingin menambahkan lebih banyak data dari QR? - Versi Aplikasi: %s Versi SDK: %s @@ -326,138 +194,44 @@ Dikembangkan dan dikelola oleh proyek DHIS2 , bagian dari Universitas Oslo, departemen informatika . Untuk informasi lebih lanjut atau pertanyaan tentang aplikasi ini, silakan menulis ke android@dhis2.org - Kata sandi tidak ada. Silakan isi kolom ini. - Nama pengguna tidak ada. Silakan isi kolom ini. - Server ini menjalankan versi dhis yang berbeda dari 2.29. Perbarui versi server Anda atau gunakan pengujian lingkungan untuk melanjutkan. - Server ini menjalankan versi dhis yang berbeda dari %s. Perbarui versi server Anda atau gunakan pengujian lingkungan untuk melanjutkan. - Ada yang salah. Harap periksa bahwa url server, nama pengguna, dan kata sandi sudah benar dan coba lagi. - Server tidak dapat menyelesaikan permintaan ini. - Terjadi masalah saat mencoba masuk ke server. - Kesalahan login - Bidang wajib tidak ada - Kesalahan tak terduga pada saat pencarian online - Kesalahan saat penguraian hasil - Pencarian online menghasilkan kesalahan - Ada yang salah di server Pilih program untuk mengaktifkan pendaftaran Anda tidak memiliki izin yang diperlukan - Fungsi ini belum tersedia - Kesalahan saat mengambil label hubungan Semua %s Ini bukan nomor telepon yang valid - Ini bukan email yang valid - Hanya angka negatif yang diperbolehkan Hanya angka positif atau nol yang diperbolehkan - Hanya angka positif yang diperbolehkan - Hanya nilai dari 0 hingga 1 yang diperbolehkan - Hanya nilai dari 0 hingga 100 yang diizinkan - Pilih tanggal untuk difilter Pilih opsi - Masalah dilaporkan - Buat even baru - Apakah Anda ingin membuat even lain? Even Selesai Semua even dalam program ini selesai. Apakah Anda ingin menutup program? - Apakah Anda ingin menyelesaikan pendaftaran juga? Memeriksa Beranda CONTOH - Tambahkan widget Tampilkan bantuan - Proses sinkronisasi data... - …konfigurasi Anda… - …atur berapa banyak catatan yang akan diunduh dari server… - Periksa dan kelola berapa banyak nilai cadangan yang tersisa - Periksa apakah koneksi ke server gagal - Kosongkan sebagian ruang disk - …atau hapus semuanya untuk memulai dari awal. - Temukan entitas Anda baik di perangkat lokal maupun server online. - Anda dapat beralih ke program lain - Cari atau Tambahkan entitas baru. Anda perlu mencari sebelum Anda dapat menambahkan yang baru! - Klik di sini untuk membersihkan bidang dan memulai kembali pencarian. Ini adalah dasbor entitas Lihat informasi profil entitas… - …Berbagi informasi melalui QR atau SMS… - …Atau tandai entitas untuk ditindaklanjuti - Klik untuk membuat atau menjadwalkan even atau alihkan ke Unit Org lain. Di sini Anda akan melihat semua even. Klik untuk melihat detail even. Navigasikan menu untuk menambahkan hubungan, melihat indikator, atau menulis catatan. - Klik untuk melihat semua pendaftaran entitas Anda atau buat yang baru. - Klik untuk menghapus even ini. Tindakan ini tidak bisa dibatalkan. - Selesaikan even. - Semua even yang terkait dengan program ini akan dicantumkan di sini. - Klik untuk menambahkan even baru Masukkan semua data untuk membuat even Klik untuk memeriksa status penyelesaian even. - Klik untuk menyelesaikan atau membuka kembali even - Baca dan simpan informasi dari perangkat lain melalui QR - Mensinkronkan data Anda pada server - Blokir sesi dengan kode 4 digit. Jangan lupa kode Anda! - Logout untuk mengubah pengguna atau server. Anda akan dapat masuk kembali meskipun tidak ada koneksi internet. - %s: hubungan Tidak ada acara yang terdaftar, klik \"+\" untuk menambahkan yang baru. - Tidak ada even yang terdaftar. Nilai data Info Tidak dapat membaca ID ini Menghapus data lokal Gambaran - Hubungan - Indikator - Analitik Tidak ada indikator untuk program ini. - Catatan - Beberapa parameter terjadi kesalahan. Mohon periksa untuk dapat menyelesaikannya Semua pendaftaran Tampilkan dasbor dengan semua program aktif - Buka log kesalahan sinkronisasi Log kesalahan sinkronisasi Berbagi dengan... - Konfigurasi sinkronisasi Anda gagal. Terdapat kesalahan pada server. Klik bagian ini untuk informasi lebih lanjut - SEBELUMNYA - SELANJUTNYA - Rincian - Indikator - Catatan - - Selesaikan nanti - - Selesai - Parameter dengan kesalahan - Beberapa parameter terdapat kesalahan. Parameter ini belum disimpan. Mohon periksa kembali Nilai harus unik, kebetulan telah ditemukan. Itu belum disimpan. Tolong diperiksa. - Sebuah kebetulan di bidang yang unik telah ditemukan. Silakan periksa formulir untuk menyimpan Pendaftaran. Mohon tunggu Lewati - Jadwal ulang Tidak ada informasi untuk layar ini - Lewat waktu - Terdapat satu aturan program yang tidak didukung. Silakan periksa dokumentasi - Tidak ada info untuk bidang ini - Kredensial Kosong - Untuk dapat login menggunakan pemindai sidik jari, Anda terlebih dahulu harus menggunakan cara default - Keamanan Biometrik - Tabel - Tabel - https:// Data yang belum tersinkron akan hilang. Apakah Anda akan melanjutkan? - Terima Data tidak dapat dihapus. Silakan coba lagi. Hapus data lokal berhasil diselesaikan. - Setidaknya satu unit organisasi harus dipilih - Kirim data - Bantu DHIS2 menyempurnakan app ini dengan membagi log kesalahan yang berkaitan dengan id user Anda - Periksa bidang - Anda kehilangan koneksi internet saat sedang mensinkronkan konfigurasi. Silahkan coba lagi nanti - Setuju - Terus - URL server - Masukkan url server DHIS 2 untuk organisasi Anda seperti yang disediakan oleh administrator sistem Anda.\n\nAtau, Anda dapat memindai kode QR yang berisi URL server Anda - Lupa kode Anda? - Apa yang ingin Anda lakukan untuk even ini? - AKHIR %s tidak ditemukan Catatan yang Anda coba akses tidak tersedia. Apakah Anda ingin mencarinya? Sinkronkan dengan SMS @@ -465,32 +239,15 @@ Mengunggah Hubungan Dikirim melalui sms - Tidak ada konflik untuk program ini - Koneksi jaringan tidak tersedia, tetapi sepertinya ada layanan telepon - Anda dapat menggunakan SMS. - Koneksi jaringan tidak tersedia. Tutup Anda bisa melihat hasil sinkronisasi dengan klik bagian ini - Data ini disimpan dalam perangkat Anda saja, tidak disinkronkan pada server - Anda up to date! Semua data Anda dikirim ke server. Anda tidak dapat menghubungkan rekaman dengan dirinya sendiri - Buka blokir sesi - Lengkap - Buka - Jenis nilai yang tidak didukung Ubah tampilan kalender - 15 menit - Setiap jam - Harian - Mingguan - Minggu - Pengaturan sinkronisasi: %s Catatan yang Anda coba akses tidak memiliki pendaftaran. Anda tidak dapat mengakses dasbor. Memformat kesalahan Anda tidak memiliki wewenang untuk menghapus catatan ini - Ini bukan url yang valid Menyesuaikan formulir… - Nomor penerima Apakah Anda menerima untuk mengirim pesan %d? Mengirim %1$d/%2$d Konfirmasi jumlah tunggu - %d @@ -508,51 +265,29 @@ Tidak ada gateway yang disetel Pengguna tidak masuk Modul SMS dinonaktifkan - Pengiriman SMS lainnya sedang berlangsung Modul SMS tidak dimulai, tidak ditemukan metadata yang diperlukan - Selesai Jumlah SMS tidak diterima Mulai pengiriman sms Data dibaca dan dikonversi. Id pengiriman: %d - Kesalahan pengiriman sms Pendaftaran dan registrasi SMS TEI Pengiriman even SMS Pengiriman data set SMS - Mulai - Dalam proses - terkirim - Gagal - Mulai sinkronisasi Sedang sinkronisasi... - Sinkronisasi selesai. - Kesalahan terjadi saat sinkronisasi - Terjadi kesalahan selama sinkronisasi. Klik di sini untuk memeriksa log kesalahan - Batalkan sinkronisasi. Tersalin - Gambar dipilih - Tampilkan di peta - Tampilkan daftar - %s adalah wajib tetapi belum disediakan. - Poligon ditangkap Poligon - Sidik jari - Harap, letakkan jari Anda di pembaca sidik jari Anda. Keamanan Untuk alasan keamanan, versi aplikasi ini tidak diizinkan untuk digunakan di perangkat yang di-rooting. Silakan gunakan versi pelatihan. - Terdapat beberapa kesalahan. Mohon perbaiki sebelum melanjutkan Filter menerapkan Tidak ada filter yang diterapkan Periode Organisasi Satuan - Penyortiran - Status Sinkronisasi Ditugaskan kepada saya Hari ini @@ -567,135 +302,18 @@ Dari untuk Lainnya Kapan saja - Sinkronisasi gagal. Periksa kembali nilai data untuk memperbaiki permasalahan kemudian coba lagi. Jika tetap gagal hubungi administrator sistem - Data ini telah terkirim ke server tetapi tidak dijamin telah disimpan Buka Jadwal Lewat waktu Dikunjungi Selesai Dilewati - Even:%smaks:%s%ssaatini:%s TEI:%smaks:%s%ssatt ini:%s -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - Pengaturan terbatas %s\nAcara: %s/%s TEI: %s/%s - Sembunyikan data pendaftaran - Tampilkan data pendaftaran Modul SMS diaktifkan Modul SMS dinonaktifkan Mengunduh data untuk modul SMS. Mohon tunggu Gerbang SMS tidak boleh kosong Tidak ada pendaftaran untuk diunggah convertTask ini tidak didukung - Jangan tampilkan layar kunci lagi Setel pin Konflik Ganti tanggal @@ -720,11 +338,7 @@ Pilih unit organisasi Masukkan URL Masukkan nilai - Pilih gambar - Pindai kode - Pilih opsi Nilai yang dicadangkan diunduh per atribut TEI - Nilai yang dicadangkan diunduh per atribut TEI %s nilai yang dicadangkan tersisa Kelola nilai yang dicadangkan Even untuk diunduh @@ -744,56 +358,27 @@ Tidak tersinkronisasi Sync error SMS tersinkronisasi - Rincian - Komentar Tersimpan! - Apakah Anda ingin memeriksa kualitas data\? - Semuanya terlihat bagus! - Apakah Anda juga ingin melengkapi data set\? - Tandai sebagai selesai - Nama - Formula - Lengkap Tidak ada %s %s dari %s %s Status even - Tanggal pendaftaran Tidak ada data. Klik \"+\" untuk menambahkan catatan baru Tidak ada data. Anda tidak memiliki izin untuk menambahkan catatan baru. Tidak ada deskripsi atau instruksi yang tersedia Data untuk ditinjau - Tersimpan dan selesai! Sudah ada pendaftaran aktif Buka Lengkap Dibatalkan - Data %s yang dipilih tidak dapat diunduh. - Diselesaikan oleh %s: %s - Diperbarui: %s - Selesai - Kami tidak dapat memeriksa kualitas data. Hubungi administrator Anda - Anda yakin? - Apakah Anda ingin membuka kembali data set? Tanggal - Tanggal even - %s tidak memiliki atribut publik. Silakan pilih program Kebijakan pribadi Klik di sini untuk memeriksa kebijakan privasi kami - Nilai koordinat tidak valid - Anda tidak dapat mendaftarkan TEI dari unit organisasi lain dalam program ini karena program ini dilindungi.\nHubungi administrator Anda. Bidang ini wajib Untuk alasan keamanan, versi aplikasi ini tidak diizinkan untuk digunakan dengan adb. Silakan gunakan versi pelatihan. Kembali - Tutup aplikasi - Keterangan lebih lanjut - Keterangan lebih lanjut - Tutup Menyalin ke clipboard - Disalin ke papan klip - Informasi kesalahan Kami menemukan kesalahan saat menyinkronkan dengan server Anda. Bagikan kesalahan dengan administrator sistem Anda jika memungkinkan. - Kami tidak dapat memulai sesi dengan pengguna Anda Ada even yang direncanakan yang tidak akan dijadwalkan ulang Grafik Daftar @@ -838,23 +423,14 @@ Umpan balik Indikator Izin kamera ditolak.\nAnda harus mengaktifkannya untuk menggunakan fitur ini. - Nilai Grafik dan indikator Ambil gambar - Pilih dari galeri - Selesai! Program ini dilindungi Jelaskan alasannya di sini - Otentikasi - URL server yang disediakan bukan instance dhis - Kredensial salah - Nilai harus dalam bilangan bulat Sesi telah berakhir Sesi Anda saat ini telah kedaluwarsa. Untuk alasan keamanan, Anda harus memberikan kredensial Anda lagi - Nilai Minggu %d %s hingga %s Jangan perlihatkan lagi - Tersedia Bahasa Hasil terlalu banyak Tersinkronisasi @@ -873,4 +449,8 @@ Tampilkan kurang Sinkronkan Tampilkan keterangan - + + + Terdapat %s program dengan pengaturan khusus + + diff --git a/app/src/main/res/values-km/strings.xml b/app/src/main/res/values-km/strings.xml index 43297c9e28d..ef7758df9e3 100644 --- a/app/src/main/res/values-km/strings.xml +++ b/app/src/main/res/values-km/strings.xml @@ -1,49 +1,23 @@ ឌីអេចអាយអេសធូ (DHIS 2) - ឌីអេចអាយអេសធូ (DHIS 2) - លេខពីរ កំហុសបច្ចេកទេស - អាសយដ្ឋានម៉ាស៊ីនមេមិនត្រឹមត្រូវ - អត្ដសញ្ញាណមិនត្រឹមត្រូវ - កំហុសបច្ចេកទេសមិនបានរំពឹងទុក - ម៉ាស៊ីនមេខាងក្នុងមានបញ្ហាបច្ចេកទេស - មិនមានតំលៃ មានអ្វីមួយខុសប្រក្រតី - បញ្ជូនទិន្នន័យឥឡូវនេះ - កំពុងបញ្ជូនទិន្នន័យទៅកាន់ម៉ាស៊ីនមេ - បញ្ចូនទិន្នន័យឥឡូវនេះ - ទិន្នន័យ ព្រឹត្តិការណ៏ - ផ្នែកតាមដាន - - បានបញ្ចប់ - ការបញ្ចូនទិន្នន័យបានបញ្ចប់ ការបញ្ចូនទិន្នន័យមានបញ្ហាបច្ចេកទេស មានបញ្ហាបច្ចេកទេសក្នុងកំឡុងពេលបញ្ជូនទិន្នន័យ, សូមព្យាយាម្ដងទៀត។ - %s លទ្ធផលដែលបានរកឃើញ - បន្ថែម​ថ្មី​ - បន្ថែម - កំណត់កាលវិភាគឥឡូវនេះ ការបញ្ជូន - អាសយដ្ឋានរបស់ម៉ាស៊ីនមេ - ឈ្មោះ​គណនី - ពាក្យ​សម្ងាត់ - ចូលដំណើរការ - ដោះសោ កំពុងបញ្ជូនការកំណត់​រចនាសម្ព័ន្ធរបស់អ្នក ទិន្នន័យរបស់អ្នកនឹងបញ្ជូនក្នុងពេលដ៏ខ្លីខាងមុខនេះ កំពុងបញ្ជូនទិន្នន័យរបស់អ្នក ការកំណត់​រចនាសម្ព័ន្ធរបស់អ្នករួចរាល់ ទិន្នន័យរបស់អ្នករួចរាល់ - ការបញ្ជូនការកំណត់​រចនាសម្ព័ន្ធរបស់អ្នកបរាជ័យ - ការបញ្ជូនទិន្នន័យបរាជ័យ ស្តារគណនីឡើងវិញ រាល់​ថ្ងៃ @@ -58,15 +32,11 @@ បញ្ជូលអក្សរ បញ្ចូលអក្សរច្រើន បញ្ជូលលេខ - បញ្ជូលទិន្នន័យជាលេខ បញ្ជូលទិន្នន័យជាលេខ (អវិជ្ជមាន) បញ្ជូលទិន្នន័យជាលេខ (វិជ្ជមាន រឺ លេខ ០) បញ្ជូលទិន្នន័យជាលេខ (វិជ្ជមាន) - ជំរើសសម្រាប់ច្រោះមើលទិន្នន័យ ជ្រើសរើសថ្ងៃខែឆ្នាំ - កម្មវិធីបានបញ្ចប់ - កម្មវិធីមិនដំណើរការ បើក បានត្រឹមតែអាន @@ -75,80 +45,48 @@ បញ្ចូន ដើម្បីធ្វើបច្ចុប្បន្នភាព - ដើម្បីលុប កំហុសបច្ចេកទេស - បញ្ជូន - ការបញ្ចប់ - ​បង្កើត ធ្វើ​បច្ចុប្បន្នភាព - កាលបរិច្ឆេទ អង្គភាព - ជម្រើសប្រភេទ រយៈទទឹង រយៈបណ្តោយ - ព្រឹត្តិការណ៏ថ្មី - មួយពេល - អចិន្ត្រៃយ៍ Report period កាលបរិច្ឆេទកំណត់ ប្រភេទបន្សំចូលគ្នា - ថ្ងៃថ្ងៃ/ខែខែ/ឆ្នាំឆ្នាំឆ្នាំឆ្នាំ បោះបង់ ​លុប​ កម្មវិធីដំណើរការ - កម្មវិធីចុះឈ្មោះ ចុះឈ្មោះ - ជួបចុងក្រោយ​ - អនុវត្ត - មើលលំអិត - មើលច្រើនទៀត កែសម្រួល​ - តាមដាន - ការតាមដានដំណើរការ - ការតាមដានមិនដំណើរការ ធ្វើអោយអសកម្ម កម្មវិធីនេះមិនអនុញ្ញាតអោយមានព្រឹត្តិការណ៏ច្រើនទេ - មិនមានទិន្នន័យ ព្រឹត្តិការណ៏ ផ្ទាំងដើម - ព័ត៌មានកម្មវិធី ចាកចេញ - ការទប់ស្កាត់ - ១នាទី - ១៥នាទី ១ម៉ោង ១ថ្ងៃ (លំនាំដើម) - កំណត់ការបញ្ជូនទិន្នន័យដោយស្វ័យប្រវត្តិជារៀងរាល់ ហត្ថកម្ម - កំណត់​រចនាសម្ព័ន្ការដោយស្វ័យប្រវត្តិជារៀងរាល់ ១សប្តាហ៍ - ប៉ារ៉ាម៉ែត្រដែលកំពុងធ្វើការបញ្ជូន - ធ្វើអោយទោលំនាំដើម ប្រព័ន្ធទិន្នន័យនឹងត្រូវលុបចោល\nអ្នកត្រូវចូលមកប្រើម្ដងទៀតដោយបញ្ចុលឈ្មោះ និង លេខសំងាត់​ ទទួលយក បោះបង់ បញ្ជូនទិន្នន័យឥឡូវនេះ បញ្ជូនការកំណត់​រចនាសម្ព័ន្ធឥឡូវនេះ ការ​កំណត់ - បានបញ្ជូនចុងក្រោយ: %s - បានបញ្ជូនចុងក្រោយ: %s - កំណត់កម្មវិធីឡើងវិញ ស្ថានភាព - ថ្ងៃខែឆ្នាំចុះឈ្មោះ - ស្វែងរក @@ -157,34 +95,16 @@ កត់ចំណាំថ្មី លុបចោល បន្ថែមការកត់ចំណាំ - ត្រលប់ក្រោយ - បានដាក់អោយដំណើរការ - ទិន្នន័យចាំបាច់មិនមាន - ឈ្មោះទិន្នន័យចាំបាច់ខ្លះមិនមាន, ប្រសិនបើអ្នកចង់ត្រឡប់ទៅវិញ រាល់ពត៏មាននិងត្រូវលុយចោល - លុប ហើយត្រឡប់ទៅវិញ - បញ្ជីតាមផ្នែក - %s សំនួរនៃ %s ដែលបានបញ្ចប់ - %s នៃ %s ដែលបានបញ្ចប់ - បញ្ចប់ និង ចាកចេញ - ថ្ងៃ - ខែ - ឆ្នាំ - សប្ដាហ៏ ថ្ងៃខែឆ្នាំ ធ្វើរោគវិនិច្ឆ័យ - លទ្ធផលក្នុងតំបន់ - លទ្ធផលអនឡាញ កម្មវិធីពីមុន អ្នកមិនមានសិទ្ធិគ្រប់គ្រាន់ដើម្បីដំណើរការផ្នែកនេះទេ - បន្ថែមថ្មីជា​ - លុបចោល កំឡុងពេល - (%d) អង្គភាព សូមស្វាគមន៏មកកាន់ប្រព័ន្ធ DHIS2 នៅទីនេះអ្នកអាចឃើញសកម្មភាពរបស់អ្នក អ្នកអាចអនុវត្តការច្រោះទិន្នន័យ​ @@ -193,15 +113,11 @@ ពិនិត្យមើលសកម្មភាពផ្សេងទៀតនៅផ្ទាំងបញ្ជីដើម - បង្កើតទំនាក់ទំនង បន្ទាប់ អ្នកត្រូវបញ្ចូលយ៉ាងហោចណាស់ %d នៃលក្ខណៈ (Attributes) ដើម្បីធ្វើការស្វែងរក - មានលទ្ធផលច្រើនជាង %d សូមបញ្ចូលលក្ខខណ្ឌផ្សេងទៀតដើម្បីស្វែងរកបន្ថែម - បញ្ចូលលក្ខខណ្ឌដើម្បីស្វែងរក នាំចូលទិន្នន័យ QR - រក្សាទុក​ យល់ព្រម ការកំណត់អត្តសញ្ញាណ លក្ខណៈ (Attributes) @@ -213,26 +129,15 @@ មិនមានទិន្នន័យ លេខកូដ QR មិនត្រឹមត្រូវ Attribute (លក្ខណៈនេះ) មិនអាចត្រូវបានបន្ថែមទេ - ការចុះឈ្មោះនេះមិនអាចបន្ថែមបានឡើយ អំពី កម្មវិធីចុះឈ្មោះ - ជ្រើសរើសទាំងអស់ - មិនមានព៌ត័មានដែលអ្នកបានច្រោះមើលនេះទេ, សូមប្ដូរចេញ​ ចែករំលែក ចែករំលែកលេខកូដ QR - ការស្វែងរកតាមរយៈបញ្ចូលមិនដំណើរការតាមរយៈការស្វែងរកតាមអនឡានទេ\nសូមជ្រើសរើសកម្មវិធីពីក្នុងបញ្ជី​ - អតិបរមា - បច្ចុប្បន្ន TEI - កំណត់ដោយអង្គភាព - បញ្ជីកម្មវិធី កំណត់កម្មវិធីឡើងវិញ - មិនអាចទៅរួចទេក្នុងការបន្ថែមទំនាក់ទំនងនៅទីនេះ ពិនិត្យទីនេះ​ - កំហុសបច្ចេកទេស រក្សាទុក​ - តើអ្នកចង់បន្ថែមទិន្នន័យពី QR ដែររឺទេ? កំណែកម្មវិធី %s @@ -244,86 +149,29 @@ \"Developed and maintained by the \"DHIS2\" project, part of University of Oslo, \"department of informatics សម្រាប់ព៌ត័មានបន្ថែម រឺ ក៏មានសំនួរអំពីកម្មវិធីនេះ, សូមសរសេរមកកាន់android\@dhis2.org - មិនមានលេខសំងាត់, សូមបំពេញ​ - មិនមានឈ្មោះអ្នកប្រើប្រាស់, សូមបំពេញ​ - ម៉ាស៊ីនមេនេះកំពុងដំណើរការខុសពី DHIS ២.២៩។ សូមធ្វើបច្ចុប្បន្នភាពលើម៉ាស៊ីនមេរបស់អ្នក​ - មានអ្វីមួយមិនប្រក្រតី​ សូមមើលអាសយដ្ឋានម៉ាស៊ីនមេ ឈ្នោះ លេខសម្ងាត់ ហើយព្យាយាមម្តងទៀត - ម៉ាស៊ីនមេមិនអាចបំពេញសំណើរនេះបានទេ​ - មានបញ្ហានៅពេលព្យាយាមចូលទៅក្នុងម៉ាស៊ីនមេ​ - ការចូលទៅប្រើប្រាស់មានបញ្ហា - ទិន្នន័យចាំបាច់មិនមាន - កំហុសដែលមិនបានរំពឹងទុកនៅពេលដែលកំពុងស្វែងរកនៅលើអនឡាញ - កំហុសខណៈពេលញែកលទ្ធផល - ការស្វែងរកតាមអនឡានមានបញ្ហាបច្ចេកទេស - មានអ្វីមួយខុសបច្ចេកទេសនៅលើម៉ាស៊ីនមេ ជ្រើសរើសកម្មវិធីដើម្បីដំណើរការចុះឈ្មោះ អ្នកមិនមានសិទ្ធិគ្រប់គ្រាន់ - មុខងារនេះមិនទាន់រួចរាល់នៅឡើយទេ​ - កំហុសក្នុងការធ្វើទំនាក់ទំនង ទាំងអស់ %s លេខទូរស័ព្ទមិនត្រឹមត្រូវ - អាសយដ្ឋានអ៊ីមែលមិនត្រឹមត្រូវ - លេខអវិជ្ជមានតែមួយគត់ដែលត្រូវបានអនុញ្ញាត លេខវិជ្ជមាន រឺ លេខ ០ តែមួយគត់ដែលត្រូវបានអនុញ្ញាត - លេខវិជ្ជមានតែមួយគត់ដែលត្រូវបានអនុញ្ញាត - តំលៃចន្លោះពីលេខ ០ ដល់ ១ ត្រូវបានអនុញ្ញាត - តំលៃចន្លោះពីលេខ ០ ដល់ ១០០ ត្រូវបានអនុញ្ញាត - ជ្រើសរើសថ្ងៃខែឆ្នាំដើម្បីច្រោះទិន្នន័យ កំណត់​ជម្រើស - បានរាយការណ៏បញ្ហា - បង្កើតព្រឹត្តិការណ៏ថ្មី - តើអ្នកចង់បង្កើតព្រឹត្តិការណ៏ថ្មីមួយទៀតទេ? ព្រឹត្តិការណ៏បានបញ្ចប់ គ្រប់ព្រឹត្តិការណ៏ទាំងអស់នៅក្នុងកម្មវិធីនេះបានបញ្ចប់។ តើអ្នកចង់បិទកម្មវិធីនេះទេ? ត្រួតពិនិត្យ ផ្ទាំងដើម ឧទាហរណ៏ - បន្ថែម Widget បង្ហាញជំនួយ - កំពុងបញ្ជូនទិន្នន័យរបស់អ្នក... - ...ការកំណត់​រចនាសម្ព័ន្ធរបស់អ្នក... - ...កំណត់ទំហំផ្ទុកក្នុងម៉ាស៊ីនរបស់អ្នក... - ...រឺ លុបគ្រប់យ៉ាងដើម្បីចាប់ផ្ដើមឡើងវិញ - អ្នកអាចផ្លាស់ប្ដូរទៅកម្មវិធីផ្សេងទៀត នេះគឺជាផ្ទាំងបង្ហាញព៌ត័មានរបស់អង្គភាព មើលព័ត៌មានប្រវត្តិរូបរបស់អង្គភាព... - ...ចែករំលែកព៌ត័មានតាមរយៈ QR រឹ SMS... - ...ឬសម្គាល់អង្គភាពសម្រាប់ការតាមដាន - ចុចដើម្បីបង្កើត រឺ ធ្វើកាលវិភាគលើព្រឹត្តិការណ៏មួយ រឺ បញ្ជូនទៅអង្គភាពផ្សេង ទីនេះអ្នកនឹងឃើញគ្រប់ព្រឹត្តិការណ៏ទាំងអស់, ចុចដើម្បីពិនិត្យមើលលំអិតពីព្រឹត្តិការណ៏ ចុចលើផ្ទាំង Menu ដើម្បីបន្ថែមទំនាក់ទំនង, មើលសូចនាករ រឺ សរសេរកំណត់ត្រា - ចុចដើម្បីមើលបញ្ជីទាំងអស់នៃអង្គភាពរបស់អ្នក ឬ បង្កើតថ្មី - ចុចដើម្បីលុបព្រឹត្តិការណ៏នេះ,​ សកម្មភាពនេះមិនអាចត្រលប់មកវិញបានទេ - បញ្ចប់ព្រឹត្តិការណ៏ - គ្រប់ព្រឹត្តិការណ៏ទាំងអស់ដែលទាក់ទងនឹងកម្មវិធីនេះត្រូវបង្ហាញនៅទីនេះ - ចុចដើម្បីបន្ថែមនូវព្រឹត្តិការណ៏ថ្មី បញ្ចូលគ្រប់ទិន្នន័យទាំងអស់ដើម្បីបង្កើតព្រឹត្តិការណ៏ថ្មី ចុចដើម្បីពិនិត្យពីស្ថានភាពនៃការបញ្ចប់របស់ព្រឹត្តិការណ៍ - ចុចដើម្បីបញ្ចប់ រឺ បើកឡើងវិញនូវព្រឹត្តិការណ៏ - អាន និង ផ្ទុកព៌ត័មានពីឧបករណ៏ផ្សេងៗតាមរយៈ QR - កំពុងបញ្ជូនទិន្នន័យរបស់អ្នកទៅកាន់ម៉ាស៊ីនមេ - បិទកម្មវិធីដោយលេខកូដ ៤ ខ្ទង់។ កុំភ្លេចលេខកូដរបស់អ្នក! - ចាកចេញដើម្បីប្ដូរឈ្មោះអ្នកប្រើប្រាស់ រឺ ដូរម៉ាស៊ីនមេ។ អ្នកនឹងអាចចូលមកប្រើបម្ដងទៀតទោះបីជាមិនភ្ជាប់អ៊ិនធើណែតក៏ដោយ ទំនាក់ទំនង ទិដ្ឋភាពទូទៅ - ទំនាក់ទំនង - Indicators - ចំណាំ - លម្អិត - Indicators - ចំណាំ - ទទួលយក - បន្ត - អាសយដ្ឋានរបស់ម៉ាស៊ីនមេ បិទ - បញ្ចប់ - បើក - រាល់​ថ្ងៃ - រាល់​សប្ដាហ៍ - បានបញ្ចប់ កំឡុងពេល - ស្ថានភាព បញ្ចូន ថ្ងៃនេះ កាលពីម្សិលមិញ @@ -337,19 +185,11 @@ ត្រលប់ថយ​ក្រោយ កាលពីម្សិលមិញ ការបញ្ចូនទិន្នន័យមានបញ្ហាបច្ចេកទេស - លម្អិត - ឈ្មោះ - ថ្ងៃខែឆ្នាំចុះឈ្មោះ បើក បញ្ចប់ បានលុបចោល - Data - Done - តើអ្នកច្បាស់ទេ? កាលបរិច្ឆេទ - ថ្ងៃខែឆ្នាំរបស់ព្រឹត្តិការណ៏ ត្រលប់ថយ​ក្រោយ - បិទ គំនូសតាង(ក្រាប) គំនូសតាង(ក្រាប) ចំណាំ @@ -369,13 +209,8 @@ ឆ្នាំហិរញ្ញវត្ថុមុន មតិ​ឆ្លើយតប Indicators - តម្លៃ - អត្ដសញ្ញាណមិនត្រឹមត្រូវ - អាច​រក​បាន​ - មិន​ស្គាល់ ផ្ញើទៅ ការបញ្ចូនទិន្នន័យមានបញ្ហាបច្ចេកទេស - មិនមានក៏បាន បង្ហាញច្រើនទៀត បញ្ចូន បង្ហាញការពិពណ៌នា diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index 08ec9f2f8b3..a09d910bd56 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -1,62 +1,29 @@ ລະບົບ DHIS2 - ລະບົບຂໍ້ມູນຂ່າວສານດ້ານສຸຂະພາບຂັ້ນເມືອງ - 2 ເກີດການຜິດພາດ - - ຂໍ້ຜິດພາດ - - ຄວາມຜິດພາດຈາກການເຊື່ອມຕໍ່ຂອງເຄື່ອງຄອມພີວເຕີໜ່ວຍແມ່ - ຄວາມຜິດພາດຈາກຢັ້ງຢືນເອກະລັກບຸກຄົນ - ຄໍາຜິດທີ່ເກີດຂື້ນໂດຍບັງເອີນ - ຄໍາຜິດທີ່ເກີດຈາກພາຍໃນເຄື່ອງຄອມພີວເຕີໜ່ວຍແມ່ - ບໍ່ມີຂໍ້ມູນ ບໍ່ມີຄ່າທີ່ສະຫງວນໃວ້. ຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ - ບໍ່ມີຄ່າທີ່ສະຫງວນໃວ້. ເຊື່ອມຕໍ່ກັບເຄື່ອຂ່າຍເພື່ອບັນຈຸອີກ - ຂໍ້ຜິດພາດ ມີບາງຢ່າງຜິດພາດ - ດຽວນີ້, ລະບົບກໍາລັງທຳງານຮ່ວມກັນ - ກໍາລັງທໍາງານຮ່ວມກັນກັບຄອມພີວເຕີໜ່ວຍແມ່ - ລະບົບກໍາລັງທໍາງານຮ່ວມກັນ - ໂຄງຮ່າງຖານຂໍ້ມູນ ເຫດການ - ຂໍ້ມູນບົ່ງບອກເອກະລັກທີ່ຖືກຕິດຕາມ - - ສໍາເລັດ - ການທຳງານຮ່ວມກັນຂອງລະບົບສໍາເລັດແລ້ວ ຄໍາຜິດທີ່ເກີດຈາກການທໍາງານຮ່ວມກັນຂອງລະບົບ ມີຄໍາຜິດເກີດຂື້ນໃນຂະນະທີ່ລະບົບທໍາງານຮ່ວມກັນ. ກະລຸນາ, ທົດລອງເບີ່ງອີກ... ອັບເດດຂໍ້ມູນໃຫ້ຄືກັນສຳເລັດແລ້ວ ແຕ່ພວກເຮົາບໍ່ໄດ້ຮັບການຢືນຢັນຈາກເຄື່ອງຄອມພິວເຕິ້ໜ່ວຍແມ່ສຳລັບບັນທຶກທັງໝົດ. ເຫຼົ່ານັ້ນຍັງຖືກໝາຍເປັນ \"ອອບລາຍ\" ໃນແອັບ. ພວກເຮົາແນະນຳໃຫ້ລອງການຕັ້ງຄ່າການຊິ້ງຂໍ້ມູນອີກຄັ້ງ. - ເກີດຂໍ້ຜິດພາດ ແລະເຄື່ອງຄອມພິວເຕິ້ໜ່ວຍແມ່ບໍ່ຕອບສະໜອງ. ຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ. - %sຜົນໄດ້ຮັບທີ່ຖືກພົບເຫັນ - ເພີ່ມໃໝ່ - ເພີ່ມ ປ້ອນ%s ປ້ອນ / ຂ້າມ%s - ສ້າງແຜນໃໝ່ ການສົ່ງຕໍ່ - ທີ່ຢູ່ຂອງເຄື່ອງຄອມພີວເຕີໜ່ວຍແມ່ - ຊື່ຜູ້ໃຊ້ - ລະຫັດ - ເຂົ້າລະບົບ - ໄລຍະເປີດໃຫ້ນໍາໃຊ້ ລະບົບກໍາລັງທໍາງານຮ່ວມກັບການຈັດວ່າງລະບົບຂອງທ່ານ ຂໍ້ມູນຂອງທ່ານຈະຖືກສົ່ງເຂົ້າລະບົບໃນໄວໆນີ້ ຂໍ້ມູນຂອງທ່ານກໍາລັງຖືກສົ່ງເຂົ້າໃນລະບົບ ການຈັດວ່າງລະບົບຂອງທ່ານກຽມພ້ອມແລ້ວ ຂໍ້ມູນຂອງທ່ານກຽມພ້ອມແລ້ວ - ການຈັດວ່າງລະບົບຂອງທ່ານເພື່ອໃຫ້ທໍາງານຮ່ວມກັນຫຼົມເຫຼວ (ບໍ່ສໍາເລັດ) - ການເຊື່ອມຂໍ້ມູນເຂົ້າກັບລະບົບຫຼົມເຫຼວ (ບໍ່ສໍາເລັດ) ​ປັບ​ປຸງ​ຄືນ​ບັນ​ຊີ​ຂອງ​ທ່ານ - ຈໍາເປັນຕ້ອງມີການເຊື່ອມຕໍ່ອິນເຕີເນັດ ເພື່ອກູ້ຄືນບັນຊີຂອງທ່ານ. ທຸກໆມື້ @@ -77,130 +44,78 @@ ຂຽນຄໍາຕອບ ປ້ອນຂໍ້ມູນເປັນຂໍ້ຄວາມຍາວ ຕື່ມຕົວເລກ - ປ້ອນຂໍ້ມູນເປັນຈໍານວນຖ້ວນ ປ້ອນຂໍ້ມູນເປັນຈໍານວນຖ້ວນຄ່າລົບ ຕື່ມຕົວເລກ ປ້ອນຂໍ້ມູນເປັນຈໍານວນຖ້ວນຄ່າບວກ - ຄັດກອງເອົາຕົວເລືອກ ເລືອກວັນທີ - ປ່ຽນປະຕິທິນ - ໂປຣແກຣມດໍາເນີນການສໍາເລັດແລ້ວ - ໂປຣແກຣມທີ່ບໍ່ໄດ້ເປີດໃຊ້ງານ ເປີດ ບໍ່ສຳເລັດ ກິດຈະກຳສຳເລັດແລ້ວ ອ່ານໄດ້ເທົ່ານັ້ນ - ສີ້ນສຸດ ແລະ ສໍາເລັດ ສໍາເລັດແລ້ວ ຍົກເລີກແລ້ວ - ເປິດຟອມຄືນໃໝ່ - ເປິດໃຊ້ງານ ທີ່ຍັງນໍາໃຊ້ຢູ່ ອັບເດດຂໍ້ມູນໃຫ້ຄືກັນ ສົ່ງ ຕ້ອງການອັບເດດ - ເພື່ອລືບອອກ ເກີດການຜິດພາດ - ອັບເດດຂໍ້ມູນໃຫ້ຄືກັນ - ສົ່ງ - ຊິ້ງຂໍ້ຄວາມ - ການສໍາເລັດ - ສ້າງ ປັບປຸງ - ວັນທີ່ ສະຖານທີ່ ບໍ່ມີໜ່ວຍງານໃດທີ່ເປິດຢູ່ສຳລັບວັນທີທີ່ເລືອກ. ກະລຸນາເລືອກວັນທີ່ອື່ນຫຼືໜ່ວຍງານອື່ນ - Category Option ເສັ້ນຂະໜານ ເສັ້ນແວງ - ກໍລະນີໃໝ່ - ເທື່ອດຽວ - ຖາວອນ ຊ່ວງເວລາ ການລາຍງານ - ຖ້າທ່ານຕັ້ງຄ່າ, ແຖວທັ້ງໝົດຕ້ອງໃຊ້ຄ່າທັ້ງໝົດເພື່ອເຮັດໃຫ້ຊຸດຂໍ້ມູນສົມບູນ - ຄ່າຂໍ້ມູນບາງຄ່າທີ່ຈຳເປັນຫາຍໄປ. ທ່ານຕ້ອງກຳນົດຄ່າບັງຄັບ ເພື່ອໃຫ້ຊຸດຂໍ້ມູນສົມບູນ - ຍັງປ້ອນຂໍ້ມູນບັງຄັບບໍ່ຄົບ. ກະລຸນາ, ປ້ອນຂໍ້ມູນເພື່ອໃຫ້ຊຸດຂໍ້ມູນຄົບຖ້ວນ. - ປະຫຍັດຄ່າ! - ບໍ່ມີໄລຍະເວລາທີຈະເລືອກ ວັນທີຕ້ອງແລ້ວ ລາຍການທີ່ໃຫ້ເລືອກ - ວ/ດ/ປ ຍົກເລີກ ລົບ - ລວມ ວັນທີເຫດການຄັ້ງຫຼ້າສຸດ ໂປຣແກຣທີ່ເປີດນໍາໃຊ້ - ໂປຣແກຣມເພື່ອລົງທະບຽນ ຂື້ນທະບຽນ - ການລົງຢ້ຽມຢາມຄັ້ງທີ່ຜ່ານມາ - ນໍາໃຊ້ - ເບິ່ງຂໍ້ມູນເພີ່ມຕື່ມ - ເບີ່ງຕື່ມ ແກ້ໄຂ - ຕິດຕາມ - ເປີດການຕິດຕາມ - ການຕິດຕາມບໍ່ສາມາດນໍາໃຊ້ໄດ້ ຢຸດນໍາໃຊ້ ໂປຣແກຣມນີ້ບໍ່ອະນຸຍາດຕື່ມກໍລະນີເຂົ້າອີກ - ບໍ່ມີຂໍ້ມູນ ເຫດການ ໜ້າຫຼັກ - ຂໍ້ມູນກ່ຽວກັບໂປຣແກຣມ ອອກຈາກລະບົບ - ໄລຍະປີດການນໍາໃຊ້ ສະແດງ%sເພີ່ມເຕີມ ສະແດງໃຫ້ເຫັນໜ້ອຍລົງ - 1 ນາທີ - 15 ນາທີ 30 ນາທີ 1 ຊົ່ວໂມງ 6h 1 ມື້ (ຄ່າມາດຕະຖານ) 12h - ສົ່ງຂໍ້ມູນໂອໂຕມະຕິກ ແຕ່ລະ: ຄູ່ມື - ປັບປຸງການຕັ້ງຄ່າແບບໂອໂຕມຕິກ ທຸກໆ: 1 ອາທິດ - ຂອບເຂດທີ່ຕັ້ງໄວ້ໃຫ້ລະບົບທໍາງານຮ່ວມກັນໃນປະຈຸບັນ - ປັບລະບົບໃຫ້ທໍາງານໃນຄ່າປົກະຕິ ຖານຂໍ້ມູນຈະຖືກລືບ.\nທ່ານຈະໄດ້ເຂົ້າລະບົບໃໝ່ ຍອມຮັບ ຍົກເລີກ ອັບເດດຂໍ້ມູນໃຫ້ຄືກັນນະຕອນນີ້ ປັບການຕັ້ງຄ່າດຽວນີ້ ຕັ້ງຄ່າ - ອັບເດດຂໍ້ມູນຄັ້ງສຸດທ້າຍເມື່ອ:%s - ອັບເດດຂໍ້ມູນຄັ້ງສຸດທ້າຍເມື່ອ:%s ໃສ່ອີກ - ໂມດູນ SMS: ເສັ້ນທາງການນຳສົ່ງຂໍ້ຄວາມ ຜູ້ສົ່ງຜົນຂໍ້ຄວາມ - ວິນາທີ - ຈຳນວນ - ຈຳນວນ ເປິດໃຊ້ການສົ່ງຂໍ້ຄວາມ ລໍຖ້າການຕອບກັບທາງຂໍ້ຄວາມ - - ມີ%s ສາຍງານທີ່ມີການຕັ້ງຄ່າສະເພາະ - ຈໍາກັດການຕັ້ງຄ່າ ໃນທົ່ວໂລກ ຕໍ່ແຜນງານ @@ -218,17 +133,12 @@ ບັນທຶກນີ້ມີຂໍ້ຜິດພາດທັ້ງໝົດທີ່ເກີດຈາກການຊິ້ງຂໍ້ມູນ ແລະ metadata ຂອງທ່ານ. ລົບຂໍ້ມູນໃນເຄື່ອງ ຂໍ້ມູນແອັບ Capture ທັງໝົດທີ່ເກັບໄວ້ໃນອຸປະກອນຂອງທ່ານຈະຖືກລຶບອອກ. ຂໍ້​ມູນ​ທີ່​ບໍ່​ໄດ້​ຊິ້ງຂໍ້ມູນກັບຄອມພິວເຕີ້ໜ່ວຍແມ່​ຈະ​ສູນ​ເສຍ​ໄປ. - ຕັ້ງຄ່າໂປຣແກຣມຄືນໃໝ່ - ການຕັ້ງຄ່າ ແລະ ຂໍ້ມູນແອັບທີ່ເກັບໄວ້ໃນອຸປະກອນຈະຖືກລຶບອອກ. ທ່ານຈະຖືກຖາມໃຫ້ເຂົ້າສູ່ລະບົບອີກຄັ້ງ ແລະ ຂໍ້ມູນທີ່ບໍ່ໄດ້ຊິງຄ໌ກັບເຄື່ອງຄອມພິວເຕີ້ໜ່ວຍແມ່ຈະສູນເສຍໄປ. ຕັ້ງຄ່າຂໍ້ຄວາມ ອັບເດດຊັອບແວ - ຊອບແວ ກວດສອບຄວາມຖືກຕ້ອງແບບ 2 ຂັ້ນ ສະຖານະ - ວັນທີ່ລົງທະບຽນ - ຄົນຫາ @@ -237,43 +147,19 @@ ຂຽນບົດບັນທຶກໃໝ່ ຈັດມ້ຽນ ຂຽນບັນທຶກລົງ - ກັບຄືນສູ່ສະພາບເດີມ - ເປີດການນໍາໃຊ້ແລ້ວ - ຫ້ອງປ້ອນຂໍ້ມູນທີ່ຈໍາເປັນ ບໍ່ເຫັນ - ຫ້ອງປ້ອນຂໍ້ມູນຈໍານວນໜື່ງບໍ່ເຫັນ. ຖ້າທ່ານຕ້ອງການກັບຄືນດຽວນີ້, ຂໍ້ມູນທັງໝົດທີ່ໄດ້ບັນທຶກແລ້ວຈະຖືກລືບ - ຊ່ອງທີປ້ອນຂ້ໍມູນບາງຊ່ອງບໍເຫັນ. ຖ້າທ່ານຕ້ອງການກັບຄືນ, ກະລຸນາຕື່ມຂໍ້ມູນໃສ່ໃຫ້ຄົບ - ບາງຊ່ອງຂໍ້ມູນຈຳເປັນຕ້ອງດຳເນີນການຂອງທ່ານ.\n ທ່ານຕ້ອງການກວດສອບແບບຟອມຫຼືບໍ? ຂໍ້ມູນຂອງທ່ານບໍ່ໄດ້ບັນທຶກ - ຖ້າທ່ານກັບຄືນຕອນນີ້ ຂໍ້ມູນທີ່ປ້ອນທັ້ງໝົດຈະຖຶກລົບ - ລືບຂໍ້ມູນ ແລະ ກັບຄືນ - ບາງຊ່ອງມີຂໍ້ຜິດພາດ, %s ກະລຸນາກວດສອບ - ຊ່ອງປ້ອນຂໍ້ມູນຈໍານວນໜື່ງບໍ່ເຫັນ. ທ່ານສາມາດປ້ອນຂໍ້ມູນ ແລະ ອອກໄດ້, ແຕ່ເຫດການຈະບໍ່ສາມາດເຮັດໃຫ້ສຳເລັດໄດ້ ປະສານງານຫາ - ລາຍຊື່ຂອງແຕ່ລະພາກ - %s ຄໍາຖາມໃນ %s ທີ່ສໍາເລັດແລ້ວ - %s ໃນ %s ທີ່ສໍາເລັດແລ້ວ - ກົດສໍາເລັດ ແລະ ອອກ - ມື້ - ເດືອນ - ປີ - ອາທິດ ວັນທີເດືອນປີທີ່ເຫດການເກີດຂື້ນ - ຜົນໄດ້ຮັບໃນໂທລະສັບ - ຜົນໄດ້ຮັບທາງອອນລາຍ ໂປຣແກຣມທີ່ຜ່ານມາ ທ່ານບໍ່ໄດ້ຮັບອະນຸຍາດໃນການດໍາເນີນການໜ້າວຽກນີ້ - ເພີ່ມເຂົ້າເປັນ ... - ລຶບ ໄລຍະ ເວລາ - (%d) ຂອງ ສະຖານທີ່ - ລະດັບ %d ຍີນດີຕ້ອນຮັບເຂົ້າສູ່ ລະບົບ DHIS2 ທີ່ນີ້, ທ່ານສາມາດເບີ່ງກິດຈະກໍາ ຂອງທ່ານໄດ້ ທ່ານສາມາດນໍາໃຊ້ເຄື່ອງມືຄັດຈ້ອນ... @@ -282,16 +168,11 @@ ກວດເບີ່ງໜ້າວຽກອື່ນໆໃນລາຍການຫຼັກ - ສ້າງສາຍພົວພັນ ຕໍ່ໄປ ທ່ານຕ້ອງປ້ອນຢ່າງໜອຍ %d ຂອງ ຄຸນລັກສະນະເຂົ້າເພື່ອຊອກຫາ - ທ່ານຕ້ອງໃສ່ຢ່າງຫນ້ອຍຫນຶ່ງ ຂອງຄຸນລັກສະນະເພື່ອເຮັດການຄົ້ນຫາ - ມີຫຼາຍກ່ວາ %d ຂອງຜົນໄດ້ຮັບ. ກະລຸນາເພີ່ມເງື່ອນໄຂໃນການຄົ້ນຫາເຂົ້າຕື່ມ - ປ້ອນເງື່ອນໄຂການຊອກຫາຂອງທ່ານ ນໍາເອົາຂໍ້ມູນ QR ເຂົ້າ - ບັນທຶກ ​ຕົກ​ລົງ ເອກະລັກສ່ວນຕົວ Attributes @@ -303,32 +184,17 @@ ບໍໍ່ມີຂໍ້ມູນ ລະຫັດ QR ບໍ່ຖືກ ຄຸນລັກສະນະອັນນີ້ບໍ່ສາມາດປ້ອນເຂົ້າໄດ້ - ການຂື້ນທະບຽນນີ້ບໍ່ສາມາດປ້ອນເຂົ້າໄດ້ ກ່ຽວກັບ ໂປຣແກຣມເພື່ອລົງທະບຽນ - ເລືອກທັງໝົດ - ລຶບການເລືອກ - ບໍ່ມີຂໍ້ມູນສໍາລັບການຄັດຈ້ອນທີ່ເລືອກມາ. ກະລຸນາພະຍາຍາມປ່ຽນຕົວຄັດຈ້ອນເບີ່ງ ແລກປ່ຽນ ແລກປ່ຽນ QR - ການຊອກຫາຕາມປະເພດແມ່ນເປັນໄປບໍ່ໄດ້ສໍາລັບການຄົ້ນຫາທາງອອນລາຍ\nກະລຸນາເລືອກໂປຣແກຣຈາກລາຍການ - ຄ່າໃຫ່ຍສຸດ - ປະຈຸບັນ ຈໍານວນກໍລະນີທີ່ປ້ອນເຂົ້າ - ຄັດຈ້ອນຕາມສະຖານທີ - ຈຳກັດໂດຍສາຍງານ - ລາຍຊື່ຂອງໂປຣແກຣມ ຕັ້ງຄ່າໂປຣແກຣມຄືນໃໝ່ - ເປັນໄປບໍ່ໄດ້ທີ່ຈະຕື່ມສາຍພົວພັນນີ້ເຂົ້າໄປ ກວດເບີ່ງອັນນີ້ - ແຈ້ງເຕືອນ - ເກີດການຜິດພາດ ບັນທຶກ ຄ່າລິຂະສິດ - ທ່ານຕ້ອງການເພີມຂໍ້ມູນຕື່ມຈາກລະຫັດ QR ນີ້ອີກບໍ? - ໂປຣແກຣມລຸ້ນ: %s SDK ລຸ້ນ: %s @@ -339,139 +205,44 @@ \"ຖືກພັດທະນາ ແລະ ບໍາລຸງຮັກສາໂດຍ \"DHIS2\" ໂຄງການເຊີ່ງເປັນພາກສ່ວນໜື່ງຂອງມຫາວິທະຍາໄລ ໂອສໂລ, ກົມຂໍ້ມູນຂ່າວສານ\"department of informatics. \"ສໍາລັບຂໍ້ມູນເພີມຕື່ມ ຫຼື ມີຄໍາຖາມກ່ຽວກັບໂປຣແກຣມນີ້, ກະລຸນາ ຂຽນໄປສອບຖາມໄດ້ທີ \"android\@dhis2.org - ບໍ່ມີລະຫັດຜ່ານ. ກະລຸນາ ໃສ່ລະຫັດຜ່ານ - ບໍ່ມີຊື່ຜູ້ໃຊ້. ກະລຸນາ ໃສ່ຊື່ຜູ້ໃຊ້ - ຄອມພີວເຕີໜ່ວຍແມ່ກໍາລັງທໍາງານກັບລະບົບ DHIS2 ລຸ້ນສູງກ່ວາ 2.29. ກະລຸນາ ນໍາໃຊ້ລຸນທີ່ສູງກ່ວາ ຫຼື ນໍາໃຊ້ລະບົບທົດລອງແທນ - ຄອມພິວເຕີໜ່ວຍແມ່ເຄື່ອງນີ້ ໃຊ້ເວີຊັ່ນdhisທີ່ແຕກຕ່າງຈາກ %s. ໃຫ້ອັບເດດເວີຊັ່ນຂອງທ່ານ ຫຼື ໃຊ້ສະພາບແວດລ້ອມການທົດລອງ ເພື່ອດຳເນີນການຕໍ່ - ມີບາງສີ່ງບາງຢ່າງທໍາງານບໍ່ຖືກຕ້ອງ. ກະລຸນາກວດເບີ່ງ ທີ່ຢູ່ຂອງຄອມພີວເຕີໜ່ວຍແມ່, ຊື່ຜູ້ນໍາໃຊ້ ແລະ ລະຫັດຜ່ານວ່າຖືກຕ້ອງແລ້ວບໍ, ແລ້ວພະຍາຍາມເຂົ້າອີກເບີ່ງ - ເຄື່ອງຄອມພີວເຕີໜ່ວຍແມ່ບໍ່ສາມາດດໍາເນີນການຕາມຄໍາຮ້ອງຂໍນີ້ໄດ້ - ມີບັນຫາເກີດຂື້ນໃນຂະນະທີ່ພະຍາຍາມເຂົ້າຫາຄອມພີວເຕີໜ່ວຍແມ່ - ຄໍາຜິດທີ່ເກີດຈາກການເຂົ້ານໍາໃຊ້ລະບົບ - ຫ້ອງປ້ອນຂໍ້ມູນທີ່ຈໍາເປັນ ບໍ່ເຫັນ - ຄໍາຜິດເກີດຂື້ນໂດຍບໍ່ຄາດຄິດໃນຂະນະທີ່ກໍາລັງຊອກຫາທາງອອນລາຍ - ມີຄໍາຜິດໃນຂະນະທີ່ສົ່ງຜົນໄດ້ຮັບ - ການຄັົ້ນຫາທາງອອນລາຍໄດ້ສົ່ງຄໍາຜິດກັບຄືນມາ - ບາງສີ່ງບາງຢ່າງໃນຄອມພີວເຕີໜ່ວຍແມ່ທໍາງານຜິດພາດ ເລືອກໂປຣແກຣມເພື່ອໃຫ້ສາມາດຂື້ນທະບຽນໄດ້ ທ່ານບໍ່ໄດ້ຮັບອະນຸຍາດຕາມທີ່ໄດ້ຮ້ອງຂໍ - ໜ້າທີ່ປະຕິບັດການນີ້ຍັງບໍ່ທັນກຽມພ້ອມ - ຄໍາຜິດທີ່ເກີດຈາກສາຍພົວພັນຂອງການຕັ້ງຊື່ ທັງໝົດຂອງ %s ເບີໂທລະສັບບໍ່ຖືກຕ້ອງ - ຊື່ອີແມ໋ວບໍ່ຖືກ - ອະນຸຍາດໃຫ້ປ້ອນໄດ້ພຽງແຕ່ຄ່າລົບເທົ່ານັ້ນ ອະນຸຍາດໃຫ້ປ້ອນໄດ້ພຽງແຕ່ຄ່າບວກ ຫຼື ສູນເທົ່ານັ້ນ - ອະນຸຍາດໃຫ້ປ້ອນແຕ່ຄ່າບວກເທົ່ານັ້ນ - ອະນຸຍາດໃຫ້ປ້ອນແຕ່ຄ່າ 0 ຫາ 1 ເທົ່ານັ້ນ - ອະຍາດໃຫ້ປ້ອນແຕ່ຄ່າ 0 ຫາ 100 ເທົ່ານັ້ນ - ເລືອກວັນທີເພື່ອຄັດຈ້ອນ ເລືອກທາງເລືອກ - ບັນຫາຖືກລາຍງານແລ້ວ - ປ້ອນເຫດການໃໝ່ - ທ່ານຕ້ອງການປ້ອນຂໍ້ມູນກໍລະນີອື່ນບໍ? ກໍລະນີໄດ້ປ້ອນເຂົ້າສໍາເລັດແລ້ວ ກໍລະນີທັງໝົດໃນໂປຣແກຣມນີ້ໄດ້ຖືກດໍາເນີນການສໍາເລັດແລ້ວ. ທ່ານຕ້ອງການປິດໂປຣແກຣມນີ້ບໍ່? - ທ່ານຕ້ອງການລົງທະບຽນໃຫ້ສຳເລັດຫຼືບໍ? ກວດເບີ່ງ ໜ້າຫຼັກ ຕົວຢ່າງ - ເພີມອົງປະກອບຂອງໂປຣແກຣມ ຊ່ວຍເຫຼືອ - ສົ່ງຂໍ້ມູນຂອງທ່ານ - ...ການປັບແລະຕັ້ງຄ່າຂອງທ່ານ... - ...ຕັ້ງຄ່າຂີດຄວາມສາມາດໃນການບັນທຶກຂອງໂທລະສັບຂອງທ່ານ... - ກວດສອບ ແລະ ຈັດການມູນຄ່າສຳລອງທີຍັງເຫຼືອ - ກວດເບິ່ງຄືນການເຊື່ອມຕໍ່ກັບຄອມພິວເຕີໜ່ວຍແມ່ວ່າລົ້ມເຫລວບໍໍ່ - ... ຫຼືລືບທຸກສີ່ງທຸກຢ່າງເພື່ອເລີ່ມໃໝ່ - ຊອກຫາໜ່ວຍງານຂອງທ່ານ ທັ້ງໃນອຸປະກອນຟື້ນທີ່ຂອງທ່ານ ແລະ ເຄື່ອງຄອມພິວເຕີໜ່ວຍແມ່ - ທ່ານສາມາດປ່ຽນໄປເລືອກເອົາໂປຣແກຣມອື່ນ - ຄົ້ນຫາ ຫຼືເພີ່ມຫົວໜ່ວຍໃໝ່. ທ່ານຕ້ອງຄົ້ນຫາກ່ອນທ່ານຈື່ງສາມາດເພີ່ມອັນໃຫມ່ໄດ້! - ຄລິກບ່ອນນີ້ເພື່ອລ້າງ ແລະ ເລີ່ມການຄົ້ນຫາໃໝ່. ນີ້ແມ່ນກະດານຂ່າວສໍາລັບຂໍ້ມູນສ່ວນຕົວ ເບີ່ງຂໍ້ມູນກ່ຽວກັບປະຫັວດສ່ວນຕົວ - ...ແບ່ງປັນຂໍ້ມູນຜ່ານທາງ QR ຫຼື ຂໍ້ຄວາມ SMS... - ...ໝາຍຂໍ້ມູນສ່ວນຕົວເພື່ອຕິດຕາມ - ກົດເພື່ອສ້າງ ຫຼື ເຮັດແຜນສໍາລັບ ກໍລະນີ ຫຼື ເພື່ອນໍາສົ່ງໄປສະຖານທີ່ອື່ນ ທີ່ນີ້, ທ່ານຈະເຫັນກໍລະນີທັງໝົດ. ກົດເພື່ອເບີ່ງລາຍລະອຽດ ຊອກຜ່ານລາຍການເພື່ອເພີ່ມສາຍພົວພັນເຂົ້າ, ເບີ່ງຄ່າຕົວປ່ຽນ ຫຼື ບັນທຶກໄວ້ - ກົດເພື່ອເບີ່ງການຂື້ນທະບຽນຂໍ້ມູນທັງໝົດ ຂອງ ທ່ານ ຫຼື ຂື້ນທະບຽນໃໝ່ - ກົດເພື່ອລືບກໍລະນີນີ້. ພຶດຕິກໍານີ້ສາມາດຍົກເລີກໄດ້ - ບັນທຶກ ກໍລະນີໃຫ້ສໍາເລັດ - ກໍລະນີທັງໝົດທີ່ກ່ຽວຂ້ອງກັບໂປຣແກຣມນີ້ຈະປະກົດຂື້ນທີ່ນີ້ - ກົດເພື່ອເພີ່ມກໍລະນີໃໝ່ເຂົ້າ ປ້ອນຂໍ້ມູນທັງໝົດເຂົ້າເພື່ອສ້າງເປັນກໍລະນີ ກົດເພື່ອກວດເບີ່ງການເຮັດສໍາເລັດການບັນທຶກກໍລະນີ - ກົດເພື່ອຢັ້ງຢືນການເຮັດສໍາເລັດ ຫຼື ເປີດກໍລະນີຄືນໃໝ່ເພືອດັດແປງ - ອ່ານ ແລະ ບັນທຶກຂໍ້ມູນຈາກໂທລະສັບໜ່ວຍອື່ນຜ່ານ QR - ສົ່ງຂໍ້ມູນຂອງທ່ານໄປຫາຄອມພີມເຕີໜ່ວຍແມ່ - ປິດໄລຍະການນໍາໃຊ້ດ້ວຍລະຫັດ4ໂຕ. ຢ່າລືມລະຫັດດັ່ງກ່າວ - Lອອກຈາກໂປຣແກຣມເພື່ອປ່ຽນຜູ້ໃຊ້ຫຼືທີ່ຢູ່ຂອງຄອມພີວເຕີໜ່ວຍແມ່. ທ່ານຈະສາມາດເຂົ້າໂປຣແກຣມຄືນໄດ້ເຖີງແມ່ນວ່າບໍ່ມີການເຊື່ອມຕໍ່ອີນເຕີແນັດກໍ່ຕາມ. - %s: ສາຍພົວພັນ ບໍ່ມີເຫດການທີ່ລົງທະບຽນໃວ້, ຄລິກ \"+\" ເພື່ອເພີ່ມເຫດການໃໝ່ - ບໍໍມີເຫດການທີ່ລົງທະບຽນ Data values ຂໍ້ມູນ ອ່ານໄອດີນີ້ບໍໄດ້ ລົບຂໍ້ມູນໃນເຄື່ອງ ພາບລວມ - ສາຍພົວພັນ - ຕົວຊີ້ວັດ - ການວິເຄາະ ບໍ່ມີຕົວຊີ້ບອກສຳລັບສາຍງານນີ້ - ຂໍ້ຄວາມ - ບໍ່ສາມາດສຳເລັດໄດ້ - ບໍ່ສາມາດບັນທຶກໄດ້ - ມີການແຈ້ງເຕືອນຢູ່ໃນຟອມ - ເຈົ້າ​ຕ້ອງ​ການ​ເຮັດ​ຫຍັງ? - ຂໍ້ມູນມີຂໍ້ຜິດພາດ. ກະລຸນາ, ກວດເບິ່ງເພື່ອໃຫ້ສາມາດເຮັດສໍາເລັດ ການລົງທະບຽນທັງໝົດ ສະແດງກະດານຂ່າວພ້ອມສາຍງານທີ່ເຮັດວຽກທັ້ງໝົດ - ເປິດບັນທຶກຂໍ້ຜິດພາດໃນການຊິ້ງ ບັນທຶກຂໍ້ຜິດພາດໃນການຊິ້ງ ຮ່ວມກັບ - ການຕັ້ງຄ່າການຊິ້ງຂໍ້ມູນຂອງທ່ານລົ້ມເຫຼວ ອາດມີຂໍ້ຜິດພາດໃນເຄື່ອງຄອມພິວເຕີໜ່ວຍແມ່ຂອງທ່ານ. ຄລິກບ່ອນນີ້ສຳລັບຂໍ້ມູນເພີ່ມເຕີມ - ຕໍ່ໄປ - ລາຍລະອຽດ - ຕົວຊີ້ວັດ - ຂໍ້ຄວາມ - - ສຳເລັດພາຍຫຼັງ - - ສີ້ນສຸດ - ຂໍ້ມູນມີຂໍ້ຜິດພາດ - ບາງຊ່ອງຂໍ້ມູນມີຂໍ້ຜິດພາດ. ຍັງບໍໄດ້ບັນທຶກ ກະລຸນາກວດສອບ ຄ່າບໍໍຄວນຊ້ຳກັນ ບັງເອີນໄດ້ຖຶກພົບເຫັນ. ມັນບໍໄດ້ບັນທຶກ. ກະລຸນາກວດສອບ - ໄດ້ພົບເຫັນຊ່ອງປ້ອນຂໍ້ມູນທີ່ເປັນເອກະລັກ. ກະລຸນາກວດສອບແບບຟອມເພື່ອບັນທຶກການລົງທະບຽນ ກະລຸນາລໍຖ້າ ຂ້າມ - ກຳນົດເວລາໃໝ່ ບໍ່ມີຂໍ້ມູນສຳລັບໜ້າຈໍນີ້ - ກາຍເວລາທີ່ກໍານົດ - ມີກົດລະບຽບຂອງສາຍງານໜື່ງຂໍ້ທີບໍໄດ້ຮອງຮັບ. ກະລຸນາກວດສອບເອກະສານ - ບໍ່ມີຂໍ້ມູນສຳລັບຫ້ອງຂໍ້ມູນນີ້ - ຂໍ້ມູນປະຈຳຕົວຫວ່າງເປົ່າ - ເພື່ອໃຫ້ສາມາດເຂົ້າສູ່ລະບົບໂດຍໃຊ້ເຄື່ອງສະແກນລາຍນິ້ວມື້ ທ່ານຕ້ອງໃຊ້ວິທີເລີ່ມຕົ້ນກ່ອນ - ຕາຕະລາງຂໍ້ມູນ - ຕາຕະລາງຂໍ້ມູນ ຂໍ້ມູນທີ່ບໍ່ໄດ້ຮັບການຊິ້ງຈະສູນເສຍໄປ. ທ່ານຕ້ອງການສືບຕໍ່ຫຼືບໍ? - ຍອມຮັບ ບໍ່ສາມາດລົບຂໍ້ມູນໄດ້ ກະລຸນາລອງໃໝ່ອີກຄັ້ງ ລົບຂໍ້ມູນໃນເຄື່ອງຮຽບຮ້ອຍແລ້ວ - ຕ້ອງເລືອກຢ່າງຫນ້ອຍໜື່ງໂຄງຮ່າງການຈັດຕັ້ງ - ສົ່ງຂໍ້ມູນ - ຊ່ວຍ DHIS2 ປັບປຸງແອບນີ້ດ້ວຍການແບ່ງປັນຂໍ້ຜິດພາດທີ່ກຽ່ວຂ້ອງກັບໄອດີຜູ້ໃຊ້ຂອງທ່ານ - ທ່ານຕ້ອງການຊ່ວຍພວກເຮົາປັບປຸງແອັບນີ້ບໍ? - ກວດເບີ່ງຫ້ອງປ້ອນຂໍ້ມູນ - ທ່ານສູນເສຍການເຊື່ອມຕໍ່ອິນເຕີເນັດຂອງທ່ານໃນຂະນະທີ່ດໍາເນີນການຊິ້ງຂໍ້ມູນການຕັ້ງຄ່າຂອງທ່ານ. ກະລຸນາລອງໃໝ່ອີກຄັ້ງ - ຍິນຍອມ - ຕໍ່ໄປ - ທີ່ຢູ່ຂອງເຄື່ອງຄອມພີວເຕີໜ່ວຍແມ່ - ປ້ອນທີ່ຢູ່ຂອງຄອມພິວເຕີໜ່ວຍແມ່ DHIS 2 ສຳລັບອົງກອນຂອງທ່ານ ຕາມທີ່ຜູ້ດູແລລະບົບຂອງທ່ານໃຫ້ມາ ຫຼື ທ່ານສາມາດສະແກນຄິວອາໂຄ້ດທີ່ມີທີ່ຢູ່ຂອງຄອມພິວເຕີໜ່ວຍແມ່ຂອງທ່ານ - ລືມລະຫັດຂອງທ່ານ? - ທ່ານຕ້ອງເຮັດຫຍັງສໍາລັບເຫດການນີ້? - ສິ້ນສຸດ %s ບໍ່ພົບເຫັນ ບັນທຶກທີ່ທ່ານກຳລັງເຂົ້າເຖີງຍັງບໍ່ສາມາດເຂົ້າໄດ້ ທ່ານຕ້ອງການຄົ້ນຫາຫຼືບໍ? ຊິ້ງຂໍ້ມູນດ້ວຍຂໍ້ຄວາມ @@ -479,33 +250,16 @@ ກຳລັງອັບໂຫຼດ ຄວາມສໍາພັນ ສົ່ງຂໍ້ຄວາມ - ສາຍງານນີ້ບໍມີຂໍ້ຂັດແຍ້ງ - ບໍ່ມີການເຊື່ອຕໍ່ກັບເຄື່ອຂ່າຍ, ແຕ່ເບີ່ງຄືວ່າມີບໍລິການໂທລະສັບ - ທ່ານສາມາດໃຊ້ຂໍ້ຄວາມໄດ້ - ການເຊື່ອມຕໍ່ກັບເຄື່ອຂ່າຍບໍສາມາດໃຊ້ໄດ້ ປິດ ຕອນນີ້ທ່ານສາມາດກວດສອບການຊິ້ງຂອງຂໍ້ມູນ ໂດຍການກົດໃສ່ - ຂໍ້ມູນນີ້ຈັດເກັບໃວ້ໃນອຸປະກອນຂອງທ່ານເທົ່ານັ້ນ, ບໍ່ມີການຊິ້ງກັບເຄື່ອງຄອມພິວເຕິ້ໜ່ວຍແມ່ - ທ່ານອັບເດດແລ້ວ! ຂໍ້ມູນຂອງທ່ານທັງຫມົດຖືກສົ່ງໄປຫາເຄື່ອງຄອມພິວເຕີ້ໜ່ວຍແມ່. ທ່ານບໍ່ສາມາດເຊື່ອມໂຍງບັນທຶກກັບຕົວມັນເອງໄດ້ - ໄລຍະເປິດໃຫ້ນຳໃຊ້ - ສຳເລັດແລ້ວ - ເປີດ - ປະເພດຄ່າບໍ່ຮອງຮັບ ປ່ຽນຮູບແບບປະຕິທິນ - 15 ນາທີ - ທຸກໆຊົ່ວໂມງ - ທຸກໆມື້ - ເປັນອາທິດ - ອາທິດ - ການຕັ້ງຄ່າການຊິ້ງຂໍ້ມູນ %s ບັນທຶກທີ່ທ່ານພະຍາຍາມເຂົ້າບໍ່ມີການລົງທະບຽນ. ທ່ານບໍສາມາດເຂົ້າເຖີງໜ້າກະດານຂ່າວໄດ້ ຂໍ້ຜິດພາດໃນການຈັດຮູບແບບ ລົບ%s ທ່ານບໍສາມາດທີ່ຈະລົບບັນທຶກນີ້ໄດ້ - ຊື່ url ບໍ່ຖຶກຕ້ອງ ກຳລັງປັບຟອມ... - ຕົວເລກຜູ້ຮັບ ທ່ານຍອມຮັບທີ່ຈະສົ່ງ %d ຂໍ້ຄວາມຫຼືບໍ? ກຳລັງສົ່ງ %1$d/%2$d ການຢືນຢັນຈຳນວນທີ່ລໍຖ້າ%d @@ -523,50 +277,28 @@ ບໍ່ໄດ້ຕັ້ງຄ່າການນຳສົ່ງ ຜູ້ໃຊ້ບໍໄດ້ເຂົ້າລະບົບ ໂມດູນຂໍ້ຄວາມຖືກປິດໃຊ້ງານ - ການສົ່ງຂໍ້ຄວາມອື່ນກຳລັງດຳເນີນຢູ່ ບໍ່ໄດ້ເລີ່ມໂມດູນຂອງຂໍ້ຄວາມ ບໍພົບ Metadata ທີ່ຕ້ອງການ - ສໍາເລັດແລ້ວ ບໍ່ຍອມຮັບການນັບຂໍ້ຄວາມ ເລີ່ມສົ່ງຂໍ້ຄວາມ ຂໍ້ມູນການອ່ານ ແລະ ແປງ. ລະຫັດການສົ່ງ: %d - ເກີດຂໍ້ຜິດພາດໃນການສົ່ງຂໍ້ຄວາມ ການລົງທະບຽນ ແລະ ລົງທະບຽນຂໍ້ຄວາມ TEI ສົ່ງເຫດການທາງຂໍ້ຄວາມ ການສົ່ງຊຸດຂໍ້ມູນຂໍ້ຄວາມ - ເລີ່ມຕົ້ນ - ກໍາລັງດໍາເນີນການ - ສົ່ງແລ້ວ - Failed - ກຳລັງເລີ່ມການຕັ້ງຄ່າການຊິ້ງຂໍ້ມູນ ກຳລັງຊິ້ງຂໍ້ມູນ - ການຕັ້ງຄ່າການຊິ້ງຂໍ້ມູນສຳເລັດແລ້ວ - ເກີດຂໍ້ຜິດພາດລະຫວ່າງການຊິ້ງຂໍ້ມູນ - ມີຂໍ້ຜິດພາດເກີດຂຶ້ນໃນລະຫວ່າງການຕັ້ງຄ່າການຊິ້ງຂໍ້ມູນ ຄລິກທີ່ນີ້ເພື່ອກວດສອບເບິ່ງຂໍ້ຜິດພາດ - ຍົກເລິກການຊິ້ງຂໍ້ມຸນແລ້ວ ສຳເນົາແລ້ວ - ເລືອກຮູບແລ້ວ - ສະແດງແຜ່ນທີ - ສະແດງລາຍການ - %s ບັງຄັບແຕ່ບໍໄດ້ລະບຸໃວ້ - ບັນທຶກຮູບຫຼາຍຫຼ່ຽມ Polygon - ລາຍນິ້ວມື - ກະລຸນາ, ວາງນິ້ວມືຂອງທ່ານໃນເຄື່ອງອ່ານລາຍນິ້ວມື ຄວາມປອດໄພ - ມີຂໍ້ຜິດພາດບາງຢ່າງ. ກະລຸນາແກ້ໄຂກ່ອນທີ່ຈະສຶບຕໍ່ ກຳລັງນຳໃຊ້ຕົວກອງ ບໍ່ໄດ້ໃຊ້ຕົວກອງ ຊ່ວງເວລາ ຫົວ​ໜ່ວຍ​ການ​ຈັດ​ຕັ້ງ - ການຈັດຮຽງ - ສະຖານະ ໃຫ້ລະບົບທໍາງານຮ່ວມກັນ ມອບໝາຍໃຫ້ຂ້ອຍ ມື້ນີ້ @@ -581,25 +313,18 @@ ຈາກ - ເຖິງ ອື່ນໆ ທຸກເວລາ - ການຊິ້ງລົ້ມເຫຼວ. ການຊິ້ງລົ້ມເຫຼວ. ກວດສອບເບີ່ງຄ່າຂໍ້ມູນເພື່ອລອງແກ້ໄຂບັນຫາ ແລະ ລອງໃໝ່ອີກຄັ້ງ. ຖ້າຫາກຍັງລົ້ມເຫຼວຢູ່ໃຫ້ຕິດຕໍ່ຜູ້ດູແລຮັກສາລະບົບຂອງທ່ານ - ຂໍ້ມູນນີ້ຖຶກສົ່ງໄປຫາເຄື່ອງຄອມພິວເຕີໜ່ວຍແມ່ແລ້ວ ແຕ່ບໍໄດ້ຮັບປະກັນວ່າຈະໄດ້ຮັບການຮັກສາໃວ້ ເປີດ ກຳນົດເວລາ ກາຍເວລາທີ່ກໍານົດ ເຂົ້າຊົມ ສໍາເລັດແລ້ວ ຂ້າມໄປ - ເຫດການ%sສູງສຸດ%s%sປະຈຸບັນ%sTEI%sສູງສຸດ%s%sປະຈຸບັນ%s - ຈຳກັດການຕັ້ງຄ່າ%s\nເຫດການ:%s/%sTEI:%s/%s - ເຊື່ອງຂໍ້ມູນການລົງທະບຽນ - ສະແດງຂໍ້ມູນການລົງທະບຽນ ເປິດໃຊ້ງານໂມດູນຂໍ້ຄວາມ ໂມດູນຂໍ້ຄວາມຖືກປິດໃຊ້ງານ ກຳລັງດາວໂຫຼດຂໍ້ມູນສຳລັບໂມດູນຂໍ້ຄວາມ. ກະ​ລຸ​ນາ​ລໍ​ຖ້າ ເສັ້ນທາງການນຳສົ່ງຂໍ້ຄວາມຕ້ອງບໍ່ຫວ່າງເປົ່າ ບໍ່ມີການລົງທະບຽນທີ່ຈະອັບໂຫຼດ ຍັງບໍ່ມີການຮອງຮັບຫນ້າວຽກການແປງນີ້ - ບໍ່ຕ້ອງສະແດງລັອກໜ້າຈໍອີກ ຕັ້ງລະຫັດຜ່ານ ຂັດແຍ້ງ ປ່ຽນວັນທີ @@ -623,11 +348,7 @@ ເລືອກຫົວໜ່ວຍອົງກອນ ປ້ອນ url ປ້ອນຄ່າ - ເລືອກຮູບພາບ - ສະແກນລະຫັດ - ເລືອກຄໍາຕອບ ດາວໂຫຼດຄ່າລິຂະສິດຕາມຄຸນລັກສະນະTEI - ດາວໂຫຼດຄ່າລິຂະສິດຕາມຄຸນລັກສະນະTEI ຈັດການຄ່າລິຂະສິດ ດາວໂຫຼດເຫດການ ດາວໂຫຼດ TEIs @@ -646,53 +367,26 @@ ບໍ່ໄດ້ອັບເດດຂໍ້ມູນໃຫ້ຄືກັນ ຄໍາຜິດທີ່ເກີດຈາກການທໍາງານຮ່ວມກັນຂອງລະບົບ ຂໍ້ຄວາມອັບເດດຂໍ້ມູນໃຫ້ຄືກັນ - ລາຍລະອຽດ - ຄຳເຫັນ ບັນທຶກແລ້ວ! - ທ່ານຕ້ອງການກວດສອບຄຸນນະພາບຂໍ້ມູນນີ້ບໍ\? - ທຸກຢ່າງຮຽບຮ້ອຍດີ - ທ່ານຕ້ອງການເຮັດຊຸດຂໍ້ມູນໃຫ້ຄົບຖ້ວນບໍ\? - ເຮັດໃຫ້ສຳເລັດແລ້ວ - ຊື່ - Formula - ແນວໃດກໍ່ສຳເລັດຂໍ້ມູນ ບໍ່ຄົບຖ້ວນ%s%sຈາກ%s%s ສະຖານະຂອງເຫດການ - ວັນທີ່ລົງທະບຽນ ບໍ່ມີຂໍ້ມູນ. ກົດ \"+\" ເພື່ອເພີ່ມບັນທຶກໃຫມ່ ບໍ່ມີຂໍ້ມູນ. ທ່ານບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ເພີ່ມໃຫມ່. ບໍ່ມີຄໍາອະທິບາຍຫຼືຄໍາແນະນໍາໃຫ້ ຂໍ້ມູນທີ່ຕ້ອງທົບທວນ - ບັນ​ທຶກ​ແລະ​ສໍາ​ເລັດ​! ມີການລົງທະບຽນທີ່ໃຊ້ງານຢູ່ແລ້ວ ເປີດ ສຳເລັດແລ້ວ ຍົກເລີກແລ້ວ - ຂໍ້ມູນ ບໍ່ສາມາດດາວໂຫຼດສິ່ງທີ່ເລືອກໄດ້%s - ສຳເລັດໂດຍ %s:%s - ອັບເດດແລ້ວ: %s - ສຳເລັດ - ພວກເຮົາບໍ່ສາມາດກວດສອບຄຸນນະພາບຂໍ້ມູນໄດ້. ຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ - ທ່ານ​ແນ່​ໃຈ​ບໍ່? - ທ່ານຕ້ອງການເປີດຊຸດຂໍ້ມູນຄືນໃໝ່ບໍ? ວັນທີ່ - ວັນທີເຫດການ - %sບໍ່ມີຄຸນສົມບັດສາທາລະນະ. ກະລຸນາເລືອກສາຍງານ ນະໂຍບາຍຄວາມເປັນສ່ວນຕົວ ກົດບ່ອນນີ້ເພື່ອກວດສອບນະໂຍບາຍຄວາມເປັນສ່ວນຕົວຂອງພວກເຮົາ - ປະສານງານບໍ່ຖືກຕ້ອງ - ທ່ານບໍ່ສາມາດລົງທະບຽນ TEIs ຈາກຫນ່ວຍການຈັດຕັ້ງອື່ນໃນສາຍງານນີ້ໄດ້ເນື່ອງຈາກມີການປ້ອງກັນ.\nຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ. ຊ່ອງປ້ອນຂໍ້ມູນນີ້ແມ່ນຈໍາເປັນຕ້ອງປ້ອນຂໍ້ມູນໃສ່ ເຫດຜົນດ້ານຄວາມປອດໄພ, ແອັບເວີຊັ່ນນີ້ບໍ່ອະນຸຍາດໃຫ້ໃຊ້ກັບ adb. ກະລຸນາໃຊ້ເວີຊັ່ນທີ່ໃຊ້ສະເພາະການຝຶກອົບຮົມ. ກັບຄືນ - ປິດແອັບ - ລາຍ​ລະ​ອຽດ​ເພີ່ມ​ເຕີມ - ລາຍ​ລະ​ອຽດ​ເພີ່ມ​ເຕີມ - ປິດ ສຳເນົາໄປຫາ ຄິບບອດ - ຂໍ້​ມູນ​ຜິດ​ພາດ​ ພວກເຮົາພົບເຫັນຂໍ້ຜິດພາດໃນເວລາຊິ້ງກັບເຄື່ອງຄອມພິວເຕິ້ໜ່ວຍແມ່ຂອງທ່ານ. ແບ່ງປັນຂໍ້ຜິດພາດກັບຜູ້ດູແລລະບົບຂອງທ່ານຖ້າເປັນໄປໄດ້. ເຫດການທີ່ວາງແຜນໄວ້ຈະບໍ່ຖືກກຳນົດເວລາໃໝ່ ແຜນວາດຂໍ້ມູນ @@ -741,45 +435,26 @@ ຜົນຕອບຮັບ ຕົວຊີ້ວັດ ການ​ອະ​ນຸ​ຍາດ​ໃຊ້ກ້ອງ​ຖ່າຍ​ຮູບ​ຖືກ​ປະ​ຕິ​ເສດ. ທ່ານ​​ຕ້ອງ​ເປີດ​ໃຊ້​ງານເພື່ອ​ໃຊ້​ຄຸນ​ສົມ​ບັດ​ນີ້​. - Value ແຜນວາດ ແລະ ຕົວຊີ້ວັດ ຖ່າຍຮູບ - ເລືອກຈາກຄັງຮູບ - ສຳເລັດແລ້ວ! ໂປຣແກຣມນີ້ໄດ້ຮັບການຄຸ້ມຄອງ ອະທິບາຍເຫດຜົນຢູ່ບ່ອນນີ້ - ກຳລັງກວດສອບຄວາມຖືກຕ້ອງ - ທີ່ຢູ່ຂອງເຄື່ອງຄອມພິວເຕິ້ໜ່ວຍແມ່ທີ່ໃສ່ ບໍ່ແມ່ນຕົວຢ່າງຂອງ dhis - ຄວາມຜິດພາດຈາກຢັ້ງຢືນເອກະລັກບຸກຄົນ - ບໍ່ຮູ້ເຄື່ອງຄອມພິວເຕິ້ໜ່ວຍແມ່ - ຄ່າຕ້ອງເປັນຈຳນວນຖ້ວນ ໄລຍະເວລາການສື່ສານໄດ້ສິ້ນສຸດລົງແລ້ວ ເຊດຊັນປັດຈຸບັນຂອງທ່ານໝົດອາຍຸແລ້ວ. ດ້ວຍເຫດຜົນດ້ານຄວາມປອດໄພ, ທ່ານຈະຕ້ອງໃຫ້ຂໍ້ມູນປະຈໍາຕົວຂອງທ່ານອີກເທື່ອຫນຶ່ງ - ຄ່າ ອາທິດ%d%sຫາ%s ບໍ່ຕ້ອງສະແດງອີກ ການຕັ້ງຄ່າຄຸນສົມບັດ ສະແດງເປັນ Radar - ບໍ່ສາມາດກຳນົດປະເພດການປະສານງານໄດ້ ຕິດຕາມ%s - %sບໍ່ສາມາດວິເຄາະເປັນວັນທີໄດ້ ບໍ່ສາມາດອັບເດດຫ້ອງປ້ອນຂໍ້ມູນນີ້ໄດ້. ກະລຸນາລອງໃໝ່ອີກຄັ້ງ - ສີ່ງທີ່ມີ ຂໍ້ມູນນີ້ບໍ່ສາມາດແກ້ໄຂໄດ້ເນື່ອງຈາກຖືກໝາຍວ່າສຳເລັດແລ້ວ ຂໍ້ມູນນີ້ບໍ່ສາມາດແກ້ໄຂໄດ້ເນື່ອງຈາກເວລາຂອງມັນໝົດອາຍຸແລ້ວ ທ່ານບໍ່ໄດ້ຮັບອານຸຍາດໃນການແກ້ໄຂຂໍ້ມູນນີ້ ຂໍ້ມູນນີ້ບໍ່ສາມາດແກ້ໄຂໄດ້ເນື່ອງຈາກຫົວຫນ່ວຍການຈັດຕັ້ງຖືກປິດໃວ້ຢູ່ ທ່ານບໍ່ໄດ້ຮັບອານຸຍາດໃນການແກ້ໄຂຂໍ້ມູນນີ້ ທ່ານບໍ່ສາມາດແກ້ໄຂຂໍ້ມູນຈາກຫົວຫນ່ວຍການຈັດຕັ້ງນີ້ໄດ້ - ລີເຊັດການຄົ້ນຫາ ການຄົ້ນຫາອອນໄລນ໌ສົ່ງຂໍ້ຄວາມຕໍ່ໄປນີ້: - ຂໍ້ຄວນລະວັງກົດຂອງສາຍງານ - ມີບັນຫາການກຳນົດຄ່າທີ່ເຮັດໃຫ້ເກີດມີຊ່ອງຫວ່າງໃນກົດລະບຽບ. ຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ. - ເລີ່ມໃໝ່ - ບໍ່ຮູ້ - ໂຫຼດຂໍ້ມູນທັງໝົດຄືນໃໝ່ ລົບບັນຊີ - ຈັດການບັນຊີ ການ​ແກ້​ໄຂ​ບັນ​ຫາ​ການ​ກຳນົດຄ່າ Language ແຕະບ່ອນນີ້ເພື່ອ ປ່ຽນພາສາຂອງແອັບພິເຄຊັ່ນ @@ -797,38 +472,22 @@ ບໍ່ມີຜົນລັບສຳລັບການຄົ້ນຫານີ້ ຜົນໄດ້ຮັບຫຼາຍເກີນໄປ ລອງປ່ຽນການຄົ້ນຫາຂອງທ່ານເພື່ອຈຳກັດຜົນລັບໃຫ້ແຄບລົງ. - ສ້າງໃໝ່ - ທ່ານຕ້ອງປ້ອນຢ່າງໜ້ອຍ %s ຂອງຄຸນລັກສະນະເຂົ້າເພື່ອຄົ້ນຫາ ຕົກລົງ ເລີ່ມການຄົ້ນຫາເພື່ອຊອກຫາອັນໃດນຶ່ງ%s ທ່ານສາມາດຄົ້ນຫາຫຼືສ້າງໃຫມ່%s ທ່ານມີບາງຂໍ້ຄວາມເຕືອນ.\nທ່ານຕ້ອງການໝາຍແບບຟອມນີ້ວ່າສຳເລັດແລ້ວຫຼືບໍ? ທ່ານຕ້ອງການໝາຍແບບຟອມນີ້ວ່າສຳເລັດແລ້ວຫຼືບໍ? ທ່ານມີຂໍ້ຜິດພາດໃນບາງຂໍ້ຄວາມ.\nທ່ານຕ້ອງການກວດເບິ່ງຄືນບໍ? - ຖ້າທ່ານອອກດຽວນີ້, ການປ່ຽນແປງຈະຖືກຍົກເລີກ. ເປີດຄືນໃໝ່ ບັນຊີຖືກປິດ ບັນຊີຂອງທ່ານຖືກປິດການນຳໃຊ້ໂດຍຜູ້ຮັກສາລະບົບ. ວັນທີປະຈຸບັນນີ້: %s ອຸປະກອນ: %s Os ລຸ້ນ: %s - ເປິດ %s ລາຍລະອຽດ - %s ລາຍລະອຽດ ກຳລັງອັບເດດຂໍ້ມູນໃຫ້ຄືກັນ %s... - ຂໍ້ຄວາມໄດ້ສົ່ງແລ້ວ. ກຳລັງລໍຖ້າໃຫ້ເຄື່ອງຄອມພິວເຕີໜ່ວຍແມ່ຕອບກັບ. - ສົ່ງຂໍ້ຄວາມແລ້ວ. ກຳລັງອັບເດດສະຖານະ. - ບໍ່ໄດ້ສົ່ງຂໍ້ຄວາມ ສົ່ງຂໍ້ຄວາມກັບ ທ່ານໄດ້ສົ່ງຂໍ້ຄວາມແລ້ວບໍ? - ກຳລັງລໍຖ້າການຢຶນຢັນຄູ່ມື - ອັບເດດເຫດການໃຫ້ຄືກັນ - ອັບເດດຫົວໜ່ວຍທີ່ຕິດຕາມໃຫ້ຄືກັນ - ອັບເດດຊຸດຂໍ້ມູນໃຫ້ຄືກັນ - ອັບເດດຂໍ້ມູນໃຫ້ຄືກັນສຳເລັດແລ້ວ - ການ​ອັບເດດຂໍ້ຄວາມໃຫ້ຄືກັນ ແມ່ນ​ມີ​ຢູ່​ແຕ່​ມີ​ການ​ເຂົ້າ​ເຖິງ​ສໍາ​ລັບ​ການ​ບັນ​ທຶກ​ຂອງ​ແຕ່​ລະ​ລາຍການ ກຳລັງດາວໂຫຼດຮູບພາບ... - ລາຍລະອຽດຂອງສາຍງານ - ລະຫັດຜ່ານຜິດພາດ ຈຳເປັນຕ້ອງອັບເດດຂໍ້ມູນໃຫ້ຄືກັນ ມີຂໍ້ຜິດພາດໃນການອັບເດດຂໍ້ມູນໃຫ້ຄືກັນ ອັບເດດຂໍ້ມູນໃຫ້ຄືກັນແລ້ວ @@ -843,9 +502,6 @@ ສົ່ງ Refresh ບໍ່​ແມ່ນ​ຕອນ​ນີ້ - - %s ຂໍ້ຜິດພາດ - ອັບເດດຊັອບແວ ດາວໂຫຼດດຽວນີ້ ກວດສອບເພື່ອປັບປຸງ @@ -866,7 +522,6 @@ ປ້ອນ%1$s ຂັ້ນຂອງສາຍງານ ເຫດການ - ​ຢ່າງ​ຕ່ຳ ມີ​ ທັງ​ໝົດ 8 ຄຳ ໃນ​ນັ້ນ​ຕ້ອງ​ມີ​ໂຕ​ໃຫ​ຍ່ 1 ໂຕ ແລະ ໂຕ​ເລກ 1 ໂຕ ສະແດງໃຫ້ເຫັນຫຼາຍຂຶ້ນ ສະແດງໃຫ້ເຫັນໜ້ອຍລົງ ອັບເດດຂໍ້ມູນໃຫ້ຄືກັນ @@ -874,4 +529,12 @@ ສະແດງຄຳອະທິບາຍ ເຊື່ອງຄຳອະທິບາຍ ໂອນ - + + + %s ຂໍ້ຜິດພາດ + + + + ມີ%s ສາຍງານທີ່ມີການຕັ້ງຄ່າສະເພາະ + + diff --git a/app/src/main/res/values-my/strings.xml b/app/src/main/res/values-my/strings.xml index 8b5fedc6759..cf0fe956d54 100644 --- a/app/src/main/res/values-my/strings.xml +++ b/app/src/main/res/values-my/strings.xml @@ -2,14 +2,8 @@ အမှား Events - ပြီးဆုံးသည် - အသစ်ထည့်ခြင်း - ထပ်ထည့်သည် - အသစ်ချိန်းဆိုခြင်း ညွှန်းပို့ခြင်း - အသုံးပြုသူအမည် - လျှို့ဝှက်နံပါတ် ပြန်လည်အသုံးပြုနိုင်ရန်သိမ်းဆည်းခြင်း နေ့စဉ် @@ -19,28 +13,21 @@ ရက်စွဲ ကိုရွေးချယ်ပါ Open ဖတ်ရန်အတွက်သာ - ပြီးဆုံးသည် လုပ်ဆောင်နိုင်သည် အမှား - ဖန်တီးသည် ‌နောက်ဆုံးသတင်းကိုရစေခြင်း - ရက်စွဲ ဖွဲ့စည်းပုံယူနစ် - category option အစီရင်ခံစာကာလအပိုင်းအခြား Дата выполнения - နေ့/လ/နှစ် ပယ်ဖျက်သည် ဖျက်ဆီးသည် - အသေးစိတ်ကြည့်ရန် တည်းဖြတ်သည် - အချက်အလက်မရှိပါ။ ပင်မစာမျက်နှာ ထွက်ရန် ပယ်ဖျက်သည် @@ -48,60 +35,32 @@ အခြေအနေ - Дата зачисления - မှတ်စုအသစ်ရေးရန် - လများ - နှစ်များ Incident date - ရှင်းလင်းသည် အချိန်ကာလ ရှေ့သို့ - သိမ်းဆည်းသည် လက်ခံသည် Events အကြောင်းအရာ - အများဆုံး - လက်ရှိ - သတိ - အမှား သိမ်းဆည်းသည် ပင်မစာမျက်နှာ အကူအညီ data တန်ဖိုးများ အကျဥ်း - အညွှန်းများ - မှတ်စု - အသေးစိတ်များ - အညွှန်းများ - မှတ်စု - မှတ်သားမည် ‌ကျေးဇူးပြု၍စောင့်ပါ သတိ ပိတ်သည် - ပြည့်စုံသည်။ - Open - နေ့စဉ် - အပတ်စဉ် အချိန်ကာလ - အခြေအနေ Last week ယခင်လ အခြား Open ပြန်သွားပါ စီမံချက် - အသေးစိတ်များ - အမည် - Дата зачисления Open ပြည့်စုံသည်။ - အချက်အလက် - Done - သေချာပါသလား။ ရက်စွဲ ပြန်သွားပါ - ပိတ်သည် ဂရပ် ပုံစံများ Programs ဂရပ် ပုံစံများ @@ -113,11 +72,6 @@ ယခင်နှစ် အကြောင်းပြန်ကြားချက် အညွှန်းများ - တန်ဖိုး - တန်ဖိုးသည် ကိန်းဂဏန်းသာ ဖြစ်ရမည်။ - ရနိုင်သည် - မသိပါ ပို့သည် Programs - မဖြစ်မနေလုပ်ရန်မလိုပါ။ diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 608ab50834e..1ceefaee86c 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -1,56 +1,24 @@ Dhis2 - dhis - 2 Feil - - Feil - Feil - - Feil server URL - Feil opplysninger - Uventet feil - Intern serverfeil - ingen verdi Det er ingen flere reserverte verdier. Kontakt din systemadministrator - Det er ingen flere reserverte verdier. Koble til nettverket for å fylle på dem - feil Noe gikk galt - Synkroniser nå - Synkroniserer med server - Synkroniserer nå - Metadata Hendelser - Sporede enheter - - Fullført - Synkronisering fullført Synkroniseringsfeil En feil har oppstått under synkronisering. Vennligst prøv på nytt - %sresultater funnet - Legg til ny - Legg til - Planlegg ny Henvisning - Server URL - Brukernavn - Passord - Logg inn - Lås opp sesjonen Synkroniserer konfigurasjonen din Dataene dine vil snart bli synkronisert Synkroniserer dataene dine Din konfigurasjon er klar Dine data er klare - Synkronisering av konfigurasjonen mislyktes - Synkronisering av data mislyktes Kontogjenoppretting Daglig @@ -68,129 +36,76 @@ Legg inn tekst Legg inn lang tekst Legg inn nummer - Legg inn tall Legg inn et negativt tall Legg inn et positivt tall eller null Legg inn positivt tall - Filteralternativ Velg dato - Endre kalender - Programmet er fullført - Programmet er inaktivt Åpne Hendelse fullført Skrivebeskyttet - Gjør ferdig og fullfør Fullført Kansellert - Aktiver Aktiv Synk Å sende Å oppdatere - Å slette Feil - SYNK - SEND - SYNK SMS - Ferdigstilling - Opprett Oppdater - Dato Org enhet Det er ingen åpne organisasjonsenheter for den valgte datoen. Vennligst velg en annen dato eller organisasjonsenhet. - Kategorivalg Breddegrad Lengdegrad - Ny hendelse - En gang - Permanent Rapportperiode - Kat alternativ - Hvis du setter en verdi, så trenger hele raden alle verdier for å fullføre datasettet. - Noen verdier som er påkrevd mangler. Du må sette obligatoriske verdier for å fullføre datasettet. - Det mangler obligatoriske felt. Vennligst fyll dem for å fullføre datasettet. - Verdien er lagret! - Det er ingen tilgjengelige perioder å velge. Forfallsdato Kat kombo - DD/MM/ÅÅÅÅ Avbryt Slett - Totalt Siste hendelsesdato Ingen alternativer er tilgjengelige Aktive programmer - Programmer å registrere Registrere - Siste besøk: - Bruk - Se detaljer - VIS MER Rediger - Oppfølging - Oppfølging er aktivert - Oppfølging er deaktivert Deaktiver Dette programmet tillater ikke flere hendelser - Ingen data hendelser Hjem - App Info Logg ut - Blokker sesjon - 1 minutt - 15 minutt 30 minutt 1 time 6t 1 dag (Standard) 12t - Synkroniser data automatisk hver: Manuelt - Synkroniser konfigurasjon automatisk hver: 1 uke - Gjeldende synkroniseringsparametre - Tilbakestill til standard Databasen vil bli slettet. Du vil bli spurt om å logge inn igjen. Aksepter Avbryt SYNK data nå SYNK konfigurasjon nå Innstillinger - Siste synk på: %s - Siste synk på: %s Fyll på - SMS modul: SMS inngangsport SMS resultat sender - sekunder - nummer - nummer Aktiver innsending av SMS Vent på SMS resultatsvar - - Det er %s program med spesifikke innstillinger - Det er %s programmer med spesifikke innstillinger - Begrensede innstillinger Globalt etter program @@ -208,15 +123,11 @@ Denne loggen inneholder alle feil som er forårsaket av synkronisering av data og metadata. Slett lokaldata Alle Capture APP data er lagret i din enhet og vil bli slettet. Data som ikke er synkronisert til server vil bli borte. - Resett app data & konfigurasjon - Din konfigurasjon og App data lagret på enheten vil bli slettet. Du vil bli bedt om å logge inn på nytt, og data som ikke er synkronisert til serveren vil bli borte. SMS innstillinger Sjekk og rediger parametre relatert til SMS inngangsport Status - Registreringsdato - Søk @@ -225,42 +136,19 @@ Skriv nytt notat tøm Legg til notat - Reverser - Aktivert - Obligatoriske felter mangler - Noen obligatoriske felt mangler. Hvis du vil gå tilbake nå, all lagret informasjon vil bli slettet. - Noen obligatoriske felt mangler. Hvis du vil gå tilbake, vennligst fyll inn dem. Dine data er ikke lagret - Hvis du går tilbake nå, vil all informasjon som har blitt lagt inn bli slettet. - Slett og gå tilbake - Noen felt har feil:\n%s\nVennligst, sjekk dem. - Noen obligatoriske felter mangler. Du kan fullføre dataregistrering og gå ut, men hendelsen kan ikke fullføres. Koordinater for - Seksjonliste - %sspørsmål av %ser fullført - %sav %sfullført - Fullfør og lukk - Dager - Måneder - År - Uker Forekomstdato - lokale resultater - Tilkoblede resultater Tidligere programmer Du har ikke tilstrekkelig tillatelse for å utføre denne handlingen - Legg til som... - Fjern Periode - (%d) Org Enhet - Nivå %d Velkommen til dhis2 Her kan du se dine aktiviteter Du kan bruke et filter... @@ -269,16 +157,11 @@ Sjekk andre handlinger i hovedmenyen - Opprett en relasjon Neste Du må legge inn minst %dav attributtene for å foreta et søk - Du må legge inn minst en av attributtene for å foreta et søk - Det er mer enn%dresultater. Vennligst legg inn flere søkekriterier - Skriv inn søkekriterier Importer QR data - Lagre OK Identifikasjon Egenskaper @@ -290,33 +173,18 @@ ingen data Ugyldig QR kode Denne attributten kan ikke legges til - Denne registreringen kan ikke legges til Om Programmer å registrere - velg alle - tøm valg - Det er ikke noe informasjon for de valgte filtre. Vennligst prøv å endre dem. Del Del QR - Søk etter type er ikke mulig for online søk.\nVennligst velg et program fra listen. - Max - Nåværende TEI TEIs - Begrens etter organisasjonsenhet - Begrens etter program - Programliste Resett app data & konfigurasjon - Det er ikke mulig å legge til relasjon Sjekk dette! - Advarsel - Feil Lagre Reserverte verdier - Vil du legge til mer data fra QR? - App versjon: %s SDK versjon: %s @@ -327,170 +195,58 @@ Utviklet og vedlikeholdt av DHIS2-prosjektet, del av Universitetet i Oslo, Institutt for informatikk. For mer informasjon eller spørsmål om denne applikasjonen, vennligst skriv tilandroid@dhis2.org - Passord mangler. Vennligst fyll det feltet - Brukernavn mangler. Vennligst fyll inn det feltet. - Denne serveren kjører en dhis versjon som er forskjellig fra 2.29. Oppdater din serverversjon eller bruk testmiljøet for å fortsette. - Denne serveren kjører en dhis versjon forskjellig fra %s. Oppdater serverversjonen din eller bruk testmiljøet for å fortsette. - Noe gikk galt. Vennligst sjekk at server URL, brukernavn og passord er korrekt og prøv igjen. - Serveren kunne ikke fullføre denne forespørselen - Det har oppstått et problem ved pålogging til serveren. - Påloggingsfeil - Obligatoriske felter mangler - Uventet feil ved søking online - Feil under analyse av resultater - Søk online returnerte en feil - Noe gikk galt på serveren Velg et program for å aktivere registrering Du har ikke tilstrekkelig tillatelse - Denne funksjonaliteten er ikke klar ennå. - Feil ved henting av relasjonsetikett Alle %s Dette er ikke et gyldig telefonnummer - Dette er ikke en gyldig e-post - Bare negative siffer er tillatt Bare positive siffer eller null er tillatt - Bare positive siffer er tillatt - Bare verdier fra 0 til 1 er tillatt - Bare verdier fra 0 til 100 er tillatt - Velg datoer for å filtrere Velg et alternativ - Problemer rapportert - Generer en ny hendelse - Vil du opprette en ny hendelse? Hendelser er fullført Alle hendelser i dette programmet er fullført. Vil du lukke programmet også? - Vil du fullføre registreringen også? Sjekk Hjem EKSEMPEL - Legg til moduler Vis hjelp - Synkroniser dine data... - ... din konfigurasjon... - ...sett hvor mange oppføringer som skal lastes ned fra server... - Sjekk og administrer hvor mange reserverte verdier som står igjen - Sjekk om tilkobling til serveren mislyktes - Frigjør diskplass - ...eller slett alt og start på nytt. - Finn dine forekomster både på din lokale enhet og på onlineserver. - Du kan bytte til andre programmer - Søk eller legg til nye forekomster. Du må søke før du kan legge til en ny! - Klikk her for å tømme feltene og starte et nytt søk. Dette er dashbord for forekomster Se forekomstprofil informasjon... - ....Del informasjon via QR eller SMS.... - ...Eller merk forekomsten for oppfølging - Klikk for å opprette eller planlegge en hendelse eller referer til en annen organisasjonsenhet. Her vil du se alle hendelser. Klikk for å se en hendelsedetalj. Naviger gjennom menyen for å legge til relasjoner, se indikatorer eller skrive notater. - Klikk for å se alle registreringer av din forekomst eller opprett en ny. - Klikk for å slette denne hendelsen. Denne handlingen kan ikke angres. - Fullfør hendelsen. - Alle hendelser relatert til dette programmet vil bli opplistet her. - Klikk for å legge til ny hendelse Fyll inn all data for å opprette hendelsen Klikk for å sjekke status for fullføring av hendelsen. - Klikk for å fullføre eller gjenåpne en hendelse - Les og lagre informasjon fra andre enheter via QR - Synkroniser dine data med serveren - Blokk sesjon med en 4 sifret kode. Ikke glem koden din! - Logg ut for å endre bruker på server. Du vil kunne logge inn igjen selv om det ikke er noen internettilkobling. - %s: relasjoner Det er ingen hendelser registrert, klikk \"+\" for å legge til en ny. - Det er ingen hendelser registrert. Dataverdier Info Kunne ikke lese denne ID-en Slett lokaldata Oversikt - Relasjoner - Indikatorer - Analyser Det er ingen indikatorer for dette programmet. - Notater - Kunne ikke fullføre - Noen felt har feil. Vennligst sjekk dem for å kunne fullføre Alle registreringer Vis dashbord med alle aktive programmer - Åpne synk feillogg Synk feillogg Del med... - Din konfigurasjons synk har mislyktes. Det kan være feil på serveren din. Klikk her for mer informasjon. - FORRIGE - NESTE - Detaljer - Indikatorer - Notater - - Fullfør senere - - Fullfør - Felt som inneholder feil - Noen felter inneholder feil. De har ikke blitt lagret. Vennligt, sjekk dem. Verdien skal være unik, et sammentreff ble funnet. Det har ikke blitt lagret. Vennligst sjekk det. - Et sammentreff i et unikt felt ble funnet. Vennligst sjekk skjema for å lagre registrering. Vennligst vent Hopp over - Planlegg på nytt Det er ingen informasjon for denne skjermen - Forfalt - Det er ingen programregel som ikke er støttet. Vennligst sjekk dokumentasjonen - Ingen info for dette feltet - Tomme opplysninger - For å kunne logge inn ved bruk av fingerskanner må du først logge inn på standard måte - Biometrisk sikkerhet - Tabeller - Tabell - https:// Ikke synkroniserte data vil bli bort. Vil du virkelig fortsette? - Aksepter Data kunne ikke slettes. Vennligst prøv på nytt. Lokal data ble slettet. - Minst en organisasjonsenhet må merkes - Send data - Hjelp DHIS2 å forbedre denne appen ved å dele feillogger assosiert med din bruker ID. - Sjekk felter - Du mistet internettilkoblingen mens du utførte din konfigurasjonssynk. Vennligst prøv igjen senere - Enig - Fortsett - Server URL - Angi DHIS 2 server URL for din organisasjons som er oppgitt av din systemadministrator.\n\nAlternativt, kan du skanne en QR kode som inneholder URL til din server - Har du glemt koden? - Hva vil du gjøre for denne hendelsen? - SLUTT %sikke funnet Oppføringen du prøver å gå inn på er ikke tilgjengelig. Vil du søke etter den? Synkronisert ved SMS Advarsel Relasjon - Det er ingen konflikter for dette programmet - Nettverkstilkobling er ikke tilgjengelig, men det ser ut som det er telefonservice - du kan bruke SMS. - Internettilkoblingen er ikke tilgjengelig Lukk Nå kan du sjekke synk informasjon ved å klikke her. - Denne dataen er lagret kun på din enhet, det er ikke synkronisert med serveren. - Du er oppdatert! Alle dataene dine er sendt til serveren. Du kan ikke relatere en oppføring med seg selv - Fjern blokkering på sesjonen - Fullfør - Åpne - Verditypen er ikke støttet Endre kalendervisning - 15 minutter - Hver time - Daglig - Ukentlig - Uke - Synkroniseringsinnstillinger: %s Oppføringen du prøver å gå inn på har ingen registrering. Du kan ikke gå til dashbord. Formateringsfeil Du har ikke autoritet til å slette denne oppføringen - Dette er ikke en gyldig URL Justerer fra... - Mottakernummer Aksepterer du å sende %dmeldinger? Sending %1$d/%2$d Bekreftelse av ventet mengde - %d @@ -508,51 +264,29 @@ Ingen inngangsport satt Bruker er ikke innlogget SMS modul er deaktivert - Enda en SMS-innsending pågår SMS-modul ikke startet, ikke funnet obligatoriske metadata - Fullført SMS-telling ikke akseptert SMS innsending er startet Data lest og konvertert. Innsendings ID: %d - Feil ved sending av SMS innsending SMS TEI registrering og registrering SMS hendelseinnsending SMS datasett innsending - Starter - Pågående - Sendt - Mislyktes - Starter synkronisering. Synkroniserer... - Synkroniseringen er fullført. - En feil har oppstått under synkronisering. - Det har skjedd en feil under synkroniseringen. Klikk her for å sjekke feillrapport - Avbrutt synkronisering. Kopiert - Bilde er valgt - Vis i kart - Vis liste - %ser obligatorisk men har ikke blitt oppgitt. - Polygon oppfanget Polygon - Fingeravtrykk - Vennligst, plasser fingeren din på fingeravtrykkleseren. Sikkerhet Av sikkerhetsgrunner, så er denne versjonen av appen ikke tillatt til å bli brukt i rotenheter. Vennligst bruk treningsversjon. - Det er noen feil. Vennligst fiks dem før du fortsetter. Filtere som brukes Ingen filter brukt Periode Org. Enhet - Sorterer - Status Synk Tildelt til meg I dag @@ -567,25 +301,18 @@ Fra - Til Annet Når som helst - Synkronisering mislyktes. Sjekk dataverdiene for å prøve å fikse problemet og prøv på nytt. Hvis det fortsatt mislykkes, kontakt din systemadministrator. - Denne data har blitt sent til serveren men det er ikke sikkert den har blitt lagret Åpne Planlegg Forfalt Besøkte Fullført Hoppet over - Hendelser: %sMax: %s%sGjeldende:%sTEI: %sMax:%s%sGjeldende%s - Begrensede innstillinger : %s\nEvents: %s/%sTEI: %s/%s - Skjul registreringsdata - Vis registreringsdata SMS modul er aktivert. SMS modul er deaktivert. Laster ned data for SMS modul. Vennligst vent SMS inngangsport kan ikke være tom Det er ingen registreringer å laste opp Denne konverteringsoppgaven er ikke støttet - Ikke vis igjen, lås skjerm Sett pin Konflikt Endre dato @@ -610,11 +337,7 @@ Velg organisasjonsenhet Legg inn URL Legg inn verdi - Velg bilde - Skann kode - Velg alternativ Reserverte verdier lastet ned per TEI attributt - Reserverte verdier lastet ned per TEI attributt %sreserverte verdier igjen Administrer reserverte verdier Hendelser å laste ned @@ -634,54 +357,26 @@ Ikke synkronisert Synkroniseringsfeil SMS synkronisert - Detaljer - Kommentarer Lagret! - Vil du sjekke datakvaliteten\? - Alt ser bra ut - Vil du også fullføre datasettet\? - Merk som fullført - Navn - Formel - Fullfør likevel Mangler %s%sfra %s%s Hendelsesstatus - Registreringsdato Det er ingen data. Klikk på \"+\" for å legge til en ny oppføring Det er ingen data. Du har ikke tillatelse til å legge til nye oppføringer. Ingen beskrivelse eller instruksjon gitt Data til gjennomgang - Lagret og fullført! Det er allerede en aktiv registrering Åpne Fullfør Kansellert - Data Den valgte %s kunne ikke lastes ned - Fullført av %s: %s - Oppdatert: %s - Fullfør - Vi kunne ikke sjekke datakvaliteten. Kontakt administratoren din - Er du sikker? - Vil du åpne datasettet på nytt? Dato - Hendelsesdato - %shar ingen offentlige attributter. Velg et program Personvernregler Klikk her for å sjekkepersonvernreglene våre - Koordinatverdiene er ikke gyldige - Du kan ikke registrere enheter fra andre organisasjonsenheter i dette programmet fordi det er beskyttet. Kontakt administratoren din. Dette feltet er obligatorisk Av sikkerhetsgrunner, så er denne versjonen av appen ikke tillatt til å bli brukt med adb. Vennligst bruk treningsversjonen. Gå tilbake - Lukk app - Flere detaljer - Flere detaljer - Lukk Kopier til utklippstavle - Kopiert til utklippstavle - Informasjon om feil Det er planlagte arrangementer som ikke vil bli planlagt på nytt Diagrammer Vis @@ -710,17 +405,9 @@ Siste regnskapsår Tilbakemelding Indikatorer - Verdi - Fullført! Dette programmet er beskyttet - Feil opplysninger - Verdien må være et heltall - Verdier - Tilgjengelig - Ukjent Språk For mange resultat - Opprett ny Ok Synkronisert Synkroniserer @@ -737,11 +424,15 @@ Programfase hendelse Tidslinje - Valgfri Vis mer Vis mindre Synk Vis beskrivelse Skjul beskrivelse Overfør - + + + Det er %s program med spesifikke innstillinger + Det er %s programmer med spesifikke innstillinger + + diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index 2eb92cf551b..76227ed09d9 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -1,5 +1,4 @@ - थप्नुहोस् दैनिक स्वीकार @@ -7,8 +6,6 @@ खोज खोल्नुहोस् - सिर्जना गर्नुहोस् - मिति रद्द गर्नुहोस् स्वीकार रद्द गर्नुहोस् @@ -16,11 +13,7 @@ खोज अबधि - स्वीकार - खोल्नुहोस् - दैनिक अबधि - स्थिती मलाई निर्दिष्ट गरिएको आज हिजो diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 7975fc4772d..c47e40f8106 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -1,61 +1,27 @@ Dhis2 - dhis - 2 Fout - - Fout - Fouten - - Verkeerde server-URL - Verkeerde inloggegevens - Onverwachte fout - Interne Server Fout - geen waarde Er zijn geen gereserveerde waarden meer. Neem contact op met uw systeembeheerder - Er zijn geen gereserveerde waarden meer. Maak verbinding met het netwerk om ze bij te vullen - fouten Er is iets fout gegaan - Synchroniseer nu - Synchroniseren met server - Nu synchroniseren - Metagegevens Gebeurtenissen - Getraceerde entiteiten - - Afgerond - Synchronisatie voltooid Synchronisatiefout Er is een fout opgetreden tijdens de synchronisatie. Probeer het opnieuw. De synchronisatie is voltooid, maar we hebben geen serverbevestiging ontvangen voor alle records. Die gegevens zijn nog steeds gemarkeerd als \"offline\" in de app. We raden aan om de synchronisatie opnieuw te proberen. - Er is een fout opgetreden en de server heeft niet gereageerd. Neem contact op met uw beheerder. - %s resultaten gevonden - Nieuw toevoegen - Toevoegen - Nieuw schema Verwijzing - Server-URL - Gebruikersnaam - Wachtwoord - Log in - Sessie ontgrendelen Synchroniseer uw configuratie Uw gegevens worden binnenkort gesynchroniseerd synchroniseer uw gegevens Uw configuratie is klaar Uw gegevens zijn klaar - Configuratiesynchronisatie mislukt - Gegevenssynchronisatie mislukt Accountherstel - Er is een netwerkverbinding nodig om uw account te herstellen. Dagelijks @@ -73,128 +39,75 @@ Tekst invoeren Voer lange tekst in Voer nummer in - Voer een geheel getal in Voer een negatief geheel getal in Voer een positief geheel getal of nul in Voer een positief geheel getal in - Filter opties Kies datum - Kalender wijzigen - Programma voltooid - Programma inactief Open Evenement voltooid Alleen lezen - Afwerken en voltooi Voltooid Geannuleerd - Activeren Actief Synchroniseren Versturen Updaten - Verwijderen Fout - SYNCHRONISEREN - VERSTUREN - SYNCHRONISEERDE SMS - Voltooiing - Creëren Bijwerken - Datum Organisatieëenheid Er zijn geen open organisatie-eenheden voor de geselecteerde datum. Selecteer een andere datum of een andere organisatie-eenheid. - Categorie optie Breedtegraad Lengtegraad - Nieuw evenement - Een keer - permanent Verslagperiode - Optie computer ondersteund vertalen - Als u een waarde instelt, heeft de hele rij alle waarden nodig om de gegevensset te voltooien. - Sommige vereiste waarden ontbreken. U moet verplichte waarden instellen om de gegevensset te voltooien. - Er ontbreken verplichte velden. Gelieve deze in te vullen om de dataset compleet te maken. - Waarde is opgeslagen! - Er zijn geen beschikbare periodes om te selecteren. Deadline Katten combinatie - DD/MM/JJJJ Annuleren Verwijder - Totaal Datum meest recente evenement Actieve programma\'s - Programma\'s om in te schrijven Inschrijven - Laatste bezoek: - toepassen - Zie de details - BEKIJK MEER Bewerk - Volg op - Vervolg ingeschakeld - Opvolging uitgeschakeld Deactiveren Dit programma staat niet meer evenementen toe - Geen gegevens evenementen Thuis - App informatie Uitloggen - Sessie blokkeren - 1 minuut - 15 minuten 30 minuten 1 uur 6 uur 1 dag (standaard) 12 uur - Automatische synchronisatiegegevens elke: Handmatig - Automatische synchronisatieconfiguratie elke: 1 week - Huidige synchronisatieparameters: - Resetten naar standaard Database wordt verwijderd.\nU wordt gevraagd opnieuw in te loggen. Aanvaarden Annuleren SYNCHRONISATIE gegevens nu SYNCHRONISATIE-configuratie nu Instellingen - Laatste synchronisatie op: %s - Laatste synchronisatie op: %s Bijvullen - SMS-module: SMS-poort SMS resultaat afzender Time-out sms-resultaat (sec) - seconden - nummer - nummer Sms-verzending inschakelen Wacht op de reactie van het sms-resultaat - - Er is een %s-programma met specifieke instellingen - Er zijn %s-programma\'s met specifieke instellingen - Instellingen beperkt Wereldwijd per programma @@ -212,18 +125,13 @@ Dit logboek bevat alle fouten die zijn veroorzaakt door het synchroniseren van uw gegevens en metagegevens. Verwijder lokale gegevens Alle Capture App-gegevens die op uw apparaat zijn opgeslagen, worden verwijderd. Gegevens die niet met de server zijn gesynchroniseerd, gaan verloren. - Reset app-gegevens &-configuratie - Uw configuratie en app-gegevens die op het apparaat zijn opgeslagen, worden verwijderd. U wordt gevraagd om opnieuw in te loggen en gegevens die niet met de server zijn gesynchroniseerd, gaan verloren. SMS-instellingen Controleer en bewerk parameters met betrekking tot de sms-gateway Software-update - Software Twee-factor-authenticatie status - Inschrijvingsdatum - Zoek @@ -232,43 +140,19 @@ Schrijf een nieuwe notitie Verwijder Notitie toevoegen - Terugdraaien - Geactiveerd - Verplichte velden ontbreken - Sommige verplichte velden ontbreken. Als u nu terug wilt gaan, wordt alle opgeslagen informatie verwijderd. - Sommige verplichte velden ontbreken. Als je terug wilt gaan, vul ze dan in. - Sommige velden hebben uw aandacht nodig.\Wilt u het formulier bekijken? Uw gegevens worden niet bewaard - Als u nu teruggaat, wordt alle ingevoerde informatie verwijderd. - Verwijderen en teruggaan - Sommige velden bevatten fouten:\n%s\nControleer ze alsjeblieft. - Sommige verplichte velden ontbreken. U kunt het invoeren en afsluiten van gegevens voltooien, maar de gebeurtenis kan niet worden voltooid. Coördinaten voor de - Sectie lijst - %s vragen van %s voltooid - %s van %s voltooid - Voltooien en afsluiten - Dagen - Maanden - Jaren - Weken Incident datum - Lokale resultaten - Online resultaten Eerdere programma\'s U heeft niet de vereiste rechten om deze actie uit te voeren - Toevoegen als… - Verwijder Periode - (%d) Organisatie-eenheid - Niveau %d Welkom bij dhis2 Hier kunt u uw activiteiten zien U kunt een filter toepassen... @@ -277,16 +161,11 @@ Controleer andere acties in het hoofdmenu - Relatie creëren Volgende U moet minimaal %d van de attributen invoeren om een zoekopdracht uit te voeren - U moet ten minste één van de kenmerken invoeren om een zoekopdracht uit te voeren - Er zijn meer dan %d resultaten. Vul a.u.b. verdere zoekcriteria in - Voer uw zoekcriteria in QR-gegevens importeren - Sla op OK Identificatie attributen @@ -298,33 +177,18 @@ geen gegevens Ongeldige QR-code Dit kenmerk kan niet worden toegevoegd - Deze inschrijving kan niet worden toegevoegd Over Programma\'s om in te schrijven - selecteer alles - Verwijder selectie - Er is geen informatie voor de geselecteerde filters. Probeer ze te veranderen. Deel QR delen - Zoeken op type is niet mogelijk voor online zoeken.\nSelecteer een programma uit de lijst. - Max - Huidig TEI TEI\'s - Beperken per organisatie-eenheid - Beperk per programma - Programma lijst Reset app-gegevens &-configuratie - Het is niet mogelijk om deze relatie toe te voegen Check dit! - Waarschuwing - Fout Sla op Gereserveerde waarden - Wilt u meer gegevens uit QR toevoegen? - App-versie: %s SDK-versie: %s @@ -335,145 +199,44 @@ Ontwikkeld en onderhouden door het DHIS2 -project, onderdeel van de Universiteit van Oslo, afdeling informatica . Voor meer informatie of vragen over deze toepassing kunt u schrijven naar android@dhis2.org - Wachtwoord ontbreekt. Vul dit veld in. - Gebruikersnaam ontbreekt. Vul dit veld in. - Deze server draait een andere versie dan 2.29. Werk uw serverversie bij of gebruik de testomgeving om verder te gaan. - Deze server draait een andere versie dan %s. Werk uw serverversie bij of gebruik de testomgeving om verder te gaan. - Er is iets fout gegaan. Controleer of de server-URL, gebruikersnaam en wachtwoord correct zijn en probeer het opnieuw. - De server kan dit verzoek niet voltooien. - Er is een probleem opgetreden bij het inloggen op de server. - Login fout - Verplichte velden ontbreken - Onverwachte fout tijdens online zoeken - Fout bij het parseren van resultaten - Online zoeken leverde een fout op - Er is iets misgegaan in de server Selecteer een programma om inschrijven mogelijk te maken U heeft niet de vereiste toestemming - Deze functionaliteit is nog niet gereed. - Fout bij ophalen relatielabel Alle %s dit is geen geldig telefoonnummer - Dit is geen geldig e-mailadres - Alleen negatieve getallen zijn toegestaan Alleen positieve getallen of nul toegestaan - Alleen positieve getallen zijn toegestaan - Alleen waarden van 0 tot 1 zijn toegestaan - Alleen waarden van 0 tot 100 zijn toegestaan - Selecteer datums om te filteren Selecteer optie - Probleem gemeld - Nieuw evenement genereren - Wil je nog een evenement aanmaken? Evenementen voltooid Alle evenementen in dit programma zijn voltooid. Wilt u het programma ook afsluiten? - Wil je de inschrijving ook afronden? Controleer Thuis VOORBEELD - Widget toevoegen Hulp laten zien - Synchroniseer uw gegevens... - ...uw configuratie... - ...stel in hoeveel records van de server moeten worden gedownload... - Controleer en beheer hoeveel gereserveerde waarden er nog over zijn - Controleer of een verbinding met de server is mislukt - Maak wat schijfruimte vrij - …of verwijder alles om opnieuw te beginnen. - Vind uw entiteiten zowel op uw lokale apparaat als op de online server. - U kunt overschakelen naar andere programma\'s - Zoek of voeg nieuwe entiteiten toe. U moet zoeken voordat u een nieuwe kunt toevoegen! - Klik hier om de velden op te schonen en de zoekopdracht opnieuw te starten. Dit is het entiteitsdashboard Profielgegevens van entiteiten bekijken... - …Deel informatie via QR of SMS… - …Of markeer de entiteit voor opvolging - Klik om een evenement te maken of te plannen of om naar een andere organisatie-eenheid te verwijzen. Hier zie je alle evenementen. Klik om een gebeurtenisdetail te zien. Navigeer door het menu om relaties toe te voegen, indicatoren te zien of notities te schrijven. - Klik om alle inschrijvingen van uw entiteit te zien of maak een nieuwe aan. - Klik om dit evenement te verwijderen. Deze actie kan niet ongedaan gemaakt worden. - Voltooi het evenement. - Alle evenementen gerelateerd aan dit programma worden hier vermeld. - Klik om een nieuw evenement toe te voegen Voer alle gegevens in om het evenement aan te maken Klik om de voltooiingsstatus van het evenement te controleren. - Klik om een evenement te voltooien of opnieuw te openen - Lees en bewaar informatie van andere apparaten via QR - Synchroniseer uw gegevens met de server - Blokkeer sessie met een 4-cijferige code. Vergeet je code niet! - Log uit om gebruiker of server te wijzigen. U kunt opnieuw inloggen, ook als er geen internetverbinding is. - %s: relaties Er zijn geen evenementen geregistreerd, klik op \"+\" om een nieuwe toe te voegen. - Er zijn geen evenementen geregistreerd. Gegevens waarden Info Kan dit ID niet lezen Verwijder lokale gegevens Overzicht - Relaties - Indicatoren - Analyse Er zijn geen indicatoren voor dit programma. - Notities - Kan niet voltooien - Kan niet opslaan - Er staan waarschuwingen in het formulier - Wat wil je doen? - Sommige velden bevatten fouten. Controleer ze alstublieft om ze te kunnen voltooien Alle inschrijvingen Toon dashboard met alle actieve programma\'s - Open logboek met synchronisatiefouten Fout logboek synchroniseren Delen met... - Uw configuratiesynchronisatie is mislukt. Er kunnen fouten in uw server zitten. Klik hier voor meer informatie. - VORIGE - VOLGENDE - Details - Indicatoren - Notities - - Voltooi later - - Finish - Velden met fouten - Sommige velden bevatten fouten. Ze zijn niet opgeslagen. Controleer ze alsjeblieft. De waarde moet uniek zijn, er is een toeval gevonden. Het is niet opgeslagen. Controleer het alstublieft. - Er is een toeval gevonden in een uniek veld. Controleer het formulier om de inschrijving op te slaan. Even geduld alstublieft Overslaan - Opnieuw plannen Er is geen informatie voor dit scherm - Verlopen - Er is één programmaregel die niet wordt ondersteund. Controleer de documentatie - Geen info voor dit veld - Lege inloggegevens - Om in te kunnen loggen met de vingerafdrukscanner moet je eerst de standaardmanier gebruiken - Biometrische beveiliging - Tafels - Tafel - https:// Niet-gesynchroniseerde gegevens gaan verloren. Wil je echt doorgaan? - Aanvaarden Gegevens konden niet worden verwijderd. Probeer het opnieuw. Verwijderen van lokale gegevens is voltooid. - Er moet ten minste één organisatie-eenheid worden geselecteerd - Verstuur data - Help DHIS2 deze app te verbeteren door foutenlogboeken te delen die zijn gekoppeld aan uw gebruikers-ID. - Wil je ons helpen deze app te verbeteren? - Als u ja zegt, stuurt de app anonieme statistieken en foutlogboeken die ons helpen de gebruikerservaring en prestaties te verbeteren.\n\nRaadpleeg ons privacybeleid voor meer informatie. - privacybeleid - Velden controleren - Je internetverbinding is verbroken tijdens het uitvoeren van je configuratiesynchronisatie. Probeer het later opnieuw - Mee eens zijn - Doorgaan - Server-URL - Voer de DHIS 2-server-URL voor uw organisatie in zoals verstrekt door uw systeembeheerder.\n\nU kunt ook een QR-code scannen met de URL van uw server - Ben je je code vergeten? - Wat zou je willen doen voor dit evenement? - EINDE %s niet gevonden Het record dat u probeert te openen, is niet beschikbaar. Wil je ernaar zoeken? Gesynchroniseerd via sms @@ -481,33 +244,16 @@ Uploaden Relatie Per sms verzonden - Er zijn geen conflicten voor dit programma - Netwerkverbinding is niet beschikbaar, maar het lijkt erop dat er telefoondiensten zijn - u kunt sms gebruiken. - Netwerkverbinding is niet beschikbaar. Sluit Nu kunt u de synchronisatie-informatie controleren door hier te klikken - Deze gegevens worden alleen op uw apparaat opgeslagen, ze worden niet met de server gesynchroniseerd. - Je bent up-to-date! Al uw gegevens worden naar de server gestuurd. U kunt een record niet met zichzelf in verband brengen - Sessie deblokkeren - Compleet - Open - Niet-ondersteund waardetype Agendaweergave wijzigen - 15 minuten - Elk uur - Dagelijks - Wekelijks - Week - Synchronisatie-instelling: %s Het record dat u probeert te openen heeft geen inschrijving. U heeft geen toegang tot het dashboard. Formatteringsfout Verwijder %s U bent niet bevoegd om dit record te verwijderen - Dit is geen geldige URL Formulier aanpassen… - Ontvanger nummer Accepteert u het verzenden van %d-berichten? Verzenden van %1$d/%2$d Bevestiging wachtend bedrag - %d @@ -525,51 +271,29 @@ Geen gateway ingesteld Gebruiker niet ingelogd SMS-module is uitgeschakeld - Er is nog een SMS-inzending aan de gang SMS-module niet gestart, vereiste metadata niet gevonden - Voltooid Aantal sms\'jes niet geaccepteerd Sms-verzending gestart Gegevens gelezen en geconverteerd. Inzendings-ID: %d - Fout bij verzenden van sms-inzending SMS TEI registratie en inschrijving Sms-gebeurtenis indienen Indiening van een sms-gegevensset - Beginnend - Bezig - Verstuurd - Mislukt - Synchronisatie starten. Synchroniseren... - Synchronisatie voltooid. - Er is een fout opgetreden tijdens de synchronisatie. - Er is een fout opgetreden tijdens de synchronisatie. Klik hier om foutlogboeken te controleren - Geannuleerde synchronisatie. Gekopieerd - Afbeelding geselecteerd - Toon op kaart - Toon lijst - %s is verplicht maar is niet verstrekt. - Polygoon vastgelegd Veelhoek - Vingerafdruk - Steek alstublieft uw vinger in uw vingerafdruklezer. Beveiliging Om veiligheidsredenen mag deze versie van de app niet worden gebruikt op geroote apparaten. Gebruik de trainingsversie. - Er zijn enkele fouten. Corrigeer ze alstublieft voordat u verder gaat. Filters van toepassing Geen filters toegepast Periode Org. Eenheid - Sorteren - status Synchroniseren Toegewezen aan mij Vandaag @@ -584,25 +308,18 @@ Van - naar Anders Altijd - Synchronisatie mislukt. Synchronisatie mislukt. Controleer de gegevenswaarden om te proberen het probleem op te lossen en probeer het opnieuw. Neem contact op met uw systeembeheerder als het blijft mislukken - Deze gegevens zijn naar de server verzonden, maar het is niet gegarandeerd dat ze zijn opgeslagen Open Schema Verlopen Bezocht Voltooid Overgeslaten - Evenementen:%smax:%s%shuidig:%s TEI:%smax:%s%shuidig:%s - Instellingen beperkt %s\nevenementen: %s/%s TEI: %s/%s - Inschrijvingsgegevens verbergen - Toon inschrijvingsgegevens SMS-module ingeschakeld SMS-module uitgeschakeld Gegevens downloaden voor SMS-module. Even geduld aub SMS-gateway mag niet leeg zijn Er zijn geen inschrijvingen om te uploaden Deze convertTask wordt niet ondersteund - Vergrendelscherm niet meer weergeven Speld instellen Conflict Verander de datum @@ -627,11 +344,7 @@ Kies organisatie-eenheid URL invoeren Voer waarde in - Kies afbeelding - Scancode - Kies optie Gereserveerde waarden gedownload per TEI-attribuut - Gereserveerde waarden gedownload per TEI-attribuut %s gereserveerde waarden over Beheer gereserveerde waarden Evenementen om te downloaden @@ -651,57 +364,28 @@ Niet gesynchroniseerd Synchronisatiefout SMS gesynchroniseerd - Details - Opmerkingen Opgeslagen! - Wilt u de datakwaliteit controleren\? - Alles ziet er goed uit! - Wil je ook de dataset compleet maken\? - Markeer als voltooid - Naam - Formule - In ieder geval compleet Ontbrekende %s %s van %s %s Gebeurtenisstatus - Inschrijvingsdatum Er zijn geen gegevens. Klik op \"+\" om een nieuw record toe te voegen Er zijn geen gegevens. U heeft geen rechten om nieuwe records toe te voegen. Geen beschrijving of instructie verstrekt Gegevens om te bekijken - Opgeslagen en voltooid! Er is al een actieve inschrijving Open Compleet Geannuleerd - Gegevens De geselecteerde %s kon niet worden gedownload. - Aangevuld door %s: %s - Bijgewerkt: %s - Klaar - We konden de gegevenskwaliteit niet controleren. Neem contact op met uw beheerder - Weet je het zeker? - Wilt u de dataset opnieuw openen? Datum - Evenement datum - %s heeft geen openbare attributen. Selecteer een programma Privacybeleid Klik hier om ons privacybeleid te bekijken - Coördinatenwaarden zijn niet geldig - U kunt TEI\'s van andere organisatie-eenheden niet inschrijven in dit programma omdat het beveiligd is.\nNeem contact op met uw beheerder. U kunt een %s van andere organisatie-eenheden niet inschrijven in dit programma omdat deze beveiligd is.\nNeem contact op met uw beheerder. Dit veld is verplicht Om veiligheidsredenen mag deze versie van de app niet worden gebruikt met adb. Gebruik de trainingsversie. Ga terug - App sluiten - Meer details - Meer details - Sluit Kopieer naar klembord - Gekopieerd naar het klembord - Fout informatie We hebben een fout gevonden bij het synchroniseren met uw server. Deel de fout indien mogelijk met uw systeembeheerder. - We kunnen de sessie met uw gebruiker niet starten Er zijn geplande evenementen die niet opnieuw worden gepland Grafieken Lijst @@ -749,47 +433,26 @@ Feedback Indicatoren Cameratoestemming is geweigerd.\Je moet deze inschakelen om deze functie te gebruiken. - Waarde Grafieken en indicatoren Neem foto - Kies uit gallerij - Klaar! Dit programma is beveiligd Omschrijf hier de reden - Verificatie - De opgegeven server-URL is geen dhis-instantie - Verkeerde inloggegevens - Onbekende server - Waarde moet een geheel getal zijn De sessie is verlopen Uw huidige sessie is verlopen. Om veiligheidsredenen moet u uw inloggegevens opnieuw opgeven - Waarden Week %d %s tot %s Niet meer laten zien Functieconfiguratie Weergeven als radar - Kan coördinaattype niet instellen Gevolgd %s - %s kan niet worden verwerkt als een datum Dit veld kan niet worden bijgewerkt. Probeer het opnieuw - Editie - Beschikbaar Deze gegevens kunnen niet worden bewerkt omdat ze als voltooid zijn gemarkeerd Deze gegevens kunnen niet worden bewerkt omdat de bewerkingstijd is verstreken U heeft geen toestemming om deze gegevens te bewerken Deze gegevens zijn niet bewerkbaar omdat de organisatie-eenheid gesloten is U heeft geen toestemming om deze gegevens te bewerken U kunt gegevens van deze organisatie-eenheid niet bewerken - Zoeken resetten De online zoekopdracht leverde het volgende bericht op: - Waarschuwing programmaregels - Er is een configuratieprobleem dat een lus in de regels veroorzaakt. Neem contact op met uw beheerder. - VERFRISSEN - Onbekend - Ververs alle gegevens - U heeft het maximale aantal accounts bereikt (%d). Om een nieuw account toe te voegen, logt u in en verwijdert u een van uw accounts Account verwijderen - Accounts beheren Problemen met configuratie oplossen Taal Tik hier om de taal van de applicatie te wijzigen @@ -808,8 +471,6 @@ Er zijn geen resultaten voor deze zoekopdracht Te veel resultaten Probeer uw zoekopdracht te wijzigen om de resultaten te verfijnen. - Maak nieuw - Het is noodzakelijk om minimaal %s attributen in te voeren om te zoeken OK Start een zoekopdracht om een %s U kunt zoeken of een nieuwe creëren %s @@ -817,7 +478,6 @@ Sommige velden bevatten fouten en worden niet opgeslagen. \nWilt u het formulier bekijken? Wilt u dit formulier als voltooid markeren? U heeft een aantal foutmeldingen.\nWilt u deze bekijken? - Als u nu afsluit, worden de wijzigingen verwijderd. heropend Account ongebruikelijk gemaakt Uw account is uitgeschakeld door een beheerder. @@ -827,27 +487,10 @@ Huidige datum: %s Apparaat: %s OS-versie: %s - Open %s-gegevens - %s gegevens %s synchroniseren... - SMS verzonden. Wachten op reactie van de server. - SMS bevestigd om de server te bereiken. Status bijwerken - We kunnen niet bevestigen dat de sms de server heeft bereikt. Status bijwerken - SMS verzonden. Status bijwerken. - Sms niet verzonden. - SMS-app openen. Wijzig het bericht alstublieft niet. Sms\'en met Heb je de sms gestuurd? - In afwachting van handmatige bevestiging - Evenementen synchroniseren - Bijgehouden entiteiten synchroniseren - Gegevenssets synchroniseren - Bronnen synchroniseren - Synchronisatie voltooid - SMS-synchronisatie is beschikbaar, maar moet voor elk afzonderlijk record worden geopend Afbeeldingen downloaden... - Programma beschrijving - Verkeerde speld Synchronisatie nodig Synchronisatiefout Gesynchroniseerd @@ -865,19 +508,10 @@ Vernieuwen Niet nu Tik hier om te verkennen - - %s-fout - %s fouten - - - %s waarschuwing - %s waarschuwingen - Software-update Later Download nu Controleer op updates - Controleren op updates Er zijn geen nieuwe updates Onbekende bronnen toestemming is geweigerd.\nU moet deze inschakelen om de versie te installeren. Opslagtoestemming is geweigerd.\nU moet deze inschakelen om de versie te installeren. @@ -902,4 +536,19 @@ %s synchroniseren... Laat beschrijving zien Beschrijving verbergen - + + + %s-fout + %s fouten + + + + %s waarschuwing + %s waarschuwingen + + + + Er is een %s-programma met specifieke instellingen + Er zijn %s-programma\'s met specifieke instellingen + + diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index ce483c05713..d9bbfd28bb2 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -9,25 +9,17 @@ ଅକ୍ଷାଂଶ ଦ୍ରାଘିମା ଗୃହ - ଆପ୍ ସୂଚନା - ୧ ମିନିଟ୍ - ୧୫ ମିନିଟ୍ ୩୦ ମିନିଟ୍ ୧ ଘଣ୍ଟା ୬ଘ ୧ ଦିନ (ଡିଫଲ୍ଟ) ୧୨ଘ ୧ ସପ୍ତାହ - କେବଳ ଋଣାତ୍ମକ ସଂଖ୍ୟା ଅନୁମୋଦିତ କେବଳ ଧନାତ୍ମକ ସଂଖ୍ୟା କିମ୍ବା ଶୂନ ଅନୁମୋଦିତ - କେବଳ ଧନାତ୍ମକ ସଂଖ୍ୟା ଅନୁମୋଦିତ ଗୃହ ସୂଚନା - ବିବରଣୀ - ସାପ୍ତାହିକ ବହୁଭୂଜ - ସଜାଣି ଆଜି ଗତକାଲି ଆସନ୍ତାକାଲି @@ -37,8 +29,6 @@ ଗତ ମାସ ଏବେ ଗତକାଲି - ବିବରଣୀ - ହୋଇଗଲା ବିବରଣୀ ମତାମତ diff --git a/app/src/main/res/values-prs/strings.xml b/app/src/main/res/values-prs/strings.xml index 843fcc035be..d772fbefdde 100644 --- a/app/src/main/res/values-prs/strings.xml +++ b/app/src/main/res/values-prs/strings.xml @@ -2,13 +2,8 @@ خطا پېښې - اضافه کردن تجدید - افزودن - تقسیم اوقات جدید مراجعه - نام کاربر - کلید رمز بهبود حساب روزنه @@ -22,25 +17,19 @@ باز کردن تنها قابل مطالعه میباشد تکمیل شد - فعال فعال خطا - ایجاد تجدید - تاریخ - کتگوری گزینه ها عرض البلد طول البلد - رویداد جدید معیاد گزارش موعد مقرر انصراف حذف - مجموع هیچ گزینه موجود نیست برنامه های فعال @@ -48,7 +37,6 @@ تجدید غیر فعال - معلوماتی وجود ندارد صفحه اصلی پذیرش انصراف @@ -56,69 +44,33 @@ وضعیت - تاریخ شمولیت - جستجو تاریخ گزارش افزودن یاداشت - روزها - ماه ها - سالانه - هفته ها تاریخ رویداد/ واقعه - پاک کردن دوره بعدی - ذخیره تأیید مشخصات پېښې وابستگی ها درباره اشتراک - بزرگتر - کنونی/ فعلی - اخطاریه - خطا ذخیره انتخاب گزینه صفحه اصلی مجموعه های اطلاعات - وابستگی ها - شاخص ها - تجزیه و تحلیل - یاداشت ها - جزئیات - شاخص ها - یاداشت ها لطفاً انتظار بکشید اسکیپ - زمانبندی دوباره - گذشته از موعد - جدول - پذیرش - ادامه اخطاریه رابطه/ وابستگی بستن - تکمیل - باز کردن - نوع پرونده پشتیبانی نمی‌شود. - روزنه - هفته وار - هفته - تکمیل شد - در حال پیشرفت - ارسال شده - ناکام چند ضلعی دوره - تنظیم کردن - وضعیت امروز دیروز هفته جاری @@ -134,20 +86,10 @@ برگشتن دیتا سیت ها دیروز - جزئیات - نظرات - نام - فورمول - تاریخ شمولیت باز کردن تکمیل - دیتا - انجام شد - آیا ډاډه یاست؟ تاریخ - تاریخ واقعه برگشتن - بستن چارت ها لیست نقشه @@ -168,10 +110,6 @@ سال گذشته مالی نظرات/فیدبک شاخص ها - مقدار - رقم باید کامل باشد - موجود - نا معلوم زبان او کی\! فرستادن @@ -183,7 +121,6 @@ تقسیم اوقات زمان بندی شده مراحل برنامه - گزینه ها نمایش دادن بیشتر نمایش دادن کم diff --git a/app/src/main/res/values-ps/strings.xml b/app/src/main/res/values-ps/strings.xml index ddd8d5e949d..c0dd876bf22 100644 --- a/app/src/main/res/values-ps/strings.xml +++ b/app/src/main/res/values-ps/strings.xml @@ -2,13 +2,8 @@ تېروته پېښې - د نویو مالوماتو ورعلاوه کول - اضافه یې کړئ - د نویو مهالوېش وټاکئ مراجعه - کارېدونکی نوم - پټنوم حساب بېرته ترلاسه کړئ ورځني [ د مودې ډول ] @@ -23,25 +18,19 @@ یوازې یې ولولئ بشپړ شوی لغوه شوی - فعال دی فعال تېروته - جوړ یې کړئ تجدید یا نوي یې کړئ - نېټه - د کټګورۍ غوروی لېټېټيوډ لانګېټيوډ - نوې پېښه د راپور ورکولو موده ټاکلې نېټه رد یې کړئ [ ژباړه ـ ردول ] خذف یې کړئ - ټولټال هېڅ انتخاب شتون نه لري فعال پروګرامونه @@ -49,7 +38,6 @@ درست یې کړئ غېرې فعال یې کړئ - د مالوماتو (ډاټا) نشتوالۍ کور پاڼه د منلو وړ رد یې کړئ [ ژباړه ـ ردول ] @@ -57,64 +45,29 @@ وضعیت - د نوم ثبتونې نېټه - جستجو د راپور نېټه نوټ ور اضافه کړئ - ورځې - میاشت - کلونه - اونۍ د پېښې نېټه - پاک یې کړئ معیاد راتلونکی - ثبت یې کړئ [ ژباړه - ثبت کړئ ] سم دی پېښې اړیکې په هکله شریک یې کړئ - حداعظم - اوسنۍ - خبرداری - تېروته ثبت یې کړئ [ ژباړه - ثبت کړئ ] کور پاڼه - اړیکې - شاخصونه - تحلیلي - یادداښتونه - جزیات [ ژباړه ـ جزیات ] - شاخصونه - یادداښتونه لطفاً صبر وکړئ ترې تېر شئ - د مهالوېش له سره ټاکل - ځنډول - جدول - د منلو وړ - دوام ورکړئ خبرداری اړیکه بند یې کړئ - بشپړ یې کړئ - خلاص یې کړئ - د ارزښت نه منل کېدونکی ډول - ورځني [ د مودې ډول ] - اوونیز - اونۍ - بشپړ شوی - دوام لري - لېږل شوي - ناکام شوي معیاد - وضعیت نن ورځ پرونۍ ورځ هفته هذا @@ -130,21 +83,12 @@ شا ته وګرځئ د مالوماتو یا ډاټا ټولګې پرونۍ ورځ - جزیات [ ژباړه ـ جزیات ] - څرګندونې - نوم د پېښې وضعیت او څرنګوالۍ - د نوم ثبتونې نېټه خلاص یې کړئ بشپړ یې کړئ لغوه شوی - مالومات (ډاټا) - ترسره شو - آیا ډاډه یاست؟ نېټه - د پېښې نېټه شا ته وګرځئ - بند یې کړئ چارټونه لېسټ نقشه @@ -166,10 +110,6 @@ تېر مالي کال د فیډبک یا نظر ورکول شاخصونه - ارزښت یا رقم - ارقام باید صحیح عدد وي - د لاس رسي وړ دي - ناپېژنده لېږل له پامه غورځول شوی پروګرامونه @@ -178,7 +118,6 @@ مهالوېش یې وټاکئ پروګرام شوی د پروګرام پړاو - اختیاري دی ډېر ښکاره کړئ لږ ښکاره کړئ diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 9291ff729a4..01a33023b9b 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1,24 +1,8 @@ Erro - - Erros - Erros - Erros - - Url do servidor errado - Credenciais erradas - Erro inesperado - Erro interno do servidor - sem valor - Metadados - Adicionar novo - Adicionar - Novo agendamento Transferência - Utilizador - Password Recuperar Conta Diário @@ -29,36 +13,28 @@ Partilhar Pesquisar - Opções de filtro Abrir Apenas leitura Concluído Cancelado - Ativar Activo Erro - Criar Actualizar - Data - Opcções de categorias Latitude Longitude - Novo evento Período de relatório Data de vencimento Cancelar Apagar - Total Programas ativos Registrar Editar Desativar - Não ha dados Origem Cancelar Configurações @@ -66,63 +42,32 @@ Situação - Data de inscrição - Pesquisar Data do relatório Adicionar uma nota - Dias - Meses - Anos Data do incidente - Limpar Período Próximo - Salvar Aprovado Atributos Relacionamentos Acerca Partilhar - Máx - Corrente - Advertência - Erro Salvar Origem Valor de Dados Visão geral - Relacionamentos - Indicadores - Notas - Detalhes - Indicadores - Notas Por favor aguarde... Pular - Reprogramar - Atrasado - Continuar Advertência Relação Fechar - Completo - Abrir - Tipo de valor não suportado - Diário - Semanal - Semana - Concluído - Em andamento - Enviar - Polígono capturado Poligono Segurança Período - Estado Hoje Ontém Última semana @@ -136,20 +81,11 @@ Voltar Agregação de Dados Ontém - Detalhes - Nome - Fórmula - Data de inscrição Abrir Completo Cancelado - Dados - Concluído - Tem certeza? Data - Data do evento Voltar - Fechar Copiar para área de transferência Lista Mapa @@ -166,11 +102,6 @@ último ano financeiro Retroinformacão Indicadores - Valor - Credenciais erradas - Valor deve ser um número inteiro - Disponível - Desconhecido Esta bem Enviar Actualizar @@ -181,5 +112,4 @@ Programar Agendado Estágio do programa - Opcional diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index fe689450992..fa0cd40f54a 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -1,64 +1,29 @@ Dhis2 - dhis - 2 Erro - - Erro - Erros - Erros - - URL do servidor errado - Credenciais erradas - Erro inesperado - Erro do Servidor Interno - sem valor Não há mais valores reservados. Entre em contato com o administrador do sistema - Não há mais valores reservados. Conecte-se à rede para recarregá-los - erros Ocorreu algo de errado - Sincronize agora - Sincronizando com o servidor - Sincronizar agora - Metadados Eventos - Entidades rastreadas - - Acabado - Sincronização concluída Erro de sincronização Ocorreu um erro durante a sincronização. Por favor tente novamente. A sincronização foi concluída, mas não recebemos a confirmação do servidor para todos os registos. Esses registos ainda estão marcados como “offline” na aplicação. Recomendamos que tente novamente a sincronização. - Ocorreu um erro e o servidor não respondeu. Contacte o seu administrador. - %s resultados encontrados - Novo - Adicionar Entrar %s Introduzir / Saltar %s - Nova agenda Transferência - url do servidor - Nome de usuário - Senha - Conecte-se - Desbloquear sessão Sincronizando sua configuração Seus dados serão sincronizados em breve Sincronizando seus dados Sua configuração está pronta Seus dados estão prontos - Falha na sincronização da configuração - Falha na sincronização de dados Recuperar Conta - É necessária uma ligação à rede para recuperar a sua conta. Diário @@ -79,140 +44,85 @@ Inserir texto Inserir texto longo Inserir numeros - Digite inteiro Digite um número inteiro negativo Digite um número inteiro positivo ou zero Digite um número inteiro positivo - Opções de filtro Escolha a data - Alterar calendário - Programa concluído - Programa inativo Abrir Não concluído Evento concluído Apenas leitura - Terminar e concluir Completo Cancelado Reabrir - Reabrir o formulário - Activar Activo Sincronizar Para enviar Atualizar - Suprimir Erro - SINCRONIZAR - ENVIAR - SINCRONIZAR SMS - Conclusão - Criar Actualizar - Data Unidade organizacional Não há unidades de organização abertas para a data selecionada. Selecione outra data ou outra unidade organizacional. - Opções de categorias Latitude Longitude - Novo evento - Um tempo - Permanente Período de relatório - Opção de gato - Se você definir um valor, a linha inteira precisa de todos os valores para concluir o conjunto de dados. - Alguns valores necessários estão ausentes. Você precisa definir valores obrigatórios para concluir o conjunto de dados. - Estão faltando campos obrigatórios. Por favor, preencha-os para completar o conjunto de dados. - O valor é salvo! - Não há períodos disponíveis para seleção. Data de vencimento Próximo %1$s Combinação de categoria - DD/MM/AAAA Cancelar Apagar - Total Data do evento mais recente Nenhuma opção disponível Lista de inscrições Programas activos - Programas para inscrição Registrar - Ultima visita: - aplique - Veja detalhes - VEJA MAIS Editar - Acompanhamento - Acompanhamento ativado - Acompanhamento desativado Desactivar Este programa não permite mais eventos - Sem dados eventos Início - Informações do aplicativo Sair - Bloquear Sessão Mostrar%s mais… Mostrar menos - 1 Minuto - 15 Minutos 30 Minutos 1 Hora 6h 1 dia (Padrão) 12h - Dados de sincronização automática a cada: Manual - Configuração de sincronização automática a cada: 1 Semana - Parâmetros de sincronização atuais: - Restaurar ao padrão O banco de dados será excluído. \nVocê será solicitado a fazer login novamente. Aceitar Cancelar SINCRONIZAR Dados agora SINCRONIZAR Configuração agora Configuração - Última sincronização ativada: %s - Última sincronização ativada: %s Recarga - Módulo SMS: Porta de entrada SMS: remetente do resultado SMS Tempo limite do resultado SMS (seg) - segundos - número - número Ativar envio de SMS Aguardar resposta do resultado do SMS - - Há sim %s programa com configurações específicas - Há%s programas com configurações específicas - Há%s programas com configurações específicas - Configurações limitadas Globalmente por programa @@ -230,20 +140,15 @@ Este registro contém todos os erros causados ​​pela sincronização de seus dados e metadados. Suprimir dados locais Todos os dados do Capture App armazenados no seu dispositivo serão excluídos. Os dados que não são sincronizados com o servidor serão perdidos. - Redefinir dados do aplicativo e configuração - Sua configuração e dados do aplicativo armazenados no dispositivo serão excluídos. Você será solicitado a fazer login novamente e os dados que não forem sincronizados com o servidor serão perdidos. Configurações de SMS Verifique e edite os parâmetros relacionados ao porta de entrada sms Atualização do software - Software Exportar base de dados Exporte a sua base de dados e partilhe-a com o seu administrador Autenticação de dois factores Estado - Data de inscrição - Pesquisar @@ -252,43 +157,19 @@ Escrever nova nota claro Adicionar uma nota - Reverter - Ativado - Faltam campos obrigatórios - Alguns campos obrigatórios estão ausentes. Se você quiser voltar agora, todas as informações salvas serão excluídas. - Alguns campos obrigatórios estão ausentes. Se você quiser voltar, por favor preencha-os. - Alguns campos requerem a sua atenção.\nDeseja rever o formulário? Seus dados não são salvos - Se você voltar agora, todas as informações inseridas serão excluídas. - Suprimir e voltar - Alguns campos têm erros:/n%s/nPor favor, verifique-os. - Alguns campos obrigatórios estão ausentes. Você pode concluir a entrada e saída de dados, mas o evento não pode ser concluído. Coordenadas para o - Lista de seções - %s perguntas de %s concluída - %s de %s concluído - Concluir e fechar - Dias - Meses - Anos - Semanas Data do incidente - Resultados locais - Resultados online Programas anteriores Você não tem a permissão necessária para executar esta ação - Adicionar como… - Limpar Período - (%d) Unidade Org - Nível %d Bem-vindo ao dhis2 Aqui você pode ver suas atividades Você pode aplicar um filtro... @@ -297,16 +178,11 @@ Verifique outras ações no menu principal - Criar relação Próximo Você precisa inserir pelo menos %d dos atributos para fazer uma pesquisa - Você precisa inserir pelo menos um dos atributos para fazer uma pesquisa - Há mais de %d resultados. Digite mais critérios de pesquisa - Digite seu critério de pesquisa Importar dados QR - Salvar Aprovado Identificação Atributos @@ -318,33 +194,18 @@ sem dados Código QR inválido Este atributo não pode ser adicionado - Esta inscrição não pode ser adicionada Acerca Programas para inscrição - selecionar tudo - seleção clara - Não há informações para os filtros selecionados. Por favor, tente alterá-los. Partilha Compartilhe QR - Pesquisa por tipo não é possível para pesquisa online. \nPor favor selecione um programa da lista. - Máx - Corrente TEI TEIs - Limite por unidade organizacional - Limitar por programa - Lista de programas Redefinir dados do aplicativo e configuração - Não é possível adicionar esse relacionamento Verifique isso! - Advertência - Erro Salvar Valores Reservados - Deseja adicionar mais dados do QR? - Versão da aplicação: %s Versão do SDK: %s @@ -355,148 +216,45 @@ Desenvolvido e mantido pela DHIS2 projeto, parte da Universidade de Oslo, departamento de informática. Para mais informações ou perguntas sobre este aplicativo, please write to android@dhis2.org - Falta a senha. Por favor preencha este campo. - O nome de usuário está ausente. Por favor preencha este campo. - Este servidor está executando uma versão dhis diferente de 2.29. Atualize a versão do servidor ou use o ambiente de teste para continuar. - Este servidor está executando uma versão dhis diferente de %s. Atualize a versão do servidor ou use o ambiente de teste para continuar. - Algo deu errado. Verifique se o URL, o nome de usuário e a senha do servidor estão corretos e tente novamente. - O servidor não pôde concluir esta solicitação. - Ocorreu um problema ao tentar fazer login no servidor. - Erro de login - Faltam campos obrigatórios - Erro inesperado ao pesquisar online - Erro ao analisar resultados - A pesquisa online retornou um erro - Algo deu errado no servidor Selecione um programa para ativar a inscrição Você não tem a permissão necessária - Essa funcionalidade ainda não está pronta. - Erro ao obter o rótulo do relacionamento Tudo %s Este não é um número de telefone válido - Este não é um email válido - Somente números negativos são permitidos Somente números positivos ou zero são permitidos - Somente números positivos são permitidos - Somente valores de 0 a 1 são permitidos - Somente valores de 0 a 100 são permitidos - Selecione as datas para filtrar Selecionar opção - Problema relatado - Gerar novo evento - Deseja criar outro evento? Eventos Concluídos Todos os eventos deste programa estão concluídos. Deseja encerrar o programa também? - Deseja concluir a inscrição também? Gostaria de completar também as %s Verifica Início EXEMPLO - Adicionar widget Mostre ajuda - Sincronize seus dados... - ...sua configuração... - ...definir quantos registros baixar do servidor... - Verifique e gerencie quantos valores reservados restam - Verifique se uma conexão com o servidor falhou - Libere espaço em disco - ...ou exclua tudo para começar de novo. - Encontre suas entidades no dispositivo local e no servidor online. - Você pode mudar para outros programas - Pesquise ou adicione novas entidades. Você precisa pesquisar antes de poder adicionar um novo! - Clique aqui para limpar os campos e reiniciar a pesquisa. Este é o painel da entidade Ver informações do perfil de entidades... - ...Compartilhe informações via QR ou SMS... - ...Ou marque a entidade para acompanhamento - Clique para criar ou agendar um evento ou se referir a outra Unidade Org. Aqui você verá todos os eventos. Clique para ver um detalhe do evento. Navegue pelo menu para adicionar relacionamentos, ver indicadores ou escrever notas. - Clique para ver todas as inscrições da sua entidade ou crie uma nova. - Clique para excluir este evento. Essa ação não pode ser desfeita. - Complete o evento. - Todos os eventos relacionados a este programa serão listados aqui. - Clique para adicionar um novo evento Digite todos os dados para criar o evento Clique para verificar o status de conclusão do evento. - Clique para concluir ou reabrir um evento - Leia e armazene informações de outros dispositivos via QR - Sincronize seus dados com o servidor - Bloqueie a sessão com um código de 4 dígitos. Não esqueça seu código! - Faça logout para alterar usuário ou servidor. Você poderá fazer login novamente, mesmo se não houver conexão com a Internet. - %s: Relacionamentos Não há eventos registrados, clique em \"+\" para adicionar um novo. - Não há eventos registrados. Valor de Dados Informações Não foi possível ler este ID Suprimir dados locais Visão global - Relacionamentos - Indicadores - Google Analytics Não há indicadores para este programa. - Notas - Não foi possível concluir - Não é possível guardar - Existem avisos no formulário - O que quer fazer? - Alguns campos possuem erros. Por favor, verifique-os para poder concluir Todas as inscrições Mostrar painel com todos os programas ativos - Registro de erros de sincronização aberta Sincronizar registro de erros Compartilhar com... - Sua sincronização de configuração falhou. Pode haver erros no seu servidor. Clique aqui para obter mais informações. - ANTERIOR - PRÓXIMO - Detalhes - Indicadores - Notas - - Conclua mais tarde - - Terminar - Campos com erros - Alguns campos possuem erros. Eles não foram salvos. Por favor, verifique-os. O valor deve ser único, uma coincidência foi encontrada. Não foi salvo. Por favor verifique isto. - Foi encontrada uma coincidência em um campo único. Verifique o formulário para salvar a Inscrição. Por favor aguarde... Saltar - Reprogramar Não há informações para esta tela - Atrasado - There is one program rule which is not supported. Por favor verifique a documentação - Nenhuma informação para este campo - Credenciais Vazias - Para poder fazer login usando o scanner de impressão digital você precisa primeiro usar a maneira padrão - Segurança biométrica - Início de sessão rápido - Gostaria de utilizar a sua impressão digital ou outro método biométrico para iniciar sessão? - Tabelas - Tabela - https:// Dados não sincronizados serão perdidos. Deseja mesmo continuar? - Aceitar Não foi possível excluir os dados. Por favor tente novamente. Exclua os dados locais concluídos com sucesso. - Pelo menos uma unidade organizacional deve ser selecionada - Enviar dados - Ajude o DHIS2 a melhorar este aplicativo compartilhando logs de erros associados ao seu ID de usuário. - Quer nos ajudar a melhorar esta aplicação? - Se disser que sim, a aplicação enviará estatísticas anónimas e registos de erros que nos ajudam a melhorar a experiência e o desempenho do utilizador.\n\nPara mais informações, consulte a nossa política de privacidade. - política de privacidade. - Verificar campos - Você perdeu sua conexão com a Internet ao executar sua sincronização de configuração. Por favor tente novamente mais tarde - Aceita - Continuar - url do servidor - Digite o URL do servidor DHIS 2 da sua organização, conforme fornecido pelo administrador do sistema.\n\nAlternativamente, você pode digitalizar um código QR contendo o URL do seu servido - Esqueceu seu código? - O que você gostaria de fazer para este evento? - FIM %s não encontrado O registro que você está tentando acessar não está disponível. Deseja procurar? Sincronizado por SMS @@ -504,33 +262,16 @@ A carregar Relação Enviado por SMS - Não há conflitos para este programa - A conexão de rede não está disponível, mas parece que existem serviços telefônicos - você pode usar o SMS. - A conexão de rede não está disponível. Fechar Agora você pode verificar as informações de sincronização clicando aqui - Esses dados são armazenados apenas no seu dispositivo, não está sincronizado com o servidor. - Você esta atualizado! Todos os seus dados são enviados para o servidor. Você não pode relacionar um registro consigo mesmo - Desbloquear sessão - Completo - Abrir - Tipo de valor não suportado Alterar visualização da agenda - 15 minutos - Toda hora - Diário - Semanal - Semana - Configuração de sincronização: %s O registro que você está tentando acessar não tem inscrição. Você não pode acessar o painel. Erro de formatação Apagar%s Você não tem autoridade para suprimir este registro - Este url não é válido Ajustando formulário... - Número do receptor Você aceita enviar %d mensagens? Enviando %1$d/%2$d Aguardando confirmação do valor - %d @@ -548,51 +289,29 @@ Nenhum conjunto de porta de entrada Usuário não logado O módulo SMS está desativado - Outro envio de SMS em andamento Módulo SMS não iniciado, não encontrado metadados necessários - Completo Contagem de SMS não aceita Iniciado envio de sms Dados lidos e convertidos. ID da submissão: %d - Erro ao enviar envio de sms Registro e inscrição de SMS TEI Envio de evento por SMS envio de conjunto de dados SMS - Iniciando - Em curso - Enviar - Falhou - Iniciando a sincronização. Sincronizando... - Sincronização concluída. - Ocorreu um erro durante a sincronização. - Ocorreu um erro durante a sincronização. Clique aqui para verificar os logs de erros - Sincronização cancelada. Copiado - Imagem selecionada - Mostrar no mapa - Mostrar lista - %s é obrigatório mas não foi fornecido. - Polígono capturado Poligono - Impressão digital - Por favor, coloque o dedo no seu leitor de impressões digitais. Segurança Por razões de segurança, esta versão do aplicativo não pode ser usada em dispositivos raiz. Por favor, use a versão de treinamento. - Existem alguns erros. Por favor corrija-os antes de continuar. Aplicação de filtros Nenhum filtro aplicado Período Unidade Org. - Ordem - Estado Sincronizar Atribuído a mim Hoje @@ -607,25 +326,18 @@ De - Para Outro A qualquer momento - Falha na sincronização. Falha na sincronização. Verifique os valores dos dados para tentar corrigir o problema e tente novamente. Se continuar falhando, entre em contato com o administrador do sistema. - Esses dados foram enviados ao servidor mas não é garantido que tenham sido armazenados Abrir Programar Atrasado Visitou Completo Ignorado - Eventos: %s max: %s %s atual: %s TEI: %s max: %s %s atual: %s - Configurações limitadas %s \nEventos: %s/%s TEI: %s/%s - Ocultar dados de inscrição - Mostrar dados de inscrição Módulo SMS ativado Módulo SMS desativado Baixando dados para o módulo SMS. Por favor espere. A porta de entrada do SMS não pode estar vazio Não há inscrições para envio Este convertTask não é suportado - Não mostrar novamente a tela de bloqueio Definir pino Conflito Mudar data @@ -650,11 +362,7 @@ Escolha a unidade organizacional Digite o URL Digite o valor - Escolha a imagem - Código de digitalização - Escolha a opção Valores reservados baixados por atributo TEI - Valores reservados baixados por atributo TEI %s valores reservados restantes Gerenciar valores reservados Eventos para baixar @@ -674,57 +382,28 @@ Não sincronizado Erro de Sincronização SMS sincronizado - Detalhes - Comentarios Gravado! - Você quer verificar a qualidade dos dados\? - Tudo parece bem! - Você também deseja completar o conjunto de dados\? - Marcar como completado - Nome - Fórmula - Completar mesmo assim Ausência de %s %s de %s %s Estado do evento - Data de inscrição Não existem dados. Clique em \"+\" para adicionar um novo registro Não existem dados. Você não tem permissão para adicionar novos registros. Nenhuma descrição ou instrução fornecida Dados para revisar - Salvo e concluído! Já existe uma inscrição ativa Abrir Completo Cancelado - Dados O selecionado %s não pôde ser baixado. - Completado por %s: %s - Atualizado: %s - Feito - Não foi possível verificar a qualidade dos dados. Contate seu administrador - Tem certeza? - Você deseja reabrir o conjunto de dados? Data - Data de incidente - %s não tem atributos públicos. Selecione um programa Política de Privacidade Clique aqui para conferir nosso política de privacidade - Os valores das coordenadas não são válidos - Você não pode inscrever TEIs de outras unidades organizacionais neste programa porque está protegido.\nContate seu administrador. Não é possível inscrever um %s de outras unidades organizacionais neste programa porque está protegido.\nContacte o seu administrador. Este campo é obrigatório Por razões de segurança, esta versão do aplicativo não pode ser usada com o adb. Por favor, use a versão de treinamento. Voltar - Fechar aplicativo - Mais detalhes - Mais detalhes - Fechar Copiar para área de transferência - Copiado para área de transferência - Informação de erro Encontramos um erro ao sincronizar com seu servidor. Compartilhe o erro com o administrador do sistema, se for possível. - Não foi possível fazer login com seu nome de usuário Existem eventos planejados que não serão reprogramados Gráficos Lista @@ -775,47 +454,26 @@ Retroinformacão Indicadores A permissão da câmara é negada.\nPrecisa de a ativar para utilizar esta funcionalidade. - Valor Gráficos e indicadores Tirar fotografia - Selecionar a partir da galeria - Feito! Este programa está protegido Descreva aqui o motivo - Autenticando - O URL do servidor fornecido não é uma instância dhis - Credenciais erradas - Servidor desconhecido - Valor deve ser um número inteiro A sessão expirou A sua sessão atual expirou. Por motivos de segurança, terá de fornecer novamente as suas credenciais - Valores Semana %d %s a%s Não voltar a mostrar Configuração de funções Mostrar como radar - Não é possível definir o tipo de coordenadas Seguimento%s - %s não pode ser analisado como uma data Não foi possível atualizar este campo. Por favor, tente novamente - Edição - Disponível Estes dados não são editáveis porque estão marcados como concluídos Estes dados não são editáveis porque o seu tempo de edição expirou Não tem permissão para editar estes dados Estes dados não são editáveis porque a unidade organizacional está encerrada Não tem permissão para editar estes dados Não é possível editar dados desta unidade organizacional - Repor a pesquisa A pesquisa em linha deu a seguinte mensagem: - Aviso de regras do programa - Existe um problema de configuração que está a provocar um ciclo nas regras. Contacte o seu administrador. - ACTUALIZAR - Desconhecido - Atualizar todos os dados -  Atingiu o número máximo de contas (%d). Para adicionar uma nova conta, inicie sessão e elimine uma das suas contas Eliminar conta - Gerir contas Resolução de problemas de configuração Idioma Toque aqui para alterar o idioma da aplicação @@ -834,9 +492,7 @@ Não existem resultados para esta pesquisa Muitos resultados Tente alterar a sua pesquisa para restringir os resultados. - Crie um novo Novo %s - É necessário introduzir pelo menos %s atributos para pesquisar Esta bem Iniciar uma pesquisa para encontrar qualquer %s É possível pesquisar ou criar um novo %s @@ -845,7 +501,6 @@ Alguns campos têm erros e não são guardados. \Deseja rever o formulário? Deseja marcar este formulário como completo? Tem algumas mensagens de erro. Quer revê-las? - Se sair agora, as alterações serão rejeitadas. Reaberto Conta desactivada A sua conta foi desactivada por um administrador. @@ -855,27 +510,10 @@ Data actual: %s Dispositivo: %s Versão do sistema operativo: %s - Abrir detalhes de %s - %s detalhes A sincronizar %s… - SMS enviado. A aguardar resposta do servidor. - SMS confirmado para chegar ao servidor. Actualização do estado - Não podemos confirmar se o SMS chegou ao servidor. Actualização do estado - SMS enviado. Atualização do estado. - SMS não enviado. - Abrir a aplicação SMS. Não modificar a mensagem, por favor. Enviar Sms com Enviou a sms? - A aguardar confirmação manual - Sincronização de eventos - Sincronização de entidades monitorizadas - Sincronização de conjuntos de dados - Sincronização de recursos - Sincronização efectuada - A sincronização de SMS está disponível, mas tem de ser acedida para cada registo individual Descarregar imagens... - Descrição do programa - Pin errado Inscrito em Propriedade de Sincronização necessária @@ -895,22 +533,11 @@ Actualizar Não agora Toque aqui para explorar - - %s erro - %s erros - %s Erros - - - %s aviso - %s avisos - %s Alertas - A versão %s aplicação já está disponível. Quer baixá-lo? Atualização do software Mais tarde Descarregar agora Verifique se existem atualizações - Verificação de actualizações Não há novas actualizações A permissão de fontes desconhecidas foi negada. É necessário activá-la para instalar a versão. A permissão de armazenamento foi negada. É necessário activá-la para instalar a versão. @@ -950,18 +577,10 @@ Estagio de programa evento Linha do tempo - Limpar pesquisa - Opcional Banco de dados descarregado - Importando base de dados - Não existem campos de pesquisa configurados para utilização. \nContacte o seu administrador. Mostre mais Mostre menos Sincronizar - Mostrar campos - Ocultar campos - Importação bem sucedida - Esta secção está mal configurada.\nContacte o seu administrador. Sincronização bem sucedida A sincronizar %s… recursos de ficheiros @@ -975,4 +594,22 @@ Transferido com sucesso %1$s cancelado Data de vencimento actualizada - + + + %s erro + %s erros + %s Erros + + + + %s aviso + %s avisos + %s Alertas + + + + Há sim %s programa com configurações específicas + Há%s programas com configurações específicas + Há%s programas com configurações específicas + + diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index c777a674a2e..67b76d5d1df 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -1,8 +1,6 @@ Eroare - Adăugare nou - Adăugare Lunar Anual Accept @@ -16,10 +14,7 @@ Eroare - Creare Actualizare - Data - Eveniment nou Perioada raportului Anulare @@ -32,37 +27,19 @@ Stare - Data înrolării - Căutare Data raportului - Zile - Luni - Ani - Săptămâni Data incidentului Următorul - salva Relații Partajare - Max - Avertizare - Eroare salva Acasă - Relații - Indicatori - Indicatori - Finalizare - Accept - Continuare Avertizare Închidere - Complet - Stare Astăzi Ieri Săptămâna aceasta @@ -71,12 +48,8 @@ Luna trecută Complet Ieri - Comentarii - Data înrolării Anulat - Terminat Data - Închidere Ultimul trimestru Săptămâni în anul curent Luni în anul curent diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index dd8681952be..86a159f813f 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1,65 +1,29 @@ Dhis2 - dhis - 2 Ошибка - - Ошибка - Ошибки - Ошибки - Ошибки - - Неправильный веб-адрес - Неверные учетные данные - Непредвиденная ошибка - Внутренняя ошибка сервера - нет значения Больше нет зарезервированных значений. Обратитесь к системному администратору - Зарезервированных значений больше нет. Подключитесь к сети, чтобы пополнить их - ошибки Что-то пошло не так - Синхронизировать сейчас - Синхронизация с сервером - Синхронизация сейчас - Метаданные События - Отслеживаемые объекты - - Завершено - Синхронизация завершена Ошибка синхронизации Во время синхронизации произошла ошибка. Пожалуйста, повторите попытку. Синхронизация завершена, но мы не получили подтверждения сервера для всех записей. Эти записи по-прежнему отмечены в приложении как \"оффлайн\". Мы рекомендуем повторить синхронизацию. - Произошла ошибка, и сервер не ответил. Обратитесь к своему администратору. - %s результатов найдено - Добавить новое - Добавить Введено %s Введено / пропущено%s - Распланировать новое Направление - Адрес веб-страницы сервера - Имя пользователя - Пароль - Вход - Разблокировать сессию Синхронизация Вашей конфигурации Ваши данные вскоре будут синхронизированы Синхронизация данных Ваша конфигурация готова Ваши данные готовы - Не удалось синхронизировать конфигурацию - Сбой синхронизации данных Восстановить учетную запись - Для восстановления учетной записи необходимо подключение к сети. Ежедневно @@ -80,135 +44,80 @@ Введите текст Введите длинный текст Введите номер - Введите целое число Введите отрицательное целое число Введите целое положительное число или ноль Введите целое положительное число - Параметры фильтров Выберите дату - Изменить календарь - Программа завершена - Программа неактивна Открыть Не завершено Событие завершено Только читать - Закончить и завершить Завершенный Отмененный Открыть заново - Открыть форму заново - Активировать Действующий Синхронизировать Отправить Обновить - Удалить Ошибка - СИНХРОНИЗАЦИЯ - ОТПРАВИТЬ - СИНХРОНИЗАЦИЯ ПО SMS - Завершение - Создать Обновить - Дата Организационная единица На выбранную дату нет свободных организационных единиц. Пожалуйста, выберите другую дату или другую организационную единицу. - Опции категории Широта Долгота - Новое событие - Один раз - Постоянно Отчет за период - Если вы задали значение, то для заполнения набора данных в строке должны быть все значения. - Некоторые необходимые значения отсутствуют. Для заполнения набора данных необходимо установить обязательные значения. - Не заполнены обязательные поля. Пожалуйста, заполните их, чтобы завершить набор данных. - Значение сохранено! - Нет доступных периодов для выбора. Дата выполнения Следующий %1$s - ДД/ММ/ГГГГ Отмена Удалить - Всего Дата последнего события Нет доступных вариантов Список регистраций Действующие программы - Программы для регистрации Регистрировать - Последнее посещение: - применить - Посмотреть детали - ПОСМОТРЕТЬ БОЛЬШЕ Редактировать - Отслеживать - Последующие действия включены - Последующие действия выключены Деактивировать Эта программа не позволяет иметь больше событий - Нет данных события/й Главная - Информация о приложении Выйти из системы - Заблокировать сессию Показать %s больше... Показать меньше... - 1 минута - 15 минут 30 минут 1 час 6 часов 1 день (по умолчанию) 12 часов - Автоматическая синхронизация данных каждый: Вручную - Автоматическая синхронизации конфигурации каждый: 1 неделя - Текущие параметры синхронизации: - Возвратить в исходное положение по умолчанию База данных будет удалена.Вам будет предложено войти в систему снова. Принять Отмена СИНХРОНИЗИРОВАТЬ данные сейчас СИНХРОНИЗИРОВАТЬ конфигурацию сейчас Настройки - Последняя синхронизация: %s - Последняя синхронизация: %s - Модуль SMS: - секунд - число - число Включить отправку SMS Дождитесь ответа на SMS-сообщение - - Существует программа %s с определенными настройками. - Существуют программы %s с определенными настройками. - Существуют программы %s с определенными настройками. - Существуют программы %s с определенными настройками. - Настройки ограничены Глобально по программам @@ -226,19 +135,14 @@ Этот журнал содержит все ошибки, вызванные синхронизацией данных и метаданных. Удалить локальные данные Все данные приложения Capture App, хранящиеся на вашем устройстве, будут удалены. Данные, не синхронизированные с сервером, будут потеряны. - Сброс данных приложения & конфигурация - Ваша конфигурация и данные приложения, хранящиеся на устройстве, будут удалены. Вам будет предложено снова войти в систему, а данные, не синхронизированные с сервером, будут потеряны. Настройки SMS Проверка и редактирование параметров, связанных с SMS-шлюзом Обновление программного обеспечения - Программное обеспечение Экспорт базы данных Экспортируйте свою базу данных и передайте ее Вашему администратору Статус - Дата зачисления - Поиск @@ -247,42 +151,19 @@ Написать новую заметку очистить Добавить заметку - Активированно - Не заполнены обязательные поля - Некоторые обязательные поля не заполнены. Если вы захотите вернуться назад, вся сохраненная информация будет удалена. - Некоторые обязательные поля не заполнены. Если вы хотите вернуться, пожалуйста, заполните их. - Некоторые поля требуют вашего внимания.Не хотите ли вы просмотреть форму? Ваши данные не сохранены - Если Вы вернетесь назад сейчас, вся введенная информация будет удалена. - Удалить и вернуться назад - В некоторых полях есть ошибки:%sПожалуйста, проверьте их. - Некоторые обязательные поля не заполнены. Вы можете завершить ввод данных и выйти, но событие не может быть завершено. Координаты для - Список разделов - %s вопросов %s завершены - %sиз %s завершено - Завершить и закрыть - Дни - Месяцы - Годы - Недели Дата происшествия - Локальные результаты - Результаты онлайн Прошлые программы У Вас нет необходимых полномочий для выполнения этого действия - Добавить как... - Очистить Период - (%d) Орг.подразделение - Уровень %d Добро пожаловать в dhis2 Здесь Вы можете увидеть свою деятельность Вы можете применить фильтр... @@ -291,16 +172,11 @@ Проверьте другие действия в главном меню - Создать взаимоотношения Следующая Для поиска необходимо ввести как минимум %d атрибутов. - Чтобы выполнить поиск, необходимо ввести хотя бы один из атрибутов - Есть больше, чем %d результатов. Пожалуйста, введите дополнительные критерии поиска - Введите критерии поиска Импорт данных через QR - Сохранить ОК Идентификация Атрибуты @@ -312,30 +188,17 @@ нет данных Неверный QR-код Этот атрибут не может быть добавлен - Эта регистрация не может быть добавлена Об Программы для регистрации - выбрать всё - очистить выбор - Для выбранных фильтров нет информации. Пожалуйста, попробуйте изменить их. Поделиться Поделиться QR - Поиск по типу невозможен для онлайн-поиска.Пожалуйста, выберите программу из списка. - Макс - Текущий TEI - Список программ Сброс данных приложения & конфигурации - Невозможно добавить эту связь Проверьте это! - Предупреждение - Ошибка Сохранить Зарезервированные значения - Хотите добавить больше данных с помощью QR-кода? - Версия приложения: %s Версия SDK: %s @@ -346,142 +209,43 @@ Разработан и поддерживается проектом DHIS2, входящим в состав Университета Осло, департамент информатики. Для получения дополнительной информации или вопросов по данному приложению пишите по адресу android@dhis2.org. - Пароль отсутствует. Пожалуйста, заполните это поле. - Имя пользователя отсутствует. Пожалуйста, заполните это поле. - На этом сервере установлена версия dhis, отличная от 2.29. Обновите версию своего сервера или используйте тестовую среду для продолжения работы. - На этом сервере установлена версия dhis, отличная от %s. Обновите версию своего сервера или используйте тестовую среду для продолжения работы. - Что-то пошло не так. Пожалуйста, проверьте правильность url-адреса сервера, имени пользователя и пароля и повторите попытку. - Сервер не смог выполнить этот запрос. - При попытке войти на сервер возникла проблема. - Ошибка входа в систему - Не заполнены обязательные поля - Неожиданная ошибка при поиске онлайн - Ошибка при разборе результатов - Поиск онлайн дал ошибку - Что-то пошло не так на сервере Выберите программу для возможности регистрации У Вас нет требуемого разрешения - Эта функциональность еще не готова. - Ошибка при получении метки взаимоотношений Все %s Это недействительный номер телефона - Это недействительный адрес электронной почты - Допускаются только отрицательные числа Допускаются только положительные числа или ноль - Допускаются только положительные числа - Допускаются только значения от 0 до 1 - Допускаются только значения от 0 до 100 - Выберите даты для фильтрации Выберите опцию - Сообщается о проблеме - Создать новое событие - Хотите создать еще одно событие? Завершенные события Все события в этой программе завершены. Вы хотите закрыть и эту программу? - Вы хотите также завершить регистрацию? Вы хотите также завершить %s? Проверьте Главная ПРИМЕР - Добавить виджет Показать помощь - Синхронизация Ваших данных... - ...Вашей конфигурации... - ...задайте количество записей, которые нужно загрузить с сервера... - Проверяйте и управляйте количеством оставшихся зарезервированных значений - Проверьте, не нарушилось ли соединение с сервером - Освободите немного места на диске - ...или удалите все, чтобы начать сначала. - Вы можете переключиться на другие программы - Поиск или добавление новых объектов. Прежде чем добавить новый объект, необходимо выполнить поиск! - Нажмите здесь, чтобы очистить поля и заново начать поиск. - ...Делитесь информацией через QR или SMS... - Нажмите, чтобы создать или запланировать событие или обратиться к другому орг. подразделению. Здесь вы увидите все события. Нажмите, чтобы просмотреть подробности события. Перемещайтесь по меню, чтобы добавить связи, посмотреть индикаторы или написать заметки. - Нажмите, чтобы удалить это событие. Это действие нельзя отменить. - Завершить событие. - Все события, связанные с этой программой, будут перечислены здесь. - Нажмите, чтобы добавить новое событие Введите все данные для создания событие Нажмите, чтобы проверить состояние завершения события. - Нажмите, чтобы завершить или снова открыть событие - Считывайте и сохраняйте информацию с других устройств с помощью QR - Синхронизация Ваших данных с сервером - Заблокируйте сессию с помощью 4-значного кода. Не забывайте свой код! - Выйдите из системы, чтобы сменить пользователя или сервер. Вы сможете снова войти в систему даже при отсутствии подключения к Интернету. - %s: связи Нет зарегистрированных событий, нажмите \"+\", чтобы добавить новое. - Нет зарегистрированных событий. Значение данных Информация Невозможно прочитать этот Id Удаление локальных данных Обзор - Зависимости - Индикаторы - Аналитика Для этой программы не существует индикаторов. - Заметки - Невозможно завершить - Невозможно сохранить - Есть предупреждения в форме - Что Вы хотите делать? - В некоторых полях есть ошибки. Пожалуйста, проверьте их, чтобы заполнить Все регистрации Показать инфопанель со всеми активными программами - Открыть журнал ошибок синхронизации Журнал ошибок синхронизации Поделиться с... - Синхронизация Вашей конфигурации не удалась. Возможно, на Вашем сервере возникли ошибки. Нажмите здесь для получения дополнительной информации. - ПРЕДЫДУЩИЙ - СЛЕДУЮЩИЙ - Детали - Индикаторы - Заметки - - Завершить позже - Завершить - Поля с ошибками - Некоторые поля содержат ошибки. Они не были сохранены. Пожалуйста, проверьте их. Значение должно быть уникальным, совпадение найдено. Оно не было сохранено. Пожалуйста, проверьте его. - Найдено совпадение в уникальном поле. Пожалуйста, проверьте форму, чтобы сохранить регистрацию. Пожалуйста, подождите Пропустить - Перепланировать Информация для этого экрана отсутствует - Просроченный - Существует одно программное правило, которое не поддерживается. Пожалуйста, проверьте документацию - Нет информации для этого поля - Пустые учетные данные - Чтобы войти в систему с помощью сканера отпечатков пальцев, сначала нужно воспользоваться стандартным способом - Биометрическая безопасность - Быстрый вход в систему - Хотите использовать отпечаток пальца или другой биометрический метод для входа в систему? - Таблицы - Таблица - https:// Не синхронизированные данные будут потеряны. Вы действительно хотите продолжить? - Принять Данные не удалось удалить. Пожалуйста, повторите попытку. Удаление локальных данных успешно завершено. - Необходимо выбрать хотя бы одну Организационную единицу. - Отправить данные - Помогите DHIS2 улучшить это приложение, поделившись журналами ошибок, связанных с Вашим идентификатором пользователя. - Хотите помочь нам улучшить это приложение? - Если вы ответите \"да\", приложение будет отправлять анонимную статистику и журналы ошибок, которые помогут нам улучшить качество работы пользователей. Для получения более подробной информации, пожалуйста, ознакомьтесь с нашей политикой конфиденциальности. - политика конфиденциальности - Проверить поля - Во время синхронизации конфигурации было потеряно подключение к Интернету. Пожалуйста, повторите попытку позже - Согласен - Продолжить - Адрес веб-страницы сервера - Введите URL-адрес сервера DHIS 2 для Вашей организации, предоставленный Вашим системным администратором. Другой вариант - отсканировать QR-код, содержащий URL-адрес Вашего сервера. - Забыли свой код? - Что бы Вы хотели сделать для этого события? - КОНЕЦ %s не найдено Запись, к которой Вы пытаетесь получить доступ, недоступна. Не хотите ли Вы поискать ее? Синхронизировано по SMS @@ -489,33 +253,16 @@ Загрузка Зависимость Отправлено по SMS - Для этой программы нет конфликтов - Подключение к сети недоступно, но, похоже, есть телефонная связь - можно использовать SMS. - Сетевое подключение недоступно. Закрыть Теперь Вы можете проверить информацию о синхронизации, нажав здесь - Эти данные хранятся только на Вашем устройстве, они не синхронизированы с сервером. - Вы обновлены! Все Ваши данные отправлены на сервер. Вы не можете связать запись с самой собой - Разблокировать сессию - Завершенный - Открыть - Неподдерживаемый тип значения Изменить вид календаря - 15 минут - Каждый час - Ежедневно - Еженедельно - Неделя - Настройка синхронизации: %s Запись, к которой Вы пытаетесь получить доступ, не зарегистрирована. Вы не можете получить доступ к инфопанели. Ошибка форматирования Удалить %s Вы не имеете права удалять эту запись - Это не правильный url Настройка формы... - Номер приемника Согласны ли Вы отправлять сообщения на %d? Отправка %1$d/%2$d Ожидание подтверждения количества - %d @@ -533,48 +280,26 @@ Шлюз не установлен Пользователь не вошел в систему Модуль SMS отключен - Продолжается отправка очередного SMS-сообщения Модуль SMS не инициирован, не найдены необходимые метаданные - Завершенный SMS не принимаются Запуск отправки смс Данные прочитаны и преобразованы. Идентификатор заявки: %d - Ошибка отправки смс - Начало - Выполняется - Отправлено - Сбой - Запуск синхронизации. Синхронизация... - Синхронизация завершена. - Во время синхронизации произошла ошибка. - Во время синхронизации произошла ошибка. Нажмите здесь, чтобы проверить журналы ошибок - Синхронизация отменена Скопировано - Выбранное изображение - Показать на карте - Показать список - %s является обязательным, но не был предоставлен. - Полигон зафиксирован Полигон - Отпечаток пальца - Пожалуйста, приложите палец к считывателю отпечатков пальцев. Безопасность По соображениям безопасности эта версия приложения не может быть использована на корневых устройствах. Пожалуйста, используйте учебную версию. - Здесь есть несколько ошибок. Пожалуйста, исправьте их, прежде чем продолжить. Применение фильтров Фильтры не применены Период Орг. единица - Сортировка - Статус Синхронизировать Назначен мне Сегодня @@ -589,18 +314,13 @@ От - до Другое Любое время - Синхронизация не удалась. Синхронизация не удалась. Проверьте значения данных, чтобы попытаться устранить проблему, и повторите попытку. Если попытка не удалась, обратитесь к системному администратору. - Эти данные были отправлены на сервер, но не гарантируется, что они были сохранены Открыть Расписание Просроченный Посещено Завершенный Пропущенный - Скрыть данные регистрации - Показать данные регистрации Нет регистраций к загрузке - Не показывать снова экран блокировки Установить пин Конфликт Изменить дату @@ -625,9 +345,6 @@ Выберите Организационную единицу Введите url Введите значение - Выбрать изображение - Сканировать код - Выберите опцию Управление зарезервированными значениями События для загрузки Отслеживаемые объекты для загрузки @@ -646,57 +363,28 @@ Не синхронизировано Ошибка синхронизации Синхронизированное SMS - Детали - Комментарии Сохранено! - Вы хотите проверить качество данных\? - Все выглядит хорошо! - Вы также хотите завершить набор данных\? - Отметить как завершенное - Название - Формула - Завершить все равно Отсутствует %s %s из %s %s Статус события - Дата зачисления Нет никаких данных. Нажмите \"+\", чтобы добавить новую запись Нет данных. У Вас нет разрешения на добавление новых записей. Описание и инструкция отсутствуют Данные для просмотра - Сохранено и завершено! Уже есть активная регистрация Открыть Завершенный Отмененный - Данные Не удалось загрузить выбранные %s. - Завершено на %s: %s - Обновлено: %s - Готово - Мы не смогли проверить качество данных. Свяжитесь с Вашим администратором - Вы уверены? - Хотите ли Вы снова открыть набор данных? Дата - Дата происшествия - %s не имеет публичных атрибутов. Пожалуйста, выберите программу Политика конфиденциальности Нажмите здесь, чтобы ознакомиться с нашей политикой конфиденциальности . - Значения координат не действительны - Вы не можете зачислить отслеживаемый объект из других организационных подразделений в эту программу, потому что она защищена. Сообщите об этом своему администратору. Вы не можете зарегистрировать %s из других организационных подразделений в этой программе, потому что она защищена. Свяжитесь с Вашим администратором. Это поле обязательно для заполнения По соображениям безопасности эта версия приложения не может быть использована с adb. Пожалуйста, используйте учебную версию. Вернуться - Закрыть приложение - Подробнее - Подробнее - Закрыть Копировать в буфер обмена - Скопировано в буфер обмена - Информация об ошибках Мы обнаружили ошибку при синхронизации с Вашим сервером. По возможности сообщите об ошибке своему системному администратору. - Мы не смогли инициировать сессию с Вашим пользователем Есть запланированные события, которые не будут перенесены на другой день Диаграммы Список @@ -746,44 +434,25 @@ Обратная связь Индикаторы Разрешение камеры отклонено. Для использования этой функции необходимо включить ее. - Значение Диаграммы и индикаторы Сделать фото - Выбрать из галереи - Готово! Данная программа защищена Опишите причину здесь - Автентификация - Предоставленный адрес сервера не является экземпляром dhis - Неверные учетные данные - Неизвестный сервер - Значение должно быть целым числом Сессия истекла Срок действия Вашей текущей сессии истек. По соображениям безопасности Вам нужно будет снова предоставить свои учетные данные - Значения Неделя %d %s до %s Больше не показывать Показать как радар Отмеченные для последующего наблюдения %s Это поле не удалось обновить. Пожалуйста, попробуйте еще раз - Издание - Доступно Эти данные нельзя редактировать, поскольку они помечены как завершенные Эти данные нельзя редактировать, так как время их редактирования истекло У Вас нет прав на редактирование этих данных Эти данные нельзя редактировать, потому что организационное подразделение закрыто У вас нет прав на редактирование этих данных Вы не можете редактировать данные из этой Организационной единицы - Сброс поиска Онлайн поиск дал следующее сообщение: - Предупреждение о правилах программы - Существует проблема конфигурации, вызывающая зацикливание правил. Обратитесь к администратору. - ОБНОВИТЬ - Неизвестный - Обновить все данные - Вы достигли максимального количества учетных записей (%d). Чтобы добавить новую учетную запись, войдите в систему и удалите одну из своих учетных записей Удалить аккаунт - Управление учетными записями Устранение неисправностей конфигурации Язык Нажмите здесь, чтобы изменить язык приложения @@ -802,9 +471,7 @@ Для этого поиска нет результатов Слишком много результатов Попробуйте изменить поиск, чтобы сузить результаты. - Создать новый Новый %s - Для поиска необходимо ввести как минимум %s атрибутов. Ok Начните поиск, чтобы найти любой %s Вы можете найти или создать новый %s @@ -813,7 +480,6 @@ В некоторых полях есть ошибки, и они не сохраняются. Хотите ли Вы просмотреть форму? Хотите ли Вы отметить эту форму как завершенную? У Вас есть несколько сообщений об ошибках. Хотите ли Вы их просмотреть? - Если Вы выйдете сейчас, изменения будут отменены. Открыть заново Аккаунт дезактивирован Ваша учетная запись была отключена администратором. @@ -822,18 +488,8 @@ Текущая дата: %s Устройство: %s Версия Os: %s - Открыть %s деталей - %s деталей Синхронизация %s... - Ожидает подтверждения вручную - Синхронизация событий - Синхронизация отслеживаемых объектов - Синхронизация наборов данных - Синхронизация ресурсов - Синхронизация выполнена Загрузка изображений... - Описание программы - Неправильный пин Зарегистрирован в Владелец Необходима синхронизация @@ -852,24 +508,11 @@ Обновить Не сейчас Нажмите здесь, чтобы посмотреть - - %s ошибка - %s ошибки - %s ошибки - %s ошибок - - - %s предупреждение - %s предупреждения - %s предупреждения - %s предупреждений - Версия приложения %s уже доступна. Хотите загрузить ее? Обновление программного обеспечения Позже Скачать сейчас Проверить наличие обновлений - Проверка наличия обновлений Новые обновления отсутствуют Разрешение на неизвестные источники отклонено. Для установки версии Вам необходимо включить его. Версия приложения @@ -908,18 +551,10 @@ Этап программы событие Временная шкала - Очистить поиск - Опционно База данных загружена - Импорт базы данных - Не настроены поля поиска. Пожалуйста, обратитесь к администратору. Показать больше Показать меньше информации Синхронизация - Показать поля - Скрыть поля - Импорт прошел успешно - Этот раздел неправильно настроен. Свяжитесь с администратором. Успешная синхронизация Синхронизация %s... Показать описание @@ -935,4 +570,25 @@ Завершить %s Деактивировать %s Окрыть повторно %s + + + %s ошибка + %s ошибки + %s ошибки + %s ошибок + + + + %s предупреждение + %s предупреждения + %s предупреждения + %s предупреждений + + + + Существует программа %s с определенными настройками. + Существуют программы %s с определенными настройками. + Существуют программы %s с определенными настройками. + Существуют программы %s с определенными настройками. + diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index 6293b752657..b5d1569c746 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -1,7 +1,6 @@ දෝෂය - රහස්‍ය පදය දිනපතා සතිපතා @@ -12,32 +11,16 @@ සොයන්න විවෘත කරන්න දෝෂය - දිනය ඉවත් කරන්න - එකතුව වෙනස් කරන්න පිළිගන්න සොයන්න - දින - මාස - අවුරුදු - සති - සුරකින්න - උපරිම - අවවාදයයි - දෝෂය සුරකින්න දත්ත අගයන් - පිළිගන්න අවවාදයයි වසන්න - විවෘත කරන්න - දිනපතා - සතිපතා - සතිය - අසාර්ථකයි අද ඊයේ @@ -48,12 +31,8 @@ වෙනත් විවෘත කරන්න ඊයේ - නම විවෘත කරන්න - දත්ත - නිම කළා දිනය - වසන්න ප්‍රස්ථාර සිතියම ප්‍රස්ථාර @@ -61,8 +40,6 @@ අගයක් ලෙස නරඹන්න මෙම වසර පසුගිය වසර - අගය - අගයන් යවන්න වැඩියෙන් පෙන්වන්න විස්තරය පෙන්වන්න diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 476e7c3003e..f5527d2ff62 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -1,49 +1,23 @@ DHIS2 - DHIS - 2 Fel - Fel serveradress - Felaktiga uppgifter - Oväntat fel - Internt serverfel - inget värde Något gick fel - Synkronisera nu - Synkroniserar med server - Synkronisera nu - Metadata Händelser - Tracked entities - - Klar - Synkronisering färdig Synkroniseringsfel Ett fel har inträffat under synkroniseringen. Försök igen. - %s resultat hittades - Lägg till ny - Lägg till - Planera nytt Remiss - Server URL - Användarnamn - Lösenord - Logga in - Lås session Synkronisera din konfiguration Dina data kommer snart att synkroniseras Synkronisera dina data Din konfiguration är klar Dina data är klara - Konfigurationssynkroniseringen misslyckades - Data synkronisering misslyckades kontoåterställning Dagligen @@ -58,15 +32,11 @@ Ange text Ange långtext Ange ett nummer - Ange ett heltal Ange ett negativt heltal Ange ett positivt heltal eller noll. Ange ett positivt heltal - Filteralternativ Välj datum - Program avslutat - Programm inaktivt Öppen read only @@ -77,77 +47,45 @@ Synkronisera Att uppdatera - Att radera Fel - SYNKRONISERA - Komplettering - Skapa Uppdatera - Datum Organisationsenhet - Kategorialternativ Latitud Longitud - Ny händelse - En gång - Permanent Förfallodatum Kategori kombination - DD/MM/ÅÅÅÅ Avbryt Radera - Totalt Aktiva program - Program för att registrera Registrera - Senaste besök: - verkställ - Se detaljer - VISA MER Redigera - Följ upp - Uppföljning aktiverad - Uppföljning avaktiverad Inaktivera Det här programmet tillåter inte fler händelser händelser Hem - App Info Logga ut - Blockera sessionen - 1 minut - 15 minuter 1 timme 1 dag (Standard) - Automatisk synkronisering varje dag Manuell - Automatisk konfigurationssynkronisering varje: 1 vecka - Nuvarande synkroniseringsparametrar - Återställ till standardvärden Databasen kommer att raderas\nDu måste logga in igen. Acceptera Avbryt Synkronisera data nu Synkronisera konfigurationen nu Inställningar - Senaste synkronisering %s - Senaste synkronisering %s - Återställ app Status - inskrivning datum - Sök @@ -156,34 +94,16 @@ Skapa ny notering ta bort Lägg till anteckning - Återställ - Aktiverad - Obligatoriska fält saknas - Några obligatoriska fält saknas. Om du vill gå tillbaka nu raderas alla sparade uppgifter. - Ta bort och gå tillbaka - Sektion lista - %s frågor av %s slutförd - %s av %s klart - Slutför och stäng - Dagar - Månader - År - Veckor infall datum - Resultat på denna enhet - Online resultat Tidigare program Du har antagligen inte den nödvändiga behörigheten för att utföra åtgärden. - Lägg till som ... - Klar Period - (%d) Organisationsenhet Välkommen till DHIS2 Här kan du se dina program Du kan använda ett filter... @@ -192,15 +112,11 @@ Kontrollera andra åtgärder i huvudmenyn - Skapa relation Nästa Du måste ange minst %d av attributen för att göra en sökning - Det finns mer än %d resultat. Vänligen ange ytterligare sökkriterier - Definiera sökkriterier Importerar QR data - Spara ok Identifikation Attribut @@ -212,85 +128,37 @@ inget data Ogiltig QR-kod Det här attributet kan inte läggas till - Denna inskrivning kan inte läggas till Handla om Program för att registrera - markera allt - Det finns ingen information för de valda filteren. Var god försök ändra dem. Dela med sig Dela QR - Sök efter typ är inte möjlig för online-sökning\nVälj ett program från listan. - max - AKTUELL TEI - Begränsa per organisationsenhet - Programlista Återställ app - Det är inte möjligt att lägga till denna relationen Kolla detta! - Varning - Fel Spara - Vill du lägga till fler data från QR? App version: %s SDK Version: %s Ansluten till: %s Aktuell användare: %s - Lösenordet saknas. Vänligen fyll i detta fält. - Användarnamnet saknas. Vänligen fyll i detta fält. - Den här servern kör en dhis-version som skiljer sig från 2.29. Uppdatera din serverversion eller använd testmiljön för att fortsätta. - Något gick fel. Kontrollera att serveradressen, användarnamnet och lösenordet är korrekta och försök igen. - Servern kunde inte slutföra denna begäran. - Ett problem uppstod när du försökte logga in på servern - Inloggningsfel - Obligatoriska fält saknas - Oväntat fel vid sökning online - Fel vid tolkning av resultat - Online-sökning gav ett fel - Något gick fel på servern Välj ett program för att aktivera registrering Du har inte behörig behörighet - Den här funktionaliteten är inte klar än. - Ett fel uppstod vid återhämtning av relationsbeskrivning Alla %s Detta är inte ett giltigt telefonnummer - Det här är inte en giltig e-postadress - Endast negativa siffror är tillåtna Endast positiva tal eller noll tillåts - Endast positiva siffror är tillåtna - Endast värden från 0 till 1 är tillåtna - Endast värden från 0 till 100 är tillåtna - Välj datum för att filtrera Välj alternativ - Problem rapporterat - Skapa ny händelse - Vill du skapa en annan händelse? Avslutade händelser Alla händelser i detta program är avslutade. Vill du stänga programmet också? Kontrollera Hem relationer - Relationer - indikatorer - detaljer - indikatorer Vänta - Tabell - Acceptera - Server URL Varning Stänga - Färdigt - Öppen - Dagligen - Varje vecka - Avklarad Period - Status Synkronisera Denna vecka Förra veckan @@ -302,18 +170,12 @@ Gå tillbaka dataset Synkroniseringsfel - detaljer - Namn Händelsestatus - inskrivning datum Öppen Färdigt Avbruten - Data Datum - Händelse datum Gå tillbaka - Stänga diagram Karta program @@ -330,18 +192,11 @@ Föregående räkenskapsår Återkoppling indikatorer - Värde - Felaktiga uppgifter - Värdet måste vara ett heltal - Tillgängliga - Okänd - Skapa ny Skicka program Synkroniseringsfel koordinater Schemalagd - Frivillig Visa mer Visa mindre Synkronisera diff --git a/app/src/main/res/values-tet/strings.xml b/app/src/main/res/values-tet/strings.xml index 540830eb8e2..fa1843ddc6b 100644 --- a/app/src/main/res/values-tet/strings.xml +++ b/app/src/main/res/values-tet/strings.xml @@ -1,10 +1,6 @@ Erru - Aumenta foun - Aumenta - Utilizador nia Naran - Seña Restaurasaun konta Diáriu @@ -17,59 +13,35 @@ Erru - Kria Atualiza - Data Kansela Soe Edita - Laiha dadus Pájina inisial Kansela Konfigurasaun Estadu - Fulan - Tinan - Semanas - Hamós Períodu Próximu - Rai OK Konabá Partilla - Max - Avizu - Erru Rai Hili opsaun Pájina inisial - Indikadores - Detalles - Indikadores Favor hein - Tabela Avizu Taka - Kompletu - Diáriu - Semanal Períodu - Estadu Semana kotuk Fulan kotuk Seluk Fila ba kotuk Pakote dadus - Detalles - Naran Kompletu - Dadus - Itabo\'ot iha duni serteza kah?? Data Fila ba kotuk - Taka Mapa Detalles Tina ida ne\'e @@ -82,9 +54,5 @@ Tinan finanseiru kotuk Feedback Indikadores - Valor - Disponível - Deskoñesidu Haruka - Opsional diff --git a/app/src/main/res/values-tg/strings.xml b/app/src/main/res/values-tg/strings.xml index f892302b8c5..26a8c8b15c5 100644 --- a/app/src/main/res/values-tg/strings.xml +++ b/app/src/main/res/values-tg/strings.xml @@ -2,10 +2,6 @@ Хатогӣ Рӯйдодҳо - Иловаи нав - Илова кардан - Номи корбар - Парол Барқароркунии ҳисоб Ҳаррӯза @@ -21,10 +17,7 @@ Хатогӣ - Сохтан Навсозӣ - Сана - Имкони категория Тӯл Арз @@ -35,56 +28,32 @@ Нест кардан Таҳрир - Ягон иттилоот нест Саҳифаи асосӣ Бекор кардан Танзимот Ҳолат - Санаи номнавис - Ҷустуҷӯ Санаи ҳисобот - Моҳҳо - Солҳо - Ҳафтаҳо - Пок кардан Давра Навбатӣ - Захира кардан OK Нишонаҳо Рӯйдодҳо Дар бораи Мубодила - Макс - Ҷорӣ - Огоҳӣ - Хатогӣ Захира кардан Саҳифаи асосӣ Қиматҳои иттлоот - Индикаторҳо - Маълумоти муфассал - Индикаторҳо Лутфан мунтазир шавед - Ҷадвал - Идома додан Огоҳӣ Пӯшидан - Анҷом ёфт - Ҳаррӯза - Ҳафтаина - Анҷомёфта - Фиристодашуда - Иҷро нашуд Бисёркунҷа Давра - Ҳолат Имрӯз Дирӯз Ҳафтаи гузашта @@ -95,17 +64,9 @@ Ба ҷафо равед Маҷмӯъҳои иттилоот Дирӯз - Маълумоти муфассал - Ном - Формула - Санаи номнавис Анҷом ёфт - Иттилоот - Иҷро шуд - Оё боварӣ доред? Сана Ба ҷафо равед - Пӯшидан Харитаҳо Барномаҳо Ворид кардани иттилоот @@ -119,14 +80,9 @@ Соли молиявии гузашта Изҳори назар Индикаторҳо - Қимат - Қимат бояд адади бутун бошад - Мавҷуда - Номаълум Фиристодан Таҷдид Барномаҳо Координатаҳо Ҷадвал - Ихтиёрӣ diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index aa67ed0f9a5..85265728a2e 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -1,65 +1,29 @@ Dhis2 - dhis - 2 Помилка - - Помилка - Помилки - Помилки - Помилки - - Помилка в URL адресі - Неправильні облікові дані - Неочікувана помилка - Помилка серверу - немає значення Більше немає зарезервованих значень. Зверніться до свого системного адміністратора - Більше немає зарезервованих значень. Щоб поповнити їх, підключіться до мережі - помилки Сталася помилка - Синхронізувати зараз - Синхронізація із сервером - Синхронізування - Метадані Події - Об’єкти, які відстежуються - - Завершено - Синхронізацію завершено Помилка синхронізації Під час синхронізації сталася помилка. Будь ласка, повторіть спробу. Синхронізацію завершено, але ми не отримали підтвердження від серверу для усіх записів. Ці записи все ще позначено як \"офлайн\" у програмі. Рекомендуємо повторити спробу синхронізації. - Сталася помилка, і сервер не відповідає. Зверніться до свого адміністратора. - %s результатів знайдено - Додати нове - Додати Введіть %s Ввести / Пропустити %s - Запланувати нове Направлення - URL-адреса серверу - Ім\'я користувача - Пароль - Увійти - Розблокувати сесію Синхронізація Вашої конфігурації Ваші дані незабаром буде синхронізовано Синхронізація Ваших даних Ваша конфігурація готова Ваші дані готові - Помилка синхронізації конфігурації - Помилка синхронізації даних Відновлення облікового запису - Для відновлення облікового запису потрібне підключення до мережі. Щодня @@ -79,135 +43,80 @@ Введіть текст Введіть довгий текст Введіть номер - Введіть ціле число Введіть ціле від’ємне число Введіть додатне число або нуль Введіть додатне число - Параметри фільтру Оберіть дату - Змінити календар - Програму завершено - Програма неактивна Відкрити Не завершено Подія завершена Тільки читати - Закінчити і завершити Завершено Скасовано - Активувати Активно Синхронізація Надіслати Оновити - Видалити Помилка - СИНХРОНІЗАЦІЯ - НАДІСЛАТИ - СИНХРОНІЗАЦІЯ ЧЕРЕЗ SMS - Завершення - Створити Оновити - Дата Організаційний підрозділ На вибрану дату немає відкритих організаційних підрозділів. Виберіть іншу дату або інший організаційний підрозділ. - Опція категорії Широта Довгота - Нова подія - Одноразово - Постійно Звітний період - Параметр категорії - Якщо Ви встановлюєте значення, то щодо усього рядка потрібно вказати всі значення, щоб завершити набір даних. - Деякі необхідні значення відсутні. Потрібно встановити обов’язкові значення, щоб заповнити набір даних. - Обов\'язкові поля не заповнені. Будь ласка, заповніть їх, щоб завершити набір даних. - Значення збережено! - Немає доступних періодів для вибору. Дата виконання Комбінація категорій - ДД/ММ/РРРР Скасувати Видалити - Підсумок Дата останнього випадку Немає доступних опцій Активні програми - Програми для реєстрації Зареєструвати - Останній візит: - застосувати - Подивитись подробиці - ДИВИТИСЬ БІЛЬШЕ Редагувати - Подальші дії - Подальші дії увімкнено - Подальші дії вимкнено Деактивувати Ця програма не дозволяє мати більше випадків - Немає даних випадки Головна - Інформація про додаток Вийти з системи - Заблокувати сесію Показати %s більше... Показати менше... - 1 хвилина - 15 хвилин 30 хвилин 1 година 6 год 1 день (за замовчуванням) 12 год - Автоматична синхронізація даних кожні: Вручну - Автоматична синхронізація конфігурації кожні: 1 тиждень - Поточні параметри синхронізації: - Установити за замовчуванням Базу даних буде видалено. Вам буде запропоновано увійти знову. Прийняти Скасувати СИНХРОНІЗУВАТИ дані зараз СИНХРОНІЗУВАТИ конфігурацію зараз Налаштування - Дата останньої синхронізації: %s - Дата останньої синхронізації: %s Поповнити - SMS модуль: SMS шлюз Результат SMS відправнику - секунд - номер - номер Увімкнути надсилання SMS Дочекайтеся відповіді щодо результату SMS - - Є програма %s зі специфічними налаштуваннями - Є програми %s зі спеціальними налаштуваннями - Є програми %s зі спеціальними налаштуваннями - Є програми %s зі спеціальними налаштуваннями - Налаштування застосовуються Всюди за програмою @@ -225,8 +134,6 @@ Цей журнал містить усі помилки, спричинені синхронізацією Ваших даних і метаданих. Видалити локальні дані Усі дані, що зберігаються на Вашому пристрої, буде видалено. Дані, які не синхронізовані із сервером, буде втрачено. - Скинути дані програми та конфігурацію - Вашу конфігурацію та дані додатку, що зберігаються на пристрої, буде видалено. Вас потрібно увійти знову, і дані, які не синхронізовані із сервером, будуть втрачені. Налаштування SMS Перевірте та відредагуйте параметри, що стосуються SMS-шлюзу Оновлення додатку @@ -235,8 +142,6 @@ Статус - Дата реєстрації - Пошук @@ -245,43 +150,19 @@ Написати нову примітку очистити Додати нотатку - Повернути - Активовано - Не заповнено обов\'язкові поля - Деякі обов’язкові поля не заповнено. Якщо Ви хочете повернутися зараз, уся збережена інформація буде видалена. - Деякі обов’язкові поля не заповнено. Якщо Ви хочете повернутися, заповніть їх. - Деякі поля потребують Вашої уваги. Бажаєте переглянути форму? Ваші дані не збережено - Якщо Ви зараз повернетеся назад, уся введена інформація буде видалена. - Видалити та повернутися назад - У деяких полях є помилки:%s Будь ласка, перевірте їх. - Деякі обов’язкові поля не заповнено. Ви можете завершити введення даних і вийти, але випадок не може бути завершений. Координати для - Список розділів - %s питань %s виконано - %s з %s завершено - Завершити та закрити - Дні - Місяці - Роки - Тижні Дата інциденту - Локальні результати - Онлайн результати Минулі програми Ви не маєте необхідного дозволу для виконання цієї дії - Додати як… - Очистити Період - (%d) Організаційний підрозділ - Рівень %d Ласкаво просимо до dhis2 Тут Ви можете бачити свою активність Ви можете застосувати фільтр… @@ -290,16 +171,11 @@ Перевірте інші дії в головному меню - Створити зв’язок Наступне Для пошуку потрібно ввести принаймні %d атрибутів - Для пошуку потрібно ввести принаймні один із атрибутів - Є більше ніж %d результатів. Будь ласка, введіть додаткові критерії пошуку - Введіть критерії пошуку Імпорт QR-даних - Зберегти ОК Ідентифікація Атрибути @@ -311,33 +187,18 @@ немає даних Невірний QR-код Цей атрибут не можна додати - Цю реєстрацію не можна додати Про Програми для реєстрації - обрати усі - очистити вибір - Немає інформації для вибраних фільтрів. Будь ласка, спробуйте змінити їх. Поділитися Поділитись QR - Пошук за типом неможливий для онлайн-пошуку. Будь ласка, оберіть програму зі списку. - Макс - Поточний Об’єкт, який відстежується Об’єкти, які відстежуються - Обмеження за організаційним підрозділом - Обмеження за програмою - Список програм Скинути дані програми & конфігурацію - Неможливо додати цей зв’язок Перевірити це! - Попередження - Помилка Зберегти Зарезервовані значення - Бажаєте додати більше даних із QR? - Версія додатку: %s Версія SDK: %s @@ -348,144 +209,44 @@ Розроблено та підтримується DHIS2 проєктом, який є частиною Університету Осло, факультету інформатики . Щоб отримати додаткову інформацію або отримати відповіді на запитання щодо цієї програми, напишіть на android@dhis2.org - Пароль відсутній. Будь ласка, заповніть це поле. - Ім\'я користувача відсутнє. Будь ласка, заповніть це поле. - На цьому сервері працює інша версія dhis, ніж 2.29. Щоб продовжити, оновіть версію сервера або скористайтеся середовищем тестування. - На цьому сервері працює версія dhis, що відрізняється від %s. Щоб продовжити, оновіть версію сервера або скористайтеся середовищем тестування. - Сталася помилка. Будь ласка, перевірте правильність URL-адреси сервера, імені користувача та пароля і повторіть спробу. - Сервер не зміг виконати цей запит. - Виникла проблема під час спроби входу на сервер. - Помилка входу - Не заповнено обов\'язкові поля - Неочікувана помилка під час пошуку онлайн - Помилка аналізу результатів - Пошук онлайн спричинив помилку - Сталася помилка на сервері Оберіть програму, щоб розпочати реєстрацію Ви не маєте необхідного дозволу - Ця функція ще не готова. - Помилка при отриманні примітки зв’язку Усі %s Це недійсний номер телефону - Ця електронна адреса невірна - Допускаються лише від’ємні числа Дозволені лише додатні числа або нуль - Допускаються лише додатні числа - Допускаються лише значення від 0 до 1 - Допускаються лише значення від 0 до 100 - Обрати дати для фільтрування Обрати опцію - Про проблему повідомлено - Створити новий випадок - Ви хочете створити інший випадок? Завершені випадки Усі випадки цієї програми завершено. Ви бажаєте закрити також і програму? - Бажаєте також завершити реєстрацію? Перевірка Головна ПРИКЛАД - Додати віджет Показати допомогу - Синхронізація Ваших даних… - ...Вашої конфігурації... - …встановити, скільки записів завантажувати із сервера… - Перевірка та управління кількістю зарезервованих значень, які залишились - Перевірка, чи при підключенні до серверу сталась помилка - Звільнити місце на диску - …або видалити усе, щоб почати спочатку. - Знаходження усіх об\'єктів, які відстежуються, як на локальному пристрої, так і на онлайн-сервері. - Ви можете перемикатися на інші програми - Пошук або додавання нових об’єктів. Вам потрібно виконати пошук, перш ніж додати новий! - Натисніть тут, щоб очистити поля та перезапустити пошук. Це інформаційна панель об\'єкту, який відстежується Переглянути інформацію про профіль об\'єкту, який відстежується… - … Поділитись інформацією за допомогою QR-коду або SMS… - …Або позначити об\'єкт, який відстежується, для подальших дій - Натисніть, щоб створити або запланувати випадок або зробити перенаправлення до іншого організаційного підрозділу. Тут Ви побачите усі випадки. Натисніть, щоб переглянути деталі випадку. Скористайтесь меню, щоб додати зв’язки, переглянути індикатори або написати примітки. - Натисніть, щоб переглянути усі реєстрації Вашого об\'єкту, або створити нову. - Натисніть, щоб видалити цей випадок. Цю дію не можна скасувати. - Завершити випадок. - Тут будуть перераховані всі випадки, які пов’язані з цією програмою. - Натисніть, щоб додати новий випадок Введіть усі дані для створення випадку Натисніть, щоб перевірити статус завершення випадку. - Натисніть, щоб завершити або повторно відкрити випадок - Читайте та зберігайте інформацію з інших пристроїв за допомогою QR - Синхронізуйте свої дані з сервером - Заблокуйте сесію 4-значним кодом. Не забудьте свій код! - Вийдіть, щоб змінити користувача або адресу серверу. Ви зможете увійти знову, навіть якщо немає підключення до Інтернету. - %s: зв\'язки Немає зареєстрованих випадків, натисніть «+», щоб додати новий. - Немає зареєстрованих випадків. Значення даних Інформація Не вдалося прочитати цей ідентифікатор Видалити локальні дані Огляд - Зв\'язки - Показники - Аналітика Індикаторів для цієї програми немає. - Нотатки - Не вдалося завершити - Не вдалося зберегти - Форма містить попередження - Що би Ви хотіли зробити? - У деяких полях є помилки. Будь ласка, перевірте їх, щоб мати можливість завершити Усі реєстрації Показати інформаційну панель з усіма активними програмами - Відкрити журнал помилок синхронізації Журнал помилок синхронізації Поділитися з... - Помилка синхронізації конфігурації. На Вашому сервері можуть бути помилки. Натисніть тут для отримання додаткової інформації. - ПОПЕР - ДАЛІ - Деталі - Показники - Нотатки - - Завершити пізніше - - Закінчити - Поля з помилками - У деяких полях є помилки. Вони не збереглися. Будь ласка, перевірте їх. Значення має бути унікальним, знайдено збіг. Значення не збереглось. Будь ласка, перевірте це. - Виявлено збіг в унікальному полі. Будь ласка, перевірте форму, щоб зберегти реєстрацію. Будь ласка, почекайте Пропустити - Перепланувати Для цієї частини немає інформації - Прострочене - Є одне правило програми, яке не підтримується. Будь ласка, зверніться до інструкції - Немає інформації для цього поля - Порожні облікові дані - Щоб мати можливість увійти за допомогою сканера відбитків пальців, спочатку потрібно використовувати спосіб за замовчуванням - Біометрична безпека - Таблиці - Таблиця - https:// Несинхронізовані дані буде втрачено. Ви дійсно хочете продовжити? - Прийняти Не вдалося видалити дані. Будь ласка, повторіть спробу. Видалення локальних даних успішно завершено. - Необхідно вибрати принаймні один організаційний підрозділ - Надіслати дані - Допоможіть DHIS2 покращити цей додаток, поділившись журналами помилок, пов’язаними з Вашим ідентифікатором користувача. - Ви хочете допомогти нам покращити цю програму? - Якщо ви погодитесь, застосунок надсилатиме анонімну статистику та журнали помилок, що допоможе нам покращити якість і продуктивність користувацького досвіду. Докладніше - у нашій політиці конфіденційності. - Перевірте поля - Під час синхронізації конфігурації з’єднання з Інтернетом було втрачено. Будь-ласка спробуйте пізніше - Погодитись - Продовжити - URL-адреса серверу - Введіть URL-адресу серверу DHIS 2 для Вашої організації, надану Вашим системним адміністратором. Альтернативно, Ви можете відсканувати QR-код, що містить URL-адресу Вашого сервера - Забули код? - Що б Ви хотіли зробити для цього випадку? - КІН %s не знайдено Запис, до якого Ви намагаєтеся отримати доступ, недоступний. Ви б хотіли його пошукати? Синхронізовано через SMS @@ -493,33 +254,16 @@ Завантаження Зв\'язок Надіслано через SMS - Для цієї програми немає конфліктів - Підключення до мережі недоступне, але, схоже, є телефонні послуги - можна використовувати SMS. - Підключення до мережі недоступне. Закрити Тепер Ви можете перевірити інформацію про синхронізацію, натиснувши тут - Ці дані зберігаються лише на Вашому пристрої, вони не синхронізуються із сервером. - Дані оновлено! Усі Ваші дані надіслано на сервер. Ви не можете пов\'язати запис із самим собою - Розблокувати сесію - Завершити - Відкрити - Тип значення, що не підтримується Змінити вид календаря - 15 хвилин - Щогодини - Щодня - Щотижня - Тиждень - Налаштування синхронізації: %s Запис, до якого Ви намагаєтеся отримати доступ, не зареєстрований. Ви не можете отримати доступ до інформаційної панелі. Помилка форматування Видалити %s Ви не маєте повноважень видаляти цей запис - Це недійсна URL-адреса Коригування форми… - Номер одержувача Чи підтверджуєте надсилання %dповідомлень ? Надсилання %1$d/%2$d Очікування обсягу підтвердження - %d @@ -537,51 +281,29 @@ Шлюз не встановлено Користувач не ввійшов у систему SMS модуль вимкнено - Триває надсилання ще одного SMS Модуль SMS не запущено, необхідні метадані не знайдені - Завершено Підрахунок SMS не приймається Розпочато відправку SMS Дані зчитано та конвертовано. Ідентифікатор подання: %d - Помилка надсилання SMS-повідомлення Реєстрація об\'єкту, який відстежується, та випадку за допомогою SMS Надсилання випадку через SMS Надсилання набору даних через SMS - Початок - Виконується - Надіслано - Помилка - Початок синхронізації. Синхронізація... - Синхронізацію завершено. - Під час синхронізації сталася помилка. - Під час синхронізації сталася помилка. Натисніть тут, щоб перевірити журнали помилок - Синхронізацію скасовано. Скопійовано - Зображення обрано - Показати на карті - Показати списком - %s є обов’язковим, але не заповнено. - Зафіксовано багатокутник Багатокутник - Відбиток пальця - Будь ласка, піднесіть палець до сканеру відбитків пальців. Безпека З міркувань безпеки цю версію додатку не можна використовувати на пристроях з кореневим доступом. Будь ласка, використовуйте навчальну версію. - Є деякі помилки. Перш ніж продовжити, виправте їх. Застосовано фільтри Фільтрів не застосовано Період Орг. підрозділ - Сортування - Статус Синхронізація Призначено мені Сьогодні @@ -596,25 +318,18 @@ Від - До Інше Будь-коли - Помилка синхронізації. Помилка синхронізації. Перевірте значення даних, щоб спробувати вирішити проблему, і повторіть спробу. Якщо збій продовжується, зверніться до системного адміністратора - Ці дані були надіслані на сервер, але їх збереження не гарантовано Відкрити Запланувати Прострочено Відвідано Завершено Пропущено - Випадки:%sмакс:%s%sпоточн:%s Об\'єкти:%sмакс:%s%sпоточн%s - Налаштування обмежено%sВипадки: %s/%s Об\'єкти: %s/%s - Приховати дані реєстрації - Показати дані реєстрації SMS-модуль включений SMS-модуль відключений Завантаження даних для модуля SMS. Будь ласка, зачекайте SMS-шлюз не може бути порожнім Немає реєстрацій для завантаження Цей convertTask не підтримується - Більше не показувати екран блокування Встановити PIN Помилка Змінити дату @@ -639,11 +354,7 @@ Оберіть організаційний підрозділ Введіть URL-адресу Введіть значення - Оберіть зображення - Сканувати код - Оберіть варіант Зарезервовані значення, завантажені для атрибута об\'єкту - Зарезервовані значення, завантажені для атрибута об\'єкту %s залишилося зарезервованих значень Управління зарезервованими значеннями Випадків для завантаження @@ -663,57 +374,28 @@ Не синхронізовано Помилка синхронізації Синхронізовано через SMS - Деталі - Коментарі Збережено! - Хочете перевірити якість даних\? - Все виглядає добре! - Ви бажаєте також завершити набір даних\? - Позначити як виконане - Ім\'я - Формула - Все одно завершити Відсутній %s %s від %s %s Статус випадку - Дата реєстрації Немає даних. Натисніть «+», щоб додати новий запис Немає даних. Ви не маєте дозволу додавати нові записи. Немає опису чи інструкції Дані для перегляду - Збережено та завершено! Вже є активна реєстрація Відкрити Завершити Скасовано - Дані Не вдалося завантажити вибраний %s. - Виконано з %s: %s - Оновлено: %s - Обрати - Ми не змогли перевірити якість даних. Зверніться до свого адміністратора - Чи Ви впевнені? - Хочете знову відкрити набір даних? Дата - Дата випадку - %s не має публічних атрибутів. Виберіть програму Політика конфіденційності Натисніть тут, щоб ознайомитися з нашою політикою конфіденційності - Значення координат недійсні - Ви не можете зареєструвати об\'єкт, який відстежується, з інших організаційних підрозділів у цій програмі, оскільки вона закрита для Вас. Зверніться до свого адміністратора. Ви не можете зареєструвати %s з інших організаційних підрозділів у цій програмі, оскільки вона закрита для Вас. Зверніться до свого адміністратора. Це поле обов\'язкове для заповнення З міркувань безпеки цю версію додатку не можна використовувати з adb. Будь ласка, використовуйте навчальну версію. Повернутися - Закрити додаток - Детальніше - Детальніше - Закрити Копіювати в буфер обміну - Скопійовано до буферу обміну - Інформація про помилку Ми знайшли помилку під час синхронізації з Вашим сервером. Якщо можливо, повідомте про помилку системному адміністратору. - Нам не вдалося почати сесію із Вашим користувачем Є заплановані випадки, які не будуть перенесені Діаграми Список @@ -762,47 +444,26 @@ Відгук Показники Відмовлено у використанні камери. Вам потрібно ввімкнути цей дозвіл, щоб використовувати цю функцію. - Значення Діаграми та індикатори Зробити фото - Обрати з галереї - Готово! Ця програма закрита для Вас Опишіть причину тут - Автентифікація - Надана URL-адреса сервера не є екземпляром dhis - Неправильні облікові дані - Невідомий сервер - Значення має бути цілим числом Сесія неактивна Ваша поточна сесія неактивна. З міркувань безпеки Вам потрібно знову ввести свої облікові дані - Значення Тиждень %d %s до %s Не показувати знову Конфігурація функції Показати як діаграму Радар - Неможливо встановити тип координат Для подальших дій %s - %s не можна проаналізувати як дату Це поле не вдалося оновити. Будь ласка спробуйте ще раз - Версія - Доступно Ці дані не можна редагувати, оскільки вони позначені як завершені Ці дані не можна редагувати, оскільки час їх редагування минув Ви не маєте дозволу редагувати ці дані Ці дані не можна редагувати, оскільки організаційний підрозділ закрито Ви не маєте дозволу редагувати ці дані Ви не можете редагувати дані з цього організаційного підрозділу - Скинути пошук Онлайн-пошук дав таке повідомлення: - Попередження про правила програми - Існує проблема конфігурації, яка спричиняє помилку у правилах. Зверніться до адміністратора. - ОНОВИТИ - Невідомо - Оновити всі дані - Ви досягли максимальної кількості акаунтів (%d). Щоб додати новий обліковий запис, увійдіть і видаліть один із своїх облікових записів Видалити обліковий запис - Управління обліковими записами Усунення несправностей конфігурації Мова Натисніть тут, щоб змінити мову додатку @@ -821,9 +482,7 @@ Для цього пошуку результатів немає Забагато результатів Спробуйте змінити пошук, щоб звузити результати. - Створити новий Новий 1%s - Для пошуку необхідно ввести хоча б %s атрибут OK Почніть пошук, щоб знайти будь-який %s Ви можете знайти або створити новий %s @@ -831,7 +490,6 @@ Деякі поля містять помилки і не були збережені. Бажаєте переглянути форму? Ви бажаєте позначити цю форму як завершену? У вас є кілька повідомлень про помилки. Бажаєте їх переглянути? - Якщо Ви зараз вийдете, зміни буде скасовано. Відкрито знову Обліковий запис вимкнено Ваш обліковий запис було вимкнено адміністратором. @@ -841,18 +499,8 @@ Поточна дата: %s Пристрій: %s Версія ОС: %s - Відкрити деталі %s - %s Деталі Синхронізація %s… - SMS відправлено. Очікування відповіді серверу. - SMS підтверджено на сервері. Оновлення статусу - Ми не можемо підтвердити, що SMS надійшло на сервер. Оновлення статусу - SMS відправлено. Оновлення статусу. - SMS не відправлено. - Відкриття програми SMS. Будь ласка, не змінюйте повідомлення. Надіслати SMS за допомогою - Очікується підтвердження вручну - Синхронізація подій Зареєстровано в: Власник: Потрібна синхронізація @@ -862,7 +510,6 @@ Не зараз Оновлення додатку Перевірити оновлення - Перевірка оновлень Оновлення відсутні Версія додатку Не синхронізовано @@ -882,15 +529,18 @@ Введіть %1$s Етап програми подія - Очистити пошук - Необов\'язково Показати більше Показати менше Синхронізація - Показати поля - Приховати поля Синхронізація %s… Показати опис Приховати опис Перевести - + + + Є програма %s зі специфічними налаштуваннями + Є програми %s зі спеціальними налаштуваннями + Є програми %s зі спеціальними налаштуваннями + Є програми %s зі спеціальними налаштуваннями + + diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index 8afc2fd4f7a..700f6f8054b 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -1,15 +1,9 @@ غلطی - میٹا ڈیٹا تقریبات - نیا شامل - اضافہ - نیا شیڈول حوالہ دیتے ہیں - صارف کا نا٠- پاسورڈ اکاؤنٹ بحالی روزانہ @@ -23,26 +17,19 @@ صرف دیکھنے کی حد تک مکمل منسوخ - چالو کریں فعال غلطی - پروگرام کا مرحلہ - تخلیق اپڈیٹ - تاریخ - اختیاری قسم طول لمبائی - نئی تقریب اخری تاریخ منسوخ حذف - کُل کوئی اختیار دستیاب نہیں ہے فعال پروگرام @@ -50,73 +37,38 @@ ترمیم غیر فعال - کوئی مواد نہیں گھر منسوخ ترتیبات حالت - اندراج کی تاریخ - تلاش کریں رپورٹ کی تاریخ نوٹ شامل - دن - مہینے - سال - ہفتوں واقعات کی تاریخ - کلیئر مدت اگلہ - محفوظ ٹھیک خصوصیات تقریبات تعلقات متعلق بانٹیں - زیادہ سے زیادہ - موجودہ - وارنگ - غلطی محفوظ گھر ڈیٹا اقدار - تعلقات - اشارے - تجزیات - نوٹس - تفصیلات - اشارے - نوٹس انتظار کیجئے چھوڑ دو - تجزیہ کریں - زیادہ سے زیادہ - ٹیبل - جاری رہے وارنگ تعلقات بند - مکمل - کھلا - غیر قابل قدر قیمت کی قسم - روزانہ - ہفتہ وار - ہفتہ - مکمل - کام جاری ہے - ناکام کثیر زبان مدت - ترتیب دیں - حالت آج کل اس ہفتے @@ -132,22 +84,12 @@ واپس ڈیٹا سیٹس کل - تفصیلات - تبصرے - نا٠- فارمولہ واقعہ کی حیثیت - اندراج کی تاریخ کھلا مکمل منسوخ - ڈیٹا - ہو گیا - کیا تمہیں یقین ہے؟ تاریخ - واقعہ کی تاریخ واپس - بند چارٹس فہرست نقشہ @@ -172,10 +114,6 @@ آخری مالیاتی سال رائے اشارے - قدر - ویلیو انٹیجر ہونی چاہیے - موجودہ - نامعلوم زبان ٹھیک ہے\! بھیجو @@ -187,7 +125,6 @@ شیڈول شیڈول کردہ پروگرام کا مرحلہ - اختیاری اور دیکھاو کم دکھائیں diff --git a/app/src/main/res/values-uz-rUZ/strings.xml b/app/src/main/res/values-uz-rUZ/strings.xml index c451ecc3382..d0abc9a3f47 100644 --- a/app/src/main/res/values-uz-rUZ/strings.xml +++ b/app/src/main/res/values-uz-rUZ/strings.xml @@ -1,50 +1,24 @@ DHIS2 - DHIS - 2 Xatolik - Server URLi notoʼgʼri - Notoʼgʼri maʼlumot - Kutilmagan xatolik - Serverdagi ichki xatolik Saqlangan boshqa qiymatlar yoʼq. Tizim administratoriga murojaat qiling. - Saqlangan boshqa qiymatlar yoʼq. Ularni toʼldirish uchun tarmoqqa ulaning. Nimadir notoʼgʼri bajarildi - Hozir sinxronlashtiring - Server bilan sinxronlash - Hozir sinxronlash - Metadata Hodisa/tadbirlar - Kuzatuvdagi obʼektlar - - Tugadi - Sinxronlash tugallandi Sinxronlashda xatolik Sinxronlash paytida xatolik yuz berdi. Iltimos, qayta urinib koʼring - 1 %s natijalar topildi - Янгисини қўшиш - Qoʼshish - Yangi reja (jadval) Yoʼnalishlarga - Server URLi - Фойдаланувчи исми - Parol - Kirish - Sessiya ochish Konfiguratsiyangiz sinxronlashmoqda Maʼlumotlaringiz tez orada sinxronlashtiriladi Maʼlumotlaringiz sinxronlashmoqda Sizning yangi konfiguratsiyangiz tayyor Maʼlumotingiz tayyor - Konfiguratsiyani sinxronlash amalga oshmadi - Maʼlumotlarni sinxronlash amalga oshmadi Аkkauntni tiklash Кунлик @@ -62,117 +36,70 @@ Matn kiriting Uzun matn kiriting Sonni kiriting - Butun son kiriting Butun manfiy son kiriting Butun musbat yoki nol sonini kiriting Musbat son kiriting - Filtr variantlari Sanani tanlang - Kalendardan tanlang - Dastur tugallandi - Dastur nofaol Ochiq Faqat oʼqish uchun - Yakunlash va toʼldirish bajarildi Bekor qilindi - Faollashtirish Faol Sinxronlash Yuborish uchun Yangilash uchun - Oʼchirib tashlash uchun Xatolik - SINXRONLАSh - SMSni SINXRONLАSh - Tugatish - Яратиш Янгилаш - Sana Tashkiliy birlik Tanlangan sanalar uchun ochiq Tashkiliy boʼlimlar mavjud emas. Iltimos, boshqa sana yoki boshqa Tashkiliy boʼlimni tanlang. - Kategoriya variantlari Kenglik Kenglik - Yangi tadbir - Bir marta - Doimiy Hisobot davri - Kategoriya varianti - Аgar siz qiymatni oʼrnatgan boʼlsangiz, maʼlumotlar toʼplamini toʼldirish uchun qatordagi barcha qiymatlar boʼlishi lozim. - Baʼzi zaruriy qiymatlar mavjud emas. Maʼlumotlar toʼplamini toʼldirish uchun sizga barcha shart boʼlgan qiymatlar mavjud boʼlishi lozim. - Shart boʼlgan maʼlumotlar yetishmayapti. Maʼlumotlar toʼplamini shakllantirish uchun ularni toʼldiring. - Qiymat saqlandi! - Tanlash uchun yaroqli davr mavjud emas Muddati Kategoriya kombinatsiyasi - KK/OO/YYYY Бекор қилиш Oʼchirib tashlash - Jami Oxirgi tadbir sanasi Variantlar mavjud emas Faol dasturlar - Roʼyxatga olish dasturlari Roʼyxatga kiritish - Oxirgi tashrif - Tafsilotlarni koʼring - KOʼPROQ KOʼRISh Tahrirlash - Kuzatib borish - Kuzatuv yoqilgan - Kuzatuv oʼchirilgan Faolsizlantirish Ushbu dastur yana koʼproq tadbirlarni qabul qilmaydi - Maʼlumot yoʼq Бош саҳифа - Ilova haqida maʼlumot - Sessiyani bloklash - 1 daqiqa - 15 daqiqa 30 daqiqa 1 soat 6 soat 1 kun (standart) 12 soat - Maʼlumotlarni avtomatik sinxronlash, har: Qoʼllanma - Konfiguratsiyani avtomatik sinxronlash, har: 1 hafta - Joriy sinxronlash parametrlari - Standart holatga qaytish Maʼlumotlar bazasi oʼchiriladi. Sizdan qayta kirish soʼraladi. Qabul qiling Бекор қилиш Maʼlumotlarni sinxronlash, hozir Konfiguratsiyani sinxronlang, hozir Sozlamalar - Oxirgi sinxronizatsiya: %s - Oxirgi sinxronizatsiya: %s Toʼldirish - SMS modul: SMS yoʼlak SMS natijalarini yuboruvchi - soniyalar - raqam - raqam SMS yuborishni yoqish SMS natijalar tarqatilishini kutish Sozlamalar cheklangan @@ -192,15 +119,11 @@ Ushbu jurnalda maʼlumotlar va MetaMaʼlumotlarni sinxronlashda vujudga kelgan barcha xatoliklar qayd etilgan Lokal maʼlumotlarni oʼchirib tashlash Qurilmangizda saqlangan barcha Kuzatuv-Nazorat ilovasi maʼlumotlari oʼchirib tashlanadi. Server bilan sinxronlanmagan maʼlumotlar yoʼqotiladi. - Ilova maʼlumotlarining asl standart holatini tiklash; konfiguratsiya - Qurilmangizda saqlangan konfiguratsiya va Ilova maʼlumotlari oʼchiriladi. Sizdan qayta tizimga kirish soʼraladi. Server bilan sinxronlanmagan maʼlumotlar yoʼqotiladi. SMS sozlamalari SMS shlyuzi bilan bogʼliq parametrlarni tekshiring va tahrirlang Status - Qayd qilingan sana - Izlash @@ -209,42 +132,19 @@ Yangi eslatma yozing aniq Izoh qoldirish - Qaytish - Faollashtirildi - Majburiy maydonlar qoldirib ketilgan - Baʼzi majburiy maydonlar qoldirib ketilgan. Аgar hozir orqaga qaytsangiz, barcha saqlangan maʼlumotlar oʼchib ketadi. - Baʼzi majburiy maydonlar qoldirib ketilgan. Аgar orqaga qaytmoqchi boʼlsangiz, Iltimos, ularni toʼldiring. Maʼlumotingiz saqlanmadi - Аgarda hozir orqaga qaytsangiz, barcha kiritilgan maʼlumotlar oʼchiriladi. - Oʼchirib tashlash va orqaga qaytish - Baʼzi maʼlumotlarda xatoliklar mavjud: \n%s\. Iltimos, ularni tekshiring. - Baʼzi majburiy maydonlar qoldirib ketilgan. Siz maʼlumotlarni kiritishni yakunlab chiqishingiz mumkin. Аmmo bu holda hodisa/tadbirni yakunlab boʼlmaydi. Uchun koordinatalar - Boʼlimlar roʼyxati - %s savollardan %s bajarildi - %s dan %s bajarildi - Yakunlash va yopish - Kunlar - Oylar - Yillar - Haftalar Hodisa sanasi - Lokal natijalar - Onlayn natijalar Аvvalgi dasturlar Ushbu amalni bajarish uchun sizda zaruriy ruxsat yoʼq - Sifatida qoʼshish... - Аниқ davr - (%d) tashkiliy boʼlimi - %d darajasi DHIS2 ga Xush kelibsiz Bu yerda щz faoliyatingizni kuzatishingiz mumkin Filtrni щzgartirishingiz mumkin @@ -253,16 +153,11 @@ Аsosiy menyudan boshqa harakatlarni tekshirish - Oʼzaro aloqa munosabatlarni yaratish Кейинги Qidiruv uchun kamida %d atributni kiritish kerak - Qidiruv uchun kamida 1 ta atributni kiritish kerak - %d dan ortiq natijalar mavjud. Iltimos, qoʼshimcha qidiruv mezonlarini kiriting - Qidiruv mezonlarini kiriting QR qurilmalarni import qilish - Saqlash OK Identifikatsiya Аttributlar @@ -274,33 +169,18 @@ maʼlumotlar yoʼq QR kod yaroqsiz Ushbu atributlarrni qoʼshib boʼlmadi - Ushbu qaydlarni qoʼshib boʼlmadi Ҳақида Roʼyxatga olish dasturlari - hammasini belgilash - aniq tanlov - Tanlangan filtrlar uchun maʼlumot yoʼq. Iltimos, ularni oʼzgartirib koʼring. Улашиш QR ni ulashish - Onlayn qidiruvda turlar boʼyicha qidirish mumkin emas. \n Iltimos, dasturni roʼyxatdan tanlang. - Максимум - Joriy TEI TEI lar - Tashkiliy boʼlimlar orqali chegaralash - Dastur orqali chegaralash - Dasturlar roʼyxati Ilova maʼlumotlarining asl standart holatini tiklash; konfiguratsiya - Ushbu oʼzaro munosabatlarni qoʼshib boʼlmaydi Buni tekshiring! - Ogohlantirish - Xatolik Saqlash Himoyalangan qiymatlar - QR dan koʼproq maʼlumotlarni qoʼshmoqchimisiz? - Ilova versiyasi: 1 %s SDK versiyasi: 1 %s @@ -311,166 +191,57 @@ Oslo Universiteti tomonidan ishlab chiqilgan va qoʼllab quvvatlanadigan DHIS2 loyihasi Ushbu dastur haqida qoʼshimcha maʼlumot yoki savollar uchun android@dhis2.org elektron manziliga yozing - Parol qoldirib ketilgan, Iltimos, ushbu maydonni toʼldiring. - Foydalanuvchi ismi qoldirib ketilgan. Iltimos, ushbu maydonni toʼldiring. - Ushbu server 2.29 dan farqli versiyani ishlatmoqda. Server versiyasini yangilang yoki davom etish uchun sinov muddatidan foydalaning. - Ushbu server %s dan farqli versiyani ishlatmoqda. Server versiyasini yangilang yoki davom etish uchun sinov muddatidan foydalaning. - Nimadir notoʼgʼri bajarildi. Server URL manzili, foydalanuvchi nomi va parol toʼgʼri ekanligini tekshiring va qaytadan urining. - Server ushbu soʼrovni bajara olmadi. - Serverga kirishga xatolik yuz berdi. - Kirish xatosi - Majburiy maydonlar qoldirib ketilgan - Onlayn qidiruvda kutilmagan xatolik - Natijalarni tahlil qilishda xatolik yuz berdi - Onlayn qidiruvda xattolik yuz berdi - Serverda xatolik yuz berdi Roʼyxatdan oʼtishni yoqish uchun dasturni tanlang Sizda kerakli ruxsat yoʼq - Ushbu funktsiya hali tayyor emas. - Oʼzaro aloqalar yorligʼini olishda xatolik yuz berdi Barchasi %s Bu yaroqli telefon raqami emas - Bu yaroqli elektron pochta manzili emas - Faqat manfiy raqamlarga ruxsat beriladi Faqat musbat raqamlar yoki nolga ruxsat beriladi - Faqat musbat raqamlarga ruxsat beriladi - Faqat 0 dan 1 gacha boʼlgan qiymatlarga ruxsat beriladi - Faqat 0 dan 100 gacha boʼlgan qiymatlarga ruxsat beriladi - Filtrlash uchun sanalarni tanlang Variant tanlang - Muammo haqida xabar berildi - Yangi hodisa/tadbir yaratish - Haqiqatdan ham boshqa hodisa/tadbir yaratmoqchimisiz? Hodisa/Tadbir Tugallandi Ushbu dasturdagi barcha hodisa/tadbirlar yakunlandi. Haqiqatdan ham ushbu dasturni yopishni xoxlaysizmi? - Haqiqatdan ham roʼyxatdan oʼtishni tugatmoqchimisiz? Tekshiring Бош саҳифа MISOL - Vidjet qoʼshish Yordam bering - Maʼlumotlaringizni soxtalashtiring... - ...sizning konfiguratsiyangiz... - ...serverdan qancha yozuvlarni yuklab olish kerakligini belgilang... - Qancha zaxira qiymatlari qolganligini tekshiring va boshqaring - Serverga ulanish amalga oshmaganligini tekshiring - Diskda joy boʼshating - ...yoki boshidan boshlash uchun hamma narsani oʼchirib tashlash. - Oʼzingizning qurilmangizni ham lokal ham serverda toping. - Sizga boshqa dasturlarga oʼtishingiz mumkin - Yangi obʼektlarni qidirish yoki qoʼshish. Siz avval qidirishingiz zarur, yangisini qoʼshishdan oldin! - Maydonlarni tozalash va qidiruvni qayta boshlash uchun shu yerni bosing. Bu shaxs-obʼektlarni boshqaruv paneli Shaxs-obʼektlarning profil maʼlumotlarini koʼring... - ...QR yoki SMS orqali maʼlumot ulashish... - ...yoki kuzatuv uchun shaxsni belgilang - Hodisa/tadbirni yaratish yoki rejalashtirish yoki boshqa Tashkiliy boʼlimga murojaat qilish uchun bosing. Bu yerda siz barcha hodisa/tadbirlarni koʼrasiz. Hodisa/tadbir tafsilotlarini koʼrish uchun bosing. Oʼzaro munosabatlarni qoʼshish, koʼrsatgichlarni koʼrish yoki yozuvlarni yozish uchun menyu boʼylab harakatlananing. - Tashkilotingiz tomonidan barcha qayd qilinganlarni koʼrish yoki yangisini yaratish uchun, bosing - Ushbu hodisa/tadbirni oʼchirib tashlash uchun bosing. Ushbu harakat qaytmas. - Hodisa/tadbirni yakunlash. - Ushbu dastur bilan bogʼliq barcha hodisa/tadbirlar bu yerda keltirilgan. - Yangi hodisa/tadbir qoʼshish uchun, bosing Hodisa/tadbir yaratish uchun barcha maʼlumotlarni kiriting Hodisa/tadbirning tugash holatini tekshirish uchun, bosing. - Hodisa/tadbirni yakunlash yoki qayta ochish uchun, bosing - QR orqali boshqa qurilmalardan maʼlumotlarni oʼqing va saqlang - Maʼlumotlarni server bilan sinxronlashtiring - 4 xonali kod bilan sessiyani bloklash. Kodingizni unutmang! - Foydalanuvchini yoki serverni oʼzgartirish uchun tizimdan chiqing. Internetda ulanish boʼlmasa ham, siz yana tizimga kirishingiz mumkin. - %s: Hech qanday hodisa/tadbir roʼyxatdan oʼtkazilmagan, yangisini qoʼshish uchun \"+\" tugmasini bosing. - Hech qanday hodisa/tadbir roʼyxatdan oʼtkazilmagan. Maʼlumotlarning qiymatlari Аxborot ID oʼqib boʼlmadi Lokal maʼlumotlarni oʼchirib tashlash Qisqacha koʼzdan kechirish - Oʼzaro aloqalar - Koʼrsatgichlar - Аnalitika Ushbu dastur uchun indikator mavjud emas. - Izohlar - Tugallanmadi - Baʼzi maydonlarda xatolar mavjud. Iltimos, ularni bajarish uchun ularni tekshiring Barcha qaydlar Barcha faol dasturlar bilan boshqaruv panelini koʼrsatish - Sinxronizatsiyadagi xatoliklar jurnalini ochish Sinxronizatsiyadagi xatoliklar jurnali bilan ulashish ... - Sizning konfiguratsiyangiz sinxronlashmadi. Sizning serveringizda xatolar boʼlishi mumkin. Qoʼshimcha maʼlumotlar uchun bu yerni bosing. - Тафсилотлари - Koʼrsatgichlar - Izohlar - - Keyinroq toʼldirish - - Tugatish - Xatoliklar mavjud boʼlgan maydonlar - Baʼzi maydonlarda xatoliklar mavjud.Ular saqlanmadi. Iltimos,, ularni tekshirib koʼring. Qiymat noyob boʼlishi lozim, bir biriga oʼxshash topildi. U saqlanmadi. Iltimos, tekshirib koʼrish. - Noyob sohada bir biriga oʼxshash qiymat topildi. Roʼyxatdan oʼtishni saqlash uchun formani tekshirish. Iltimos, kuting Oʼtkazib yuborish - Qayta rejalang Ushbu ekrandagi haqida maʼlumot yoʼq - Muddat oʼtgan - Bu yerda dasturning qoʼllab quvvatlanmaydigan bir qoidasi mavjud. Iltimos, hujjatlarni tekshiring. - Ushbu maydon uchun maʼlumot yoʼq - Ishonch yorliqlari boʼsh - Barmoq izlari skaneri yordamida tizimga kirish uchun avval standart usuldan foydalanishingiz kerak - Biometrik Xavfsizlik - Jadvallar - Жадвал - https:// Sinxronizatsiya qilinmagan maʼlumotlar yoʼqoladi. Haqiqatdan ham davom ettirishni xoxlaysizmi? - Qabul qiling Maʼlumotlarni oʼchirib boʼlmadi. Iltimos, qayta urinib koʼring. Lokal maʼlumotlarni oʼchirish muvaffaqiyatli yakunlandi. - Kamida bitta tashkiliy boʼlim tanlanishi kerak - aʼlumotlarni yuboring - DHIS2 da foydalanuvchi identifikatorlari bilan bogʼliq xatoliklar jurnallarini ulashish orqali ushbu dasturni yaxshilashga yordam berish. - Maydonlarni belgilash - Konfiguratsiyani sinxronlashtirish paytida sizning internet aloqangizda uzilish yuz berdi. Iltimos, keyinroq qayta urinib koʼring - Roziman - Davom etish - Server URLi - Tashkilotingiz uchun tizim maʼmuri tomonidan taqdim etilgan DHIS2 server URL manzilini kiriting. \n\ Boshqa holda, siz serveringiz URL manzilini oʼz ichiga olgan QR kodini skanerlashingiz mumkin. - Kodingizni unutdingizmi? - Ushbu hodisa/tadbir uchun nima qilmoqchisiz? - TАMOM %s topilmadi Siz kirib koʼrmoqchi boʼlgan yozuv mavjud emas. Buni qidirmoqchimisiz? SMS orqali sinxronlash Ogohlantirish Oʼzaro aloqa - Ushbu dastur uchun hech qanday nizolar mavjud emas - Internetga ulanish uzilgan, lekin telefon xizmatlari mavjudga oʼxshaydi - siz SMS dan foydalanishingiz mumkin. - Internetga ulanish uzilgan. Yopmoq Endi siz shu tugmaga bosish orqali sinxronizatsiya maʼlumotlarini tekshirishingiz mumkin - Ushbu maʼlumotlar faqat sizning qurilmangizda saqlanadi, server bilan sinxronlashtirilmaydi. - Sizning holatingiz dolzarb! Sizning barcha maʼlumotlaringiz serverga yuboriladi. Yozuvni oʼzaro aloqalar bilan bogʼlab boʼlmadi - Sessiyani blokdan chiqarish - Bajarildi - Ochiq - Qoʼllab quvvatlanmaydigan qiymat turi Taqvim koʼrinishini oʼzgartirish - Har soatda - Кунлик - Ҳафталик - Hafta - Sinxronizatsiya sozlanmasi: %s Siz kirib koʼrmoqchi boʼlgan yozuv qayd etilmagan. Siz boshqaruv paneliga kira olmaysiz Formatlashda xatolik Ushbu yozuvni oʼchirib tashlash huquqiga ega emassiz - Bu haqiqiy URL emas Shakl sozlanmoqda... - Qabul qiluvchining raqami Siz %d ta xabar yuborilishini qabul qilasizmi? %1$d / %2$d yuborilmoqda Kutish vaqtini tasdiqlash - 1%d @@ -488,51 +259,29 @@ Shlyuz oʼrnatilmagan Foydalanuvchi tizimga kirmagan SMS modul oʼchirib qoʼyilgan - Yana SMS yuborildi SMS modul ishga tushirilmadi, talab qilingan metamaʼlumotlar topilmadi - bajarildi Qabul qilinmagan SMS lar soni SMS yuborilishi boshlandi Maʼlumotlar oʼqildi va qayta moslashtirildi. Yuborish identifikatori %d - SMS yuborishda xatolik yuz berdi SMS TEI roʼyxatdan oʼtish va qayd qilish SMS hodisa/tadbirlarni yuborish SMS maʼlumotlar toʼplamini yuborish - Boshlanmoqda - Jarayonda - Yuborildi - Аmalga oshmadi - Sinxronizatsiyani boshlash. Sinxronizatsiyalanmoqda... - Sinxronizatsiya tugallandi. - Sinxronizatsiya paytida xatolik yuz berdi - Sinxronizatsiya paytida xatolik yuz berdi. Xatoliklar jurnalini tekshirish uchun shu yerni bosing - Sinxronizatsiya bekor qilindi. Nusxa olindi - Rasm tanlandi - Xaritada koʼrsatish - Roʼyxatni koʼrsatish - %s majburiy, ammo taыdim etilmagan - Koʼpburchak ushlandi Poligon - Barmoq izlari - Iltimos, barmoq izini kiriting Xavfsizlik Xavfsizlik tufayli dasturning ushbu versiyasidan andoza olingan qurilmalarga foydalanishga ruxmat berilmagan. Iltimos, mashq versiyasidan foydalaning. - Baʼzi xatoliklar aniqlandi. Davom etishdan oldin ularni tuzating. Filtrlar qoʼllaniladi Hech qanday filtr qoʼllanilmagan davr Tashkiliy boʼlim - Tartiblash - Status Sinxronlash Menga berilgan vakolat бугун @@ -547,25 +296,18 @@ Dan-Gacha Boshqa Istalgan vaqt - Sinxronizatsiya amalga oshmadi. Muammoni hal qilishga urinish uchun maʼlumotlar qiymatlarini tekshiring va qaytadan urining. Аgar shunda sinxronizatsiya ishlamasa, tizim maʼmuriga murojaat qiling - Ushbu maʼlumotlar serverga yuborilgan, ammo ularning saqlanishiga kafolat berilmagan Ochiq Reja Muddat oʼtgan Tashrif buyurdi bajarildi Oʼtkazib yuborildi - Hodisa/tadbirlar %s maksimal : %s %s ketma-ketlik: %s TEI: %s maksimal : %s %s ketma-ketlik: %s - Sozlamalar cheklangan %s \n Hodisa/tadbirlar: %s / %s TEI: %s / %s - Qayd qilish maʼlumotlarini berkitish - Qayd qilish maʼlumotlarini koʼrsatish SMS modul yoqib qoʼyilgan SMS modul oʼchirib qoʼyilgan SMS modul uchun maʼlumotlar yuklanmoqda. Iltimos, kuting SMS shlyuz boʼsh boʼlishi mumkin emas Yuklash uchun qayd etilganlar yoʼq Ushbu konvertatsiya qilish vazifasi qoʼllab-quvvatlanmaydi - Bloklangan ekranni qayta koʼrsatmaslik PIN kodni oʼrnating Nomutanosiblik Sanani oʼzgartirish @@ -590,11 +332,7 @@ Tashkiliy boʼlimni tanlang URL ni tanlang Qiymatni tanlang - Rasmni tanlang - Kodni skanerlash - Variantni tanlang TEI atributidan yuklangan himoyalangan qiymatlar - TEI atributidan yuklangan himoyalangan qiymatlar %s himoyalangan qiymatlar qoldi Himoyalangan qiymatlarni boshqarish Yuklab olish uchun hodisa/tadbirlar @@ -613,52 +351,25 @@ Sinxronizatsiyalanmagan Sinxronlashda xatolik SMS Sinxronizatsiyalangan - Тафсилотлари - Izohlar Saqlandi! - Maʼlumotlar sifatini tekshirishni xoxlaysizmi\? - Koʼrinishidan hammasi yaxshi! - Maʼlumotlar toʼplamini toʼldirishni xoxlaysizmi\? - Tugallangan deb belgilang - Исми - Formula - Baribir toʼldiring %s %s dan %s %s yoʼqolgan Hodisa/Tadbir holati - Qayd qilingan sana Maʼlumot yoʼq. Yangi yozuv qoʼshish uchun \"+\" tugmasini bosing Maʼlumot yoʼq. Sizda yangi yozuvlarni qoʼshishga ruxsat yoʼq. Hech qanday tavsif yoki koʼrsatma berilmagan Koʼrib chiqiladigan maʼlumotlar - Yakunlandi va saqlandi! Qayd allaqachon mavjud Ochiq Bajarildi Bekor qilindi - Маълумот Tanlangan %s  yuklanmadi. - %s tomonidan bajarilgan: %s - Yangilangan: %s - Maʼlumotlar sifatini tekshirib boʼlmadi. Аdministratoringizga murojaat qiling - Ishonchinigiz komilmi? - Maʼlumotlar toʼplamini qayta ochib koʼrmoqchimisiz? Sana - Hodisa/Tadbir sanasi - %s umumiy xususiyatlarga ega emas. Iltimos, dasturni tanlang Maxfiylik siyosati - Koordinata qiymatlari yaroqsiz - Siz ushbu dasturda boshqa tashkiliy boʼlimlar nomidan TEI qayd eta olmaysiz, chunki u himoyalangan. \N tizim maʼmuri bilan bogʼlaning. Maydon toʼldirilishi majburiy Xavfsizlik sababli ushbu versiyadan adb formatidan foydalanishga ruxsat berilmagan.Ilitmos, mashq versiyasidan foydalaning. Orqaga qayting - Ilovani yopish - Batafsil maʼlumot - Batafsil maʼlumot - Yopmoq Buferga nusxa olish - Buferga nusxa olindi - Xatto haqida maʼlumot Rejalashtirila olinmaydigan hodisa/tadbir rejalari mavjud Diagrammalar Patsientlar Roʼyxati @@ -687,16 +398,8 @@ Охирги молиявий йил Fikr-mulohaza Indikatorlar - Қиймат - Bajarildi! - Notoʼgʼri maʼlumot - Qiymat butun son boʼlishi lozim - Qiymatlar - Mavjud - Nomaʼlum Til Natija juda koʼp - Yangisini yaratish Sinxronizatsiyalangan Sinxronlashmoqda Yuborish @@ -710,7 +413,6 @@ Reja boʼyicha Dastur bosqichi Xronologiya - Ixtiyoriy Koʼproq koʼrsatish Kamroq koʼrsatish Sinxronlash diff --git a/app/src/main/res/values-uz/strings.xml b/app/src/main/res/values-uz/strings.xml index 714451bfe01..c60efa0d324 100644 --- a/app/src/main/res/values-uz/strings.xml +++ b/app/src/main/res/values-uz/strings.xml @@ -1,57 +1,25 @@ DHIS2 - DHIS - 2 Хатолик - - Хатоликлар - - Сервер URLи нотўғри - Нотўғри маълумот - Кутилмаган хатолик - Сервердаги ички хатолик - қиймат йўқ Сақланган бошқа қийматлар йўқ. Тизим администраторига мурожаат қилинг. - Сақланган бошқа қийматлар йўқ. Уларни тўлдириш учун тармоққа уланинг. - хатоликлар Нимадир нотўғри бажарилди - Ҳозир синхронлаштиринг - Сервер билан синхронлаш - Ҳозир синхронлаш - МетаМаълумот Ҳодиса/тадбирлар - Кузатувдаги объектлар - - Тугади - Синхронлаш тугалланди Синхронлашда хатолик Синхронлаш пайтида хатолик юз берди. Илтимос, қайта уриниб кўринг - Бу ерда хатолик юз берди ва сервер жавоб бермади. Ўз администраторингиз билан алоқа боғланг. - 1 %s натижалар топилди - Янгисини қўшиш - Қўшиш - Янги режа (жадвал) Йўналишларга - Сервер URLи - Фойдаланувчи исми - Пароль - Кириш - Сессия очиш Конфигурациянгиз синхронлашмоқда Маълумотларингиз тез орада синхронлаштирилади Маълумотларингиз синхронлашмоқда Сизнинг янги конфигурациянгиз тайёр Маълумотингиз тайёр - Конфигурацияни синхронлаш амалга ошмади - Маълумотларни синхронлаш амалга ошмади Аккаунтни тиклаш Кунлик @@ -69,128 +37,76 @@ Матн киритинг Узун матн киритинг Сонни киритинг - Бутун сон киритинг Бутун манфий сон киритинг Бутун мусбат ёки ноль сонини киритинг Мусбат сон киритинг - Фильтр вариантлари Санани танланг - Календардан танланг - Дастур тугалланди - Дастур нофаол Очиш Ҳодиса/тадбир якунланди Фақат ўқиш учун - Якунлаш ва тўлдириш Тўлдирилди Бекор қилинди - Фаоллаштириш Фаол Синхронлаш Юбориш учун Янгилаш учун - Ўчириб ташлаш учун Хатолик - СИНХРОНЛАШ - ЮБОРИШ - СМСни СИНХРОНЛАШ - Тугатиш - Яратиш Янгилаш - Сана Ташкилий бўлим Танланган саналар учун очиқ Ташкилий бўлимлар мавжуд эмас. Илтимос, бошқа сана ёки бошқа Ташкилий бўлимни танланг. - Категория вариантлари Кенглик Узунлик - Янги тадбир - Бир марта - Доимий Ҳисобот даври - Категория варианти - Агар сиз қийматни ўрнатган бўлсангиз, маълумотлар тўпламини тўлдириш учун қатордаги барча қийматлар бўлиши лозим. - Баъзи зарурий қийматлар мавжуд эмас. Маълумотлар тўпламини тўлдириш учун сизга барча шарт бўлган қийматлар мавжуд бўлиши лозим. - Шарт бўлган маълумотлар етишмаяпти. Маълумотлар тўпламини шакллантириш учун уларни тўлдиринг. - Қиймат сақланди! - Танлаш учун яроқли давр мавжуд эмас Муддати Категория комбинацияси - КК/ОО/ЙЙЙЙ Бекор қилиш Ўчириб ташлаш - Жами Охирги тадбир санаси Вариантлар мавжуд эмас Фаол дастурлар - Рўйхатга олиш дастурлари Рўйхатга киритиш - Охирги ташриф - Мурожаат қилиш - Тафсилотларни кўринг - КЎПРОҚ КЎРИШ Таҳрирлаш - Кузатиб бориш - Кузатув ёқилган - Кузатув ўчирилган Фаолсизлантириш Ушбу дастур яна кўпроқ тадбирларни қабул қилмайди - Маълумот йўқ ҳодиса/тадбирлар Бош саҳифа - Илова ҳақида маълумот Чиқиш - Сессияни блоклаш - 1 дақиқа - 15 дақиқа 30 дақиқа 1 соат 6 соат 1 кун (стандарт) 12 соат - Маълумотларни автоматик синхронлаш, ҳар: Қўлланма - Конфигурацияни автоматик синхронлаш, ҳар: 1 ҳафта - Жорий синхронлаш параметрлари - Стандарт ҳолатга қайтиш Маълумотлар базаси ўчирилади. Сиздан қайта кириш сўралади. Қабул қилинг Бекор қилиш Маълумотларни синхронлаш, ҳозир Конфигурацияни синхронланг, ҳозир Созламалар - Охирги синхронизация: %s - Охирги синхронизация: %s Тўлдириш - СМС модуль: СМС йўлак СМС натижаларини юборувчи - сониялар - рақам - рақам СМС юборишни ёқиш СМС натижалар тарқатилишини кутиш - - Махсус созламаларга эга бўлган дастурлар %s - Созламалар чекланган Глобал миқёсда дастур бўйича @@ -208,15 +124,11 @@ Ушбу журналда маълумотлар ва МетаМаълумотларни синхронлашда вужудга келган барча хатоликлар қайд этилган Локал маълумотларни ўчириб ташлаш Қурилмангизда сақланган барча Кузатув-Назорат иловаси маълумотлари ўчириб ташланади. Сервер билан синхронланмаган маълумотлар йўқотилади. - Илова маълумотларининг асл стандарт ҳолатини тиклаш; конфигурация - Қурилмангизда сақланган конфигурация ва Илова маълумотлари ўчирилади. Сиздан қайта тизимга кириш сўралади. Сервер билан синхронланмаган маълумотлар йўқотилади. СМС созламалари СМС шлюзи билан боғлиқ параметрларни текширинг ва таҳрирланг Статус - Қабул қилинган сана - Излаш @@ -225,42 +137,19 @@ Янги эслатма ёзинг аниқ Изоҳ қолдириш - Қайтиш - Фаоллаштирилди - Мажбурий майдонлар қолдириб кетилган - Баъзи мажбурий майдонлар қолдириб кетилган. Агар ҳозир орқага қайтсангиз, барча сақланган маълумотлар ўчиб кетади. - Баъзи мажбурий майдонлар қолдириб кетилган. Агар орқага қайтмоқчи бўлсангиз, Илтимос, уларни тўлдиринг. Маълумотингиз сақланмади - Агарда ҳозир орқага қайтсангиз, барча киритилган маълумотлар ўчирилади. - Ўчириб ташлаш ва орқага қайтиш - Баъзи маълумотларда хатоликлар мавжуд: \n%s\. Илтимос, уларни текширинг. - Баъзи мажбурий майдонлар қолдириб кетилган. Сиз маълумотларни киритишни якунлаб чиқишингиз мумкин. Аммо бу ҳолда ҳодиса/тадбирни якунлаб бўлмайди. Учун координаталар - Бўлимлар рўйхати - %s саволлардан %s бажарилди - %s дан %s бажарилди - Якунлаш ва ёпиш - Кунлар - Ойлар - Йиллар - Ҳафталар Ҳодиса санаси - Локал натижалар - Онлайн натижалар Аввалги дастурлар Ушбу амални бажариш учун сизда зарурий рухсат йўқ - Сифатида қўшиш... - Тозалаш давр - (%d) ташкилий бўлими - %d даражаси DHIS2 га Хуш келибсиз Бу ерда щз фаолиятингизни кузатишингиз мумкин Фильтрни щзгартиришингиз мумкин @@ -269,16 +158,11 @@ Асосий менюдан бошқа ҳаракатларни текшириш - Ўзаро алоқа муносабатларни яратиш Кейинги Қидирув учун камида %d атрибутни киритиш керак - Қидирув учун камида 1 та атрибутни киритиш керак - %d дан ортиқ натижалар мавжуд. Илтимос, қўшимча қидирув мезонларини киритинг - Қидирув мезонларини киритинг QR қурилмаларни импорт қилиш - Сақлаш ОК Идентификация Аттрибутлар @@ -290,33 +174,18 @@ маълумотлар йўқ QR код яроқсиз Ушбу атрибутларрни қўшиб бўлмади - Ушбу қайдларни қўшиб бўлмади Ҳақида Рўйхатга олиш дастурлари - ҳаммасини белгилаш - аниқ танлов - Танланган фильтрлар учун маълумот йўқ. Илтимос, уларни ўзгартириб кўринг. Улашиш QR ни улашиш - Онлайн қидирувда турлар бўйича қидириш мумкин эмас. \n Илтимос, дастурни рўйхатдан танланг. - Максимум - Жорий TEI TEI лар - Ташкилий бўлимлар орқали чегаралаш - Дастур орқали чегаралаш - Дастурлар рўйхати Илова маълумотларининг асл стандарт ҳолатини тиклаш; конфигурация - Ушбу ўзаро муносабатларни қўшиб бўлмайди Буни текширинг! - Огоҳлантириш - Хато Сақлаш Ҳимояланган қийматлар - QR дан кўпроқ маълумотларни қўшмоқчимисиз? - Илова версияси: 1 %s SDK версияси: 1 %s @@ -327,139 +196,44 @@ Осло Университети томонидан ишлаб чиқилган ва қўллаб қувватланадиган DHIS2 лойиҳаси Ушбу дастур ҳақида қўшимча маълумот ёки саволлар учун android@dhis2.org электрон манзилига ёзинг - Пароль қолдириб кетилган, Илтимос, ушбу майдонни тўлдиринг. - Фойдаланувчи исми қолдириб кетилган. Илтимос, ушбу майдонни тўлдиринг. - Ушбу сервер 2.29 дан фарқли версияни ишлатмоқда. Сервер версиясини янгиланг ёки давом этиш учун синов муддатидан фойдаланинг. - Ушбу сервер %s дан фарқли версияни ишлатмоқда. Сервер версиясини янгиланг ёки давом этиш учун синов муддатидан фойдаланинг. - Нимадир нотўғри бажарилди. Сервер URL манзили, фойдаланувчи номи ва пароль тўғри эканлигини текширинг ва қайтадан урининг. - Сервер ушбу сўровни бажара олмади. - Серверга киришга хатолик юз берди. - Кириш хатоси - Мажбурий майдонлар қолдириб кетилган - Онлайн қидирувда кутилмаган хатолик - Натижаларни таҳлил қилишда хатолик юз берди - Онлайн қидирувда хаттолик юз берди - Серверда хатолик юз берди Рўйхатдан ўтишни ёқиш учун дастурни танланг Сизда керакли рухсат йўқ - Ушбу функция ҳали тайёр эмас. - Ўзаро алоқалар ёрлиғини олишда хатолик юз берди Барчаси %s Бу яроқли телефон рақами эмас - Бу яроқли электрон почта манзили эмас - Фақат манфий рақамларга рухсат берилади Фақат мусбат рақамлар ёки нолга рухсат берилади - Фақат мусбат рақамларга рухсат берилади - Фақат 0 дан 1 гача бўлган қийматларга рухсат берилади - Фақат 0 дан 100 гача бўлган қийматларга рухсат берилади - Фильтрлаш учун саналарни танланг Вариант танланг - Муаммо ҳақида хабар берилди - Янги ҳодиса/тадбир яратиш - Ҳақиқатдан ҳам бошқа ҳодиса/тадбир яратмоқчимисиз? Ҳодиса/Тадбир Тугалланди Ушбу дастурдаги барча ҳодиса/тадбирлар якунланди. Ҳақиқатдан ҳам ушбу дастурни ёпишни хохлайсизми? - Ҳақиқатдан ҳам рўйхатдан ўтишни тугатмоқчимисиз? Текширинг Бош саҳифа МИСОЛ - Виджет қўшиш Ёрдам беринг - Маълумотларингизни сохталаштиринг... - ...сизнинг конфигурациянгиз... - ...сервердан қанча ёзувларни юклаб олиш кераклигини белгиланг... - Қанча захира қийматлари қолганлигини текширинг ва бошқаринг - Серверга уланиш амалга ошмаганлигини текширинг - Дискда жой бўшатинг - ...ёки бошидан бошлаш учун ҳамма нарсани ўчириб ташлаш. - Ўзингизнинг қурилмангизни ҳам локал ҳам серверда топинг. - Сизга бошқа дастурларга ўтишингиз мумкин - Янги объектларни қидириш ёки қўшиш. Сиз аввал қидиришингиз зарур, янгисини қўшишдан олдин! - Майдонларни тозалаш ва қидирувни қайта бошлаш учун шу ерни босинг. Бу шахс-объектларни бошқарув панели Шахс-объектларнинг профиль маълумотларини кўринг... - ...QR ёки СМС орқали маълумот улашиш... - ...ёки кузатув учун шахсни белгиланг - Ҳодиса/тадбирни яратиш ёки режалаштириш ёки бошқа Ташкилий бўлимга мурожаат қилиш учун босинг. Бу ерда сиз барча ҳодиса/тадбирларни кўрасиз. Ҳодиса/тадбир тафсилотларини кўриш учун босинг. Ўзаро муносабатларни қўшиш, кўрсатгичларни кўриш ёки ёзувларни ёзиш учун меню бўйлаб ҳаракатлананинг. - Ташкилотингиз томонидан барча қайд қилинганларни кўриш ёки янгисини яратиш учун, босинг - Ушбу ҳодиса/тадбирни ўчириб ташлаш учун босинг. Ушбу ҳаракат қайтмас. - Ҳодиса/тадбирни якунлаш. - Ушбу дастур билан боғлиқ барча ҳодиса/тадбирлар бу ерда келтирилган. - Янги ҳодиса/тадбир қўшиш учун, босинг Ҳодиса/тадбир яратиш учун барча маълумотларни киритинг Ҳодиса/тадбирнинг тугаш ҳолатини текшириш учун, босинг. - Ҳодиса/тадбирни якунлаш ёки қайта очиш учун, босинг - QR орқали бошқа қурилмалардан маълумотларни ўқинг ва сақланг - Маълумотларни сервер билан синхронлаштиринг - 4 хонали код билан сессияни блоклаш. Кодингизни унутманг! - Фойдаланувчини ёки серверни ўзгартириш учун тизимдан чиқинг. Интернетда уланиш бўлмаса ҳам, сиз яна тизимга киришингиз мумкин. - %s: ўзаро алоқалар Ҳеч қандай ҳодиса/тадбир рўйхатдан ўтказилмаган, янгисини қўшиш учун \"+\" тугмасини босинг. - Ҳеч қандай ҳодиса/тадбир рўйхатдан ўтказилмаган. Маълумотларнинг қийматлари Ахборот ID ўқиб бўлмади Локал маълумотларни ўчириб ташлаш Қисқача кўздан кечириш - Ўзаро алоқалар - Кўрсатгичлар - Аналитика Ушбу дастур учун индикатор мавжуд эмас. - Изоҳлар - Тугалланмади - Баъзи майдонларда хатолар мавжуд. Илтимос, уларни бажариш учун уларни текширинг Барча қайдлар Барча фаол дастурлар билан бошқарув панелини кўрсатиш - Синхронизациядаги хатоликлар журналини очиш Синхронизациядаги хатоликлар журнали билан улашиш ... - Сизнинг конфигурациянгиз синхронлашмади. Сизнинг серверингизда хатолар бўлиши мумкин. Қўшимча маълумотлар учун бу ерни босинг. - ОЛДИНГИ - КЕЙИНГИ - Тафсилотлари - Индикаторлар - Изоҳлар - - Кейинроқ тўлдириш - - Тугатиш - Хатоликлар мавжуд бўлган майдонлар - Баъзи майдонларда хатоликлар мавжуд.Улар сақланмади. Илтимос,, уларни текшириб кўринг. Қиймат ноёб бўлиши лозим, бир бирига ўхшаш топилди. У сақланмади. Илтимос, текшириб кўриш. - Ноёб соҳада бир бирига ўхшаш қиймат топилди. Рўйхатдан ўтишни сақлаш учун формани текшириш. Илтимос, кутинг Ўтказиб юбориш - Қайта режаланг Ушбу экрандаги ҳақида маълумот йўқ - Муддат ўтган - Бу ерда дастурнинг қўллаб қувватланмайдиган бир қоидаси мавжуд. Илтимос, ҳужжатларни текширинг. - Ушбу майдон учун маълумот йўқ - Ишонч ёрлиқлари бўш - Бармоқ излари сканери ёрдамида тизимга кириш учун аввал стандарт усулдан фойдаланишингиз керак - Биометрик Хавфсизлик - Жадваллар - Жадвал - https:// Синхронизация қилинмаган маълумотлар йўқолади. Ҳақиқатдан ҳам давом эттиришни хохлайсизми? - Қабул қилинг Маълумотларни ўчириб бўлмади. Илтимос, қайта уриниб кўринг. Локал маълумотларни ўчириш муваффақиятли якунланди. - Камида битта ташкилий бўлим танланиши керак - аълумотларни юборинг - DHIS2 да фойдаланувчи идентификаторлари билан боғлиқ хатоликлар журналларини улашиш орқали ушбу дастурни яхшилашга ёрдам бериш. - Майдонларни белгилаш - Конфигурацияни синхронлаштириш пайтида сизнинг интернет алоқангизда узилиш юз берди. Илтимос, кейинроқ қайта уриниб кўринг - Розиман - Давом этиш - Сервер URLи - Ташкилотингиз учун тизим маъмури томонидан тақдим этилган DHIS2 сервер URL манзилини киритинг. \n\ Бошқа ҳолда, сиз серверингиз URL манзилини ўз ичига олган QR кодини сканерлашингиз мумкин. - Кодингизни унутдингизми? - Ушбу ҳодиса/тадбир учун нима қилмоқчисиз? - ТАМОМ %s топилмади Сиз кириб кўрмоқчи бўлган ёзув мавжуд эмас. Буни қидирмоқчимисиз? СМС орқали синхронлаш @@ -467,32 +241,15 @@ Юкланмоқда Ўзаро алоқа СМС орқали юборилган - Ушбу дастур учун ҳеч қандай низолар мавжуд эмас - Интернетга уланиш узилган, лекин телефон хизматлари мавжудга ўхшайди - сиз СМС дан фойдаланишингиз мумкин. - Интернетга уланиш узилган. Ёпмоқ Энди сиз шу тугмага босиш орқали синхронизация маълумотларини текширишингиз мумкин - Ушбу маълумотлар фақат сизнинг қурилмангизда сақланади, сервер билан синхронлаштирилмайди. - Сизнинг ҳолатингиз долзарб! Сизнинг барча маълумотларингиз серверга юборилади. Ёзувни ўзаро алоқалар билан боғлаб бўлмади - Сессияни блокдан чиқариш - Бажарилди - Очиш - Қўллаб қувватланмайдиган қиймат тури Тақвим кўринишини ўзгартириш - 15 дақиқа - Ҳар соатда - Кунлик - Ҳафталик - Ҳафта - Синхронизация созланмаси: %s Сиз кириб кўрмоқчи бўлган ёзув қайд этилмаган. Сиз бошқарув панелига кира олмайсиз Форматлашда хатолик Ҳуқуқингиз чегараланганлиги сабабни ушбу ёзувни ўчириб ташлолмайсиз - Бу ҳақиқий URL эмас Шакл созланмоқда... - Қабул қилувчининг рақами Сиз %d та хабар юборилишини қабул қиласизми? %1$d / %2$d юборилмоқда Кутиш вақтини тасдиқлаш - 1%d @@ -510,51 +267,29 @@ Шлюз ўрнатилмаган Фойдаланувчи тизимга кирмаган СМС модуль ўчириб қўйилган - Яна СМС юборилди СМС модуль ишга туширилмади, талаб қилинган метамаълумотлар топилмади - бажарилди Қабул қилинмаган СМС лар сони СМС юборилиши бошланди Маълумотлар ўқилди ва қайта мослаштирилди. Юбориш идентификатори %d - СМС юборишда хатолик юз берди СМС TEI рўйхатдан ўтиш ва қайд қилиш СМС ҳодиса/тадбирларни юбориш СМС маълумотлар тўпламини юбориш - Бошланмоқда - Жараёнда - Юборилди - Амалга ошмади - Синхронизацияни бошлаш. Синхронизацияланмоқда... - Синхронизация тугалланди. - Синхронизация пайтида хатолик юз берди - Синхронизация пайтида хатолик юз берди. Хатоликлар журналини текшириш учун шу ерни босинг - Синхронизация бекор қилинди. Нусха олинди - Расм танланди - Харитада кўрсатиш - Рўйхатни кўрсатиш - %s мажбурий, аммо таыдим этилмаган - Кўпбурчак ушланди Полигон - Бармоқ излари - Илтимос, бармоқ изини киритинг Хавфсизлик Хавфсизлик туфайли дастурнинг ушбу версиясидан андоза олинган қурилмаларга фойдаланишга рухмат берилмаган. Илтимос, машқ версиясидан фойдаланинг. - Баъзи хатоликлар аниқланди. Давом этишдан олдин уларни тузатинг. Фильтрлар қўлланилади Ҳеч қандай фильтр қўлланилмаган Давр Ташкилий бўлим - Тартиблаш - Статус Синхронлаш Менга берилган ваколат бугун @@ -569,25 +304,18 @@ Дан-Гача Бошқа Исталган вақт - Синхронизация амалга ошмади. Муаммони ҳал қилишга уриниш учун маълумотлар қийматларини текширинг ва қайтадан урининг. Агар шунда синхронизация ишламаса, тизим маъмурига мурожаат қилинг - Ушбу маълумотлар серверга юборилган, аммо уларнинг сақланишига кафолат берилмаган Очиш Режа Муддат ўтган Ташриф буюрди бажарилди Ўтказиб юборилди - Ҳодиса/тадбирлар %s максимал : %s %s кетма-кетлик: %s TEI: %s максимал : %s %s кетма-кетлик: %s - Созламалар чекланган %s \n Ҳодиса/тадбирлар: %s / %s TEI: %s / %s - Қайд қилиш маълумотларини беркитиш - Қайд қилиш маълумотларини кўрсатиш СМС модуль ёқиб қўйилган СМС модуль ўчириб қўйилган СМС модуль учун маълумотлар юкланмоқда. Илтимос, кутинг СМС шлюз бўш бўлиши мумкин эмас Юклаш учун қайд этилганлар йўқ Ушбу конвертация қилиш вазифаси қўллаб-қувватланмайди - Блокланган экранни қайта кўрсатмаслик ПИН кодни ўрнатинг Номутаносиблик Санани ўзгартириш @@ -612,11 +340,7 @@ Ташкилий бўлимни танланг URL ни танланг Қийматни танланг - Расмни танланг - Кодни сканерлаш - Вариантни танланг TEI атрибутидан юкланган ҳимояланган қийматлар - TEI атрибутидан юкланган ҳимояланган қийматлар %s ҳимояланган қийматлар қолди Ҳимояланган қийматларни бошқариш Юклаб олиш учун ҳодиса/тадбирлар @@ -636,56 +360,27 @@ Синхронизацияланмаган Синхронлашда хатолик СМС Синхронизацияланган - Тафсилотлари - Изоҳлар Сақланди! - Маълумотлар сифатини текширишни хохлайсизми\? - Кўринишидан ҳаммаси яхши! - Маълумотлар тўпламини тўлдиришни хохлайсизми\? - Тугалланган сифатида белгилансин - Исми - Формула - Барибир тўлдиринг %s %s дан %s %s йўқолган Ҳодиса/Тадбир ҳолати - Қайд қилинган сана Маълумот йўқ. Янги ёзув қўшиш учун \"+\" тугмасини босинг Маълумот йўқ. Сизда янги ёзувларни қўшишга рухсат йўқ. Ҳеч қандай тавсиф ёки кўрсатма берилмаган Кўриб чиқиладиган маълумотлар - Якунланди ва сақланди! Қайд аллақачон мавжуд Очиш Бажарилди Бекор қилинди - Маълумот Танланган %s  юкланмади. - %s томонидан бажарилган: %s - Янгиланган: %s - Бажарилди - Маълумотлар сифатини текшириб бўлмади. Администраторингизга мурожаат қилинг - Ишончинигиз комилми? - Маълумотлар тўпламини қайта очиб кўрмоқчимисиз? Сана - Тадбир санаси - %s умумий хусусиятларга эга эмас. Илтимос, дастурни танланг Махфийлик сиёсати Махфийлик сиёсатини текшириш учун шу ерни босинг - Координата қийматлари яроқсиз - Сиз ушбу дастурда бошқа ташкилий бўлимлар номидан TEI қайд эта олмайсиз, чунки у ҳимояланган. \N тизим маъмури билан боғланинг. Майдон тўлдирилиши мажбурий Хавфсизлик сабабли ушбу версиядан adb форматидан фойдаланишга рухсат берилмаган.Илитмос, машқ версиясидан фойдаланинг. Орқага қайтинг - Иловани ёпиш - Батафсил маълумот - Батафсил маълумот - Ёпмоқ Буферга нусха олиш - Буферга нусха олинди - Хатто ҳақида маълумот Серверингиз билан синхронизацияда хатоликни аниқладик. Иложи бўлса, хатолик ҳақида администраторингизга хабар беринг. - Сизнинг фойдаланувчингиз билан сеанс ташкиллаштира олмадик Режалаштирила олинмайдиган ҳодиса/тадбир режалари мавжуд Диаграммалар Пациентлар Рўйхати @@ -724,38 +419,21 @@ Фикр-мулоҳаза Кўрсатгичлар Камерада фойдаланишга рухсат берилмаган. Ушбу функциядан фойдаланиш учун уни ёқишингиз керак. - Қиймат Диаграммалар ва индикаторлар Суратга олиш - Галереядан танлаш - Бажарилди! Ушбу дастур ҳимояланган Сабабини шу ерда ёзиб қолдиринг - Аутентификация қилинмоқда - Кўрсатиб ўтилган URL манзил DHIS шаблонида эмас - Нотўғри маълумот - Қиймат бутун сон бўлиши лозим Сессия муддати тугаган Сизнинг жорий сессиянгиз муддати тугаган. Хавфсизлик нуқтаи назаридан, сиз қайтадан аккаунт маълумотларини тақдим этишингиз лозим. - Қийматлар Радар (тўрсимон) сифатда кўриш - Мавжуд - Номаълум Тил Натижа жуда кўп - Янгисини яратиш Яхши Синхронизацияланган Синхронлашмоқда Юбориш Янгилаш Hozir emas - - %s da xatoliklar - - - %s da ogohlantirishlar - Кузатув учун белгиланган Фақат кўриш учун Ўтказиб юборилди @@ -768,13 +446,22 @@ Дастур босқичи ҳодиса/тадбир Хронология - Ихтиёрий Кўпроқ кўрсатиш Камроқ кўрсатиш Синх - Қаторларни кўрсатиш - Қаторларни беркитиш Тавсифни кўрсатиш Тавсифни беркитиш Ўтказиш - + + + %s da xatoliklar + + + + %s da ogohlantirishlar + + + + Махсус созламаларга эга бўлган дастурлар %s + + diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 1a718fa79fb..a000a2926ce 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -1,62 +1,29 @@ Dhis2 - dhis - 2 Lỗi - - Lỗi - - Sai đường dẫn đến máy chủ - Sai thông tin đăng nhập - Lỗi không mong muốn - Lỗi máy chủ nội bộ - không có giá trị Không còn giá trị dành riêng. Liên hệ với quản trị viên hệ thống của bạn - Không còn giá trị dành riêng. Kết nối với mạng để nạp thêm - lỗi Có gì đó không đúng - Đồng bộ ngay - Đang đồng bộ với máy chủ - Đang đồng bộ - Siêu dữ liệu Sự kiện - Đối tượng theo dõi - - Lưu - Hoàn thành đồng bộ Lỗi đồng bộ Xảy ra lỗi trong quá trình đồng bộ. Vui lòng thử lại. Đồng bộ đã hoàn tất nhưng chúng tôi không nhận được xác nhận máy chủ cho tất cả dữ liệu. Các dữ liệu vẫn được đánh dấu là \"Ngoại tuyến\" trong Ứng dụng. Chúng tôi khuyên bạn thử đồng bộ lại. - Có lỗi và máy chủ không phản hồi. Liên hệ quản trị viên của bạn. - Tìm thấy %s kết quả - Thêm sự kiện mới - Thêm Nhập %s Nhập / Bỏ qua %s - Đặt lịch hẹn Giới thiệu đến cơ sở khác - Đường dẫn đến máy chủ - Tên đăng nhập - Mật khẩu - Đăng nhập - Mở khóa phần nhập Đang đồng bộ Cấu Hình của bạn Dự Liệu của bạn sẽ được sớm đồng bộ Đang đồng bộ Dữ Liệu của bạn Cấu Hình của bạn đã sẵn sàng Dữ Liệu của bạn đã sẵn sàng - Đồng bộ Cấu Hình thất bại - Đồng bộ Dữ Liệu thất bại Phục hồi tài khoản - Cần có kết nối mạng để phục hồi tài khoảng của bạn Hàng Ngày @@ -77,138 +44,85 @@ Nhập văn bản Nhập văn bản dài Nhập số - Nhập số nguyên Nhập số nguyên âm Nhập số nguyên dương hoặc số 0 Nhập số nguyên dương - Tùy Chọn Bộ Lọc Chọn ngày - Thay đổi lịch - Chương trình đã hoàn tất - Chương trình không hoạt động Mở Chưa hoàn tất Sự kiện đã hoàn tất Chỉ Xem - Lưu và Hoàn Tất Đã hoàn tất Đã hủy Mở lại - Mở lại biểu nhập - Kích hoạt Hoạt động Đồng bộ Gửi Cập nhật - Xóa Lỗi - ĐỒNG BỘ - GỬI ĐI - ĐỒNG BỘ SMS - Hoàn tất - Tạo mới Cập nhật - Ngày Đơn vị Không có Đơn Vị nào trong ngày được chọn. Xin vui lòng chọn ngày khác hoặc Đơn Vị khác. - Tùy Chọn Phân Loại Vĩ độ Kinh độ - Sự kiện mới - Một lần - Cố định Thời điểm báo cáo - Tùy chọn - Nếu bạn nhập một giá trị, cần nhập tất cả giá trị để hoàn tất Biểu Nhập - Một số giá trị bắt buộc đang bị thiếu. Bạn cần nhập giá trị bắt buộc để hoàn tất Biểu Nhập. - Các trường nhập bắt buộc đang bị thiếu. Xin vui lòng điền giá trị bắt buộc để hoàn thành biểu nhập. - Giá trị đã được lưu! - Không có thời điểm để chọn. Ngày đến hạn %1$skế tiếp Tổ hợp Phân Loại - DD/MM/YYYY Hủy Xóa - Tổng số Ngày sự kiện gần nhất Không có tùy chọn Danh sách đăng ký Các chương trình đang hoạt động - Chương trình để đăng ký Đăng ký - Ngày đến khám gần nhất : - áp dụng - Xem Chi Tiết - XEM THÊM Chỉnh sửa - Theo dõi - Đã bật theo dõi - Đã tắt theo dõi Không hoạt động Chương trình này không cho phép thêm sự kiện - Không có dữ liệu sự kiện Trang chủ - Thông Tin Ứng Dụng Đăng Xuất - Khóa Phiên đăng nhập Hiển thị thêm %s... Ẩn bớt... - 1 Phút - 15 Phút 30 Phút 1 Giờ 6 Giờ 1 Ngày (Mặc định) 12 Giờ - Đồng bộ dữ liệu tự động mỗi: Thủ công - Tự động đồng bộ cấu hình mỗi: 1 Tuần - Các tham số đồng bộ hiện tại: - Trở về cài đặt mặc định Cơ sở dữ liệu sẽ được xóa.\nBạn sẽ được yêu cầu đăng nhập lại. Chấp nhận Hủy Đồng Bộ Dữ Liệu Ngay Đồng Bộ Cấu Hình Ngay Cài đặt - Đồng bộ lần cuối: %s - Đồng bộ lần cuối: %s Nạp lại - Mô đun SMS: Cổng SMS Người gửi kết quả SMS Thời gian chờ kết quả SMS (giây) - giây - số - số Cho phép nộp SMS Đợi phản hồi kết quả SMS - - Có %s chương trình với các cài đặt riêng - Cài đặt bị giới hạn Toàn cầu theo chương trình @@ -226,20 +140,15 @@ Nhật ký này chứa tất cả các lỗi gây ra khi đồng bộ dữ liệu và siêu dữ liệu của bạn. Xóa dữ liệu nội bộ Tất cả dữ liệu của Ứng Dụng này được lưu trữ trong thiết bị của bạn sẽ bị xóa. Dữ liệu chưa được đồng bộ lên máy chủ sẽ bị mất. - Cài đặt lại dữ liệu và cấu hình - Cấu hình và dữ liệu trong ứng dụng của bạn được lưu trữ trong thiết bị sẽ bị xóa. Bạn sẽ được yêu cầu đăng nhập lại và dữ liệu chưa đồng bộ lên máy chủ sẽ bị mất. Cài đặt SMS Kiểm tra và chỉnh sửa các tham số liên quan tới cổng sms Cập nhật phần mềm - Phần mềm Xuất cơ sở dữ liệu Xuất cơ sở dữ liệu và chia sẻ nó với quản trị của bạn Xác thực hai yếu tố Trạng thái - Ngày đăng ký - Tìm kiếm @@ -248,43 +157,19 @@ Viết ghi chú mới xóa Thêm ghi chú - Hoàn tác - Đã hoạt động - Thiếu trường dữ liệu bắt buộc - Một số trường bắt buộc bị thiếu. Nếu bạn muốn quay lại, tất cả các thông tin đã lưu sẽ bị xóa. - Một số trường bắt buộc nhập bị thiếu. Nếu bạn muốn quay lại, vui lòng nhập giá trị cho chúng - Một số trường dữ liệu cần bạn chú ý.\n Bạn có muốn xem xét biểu nhập không? Dữ liệu của bạn chưa được lưu - Nếu bạn quay lại bây giờ, tất cả thông tin đã nhập sẽ bị xóa. - Xóa và quay lại - Một vài trường dữ liệu có lỗi:\n %s\nVui lòng kiểm tra. - Một số trường bắt buộc bị thiếu. Bạn có thể lưu biểu nhập và tắt, nhưng sự kiện chưa hoàn tất. Tọa độ của - Danh sách phân đoạn - %s câu hỏi của %s đã hoàn tất - %s của %s đã hoàn tất - Hoàn tất và Đóng - Ngày - Tháng - Năm - Tuần Ngày khởi phát - Kết quả cục bộ - Kết quả trực tuyến Các chương trình cũ Bạn không có quyền thực hiện hành động này - Thêm làm - Xóa Thời điểm - (%d) Đơn vị - Tuyến %d Chào mừng đến với dhis2 Bạn có thể xem các hoạt động của mình tại đây Bạn có thể áp dụng bộ lọc... @@ -293,16 +178,11 @@ Xem các hoạt động khác ở trình đơn chính - Tạo mối quan hệ Tiếp tục Bạn cần nhập ít nhất %d thuộc tính để thực hiện tìm kiếm - Bạn cần nhập ít nhất một thuộc tính để tìm kiếm - Có nhiều hơn %d kết quả. Vui lòng nhập thêm thông số tìm kiếm khác - Nhập thông số tìm kiếm của bạn Nhập dữ liệu QR - Lưu OK Nhận dạng Thuộc Tính @@ -314,33 +194,18 @@ không có dữ liệu Mã QR không hợp lệ Không thể thêm thuộc tính này - Không thể đăng ký Giới thiệu Chương trình để đăng ký - chọn tất cả - Bỏ chọn - Không có thông tin với các bộ lọc đã chọn. Vui lòng thay đổi Chia sẻ Chia sẻ mã QR - Không thể tìm kiếm theo loại khi tìm kiếm trực tuyến.\nVui lòng chọn một chương trình trong danh sách. - Lớn nhất - Hiện tại ĐỐI TƯỢNG THEO DÕI ĐỐI TƯỢNG THEO DÕI - GIới hạn bởi đơn vị - Giới hạn bởi chương trình - Danh sách chương trình Cài đặt lại Dữ liệu & cấu hình - Không thể thêm mối quan hệ này Kiểm tra cái này! - Cảnh báo - Lỗi Lưu Giá trị dành riêng - Bạn có muốn thêm dữ liệu từ mã QR không? - Phiên bản Ứng dụng: %s Phiên bản SDK: %s @@ -351,148 +216,45 @@ Phát triển và duy trì bởi dự án DHIS2, thuộc trường Đại học Oslo, Khoa Tin học. Để biết thêm thông tin hoặc hỏi về ứng dụng này, vui lòng gửi thư đến android@dhis2.org - Chưa nhập mật khẩu. Vui lòng nhập mật khẩu. - Chưa nhập tên đăng nhập. Vui lòng nhập tên đăng nhập. - Máy chủ này đang chạy phiên bản dhis khác với phiên bản 2.29. Hãy cập nhật phiên bản máy chủ của bạn hoặc sử dụng môi trường thực nghiệm để tiếp tục. - Máy chủ này đang chạy một phiên bản dhis khác với %s. Hãy cập nhật phiên bản máy chủ của bạn hoặc sử dụng môi trường thử nghiệm để tiếp tục. - Có gì đó không đúng. Vui lòng kiểm tra lại đường dẫn máy chủ, tên đăng nhập và mật khẩu và thử lại. - Máy chủ không thể hoàn thành yêu cầu này. - Có vấn đề khi đang đăng nhập vào máy chủ. - Lỗi đăng nhập - Các trường dữ liệu bắt buộc bị thiếu - Xảy ra lỗi không mong muốn khi tìm kiếm trực tuyến - Xảy ra lỗi khi chuyển đổi kết quả - Tìm kiếm trực tuyến trả về lỗi - Có lỗi gì đó trên máy chủ Chọn một chương trình để đăng ký Bạn không có quyền cần thiết - Chức năng này chưa hoạt động. - Có lỗi khi lấy nhãn mối quan hệ Tất cả %s Số điện thoại này không hợp lệ - Email này không hợp lệ - Chỉ cho phép nhập số âm Chỉ cho phép số nguyên hoặc số 0 - Chỉ cho phép số dương - Chỉ cho phép giá trị từ 0 đến 1 - Chỉ cho phép giá trị từ 0 đến 100 - Chọn ngày để lọc Tùy chọn - Vấn đề đã được báo cáo - Tạo sự kiện mới - Bạn có muốn tạo một sự kiện khác? Sự kiện đã hoàn tất Tất cả các sự kiện trong chương trình này đã hoàn tất. Bạn có muốn đóng chương trình không? - Bạn có muốn hoàn tất đăng ký? Bạn có muốn hoàn tất %sluôn không? Kiểm tra Trang chủ VÍ DỤ - Thêm tiện ích Hiện trợ giúp - Đang đồng bộ dữ liệu của bạn... - ...cấu hình của bạn... - ...cài đặt bao nhiêu hồ sơ có thể tải xuống từ máy chủ... - Kiểm tra và quản lý còn bao nhiêu giá trị dành riêng - Kiểm tra kết nối mạng đến máy chủ bị lỗi hay không - Giải phóng một ít dung lượng ổ đĩa - ...hoặc xóa tất cả để bắt đầu lại từ đầu. - Tìm kiếm đối tượng theo dõi của bạn tại thiết bị của bạn hoặc trên máy chủ trực tuyến - Bạn có thể đổi sang các chương trình khác. - Tìm kiếm hoặc Thêm đối tượng theo dõi mới. Bạn cần phải tìm kiếm trước khi thêm một đối tượng mới! - Bấm vào đây để xóa các trường dữ liệu và đặt lại thông tin tìm kiếm Đây là bản trình bày dữ liệu của đối tượng theo dõi Xem thông tin hồ sơ của các đối tượng theo dõi... - ...Chia sẻ thông tin qua mã QR hoặc SMS... - ...Hoặc đánh dấu đối tượng để theo dõi - Bấm để tạo hoặc đặt lịch cho một sự kiện hoặc giới thiệu đến một đơn vị khác. Tại đây bạn sẽ thấy tất cả các sự kiện. Bấm để xem chi tiết một sự kiện. Thao tác điều hướng trong trình đơn để Thêm mối quan hệ, Xem chỉ số hoặc Viết ghi chú - Bấm vào đây để xem tất cả các đăng ký của đối tượng theo dõi hoặc đăng ký mới. - Bấm để xóa sự kiện này. Hành động này không thể hoàn tác. - Hoàn tất sự kiện. - Tất cả các sự kiện liên quan tới chương trình này sẽ được liệt kê ở đây. - Bấm để thêm một sự kiện mới Nhập tất cả dữ liệu để tạo sự kiện Bấm để kiểm tra trạng thái hoàn tất sự kiện - Bấm để Hoàn tất hoặc Mở-lại sự kiện - Đọc và lưu thông tin từ thiết bị khác bằng QR - Đồng bộ dữ liệu của bạn với máy chủ - Khóa phiên đăng nhập với mã 4 ký tự số. Đừng quên mã của bạn! - Đăng xuất để thay đổi tên đăng nhập hoặc máy chủ. Bạn vẫn sẽ có thể đăng nhập lại thậm chí khi không có kết nối mạng. - %s: mối quan hệ Không có sự kiện đã đăng ký, bấm vào \"+\" để thêm một sự kiện mới. - Không có sự kiện được đăng ký Giá trị dữ liệu Thông tin Không thể đọc được mã nhận dạng này Xóa dữ liệu nội bộ Tổng quan - Mối quan hệ - Chỉ số - Phân tích Không có chỉ số cho chương trình này. - Ghi Chú - Không thể hoàn tất - Không thể lưu - Có cảnh báo trong biểu nhập. - Bạn muốn làm gì? - Một số trường dữ liệu có lỗi. Vui lòng kiểm tra chúng để có thể hoàn tất. Tất cả đăng ký Bảng hiển thị dữ liệu với tất cả chương trình đang hoạt động - Mở lịch sử lỗi đồng bộ Lịch sử lỗi đồng bộ Chia sẻ với... - Đồng bộ cấu hình của bạn thất bại. Có thể có lỗi nào đó trong máy chủ của bạn. Bấm vào đây để biết thêm chi tiết - TRƯỚC - SAU - Chi tiết - Chỉ số - Ghi Chú - - Hoàn tất sau - - Lưu - Các trường dữ liệu có lỗi - Một số trường dữ liệu có lỗi. Chúng chưa được lưu. Xin vui lòng kiểm tra lại. Giá trị phải là duy nhất, có một giá trị bị trùng. Nó chưa được lưu lại. Xin vui lòng kiểm tra. - Có một sự trùng lặp trong trường duy nhất. Xin vui lòng kiểm tra lại biểu nhập để lưu Đăng ký này. Xin vui lòng đợi Bỏ qua - Sửa lịch hẹn Không có thông tin cho màn hình này - Quá hạn - Có một quy tắc chương trình không được hỗ trợ. Vui lòng kiểm tra tài liệu. - Không có thông tin cho trường dữ liệu này - Xóa hết thông tin đăng nhập - Để có thể đăng nhập bằng cách sử dụng máy quét dấu vân tay, trước tiên bạn cần phải sử dụng cách mặc định. - Bảo mật sinh trắc học - Đăng nhập nhanh - Bạn có muốn sử dụng dấu vân tay của bạn hoặc phương thức sinh học khác để đăng nhập không? - Bảng - Bảng - https:// Dữ liệu đã đồng bộ sẽ không bị mất. Bạn có muốn tiếp tục không? - Chấp nhận Không thể xóa dữ liệu. Vui lòng thử lại. Đã xóa dữ liệu cục bộ thành công - Phải chọn ít nhất một đơn vị - Đã gửi dữ liệu - Giúp DHIS2 cải thiện ứng dụng này bằng việc chia sẻ lịch sử lỗi liên kết với tên đăng nhập của bạn. - Bạn có muốn giúp chúng tôi cải thiện ứng dụng này không? - Nếu bạn đồng ý, ứng dụng sẽ gửi nhật ký thống kê vô danh và lỗi để giúp chúng tôi cải thiện trải nghiệm và vận hành của người dùng. \n\nĐể biết thêm thông tin chi tiết, xin vui lòng tham khảo chính sách bảo mật của chúng tôi. - chính sách bảo mật - Kiểm tra các trường dữ liệu - Bạn đã mất kết nối mạng trong khi đang thực hiện đồng bộ cấu hình. Vui lòng thử lại sau. - Đồng ý - Tiếp tục - Đường dẫn đến máy chủ - Nhập đường dẫn liên kết đến máy chủ DHIS 2 với đơn vị được cung cấp bởi quản lý của bạn.\n\n Hoặc bạn có thể quét mã QR có chứa đường dẫn liên kết đến máy chủ. - Bạn đã quên mã của bạn phải không? - Bạn muốn làm gì với sự kiện này? - KẾT THÚC Không tìm thấy %s Hồ sơ bạn đang cố truy cập không có. Bạn có muốn tìm kiếm nó không? Được đồng bộ bằng SMS @@ -500,33 +262,16 @@ Đang tải lên Mối quan hệ Đã gửi bằng SMS - Không có xung đột trong trường trình này - Không có kết nối mạng, nhưng dường như có dịch vụ điện thoại - bạn có thể sử dụng SMS. - Không có kết nối mạng Đóng Bây giờ bạn có thể kiểm tra thông tin đồng bộ bằng cách bấm vào đây - Dữ liệu này chỉ được lưu trong thiết bị của bạn, nó chưa được đồng bộ lên máy chủ. - Bạn đã được cập nhật! Tất cả dữ liệu của bạn đã gửi đến máy chủ. Bạn không thể liên kết một hồ sơ với chính nó - Mở khóa phiên đăng nhập - Hoàn tất - Mở - Không hỗ trợ kiểu giá trị này Thay đổi xem lịch - 15 Phút - Mỗi Giờ - Hàng ngày - Hàng tuần - Tuần - Cài đặt đồng bộ: %s Hồ sơ bạn đang truy suất không có đăng ký. Bạn không thể mở bảng trình bày dữ liệu Lỗi định dạng Xóa %s Bạn không có quyền để xóa dữ liệu này - Đường dẫn liên kết không đúng Đang điều chỉnh biểu nhập... - Số người nhận Bạn có chấp nhận gửi %dtin nhắn không? Đang gửi %1$d/%2$d Đang đợi xác nhận số lượng - %d @@ -544,51 +289,29 @@ Không cài đặt cổng Người dùng chưa đăng nhập Mô đung SMS bị tắt - Đang nộp SMS khác Mô đun SMS không được khởi tạo, không tìm thấy siêu dữ liệu yêu cầu. - Hoàn tất Đếm SMS không được chấp nhận Đã Nộp SMS Đọc và chuyển đổi dữ liệu. Mã nộp : %d - Lỗi khi gửi sms SMS đăng ký đối tượng theo dõi SMS nộp sự kiện SMS nộp biểu nhập - Đang bắt đầu - Đang tiến hành - Đã gửi - Thất bại - Đang bắt đầu đồng bộ Đang đồng bộ... - Đồng bộ đã hoàn tất. - Lỗi đã xảy ra trong khi đồng bộ. - Có một lỗi đã xảy ra trong khi đồng bộ. Bấm vào đây để kiểm tra nhật ký lỗi. - Đã hủy đồng bộ Đã sao chép - Hình ảnh đã chọn - Hiển thị trong bản đồ - Hiển thị danh sách - %slà bắt buộc nhưng chưa được cung cấp. - Đã thêm bản đồ ranh giới Bản đồ ranh giới - Vân tay - Vui lòng đặt ngón tay của bạn lên chỗ đọc dấu vân tay Bảo mật Vì lí do bảo mật, phiên bản này của ứng dụng không cho phép sử dụng trong các thiết bị nguồn. Vui lòng sử dụng phiên bản đào tạo. - Có một số lỗi. Vui lòng sửa chúng trước khi tiếp tục. Đang áp dụng các bộ lọc Không có bộ lọc nào được áp dụng Thời điểm Đơn vị - Đang sắp xếp thứ tự - Trạng thái Đồng bộ Đã gán cho tôi Hôm Nay @@ -603,25 +326,18 @@ Từ - Đến Khác Bất cứ khi nào - Lỗi đồng bộ. Kiểm tra giá trị dữ liệu để sửa vấn đề và thử lại. Nếu nó vẫn bị lỗi, hãy liên lạc quản lý của bạn. - Dữ liệu này đã được gửi đến máy chủ nhưng nó không đảm bảo đã được lưu trữ Mở Lịch hẹn Quá hạn Đã đến Đã hoàn tất Đã bỏ qua - Sự kiện: %stối đa: %s%shiện có: %sĐối tượng theo dõi: %stối đa: %s%shiện có%s - Cài đặt bị giới hạn %s\n Sự kiện: %s/%s Đối tượng theo dõi: %s/%s - Ẩn dữ liệu đăng ký - Hiển thị dữ liệu đăng ký Mô đun SMS đã bật Mô đun SMS đã tắt Đang tải xuống dữ liệu cho mô đun SMS. Vui lòng đợi Cổng SMS không được để trống Không có đăng ký để tải lên Nhiệm vụ chuyển đổi này không hỗ trợ - Không hiển thị lại màn hình khóa Cài đặt mã pin Xung đột Thay đổi ngày @@ -646,11 +362,7 @@ Chọn đơn vị Nhập đường dẫn liên kết Nhập giá trị - Chọn hình ảnh - Mã scan - Chọn tùy chọn Các giá trị dành riêng đã tải xuống cho mỗi thuộc tính Đối Tượng Theo Dõi - Các giá trị dành riêng đã tải xuống cho mỗi thuộc tính Đối Tượng Theo Dõi Còn %s giá trị dành riêng Quản lý giá trị dành riêng Sự kiện để tải xuống @@ -670,57 +382,28 @@ Chưa đồng bộ Lỗi đồng bộ Đã đồng bộ SMS - Chi tiết - Ghi chú Đã lưu! - Ban có muốn kiểm tra chất lượng dữ liệu không\? - Mọi thứ đều ổn! - Bạn cũng muốn hoàn tất biểu nhập phải không\? - Đánh dấu đã hoàn tất - Tên - Công thức - Hoàn tất luôn Thiếu %s %s từ %s %s Trạng thái sự kiện - Ngày đăng ký Không có dữ liệu. Bấm \"+\" để tạo hồ sơ mới. Không có dữ liệu. Bạn không có quyền để tạo hồ sơ mới. Không có mô tả hoặc hướng dẫn được cung cấp Dữ liệu để xem xét - Đã lưu và Hoàn tất! Có 1 đăng ký đang hoạt động Mở Hoàn tất Đã hủy - Dữ liệu %s đã chọn không thể tải xuống - Đã hoàn tất được %s: %s - Đã cập nhật: %s - Hoàn thành - Chúng tôi không thể kiểm tra chất lượng dữ liệu. Hãy liên hệ quản lý của bạn. - Bạn có chắc chắn không? - Bạn có muốn mở-lại biểu nhập này không? Ngày - Ngày sự kiện - %s không có các thuộc tính công khai. Vui lòng chọn một chương trình. Chính Sách Bảo Mật Bấm vào đây để kiểm trachính sách bảo mật - Giá trị tọa độ không đúng - Bạn không thể đăng ký Đối Tượng Theo Dõi từ đơn vị khác vào chương trình này. \nXin vui lòng liên hệ quản lý của bạn. Bạn không thể đăng ký %stừ đơn vị khác vào chương trình này bởi vì nó được bảo vệ.\n Hãy liên hệ quản lý của bạn. Trường dữ liệu này bắt buộc Vì lí do bảo mật, phiên bản ứng dụng này không cho phép sử dụng với adb. Vui lòng sử dụng phiên bản đào tạo. Quay lại - Đóng ứng dụng - Thêm chi tiết - Thêm chi tiết - Đóng Sao chép vào bộ nhớ tạm - Đã sao chép vào bộ nhớ tạm - Thông tin lỗi Chúng tôi đã tìm thấy một lỗi khi đang đồng bộ với máy chủ của bạn. Hãy chia sẻ lỗi này với quản lý của bạn nếu có thể. - Chúng ta không thể khởi đầu phiên đăng nhập bằng tên đăng nhập của bạn Có các sự kiện đã lên kế hoạch mà sẽ không chỉnh sửa lịch hẹn. Biểu đồ Danh sách @@ -771,47 +454,26 @@ Phản hồi Chỉ Số Quyền mở máy ảnh bị từ chối.\n Bạn cần bật tính năng máy ảnh để sử dụng chức năng này - Giá trị Biểu đồ và Chỉ số Chụp ảnh - Chọn từ thư viện ảnh - Hoàn thành! Chương trình này đã được bảo vệ Mô tả lý do ở đây - Đang xác thực - Đường dẫn liên kết đã cung cấp không phải là đường dẫn đến máy chủ DHIS2 - Sai thông tin đăng nhập - Máy chủ không xác định - Giá trị phải là số nguyên Phiên đăng nhập đã hết hạn Phiên đăng nhập của bạn đã hết hạn. Vì lý do bảo mật, bạn cần cung cấp thông tin đăng nhập lại. - Giá trị Tuần 1%d 2%s đến 2%s Không hiển thị lại Cấu hình chức năng Xem Radar - Không thể cài đặt kiểu tọa độ Đã theo dõi %s - %s không thể chuyển đổi dữ liệu Ngày Không thể cập nhật trường dữ liệu này. Xin vui lòng thử lại. - Chỉnh sửa - Hiện có Không thể chỉnh sửa dữ liệu này bởi vị chúng được đánh dấu đã hoàn tất Không thể chỉnh sửa dữ liệu này bởi vì thời gian chỉnh sửa đã hết hạn Bạn không có quyền chỉnh sửa dữ liệu này Dữ liệu này không thể sửa bởi vì đơn vị đã bị đóng Bạn không có quyền chỉnh sửa dữ liệu này Bạn không thể chỉnh sửa dữ liệu từ đơn vị này - Đặt lại Tìm Kiếm Tìm kiếm trực tuyến trả về tin nhắn sau: - Cảnh báo quy tắc chương trình - Có một vấn đề cấu hình gây ra một vòng lặp trong các quy tắc chương trình. Hãy liên lạc với quản lý của bạn. - LÀM MỚI - Không rõ - Làm mới lại tất cả dữ liệu - Bạn đã đạt số lượng tài khoản tối đa (%d). Để tạo thêm tài khoản, hãy đăng nhập và xóa một trong những tài khoản của bạn. Xóa Tài khoản - Quản lý Tài Khoản Xử lý sự cố cấu hình Ngôn ngữ Bấm vào đây để thay đổi ngôn ngữ của ứng dụng @@ -830,9 +492,7 @@ Không có kết quả cho tìm kiếm này Có quá nhiều kết quả Thử thay đổi tìm kiếm của bạn để thu hẹp kết quả. - Tạo mới %sMới - Cần phải nhập ít nhất %sthuộc tính để tìm kiếm Ok Mở trang tìm kiếm để tìm bất cứ %snào Bạn có thể tìm kiếm hoặc tạo một %smới @@ -841,7 +501,6 @@ Một số trường dữ liệu có lỗi và chưa được lưu. \n Bạn có muốn xem xét biểu nhập không? Bạn có muốn đánh dấu biểu nhập này là hoàn tất không? Bạn có một số tin nhắn lỗi.\n Bạn có muốn xem xét không? - Nếu bạn tắt bây giờ, tất cả thay đổi sẽ bị hủy bỏ. Đã Mở-lại Tài khoản đã bị vô hiệu hóa Tài khoản của bạn đã bị vô hiệu hóa bởi quản lý chương trình. @@ -851,27 +510,10 @@ Ngày hiện tại: %s Thiết bị: %s Phiên bản hệ điều hành: %s - Mở chi tiết %s - Chi tiết %s Đang đồng bộ %s... - Đã gửi SMS. Đang đợi máy chủ trả lời - Đã xác nhận SMS đến máy chủ. Đang cập nhật Trạng Thái - Chúng tôi không thể xác nhận SMS đến máy chủ hay chưa. Đang cập nhật trạng thái - Đã gửi SMS. Đang cập nhật trạng thái. - Chưa gửi SMS. - Đang mở ứng dụng SMS. Xin vui lòng không chỉnh sửa tin nhắn. Gửi SMS với Bạn đã gửi SMS chưa? - Đang đợi xác nhận thủ công - Đang đồng bộ các sự kiện - Đang đồng bộ các đối tượng theo dõi - Đang đồng bộ các tập dữ liệu - Đang đồng bộ tài nguyên - Đồng bộ hoàn tất - Đồng bộ SMS đang hiển thị nhưng phải được truy suất từng hồ sơ cá nhân Đang tải hình ảnh... - Mô tả chương trình - Sai mã pin Đã đăng ký trong Sở hữu bởi Cần được đồng bộ @@ -891,18 +533,11 @@ Làm mới Không phải bây giờ Bấm vào đây để xem thêm - - Các lỗi %s - - - Các cảnh báo %s - Phiên bản ứng dụng %s đang có. Bạn có muốn tải nó không? Cập nhật phần mềm Để sau Tải xuống ngay Kiểm tra các cập nhật - Đang kiểm tra các cập nhật Không có cập nhật mới Quyền nguồn không xác định bị từ chối.\n Bạn cần cho phép nó để cài đặt. Quyền lưu trữ bị từ chối. \n Bạn cần cho phép để cài phiên bản. @@ -942,18 +577,10 @@ Giai Đoạn Chương Trình sự kiện Dòng thời gian - Bỏ tìm kiếm - Không bắt buộc Cơ sở dữ liệu đã được tải về - Đang nhập cơ sở dữ liệu - Không có các trường tìm kiếm được cấu hình để sử dụng.\nXin vui lòng liên lạc với quản trị của bạn. Hiện thêm Ẩn bớt Đồng bộ - Hiện trường dữ liệu - Ẩn trường dữ liệu - Nhập thành công - Phần này được cấu hình sai.\nXin vui lòng liên lạc quản trị của bạn. Đồng bộ thành công Đang đồng bộ %s... tài nguyên tập tin @@ -967,4 +594,16 @@ Đã chuyển thành công %1$s đã hủy Ngày đến hạn đã được cập nhật - + + + Các lỗi %s + + + + Các cảnh báo %s + + + + Có %s chương trình với các cài đặt riêng + + diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index ba54cdf804a..154008f6a85 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -1,62 +1,29 @@ DHIS2 - 区域健康信息系统 - 2 错误 - - 失误 - - 服务器URL错误 - 证书不正确 - 未知错误 - 服务器内部错误 - 无值 没有更多保留值,请联系管理员 - 没有更多保留值,连接网络重新填充他们 - 错误 出了些问题 - 现在同步 - 与服务器同步中 - 同步 - 元数据 事件 - 跟踪的实体 - - 已完成 - 同步完成 同步错误 同步中发生错误,请重试 同步完成,但我们没有收到所有记录的服务器确认。这些记录在应用程序中仍被标记为“离线”状态。我们建议重试同步。 - 发生错误,服务器未响应。与您的管理员联系。 - 发现结果:1%s - 新加 - 添加 输入%s 输入/跳过 %s - 新调度 流转 - 服务器URL - 用户名 - 口令 - 登录 - 解锁会话 同步你的配置 你的数据很快会被同步 同步你的数据 你的配置已经准备好 你的数据已经准备好 - 配置同步失败 - 数据同步失败 账号恢复 - 需要网络连接才能恢复您的帐户。 每天 @@ -77,139 +44,85 @@ 输入文本 输入长文本 输入数字 - 输入整数 输入负整数 输入正整数或零 输入正整数 - 过滤选项 选择日期 - 改变日历 - 项目已经完成 - 项目不活跃 开放 没完成 事件完成 只读 - 完成 已完成 已取消 重新打开 - 重新打开表单 - 激活 活跃的 同步 发送 更新 - 删除 错误 - 同步 - 发送 - 同步短信 - 完成 - 创建 更新 - 日期 机构 选择的日期没有开放的机构,请选择另外的日期或机构 - 分类选项 维度 经度 - 新事件 - 一次 - 永远 报告期间 - 采集选项 - 如果你设置值,整行的值需要设置才能完成数据集。 - 一些必需的值缺失,你需要设置强制的值才能完成数据集。 - 有强制字段请填充后完成数据集 - 值已被保存 - 没有可用期间可选 到期日期 下一页%1$s 分类选择框 - DD/MM/YYYY 取消 删除 - 总共 最近事件日期 无可用选项 登记清单 活动项目 - 注册的项目 注册 - 上次访问: - 应用 - 查看详情 - 更多 编辑 - 后续跟踪 - 使能后续跟踪 - 后续跟踪关闭 去活 该项目不允许更多事件 - 无数据 事件 首页 - 应用信息 退出 - 阻止会话 显示%s更多… 显示较少… - 1分钟 - 15分钟 30分钟 一小时 六小时 一天(缺省) 12小时 - 自动同步数据 每: 手工 - 自动同步配置 -每: 一周 - 当前同步参数 - 复位缺省值 数据库将被删除,\n 你将被要求再次登录。 接受 取消 现在同步数据 现在同步配置 设置 - 上次同步:1%s - 上次同步:%s 重新填充 - 短信模块: 短信网关 短信结果发送者 SMS 结果超时(秒) - - 数量 - 数量 激活短信提交 等待短信结果响应 - - 这里有%s个项目有特定的设置 - 设置限制 全局 按项目 @@ -227,19 +140,14 @@ 该日志包括你同步数据和元数据的所有错误。 删除本地数据 所有存储在你的设备的采集app数据将被删除。没有同步到服务器的数据将丢失。 - 重置应用数据和配置 - 所有存储在你的设备的采集app数据和配置将被删除。你将被要求重新登录并且没有与服务器同步的数据将会丢失。 短信设置 检查和编辑短信网关的相关参数。 软件更新 - 软件 导出数据库 导出数据库并与管理员共享 状态 - 注册日期 - 搜索 @@ -248,43 +156,19 @@ 书写新笔记 清除 添加笔记 - 反转 - 激活 - 强制字段缺失 - 有些强制字段缺失,如果你后退,所有保存的信息将被删除。 - 有些强制字段缺失,如果你后退,请填充他们 - 某些字段需要您注意。\n您要查看表单吗? 你的数据已经被保存 - 如果退回,所有输入信息将被删除 - 删除并后退 - 有些字段有错误:%s。 \n 请检查。 - 有些强制字段缺失。你可以完成数据录入并退出,但不能完成该事件。 坐标 - 分段列表 - 已经完成 %s 个问题,总共%s。 - 完成 %s共 %s - 完成并关闭 - 天数 - - - 事故日期 - 本地结果 - 在线结果 过去的项目 你没有执行该操作的权限 - 添加为 - 清除 期间 - (%d)机构 - 等级%d 欢迎来到DHIS2 你可以在这里查看你的活动 你可以应用一个过滤器 @@ -293,16 +177,11 @@ 选择主菜单的其它操作 - 创建关系 下一个 你至少需要输入 %d个属性便于搜索 - 你至少需要输入 一个属性便于搜索 - 有多余%d个结果,请再细化搜索条件 - 输入你的搜索条件 导入二维码数据 - 保存 标识 属性 @@ -314,33 +193,18 @@ 无数据 无效的二维码 该属性不能被添加 - 该注册不能添加 关于 注册的项目 - 全选 - 清除选择 - 选择的过滤器没有相关信息,请尝试改变 共享 共享二维码 - 按类型搜索对在线搜索不可能。\n 请从清单中选择一个项目。 - 最大 - 当前 跟踪实体 跟踪实体 - 按机构限制 - 按项目限制 - 项目列表 重置应用数据和配置 - 不能添加该关系 检查 - 警告 - 错误 保存 保留值 - 你想从二维码添加更多数据? - 应用版本:%s SDK版本:%s @@ -351,148 +215,45 @@ 由挪威奥斯陆大学信息系的一部分,DHIS2项目组开发和维护, 关于该应用更多信息或问题请联系 android@dhis2.org - 口令缺失,请输入。 - 用户名缺失,请输入。 - 服务器运行版本不是2.29,请更新服务器版本或使用测试环境继续 - 服务器运行的版本不是 %s。更新服务器版本使用测试的环境继续。 - 有些事出错,请检查服务器URL,用户名和口令是否正确后再试。 - 服务器不能完成该请求。 - 试图登录服务器存在问题。 - 登录错误 - 强制字段缺失 - 在线搜索发生未知的错误 - 解析结果发生错误 - 在线搜索返回错误。 - 服务器出现错误 选择一个项目开始注册 你没有请求的权限 - 功能还没有实现。 - 获取关系标签发生错误 所有 %s 不是有效的的电话号码 - 不是有效的电子邮件 - 仅仅允许负数 仅仅允许正整数和零 - 仅仅允许正数。 - 仅仅 从0到1的值允许 - 仅仅从0到100的值允许 - 选择过滤日期 选择选项 - 报告的问题 - 生成新事件 - 你要创建另外的事件? 完成的事件 该项目的所有事件已经完成。你同时要关闭该项目吗? - 你同时要完成登记注册吗? 您也想完成%s吗? 检查 首页 例子 - 添加组件 显示帮助 - 同步你的数据 - 你的配置 - 设置从服务器下载多少记录 - 检查和管理剩下多少保留值 - 检查是否到服务器的连接失败 - 释放更多盘空间 - 删除启动后的所有东西 - 发现在本地和联机服务器的实体 - 你可以切换到其它项目 - 搜索或添加一个新实体。你需要先搜索再添加一个新的 - 点击这里清除字段和重启搜索。 这是实体仪表盘 查看实体概要信息 - 通过二维码或短信共享信息。 - 或者标记实体为后续跟踪。 - 点击创建或调度一个事件或流转到其它机构 这里你将看到所有的事件。点击查看事件详情。 通过菜单添加关系、查看指标或写笔记。 - 点击查看实体的所有注册数据或者创建一个新的 - 点击删除该事件。该操作不能取消。 - 完成事件 - 所有该项目的相关事件将列表在这里。 - 点击添加新事件 输入所有数据创建事件 点击检查事件完成状态 - 点击完成或重新打开事件 - 通过二维码从其它设备读取并存储信息。 - 和服务器同步你的数据 - 用四个数字阻止会话。不要忘记你的口令。 - 退出以便改变用户或服务器,你将可以再次登录即使没有互联网。 - %s: 关系 还没有登记的事件,点击“+”新建一个。 - 还没有登记或上报的事件 数据值 信息 不能读取该ID 删除本地数据 概要 - 关系 - 指标 - 分析 该项目无指标 - 笔记 - 不能完成 - 无法保存 - 表格中有警告 - 你想做什么? - 有些字段有错误,请检查,才能完成项目 所有的注册 显示所有活动项目的仪表盘 - 打开同步错误日志 同步错误日志 分享 - 你的配置同步失败。服务器可能有错误,点击查看更多信息。 - 前一个 - 下一个 - 详情 - 指标 - 笔记 - - 稍后完成 - - 保存 - 有错误的字段 - 有些字段有错误,他们已经保存,请检查。 值应该唯一,发现相同的。还没有保存,请检查。 - 唯一字段发现相同的,请检查表单 以便保存注册 请等待 跳过 - 重新调度 该屏没有信息 - 逾期 - 存在不支持的项目规则,请检查文档。 - 该字段没有相关信息 - 空证书 - 为了能够使用指纹扫描器,你需要先使用缺省的方法 - 生物特征安全 - 快速登录 - 您想使用指纹或其他生物识别方法登录吗? - - - https:// 没有同步的数据不会丢失,你真想要继续 - 接受 数据不能删除,请重试 删除本地数据成功完成 - 至少得选择一个机构 - 发送数据 - 帮助提升该应用通过分享你的错误日志。 - 你想帮助我们改进这个应用程序吗? - 如果您同意,应用程序将发送匿名统计数据和错误日志,帮助我们改善用户体验和性能。 - 隐私政策 - 检查字段 - 你丢掉了互联网连接,当执行配置同步的时候。稍后再试。 - 同意 - 继续 - 服务器URL - 输入管理员提供的服务器地址。\n\n 可选的你可以扫描服务器地址 二维码 - 忘记你的数字口令 - 对该事件你想做什么? - 结束 %s没有发现 你试图访问的记录不可用。你想搜索吗? 通过短信同步。 @@ -500,33 +261,16 @@ 上载中 关系 通过短信发送 - 该项目没有冲突。 - 网络不可用。但是看起来电话系统可用,你可以使用短信 - 网络连接不可用。 关闭 点击这里检查同步信息。 - 数据仅仅存储在你的设备。还没有与服务器同步。 - 已经更新。所有的数据已经发送到服务器。 你不能关联记录到自身。 - 解锁会话 - 完成 - Open - 不支持的值类型 改变日历视图。 - 15分钟 - 每小时 - 每天 - 每周 - - 同步设置:%s 你试图访问的记录还没有注册。你不能访问仪表盘。 格式化错误 删除 %s 你没有删除记录的权限 - 没有有效的URL 调整表单。。。 - 接收号码 你接受发送 %d消息? 发送 %1$d/%2$d 等待确认量:%d @@ -544,51 +288,29 @@ 没有设置网关 用户没有登录 短信模块被关闭 - 其它的短信提交在进行中 短信模块没有初始化,没有发现需要的元数据。 - 已完成 短信数量不能接受 开始的短信提交。 数据读取和转换的。提交ID:%d - 短信提交发送错误 短信 实体注册和登记 SMS事件注册 SMS数据集提交 - 开始 - 进行中 - 发送 - 失败 - 开始同步 同步 - 同步完成 - 同步中发生错误。 - 同步期间发生错误。点击这里查看错误日志 - 取消的同步 副本 - 选择的图像 - 地图上显示 - 显示列表 - %s是强制的但是没有提供 - 采集的多边形。 多边形 - 指纹 - 请在指纹阅读器输入指纹 安全 基于安全原因,该版本的app不允许使用根设备。请使用培训版本。 - 有些错误,请修正后继续 应用过滤器 无过滤器 期间 机构 - 排序 - 状态 同步 指派给我 今天 @@ -603,25 +325,18 @@ 从——到 其它 任何时候 - 同步失败,检查数据值修正错误再试。如果仍然失败,联系管理员。 - 数据已经发送到服务器,但不保证已经被保存。 开放 调度 逾期 已随访 已完成 跳过的 - 事件:%s 最大:%s%s 当前:%s ,实体:%s 最大:%s%s 当前:%s - 设置限制:%s。\n 事件:%s/%s 实体:%s/%s - 隐藏注册数据 - 显示注册数据 短信模块被激活 短信模块被关闭 下载短信模块,请等待。 短信网关不能为空 没有注册可以上传 转换任务不支持。 - 不再显示锁屏 设置PIN 冲突 改变日期 @@ -646,11 +361,7 @@ 选择机构 输入url 输入值 - 选择图像 - 扫描码 - 选择选项 每个TEI的属性下载的保留值 - 每个TEI的属性下载的保留值 剩下%s 保留值 管理保留值 下载的事件 @@ -670,57 +381,28 @@ 未同步 同步错误 短信已同步 - 详情 - 评论 已经保存! - 你要检查数据质量? - 一切都很好 - 你要完成数据集? - 标记已经完成 - 名称 - 公式 - 任何都要完成 遗失 %s %s 从%s %s 事件状态 - 注册日期 没有数据,点击“+”添加新的记录 没有数据,您没有权限添加新记录 没有提供描述或指导 复查的数据 - 保存并完成! 已经存在活动的注册 Open 完成 取消 - 数据 选择的%s不能下载 - %s完成:%s - 已更新:%s - 完成 - 不能检查质量,联系管理员 - 你确信? - 你要重新打开数据集? 日期 - 事故日期 - %s没有公有属性,请选择一个项目 私有策略 点击这里检查隐私策略 - 坐标值无效 - 你不能从该项目的其它机构注册TEI(跟踪实体),因为被保护。联系你的管理员。 您无法在此项目中加入来自其他组织单位的 %s,因为它受到保护。\n请与您的管理员联系。 此字段是必填字段 出于安全原因,此版本的应用程序不允许与adb一起使用。请使用培训版本。 回退 - 关闭应用 - 更多细节 - 更多细节 - 关闭 复制到剪贴板 - 复制到剪贴板 - 错误信息 与您的服务器同步时发现错误。如果可能,与系统管理员共享错误。 - 我们无法与您的用户发起会话 已经计划的事件不会重新安排 图表 列表 @@ -771,47 +453,26 @@ 反馈 指标 相机权限被拒绝。\n 您需要启用它才能使用此功能。 - 图表和指标 拍照 - 从图库中选择 - 完成! 该项目受保护 在此说明原因 - 验证中 - 提供的服务器URL不是dhis实例 - 证书不正确 - 未知服务器 - 值必须是一个整数 会话已过期 您当前的会话已过期。出于安全原因,您将需要再次提供凭据 - 星期%d %s到%s 不再显示 特征配置 显示为雷达图 - 无法设置坐标类型 跟进%s - %s 无法解析为日期 无法更新此字段。请再试一次 - - 可用的 此数据不可编辑,因为已标记为已完成 此数据不可编辑,因为其编辑时间已过期 您无权编辑此数据 此数据不可修改,因为单位部门已关闭 您无权编辑此数据 您无法编辑此机构的数据 - 重置搜索 网上搜索返回如下信息: - 项目规则警告 - 存在导致规则循环的配置问题。联系您的管理员。 - 刷新 - 未知 - 刷新所有数据 - 您已达到最大帐户数 (%d)。要添加新帐户,请登录并删除您的一个帐户 删除帐户 - 管理帐户 配置疑难解答 语言 点击此处更改应用程序的语言 @@ -830,9 +491,7 @@ 此搜索没有结果 结果太多 尝试更改搜索以缩小结果范围。 - 新建 新%s - 需要至少输入%s属性才能搜索 Ok! 开始搜索以找到任何 %s 您可以搜索或创建一个新的 %s @@ -841,7 +500,6 @@ 一些字段有错误并且它们没有被保存。 \n您要查看表单吗? 您想将此表单标记为已完成吗? 您有一些错误消息。\n您要查看它们吗? - 如果您现在退出,更改将被丢弃。 重新开放 帐户已禁用 您的帐户已被管理员禁用。 @@ -851,27 +509,10 @@ 当前日期:%s 设备:%s 操作系统版本:%s - 打开 %s 详细信息 - %s 细节 正在同步 %s… - 短信发送。等待服务器响应。 - 短信确认到达服务器。更新状态 - 我们无法确认 SMS 已到达服务器。更新状态 - 短信发送。更新状态。 - 短信未发送。 - 打开短信应用。请不要修改留言。 发送短信 你发短信了吗? - 等待手工确认 - 同步事件 - 同步跟踪的实体 - 同步数据集 - 同步资源 - 同步完成 - SMS 同步可用,但必须为每个单独的记录访问 正在下载图片... - 项目说明 - 错误的密码 已加入 拥有者 需要同步 @@ -891,18 +532,11 @@ 刷新 现在不要 点击此处探索 - - %s 错误 - - - %s 警告 - 应用程序版本%s 现已推出。您想下载吗? 软件更新 之后 现在下载 检查更新 - 查询更新 没有新的更新 未知来源权限被拒绝。\n您需要启用它才能安装版本。 存储权限被拒绝。\n您需要启用它才能安装版本。 @@ -942,18 +576,10 @@ 项目阶段 事件 时间线 - 清除搜索 - 可选项描述 数据库已下载 - 导入数据库 - 没有配置可用的搜索字段,请联系您的管理员。 更多 显示较少 同步 - 显示字段 - 隐藏字段 - 导入成功 - 此部分配置错误。 成功同步 正在同步 %s… 文件资源 @@ -970,4 +596,16 @@ 完整%s 停用%s 重新打开%s + + + %s 错误 + + + + %s 警告 + + + + 这里有%s个项目有特定的设置 + diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 1936f3925c6..11b458b2e71 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -1,33 +1,13 @@ DHIS2 - 区域健康信息系统 - 2 错误 - - 错误 - - 服务器URL错误 - 凭证错误 - 未知错误 - 服务器内部错误 - 无值 没有更多保留值,请联系管理员 - 没有更多保留值,连接网络重新填充他们 - 错误 出问题了 - 现在同步 - 与服务器同步中 - 现在同步 - 元数据 事件 - 跟踪的实体 - - 已完成 - 同步完成 同步错误 同步中发生错误,请重试 @@ -35,31 +15,18 @@ 失败:同步过程中出了问题。如果有连接,请重试。如果错误仍然存在,请联系您的管理员。 您的数据存在冲突。请同步您的配置,查看数据并尝试再次同步。 您的部分数据未能同步。 - 发生错误,服务器未响应。与您的管理员联系。 - 发现结果:1%s - 新增 - 添加 输入%s 输入/跳过 %s - 新调度 转派 - 服务器URL - 用户名 - 口令 - 登录 - 解锁会话 同步你的配置 你的数据很快会被同步 同步你的数据 你的配置已经准备好 你的数据已经准备好 - 配置同步失败 - 数据同步失败 账号恢复 - 需要网络连接才能恢复您的帐户。 每日 @@ -80,139 +47,86 @@ 输入文本 输入长文本 输入数字 - 输入整数 输入负整数 输入正整数或零 输入正整数 - 过滤选项 选择日期 - 改变日历 - 项目已经完成 - 项目不活跃 开放 没完成 事件完成 只读 - 完成 已完成 已取消 重新打开 - 重新打开表单 - 激活 活跃的 同步 发送 更新 - 删除 错误 - 同步 - 发送 - 同步短信 - 完成 - 创建 更新 - 日期 机构 选择的日期没有开放的机构,请选择另外的日期或机构 - 分类选项 纬度 经度 - 新事件 - 一次 - 永远 报表周期 - 采集选项 - 如果你设置值,整行的值需要设置才能完成数据集。 - 一些必需的值缺失,你需要设置强制的值才能完成数据集。 - 有强制字段请填充后完成数据集 - 值已被保存 - 没有可用期间可选 到期日期 下一页%1$s 分类选择框 - DD/MM/YYYY 取消 删除 - 总共 最近事件日期 无可用选项 报名名单 活动项目 - 加入的项目 加入 - 上次访问: - 应用 - 查看详情 - 更多 编辑 - 后续跟踪 - 使能后续跟踪 - 后续跟踪关闭 去活 该项目不允许更多事件 - 无数据 事件 主页 - 应用信息 退出 - 阻止会话 显示%s更多… 显示较少… - 1分钟 - 15分钟 30分钟 1小时 6小时 1天(默认) 12小时 - 自动同步数据 每: 手工 - 自动同步配置: 1周 - 当前同步参数 - 复位缺省值 数据库将被删除,\n 你将被要求再次登录。 接受 取消 现在同步数据 现在同步配置 设置 - 上次同步:1%s 最后一次同步时间 - 上次同步:%s 重新填充 - 短信模块: 短信网关 短信结果发送者 SMS 结果超时(秒) - - 数量 - 数量 激活短信提交 等待短信结果响应 - - 这里有%s个项目有特定的设置 - 同步周期 设置限制 全局 @@ -231,12 +145,9 @@ 该日志包括你同步数据和元数据的所有错误。 删除本地数据 所有存储在你的设备的采集app数据将被删除。没有同步到服务器的数据将丢失。 - 重置应用数据和配置 - 所有存储在你的设备的采集app数据和配置将被删除。你将被要求重新登录并且没有与服务器同步的数据将会丢失。 短信设置 检查和编辑短信网关的相关参数。 软件更新 - 软件 导出数据库 导出数据库并与管理员共享 双重身份验证 @@ -244,8 +155,6 @@ 分两步启用或禁用身份验证。 - 加入日期 - 搜索 @@ -254,43 +163,19 @@ 书写新笔记 清除 添加笔记 - 反转 - 激活 - 强制字段缺失 - 有些强制字段缺失,如果你后退,所有保存的信息将被删除。 - 有些强制字段缺失,如果你后退,请填充他们 - 某些字段需要您注意。\n您要查看表单吗? 你的数据已经被保存 - 如果退回,所有输入信息将被删除 - 删除并后退 - 有些字段有错误:%s。 \n 请检查。 - 有些强制字段缺失。你可以完成数据录入并退出,但不能完成该事件。 坐标 - 分段列表 - 已经完成 %s 个问题,总共%s。 - 完成 %s共 %s - 完成并关闭 - - - - 星期 发生日期 - 本地结果 - 在线结果 过去的项目 你没有执行该操作的权限 - 添加为 - 清除 周期 - (%d)机构 - 等级%d 欢迎来到DHIS2 你可以在这里查看你的活动 你可以应用一个过滤器 @@ -299,16 +184,11 @@ 在主菜单上的选择其他操作 - 创建关系 下一步 你至少需要输入 %d个属性便于搜索 - 你至少需要输入 一个属性便于搜索 - 有多余%d个结果,请再细化搜索条件 - 输入你的搜索条件 导入二维码数据 - 保存 标识 属性 @@ -320,33 +200,18 @@ 无数据 无效的二维码 该属性不能被添加 - 该加入登记不能添加 关于 加入的项目 - 全选 - 清除选择 - 选择的过滤器没有相关信息,请尝试改变 分享 共享二维码 - 按类型搜索对在线搜索不可能。\n 请从清单中选择一个项目。 - 最大 - 当前 跟踪实体 跟踪实体 - 按机构限制 - 按项目限制 - 项目列表 重置应用数据和配置 - 不能添加该关系 检查 - 警告 - 错误 保存 保留值 - 你想从二维码添加更多数据? - 应用版本:%s SDK版本:%s @@ -357,148 +222,45 @@ DHIS2 项目组开发和维护,这是奥斯陆大学信息学系的一部分。 关于该应用更多信息或问题请联系 android@dhis2.org和lin_xd@126.com - 口令缺失,请输入。 - 用户名缺失,请输入。 - 服务器运行版本不是2.29,请更新服务器版本或使用测试环境继续 - 服务器运行的版本不是 %s。更新服务器版本使用测试的环境继续。 - 有些事出错,请检查服务器URL,用户名和口令是否正确后再试。 - 服务器不能完成该请求。 - 试图登录服务器存在问题。 - 登录错误 - 强制字段缺失 - 在线搜索发生未知的错误 - 解析结果发生错误 - 在线搜索返回错误。 - 服务器出现错误 选择一个项目开始加入登记 你没有请求的权限 - 功能还没有实现。 - 获取关系标签发生错误 所有 %s 不是有效的的电话号码 - 不是有效的电子邮件 - 仅仅允许负数 仅仅允许正整数和零 - 仅仅允许正数。 - 仅仅 从0到1的值允许 - 仅仅从0到100的值允许 - 选择过滤日期 选择选项 - 报告的问题 - 生成新事件 - 你要创建另外的事件? 完成的事件 该项目的所有事件已经完成。你同时要关闭该项目吗? - 您还想同时完成加入登记吗? 您也想完成%s吗? 检查 主页 例子 - 添加组件 显示帮助 - 同步你的数据 - 你的配置 - 设置从服务器下载多少记录 - 检查和管理剩下多少保留值 - 检查是否到服务器的连接失败 - 释放更多盘空间 - 删除启动后的所有东西 - 发现在本地和联机服务器的实体 - 你可以切换到其它项目 - 搜索或添加一个新实体。你需要先搜索再添加一个新的 - 点击这里清除字段和重启搜索。 这是实体仪表盘 查看实体概要信息 - 通过二维码或短信共享信息。 - 或者标记实体为后续跟踪。 - 点击创建或调度一个事件或流转到其它机构 这里你将看到所有的事件。点击查看事件详情。 通过菜单添加关系、查看指标或写笔记。 - 点击查看实体的所有登记数据或者创建一个新的 - 点击删除该事件。该操作不能取消。 - 完成事件 - 所有该项目的相关事件将列表在这里。 - 点击添加新事件 输入所有数据创建事件 点击检查事件完成状态 - 点击完成或重新打开事件 - 通过二维码从其它设备读取并存储信息。 - 和服务器同步你的数据 - 用四个数字阻止会话。不要忘记你的口令。 - 退出以便改变用户或服务器,你将可以再次登录即使没有互联网。 - %s: 关系 没有注册事件,单击“ +”添加一个新事件。 - 没有注册事件。 数据值 信息 不能读取该ID 删除本地数据 概要 - 关系 - 指标 - Analytics 该项目无指标 - 笔记 - 不能完成 - 无法保存 - 表格中有警告 - 你想做什么? - 有些字段有错误,请检查,才能完成项目 所有的加入登记 显示所有活动项目的仪表盘 - 打开同步错误日志 同步错误日志 分享 - 你的配置同步失败。服务器可能有错误,点击查看更多信息。 - 前一个 - 下一个 - 详情 - 指标 - 笔记 - - 稍后完成 - - 保存 - 有错误的字段 - 有些字段有错误,他们已经保存,请检查。 值应该唯一,发现相同的。还没有保存,请检查。 - 唯一字段发现相同的,请检查表单 以便保存注册 请等待..... 跳过 - 重新调度 该屏没有信息 - 逾期 - 存在不支持的项目规则,请检查文档。 - 该字段没有相关信息 - 空证书 - 为了能够使用指纹扫描器,你需要先使用缺省的方法 - 生物特征安全 - 快速登录 - 您想使用指纹或其他生物识别方法登录吗? - - - https:// 没有同步的数据不会丢失,你真想要继续 - 接受 数据不能删除,请重试 删除本地数据成功完成 - 至少得选择一个机构 - 发送数据 - 通过共享与您的用户ID相关的错误日志来帮助DHIS2改进此应用程序。 - 你想帮助我们改进这个应用程序吗? - 如果您同意,应用程序将发送匿名统计数据和错误日志,帮助我们改善用户体验和性能。 - 隐私政策 - 检查字段 - 你丢掉了互联网连接,当执行配置同步的时候。稍后再试。 - 同意 - 继续 - 服务器URL - 输入系统管理员为贵组织提供的 DHIS 2 服务器网址。\n\n或者,您也可以扫描包含服务器 URL 的 QR 代码 - 忘记你的数字口令 - 对该事件你想做什么? - 结束 %s没有发现 你试图访问的记录不可用。你想搜索吗? 通过短信同步。 @@ -506,33 +268,16 @@ 上载中 关系 通过短信发送 - 该项目没有冲突。 - 网络不可用。但是看起来电话系统可用,你可以使用短信 - 网络连接不可用。 关闭 点击这里检查同步信息。 - 数据仅仅存储在你的设备。还没有与服务器同步。 - 已经更新。所有的数据已经发送到服务器。 你不能关联记录到自身。 - 解锁会话 - 完成 - 开放 - 不支持的值类型 改变日历视图。 - 15分钟 - 每小时 - 每日 - 每周 - - 同步设置:%s 你试图访问的记录还没有注册。你不能访问仪表盘。 格式化错误 删除 %s 你没有删除记录的权限 - 没有有效的URL 调整表单。。。 - 接收号码 你接受发送 %d消息? 发送 %1$d/%2$d 等待确认量:%d @@ -550,51 +295,29 @@ 没有设置网关 用户没有登录 短信模块被关闭 - 其它的短信提交在进行中 短信模块没有初始化,没有发现需要的元数据。 - 已完成 短信数量不能接受 开始的短信提交。 数据读取和转换的。提交ID:%d - 短信提交发送错误 SMS 跟踪实体实例TEI注册和报名 SMS事件注册 SMS数据集提交 - 开始 - 进行中 - 发送 - 失败 - 开始同步 同步 - 同步完成 - 同步中发生错误。 - 同步期间发生错误。点击这里查看错误日志 - 取消的同步 副本 - 选择的图像 - 地图上显示 - 显示列表 - %s是强制的但是没有提供 - 采集的多边形。 多边形 - 指纹 - 请在指纹阅读器输入指纹 安全 基于安全原因,该版本的app不允许使用根设备。请使用培训版本。 - 有些错误,请修正后继续 应用过滤器 无过滤器 周期 机构 - 排序 - 状态 同步 指派给我 今天 @@ -609,26 +332,19 @@ 从——到 其它 任何时候 - 同步失败,检查数据值修正错误再试。如果仍然失败,联系管理员。 - 数据已经发送到服务器,但不保证已经被保存。 开放 调度 逾期 已随访 已完成 跳过的 - 事件:%s 最大:%s%s 当前:%s ,实体:%s 最大:%s%s 当前:%s - 设置限制:%s。\n 事件:%s/%s 实体:%s/%s 设置限制%s - 隐藏加入数据 - 显示加入数据 短信模块被激活 短信模块被关闭 下载短信模块,请等待。 短信网关不能为空 没有登记可以上传 转换任务不支持。 - 不再显示锁屏 设置PIN 冲突 改变日期 @@ -653,11 +369,7 @@ 选择机构 输入url 输入值 - 选择图像 - 扫描码 - 选择选项 每个TEI的属性下载的保留值 - 每个TEI的属性下载的保留值 剩下%s 保留值 管理保留值 待下载的事件 @@ -677,57 +389,28 @@ 未同步 同步错误 短信已同步 - 详情 - 评论 已经保存! - 您要检查数据质量吗? - 一切看起来都不错! - 你要完成数据集? - 标记为完成 - 名称 - 公式 - 任何都要完成 遗失 %s %s 从%s %s 事件状态 - 登记日期 没有数据,点击“+”添加新的记录 没有数据,您没有权限添加新记录 没有提供描述或指导 复查的数据 - 保存并完成! 已经存在活动的注册 开放 完成 已取消 - 数据 选择的%s不能下载 - %s完成:%s - 已更新:%s - 完成 - 不能检查质量,联系管理员 - 你确信? - 你要重新打开数据集? 日期 - 事件日期 - %s没有公有属性,请选择一个项目 私有策略 点击这里检查隐私策略 - 坐标值无效 - 你不能从该项目的其它机构注册TEI(跟踪实体),因为被保护。联系你的管理员。 您无法在此项目中加入来自其他组织单位的 %s,因为它受到保护。\n请与您的管理员联系。 此字段是必填字段 出于安全原因,此版本的应用程序不允许与adb一起使用。请使用培训版本。 后退 - 关闭应用 - 更多细节 - 更多细节 - 关闭 复制到剪贴板 - 复制到剪贴板 - 错误信息 与您的服务器同步时发现错误。如果可能,与系统管理员共享错误。 - 我们无法与您的用户发起会话 还有计划的事件,不能重新安排 图表 列表 @@ -778,47 +461,26 @@ 反馈 指标 相机权限被拒绝。\n 您需要启用它才能使用此功能。 - 图表和指标 拍照 - 从图库中选择 - 完成! 该项目受保护 在此说明原因 - 验证中 - 提供的服务器URL不是dhis实例 - 凭证错误 - 未知服务器 - 值必须是整数 会话已过期 您当前的会话已过期。出于安全原因,您将需要再次提供凭据 - 星期%d %s到%s 不再显示 特征配置 显示为雷达图 - 无法设置坐标类型 跟进%s - %s 无法解析为日期 无法更新此字段。请再试一次 - - 可用的 此数据不可编辑,因为已标记为已完成 此数据不可编辑,因为其编辑时间已过期 您无权编辑此数据 此数据不可修改,因为单位部门已关闭 您无权编辑此数据 您无法编辑此机构的数据 - 重置搜索 网上搜索返回如下信息: - 项目规则警告 - 存在导致规则循环的配置问题。联系您的管理员。 - 刷新 - 未知 - 刷新所有数据 - 您已达到最大帐户数 (%d)。要添加新帐户,请登录并删除您的一个帐户 删除帐户 - 管理帐户 配置疑难解答 语言 点击此处更改应用程序的语言 @@ -837,9 +499,7 @@ 此搜索没有结果 结果太多 尝试更改搜索以缩小结果范围。 - 新建 新%s - 需要至少输入%s属性才能搜索 Ok! 开始搜索以找到任何 %s 您可以搜索或创建一个新的 %s @@ -848,7 +508,6 @@ 一些字段有错误并且它们没有被保存。 \n您要查看表单吗? 您想将此表单标记为已完成吗? 您有一些错误消息。\n您要查看它们吗? - 如果您现在退出,更改将被丢弃。 重新开放 帐户已禁用 您的帐户已被管理员禁用。 @@ -858,27 +517,10 @@ 当前日期:%s 设备:%s 操作系统版本:%s - 打开 %s 详细信息 - %s 细节 正在同步 %s… - 短信发送。等待服务器响应。 - 短信确认到达服务器。更新状态 - 我们无法确认 SMS 已到达服务器。更新状态 - 短信发送。更新状态。 - 短信未发送。 - 打开短信应用。请不要修改留言。 发送短信 你发短信了吗? - 等待手工确认 - 同步事件 - 同步跟踪的实体 - 同步数据集 - 同步资源 - 同步完成 - SMS 同步可用,但必须为每个单独的记录访问 正在下载图片... - 项目说明 - 错误的密码 已加入 拥有者 需要同步 @@ -898,18 +540,11 @@ 刷新 现在不要 点击此处探索 - - %s 错误 - - - %s 警告 - 应用程序版本%s 现已推出。您想下载吗? 软件更新 之后 现在下载 检查更新 - 查询更新 没有新的更新 未知来源权限被拒绝。\n您需要启用它才能安装版本。 存储权限被拒绝。\n您需要启用它才能安装版本。 @@ -951,18 +586,10 @@ 项目阶段 事件 时间线 - 清除搜索 - 可选项描述 数据库已下载 - 导入数据库 - 没有配置可用的搜索字段,请联系您的管理员。 更多 显示较少 同步 - 显示字段 - 隐藏字段 - 导入成功 - 此部分配置错误。 成功同步 正在同步 %s… 文件资源 @@ -979,4 +606,16 @@ 完整%s 停用%s 重新打开%s + + + %s 错误 + + + + %s 警告 + + + + 这里有%s个项目有特定的设置 + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e9a55d33666..76b17745f6c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,36 +1,13 @@ Dhis2 - dhis - 2 - \u0009 - 20180901 Error - - Error - Errors - - Wrong server url - Wrong credentials - Unexpected error - Internal server error - no value There are no more reserved values. Contact your system administrator - There are no more reserved values. Connect to the network to refill them - errors Something went wrong - Synchronise now - Synchronising with server - Syncing now - Metadata Events - Tracked entities - - Finished - Sync complete Sync Error An error has occurred during synchronisation. Please retry. @@ -38,32 +15,19 @@ FAIL: Something went wrong in the sync process. If you have connection please try again. If the error persists, contact your administrator. There are conflicts in your data. Please sync your configuration, review your data and try syncing again. Some of your data failed to sync. - There was an error and the server did not respond. Contact your administrator. - %s results found - Add new - Add Enter %s Enter / Skip %s - Schedule new Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat Referral - Server url - Username - Password - Log In - Unlock session Syncing your Configuration Your Data will shortly be synced Syncing your Data Your Configuration is ready Your Data is ready - Configuration sync failed - Data sync failed Account recovery - A network connection is needed to recover your account. Daily @@ -84,141 +48,86 @@ Enter text Enter long text Enter number - Enter integer Enter negative integer Enter positive integer or zero Enter positive integer - Filter options Choose date - Change calendar - Program Completed - Program inactive Open Not completed Event completed Read only - Finish and complete Completed Cancelled Re-open - Re-open form - Activate Active Sync To send To update - To delete Error - SYNC - SEND - SYNC SMS - Completion - Create Update - Date Org unit There aren\'t any open Organization Units for the selected date. Please select another date or another Organisation Unit. - Category option Latitude Longitude - New event - Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - One time - Permanent Report period - Cat option - If you set a value, the whole row needs all of values to complete the Data Set. - Some values required are missing. You need set mandatory values to complete the Data Set. - There are missing mandatory fields. Please, fill them to complete the data set. - Value is saved! - There is no available periods to select. Due date Next %1$s Cat combo - DD/MM/YYYY Cancel Delete - Total Most recent event date No options available Enrollment list Active programs - Programs to enroll Enroll - Last Visit: - apply - See Details - VIEW MORE Edit - Follow up - Follow up enabled - Follow up disabled Deactivate This program does not allow more events - No data events Home - App Info Log Out - Block Session Show %s more… Show less… - 1 Minute - 15 Minutes 30 Minutes 1 Hour 6h 1 Day (Default) 12h - Automatic Sync Data every: Manual - Automatic Sync Configuration every: 1 Week - Current sync parameters: - Reset to default Database will be deleted.\nYou will be asked to log in again. Accept Cancel SYNC Data Now SYNC Configuration Now Settings - Last sync on: %s Last sync on - Last sync on: %s Refill - SMS module: SMS gateway SMS result sender SMS result timeout (sec) - seconds - number - number Enable SMS submission Wait for SMS result response - - There is %s program with specific settings - There are %s programs with specific settings - Sync period Settings limited Globally @@ -237,12 +146,9 @@ This log contains all errors caused by syncing your data and metadata. Delete local data All Capture App data stored in your device will be deleted. Data which is not synced to the server will be lost. - Reset app data & configuration - Your configuration and App data stored in the device will be deleted. You will be asked to log in again and data which is not synced to the server will be lost. SMS Settings Check and edit parameters related to the sms gateway Software update - Software Export database Export your database and share it with your administrator Two factor authentication @@ -250,8 +156,6 @@ Enable or disable the authentication in two steps. - Enrollment date - Search @@ -260,43 +164,19 @@ Write new note clear Add note - Revert - Activated - Mandatory fields are missing - Some mandatory fields are missing. If you want to go back now, all saved information will be deleted. - Some mandatory fields are missing. If you want to go back, please fill them. - Some fields need your attention.\nDo you want to review the form? Your data is not saved - If you go back now all information entered will be deleted. - Delete and go back - Some fields have errors:\n%s\nPlease, check them. - Some mandatory fields are missing. You can finish data entry and exit, but the event cannot be completed. Coordinates for the - Section list - %s questions of %s completed - %s of %s completed - Complete and close - Days - Months - Years - Weeks Incident date - Local results - Online results Past programs You don\'t have the required permission to perform this action - Add as… - Clear Period - (%d) Org Unit - Level %d Welcome to dhis2 Here you can see your activities You can apply a filter… @@ -305,17 +185,11 @@ Check other actions on the main menu - Create relationship Next You need to enter at least %d of the attributes to do a search - You need to enter at least one of the attributes to do a search - There is more than %d results. Please enter further search criteria - Your search criteria didn\'t return any result.\nRevise your criteria or enroll a new %s - Enter your search criteria Import QR data - Save OK Identification Attributes @@ -327,33 +201,18 @@ no data Invalid QR code This attribute can\'t be added - This enrollment can\'t be added About Programs to enroll - select all - clear selection - There is no information for the filters selected. Please try changing them. Share Share QR - Search by type is not possible for online search.\nPlease select a program from the list. - Max - Current TEI TEIs - Limit by organisation unit - Limit by program - Program list Reset app data & configuration - It\'s not possible to add this relationship Check this! - Warning - Error Save Reserved Values - Do you want to add more data from QR? - App Version: %s SDK Version: %s @@ -364,148 +223,45 @@ Developed and maintained by the DHIS2 project, part of University of Oslo, department of informatics. For more information or questions about this application, please write to android@dhis2.org - Password is missing. Please fill this field. - Username is missing. Please fill this field. - This server is running a dhis version different than 2.29. Update your server version or use the testing environment to proceed. - This server is running a dhis version different than %s. Update your server version or use the testing environment to proceed. - Something went wrong. Please check that server url, username and password are correct and try again. - The server could not complete this request. - There has been a problem while trying to log into the server. - Login error - Mandatory fields are missing - Unexpected error while searching online - Error while parsing results - Searching online returned an error - Something went wrong in the server Select a program to enable enrolling You don\'t have the requiered permission - This functionality is not ready yet. - Error getting relationship label All %s This is not a valid phone number - This is not a valid email - Only negative numbers are allowed Only positive numbers or zero allowed - Only positive numbers are allowed - Only values from 0 to 1 are allowed - Only values from 0 to 100 are allowed - Select dates to filter Select option - Issue reported - Generate new event - Do you want to create another event? Events Completed All events in this program are completed. Would you like to close the program as well? - Would you like to complete the enrollment as well? Would you like to complete the %s as well? Check Home EXAMPLE - Add widget Show help - Synchronize your data… - …your configuration… - …set how many records to download from server… - Check and manage how many reserved values are left - Check if a connection to the server failed - Free some disk space - …or delete everything to start over. - Find your entities both in your local device and the online server. - You can switch to other programs - Search or Add new entities. You need to search before you can add a new one! - Click here to clean the fields and restart the search. This is the entity dashboard See entities profile information… - …Share information via QR or SMS… - …Or mark the entity for follow-up - Click to create or schedule an event or refer to another Org Unit. Here you will see all events. Click to see an event detail. Navigate through the menu to add relationships, see indicators or write notes. - Click to see all enrollments of your entity or create a new one. - Click to delete this event. This action can not be undone. - Complete the event. - All events related to this program will be listed here. - Click to add a new event Enter all data to create the event Click to check the event completion status. - Click to complete or re-open an event - Read and store information from other devices via QR - Synchronize your data with the server - Block session with a 4 digit code. Do not forget your code! - Log out to change user or server. You will be able to log in again even if there is no internet connection. - %s: relationships There are no events registered, click \"+\" to add a new one. - There are no events registered. Data values Info Could not read this Id Delete local data Overview - Relationships - Indicators - Analytics There are no indicators for this program. - Notes - Unable to complete - Unable to save - There are warnings in the form - What do yo want to do? - Some fields have errors. Please, check them to be able to complete All enrollments Show dashboard with all active programs - Open sync errors log Sync error log Share with... - Your configuration sync has failed. There could be errors in your server. Click here for more information. - PREV - NEXT - Details - Indicators - Notes - - Complete later - - Finish - Fields with errors - Some fields have errors. They have not been saved. Please, check them. The value should be unique, a coincidence has been found. It has not been saved. Please check it. - A coincidence in a unique field has been found. Please check form to save Enrollment. Please wait Skip - Reschedule There is no information for this screen - Overdue - There is one program rule which is not supported. Please check the documentation - No info for this field - Empty Credentials - To be able to log in using the fingerprint scanner you first need to use the default way - Biometric Security - Quick login - Would you like to use your fingerprint or another biometric method to log in? - Tables - Table - https:// Non synchronized data will be lost. Do you really want to continue? - Accept Data could not be deleted. Please retry. Delete local data finished successfully. - At least one organisation unit must be selected - Send data - Help DHIS2 improve this app by sharing error logs associated to your user id. - Do you want to help us improve this app? - If you say yes the app will send anonymous statistics and error logs which help us improve user experience and performance.\n\nFor further details, please refer to our privacy policy. - privacy policy - Check fields - You lost your internet connection while performing your configuration sync. Please try again later - Agree - Continue - Server url - Enter the DHIS 2 server url for your organisation as provided by your system administrator.\n\nAlternatively, you can scan a QR code containing the URL of your server - Forgot your code? - What would you like to do for this event? - END %s not found The record you are trying to access is not available. Would you like to search for it? Synced by SMS @@ -513,33 +269,16 @@ Uploading Relationship Sent by sms - There are no conflicts for this program - Network connection is not available, but it looks like there is phone services - you can use SMS. - Network connection is not available. Close Now you can check sync information by clicking here - This data is stored in your device only, it is not synced with the server. - You are up to date! All your data is sent to the server. You can\'t relate a record with itself - Unblock session - Complete - Open - Unsupported value type Change calendar view - 15 minutes - Every hour - Daily - Weekly - Week - Synchronization setting: %s The record you are trying to access has no enrollment. You can\'t access the dashboard. Formatting error Delete %s You do not have the authority to delete this record - This is not a valid url Adjusting form… - Receiver number Do you accept to send %d messages? Sending %1$d/%2$d Waiting amount confirmation - %d @@ -557,51 +296,29 @@ No gateway set User not logged in SMS module is disabled - Another SMS submission ongoing SMS module not initiated, not found required metadata - Completed SMS count not accepted Started sms submission Data read and converted. Submission id: %d - Error sending sms submission SMS TEI registration and enrollment SMS event submission SMS data set submission - Starting - In progress - Sent - Failed - Starting synchronization. Synchronizing... - Synchronization completed. - Error has happened during synchronization. - An error has happened during synchronization. Click here to check error logs - Cancelled synchronization. Copied - Image selected - Show in map - Show list - %s is mandatory but has not been provided. - Polygon captured Polygon - Fingerprint - Please, put your finger in your fingerprint reader. Security For security reasons, this version of the app is not allow to be used in rooted devices. Please use the training version. - There are some errors. Please fix them before continuing. Filters applying No filters applied Period Org. Unit - Sorting - Status Sync Assigned to me Today @@ -616,26 +333,19 @@ From - To Other Anytime - Sync failed. Sync failed. Check the data values to try to fix the problem and try again. If it keeps failing contact your system administrator - This data has been sent to the server but it is not guaranteed to have been stored Open Schedule Overdue Visited Completed Skipped - Events:%smax:%s%scurrent:%s TEI:%smax:%s%scurrent:%s - Settings limited %s\nEvents: %s/%s TEI: %s/%s Settings limited %s - Hide enrollment data - Show enrollment data SMS module enabled SMS module disabled Downloading data for SMS module. Please wait SMS gateway can\'t be empty There are no enrollments to upload This convertTask is not supported - Don´t show again lock screen Set pin Conflict Change date @@ -665,11 +375,7 @@ Choose organisation unit Enter url Enter value - Choose image - Scan code - Choose option Reserved values downloaded per TEI attribute - Reserved values downloaded per TEI attribute %s reserved values left Manage reserved values Events to download @@ -689,60 +395,31 @@ Not Synced Sync Error SMS Synced - Details - Comments Saved! - Do you want to check data quality? - Everything looks good! - Do you also want to complete the data set? - Mark as completed - Name - Formula - Complete anyway Missing %s %s from %s %s Event status @string/enrollment_status - Enrollment date There are no data. Click \"+\" to add new a new record There are no data. You don\'t have permission to add new records. No description or instruction provided Data to review - Saved and completed! There is already an active enrollment Open Complete Cancelled - - Data The selected %s could not be downloaded. - Completed by %s: %s - Updated: %s - Done - We could not check data quality. Contact your administrator - Are you sure? - Do you want to re-open the data set? Date - Event date - %s has no public attributes. Please select a program Privacy Policy Click here to check our privacy policy - Coordinates values are not valid - You cannot enroll TEIs from other org units in this program because it is protected.\nContact your administrator. You cannot enroll a %s from other org units in this program because it is protected.\nContact your administrator. This field is mandatory For security reasons, this version of the app is not allow to be used with adb. Please use the training version. Oops! Something didn\'t go as planned.\nLet us get you back in action. Go back - Close app - More details - More details - Close Copy to clipboard - Copied to clipboard - Error information We found an error when syncing with your server. Share the error with your system administrator if possible. - We could not init the session with your user There are planned events that won\'t be re-scheduled Charts List @@ -794,49 +471,28 @@ Feedback Indicators Camera permission is denied.\nYou need to enable it to use this feature. - Value Charts and indicators Take Photo - Choose from gallery - Done! This program is protected Describe the reason here - Authenticating - Provided server url is not a dhis instance - Wrong credentials - Unknown server - Value must be an integer The session has expired Your current session has expired. For security reasons you will need to provide your credentials again - Values %s - %s Week %d %s to %s %d %s - %d %s Do not show again Feature Configuration Show as Radar - Can not set coordinate type Followed up %s - %s can\'t be parsed as a date This field could not be updated. Please try again - Edition - Available This data is not editable because is marked as completed This data is not editable because its edition time is expired You do not have permission to edit this data This data is not editable because the organization unit is closed You do not have permission to edit this data You cannot edit data from this organisation unit - Reset search The online search returned the following message: - Program rules warning - There is a configuration issue causing a loop in the rules. Contact you administrator. - REFRESH - Unknown - Refresh all data - You have reached the maximum number of accounts (%d). To add a new account, log in and delete one of your accounts Delete Account - Manage Accounts Configuration troubleshooting Language Tap here to change the language of the application @@ -855,9 +511,7 @@ There are no results for this search Too many results Try changing your search to narrow down the results. - Create new New %s - It is necessary to enter at least %s attributes to search Ok Start a search to find any %s You can search or create a new %s @@ -866,7 +520,6 @@ Some fields have errors and they are not saved. \nDo you want to review the form? Do you want to mark this form as complete? You have some error messages.\nDo you want to review them? - If you exit now the changes will be discarded. Re-opened Account disabled Your account has been disabled by an administrator. @@ -876,27 +529,10 @@ Current date: %s Device: %s Os version: %s - Open %s details - %s details Syncing %s… - SMS sent. Waiting for server response. - SMS confirmed to reach server. Updating Status - We can\'t confirm the SMS reached the server. Updating Status - SMS sent. Updating status. - SMS not sent. - Opening SMS app. Do not modify the message please. Send Sms with Did you send the sms? - Awaiting manual confirmation - Syncing events - Syncing tracked entities - Syncing data sets - Syncing resources - Syncing done - SMS sync is available but has to be accessed for each individual record Downloading images... - Program description - Wrong pin Enrolled in Owned by Sync needed @@ -916,20 +552,11 @@ Refresh Not now Tap here to explore - - %s error - %s errors - - - %s warning - %s warnings - App version %s is now available. Do you want to download it? Software update Later Download now Check for updates - Checking for updates There are no new updates Unknown sources permission is denied.\nYou need to enable it to install version. Storage permission is denied.\nYou need to enable it to install version. @@ -971,18 +598,10 @@ Program stage event Timeline - Clear search - Optional Database downloaded - Importing database - There are no search fields configured to use.\nPlease contact your admin. Show more Show less Sync - Show fields - Hide fields - Import successful - This section is misconfigured.\nContact your administrator. Successful sync Syncing %s… file resources @@ -999,4 +618,19 @@ Complete %s Deactivate %s Re-open %s + + + %s error + %s errors + + + + %s warning + %s warnings + + + + There is %s program with specific settings + There are %s programs with specific settings + diff --git a/commons/src/main/res/values-ar-rIQ/strings.xml b/commons/src/main/res/values-ar-rIQ/strings.xml index c34ec174a81..94cd7cf5951 100644 --- a/commons/src/main/res/values-ar-rIQ/strings.xml +++ b/commons/src/main/res/values-ar-rIQ/strings.xml @@ -8,13 +8,10 @@ البرامج علاقات التفاصيل - التفاصيل البحث حزم البيانات - الحالة التاريخ تحديد نوع الفترة الزمنية - يومي أسبوعي كل اسبوعين شهري @@ -62,8 +59,6 @@ المؤشرات المخططات البيانية مكتمل - القيمة - البيانات اليوم إزالة يومي diff --git a/commons/src/main/res/values-ar/strings.xml b/commons/src/main/res/values-ar/strings.xml index 149d9166be8..7344a2b8e1d 100644 --- a/commons/src/main/res/values-ar/strings.xml +++ b/commons/src/main/res/values-ar/strings.xml @@ -8,7 +8,6 @@ إلغاء نعم لا - الغاء التحديد عرض قائمة عرض جدول عرض خريطة @@ -19,7 +18,6 @@ الملاحظات إدخال البيانات التفاصيل - التفاصيل تحديد الخيار بحث الأحداث @@ -33,14 +31,11 @@ لم يتم تطبيق عوامل تصفية الفترة الزمنية الوحدة التنظيمية - فرز - الحالة حالة التزامن تم تعيينه لي التاريخ تمت متابعة %s تحديد نوع الفترة الزمنية - يومي أسبوعي كل اسبوعين أسبوعياً ابتداءً من يوم الأربعاء @@ -59,13 +54,10 @@ تبدأ السنة المالية في اكتوبر تبدأ السنة المالية في نوفمبر - - حالة التزامن للإرسال للتحديث - للحذف خطأ تحذير رفع @@ -158,7 +150,6 @@ كلمة المرور مفقودة. الرجاء إدخال كلمة المرور. اسم المستخدم مفقود. الرجاء إدخال اسم المستخدم. - يقوم هذا الخادم بتشغيل إصدار dhis مختلف عن 2.29. قم بتحديث إصدار الخادم الخاص بك أو استخدم بيئة الاختبار للمتابعة. يقوم هذا الخادم بتشغيل إصدار DHIS2 مختلف عن %s. قم بتحديث إصدار الخادم الخاص بك أو اتصل بالمسؤول. هناك خطأ ما. يرجى التحقق من صحة عنوان URL الخاص بالخادم واسم المستخدم وكلمة المرور وحاول مرة أخرى. آسف! فشل شيء ما من جانب الخادم. @@ -212,7 +203,6 @@ البحث على الإنترنت متاح فقط للوحدات التنظيمية المتاحة للمستخدم للبحث. الخادم غير متوفر حالياً. حاول مرة أخرى في وقت لاحق. أنت غير متصل بالإنترنت. اتصل بالإنترنت وحاول مرة أخرى. - هذا الحقل غير متاح للإدخال بالموبايل إضافة صورة إضافة ملف موافق\! @@ -221,9 +211,7 @@ ليس الان المراجعة مكتمل - القيمة تجاهل التغييرات - بيانات اتصال الشبكة غير متوفر يلزم الاتصال بالإنترنت لاستخدام الخرائط. @@ -231,13 +219,11 @@ موعد استحقاقها اليوم تم تنزيل الملف بنجاح - يجب عليك تقديم سبب للتحقق من %s في هذا البرنامج المحمي. سيتم تسجيل جميع الأنشطة. هذه البيانات غير قابلة للتحرير لأن %s اكتملت أو تم إلغاؤها مسجل في: حذف %s الأسابيع %d %s إلى %s - إعادة فتح إعادة محاولة المزامنة مزامنة... diff --git a/commons/src/main/res/values-bn/strings.xml b/commons/src/main/res/values-bn/strings.xml index b67f407d0cd..057ea8ec990 100644 --- a/commons/src/main/res/values-bn/strings.xml +++ b/commons/src/main/res/values-bn/strings.xml @@ -4,7 +4,6 @@ না মন্তব্য তথ্যের অন্তর্ভুক্তি - অবস্থা তারিখ ভুল সম্পন্ন diff --git a/commons/src/main/res/values-ckb/strings.xml b/commons/src/main/res/values-ckb/strings.xml index e8c0ed47541..cbb8da8f4b8 100644 --- a/commons/src/main/res/values-ckb/strings.xml +++ b/commons/src/main/res/values-ckb/strings.xml @@ -11,7 +11,6 @@ تةواو كرا ماوة - پێگە بەروار هەڵە تەواوبوو @@ -29,7 +28,6 @@ ڕاووبۆچون نیشاندەر تەواوبکە - بةها ئەمڕۆ لابردن diff --git a/commons/src/main/res/values-cs/strings.xml b/commons/src/main/res/values-cs/strings.xml index 50f2effd560..11e12893ef5 100644 --- a/commons/src/main/res/values-cs/strings.xml +++ b/commons/src/main/res/values-cs/strings.xml @@ -9,7 +9,6 @@ Zrušit Ano Ne - vymazat výběr Zobrazení seznamu Zobrazení tabulky Zobrazení mapy @@ -21,7 +20,6 @@ Poznámky Vstup dat Detaily - Detaily Vybrat možnost Hledat události @@ -35,8 +33,6 @@ Nejsou použity žádné filtry Období Org. jednotka - Třídění - Stav Synchronizace Přiděleno mně datum @@ -45,7 +41,6 @@ @string/enrollment_status Navázalo na %s Vybrat typ období - Denně Týdně po 14ti dnech Týdně od středy @@ -58,7 +53,6 @@ Čtvrtletně od listopadu Šestiměsíční Od dubna každých šest měsíců - Šestiměsíčně od července Počínaje listopadem šest měsíců Ročně Finanční rok začínající v dubnu @@ -66,13 +60,10 @@ Finanční rok začínající v říjnu Finanční rok začínající v listopadu - - Synchronizace Poslat Aktualizovat - Smazat Chyba Varování Nahrávám @@ -165,7 +156,6 @@ Chybí heslo. Prosím vložte heslo. Chybí uživatelské jméno. Zadejte uživatelské jméno. - Tento server používá jinou verzi DHIS než 2.29. Aktualizujte verzi serveru nebo pokračujte testovacím prostředím. Tento server používá verzi DHIS2 odlišnou od %s. Aktualizujte verzi serveru nebo kontaktujte svého administrátora. Něco se pokazilo. Zkontrolujte prosím správnost adresy URL serveru, uživatelského jména a hesla a zkuste to znovu. Promiňte! Něco selhalo na straně serveru. @@ -225,9 +215,7 @@ V dotazu jsou neplatné znaky. Požádejte správce o ověření konfigurace serveru (relaxedQueryChars,...). Server je momentálně nedostupný. Zkuste to později. Jste offline. Připojte se k internetu a zkuste to znovu. - Toto pole není k dispozici pro mobilní zachycení Přidat obrázek - Přidat podpis Přidat soubor Ok Poloha vašeho zařízení je odpojena. Povolte jej k zachycení souřadnic @@ -235,9 +223,7 @@ Teď ne Posouzení Dokončit - Hodnota Zrušit změny - Data Síťové připojení není k dispozici K používání map je nutné připojení k internetu. @@ -272,12 +258,10 @@ Soubor úspěšně stažen - Zobrazit souřadnice %s %s data %s souřadnice %s datum - %s stav V tomto chráněném programu musíte uvést důvod kontroly na %s. Veškerá činnost bude zaznamenána. Důvod pro kontrolu %s Tyto data nelze upravovat, protože %s je dokončen nebo zrušen @@ -285,14 +269,12 @@ %s zrušeno Nový %s Zapsáno v: - Program %s Více zápisů Odebrat z Obnovit tento záznam Zobrazit časovou osu Skupina podle etapy - %s dokončeno %s vytvořeno Nový %s @@ -306,12 +288,9 @@ Tato stránka %s nemůže mít datum v budoucnosti. Změňte ho prosím. Nepodařilo se vložit nový %s Týden %d %s až %s - Skupina %s podle etapy - Zobrazit časovou osu %s Nejsou zaregistrovány žádné stránky %s, kliknutím na tlačítko \"+\" přidáte novou. Nejsou registrovány žádné stránky %s. Na stránkách %s jsou plánovány akce, které nebudou přeplánovány. - znovu otevřít Opakování synchronizace Probíhá synchronizace ... @@ -331,4 +310,6 @@ Není v režimu registrace TOTP 2FA Vymazat vše + + %s stav diff --git a/commons/src/main/res/values-da/strings.xml b/commons/src/main/res/values-da/strings.xml index 4cf9bb987b9..238317f52b3 100644 --- a/commons/src/main/res/values-da/strings.xml +++ b/commons/src/main/res/values-da/strings.xml @@ -6,11 +6,8 @@ No Programs Details - Details Data sets - Status Date - Daily Weekly Månedlige Bi-monthly diff --git a/commons/src/main/res/values-en-rUS/strings.xml b/commons/src/main/res/values-en-rUS/strings.xml index b72c89af550..aa28fde5a0a 100644 --- a/commons/src/main/res/values-en-rUS/strings.xml +++ b/commons/src/main/res/values-en-rUS/strings.xml @@ -10,7 +10,6 @@ Password is missing. Please enter password. Username is missing. Please enter username. - This server is running a dhis version different than 2.29. Update your server version or use the testing environment to proceed. This server is running a DHIS2 version different than %s. Update your server version or contact your admin. Something went wrong. Please check that server URL, username and password are correct and try again. Sorry! Something failed on the server side. diff --git a/commons/src/main/res/values-es-rES/strings.xml b/commons/src/main/res/values-es-rES/strings.xml index 7a24c9faab6..6856c124efc 100644 --- a/commons/src/main/res/values-es-rES/strings.xml +++ b/commons/src/main/res/values-es-rES/strings.xml @@ -9,7 +9,6 @@ Cancelar No - Borrar selección Vista de lista Vista de tabla Vista del mapa @@ -20,7 +19,6 @@ Notas Introducción de datos Detalles - Detalles Seleccionar opción Buscar Eventos @@ -34,13 +32,10 @@ Filtros desactivados Periodo Unidad Org. - Orden - Estado Sincronizado Asignado a mí Fecha Seguido %s - Diario Semanal Mensual Anual @@ -48,7 +43,6 @@ Sincronizado Por enviar Para actualizar - Para borrar Error Advertencia Subiendo @@ -138,7 +132,6 @@ La contraseña está vacía. Ingrese la contraseña. El usuario está vacío. Ingrese el usuario. - Este servidor trabaja sobre una versión de dhis distinta a 2.29. Actualice el servidor o utilize el entorno de pruebas para continuar. Este servidor tiene una version de DHIS2 diferente de %s. Actualice su servidor o contacte a su administrador. Algo ha ido mal. Por favor, compruebe que tanto la url del servidor como el usuario y contraseña son correctos y pruebe otra vez. Disculpe, hubo un error del lado del servidor. @@ -196,7 +189,6 @@ No hay suficientes atributos para realizar la búsqueda. Por favor redefina la búsqueda añadiendo más atributos. La búsqueda online solo está disponible para las unidades organizativas de búsqueda. El query contiene caracteres invalidos. Por favor contacte a su administrador para verificar la configuración del servidor (relaxedQueryChars,...). - Este campo no está disponible para la captura por móvil. Añadir imagen Añadir archivo De acuerdo @@ -205,14 +197,11 @@ Ahora no Revisar Completar - Valor Descartar los cambios - Datos Hoy Inscrito en: Eliminar %s Semana %d %s a %s - Reabrir Sincronizando... Eliminar diff --git a/commons/src/main/res/values-es/strings.xml b/commons/src/main/res/values-es/strings.xml index 7677a34705d..ba21e4b48be 100644 --- a/commons/src/main/res/values-es/strings.xml +++ b/commons/src/main/res/values-es/strings.xml @@ -9,7 +9,6 @@ Cancelar No - Borrar selección Vista de lista Vista de tabla Vista del mapa @@ -21,7 +20,6 @@ Notas Introducción de datos Detalles - Detalles Seleccionar opción Buscar Eventos @@ -35,8 +33,6 @@ Filtros desactivados Periodo Unidad Org. - Orden - Estado Sincronizado Asignado a mí Fecha @@ -45,7 +41,6 @@ @string/enrollment_status Seguido %s Seleccionar tipo de periodo - Diario Semanal Quincenal Semanal con inicio el miércoles @@ -58,7 +53,6 @@ Trimestral con inicio en noviembre Semestral Semestral a partir de abril - Semestral con inicio en julio Semestral con inicio en noviembre Anual Año fiscal con inicio en abril @@ -66,13 +60,10 @@ Año fiscal con inicio en octubre Año fiscal con inicio en noviembre - - Sincronizado Por enviar Para actualizar - Para borrar Error Advertencia Subiendo @@ -165,7 +156,6 @@ La contraseña está vacía. Ingrese la contraseña. El usuario está vacío. Ingrese el usuario. - Este servidor trabaja sobre una versión de dhis distinta a 2.29. Actualice el servidor o utilize el entorno de pruebas para continuar. Este servidor tiene una version de DHIS2 diferente de %s. Actualice su servidor o contacte a su administrador. Algo ha ido mal. Por favor, compruebe que tanto la url del servidor como el usuario y contraseña son correctos y pruebe otra vez. Disculpe, hubo un error del lado del servidor. @@ -225,9 +215,7 @@ La consulta contiene caracteres inválidos. Por favor contacte a su administrador para verificar la configuración del servidor (relaxedQueryChars,...). El servidor no está disponible actualmente. Vuelve a intentarlo más tarde. Estas desconectado. Conéctese a Internet e inténtelo nuevamente. - Este campo no está disponible para la captura por móvil. Añadir imagen - Añadir firma Añadir archivo De acuerdo La ubicación de su dispositivo está desconectada. Por favor habilítela para capturar coordenadas. @@ -235,9 +223,7 @@ Ahora no Revisar Completar - Valor Descartar los cambios - Datos Conexión de red no disponible. Se requiere una conexión a Internet para poder utilizar los mapas. @@ -279,7 +265,6 @@ Archivo descargado correctamente - Registro @@ -290,7 +275,6 @@ %s datos %s coordenadas %s fecha - %s estado Debes proporcionar un motivo para consultar %s en este programa protegido. Toda la actividad será registrada. Motivo para consultar %s Estos datos no se pueden editar porque %s está completado o cancelado. @@ -298,14 +282,12 @@ %s se ha cancelado Nuevo %s Inscrito en: - Programa %s Más inscripciones Eliminar de Actualizar este registro Ver como línea de tiempo Ver por etapa - evento @@ -325,12 +307,9 @@ %s no puede tener una fecha en el futuro. Por favor, modifíquela. No fue posible insertar %s Semana %d %s a %s - Agrupar %s por etapa  - Mostrar línea de tiempo de %s No hay %s registrados. Haz clic en “+” para agregar uno nuevo. No hay %s registrados. Hay %s programados que no serán reprogramados - Reabrir Reintentar sincronización Sincronizando... @@ -348,4 +327,6 @@ Importación de la base de datos fallida Archivo no válido Limpiar todo + + %s estado diff --git a/commons/src/main/res/values-fr/strings.xml b/commons/src/main/res/values-fr/strings.xml index 72f5db28171..e6f74d572d4 100644 --- a/commons/src/main/res/values-fr/strings.xml +++ b/commons/src/main/res/values-fr/strings.xml @@ -8,7 +8,6 @@ Annuler Oui Non - effacer la sélection Vue de liste Vue de tableau Vue de la carte @@ -19,7 +18,6 @@ Notes Saisie de données Details - Details Sélectionnez une option Chercher événements @@ -33,13 +31,10 @@ Aucun flitre n\'est appliqué Période Unité d\'org. - Trier - Statut Synchronisation Assigné à moi Date Sélectionner type de période - Quotidien Hebdomadaire Bi-hebdomadaire Hebdomadaire débutant un mercredi @@ -58,13 +53,10 @@ Année financière débutant par octobre Année financière débutant par Novembre - - Synchronisation Envoyer Prêts à actualiser - A supprimer Erreur Attention Téléchargement en cours @@ -154,7 +146,6 @@ Le mot de passe est manquant. Veuillez entrer le mot de passe. Le nom d\'utilisateur est manquant. Veuillez entrer le nom d\'utilisateur. - Ce serveur a une version différente de 2.29. Mettre à jour la version ou utiliser un environnement d\'essai pour continuer L\'URL fournie n\'est pas un serveur DHIS2. Nom d\'utilisateur ou le mot de passe sont incorrects Serveur inconnu @@ -181,9 +172,7 @@ Il n\'y a pas assez d\'attributs pour effectuer la recherche. Veuillez affiner votre recherche avec plus d\'attributs. La recherche en ligne n\'est disponible que pour vos unités organisationnelles de recherche d\'utilisateurs. Vous n\'êtes pas connecté. Veuillez-vous connecter et réssayer. - Ce champ n\'est pas disponible pour la capture mobile Ajouter une image - Ajouter une signature Ajouter un fichier Ok L\'emplacement de votre appareil est déconnecté. Veuillez l\'activer pour capturer les coordonnées @@ -191,9 +180,7 @@ Pas maintenant Vérifier Terminer - Valeur Annuler les modifications - Données Connexion réseau indisponible Une connexion Internet est nécessaire pour utiliser les cartes. @@ -209,7 +196,6 @@ Inscrire à: Supprimer 1%s Semaine %d %s à %s - rouvrir Réessayer la synchronisation Synchronisation... diff --git a/commons/src/main/res/values-hi-rIN/strings.xml b/commons/src/main/res/values-hi-rIN/strings.xml index 45fa1a37cb9..24b3a02eecf 100644 --- a/commons/src/main/res/values-hi-rIN/strings.xml +++ b/commons/src/main/res/values-hi-rIN/strings.xml @@ -12,7 +12,6 @@ पूरा हुआ तारीख - रोज़ाना साप्ताहिक मासिक वार्षिक @@ -50,9 +49,7 @@ अभी नहीं रिव्यू पूरा हुआ - वैल्यू बदलावों को छोड़ना है - डेटा आज %d दिन बाकी है @@ -60,7 +57,6 @@ फ़ाइल सफलतापूर्वक डाउनलोड हो गई - %s डेटा सिंक हो रहा है… हटाएं diff --git a/commons/src/main/res/values-id/strings.xml b/commons/src/main/res/values-id/strings.xml index 03e4b6b5122..5bd3ae1e942 100644 --- a/commons/src/main/res/values-id/strings.xml +++ b/commons/src/main/res/values-id/strings.xml @@ -8,7 +8,6 @@ Batal Iya Tidak - hapus pilihan Tampilan daftar Tampilan tabel Tampilan peta @@ -19,7 +18,6 @@ Catatan Data entri Rincian - Rincian Pilih opsi Pencarian Even @@ -33,13 +31,10 @@ Tidak ada filter yang diterapkan Periode Organisasi Satuan - Penyortiran - Status Sinkronkan Ditugaskan kepada saya Tanggal Pilih tipe periode - Harian Mingguan Dwiwulanan Bulanan @@ -51,7 +46,6 @@ Sinkronkan Untuk dikirim Untuk diperbarui - Untuk dihapus Kesalahan Peringatan Mengunggah @@ -133,17 +127,13 @@ Grafik Grafik dan indikator - Server ini menjalankan versi dhis yang berbeda dari 2.29. Perbarui versi server Anda atau gunakan pengujian lingkungan untuk melanjutkan. Kesalahan saat penguraian hasil Tambahkan gambar Tambahkan berkas Lengkap - Nilai Hapus perubahan - Data Hari ini Minggu %d %s hingga %s - Buka kembali Sedang sinkronisasi... Hapus diff --git a/commons/src/main/res/values-km/strings.xml b/commons/src/main/res/values-km/strings.xml index e162244a975..bc28b3ae5ec 100644 --- a/commons/src/main/res/values-km/strings.xml +++ b/commons/src/main/res/values-km/strings.xml @@ -10,7 +10,6 @@ ទំនាក់ទំនង ចំណាំ លម្អិត - លម្អិត កំណត់​ជម្រើស ស្វែងរក ព្រឹត្តិការណ៏ @@ -18,10 +17,8 @@ Done កំឡុងពេល - ស្ថានភាព បញ្ចូន កាលបរិច្ឆេទ - រាល់​ថ្ងៃ រាល់​សប្ដាហ៍ រាល់​ខែ រាល់ពីរសប្តាហ៍ @@ -31,7 +28,6 @@ បញ្ចូន ដើម្បីធ្វើបច្ចុប្បន្នភាព - ដើម្បីលុប កំហុសបច្ចេកទេស បើក @@ -73,16 +69,12 @@ មតិ​ឆ្លើយតប Indicators គំនូសតាង(ក្រាប) - ម៉ាស៊ីនមេនេះកំពុងដំណើរការខុសពី DHIS ២.២៩។ សូមធ្វើបច្ចុប្បន្នភាពលើម៉ាស៊ីនមេរបស់អ្នក​ កំហុសខណៈពេលញែកលទ្ធផល បញ្ចូលឯកសារ រក្សាទុកការកែប្រែ បញ្ចប់ - តម្លៃ លុបការកែប្រែ - Data ថ្ងៃនេះ - បើកឡើងវិញ លុបចេញ រាល់​ថ្ងៃ diff --git a/commons/src/main/res/values-lo/strings.xml b/commons/src/main/res/values-lo/strings.xml index b56aa1d51e7..0be681c83eb 100644 --- a/commons/src/main/res/values-lo/strings.xml +++ b/commons/src/main/res/values-lo/strings.xml @@ -9,7 +9,6 @@ Cancel ແມ່ນ ບໍ່ມີ - ລຶບການເລືອກ ສະແດງຮູບແບບລາຍການ ເບີ່ງຕາຕະລາງ ເບີ່ງແຜ່ນທີ່ @@ -20,7 +19,6 @@ ຂໍ້ຄວາມ ປ້ອນຂໍ້ມູນ ລາຍລະອຽດ - ລາຍລະອຽດ ເລືອກທາງເລືອກ ຄົນຫາ ເຫດການ @@ -34,14 +32,11 @@ ບໍ່ໄດ້ໃຊ້ຕົວກອງ ຊ່ວງເວລາ ຫົວ​ໜ່ວຍ​ການ​ຈັດ​ຕັ້ງ - ການຈັດຮຽງ - ສະຖານະ ອັບເດດຂໍ້ມູນໃຫ້ຄືກັນ ມອບໝາຍໃຫ້ຂ້ອຍ ວັນທີ່ ຕິດຕາມ%s ​ເລືອກ​ໄລ​ຍະ​ເວ​ລາ​ປະ​ເພດ​ຕ່າງໆ - ທຸກໆມື້ ລາຍອາທິດ ສອງອາທິດຕໍ່ຄັ້ງ ລາຍເດືອນ @@ -53,7 +48,6 @@ ອັບເດດຂໍ້ມູນໃຫ້ຄືກັນ ສົ່ງ ຕ້ອງການອັບເດດ - ເພື່ອລືບອອກ ເກີດການຜິດພາດ ແຈ້ງເຕືອນ ກຳລັງອັບໂຫຼດ @@ -143,7 +137,6 @@ ບໍ່ມີລະຫັດຜ່ານ. ກະລຸນາໃສ່ລະຫັດຜ່ານ. ບໍ່ມີຊື່ຜູ້ໃຊ້. ກະລຸນາປ້ອນຊື່ຜູ້ໃຊ້ - ຄອມພີວເຕີໜ່ວຍແມ່ກໍາລັງທໍາງານກັບລະບົບ DHIS2 ລຸ້ນສູງກ່ວາ 2.29. ກະລຸນາ ນໍາໃຊ້ລຸນທີ່ສູງກ່ວາ ຫຼື ນໍາໃຊ້ລະບົບທົດລອງແທນ ຄອມພິວເຕີໜ່ວຍແມ່ເຄື່ອງນີ້ກຳລັງໃຊ້ເວີຊັນ DHIS2 ທີ່ແຕກຕ່າງຈາກ%s . ອັບເດດລຸ່ນຂອງຄອມພິວເຕີເຄື່ອງແມ່ຂອງທ່ານ ຫຼື ຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ. ມີບາງສິ່ງບາງຢ່າງຜິດພາດ. ກະລຸນາກວດເບິ່ງທີ່ຢູ່ຂອງເຄື່ອງຄອມພິວເຕີໜ່ວຍແມ່, ຊື່ຜູ້ໃຊ້ ແລະ ລະຫັດຜ່ານວ່າຖືກຕ້ອງແລ້ວ ແລ້ວລອງໃໝ່ອີກຄັ້ງ. ຂໍອາໄພ! ມີບາງຢ່າງລົ້ມເຫຼວໃນເຄື່ອງຄອມພິວເຕີໜ່ວຍແມ່. @@ -199,9 +192,7 @@ ຄຸນລັກສະນະບໍ່ພຽງພໍທີ່ຈະດໍາເນີນການຄົ້ນຫາ. ກະລຸນາປັບປຸງການຄົ້ນຫາຂອງທ່ານດ້ວຍຄຸນລັກສະນະເພີ່ມເຕີມ. ການຄົ້ນຫາອອນລາຍໃຊ້ໄດ້ກັບຫົວຫນ່ວຍການຈັດຕັ້ງທີ່ຄົ້ນຫາຜູ້ໃຊ້ຂອງທ່ານເທົ່ານັ້ນ. ທ່ານອອຟລາຍຢູ່. ເຊື່ອມຕໍ່ອິນເຕີເນັດ ແລະ ລອງໃໝ່ອີກຄັ້ງ - ຫ້ອງນີ້ຂໍ້ມູນບໍ່ສາມາດໃຊ້ໄດ້ສໍາລັບການຈັບພາບມືຖື ເພີ່ມຮູບພາບ - ເພີ່ມລາຍເຊັນ ເອົາຟາຍຂໍ້ມູນເຂົ້າ ຕົກລົງ ສະຖານທີ່ອຸປະກອນຂອງທ່ານຖືກຕັດການເຊື່ອມຕໍ່. ກະລຸນາເປີດໃຊ້ມັນເພື່ອບັນທຶກພິກັດ @@ -209,9 +200,7 @@ ບໍ່​ແມ່ນ​ຕອນ​ນີ້ ທົບທວນຄືນ ສຳເລັດແລ້ວ - Value ລຶບການປ່ຽນແປງ - ຂໍ້ມູນ ການເຊື່ອມຕໍ່ເຄືອຂ່າຍບໍ່ສາມາດໃຊ້ໄດ້ ຈຳເປັນຕ້ອງມີການເຊື່ອມຕໍ່ອິນເຕີເນັດເພື່ອໃຊ້ແຜນທີ່. @@ -219,7 +208,6 @@ ລົງທະບຽນໃນ: ລົບ%s ອາທິດ%d%sຫາ%s - ເປີດຄືນໃໝ່ ກຳລັງຊິ້ງຂໍ້ມູນ ລົບອອກ diff --git a/commons/src/main/res/values-my/strings.xml b/commons/src/main/res/values-my/strings.xml index f21e2cf4b6c..0d5538640b4 100644 --- a/commons/src/main/res/values-my/strings.xml +++ b/commons/src/main/res/values-my/strings.xml @@ -8,14 +8,11 @@ Programs မှတ်စု အသေးစိတ်များ - အသေးစိတ်များ စီမံချက် Done အချိန်ကာလ - အခြေအနေ ရက်စွဲ - နေ့စဉ် အပတ်စဉ် လစဉ် နှစ်လတစ်ကြိမ် @@ -47,8 +44,6 @@ အညွှန်းများ ဂရပ် ပုံစံများ ပြည့်စုံသည်။ - တန်ဖိုး - အချက်အလက် ဖယ်ရှားခြင်း နေ့စဉ် ခုနှစ် diff --git a/commons/src/main/res/values-nb/strings.xml b/commons/src/main/res/values-nb/strings.xml index 315bebd06d5..7d0d5afef70 100644 --- a/commons/src/main/res/values-nb/strings.xml +++ b/commons/src/main/res/values-nb/strings.xml @@ -8,7 +8,6 @@ Avbryt Ja Nei - tøm valg Listevisning Tabellvisning Kartvisning @@ -19,7 +18,6 @@ Notater Dataregistrering Detaljer - Detaljer Velg et alternativ Søk hendelser @@ -33,13 +31,10 @@ Ingen filter brukt Periode Org. Enhet - Sorterer - Status Synk Tildelt til meg Dato Velg periodetype - Daglig Ukentlig Toukentlig Ukentlig, startes onsdag @@ -58,13 +53,10 @@ Regnskapsår med start oktober Regnskapsår med start november - - Synk Å sende Å oppdatere - Å slette Feil Advarsel Relasjon @@ -132,7 +124,6 @@ Tilbakemelding Indikatorer Diagrammer - Denne serveren kjører en dhis versjon som er forskjellig fra 2.29. Oppdater din serverversjon eller bruk testmiljøet for å fortsette. Feil under analyse av resultater Legg til bilde Legg til fil @@ -140,11 +131,8 @@ Enhetsplasseringen din er koblet fra. Aktiver den for å registrere koordinater Fortsett å rediger Fullfør - Verdi Forkast endringer - Data I dag - Åpne igjen Synkroniserer... Fjern diff --git a/commons/src/main/res/values-ne/strings.xml b/commons/src/main/res/values-ne/strings.xml index 415407a4070..a10a804bf45 100644 --- a/commons/src/main/res/values-ne/strings.xml +++ b/commons/src/main/res/values-ne/strings.xml @@ -4,10 +4,8 @@ रद्द गर्नुहोस् खोज अबधि - स्थिती मलाई निर्दिष्ट गरिएको मिति - दैनिक खोल्नुहोस् खोल्नुहोस् diff --git a/commons/src/main/res/values-nl/strings.xml b/commons/src/main/res/values-nl/strings.xml index 72dc3cbe25c..21d01d219ff 100644 --- a/commons/src/main/res/values-nl/strings.xml +++ b/commons/src/main/res/values-nl/strings.xml @@ -9,7 +9,6 @@ Annuleren Ja Nee - duidelijke selectie Lijstweergave Tabel weergave Kaartweergave @@ -20,7 +19,6 @@ Notities Gegevensinvoer Details - Details Selecteer optie Zoek evenementen @@ -34,13 +32,10 @@ Geen filters toegepast Periode Org. Eenheid - Sorteren - status Synchroniseren Toegewezen aan mij Datum Gevolgd %s - Dagelijks Wekelijks Tweewekelijks Maandelijks @@ -52,7 +47,6 @@ Synchroniseren Versturen Updaten - Verwijderen Fout Waarschuwing Uploaden @@ -142,7 +136,6 @@ Wachtwoord ontbreekt. Voer wachtwoord in alstublieft. Gebruikersnaam ontbreekt. Voer gebruikersnaam in. - Deze server draait een andere versie dan 2.29. Werk uw serverversie bij of gebruik de testomgeving om verder te gaan. Deze server draait een andere DHIS2-versie dan %s. Werk uw serverversie bij of neem contact op met uw beheerder. Er is iets fout gegaan. Controleer of de server-URL, gebruikersnaam en wachtwoord juist zijn en probeer het opnieuw. Sorry! Er is iets misgegaan aan de serverzijde. @@ -200,7 +193,6 @@ Er zijn niet genoeg attributen om de zoekopdracht uit te voeren. Verfijn uw zoekopdracht met meer attributen. Online zoeken is alleen beschikbaar voor uw organisatie-eenheden voor het zoeken van gebruikers. Er zijn ongeldige tekens in de vraag. Vraag de beheerder om de serverconfiguratie te verifiëren (relaxedQueryChars,...). - Dit veld is niet beschikbaar voor mobiel vastleggen Voeg afbeelding toe Bestand toevoegen OK @@ -209,9 +201,7 @@ Niet nu Beoordeling Compleet - Waarde Veranderingen ongedaan maken - Gegevens Netwerkverbinding niet beschikbaar Voor het gebruik van maps is een internetverbinding vereist. @@ -221,7 +211,6 @@ Ingeschreven in: Verwijder %s Week %d %s tot %s - heropenen Synchroniseren... Verwijderen diff --git a/commons/src/main/res/values-or/strings.xml b/commons/src/main/res/values-or/strings.xml index 95b5a47fea6..e34313ae89a 100644 --- a/commons/src/main/res/values-or/strings.xml +++ b/commons/src/main/res/values-or/strings.xml @@ -3,11 +3,9 @@ ହଁ ନାହିଁ ବିବରଣୀ - ବିବରଣୀ ସୂଚନା ହୋଇଗଲା - ସଜାଣି ସାପ୍ତାହିକ ମାସିକ ବାର୍ଷିକ diff --git a/commons/src/main/res/values-prs/strings.xml b/commons/src/main/res/values-prs/strings.xml index ea0ae3f4997..50efaaea1bc 100644 --- a/commons/src/main/res/values-prs/strings.xml +++ b/commons/src/main/res/values-prs/strings.xml @@ -12,18 +12,14 @@ یاداشت ها وارد کردن معلومات جزئیات - جزئیات انتخاب گزینه جستجو دیتا سیت ها انجام شد دوره - تنظیم کردن - وضعیت تاریخ انتخاب نوع دوره - روزنه هفته وار ماهانه دوبار در- ماه @@ -73,8 +69,6 @@ چارت ها او کی\! تکمیل - مقدار - دیتا امروز حذف روزنه diff --git a/commons/src/main/res/values-ps/strings.xml b/commons/src/main/res/values-ps/strings.xml index 7ec567f8d1e..516892c8eca 100644 --- a/commons/src/main/res/values-ps/strings.xml +++ b/commons/src/main/res/values-ps/strings.xml @@ -12,16 +12,13 @@ یادداښتونه د ډاټا یا مالوماتو داخلول جزیات [ ژباړه ـ جزیات ] - جزیات [ ژباړه ـ جزیات ] جستجو د مالوماتو یا ډاټا ټولګې ترسره شو معیاد - وضعیت نېټه د مودې ډول غوره کړئ. - ورځني [ د مودې ډول ] اوونیز میاشتنۍ دوه میاشتنۍ @@ -73,8 +70,6 @@ شاخصونه چارټونه بشپړ یې کړئ - ارزښت یا رقم - مالومات (ډاټا) نن ورځ لرې کول ورځني [ د مودې ډول ] diff --git a/commons/src/main/res/values-pt-rBR/strings.xml b/commons/src/main/res/values-pt-rBR/strings.xml index 4aa6983ff14..5e354a2423e 100644 --- a/commons/src/main/res/values-pt-rBR/strings.xml +++ b/commons/src/main/res/values-pt-rBR/strings.xml @@ -10,16 +10,13 @@ Notas Entrada de dados Detalhes - Detalhes Pesquisar Agregação de Dados Concluído Período - Estado Data Seleccione o tipo de período - Diário Semanal Mensal Bimensal @@ -66,8 +63,6 @@ Indicadores Esta bem Completo - Valor - Dados Hoje Remover Diário diff --git a/commons/src/main/res/values-pt/strings.xml b/commons/src/main/res/values-pt/strings.xml index 39a2d819503..badb83d96bc 100644 --- a/commons/src/main/res/values-pt/strings.xml +++ b/commons/src/main/res/values-pt/strings.xml @@ -9,7 +9,6 @@ Cancelar Sim Não - seleção clara Vista de lista Vista de tabela Vista de mapa @@ -21,7 +20,6 @@ Notas Entrada de dados Detalhes - Detalhes Selecionar opção Pesquisar eventos @@ -35,14 +33,11 @@ Nenhum filtro aplicado Período Unidade Org. - Ordem - Status Sincronizar Atribuído a mim Data Acompanhado%s Seleccionar tipo de período - Diário Semanal Quinzenal Semanalmente começando na quarta-feira @@ -61,13 +56,10 @@ Ano financeiro começando em outubro Ano financeiro começando em novembro - - Sincronizar Para enviar Atualizar - Suprimir Erro Advertência A carregar @@ -160,7 +152,6 @@ A palavra-passe está em falta. Introduza a palavra-passe. O nome de utilizador está em falta. Por favor, introduza o nome de utilizador. - Este servidor está executando uma versão dhis diferente de 2.29. Atualize a versão do servidor ou use o ambiente de teste para continuar. Este servidor está a executar uma versão do DHIS2 diferente de %s. Actualize a versão do seu servidor ou contacte o seu administrador. Algo correu mal. Verifique se o URL do servidor, o nome de utilizador e a palavra-passe estão correctos e tente novamente. Desculpe! Algo falhou no lado do servidor. @@ -220,9 +211,7 @@ Existem caracteres inválidos na consulta. Por favor, peça ao administrador para verificar a configuração do servidor (relaxedQueryChars,...). O servidor está indisponível do momento. Tente novamente mais tarde. Está off-line. Ligue-se à Internet e tente novamente. - Este campo não está disponível para captura móvel Adicionar imagem - Adicionar assinatura Adicionar ficheiro Esta bem A localização do seu dispositivo está desconectada. Por favor ative-o para capturar coordenadas @@ -230,9 +219,7 @@ Agora não Revisão Completo - Valor Descartar mudanças - Dados Ligação a rede indisponível É necessária uma ligação à Internet para utilizar mapas. @@ -262,7 +249,6 @@ Novo %s Apagar%s Semana %d %s a%s - reabrir Repetir a sincronização Sincronizando... diff --git a/commons/src/main/res/values-ro/strings.xml b/commons/src/main/res/values-ro/strings.xml index 1a7483d1444..86688eb8b18 100644 --- a/commons/src/main/res/values-ro/strings.xml +++ b/commons/src/main/res/values-ro/strings.xml @@ -10,7 +10,6 @@ evenimente Terminat - Stare Data Selectați tipul perioadei Lunar diff --git a/commons/src/main/res/values-ru/strings.xml b/commons/src/main/res/values-ru/strings.xml index 1961a02d8e8..86b8be08212 100644 --- a/commons/src/main/res/values-ru/strings.xml +++ b/commons/src/main/res/values-ru/strings.xml @@ -8,7 +8,6 @@ Отмена Да Нет - очистить выбор В виде списка В виде таблицы В виде карты @@ -20,7 +19,6 @@ Заметки Ввод данных Детали - Детали Выберите опцию Поиск события/й @@ -34,8 +32,6 @@ Фильтры не применены Период Орг. единица - Сортировка - Статус Синхронизация Назначен мне Дата @@ -44,7 +40,6 @@ Cтатус регистрации Отмеченные для последующего наблюдения %s Выбрать тип периода - Ежедневно Еженедельно Каждые две недели Еженедельно со среды @@ -56,7 +51,6 @@ Ежеквартально Раз в полугодие По шесть месяцев начиная с апреля - Раз в полгода, начиная с июля Раз в полгода, начиная с ноября Ежегодно Финансовый год начиная с апреля @@ -64,13 +58,10 @@ Финансовый год начиная с октября Финансовый год начиная с ноября - - Синхронизация Отправить Обновить - Удалить Ошибка Предупреждение Загрузка @@ -162,7 +153,6 @@ Пароль отсутствует. Пожалуйста, введите пароль. Имя пользователя отсутствует. Пожалуйста, введите имя пользователя. - На этом сервере установлена версия dhis, отличная от 2.29. Обновите версию своего сервера или используйте тестовую среду для продолжения работы. На этом сервере установлена версия DHIS2, отличная от %s. Обновите версию сервера или обратитесь к администратору. Что-то пошло не так. Пожалуйста, проверьте правильность URL-адреса сервера, имени пользователя и пароля и повторите попытку. Извините! Что-то не получилось на стороне сервера. @@ -209,9 +199,7 @@ Онлайн-поиск доступен только для подразделений вашей организации по поиску пользователей. Сервер в настоящее время недоступен. Повторите попытку позже. Вы находитесь оффлайн. Подключитесь к Интернету и повторите попытку. - Это поле недоступно для мобильного заполнения Добавить изображение - Добавить подпись Добавить файл Ok Местоположение вашего устройства отключено. Пожалуйста, включите его для получения координат @@ -219,9 +207,7 @@ Не сейчас Просмотреть Завершенный - Значение Сбросить изменения - Данные Сетевое подключение недоступно Для использования карт необходимо подключение к Интернету. @@ -269,7 +255,6 @@ Файл успешно загружен - зачисление @@ -279,7 +264,6 @@ %s данных %s дата - %s статус Вы должны указать причину для проверки %s в этой защищенной программе. Все действия будут регистрироваться. Причина для проверки %s Эти данные нельзя редактировать, поскольку %s завершен или отменен. @@ -287,14 +271,12 @@ %s отменено Новый %s Зарегистрирован в: - Программа %s Больше регистраций Удалить из Обновить эту запись Просмотр хронологии Группировать по этапам - мероприятие @@ -315,12 +297,9 @@ У этого %s не может быть даты в будущем. Пожалуйста, измените ее. Не удалось вставить новый %s Неделя %d %s до %s - Группировать %s по этапам - Показать хронологию %s Нет зарегистрированных %s, нажмите \"+\", чтобы добавить новый. Нет зарегистрированных %s. Есть запланированные %s, которые не будут перенесены. - снова открыть Повторить синхронизацию Синхронизация... @@ -333,4 +312,6 @@ Год Нет доступных периодов Очистить все + + %s статус diff --git a/commons/src/main/res/values-si/strings.xml b/commons/src/main/res/values-si/strings.xml index 29628b9ac79..9ee4c5153cc 100644 --- a/commons/src/main/res/values-si/strings.xml +++ b/commons/src/main/res/values-si/strings.xml @@ -7,7 +7,6 @@ කළා දිනය - දිනපතා සතිපතා දෙසතියකට වරක් මාස්පතා @@ -38,9 +37,7 @@ ඊයේ ප්‍රස්ථාර - අගය වෙනස් කිරීම් ඉවතලන්න - දත්ත අද ඉවත් කරන්න දිනපතා diff --git a/commons/src/main/res/values-sv/strings.xml b/commons/src/main/res/values-sv/strings.xml index 95291c34402..b8942ffd9ea 100644 --- a/commons/src/main/res/values-sv/strings.xml +++ b/commons/src/main/res/values-sv/strings.xml @@ -9,17 +9,14 @@ program Relationer detaljer - detaljer Välj alternativ Sök händelser dataset TEI Period - Status Synkronisera Datum - Dagligen Varje vecka En gång i månaden varannan månad @@ -29,7 +26,6 @@ Synkronisera Att uppdatera - Att radera Fel Varning @@ -65,15 +61,11 @@ Återkoppling indikatorer diagram - Den här servern kör en dhis-version som skiljer sig från 2.29. Uppdatera din serverversion eller använd testmiljön för att fortsätta. Fel vid tolkning av resultat Lägg till fil Fortsätt redigera Färdigt - Värde Ignorera ändringar - Data - Öppna igen Ta bort Dagligen diff --git a/commons/src/main/res/values-tet/strings.xml b/commons/src/main/res/values-tet/strings.xml index f8fe5cc550a..893f89f78ee 100644 --- a/commons/src/main/res/values-tet/strings.xml +++ b/commons/src/main/res/values-tet/strings.xml @@ -6,14 +6,11 @@ Sim Lae Detalles - Detalles Hili opsaun Pakote dadus Períodu - Estadu Data Hili Tipu períodu - Diáriu Semanal Mensal Bimensal @@ -45,8 +42,6 @@ Feedback Indikadores Kompletu - Valor - Dadus Hasai Diáriu Tinan diff --git a/commons/src/main/res/values-tg/strings.xml b/commons/src/main/res/values-tg/strings.xml index ecb8aa6339d..bc5064b3e92 100644 --- a/commons/src/main/res/values-tg/strings.xml +++ b/commons/src/main/res/values-tg/strings.xml @@ -8,16 +8,13 @@ Барномаҳо Ворид кардани иттилоот Маълумоти муфассал - Маълумоти муфассал Ҷустуҷӯ Маҷмӯъҳои иттилоот Иҷро шуд Давра - Ҳолат Сана Интихоби навъи давра - Ҳаррӯза Ҳафтаина Моҳона Ду маротиба дар як моҳ @@ -55,8 +52,6 @@ Изҳори назар Индикаторҳо Анҷом ёфт - Қимат - Иттилоот Имрӯз Тоза кардан Ҳаррӯза diff --git a/commons/src/main/res/values-uk/strings.xml b/commons/src/main/res/values-uk/strings.xml index e6cafb5a74f..eabd11013ea 100644 --- a/commons/src/main/res/values-uk/strings.xml +++ b/commons/src/main/res/values-uk/strings.xml @@ -9,7 +9,6 @@ Скасувати Так Ні - очистити вибір У вигляді списку У вигляді таблиці У вигляді карті @@ -20,7 +19,6 @@ Примітки Введення даних Деталі - Деталі Обрати опцію Пошук випадки @@ -34,15 +32,12 @@ Фільтрів не застосовано Період Орг. підрозділ - Сортування - Статус Синхронізувати Призначено мені Дата Дата %s Для подальших дій %s Обрати тип періоду - Щодня Щотижня Щодва тижні Щомісяця @@ -54,7 +49,6 @@ Синхронізувати Надіслати Оновити - Видалити Помилка Попередження Завантаження @@ -147,7 +141,6 @@ Пароль відсутній. Будь ласка, введіть пароль. Ім\'я користувача відсутнє. Будь ласка, введіть ім\'я користувача. - На цьому сервері працює інша версія dhis, ніж 2.29. Щоб продовжити, оновіть версію серверу або скористайтеся середовищем тестування. На цьому сервері працює версія DHIS2, що відрізняється від %s. Оновіть версію серверу або сконтактуйте з системним адміністратором. Сталася помилка. Будь ласка, перевірте правильність URL-адреси серверу, імені користувача та пароля і повторіть спробу. Вибачте! На сервері сталася помилка. @@ -205,9 +198,7 @@ Недостатньо атрибутів для виконання пошуку. Уточніть пошук за допомогою додаткових атрибутів. Онлайн-пошук доступний лише для організаційних підрозділів користувача. У запиті є недійсні символи. Попросіть адміністратора перевірити конфігурацію сервера (relaxedQueryChars,...). - Це поле недоступне в мобільній версії Додати зображення - Додати підпис Додати файл OK Розташування Вашого пристрою відключено. Будь ласка, увімкніть його для отримання координат @@ -215,9 +206,7 @@ Не зараз Перегляд Завершити - Значення Відхилити внесені зміни - Дані Сьогодні %d день прострочення @@ -257,7 +246,6 @@ %s успішно видалено Ви впевнені, що хочете видалити %s? Тиждень %d %s до %s - повторно відкрити Синхронізація... Видалити diff --git a/commons/src/main/res/values-ur/strings.xml b/commons/src/main/res/values-ur/strings.xml index a5a12904c62..28b6ff218fe 100644 --- a/commons/src/main/res/values-ur/strings.xml +++ b/commons/src/main/res/values-ur/strings.xml @@ -11,17 +11,13 @@ نوٹس ڈیٹا انٹری تفصیلات - تفصیلات تلاش کریں ڈیٹا سیٹس ہو گیا مدت - ترتیب دیں - حالت تاریخ مدت کی قسم منتخب کریں - روزانہ ہفتہ وار ہفتہ وار شروع ہونے والا ہفتہ جمعرات سے شروع ہونے والا ہفتہ @@ -85,8 +81,6 @@ چارٹس ٹھیک ہے\! مکمل - قدر - ڈیٹا آج حذف روزانہ diff --git a/commons/src/main/res/values-uz-rUZ/strings.xml b/commons/src/main/res/values-uz-rUZ/strings.xml index 08d9efbf1e3..8dafcecf13c 100644 --- a/commons/src/main/res/values-uz-rUZ/strings.xml +++ b/commons/src/main/res/values-uz-rUZ/strings.xml @@ -8,7 +8,6 @@ Бекор қилиш Ҳа Йўқ - aniq tanlov Roʼyxat koʼrinishi Jadval koʼrinishi Xarita koʼrinishi @@ -19,7 +18,6 @@ Izohlar Maʼlumot kiritish Тафсилотлари - Тафсилотлари Variant tanlang Izlash Maʼlumotlar toʼplami @@ -30,13 +28,10 @@ Hech qanday filtr qoʼllanilmagan davr Tashkiliy boʼlim - Tartiblash - Status Sinxronlash Menga berilgan vakolat Sana Davr turini tanlash - Кунлик Ҳафталик Juft hafta Ойлик @@ -48,7 +43,6 @@ Sinxronlash Yuborish uchun Yangilash uchun - Oʼchirib tashlash uchun Xatolik Ogohlantirish Oʼzaro aloqa @@ -116,7 +110,6 @@ Fikr-mulohaza Koʼrsatgichlar Diagrammalar - Ushbu server 2.29 dan farqli versiyani ishlatmoqda. Server versiyasini yangilang yoki davom etish uchun sinov muddatidan foydalaning. Nimadir notoʼgʼri bajarildi. Server URL manzili, foydalanuvchi nomi va parol toʼgʼri ekanligini tekshiring va qaytadan urining. Natijalarni tahlil qilishda xatolik yuz berdi Rasm qoʼshish @@ -125,11 +118,8 @@ Tahrirni davom eting Ko‘rib chiqish Bajarildi - Қиймат Oʼzgartirishlar bekor qilinsin - Маълумот бугун - qayta ochish Sinxronizatsiyalanmoqda... Олиб ташлаш diff --git a/commons/src/main/res/values-uz/strings.xml b/commons/src/main/res/values-uz/strings.xml index 035658fff84..262c9c8ba70 100644 --- a/commons/src/main/res/values-uz/strings.xml +++ b/commons/src/main/res/values-uz/strings.xml @@ -8,7 +8,6 @@ Бекор қилиш Ҳа Йўқ - аниқ танлов Рўйхат кўриниши Жадвал кўриниши Харита кўриниши @@ -19,7 +18,6 @@ Изоҳлар Маълумот киритиш Тафсилотлари - Тафсилотлари Вариант танланг Қидириш ҳодиса/тадбирлар @@ -33,13 +31,10 @@ Ҳеч қандай фильтр қўлланилмаган Давр Ташкилий бўлим - Тартиблаш - Статус Синхронлаш Менга берилган ваколат Сана Давр турини танлаш - Кунлик Ҳафталик Жуфт ҳафталик Чоршанба кунидан бошлаб ҳар ҳафта @@ -58,13 +53,10 @@ Молиявий йил Октябрдан бошлаб Молиявий йил Ноябрдан бошлаб - - Синхронлаш Юбориш учун Янгилаш учун - Ўчириб ташлаш учун Хатолик Огоҳлантириш Юкланмоқда @@ -141,11 +133,8 @@ Диаграммалар Диаграммалар ва индикаторлар - Ушбу сервер 2.29 дан фарқли версияни ишлатмоқда. Сервер версиясини янгиланг ёки давом этиш учун синов муддатидан фойдаланинг. Натижаларни таҳлил қилишда хатолик юз берди - Ушбу сатр мобил назорат учун мавжуд эмас Расм қўшиш - Имзо қўшинг Файл қўшиш Яхши Сизнинг қўрилмангиз интернет алоқаси узилди. Илтимос, координаталарни олиш учун уни ёқинг @@ -153,12 +142,9 @@ Hozir emas Кўриб чиқиш Тўлдириш - Қиймат Ўзгартиришлар бекор қилинсин - Маълумот Бугун Қайд этилган: - қайта очиш Синхронизацияланмоқда... Олиб ташлаш diff --git a/commons/src/main/res/values-vi/strings.xml b/commons/src/main/res/values-vi/strings.xml index 32c878e2fb8..f8fd17c3bc1 100644 --- a/commons/src/main/res/values-vi/strings.xml +++ b/commons/src/main/res/values-vi/strings.xml @@ -9,7 +9,6 @@ Hủy Không - Bỏ chọn Xem danh sách Xem bảng Xem bản đồ @@ -21,7 +20,6 @@ Ghi Chú Nhập dữ liệu Chi tiết - Chi tiết Chọn Tìm kiếm sự kiện @@ -35,8 +33,6 @@ Không có bộ lọc nào được áp dụng Thời điểm Đơn vị - Sắp xếp thứ tự - Trạng thái Đồng bộ Gán cho tôi Ngày @@ -45,7 +41,6 @@ @string/enrollment_status Theo dõi %s Chọn loại thời điểm - Hàng Ngày Hàng Tuần Định kỳ 2 tuần Hàng tuần bắt đầu từ thứ Tư @@ -63,7 +58,6 @@ Đồng bộ Gửi Cập nhật - Xóa Lỗi Cảnh báo Đang tải lên @@ -156,7 +150,6 @@ Thiếu mật khẩu. Xin vui lòng nhập mật khẩu Thiếu tên đăng nhập. Xin vui lòng nhập tên đăng nhập. - Máy chủ không chạy dhis phiên bản 2.29. Nâng cấp phiên bản máy chủ hoặc sử dụng môi trường thử nghiệm để thực hiện. Máy chủ này đang chạy phiên bản DHIS2 khác với %s. Vui lòng cập nhật phiên bản máy chủ của bạn hoặc liên hệ quản lý. Có gì đó không đúng. Vui lòng kiểm tra đường dẫn liên kết đến máy chủ, tên đăng nhập, mật khẩu và thử lại. Rất tiếc! Có lỗi gì đó ở phía máy chủ @@ -216,9 +209,7 @@ Có các ký tự không hợp lệ trong yêu cầu. Vui lòng liên hệ quản lý để xác nhận cấu hình máy chủ (relaxQueryChars,...) Không thể truy cập máy chủ. Xin vui lòng thử lại sau. Bạn đang ngoại tuyến. Vui lòng kết nối mạng và thử lại - Trường này không hiển thị để nhập dữ liệu bằng điện thoại Thêm hình ảnh - Thêm chữ ký Thêm tập tin Ok Tính năng chia sẻ vị trí thiết bị của bạn bị tắt. Vui lòng mở nó để thu thập tọa độ. @@ -226,9 +217,7 @@ Không phải bây giờ Xem xét Hoàn tất - Giá trị Hủy bỏ các thay đổi - Dữ liệu Không có kết nối mạng Cần có kết nối mạng để sử dụng bản đồ @@ -247,10 +236,8 @@ Tệp đã tải xuống thành công - Dữ liệu %s %s ngày - %s trạng thái %s đã hủy %sMới Đã đăng ký vào: @@ -258,7 +245,6 @@ %s ngày Xóa %s Tuần %d %s đến %s - mở lại Đồng bộ lại Đang đồng bộ... @@ -273,4 +259,6 @@ Không ở chế độ đăng ký TOTP 2FA Xóa tất cả + + %s trạng thái diff --git a/commons/src/main/res/values-zh-rCN/strings.xml b/commons/src/main/res/values-zh-rCN/strings.xml index 6b655484185..795b9c5b8b7 100644 --- a/commons/src/main/res/values-zh-rCN/strings.xml +++ b/commons/src/main/res/values-zh-rCN/strings.xml @@ -9,7 +9,6 @@ 取消 - 清除选择 列表显示 表格检视 地图检视 @@ -21,7 +20,6 @@ 笔记 数据输入 详情 - 详情 选择选项 搜索 事件 @@ -35,8 +33,6 @@ 无过滤器 周期 机构 - 排序 - 状态 同步 指派给我 日期 @@ -45,7 +41,6 @@ @string/enrollment_status 跟进%s 请选择周期类型 - 每日 每周 双周 开始于周三的周报 @@ -58,7 +53,6 @@ 每季度 11 月 六个月 开始于四月的每六个月 - 从 7 月开始,每 6 个月一次 开始于11月的半年 每年 开始于四月的财政年 @@ -66,13 +60,10 @@ 开始于十月的财政年 开始于11月的财政年 - - 同步 发送 更新 - 删除 错误 警告 上传 @@ -165,7 +156,6 @@ 密码丢失。请输入密码。 缺少用户名。请输入用户名。 - 服务器运行版本不是2.29,请更新服务器版本或使用测试环境继续 此服务器正在运行与 %s 不同的 DHIS2 版本。更新您的服务器版本或联系您的管理员。 出了些问题。请检查服务器 URL、用户名和密码是否正确,然后重试。 对不起!服务器端出现问题。 @@ -225,9 +215,7 @@ 查询中有无效字符。请让管理员验证服务器配置(relaxedQueryChars,...)。 服务器当前不可用。稍后再试。 您已离线。连接到互联网并重试。 - 该字段不可用于移动采集 添加图片 - 添加签名 添加文件 Ok! 您的设备位置已断开。请启用它以捕获坐标 @@ -235,9 +223,7 @@ 现在不要 审查 完成 - 忽略修改 - 数据 网络连接不可用 需要互联网连接才能使用地图。 @@ -267,7 +253,6 @@ 文件下载成功 - 注册人数 @@ -276,7 +261,6 @@ %s 数据 %s 坐标 %s 日期 - %s 地位 在这个受保护的程序中,您必须提供检查%s 的理由。所有活动都将记录在案。 检查原因%s 该数据不可编辑,因为%s 已完成或取消 @@ -284,14 +268,12 @@ %s 已取消 新%s 加入: - 计划%s 更多注册人数 刷新此记录 查看时间表 按阶段分组 - 活动 @@ -309,12 +291,9 @@ %s 的日期不能是未来。请更改。 插入新%s 星期%d %s到%s - 按阶段划分的组别%s - 显示%s 时间轴 没有注册%s ,点击 \"+\"可添加新的 。 %s 。 计划中的%s 不会改期 - 重新打开 重试同步 同步 @@ -330,4 +309,6 @@ 财政年度 无可用时段 全清除 + + %s 地位 diff --git a/commons/src/main/res/values-zh/strings.xml b/commons/src/main/res/values-zh/strings.xml index 031f5dbb1d7..b5da390dd4d 100644 --- a/commons/src/main/res/values-zh/strings.xml +++ b/commons/src/main/res/values-zh/strings.xml @@ -9,7 +9,6 @@ 取消 是的 - 清除选择 列表显示 表格显示 地图显示 @@ -21,7 +20,6 @@ 笔记 数据输入 详情 - 详情 选择选项 搜索 事件 @@ -35,8 +33,6 @@ 无过滤器 期间 机构 - 排序 - 状态 同步 指派给我 日期 @@ -45,7 +41,6 @@ @string/enrollment_status 跟进%s 请选择周期类型 - 每日 每周 两周 开始于周三的周报 @@ -59,7 +54,6 @@ 每季度 11 月 六个月 开始于四月的每六个月 - 从 7 月开始,每 6 个月一次 开始于11月的半年 每年 从 2 月开始的财务年度 @@ -70,13 +64,10 @@ 开始于十月的财政年 开始于11月的财政年 - - 同步 发送 更新 - 删除 错误 警告 上传 @@ -169,7 +160,6 @@ 密码丢失。请输入密码。 缺少用户名。请输入用户名。 - 服务器运行版本不是2.29,请更新服务器版本或使用测试环境继续 此服务器正在运行与 %s 不同的 DHIS2 版本。更新您的服务器版本或联系您的管理员。 出了些问题。请检查服务器 URL、用户名和密码是否正确,然后重试。 对不起!服务器端出现问题。 @@ -229,9 +219,7 @@ 查询中有无效字符。请让管理员验证服务器配置(relaxedQueryChars,...)。 服务器当前不可用。稍后再试。 您已离线。连接到互联网并重试。 - 该字段不可用于移动采集 添加图片 - 添加签名 添加文件 Ok! 您的设备定位已断开或关闭。请启用它以便捕获地理坐标 @@ -239,9 +227,7 @@ 现在不要 审查 完成 - 忽略修改 - 数据 网络连接不可用 需要互联网连接才能使用地图。 @@ -271,7 +257,6 @@ 文件下载成功 - 注册人数 @@ -280,7 +265,6 @@ %s 数据 %s 坐标 %s 日期 - %s 地位 在这个受保护的程序中,您必须提供检查%s 的理由。所有活动都将记录在案。 检查原因%s 该数据不可编辑,因为%s 已完成或取消 @@ -288,14 +272,12 @@ %s 已取消 新%s 加入: - 计划%s 更多注册人数 刷新此记录 查看时间表 按阶段分组 - 活动 @@ -313,12 +295,9 @@ %s 的日期不能是未来。请更改。 插入新%s 星期%d %s到%s - 按阶段划分的组别%s - 显示%s 时间轴 没有注册%s ,点击 \"+\"可添加新的 。 %s 。 计划中的%s 不会改期 - 重新打开 重试同步 同步 @@ -338,4 +317,6 @@ 未进入 TOTP 2FA 注册模式 全清除 + + %s 地位 diff --git a/commons/src/main/res/values/strings.xml b/commons/src/main/res/values/strings.xml index 86841ba4fb0..9d34e6f518f 100644 --- a/commons/src/main/res/values/strings.xml +++ b/commons/src/main/res/values/strings.xml @@ -10,7 +10,6 @@ Cancel Yes No - clear selection List view Table view Map view @@ -22,7 +21,6 @@ Notes Data entry Details - Details Select option Search events @@ -36,8 +34,6 @@ No filters applied Period Org. Unit - Sorting - Status Sync Assigned to me Date @@ -46,7 +42,6 @@ @string/enrollment_status Followed up %s Select period type - Daily Weekly Bi-weekly Weekly starting Wednesday @@ -60,7 +55,6 @@ Quarterly Nov Six-monthly Six-monthly starting April - Six-monthly starting July Six-monthly starting November Yearly Financial year starting February @@ -71,13 +65,10 @@ Financial year starting October Financial year starting November - - Sync To send To update - To delete Error Warning Uploading @@ -171,7 +162,6 @@ Password is missing. Please enter password. Username is missing. Please enter username. - This server is running a dhis version different than 2.29. Update your server version or use the testing environment to proceed. This server is running a DHIS2 version different than %s. Update your server version or contact your admin. Something went wrong. Please check that server URL, username and password are correct and try again. Sorry! Something failed on the server side. @@ -231,9 +221,7 @@ There are invalid characters in the query. Please ask the administrator to verify the server configuration (relaxedQueryChars,...). The server is currently unavailable. Try again later. You are offline. Connect to the internet and try again. - This field is not available for mobile capture Add Image - Add signature Add file Ok Your device location is disconnected. Please enable it to capture coordinates @@ -241,9 +229,7 @@ Not now Review Complete - Value Discard changes - Data Network connection unavailable An internet connection is required in order to use maps. @@ -279,7 +265,6 @@ File downloaded successfully - enrollment @@ -289,7 +274,6 @@ %s data %s coordinates %s date - %s status You must provide a reason to check for %s in this protected program. All activity will be logged. Reason to check for %s This data is not editable because the %s is completed or cancelled @@ -297,14 +281,12 @@ %s cancelled New %s Enrolled in: - Program %s More enrollments Remove from Refresh this record View timeline Group by stage - event @@ -325,12 +307,9 @@ %s - %s Week %d %s to %s %d %s - %d %s - Group %s by stage - Show %s timeline There are no %s registered, click \"+\" to add a new one. There are no %s registered. There are planned %s that won\'t be re-scheduled - re-open Retry sync Synchronizing... @@ -350,4 +329,6 @@ Not in TOTP 2FA enrollment mode Clear all + + %s status diff --git a/commonskmm/src/commonMain/composeResources/values-ar-rIQ/strings.xml b/commonskmm/src/commonMain/composeResources/values-ar-rIQ/strings.xml index f029f4b5e88..7e901c6ffbb 100644 --- a/commonskmm/src/commonMain/composeResources/values-ar-rIQ/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-ar-rIQ/strings.xml @@ -1,13 +1,8 @@ خطأ - التاريخ - السنوات - الأشهر - ‏‏الأيام تاريخ الاستحقاق مكتمل - حفظ على اية حال مشاركة إغلاق تاريخ الواقعة diff --git a/commonskmm/src/commonMain/composeResources/values-ar/strings.xml b/commonskmm/src/commonMain/composeResources/values-ar/strings.xml index 83e3ebf920f..ac890848627 100644 --- a/commonskmm/src/commonMain/composeResources/values-ar/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-ar/strings.xml @@ -22,16 +22,9 @@ لديك بعض الرسائل التحذيرية. لديك بعض الرسائل التحذيرية.\nهل تريد وضع علامة \"مكتمل\" على هذا النموذج؟ مطلوب - التاريخ - السنوات - الأشهر - ‏‏الأيام - لا يمكن تحليل %s كتاريخ مضلع خط العرض خط الطول - قيم الإحداثيات غير صالحة - تم التقاط المضلع أدخل قيمة أدخل رابط url أدخل بريداً إلكترونياً @@ -46,9 +39,6 @@ أدخل نصًا طويلاً أدخل نصًا تاريخ الاستحقاق - حقل الزامي - خط العرض: - خط الطول: لم يتم حفظه المراجعة مكتمل @@ -58,19 +48,13 @@ بعض الحقول بها أخطاء ولم يتم حفظها. \nهل تريد مراجعة النموذج؟ بعض الحقول تحتاج إلى انتباهك.\nهل تريد مراجعة النموذج؟ ليس الان - حفظ على اية حال استمر في التعديل هل تريد وضع علامة على هذا النموذج كمكتمل؟ إذا قمت بالخروج الآن ، فسيتم تجاهل جميع المعلومات الموجودة في النموذج. تحتوي بعض الحقول على أخطاء ولا يتم حفظها. \nإذا قمت بالخروج الآن سيتم تجاهل التغييرات. - بعض الحقول بها أخطاء ولم يتم حفظها. - بعض الحقول الإلزامية غير مدخله ولا يمكن حفظ النموذج. - بعض الحقول الإلزامية مفقودة ولا يمكن حفظ النموذج. \nإذا قمت بالخروج الآن سيتم تجاهل التغييرات. مشاركة إغلاق - تحذير قواعد البرنامج تم النسخ - لا توجد معلومات عن هذا الحقل التقط صورة تحقق من هذا! لا تظهر مرة أخرى @@ -94,7 +78,6 @@ تاريخ الحدوث تنزيل المسح الضوئي - رمز الاستجابة السريعة إضافة موقع الوحدة التنظيمية الإحداثيات @@ -124,7 +107,6 @@ **********************--> كلمة المرور مفقودة. الرجاء إدخال كلمة المرور. اسم المستخدم مفقود. الرجاء إدخال اسم المستخدم. - يقوم هذا الخادم بتشغيل إصدار dhis مختلف عن 2.29. قم بتحديث إصدار الخادم الخاص بك أو استخدم بيئة الاختبار للمتابعة. يقوم هذا الخادم بتشغيل إصدار DHIS2 مختلف عن %s. قم بتحديث إصدار الخادم الخاص بك أو اتصل بالمسؤول. هناك خطأ ما. يرجى التحقق من صحة عنوان URL الخاص بالخادم واسم المستخدم وكلمة المرور وحاول مرة أخرى. آسف! فشل شيء ما من جانب الخادم. diff --git a/commonskmm/src/commonMain/composeResources/values-bn/strings.xml b/commonskmm/src/commonMain/composeResources/values-bn/strings.xml index 926dfcf4f64..362b63464d3 100644 --- a/commonskmm/src/commonMain/composeResources/values-bn/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-bn/strings.xml @@ -2,7 +2,6 @@ অবশ্যই সংখ্যা হতে হবে ভুল - তারিখ নির্ধারিত তারিখ Chybí heslo. Prosím vložte heslo. Chybí uživatelské jméno. Zadejte uživatelské jméno. - Tento server používá jinou verzi DHIS než 2.29. Aktualizujte verzi serveru nebo pokračujte testovacím prostředím. Tento server používá verzi DHIS2 odlišnou od %s. Aktualizujte verzi serveru nebo kontaktujte svého administrátora. Něco se pokazilo. Zkontrolujte prosím správnost adresy URL serveru, uživatelského jména a hesla a zkuste to znovu. Promiňte! Něco selhalo na straně serveru. diff --git a/commonskmm/src/commonMain/composeResources/values-da/strings.xml b/commonskmm/src/commonMain/composeResources/values-da/strings.xml index 0a9e6fa0ffe..4204a6da923 100644 --- a/commonskmm/src/commonMain/composeResources/values-da/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-da/strings.xml @@ -2,7 +2,6 @@ Value must be an integer Error - Date Due date Close Incident date diff --git a/commonskmm/src/commonMain/composeResources/values-en-rUS/strings.xml b/commonskmm/src/commonMain/composeResources/values-en-rUS/strings.xml index 64b9f608a19..46581947a65 100644 --- a/commonskmm/src/commonMain/composeResources/values-en-rUS/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-en-rUS/strings.xml @@ -21,16 +21,9 @@ This field is mandatory You have some warning messages. Required - Date - Years - Months - Days - %s can\'t be parsed as a date Polygon Latitude Longitude - Coordinates values are not valid - Polygon captured Enter value Enter url Enter email @@ -45,27 +38,18 @@ Enter long text Enter text Due date - Mandatory field - Lat: - Long: Not saved Review Complete Discard changes Saved! Not now - Save anyway Keep editing Do you want to mark this form as complete\? If you exit now all the information in the form will be discarded. - Some fields have errors and they are not saved. - Some mandatory fields are missing and the form cannot be saved. Share Close - Program rules warning - There is a configuration issue causing a loop in the rules. Contact you administrator. Copied - No info for this field Take Photo From gallery Check this! @@ -77,13 +61,10 @@ Coordinates for the There are no more reserved values. Contact your system administrator Incident date - The location permission is needed for capturing coordinates. Please, enable them in the application settings Open with No option found Download Scan - QR code - Bar code Add location This form has no fields configured %s details @@ -115,7 +96,6 @@ **********************--> Password is missing. Please enter password. Username is missing. Please enter username. - This server is running a dhis version different than 2.29. Update your server version or use the testing environment to proceed. This server is running a DHIS2 version different than %s. Update your server version or contact your admin. Something went wrong. Please check that server URL, username and password are correct and try again. Sorry! Something failed on the server side. diff --git a/commonskmm/src/commonMain/composeResources/values-es-rES/strings.xml b/commonskmm/src/commonMain/composeResources/values-es-rES/strings.xml index ea31a79c61e..63291f3482c 100644 --- a/commonskmm/src/commonMain/composeResources/values-es-rES/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-es-rES/strings.xml @@ -22,16 +22,9 @@ La regla de programa %s está intentando asignar el valor %s que no pertenece al conjunto de opciones %s El valor del campo %s no pertenece al conjunto de opciones en %s El campo es obligatorio - Fecha - Años - Meses - Días - %s no es una fecha válida Polígono Latitud Longitud - El valor de las coordenadas no es válido - Polígono guardado Introduzca valor Introduzca url Introduzca email @@ -46,27 +39,18 @@ Introducir texto largo Introducir texto Fecha de vencimiento - Campo obligatorio - Lat: - Long: No guardado Revisar Completar Descartar los cambios ¡Guardado! Ahora no - Guardar de todos modos Seguir editando ¿Desea marcar este formulario como completo? Si sale toda la información del formulario será descartada. - Algunos campos tienen errores y no serán guardados. - Algunos campos obligatorios faltan llenarse, el formulario no puede ser guardado Compartir Cerrar - Advertencia de reglas del programa - Hay un problema de configuración que provoca un bucle en las reglas. Póngase en contacto con su administrador. Copiado - No hay información para este campo Tomar foto ¡Importante! No volver a mostrar @@ -90,7 +74,6 @@ Coordenadas para No quedan valores reservados. Contacte con el administrador del sistema. Fecha del incidente - Se requiere el permiso de localización para obtener coordenadas. POR FAVOR, habilítelo desde los ajustes del dispositivo. Unidad Organizativa Cat Combo @@ -108,7 +91,6 @@ **********************--> La contraseña está vacía. Ingrese la contraseña. El usuario está vacío. Ingrese el usuario. - Este servidor trabaja sobre una versión de dhis distinta a 2.29. Actualice el servidor o utilice el entorno de pruebas para continuar. Este servidor tiene una version de DHIS2 diferente de %s. Actualice su servidor o contacte a su administrador. Algo ha ido mal. Por favor, compruebe que tanto la url del servidor como el usuario y contraseña son correctos y pruebe otra vez. Disculpe, hubo un error del lado del servidor. diff --git a/commonskmm/src/commonMain/composeResources/values-es/strings.xml b/commonskmm/src/commonMain/composeResources/values-es/strings.xml index a1aea5f6b2e..3433fefd7a2 100644 --- a/commonskmm/src/commonMain/composeResources/values-es/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-es/strings.xml @@ -25,16 +25,9 @@ Tienes algunos mensajes de aviso. Tiene algunos mensajes de advertencia.\n¿Deseas marcar este formulario como completo? Necesario - Fecha - Años - Meses - Días - %s no es una fecha válida Polígono Latitud Longitud - El valor de las coordenadas no es válido - Polígono capturado Introduzca valor Introduzca url Introduzca email @@ -49,9 +42,6 @@ Introducir texto largo Introducir texto Fecha de vencimiento - Campo obligatorio - Lat: - Long: No guardado Revisar Completar @@ -61,21 +51,14 @@ Algunos campos tienen errores y no se han guardado.\n¿Deseas revisar el formulario? Algunos campos necesitan tu atención.\n¿Deseas revisar el formulario? Ahora no - Guardar de todos modos Seguir editando ¿Desea marcar este formulario como completo? Si sale toda la información del formulario será descartada. Algunos campos presentan errores y no se han guardado.\nSi sales ahora, los cambios se descartarán. - Algunos campos tienen errores y no serán guardados. - Algunos campos obligatorios faltan llenarse, el formulario no puede ser guardado - Faltan algunos campos obligatorios y el formulario no puede guardarse.\nSi sales ahora, los cambios se descartarán. Compartir El permiso de cámara está denegado.\nDebes activarlo para usar esta función. Cerrar - Advertencia de reglas del programa - Hay un problema de configuración que provoca un bucle en las reglas. Póngase en contacto con su administrador. Copiado - No hay información para este campo Tomar foto Desde la galería ¡Importante! @@ -100,13 +83,10 @@ Coordenadas para No quedan valores reservados. Contacte con el administrador del sistema. Fecha del incidente - Se requiere el permiso de localización para obtener coordenadas. Por favor, habilítelo desde los ajustes del dispositivo. Abrir con No se ha encontrado opción Descargar Escanear - Código QR - Código de barras Agregar ubicación Este formulario no tiene campos configurados %s detalles @@ -142,7 +122,6 @@ **********************--> La contraseña está vacía. Ingrese la contraseña. El usuario está vacío. Ingrese el usuario. - Este servidor trabaja sobre una versión de dhis distinta a 2.29. Actualice el servidor o utilice el entorno de pruebas para continuar. Este servidor tiene una version de DHIS2 diferente de %s. Actualice su servidor o contacte a su administrador. Algo ha ido mal. Por favor, compruebe que tanto la url del servidor como el usuario y contraseña son correctos y pruebe otra vez. Disculpe, hubo un error del lado del servidor. diff --git a/commonskmm/src/commonMain/composeResources/values-fr/strings.xml b/commonskmm/src/commonMain/composeResources/values-fr/strings.xml index 61235128076..42fddb45f7d 100644 --- a/commonskmm/src/commonMain/composeResources/values-fr/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-fr/strings.xml @@ -24,16 +24,9 @@ Ce champ est obligatoire Vous avez des messages d\'avertissement. Requis - Date - Années - Mois - Jours - %s ne peut pas être analysé comme une date Polygone Latitude Longitude - Les valeurs des coordonnées ne sont pas valides - Le polygône a été défini Entrez une valeur Entrez url Entrez e-mail @@ -48,25 +41,18 @@ Saisir texte long Saisir du texte Date d\'échéance - Champ obligatoire Non enregistré! Vérifier Terminer Annuler les modifications Enregistré! Pas maintenant - Enregistrer quand même Continuer l’édition Voulez-vous marquer ce formulaire comme complet? Si vous quittez maintenant, toutes les informations du formulaire seront supprimées. - Certains champs contiennent des erreurs et ils ne sont pas enregistrés. - Certains champs obligatoires manquent et le formulaire ne peut pas être enregistré. Partager Fermer - Avertissement relatif aux règles du programme - Il y a un problème de configuration provoquant une boucle dans les règles. Contactez votre administrateur. Copié - Pas d\'information pour ce champ Prendre une photo Attention. Vérifiez ceci! Ne pas montrer de nouveau @@ -90,13 +76,10 @@ Coordonnées pour Il n\'y a plus de valeurs réservées. Veuillez contacter votre administrateur système. Date de l´incident - L\'autorisation de localisation est nécessaire pour capturer les coordonnées. Veuillez les activer dans les paramètres de l\'application Ouvrir avec Aucune option trouvée Télécharger Scanner - Code QR - Code-barre Ajouter un lieu Ce formulaire n\'a pas de champs configurés %s détails @@ -126,7 +109,6 @@ **********************--> Le mot de passe est manquant. Veuillez entrer le mot de passe. Le nom d\'utilisateur est manquant. Veuillez entrer le nom d\'utilisateur. - Ce serveur a une version différente de 2.29. Mettre à jour la version ou utiliser un environnement d\'essai pour continuer L\'URL fournie n\'est pas un serveur DHIS2. Nom d\'utilisateur ou le mot de passe sont incorrects Serveur inconnu diff --git a/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml b/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml index ce60d43e806..39ab3e96eb3 100644 --- a/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml @@ -18,11 +18,6 @@ आपके पास कुछ चेतावनी संदेश हैं आपके पास कुछ चेतावनी संदेश हैं\nक्या आप इस फ़ॉर्म को कम्प्लीट मार्क करना चाहते हैं\? आवश्यकता है - तारीख - वर्ष - महीने - दिन - %s डेट के रूप में पढ़ा नहीं जा सकता अक्षांश देशांतर मान दर्ज करें @@ -35,15 +30,12 @@ अक्षर दर्ज करें लंबा अक्षर दर्ज करें पाठ दर्ज करें - अक्षांश - देशांतर सेव नहीं रिव्यू पूरा हुआ बदलावों को छोड़ना है सेव अभी नहीं - सेव करें संपादन करते रहें साझा करें बंद करें diff --git a/commonskmm/src/commonMain/composeResources/values-id/strings.xml b/commonskmm/src/commonMain/composeResources/values-id/strings.xml index 4b1c57297c4..7c91f0384ed 100644 --- a/commonskmm/src/commonMain/composeResources/values-id/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-id/strings.xml @@ -17,15 +17,9 @@ Pilih unit organisasi Bidang ini wajib Wajib - Tanggal - Tahun - Bulan - Hari Poligon Garis lintang Garis bujur - Nilai koordinat tidak valid - Poligon ditangkap Masukkan nilai Masukkan URL Masukan email @@ -43,12 +37,10 @@ Lengkap Hapus perubahan Tersimpan! - Simpan bagaimanapun Bagikan Izin kamera ditolak.\nAnda harus mengaktifkannya untuk menggunakan fitur ini. Tutup Tersalin - Tidak ada info untuk bidang ini Ambil gambar Periksa ini! Jangan perlihatkan lagi @@ -74,7 +66,6 @@ Tidak ada hasil ditemukan Selesai Tidak didukung - Server ini menjalankan versi dhis yang berbeda dari 2.29. Perbarui versi server Anda atau gunakan pengujian lingkungan untuk melanjutkan. Kesalahan saat penguraian hasil Batal OK diff --git a/commonskmm/src/commonMain/composeResources/values-km/strings.xml b/commonskmm/src/commonMain/composeResources/values-km/strings.xml index f43b201d40c..34cbb15a775 100644 --- a/commonskmm/src/commonMain/composeResources/values-km/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-km/strings.xml @@ -10,10 +10,6 @@ កំហុសបច្ចេកទេស ជ្រើសរើសថ្ងៃខែឆ្នាំ ទាមទារ - កាលបរិច្ឆេទ - ឆ្នាំ - ខែ - ថ្ងៃ រយៈទទឹង រយៈបណ្តោយ បញ្ជូលទិន្នន័យជាលេខ (វិជ្ជមាន រឺ លេខ ០) @@ -44,7 +40,6 @@ មិនមានលទ្ធផលបង្ហាញ Done មិនគាំទ្រ​ / មិនអាចធ្វើឡើងបានទេ - ម៉ាស៊ីនមេនេះកំពុងដំណើរការខុសពី DHIS ២.២៩។ សូមធ្វើបច្ចុប្បន្នភាពលើម៉ាស៊ីនមេរបស់អ្នក​ កំហុសខណៈពេលញែកលទ្ធផល បោះបង់ យល់ព្រម diff --git a/commonskmm/src/commonMain/composeResources/values-lo/strings.xml b/commonskmm/src/commonMain/composeResources/values-lo/strings.xml index b2a003396cf..ffe9abe14d6 100644 --- a/commonskmm/src/commonMain/composeResources/values-lo/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-lo/strings.xml @@ -23,16 +23,9 @@ ຄ່າຂອງຫ້ອງປ້ອນຂໍ້ມູນ%sບໍ່ໄດ້ຂຶ້ນກັບຕົວເລືອກທີ່ຕັ້ງໄວ້ໃນ%s ຊ່ອງປ້ອນຂໍ້ມູນນີ້ແມ່ນຈໍາເປັນຕ້ອງປ້ອນຂໍ້ມູນໃສ່ ຕ້ອງການ - ວັນທີ່ - ປີ - ເດືອນ - ມື້ - %sບໍ່ສາມາດວິເຄາະເປັນວັນທີໄດ້ Polygon ເສັ້ນຂະໜານ ເສັ້ນແວງ - ປະສານງານບໍ່ຖືກຕ້ອງ - ບັນທຶກຮູບຫຼາຍຫຼ່ຽມ ປ້ອນຄ່າ ປ້ອນ url ປ້ອນອີເມລ @@ -47,23 +40,18 @@ ປ້ອນຂໍ້ມູນເປັນຂໍ້ຄວາມຍາວ ຂຽນຄໍາຕອບ ວັນທີຕ້ອງແລ້ວ - ຊ່ອງປ້ອນຂໍ້ມູນທີ່ບັງຄັບ ບໍ່ໄດ້ບັນທຶກ ທົບທວນຄືນ ສຳເລັດແລ້ວ ລຶບການປ່ຽນແປງ ບັນທຶກແລ້ວ! ບໍ່​ແມ່ນ​ຕອນ​ນີ້ - ບັນທຶກ ສຶບຕໍ່ແກ້ໄຂ ທ່ານຕ້ອງການໝາຍແບບຟອມນີ້ວ່າສຳເລັດແລ້ວຫຼືບໍ\? ຖ້າທ່ານອອກດຽວນີ້ ຂໍ້ມູນທັງໝົດໃນແບບຟອມຈະຖືກຍົກເລີກ. ເຜີຍແຜ່ ປິດ - ຂໍ້ຄວນລະວັງກົດຂອງສາຍງານ - ມີບັນຫາການກຳນົດຄ່າທີ່ເຮັດໃຫ້ເກີດມີຊ່ອງຫວ່າງໃນກົດລະບຽບ. ຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ. ສຳເນົາແລ້ວ - ບໍ່ມີຂໍ້ມູນສຳລັບຫ້ອງຂໍ້ມູນນີ້ ຖ່າຍຮູບ ກວດເບີ່ງອັນນີ້ ບໍ່ຕ້ອງສະແດງອີກ @@ -108,7 +96,6 @@ **********************--> ບໍ່ມີລະຫັດຜ່ານ. ກະລຸນາໃສ່ລະຫັດຜ່ານ. ບໍ່ມີຊື່ຜູ້ໃຊ້. ກະລຸນາປ້ອນຊື່ຜູ້ໃຊ້ - ຄອມພີວເຕີໜ່ວຍແມ່ກໍາລັງທໍາງານກັບລະບົບ DHIS2 ລຸ້ນສູງກ່ວາ 2.29. ກະລຸນາ ນໍາໃຊ້ລຸນທີ່ສູງກ່ວາ ຫຼື ນໍາໃຊ້ລະບົບທົດລອງແທນ ຄອມພິວເຕີໜ່ວຍແມ່ເຄື່ອງນີ້ກຳລັງໃຊ້ເວີຊັນ DHIS2 ທີ່ແຕກຕ່າງຈາກ%s . ອັບເດດລຸ່ນຂອງຄອມພິວເຕີເຄື່ອງແມ່ຂອງທ່ານ ຫຼື ຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ. ມີບາງສິ່ງບາງຢ່າງຜິດພາດ. ກະລຸນາກວດເບິ່ງທີ່ຢູ່ຂອງເຄື່ອງຄອມພິວເຕີໜ່ວຍແມ່, ຊື່ຜູ້ໃຊ້ ແລະ ລະຫັດຜ່ານວ່າຖືກຕ້ອງແລ້ວ ແລ້ວລອງໃໝ່ອີກຄັ້ງ. ຂໍອາໄພ! ມີບາງຢ່າງລົ້ມເຫຼວໃນເຄື່ອງຄອມພິວເຕີໜ່ວຍແມ່. diff --git a/commonskmm/src/commonMain/composeResources/values-my/strings.xml b/commonskmm/src/commonMain/composeResources/values-my/strings.xml index a302e05d7c1..e4d17d0f0bd 100644 --- a/commonskmm/src/commonMain/composeResources/values-my/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-my/strings.xml @@ -4,9 +4,6 @@ အမှား ရက်စွဲ ကိုရွေးချယ်ပါ ဖြည့်သွင်းရန်လိုအပ်သည် - ရက်စွဲ - နှစ်များ - လများ Дата выполнения ပြည့်စုံသည်။ ပိတ်သည် diff --git a/commonskmm/src/commonMain/composeResources/values-nb/strings.xml b/commonskmm/src/commonMain/composeResources/values-nb/strings.xml index 7c8635f1aae..fc34c808707 100644 --- a/commonskmm/src/commonMain/composeResources/values-nb/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-nb/strings.xml @@ -18,15 +18,9 @@ Velg organisasjonsenhet Dette feltet er obligatorisk Påkrevd - Dato - År - Måneder - Dager Polygon Breddegrad Lengdegrad - Koordinatverdiene er ikke gyldige - Polygon oppfanget Legg inn verdi Legg inn URL Legg inn e-post @@ -44,12 +38,10 @@ Fullfør Forkast endringer Lagret! - Lagre likevel Fortsett å rediger Del Lukk Kopiert - Ingen info for dette feltet Sjekk dette! Attributter - %s Koordinater for @@ -75,7 +67,6 @@ Ingen resultater funnet Fullfør Ikke støttet - Denne serveren kjører en dhis versjon som er forskjellig fra 2.29. Oppdater din serverversjon eller bruk testmiljøet for å fortsette. Feil under analyse av resultater Wachtwoord ontbreekt. Voer wachtwoord in alstublieft. Gebruikersnaam ontbreekt. Voer gebruikersnaam in. - Deze server draait een andere versie dan 2.29. Werk uw serverversie bij of gebruik de testomgeving om verder te gaan. Deze server draait een andere DHIS2-versie dan %s. Werk uw serverversie bij of neem contact op met uw beheerder. Er is iets fout gegaan. Controleer of de server-URL, gebruikersnaam en wachtwoord juist zijn en probeer het opnieuw. Sorry! Er is iets misgegaan aan de serverzijde. diff --git a/commonskmm/src/commonMain/composeResources/values-prs/strings.xml b/commonskmm/src/commonMain/composeResources/values-prs/strings.xml index b791b633594..e8ffe608337 100644 --- a/commonskmm/src/commonMain/composeResources/values-prs/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-prs/strings.xml @@ -3,10 +3,6 @@ رقم باید کامل باشد خطا ضروری - تاریخ - سالانه - ماه ها - روزها چند ضلعی عرض البلد طول البلد diff --git a/commonskmm/src/commonMain/composeResources/values-ps/strings.xml b/commonskmm/src/commonMain/composeResources/values-ps/strings.xml index 51825c9dc24..d33f57f12c1 100644 --- a/commonskmm/src/commonMain/composeResources/values-ps/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-ps/strings.xml @@ -3,10 +3,6 @@ ارقام باید صحیح عدد وي تېروته اړین دي - نېټه - کلونه - میاشت - ورځې لېټېټيوډ لانګېټيوډ ټاکلې نېټه diff --git a/commonskmm/src/commonMain/composeResources/values-pt-rBR/strings.xml b/commonskmm/src/commonMain/composeResources/values-pt-rBR/strings.xml index 7caad5b8e83..95f522f9084 100644 --- a/commonskmm/src/commonMain/composeResources/values-pt-rBR/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-pt-rBR/strings.xml @@ -3,14 +3,9 @@ Valor deve ser um número inteiro Erro Exigido - Data - Anos - Meses - Dias Poligono Latitude Longitude - Polígono capturado Data de vencimento Completo Partilhar diff --git a/commonskmm/src/commonMain/composeResources/values-pt/strings.xml b/commonskmm/src/commonMain/composeResources/values-pt/strings.xml index b947ca885da..c2498ba2970 100644 --- a/commonskmm/src/commonMain/composeResources/values-pt/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-pt/strings.xml @@ -24,16 +24,9 @@ Este campo é obrigatório Tem algumas mensagens de aviso. Obrigatório - Encontro - Anos - Meses - Dias - %s não pode ser analisado como uma data Poligono Latitude Longitude - Os valores das coordenadas não são válidos - Polígono capturado Digite o valor Digite o URL Digite o email @@ -48,27 +41,18 @@ Inserir texto longo Inserir texto Data de Vencimento - Campo obrigatório - Latitude: - Longitude: Não guardado Revisão Concluir Descartar alterações Gravado! Agora não - Salve mesmo assim Continue a editar Deseja marcar este formulário como completo? Se sair agora, todas as informações do formulário serão descartadas. - Alguns campos apresentam erros e não são guardados. - Alguns campos obrigatórios estão em falta e o formulário não pode ser guardado. Partilhar Fechar - Aviso de regras do programa - Existe um problema de configuração que está a provocar um ciclo nas regras. Contacte o seu administrador. Copiado - Nenhuma informação para este campo Tirar fotografia Verifique isso! Não mostrar novamente @@ -92,13 +76,10 @@ Coordenadas para o Não há mais valores reservados. Entre em contato com o administrador do sistema Data do incidente - A permissão de localização é necessária para captar as coordenadas. Por favor, ative-a nas definições do aplicativo Abrir com Nenhuma opção encontrada Baixar Digitalizar - Código QR - Código de barras Adicionar localização Este formulário não tem campos configurados %s detalhes @@ -129,7 +110,6 @@ **********************--> A palavra-passe está em falta. Introduza a palavra-passe. O nome de utilizador está em falta. Por favor, introduza o nome de utilizador. - Este servidor está executando uma versão dhis diferente de 2.29. Atualize a versão do servidor ou use o ambiente de teste para continuar. Este servidor está a executar uma versão do DHIS2 diferente de %s. Actualize a versão do seu servidor ou contacte o seu administrador. Algo correu mal. Verifique se o URL do servidor, o nome de utilizador e a palavra-passe estão correctos e tente novamente. Desculpe! Algo falhou no lado do servidor. diff --git a/commonskmm/src/commonMain/composeResources/values-ro/strings.xml b/commonskmm/src/commonMain/composeResources/values-ro/strings.xml index 901c7f098ad..349eb09ecb6 100644 --- a/commonskmm/src/commonMain/composeResources/values-ro/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-ro/strings.xml @@ -1,11 +1,6 @@ Eroare - Data - Ani - Luni - Zile - Salvare oricum Partajare Închidere Data incidentului diff --git a/commonskmm/src/commonMain/composeResources/values-ru/strings.xml b/commonskmm/src/commonMain/composeResources/values-ru/strings.xml index 2c17acd492e..db01df14eb6 100644 --- a/commonskmm/src/commonMain/composeResources/values-ru/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-ru/strings.xml @@ -23,15 +23,9 @@ У вас есть несколько предупреждающих сообщений. У Вас есть несколько предупреждающих сообщений.\nХотите ли Вы отметить эту форму как завершенную? Обязательный - Дата - Годы - Месяцы - Дни Полигон Широта Долгота - Значения координат не действительны - Полигон зафиксирован Введите значение Введите url Введите электронную почту @@ -46,7 +40,6 @@ Ввод длинного текста Введите текст Дата выполнения - Обязательное поле Не сохранено Просмотр Завершить @@ -56,21 +49,14 @@ В некоторых полях есть ошибки, и они не сохраняются. \nВы хотите просмотреть форму? Некоторые поля требуют Вашего внимания.\nХотите просмотреть форму? Не сейчас - Сохранить в любом случае Продолжить редактирование Хотите ли Вы отметить эту форму как завершенную? Если Вы выйдете сейчас, вся информация в форме будет удалена. Некоторые поля содержат ошибки, и они не сохраняются. \nЕсли Вы выйдете сейчас, изменения будут отменены. - Некоторые поля содержат ошибки, и они не сохраняются. - Некоторые обязательные поля отсутствуют, и форму невозможно сохранить. - Некоторые обязательные поля отсутствуют, и форма не может быть сохранена. \nЕсли вы выйдете сейчас, изменения будут отменены. Поделиться Разрешение камеры запрещено.\nЧтобы использовать эту функцию, ее необходимо разрешить. Закрыть - Предупреждение о правилах программы - Существует проблема конфигурации, вызывающая зацикливание правил. Обратитесь к администратору. Скопировано - Нет информации для этого поля Сделать фото Из галереи Проверьте это! @@ -94,13 +80,10 @@ Координаты для Больше нет зарезервированных значений. Обратитесь к системному администратору Дата происшествия - Для захвата координат необходимо разрешение на определение местоположения. Пожалуйста, включите их в настройках приложения Открыть с помощью Опции не найдены Скачать Сканировать - QR-код - Штрих-код Добавить локацию В этой форме нет настроенных полей %s деталей @@ -133,7 +116,6 @@ **********************--> Пароль отсутствует. Пожалуйста, введите пароль. Имя пользователя отсутствует. Пожалуйста, введите имя пользователя. - На этом сервере установлена версия dhis, отличная от 2.29. Обновите версию своего сервера или используйте тестовую среду для продолжения работы. На этом сервере установлена версия DHIS2, отличная от %s. Обновите версию сервера или обратитесь к администратору. Что-то пошло не так. Пожалуйста, проверьте правильность URL-адреса сервера, имени пользователя и пароля и повторите попытку. Извините! Что-то не получилось на стороне сервера. diff --git a/commonskmm/src/commonMain/composeResources/values-si/strings.xml b/commonskmm/src/commonMain/composeResources/values-si/strings.xml index fdbec3574f9..804b0a9d6db 100644 --- a/commonskmm/src/commonMain/composeResources/values-si/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-si/strings.xml @@ -1,10 +1,6 @@ දෝෂය - දිනය - අවුරුදු - මාස - දින වෙනස් කිරීම් ඉවතලන්න වසන්න බාගත කරන්න diff --git a/commonskmm/src/commonMain/composeResources/values-sv/strings.xml b/commonskmm/src/commonMain/composeResources/values-sv/strings.xml index d5751363d53..798704fbceb 100644 --- a/commonskmm/src/commonMain/composeResources/values-sv/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-sv/strings.xml @@ -11,10 +11,6 @@ Fel Välj datum Nödvändig - Datum - År - Månader - Dagar Latitud Longitud Ange ett positivt heltal eller noll. @@ -43,7 +39,6 @@ Longitud Lägg till fil Inga resultat hittades - Den här servern kör en dhis-version som skiljer sig från 2.29. Uppdatera din serverversion eller använd testmiljön för att fortsätta. Fel vid tolkning av resultat Avbryt ok diff --git a/commonskmm/src/commonMain/composeResources/values-tet/strings.xml b/commonskmm/src/commonMain/composeResources/values-tet/strings.xml index f7f9abb5148..066de3d02bd 100644 --- a/commonskmm/src/commonMain/composeResources/values-tet/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-tet/strings.xml @@ -2,9 +2,6 @@ Erru Nesesáriu - Data - Tinan - Fulan Kompletu Partilla Taka diff --git a/commonskmm/src/commonMain/composeResources/values-tg/strings.xml b/commonskmm/src/commonMain/composeResources/values-tg/strings.xml index 877496fe1aa..921720cdddd 100644 --- a/commonskmm/src/commonMain/composeResources/values-tg/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-tg/strings.xml @@ -3,9 +3,6 @@ Қимат бояд адади бутун бошад Хатогӣ Ҳатмӣ - Сана - Солҳо - Моҳҳо Бисёркунҷа Тӯл Арз diff --git a/commonskmm/src/commonMain/composeResources/values-uk/strings.xml b/commonskmm/src/commonMain/composeResources/values-uk/strings.xml index 543f1adaa55..63e2e009d39 100644 --- a/commonskmm/src/commonMain/composeResources/values-uk/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-uk/strings.xml @@ -23,16 +23,9 @@ Значення для поля %s не належить параметру, встановленому в %s Це поле обов\'язкове для заповнення Обов\'язкове поле - Дата - Роки - Місяці - Дні - %s не можна проаналізувати як дату Багатокутник Широта Довгота - Значення координат недійсні - Зафіксовано багатокутник Введіть значення Введіть URL-адресу Введіть адресу електронної пошти @@ -47,9 +40,6 @@ Введіть довгий текст Введіть текст Запланована дата - Обов\'язкове поле - Широта: - Довгота: Не збережено Перегляд Завершити @@ -59,14 +49,9 @@ Продовжити редагування Ви бажаєте позначити цю форму як завершену? Якщо Ви зараз вийдете, уся інформація у формі буде відхилена. - Деякі поля містять помилки і не були збережені. - Деякі обов’язкові поля не заповнено, і форму неможливо зберегти. Поділитися Закрити - Попередження про правила програми - Існує проблема конфігурації, яка спричиняє помилку у правилах. Зверніться до адміністратора. Скопійовано - Немає інформації для цього поля Зробити фото Перевірте це! Не показувати знову @@ -91,7 +76,6 @@ Більше немає зарезервованих значень. Зверніться до свого системного адміністратора Дата інциденту Завантажити - QR-код Додати місцезнаходження %s Деталі Організаційний підрозділ @@ -117,7 +101,6 @@ **********************--> Пароль відсутній. Будь ласка, введіть пароль. Ім\'я користувача відсутнє. Будь ласка, введіть ім\'я користувача. - На цьому сервері працює інша версія dhis, ніж 2.29. Щоб продовжити, оновіть версію серверу або скористайтеся середовищем тестування. На цьому сервері працює версія DHIS2, що відрізняється від %s. Оновіть версію серверу або сконтактуйте з системним адміністратором. Сталася помилка. Будь ласка, перевірте правильність URL-адреси серверу, імені користувача та пароля і повторіть спробу. Вибачте! На сервері сталася помилка. diff --git a/commonskmm/src/commonMain/composeResources/values-ur/strings.xml b/commonskmm/src/commonMain/composeResources/values-ur/strings.xml index 30391151185..4327fe9a0dd 100644 --- a/commonskmm/src/commonMain/composeResources/values-ur/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-ur/strings.xml @@ -3,10 +3,6 @@ ویلیو انٹیجر ہونی چاہیے غلطی لازمی - تاریخ - سال - مہینے - دن کثیر زبان طول لمبائی diff --git a/commonskmm/src/commonMain/composeResources/values-uz-rUZ/strings.xml b/commonskmm/src/commonMain/composeResources/values-uz-rUZ/strings.xml index 85c7a70918e..846df44e6d8 100644 --- a/commonskmm/src/commonMain/composeResources/values-uz-rUZ/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-uz-rUZ/strings.xml @@ -18,15 +18,9 @@ Tashkiliy boʼlimni tanlang Maydon toʼldirilishi majburiy Majburiy - Sana - Yillar - Oylar - Kunlar Poligon Kenglik Kenglik - Koordinata qiymatlari yaroqsiz - Koʼpburchak ushlandi Qiymatni tanlang URL ni tanlang ye-pochta manzilini kiriting @@ -45,12 +39,10 @@ Bajarildi Oʼzgartirishlar bekor qilinsin Saqlandi! - Nima boʼlganda ham saqlash Tahrirni davom eting Улашиш Yopmoq Nusxa olindi - Ushbu maydon uchun maʼlumot yoʼq Buni tekshiring! Аtribatlar - %s Uchun koordinatalar @@ -71,7 +63,6 @@ Fayl qoʼshish Rasm qoʼshish Hech qanday natija topilmadi - Ushbu server 2.29 dan farqli versiyani ishlatmoqda. Server versiyasini yangilang yoki davom etish uchun sinov muddatidan foydalaning. Nimadir notoʼgʼri bajarildi. Server URL manzili, foydalanuvchi nomi va parol toʼgʼri ekanligini tekshiring va qaytadan urining. Natijalarni tahlil qilishda xatolik yuz berdi Бекор қилиш diff --git a/commonskmm/src/commonMain/composeResources/values-uz/strings.xml b/commonskmm/src/commonMain/composeResources/values-uz/strings.xml index 26de626e199..af1e7cadc1c 100644 --- a/commonskmm/src/commonMain/composeResources/values-uz/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-uz/strings.xml @@ -18,15 +18,9 @@ Ташкилий бўлимни танланг Майдон тўлдирилиши мажбурий Мажбурий - Сана - Йиллар - Ойлар - Кунлар Полигон Кенглик Узунлик - Координата қийматлари яроқсиз - Полигон белгиланди Қийматни танланг URL ни танланг е-почта манзилини киритинг @@ -46,12 +40,10 @@ Ўзгартиришлар бекор қилинсин Сақланди! Hozir emas - Нима бўлганда ҳам сақлаш Таҳрирни давом этинг Улашиш Ёпмоқ Нусха олинди - Ушбу майдон учун маълумот йўқ Суратга олиш Буни текширинг! Атрибатлар - %s @@ -59,7 +51,6 @@ Сақланган бошқа қийматлар йўқ. Тизим администраторига мурожаат қилинг. Ҳодиса санаси Юклаш - QR код Локация қўшинг Ташкилий бўлим Координаталар @@ -81,7 +72,6 @@ Натижа йўқ Бўлди Қўллаб қувватланмайди - Ушбу сервер 2.29 дан фарқли версияни ишлатмоқда. Сервер версиясини янгиланг ёки давом этиш учун синов муддатидан фойдаланинг. Натижаларни таҳлил қилишда хатолик юз берди Thiếu mật khẩu. Xin vui lòng nhập mật khẩu Thiếu tên đăng nhập. Xin vui lòng nhập tên đăng nhập. - Máy chủ này đang chạy phiên bản dhis khác với phiên bản 2.29. Hãy cập nhật phiên bản máy chủ của bạn hoặc sử dụng môi trường thực nghiệm để tiếp tục. Máy chủ này đang chạy phiên bản DHIS2 khác với %s. Vui lòng cập nhật phiên bản máy chủ của bạn hoặc liên hệ quản lý. Có gì đó không đúng. Vui lòng kiểm tra đường dẫn liên kết đến máy chủ, tên đăng nhập, mật khẩu và thử lại. Rất tiếc! Có lỗi gì đó ở phía máy chủ diff --git a/commonskmm/src/commonMain/composeResources/values-zh-rCN/strings.xml b/commonskmm/src/commonMain/composeResources/values-zh-rCN/strings.xml index d21528424cd..a83b6a4bc30 100644 --- a/commonskmm/src/commonMain/composeResources/values-zh-rCN/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-zh-rCN/strings.xml @@ -24,16 +24,9 @@ 此字段是必填字段 您收到了一些警告信息。 必须的 - 日期 - - - - %s 无法解析为日期 多边形 纬度 经度 - 坐标值无效 - 采集的多边形。 输入值 输入url 输入电子邮件 @@ -48,27 +41,18 @@ 输入长文本 输入文本 到期日期 - 强制字段 - 纬度: - 经度: 未保存 审查 完成 忽略修改 已经保存! 现在不要 - 仍然保存 继续编辑 您想将此表单标记为已完成吗? 如果您现在退出,表单中的所有信息都将被丢弃。 - 一些字段有错误并且它们没有被保存。 - 缺少一些必填字段,无法保存表单。 分享 关闭 - 项目规则警告 - 存在导致规则循环的配置问题。联系您的管理员。 副本 - 该字段没有相关信息 拍照 来自画廊 检查 @@ -93,13 +77,10 @@ 坐标 没有更多保留值,请联系管理员 事件日期 - 获取坐标需要位置权限。请在应用程序设置中启用它们 打开用 找不到选项 下载 扫描 - 二维码 - 条码 添加位置 该表单没有配置任何字段 %s详细信息 @@ -130,7 +111,6 @@ **********************--> 密码丢失。请输入密码。 缺少用户名。请输入用户名。 - 服务器运行版本不是2.29,请更新服务器版本或使用测试环境继续 此服务器正在运行与 %s 不同的 DHIS2 版本。更新您的服务器版本或联系您的管理员。 出了些问题。请检查服务器 URL、用户名和密码是否正确,然后重试。 对不起!服务器端出现问题。 diff --git a/commonskmm/src/commonMain/composeResources/values-zh/strings.xml b/commonskmm/src/commonMain/composeResources/values-zh/strings.xml index b3e356705b9..65a49b23721 100644 --- a/commonskmm/src/commonMain/composeResources/values-zh/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-zh/strings.xml @@ -25,16 +25,9 @@ 您收到了一些警告信息。 您收到了一些警告信息。\n您是否要将此表格标记为已完成? 必须的 - 日期 - - - - %s 无法解析为日期 多边形 维度 经度 - 坐标值无效 - 采集的多边形。 输入值 输入url 输入电子邮件 @@ -49,9 +42,6 @@ 输入长文本 输入文本 到期日期 - 强制字段 - 纬度: - 经度: 未保存 审查 完成 @@ -61,21 +51,14 @@ 某些字段有错误,无法保存。 \n您想查看表格吗? 有些字段需要您注意。\n您要查看表格吗? 现在不要 - 仍然保存 继续编辑 您想将此表单标记为已完成吗? 如果您现在退出,表单中的所有信息都将被丢弃。 某些字段有错误,无法保存。 \n如果您现在退出,更改将被丢弃。 - 一些字段有错误并且它们没有被保存。 - 缺少一些必填字段,无法保存表单。 - 某些必填字段缺失,无法保存表格。 \n如果您现在退出,更改将被丢弃。 分享 相机权限被拒绝。\n您需要启用它才能使用此功能。 关闭 - 项目规则警告 - 存在导致规则循环的配置问题。联系您的管理员。 副本 - 该字段没有相关信息 拍照 来自画廊 检查 @@ -101,13 +84,10 @@ 坐标 没有更多保留值,请联系管理员 事件日期 - 获取坐标需要位置权限。请在应用程序设置中启用它们 打开用 找不到选项 下载 扫描 - 二维码 - 条码 添加位置 该表单没有配置任何字段 %s详细信息 @@ -143,7 +123,6 @@ **********************--> 密码丢失。请输入密码。 缺少用户名。请输入用户名。 - 服务器运行版本不是2.29,请更新服务器版本或使用测试环境继续 此服务器正在运行与 %s 不同的 DHIS2 版本。更新您的服务器版本或联系您的管理员。 出了些问题。请检查服务器 URL、用户名和密码是否正确,然后重试。 对不起!服务器端出现问题。 diff --git a/commonskmm/src/commonMain/composeResources/values/strings.xml b/commonskmm/src/commonMain/composeResources/values/strings.xml index 3f0da35116c..22dadf90ef4 100644 --- a/commonskmm/src/commonMain/composeResources/values/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values/strings.xml @@ -26,16 +26,9 @@ You have some warning messages. You have some warning messages.\nDo you want to mark this form as complete? Required - Date - Years - Months - Days - %s can\'t be parsed as a date Polygon Latitude Longitude - Coordinates values are not valid - Polygon captured Enter value Enter url Enter email @@ -50,9 +43,6 @@ Enter long text Enter text Due date - Mandatory field - Lat: - Long: Not saved Review Complete @@ -62,21 +52,14 @@ Some fields have errors and they are not saved. \nDo you want to review the form? Some fields need your attention.\nDo you want to review the form? Not now - Save anyway Keep editing Do you want to mark this form as complete? If you exit now all the information in the form will be discarded. Some fields have errors and they are not saved. \nIf you exit now the changes will be discarded. - Some fields have errors and they are not saved. - Some mandatory fields are missing and the form cannot be saved. - Some mandatory fields are missing and the form cannot be saved. \nIf you exit now the changes will be discarded. Share Camera permission is denied.\nYou need to enable it to use this feature. Close - Program rules warning - There is a configuration issue causing a loop in the rules. Contact you administrator. Copied - No info for this field Take Photo From gallery Check this! @@ -102,13 +85,10 @@ Coordinates for the There are no more reserved values. Contact your system administrator Incident date - The location permission is needed for capturing coordinates. Please, enable them in the application settings Open with No option found Download Scan - QR code - Bar code Add location This form has no fields configured %s details @@ -144,7 +124,6 @@ **********************--> Password is missing. Please enter password. Username is missing. Please enter username. - This server is running a dhis version different than 2.29. Update your server version or use the testing environment to proceed. This server is running a DHIS2 version different than %s. Update your server version or contact your admin. Something went wrong. Please check that server URL, username and password are correct and try again. Sorry! Something failed on the server side. diff --git a/dhis2_android_maps/src/main/res/values-ar/strings.xml b/dhis2_android_maps/src/main/res/values-ar/strings.xml index ccae4686fd0..46f22b2e4a1 100644 --- a/dhis2_android_maps/src/main/res/values-ar/strings.xml +++ b/dhis2_android_maps/src/main/res/values-ar/strings.xml @@ -8,7 +8,6 @@ Bing داكن Bing جوي تطبيق - إظهار عرض القمر الصناعي إظهار الأحداث إظهار إحداثيات tei إظهار طبقة مخطط الحرارة diff --git a/dhis2_android_maps/src/main/res/values-cs/strings.xml b/dhis2_android_maps/src/main/res/values-cs/strings.xml index d3f4de029f2..28c0d6f34db 100644 --- a/dhis2_android_maps/src/main/res/values-cs/strings.xml +++ b/dhis2_android_maps/src/main/res/values-cs/strings.xml @@ -13,7 +13,6 @@ Azure Aerial Azure Aerial Labels Použít - Zobrazit satelitní pohled Zobrazit události Zobrazit TEI souřadnice Zobrazit vrstvu teplotní mapy diff --git a/dhis2_android_maps/src/main/res/values-es-rES/strings.xml b/dhis2_android_maps/src/main/res/values-es-rES/strings.xml index b28858e97a5..4cdeb71a5ca 100644 --- a/dhis2_android_maps/src/main/res/values-es-rES/strings.xml +++ b/dhis2_android_maps/src/main/res/values-es-rES/strings.xml @@ -3,7 +3,6 @@ Seleccione ubicación Capas del Mapa Aplicar - Mostrar vista satélite Mostrar eventos Mostrar coordenadas de la entidad Mostrar mapa de calor diff --git a/dhis2_android_maps/src/main/res/values-es/strings.xml b/dhis2_android_maps/src/main/res/values-es/strings.xml index 2f5e8d549f8..653d67fcd5b 100644 --- a/dhis2_android_maps/src/main/res/values-es/strings.xml +++ b/dhis2_android_maps/src/main/res/values-es/strings.xml @@ -13,7 +13,6 @@ Azure Vista Aérea Azure Vista Aérea con Etiquetas Aplicar - Mostrar vista satélite Mostrar eventos Mostrar coordenadas de la entidad Mostrar mapa de calor diff --git a/dhis2_android_maps/src/main/res/values-fr/strings.xml b/dhis2_android_maps/src/main/res/values-fr/strings.xml index 6f9b664bd07..43fb4f3467e 100644 --- a/dhis2_android_maps/src/main/res/values-fr/strings.xml +++ b/dhis2_android_maps/src/main/res/values-fr/strings.xml @@ -13,7 +13,6 @@ Azure Vue Aérienne Azure Vue Aérienne avec Étiquettes Appliquer - Afficher la vue satellite Afficher les événements Afficher les coordonnées tei Afficher la couche de carte thermique diff --git a/dhis2_android_maps/src/main/res/values-id/strings.xml b/dhis2_android_maps/src/main/res/values-id/strings.xml index 8c0622a1bf2..858c95d691e 100644 --- a/dhis2_android_maps/src/main/res/values-id/strings.xml +++ b/dhis2_android_maps/src/main/res/values-id/strings.xml @@ -3,7 +3,6 @@ Pilih lokasi Bing Dark Terapkan - Tampilkan citra satelit Tampilkan even Tampilkan koordinat tei Rendah diff --git a/dhis2_android_maps/src/main/res/values-nb/strings.xml b/dhis2_android_maps/src/main/res/values-nb/strings.xml index dcfacaa3265..15209820af7 100644 --- a/dhis2_android_maps/src/main/res/values-nb/strings.xml +++ b/dhis2_android_maps/src/main/res/values-nb/strings.xml @@ -9,7 +9,6 @@ Bing Flyfoto Bing Flyfoto Etiketter Bruk - Vis satelittvisning Vis hendelser Vis tei koordinater Vis varmekartlag diff --git a/dhis2_android_maps/src/main/res/values-nl/strings.xml b/dhis2_android_maps/src/main/res/values-nl/strings.xml index 354543d1e7a..125f4efbee9 100644 --- a/dhis2_android_maps/src/main/res/values-nl/strings.xml +++ b/dhis2_android_maps/src/main/res/values-nl/strings.xml @@ -9,7 +9,6 @@ Bing Aerial Bing Aerial Labels Toepassen - Satellietweergave tonen Toon evenementen Toon tei-coördinaten Warmtebeeld weergeven diff --git a/dhis2_android_maps/src/main/res/values-pt/strings.xml b/dhis2_android_maps/src/main/res/values-pt/strings.xml index 2be6fdd4180..2c0b8f2a127 100644 --- a/dhis2_android_maps/src/main/res/values-pt/strings.xml +++ b/dhis2_android_maps/src/main/res/values-pt/strings.xml @@ -9,7 +9,6 @@ Bing Aerial Etiquetas aéreas do Bing Aplicar - Mostrar vista de satélite Mostrar eventos Mostrar coordenadas tei Mostrar camada do mapa de calor diff --git a/dhis2_android_maps/src/main/res/values-uk/strings.xml b/dhis2_android_maps/src/main/res/values-uk/strings.xml index d4e032c7d59..c54dced58a5 100644 --- a/dhis2_android_maps/src/main/res/values-uk/strings.xml +++ b/dhis2_android_maps/src/main/res/values-uk/strings.xml @@ -8,7 +8,6 @@ Bing - супутник Bing - супутник з мітками Застосувати - Показати як вид із супутника Показати випадки Показати координати об\'єкту, який відстежується Показати шар теплової карти diff --git a/dhis2_android_maps/src/main/res/values-uz-rUZ/strings.xml b/dhis2_android_maps/src/main/res/values-uz-rUZ/strings.xml index a8e4050f2d2..547d1374d8f 100644 --- a/dhis2_android_maps/src/main/res/values-uz-rUZ/strings.xml +++ b/dhis2_android_maps/src/main/res/values-uz-rUZ/strings.xml @@ -9,7 +9,6 @@ Gibrid koʼrinish Belgilar Murojaat qilish - Suniy yoʼldosh koʼrinishini koʼrsatish Hodisa/tadbirlarni koʼrsatish TEI koordinatalarini koʼrsatish Issiqlik xaritasi qatlamini koʼrsatish diff --git a/dhis2_android_maps/src/main/res/values-uz/strings.xml b/dhis2_android_maps/src/main/res/values-uz/strings.xml index 08f61f883ae..af6486c4288 100644 --- a/dhis2_android_maps/src/main/res/values-uz/strings.xml +++ b/dhis2_android_maps/src/main/res/values-uz/strings.xml @@ -9,7 +9,6 @@ Гибрид кўриниш Қатлам белгилари Мурожаат қилиш - Суньий йўлдош кўринишини кўрсатиш Ҳодиса/тадбирларни кўрсатиш TEI координаталарини кўрсатиш Иссиқлик харитаси қатламини кўрсатиш diff --git a/dhis2_android_maps/src/main/res/values-vi/strings.xml b/dhis2_android_maps/src/main/res/values-vi/strings.xml index f87647d0c88..c073b974087 100644 --- a/dhis2_android_maps/src/main/res/values-vi/strings.xml +++ b/dhis2_android_maps/src/main/res/values-vi/strings.xml @@ -13,7 +13,6 @@ Azure Aerial Azure Aerial Labels Áp dụng - Xem Vệ Tinh Hiển thị sự kiện Hiển thị tọa độ đối tượng theo dõi Hiển thị lớp bản đồ nhiệt độ diff --git a/dhis2_android_maps/src/main/res/values-zh-rCN/strings.xml b/dhis2_android_maps/src/main/res/values-zh-rCN/strings.xml index 8cb78453585..f88f85ddd6e 100644 --- a/dhis2_android_maps/src/main/res/values-zh-rCN/strings.xml +++ b/dhis2_android_maps/src/main/res/values-zh-rCN/strings.xml @@ -9,7 +9,6 @@ Bing空间图 Bing空间标示图 应用 - 显示卫星视图 显示事件 显示跟踪实体坐标 显示热力图 diff --git a/dhis2_android_maps/src/main/res/values-zh/strings.xml b/dhis2_android_maps/src/main/res/values-zh/strings.xml index 22b721b4b4a..ca7e398e6b0 100644 --- a/dhis2_android_maps/src/main/res/values-zh/strings.xml +++ b/dhis2_android_maps/src/main/res/values-zh/strings.xml @@ -13,7 +13,6 @@ Azure 卫星图 Azure 卫星带标签图 应用 - 显示卫星视图 显示事件 显示跟踪实体坐标 显示热力图 diff --git a/dhis2_android_maps/src/main/res/values/strings.xml b/dhis2_android_maps/src/main/res/values/strings.xml index 55fa70bc72f..61b2027b56a 100644 --- a/dhis2_android_maps/src/main/res/values/strings.xml +++ b/dhis2_android_maps/src/main/res/values/strings.xml @@ -13,7 +13,6 @@ Azure Aerial Azure Aerial Labels Apply - Show satellite view Show events Show tei coordinates Show heatmap layer diff --git a/dhis_android_analytics/src/main/res/values-ar-rIQ/strings.xml b/dhis_android_analytics/src/main/res/values-ar-rIQ/strings.xml index 38de9dcfe4a..39f8914a67b 100644 --- a/dhis_android_analytics/src/main/res/values-ar-rIQ/strings.xml +++ b/dhis_android_analytics/src/main/res/values-ar-rIQ/strings.xml @@ -2,7 +2,6 @@ عرض كجدول قبول - لا شيء يومي اليوم الأمس diff --git a/dhis_android_analytics/src/main/res/values-ar/strings.xml b/dhis_android_analytics/src/main/res/values-ar/strings.xml index bd90b0a6276..72fc5ea5af7 100644 --- a/dhis_android_analytics/src/main/res/values-ar/strings.xml +++ b/dhis_android_analytics/src/main/res/values-ar/strings.xml @@ -6,7 +6,6 @@ عرض كقيمة قبول الفترة الزمنية - لا شيء يومي اليوم أخرى @@ -42,7 +41,6 @@ سيعرض الفترة الحالية في الرسم البياني. لا تُرجع عوامل التصفية التي قمت بتطبيقها أية بيانات ليس لديك أي بيانات ليتم عرضها - هناك خطأ ما في هذا التصور هناك خطأ ما في التصورات كل البيانات صفر لم يتم تكوين هذا العرض البياني بشكل جيد ، يرجى الاتصال بالمسؤول. diff --git a/dhis_android_analytics/src/main/res/values-ckb/strings.xml b/dhis_android_analytics/src/main/res/values-ckb/strings.xml index 5f9661cf0a1..c4d7dcac0d1 100644 --- a/dhis_android_analytics/src/main/res/values-ckb/strings.xml +++ b/dhis_android_analytics/src/main/res/values-ckb/strings.xml @@ -2,7 +2,6 @@ پەسندکردن ماوة - هیچیان ئەمڕۆ ئەم ساڵە \ No newline at end of file diff --git a/dhis_android_analytics/src/main/res/values-cs/strings.xml b/dhis_android_analytics/src/main/res/values-cs/strings.xml index f754a77c112..d7efadff225 100644 --- a/dhis_android_analytics/src/main/res/values-cs/strings.xml +++ b/dhis_android_analytics/src/main/res/values-cs/strings.xml @@ -9,7 +9,6 @@ Přijmout Období Org. Jednotka - Žádný Denně Dnes jiný @@ -45,7 +44,6 @@ V grafu se zobrazí aktuální období. Použité filtry nevracejí žádná data K zobrazení nemáte žádná data - S touto vizualizací není něco v pořádku S vizualizacemi není něco v pořádku Něco není v pořádku se skupinami vizualizace Všechny údaje jsou nulové @@ -61,7 +59,6 @@ Nemáte přístup k indikátoru programu %s Chybí vizualizace %s Tato vizualizace není dobře nakonfigurována, kontaktujte svého administrátora. - Vlastní hranice nejsou podporovány pro programový indikátor %s Nelze získat přístup k databázi. Kontaktujte prosím svého správce. Nemáte přístup k programu %s Nemáte přístup k atributu %s diff --git a/dhis_android_analytics/src/main/res/values-da/strings.xml b/dhis_android_analytics/src/main/res/values-da/strings.xml index fcbe723511f..d6b540aa4d9 100644 --- a/dhis_android_analytics/src/main/res/values-da/strings.xml +++ b/dhis_android_analytics/src/main/res/values-da/strings.xml @@ -1,6 +1,5 @@ - None Daily Other Weekly diff --git a/dhis_android_analytics/src/main/res/values-es-rES/strings.xml b/dhis_android_analytics/src/main/res/values-es-rES/strings.xml index cce3fcb86fc..c81848ec9f1 100644 --- a/dhis_android_analytics/src/main/res/values-es-rES/strings.xml +++ b/dhis_android_analytics/src/main/res/values-es-rES/strings.xml @@ -9,7 +9,6 @@ Aceptar Periodo Unid.Org. - Ninguno Diario Hoy Otro @@ -45,7 +44,6 @@ Se mostrará el periodo actual en el gráfico. Los filtros que has aplicado no devolvieron datos No tienes datos para mostrar - Hay algo erróneo en esta visualización Hay algo erróneo con las visualizaciones Hay algo erróneo con los grupos de visualizaciones Todos los datos tienen valor cero @@ -61,7 +59,6 @@ No tiene acceso indicador del programa %s La visualización %s no se encuentra disponible Esta visualización no se encuentra bien configurada, por favor contacte a su administrador. - Los límites personalizados de indicadores de programa no son compatibles con los graficos de Android%s No se puede acceder a la base de datos. Por favor, contacta con tu administrador. No tiene permiso para acceder al programa %s No tiene permiso para acceder al atributo %s diff --git a/dhis_android_analytics/src/main/res/values-es/strings.xml b/dhis_android_analytics/src/main/res/values-es/strings.xml index 14e40b82ccb..a2f88ea0299 100644 --- a/dhis_android_analytics/src/main/res/values-es/strings.xml +++ b/dhis_android_analytics/src/main/res/values-es/strings.xml @@ -9,7 +9,6 @@ Aceptar Periodo Unid.Org. - Ninguno Diario Hoy Otro @@ -45,7 +44,6 @@ Se mostrará el periodo actual en el gráfico. Los filtros que has aplicado no devolvieron datos No tienes datos para mostrar - Hay algo erróneo en esta visualización Hay algo erróneo con las visualizaciones Hay algo erróneo con los grupos de visualizaciones Todos los datos tienen valor cero @@ -61,7 +59,6 @@ No tiene acceso indicador del programa %s La visualización %s no se encuentra disponible Esta visualización no se encuentra bien configurada, por favor contacte a su administrador. - Los límites personalizados de indicadores de programa no son compatibles con los graficos de Android%s No se puede acceder a la base de datos. Por favor, contacta con tu administrador. No tiene permiso para acceder al programa %s No tiene permiso para acceder al atributo %s diff --git a/dhis_android_analytics/src/main/res/values-fr/strings.xml b/dhis_android_analytics/src/main/res/values-fr/strings.xml index de182c6df8d..adca246f900 100644 --- a/dhis_android_analytics/src/main/res/values-fr/strings.xml +++ b/dhis_android_analytics/src/main/res/values-fr/strings.xml @@ -6,7 +6,6 @@ Afficher comme valeur Accepter Période - Aucun Quotidien Aujourd\'hui Autre diff --git a/dhis_android_analytics/src/main/res/values-hi-rIN/strings.xml b/dhis_android_analytics/src/main/res/values-hi-rIN/strings.xml index a4e3d321508..38f6eba739a 100644 --- a/dhis_android_analytics/src/main/res/values-hi-rIN/strings.xml +++ b/dhis_android_analytics/src/main/res/values-hi-rIN/strings.xml @@ -1,7 +1,6 @@ स्वीकार करें - कोई नहीं रोज़ाना आज कल (बिता हुआ) diff --git a/dhis_android_analytics/src/main/res/values-id/strings.xml b/dhis_android_analytics/src/main/res/values-id/strings.xml index fc1cb7776d6..adb45322a85 100644 --- a/dhis_android_analytics/src/main/res/values-id/strings.xml +++ b/dhis_android_analytics/src/main/res/values-id/strings.xml @@ -6,7 +6,6 @@ Lihat sebagai Nilai Terima Periode - Tidak ada Harian Hari ini Lainnya diff --git a/dhis_android_analytics/src/main/res/values-km/strings.xml b/dhis_android_analytics/src/main/res/values-km/strings.xml index 940b38c9527..10115835d63 100644 --- a/dhis_android_analytics/src/main/res/values-km/strings.xml +++ b/dhis_android_analytics/src/main/res/values-km/strings.xml @@ -3,7 +3,6 @@ បង្ហាញតារាង ទទួលយក កំឡុងពេល - គ្មាន រាល់​ថ្ងៃ ថ្ងៃនេះ ផ្សេង diff --git a/dhis_android_analytics/src/main/res/values-lo/strings.xml b/dhis_android_analytics/src/main/res/values-lo/strings.xml index a673b780a1d..e8058a2aea4 100644 --- a/dhis_android_analytics/src/main/res/values-lo/strings.xml +++ b/dhis_android_analytics/src/main/res/values-lo/strings.xml @@ -8,7 +8,6 @@ ຍອມຮັບ ຊ່ວງເວລາ ຫົວໜ່ວຍອົງກອນ - ບໍ່ມີ ທຸກໆມື້ ມື້ນີ້ ອື່ນໆ @@ -44,7 +43,6 @@ ມັນຈະສະແດງຊ່ວງເວລາປະຈຸບັນໃນແຜນວາດ ຕົວກອງທີ່ທ່ານໃຊ້ບໍ່ໄດ້ສົ່ງຂໍ້ມູນຄືນໃດໆ ທ່ານບໍ່ມີຂໍ້ມູນໃດໆທີ່ຈະສະແດງ - ມີບາງຢ່າງຜິດພາດກັບການສະແດງພາບນີ້ ມີບາງຢ່າງຜິດພາດກັບການເບິ່ງເຫັນ ມີບາງຢ່າງຜິດພາດກັບກຸ່ມການເບິ່ງເຫັນ ຂໍ້ມູນທັງໝົດເປັນສູນ @@ -60,7 +58,6 @@ ທ່ານບໍ່ໄດ້ຮັບອານຸຍາດເຂົ້າເຖິງສາຍງານຕົວຊີ້ວັດ%s ການສະແດງພາບ%sຂາດຫາຍໄປ ການສະແດງພາບນີ້ບໍ່ໄດ້ຖືກຕັ້ງຄ່າໄດ້ດີ, ກະລຸນາຕິດຕໍ່ຜູ້ດູແລຂອງທ່ານ. - ບໍ່ຮອງຮັບຂອບເຂດກຳນົດເອງສຳລັບຕົວຊີ້ວັດຂອງສາຍງານ%s ບໍ່ສາມາດເຂົ້າເຖິງຖານຂໍ້ມູນໄດ້. ກະລຸນາຕິດຕໍ່ຜູ້ດູແລລະບົບ ທ່ານບໍ່ໄດ້ຮັບອານຸຍາດເຂົ້າເຖີງໂປຣແກຣມ %s ປະເພດການສັງລວມບໍ່ໄດ້ສະໜັບສະໜູນ %s diff --git a/dhis_android_analytics/src/main/res/values-my/strings.xml b/dhis_android_analytics/src/main/res/values-my/strings.xml index cd195ba6d3a..19c9c50e83e 100644 --- a/dhis_android_analytics/src/main/res/values-my/strings.xml +++ b/dhis_android_analytics/src/main/res/values-my/strings.xml @@ -1,7 +1,6 @@ အချိန်ကာလ - တစ်ခုမှမဟုတ် နေ့စဉ် အခြား အပတ်စဉ် diff --git a/dhis_android_analytics/src/main/res/values-nb/strings.xml b/dhis_android_analytics/src/main/res/values-nb/strings.xml index 134f679d4fc..dcd0cec2954 100644 --- a/dhis_android_analytics/src/main/res/values-nb/strings.xml +++ b/dhis_android_analytics/src/main/res/values-nb/strings.xml @@ -3,7 +3,6 @@ Vis som tabell Aksepter Periode - Ingen Daglig I dag Annet diff --git a/dhis_android_analytics/src/main/res/values-nl/strings.xml b/dhis_android_analytics/src/main/res/values-nl/strings.xml index 312d06a887b..e49e2d5310d 100644 --- a/dhis_android_analytics/src/main/res/values-nl/strings.xml +++ b/dhis_android_analytics/src/main/res/values-nl/strings.xml @@ -9,7 +9,6 @@ Aanvaarden Periode Organisatie-eenheid - Geen Dagelijks Vandaag Anders @@ -45,7 +44,6 @@ Het zal de huidige periode in de grafiek weergeven. De filters die u hebt toegepast, retourneren geen gegevens U hoeft geen gegevens weer te geven - Er is iets mis met deze visualisatie Er is iets mis met de visualisaties Er is iets mis met de visualisatiegroepen Alle gegevens zijn nul @@ -61,7 +59,6 @@ U heeft geen toegang tot programma-indicator %s De visualisatie %s ontbreekt Deze visualisatie is niet goed geconfigureerd, neem contact op met uw beheerder. - Aangepaste grenzen worden niet ondersteund voor programma-indicator %s Geen toegang tot database. Neem contact op met uw beheerder. U heeft geen toegang tot het programma %s U heeft geen toegang tot attribuut %s diff --git a/dhis_android_analytics/src/main/res/values-prs/strings.xml b/dhis_android_analytics/src/main/res/values-prs/strings.xml index 3362235275c..50fe14b4ab6 100644 --- a/dhis_android_analytics/src/main/res/values-prs/strings.xml +++ b/dhis_android_analytics/src/main/res/values-prs/strings.xml @@ -2,7 +2,6 @@ پذیرش دوره - هیچ‌کدام روزنه امروز دیگر diff --git a/dhis_android_analytics/src/main/res/values-ps/strings.xml b/dhis_android_analytics/src/main/res/values-ps/strings.xml index 4f1e5a6e269..8f32ebbc4a3 100644 --- a/dhis_android_analytics/src/main/res/values-ps/strings.xml +++ b/dhis_android_analytics/src/main/res/values-ps/strings.xml @@ -2,7 +2,6 @@ د منلو وړ معیاد - هېڅ یو ورځني [ د مودې ډول ] نن ورځ نور diff --git a/dhis_android_analytics/src/main/res/values-pt-rBR/strings.xml b/dhis_android_analytics/src/main/res/values-pt-rBR/strings.xml index 135b459054b..83c0c64c566 100644 --- a/dhis_android_analytics/src/main/res/values-pt-rBR/strings.xml +++ b/dhis_android_analytics/src/main/res/values-pt-rBR/strings.xml @@ -1,7 +1,6 @@ Período - Nenhum Diário Hoje Outro diff --git a/dhis_android_analytics/src/main/res/values-pt/strings.xml b/dhis_android_analytics/src/main/res/values-pt/strings.xml index 4382d0c612a..7fee702c6aa 100644 --- a/dhis_android_analytics/src/main/res/values-pt/strings.xml +++ b/dhis_android_analytics/src/main/res/values-pt/strings.xml @@ -9,7 +9,6 @@ Aceitar Período UnidOrg - Nenhum Diário Hoje Outro @@ -45,7 +44,6 @@ Inclui o período actual no gráfico Não tem dados associados aos filtros aplicados Não existem dados para mostrar - Algo de errado existe com esta visualização Algo de errado existe com estas visualizações Algo de errado existe com a visualização dos grupos Todos os dados são zero @@ -61,7 +59,6 @@ Não tem acesso ao indicador de programa %s A visualização %s está em falta A visualização não está bem configurada, contacte o seu admin - Limites personalizados não são suportados para o indicador de programa %s Não consegue aceder a base de dados. Favor contactar o seu administrador. Não tem acesso ao programa%s Não tem acesso ao atributo %s diff --git a/dhis_android_analytics/src/main/res/values-ru/strings.xml b/dhis_android_analytics/src/main/res/values-ru/strings.xml index 23fc52b1c80..b0ed579152a 100644 --- a/dhis_android_analytics/src/main/res/values-ru/strings.xml +++ b/dhis_android_analytics/src/main/res/values-ru/strings.xml @@ -9,7 +9,6 @@ Принять Период Орг.подразделение - Не известное значение Ежедневно Сегодня Другое @@ -45,7 +44,6 @@ Это отобразит на графике текущий период. Примененные Вами фильтры не соотносятся ни с какими данными У Вас нет данных для отображения - Что-то не так с этой визуализацией Что-то не так с визуализациями Что-то не так с группами визуализаций Все данные равны нулю diff --git a/dhis_android_analytics/src/main/res/values-sv/strings.xml b/dhis_android_analytics/src/main/res/values-sv/strings.xml index 5803cee0e7b..ae5b810081e 100644 --- a/dhis_android_analytics/src/main/res/values-sv/strings.xml +++ b/dhis_android_analytics/src/main/res/values-sv/strings.xml @@ -2,7 +2,6 @@ Acceptera Period - Ingen Dagligen Övrig Varje vecka diff --git a/dhis_android_analytics/src/main/res/values-tet/strings.xml b/dhis_android_analytics/src/main/res/values-tet/strings.xml index 634b6efb59f..41d0afc3288 100644 --- a/dhis_android_analytics/src/main/res/values-tet/strings.xml +++ b/dhis_android_analytics/src/main/res/values-tet/strings.xml @@ -1,7 +1,6 @@ Períodu - Nein ida Diáriu Seluk Semanal diff --git a/dhis_android_analytics/src/main/res/values-tg/strings.xml b/dhis_android_analytics/src/main/res/values-tg/strings.xml index abe7678f943..7c80bd5ad07 100644 --- a/dhis_android_analytics/src/main/res/values-tg/strings.xml +++ b/dhis_android_analytics/src/main/res/values-tg/strings.xml @@ -1,7 +1,6 @@ Давра - Ягонто Ҳаррӯза Имрӯз Дигар diff --git a/dhis_android_analytics/src/main/res/values-uk/strings.xml b/dhis_android_analytics/src/main/res/values-uk/strings.xml index 851d722453c..0eebc1b8847 100644 --- a/dhis_android_analytics/src/main/res/values-uk/strings.xml +++ b/dhis_android_analytics/src/main/res/values-uk/strings.xml @@ -9,7 +9,6 @@ Прийняти Період Організаційний підрозділ - Жодного Щодня Сьогодні Інше @@ -45,7 +44,6 @@ Це відобразить поточний період на діаграмі. Фільтри, які Ви застосували, не відповідають жодним даним У Вас немає даних для відображення - Помилка із цією візуалізацією Помилка із цими візуалізаціями Помилка із групою візуалізацій Усі значення нульові @@ -61,7 +59,6 @@ Ви не маєте доступу до програмного індикатора %s Візуалізація %s відсутня Цю візуалізацію налаштовано неправильно. Зверніться до адміністратора. - Спеціальні межі не підтримуються для програмного індикатора %s Неможливо отримати доступ до бази даних. Будь ласка, зверніться до свого адміністратора. Ви не маєте доступу до програми %s Ви не маєте доступу до атрибуту %s diff --git a/dhis_android_analytics/src/main/res/values-ur/strings.xml b/dhis_android_analytics/src/main/res/values-ur/strings.xml index 88d2be1923e..2fa15acbda4 100644 --- a/dhis_android_analytics/src/main/res/values-ur/strings.xml +++ b/dhis_android_analytics/src/main/res/values-ur/strings.xml @@ -1,7 +1,6 @@ مدت - کوئی نہں روزانہ آج دیگر diff --git a/dhis_android_analytics/src/main/res/values-uz-rUZ/strings.xml b/dhis_android_analytics/src/main/res/values-uz-rUZ/strings.xml index 8250abcea48..5a5959ce2e9 100644 --- a/dhis_android_analytics/src/main/res/values-uz-rUZ/strings.xml +++ b/dhis_android_analytics/src/main/res/values-uz-rUZ/strings.xml @@ -3,7 +3,6 @@ Jadval sifatida koʼrish Qabul qiling davr - Йўқ Кунлик бугун Boshqa diff --git a/dhis_android_analytics/src/main/res/values-uz/strings.xml b/dhis_android_analytics/src/main/res/values-uz/strings.xml index 3d6cf787646..0e64911eea9 100644 --- a/dhis_android_analytics/src/main/res/values-uz/strings.xml +++ b/dhis_android_analytics/src/main/res/values-uz/strings.xml @@ -9,7 +9,6 @@ Қабул қилинг Давр Ташкилий бирлик - Йўқ Кунлик Бугун Бошқа diff --git a/dhis_android_analytics/src/main/res/values-vi/strings.xml b/dhis_android_analytics/src/main/res/values-vi/strings.xml index c752921c92e..ee65b96dcfe 100644 --- a/dhis_android_analytics/src/main/res/values-vi/strings.xml +++ b/dhis_android_analytics/src/main/res/values-vi/strings.xml @@ -9,7 +9,6 @@ Chấp nhận Thời điểm Đơn vị - Không Hàng ngày Hôm nay Khác @@ -45,7 +44,6 @@ Nó sẽ hiển thị thời điểm hiện tại trong biểu đồ Các yếu tố lọc bạn đã chọn không trả về kết quả nào Bạn không có dữ liệu nào để hiển thị - Có gì đó không đúng với biểu đồ này Có gì đó không đúng với các biểu đồ này Có gì đó không đúng với các nhóm biểu đồ này Tất cả dữ liệu là 0 @@ -61,7 +59,6 @@ Bạn không được truy cập Chỉ Số Chương Trình %s Biểu đồ %s không hiển thị Biểu đồ này cấu hình chưa đúng, xin vui lòng liên hệ quản lý của bạn - Phạm vi tự chọn không được hỗ trợ cho Chỉ Số Chương Trình %s Không thể truy cập cơ sở dữ liệu. Xin vui lòng liên hệ quản lý của bạn. Bạn không có quyền truy cập đến chương trình %s Bạn không có quyền truy cập đến thuộc tính %s diff --git a/dhis_android_analytics/src/main/res/values-zh-rCN/strings.xml b/dhis_android_analytics/src/main/res/values-zh-rCN/strings.xml index 028507b98d7..e761cd68890 100644 --- a/dhis_android_analytics/src/main/res/values-zh-rCN/strings.xml +++ b/dhis_android_analytics/src/main/res/values-zh-rCN/strings.xml @@ -8,7 +8,6 @@ 以饼图形式查看 接受 周期 - 每日 今天 其它 diff --git a/dhis_android_analytics/src/main/res/values-zh/strings.xml b/dhis_android_analytics/src/main/res/values-zh/strings.xml index 73507351b45..c502c6760e0 100644 --- a/dhis_android_analytics/src/main/res/values-zh/strings.xml +++ b/dhis_android_analytics/src/main/res/values-zh/strings.xml @@ -9,7 +9,6 @@ 接受 期间 组织单位 - 没有 每日 今天 其它 @@ -45,7 +44,6 @@ 它将在图表中显示当前周期。 您应用的过滤器不返回任何数据 您没有任何要显示的数据 - 此可视化有问题 可视化有问题 可视化组有问题 所有数据为零 @@ -61,7 +59,6 @@ 您无权访问项目指标 %s 缺少可视化 %s 此可视化未正确配置,请联系您的管理员。 - 项目指标 %s 不支持自定义边界 无法访问数据库。请联系您的管理员。 您无权访问项目%s 您无权访问属性 %s diff --git a/dhis_android_analytics/src/main/res/values/strings.xml b/dhis_android_analytics/src/main/res/values/strings.xml index e002a7f92ce..ffc1de03d32 100644 --- a/dhis_android_analytics/src/main/res/values/strings.xml +++ b/dhis_android_analytics/src/main/res/values/strings.xml @@ -9,7 +9,6 @@ Accept Period OrgUnit - None Daily Today Other @@ -45,7 +44,6 @@ It will display the current period in the chart. The filters you applied do not return any data You do not have any data to be displayed - Something is wrong with this visualization Something is wrong with the visualizations Something is wrong with the visualization groups All data is zero @@ -61,7 +59,6 @@ You don\'t have access to program indicator %s The visualization %s is missing This visualization is not well configured, please contact your admin. - Custom boundaries are not supported for program indicator %s Can\'t access database. Please contact your administrator. You do not have access to program %s You do not have access to attribute %s diff --git a/form/src/main/res/values-ar-rIQ/strings.xml b/form/src/main/res/values-ar-rIQ/strings.xml index 9b49034757a..db4300cab91 100644 --- a/form/src/main/res/values-ar-rIQ/strings.xml +++ b/form/src/main/res/values-ar-rIQ/strings.xml @@ -1,13 +1,8 @@ خطأ - التاريخ - السنوات - الأشهر - ‏‏الأيام تاريخ الاستحقاق مكتمل - حفظ على اية حال مشاركة إغلاق تاريخ الواقعة diff --git a/form/src/main/res/values-ar/strings.xml b/form/src/main/res/values-ar/strings.xml index 5c99fd3f827..dd1d0d90a8d 100644 --- a/form/src/main/res/values-ar/strings.xml +++ b/form/src/main/res/values-ar/strings.xml @@ -10,16 +10,9 @@ لديك بعض الرسائل التحذيرية. لديك بعض رسائل التحذير.\n هل تريد وضع علامة على هذا النموذج كمكتمل؟ مطلوب - التاريخ - السنوات - الأشهر - ‏‏الأيام - لا يمكن تحليل %s كتاريخ مضلع خط العرض خط الطول - قيم الإحداثيات غير صالحة - تم التقاط المضلع أدخل قيمة أدخل رابط url أدخل بريداً إلكترونياً @@ -34,9 +27,6 @@ أدخل نصًا طويلاً أدخل نصًا تاريخ الاستحقاق - حقل الزامي - خط العرض: - خط الطول: لم يتم حفظه المراجعة مكتمل @@ -46,20 +36,14 @@ بعض الحقول بها أخطاء ولم يتم حفظها. \n هل تريد مراجعة النموذج؟ تحتاج بعض الحقول إلى إطلاعك.\n هل تريد مراجعة النموذج؟ ليس الان - حفظ على اية حال استمر في التعديل هل تريد وضع علامة على هذا النموذج كمكتمل؟ إذا قمت بالخروج الآن ، فسيتم تجاهل جميع المعلومات الموجودة في النموذج. بعض الحقول بها أخطاء ولم يتم حفظها. \n إذا قمت بالخروج الآن ، فسيتم تجاهل التغييرات. - بعض الحقول بها أخطاء ولم يتم حفظها. - بعض الحقول الإلزامية غير مدخله ولا يمكن حفظ النموذج. - بعض الحقول الإلزامية مفقودة ولا يمكن حفظ النموذج. \n إذا قمت بالخروج الآن ، فسيتم تجاهل التغييرات. مشاركة تم رفض إذن الكاميرا.\n تحتاج إلى تمكينها لاستخدام هذه الميزة. إغلاق - تحذير قواعد البرنامج تم النسخ - لا توجد معلومات عن هذا الحقل التقط صورة تحقق من هذا! لا تظهر مرة أخرى @@ -70,7 +54,6 @@ تاريخ الحدوث تنزيل المسح الضوئي - رمز الاستجابة السريعة إضافة موقع الوحدة التنظيمية الإحداثيات diff --git a/form/src/main/res/values-bn/strings.xml b/form/src/main/res/values-bn/strings.xml index cf7928a2412..4d5737571b2 100644 --- a/form/src/main/res/values-bn/strings.xml +++ b/form/src/main/res/values-bn/strings.xml @@ -1,6 +1,5 @@ ভুল - তারিখ নির্ধারিত তারিখ \ No newline at end of file diff --git a/form/src/main/res/values-ckb/strings.xml b/form/src/main/res/values-ckb/strings.xml index a3b258aaab8..c6769fb51fd 100644 --- a/form/src/main/res/values-ckb/strings.xml +++ b/form/src/main/res/values-ckb/strings.xml @@ -2,12 +2,7 @@ هەڵە ثيويست - بەروار - ساڵەکان - مانگەکان - رۆژەکان تەواوبکە - بەهەرحاڵ تۆماری بکە داخستن هیچ نرخێکی دیکەی تەرخانکراو نەما. پەیوەندی بە بەڕێوەبەری سیستەمەکەتەوە بکە \ No newline at end of file diff --git a/form/src/main/res/values-cs/strings.xml b/form/src/main/res/values-cs/strings.xml index b05b937aa3e..d6f580ce04d 100644 --- a/form/src/main/res/values-cs/strings.xml +++ b/form/src/main/res/values-cs/strings.xml @@ -12,16 +12,9 @@ Máte několik varovných hlášení. Máte nějaké varovné zprávy.\nChcete tento formulář označit jako dokončený? Vyžadováno - datum - Let - Měsíce - Dnů - %s nelze analyzovat jako datum Polygon Zeměpisná šířka Zeměpisná délka - Hodnoty souřadnic nejsou platné - Polygon zaznamenán Zadejte hodnotu Zadejte url Zadejte e-mail @@ -36,9 +29,6 @@ Zadejte dlouhý text Zadejte text Datum vypršení - Povinné pole - Šířka: - Délka: Neuloženo Posouzení Dokončit @@ -48,21 +38,15 @@ Některá pole obsahují chyby a neuloží se. \nChcete zkontrolovat formulář? Některá pole vyžadují vaši pozornost.\nChcete formulář zkontrolovat? Teď ne - Přesto uložit Pokračovat v úpravách Chcete tento formulář označit jako vyplněný? Pokud nyní odejdete, všechny informace ve formuláři budou zahozeny. Některá pole obsahují chyby a neuloží se. \nPokud nyní skončíte, změny budou zahozeny. - Některá pole obsahují chyby a neuloží se. - Některá povinná pole chybí a formulář nelze uložit. - Některá povinná pole chybí a formulář nelze uložit. \nPokud nyní skončíte, změny budou zahozeny. Sdílet Povolení fotoaparátu bylo odepřeno.\nPro použití této funkce je nutné ji povolit. Zavřít - Upozornění na pravidla programu Došlo k problému s konfigurací, který způsobuje smyčku v pravidlech. Kontaktujte svého správce. Zkopírováno - Žádné informace pro toto pole Vyfotit Z galerie Zkontrolovat to! @@ -72,13 +56,10 @@ Souřadnice pro Neexistují žádné další rezervované hodnoty. Obraťte se na správce systému Datum incidentu - Pro zachycení souřadnic je potřeba oprávnění k poloze. Povolte je prosím v nastavení aplikace Otevřít s Nenalezena žádná možnost Stáhnout Skenování - QR kód - Čárový kód Přidat umístění Tento formulář nemá nakonfigurovaná žádná pole Podrobnosti %s diff --git a/form/src/main/res/values-da/strings.xml b/form/src/main/res/values-da/strings.xml index 7945b4308bb..dfc69377b92 100644 --- a/form/src/main/res/values-da/strings.xml +++ b/form/src/main/res/values-da/strings.xml @@ -1,7 +1,6 @@ Error - Date Due date Close Incident date diff --git a/form/src/main/res/values-en-rUS/strings.xml b/form/src/main/res/values-en-rUS/strings.xml index 195e9fea377..0837bb97812 100644 --- a/form/src/main/res/values-en-rUS/strings.xml +++ b/form/src/main/res/values-en-rUS/strings.xml @@ -11,16 +11,9 @@ This field is mandatory You have some warning messages. Required - Date - Years - Months - Days - %s can\'t be parsed as a date Polygon Latitude Longitude - Coordinates values are not valid - Polygon captured Enter value Enter url Enter email @@ -35,27 +28,19 @@ Enter long text Enter text Due date - Mandatory field - Lat: - Long: Not saved Review Complete Discard changes Saved! Not now - Save anyway Keep editing Do you want to mark this form as complete\? If you exit now all the information in the form will be discarded. - Some fields have errors and they are not saved. - Some mandatory fields are missing and the form cannot be saved. Share Close - Program rules warning There is a configuration issue causing a loop in the rules. Contact you administrator. Copied - No info for this field Take Photo From gallery Check this! @@ -65,13 +50,10 @@ Coordinates for the There are no more reserved values. Contact your system administrator Incident date - The location permission is needed for capturing coordinates. Please, enable them in the application settings Open with No option found Download Scan - QR code - Bar code Add location This form has no fields configured %s details diff --git a/form/src/main/res/values-es-rES/strings.xml b/form/src/main/res/values-es-rES/strings.xml index 461f560c077..ac397143b57 100644 --- a/form/src/main/res/values-es-rES/strings.xml +++ b/form/src/main/res/values-es-rES/strings.xml @@ -10,16 +10,9 @@ El valor del campo %s no pertenece al conjunto de opciones en %s El campo es obligatorio Tienes algunos mensajes de alerta.\n¿Desea marcar el formulario como Completo? - Fecha - Años - Meses - Días - %s no es una fecha válida Polígono Latitud Longitud - El valor de las coordenadas no es válido - Polígono guardado Introduzca valor Introduzca url Introduzca email @@ -34,9 +27,6 @@ Introducir texto largo Introducir texto Fecha de vencimiento - Campo obligatorio - Lat: - Long: No guardado Revisar Completar @@ -46,21 +36,15 @@ Algunos campos tienen errores y no serán guardados. \n¿Desea revisar el formulario? Algunos campos necesitan su atención.\n¿Desea revisar el formulario? Ahora no - Guardar de todos modos Seguir editando ¿Desea marcar este formulario como completo? Si sale toda la información del formulario será descartada. Algunos campos tienen errores y no serán guardados. \nSi sale, los cambios serán descartados. - Algunos campos tienen errores y no serán guardados. - Algunos campos obligatorios faltan llenarse, el formulario no puede ser guardado - Algunos campos obligatorios faltan llenarse, el formulario no puede guardarse. \nSi sale, los cambios serán descartados. Compartir El permiso de la cámara está denegado.\nDebe habilitarlo para usar esta función. Cerrar - Advertencia de reglas del programa Hay un problema de configuración que provoca un bucle en las reglas. Póngase en contacto con su administrador. Copiado - No hay información para este campo Tomar foto ¡Importante! No volver a mostrar @@ -69,7 +53,6 @@ Coordenadas para No quedan valores reservados. Contacte con el administrador del sistema. Fecha del incidente - Se requiere el permiso de localización para obtener coordenadas. POR FAVOR, habilítelo desde los ajustes del dispositivo. Unidad Organizativa Cat Combo \ No newline at end of file diff --git a/form/src/main/res/values-es/strings.xml b/form/src/main/res/values-es/strings.xml index 2dfdcdb429d..b18ae56fb2f 100644 --- a/form/src/main/res/values-es/strings.xml +++ b/form/src/main/res/values-es/strings.xml @@ -12,16 +12,9 @@ Tienes algunos mensajes de aviso. Tienes algunos mensajes de alerta.\n¿Desea marcar el formulario como Completo? Necesario - Fecha - Años - Meses - Días - %s no es una fecha válida Polígono Latitud Longitud - El valor de las coordenadas no es válido - Polígono guardado Introduzca valor Introduzca url Introduzca email @@ -36,9 +29,6 @@ Introducir texto largo Introducir texto Fecha de vencimiento - Campo obligatorio - Lat: - Long: No guardado Revisar Completar @@ -48,21 +38,15 @@ Algunos campos tienen errores y no serán guardados. \n¿Desea revisar el formulario? Algunos campos necesitan su atención.\n¿Desea revisar el formulario? Ahora no - Guardar de todos modos Seguir editando ¿Desea marcar este formulario como completo? Si sale toda la información del formulario será descartada. Algunos campos tienen errores y no serán guardados. \nSi sale, los cambios serán descartados. - Algunos campos tienen errores y no serán guardados. - Algunos campos obligatorios faltan llenarse, el formulario no puede ser guardado - Algunos campos obligatorios faltan llenarse, el formulario no puede guardarse. \nSi sale, los cambios serán descartados. Compartir El permiso de la cámara está denegado.\nDebe habilitarlo para usar esta función. Cerrar - Advertencia de reglas del programa Hay un problema de configuración que provoca un bucle en las reglas. Póngase en contacto con su administrador. Copiado - No hay información para este campo Tomar foto Desde la galería ¡Importante! @@ -72,13 +56,10 @@ Coordenadas para No quedan valores reservados. Contacte con el administrador del sistema. Fecha del incidente - Se requiere el permiso de localización para obtener coordenadas. Por favor, habilítelo desde los ajustes del dispositivo. Abrir con No se ha encontrado opción Descargar Escanear - Código QR - Código de barras Añadir ubicación Este formulario no tiene campos configurados %s detalles diff --git a/form/src/main/res/values-fr/strings.xml b/form/src/main/res/values-fr/strings.xml index dbfc612a708..ce08a65930a 100644 --- a/form/src/main/res/values-fr/strings.xml +++ b/form/src/main/res/values-fr/strings.xml @@ -12,16 +12,9 @@ Vous avez des messages d\'avertissement. Vous avez des messages d\'avertissement.\nVoulez-vous marquer ce formulaire comme terminé ? Requis - Date - Années - Mois - Jours - %s ne peut pas être analysé comme une date Polygone Latitude Longitude - Les valeurs des coordonnées ne sont pas valides - Le polygône a été défini Entrez une valeur Entrez url Entrez e-mail @@ -36,7 +29,6 @@ Saisir texte long Saisir du texte Date d\'échéance - Champ obligatoire Non enregistré! Vérifier Terminer @@ -46,21 +38,15 @@ Certains champs contiennent des erreurs et ils ne sont pas enregistrés. \ nVoulez-vous revoir le formulaire ? Certains champs nécessitent votre attention. \n Voulez-vous revoir le formulaire ? Pas maintenant - Enregistrer quand même Continuer l’édition Voulez-vous marquer ce formulaire comme complet? Si vous quittez maintenant, toutes les informations du formulaire seront supprimées. Certains champs contiennent des erreurs et ils ne sont pas enregistrés. \ nSi vous quittez maintenant, les modifications seront ignorées. - Certains champs contiennent des erreurs et ils ne sont pas enregistrés. - Certains champs obligatoires manquent et le formulaire ne peut pas être enregistré. - Certains champs obligatoires manquent et le formulaire ne peut pas être enregistré. \ nSi vous quittez maintenant, les modifications seront ignorées Partager L\'autorisation de la caméra est refusée. \nVous devez l\'activer pour utiliser cette fonctionnalité. Fermer - Avertissement relatif aux règles du programme Il y a un problème de configuration provoquant une boucle dans les règles. Contactez votre administrateur. Copié - Pas d\'information pour ce champ Prendre une photo Attention. Vérifiez ceci! Ne pas montrer de nouveau @@ -69,13 +55,10 @@ Coordonnées pour Il n\'y a plus de valeurs réservées. Veuillez contacter votre administrateur système. Date de l´incident - L\'autorisation de localisation est nécessaire pour capturer les coordonnées. Veuillez les activer dans les paramètres de l\'application Ouvrir avec Aucune option trouvée Télécharger Scanner - Code QR - Code-barre Ajouter un lieu Ce formulaire n\'a pas de champs configurés %s détails diff --git a/form/src/main/res/values-hi-rIN/strings.xml b/form/src/main/res/values-hi-rIN/strings.xml index 98d40ab6b26..ffbd43c7d78 100644 --- a/form/src/main/res/values-hi-rIN/strings.xml +++ b/form/src/main/res/values-hi-rIN/strings.xml @@ -9,11 +9,6 @@ आपके पास कुछ चेतावनी संदेश हैं आपके पास कुछ चेतावनी संदेश हैं\nक्या आप इस फ़ॉर्म को कम्प्लीट मार्क करना चाहते हैं\? आवश्यकता है - तारीख - वर्ष - महीने - दिन - %s डेट के रूप में पढ़ा नहीं जा सकता अक्षांश देशांतर मान दर्ज करें @@ -26,15 +21,12 @@ अक्षर दर्ज करें लंबा पाठ दर्ज करें पाठ दर्ज करें - अक्षांश - देशांतर सेव नहीं रिव्यू पूरा हुआ बदलावों को छोड़ना है सेव अभी नहीं - सेव करें संपादन करते रहें साझा करें बंद करें diff --git a/form/src/main/res/values-id/strings.xml b/form/src/main/res/values-id/strings.xml index f823e81bae7..2bdafe0001a 100644 --- a/form/src/main/res/values-id/strings.xml +++ b/form/src/main/res/values-id/strings.xml @@ -7,15 +7,9 @@ Pilih unit organisasi Bidang ini wajib Wajib - Tanggal - Tahun - Bulan - Hari Poligon Garis lintang Garis bujur - Nilai koordinat tidak valid - Poligon ditangkap Masukkan nilai Masukkan URL Masukan email @@ -33,12 +27,10 @@ Lengkap Hapus perubahan Tersimpan! - Simpan bagaimanapun Bagikan Izin kamera ditolak.\nAnda harus mengaktifkannya untuk menggunakan fitur ini. Tutup Tersalin - Tidak ada info untuk bidang ini Ambil gambar Periksa ini! Jangan perlihatkan lagi diff --git a/form/src/main/res/values-km/strings.xml b/form/src/main/res/values-km/strings.xml index 4c7c0e6d5cc..cbd574eee1a 100644 --- a/form/src/main/res/values-km/strings.xml +++ b/form/src/main/res/values-km/strings.xml @@ -3,10 +3,6 @@ កំហុសបច្ចេកទេស ជ្រើសរើសថ្ងៃខែឆ្នាំ ទាមទារ - កាលបរិច្ឆេទ - ឆ្នាំ - ខែ - ថ្ងៃ រយៈទទឹង រយៈបណ្តោយ បញ្ជូលទិន្នន័យជាលេខ (វិជ្ជមាន រឺ លេខ ០) diff --git a/form/src/main/res/values-lo/strings.xml b/form/src/main/res/values-lo/strings.xml index 558a0193e17..63fb1ce0768 100644 --- a/form/src/main/res/values-lo/strings.xml +++ b/form/src/main/res/values-lo/strings.xml @@ -11,16 +11,9 @@ ຊ່ອງປ້ອນຂໍ້ມູນນີ້ແມ່ນຈໍາເປັນຕ້ອງປ້ອນຂໍ້ມູນໃສ່ ທ່ານມີບາງຂໍ້ຄວາມເຕືອນ.\nທ່ານຕ້ອງການໝາຍແບບຟອມນີ້ວ່າສຳເລັດແລ້ວຫຼືບໍ? ຕ້ອງການ - ວັນທີ່ - ປີ - ເດືອນ - ມື້ - %sບໍ່ສາມາດວິເຄາະເປັນວັນທີໄດ້ Polygon ເສັ້ນຂະໜານ ເສັ້ນແວງ - ປະສານງານບໍ່ຖືກຕ້ອງ - ບັນທຶກຮູບຫຼາຍຫຼ່ຽມ ປ້ອນຄ່າ ປ້ອນ url ປ້ອນອີເມລ @@ -35,7 +28,6 @@ ປ້ອນຂໍ້ມູນເປັນຂໍ້ຄວາມຍາວ ຂຽນຄໍາຕອບ ວັນທີຕ້ອງແລ້ວ - ຊ່ອງປ້ອນຂໍ້ມູນທີ່ບັງຄັບ ບໍ່ໄດ້ບັນທຶກ ທົບທວນຄືນ ສຳເລັດແລ້ວ @@ -44,17 +36,14 @@ ທ່ານມີຂໍ້ຜິດພາດໃນບາງຂໍ້ຄວາມ.\nທ່ານຕ້ອງການກວດເບິ່ງຄືນບໍ? ບາງຊ່ອງຂໍ້ມູນຈຳເປັນຕ້ອງດຳເນີນການຂອງທ່ານ.\n ທ່ານຕ້ອງການກວດສອບແບບຟອມຫຼືບໍ? ບໍ່​ແມ່ນ​ຕອນ​ນີ້ - ບັນທຶກ ສຶບຕໍ່ແກ້ໄຂ ທ່ານຕ້ອງການໝາຍແບບຟອມນີ້ວ່າສຳເລັດແລ້ວຫຼືບໍ? ຖ້າທ່ານອອກດຽວນີ້ ຂໍ້ມູນທັງໝົດໃນແບບຟອມຈະຖືກຍົກເລີກ. ເຜີຍແຜ່ ການ​ອະ​ນຸ​ຍາດ​ໃຊ້ກ້ອງ​ຖ່າຍ​ຮູບ​ຖືກ​ປະ​ຕິ​ເສດ. ທ່ານ​​ຕ້ອງ​ເປີດ​ໃຊ້​ງານເພື່ອ​ໃຊ້​ຄຸນ​ສົມ​ບັດ​ນີ້​. ປິດ - ຂໍ້ຄວນລະວັງກົດຂອງສາຍງານ ມີບັນຫາການກຳນົດຄ່າທີ່ເຮັດໃຫ້ເກີດມີຊ່ອງຫວ່າງໃນກົດລະບຽບ. ຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ. ສຳເນົາແລ້ວ - ບໍ່ມີຂໍ້ມູນສຳລັບຫ້ອງຂໍ້ມູນນີ້ ຖ່າຍຮູບ ກວດເບີ່ງອັນນີ້ ບໍ່ຕ້ອງສະແດງອີກ diff --git a/form/src/main/res/values-my/strings.xml b/form/src/main/res/values-my/strings.xml index 6f007af625e..c6b413b6074 100644 --- a/form/src/main/res/values-my/strings.xml +++ b/form/src/main/res/values-my/strings.xml @@ -3,9 +3,6 @@ အမှား ရက်စွဲ ကိုရွေးချယ်ပါ ဖြည့်သွင်းရန်လိုအပ်သည် - ရက်စွဲ - နှစ်များ - လများ Дата выполнения ပြည့်စုံသည်။ ပိတ်သည် diff --git a/form/src/main/res/values-nb/strings.xml b/form/src/main/res/values-nb/strings.xml index b5b0f8fb3cb..240d55b56b9 100644 --- a/form/src/main/res/values-nb/strings.xml +++ b/form/src/main/res/values-nb/strings.xml @@ -7,15 +7,9 @@ Velg organisasjonsenhet Dette feltet er obligatorisk Påkrevd - Dato - År - Måneder - Dager Polygon Breddegrad Lengdegrad - Koordinatverdiene er ikke gyldige - Polygon oppfanget Legg inn verdi Legg inn URL Legg inn e-post @@ -33,12 +27,10 @@ Fullfør Forkast endringer Lagret! - Lagre likevel Fortsett å rediger Del Lukk Kopiert - Ingen info for dette feltet Sjekk dette! Attributter - %s Koordinater for diff --git a/form/src/main/res/values-ne/strings.xml b/form/src/main/res/values-ne/strings.xml index 39f97f62bf6..efe0a1d8ee1 100644 --- a/form/src/main/res/values-ne/strings.xml +++ b/form/src/main/res/values-ne/strings.xml @@ -1,4 +1,3 @@ - मिति \ No newline at end of file diff --git a/form/src/main/res/values-nl/strings.xml b/form/src/main/res/values-nl/strings.xml index 6c05f8d40aa..65fb7caa283 100644 --- a/form/src/main/res/values-nl/strings.xml +++ b/form/src/main/res/values-nl/strings.xml @@ -11,16 +11,9 @@ Dit veld is verplicht U heeft enkele waarschuwingsberichten.\nWilt u dit formulier als voltooid markeren? Vereist - Datum - Jaren - Maanden - Dagen - %s kan niet worden verwerkt als een datum Veelhoek Breedtegraad Lengtegraad - Coördinatenwaarden zijn niet geldig - Polygoon vastgelegd Voer waarde in URL invoeren Voer email in @@ -35,9 +28,6 @@ Voer lange tekst in Tekst invoeren Deadline - Verplicht veld - Breedte: - Lang: Niet opgeslagen Beoordeling Compleet @@ -47,21 +37,15 @@ Sommige velden bevatten fouten en worden niet opgeslagen. \nWilt u het formulier bekijken? Sommige velden hebben uw aandacht nodig.\Wilt u het formulier bekijken? Niet nu - Toch opslaan Blijf bewerken Wilt u dit formulier als voltooid markeren? Als u nu afsluit, wordt alle informatie in het formulier weggegooid. Sommige velden bevatten fouten en worden niet opgeslagen. \Als u nu afsluit, worden de wijzigingen verwijderd. - Sommige velden bevatten fouten en worden niet opgeslagen. - Sommige verplichte velden ontbreken en het formulier kan niet worden opgeslagen. - Sommige verplichte velden ontbreken en het formulier kan niet worden opgeslagen. \Als u nu afsluit, worden de wijzigingen verwijderd. Deel Cameratoestemming is geweigerd.\Je moet deze inschakelen om deze functie te gebruiken. Sluit - Waarschuwing programmaregels Er is een configuratieprobleem dat een lus in de regels veroorzaakt. Neem contact op met uw beheerder. Gekopieerd - Geen info voor dit veld Neem foto Check dit! Niet meer laten zien @@ -70,7 +54,6 @@ Coördinaten voor de Er zijn geen gereserveerde waarden meer. Neem contact op met uw systeembeheerder Incident datum - De locatietoestemming is nodig voor het vastleggen van coördinaten. Schakel ze alstublieft in de applicatie-instellingen in Openen met Geen optie gevonden Downloaden diff --git a/form/src/main/res/values-prs/strings.xml b/form/src/main/res/values-prs/strings.xml index fe9eae69f5d..7a2e0d64a6d 100644 --- a/form/src/main/res/values-prs/strings.xml +++ b/form/src/main/res/values-prs/strings.xml @@ -2,10 +2,6 @@ خطا ضروری - تاریخ - سالانه - ماه ها - روزها چند ضلعی عرض البلد طول البلد diff --git a/form/src/main/res/values-ps/strings.xml b/form/src/main/res/values-ps/strings.xml index 03d9781ed48..f2f7e61f1e9 100644 --- a/form/src/main/res/values-ps/strings.xml +++ b/form/src/main/res/values-ps/strings.xml @@ -2,10 +2,6 @@ تېروته اړین دي - نېټه - کلونه - میاشت - ورځې لېټېټيوډ لانګېټيوډ ټاکلې نېټه diff --git a/form/src/main/res/values-pt-rBR/strings.xml b/form/src/main/res/values-pt-rBR/strings.xml index 022afde4550..2c2d2e33f43 100644 --- a/form/src/main/res/values-pt-rBR/strings.xml +++ b/form/src/main/res/values-pt-rBR/strings.xml @@ -2,14 +2,9 @@ Erro Exigido - Data - Anos - Meses - Dias Poligono Latitude Longitude - Polígono capturado Data de vencimento Completo Partilhar diff --git a/form/src/main/res/values-pt/strings.xml b/form/src/main/res/values-pt/strings.xml index 30151977e7a..141cf521ce2 100644 --- a/form/src/main/res/values-pt/strings.xml +++ b/form/src/main/res/values-pt/strings.xml @@ -12,16 +12,9 @@ Tem algumas mensagens de aviso. Tem algumas mensagens de aviso.\nDeseja marcar este formulário como completo? Obrigatório - Data - Anos - Meses - Dias - %s não pode ser analisado como uma data Poligono Latitude Longitude - Os valores das coordenadas não são válidos - Polígono capturado Digite o valor Digite o URL Digite o email @@ -36,9 +29,6 @@ Inserir texto longo Inserir texto Data de Vencimento - Campo obrigatório - Latitude: - Longitude: Não guardado Revisão Completo @@ -48,21 +38,15 @@ Alguns campos têm erros e não são guardados. \Deseja rever o formulário? Alguns campos requerem a sua atenção.\nDeseja rever o formulário? Não agora - Gravar assim mesmo Continue editando Deseja marcar este formulário como completo? Se sair agora, todas as informações do formulário serão descartadas. Alguns campos têm erros e não são guardados. \Se sair agora, as suas alterações serão descartadas. - Alguns campos apresentam erros e não são guardados. - Alguns campos obrigatórios estão em falta e o formulário não pode ser guardado. - Faltam alguns campos obrigatórios e o formulário não pode ser guardado. \Se sair agora, as alterações serão eliminadas. Partilha A permissão da câmara foi negada. \Necessita de ativá-la para usar este recurso. Fechar - Aviso de regras do programa Existe um problema de configuração que está a provocar um ciclo nas regras. Contacte o seu administrador. Copiado - Nenhuma informação para este campo Tirar fotografia Verifique isso! Não mostrar novamente @@ -71,13 +55,10 @@ Coordenadas para o Não há mais valores reservados. Entre em contato com o administrador do sistema Data do incidente - A permissão de localização é necessária para captar as coordenadas. Por favor, ative-a nas definições do aplicativo Abrir com Nenhuma opção encontrada Descarregar Digitalizar - Código QR - Código de barras Adicionar localização Este formulário não tem campos configurados %s detalhes diff --git a/form/src/main/res/values-ro/strings.xml b/form/src/main/res/values-ro/strings.xml index be206b05e5b..a6299e631c1 100644 --- a/form/src/main/res/values-ro/strings.xml +++ b/form/src/main/res/values-ro/strings.xml @@ -1,11 +1,6 @@ Eroare - Data - Ani - Luni - Zile - Salvare oricum Partajare Închidere Data incidentului diff --git a/form/src/main/res/values-ru/strings.xml b/form/src/main/res/values-ru/strings.xml index 00608fcbf79..97851af3ab0 100644 --- a/form/src/main/res/values-ru/strings.xml +++ b/form/src/main/res/values-ru/strings.xml @@ -11,15 +11,9 @@ У Вас есть несколько предупреждающих сообщений. У Вас есть несколько предупреждений. Хотите ли Вы отметить эту форму как завершенную? Обязательный - Дата - Годы - Месяцы - Дни Полигон Широта Долгота - Значения координат не действительны - Полигон зафиксирован Введите значение Введите url Введите электронную почту @@ -34,7 +28,6 @@ Ввод длинного текста Введите текст Дата выполнения - Обязательное поле Не сохранено Просмотр Завершенный @@ -44,21 +37,15 @@ В некоторых полях есть ошибки, и они не сохраняются. Хотите ли Вы просмотреть форму? Некоторые поля требуют Вашего внимания. Не хотите ли Вы просмотреть форму? Не сейчас - Сохранить в любом случае Продолжить редактировать Хотите ли Вы отметить эту форму как завершенную? Если Вы выйдете сейчас, вся информация в форме будет удалена. Некоторые поля содержат ошибки, и они не сохраняются. Если Вы выйдете сейчас, изменения будут отменены. - Некоторые поля содержат ошибки, и они не сохранены. - Некоторые обязательные поля не заполнены, и форму невозможно сохранить. - Некоторые обязательные поля не заполнены, и форма не может быть сохранена. Если Вы выйдете сейчас, изменения будут отменены. Поделиться Разрешение камеры отклонено. Для использования этой функции необходимо включить ее. Закрыть - Предупреждение о правилах программы Существует проблема конфигурации, вызывающая зацикливание правил. Обратитесь к администратору. Скопировано - Нет информации для этого поля Сделать фото Из галереи Проверьте это! @@ -68,13 +55,10 @@ Координаты для Больше нет зарезервированных значений. Обратитесь к системному администратору Дата происшествия - Для захвата координат необходимо разрешение на определение местоположения. Пожалуйста, включите их в настройках приложения Открыть с помощью Опции не найдены Скачать Сканировать - QR-код - Штрих-код Добавить локацию В этой форме нет настроенных полей %s деталей diff --git a/form/src/main/res/values-si/strings.xml b/form/src/main/res/values-si/strings.xml index 1e933248190..4aaa0fc8c4b 100644 --- a/form/src/main/res/values-si/strings.xml +++ b/form/src/main/res/values-si/strings.xml @@ -1,10 +1,6 @@ දෝෂය - දිනය - අවුරුදු - මාස - දින වෙනස් කිරීම් ඉවතලන්න වසන්න බාගත කරන්න diff --git a/form/src/main/res/values-sv/strings.xml b/form/src/main/res/values-sv/strings.xml index 502e2849be2..55ab9a3b71b 100644 --- a/form/src/main/res/values-sv/strings.xml +++ b/form/src/main/res/values-sv/strings.xml @@ -3,10 +3,6 @@ Fel Välj datum Nödvändig - Datum - År - Månader - Dagar Latitud Longitud Ange ett positivt heltal eller noll. diff --git a/form/src/main/res/values-tet/strings.xml b/form/src/main/res/values-tet/strings.xml index c127ca9ac6f..00e97d80005 100644 --- a/form/src/main/res/values-tet/strings.xml +++ b/form/src/main/res/values-tet/strings.xml @@ -2,9 +2,6 @@ Erru Nesesáriu - Data - Tinan - Fulan Kompletu Partilla Taka diff --git a/form/src/main/res/values-tg/strings.xml b/form/src/main/res/values-tg/strings.xml index d2575c6d443..184beac6486 100644 --- a/form/src/main/res/values-tg/strings.xml +++ b/form/src/main/res/values-tg/strings.xml @@ -2,9 +2,6 @@ Хатогӣ Ҳатмӣ - Сана - Солҳо - Моҳҳо Бисёркунҷа Тӯл Арз diff --git a/form/src/main/res/values-uk/strings.xml b/form/src/main/res/values-uk/strings.xml index aca76ee8ff2..44f017046d6 100644 --- a/form/src/main/res/values-uk/strings.xml +++ b/form/src/main/res/values-uk/strings.xml @@ -11,16 +11,9 @@ Це поле обов\'язкове для заповнення У вас є кілька попереджень. Ви хочете позначити цю форму як завершену? Обов\'язкове поле - Дата - Роки - Місяці - Дні - %s не можна проаналізувати як дату Багатокутник Широта Довгота - Значення координат недійсні - Зафіксовано багатокутник Введіть значення Введіть URL-адресу Введіть адресу електронної пошти @@ -35,9 +28,6 @@ Введіть довгий текст Введіть текст Запланована дата - Обов\'язкове поле - Широта: - Довгота: Не збережено Перегляд Завершити @@ -51,16 +41,11 @@ Ви бажаєте позначити цю форму як завершену? Якщо Ви зараз вийдете, уся інформація у формі буде відхилена. Деякі поля містять помилки і не були збережені. Якщо Ви вийдете зараз, внесені зміни буде скасовано. - Деякі поля містять помилки і не були збережені. - Деякі обов’язкові поля не заповнено, і форму неможливо зберегти. - Деякі обов’язкові поля не заповнено, і форму неможливо зберегти. Якщо Ви вийдете зараз, внесені зміни буде скасовано. Поділитися Відмовлено у використанні камери. Вам потрібно ввімкнути цей дозвіл, щоб використовувати цю функцію. Закрити - Попередження про правила програми Існує проблема конфігурації, яка спричиняє помилку у правилах. Зверніться до адміністратора. Скопійовано - Немає інформації для цього поля Зробити фото Перевірте це! Не показувати знову @@ -70,7 +55,6 @@ Більше немає зарезервованих значень. Зверніться до свого системного адміністратора Дата інциденту Завантажити - QR-код Додати місцезнаходження %s Деталі Організаційний підрозділ diff --git a/form/src/main/res/values-ur/strings.xml b/form/src/main/res/values-ur/strings.xml index 54ef83f7f58..c7967918ff0 100644 --- a/form/src/main/res/values-ur/strings.xml +++ b/form/src/main/res/values-ur/strings.xml @@ -2,10 +2,6 @@ غلطی لازمی - تاریخ - سال - مہینے - دن کثیر زبان طول لمبائی diff --git a/form/src/main/res/values-uz-rUZ/strings.xml b/form/src/main/res/values-uz-rUZ/strings.xml index 9abebe48ea0..e02469217ec 100644 --- a/form/src/main/res/values-uz-rUZ/strings.xml +++ b/form/src/main/res/values-uz-rUZ/strings.xml @@ -7,15 +7,9 @@ Tashkiliy boʼlimni tanlang Maydon toʼldirilishi majburiy Majburiy - Sana - Yillar - Oylar - Kunlar Poligon Kenglik Kenglik - Koordinata qiymatlari yaroqsiz - Koʼpburchak ushlandi Qiymatni tanlang URL ni tanlang ye-pochta manzilini kiriting @@ -34,12 +28,10 @@ Bajarildi Oʼzgartirishlar bekor qilinsin Saqlandi! - Nima boʼlganda ham saqlash Tahrirni davom eting Улашиш Yopmoq Nusxa olindi - Ushbu maydon uchun maʼlumot yoʼq Buni tekshiring! Аtribatlar - %s Uchun koordinatalar diff --git a/form/src/main/res/values-uz/strings.xml b/form/src/main/res/values-uz/strings.xml index f7b581bbffc..e5c26f36c1a 100644 --- a/form/src/main/res/values-uz/strings.xml +++ b/form/src/main/res/values-uz/strings.xml @@ -7,15 +7,9 @@ Ташкилий бўлимни танланг Майдон тўлдирилиши мажбурий Мажбурий - Сана - Йиллар - Ойлар - Кунлар Полигон Кенглик Узунлик - Координата қийматлари яроқсиз - Кўпбурчак ушланди Қийматни танланг URL ни танланг е-почта манзилини киритинг @@ -35,13 +29,11 @@ Ўзгартиришлар бекор қилинсин Сақланди! Hozir emas - Нима бўлганда ҳам сақлаш Таҳрирни давом этинг Улашиш Камерада фойдаланишга рухсат берилмаган. Ушбу функциядан фойдаланиш учун уни ёқишингиз керак. Ёпиш Нусха олинди - Ушбу майдон учун маълумот йўқ Суратга олиш Буни текширинг! Атрибатлар - %s @@ -49,7 +41,6 @@ Сақланган бошқа қийматлар йўқ. Тизим администраторига мурожаат қилинг. Ҳодиса санаси Юклаш - QR код Локация қўшинг Ташкилий бўлим Координаталар diff --git a/form/src/main/res/values-vi/strings.xml b/form/src/main/res/values-vi/strings.xml index 2ec97e83842..026a6a2daa6 100644 --- a/form/src/main/res/values-vi/strings.xml +++ b/form/src/main/res/values-vi/strings.xml @@ -12,16 +12,9 @@ Bạn có một số tin nhắn cảnh báo. Bạn có một số tin nhắn cảnh báo. \n Bạn có muốn đánh dấu biểu nhập này là hoàn tất không? Bắt buộc - Ngày - Năm - Tháng - Ngày - %s không thể chuyển đổi dữ liệu Ngày Bản đồ Vĩ độ Kinh độ - Giá trị tọa độ không đúng - Thêm bản đồ Nhập dữ liệu Nhập đường dẫn liên kết Nhập email @@ -36,9 +29,6 @@ Nhập văn bản dài Nhập văn bản Ngày đến hạn - Trường bắt buộc - Vĩ độ: - Kinh độ: Chưa lưu Xem xét Hoàn tất @@ -48,21 +38,15 @@ Một số trường dữ liệu có lỗi và chưa được lưu. \n Bạn có muốn xem lại biểu nhập không? Một số trường dữ liệu cần bạn chú ý.\n Bạn có muốn xem xét biểu nhập không? Không phải bây giờ - Tiếp tục Lưu Tiếp tục chỉnh sửa Bạn có muốn đánh dấu biểu nhập này là hoàn tất không? Nếu bạn tắt bây giờ, tất cả thông tin trong biểu nhập sẽ bị hủy bỏ. Một số trường dữ liệu có lỗi và chưa được lưu.\n Nếu bạn tắt bây giờ, tất cả thay đổi sẽ bị hủy bỏ. - Một số trường dữ liệu bị lỗi và chưa được lưu - Thiếu một số trường dữ liệu bắt buộc và Không thể lưu biểu nhập. - Thiếu một số trường dữ liệu bắt buộc và không thể lưu biểu nhập. \n Nếu bạn tắt bây giờ, tất cả thay đổi sẽ bị hủy bỏ. Chia sẻ Quyền mở máy ảnh bị từ chối.\n Bạn cần bật tính năng máy ảnh để sử dụng chức năng này Đóng - Cảnh báo quy tắc chương trình Có một vấn đề cấu hình gây ra một vòng lặp trong các quy tắc chương trình. Hãy liên lạc với quản lý của bạn. Đã sao chép - Không có thông tin cho trường dữ liệu này Chụp ảnh Từ thư viện ảnh Kiểm tra cái này! @@ -72,13 +56,10 @@ Tọa độ của Không có giá trị dành riêng nào nữa. Liên hệ với quản lý của bạn Ngày khởi phát - Cần quyền định vị để thu thập vị trí. Xin vui lòng mở chúng trong cài đặt ứng dụng Mở với Không tìm thấy tùy chọn Tải về Quét - Mã QR - Mã vạch Thêm vị trí Biểu này không có trường dữ liệu được cấu hình Chi tiết %s diff --git a/form/src/main/res/values-zh-rCN/strings.xml b/form/src/main/res/values-zh-rCN/strings.xml index 3ee8890a334..cc381f8ce76 100644 --- a/form/src/main/res/values-zh-rCN/strings.xml +++ b/form/src/main/res/values-zh-rCN/strings.xml @@ -12,16 +12,9 @@ 您收到了一些警告信息。 您有一些警告消息。\n您想将此表单标记为完成吗? 必须的 - 日期 - - - - %s 无法解析为日期 多边形 纬度 经度 - 坐标值无效 - 采集的多边形。 输入值 输入url 输入电子邮件 @@ -36,9 +29,6 @@ 输入长文本 输入文本 到期日 - 强制字段 - 纬度: - 经度: 未保存 审查 完成 @@ -48,21 +38,15 @@ 一些字段有错误并且它们没有被保存。 \n您要查看表单吗? 有些字段需要您注意。\n您要复查表单吗? 现在不要 - 仍然保存 继续编辑 您想将此表单标记为已完成吗? 如果您现在退出,表单中的所有信息都将被丢弃。 一些字段有错误并且它们没有被保存。 \n 如果您现在退出,更改将被丢弃。 - 一些字段有错误并且它们没有被保存。 - 缺少一些必填字段,无法保存表单。 - 缺少一些必填字段,无法保存表单。 \n如果您现在退出,更改将被丢弃。 分享 相机权限被拒绝。\n 您需要启用它才能使用此功能。 关闭 - 项目规则警告 存在导致规则循环的配置问题。联系您的管理员。 副本 - 该字段没有相关信息 拍照 来自画廊 检查 @@ -72,13 +56,10 @@ 坐标 没有更多保留值,请联系管理员 事件日期 - 获取坐标需要位置权限。请在应用程序设置中启用它们 打开用 找不到选项 下载 扫描 - 二维码 - 条码 添加位置 该表单没有配置任何字段 %s详细信息 diff --git a/form/src/main/res/values-zh/strings.xml b/form/src/main/res/values-zh/strings.xml index 61ddcca1ef2..0398619d7a9 100644 --- a/form/src/main/res/values-zh/strings.xml +++ b/form/src/main/res/values-zh/strings.xml @@ -12,16 +12,9 @@ 您收到了一些警告信息。 您有一些警告消息。\n您想将此表单标记为完成吗? 必须的 - 日期 - - - - %s 无法解析为日期 多边形 维度 经度 - 坐标值无效 - 采集的多边形。 输入值 输入url 输入电子邮件 @@ -36,9 +29,6 @@ 输入长文本 输入文本 到期日期 - 强制字段 - 纬度: - 经度: 未保存 审查 完成 @@ -48,21 +38,15 @@ 一些字段有错误并且它们没有被保存。 \n您要查看表单吗? 有些字段需要您注意。\n您要复查表单吗? 现在不要 - 仍然保存 继续编辑 您想将此表单标记为已完成吗? 如果您现在退出,表单中的所有信息都将被丢弃。 一些字段有错误并且它们没有被保存。 \n 如果您现在退出,更改将被丢弃。 - 一些字段有错误并且它们没有被保存。 - 缺少一些必填字段,无法保存表单。 - 缺少一些必填字段,无法保存表单。 \n如果您现在退出,更改将被丢弃。 分享 相机权限被拒绝。\n 您需要启用它才能使用此功能。 关闭 - 项目规则警告 存在导致规则循环的配置问题。联系您的管理员。 副本 - 该字段没有相关信息 拍照 来自画廊 检查 @@ -72,13 +56,10 @@ 坐标 没有更多保留值,请联系管理员 事件日期 - 获取坐标需要位置权限。请在应用程序设置中启用它们 打开用 找不到选项 下载 扫描 - 二维码 - 条码 添加位置 该表单没有配置任何字段 %s详细信息 diff --git a/form/src/main/res/values/strings.xml b/form/src/main/res/values/strings.xml index d6a292f9f03..59ef07625dd 100644 --- a/form/src/main/res/values/strings.xml +++ b/form/src/main/res/values/strings.xml @@ -13,16 +13,9 @@ You have some warning messages. You have some warning messages.\nDo you want to mark this form as complete? Required - Date - Years - Months - Days - %s can\'t be parsed as a date Polygon Latitude Longitude - Coordinates values are not valid - Polygon captured Enter value Enter url Enter email @@ -37,9 +30,6 @@ Enter long text Enter text Due date - Mandatory field - Lat: - Long: Not saved Review Complete @@ -49,20 +39,14 @@ Some fields have errors and they are not saved. \nDo you want to review the form? Some fields need your attention.\nDo you want to review the form? Not now - Save anyway Keep editing Do you want to mark this form as complete? If you exit now all the information in the form will be discarded. Some fields have errors and they are not saved. \nIf you exit now the changes will be discarded. - Some fields have errors and they are not saved. - Some mandatory fields are missing and the form cannot be saved. - Some mandatory fields are missing and the form cannot be saved. \nIf you exit now the changes will be discarded. Share Camera permission is denied.\nYou need to enable it to use this feature. Close - Program rules warning Copied - No info for this field Take Photo From gallery Check this! @@ -72,13 +56,10 @@ Coordinates for the There are no more reserved values. Contact your system administrator Incident date - The location permission is needed for capturing coordinates. Please, enable them in the application settings Open with No option found Download Scan - QR code - Bar code Add location This form has no fields configured %s details diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index fa92bd1a7dd..3480978da21 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -557,18 +557,16 @@ - - - - - - - - - - + + + + + + + + + + @@ -577,12 +575,11 @@ - - - - - + + + + + @@ -635,24 +632,20 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + @@ -671,10 +664,9 @@ - - - + + + @@ -711,18 +703,16 @@ - - - - - - - - - - + + + + + + + + + + @@ -778,24 +768,20 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + @@ -957,10 +943,9 @@ - - - + + + @@ -13259,6 +13244,11 @@ + + + + + @@ -13283,6 +13273,14 @@ + + + + + + + + diff --git a/login/src/commonMain/composeResources/values-cs/strings.xml b/login/src/commonMain/composeResources/values-cs/strings.xml index 23259f8bfec..6a229e1332e 100644 --- a/login/src/commonMain/composeResources/values-cs/strings.xml +++ b/login/src/commonMain/composeResources/values-cs/strings.xml @@ -28,7 +28,6 @@ Vypnutí dvoufaktorového ověřování Chcete-li vypnout dvoufaktorové ověřování, otevřete aplikaci Authenticator. Níže zadejte kód z aplikace autentizátoru. - Ověřovací kód Vypnout Vypnutí... Nepodařilo se vypnout dvoufaktorové ověřování. diff --git a/login/src/commonMain/composeResources/values-fr/strings.xml b/login/src/commonMain/composeResources/values-fr/strings.xml index 5472b4ff737..8e390a702d6 100644 --- a/login/src/commonMain/composeResources/values-fr/strings.xml +++ b/login/src/commonMain/composeResources/values-fr/strings.xml @@ -4,7 +4,6 @@ Code d'authentification Suivant L'authentification à deux facteurs est activée. - Code d'authentification Voudriez-vous utiliser l'empreinte digitale ou autre méthode biométrique pour se connecter Nom d'utilisateur Mot de passe diff --git a/login/src/commonMain/composeResources/values-hi-rIN/strings.xml b/login/src/commonMain/composeResources/values-hi-rIN/strings.xml index af04834da4e..4487ecfa858 100644 --- a/login/src/commonMain/composeResources/values-hi-rIN/strings.xml +++ b/login/src/commonMain/composeResources/values-hi-rIN/strings.xml @@ -2,7 +2,6 @@ ऑथेंटिकेशन कोड आगे - ऑथेंटिकेशन कोड यूज़रनेम पासवर्ड लॉग इन हो रहा है… diff --git a/login/src/commonMain/composeResources/values-nl/strings.xml b/login/src/commonMain/composeResources/values-nl/strings.xml index 4e8b53798d0..187813f251b 100644 --- a/login/src/commonMain/composeResources/values-nl/strings.xml +++ b/login/src/commonMain/composeResources/values-nl/strings.xml @@ -4,7 +4,6 @@ Authenticatiecode Volgende Twee-factor-authenticatie staat aan. - Authenticatiecode Gebruikersnaam Wachtwoord Aan het inloggen... diff --git a/login/src/commonMain/composeResources/values-uz/strings.xml b/login/src/commonMain/composeResources/values-uz/strings.xml index 3d8d9ab6f7b..8859dd53bec 100644 --- a/login/src/commonMain/composeResources/values-uz/strings.xml +++ b/login/src/commonMain/composeResources/values-uz/strings.xml @@ -2,7 +2,6 @@ Аутентификация коди Кейинги - Аутентификация коди Фойдаланувчи исми Пароль Кириш... diff --git a/login/src/commonMain/composeResources/values-vi/strings.xml b/login/src/commonMain/composeResources/values-vi/strings.xml index d3175d53cad..433956fecdc 100644 --- a/login/src/commonMain/composeResources/values-vi/strings.xml +++ b/login/src/commonMain/composeResources/values-vi/strings.xml @@ -4,7 +4,6 @@ Mã xác thực Tiếp tục Xác thực hai yếu tố đang được bật. - Mã xác thực Đăng nhập nhanh Bạn có muốn sử dụng dấu vân tay của bạn hoặc phương thức sinh học khác để đăng nhập không? Tên đăng nhập diff --git a/login/src/commonMain/composeResources/values-zh-rCN/strings.xml b/login/src/commonMain/composeResources/values-zh-rCN/strings.xml index 5b78cdec196..0945cbb1170 100644 --- a/login/src/commonMain/composeResources/values-zh-rCN/strings.xml +++ b/login/src/commonMain/composeResources/values-zh-rCN/strings.xml @@ -2,7 +2,6 @@ 验证码 下一个 - 验证码 快速登录 您想使用指纹或其他生物识别方法登录吗? 用户名 diff --git a/login/src/commonMain/composeResources/values-zh/strings.xml b/login/src/commonMain/composeResources/values-zh/strings.xml index b1d62951c8f..c58530c4b84 100644 --- a/login/src/commonMain/composeResources/values-zh/strings.xml +++ b/login/src/commonMain/composeResources/values-zh/strings.xml @@ -27,7 +27,6 @@ 关闭双因素身份验证 要禁用双因素身份验证,请打开身份验证程序。 在下方输入验证程序中的代码。 - 验证码 关闭 关闭... 未关闭双因素身份验证。 diff --git a/login/src/commonMain/composeResources/values/strings.xml b/login/src/commonMain/composeResources/values/strings.xml index a663386ac72..0fde0a09b5a 100644 --- a/login/src/commonMain/composeResources/values/strings.xml +++ b/login/src/commonMain/composeResources/values/strings.xml @@ -28,7 +28,6 @@ Turning off two-factor authentication To disable two-factor authentication open your authenticator app. Enter the code from your authenticator app below. - Authentication code Turn off Turning off... Fail to turn two factor authentication off. diff --git a/stock-usecase/src/main/res/values-ar-rIQ/strings.xml b/stock-usecase/src/main/res/values-ar-rIQ/strings.xml index 81132242e3c..be2114d6758 100644 --- a/stock-usecase/src/main/res/values-ar-rIQ/strings.xml +++ b/stock-usecase/src/main/res/values-ar-rIQ/strings.xml @@ -4,7 +4,6 @@ حذف إلغاء من - البحث تأكيد الرئيسية العدد diff --git a/stock-usecase/src/main/res/values-ar/strings.xml b/stock-usecase/src/main/res/values-ar/strings.xml index 3c33d1c6dbb..706e0964e6b 100644 --- a/stock-usecase/src/main/res/values-ar/strings.xml +++ b/stock-usecase/src/main/res/values-ar/strings.xml @@ -1,38 +1,17 @@ الرئيسية - المراجعة - الإعدادات تجاهل - أحدث الأنشطة - آخر مزامنة - اختر واحدة - الخادم: - تسجيل دخول - تسجيل الدخول إلى حسابك اسم المستخدم - كلمة المرور - نسيت كلمة المرور؟ - - تحميل الأنشطة الأخيرة... - لم تقم بأي نشاط بعد - مزامنة البيانات الوصفية... تعذر إكمال مزامنة بيانات التعريف - مزامنة البيانات... - تعذر إكمال مزامنة البيانات - اكتملت مزامنة البيانات الوصفية! - اكتملت المزامنة! - متابعة المراجعة - مسح الرمز الشريطي ضوئيًا - المسح الضوئي... عنصر البحث بحث... حذف @@ -40,48 +19,17 @@ إلغاء من - اللغة الإنجليزية - الفرنسية - الإسبانية - اللغة العربية - الروسية - - اللغة - تسجيل الخروج - - العنصر - بريد إلكتروني - كلمة المرور - تسجيل الدخول أو التسجيل - تسجيل دخول - أهلاً وسهلاً بك! - ليس اسم مستخدم صالحاً - يجب أن تكون كلمة المرور > 5 أحرف - فشل تسجيل الدخول - إعادة المزامنة - تعذر تسجيل الدخول - معلومات المزامنة - بحث - آخر مزامنة تأكيد - تأكيد إعادة التشغيل - تم إلغاء الفحص - - حدث خطأ أثناء تسجيل الخروج. يرجى المحاولة مرة أخرى لاحقاً. - - تم تسجيل الخروج بنجاح - غير صالح خطأ في الشبكة انتهت مهلة تشغيل الشبكة حدث خطأ في خادم الكلام حدث خطأ غير معروف. - لا يتوفر اتصال بالشبكة غير قادر على مزامنة البيانات لعدم توفر اتصال بالشبكة @@ -121,8 +69,6 @@ هناك مشكلة في شهادات الخادم. من فضلك ، اتصل بالمسؤول الخاص بك. الرئيسية الخلف - لا توجد أي تعارضات لهذا البرنامج - إرسال لم يتم حفظه العدد خطأ في التنسيق diff --git a/stock-usecase/src/main/res/values-ckb/strings.xml b/stock-usecase/src/main/res/values-ckb/strings.xml index 14d87de103c..d24ef745bdd 100644 --- a/stock-usecase/src/main/res/values-ckb/strings.xml +++ b/stock-usecase/src/main/res/values-ckb/strings.xml @@ -1,15 +1,12 @@ ماڵةوة - ريكخستن فري دان - ئةنجام دان سڕینەوە تةواو لابردن لە - گەڕان دووپاتکردنەوە ماڵةوة كةرانةوة diff --git a/stock-usecase/src/main/res/values-cs/strings.xml b/stock-usecase/src/main/res/values-cs/strings.xml index 3d44027ed80..daa07cf9eae 100644 --- a/stock-usecase/src/main/res/values-cs/strings.xml +++ b/stock-usecase/src/main/res/values-cs/strings.xml @@ -1,183 +1,59 @@ Správa zásob lékáren Domovská strana - Posouzení - Nastavení Rozdělení Vyřadit Oprava - Vyberte transakci - Datum transakce - Poslední aktivita - Poslední synchronizace: - Vyberte Zařízení - Distribuováno do - Vyber jeden - Server: - Přihlásit se - Přihlaste se ke svému účtu - Přihlaste se pomocí účtu ICRC - Pouze pro zaměstnance, kteří nejsou členy ICRC - Pouze pro zaměstnance ICRC Uživatelské jméno - Heslo - Zapomenuté heslo\? - - Načítání nedávných aktivit… - Ještě jste nevykonali žádnou činnost - Synchronizace metadat… Synchronizaci metadat nelze dokončit - Synchronizace dat… - Synchronizaci dat nelze dokončit - Synchronizace metadat dokončena! - Synchronizace dokončena! - Pokračovat Posouzení - Skenování čárového kódu - Skenování… Vyhledat položku Vyhledávání… Smazat OK Zrušit - potvrzení Od Doručit… %s - Komu %s - Angličtina - Francouzština - Španělština - Arabština - Ruština - Pro zadávání dat použijte mikrofon - Jazyk - Vynutit synchronizaci dat - Odhlásit - - Položka - Zásoby na skladě Množství - položky k dispozici - - Kladná hodnota = \"chybějící množství\" ( fyzické zásoby menší než vypočítaná hodnota ) - - - Záporná hodnota = \"nalezeno na skladě\" ( vypočítaná hodnota fyzické zásoby je více než 800) - - - Než budete moci pokračovat, musíte vybrat typ transakce a vyplnit všechna pole - Než budete moci pokračovat, musí být vyplněno pole zařízení \\n Před pokračováním je třeba vyplnit pole \"Distribuováno do\". - \n Než budete moci pokračovat, musí být vyplněno pole „Distribuováno do“.\n - \n Opravdu se chcete vrátit na předchozí obrazovku\?\n Pokud se rozhodnete pokračovat, ztratíte právě zadané údaje.\n Transakce byla úspěšně dokončena! - - Transakce byla úspěšně zrušena! - - \n Opravdu chcete vynutit synchronizaci\?\n - Opravdu se chcete odhlásit\? - - \\n Opravdu chcete trvale odstranit záznam pro opravu \"%1$s\"\?\\n Tuto akci nelze vzít zpět.\\n - \\n Opravdu chcete trvale odstranit položku pro distribuci \"%1$s\"\?\\n Tuto akci nelze vzít zpět.\\n - \\n Opravdu chcete trvale odstranit položku pro vyřazení \"%1$s\"\?\\n Tuto akci nelze vrátit zpět.\\n - - - %d položka - %d položky - %d položek - %d položek - - Nenalezeny žádné položky - Načítání skladových položek … - E-mail - Heslo - Přihlaste se nebo se zaregistrujte - Přihlásit se - Vítejte ! - Neplatné uživatelské jméno - Heslo musí mít >5 znaků - Přihlášení selhalo - Znovu synchronizovat - Nelze se přihlásit - Nelze načíst konfigurační soubor - - ID skladového programu nebylo v konfiguračním souboru nastaveno - - Nelze načíst vaše nedávné aktivity Nelze načíst seznam dostupných zařízení Nelze načíst seznam dostupných cílů - - Nelze načíst distribuční datový prvek - - - Nelze načíst opravný datový prvek - - - Nelze načíst datový prvek discard - - Synchronizovat informace - Hledat - Jasný text - Zobrazit nástroj pro výběr dat - Distribuováno do - Naposledy synchronizováno - Více informací o množství - Odebrat položku - Směrová šipka - Stav nedávné aktivity - Informační průvodce Potvrdit - - V konfiguračním souboru chybí jedno nebo více požadovaných polí. - - Vyberte požadovaný jazyk - - Restartovat později - \n Aby se však změny projevily, je třeba aplikaci restartovat,\n všechny neuložené změny budou ztraceny.\n\nChcete pokračovat v restartu\?\n - Potvrdit restart - Skenování zrušeno! - - Při odhlašování došlo k chybě. Prosím zkuste to znovu později. - - Úspěšně odhlášeno - Neplatný Dostupné skladové zásoby nelze překročit - - Akcie pod kontrolou nemohou být prázdné. Pokud si to nepřejete, můžete položku odstranit - Přístup udělen Přístup odepřen @@ -200,21 +76,9 @@ Nenumerický vstup není povolen: \"%s\" \n Zadání záporného čísla není povoleno: \"%s\"\n - Nelze načíst konfiguraci OpenID - - Při ověřování pomocí OpenID došlo k neočekávané chybě - - Není k dispozici připojení k síti Nelze synchronizovat data, protože není k dispozici připojení k síti - - Nelze se ověřit pomocí vašeho účtu ICRC - - - - V případě problémů \nkontaktujte prosím servis ICRC - Něco se pokazilo. Zkontrolujte prosím správnost adresy URL serveru, uživatelského jména a hesla a zkuste to znovu. @@ -252,8 +116,6 @@ Došlo k problému s certifikáty serveru. Kontaktujte prosím svého správce. Domovská strana Zpět - U tohoto programu nejsou žádné konflikty - Odeslat Ze zařízení Do zařízení Sklad diff --git a/stock-usecase/src/main/res/values-da/strings.xml b/stock-usecase/src/main/res/values-da/strings.xml index 3617e789403..3b6f9dd7989 100644 --- a/stock-usecase/src/main/res/values-da/strings.xml +++ b/stock-usecase/src/main/res/values-da/strings.xml @@ -1,11 +1,8 @@ - Settings Username - Password Delete OK Cancel - Password Back \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-en-rUS/strings.xml b/stock-usecase/src/main/res/values-en-rUS/strings.xml index 1765a6d8fde..08c9f76bfbf 100644 --- a/stock-usecase/src/main/res/values-en-rUS/strings.xml +++ b/stock-usecase/src/main/res/values-en-rUS/strings.xml @@ -1,5 +1,4 @@ - Review Review Cancel diff --git a/stock-usecase/src/main/res/values-es-rES/strings.xml b/stock-usecase/src/main/res/values-es-rES/strings.xml index 7b2cabd62c1..173b2a51df7 100644 --- a/stock-usecase/src/main/res/values-es-rES/strings.xml +++ b/stock-usecase/src/main/res/values-es-rES/strings.xml @@ -1,23 +1,14 @@ Inicio - Revisar - Configuración Nombre de usuario - Contraseña Revisar Borrar Correcto Cancelar De - Idioma - Cerrar sesión - - Contraseña - Buscar - Quitar elemento Algo ha ido mal. Por favor, compruebe que tanto la url del servidor como el usuario y contraseña son correctos y pruebe otra vez. Servidor desconocido @@ -49,7 +40,6 @@ Hay un problema con los certificados del servidor. Por favor contacte con su administrador. Inicio Atrás - Este programa no tiene conflictos No guardado Error de formato Solo se permiten números positivos o cero diff --git a/stock-usecase/src/main/res/values-es/strings.xml b/stock-usecase/src/main/res/values-es/strings.xml index 1667ef2199e..c60a5bcb340 100644 --- a/stock-usecase/src/main/res/values-es/strings.xml +++ b/stock-usecase/src/main/res/values-es/strings.xml @@ -1,172 +1,58 @@ Gestión de Inventarios en Farmacias Inicio - Revisar - Configuración Distribución Descartar Corrección - Seleccione transacción - Fecha de la Transacción - Actividad reciente - Última sincronización: - Seleccione establecimiento - Distribuido a - Seleccione un - Servidor: - Iniciar sesión - Inicia sesión en tu cuenta - Iniciar sesión con la cuenta del CICR - Solo para miembros del personal que no pertenecen al CICR - Solo para miembros del personal del CICR Nombre de usuario - Contraseña - ¿Has olvidado tu contraseña\? - - Cargando actividades recientes… - Aún no has realizado ninguna actividad - Sincronizando metadatos… No se pudo completar la sincronización de metadatos - Sincronizando datos… - No se pudo completar la sincronización de datos - ¡Sincronización de metadatos completada! - ¡Sincronizacion completa! - Proceder Revisar - Escanear código de barras - Escaneando… Buscar elemento Buscar... Eliminar Correcto Cancelar - Confirmación De Entregar a... %s - A %s - Inglés - Francés - Español - Arabe - Ruso - Utilice el micrófono para la entrada de datos - Idioma - Forzar la sincronización de datos - Cerrar sesión - - Elemento - Inventario disponible Cantidad - Elementos disponibles - - Valor positivo = \"cantidad faltante\" (existencias físicas menor al valor calculado) - - - Valor negativo = \"encontrado en existencias\" (existencias físicas mayores al valor calculado) - - - Se debe seleccionar un tipo de transacción y completar todos los campos antes de poder continuar - Debe seleccionar el establecimiento antes de poder continuar - \n Se debe completar el campo \"Distribuido a\" antes de poder continuar\n ¡La transacción se completó exitosamente! - - ¡La cancelación de la transacción se realizó con éxito! - - - %d artículo - %d artículos - %d artículos - - No se encontraron elementos - Cargando artículos en stock … - Correo-e - Contraseña - Iniciar sesión o registrarse - Iniciar sesión - ¡Bienvenido! - Nombre de usuario no válido - La contraseña debe tener >5 caracteres - Fallo al iniciar sesión - Sincronizar de nuevo - No se pudo iniciar sesión - No se puede cargar el archivo de configuración - - El identificador del programa de inventario no ha sido establecido en el archivo de configuración - - No se pueden cargar tus actividades recientes No se pueden cargar la lista de establecimientos disponibles No se puede cargar la lista de destinos disponibles - - No se ha podido cargar el elemento de datos de distribución - - - No se ha podido cargar el elemento de datos de corrección - - - No se puede cargar el elemento de datos de descarte - - Sincronizar información - Buscar - Limpiar texto - Mostrar selector de fecha - Distribuido a - Última sincronización - Más información sobre cantidad - Quitar elemento - Flecha direccional - Estado de actividades recientes - Cerrar guía de información Confirmar - - Falta completar uno o más campos obligatorios en el archivo de configuración - - Seleccione el idioma deseado - Reiniciar más tarde - Confirmar reinicio - ¡Escaneo cancelado! - - Se produjo un error durante el cierre de sesión. Por favor, inténtelo de nuevo más tarde. - - Sesión cerrada exitosamente - - No válido No se puede superar el inventario disponible - - Un inventario en revisión no puede estar vacío. Puedes eliminar el ítem si no es deseado - Permiso concedido Permiso denegado @@ -190,21 +76,9 @@ android.permission.RECORD_AUDIO No se permiten entradas no numéricas: \"%s\" \n No se permite la entrada de números negativos: \"%s\"\n - No se puede cargar la configuración de OpenID - - Se produjo un error inesperado al autenticar con OpenID - - No se encontró conexión de red disponible. No se puede sincronizar los datos porque no hay conexión de red disponible - - No se puede autenticar con su cuenta del CICR - - - - En caso de problemas, \ncomuníquese con el servicio de atención al cliente del CICR - Algo ha ido mal. Por favor, compruebe que tanto la url del servidor como el usuario y contraseña son correctos y pruebe otra vez. @@ -242,8 +116,6 @@ android.permission.RECORD_AUDIO Hay un problema con los certificados del servidor. Por favor contacte con su administrador. Inicio Atrás - Este programa no tiene conflictos - Enviar Desde el establecimiento Al establecimiento Inventario diff --git a/stock-usecase/src/main/res/values-fr/strings.xml b/stock-usecase/src/main/res/values-fr/strings.xml index 0fca27610cf..e21d633de4d 100644 --- a/stock-usecase/src/main/res/values-fr/strings.xml +++ b/stock-usecase/src/main/res/values-fr/strings.xml @@ -1,57 +1,27 @@ Accueil - Vérifier - Paramètres Distribution Abandonner Correction - Sélectionner une transaction - Date de la transaction - Dernière synchronisation - Séléctionner la structure - Distribuer à - Entrer Nom d\'utilisateur - Mot de passe - Mot de passe oublié? - Synchronisation terminée - Continuer Vérifier - Scanner le code-barre Rechercher un produit Supprimer Ok Annuler A partir de Livrer à - Langue - Déconnexion - - Élément - Stock disponible Quantité La transaction a été effectuée avec succès. - -La transaction a été annulée avec succès. - Aucun produit trouvé - Adresse e-mail - Mot de passe - Entrer - Connexion échouée - Impossible de se connecter - Rechercher - Distribué à - Retirer l\'élément Confirmer - Invalide Stock disponible ne peut être dépassé Erreur réseau @@ -73,8 +43,6 @@ Stock disponible ne peut être dépassé Il y a un problème avec les certificats du serveur. Veuillez contacter votre administrateur. Accueil Précédent - Il n\'y a pas de conflits pour ce programme - Envoyer Non enregistré! Décompte Revoir diff --git a/stock-usecase/src/main/res/values-hi-rIN/strings.xml b/stock-usecase/src/main/res/values-hi-rIN/strings.xml index 75300e27444..62c228f7b22 100644 --- a/stock-usecase/src/main/res/values-hi-rIN/strings.xml +++ b/stock-usecase/src/main/res/values-hi-rIN/strings.xml @@ -1,11 +1,7 @@ - रिव्यू - सेटिंग्स छोड़ें यूज़रनेम - पासवर्ड - पासवर्ड भूल गए\? रिव्यू @@ -13,13 +9,7 @@ ठीक है रद्द करें से - भाषा - लॉग आउट - - ईमेल - पासवर्ड - सर्च करें / खोजें वापस जाएँ सेव नहीं केवल शून्य या पॉजिटिव संख्या ही अनुमति है diff --git a/stock-usecase/src/main/res/values-id/strings.xml b/stock-usecase/src/main/res/values-id/strings.xml index c27a202ac42..9e85eee4b80 100644 --- a/stock-usecase/src/main/res/values-id/strings.xml +++ b/stock-usecase/src/main/res/values-id/strings.xml @@ -1,30 +1,18 @@ Beranda - Setting Buang Nama pengguna - Sandi - Lanjutkan Hapus OK Batal Dari - Bahasa - Keluar - - Email - Sandi - Pencarian Konfirmasi - Tidak valid Kesalahan saat penguraian hasil Beranda Kembali - Tidak ada konflik untuk program ini - Kirim Hitung Memformat kesalahan Hanya angka positif atau nol yang diperbolehkan diff --git a/stock-usecase/src/main/res/values-km/strings.xml b/stock-usecase/src/main/res/values-km/strings.xml index a2cd6f4f905..312458fe0c1 100644 --- a/stock-usecase/src/main/res/values-km/strings.xml +++ b/stock-usecase/src/main/res/values-km/strings.xml @@ -1,20 +1,15 @@ ផ្ទាំងដើម - ការ​កំណត់ ឈ្មោះ​គណនី - ពាក្យ​សម្ងាត់ ​លុប​ យល់ព្រម បោះបង់ - ពាក្យ​សម្ងាត់ - ស្វែងរក បញ្ជាក់ បណ្ដាញមានបញ្ហា កំហុសខណៈពេលញែកលទ្ធផល ផ្ទាំងដើម ថយក្រោយ - ផ្ញើទៅ ផលរាប់ លេខវិជ្ជមាន រឺ លេខ ០ តែមួយគត់ដែលត្រូវបានអនុញ្ញាត \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-lo/strings.xml b/stock-usecase/src/main/res/values-lo/strings.xml index 06659f9ef60..185d247f435 100644 --- a/stock-usecase/src/main/res/values-lo/strings.xml +++ b/stock-usecase/src/main/res/values-lo/strings.xml @@ -1,24 +1,11 @@ ໜ້າຫຼັກ - ທົບທວນຄືນ - ຕັ້ງຄ່າ ຍົົກເລິກ - ເລືອກທຸລະກຳ - ກິດຈະກຳທີ່ຜ່ານມາ - ອັບເດດຂໍ້ມູນຄັ້ງສຸດທ້າຍ: - ເລືອກສະຖານທີ່ບໍລິການ - ເຄື່ອງຄອມພິວເຕີໜ່ວຍແມ່: - ເຂົ້າສູ່ລະບົບ - ເຂົ້າສູ່ລະບົບດ້ວຍບັນຊີຂອງທ່ານ - ເຂົ້າສູ່ລະບົບດ້ວຍບັນຊີ ICRC ຊື່ຜູ້ໃຊ້ - ລະຫັດຜ່ານ - ລຶມລະຫັດຜ່ານ\? - ດຳເນີນ ທົບທວນຄືນ ຄົ້ນຫາລາຍການ @@ -27,46 +14,18 @@ ​ຕົກ​ລົງ ຍົກເລີກ ຈາກ - ພາສາ - ອອກຈາກລະບົບ - - ລາຍການ ປະລິມານ - ລາຍການທີ່ມີຢູ່ - - %d ລາຍການ - - ບໍ່ພົບລາຍການໃດໆ - ອີເມວ - ລະຫັດຜ່ານ - ເຂົ້າສູ່ລະບົບ ຫຼື ລົງທະບຽນ - ເຂົ້າສູ່ລະບົບ - ຍິນດີຕ້ອນຮັບ ! - ບໍ່ແມ່ນຊື່ຜູ້ໃຊ້ທີ່ຖືກຕ້ອງ - ລະຫັດຜ່ານຕ້ອງມີ >5 ຕົວອັກສອນ - ການເຂົ້າສູ່ລະບົບຜິດພາດ - ອັບເດດຂໍ້ມູນຄືນໃໝ່ - ບໍ່ສາມາດເຂົ້າສູ່ລະບົບໄດ້ ບໍ່ສາມາດໂຫຼດລາຍຊື່ສະຖານທີ່ບໍລິການທີ່ມີຢູ່ໄດ້ - ຄົ້ນຫາ - ລ້າງຂໍ້ຄວາມ - ອັບເດດຂໍ້ມູນຄັ້ງສຸດທ້າຍ - ຂໍ້ມູນເພີ່ມເຕີມກ່ຽວກັບປະລິມານ - ລົບລາຍການ ຢືນຢັນ - ເລີ່ມຕົ້ນໃໝ່ໃນພາຍຫຼັງ - ອອກຈາກລະບົບສຳເລັດແລ້ວ - ບໍ່ຖືກຕ້ອງ ຂໍ້ຜິດພາດທາງເຄື່ອຂ່າຍ ການເຮັດວຽກຂອງອິນເຕີເນັດໝົດເວລາແລ້ວ \nບໍ່ອະນຸຍາດໃຫ້ປ້ອນຕົວເລກລົບ:\"%s\" - ບໍ່ມີການເຊື່ອມຕໍ່ອິນເຕີເນັດ ບໍ່ສາມາດ ອັບເດດຂໍ້ມູນໃຫ້ຄືກັນຂໍ້ມູນໄດ້ເນື່ອງຈາກບໍ່ມີການເຊື່ອມຕໍ່ອິນເຕີເນັດ @@ -105,8 +64,6 @@ ມີບັນຫາກັບໃບຮັບຮອງເຄື່ອງຄອມພິວເຕິ້ໜ່ວຍແມ່. ກະລຸນາຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ. ໜ້າຫຼັກ ​ກັບ​ຄືນ - ສາຍງານນີ້ບໍມີຂໍ້ຂັດແຍ້ງ - ສົ່ງ ຈາກ ສະຖານທີ່ບໍລິການ ຫາ ສະຖານທີ່ບໍລິການ ສາງ diff --git a/stock-usecase/src/main/res/values-my/strings.xml b/stock-usecase/src/main/res/values-my/strings.xml index f01a1568adf..366e245c68b 100644 --- a/stock-usecase/src/main/res/values-my/strings.xml +++ b/stock-usecase/src/main/res/values-my/strings.xml @@ -1,17 +1,12 @@ ပင်မစာမျက်နှာ - တည်ဆောက်ထားသည့်အနေအထား အသုံးပြုသူအမည် - လျှို့ဝှက်နံပါတ် - လျှို့ဝှက်နံပါတ်မေ့သွားသည် ဖျက်ဆီးသည် လက်ခံသည် ပယ်ဖျက်သည် - လျှို့ဝှက်နံပါတ် ပင်မစာမျက်နှာ ‌နောက်သို့ပြန်သွားသည် - ပို့သည် အရေအတွက် \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-nb/strings.xml b/stock-usecase/src/main/res/values-nb/strings.xml index f620f8e4315..93d11a605c7 100644 --- a/stock-usecase/src/main/res/values-nb/strings.xml +++ b/stock-usecase/src/main/res/values-nb/strings.xml @@ -1,36 +1,20 @@ Hjem - Innstillinger Forkast - Logg inn Brukernavn - Passord - Glemt passord? - Fortsett Slett OK Avbryt Fra - Språk - Logg ut - - Element - E-post - Passord - Logg inn - Søk Bekreft - Ugyldig Feil under analyse av resultater Hjem Tilbake - Det er ingen konflikter for dette programmet - Send Antall Formateringsfeil Bare positive siffer eller null er tillatt diff --git a/stock-usecase/src/main/res/values-ne/strings.xml b/stock-usecase/src/main/res/values-ne/strings.xml index 22478dfd7d8..61bbff72a22 100644 --- a/stock-usecase/src/main/res/values-ne/strings.xml +++ b/stock-usecase/src/main/res/values-ne/strings.xml @@ -1,7 +1,4 @@ त्याग गर्नुहोस् रद्द गर्नुहोस् - खोज - अमान्य - पठाउनुहोस् \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-nl/strings.xml b/stock-usecase/src/main/res/values-nl/strings.xml index 97e65126ff9..bd77f7f6bba 100644 --- a/stock-usecase/src/main/res/values-nl/strings.xml +++ b/stock-usecase/src/main/res/values-nl/strings.xml @@ -1,146 +1,49 @@ Voorraadbeheer apotheek Thuis - Beoordeling - Instellingen Verdeling Weggooien Correctie - Selecteer transactie - Datum van transactie - Recente activiteit - Laatst gesynchroniseerd: - Selecteer Faciliteit - Gedistribueerd naar - Kies een - Server: - Aanmelden - Meld u aan bij uw account - Log in met ICRC-account - Alleen voor niet-ICRC-personeelsleden - Alleen voor ICRC-personeelsleden Gebruikersnaam - Wachtwoord - Wachtwoord vergeten\? - - Recente activiteiten laden… - U moet nog enige activiteit uitvoeren - Metagegevens synchroniseren… Kan metadatasynchronisatie niet voltooien - Gegevens synchroniseren… - Gegevenssynchronisatie kan niet worden voltooid - Metadatasynchronisatie voltooid! - Synchronisatie voltooid! - Ga door Beoordeling - Streepjescode scannen - Scannen… Zoek item Zoekopdracht… Verwijder OK Annuleren - Bevestiging Van Leveren aan… %s - Naar %s - Engels - Frans - Spaans - Arabisch - Russisch - Gebruik microfoon voor gegevensinvoer - Taal - Forceer gegevenssynchronisatie - Uitloggen - - Item - Voorraad bij de hand Hoeveelheid - artikelen beschikbaar - Positieve waarde = \"ontbrekende hoeveelheid\" ( fysieke voorraad kleiner dan de berekende waarde ) - Negatieve waarde = \"op voorraad gevonden\" ( fysieke voorraad is meer dan de berekende waarde ) - Er moet een transactietype worden geselecteerd en alle velden moeten zijn ingevuld voordat u verder kunt gaan Het faciliteitsveld moet worden ingevuld voordat u verder kunt gaan - Het veld \"Gedistribueerd naar\" moet zijn ingevuld voordat u verder kunt gaan - Weet u zeker dat u terug wilt naar het vorige scherm\? U verliest de zojuist ingevoerde gegevens als u besluit door te gaan. De transactie is succesvol afgerond! - De transactie is succesvol geannuleerd! - Weet u zeker dat u synchronisatie wilt forceren\? - Weet u zeker dat u wilt uitloggen\? - - Weet u zeker dat u de invoer voor de correctie van \"%1$s permanent wilt verwijderen\"\? Deze actie kan niet ongedaan gemaakt worden. - Weet u zeker dat u het item voor de distributie van \"%1$s permanent wilt verwijderen\"\? Deze actie kan niet ongedaan gemaakt worden. - Weet u zeker dat u de invoer voor het weggooien van \"%1$s permanent wilt verwijderen\"\? Deze actie kan niet ongedaan gemaakt worden. - - - %d item - %d artikelen - - Geen items gevonden - Voorraadartikelen laden … - Emailadres - Wachtwoord - Log in of registreer - Aanmelden - Welkom ! - Geen geldige gebruikersnaam - Wachtwoord moet >5 tekens zijn - Aanmelden mislukt - Opnieuw synchroniseren - Niet mogelijk om in te loggen - Kan het configuratiebestand niet laden - Stock-programma-ID is niet ingesteld in het configuratiebestand - Kan uw recente activiteiten niet laden Kan de lijst met beschikbare faciliteiten niet laden Kan de lijst met beschikbare bestemmingen niet laden - Synchroniseer informatie - Zoek - Duidelijke tekst - Toon datumkiezer - Gedistribueerd naar - Laatst gesynchroniseerd - Meer informatie over hoeveelheid - Verwijder voorwerp - Richtingspijl - Recente activiteitsstatus - Informatiegids sluiten Bevestigen - Een of meer verplichte velden ontbreken in het configuratiebestand - Selecteer uw gewenste taal - Later opnieuw opstarten - De toepassing moet opnieuw worden gestart om de wijzigingen door te voeren, maar alle niet-opgeslagen wijzigingen gaan verloren.\n\nWilt u doorgaan met de herstart\? - Bevestig opnieuw opstarten - Scan geannuleerd! - Er is een fout opgetreden tijdens het uitloggen. Probeer het later opnieuw. - Succesvol uitgelogd - - Ongeldig De beschikbare voorraad kan niet worden overschreden - Een voorraad die wordt beoordeeld, kan niet leeg zijn. U kunt het item verwijderen als u dit niet wilt Toestemming verleend Geen toestemming @@ -159,13 +62,7 @@ Niet-numerieke invoer is niet toegestaan: \"%s\" Negatieve getalinvoer is niet toegestaan: \"%s\" - Kan OpenID-configuratie niet laden - Er is een onverwachte fout opgetreden tijdens het verifiëren met OpenID - Geen netwerkverbinding beschikbaar Kan gegevens niet synchroniseren omdat er geen netwerkverbinding beschikbaar is - Kan niet verifiëren met uw ICRC-account - - Neem bij problemen \ncontact op met de ICRC-servicedesk Er is iets fout gegaan. Controleer of de server-URL, gebruikersnaam en wachtwoord juist zijn en probeer het opnieuw. @@ -203,8 +100,6 @@ Er is een probleem met de servercertificaten. Neem contact op met uw beheerder. Thuis Terug - Er zijn geen conflicten voor dit programma - Versturen Van faciliteit Naar faciliteit Voorraad diff --git a/stock-usecase/src/main/res/values-prs/strings.xml b/stock-usecase/src/main/res/values-prs/strings.xml index 0df4da408d6..e38feebddce 100644 --- a/stock-usecase/src/main/res/values-prs/strings.xml +++ b/stock-usecase/src/main/res/values-prs/strings.xml @@ -1,30 +1,17 @@ صفحه اصلی - تنظیمات ازبین بردن - ورود به سیستم نام کاربر - کلید رمز - آیا کلید رمز را فراموش نه موده اید؟ - ادامه دادن حذف تأیید انصراف از جانب - زبان - مورد - برېښنالیک - کلید رمز - ورود به سیستم - جستجو تائید - نامعتبر صفحه اصلی عقب - فرستادن تعداد \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-ps/strings.xml b/stock-usecase/src/main/res/values-ps/strings.xml index 3ad1c0f779c..ee29df2717a 100644 --- a/stock-usecase/src/main/res/values-ps/strings.xml +++ b/stock-usecase/src/main/res/values-ps/strings.xml @@ -1,28 +1,16 @@ کور پاڼه - تنظیمات رد یې کړئ - سیسټم ته داخلېدل کارېدونکی نوم - پټنوم - پټ نوم هېر شوی دی؟ - دوام ورکول خذف یې کړئ سم دی رد یې کړئ [ ژباړه ـ ردول ] څخه - مورد - ایمیل - پټنوم - سیسټم ته داخلېدل - جستجو - د اعتبار وړ نه دي کور پاڼه شا ته کېدل - لېږل شمېرل \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-pt-rBR/strings.xml b/stock-usecase/src/main/res/values-pt-rBR/strings.xml index 85a833fe33b..b060f63fa9d 100644 --- a/stock-usecase/src/main/res/values-pt-rBR/strings.xml +++ b/stock-usecase/src/main/res/values-pt-rBR/strings.xml @@ -1,21 +1,14 @@ Origem - Configurações Utilizador - Password Apagar Aprovado Cancelar A partir de - E-mail - Password - Pesquisar Confirmar - Inválido Erro de rede Origem Voltar - Enviar Contagem \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-pt/strings.xml b/stock-usecase/src/main/res/values-pt/strings.xml index 4d68792affe..32e11c7c7c8 100644 --- a/stock-usecase/src/main/res/values-pt/strings.xml +++ b/stock-usecase/src/main/res/values-pt/strings.xml @@ -1,169 +1,56 @@ Gestão de stocks de farmácia Início - Revisão - Configurações Distribuição Descartar Correção - Selecionar transação - Data da transação - Actividade recente - Data da última sincronização - Selecionar unidade sanitária - Distribuído para - Selecione um - Servidor: - Entrar - Iniciar sessão na sua conta - Iniciar sessão com a conta do ICRC - Apenas para membros do pessoal não pertencentes ao ICRC - Apenas para membros do ICRC Nome de utilizador - Senha - Esqueceu a password\? - - Carregar actividades recentes… - Ainda não realizou nenhuma atividade - Sincronização de metadados… Não foi possível concluir a sincronização de metadados - Sincronização de dados… - Não é possível concluir a sincronização de dados - Sincronização de metadados concluída! - Sincronização concluída! - Prosseguir Revisão - Ler código de barras - Digitalização… Procurar item Pesquisar... Apagar OK Cancelar - Confirmação A partir de Entrega para... %s - Para %s - Inglês - Francês - Espanhol - Árabe - Russo - Use microfone para introdução de dados - Idioma - Forçar a sincronização de dados - Terminar sessão - - Item - Existências Quantidade - artigos disponíveis - - Valor positivo = \"quantidade em falta\" (estoque físico inferior ao número calculado) - - - Valor negativo = \"encontrado em stock\" (estoque físico é superior ao valor calculado) - - Deve ser selecionado um tipo de transação e todos os campos devem ser preenchidos antes de poder prosseguir - O campo da instalação deve ser preenchido antes de prosseguir - \n The ‘Distributed to’ field must be filled in before proceeding\n A transação foi concluída com êxito! - - A transação foi cancelada com sucesso! - - - %d item - %d artigos - %d itens - - Nenhum item encontrado - Carregar itens em stock … - E-mail - Palavra-passe - Iniciar sessão ou registar-se - Entrar - Bem-vindo! - Não é um nome de utilizador válido - A palavra-passe deve ter >5 caracteres - O início de sessão falhou - Voltar a sincronizar - Não é possível iniciar sessão - Não é possível carregar o ficheiro de configuração - - O ID do programa de stock não foi definido no ficheiro de configuração - - Não é possível carregar as suas actividades recentes Não é possível carregar a lista de unidades sanitárias disponíveis Não foi possível carregar a lista de destinos disponíveis - - Não foi possível carregar o elemento de dados de distribuição - - - Não foi possível carregar o elemento de dados de correção - - - Não foi possível carregar o elemento de dados descartados - - Informações de sincronização - Pesquisar - Limpar texto - Mostrar selector de datas - Distribuído para - Última sincronização - Mais informações sobre a quantidade - Remover item - Seta direcional - Estado da atividade recente - Fechar guia de informação Confirme - - Um ou mais campos obrigatórios estão em falta no ficheiro de configuração - - Selecione a língua pretendida - - Reiniciar mais tarde - Confirmar o reinício - Scan cancelado! - - Ocorreu um erro durante o logout. Por favor, tente mais tarde. - - Sair da sessão com sucesso - Inválido As existências disponíveis não podem ser excedidas - - Um stock em revisão não pode estar vazio. Pode remover o item se não desejar - Autorização concedida Autorização recusada @@ -186,21 +73,9 @@  Não é permitida a introdução de dados não numéricos: \"%s\" \n A introdução de números negativos não é permitida:\"%s\"\n - Não é possível carregar a configuração do OpenID - - Ocorreu um erro inesperado ao autenticar com OpenID - - Não há ligação de rede disponível Não é possível sincronizar dados porque não existe uma ligação de rede disponível - - Não é possível autenticar com a sua conta ICRC - - - - Em caso de problemas, \ncontacte o serviço de atendimento do ICRC - Algo correu mal. Verifique se o URL do servidor, o nome de utilizador e a palavra-passe estão correctos e tente novamente. @@ -238,8 +113,6 @@ Existe um problema com os certificados do servidor. Por favor, contacte o seu administrador. Início Voltar - Não há conflitos para este programa - Enviar Da unidade sanitária Para a unidade sanitária Stock diff --git a/stock-usecase/src/main/res/values-ro/strings.xml b/stock-usecase/src/main/res/values-ro/strings.xml index c708e2b5904..ea3a4ccc6ec 100644 --- a/stock-usecase/src/main/res/values-ro/strings.xml +++ b/stock-usecase/src/main/res/values-ro/strings.xml @@ -3,7 +3,6 @@ Lichidare Anulare Din - Căutare Confirmare Acasă Înapoi diff --git a/stock-usecase/src/main/res/values-ru/strings.xml b/stock-usecase/src/main/res/values-ru/strings.xml index 21f222fa8d0..edfaf18563b 100644 --- a/stock-usecase/src/main/res/values-ru/strings.xml +++ b/stock-usecase/src/main/res/values-ru/strings.xml @@ -1,104 +1,39 @@ Главная - Просмотр - Настройки Отмена - Выберите транзакцию - Дата транзакции - Последняя активность - Последняя синхронизация: - Выберите один - Сервер: - Войти в систему - Войдите в свою учетную запись Имя пользователя - Пароль - Забыли пароль? - Загрузка последних действий... - Синхронизация метаданных... Невозможно завершить синхронизацию метаданных - Синхронизация данных... - Невозможно завершить синхронизацию данных - Синхронизация метаданных завершена! - Синхронизация завершена! - Продолжить Просмотр - Сканировать штрих-код - Сканирование... Поиск... Удалить ОК Отмена - Подтверждение От Доставка к... - Английский язык - Французский - Испанский - Арабский язык - Русский - - Язык - Принудительная синхронизация данных - Выход из системы - - Пункт - адрес электронной почты - Пароль - Войдите или зарегистрируйтесь - Войти в систему - Добро пожаловать! - Неверное имя пользователя - Пароль должен состоять из более, чем 5 символов - Вход в систему не удался - Ресинхронизация - Невозможно войти в систему - Невозможно загрузить файл конфигурации - Невозможно загрузить последние действия - Информация о синхронизации - Поиск - Очистить текст - Последняя синхронизация - Удалить элемент - Статус последней активности - Закрыть информационный справочник Подтвердить - - В файле конфигурации отсутствует одно или несколько обязательных полей - - Выберите желаемый язык - - Перезапустить позже - Подтвердите перезапуск - - Во время выхода из системы произошла ошибка. Пожалуйста, повторите попытку позже. - - Успешный выход из системы - Недействительный Разрешение получено Разрешение отклонено Ошибка сети Время работы сети истекло Произошла неизвестная ошибка. - Отсутствует сетевое подключение Невозможно синхронизировать данные из-за отсутствия сетевого подключения @@ -136,8 +71,6 @@ Возникла проблема с сертификатами сервера. Пожалуйста, свяжитесь с вашим администратором. Главная Назад - Для этой программы нет конфликтов - Отправить Не сохранено Количество На проверке diff --git a/stock-usecase/src/main/res/values-si/strings.xml b/stock-usecase/src/main/res/values-si/strings.xml index 91b6b19be5d..891a2ccd6fe 100644 --- a/stock-usecase/src/main/res/values-si/strings.xml +++ b/stock-usecase/src/main/res/values-si/strings.xml @@ -1,11 +1,6 @@ ඉවත ලන්න - රහස්‍ය පදය ඉවත් කරන්න - රහස්‍ය පදය - සොයන්න තහවුරු කරන්න - අවලංගු - යවන්න ගණන \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-sv/strings.xml b/stock-usecase/src/main/res/values-sv/strings.xml index c682b0fb798..6d2455fb18b 100644 --- a/stock-usecase/src/main/res/values-sv/strings.xml +++ b/stock-usecase/src/main/res/values-sv/strings.xml @@ -1,27 +1,17 @@ Hem - Inställningar Kassera - Logga in Användarnamn - Lösenord - Glömt ditt lösenord? - Fortsätta Radera ok Avbryt - E-post - Lösenord - Logga in - Sök Bekräfta Fel vid tolkning av resultat Hem Tillbaka - Skicka Räkna Endast positiva tal eller noll tillåts \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-tet/strings.xml b/stock-usecase/src/main/res/values-tet/strings.xml index e548b77bb20..89d57feef88 100644 --- a/stock-usecase/src/main/res/values-tet/strings.xml +++ b/stock-usecase/src/main/res/values-tet/strings.xml @@ -1,19 +1,12 @@ Pájina inisial - Konfigurasaun Soe - Tama Utilizador nia Naran - Seña - Haluha seña? Soe OK Kansela - Seña - Tama Pájina inisial Ba kotuk - Haruka Konta \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-tg/strings.xml b/stock-usecase/src/main/res/values-tg/strings.xml index 45193944048..f5a8753abc8 100644 --- a/stock-usecase/src/main/res/values-tg/strings.xml +++ b/stock-usecase/src/main/res/values-tg/strings.xml @@ -1,20 +1,13 @@ Саҳифаи асосӣ - Танзимот Номи корбар - Парол - Паролро фаромӯш кардед? Нест кардан OK Бекор кардан - Почтаи электронӣ - Парол - Ҷустуҷӯ Тасдиқ Саҳифаи асосӣ Ба қафо - Фиристодан Шумора \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-uk/strings.xml b/stock-usecase/src/main/res/values-uk/strings.xml index 881a7e66631..66ce11d1c6e 100644 --- a/stock-usecase/src/main/res/values-uk/strings.xml +++ b/stock-usecase/src/main/res/values-uk/strings.xml @@ -1,16 +1,10 @@ Головна - Перегляд - Налаштування Ігнорувати - Увійти Ім\'я користувача - Пароль - Забули пароль? - Продовжити Перегляд Пошуковий елемент @@ -19,18 +13,9 @@ ОК Скасувати Від - Мова - Вийти - - Елемент - Електронна пошта - Пароль - Увійти - Пошук Підтвердити - Невірне Сталася помилка. Будь ласка, перевірте правильність URL-адреси серверу, імені користувача та пароля і повторіть спробу. Невідомий сервер @@ -62,8 +47,6 @@ Виникла проблема із сертифікатами сервера. Будь ласка, зверніться до свого адміністратора. Головна Назад - Для цієї програми немає конфліктів - Надіслати Не збережено Підрахунок Помилка форматування diff --git a/stock-usecase/src/main/res/values-ur/strings.xml b/stock-usecase/src/main/res/values-ur/strings.xml index d93e663e7dd..ec6dff82842 100644 --- a/stock-usecase/src/main/res/values-ur/strings.xml +++ b/stock-usecase/src/main/res/values-ur/strings.xml @@ -1,30 +1,17 @@ گھر - ترتیبات ذائل - داخلہ صارف کا نا٠- پاسورڈ - پاسورڈ بھول گے؟ - آگے بڑھو حذف ٹھیک منسوخ سے - زبان - شے - ای میل - پاسورڈ - داخلہ - تلاش کریں تصدیق کریں - غلط گھر واپس - بھیجو شمار \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-uz-rUZ/strings.xml b/stock-usecase/src/main/res/values-uz-rUZ/strings.xml index 774489d1f0f..b985ee3597d 100644 --- a/stock-usecase/src/main/res/values-uz-rUZ/strings.xml +++ b/stock-usecase/src/main/res/values-uz-rUZ/strings.xml @@ -1,146 +1,50 @@ Dorixona fondini boshqarish Бош саҳифа - Ko‘rib chiqish - Sozlamalar Tarqatish Bekor qilish Tuzatish - Tranzaksiyani tanlang - Tranzaksiya sanasi - Oxirgi faoliyat - Oxirgi sinxronlangan: - Tashkilotni tanlang - ga tarqatiladi - Birini tanlang - Server: - Tizimga kirish - Akkauntingizga kiring - ICRC akkaunti orqali bilan tizimga kiring - Faqat ICRC bo\'lmagan xodimlar uchun - Faqat ICRC xodimlar uchun Фойдаланувчи исми - Parol - Parolni unutdingizmi\? - - Oxirgi harakatlar yuklanmoqda… - Siz hali hech qanday faoliyatni amalga oshirmayapsiz - Metadata sinxronlanmoqda… Meta-maʼlumotlarni sinxronlash tugallanmadi - Ma\'lumotlarni sinxronlash… - Maʼlumotlarni sinxronlash tugallanmadi - Metadata sinxronlash tugallandi! - Sinxronlash tugallandi! - Davom eting Ko‘rib chiqish - Shtrix-kodni skanerlash - Skanerlash… Elementni qidirish Излаш... Oʼchirib tashlash OK Бекор қилиш - Тасдиқлаш Dan Етказиб бериш ... га %s - %s ga - Inglizcha - Fransuzcha - Ispancha - Arabcha - Ruscha - Ma\'lumotlarni kiritish uchun mikrofondan foydalaning - Til - Маълумотларни мажбурий синхронлаш - Chiqib ketish - - Element - Захирада бор Миқдори - мавжуд нарсалар - - Позитив қиймат = \"етмаган қиймат\" (жисмоний захира ҳисобдаги қийматдан кам) - - - Манфий қиймат = \"захирада мавжуд\" (жисмоний захирада ҳисобдаги қийматдан кўп) - - -Жараён давом этишидан олдин, Транзакция тури танланган бўлиши ва барча катаклар тўлдирилган бўлиши шарт - Davom etishdan oldin tashkilot maydoni to\'ldirilishi kerak - Davom etishdan oldin “Tarqatilgan” maydoni to‘ldirilishi kerak Tranzaksiya muvaffaqiyatli yakunlandi! - Tranzaksiya muvaffaqiyatli bekor qilindi! - - %d нарсалар - - Бирор нарса топилмади - Нарсалар захираси юкланмоқда … - ye-Pochta - Parol - Киринг ёки рўйхатдан ўтинг - Tizimga kirish - Хуш келибсиз! - Яроқсиз исм - Пароль 5 та белгидан кўп бўлиши керак - Логин хато - Қайта синхронлаш - Мавжуд бўлмаган логин - Konfiguratsiya faylini yuklab bo‘lmadi - Birja dasturi identifikatori konfiguratsiya faylida o\'rnatilmagan - Oxirgi harakatlaringiz yuklanmadi Mavjud imkoniyatlar roʻyxatini yuklab boʻlmadi Mavjud manzillar roʻyxatini yuklab boʻlmadi - Tarqatish maʼlumotlari elementini yuklab boʻlmadi - Tuzatish maʼlumotlari elementini yuklab boʻlmadi - Yo‘qotilgan ma’lumotlar elementini yuklab bo‘lmadi - Ma\'lumotni sinxronlash - Izlash - Matnni tozalash - Sana tanlagichni ko\'rsatish - ga tarqatiladi - Oxirgi sinxronlangan - Miqdori haqida ko\'proq ma\'lumot - Elementni olib tashlang - Yo\'nalish o\'qi - Oxirgi faoliyat holati - Ma\'lumot yo\'riqnomasini yoping Tasdiqlang - Konfiguratsiya faylida bir yoki bir nechta talab qilinadigan maydonlar mavjud emas - O\'zingiz xohlagan tilni tanlang - Keyinroq qayta ishga tushirish - Qayta ishga tushirishni tasdiqlang - Skanerlash bekor qilindi! - Chiqish paytida xatolik yuz berdi. Keyinroq qayta urinib ko‘ring. - Akkauntdan muvaffaqiyatli chiqdi - - Yaroqsiz Qo\'ldagi mavjud zaxiradan oshib bo\'lmaydi - Ko\'rib chiqilayotgan aktsiya bo\'sh bo\'lishi mumkin emas. Agar xohlamasangiz, elementni olib tashlashingiz mumkin Ruxsat berilgan Ruxsat berilmadi @@ -159,13 +63,7 @@ Raqamsiz kiritishga ruxsat berilmagan: \"%s\" Raqamni salbiy kiritish mumkin emas: \"%s\"\n - OpenID konfiguratsiyasini yuklab boʻlmadi - OpenID bilan autentifikatsiya qilishda kutilmagan xatolik yuz berdi - Tarmoq ulanishi mavjud emas Maʼlumotlarni sinxronlash imkonsiz, chunki tarmoq ulanishi mavjud emas - ICRC akkauntingiz bilan autentifikatsiya qilish imkonsiz - - Muammolar bo\'lsa, \nIltimos, ICRC xizmat ko\'rsatish markaziga murojaat qiling Nimadir notoʼgʼri bajarildi. Server URL manzili, foydalanuvchi nomi va parol toʼgʼri ekanligini tekshiring va qaytadan urining. @@ -174,8 +72,6 @@ Natijalarni tahlil qilishda xatolik yuz berdi Бош саҳифа Orqaga - Ushbu dastur uchun hech qanday nizolar mavjud emas - Yuborish Ҳисоблаш Formatlashda xatolik Faqat musbat raqamlar yoki nolga ruxsat beriladi diff --git a/stock-usecase/src/main/res/values-uz/strings.xml b/stock-usecase/src/main/res/values-uz/strings.xml index 6b402c132c1..c2ee33e04a2 100644 --- a/stock-usecase/src/main/res/values-uz/strings.xml +++ b/stock-usecase/src/main/res/values-uz/strings.xml @@ -1,117 +1,45 @@ Дорихона фондини бошқариш Бош саҳифа - Кўриб чиқиш - Созламалар Тарқатиш Бекор қилиш Тузатиш - Транзакцияни танлаш - Транзакция санаси - Охирги фаолият - Охирги марта синхронланган: - Ташкилотни танлаш - ... га тарқатиш - Биртасини танлаш - Сервер: - Тизимга кириш - Ўз аккаунтингизга киринг - CRC аккаунти орқали киринг - ICRC ходимлари бўлмаганлар учун - ICRC ходимлари учун Фойдаланувчи исми - Пароль - Паролни унутдингизми\? - - Охирги фаоллик юкланмоқда … - Ҳозирда ҳеч қандай фаоллик амалга оширилмаган - Метамаълумотлар синхронизацияси… Метамаълумотлар синхронизациясини якунлаш имконсиз - Маълумотлар синхронизацияси… - Маълумотлар синхронизациясини якунлаш имконсиз - Метамаълумотлар синхронизацияси якунланди - Синхронлаш якунланди! - Давом этинг Кўриб чиқиш - Баркодни сканерлаш - Сканерлаш… Элементни излаш Излаш... Ўчириб ташлаш ОК Бекор қилиш - Тасдиқлаш Кимдан Етказиб бериш ... га %s - %s га - Инглиз - Француз - Испан - Арабча - Русча - Маълумотларни киритиш учун микрофондан фойдаланиш - Тил - Маълумотларни мажбурий синхронлаш - Чиқиб кетиш - - Элемент - Захирада бор Миқдори - мавжуд нарсалар - - Позитив қиймат = \"етмаган қиймат\" (жисмоний захира ҳисобдаги қийматдан кам) - - - Манфий қиймат = \"захирада мавжуд\" (жисмоний захирада ҳисобдаги қийматдан кўп) - - -Жараён давом этишидан олдин, Транзакция тури танланган бўлиши ва барча катаклар тўлдирилган бўлиши шарт - - - %d нарсалар - - Бирор нарса топилмади - Нарсалар захираси юкланмоқда … - е-Почта - Пароль - Киринг ёки рўйхатдан ўтинг - Тизимга кириш - Хуш келибсиз! - Яроқсиз исм - Пароль 5 та белгидан кўп бўлиши керак - Логин хато - Қайта синхронлаш - Мавжуд бўлмаган логин - Қидириш - ... га тарқатиш Тасдиқланг - Яроқсиз Тармоқда хатолик Натижаларни таҳлил қилишда хатолик юз берди Бош саҳифа Орқага - Ушбу дастур учун ҳеч қандай низолар мавжуд эмас - Юбориш Ҳисоблаш Форматлашда хатолик Фақат мусбат рақамлар ёки нолга рухсат берилади diff --git a/stock-usecase/src/main/res/values-vi/strings.xml b/stock-usecase/src/main/res/values-vi/strings.xml index 742d15dc515..1d4e2869417 100644 --- a/stock-usecase/src/main/res/values-vi/strings.xml +++ b/stock-usecase/src/main/res/values-vi/strings.xml @@ -1,170 +1,58 @@ Quản lý kho dược phẩm Trang chủ - Xem xét - Cài đặt Phân bổ Hủy bỏ Điểu chỉnh - Chọn giao dịch - Ngày giao dịch - Hoạt động gần đây - Đồng bộ lần cuối : - Chọn cơ sở - Phân bổ đến - Chọn một - Máy chủ : - Đăng nhập - Đăng nhập vào tài khoản của bạn - Đăng nhập với tài khoản ICRC - Chỉ dành cho nhân viên ngoài ICRC - Chỉ dành cho nhân viên ICRC Tên đăng nhập - Mật khẩu - Quên mật khẩu\? - - Đang tải các hoạt động gần đây… - Bạn chưa thực hiện bất kỳ hoạt động nào - Đang đồng bộ siêu dữ liệu&#8230 Không thể hoàn thành đồng bộ siêu dữ liệu - Đang đồng bộ dữ liệuಞ - Không thể hoàn thành đồng bộ dữ liệu - Đồng bộ siêu dữ liệu đã hoàn tất! - Đồng bộ đã hoàn tất! - Tiến hành Xem xét - Quét mã vạch - Đang quét… Tìm kiếm Tìm kiếm... Xóa OK Hủy - Xác nhận Từ Gửi đến... %s - Đến %s - Tiếng Anh - Tiếng Pháp - Tiếng Tây Ban Nha - Tiếng Ả Rập - Tiếng Nga - Dùng micro để nhập dữ liệu - Ngôn ngữ - Buộc đồng bộ dữ liệu - Đăng xuất - - Mặt hàng - Hàng có sẵn Số lượng - Các mặt hàng có sẵn - - Giá trị dương= \"số lượng thiếu\" (số lượng thực tế ít hơn giá trị được tính toán) - - - Giá trị âm= \"đang có trong kho\" (số lượng thực tế nhiều hơn giá trị được tính toán) - - - Chọn Kiểu giao dịch và điền đầy đủ tất cả các trường trước khi bạn có thể tiếp tục - Điền đầy đủ các trường dữ liệu cơ sở trước khi bạn có thể tiếp tục - \n Điền đầy đủ Trường \"Phân bổ đến\" trước khi tiếp tục\n Giao dịch vưa được hoàn thành! - - Giao dịch đã được hủy bỏ - - - %d mặt hàng - - Không tìm thấy mặt hàng nào - Đang tải các mặt hàng trong kho … - Thư điện tử - Mật khẩu - Đặng nhập hoặc đăng ký - Đăng nhập - Xin chào ! - Tên đăng nhập không đúng - Mật khẩu phải có >5 ký tự - Đăng nhập không thành công - Đồng bộ lại - Không thể đăng nhập - Không thể tải tập tin cấu hình - - Mã chương trình Kho lưu trữ chưa được cài trong tập tin cấu hình - - Không thể tải các hoạt động gần đây của bạn Không thể tải danh sách các cơ sở hiện có Không thể tải danh sách các điểm đến hiện có - - Không thể tải phần tử dữ liệu phân bổ - - - Không thể tải phần tử dữ liệu chỉnh sửa - - - Không thể tải phần tử dữ liệu loại bỏ - - Thông tin đồng bộ - Tìm kiếm - Xóa văn bản - Hiển thị bộ chọn ngày - Phân bổ đến - Đồng bộ lần cuối - Thêm thông tin về số lượng - Bỏ mặt hàng - Mũi tên chỉ hướng - Trạng thái hoạt động gần đây - Đóng thông tin hướng dẫn Xác nhận - - Một hoặc nhiều trường bị thiếu trong tập tinh cấu hình - - Chọn ngôn ngữ yêu thích - Khởi động lại sau - Xác nhận Khởi động lại - Đã hủy quét! - - Có một lỗi xuất hiện trong khi đăng xuất. Xin vui lòng thử lại sau. - - Đăng xuất thành công - - Không hợp lệ Số lượng hàng có sẵn không thể vượt quá - - Một kho đang được kiểm tra không thể để trống. Bạn có thể gỡ bỏ các mặt hàng nếu không muốn - Đã được cho phép Quyền bị tự chối @@ -187,21 +75,9 @@ Không chấp nhận đầu vào không phải là số: \"%s\" \n Không chấp nhận đầu vào là số âm: \"%s\"\n - Không thể tải cấu hình OpenID - - Một lỗi không mong muốn đã xuất hiện trong khi đang xác thực bằng OpenID - - Không có kết nối internet Không thể đồng bộ hóa dữ liệu bởi vì không có kết nối internet - - Không thể xác thực bằng tài khoảng ICRC của bạn - - - - Trong trường hợp có vấn đề, \nxin vui lòng liên hệ bàn hướng dẫn ICRC - Có gì đó không đúng. Vui lòng kiểm tra đường dẫn liên kết đến máy chủ, tên đăng nhập, mật khẩu và thử lại. @@ -239,8 +115,6 @@ Có vấn đề với chứng nhận máy chủ. Vui lòng liên hệ với quản lý của bạn. Trang chủ Quay lại - Không có xung đột trong trường trình này - Gửi đi Từ cơ sở Đến cơ sở Kho diff --git a/stock-usecase/src/main/res/values-zh-rCN/strings.xml b/stock-usecase/src/main/res/values-zh-rCN/strings.xml index 1739d270056..799c1caeebb 100644 --- a/stock-usecase/src/main/res/values-zh-rCN/strings.xml +++ b/stock-usecase/src/main/res/values-zh-rCN/strings.xml @@ -1,35 +1,19 @@ Home - 审查 - 设置 放弃 - 登记 用户名 - 口令 - 忘记口令 - 处理 审查 删除 OK 取消 - 语言 - 退出 - - 条目 - 邮件 - 口令 - 注册 - 登记 - 搜索 确认 - 无效 网络错误 出现未知错误。 @@ -63,8 +47,6 @@ 服务器证书有问题。请联系您的管理员。 Home 后退 - 该项目没有冲突。 - 发送 未保存 计数 格式化错误 diff --git a/stock-usecase/src/main/res/values-zh/strings.xml b/stock-usecase/src/main/res/values-zh/strings.xml index e09555bad0b..7cfaadc234f 100644 --- a/stock-usecase/src/main/res/values-zh/strings.xml +++ b/stock-usecase/src/main/res/values-zh/strings.xml @@ -1,178 +1,59 @@ 药房库存管理 首页 - 审查 - 设置 分配 放弃 更正 - 选择交易 - 交易日期 - 近期活动 - 上次同步: - 选择机构设施 - 分发给 - 选择一个 - 服务器: - 登录 - 登录到您的帐户 - 使用红十字国际委员会账户登录 - 仅适用于非红十字国际委员会工作人员 - 仅适用于红十字国际委员会工作人员 用户名 - 口令 - 忘记密码\? - - 正在加载最近的活动… - 您尚未执行任何活动 - 同步元数据… 无法完成元数据同步 - 同步数据… - 无法完成数据同步 - 元数据同步完成! - 同步完成! - 处理 审查 - 扫描条码 - 扫描… 搜索项目 搜索… 删除 取消 - 确认 送货至…… %s - 至 %s - 英语 - 法语 - 西班牙语 - 阿拉伯 - 俄语 - 使用麦克风输入数据 - 语言 - 强制数据同步 - 退出 - - 条目 - 现货 数量 - 可用项目 - - 正值 = \"缺失数量\" ( 实物库存小于计算值 ) - - - 负值 = \"found in stock\" ( 实物库存大于计算值 ) - - - 必须选择交易类型并且必须填写所有字段才能继续 - 必须先填写设施字段,然后才能继续 \\n 必须填写 \"分发至 \"字段后才能继续操作 - \n 必须填写“分发给”字段才能继续\n - \n 您确定要返回上一屏幕吗?\n 如果您决定继续,您将丢失刚刚输入的数据。\n 交易成功完成! - - 交易取消成功! - - \n 您确定要强制同步吗?\n - 您确定要退出吗? - - \\n 您确定要永久删除更正“%1$s”\的条目吗?\\n 此操作无法撤消。\\n - \\n 您确定要永久删除“%1$s”\ 的分发条目吗?\\n 此操作无法撤消。\\n - \\n 您确定要永久删除“%1$s”\的丢弃条目吗?\\n 此操作无法撤消。\\n - - - %d 项目 - - 未找到任何项目 - 加载库存项目 … - 邮件 - 口令 - 登录或注册 - 登录 - 欢迎 ! - 不是有效的用户名 - 密码必须大于 5 个字符 - 登录失败 - 重新同步 - 无法登入 - 无法加载配置文件 - - 配置文件中没有设置股票节目id - - 无法加载您最近的活动 无法加载可用设施列表 无法加载可用目的地列表 - - 无法加载分布数据元素 - - - 无法加载校正数据元素 - - 无法加载丢弃的数据元素 - 同步信息 - 搜索 - 明文 - 显示日期选择器 - 分发给 - 上次同步 - 有关数量的更多信息 - 除去项目 - 方向箭头 - 近期活动状态 - 关闭信息指南 确认 - - 配置文件中缺少一个或多个必填字段 - - 选择您想要的语言 - 稍后重启 - \n 需要重新启动应用程序才能使更改生效,但是,\n 任何未保存的更改都将丢失。\n\n您要继续重启\吗?\n - 确认重启 - 扫描已取消! - - 注销期间发生错误。请稍后再试。 - - 成功登出 - - 无效 手头的可用库存不能超过 - - 审核中的股票不能为空。如果不需要,您可以删除该项目 - 许可授予 没有权限 @@ -195,21 +76,9 @@ 不允许非数字输入:“%s” \n 不允许输入负数:“%s”\n - 无法加载 OpenID 配置 - - 使用 OpenID 进行身份验证时发生意外错误 - - 没有可用的网络连接 无法同步数据,因为没有可用的网络连接 - - 无法使用您的红十字国际委员会账户进行身份验证 - - - - 如有问题,\n请联系红十字国际委员会服务台 - 出了些问题。请检查服务器 URL、用户名和密码是否正确,然后重试。 @@ -247,8 +116,6 @@ 服务器证书有问题。请联系您的管理员。 首页 后退 - 该项目没有冲突。 - 发送 从设施 到设施 库存 diff --git a/stock-usecase/src/main/res/values/strings.xml b/stock-usecase/src/main/res/values/strings.xml index 67f97da9f9e..692c739076f 100644 --- a/stock-usecase/src/main/res/values/strings.xml +++ b/stock-usecase/src/main/res/values/strings.xml @@ -1,216 +1,69 @@ Pharmacy Stock Management Home - Review - Settings Distribution Discard Correction - Select transaction - Date of Transaction - Recent Activity - Last synced: - Select Facility - Distributed to - Select one - Server: - Sign in - Sign in to your account - Sign in with ICRC account - For non-ICRC staff members only - For ICRC staff members only Username - Password - Forgot password? - - Loading recent activities… - You are yet to perform any activity - Syncing metadata… Unable to complete metadata sync - Syncing data… - Unable to complete data sync - Metadata sync completed! - Syncing completed! - Proceed Review - Scan barcode - Scanning… Search item Search… Delete OK Cancel - Confirmation From Delivery to… %s - To %s - English - French - Spanish - Arabic - Russian - Use microphone for data entry - Language - Force data synchronization - Logout - - Item - Stock on hand Quantity - items available - - Positive value = \"missing quantity\" (physical stock less than the calculated value) - - - Negative value = \"found in stock\" (physical stock is more than the calculated value) - - - A transaction type must be selected and all fields must be filled before you can proceed - The facility field must be filled before you can proceed The \"Distributed to\" field must be filled before you can proceed - - The \"Distributed to\" field must be filled before you can proceed - - - Are you sure you want to go back to the previous screen? - You will lose the data just entered if you decide to proceed. - The transaction was successfully completed! - - The transaction was successfully cancelled! - - - Are you sure you want to force synchronization? - - Are you sure you want to log out? - - - Are you sure you want to permanently delete the entry for the correction of \"%1$s\"? - This action cannot be undone. - - - Are you sure you want to permanently delete the entry for the distribution of \"%1$s\"? - This action cannot be undone. - - - Are you sure you want to permanently delete the entry for the discard of \"%1$s\"? - This action cannot be undone. - - - - %d item - %d items - - No items found - Loading stock items … - Email - Password - Sign in or register - Sign in - Welcome ! - Not a valid username - Password must be >5 characters - Login failed - Resync - Unable to login - Unable to load configuration file - - Stock program id has not been set in the configuration file - - Unable to load your recent activities Unable to load the list of available facilities Unable to load the list of available destinations - - Unable to load the distribution data element - - - Unable to load correction data element - - - Unable to load discard data element - - Sync information - Search - Clear text - Show date picker - Distributed to - Last Synced - More information on quantity - Remove item - Directional arrow - Recent activity status - Close information guide Confirm - - One or more required fields are missing in the configuration file - - Select your desired language - logged_in_user language_preference - logout - force_sync use_mic en - Restart Later - - The application needs to be restarted for the changes to be effected, however, - any unsaved changes will be lost.\n\nWill you like to proceed with the restart? - - Confirm Restart - Scan cancelled! - - An error occurred during logout. Please try again later. - - Successfully logged out - - Invalid Available stock on hand cannot be exceeded - - A stock under review cannot be empty. You can remove the item if not desired - Permission Granted Permission Denied - en - Splash screen image - Insufficient permissions. Request android.permission.RECORD_AUDIO @@ -231,21 +84,9 @@ Negative number input is not allowed: \"%s\" - Unable to load OpenID configuration - - An unexpected error occurred while authenticating with OpenID - - No network connection available Unable to synchronize data because there is no network connection available - - Unable to authenticate with your ICRC account - - - - In case of problems, \nplease contact ICRC service desk - Something went wrong. Please check that server URL, username and password are correct and try again. @@ -283,8 +124,6 @@ There is a problem with the server certificates. Please, contact your administrator. Home Back - There are no conflicts for this program - Send From facility To facility Stock diff --git a/tracker/src/commonMain/composeResources/values/strings.xml b/tracker/src/commonMain/composeResources/values/strings.xml index 42c4e967930..bacd371734f 100644 --- a/tracker/src/commonMain/composeResources/values/strings.xml +++ b/tracker/src/commonMain/composeResources/values/strings.xml @@ -20,7 +20,6 @@ Optional Launch Exact matches only - Matches any part of the value Must match the start of the value Must match the end of the value yes From c88892fe479baad488768b585b0383027c97783a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 14:21:19 +0100 Subject: [PATCH 109/260] deps: bump the gradle-updates group across 1 directory with 15 updates (#4735) * deps: bump the gradle-updates group across 1 directory with 15 updates Bumps the gradle-updates group with 15 updates in the / directory: | Package | From | To | | --- | --- | --- | | [org.jetbrains.kotlin:kotlin-gradle-plugin](https://github.com/JetBrains/kotlin) | `2.3.10` | `2.3.20` | | [org.jetbrains.kotlin:kotlin-serialization](https://github.com/JetBrains/kotlin) | `2.3.10` | `2.3.20` | | [org.jetbrains.kotlin.multiplatform](https://github.com/JetBrains/kotlin) | `2.3.10` | `2.3.20` | | [org.jetbrains.kotlin.plugin.compose](https://github.com/JetBrains/kotlin) | `2.3.10` | `2.3.20` | | androidx.compose.material:material | `1.10.4` | `1.10.5` | | androidx.compose.ui:ui | `1.10.4` | `1.10.5` | | androidx.compose.runtime:runtime-livedata | `1.10.4` | `1.10.5` | | androidx.compose.ui:ui-tooling | `1.10.4` | `1.10.5` | | androidx.compose.ui:ui-tooling-preview | `1.10.4` | `1.10.5` | | androidx.compose.ui:ui-test-junit4 | `1.10.4` | `1.10.5` | | androidx.compose.ui:ui-test-manifest | `1.10.4` | `1.10.5` | | androidx.compose.ui:ui-test-junit4-android | `1.10.4` | `1.10.5` | | androidx.paging:paging-compose | `3.4.1` | `3.4.2` | | androidx.paging:paging-testing | `3.4.1` | `3.4.2` | | [joda-time:joda-time](https://github.com/JodaOrg/joda-time) | `2.14.0` | `2.14.1` | Updates `org.jetbrains.kotlin:kotlin-gradle-plugin` from 2.3.10 to 2.3.20 - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/v2.3.20/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v2.3.10...v2.3.20) Updates `org.jetbrains.kotlin:kotlin-serialization` from 2.3.10 to 2.3.20 - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/v2.3.20/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v2.3.10...v2.3.20) Updates `org.jetbrains.kotlin.multiplatform` from 2.3.10 to 2.3.20 - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/v2.3.20/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v2.3.10...v2.3.20) Updates `org.jetbrains.kotlin.plugin.compose` from 2.3.10 to 2.3.20 - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/v2.3.20/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v2.3.10...v2.3.20) Updates `org.jetbrains.kotlin:kotlin-serialization` from 2.3.10 to 2.3.20 - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/v2.3.20/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v2.3.10...v2.3.20) Updates `androidx.compose.material:material` from 1.10.4 to 1.10.5 Updates `androidx.compose.ui:ui` from 1.10.4 to 1.10.5 Updates `androidx.compose.runtime:runtime-livedata` from 1.10.4 to 1.10.5 Updates `androidx.compose.ui:ui-tooling` from 1.10.4 to 1.10.5 Updates `androidx.compose.ui:ui-tooling-preview` from 1.10.4 to 1.10.5 Updates `androidx.compose.ui:ui-test-junit4` from 1.10.4 to 1.10.5 Updates `androidx.compose.ui:ui-test-manifest` from 1.10.4 to 1.10.5 Updates `androidx.compose.ui:ui-test-junit4-android` from 1.10.4 to 1.10.5 Updates `androidx.compose.ui:ui` from 1.10.4 to 1.10.5 Updates `androidx.compose.runtime:runtime-livedata` from 1.10.4 to 1.10.5 Updates `androidx.compose.ui:ui-tooling` from 1.10.4 to 1.10.5 Updates `androidx.compose.ui:ui-tooling-preview` from 1.10.4 to 1.10.5 Updates `androidx.paging:paging-compose` from 3.4.1 to 3.4.2 Updates `androidx.paging:paging-testing` from 3.4.1 to 3.4.2 Updates `joda-time:joda-time` from 2.14.0 to 2.14.1 - [Release notes](https://github.com/JodaOrg/joda-time/releases) - [Changelog](https://github.com/JodaOrg/joda-time/blob/main/RELEASE-NOTES.txt) - [Commits](https://github.com/JodaOrg/joda-time/compare/v2.14.0...v2.14.1) Updates `androidx.compose.ui:ui-test-junit4` from 1.10.4 to 1.10.5 Updates `androidx.compose.ui:ui-test-manifest` from 1.10.4 to 1.10.5 Updates `androidx.compose.ui:ui-test-junit4-android` from 1.10.4 to 1.10.5 Updates `org.jetbrains.kotlin.multiplatform` from 2.3.10 to 2.3.20 - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/v2.3.20/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v2.3.10...v2.3.20) Updates `org.jetbrains.kotlin.plugin.compose` from 2.3.10 to 2.3.20 - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/v2.3.20/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v2.3.10...v2.3.20) --- updated-dependencies: - dependency-name: org.jetbrains.kotlin:kotlin-gradle-plugin dependency-version: 2.3.20 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: org.jetbrains.kotlin:kotlin-serialization dependency-version: 2.3.20 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: org.jetbrains.kotlin.multiplatform dependency-version: 2.3.20 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: org.jetbrains.kotlin.plugin.compose dependency-version: 2.3.20 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: org.jetbrains.kotlin:kotlin-serialization dependency-version: 2.3.20 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.material:material dependency-version: 1.10.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui dependency-version: 1.10.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.runtime:runtime-livedata dependency-version: 1.10.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-tooling dependency-version: 1.10.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-tooling-preview dependency-version: 1.10.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-test-junit4 dependency-version: 1.10.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-test-manifest dependency-version: 1.10.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-test-junit4-android dependency-version: 1.10.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui dependency-version: 1.10.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.runtime:runtime-livedata dependency-version: 1.10.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-tooling dependency-version: 1.10.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-tooling-preview dependency-version: 1.10.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.paging:paging-compose dependency-version: 3.4.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.paging:paging-testing dependency-version: 3.4.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: joda-time:joda-time dependency-version: 2.14.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-test-junit4 dependency-version: 1.10.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-test-manifest dependency-version: 1.10.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-test-junit4-android dependency-version: 1.10.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: org.jetbrains.kotlin.multiplatform dependency-version: 2.3.20 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: org.jetbrains.kotlin.plugin.compose dependency-version: 2.3.20 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates ... Signed-off-by: dependabot[bot] * build: gradle verification metadata * fix: update verification-metadata.xml --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: andresmr --- gradle/libs.versions.toml | 10 +- gradle/verification-metadata.xml | 781 +++++++++++++++++++++++++++++++ 2 files changed, 786 insertions(+), 5 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2bb4f07c4cb..179c3619f86 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,7 +7,7 @@ minSdk = "23" vCode = "151" vName = "3.4.1-Dev" gradle = "9.0.1" -kotlin = '2.3.10' +kotlin = '2.3.20' dagger = '2.57.2' jacoco = '0.8.14' designSystem = "0.7.1-SNAPSHOT" @@ -26,10 +26,10 @@ exif = "1.4.2" corektx = "1.17.0" fragmentktx = "1.8.9" recyclerview = "1.4.0" -compose = "1.10.4" +compose = "1.10.5" composePluginVersion = "1.10.2" -composePaging = "3.4.1" -pagingTesting = "3.4.1" +composePaging = "3.4.2" +pagingTesting = "3.4.2" composeConstraintLayout = "1.1.1" activityCompose = "1.11.0" viewModelCompose = "2.9.4" @@ -55,7 +55,7 @@ openid = "0.11.1" conscrypt = "2.5.3" gson = "2.13.2" okhttp = "4.12.0" -jodatime = "2.14.0" +jodatime = "2.14.1" glide = "5.0.5" guava = "33.5.0-android" mockito = "5.20.0" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 3480978da21..4f4d96f9ce2 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -567,6 +567,11 @@ + + + + + @@ -648,6 +653,14 @@ + + + + + + + + @@ -713,6 +726,11 @@ + + + + + @@ -784,6 +802,14 @@ + + + + + + + + @@ -849,6 +875,11 @@ + + + + + @@ -935,6 +966,14 @@ + + + + + + + + @@ -961,6 +1000,11 @@ + + + + + @@ -1005,6 +1049,11 @@ + + + + + @@ -1081,6 +1130,14 @@ + + + + + + + + @@ -1147,6 +1204,11 @@ + + + + + @@ -1181,6 +1243,14 @@ + + + + + + + + @@ -1419,6 +1489,14 @@ + + + + + + + + @@ -1488,6 +1566,14 @@ + + + + + + + + @@ -1538,6 +1624,14 @@ + + + + + + + + @@ -1594,6 +1688,14 @@ + + + + + + + + @@ -1722,6 +1824,14 @@ + + + + + + + + @@ -1767,6 +1877,14 @@ + + + + + + + + @@ -1791,6 +1909,14 @@ + + + + + + + + @@ -1833,6 +1959,14 @@ + + + + + + + + @@ -1917,6 +2051,14 @@ + + + + + + + + @@ -2014,6 +2156,14 @@ + + + + + + + + @@ -2075,6 +2225,14 @@ + + + + + + + + @@ -2138,6 +2296,14 @@ + + + + + + + + @@ -2209,6 +2375,14 @@ + + + + + + + + @@ -2277,6 +2451,14 @@ + + + + + + + + @@ -2338,6 +2520,14 @@ + + + + + + + + @@ -2393,6 +2583,14 @@ + + + + + + + + @@ -2438,6 +2636,14 @@ + + + + + + + + @@ -2477,6 +2683,11 @@ + + + + + @@ -2522,6 +2733,14 @@ + + + + + + + + @@ -2570,6 +2789,14 @@ + + + + + + + + @@ -2620,6 +2847,14 @@ + + + + + + + + @@ -2686,6 +2921,14 @@ + + + + + + + + @@ -2746,6 +2989,14 @@ + + + + + + + + @@ -2791,6 +3042,14 @@ + + + + + + + + @@ -2833,6 +3092,14 @@ + + + + + + + + @@ -2878,6 +3145,14 @@ + + + + + + + + @@ -2920,6 +3195,14 @@ + + + + + + + + @@ -2965,6 +3248,14 @@ + + + + + + + + @@ -3020,6 +3311,14 @@ + + + + + + + + @@ -3091,6 +3390,14 @@ + + + + + + + + @@ -3151,6 +3458,14 @@ + + + + + + + + @@ -3214,6 +3529,14 @@ + + + + + + + + @@ -5185,6 +5508,14 @@ + + + + + + + + @@ -5217,6 +5548,14 @@ + + + + + + + + @@ -5233,6 +5572,14 @@ + + + + + + + + @@ -5281,6 +5628,14 @@ + + + + + + + + @@ -5305,6 +5660,14 @@ + + + + + + + + @@ -5329,6 +5692,14 @@ + + + + + + + + @@ -5345,6 +5716,14 @@ + + + + + + + + @@ -5385,6 +5764,14 @@ + + + + + + + + @@ -5409,6 +5796,11 @@ + + + + + @@ -5433,6 +5825,14 @@ + + + + + + + + @@ -12129,6 +12529,14 @@ + + + + + + + + @@ -15974,6 +16382,14 @@ + + + + + + + + @@ -15998,6 +16414,14 @@ + + + + + + + + @@ -16014,6 +16438,14 @@ + + + + + + + + @@ -16022,6 +16454,14 @@ + + + + + + + + @@ -16046,6 +16486,14 @@ + + + + + + + + @@ -16070,6 +16518,14 @@ + + + + + + + + @@ -16078,6 +16534,14 @@ + + + + + + + + @@ -16107,6 +16571,14 @@ + + + + + + + + @@ -16131,6 +16603,14 @@ + + + + + + + + @@ -16139,6 +16619,22 @@ + + + + + + + + + + + + + + + + @@ -16155,6 +16651,14 @@ + + + + + + + + @@ -16179,6 +16683,14 @@ + + + + + + + + @@ -16203,6 +16715,14 @@ + + + + + + + + @@ -16219,6 +16739,14 @@ + + + + + + + + @@ -16243,6 +16771,14 @@ + + + + + + + + @@ -16267,6 +16803,14 @@ + + + + + + + + @@ -16291,6 +16835,14 @@ + + + + + + + + @@ -16315,6 +16867,14 @@ + + + + + + + + @@ -16345,6 +16905,14 @@ + + + + + + + + @@ -16369,6 +16937,14 @@ + + + + + + + + @@ -16393,6 +16969,14 @@ + + + + + + + + @@ -16433,6 +17017,14 @@ + + + + + + + + @@ -16441,6 +17033,14 @@ + + + + + + + + @@ -16465,6 +17065,14 @@ + + + + + + + + @@ -16481,6 +17089,14 @@ + + + + + + + + @@ -16513,6 +17129,14 @@ + + + + + + + + @@ -16537,6 +17161,14 @@ + + + + + + + + @@ -16553,6 +17185,14 @@ + + + + + + + + @@ -16577,6 +17217,14 @@ + + + + + + + + @@ -16673,6 +17321,14 @@ + + + + + + + + @@ -16689,6 +17345,14 @@ + + + + + + + + @@ -16705,6 +17369,14 @@ + + + + + + + + @@ -16721,6 +17393,14 @@ + + + + + + + + @@ -16737,6 +17417,14 @@ + + + + + + + + @@ -16753,6 +17441,14 @@ + + + + + + + + @@ -16769,6 +17465,14 @@ + + + + + + + + @@ -16908,6 +17612,17 @@ + + + + + + + + + + + @@ -17020,6 +17735,11 @@ + + + + + @@ -17265,6 +17985,17 @@ + + + + + + + + + + + @@ -17281,6 +18012,14 @@ + + + + + + + + @@ -17305,6 +18044,14 @@ + + + + + + + + @@ -17329,6 +18076,14 @@ + + + + + + + + @@ -17353,6 +18108,14 @@ + + + + + + + + @@ -17377,6 +18140,14 @@ + + + + + + + + @@ -17390,6 +18161,11 @@ + + + + + @@ -17400,6 +18176,11 @@ + + + + + From 4176f20d0f99ec9b78b59d6954a9f033a2cbf521 Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Thu, 19 Mar 2026 15:22:45 +0100 Subject: [PATCH 110/260] fix(translations): sync translations from transifex (develop) (#4745) * fix(translations): sync translations from transifex (develop) WARNING: This automated sync from transifex removed more lines than it added. Please check carefully before merging! * fix(translations): cleanup string resource formatting and unescape question marks in multiple languages --------- Co-authored-by: andresmr --- .../composeResources/values-es/strings.xml | 2 +- .../composeResources/values-hi-rIN/strings.xml | 1 + commons/src/main/res/values-ar/strings.xml | 1 - commons/src/main/res/values-es-rES/strings.xml | 1 - commons/src/main/res/values-fr/strings.xml | 1 - commons/src/main/res/values-id/strings.xml | 1 - commons/src/main/res/values-km/strings.xml | 1 - commons/src/main/res/values-lo/strings.xml | 1 - commons/src/main/res/values-nb/strings.xml | 1 - commons/src/main/res/values-nl/strings.xml | 1 - commons/src/main/res/values-pt/strings.xml | 1 - commons/src/main/res/values-sv/strings.xml | 4 ++-- commons/src/main/res/values-uk/strings.xml | 1 - commons/src/main/res/values-uz-rUZ/strings.xml | 1 - commons/src/main/res/values-uz/strings.xml | 1 - commons/src/main/res/values-vi/strings.xml | 1 - .../composeResources/values-bn/strings.xml | 4 ---- .../composeResources/values-cs/strings.xml | 2 +- .../composeResources/values-si/strings.xml | 4 ---- form/src/main/res/values-cs/strings.xml | 1 - form/src/main/res/values-en-rUS/strings.xml | 1 - form/src/main/res/values-es-rES/strings.xml | 1 - form/src/main/res/values-es/strings.xml | 1 - form/src/main/res/values-fr/strings.xml | 1 - form/src/main/res/values-lo/strings.xml | 1 - form/src/main/res/values-nl/strings.xml | 1 - form/src/main/res/values-pt/strings.xml | 1 - form/src/main/res/values-ru/strings.xml | 1 - form/src/main/res/values-uk/strings.xml | 1 - form/src/main/res/values-vi/strings.xml | 1 - form/src/main/res/values-zh-rCN/strings.xml | 1 - form/src/main/res/values-zh/strings.xml | 1 - .../composeResources/values-fr/strings.xml | 12 ++++++------ .../composeResources/values-hi-rIN/strings.xml | 2 +- .../composeResources/values-nl/strings.xml | 6 +++--- .../composeResources/values-vi/strings.xml | 4 ++-- stock-usecase/src/main/res/values-da/strings.xml | 4 +++- stock-usecase/src/main/res/values-or/strings.xml | 1 + 38 files changed, 21 insertions(+), 51 deletions(-) diff --git a/aggregates/src/commonMain/composeResources/values-es/strings.xml b/aggregates/src/commonMain/composeResources/values-es/strings.xml index ffbbe42bc21..3f4f8932e27 100644 --- a/aggregates/src/commonMain/composeResources/values-es/strings.xml +++ b/aggregates/src/commonMain/composeResources/values-es/strings.xml @@ -26,7 +26,7 @@ Aceptar ¡Guardado y completado! Ha ocurrido un error al completar el conjunto de datos - ¿Quiere validar la calidad de los datos? + ¿Quieree validar la calidad de los datos? No Error diff --git a/aggregates/src/commonMain/composeResources/values-hi-rIN/strings.xml b/aggregates/src/commonMain/composeResources/values-hi-rIN/strings.xml index cd9dbf45529..4ac6537b450 100644 --- a/aggregates/src/commonMain/composeResources/values-hi-rIN/strings.xml +++ b/aggregates/src/commonMain/composeResources/values-hi-rIN/strings.xml @@ -70,6 +70,7 @@ %2$s is the attribute option combo name --> आप %2$s में पीरियड %1$s के लिए डेटा संपादित नहीं कर सकते + यह डेटा संपादन योग्य नहीं है क्योंकि चुनी गई अवधि डेटा इनपुट अवधि के बाहर है यह डेटा संपादन योग्य नहीं है क्योंकि इसे क्लोज़ मार्क किया गया है यह डेटा संपादन योग्य नहीं है क्योंकि संपादन का समय समाप्त हो गया है diff --git a/commons/src/main/res/values-ar/strings.xml b/commons/src/main/res/values-ar/strings.xml index 7344a2b8e1d..24fd62e1b7f 100644 --- a/commons/src/main/res/values-ar/strings.xml +++ b/commons/src/main/res/values-ar/strings.xml @@ -224,7 +224,6 @@ مسجل في: حذف %s الأسابيع %d %s إلى %s - إعادة محاولة المزامنة مزامنة... إزلة diff --git a/commons/src/main/res/values-es-rES/strings.xml b/commons/src/main/res/values-es-rES/strings.xml index 6856c124efc..632edc9d7a9 100644 --- a/commons/src/main/res/values-es-rES/strings.xml +++ b/commons/src/main/res/values-es-rES/strings.xml @@ -202,7 +202,6 @@ Inscrito en: Eliminar %s Semana %d %s a %s - Sincronizando... Eliminar Diario diff --git a/commons/src/main/res/values-fr/strings.xml b/commons/src/main/res/values-fr/strings.xml index e6f74d572d4..a8980102e90 100644 --- a/commons/src/main/res/values-fr/strings.xml +++ b/commons/src/main/res/values-fr/strings.xml @@ -196,7 +196,6 @@ Inscrire à: Supprimer 1%s Semaine %d %s à %s - Réessayer la synchronisation Synchronisation... Supprimer diff --git a/commons/src/main/res/values-id/strings.xml b/commons/src/main/res/values-id/strings.xml index 5bd3ae1e942..3520c397002 100644 --- a/commons/src/main/res/values-id/strings.xml +++ b/commons/src/main/res/values-id/strings.xml @@ -134,7 +134,6 @@ Hapus perubahan Hari ini Minggu %d %s hingga %s - Sedang sinkronisasi... Hapus Harian diff --git a/commons/src/main/res/values-km/strings.xml b/commons/src/main/res/values-km/strings.xml index bc28b3ae5ec..f534228c85d 100644 --- a/commons/src/main/res/values-km/strings.xml +++ b/commons/src/main/res/values-km/strings.xml @@ -75,7 +75,6 @@ បញ្ចប់ លុបការកែប្រែ ថ្ងៃនេះ - លុបចេញ រាល់​ថ្ងៃ ឆ្នាំ diff --git a/commons/src/main/res/values-lo/strings.xml b/commons/src/main/res/values-lo/strings.xml index 0be681c83eb..11cd8ae776d 100644 --- a/commons/src/main/res/values-lo/strings.xml +++ b/commons/src/main/res/values-lo/strings.xml @@ -208,7 +208,6 @@ ລົງທະບຽນໃນ: ລົບ%s ອາທິດ%d%sຫາ%s - ກຳລັງຊິ້ງຂໍ້ມູນ ລົບອອກ ທຸກໆມື້ diff --git a/commons/src/main/res/values-nb/strings.xml b/commons/src/main/res/values-nb/strings.xml index 7d0d5afef70..1b7a926bfb5 100644 --- a/commons/src/main/res/values-nb/strings.xml +++ b/commons/src/main/res/values-nb/strings.xml @@ -133,7 +133,6 @@ Fullfør Forkast endringer I dag - Synkroniserer... Fjern Daglig diff --git a/commons/src/main/res/values-nl/strings.xml b/commons/src/main/res/values-nl/strings.xml index 21d01d219ff..57d5aa8fc73 100644 --- a/commons/src/main/res/values-nl/strings.xml +++ b/commons/src/main/res/values-nl/strings.xml @@ -211,7 +211,6 @@ Ingeschreven in: Verwijder %s Week %d %s tot %s - Synchroniseren... Verwijderen Dagelijks diff --git a/commons/src/main/res/values-pt/strings.xml b/commons/src/main/res/values-pt/strings.xml index badb83d96bc..1d4f58714ce 100644 --- a/commons/src/main/res/values-pt/strings.xml +++ b/commons/src/main/res/values-pt/strings.xml @@ -249,7 +249,6 @@ Novo %s Apagar%s Semana %d %s a%s - Repetir a sincronização Sincronizando... Remover diff --git a/commons/src/main/res/values-sv/strings.xml b/commons/src/main/res/values-sv/strings.xml index b8942ffd9ea..1d90835c3d3 100644 --- a/commons/src/main/res/values-sv/strings.xml +++ b/commons/src/main/res/values-sv/strings.xml @@ -66,9 +66,9 @@ Fortsätt redigera Färdigt Ignorera ändringar - Ta bort Dagligen År Rensa alla - + + diff --git a/commons/src/main/res/values-uk/strings.xml b/commons/src/main/res/values-uk/strings.xml index eabd11013ea..b82b29502ef 100644 --- a/commons/src/main/res/values-uk/strings.xml +++ b/commons/src/main/res/values-uk/strings.xml @@ -246,7 +246,6 @@ %s успішно видалено Ви впевнені, що хочете видалити %s? Тиждень %d %s до %s - Синхронізація... Видалити Щодня diff --git a/commons/src/main/res/values-uz-rUZ/strings.xml b/commons/src/main/res/values-uz-rUZ/strings.xml index 8dafcecf13c..1aa348770d0 100644 --- a/commons/src/main/res/values-uz-rUZ/strings.xml +++ b/commons/src/main/res/values-uz-rUZ/strings.xml @@ -120,7 +120,6 @@ Bajarildi Oʼzgartirishlar bekor qilinsin бугун - Sinxronizatsiyalanmoqda... Олиб ташлаш Кунлик diff --git a/commons/src/main/res/values-uz/strings.xml b/commons/src/main/res/values-uz/strings.xml index 262c9c8ba70..971dfe7ab20 100644 --- a/commons/src/main/res/values-uz/strings.xml +++ b/commons/src/main/res/values-uz/strings.xml @@ -145,7 +145,6 @@ Ўзгартиришлар бекор қилинсин Бугун Қайд этилган: - Синхронизацияланмоқда... Олиб ташлаш Кунлик diff --git a/commons/src/main/res/values-vi/strings.xml b/commons/src/main/res/values-vi/strings.xml index f8fd17c3bc1..3cd9b32dfdb 100644 --- a/commons/src/main/res/values-vi/strings.xml +++ b/commons/src/main/res/values-vi/strings.xml @@ -245,7 +245,6 @@ %s ngày Xóa %s Tuần %d %s đến %s - Đồng bộ lại Đang đồng bộ... Xóa diff --git a/commonskmm/src/commonMain/composeResources/values-bn/strings.xml b/commonskmm/src/commonMain/composeResources/values-bn/strings.xml index 362b63464d3..6edef692700 100644 --- a/commonskmm/src/commonMain/composeResources/values-bn/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-bn/strings.xml @@ -3,8 +3,4 @@ অবশ্যই সংখ্যা হতে হবে ভুল নির্ধারিত তারিখ - - \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-cs/strings.xml b/commonskmm/src/commonMain/composeResources/values-cs/strings.xml index 57227c61353..7fd09a3492a 100644 --- a/commonskmm/src/commonMain/composeResources/values-cs/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-cs/strings.xml @@ -23,7 +23,7 @@ Hodnota pole %s nepatří do možnosti nastavené v položce %s Toto pole je povinné Máte několik varovných hlášení. - Máte několik varovných hlášení.\nChcete tento formulář označit jako dokončený? + Máte několik varovných hlášení.\nChcete tento formulář označit jako dokončený\? Vyžadováno Polygon Zeměpisná šířka diff --git a/commonskmm/src/commonMain/composeResources/values-si/strings.xml b/commonskmm/src/commonMain/composeResources/values-si/strings.xml index 804b0a9d6db..21aa1406a9e 100644 --- a/commonskmm/src/commonMain/composeResources/values-si/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-si/strings.xml @@ -7,8 +7,4 @@ හෝ පිළිගන්න නිම කළා - - \ No newline at end of file diff --git a/form/src/main/res/values-cs/strings.xml b/form/src/main/res/values-cs/strings.xml index d6f580ce04d..c719bae0f7b 100644 --- a/form/src/main/res/values-cs/strings.xml +++ b/form/src/main/res/values-cs/strings.xml @@ -45,7 +45,6 @@ Sdílet Povolení fotoaparátu bylo odepřeno.\nPro použití této funkce je nutné ji povolit. Zavřít - Došlo k problému s konfigurací, který způsobuje smyčku v pravidlech. Kontaktujte svého správce. Zkopírováno Vyfotit Z galerie diff --git a/form/src/main/res/values-en-rUS/strings.xml b/form/src/main/res/values-en-rUS/strings.xml index 0837bb97812..5b2f6596932 100644 --- a/form/src/main/res/values-en-rUS/strings.xml +++ b/form/src/main/res/values-en-rUS/strings.xml @@ -39,7 +39,6 @@ If you exit now all the information in the form will be discarded. Share Close - There is a configuration issue causing a loop in the rules. Contact you administrator. Copied Take Photo From gallery diff --git a/form/src/main/res/values-es-rES/strings.xml b/form/src/main/res/values-es-rES/strings.xml index ac397143b57..cce4e795e3f 100644 --- a/form/src/main/res/values-es-rES/strings.xml +++ b/form/src/main/res/values-es-rES/strings.xml @@ -43,7 +43,6 @@ Compartir El permiso de la cámara está denegado.\nDebe habilitarlo para usar esta función. Cerrar - Hay un problema de configuración que provoca un bucle en las reglas. Póngase en contacto con su administrador. Copiado Tomar foto ¡Importante! diff --git a/form/src/main/res/values-es/strings.xml b/form/src/main/res/values-es/strings.xml index b18ae56fb2f..678c1ec5fdb 100644 --- a/form/src/main/res/values-es/strings.xml +++ b/form/src/main/res/values-es/strings.xml @@ -45,7 +45,6 @@ Compartir El permiso de la cámara está denegado.\nDebe habilitarlo para usar esta función. Cerrar - Hay un problema de configuración que provoca un bucle en las reglas. Póngase en contacto con su administrador. Copiado Tomar foto Desde la galería diff --git a/form/src/main/res/values-fr/strings.xml b/form/src/main/res/values-fr/strings.xml index ce08a65930a..83ae4aeb30a 100644 --- a/form/src/main/res/values-fr/strings.xml +++ b/form/src/main/res/values-fr/strings.xml @@ -45,7 +45,6 @@ Partager L\'autorisation de la caméra est refusée. \nVous devez l\'activer pour utiliser cette fonctionnalité. Fermer - Il y a un problème de configuration provoquant une boucle dans les règles. Contactez votre administrateur. Copié Prendre une photo Attention. Vérifiez ceci! diff --git a/form/src/main/res/values-lo/strings.xml b/form/src/main/res/values-lo/strings.xml index 63fb1ce0768..31475d85cab 100644 --- a/form/src/main/res/values-lo/strings.xml +++ b/form/src/main/res/values-lo/strings.xml @@ -42,7 +42,6 @@ ເຜີຍແຜ່ ການ​ອະ​ນຸ​ຍາດ​ໃຊ້ກ້ອງ​ຖ່າຍ​ຮູບ​ຖືກ​ປະ​ຕິ​ເສດ. ທ່ານ​​ຕ້ອງ​ເປີດ​ໃຊ້​ງານເພື່ອ​ໃຊ້​ຄຸນ​ສົມ​ບັດ​ນີ້​. ປິດ - ມີບັນຫາການກຳນົດຄ່າທີ່ເຮັດໃຫ້ເກີດມີຊ່ອງຫວ່າງໃນກົດລະບຽບ. ຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ. ສຳເນົາແລ້ວ ຖ່າຍຮູບ ກວດເບີ່ງອັນນີ້ diff --git a/form/src/main/res/values-nl/strings.xml b/form/src/main/res/values-nl/strings.xml index 65fb7caa283..a31ea8e544e 100644 --- a/form/src/main/res/values-nl/strings.xml +++ b/form/src/main/res/values-nl/strings.xml @@ -44,7 +44,6 @@ Deel Cameratoestemming is geweigerd.\Je moet deze inschakelen om deze functie te gebruiken. Sluit - Er is een configuratieprobleem dat een lus in de regels veroorzaakt. Neem contact op met uw beheerder. Gekopieerd Neem foto Check dit! diff --git a/form/src/main/res/values-pt/strings.xml b/form/src/main/res/values-pt/strings.xml index 141cf521ce2..1a427a2b4c5 100644 --- a/form/src/main/res/values-pt/strings.xml +++ b/form/src/main/res/values-pt/strings.xml @@ -45,7 +45,6 @@ Partilha A permissão da câmara foi negada. \Necessita de ativá-la para usar este recurso. Fechar - Existe um problema de configuração que está a provocar um ciclo nas regras. Contacte o seu administrador. Copiado Tirar fotografia Verifique isso! diff --git a/form/src/main/res/values-ru/strings.xml b/form/src/main/res/values-ru/strings.xml index 97851af3ab0..e9438740eea 100644 --- a/form/src/main/res/values-ru/strings.xml +++ b/form/src/main/res/values-ru/strings.xml @@ -44,7 +44,6 @@ Поделиться Разрешение камеры отклонено. Для использования этой функции необходимо включить ее. Закрыть - Существует проблема конфигурации, вызывающая зацикливание правил. Обратитесь к администратору. Скопировано Сделать фото Из галереи diff --git a/form/src/main/res/values-uk/strings.xml b/form/src/main/res/values-uk/strings.xml index 44f017046d6..f51c0371b50 100644 --- a/form/src/main/res/values-uk/strings.xml +++ b/form/src/main/res/values-uk/strings.xml @@ -44,7 +44,6 @@ Поділитися Відмовлено у використанні камери. Вам потрібно ввімкнути цей дозвіл, щоб використовувати цю функцію. Закрити - Існує проблема конфігурації, яка спричиняє помилку у правилах. Зверніться до адміністратора. Скопійовано Зробити фото Перевірте це! diff --git a/form/src/main/res/values-vi/strings.xml b/form/src/main/res/values-vi/strings.xml index 026a6a2daa6..204cba9093f 100644 --- a/form/src/main/res/values-vi/strings.xml +++ b/form/src/main/res/values-vi/strings.xml @@ -45,7 +45,6 @@ Chia sẻ Quyền mở máy ảnh bị từ chối.\n Bạn cần bật tính năng máy ảnh để sử dụng chức năng này Đóng - Có một vấn đề cấu hình gây ra một vòng lặp trong các quy tắc chương trình. Hãy liên lạc với quản lý của bạn. Đã sao chép Chụp ảnh Từ thư viện ảnh diff --git a/form/src/main/res/values-zh-rCN/strings.xml b/form/src/main/res/values-zh-rCN/strings.xml index cc381f8ce76..f098363e5c8 100644 --- a/form/src/main/res/values-zh-rCN/strings.xml +++ b/form/src/main/res/values-zh-rCN/strings.xml @@ -45,7 +45,6 @@ 分享 相机权限被拒绝。\n 您需要启用它才能使用此功能。 关闭 - 存在导致规则循环的配置问题。联系您的管理员。 副本 拍照 来自画廊 diff --git a/form/src/main/res/values-zh/strings.xml b/form/src/main/res/values-zh/strings.xml index 0398619d7a9..2fa43cc6fdc 100644 --- a/form/src/main/res/values-zh/strings.xml +++ b/form/src/main/res/values-zh/strings.xml @@ -45,7 +45,6 @@ 分享 相机权限被拒绝。\n 您需要启用它才能使用此功能。 关闭 - 存在导致规则循环的配置问题。联系您的管理员。 副本 拍照 来自画廊 diff --git a/login/src/commonMain/composeResources/values-fr/strings.xml b/login/src/commonMain/composeResources/values-fr/strings.xml index 8e390a702d6..cc907b0b6a4 100644 --- a/login/src/commonMain/composeResources/values-fr/strings.xml +++ b/login/src/commonMain/composeResources/values-fr/strings.xml @@ -1,11 +1,11 @@ - + Authentification à deux facteurs - Code d'authentification + Code d\'authentification Suivant - L'authentification à deux facteurs est activée. - Voudriez-vous utiliser l'empreinte digitale ou autre méthode biométrique pour se connecter - Nom d'utilisateur + L\'authentification à deux facteurs est activée. + Voudriez-vous utiliser l\'empreinte digitale ou autre méthode biométrique pour se connecter + Nom d\'utilisateur Mot de passe En cours de connection... Se connecter @@ -15,4 +15,4 @@ Pas maintenant Oui Déverrouiller - \ No newline at end of file + \ No newline at end of file diff --git a/login/src/commonMain/composeResources/values-hi-rIN/strings.xml b/login/src/commonMain/composeResources/values-hi-rIN/strings.xml index 4487ecfa858..8f7f33d0552 100644 --- a/login/src/commonMain/composeResources/values-hi-rIN/strings.xml +++ b/login/src/commonMain/composeResources/values-hi-rIN/strings.xml @@ -1,4 +1,4 @@ - + ऑथेंटिकेशन कोड आगे diff --git a/login/src/commonMain/composeResources/values-nl/strings.xml b/login/src/commonMain/composeResources/values-nl/strings.xml index 187813f251b..4bf13cf6ba2 100644 --- a/login/src/commonMain/composeResources/values-nl/strings.xml +++ b/login/src/commonMain/composeResources/values-nl/strings.xml @@ -1,4 +1,4 @@ - + Twee-factor-authenticatie Authenticatiecode @@ -8,8 +8,8 @@ Wachtwoord Aan het inloggen... Inloggen - Wil je ons helpen deze app te verbeteren? + Wil je ons helpen deze app te verbeteren\? privacybeleid Niet nu Ja - \ No newline at end of file + \ No newline at end of file diff --git a/login/src/commonMain/composeResources/values-vi/strings.xml b/login/src/commonMain/composeResources/values-vi/strings.xml index 433956fecdc..e121c25b9f4 100644 --- a/login/src/commonMain/composeResources/values-vi/strings.xml +++ b/login/src/commonMain/composeResources/values-vi/strings.xml @@ -1,4 +1,4 @@ - + Xác thực hai yếu tố Mã xác thực @@ -17,4 +17,4 @@ Mở khoá Nhập thành công - \ No newline at end of file + \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-da/strings.xml b/stock-usecase/src/main/res/values-da/strings.xml index 3b6f9dd7989..9fbbe5ea726 100644 --- a/stock-usecase/src/main/res/values-da/strings.xml +++ b/stock-usecase/src/main/res/values-da/strings.xml @@ -1,8 +1,10 @@ - + Username + Delete OK Cancel + Back \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-or/strings.xml b/stock-usecase/src/main/res/values-or/strings.xml index 73cd7ef15f9..ea423cc3410 100644 --- a/stock-usecase/src/main/res/values-or/strings.xml +++ b/stock-usecase/src/main/res/values-or/strings.xml @@ -1,5 +1,6 @@ ଗୃହ + ଗୃହ କେବଳ ଧନାତ୍ମକ ସଂଖ୍ୟା କିମ୍ବା ଶୂନ ଅନୁମୋଦିତ \ No newline at end of file From a16c3aa672f97597de12629fdafceb3c0f77962f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Mar 2026 06:56:33 +0100 Subject: [PATCH 111/260] deps: bump the gradle-updates group with 3 updates (#4749) * deps: bump the gradle-updates group with 3 updates Bumps the gradle-updates group with 3 updates: [org.hisp.dhis.rules:rule-engine-jvm](https://github.com/dhis2/dhis2-rule-engine), [com.scottyab:rootbeer-lib](https://github.com/scottyab/rootbeer) and org.jetbrains.compose. Updates `org.hisp.dhis.rules:rule-engine-jvm` from 3.7.0 to 3.7.1 - [Release notes](https://github.com/dhis2/dhis2-rule-engine/releases) - [Commits](https://github.com/dhis2/dhis2-rule-engine/compare/v3.7.0...v3.7.1) Updates `com.scottyab:rootbeer-lib` from 0.1.1 to 0.1.2 - [Release notes](https://github.com/scottyab/rootbeer/releases) - [Commits](https://github.com/scottyab/rootbeer/compare/0.1.1...0.1.2) Updates `org.jetbrains.compose` from 1.10.2 to 1.10.3 --- updated-dependencies: - dependency-name: org.hisp.dhis.rules:rule-engine-jvm dependency-version: 3.7.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: com.scottyab:rootbeer-lib dependency-version: 0.1.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: org.jetbrains.compose dependency-version: 1.10.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates ... Signed-off-by: dependabot[bot] * build: update expressionParser to 1.4.0 and sync verification-metadata.xml --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: andresmr --- gradle/libs.versions.toml | 8 +- gradle/verification-metadata.xml | 410 +++++++++++++++++++++++++++++++ 2 files changed, 414 insertions(+), 4 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 179c3619f86..c4c37370328 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -12,8 +12,8 @@ dagger = '2.57.2' jacoco = '0.8.14' designSystem = "0.7.1-SNAPSHOT" dhis2sdk = "1.14.1-SNAPSHOT" -ruleEngine = "3.7.0" -expressionParser = "1.3.1" +ruleEngine = "3.7.1" +expressionParser = "1.4.0" appcompat = "1.7.1" annotation = "1.9.1" cardview = "1.0.0" @@ -27,7 +27,7 @@ corektx = "1.17.0" fragmentktx = "1.8.9" recyclerview = "1.4.0" compose = "1.10.5" -composePluginVersion = "1.10.2" +composePluginVersion = "1.10.3" composePaging = "3.4.2" pagingTesting = "3.4.2" composeConstraintLayout = "1.1.1" @@ -50,7 +50,7 @@ rxlint = "1.7.8" crashactivity = "2.4.0" zxing = "3.5.4" zxingandroid = "4.3.0" -root = "0.1.1" +root = "0.1.2" openid = "0.11.1" conscrypt = "2.5.3" gson = "2.13.2" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 4f4d96f9ce2..d7f5a96c442 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -1736,6 +1736,14 @@ + + + + + + + + @@ -1776,6 +1784,14 @@ + + + + + + + + @@ -1933,6 +1949,14 @@ + + + + + + + + @@ -2114,6 +2138,14 @@ + + + + + + + + @@ -10359,6 +10391,14 @@ + + + + + + + + @@ -13737,6 +13777,14 @@ + + + + + + + + @@ -14242,6 +14290,14 @@ + + + + + + + + @@ -14268,6 +14324,11 @@ + + + + + @@ -14294,6 +14355,14 @@ + + + + + + + + @@ -14339,6 +14408,14 @@ + + + + + + + + @@ -14384,6 +14461,14 @@ + + + + + + + + @@ -14429,6 +14514,14 @@ + + + + + + + + @@ -14474,6 +14567,14 @@ + + + + + + + + @@ -14524,6 +14625,14 @@ + + + + + + + + @@ -14574,6 +14683,14 @@ + + + + + + + + @@ -14611,6 +14728,14 @@ + + + + + + + + @@ -14643,6 +14768,14 @@ + + + + + + + + @@ -14683,6 +14816,14 @@ + + + + + + + + @@ -14715,6 +14856,14 @@ + + + + + + + + @@ -14747,6 +14896,14 @@ + + + + + + + + @@ -14779,6 +14936,14 @@ + + + + + + + + @@ -14816,6 +14981,14 @@ + + + + + + + + @@ -14855,6 +15028,11 @@ + + + + + @@ -14891,6 +15069,14 @@ + + + + + + + + @@ -14936,6 +15122,14 @@ + + + + + + + + @@ -14976,6 +15170,14 @@ + + + + + + + + @@ -15021,6 +15223,14 @@ + + + + + + + + @@ -15162,6 +15372,14 @@ + + + + + + + + @@ -15199,6 +15417,14 @@ + + + + + + + + @@ -15271,6 +15497,14 @@ + + + + + + + + @@ -15313,6 +15547,14 @@ + + + + + + + + @@ -15403,6 +15645,14 @@ + + + + + + + + @@ -15456,6 +15706,14 @@ + + + + + + + + @@ -15496,6 +15754,14 @@ + + + + + + + + @@ -15546,6 +15812,14 @@ + + + + + + + + @@ -15586,6 +15860,14 @@ + + + + + + + + @@ -15636,6 +15918,14 @@ + + + + + + + + @@ -15697,6 +15987,14 @@ + + + + + + + + @@ -15742,6 +16040,14 @@ + + + + + + + + @@ -15782,6 +16088,14 @@ + + + + + + + + @@ -15832,6 +16146,14 @@ + + + + + + + + @@ -15872,6 +16194,14 @@ + + + + + + + + @@ -15922,6 +16252,14 @@ + + + + + + + + @@ -15967,6 +16305,14 @@ + + + + + + + + @@ -16017,6 +16363,14 @@ + + + + + + + + @@ -16062,6 +16416,14 @@ + + + + + + + + @@ -16099,6 +16461,14 @@ + + + + + + + + @@ -16139,6 +16509,14 @@ + + + + + + + + @@ -16184,6 +16562,14 @@ + + + + + + + + @@ -16234,6 +16620,14 @@ + + + + + + + + @@ -16284,6 +16678,14 @@ + + + + + + + + @@ -16334,6 +16736,14 @@ + + + + + + + + From 60cbd9113ff6d4702375c654a430bdf8951b9818 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Mar 2026 08:56:15 +0100 Subject: [PATCH 112/260] build(deps): bump ncipollo/release-action from 1.20.0 to 1.21.0 (#4748) Bumps [ncipollo/release-action](https://github.com/ncipollo/release-action) from 1.20.0 to 1.21.0. - [Release notes](https://github.com/ncipollo/release-action/releases) - [Commits](https://github.com/ncipollo/release-action/compare/b7eabc95ff50cbeeedec83973935c8f306dfcd0b...339a81892b84b4eeb0f6e744e4574d79d0d9b8dd) --- updated-dependencies: - dependency-name: ncipollo/release-action dependency-version: 1.21.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/deploy-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml index a34c3897cb4..fe103ee76e8 100644 --- a/.github/workflows/deploy-release.yml +++ b/.github/workflows/deploy-release.yml @@ -94,7 +94,7 @@ jobs: - name: Upload to Github if: ${{ inputs.github_release }} - uses: ncipollo/release-action@b7eabc95ff50cbeeedec83973935c8f306dfcd0b + uses: ncipollo/release-action@339a81892b84b4eeb0f6e744e4574d79d0d9b8dd with: allowUpdates: true draft: true From 955aab1284d48a6d182505a7f4173532867f5436 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Tue, 24 Mar 2026 08:56:32 +0100 Subject: [PATCH 113/260] build: update ruleEngine to 3.7.1 and expressionParser to 1.4.0 (#4758) --- gradle/libs.versions.toml | 4 +- gradle/verification-metadata.xml | 426 ++++++------------------------- 2 files changed, 82 insertions(+), 348 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index dc0b49a18f9..b8f10ef4466 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -12,8 +12,8 @@ dagger = '2.57.2' jacoco = '0.8.14' designSystem = "0.7.0-SNAPSHOT" dhis2sdk = "1.14.0-SNAPSHOT" -ruleEngine = "3.7.0" -expressionParser = "1.3.1" +ruleEngine = "3.7.1" +expressionParser = "1.4.0" appcompat = "1.7.1" annotation = "1.9.1" cardview = "1.0.0" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index e3ec308658d..8885c5a0dc9 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -557,18 +557,16 @@ - - - - - - - - - - + + + + + + + + + + @@ -577,12 +575,11 @@ - - - - - + + + + + @@ -635,24 +632,20 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + @@ -671,10 +664,9 @@ - - - + + + @@ -711,18 +703,16 @@ - - - - - - - - - - + + + + + + + + + + @@ -778,24 +768,20 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + @@ -857,12 +843,6 @@ - - - - - @@ -955,16 +935,6 @@ - - - - - - - - @@ -973,10 +943,9 @@ - - - + + + @@ -1035,12 +1004,6 @@ - - - - - @@ -1109,17 +1072,6 @@ - - - - - - - - @@ -1681,16 +1633,6 @@ - - - - - - - - @@ -1731,16 +1673,6 @@ - - - - - - - - @@ -13312,6 +13244,11 @@ + + + + + @@ -13336,6 +13273,14 @@ + + + + + + + + @@ -13384,6 +13329,14 @@ + + + + + + + + @@ -13941,16 +13894,6 @@ - - - - - - - - @@ -13995,16 +13938,6 @@ - - - - - - - - @@ -14141,17 +14074,6 @@ - - - - - - - - @@ -14201,17 +14123,6 @@ - - - - - - - - @@ -14300,17 +14211,6 @@ - - - - - - - - @@ -14478,12 +14378,6 @@ - - - - - @@ -14597,16 +14491,6 @@ - - - - - - - - @@ -14683,17 +14567,6 @@ - - - - - - - - @@ -14747,17 +14620,6 @@ - - - - - - - - @@ -14900,12 +14762,6 @@ - - - - - @@ -14934,16 +14790,6 @@ - - - - - - - - @@ -15291,17 +15137,6 @@ - - - - - - - - @@ -15401,16 +15236,6 @@ - - - - - - - - @@ -15471,16 +15296,6 @@ - - - - - - - - @@ -15567,16 +15382,6 @@ - - - - - - - - @@ -15708,16 +15513,6 @@ - - - - - - - - @@ -15771,16 +15566,6 @@ - - - - - - - - @@ -15832,16 +15617,6 @@ - - - - - - - - @@ -15924,17 +15699,6 @@ - - - - - - - - @@ -16070,16 +15834,6 @@ - - - - - - - - @@ -16130,16 +15884,6 @@ - - - - - - - - @@ -16181,16 +15925,6 @@ - - - - - - - - From 1b5c53f71f238c11b713e9b105bf26814d991a3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Tue, 24 Mar 2026 14:56:55 +0100 Subject: [PATCH 114/260] =?UTF-8?q?chore:=20[ANDROAPP-7547]=20Refactor=20G?= =?UTF-8?q?radle=20dependency=20verification=20=E2=80=94=20release-only=20?= =?UTF-8?q?security=20gate=20[skip=20size]=20(#4746)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: [ANDROAPP-7547] Refactor Gradle dependency verification setup - Replace the 20k-line verification-metadata.xml with an 18-line seed file containing only the block (trusted-artifacts, no component checksums). This eliminates merge conflicts on every branch. - Fix incorrect gradle.properties key: 'org.gradle.dependency. verification.mode' is not a valid Gradle property; corrected to 'org.gradle.dependency.verification=off', silencing 1643 per-build warnings while keeping development builds fast and unblocked. - Remove redundant --dependency-verification lenient flags from Jenkinsfile (×2), continuous-delivery.yml (×1), and sonarqube.sh (×1) now that gradle.properties correctly disables verification by default. - Introduce a real security gate in release-only pipelines (build-release-candidate.yml and deploy-release.yml): 1. Generate fresh SHA-256 checksums via --write-verification-metadata sha256 dependencies 2. Build the release APKs with --dependency-verification strict Both steps run in the same CI job using the same Gradle cache, so downloaded artifacts are verified against checksums computed moments earlier on the same machine — providing genuine supply-chain protection at release time without any friction in daily development. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * build: update dependency verification metadata generation tasks * build: debug assembly approach * build: compile-only approach * build: compileDhis2ReleaseKotlin * build: fix dependency verification metadata generation in release workflow Use 'help' task for --write-verification-metadata so the step never fails due to pre-existing compilation errors. The detached-config artifacts (KSP, Kotlin intellij coroutines) are now committed in verification-metadata.xml so they persist across CI runs without needing a compilation step to regenerate them. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * build: align deploy-release and add Jenkins metadata drift check - Use 'help' task in deploy-release.yml for consistency with build-release-candidate.yml - Add 'Check dependency verification metadata' stage in Jenkinsfile to fail PRs when verification-metadata.xml is out of date Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * build: trust org.jetbrains.intellij.deps.kotlinx artifacts These are Kotlin compiler-internal artifacts resolved as detached configurations at compile time. They cannot be captured by the 'help' task, so we trust the entire group rather than chasing individual checksums across CI environments. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * build: remove redundant write-verification-metadata step from release workflows The metadata is already committed and kept up to date by the Jenkins PR check. The generate step is no longer needed before the build. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * build: trust .pom and .module metadata files in dependency verification BOM and parent POM files contain no executable code - they only describe dependency relationships. Trusting them by file extension is consistent with already-trusted -sources.jar and -javadoc.jar. Actual security is maintained by verifying .jar files (executable code). If a tampered .pom pulls in a different dependency version, the .jar checksum verification will catch it. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * build: reorder trust entries in verification-metadata.xml * ci: migrate dependency verification metadata check to GitHub Actions * chore: update dependency verification metadata [skip ci] --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: @dhis2-bot --- .github/workflows/build-release-candidate.yml | 4 +- .github/workflows/continuous-delivery.yml | 2 +- .github/workflows/deploy-release.yml | 4 +- .../workflows/verify-dependency-metadata.yml | 58 + Jenkinsfile | 4 +- gradle.properties | 7 +- gradle/verification-metadata.xml | 9404 +---------------- scripts/sonarqube.sh | 2 +- 8 files changed, 217 insertions(+), 9268 deletions(-) create mode 100644 .github/workflows/verify-dependency-metadata.yml diff --git a/.github/workflows/build-release-candidate.yml b/.github/workflows/build-release-candidate.yml index 2255793e356..6134ac3ef22 100644 --- a/.github/workflows/build-release-candidate.yml +++ b/.github/workflows/build-release-candidate.yml @@ -45,7 +45,7 @@ jobs: encodedString: ${{ secrets.KEYSTORE }} - name: Build Release APKs - run: ./gradlew --dependency-verification lenient app:assembleDhis2Release app:assembleDhis2PlayServicesRelease + run: ./gradlew --dependency-verification strict app:assembleDhis2Release app:assembleDhis2PlayServicesRelease env: SENTRY_DSN: ${{ secrets.SENTRY_DSN }} SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} @@ -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 --dependency-verification lenient app:assembleDhis2TrainingRelease + run: ./gradlew --dependency-verification strict app:assembleDhis2TrainingRelease - name: Read version name from file working-directory: ./gradle diff --git a/.github/workflows/continuous-delivery.yml b/.github/workflows/continuous-delivery.yml index 0915084b71a..e808ea79d35 100644 --- a/.github/workflows/continuous-delivery.yml +++ b/.github/workflows/continuous-delivery.yml @@ -51,7 +51,7 @@ jobs: # Create APK Debug - name: Build apk debug project (APK) - ${{ env.main_project_module }} module - run: ./gradlew --dependency-verification lenient assembleDhis2Debug + run: ./gradlew assembleDhis2Debug env: SENTRY_DSN: ${{ secrets.SENTRY_DSN }} DEBUG_KEYSTORE_ALIAS: ${{ secrets.DEBUG_KEYSTORE_ALIAS }} diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml index fe103ee76e8..da2d40b7f33 100644 --- a/.github/workflows/deploy-release.yml +++ b/.github/workflows/deploy-release.yml @@ -49,7 +49,7 @@ jobs: encodedString: ${{ secrets.KEYSTORE }} - name: Build Release APKs - run: ./gradlew --dependency-verification lenient app:assembleDhis2Release app:assembleDhis2PlayServicesRelease + run: ./gradlew --dependency-verification strict app:assembleDhis2Release app:assembleDhis2PlayServicesRelease env: SENTRY_DSN: ${{ secrets.SENTRY_DSN }} SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} @@ -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 --dependency-verification lenient app:assembleDhis2TrainingRelease + run: ./gradlew --dependency-verification strict app:assembleDhis2TrainingRelease - name: Read version name from file working-directory: ./gradle diff --git a/.github/workflows/verify-dependency-metadata.yml b/.github/workflows/verify-dependency-metadata.yml new file mode 100644 index 00000000000..ab070ac4eaa --- /dev/null +++ b/.github/workflows/verify-dependency-metadata.yml @@ -0,0 +1,58 @@ +name: Verify Dependency Metadata + +on: + pull_request: + branches: + - main + - develop + - release/* + +jobs: + verify-dependency-metadata: + runs-on: ubuntu-latest + + steps: + - name: Checkout PR branch + uses: actions/checkout@v6 + with: + ref: ${{ github.head_ref }} + fetch-depth: 0 + token: ${{ secrets.DHIS2_BOT_GITHUB_TOKEN }} + + - name: Set Up JDK + uses: actions/setup-java@v5 + with: + distribution: 'zulu' + java-version: '17' + cache: 'gradle' + + - name: Change wrapper permissions + run: chmod +x ./gradlew + + - name: Regenerate verification metadata + run: ./gradlew --write-verification-metadata sha256 help --no-daemon + + - name: Check if metadata changed + id: check-diff + run: | + if git diff --quiet gradle/verification-metadata.xml; then + echo "changed=false" >> $GITHUB_OUTPUT + echo "✅ verification-metadata.xml is up to date." + else + echo "changed=true" >> $GITHUB_OUTPUT + fi + + - name: Fail for fork PRs with outdated metadata + if: steps.check-diff.outputs.changed == 'true' && github.event.pull_request.head.repo.full_name != github.repository + run: | + echo "⚠️ Fork PR: verification-metadata.xml is out of date but cannot be auto-committed." + echo "Please run './gradlew --write-verification-metadata sha256 help' locally and commit the result." + exit 1 + + - name: Commit updated metadata + if: steps.check-diff.outputs.changed == 'true' && github.event.pull_request.head.repo.full_name == github.repository + uses: flex-development/gh-commit@177be4b5bca1b102400ca7220932d9ff7980fddb + with: + message: 'chore: update dependency verification metadata [skip ci]' + ref: ${{ github.head_ref }} + token: ${{ secrets.DHIS2_BOT_GITHUB_TOKEN }} diff --git a/Jenkinsfile b/Jenkinsfile index 10854742886..0cf65b9502b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -77,7 +77,7 @@ pipeline { steps { script { echo 'Running unit tests' - sh './gradlew --dependency-verification lenient testDebugUnitTest testDhis2DebugUnitTest testAndroidHostTest --stacktrace --no-daemon' + sh './gradlew testDebugUnitTest testDhis2DebugUnitTest testAndroidHostTest --stacktrace --no-daemon' } } } @@ -85,7 +85,7 @@ pipeline { steps { script { echo 'Building UI APKs' - sh './gradlew --dependency-verification lenient :app:assembleDhis2Debug :app:assembleDhis2DebugAndroidTest :form:assembleAndroidTest' + sh './gradlew :app:assembleDhis2Debug :app:assembleDhis2DebugAndroidTest :form:assembleAndroidTest' } } } diff --git a/gradle.properties b/gradle.properties index 70e8c2b5087..9dde98c3fd5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -43,7 +43,10 @@ android.nonTransitiveRClass=false kotlin.daemon.jvmargs=-Xmx4096M kotlin.incremental=true -# Enable dependency verification -org.gradle.dependency.verification.mode=lenient +# Dependency verification is disabled for local development and CI to avoid +# noise from unverified artifacts. Release pipelines run with strict +# dependency verification enabled (e.g. --dependency-verification strict) using +# existing verification metadata. +org.gradle.dependency.verification=off android.r8.strictFullModeForKeepRules=false kotlinx.atomicfu.enableJvmIrTransformation=true diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index d7f5a96c442..8dad06e2ec2 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -5,8 +5,11 @@ false + + + @@ -15,14 +18,6 @@ - - - - - - - - @@ -40,58 +35,20 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -118,24 +75,6 @@ - - - - - - - - - - - - - - - - - - @@ -152,57 +91,22 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -226,17 +130,11 @@ - - - - - - @@ -256,18 +154,7 @@ - - - - - - - - - - - @@ -288,15 +175,7 @@ - - - - - - - - @@ -320,9 +199,6 @@ - - - @@ -332,19 +208,6 @@ - - - - - - - - - - - - - @@ -353,27 +216,11 @@ - - - - - - - - - - - - - - - - @@ -382,15 +229,7 @@ - - - - - - - - @@ -404,9 +243,6 @@ - - - @@ -481,9 +317,6 @@ - - - @@ -552,16 +385,6 @@ - - - - - - - - - - @@ -572,24 +395,6 @@ - - - - - - - - - - - - - - - - - - @@ -602,49 +407,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -661,14 +429,6 @@ - - - - - - - - @@ -682,45 +442,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -731,14 +457,6 @@ - - - - - - - - @@ -751,49 +469,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -810,14 +491,6 @@ - - - - - - - - @@ -836,40 +509,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -880,14 +519,6 @@ - - - - - - - - @@ -898,11 +529,6 @@ - - - - - @@ -915,49 +541,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -974,19 +563,6 @@ - - - - - - - - - - - - - @@ -1005,45 +581,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1054,19 +596,6 @@ - - - - - - - - - - - - - @@ -1079,49 +608,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1138,14 +630,6 @@ - - - - - - - - @@ -1164,85 +648,21 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1259,28 +679,9 @@ - - - - - - - - - - - - - - - - - - - - - - + + + @@ -1378,9 +779,6 @@ - - - @@ -1468,19 +866,6 @@ - - - - - - - - - - - - - @@ -1501,62 +886,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1574,48 +908,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1636,49 +928,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1696,38 +945,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1736,14 +953,6 @@ - - - - - - - - @@ -1752,30 +961,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -1784,14 +969,6 @@ - - - - - - - - @@ -1800,46 +977,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1848,43 +985,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1901,22 +1001,6 @@ - - - - - - - - - - - - - - - - @@ -1933,14 +1017,6 @@ - - - - - - - - @@ -1949,32 +1025,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2000,72 +1050,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2098,38 +1082,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2138,55 +1090,15 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2196,209 +1108,40 @@ - - - + + + - - + + - - - + + + - - + + - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2415,73 +1158,10 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2491,59 +1171,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2557,791 +1184,137 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - + + + - - + + - - - + + + - - - - + + - - - - - - + + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - - + + + - - + + - - - - - - + + + - - - - - - + + + - - - + + + - - + + - - - + + + - - + + - - - + + + + + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - - - + + - - - @@ -3351,14 +1324,6 @@ - - - - - - - - @@ -3369,51 +1334,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -3430,65 +1350,10 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -3498,11 +1363,6 @@ - - - - - @@ -3512,46 +1372,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -3569,48 +1389,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -3668,9 +1446,6 @@ - - - @@ -3696,14 +1471,6 @@ - - - - - - - - @@ -3718,17 +1485,11 @@ - - - - - - @@ -3754,14 +1515,6 @@ - - - - - - - - @@ -3778,33 +1531,12 @@ - - - - - - - - - - - - - - - - - - - - - @@ -3822,15 +1554,7 @@ - - - - - - - - @@ -3852,9 +1576,6 @@ - - - @@ -3912,22 +1633,6 @@ - - - - - - - - - - - - - - - - @@ -3936,14 +1641,6 @@ - - - - - - - - @@ -3952,84 +1649,20 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - + + + - - + + @@ -4040,14 +1673,6 @@ - - - - - - - - @@ -4056,22 +1681,6 @@ - - - - - - - - - - - - - - - - @@ -4080,14 +1689,6 @@ - - - - - - - - @@ -4096,22 +1697,6 @@ - - - - - - - - - - - - - - - - @@ -4120,14 +1705,6 @@ - - - - - - - - @@ -4136,22 +1713,6 @@ - - - - - - - - - - - - - - - - @@ -4160,14 +1721,6 @@ - - - - - - - - @@ -4208,11 +1761,6 @@ - - - - - @@ -4273,14 +1821,6 @@ - - - - - - - - @@ -4300,9 +1840,6 @@ - - - @@ -4393,33 +1930,21 @@ - - - - - - - - - - - - @@ -4433,17 +1958,11 @@ - - - - - - @@ -4468,11 +1987,6 @@ - - - - - @@ -4507,11 +2021,6 @@ - - - - - @@ -4520,28 +2029,12 @@ - - - - - - - - - - - - - - - - @@ -4555,17 +2048,11 @@ - - - - - - @@ -4583,31 +2070,17 @@ - - - - - - - - - - - - - - @@ -4621,17 +2094,11 @@ - - - - - - @@ -4644,11 +2111,6 @@ - - - - - @@ -4668,17 +2130,11 @@ - - - - - - @@ -4730,35 +2186,21 @@ - - - - - - - - - - - - - - @@ -4771,46 +2213,22 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -4821,28 +2239,16 @@ - - - - - - - - - - - - @@ -4863,11 +2269,6 @@ - - - - - @@ -4890,17 +2291,11 @@ - - - - - - @@ -4918,11 +2313,6 @@ - - - - - @@ -4944,11 +2334,6 @@ - - - - - @@ -4971,17 +2356,11 @@ - - - - - - @@ -5000,9 +2379,6 @@ - - - @@ -5039,30 +2415,16 @@ - - - - - - - - - - - - - - @@ -5075,46 +2437,17 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -5128,26 +2461,14 @@ - - - - - - - - - - - - @@ -5172,9 +2493,6 @@ - - - @@ -5189,11 +2507,6 @@ - - - - - @@ -5203,9 +2516,6 @@ - - - @@ -5215,11 +2525,6 @@ - - - - - @@ -5241,30 +2546,17 @@ - - - - - - - - - - - - - @@ -5283,9 +2575,6 @@ - - - @@ -5296,9 +2585,6 @@ - - - @@ -5315,17 +2601,11 @@ - - - - - - @@ -5340,11 +2620,6 @@ - - - - - @@ -5401,32 +2676,11 @@ - - - - - - - - - - - - - - - - - - - - - @@ -5435,24 +2689,11 @@ - - - - - - - - - - - - - @@ -5461,24 +2702,11 @@ - - - - - - - - - - - - - @@ -5503,19 +2731,6 @@ - - - - - - - - - - - - - @@ -5524,22 +2739,6 @@ - - - - - - - - - - - - - - - - @@ -5548,14 +2747,6 @@ - - - - - - - - @@ -5564,22 +2755,6 @@ - - - - - - - - - - - - - - - - @@ -5588,22 +2763,6 @@ - - - - - - - - - - - - - - - - @@ -5612,30 +2771,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -5644,22 +2779,6 @@ - - - - - - - - - - - - - - - - @@ -5668,30 +2787,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -5700,52 +2795,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -5756,22 +2811,6 @@ - - - - - - - - - - - - - - - - @@ -5780,22 +2819,6 @@ - - - - - - - - - - - - - - - - @@ -5804,59 +2827,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -5900,9 +2875,6 @@ - - - @@ -5915,18 +2887,7 @@ - - - - - - - - - - - @@ -5960,24 +2921,11 @@ - - - - - - - - - - - - - @@ -5991,14 +2939,6 @@ - - - - - - - - @@ -6007,24 +2947,11 @@ - - - - - - - - - - - - - @@ -6033,24 +2960,11 @@ - - - - - - - - - - - - - @@ -6059,28 +2973,17 @@ - - - - - - - - - - - @@ -6094,25 +2997,13 @@ - - - - - - - - - - - - @@ -6120,11 +3011,6 @@ - - - - - @@ -6155,17 +3041,11 @@ - - - - - - @@ -6236,9 +3116,6 @@ - - - @@ -6280,29 +3157,11 @@ - - - - - - - - - - - - - - - - - - @@ -6325,9 +3184,6 @@ - - - @@ -6337,29 +3193,11 @@ - - - - - - - - - - - - - - - - - - @@ -6421,11 +3259,6 @@ - - - - - @@ -6610,14 +3443,6 @@ - - - - - - - - @@ -6655,14 +3480,6 @@ - - - - - - - - @@ -6696,9 +3513,6 @@ - - - @@ -6754,9 +3568,6 @@ - - - @@ -6907,22 +3718,6 @@ - - - - - - - - - - - - - - - - @@ -6931,30 +3726,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -6963,30 +3734,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -6995,34 +3742,16 @@ - - - - - - - - - - - - - - - - - - @@ -7031,22 +3760,6 @@ - - - - - - - - - - - - - - - - @@ -7055,30 +3768,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -7087,14 +3776,6 @@ - - - - - - - - @@ -7111,22 +3792,6 @@ - - - - - - - - - - - - - - - - @@ -7135,46 +3800,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -7183,30 +3808,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -7215,30 +3816,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -7247,30 +3824,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -7279,30 +3832,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -7311,30 +3840,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -7343,30 +3848,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -7375,68 +3856,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + + @@ -7447,30 +3872,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -7479,30 +3880,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -7511,30 +3888,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -7543,30 +3896,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -7575,30 +3904,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -7607,22 +3912,6 @@ - - - - - - - - - - - - - - - - @@ -7631,22 +3920,6 @@ - - - - - - - - - - - - - - - - @@ -7655,30 +3928,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -7687,30 +3936,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -7719,14 +3944,6 @@ - - - - - - - - @@ -7735,30 +3952,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -7767,30 +3960,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -7799,22 +3968,6 @@ - - - - - - - - - - - - - - - - @@ -7831,22 +3984,6 @@ - - - - - - - - - - - - - - - - @@ -7855,30 +3992,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -7887,78 +4000,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -7967,252 +4008,36 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - + + @@ -8223,30 +4048,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -8255,30 +4056,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -8287,30 +4064,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -8319,30 +4072,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -8351,30 +4080,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -8383,30 +4088,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -8415,30 +4096,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -8447,30 +4104,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -8479,30 +4112,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -8511,30 +4120,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -8543,30 +4128,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -8575,30 +4136,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -8607,30 +4144,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -8639,14 +4152,6 @@ - - - - - - - - @@ -8655,14 +4160,6 @@ - - - - - - - - @@ -8671,30 +4168,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -8703,14 +4176,6 @@ - - - - - - - - @@ -8734,21 +4199,6 @@ - - - - - - - - - - - - - - - @@ -8804,16 +4254,6 @@ - - - - - - - - - - @@ -8847,28 +4287,6 @@ - - - - - - - - - - - - - - - - - - - - - - @@ -8984,22 +4402,6 @@ - - - - - - - - - - - - - - - - @@ -9024,11 +4426,6 @@ - - - - - @@ -9086,9 +4483,6 @@ - - - @@ -9109,14 +4503,6 @@ - - - - - - - - @@ -9151,14 +4537,6 @@ - - - - - - - - @@ -9175,11 +4553,6 @@ - - - - - @@ -9271,14 +4644,6 @@ - - - - - - - - @@ -9327,58 +4692,16 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -9395,22 +4718,6 @@ - - - - - - - - - - - - - - - - @@ -9419,38 +4726,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -9459,22 +4734,6 @@ - - - - - - - - - - - - - - - - @@ -9484,9 +4743,6 @@ - - - @@ -9496,11 +4752,6 @@ - - - - - @@ -9556,11 +4807,6 @@ - - - - - @@ -9667,9 +4913,6 @@ - - - @@ -9678,17 +4921,6 @@ - - - - - - - - - - - @@ -9697,9 +4929,6 @@ - - - @@ -9716,29 +4945,9 @@ - - - - - - - - - - - - - - - - - - - - - - + + @@ -9827,16 +5036,6 @@ - - - - - - - - - - @@ -9853,19 +5052,6 @@ - - - - - - - - - - - - - @@ -9890,14 +5076,6 @@ - - - - - - - - @@ -9914,14 +5092,6 @@ - - - - - - - - @@ -9955,16 +5125,6 @@ - - - - - - - - - - @@ -9973,14 +5133,6 @@ - - - - - - - - @@ -9989,14 +5141,6 @@ - - - - - - - - @@ -10005,14 +5149,6 @@ - - - - - - - - @@ -10021,14 +5157,6 @@ - - - - - - - - @@ -10037,14 +5165,6 @@ - - - - - - - - @@ -10053,14 +5173,6 @@ - - - - - - - - @@ -10107,9 +5219,6 @@ - - - @@ -10119,22 +5228,6 @@ - - - - - - - - - - - - - - - - @@ -10391,22 +5484,6 @@ - - - - - - - - - - - - - - - - @@ -10439,14 +5516,6 @@ - - - - - - - - @@ -10478,9 +5547,6 @@ - - - @@ -10498,18 +5564,7 @@ - - - - - - - - - - - @@ -10534,17 +5589,6 @@ - - - - - - - - - - - @@ -10563,23 +5607,9 @@ - - - - - - - - - - - - - - @@ -10594,24 +5624,11 @@ - - - - - - - - - - - - - @@ -10658,19 +5675,6 @@ - - - - - - - - - - - - - @@ -10680,9 +5684,6 @@ - - - @@ -10704,17 +5705,11 @@ - - - - - - @@ -10749,9 +5744,6 @@ - - - @@ -10919,9 +5911,6 @@ - - - @@ -10947,24 +5936,6 @@ - - - - - - - - - - - - - - - - - - @@ -10997,9 +5968,6 @@ - - - @@ -11321,22 +6289,6 @@ - - - - - - - - - - - - - - - - @@ -11345,22 +6297,6 @@ - - - - - - - - - - - - - - - - @@ -11369,22 +6305,6 @@ - - - - - - - - - - - - - - - - @@ -11393,22 +6313,6 @@ - - - - - - - - - - - - - - - - @@ -11417,22 +6321,6 @@ - - - - - - - - - - - - - - - - @@ -11441,22 +6329,6 @@ - - - - - - - - - - - - - - - - @@ -11465,22 +6337,6 @@ - - - - - - - - - - - - - - - - @@ -11489,22 +6345,6 @@ - - - - - - - - - - - - - - - - @@ -11513,22 +6353,6 @@ - - - - - - - - - - - - - - - - @@ -11537,22 +6361,6 @@ - - - - - - - - - - - - - - - - @@ -11561,22 +6369,6 @@ - - - - - - - - - - - - - - - - @@ -11601,22 +6393,6 @@ - - - - - - - - - - - - - - - - @@ -11625,22 +6401,6 @@ - - - - - - - - - - - - - - - - @@ -11649,22 +6409,6 @@ - - - - - - - - - - - - - - - - @@ -11686,22 +6430,6 @@ - - - - - - - - - - - - - - - - @@ -11710,22 +6438,6 @@ - - - - - - - - - - - - - - - - @@ -11734,22 +6446,6 @@ - - - - - - - - - - - - - - - - @@ -11758,22 +6454,6 @@ - - - - - - - - - - - - - - - - @@ -11782,22 +6462,6 @@ - - - - - - - - - - - - - - - - @@ -11806,22 +6470,6 @@ - - - - - - - - - - - - - - - - @@ -11846,22 +6494,6 @@ - - - - - - - - - - - - - - - - @@ -11870,22 +6502,6 @@ - - - - - - - - - - - - - - - - @@ -11894,22 +6510,6 @@ - - - - - - - - - - - - - - - - @@ -11918,22 +6518,6 @@ - - - - - - - - - - - - - - - - @@ -11942,22 +6526,6 @@ - - - - - - - - - - - - - - - - @@ -11966,22 +6534,6 @@ - - - - - - - - - - - - - - - - @@ -12188,24 +6740,8 @@ - - - - - - - - - - - - - - - - - - + + @@ -12233,21 +6769,10 @@ - - - - - - - - - - - @@ -12256,14 +6781,6 @@ - - - - - - - - @@ -12298,22 +6815,6 @@ - - - - - - - - - - - - - - - - @@ -12322,22 +6823,6 @@ - - - - - - - - - - - - - - - - @@ -12346,22 +6831,6 @@ - - - - - - - - - - - - - - - - @@ -12370,14 +6839,6 @@ - - - - - - - - @@ -12386,22 +6847,6 @@ - - - - - - - - - - - - - - - - @@ -12410,22 +6855,6 @@ - - - - - - - - - - - - - - - - @@ -12434,22 +6863,6 @@ - - - - - - - - - - - - - - - - @@ -12458,22 +6871,6 @@ - - - - - - - - - - - - - - - - @@ -12482,22 +6879,6 @@ - - - - - - - - - - - - - - - - @@ -12506,11 +6887,6 @@ - - - - - @@ -12561,14 +6937,6 @@ - - - - - - - - @@ -12593,22 +6961,6 @@ - - - - - - - - - - - - - - - - @@ -12630,11 +6982,6 @@ - - - - - @@ -12680,14 +7027,6 @@ - - - - - - - - @@ -12733,11 +7072,6 @@ - - - - - @@ -12746,44 +7080,21 @@ - - - - - - - - - - - - - - - - - - - - - - - @@ -12822,14 +7133,6 @@ - - - - - - - - @@ -12862,14 +7165,6 @@ - - - - - - - - @@ -12887,9 +7182,6 @@ - - - @@ -12899,24 +7191,11 @@ - - - - - - - - - - - - - @@ -12927,21 +7206,11 @@ - - - - - - - - - - @@ -12962,11 +7231,6 @@ - - - - - @@ -13008,14 +7272,6 @@ - - - - - - - - @@ -13238,9 +7494,6 @@ - - - @@ -13250,14 +7503,6 @@ - - - - - - - - @@ -13266,14 +7511,6 @@ - - - - - - - - @@ -13282,14 +7519,6 @@ - - - - - - - - @@ -13306,14 +7535,6 @@ - - - - - - - - @@ -13363,9 +7584,6 @@ - - - @@ -13374,9 +7592,6 @@ - - - @@ -13385,17 +7600,6 @@ - - - - - - - - - - - @@ -13633,9 +7837,6 @@ - - - @@ -13682,11 +7883,6 @@ - - - - - @@ -13697,22 +7893,6 @@ - - - - - - - - - - - - - - - - @@ -13729,14 +7909,6 @@ - - - - - - - - @@ -13745,30 +7917,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -13777,14 +7925,6 @@ - - - - - - - - @@ -13888,18 +8028,7 @@ - - - - - - - - - - - @@ -13909,14 +8038,6 @@ - - - - - - - - @@ -13925,27 +8046,11 @@ - - - - - - - - - - - - - - - - @@ -13954,27 +8059,11 @@ - - - - - - - - - - - - - - - - @@ -13991,14 +8080,6 @@ - - - - - - - - @@ -14007,18 +8088,7 @@ - - - - - - - - - - - @@ -14028,14 +8098,6 @@ - - - - - - - - @@ -14052,14 +8114,6 @@ - - - - - - - - @@ -14076,14 +8130,6 @@ - - - - - - - - @@ -14093,9 +8139,6 @@ - - - @@ -14105,14 +8148,6 @@ - - - - - - - - @@ -14121,14 +8156,6 @@ - - - - - - - - @@ -14137,14 +8164,6 @@ - - - - - - - - @@ -14153,14 +8172,6 @@ - - - - - - - - @@ -14169,14 +8180,6 @@ - - - - - - - - @@ -14185,14 +8188,6 @@ - - - - - - - - @@ -14201,14 +8196,6 @@ - - - - - - - - @@ -14222,11 +8209,6 @@ - - - - - @@ -14240,11 +8222,6 @@ - - - - - @@ -14261,11 +8238,6 @@ - - - - - @@ -14274,14 +8246,6 @@ - - - - - - - - @@ -14290,83 +8254,20 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - @@ -14376,30 +8277,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -14408,18 +8285,7 @@ - - - - - - - - - - - @@ -14430,29 +8296,10 @@ - - - - - - - - - - - - - - - - - - - @@ -14461,14 +8308,6 @@ - - - - - - - - @@ -14483,29 +8322,10 @@ - - - - - - - - - - - - - - - - - - - @@ -14514,19 +8334,6 @@ - - - - - - - - - - - - - @@ -14535,30 +8342,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -14567,23 +8350,7 @@ - - - - - - - - - - - - - - - - @@ -14593,30 +8360,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -14625,23 +8368,7 @@ - - - - - - - - - - - - - - - - @@ -14651,30 +8378,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -14683,43 +8386,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -14728,38 +8399,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -14768,14 +8407,6 @@ - - - - - - - - @@ -14784,30 +8415,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -14816,38 +8423,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -14856,38 +8431,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -14896,38 +8439,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -14936,43 +8447,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -14981,14 +8460,6 @@ - - - - - - - - @@ -14997,70 +8468,16 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -15069,18 +8486,7 @@ - - - - - - - - - - - @@ -15090,30 +8496,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -15122,14 +8504,6 @@ - - - - - - - - @@ -15138,30 +8512,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -15170,18 +8520,7 @@ - - - - - - - - - - - @@ -15191,30 +8530,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -15223,14 +8538,6 @@ - - - - - - - - @@ -15244,22 +8551,6 @@ - - - - - - - - - - - - - - - - @@ -15356,14 +8647,6 @@ - - - - - - - - @@ -15372,43 +8655,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -15417,14 +8668,6 @@ - - - - - - - - @@ -15433,22 +8676,6 @@ - - - - - - - - - - - - - - - - @@ -15481,14 +8708,6 @@ - - - - - - - - @@ -15497,14 +8716,6 @@ - - - - - - - - @@ -15523,22 +8734,6 @@ - - - - - - - - - - - - - - - - @@ -15547,14 +8742,6 @@ - - - - - - - - @@ -15569,21 +8756,10 @@ - - - - - - - - - - - @@ -15629,14 +8805,6 @@ - - - - - - - - @@ -15645,59 +8813,21 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -15706,14 +8836,6 @@ - - - - - - - - @@ -15722,30 +8844,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -15754,23 +8852,12 @@ - - - - - - - - - - - @@ -15780,30 +8867,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -15812,14 +8875,6 @@ - - - - - - - - @@ -15828,30 +8883,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -15860,23 +8891,12 @@ - - - - - - - - - - - @@ -15886,30 +8906,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -15918,21 +8914,10 @@ - - - - - - - - - - - @@ -15943,17 +8928,6 @@ - - - - - - - - - - - @@ -15971,14 +8945,6 @@ - - - - - - - - @@ -15987,14 +8953,6 @@ - - - - - - - - @@ -16008,30 +8966,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -16040,14 +8974,6 @@ - - - - - - - - @@ -16056,30 +8982,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -16088,23 +8990,12 @@ - - - - - - - - - - - @@ -16114,30 +9005,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -16146,14 +9013,6 @@ - - - - - - - - @@ -16162,30 +9021,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -16194,54 +9029,19 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - + + + @@ -16252,14 +9052,6 @@ - - - - - - - - @@ -16273,30 +9065,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -16305,23 +9073,12 @@ - - - - - - - - - - - @@ -16331,30 +9088,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -16363,14 +9096,6 @@ - - - - - - - - @@ -16384,30 +9109,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -16416,43 +9117,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -16461,14 +9130,6 @@ - - - - - - - - @@ -16477,30 +9138,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -16509,51 +9146,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -16562,23 +9154,12 @@ - - - - - - - - - - - @@ -16588,30 +9169,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -16620,24 +9177,11 @@ - - - - - - - - - - - - - @@ -16646,30 +9190,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -16678,23 +9198,12 @@ - - - - - - - - - - - @@ -16704,30 +9213,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -16736,14 +9221,6 @@ - - - - - - - - @@ -16752,22 +9229,6 @@ - - - - - - - - - - - - - - - - @@ -16776,22 +9237,6 @@ - - - - - - - - - - - - - - - - @@ -16808,22 +9253,6 @@ - - - - - - - - - - - - - - - - @@ -16832,22 +9261,6 @@ - - - - - - - - - - - - - - - - @@ -16856,14 +9269,6 @@ - - - - - - - - @@ -16880,22 +9285,6 @@ - - - - - - - - - - - - - - - - @@ -16912,22 +9301,6 @@ - - - - - - - - - - - - - - - - @@ -16936,14 +9309,6 @@ - - - - - - - - @@ -16965,22 +9330,6 @@ - - - - - - - - - - - - - - - - @@ -16997,22 +9346,6 @@ - - - - - - - - - - - - - - - - @@ -17021,14 +9354,6 @@ - - - - - - - - @@ -17045,22 +9370,6 @@ - - - - - - - - - - - - - - - - @@ -17077,22 +9386,6 @@ - - - - - - - - - - - - - - - - @@ -17109,22 +9402,6 @@ - - - - - - - - - - - - - - - - @@ -17133,22 +9410,6 @@ - - - - - - - - - - - - - - - - @@ -17165,22 +9426,6 @@ - - - - - - - - - - - - - - - - @@ -17190,27 +9435,11 @@ - - - - - - - - - - - - - - - - - - + + - - + + @@ -17229,22 +9458,6 @@ - - - - - - - - - - - - - - - - @@ -17261,22 +9474,6 @@ - - - - - - - - - - - - - - - - @@ -17296,25 +9493,6 @@ - - - - - - - - - - - - - - - - - - - @@ -17331,22 +9509,6 @@ - - - - - - - - - - - - - - - - @@ -17363,22 +9525,6 @@ - - - - - - - - - - - - - - - - @@ -17395,14 +9541,6 @@ - - - - - - - - @@ -17411,22 +9549,6 @@ - - - - - - - - - - - - - - - - @@ -17435,14 +9557,6 @@ - - - - - - - - @@ -17459,22 +9573,6 @@ - - - - - - - - - - - - - - - - @@ -17483,22 +9581,6 @@ - - - - - - - - - - - - - - - - @@ -17523,22 +9605,6 @@ - - - - - - - - - - - - - - - - @@ -17555,22 +9621,6 @@ - - - - - - - - - - - - - - - - @@ -17579,22 +9629,6 @@ - - - - - - - - - - - - - - - - @@ -17611,22 +9645,6 @@ - - - - - - - - - - - - - - - - @@ -17651,14 +9669,6 @@ - - - - - - - - @@ -17675,14 +9685,6 @@ - - - - - - - - @@ -17691,14 +9693,6 @@ - - - - - - - - @@ -17715,22 +9709,6 @@ - - - - - - - - - - - - - - - - @@ -17739,22 +9717,6 @@ - - - - - - - - - - - - - - - - @@ -17763,22 +9725,6 @@ - - - - - - - - - - - - - - - - @@ -17787,22 +9733,6 @@ - - - - - - - - - - - - - - - - @@ -17811,22 +9741,6 @@ - - - - - - - - - - - - - - - - @@ -17835,22 +9749,6 @@ - - - - - - - - - - - - - - - - @@ -17859,22 +9757,6 @@ - - - - - - - - - - - - - - - - @@ -17883,14 +9765,6 @@ - - - - - - - - @@ -17908,59 +9782,22 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -17978,32 +9815,15 @@ - - - - - - - - - - - - - - - - - @@ -18011,17 +9831,6 @@ - - - - - - - - - - - @@ -18033,24 +9842,6 @@ - - - - - - - - - - - - - - - - - - @@ -18077,16 +9868,6 @@ - - - - - - - - - - @@ -18096,19 +9877,6 @@ - - - - - - - - - - - - - @@ -18125,60 +9893,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -18204,9 +9923,6 @@ - - - @@ -18232,14 +9948,6 @@ - - - - - - - - @@ -18256,30 +9964,11 @@ - - - - - - - - - - - - - - - - - - - @@ -18304,14 +9993,6 @@ - - - - - - - - @@ -18338,14 +10019,6 @@ - - - - - - - - @@ -18363,9 +10036,6 @@ - - - @@ -18373,28 +10043,6 @@ - - - - - - - - - - - - - - - - - - - - - - @@ -18406,22 +10054,6 @@ - - - - - - - - - - - - - - - - @@ -18438,22 +10070,6 @@ - - - - - - - - - - - - - - - - @@ -18470,22 +10086,6 @@ - - - - - - - - - - - - - - - - @@ -18502,22 +10102,6 @@ - - - - - - - - - - - - - - - - @@ -18531,23 +10115,7 @@ - - - - - - - - - - - - - - - - - + @@ -18558,65 +10126,16 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -18626,17 +10145,11 @@ - - - - - - @@ -18723,39 +10236,17 @@ - - - - - - - - - - - - - - - - - - - - - - @@ -18773,21 +10264,6 @@ - - - - - - - - - - - - - - - @@ -18821,32 +10297,10 @@ - - - - - - - - - - - - - - - - - - - - - - @@ -18858,21 +10312,10 @@ - - - - - - - - - - - @@ -18883,15 +10326,9 @@ - - - - - - @@ -18902,9 +10339,6 @@ - - - @@ -18913,9 +10347,6 @@ - - - @@ -18928,32 +10359,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -18962,29 +10367,6 @@ - - - - - - - - - - - - - - - - - - - - - - - @@ -18993,29 +10375,6 @@ - - - - - - - - - - - - - - - - - - - - - - - @@ -19024,24 +10383,6 @@ - - - - - - - - - - - - - - - - - - @@ -19058,21 +10399,10 @@ - - - - - - - - - - - @@ -19082,14 +10412,6 @@ - - - - - - - - @@ -19098,16 +10420,6 @@ - - - - - - - - - - @@ -19124,22 +10436,6 @@ - - - - - - - - - - - - - - - - @@ -19147,9 +10443,6 @@ - - - @@ -19206,26 +10499,11 @@ - - - - - - - - - - - - - - - @@ -19249,11 +10527,6 @@ - - - - - @@ -19262,14 +10535,6 @@ - - - - - - - - @@ -19294,14 +10559,6 @@ - - - - - - - - @@ -19310,14 +10567,6 @@ - - - - - - - - @@ -19339,27 +10588,6 @@ - - - - - - - - - - - - - - - - - - - - - @@ -19410,30 +10638,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -19455,18 +10659,10 @@ - - - - - - - - @@ -19476,14 +10672,6 @@ - - - - - - - - @@ -19504,17 +10692,11 @@ - - - - - - @@ -19532,22 +10714,6 @@ - - - - - - - - - - - - - - - - @@ -19576,9 +10742,6 @@ - - - @@ -19586,41 +10749,26 @@ - - - - - - - - - - - - - - - @@ -19633,96 +10781,41 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -19738,25 +10831,6 @@ - - - - - - - - - - - - - - - - - - - @@ -19773,25 +10847,6 @@ - - - - - - - - - - - - - - - - - - - @@ -19801,22 +10856,6 @@ - - - - - - - - - - - - - - - - @@ -19832,25 +10871,6 @@ - - - - - - - - - - - - - - - - - - - @@ -19867,25 +10887,6 @@ - - - - - - - - - - - - - - - - - - - @@ -20019,9 +11020,6 @@ - - - @@ -20084,14 +11082,6 @@ - - - - - - - - @@ -20190,22 +11180,6 @@ - - - - - - - - - - - - - - - - @@ -20235,14 +11209,6 @@ - - - - - - - - @@ -20267,11 +11233,6 @@ - - - - - @@ -20297,11 +11258,6 @@ - - - - - @@ -20325,63 +11281,16 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -20398,14 +11307,6 @@ - - - - - - - - @@ -20414,14 +11315,6 @@ - - - - - - - - @@ -20430,11 +11323,6 @@ - - - - - diff --git a/scripts/sonarqube.sh b/scripts/sonarqube.sh index 2b60e3be6c2..7192029a1cc 100644 --- a/scripts/sonarqube.sh +++ b/scripts/sonarqube.sh @@ -37,4 +37,4 @@ then git fetch --no-tags --force --progress -- $url +refs/heads/$GIT_BRANCH_DEST:refs/remotes/$remote/$GIT_BRANCH_DEST fi -./gradlew --dependency-verification lenient sonarqube --stacktrace --no-daemon \ No newline at end of file +./gradlew sonarqube --stacktrace --no-daemon \ No newline at end of file From 5672497578a984d665cc863960e7d4749d4c25a3 Mon Sep 17 00:00:00 2001 From: Xavier Molloy Date: Thu, 26 Mar 2026 07:40:36 +0100 Subject: [PATCH 115/260] chore: [ANDROAPP-7393] OpenId tests [skip size] (#4509) * chore: [ANDROAPP-7393] OpenId tests * fix: update tests * chore: update dependency verification metadata [skip ci] --------- Co-authored-by: @dhis2-bot --- gradle/verification-metadata.xml | 250 ++++++++ .../main/domain/usecase/OpenIdLoginTest.kt | 555 ++++++++++++++++++ 2 files changed, 805 insertions(+) create mode 100644 login/src/commonTest/kotlin/org/dhis2/mobile/login/main/domain/usecase/OpenIdLoginTest.kt diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 8dad06e2ec2..a9c2affeb03 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -953,6 +953,11 @@ + + + + + @@ -969,6 +974,11 @@ + + + + + @@ -1025,6 +1035,11 @@ + + + + + @@ -1090,6 +1105,11 @@ + + + + + @@ -5484,6 +5504,11 @@ + + + + + @@ -7925,6 +7950,11 @@ + + + + + @@ -8254,6 +8284,11 @@ + + + + + @@ -8267,6 +8302,11 @@ + + + + + @@ -8285,6 +8325,11 @@ + + + + + @@ -8308,6 +8353,11 @@ + + + + + @@ -8334,6 +8384,11 @@ + + + + + @@ -8350,6 +8405,11 @@ + + + + + @@ -8368,6 +8428,11 @@ + + + + + @@ -8386,6 +8451,11 @@ + + + + + @@ -8399,6 +8469,11 @@ + + + + + @@ -8407,6 +8482,11 @@ + + + + + @@ -8423,6 +8503,11 @@ + + + + + @@ -8431,6 +8516,11 @@ + + + + + @@ -8439,6 +8529,11 @@ + + + + + @@ -8447,6 +8542,11 @@ + + + + + @@ -8460,6 +8560,11 @@ + + + + + @@ -8486,6 +8591,11 @@ + + + + + @@ -8504,6 +8614,11 @@ + + + + + @@ -8520,6 +8635,11 @@ + + + + + @@ -8538,6 +8658,11 @@ + + + + + @@ -8655,6 +8780,11 @@ + + + + + @@ -8668,6 +8798,11 @@ + + + + + @@ -8716,6 +8851,11 @@ + + + + + @@ -8742,6 +8882,11 @@ + + + + + @@ -8813,6 +8958,11 @@ + + + + + @@ -8836,6 +8986,11 @@ + + + + + @@ -8852,6 +9007,11 @@ + + + + + @@ -8875,6 +9035,11 @@ + + + + + @@ -8891,6 +9056,11 @@ + + + + + @@ -8914,6 +9084,11 @@ + + + + + @@ -8953,6 +9128,11 @@ + + + + + @@ -8974,6 +9154,11 @@ + + + + + @@ -8990,6 +9175,11 @@ + + + + + @@ -9013,6 +9203,11 @@ + + + + + @@ -9029,6 +9224,11 @@ + + + + + @@ -9052,6 +9252,11 @@ + + + + + @@ -9073,6 +9278,11 @@ + + + + + @@ -9096,6 +9306,11 @@ + + + + + @@ -9117,6 +9332,11 @@ + + + + + @@ -9130,6 +9350,11 @@ + + + + + @@ -9146,6 +9371,11 @@ + + + + + @@ -9154,6 +9384,11 @@ + + + + + @@ -9177,6 +9412,11 @@ + + + + + @@ -9198,6 +9438,11 @@ + + + + + @@ -9221,6 +9466,11 @@ + + + + + diff --git a/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/domain/usecase/OpenIdLoginTest.kt b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/domain/usecase/OpenIdLoginTest.kt new file mode 100644 index 00000000000..6ca9f581125 --- /dev/null +++ b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/domain/usecase/OpenIdLoginTest.kt @@ -0,0 +1,555 @@ +package org.dhis2.mobile.login.main.domain.usecase + +import kotlinx.coroutines.test.runTest +import org.dhis2.mobile.login.main.data.LoginRepository +import org.dhis2.mobile.login.main.domain.model.LoginResult +import org.junit.Before +import org.junit.Test +import org.mockito.kotlin.any +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock +import org.mockito.kotlin.never +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever +import kotlin.test.assertEquals +import kotlin.test.assertIs + +class OpenIdLoginTest { + private val repository: LoginRepository = mock() + private lateinit var openIdLogin: OpenIdLogin + + private val serverUrl = "https://test.server.org" + private val isNetworkAvailable = true + private val clientId = "test-client-id" + private val redirectUri = "dhis2://oauth" + private val discoveryUri = "https://test.server.org/.well-known/openid-configuration" + private val authorizationUri = "https://test.server.org/oauth/authorize" + private val tokenUrl = "https://test.server.org/oauth/token" + private val username = "openIdUser" + + @Before + fun setUp() { + openIdLogin = OpenIdLogin(repository) + } + + @Test + fun `GIVEN successful OpenID login with no existing accounts WHEN user logs in THEN biometric credentials are NOT deleted`() = + runTest { + // GIVEN - User has no other accounts (numberOfAccounts = 0) + whenever( + repository.loginWithOpenId( + serverUrl = serverUrl, + isNetworkAvailable = isNetworkAvailable, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ), + ) doReturn Result.success(Unit) + whenever(repository.getUsername()) doReturn username + whenever(repository.numberOfAccounts()) doReturn 0 + whenever(repository.displayTrackingMessage()) doReturn false + whenever(repository.initialSyncDone(serverUrl, username)) doReturn true + + // WHEN - User logs in successfully with OpenID + val result = + openIdLogin( + serverUrl = serverUrl, + isNetworkAvailable = isNetworkAvailable, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ) + + // THEN - Login is successful + assertIs(result) + verify(repository).unlockSession() + verify(repository).updateAvailableUsers(username) + verify(repository).updateServerUrls(serverUrl) + verify(repository).numberOfAccounts() + // Biometric credentials should NOT be deleted when numberOfAccounts < 1 + verify(repository, never()).deleteBiometricCredentials() + } + + @Test + fun `GIVEN successful OpenID login with multiple existing accounts WHEN user logs in THEN biometric credentials are deleted`() = + runTest { + // GIVEN - User has multiple existing accounts (numberOfAccounts = 3) + whenever( + repository.loginWithOpenId( + serverUrl = serverUrl, + isNetworkAvailable = isNetworkAvailable, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ), + ) doReturn Result.success(Unit) + whenever(repository.getUsername()) doReturn username + whenever(repository.numberOfAccounts()) doReturn 3 + whenever(repository.displayTrackingMessage()) doReturn false + whenever(repository.initialSyncDone(serverUrl, username)) doReturn true + + // WHEN - User logs in successfully with OpenID + val result = + openIdLogin( + serverUrl = serverUrl, + isNetworkAvailable = isNetworkAvailable, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ) + + // THEN - Login is successful and biometric credentials are deleted + assertIs(result) + verify(repository).unlockSession() + verify(repository).updateAvailableUsers(username) + verify(repository).updateServerUrls(serverUrl) + verify(repository).numberOfAccounts() + verify(repository).deleteBiometricCredentials() + } + + @Test + fun `GIVEN failed OpenID login WHEN user attempts to log in THEN biometric credentials are NOT deleted`() = + runTest { + // GIVEN - OpenID login will fail + val errorMessage = "OpenID authentication failed" + whenever( + repository.loginWithOpenId( + serverUrl = serverUrl, + isNetworkAvailable = isNetworkAvailable, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ), + ) doReturn Result.failure(Exception(errorMessage)) + + // WHEN - User attempts to log in with OpenID + val result = + openIdLogin( + serverUrl = serverUrl, + isNetworkAvailable = isNetworkAvailable, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ) + + // THEN - Login fails and biometric credentials are NOT deleted + assertIs(result) + assertEquals(errorMessage, result.message) + verify(repository, never()).getUsername() + verify(repository, never()).unlockSession() + verify(repository, never()).updateAvailableUsers(any()) + verify(repository, never()).updateServerUrls(any()) + verify(repository, never()).numberOfAccounts() + verify(repository, never()).deleteBiometricCredentials() + } + + @Test + fun `GIVEN successful OpenID login WHEN repository operations are executed THEN they are called in correct order`() = + runTest { + // GIVEN + whenever( + repository.loginWithOpenId( + serverUrl = serverUrl, + isNetworkAvailable = isNetworkAvailable, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ), + ) doReturn Result.success(Unit) + whenever(repository.getUsername()) doReturn username + whenever(repository.numberOfAccounts()) doReturn 2 + whenever(repository.displayTrackingMessage()) doReturn false + whenever(repository.initialSyncDone(serverUrl, username)) doReturn true + + // WHEN + openIdLogin( + serverUrl = serverUrl, + isNetworkAvailable = isNetworkAvailable, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ) + + // THEN - Verify the order of operations + val inOrder = org.mockito.kotlin.inOrder(repository) + inOrder.verify(repository).loginWithOpenId( + serverUrl = serverUrl, + isNetworkAvailable = isNetworkAvailable, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ) + inOrder.verify(repository).getUsername() + inOrder.verify(repository).unlockSession() + inOrder.verify(repository).updateAvailableUsers(username) + inOrder.verify(repository).updateServerUrls(serverUrl) + inOrder.verify(repository).numberOfAccounts() + inOrder.verify(repository).deleteBiometricCredentials() + inOrder.verify(repository).displayTrackingMessage() + inOrder.verify(repository).initialSyncDone(serverUrl, username) + } + + @Test + fun `GIVEN network is offline WHEN user logs in with OpenID THEN login is attempted with offline flag`() = + runTest { + // GIVEN - Network is unavailable + val isOffline = false + whenever( + repository.loginWithOpenId( + serverUrl = serverUrl, + isNetworkAvailable = isOffline, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ), + ) doReturn Result.success(Unit) + whenever(repository.getUsername()) doReturn username + whenever(repository.numberOfAccounts()) doReturn 0 + whenever(repository.displayTrackingMessage()) doReturn false + whenever(repository.initialSyncDone(serverUrl, username)) doReturn true + + // WHEN - User attempts to log in offline + val result = + openIdLogin( + serverUrl = serverUrl, + isNetworkAvailable = isOffline, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ) + + // THEN - Login is successful with offline flag + assertIs(result) + verify(repository).loginWithOpenId( + serverUrl = serverUrl, + isNetworkAvailable = isOffline, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ) + } + + @Test + fun `GIVEN all success flags are true WHEN OpenID login succeeds THEN all flags are reflected in result`() = + runTest { + // GIVEN - Both tracking message and initial sync are required + whenever( + repository.loginWithOpenId( + serverUrl = serverUrl, + isNetworkAvailable = isNetworkAvailable, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ), + ) doReturn Result.success(Unit) + whenever(repository.getUsername()) doReturn username + whenever(repository.numberOfAccounts()) doReturn 0 + whenever(repository.displayTrackingMessage()) doReturn true + whenever(repository.initialSyncDone(serverUrl, username)) doReturn true + + // WHEN - User logs in successfully + val result = + openIdLogin( + serverUrl = serverUrl, + isNetworkAvailable = isNetworkAvailable, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ) + + // THEN - Both flags are true + assertIs(result) + assertEquals(true, result.displayTrackingMessage) + assertEquals(true, result.initialSyncDone) + } + + @Test + fun `GIVEN all success flags are false WHEN OpenID login succeeds THEN all flags are false in result`() = + runTest { + // GIVEN - Neither tracking message nor initial sync are required + whenever( + repository.loginWithOpenId( + serverUrl = serverUrl, + isNetworkAvailable = isNetworkAvailable, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ), + ) doReturn Result.success(Unit) + whenever(repository.getUsername()) doReturn username + whenever(repository.numberOfAccounts()) doReturn 0 + whenever(repository.displayTrackingMessage()) doReturn false + whenever(repository.initialSyncDone(serverUrl, username)) doReturn false + + // WHEN - User logs in successfully + val result = + openIdLogin( + serverUrl = serverUrl, + isNetworkAvailable = isNetworkAvailable, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ) + + // THEN - Both flags are false + assertIs(result) + assertEquals(false, result.displayTrackingMessage) + assertEquals(false, result.initialSyncDone) + } + + @Test + fun `GIVEN custom redirect URI scheme WHEN OpenID login succeeds THEN custom scheme is handled`() = + runTest { + // GIVEN - Custom app redirect URI + val customRedirectUri = "myapp://oauth/callback" + whenever( + repository.loginWithOpenId( + serverUrl = serverUrl, + isNetworkAvailable = isNetworkAvailable, + clientId = clientId, + redirectUri = customRedirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ), + ) doReturn Result.success(Unit) + whenever(repository.getUsername()) doReturn username + whenever(repository.numberOfAccounts()) doReturn 0 + whenever(repository.displayTrackingMessage()) doReturn false + whenever(repository.initialSyncDone(serverUrl, username)) doReturn true + + // WHEN - User logs in with custom redirect URI + val result = + openIdLogin( + serverUrl = serverUrl, + isNetworkAvailable = isNetworkAvailable, + clientId = clientId, + redirectUri = customRedirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ) + + // THEN - Login succeeds with custom redirect URI + assertIs(result) + verify(repository).loginWithOpenId( + serverUrl = serverUrl, + isNetworkAvailable = isNetworkAvailable, + clientId = clientId, + redirectUri = customRedirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ) + } + + @Test + fun `GIVEN different server URL formats WHEN OpenID login succeeds THEN server URL is used correctly`() = + runTest { + // GIVEN - Server URL with path + val serverWithPath = "https://test.server.org/dhis" + whenever( + repository.loginWithOpenId( + serverUrl = serverWithPath, + isNetworkAvailable = isNetworkAvailable, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ), + ) doReturn Result.success(Unit) + whenever(repository.getUsername()) doReturn username + whenever(repository.numberOfAccounts()) doReturn 0 + whenever(repository.displayTrackingMessage()) doReturn false + whenever(repository.initialSyncDone(serverWithPath, username)) doReturn true + + // WHEN - User logs in with server URL containing path + val result = + openIdLogin( + serverUrl = serverWithPath, + isNetworkAvailable = isNetworkAvailable, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ) + + // THEN - Server URL is passed correctly + assertIs(result) + verify(repository).updateServerUrls(serverWithPath) + verify(repository).initialSyncDone(serverWithPath, username) + } + + @Test + fun `GIVEN repository throws runtime exception WHEN OpenID login fails THEN exception message is returned`() = + runTest { + // GIVEN - Repository throws RuntimeException + val runtimeError = "OpenID provider unavailable" + whenever( + repository.loginWithOpenId( + serverUrl = serverUrl, + isNetworkAvailable = isNetworkAvailable, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ), + ) doReturn Result.failure(RuntimeException(runtimeError)) + + // WHEN - User attempts to log in + val result = + openIdLogin( + serverUrl = serverUrl, + isNetworkAvailable = isNetworkAvailable, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ) + + // THEN - Error message is propagated + assertIs(result) + assertEquals(runtimeError, result.message) + } + + @Test + fun `GIVEN successful OpenID login WHEN unlockSession is called THEN it is always executed`() = + runTest { + // GIVEN - Successful OpenID login + whenever( + repository.loginWithOpenId( + serverUrl = serverUrl, + isNetworkAvailable = isNetworkAvailable, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ), + ) doReturn Result.success(Unit) + whenever(repository.getUsername()) doReturn username + whenever(repository.numberOfAccounts()) doReturn 0 + whenever(repository.displayTrackingMessage()) doReturn false + whenever(repository.initialSyncDone(serverUrl, username)) doReturn true + + // WHEN - User logs in + openIdLogin( + serverUrl = serverUrl, + isNetworkAvailable = isNetworkAvailable, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ) + + // THEN - Session is always unlocked on success + verify(repository).unlockSession() + } + + @Test + fun `GIVEN failed OpenID login WHEN unlockSession would be called THEN it is never executed`() = + runTest { + // GIVEN - Failed OpenID login + whenever( + repository.loginWithOpenId( + serverUrl = serverUrl, + isNetworkAvailable = isNetworkAvailable, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ), + ) doReturn Result.failure(Exception("OpenID failed")) + + // WHEN - User attempts to log in + openIdLogin( + serverUrl = serverUrl, + isNetworkAvailable = isNetworkAvailable, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ) + + // THEN - Session is never unlocked on failure + verify(repository, never()).unlockSession() + } + + @Test + fun `GIVEN username with special characters WHEN OpenID login succeeds THEN username is handled correctly`() = + runTest { + // GIVEN - Username contains special characters + val specialUsername = "user@example.com" + whenever( + repository.loginWithOpenId( + serverUrl = serverUrl, + isNetworkAvailable = isNetworkAvailable, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ), + ) doReturn Result.success(Unit) + whenever(repository.getUsername()) doReturn specialUsername + whenever(repository.numberOfAccounts()) doReturn 0 + whenever(repository.displayTrackingMessage()) doReturn false + whenever(repository.initialSyncDone(serverUrl, specialUsername)) doReturn true + + // WHEN - User logs in successfully + val result = + openIdLogin( + serverUrl = serverUrl, + isNetworkAvailable = isNetworkAvailable, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + ) + + // THEN - Special username is used correctly + assertIs(result) + verify(repository).updateAvailableUsers(specialUsername) + verify(repository).initialSyncDone(serverUrl, specialUsername) + } +} From 17167164bba054ebcac9dc4ac475e86b2e7f3c0b Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Thu, 26 Mar 2026 14:31:52 +0100 Subject: [PATCH 116/260] fix(translations): sync translations from transifex (develop) [skip size] (#4750) * fix(translations): sync translations from transifex (develop) * fix(translations): remove unnecessary escapes for question marks in strings.xml files --------- Co-authored-by: andresmr --- app/src/main/res/values-ar-rIQ/strings.xml | 9 +++++++++ app/src/main/res/values-ar/strings.xml | 2 -- app/src/main/res/values-bn/strings.xml | 3 +-- app/src/main/res/values-ckb/strings.xml | 9 ++++++++- app/src/main/res/values-da/strings.xml | 13 ++++++++++++- app/src/main/res/values-en-rUS/strings.xml | 7 +++++++ app/src/main/res/values-es-rES/strings.xml | 3 --- app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 3 +-- app/src/main/res/values-hi-rIN/strings.xml | 13 ++++++++++++- app/src/main/res/values-id/strings.xml | 3 +-- app/src/main/res/values-km/strings.xml | 5 +++-- app/src/main/res/values-lo/strings.xml | 3 --- app/src/main/res/values-my/strings.xml | 17 ++++++++++++++--- app/src/main/res/values-nb/strings.xml | 2 +- app/src/main/res/values-ne/strings.xml | 5 ++++- app/src/main/res/values-nl/strings.xml | 2 -- app/src/main/res/values-or/strings.xml | 3 +++ app/src/main/res/values-prs/strings.xml | 18 ++++++++++++++++-- app/src/main/res/values-ps/strings.xml | 17 +++++++++++++++-- app/src/main/res/values-pt-rBR/strings.xml | 16 +++++++++++++++- app/src/main/res/values-pt/strings.xml | 2 -- app/src/main/res/values-ro/strings.xml | 8 ++++++++ app/src/main/res/values-ru/strings.xml | 2 -- app/src/main/res/values-si/strings.xml | 8 ++++++-- app/src/main/res/values-sv/strings.xml | 6 ++++-- app/src/main/res/values-tet/strings.xml | 7 ++++++- app/src/main/res/values-tg/strings.xml | 13 +++++++++++-- app/src/main/res/values-uk/strings.xml | 2 -- app/src/main/res/values-ur/strings.xml | 16 ++++++++++++++-- app/src/main/res/values-uz-rUZ/strings.xml | 3 ++- app/src/main/res/values-uz/strings.xml | 3 +-- app/src/main/res/values-vi/strings.xml | 2 -- app/src/main/res/values-zh-rCN/strings.xml | 1 - commons/src/main/res/values-pt-rBR/strings.xml | 3 ++- .../composeResources/values-cs/strings.xml | 2 +- .../composeResources/values-en-rUS/strings.xml | 2 +- .../composeResources/values-hi-rIN/strings.xml | 2 +- .../composeResources/values-lo/strings.xml | 2 +- .../src/main/res/values-ar-rEG/strings.xml | 4 ++++ .../src/main/res/values-ar-rIQ/strings.xml | 7 +++++++ .../src/main/res/values-ar/strings.xml | 9 +++------ .../src/main/res/values-ckb/strings.xml | 5 ++++- .../src/main/res/values-en-rUS/strings.xml | 2 ++ .../src/main/res/values-es-rES/strings.xml | 5 ++++- .../src/main/res/values-fr/strings.xml | 13 ++++++++++++- .../src/main/res/values-hi-rIN/strings.xml | 5 +++-- .../src/main/res/values-id/strings.xml | 6 +++++- .../src/main/res/values-km/strings.xml | 6 ++++++ .../src/main/res/values-lo/strings.xml | 7 +++++++ .../src/main/res/values-my/strings.xml | 2 ++ .../src/main/res/values-nb/strings.xml | 6 ++++-- .../src/main/res/values-ne/strings.xml | 1 + .../src/main/res/values-nl/strings.xml | 1 + .../src/main/res/values-prs/strings.xml | 7 +++++-- .../src/main/res/values-ps/strings.xml | 4 ++-- .../src/main/res/values-pt-rBR/strings.xml | 6 ++++++ .../src/main/res/values-ro/strings.xml | 5 +++++ .../src/main/res/values-ru/strings.xml | 7 +------ .../src/main/res/values-si/strings.xml | 3 +++ .../src/main/res/values-sv/strings.xml | 6 +++++- .../src/main/res/values-tet/strings.xml | 3 +++ .../src/main/res/values-tg/strings.xml | 5 +++++ .../src/main/res/values-uk/strings.xml | 5 ++++- .../src/main/res/values-ur/strings.xml | 7 +++++-- .../src/main/res/values-uz/strings.xml | 4 ++-- .../src/main/res/values-zh-rCN/strings.xml | 5 ++++- 67 files changed, 295 insertions(+), 89 deletions(-) create mode 100644 stock-usecase/src/main/res/values-ar-rEG/strings.xml diff --git a/app/src/main/res/values-ar-rIQ/strings.xml b/app/src/main/res/values-ar-rIQ/strings.xml index 72f34cc8efc..2e6c4b5bb71 100644 --- a/app/src/main/res/values-ar-rIQ/strings.xml +++ b/app/src/main/res/values-ar-rIQ/strings.xml @@ -10,18 +10,24 @@ مشاركة البحث + + فتح مكتمل تم الإلغاء فعال خطأ + + + تحديث تاريخ الاستحقاق إلغاء حذف + تعديل الرئيسية قبول @@ -31,8 +37,11 @@ البحث + + تاريخ الواقعة + التالي السمات علاقات diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index ac4bc6a211a..a89d1c6cf89 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -12,7 +12,6 @@ خطأ في المزامنة حدث خطأ أثناء المزامنة. يرجى اعادة المحاولة. انتهت المزامنة ولكن لم نتلق تأكيدًا من الخادم لجميع السجلات. هذه السجلات لا تزال تحمل علامة \"غير مزامن\" في التطبيق. نوصي بإعادة محاولة المزامنة. - إحالة @@ -538,7 +537,6 @@ إظهار الوصف إخفاء الوصف استخدام كلمة المرور - %s الأخطاء %s الخطأ diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 0b0ac6d887a..1788146de07 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -3,11 +3,10 @@ ভুল সম্পন্ন ভুল + নির্ধারিত তারিখ অবস্থা - - পরিদর্শনের তারিখ সম্পন্ন diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index 5b119203d87..e80cde13ada 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -18,19 +18,26 @@ چاڵاک هەڵە + + + + نويَ كردنةوة لابردن سرينةوة + دةستكاري ماڵةوة پەسندکردن لابردن ريكخستن پێگە + + طةران - ماوة + داهاتوو تةواو ڕووداوەکان diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 348da469704..6eb6eb75ffa 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -1,18 +1,27 @@ Error + + Events + Account recovery + Daily Weekly Monthly Yearly + + Open Read only Active Error + + + Update @@ -22,9 +31,11 @@ Cancel Settings Status - + + Incident date + Next OK Events diff --git a/app/src/main/res/values-en-rUS/strings.xml b/app/src/main/res/values-en-rUS/strings.xml index 6f9807a2bf9..66fa68dcf90 100644 --- a/app/src/main/res/values-en-rUS/strings.xml +++ b/app/src/main/res/values-en-rUS/strings.xml @@ -11,10 +11,13 @@ Enter positive integer or zero Enter positive integer Choose date + Error + Org unit Latitude Longitude + Due date Cat combo @@ -26,6 +29,8 @@ Add file Coordinates for the + + Incident date Share @@ -36,6 +41,8 @@ Close Formatting error Copied + + Polygon Attributes - %s Select time diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index b4a835b479b..ced5d354485 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -12,7 +12,6 @@ Error en sincronizacion La sincronizacion ha fallado. Intentelo de nuevo. La sincronización ha terminado pero no se ha recibido confirmación del servidor en algunos rescursos. Éstos estarán marcados como \"no sincronizados\" en la App. Recomendamos reintentar la sincronización. - Remitir @@ -79,7 +78,6 @@ Programas activos Admitir - Desactivar Este programa no admite más eventos @@ -495,7 +493,6 @@ evento Sincronizado Sincronizando %s... - Hay %s programa con una configuración específica Hay %s programas con configuraciones específicas diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index ffd064991e9..0f74deb2377 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -12,7 +12,6 @@ Error en sincronizacion La sincronizacion ha fallado. Intentelo de nuevo. La sincronización ha terminado pero no se ha recibido confirmación del servidor en algunos rescursos. Éstos estarán marcados como \"no sincronizados\" en la App. Recomendamos reintentar la sincronización. - Ingresar %s Editar / Omitir %s Remitir diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index b1d833b6380..28a302efe58 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -12,7 +12,6 @@ Problème de synchronisation Une erreur s´est produite pendant sync. Essayez à nouveau. La synchronisation est terminée, mais nous n\'avons pas reçu de confirmation du serveur pour tous les enregistrements. Ces enregistrements sont toujours marqués comme \"hors ligne\" dans l\'application. Nous vous recommandons de réessayer la synchronisation. - référence @@ -22,6 +21,7 @@ La configuration est prête vos données sont prêtes Récupération de compte + Quotidien Hebdomadaire @@ -509,7 +509,6 @@ Afficher la description Masquer la description Transférer - %s erreur %s erreurs diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml index 85568cd2f96..72145803d40 100644 --- a/app/src/main/res/values-hi-rIN/strings.xml +++ b/app/src/main/res/values-hi-rIN/strings.xml @@ -21,26 +21,36 @@ लंबा अक्षर दर्ज करें नंबर दर्ज करें दिन चुनें + + + खोलें इवेंट कंप्लीटेड पूरा हुआ त्रुटि + + + अपडेट करें अक्षांश देशांतर + रद्द करें हटाएं + संपादन करें इवेंट्स स्वीकार करें रद्द करें सेटिंग्स + + सर्च करें / खोजें फ़ाइल जोड़ें - + आगे ठीक है इवेंट्स @@ -53,6 +63,7 @@ संबंध बंद करें सिंक हो रहा है… + आज कल (बिता हुआ) इस सप्ताह diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 0e94737b601..324bf88560d 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -11,7 +11,6 @@ Sync error Terjadi kesalahan saat sinkronisasi. Silakan coba kembali. - Rujukan @@ -21,6 +20,7 @@ Konfigurasi Anda siap digunakan Data Anda tersedia Penyelamatan akun + Harian Mingguan @@ -449,7 +449,6 @@ Tampilkan kurang Sinkronkan Tampilkan keterangan - Terdapat %s program dengan pengaturan khusus diff --git a/app/src/main/res/values-km/strings.xml b/app/src/main/res/values-km/strings.xml index ef7758df9e3..6a696fc2706 100644 --- a/app/src/main/res/values-km/strings.xml +++ b/app/src/main/res/values-km/strings.xml @@ -19,6 +19,7 @@ ការកំណត់​រចនាសម្ព័ន្ធរបស់អ្នករួចរាល់ ទិន្នន័យរបស់អ្នករួចរាល់ ស្តារគណនីឡើងវិញ + រាល់​ថ្ងៃ រាល់​សប្ដាហ៍ @@ -36,6 +37,7 @@ បញ្ជូលទិន្នន័យជាលេខ (វិជ្ជមាន រឺ លេខ ០) បញ្ជូលទិន្នន័យជាលេខ (វិជ្ជមាន) ជ្រើសរើសថ្ងៃខែឆ្នាំ + បើក @@ -46,6 +48,7 @@ បញ្ចូន ដើម្បីធ្វើបច្ចុប្បន្នភាព កំហុសបច្ចេកទេស + @@ -73,7 +76,6 @@ ព្រឹត្តិការណ៏ ផ្ទាំងដើម ចាកចេញ - ១ម៉ោង ១ថ្ងៃ (លំនាំដើម) ហត្ថកម្ម @@ -138,7 +140,6 @@ កំណត់កម្មវិធីឡើងវិញ ពិនិត្យទីនេះ​ រក្សាទុក​ - កំណែកម្មវិធី %s កំណែរ SDK: %s diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index a09d910bd56..d0b06a3ef4a 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -12,7 +12,6 @@ ຄໍາຜິດທີ່ເກີດຈາກການທໍາງານຮ່ວມກັນຂອງລະບົບ ມີຄໍາຜິດເກີດຂື້ນໃນຂະນະທີ່ລະບົບທໍາງານຮ່ວມກັນ. ກະລຸນາ, ທົດລອງເບີ່ງອີກ... ອັບເດດຂໍ້ມູນໃຫ້ຄືກັນສຳເລັດແລ້ວ ແຕ່ພວກເຮົາບໍ່ໄດ້ຮັບການຢືນຢັນຈາກເຄື່ອງຄອມພິວເຕິ້ໜ່ວຍແມ່ສຳລັບບັນທຶກທັງໝົດ. ເຫຼົ່ານັ້ນຍັງຖືກໝາຍເປັນ \"ອອບລາຍ\" ໃນແອັບ. ພວກເຮົາແນະນຳໃຫ້ລອງການຕັ້ງຄ່າການຊິ້ງຂໍ້ມູນອີກຄັ້ງ. - ປ້ອນ%s ປ້ອນ / ຂ້າມ%s ການສົ່ງຕໍ່ @@ -294,7 +293,6 @@ ຄວາມປອດໄພ - ກຳລັງນຳໃຊ້ຕົວກອງ ບໍ່ໄດ້ໃຊ້ຕົວກອງ ຊ່ວງເວລາ @@ -529,7 +527,6 @@ ສະແດງຄຳອະທິບາຍ ເຊື່ອງຄຳອະທິບາຍ ໂອນ - %s ຂໍ້ຜິດພາດ diff --git a/app/src/main/res/values-my/strings.xml b/app/src/main/res/values-my/strings.xml index cf0fe956d54..bce5f17f333 100644 --- a/app/src/main/res/values-my/strings.xml +++ b/app/src/main/res/values-my/strings.xml @@ -1,21 +1,31 @@ အမှား + + Events + ညွှန်းပို့ခြင်း ပြန်လည်အသုံးပြုနိုင်ရန်သိမ်းဆည်းခြင်း + နေ့စဉ် အပတ်စဉ် လစဉ် နှစ်စဉ် ရက်စွဲ ကိုရွေးချယ်ပါ + + + Open ဖတ်ရန်အတွက်သာ လုပ်ဆောင်နိုင်သည် အမှား + + + ‌နောက်ဆုံးသတင်းကိုရစေခြင်း ဖွဲ့စည်းပုံယူနစ် @@ -27,17 +37,18 @@ ဖျက်ဆီးသည် တည်းဖြတ်သည် - ပင်မစာမျက်နှာ ထွက်ရန် ပယ်ဖျက်သည် တည်ဆောက်ထားသည့်အနေအထား အခြေအနေ - - မှတ်စုအသစ်ရေးရန် + + + Incident date အချိန်ကာလ + ရှေ့သို့ လက်ခံသည် Events diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 1ceefaee86c..54d15587664 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -20,6 +20,7 @@ Din konfigurasjon er klar Dine data er klare Kontogjenoppretting + Daglig Ukentlig @@ -430,7 +431,6 @@ Vis beskrivelse Skjul beskrivelse Overfør - Det er %s program med spesifikke innstillinger Det er %s programmer med spesifikke innstillinger diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index 76227ed09d9..4463bcc4e0e 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -4,12 +4,15 @@ स्वीकार खोज + + खोल्नुहोस् - रद्द गर्नुहोस् स्वीकार रद्द गर्नुहोस् स्थिती + + खोज अबधि diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index c47e40f8106..fb49ae409fb 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -12,7 +12,6 @@ Synchronisatiefout Er is een fout opgetreden tijdens de synchronisatie. Probeer het opnieuw. De synchronisatie is voltooid, maar we hebben geen serverbevestiging ontvangen voor alle records. Die gegevens zijn nog steeds gemarkeerd als \"offline\" in de app. We raden aan om de synchronisatie opnieuw te proberen. - Verwijzing @@ -536,7 +535,6 @@ %s synchroniseren... Laat beschrijving zien Beschrijving verbergen - %s-fout %s fouten diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index d9bbfd28bb2..d9689d0b17a 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -6,8 +6,10 @@ ଧନାତ୍ମକ ପୂର୍ଣ୍ଣସଂଖ୍ୟା କିମ୍ବା ଶୂନ ପ୍ରବେଶ କରନ୍ତୁ ଧନାତ୍ମକ ପୂର୍ଣ୍ଣସଂଖ୍ୟା ପ୍ରବେଶ କରନ୍ତୁ ତାରିଖ ବାଛନ୍ତୁ + ଅକ୍ଷାଂଶ ଦ୍ରାଘିମା + ଗୃହ ୩୦ ମିନିଟ୍ @@ -19,6 +21,7 @@ କେବଳ ଧନାତ୍ମକ ସଂଖ୍ୟା କିମ୍ବା ଶୂନ ଅନୁମୋଦିତ ଗୃହ ସୂଚନା + ବହୁଭୂଜ ଆଜି ଗତକାଲି diff --git a/app/src/main/res/values-prs/strings.xml b/app/src/main/res/values-prs/strings.xml index d772fbefdde..7a00ed0a423 100644 --- a/app/src/main/res/values-prs/strings.xml +++ b/app/src/main/res/values-prs/strings.xml @@ -1,10 +1,14 @@ خطا + + پېښې + مراجعه بهبود حساب + روزنه هفته وار @@ -14,16 +18,22 @@ اشتراک جستجو + + باز کردن تنها قابل مطالعه میباشد تکمیل شد فعال خطا + + + تجدید عرض البلد طول البلد + معیاد گزارش @@ -34,9 +44,10 @@ برنامه های فعال ثبت نام + + تجدید غیر فعال - صفحه اصلی پذیرش انصراف @@ -49,9 +60,12 @@ تاریخ گزارش افزودن یاداشت + + تاریخ رویداد/ واقعه دوره + بعدی تأیید مشخصات @@ -68,7 +82,7 @@ اخطاریه رابطه/ وابستگی بستن - + چند ضلعی دوره امروز diff --git a/app/src/main/res/values-ps/strings.xml b/app/src/main/res/values-ps/strings.xml index c0dd876bf22..382c45bcba6 100644 --- a/app/src/main/res/values-ps/strings.xml +++ b/app/src/main/res/values-ps/strings.xml @@ -1,10 +1,14 @@ تېروته + + پېښې + مراجعه حساب بېرته ترلاسه کړئ + ورځني [ د مودې ډول ] اوونیز @@ -14,6 +18,8 @@ شریک یې کړئ جستجو + + خلاص یې کړئ یوازې یې ولولئ بشپړ شوی @@ -21,10 +27,14 @@ فعال تېروته + + + تجدید یا نوي یې کړئ لېټېټيوډ لانګېټيوډ + د راپور ورکولو موده @@ -35,9 +45,10 @@ فعال پروګرامونه نوم لیکنه یا شمولیت + + درست یې کړئ غېرې فعال یې کړئ - کور پاڼه د منلو وړ رد یې کړئ [ ژباړه ـ ردول ] @@ -50,9 +61,12 @@ د راپور نېټه نوټ ور اضافه کړئ + + د پېښې نېټه معیاد + راتلونکی سم دی پېښې @@ -66,7 +80,6 @@ خبرداری اړیکه بند یې کړئ - معیاد نن ورځ پرونۍ ورځ diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 01a33023b9b..a7fb14fc1ad 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -4,6 +4,7 @@ Transferência Recuperar Conta + Diário Semanal @@ -13,6 +14,8 @@ Partilhar Pesquisar + + Abrir Apenas leitura Concluído @@ -20,10 +23,14 @@ Activo Erro + + + Actualizar Latitude Longitude + Período de relatório @@ -32,9 +39,10 @@ Apagar Programas ativos Registrar + + Editar Desativar - Origem Cancelar Configurações @@ -47,9 +55,12 @@ Data do relatório Adicionar uma nota + + Data do incidente Período + Próximo Aprovado Atributos @@ -65,7 +76,10 @@ Advertência Relação Fechar + Poligono + + Segurança Período Hoje diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index fa0cd40f54a..49d47a8c634 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -12,7 +12,6 @@ Erro de sincronização Ocorreu um erro durante a sincronização. Por favor tente novamente. A sincronização foi concluída, mas não recebemos a confirmação do servidor para todos os registos. Esses registos ainda estão marcados como “offline” na aplicação. Recomendamos que tente novamente a sincronização. - Entrar %s Introduzir / Saltar %s Transferência @@ -594,7 +593,6 @@ Transferido com sucesso %1$s cancelado Data de vencimento actualizada - %s erro %s erros diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 67b76d5d1df..c55464225ca 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -13,13 +13,18 @@ Activ Eroare + + + Actualizare Perioada raportului Anulare Lichidare + Editare + evenimente Acasă Accept @@ -31,8 +36,11 @@ Căutare Data raportului + + Data incidentului + Următorul Relații Partajare diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 86a159f813f..01186efbf30 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -12,7 +12,6 @@ Ошибка синхронизации Во время синхронизации произошла ошибка. Пожалуйста, повторите попытку. Синхронизация завершена, но мы не получили подтверждения сервера для всех записей. Эти записи по-прежнему отмечены в приложении как \"оффлайн\". Мы рекомендуем повторить синхронизацию. - Введено %s Введено / пропущено%s Направление @@ -284,7 +283,6 @@ SMS не принимаются Запуск отправки смс Данные прочитаны и преобразованы. Идентификатор заявки: %d - Синхронизация... Скопировано diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index b5d1569c746..535e27f892f 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -9,19 +9,23 @@ පිළිගන්න සොයන්න + + විවෘත කරන්න දෝෂය + ඉවත් කරන්න + වෙනස් කරන්න පිළිගන්න + + සොයන්න - සුරකින්න දත්ත අගයන් අවවාදයයි වසන්න - අද ඊයේ මෙම සතිය diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index f5527d2ff62..94f8d4d460a 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -19,6 +19,7 @@ Din konfiguration är klar Dina data är klara kontoåterställning + Dagligen Varje vecka @@ -36,6 +37,7 @@ Ange ett positivt heltal eller noll. Ange ett positivt heltal Välj datum + Öppen @@ -48,6 +50,7 @@ Synkronisera Att uppdatera Fel + @@ -69,10 +72,10 @@ Inaktivera Det här programmet tillåter inte fler händelser + händelser Hem Logga ut - 1 timme 1 dag (Standard) Manuell @@ -137,7 +140,6 @@ Återställ app Kolla detta! Spara - App version: %s SDK Version: %s diff --git a/app/src/main/res/values-tet/strings.xml b/app/src/main/res/values-tet/strings.xml index fa1843ddc6b..a8fc31e8316 100644 --- a/app/src/main/res/values-tet/strings.xml +++ b/app/src/main/res/values-tet/strings.xml @@ -2,6 +2,7 @@ Erru Restaurasaun konta + Diáriu Semanal @@ -12,17 +13,21 @@ Ativu Erru + + + Atualiza Kansela Soe + Edita - Pájina inisial Kansela Konfigurasaun Estadu Períodu + Próximu OK Konabá diff --git a/app/src/main/res/values-tg/strings.xml b/app/src/main/res/values-tg/strings.xml index 26a8c8b15c5..69f79dc603f 100644 --- a/app/src/main/res/values-tg/strings.xml +++ b/app/src/main/res/values-tg/strings.xml @@ -1,8 +1,12 @@ Хатогӣ + + Рӯйдодҳо + Барқароркунии ҳисоб + Ҳаррӯза Ҳафтаина @@ -16,18 +20,22 @@ Фаъол Хатогӣ + + + Навсозӣ Тӯл Арз + Давраи ҳисобот Санаи пешбинишуда Бекор кардан Нест кардан + Таҳрир - Саҳифаи асосӣ Бекор кардан Танзимот @@ -39,6 +47,7 @@ Санаи ҳисобот Давра + Навбатӣ OK Нишонаҳо @@ -51,7 +60,7 @@ Лутфан мунтазир шавед Огоҳӣ Пӯшидан - + Бисёркунҷа Давра Имрӯз diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 85265728a2e..e03e4d5488e 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -12,7 +12,6 @@ Помилка синхронізації Під час синхронізації сталася помилка. Будь ласка, повторіть спробу. Синхронізацію завершено, але ми не отримали підтвердження від серверу для усіх записів. Ці записи все ще позначено як \"офлайн\" у програмі. Рекомендуємо повторити спробу синхронізації. - Введіть %s Ввести / Пропустити %s Направлення @@ -536,7 +535,6 @@ Показати опис Приховати опис Перевести - Є програма %s зі специфічними налаштуваннями Є програми %s зі спеціальними налаштуваннями diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index 700f6f8054b..21515732ec1 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -1,10 +1,14 @@ غلطی + + تقریبات + حوالہ دیتے ہیں اکاؤنٹ بحالی + روزانہ ہفتہ وار @@ -13,6 +17,8 @@ بانٹیں تلاش کریں + + کھلا صرف دیکھنے کی حد تک مکمل @@ -20,12 +26,14 @@ فعال غلطی + اپڈیٹ طول لمبائی + اخری تاریخ منسوخ @@ -34,9 +42,10 @@ فعال پروگرام اندراج کریں + + ترمیم غیر فعال - گھر منسوخ ترتیبات @@ -48,9 +57,12 @@ رپورٹ کی تاریخ نوٹ شامل + + واقعات کی تاریخ مدت + اگلہ ٹھیک خصوصیات @@ -66,7 +78,7 @@ وارنگ تعلقات بند - + کثیر زبان مدت آج diff --git a/app/src/main/res/values-uz-rUZ/strings.xml b/app/src/main/res/values-uz-rUZ/strings.xml index d0abc9a3f47..49f8eb00a40 100644 --- a/app/src/main/res/values-uz-rUZ/strings.xml +++ b/app/src/main/res/values-uz-rUZ/strings.xml @@ -20,6 +20,7 @@ Sizning yangi konfiguratsiyangiz tayyor Maʼlumotingiz tayyor Аkkauntni tiklash + Кунлик Ҳафталик @@ -76,12 +77,12 @@ Faol dasturlar Roʼyxatga kiritish + Tahrirlash Faolsizlantirish Ushbu dastur yana koʼproq tadbirlarni qabul qilmaydi - Бош саҳифа 30 daqiqa diff --git a/app/src/main/res/values-uz/strings.xml b/app/src/main/res/values-uz/strings.xml index c60efa0d324..52f0170f2e0 100644 --- a/app/src/main/res/values-uz/strings.xml +++ b/app/src/main/res/values-uz/strings.xml @@ -11,7 +11,6 @@ Синхронлашда хатолик Синхронлаш пайтида хатолик юз берди. Илтимос, қайта уриниб кўринг - Йўналишларга @@ -21,6 +20,7 @@ Сизнинг янги конфигурациянгиз тайёр Маълумотингиз тайёр Аккаунтни тиклаш + Кунлик Ҳафталик @@ -452,7 +452,6 @@ Тавсифни кўрсатиш Тавсифни беркитиш Ўтказиш - %s da xatoliklar diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index a000a2926ce..915ac430aef 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -12,7 +12,6 @@ Lỗi đồng bộ Xảy ra lỗi trong quá trình đồng bộ. Vui lòng thử lại. Đồng bộ đã hoàn tất nhưng chúng tôi không nhận được xác nhận máy chủ cho tất cả dữ liệu. Các dữ liệu vẫn được đánh dấu là \"Ngoại tuyến\" trong Ứng dụng. Chúng tôi khuyên bạn thử đồng bộ lại. - Nhập %s Nhập / Bỏ qua %s Giới thiệu đến cơ sở khác @@ -594,7 +593,6 @@ Đã chuyển thành công %1$s đã hủy Ngày đến hạn đã được cập nhật - Các lỗi %s diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 154008f6a85..f9d4d3def40 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -12,7 +12,6 @@ 同步错误 同步中发生错误,请重试 同步完成,但我们没有收到所有记录的服务器确认。这些记录在应用程序中仍被标记为“离线”状态。我们建议重试同步。 - 输入%s 输入/跳过 %s 流转 diff --git a/commons/src/main/res/values-pt-rBR/strings.xml b/commons/src/main/res/values-pt-rBR/strings.xml index 5e354a2423e..acaa0069821 100644 --- a/commons/src/main/res/values-pt-rBR/strings.xml +++ b/commons/src/main/res/values-pt-rBR/strings.xml @@ -70,4 +70,5 @@ Mês Ano Limpar tudo - + + diff --git a/commonskmm/src/commonMain/composeResources/values-cs/strings.xml b/commonskmm/src/commonMain/composeResources/values-cs/strings.xml index 7fd09a3492a..57227c61353 100644 --- a/commonskmm/src/commonMain/composeResources/values-cs/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-cs/strings.xml @@ -23,7 +23,7 @@ Hodnota pole %s nepatří do možnosti nastavené v položce %s Toto pole je povinné Máte několik varovných hlášení. - Máte několik varovných hlášení.\nChcete tento formulář označit jako dokončený\? + Máte několik varovných hlášení.\nChcete tento formulář označit jako dokončený? Vyžadováno Polygon Zeměpisná šířka diff --git a/commonskmm/src/commonMain/composeResources/values-en-rUS/strings.xml b/commonskmm/src/commonMain/composeResources/values-en-rUS/strings.xml index 46581947a65..30a64044856 100644 --- a/commonskmm/src/commonMain/composeResources/values-en-rUS/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-en-rUS/strings.xml @@ -45,7 +45,7 @@ Saved! Not now Keep editing - Do you want to mark this form as complete\? + Do you want to mark this form as complete? If you exit now all the information in the form will be discarded. Share Close diff --git a/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml b/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml index 39ab3e96eb3..629e42f9920 100644 --- a/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml @@ -16,7 +16,7 @@ दिन चुनें यह फ़ील्ड आवश्यक है आपके पास कुछ चेतावनी संदेश हैं - आपके पास कुछ चेतावनी संदेश हैं\nक्या आप इस फ़ॉर्म को कम्प्लीट मार्क करना चाहते हैं\? + आपके पास कुछ चेतावनी संदेश हैं\nक्या आप इस फ़ॉर्म को कम्प्लीट मार्क करना चाहते हैं? आवश्यकता है अक्षांश देशांतर diff --git a/commonskmm/src/commonMain/composeResources/values-lo/strings.xml b/commonskmm/src/commonMain/composeResources/values-lo/strings.xml index ffe9abe14d6..50e290bb0f5 100644 --- a/commonskmm/src/commonMain/composeResources/values-lo/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-lo/strings.xml @@ -47,7 +47,7 @@ ບັນທຶກແລ້ວ! ບໍ່​ແມ່ນ​ຕອນ​ນີ້ ສຶບຕໍ່ແກ້ໄຂ - ທ່ານຕ້ອງການໝາຍແບບຟອມນີ້ວ່າສຳເລັດແລ້ວຫຼືບໍ\? + ທ່ານຕ້ອງການໝາຍແບບຟອມນີ້ວ່າສຳເລັດແລ້ວຫຼືບໍ? ຖ້າທ່ານອອກດຽວນີ້ ຂໍ້ມູນທັງໝົດໃນແບບຟອມຈະຖືກຍົກເລີກ. ເຜີຍແຜ່ ປິດ diff --git a/stock-usecase/src/main/res/values-ar-rEG/strings.xml b/stock-usecase/src/main/res/values-ar-rEG/strings.xml new file mode 100644 index 00000000000..cba52c3f66d --- /dev/null +++ b/stock-usecase/src/main/res/values-ar-rEG/strings.xml @@ -0,0 +1,4 @@ + + إلغاء + + \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-ar-rIQ/strings.xml b/stock-usecase/src/main/res/values-ar-rIQ/strings.xml index be2114d6758..93fef6284eb 100644 --- a/stock-usecase/src/main/res/values-ar-rIQ/strings.xml +++ b/stock-usecase/src/main/res/values-ar-rIQ/strings.xml @@ -1,10 +1,17 @@ الرئيسية + + اسم المستخدم + حذف إلغاء + من + + تأكيد + الرئيسية العدد \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-ar/strings.xml b/stock-usecase/src/main/res/values-ar/strings.xml index 706e0964e6b..ac93bc2b53e 100644 --- a/stock-usecase/src/main/res/values-ar/strings.xml +++ b/stock-usecase/src/main/res/values-ar/strings.xml @@ -2,7 +2,6 @@ الرئيسية تجاهل - اسم المستخدم @@ -17,13 +16,10 @@ حذف موافق إلغاء - من - - - - + من + تأكيد خطأ في الشبكة @@ -33,6 +29,7 @@ غير قادر على مزامنة البيانات لعدم توفر اتصال بالشبكة + هناك خطأ ما. يرجى التحقق من صحة عنوان URL الخاص بالخادم واسم المستخدم وكلمة المرور وحاول مرة أخرى. عفوًا! حدث خطأ ما على جانب الخادم. diff --git a/stock-usecase/src/main/res/values-ckb/strings.xml b/stock-usecase/src/main/res/values-ckb/strings.xml index d24ef745bdd..e64f0d59ff3 100644 --- a/stock-usecase/src/main/res/values-ckb/strings.xml +++ b/stock-usecase/src/main/res/values-ckb/strings.xml @@ -2,12 +2,15 @@ ماڵةوة فري دان - سڕینەوە تةواو لابردن + لە + + دووپاتکردنەوە + ماڵةوة كةرانةوة \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-en-rUS/strings.xml b/stock-usecase/src/main/res/values-en-rUS/strings.xml index 08c9f76bfbf..757f206455f 100644 --- a/stock-usecase/src/main/res/values-en-rUS/strings.xml +++ b/stock-usecase/src/main/res/values-en-rUS/strings.xml @@ -1,7 +1,9 @@ + Review Cancel + Something went wrong. Please check that server URL, username and password are correct and try again. Unknown server diff --git a/stock-usecase/src/main/res/values-es-rES/strings.xml b/stock-usecase/src/main/res/values-es-rES/strings.xml index 173b2a51df7..6474710022e 100644 --- a/stock-usecase/src/main/res/values-es-rES/strings.xml +++ b/stock-usecase/src/main/res/values-es-rES/strings.xml @@ -1,14 +1,17 @@ Inicio + Nombre de usuario + + Revisar Borrar Correcto Cancelar - De + De Algo ha ido mal. Por favor, compruebe que tanto la url del servidor como el usuario y contraseña son correctos y pruebe otra vez. Servidor desconocido diff --git a/stock-usecase/src/main/res/values-fr/strings.xml b/stock-usecase/src/main/res/values-fr/strings.xml index e21d633de4d..dfe7b8fd117 100644 --- a/stock-usecase/src/main/res/values-fr/strings.xml +++ b/stock-usecase/src/main/res/values-fr/strings.xml @@ -4,6 +4,8 @@ Distribution Abandonner Correction + + Nom d\'utilisateur @@ -13,17 +15,26 @@ Supprimer Ok Annuler + A partir de Livrer à + + + Quantité + La transaction a été effectuée avec succès. - + + + Confirmer + Stock disponible ne peut être dépassé + Erreur réseau Une erreur inconnue s\'est produite. Le nom d\'utilisatuer et/ou mot de passe est incorrect diff --git a/stock-usecase/src/main/res/values-hi-rIN/strings.xml b/stock-usecase/src/main/res/values-hi-rIN/strings.xml index 62c228f7b22..cc95d404b88 100644 --- a/stock-usecase/src/main/res/values-hi-rIN/strings.xml +++ b/stock-usecase/src/main/res/values-hi-rIN/strings.xml @@ -1,15 +1,16 @@ - छोड़ें + यूज़रनेम + रिव्यू हटाएं ठीक है रद्द करें - से + से वापस जाएँ सेव नहीं केवल शून्य या पॉजिटिव संख्या ही अनुमति है diff --git a/stock-usecase/src/main/res/values-id/strings.xml b/stock-usecase/src/main/res/values-id/strings.xml index 9e85eee4b80..b6d9c974035 100644 --- a/stock-usecase/src/main/res/values-id/strings.xml +++ b/stock-usecase/src/main/res/values-id/strings.xml @@ -2,14 +2,18 @@ Beranda Buang + Nama pengguna - + Hapus OK Batal + Dari + Konfirmasi + Kesalahan saat penguraian hasil Beranda Kembali diff --git a/stock-usecase/src/main/res/values-km/strings.xml b/stock-usecase/src/main/res/values-km/strings.xml index 312458fe0c1..0aacb2a8874 100644 --- a/stock-usecase/src/main/res/values-km/strings.xml +++ b/stock-usecase/src/main/res/values-km/strings.xml @@ -1,11 +1,17 @@ ផ្ទាំងដើម + ឈ្មោះ​គណនី + ​លុប​ យល់ព្រម បោះបង់ + + + បញ្ជាក់ + បណ្ដាញមានបញ្ហា កំហុសខណៈពេលញែកលទ្ធផល ផ្ទាំងដើម diff --git a/stock-usecase/src/main/res/values-lo/strings.xml b/stock-usecase/src/main/res/values-lo/strings.xml index 185d247f435..d3085495a52 100644 --- a/stock-usecase/src/main/res/values-lo/strings.xml +++ b/stock-usecase/src/main/res/values-lo/strings.xml @@ -13,13 +13,19 @@ ລົບ ​ຕົກ​ລົງ ຍົກເລີກ + ຈາກ + + + ປະລິມານ ບໍ່ສາມາດໂຫຼດລາຍຊື່ສະຖານທີ່ບໍລິການທີ່ມີຢູ່ໄດ້ + + ຢືນຢັນ ຂໍ້ຜິດພາດທາງເຄື່ອຂ່າຍ @@ -28,6 +34,7 @@ ບໍ່ສາມາດ ອັບເດດຂໍ້ມູນໃຫ້ຄືກັນຂໍ້ມູນໄດ້ເນື່ອງຈາກບໍ່ມີການເຊື່ອມຕໍ່ອິນເຕີເນັດ + ມີບາງສິ່ງບາງຢ່າງຜິດພາດ. ກະລຸນາກວດເບິ່ງທີ່ຢູ່ຂອງເຄື່ອງຄອມພິວເຕີໜ່ວຍແມ່, ຊື່ຜູ້ໃຊ້ ແລະ ລະຫັດຜ່ານວ່າຖືກຕ້ອງແລ້ວ ແລ້ວລອງໃໝ່ອີກຄັ້ງ. Oops! ມີບາງສິ່ງບາງຢ່າງຜິດພາດທາງດ້ານຄອມພິວເຕີໜ່ວຍແມ່ diff --git a/stock-usecase/src/main/res/values-my/strings.xml b/stock-usecase/src/main/res/values-my/strings.xml index 366e245c68b..421d472175a 100644 --- a/stock-usecase/src/main/res/values-my/strings.xml +++ b/stock-usecase/src/main/res/values-my/strings.xml @@ -1,11 +1,13 @@ ပင်မစာမျက်နှာ + အသုံးပြုသူအမည် ဖျက်ဆီးသည် လက်ခံသည် ပယ်ဖျက်သည် + ပင်မစာမျက်နှာ ‌နောက်သို့ပြန်သွားသည် အရေအတွက် diff --git a/stock-usecase/src/main/res/values-nb/strings.xml b/stock-usecase/src/main/res/values-nb/strings.xml index 93d11a605c7..650b127c221 100644 --- a/stock-usecase/src/main/res/values-nb/strings.xml +++ b/stock-usecase/src/main/res/values-nb/strings.xml @@ -2,16 +2,18 @@ Hjem Forkast + Brukernavn - Slett OK Avbryt + Fra + - Bekreft + Feil under analyse av resultater Hjem Tilbake diff --git a/stock-usecase/src/main/res/values-ne/strings.xml b/stock-usecase/src/main/res/values-ne/strings.xml index 61bbff72a22..8020b60ebe8 100644 --- a/stock-usecase/src/main/res/values-ne/strings.xml +++ b/stock-usecase/src/main/res/values-ne/strings.xml @@ -1,4 +1,5 @@ त्याग गर्नुहोस् रद्द गर्नुहोस् + \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-nl/strings.xml b/stock-usecase/src/main/res/values-nl/strings.xml index bd77f7f6bba..f1a28c269c0 100644 --- a/stock-usecase/src/main/res/values-nl/strings.xml +++ b/stock-usecase/src/main/res/values-nl/strings.xml @@ -39,6 +39,7 @@ Kan de lijst met beschikbare faciliteiten niet laden Kan de lijst met beschikbare bestemmingen niet laden + Bevestigen diff --git a/stock-usecase/src/main/res/values-prs/strings.xml b/stock-usecase/src/main/res/values-prs/strings.xml index e38feebddce..1f94b8913d3 100644 --- a/stock-usecase/src/main/res/values-prs/strings.xml +++ b/stock-usecase/src/main/res/values-prs/strings.xml @@ -2,15 +2,18 @@ صفحه اصلی ازبین بردن + نام کاربر - حذف تأیید انصراف + از جانب - + + تائید + صفحه اصلی عقب تعداد diff --git a/stock-usecase/src/main/res/values-ps/strings.xml b/stock-usecase/src/main/res/values-ps/strings.xml index ee29df2717a..77dc787f1ba 100644 --- a/stock-usecase/src/main/res/values-ps/strings.xml +++ b/stock-usecase/src/main/res/values-ps/strings.xml @@ -2,14 +2,14 @@ کور پاڼه رد یې کړئ + کارېدونکی نوم - خذف یې کړئ سم دی رد یې کړئ [ ژباړه ـ ردول ] + څخه - کور پاڼه شا ته کېدل شمېرل diff --git a/stock-usecase/src/main/res/values-pt-rBR/strings.xml b/stock-usecase/src/main/res/values-pt-rBR/strings.xml index b060f63fa9d..927743b9223 100644 --- a/stock-usecase/src/main/res/values-pt-rBR/strings.xml +++ b/stock-usecase/src/main/res/values-pt-rBR/strings.xml @@ -1,12 +1,18 @@ Origem + Utilizador + Apagar Aprovado Cancelar + A partir de + + Confirmar + Erro de rede Origem Voltar diff --git a/stock-usecase/src/main/res/values-ro/strings.xml b/stock-usecase/src/main/res/values-ro/strings.xml index ea3a4ccc6ec..7d2a86fc3fc 100644 --- a/stock-usecase/src/main/res/values-ro/strings.xml +++ b/stock-usecase/src/main/res/values-ro/strings.xml @@ -1,9 +1,14 @@ Acasă + Lichidare Anulare + Din + + Confirmare + Acasă Înapoi \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-ru/strings.xml b/stock-usecase/src/main/res/values-ru/strings.xml index edfaf18563b..da7bf782bc3 100644 --- a/stock-usecase/src/main/res/values-ru/strings.xml +++ b/stock-usecase/src/main/res/values-ru/strings.xml @@ -2,7 +2,6 @@ Главная Отмена - Имя пользователя @@ -19,11 +18,6 @@ От Доставка к... - - - - - Подтвердить @@ -37,6 +31,7 @@ Невозможно синхронизировать данные из-за отсутствия сетевого подключения + Что-то пошло не так. Пожалуйста, проверьте правильность URL-адреса сервера, имени пользователя и пароля и повторите попытку. Упс! Что-то пошло не так на стороне сервера. diff --git a/stock-usecase/src/main/res/values-si/strings.xml b/stock-usecase/src/main/res/values-si/strings.xml index 891a2ccd6fe..4e53c4d4218 100644 --- a/stock-usecase/src/main/res/values-si/strings.xml +++ b/stock-usecase/src/main/res/values-si/strings.xml @@ -1,6 +1,9 @@ ඉවත ලන්න ඉවත් කරන්න + + තහවුරු කරන්න + ගණන \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-sv/strings.xml b/stock-usecase/src/main/res/values-sv/strings.xml index 6d2455fb18b..c2e6ee78a34 100644 --- a/stock-usecase/src/main/res/values-sv/strings.xml +++ b/stock-usecase/src/main/res/values-sv/strings.xml @@ -2,13 +2,17 @@ Hem Kassera + Användarnamn - Radera ok Avbryt + + + Bekräfta + Fel vid tolkning av resultat Hem Tillbaka diff --git a/stock-usecase/src/main/res/values-tet/strings.xml b/stock-usecase/src/main/res/values-tet/strings.xml index 89d57feef88..ad03ceeeee1 100644 --- a/stock-usecase/src/main/res/values-tet/strings.xml +++ b/stock-usecase/src/main/res/values-tet/strings.xml @@ -2,10 +2,13 @@ Pájina inisial Soe + Utilizador nia Naran + Soe OK Kansela + Pájina inisial Ba kotuk Konta diff --git a/stock-usecase/src/main/res/values-tg/strings.xml b/stock-usecase/src/main/res/values-tg/strings.xml index f5a8753abc8..52453d4d5bc 100644 --- a/stock-usecase/src/main/res/values-tg/strings.xml +++ b/stock-usecase/src/main/res/values-tg/strings.xml @@ -1,12 +1,17 @@ Саҳифаи асосӣ + Номи корбар Нест кардан OK Бекор кардан + + + Тасдиқ + Саҳифаи асосӣ Ба қафо Шумора diff --git a/stock-usecase/src/main/res/values-uk/strings.xml b/stock-usecase/src/main/res/values-uk/strings.xml index 66ce11d1c6e..9b5a949f2cc 100644 --- a/stock-usecase/src/main/res/values-uk/strings.xml +++ b/stock-usecase/src/main/res/values-uk/strings.xml @@ -2,6 +2,7 @@ Головна Ігнорувати + Ім\'я користувача @@ -12,10 +13,12 @@ Видалити ОК Скасувати + Від + - Підтвердити + Сталася помилка. Будь ласка, перевірте правильність URL-адреси серверу, імені користувача та пароля і повторіть спробу. Невідомий сервер diff --git a/stock-usecase/src/main/res/values-ur/strings.xml b/stock-usecase/src/main/res/values-ur/strings.xml index ec6dff82842..1fe5c9a7c5f 100644 --- a/stock-usecase/src/main/res/values-ur/strings.xml +++ b/stock-usecase/src/main/res/values-ur/strings.xml @@ -2,15 +2,18 @@ گھر ذائل + صارف کا نا٠- حذف ٹھیک منسوخ + سے - + + تصدیق کریں + گھر واپس شمار diff --git a/stock-usecase/src/main/res/values-uz/strings.xml b/stock-usecase/src/main/res/values-uz/strings.xml index c2ee33e04a2..25dd38ef719 100644 --- a/stock-usecase/src/main/res/values-uz/strings.xml +++ b/stock-usecase/src/main/res/values-uz/strings.xml @@ -32,10 +32,10 @@ Миқдори - + - Тасдиқланг + Тармоқда хатолик Натижаларни таҳлил қилишда хатолик юз берди Бош саҳифа diff --git a/stock-usecase/src/main/res/values-zh-rCN/strings.xml b/stock-usecase/src/main/res/values-zh-rCN/strings.xml index 799c1caeebb..885c57be8ac 100644 --- a/stock-usecase/src/main/res/values-zh-rCN/strings.xml +++ b/stock-usecase/src/main/res/values-zh-rCN/strings.xml @@ -2,6 +2,7 @@ Home 放弃 + 用户名 @@ -10,10 +11,12 @@ 删除 OK 取消 + + - 确认 + 网络错误 出现未知错误。 From 11d25560cccd7d59a7d38f2fc7bc690b1660419b Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Fri, 27 Mar 2026 11:01:24 +0100 Subject: [PATCH 117/260] fix(translations): sync translations from transifex (develop) (#4771) * fix(translations): sync translations from transifex (develop) * fix(translations): remove unnecessary question mark escapes --------- Co-authored-by: andresmr From 181f989aa18a12587399ff5e5e965ba903766a93 Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Mon, 30 Mar 2026 12:38:13 +0200 Subject: [PATCH 118/260] fix(translations): sync translations from transifex (develop) (#4776) * fix(translations): sync translations from transifex (develop) * ci: add workflow to fix KMP-incompatible escaped question marks * fix(translations): remove KMP-incompatible escaped question marks [skip ci] --------- Co-authored-by: andresmr Co-authored-by: github-actions[bot] --- .github/workflows/fix-kmp-translations.yml | 61 +++++++++++++++++++ .../composeResources/values-cs/strings.xml | 8 +-- .../composeResources/values-nl/strings.xml | 2 +- .../values-hi-rIN/strings.xml | 4 +- 4 files changed, 68 insertions(+), 7 deletions(-) create mode 100644 .github/workflows/fix-kmp-translations.yml diff --git a/.github/workflows/fix-kmp-translations.yml b/.github/workflows/fix-kmp-translations.yml new file mode 100644 index 00000000000..56d67418046 --- /dev/null +++ b/.github/workflows/fix-kmp-translations.yml @@ -0,0 +1,61 @@ +name: Fix KMP Translations + +on: + pull_request: + types: [opened, synchronize] + +jobs: + fix-kmp-translations: + if: startsWith(github.head_ref, 'develop-transifex-') + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + + steps: + - uses: actions/checkout@v6 + with: + ref: ${{ github.head_ref }} + fetch-depth: 0 + + - name: Remove escaped question marks from KMP compose resources + run: | + for dir in \ + "tracker/src/commonMain/composeResources" \ + "aggregates/src/commonMain/composeResources" \ + "commonskmm/src/commonMain/composeResources" \ + "login/src/commonMain/composeResources" \ + "sync/src/commonMain/composeResources"; do + if [ -d "$dir" ]; then + find "$dir" -name "*.xml" -exec sed -i 's/\\?/?/g' {} \; + fi + done + git add -A + + - name: Check if meaningful changes remain vs base branch + id: check + run: | + if git diff --cached --quiet origin/${{ github.base_ref }}; then + echo "has_changes=false" >> "$GITHUB_OUTPUT" + else + echo "has_changes=true" >> "$GITHUB_OUTPUT" + fi + + - name: Commit and push fix + if: steps.check.outputs.has_changes == 'true' + run: | + if ! git diff --cached --quiet; then + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git commit -m "fix(translations): remove KMP-incompatible escaped question marks [skip ci]" + git push + fi + + - name: Close PR — no meaningful changes remain + if: steps.check.outputs.has_changes == 'false' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh pr comment ${{ github.event.pull_request.number }} \ + --body "Closing automatically: after removing Android-style escaped \`\?\` characters (incompatible with KMP Compose resources), no translation changes remain." + gh pr close ${{ github.event.pull_request.number }} --delete-branch diff --git a/login/src/commonMain/composeResources/values-cs/strings.xml b/login/src/commonMain/composeResources/values-cs/strings.xml index 6a229e1332e..c1026c047aa 100644 --- a/login/src/commonMain/composeResources/values-cs/strings.xml +++ b/login/src/commonMain/composeResources/values-cs/strings.xml @@ -22,7 +22,7 @@ Zpět na nastavení Další Navázání spojení... - Ke kterému serveru se chcete připojit\? + Ke kterému serveru se chcete připojit? URL serveru Je zapnuté dvoufaktorové ověřování. Vypnutí dvoufaktorového ověřování @@ -33,7 +33,7 @@ Nepodařilo se vypnout dvoufaktorové ověřování. Není platná URL serveru Rychlé přihlášení - Chcete se přihlásit pomocí otisku prstu nebo jiné biometrické metody\? + Chcete se přihlásit pomocí otisku prstu nebo jiné biometrické metody? Pověření již byla uložena Pověření nebyla uložena Uživatelské jméno @@ -44,7 +44,7 @@ Nebo Přihlášení pomocí openID Správa účtů - Chcete nám pomoci vylepšit tuto aplikaci\? + Chcete nám pomoci vylepšit tuto aplikaci? Pokud řeknete ano, aplikace bude odesílat anonymní statistiky a protokoly o chybách, které nám pomáhají zlepšovat uživatelský komfort a výkon. Další podrobnosti naleznete v našem Zásady ochrany osobních údajů @@ -56,7 +56,7 @@ Zadejte svůj kód PIN Pro přístup k účtu zadejte čtyřmístný kód PIN. Odemknout - Zapomněli jste kód PIN\? + Zapomněli jste kód PIN? Nesprávný kód PIN Není nakonfigurován žádný kód PIN Nepodařilo se uložit kód PIN diff --git a/login/src/commonMain/composeResources/values-nl/strings.xml b/login/src/commonMain/composeResources/values-nl/strings.xml index 4bf13cf6ba2..82c082e57a9 100644 --- a/login/src/commonMain/composeResources/values-nl/strings.xml +++ b/login/src/commonMain/composeResources/values-nl/strings.xml @@ -8,7 +8,7 @@ Wachtwoord Aan het inloggen... Inloggen - Wil je ons helpen deze app te verbeteren\? + Wil je ons helpen deze app te verbeteren? privacybeleid Niet nu Ja diff --git a/tracker/src/commonMain/composeResources/values-hi-rIN/strings.xml b/tracker/src/commonMain/composeResources/values-hi-rIN/strings.xml index 6845fc86503..e696bac7412 100644 --- a/tracker/src/commonMain/composeResources/values-hi-rIN/strings.xml +++ b/tracker/src/commonMain/composeResources/values-hi-rIN/strings.xml @@ -2,9 +2,9 @@ कोई संबंध नहीं है, नया जोड़ने के लिए “+” पर क्लिक करें संबंध बनाया गया - हटाएँ %1$s\? + हटाएँ %1$s? %1$s हटा दिया जाएगा। यह कार्रवाई वापस नहीं की जा सकती - %1$d संबंध हटाएँ\? + %1$d संबंध हटाएँ? %1$d हटा दिया जाएगा। यह कार्रवाई वापस नहीं की जा सकती %1$d और दिखाएँ संबंध From 2deafc54c52f4add7a03d14f70acb773658f4de6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Mon, 30 Mar 2026 15:38:20 +0200 Subject: [PATCH 119/260] docs: add CLAUDE.md (#4778) --- CLAUDE.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000000..eef4bd20cf9 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +@AGENTS.md \ No newline at end of file From 716d29886a489aba49fa287b9684934a1c652240 Mon Sep 17 00:00:00 2001 From: Xavier Molloy Date: Tue, 31 Mar 2026 07:59:42 +0200 Subject: [PATCH 120/260] refactor: [ANDROAPP-7495] Search refactor [skip size] (#4774) * chore: [ANDROAPP-7495] (I) Repository, usecase and model changes [skip size] (#4751) * chore: [ANDROAPP-7495] fetch new data from and add to usecase domain model * chore: [ANDROAPP-7495] repository changes * chore: [ANDROAPP-7495] code review comments * chore: [ANDROAPP-7495] code review comments * chore: [ANDROAPP-7495] code review comments * chore [ANDROAPP-7495] (II) Old model and repository clean up (#4752) * chore: [ANDROAPP-7495] fetch new data from and add to usecase domain model * chore: [ANDROAPP-7495] repository changes * chore: [ANDROAPP-7495] code review comments * chore: [ANDROAPP-7495] code review comments * chore: [ANDROAPP-7495] code review comments * chore: [ANDROAPP-7495] Adapt old SearchTeiModel and remove repository unused methods * chore: [ANDROAPP-7495] SearchTeiViewmodel adaptation * chore: [ANDROAPP-7495] trailing comma convention * chore: [ANDROAPP-7495] (III)Dependency injection (#4753) * chore: [ANDROAPP-7495] fetch new data from and add to usecase domain model * chore: [ANDROAPP-7495] code review comments * chore: [ANDROAPP-7495] SearchTeiViewmodel adaptation * chore: [ANDROAPP-7495] (IV) Carousel Item model removal new model adaptations (#4754) * chore: [ANDROAPP-7495] fetch new data from and add to usecase domain model * chore: [ANDROAPP-7495] code review comments * chore: [ANDROAPP-7495] Carousel Item model removal and adaptations to new domain model * chore: [ANDROAPP-7495] code review comments * chore:[ANDROAPP-7495] (V) Cascading changes from model (#4756) * chore: [ANDROAPP-7495] fetch new data from and add to usecase domain model * chore: [ANDROAPP-7495] code review comments * chore: [ANDROAPP-7495] Cascading changes from new domain model usage * chore: [ANDROAPP-7495] More cascading changes * chore: [ANDROAPP-7495] code review comments * chore: [ANDROAPP-7495] (VI) Test adaptation [skip size] (#4757) * chore: [ANDROAPP-7495] fetch new data from and add to usecase domain model * chore: [ANDROAPP-7495] code review comments * chore: [ANDROAPP-7495] Cascading changes from new domain model usage * chore: [ANDROAPP-7495] code review comments * chore: [ANDROAPP-7495] Test adaptation * chore: [ANDROAPP-7495] Test adaptation * chore: [ANDROAPP-7495] fix tests * chore: [ANDROAPP-7495] fix tests * chore: update dependency verification metadata [skip ci] * chore: [ANDROAPP-7495] Update verification metadata trust rules * chore: update dependency verification metadata [skip ci] * chore: [ANDROAPP-7495] delete components in dependency verification file * chore: update dependency verification metadata [skip ci] * chore: [ANDROAPP-7495] sonar code smells --------- Co-authored-by: @dhis2-bot --- .../usescases/searchte/robot/FilterRobot.kt | 5 +- .../data/enrollment/EnrollmentUiDataHelper.kt | 2 +- .../data/sorting/SearchSortingValueSetter.kt | 13 +- .../searchTrackEntity/SearchRepository.java | 2 - .../SearchRepositoryImpl.java | 439 -- .../SearchRepositoryImplKt.kt | 61 +- .../searchTrackEntity/SearchRepositoryKt.kt | 7 + .../searchTrackEntity/SearchTEIViewModel.kt | 101 +- .../searchTrackEntity/SearchTEModule.java | 24 +- .../searchTrackEntity/SearchTeiModel.java | 202 +- .../SearchTeiViewModelFactory.kt | 2 +- .../adapters/BaseTeiViewHolder.kt | 32 +- .../adapters/SearchAdapterDiffCallback.kt | 18 +- .../adapters/SearchRelationshipViewHolder.kt | 2 +- .../adapters/SearchTEViewHolder.kt | 23 +- .../adapters/SearchTeiLiveAdapter.kt | 14 +- .../adapters/SearchTeiModelExtensions.kt | 171 +- .../ui/mapper/TEICardMapper.kt | 148 +- .../relationships/RelationshipModule.java | 45 +- .../TrackedEntityInstanceInfoProvider.kt | 37 +- .../main/java/org/dhis2/utils/ValueUtils.kt | 46 +- .../res/layout/item_search_tracked_entity.xml | 6 +- .../sorting/SearchSortingValueSetterTest.kt | 158 +- .../ProgramEventMapperTest.kt | 4 +- .../searchTrackEntity/SearchRepositoryTest.kt | 176 +- .../ui/mapper/TEICardMapperTest.kt | 196 +- .../TrackedEntityInstanceInfoProviderTests.kt | 4 + .../commons/bindings/TEICardExtensions.kt | 117 - .../dhis2/commons/data/CarouselItemModel.kt | 5 - .../commons/data/ProgramEventViewModel.kt | 4 +- .../commons/extensions/DateExtensions.kt | 14 + .../model/RelationshipUiComponentModel.kt | 8 +- gradle/verification-metadata.xml | 6352 +---------------- tracker/build.gradle.kts | 1 + .../SearchTrackedEntityRepositoryImplTest.kt | 11 +- ...omainToSDKTrackedEntitySearchItemMapper.kt | 137 - .../data/SearchTrackedEntityRepositoryImpl.kt | 467 +- .../data/TrackedEntitySearchItemMapper.kt | 84 +- .../search/di/TrackerSearchModule.android.kt | 1 + .../data/SearchTrackedEntityRepository.kt | 2 + .../search/domain/SearchTrackedEntities.kt | 2 + .../model/TrackedEntitySearchItemResult.kt | 64 +- .../domain/SearchTrackedEntitiesTest.kt | 59 +- 43 files changed, 1499 insertions(+), 7767 deletions(-) delete mode 100644 commons/src/main/java/org/dhis2/commons/data/CarouselItemModel.kt create mode 100644 commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/extensions/DateExtensions.kt delete mode 100644 tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/DomainToSDKTrackedEntitySearchItemMapper.kt diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/FilterRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/FilterRobot.kt index c12066a97fd..a25ea3b6157 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/FilterRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/FilterRobot.kt @@ -170,8 +170,9 @@ class FilterRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { fun checkTeiAreCompleted() { val nodes = composeTestRule.onAllNodesWithText("Enrollment completed", true) - assert(nodes.fetchSemanticsNodes().size >= 3) { - "Expected at least 3 nodes, but found ${nodes.fetchSemanticsNodes().size}" + composeTestRule.waitForIdle() + assert(nodes.fetchSemanticsNodes().size >= 2) { + "Expected at least 2 nodes, but found ${nodes.fetchSemanticsNodes().size}" } } diff --git a/app/src/main/java/org/dhis2/data/enrollment/EnrollmentUiDataHelper.kt b/app/src/main/java/org/dhis2/data/enrollment/EnrollmentUiDataHelper.kt index b50840c9e0d..1902c4ec288 100644 --- a/app/src/main/java/org/dhis2/data/enrollment/EnrollmentUiDataHelper.kt +++ b/app/src/main/java/org/dhis2/data/enrollment/EnrollmentUiDataHelper.kt @@ -2,7 +2,7 @@ package org.dhis2.data.enrollment import android.content.Context import org.dhis2.R -import org.hisp.dhis.android.core.enrollment.EnrollmentStatus +import org.dhis2.tracker.search.model.EnrollmentStatus class EnrollmentUiDataHelper( val context: Context, diff --git a/app/src/main/java/org/dhis2/data/sorting/SearchSortingValueSetter.kt b/app/src/main/java/org/dhis2/data/sorting/SearchSortingValueSetter.kt index be850c0fb82..f56b1327de2 100644 --- a/app/src/main/java/org/dhis2/data/sorting/SearchSortingValueSetter.kt +++ b/app/src/main/java/org/dhis2/data/sorting/SearchSortingValueSetter.kt @@ -4,6 +4,7 @@ import org.dhis2.commons.filters.Filters import org.dhis2.commons.filters.sorting.SortingItem import org.dhis2.commons.filters.sorting.SortingStatus import org.dhis2.data.enrollment.EnrollmentUiDataHelper +import org.dhis2.mobile.commons.extensions.toJavaDate import org.dhis2.usescases.searchTrackEntity.SearchTeiModel import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.arch.repositories.scope.RepositoryScope @@ -52,7 +53,7 @@ class SearchSortingValueSetter( .eventModule() .events() .byEnrollmentUid() - .eq(teiModel.selectedEnrollment?.uid() ?: "") + .eq(teiModel.selectedEnrollment?.uid ?: "") .byDeleted() .isFalse .orderByTimeline( @@ -62,7 +63,7 @@ class SearchSortingValueSetter( RepositoryScope.OrderByDirection.DESC }, ).blockingGet() - if (sortedEvents != null && sortedEvents.isNotEmpty()) { + if (sortedEvents.isNotEmpty()) { val sortedEvent = sortedEvents.first() val sortedDate: Date? = if (sortedEvent.status() == EventStatus.SCHEDULE || @@ -85,7 +86,7 @@ class SearchSortingValueSetter( if (teiModel.selectedEnrollment != null) { enrollmentStatusValue = enrollmentUiDataHelper.getEnrollmentStatusClientName( - teiModel.selectedEnrollment.status()!!, + teiModel.selectedEnrollment.status, ) } return Pair(enrollmentStatusLabel, enrollmentStatusValue) @@ -97,12 +98,12 @@ class SearchSortingValueSetter( d2 .programModule() .programs() - .uid(it.program()) + .uid(it.program) .blockingGet() - ?.enrollmentDateLabel() ?: enrollmentDateDefaultLabel + ?.displayEnrollmentDateLabel() ?: enrollmentDateDefaultLabel val enrollmentDateValue = SimpleDateFormat(uiDateFormat, Locale.getDefault()) - .format(teiModel.selectedEnrollment.enrollmentDate()) + .format(teiModel.selectedEnrollment.enrollmentDate?.toJavaDate()) Pair(enrollmentDateLabel, enrollmentDateValue) } ?: Pair(enrollmentDateDefaultLabel, unknownLabel) } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepository.java b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepository.java index 80965866353..7d8a17ce1a2 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepository.java +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepository.java @@ -48,8 +48,6 @@ public interface SearchRepository { TeiDownloadResult download(String teiUid, @Nullable String enrollmentUid, String reason); - SearchTeiModel transform(TrackedEntitySearchItem searchItem, @Nullable Program selectedProgram, boolean offlineOnly, SortingItem sortingItem); - TrackedEntitySearchCollectionRepository getFilteredRepository(SearchParametersModel searchParametersModel); void setCurrentProgram(@Nullable String currentProgram); diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImpl.java b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImpl.java index ce0ebbcecbb..c5c45ddd3c5 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImpl.java +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImpl.java @@ -3,17 +3,11 @@ import android.database.sqlite.SQLiteConstraintException; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import org.dhis2.R; -import org.dhis2.bindings.ExtensionsKt; -import org.dhis2.bindings.ValueExtensionsKt; import org.dhis2.commons.Constants; import org.dhis2.commons.data.EntryMode; import org.dhis2.commons.date.DateUtils; import org.dhis2.commons.filters.FilterManager; import org.dhis2.commons.filters.data.FilterPresenter; -import org.dhis2.commons.filters.sorting.SortingItem; -import org.dhis2.commons.network.NetworkUtils; -import org.dhis2.commons.resources.MetadataIconProvider; import org.dhis2.commons.resources.ResourceManager; import org.dhis2.commons.viewmodel.DispatcherProvider; import org.dhis2.data.dhislogic.DhisEnrollmentUtils; @@ -21,60 +15,33 @@ import org.dhis2.data.forms.dataentry.ValueStore; import org.dhis2.data.forms.dataentry.ValueStoreImpl; import org.dhis2.data.search.SearchParametersModel; -import org.dhis2.data.sorting.SearchSortingValueSetter; import org.dhis2.metadata.usecases.FileResourceConfiguration; import org.dhis2.metadata.usecases.ProgramConfiguration; import org.dhis2.metadata.usecases.TrackedEntityInstanceConfiguration; import org.dhis2.mobile.commons.customintents.CustomIntentRepository; import org.dhis2.mobile.commons.model.CustomIntentActionTypeModel; import org.dhis2.mobile.commons.network.NetworkStatusProvider; -import org.dhis2.mobile.commons.providers.FieldErrorMessageProvider; import org.dhis2.mobile.commons.reporting.CrashReportController; -import org.dhis2.tracker.data.ProfilePictureProvider; -import org.dhis2.tracker.relationships.model.RelationshipDirection; -import org.dhis2.tracker.relationships.model.RelationshipGeometry; -import org.dhis2.tracker.relationships.model.RelationshipModel; -import org.dhis2.tracker.relationships.model.RelationshipOwnerType; import org.dhis2.ui.ThemeManager; import org.dhis2.usescases.teiDownload.TeiDownloader; -import org.dhis2.utils.ValueUtils; import org.hisp.dhis.android.core.D2; import org.hisp.dhis.android.core.arch.call.D2Progress; import org.hisp.dhis.android.core.arch.helpers.UidsHelper; -import org.hisp.dhis.android.core.arch.repositories.scope.RepositoryScope; import org.hisp.dhis.android.core.common.FeatureType; -import org.hisp.dhis.android.core.common.ObjectStyle; -import org.hisp.dhis.android.core.common.State; import org.hisp.dhis.android.core.common.ValueType; -import org.hisp.dhis.android.core.enrollment.Enrollment; -import org.hisp.dhis.android.core.enrollment.EnrollmentCollectionRepository; import org.hisp.dhis.android.core.enrollment.EnrollmentCreateProjection; -import org.hisp.dhis.android.core.enrollment.EnrollmentStatus; -import org.hisp.dhis.android.core.event.Event; -import org.hisp.dhis.android.core.event.EventCollectionRepository; -import org.hisp.dhis.android.core.event.EventStatus; import org.hisp.dhis.android.core.organisationunit.OrganisationUnit; import org.hisp.dhis.android.core.program.Program; -import org.hisp.dhis.android.core.program.ProgramStage; import org.hisp.dhis.android.core.program.ProgramTrackedEntityAttribute; -import org.hisp.dhis.android.core.relationship.Relationship; -import org.hisp.dhis.android.core.relationship.RelationshipItem; -import org.hisp.dhis.android.core.relationship.RelationshipItemTrackedEntityInstance; import org.hisp.dhis.android.core.settings.AnalyticsDhisVisualizationsGroup; import org.hisp.dhis.android.core.settings.ProgramConfigurationSetting; import org.hisp.dhis.android.core.trackedentity.TrackedEntityAttribute; -import org.hisp.dhis.android.core.trackedentity.TrackedEntityAttributeValue; -import org.hisp.dhis.android.core.trackedentity.TrackedEntityInstance; import org.hisp.dhis.android.core.trackedentity.TrackedEntityInstanceCreateProjection; import org.hisp.dhis.android.core.trackedentity.TrackedEntityType; import org.hisp.dhis.android.core.trackedentity.TrackedEntityTypeAttribute; import org.hisp.dhis.android.core.trackedentity.internal.TrackedEntityInstanceDownloader; import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchCollectionRepository; -import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItem; -import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItemAttribute; -import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItemHelper; import org.jetbrains.annotations.NotNull; -import org.matomo.sdk.dispatcher.Dispatcher; import java.util.ArrayList; import java.util.Collections; @@ -89,14 +56,12 @@ import io.reactivex.Observable; import io.reactivex.Single; import kotlin.Pair; -import kotlin.Triple; public class SearchRepositoryImpl implements SearchRepository { private final String teiType; private final ResourceManager resources; private final D2 d2; - private final SearchSortingValueSetter sortingValueSetter; private final DispatcherProvider dispatcherProvider; private TrackedEntitySearchCollectionRepository trackedEntityInstanceQuery; private FilterPresenter filterPresenter; @@ -111,16 +76,7 @@ public class SearchRepositoryImpl implements SearchRepository { private HashSet fetchedTeiUids = new HashSet<>(); private TeiDownloader teiDownloader; private HashMap programCache = new HashMap<>(); - private HashMap orgUnitNameCache = new HashMap<>(); - private HashMap profilePictureCache = new HashMap<>(); - - private HashMap> attributesUidsCache = new HashMap(); - - private HashMap> trackedEntityTypeAttributesUidsCache = new HashMap(); - - private final MetadataIconProvider metadataIconProvider; - private final ProfilePictureProvider profilePictureProvider; private CustomIntentRepository customIntentRepository; SearchRepositoryImpl(String teiType, @@ -128,14 +84,11 @@ public class SearchRepositoryImpl implements SearchRepository { D2 d2, FilterPresenter filterPresenter, ResourceManager resources, - SearchSortingValueSetter sortingValueSetter, Charts charts, CrashReportController crashReportController, NetworkStatusProvider networkStatusProvider, SearchTEIRepository searchTEIRepository, ThemeManager themeManager, - MetadataIconProvider metadataIconProvider, - ProfilePictureProvider profilePictureProvider, DateUtils dateUtils, CustomIntentRepository customIntentRepository, DispatcherProvider dispatcherProvider @@ -143,7 +96,6 @@ public class SearchRepositoryImpl implements SearchRepository { this.teiType = teiType; this.d2 = d2; this.resources = resources; - this.sortingValueSetter = sortingValueSetter; this.filterPresenter = filterPresenter; this.charts = charts; this.crashReportController = crashReportController; @@ -158,8 +110,6 @@ public class SearchRepositoryImpl implements SearchRepository { new FileResourceConfiguration(d2), currentProgram, resources); - this.metadataIconProvider = metadataIconProvider; - this.profilePictureProvider = profilePictureProvider; this.customIntentRepository = customIntentRepository; this.dispatcherProvider = dispatcherProvider; } @@ -335,260 +285,6 @@ public Observable> getOrgUnits(@Nullable String selectedP } - private void setEnrollmentInfo(SearchTeiModel searchTei) { - List enrollments = - d2.enrollmentModule().enrollments() - .byTrackedEntityInstance().eq(searchTei.getTei().uid()) - .byDeleted().eq(false) - .orderByCreated(RepositoryScope.OrderByDirection.DESC) - .blockingGet(); - for (Enrollment enrollment : enrollments) { - if (enrollments.indexOf(enrollment) == 0) - searchTei.resetEnrollments(); - searchTei.addEnrollment(enrollment); - Program program = getProgram(enrollment.program()); - if (program.displayFrontPageList()) { - searchTei.addProgramInfo( - program, - metadataIconProvider.invoke(program.style()) - ); - } - searchTei.addEnrollmentInfo(getProgramInfo(program)); - } - } - - private Triple getProgramInfo(Program program) { - String programColor = program.style() != null && program.style().color() != null ? program.style().color() : ""; - String programIcon = program.style() != null && program.style().icon() != null ? program.style().icon() : ""; - return new Triple<>(program.displayName(), programColor, programIcon); - } - - private void setAttributesInfo(SearchTeiModel searchTei, TrackedEntitySearchItem searchTeiItem) { - for (TrackedEntitySearchItemAttribute attribute : searchTeiItem.getAttributeValues()) { - if (attribute.getDisplayInList() && isAcceptedValueType(attribute.getValueType())) { - setAttributeValue(searchTei, attribute); - } - } - } - - private boolean isAcceptedValueType(ValueType valueType) { - return switch (valueType) { - case IMAGE, COORDINATE, FILE_RESOURCE -> false; - default -> true; - }; - } - - private void setAttributeValue(SearchTeiModel searchTei, TrackedEntitySearchItemAttribute attribute) { - String value = attribute.getValue(); - String transformedValue; - if (value != null) { - transformedValue = ValueUtils.Companion.transformValue(d2, value, attribute.getValueType(), attribute.getOptionSet()); - } else { - transformedValue = sortingValueSetter.getUnknownLabel(); - } - TrackedEntityAttributeValue attributeValue = TrackedEntityAttributeValue.builder() - .created(attribute.getCreated()) - .lastUpdated(attribute.getLastUpdated()) - .trackedEntityAttribute(attribute.getAttribute()) - .trackedEntityInstance(searchTei.getTei().uid()) - .value(transformedValue) - .build(); - - searchTei.addAttributeValue(attribute.getDisplayFormName(), attributeValue); - - if (attribute.getValueType() == ValueType.TEXT || attribute.getValueType() == ValueType.LONG_TEXT) { - searchTei.addTextAttribute(attribute.getDisplayName(), attributeValue); - } - } - - private void setOverdueEvents(@NonNull SearchTeiModel tei, Program selectedProgram) { - String teiId = tei.getTei() != null && tei.getTei().uid() != null ? tei.getTei().uid() : ""; - List enrollments = d2.enrollmentModule().enrollments().byTrackedEntityInstance().eq(teiId).blockingGet(); - - EventCollectionRepository overdueEvents = d2.eventModule().events() - .byEnrollmentUid().in(UidsHelper.getUidsList(enrollments)) - .byStatus().eq(EventStatus.OVERDUE); - - EventCollectionRepository overdueScheduledEvents = d2.eventModule().events() - .byEnrollmentUid().in(UidsHelper.getUidsList(enrollments)) - .byStatus().eq(EventStatus.SCHEDULE); - - if (selectedProgram != null) { - overdueEvents = overdueEvents.byProgramUid().eq(selectedProgram.uid()); - overdueScheduledEvents = overdueScheduledEvents.byProgramUid().eq(selectedProgram.uid()); - } - - List overdueList = overdueEvents.orderByDueDate(RepositoryScope.OrderByDirection.DESC).blockingGet(); - List scheduledList = overdueScheduledEvents.orderByDueDate(RepositoryScope.OrderByDirection.DESC).blockingGet(); - - List filteredScheduled = new ArrayList<>(); - for (Event event : scheduledList) { - if (Boolean.TRUE.equals(dateUtils.isEventDueDateOverdue(event.dueDate()))) { - filteredScheduled.add(event); - } - } - - for (Event event : overdueList) { - if (Boolean.TRUE.equals(dateUtils.isEventDueDateOverdue(event.dueDate()))) { - filteredScheduled.add(event); - } - } - - List combinedOverdue = new ArrayList<>(filteredScheduled); - - if (!combinedOverdue.isEmpty()) { - combinedOverdue.sort((e1, e2) -> { - if (e1.dueDate() == null || e2.dueDate() == null) return 0; - return e2.dueDate().compareTo(e1.dueDate()); - }); - tei.setHasOverdue(true); - tei.setOverdueDate(combinedOverdue.get(0).dueDate()); - } - } - - private void setRelationshipsInfo(@NonNull SearchTeiModel searchTeiModel, Program selectedProgram) { - List relationshipModels = new ArrayList<>(); - List relationships = d2.relationshipModule().relationships().getByItem( - RelationshipItem.builder().trackedEntityInstance( - RelationshipItemTrackedEntityInstance.builder() - .trackedEntityInstance(searchTeiModel.getTei().uid()) - .build() - ).build() - ); - for (Relationship relationship : relationships) { - if (relationship.from().trackedEntityInstance() != null) { - String relationshipTEIUid; - RelationshipDirection direction; - if (!searchTeiModel.getTei().uid().equals(relationship.from().trackedEntityInstance().trackedEntityInstance())) { - relationshipTEIUid = relationship.from().trackedEntityInstance().trackedEntityInstance(); - direction = RelationshipDirection.FROM; - } else { - relationshipTEIUid = relationship.to().trackedEntityInstance().trackedEntityInstance(); - direction = RelationshipDirection.TO; - } - - String fromTeiUid = relationship.from().trackedEntityInstance().trackedEntityInstance(); - String toTeiUid = relationship.to().trackedEntityInstance().trackedEntityInstance(); - - TrackedEntityInstance fromTei = d2.trackedEntityModule().trackedEntityInstances().uid(fromTeiUid).blockingGet(); - TrackedEntityInstance toTei = d2.trackedEntityModule().trackedEntityInstances().uid(toTeiUid).blockingGet(); - - List> fromValues = new ArrayList<>(); - List fromAttr = getTrackedEntityAttributesForRelationship(fromTei, selectedProgram); - List> toValues = new ArrayList<>(); - List toAttr = getTrackedEntityAttributesForRelationship(toTei, selectedProgram); - for (TrackedEntityAttributeValue attributeValue : fromAttr) { - fromValues.add(new kotlin.Pair<>(attributeValue.trackedEntityAttribute(), attributeValue.value())); - } - for (TrackedEntityAttributeValue attributeValue : toAttr) { - toValues.add(new kotlin.Pair<>(attributeValue.trackedEntityAttribute(), attributeValue.value())); - } - - RelationshipGeometry fromGeometry = null; - RelationshipGeometry toGeometry = null; - - if (fromTei.geometry() != null) { - fromGeometry = new RelationshipGeometry( - fromTei.geometry().type().name(), - fromTei.geometry().coordinates() - ); - } - - if (toTei.geometry() != null) { - toGeometry = new RelationshipGeometry( - toTei.geometry().type().name(), - toTei.geometry().coordinates() - ); - } - - relationshipModels.add(new RelationshipModel( - relationship.uid(), - relationship.syncState().name(), - fromGeometry, - toGeometry, - direction, - relationshipTEIUid, - RelationshipOwnerType.TEI, - fromValues, - toValues, - profilePicturePath(fromTei, selectedProgram.uid()), - profilePicturePath(toTei, selectedProgram.uid()), - getTeiDefaultRes(fromTei), - getTeiDefaultRes(toTei), - null, - null, - true, - null, - null, - null, - null - )); - } - } - - searchTeiModel.setRelationships(relationshipModels); - } - - private String profilePicturePath(TrackedEntityInstance tei, String programUid) { - if (!profilePictureCache.containsKey(tei.uid())) { - profilePictureCache.put(tei.uid(), ExtensionsKt.profilePicturePath(tei, d2, programUid)); - } - return profilePictureCache.get(tei.uid()); - } - - private List getProgramAttributeUids(String programUid) { - if (!attributesUidsCache.containsKey(programUid)) { - List attributeUids = new ArrayList<>(); - List programTrackedEntityAttributes = d2.programModule().programTrackedEntityAttributes() - .byProgram().eq(programUid) - .byDisplayInList().isTrue() - .orderBySortOrder(RepositoryScope.OrderByDirection.ASC) - .blockingGet(); - for (ProgramTrackedEntityAttribute programAttribute : programTrackedEntityAttributes) { - attributeUids.add(programAttribute.trackedEntityAttribute().uid()); - } - attributesUidsCache.put(programUid, attributeUids); - } - - return attributesUidsCache.get(programUid); - } - - private List getTETypeAttributeUids(String teTypeUid) { - if (!trackedEntityTypeAttributesUidsCache.containsKey(teTypeUid)) { - List attributeUids = new ArrayList<>(); - List typeAttributes = d2.trackedEntityModule().trackedEntityTypeAttributes() - .byTrackedEntityTypeUid().eq(teTypeUid) - .byDisplayInList().isTrue() - .blockingGet(); - - for (TrackedEntityTypeAttribute typeAttribute : typeAttributes) { - attributeUids.add(typeAttribute.trackedEntityAttribute().uid()); - } - } - return trackedEntityTypeAttributesUidsCache.get(teTypeUid); - } - - private int getTeiDefaultRes(TrackedEntityInstance tei) { - TrackedEntityType teiTypeValues = d2.trackedEntityModule().trackedEntityTypes().uid(tei.trackedEntityType()).blockingGet(); - return resources.getObjectStyleDrawableResource(teiTypeValues.style().icon(), R.drawable.photo_temp_gray); - } - - private List getTrackedEntityAttributesForRelationship(TrackedEntityInstance tei, Program selectedProgram) { - - List values; - values = d2.trackedEntityModule().trackedEntityAttributeValues() - .byTrackedEntityInstance().eq(tei.uid()) - .byTrackedEntityAttribute().in(getProgramAttributeUids(selectedProgram.uid())).blockingGet(); - - if (values.isEmpty()) { - values = d2.trackedEntityModule().trackedEntityAttributeValues() - .byTrackedEntityInstance().eq(tei.uid()) - .byTrackedEntityAttribute().in(getTETypeAttributeUids(tei.trackedEntityType())).blockingGet(); - } - - return values; - } - @Override public String getProgramColor(@NonNull String programUid) { Program program = getProgram(programUid); @@ -653,19 +349,6 @@ public TrackedEntityType getTrackedEntityType() { return d2.trackedEntityModule().trackedEntityTypes().uid(teiType).blockingGet(); } - private String orgUnitName(String orgUnitUid) { - if (!orgUnitNameCache.containsKey(orgUnitUid)) { - OrganisationUnit organisationUnit = d2.organisationUnitModule() - .organisationUnits() - .uid(orgUnitUid) - .blockingGet(); - if (organisationUnit != null) { - orgUnitNameCache.put(orgUnitUid, organisationUnit.displayName()); - } - } - return orgUnitNameCache.get(orgUnitUid); - } - @Override public Observable downloadTei(String teiUid) { downloadRepository = d2.trackedEntityModule().trackedEntityInstanceDownloader() @@ -684,122 +367,6 @@ public TeiDownloadResult download(String teiUid, @Nullable String enrollmentUid, return teiDownloader.download(teiUid, enrollmentUid, reason); } - @Override - public SearchTeiModel transform(TrackedEntitySearchItem searchItem, @Nullable Program selectedProgram, boolean offlineOnly, SortingItem sortingItem) { - if (!fetchedTeiUids.contains(searchItem.uid())) { - fetchedTeiUids.add(searchItem.uid()); - } - TrackedEntityInstance teiFromItem = TrackedEntitySearchItemHelper.INSTANCE.toTrackedEntityInstance(searchItem); - - TrackedEntityInstance dbTei = searchItem.isOnline() ? - d2.trackedEntityModule().trackedEntityInstances().uid(searchItem.uid()).blockingGet() : - teiFromItem; - - SearchTeiModel searchTei = new SearchTeiModel(); - if (dbTei != null && dbTei.aggregatedSyncState() != State.RELATIONSHIP) { - searchTei.setTei(dbTei); - EnrollmentCollectionRepository enrollmentRepository = d2.enrollmentModule().enrollments() - .byTrackedEntityInstance().eq(dbTei.uid()); - - if (selectedProgram != null) { - enrollmentRepository = enrollmentRepository.byProgram().eq(selectedProgram.uid()); - } - - List enrollmentsInProgram = enrollmentRepository - .orderByEnrollmentDate(RepositoryScope.OrderByDirection.DESC) - .blockingGet(); - - if (selectedProgram != null && !enrollmentsInProgram.isEmpty()) { - for (Enrollment enrollment : enrollmentsInProgram) { - if (enrollment.status() == EnrollmentStatus.ACTIVE) { - searchTei.setCurrentEnrollment(enrollment); - break; - } - } - if (searchTei.getSelectedEnrollment() == null) { - searchTei.setCurrentEnrollment(enrollmentsInProgram.get(0)); - } - } - // set online parameter from the tei search item - searchTei.setOnline(searchItem.isOnline()); - // If search is being conducted offline only, set the search as offline - if (offlineOnly) - searchTei.setOnline(false); - // if the local database tei is deleted, set search as online - if (Boolean.TRUE.equals(dbTei.deleted())) { - searchTei.setOnline(true); - } - - setEnrollmentInfo(searchTei); - setAttributesInfo(searchTei, searchItem); - setOverdueEvents(searchTei, selectedProgram); - if (selectedProgram != null) { - setRelationshipsInfo(searchTei, selectedProgram); - } - if (!searchItem.getProgramOwners().isEmpty() && - !searchItem.getProgramOwners().get(0).getOwnerOrgUnit().equals(searchItem.getOrganisationUnit())) { - searchTei.setOwnerOrgUnit(orgUnitName(searchItem.getProgramOwners().get(0).getOwnerOrgUnit())); - } - if (searchTei.getSelectedEnrollment() != null) { - searchTei.setEnrolledOrgUnit(orgUnitName(searchTei.getSelectedEnrollment().organisationUnit())); - } else { - searchTei.setEnrolledOrgUnit(orgUnitName(searchTei.getTei().organisationUnit())); - } - searchTei.setProfilePicture(profilePictureProvider.invoke(dbTei, selectedProgram != null ? selectedProgram.uid() : null)); - } else { - searchTei.setTei(teiFromItem); - if (!searchItem.getProgramOwners().isEmpty() && - searchItem.getProgramOwners().get(0).getOwnerOrgUnit().equals(searchItem.getOrganisationUnit())) { - searchTei.setEnrolledOrgUnit(orgUnitName(searchTei.getTei().organisationUnit())); - } else { - searchTei.setEnrolledOrgUnit(orgUnitName(searchTei.getTei().organisationUnit())); - if (!searchItem.getProgramOwners().isEmpty()) { - searchTei.setOwnerOrgUnit(orgUnitName(searchItem.getProgramOwners().get(0).getOwnerOrgUnit())); - } - } - - for (TrackedEntitySearchItemAttribute attribute : searchItem.getAttributeValues()) { - if (attribute.getDisplayInList()) { - addAttribute(searchTei, attribute); - } - } - } - - ObjectStyle os = searchItem.getType().style(); - searchTei.setDefaultTypeIcon(os != null ? os.icon() : null); - - searchTei.setHeader(searchItem.getHeader()); - searchTei.setSortingValue(sortingValueSetter.setSortingItem(searchTei, sortingItem)); - searchTei.setTEType(searchItem.getType().displayName()); - searchTei.setDisplayOrgUnit(displayOrgUnit()); - return searchTei; - } - - private void addAttribute(SearchTeiModel searchTei, TrackedEntitySearchItemAttribute att) { - TrackedEntityAttributeValue attributeValue = TrackedEntityAttributeValue.builder() - .value(att.getValue()) - .created(att.getCreated()) - .lastUpdated(att.getLastUpdated()) - .trackedEntityAttribute(att.getAttribute()) - .trackedEntityInstance(searchTei.getTei().uid()) - .build(); - - String friendlyValue = ValueExtensionsKt.userFriendlyValue(attributeValue, d2, true); - - TrackedEntityAttributeValue friendlyAttributeValue = attributeValue.toBuilder() - .value(friendlyValue) - .build(); - - if (att.getValueType() == ValueType.IMAGE) - searchTei.setProfilePicture(att.getAttribute()); - - searchTei.addAttributeValue(att.getDisplayFormName(), friendlyAttributeValue); - } - - private String profilePicturePath(TrackedEntityInstance tei, @Nullable Program selectedProgram) { - return ExtensionsKt.profilePicturePath(tei, d2, selectedProgram != null ? selectedProgram.uid() : null); - } - @Override public void setCurrentProgram(String currentProgram) { this.currentProgram = currentProgram; @@ -921,12 +488,6 @@ public boolean canCreateInProgramWithoutSearch() { } } - private boolean displayOrgUnit() { - return d2.organisationUnitModule().organisationUnits() - .byProgramUids(Collections.singletonList(currentProgram)) - .blockingCount() > 1; - } - private static final String OPTION_SET_REGEX = "_os_"; } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImplKt.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImplKt.kt index 3f699212450..d1b4f4fc90e 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImplKt.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImplKt.kt @@ -6,6 +6,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.withContext import org.dhis2.commons.filters.FilterManager +import org.dhis2.commons.filters.sorting.SortingItem import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.search.SearchParametersModel import org.dhis2.maps.model.MapItemModel @@ -13,9 +14,11 @@ import org.dhis2.mobile.commons.customintents.CustomIntentRepository import org.dhis2.mobile.commons.model.CustomIntentActionTypeModel import org.dhis2.tracker.input.model.TrackerInputType import org.dhis2.tracker.input.ui.action.FieldUid +import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult import org.dhis2.usescases.events.EventInfoProvider import org.dhis2.usescases.tracker.TrackedEntityInstanceInfoProvider import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.common.ObjectStyle import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.android.core.event.EventStatus @@ -59,9 +62,9 @@ class SearchRepositoryImplKt( } val allowCache = queryData == savedSearchParameters.queryData && - FilterManager - .getInstance() - .sameFilters(savedFilters) + FilterManager + .getInstance() + .sameFilters(savedFilters) savedSearchParameters = savedSearchParameters.copy(queryData = queryData) savedFilters = FilterManager.getInstance().copy() return allowCache @@ -128,7 +131,7 @@ class SearchRepositoryImplKt( } val attributeValues = - trackedEntityInstanceInfoProvider.getTeiAdditionalInfoList( + trackedEntityInstanceInfoProvider.getTeiAdditionalInfoListForMap( searchItem.attributeValues ?: emptyList(), ) @@ -188,15 +191,15 @@ class SearchRepositoryImplKt( TrackerInputType.VERTICAL_CHECKBOXES, TrackerInputType.HORIZONTAL_RADIOBUTTONS, TrackerInputType.VERTICAL_RADIOBUTTONS, - -> ValueType.BOOLEAN + -> ValueType.BOOLEAN TrackerInputType.YES_ONLY_SWITCH, TrackerInputType.YES_ONLY_CHECKBOX, - -> ValueType.TRUE_ONLY + -> ValueType.TRUE_ONLY TrackerInputType.QR_CODE, TrackerInputType.BAR_CODE, - -> ValueType.TEXT + -> ValueType.TEXT TrackerInputType.MULTI_SELECTION -> ValueType.MULTI_TEXT TrackerInputType.DROPDOWN, @@ -205,9 +208,40 @@ class SearchRepositoryImplKt( TrackerInputType.SEQUENTIAL, TrackerInputType.NOT_SUPPORTED, TrackerInputType.CUSTOM_INTENT, - -> ValueType.TEXT + -> ValueType.TEXT } + override fun mapTrackedEntitySearchItemResultToSearchTeiModel( + searchItemResult: TrackedEntitySearchItemResult, + sortingItem: SortingItem?, + ): SearchTeiModel { + val searchTeiModel = SearchTeiModel() + searchTeiModel.tei = searchItemResult + searchItemResult.enrolledPrograms?.forEach { + searchTeiModel.addProgramInfo( + it.uid, + trackedEntityInstanceInfoProvider.getMetadataIcon( + ObjectStyle.builder().icon(it.style.icon).color(it.style.color).build() + ) + ) + } + searchItemResult.attributeValues.forEach { attr -> + if (attr.displayInList && isAcceptedValueType(attr.valueType)) { + val transformedValue = if (attr.value != null) + trackedEntityInstanceInfoProvider.getTransformedValue(attr) else trackedEntityInstanceInfoProvider.getUnknownLabel() + searchTeiModel.addAttributeValue(attr.displayName, attr.copy(value = transformedValue)) + if(attr.valueType == TrackerInputType.TEXT || attr.valueType == TrackerInputType.LONG_TEXT){ + searchTeiModel.addTextAttribute(attr.displayFormName, attr.copy(value = transformedValue)) + } + } + } + sortingItem?.let { + searchTeiModel.setSortingValue(trackedEntityInstanceInfoProvider.getSortingKeyValue(searchTeiModel, sortingItem)) + } + return searchTeiModel + + } + override fun searchRelationshipsForMap( teis: List, selectedProgram: Program?, @@ -250,7 +284,7 @@ class SearchRepositoryImplKt( when { relationshipTarget?.trackedEntityInstance() != null && - teis.none { it.uid == relationshipTarget.elementUid() } -> { + teis.none { it.uid == relationshipTarget.elementUid() } -> { val trackedEntityType = d2 .trackedEntityModule() @@ -296,9 +330,11 @@ class SearchRepositoryImplKt( TrackerInputType.DATE -> { ValueType.DATE.validator.validate(value) } + TrackerInputType.DATE_TIME -> { ValueType.DATETIME.validator.validate(value) } + TrackerInputType.TIME -> { ValueType.TIME.validator.validate(value) } @@ -353,4 +389,11 @@ class SearchRepositoryImplKt( actionType = CustomIntentActionTypeModel.SEARCH, ) } + + private fun isAcceptedValueType(valueType: TrackerInputType): Boolean { + return when (valueType) { + TrackerInputType.NOT_SUPPORTED -> false + else -> true + } + } } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryKt.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryKt.kt index 17f56679dee..43d715b49d9 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryKt.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryKt.kt @@ -1,10 +1,12 @@ package org.dhis2.usescases.searchTrackEntity +import org.dhis2.commons.filters.sorting.SortingItem import org.dhis2.data.search.SearchParametersModel import org.dhis2.maps.model.MapItemModel import org.dhis2.mobile.commons.model.CustomIntentModel import org.dhis2.tracker.input.model.TrackerInputType import org.dhis2.tracker.input.ui.action.FieldUid +import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.android.core.program.Program @@ -39,4 +41,9 @@ interface SearchRepositoryKt { fun getExcludeValues(): HashSet? fun trackerValueTypeToSDKValueType(trackerInputType: TrackerInputType): ValueType? + + fun mapTrackedEntitySearchItemResultToSearchTeiModel( + searchItemResult: TrackedEntitySearchItemResult, + sortingItem: SortingItem?, + ): SearchTeiModel } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt index c6fc35f741d..1991f8d981b 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt @@ -59,7 +59,6 @@ import org.dhis2.tracker.input.ui.action.FieldUid import org.dhis2.tracker.input.ui.action.TrackerInputAction import org.dhis2.tracker.input.ui.mapper.toTrackerInputUiState import org.dhis2.tracker.input.ui.state.TrackerOptionItem -import org.dhis2.tracker.search.data.transformDomainTeiToSDKTei import org.dhis2.tracker.search.domain.FetchOptionSetOptions import org.dhis2.tracker.search.domain.FetchSearchParameters import org.dhis2.tracker.search.domain.SearchTrackedEntities @@ -306,9 +305,9 @@ class SearchTEIViewModel( searchRepository.getProgram(initialProgramUid)?.displayFrontPageList() ?: true val shouldOpenSearch = !displayFrontPageList && - !searchRepository.canCreateInProgramWithoutSearch() && - !searching && - filtersActive.value == false + !searchRepository.canCreateInProgramWithoutSearch() && + !searching && + filtersActive.value == false createButtonScrollVisibility.postValue( if (searching) { @@ -548,7 +547,7 @@ class SearchTEIViewModel( queryDataAsMap(), selectedProgram?.uid(), ) - val newTrackerSearchModel = + val trackerSearchModel = SearchTrackedEntitiesInput( selectedProgram = selectedProgram?.uid(), allowCache = allowCache, @@ -557,22 +556,14 @@ class SearchTEIViewModel( isOnline = isOnline, queryDataList = queryDataList, ) - val results = searchTrackedEntities.invoke(newTrackerSearchModel) + val results = searchTrackedEntities.invoke(trackerSearchModel) emitAll( results.getOrThrow().map { pagingData -> pagingData.map { item -> withContext(dispatchers.io()) { - // TODO Create a new SearchTeiModel that does not use - // SDK objects and remove this mapping from the domain model back to the SDK one - val sdkTei = transformDomainTeiToSDKTei(item) - val searchOnline = - isOnline && - filterManager.stateFilters.isEmpty() - searchRepository.transform( - sdkTei, - selectedProgram, - !searchOnline, + searchRepositoryKt.mapTrackedEntitySearchItemResultToSearchTeiModel( + item, filterManager.sortingItem, ) } @@ -606,13 +597,8 @@ class SearchTEIViewModel( results.getOrThrow().map { pagingData -> pagingData.map { item -> withContext(dispatchers.io()) { - // TODO Create a new SearchTeiModel that does not use - // SDK objects and remove this mapping from the domain model back to the SDK one - val sdkTei = transformDomainTeiToSDKTei(item) - searchRepository.transform( - sdkTei, - selectedProgram, - true, + searchRepositoryKt.mapTrackedEntitySearchItemResultToSearchTeiModel( + item, filterManager.sortingItem, ) } @@ -650,16 +636,8 @@ class SearchTEIViewModel( results.getOrThrow().map { pagingData -> pagingData.map { item -> withContext(dispatchers.io()) { - // TODO Create a new SearchTeiModel that does not use - // SDK objects and remove this mapping from the domain model back to the SDK one - val sdkTei = transformDomainTeiToSDKTei(item) - val searchOnline = - isOnline && - filterManager.stateFilters.isEmpty() - searchRepository.transform( - sdkTei, - selectedProgram, - !searchOnline, + searchRepositoryKt.mapTrackedEntitySearchItemResultToSearchTeiModel( + item, filterManager.sortingItem, ) } @@ -763,17 +741,17 @@ class SearchTEIViewModel( onlineTooManyResults: Boolean, ): Boolean = !onlineTooManyResults && - when (initialProgramUid) { - null -> itemCount <= TEI_TYPE_SEARCH_MAX_RESULTS - else -> - searchRepository - .getProgram(initialProgramUid) - ?.maxTeiCountToReturn() - ?.takeIf { it != 0 } - ?.let { maxTeiCount -> - itemCount <= maxTeiCount - } ?: true - } + when (initialProgramUid) { + null -> itemCount <= TEI_TYPE_SEARCH_MAX_RESULTS + else -> + searchRepository + .getProgram(initialProgramUid) + ?.maxTeiCountToReturn() + ?.takeIf { it != 0 } + ?.let { maxTeiCount -> + itemCount <= maxTeiCount + } ?: true + } fun queryDataByProgram(programUid: String?): MutableMap> = searchRepository.filterQueryForProgram(queryDataAsMap(), programUid) @@ -903,9 +881,10 @@ class SearchTEIViewModel( } hasGlobalResults == null && - searchRepository.getProgram(initialProgramUid) != null && - searchRepository.filterQueryForProgram(queryDataAsMap(), null).isNotEmpty() && - searchRepository.filtersApplyOnGlobalSearch() -> { + searchRepository.getProgram(initialProgramUid) != null && + searchRepository.filterQueryForProgram(queryDataAsMap(), null) + .isNotEmpty() && + searchRepository.filtersApplyOnGlobalSearch() -> { listOf( SearchResult( SearchResult.SearchResultType.SEARCH_OUTSIDE, @@ -915,9 +894,9 @@ class SearchTEIViewModel( } hasGlobalResults == null && - searchRepository.getProgram(initialProgramUid) != null && - searchRepository.trackedEntityTypeFields().isNotEmpty() && - searchRepository.filtersApplyOnGlobalSearch() -> { + searchRepository.getProgram(initialProgramUid) != null && + searchRepository.trackedEntityTypeFields().isNotEmpty() && + searchRepository.filtersApplyOnGlobalSearch() -> { listOf( SearchResult( type = SearchResult.SearchResultType.UNABLE_SEARCH_OUTSIDE, @@ -1141,7 +1120,7 @@ class SearchTEIViewModel( // get uids to exclude for possible duplicates val excludeValues = searchRepositoryKt.getExcludeValues() - val newTrackerSearchModel = + val trackerSearchModel = SearchTrackedEntitiesInput( selectedProgram = selectedProgram?.uid(), allowCache = false, // No need for cache in immediate search @@ -1152,7 +1131,7 @@ class SearchTEIViewModel( ) // Use invokeImmediate for QR code scanning to get immediate non-paginated results - val trackedEntitiesResult = searchTrackedEntities.invokeImmediate(newTrackerSearchModel) + val trackedEntitiesResult = searchTrackedEntities.invokeImmediate(trackerSearchModel) val trackedEntities = trackedEntitiesResult.getOrNull() ?: emptyList() @@ -1161,17 +1140,11 @@ class SearchTEIViewModel( val tei = trackedEntities.first() // Transform domain model to SDK model for compatibility with existing code - val sdkTei = - withContext(dispatchers.io()) { - transformDomainTeiToSDKTei(tei) - } val searchTeiModel = withContext(dispatchers.io()) { - searchRepository.transform( - sdkTei, - selectedProgram, - !(isOnline && filterManager.stateFilters.isEmpty()), + searchRepositoryKt.mapTrackedEntitySearchItemResultToSearchTeiModel( + tei, filterManager.sortingItem, ) } @@ -1183,9 +1156,9 @@ class SearchTEIViewModel( // Open TEI dashboard for the found TEI onTeiClick( - teiUid = searchTeiModel.uid(), - enrollmentUid = searchTeiModel.selectedEnrollment.uid(), - online = searchTeiModel.isOnline, + teiUid = searchTeiModel.tei.uid, + enrollmentUid = searchTeiModel.selectedEnrollment.uid, + online = searchTeiModel.tei.isOnline, ) } } @@ -1231,7 +1204,7 @@ class SearchTEIViewModel( TrackerInputType.VERTICAL_RADIOBUTTONS, TrackerInputType.HORIZONTAL_CHECKBOXES, TrackerInputType.VERTICAL_CHECKBOXES, - -> { + -> { item.value?.let { if (it == "true" || it == "false") { map[item.uid] = "${item.label}: $it" diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java index 48630a68fb2..9e45fdea6b1 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java @@ -167,30 +167,24 @@ MapTeiEventsToFeatureCollection provideMapTeiEventsToFeatureCollection() { SearchRepository searchRepository(@NonNull D2 d2, FilterPresenter filterPresenter, ResourceManager resources, - SearchSortingValueSetter searchSortingValueSetter, Charts charts, CrashReportController crashReportController, NetworkStatusProvider networkStatusProvider, SearchTEIRepository searchTEIRepository, ThemeManager themeManager, - MetadataIconProvider metadataIconProvider, DateUtils dateUtils, CustomIntentRepository customIntentRepository, DispatcherProvider dispatcherProvider) { - ProfilePictureProvider profilePictureProvider = new ProfilePictureProvider(d2); return new SearchRepositoryImpl(teiType, initialProgram, d2, filterPresenter, resources, - searchSortingValueSetter, charts, crashReportController, networkStatusProvider, searchTEIRepository, themeManager, - metadataIconProvider, - profilePictureProvider, dateUtils, customIntentRepository, dispatcherProvider); @@ -205,7 +199,8 @@ SearchRepositoryKt searchRepositoryKt( MetadataIconProvider metadataIconProvider, ColorUtils colorUtils, DateUtils dateUtils, - CustomIntentRepository customIntentRepository + CustomIntentRepository customIntentRepository, + SearchSortingValueSetter sortingValueSetter ) { ResourceManager resourceManager = new ResourceManager(moduleContext, colorUtils); DateLabelProvider dateLabelProvider = new DateLabelProvider(moduleContext, new ResourceManager(moduleContext, colorUtils)); @@ -219,7 +214,8 @@ SearchRepositoryKt searchRepositoryKt( d2, profilePictureProvider, dateLabelProvider, - metadataIconProvider + metadataIconProvider, + sortingValueSetter ), new EventInfoProvider( d2, @@ -437,14 +433,22 @@ SearchTrackedEntities provideLoadSearchResultsUseCase( @PerActivity SearchTrackedEntityRepository provideLoadSearchResultsRepository( D2 d2, - FilterPresenter filterPresenter + FilterPresenter filterPresenter, + ProfilePictureProvider profilePictureProvider ) { return new SearchTrackedEntityRepositoryImpl( d2, - filterPresenter + filterPresenter, + profilePictureProvider ); } + @Provides + @PerActivity + ProfilePictureProvider provideProfilePictureProvider(D2 d2) { + return new ProfilePictureProvider(d2); + } + @Provides @PerActivity DateUtils provideDateUtils( diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTeiModel.java b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTeiModel.java index c1cd2674bc3..04573bbf6b7 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTeiModel.java +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTeiModel.java @@ -1,55 +1,28 @@ package org.dhis2.usescases.searchTrackEntity; -import org.dhis2.commons.data.CarouselItemModel; -import org.dhis2.tracker.relationships.model.RelationshipModel; import org.dhis2.mobile.commons.model.MetadataIconData; -import org.hisp.dhis.android.core.enrollment.Enrollment; +import org.dhis2.tracker.search.model.DomainEnrollment; +import org.dhis2.tracker.search.model.TrackedEntitySearchItemAttributeDomain; +import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult; import org.hisp.dhis.android.core.maintenance.D2ErrorCode; -import org.hisp.dhis.android.core.program.Program; -import org.hisp.dhis.android.core.trackedentity.TrackedEntityAttributeValue; -import org.hisp.dhis.android.core.trackedentity.TrackedEntityInstance; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Date; import java.util.HashMap; import java.util.LinkedHashMap; -import java.util.List; -import java.util.Objects; -import kotlin.Triple; +public class SearchTeiModel{ -public class SearchTeiModel implements CarouselItemModel { + private LinkedHashMap attributeValues; + private LinkedHashMap textAttributeValues; - private LinkedHashMap attributeValues; - private LinkedHashMap textAttributeValues; - - private List> enrollmentsInfo; - private List programInfo; private HashMap metadataIconDataMap; - private boolean hasOverdue; - private boolean isOnline; - - private TrackedEntityInstance tei; - private String profilePicturePath; - private String defaultTypeIcon; - private String header; - - private Enrollment selectedEnrollment; - private List enrollments; - private Date overdueDate; - private List relationships; + + private TrackedEntitySearchItemResult tei; + private boolean openedAttributeList = false; private String sortingKey; private String sortingValue; - private String teTypeName; - private String enrolledOrgUnit; - private String ownerOrgUnit; - private Boolean displayOrgUnit; - private boolean showNavigationButton = false; @Nullable public String onlineErrorMessage; @Nullable @@ -57,140 +30,73 @@ public class SearchTeiModel implements CarouselItemModel { public SearchTeiModel() { this.tei = null; - this.selectedEnrollment = null; this.attributeValues = new LinkedHashMap<>(); this.textAttributeValues = new LinkedHashMap<>(); - this.enrollmentsInfo = new ArrayList<>(); - this.programInfo = new ArrayList<>(); - this.isOnline = true; - this.enrollments = new ArrayList<>(); - this.relationships = new ArrayList<>(); this.sortingKey = null; this.sortingValue = null; - this.enrolledOrgUnit = null; this.onlineErrorMessage = null; this.metadataIconDataMap = new HashMap<>(); - this.ownerOrgUnit = null; } - public void addEnrollmentInfo(Triple enrollmentInfo) { - enrollmentsInfo.add(enrollmentInfo); - } - public void addProgramInfo(Program program, MetadataIconData metadataIconData) { - if (!programInfo.contains(program)) { - programInfo.add(program); - metadataIconDataMap.put(program.uid(), metadataIconData); - } - } - public boolean isHasOverdue() { - return hasOverdue; - } + public void addProgramInfo(String programUid, MetadataIconData metadataIconData) { - public void setHasOverdue(boolean hasOverdue) { - this.hasOverdue = hasOverdue; - } + metadataIconDataMap.put(programUid, metadataIconData); - public boolean isOnline() { - return isOnline; } - public void setOnline(boolean online) { - isOnline = online; - this.attributeValues.clear(); - } - public LinkedHashMap getAttributeValues() { + public LinkedHashMap getAttributeValues() { return attributeValues; } - public LinkedHashMap getTextAttributeValues() { + public LinkedHashMap getTextAttributeValues() { return textAttributeValues; } - public void addAttributeValue(String attributeName, TrackedEntityAttributeValue attributeValues) { + public void addAttributeValue(String attributeName, TrackedEntitySearchItemAttributeDomain attributeValues) { this.attributeValues.put(attributeName, attributeValues); } - public void addTextAttribute(String attributeName, TrackedEntityAttributeValue attributeValue) { + public void addTextAttribute(String attributeName, TrackedEntitySearchItemAttributeDomain attributeValue) { this.textAttributeValues.put(attributeName, attributeValue); } - public void resetEnrollments() { - this.enrollments.clear(); - this.enrollmentsInfo.clear(); - } - - public void setAttributeValues(LinkedHashMap attributeValues) { + public void setAttributeValues(LinkedHashMap attributeValues) { this.attributeValues = attributeValues; } - public void setTei(TrackedEntityInstance tei) { + public void setTei(TrackedEntitySearchItemResult tei) { this.tei = tei; } - public TrackedEntityInstance getTei() { + public TrackedEntitySearchItemResult getTei() { return tei; } - public void setProfilePicture(String profilePicturePath) { - this.profilePicturePath = profilePicturePath; - } public String getProfilePicturePath() { - return profilePicturePath != null ? profilePicturePath : ""; + return this.tei.getProfilePicture() != null ? this.tei.getProfilePicture() : ""; } - public void setDefaultTypeIcon(String defaultTypeIcon) { - this.defaultTypeIcon = defaultTypeIcon; - } + @Nullable public String getDefaultTypeIcon() { - return defaultTypeIcon; - } - - public void setHeader(String header) { - this.header = header; + return this.tei.getDefaultTypeIcon(); } @Nullable public String getHeader() { - return header; - } - - public void setCurrentEnrollment(Enrollment enrollment) { - this.selectedEnrollment = enrollment; + return this.tei.getHeader(); } - public Enrollment getSelectedEnrollment() { - return this.selectedEnrollment; - } - - public void addEnrollment(Enrollment enrollment) { - this.enrollments.add(enrollment); - } - public List getEnrollments() { - return enrollments; - } - - public List getProgramInfo() { - Collections.sort(programInfo, (program1, program2) -> program1.displayName().compareToIgnoreCase(program2.displayName())); - if (selectedEnrollment != null) { - List programs = new ArrayList<>(); - for (Program program : programInfo) { - if (!Objects.equals(selectedEnrollment.program(), program.uid())) { - programs.add(program); - } - } - return programs; - } else { - return programInfo; - } + public DomainEnrollment getSelectedEnrollment() { + return this.tei.getSelectedEnrollment(); } public MetadataIconData getMetadataIconData(@Nullable String programUid) { @@ -211,22 +117,6 @@ public Boolean isMetadataIconDataAvailable(@Nullable String programUid) { } } - public void setOverdueDate(Date dateToShow) { - this.overdueDate = dateToShow; - } - - public Date getOverdueDate() { - return overdueDate; - } - - public List getRelationships() { - return relationships; - } - - public void setRelationships(List relationships) { - this.relationships = relationships; - } - public void toggleAttributeList() { this.openedAttributeList = !this.openedAttributeList; } @@ -250,49 +140,5 @@ public String getSortingValue() { return sortingValue; } - public void setTEType(String teTypeName) { - this.teTypeName = teTypeName; - } - - public String getTeTypeName() { - return teTypeName; - } - - @NotNull - @Override - public String uid() { - return tei.uid(); - } - - public void setEnrolledOrgUnit(String orgUnit) { - enrolledOrgUnit = orgUnit; - } - - public String getEnrolledOrgUnit() { - return enrolledOrgUnit; - } - - public void setOwnerOrgUnit(String orgUnit) { - ownerOrgUnit = orgUnit; - } - public String getOwnerOrgUnit() { - return ownerOrgUnit; - } - - public void setDisplayOrgUnit(Boolean display) { - displayOrgUnit = display; - } - - public Boolean getDisplayOrgUnit() { - return displayOrgUnit; - } - - public void setShowNavigationButton(boolean showNavigationButton) { - this.showNavigationButton = showNavigationButton; - } - - public boolean shouldShowNavigationButton() { - return showNavigationButton; - } } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTeiViewModelFactory.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTeiViewModelFactory.kt index 6244a20203b..e37e97c1248 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTeiViewModelFactory.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTeiViewModelFactory.kt @@ -28,7 +28,7 @@ class SearchTeiViewModelFactory( private val searchTrackedEntities: SearchTrackedEntities, private val fetchSearchParameters: FetchSearchParameters, private val fetchOptionSetOptions: FetchOptionSetOptions, -) : ViewModelProvider.Factory { + ) : ViewModelProvider.Factory { override fun create(modelClass: Class): T = SearchTEIViewModel( initialProgramUid, diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/BaseTeiViewHolder.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/BaseTeiViewHolder.kt index d38456551d0..75ba63d16fe 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/BaseTeiViewHolder.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/BaseTeiViewHolder.kt @@ -3,15 +3,13 @@ package org.dhis2.usescases.searchTrackEntity.adapters import android.view.View import androidx.compose.ui.platform.ViewCompositionStrategy import androidx.recyclerview.widget.RecyclerView -import org.dhis2.commons.bindings.getEnrollmentIconsData -import org.dhis2.commons.bindings.hasFollowUp import org.dhis2.commons.bindings.paintAllEnrollmentIcons -import org.dhis2.commons.bindings.setAttributeList -import org.dhis2.commons.bindings.setStatusText import org.dhis2.commons.data.EnrollmentIconData import org.dhis2.commons.date.toDateSpan import org.dhis2.commons.resources.ColorUtils import org.dhis2.databinding.ItemSearchTrackedEntityBinding +import org.dhis2.mobile.commons.extensions.toJavaDate +import org.dhis2.tracker.search.data.toSDKState import org.dhis2.usescases.searchTrackEntity.SearchTeiModel abstract class BaseTeiViewHolder( @@ -43,32 +41,32 @@ abstract class BaseTeiViewHolder( } binding.apply { - overdue = teiModel.isHasOverdue - isOnline = teiModel.isOnline - orgUnit = teiModel.enrolledOrgUnit - teiSyncState = teiModel.tei.state() + overdue = teiModel.tei.overDueDate?.toJavaDate() != null + isOnline = teiModel.tei.isOnline + orgUnit = teiModel.tei.enrollmentOrgUnit + teiSyncState = teiModel.tei.aggregatedSyncState?.toSDKState() attribute = teiModel.attributeValues.values.toList() attributeNames = teiModel.attributeValues.keys attributeListOpened = teiModel.isAttributeListOpen - lastUpdated.text = teiModel.tei.lastUpdated().toDateSpan(itemView.context) + lastUpdated.text = teiModel.tei.lastUpdated?.toJavaDate()?.toDateSpan(itemView.context) sortingValue = teiModel.sortingValue } teiModel.apply { - binding.setFollowUp(enrollments.hasFollowUp()) - val enrollmentIconDataList: List = - programInfo.getEnrollmentIconsData( - if (selectedEnrollment != null) selectedEnrollment.program() else null, + binding.setFollowUp(tei.enrollments?.hasFollowUp()) + val enrollmentIconDataList: List? = + tei.enrolledPrograms?.getEnrollmentIconsData( + if (selectedEnrollment != null) selectedEnrollment.program else null, ) { programUid -> getMetadataIconData(programUid) } - enrollmentIconDataList.paintAllEnrollmentIcons( + enrollmentIconDataList?.paintAllEnrollmentIcons( binding.composeProgramList, ) if (selectedEnrollment != null) { selectedEnrollment.setStatusText( itemView.context, binding.enrollmentStatus, - isHasOverdue, - overdueDate, + teiModel.tei.overDueDate != null, + teiModel.tei.overDueDate?.toJavaDate(), ) } setTeiImage( @@ -85,7 +83,7 @@ abstract class BaseTeiViewHolder( teiModel.isAttributeListOpen, teiModel.sortingKey, teiModel.sortingValue, - teiModel.enrolledOrgUnit, + teiModel.tei.enrollmentOrgUnit, ) { attributeVisibilityCallback() } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchAdapterDiffCallback.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchAdapterDiffCallback.kt index a2c66cac0fe..4b02a4f7c01 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchAdapterDiffCallback.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchAdapterDiffCallback.kt @@ -7,21 +7,15 @@ class SearchAdapterDiffCallback : DiffUtil.ItemCallback() { override fun areItemsTheSame( oldItem: SearchTeiModel, newItem: SearchTeiModel, - ): Boolean = oldItem.tei?.uid() == newItem.tei?.uid() + ): Boolean = oldItem.tei?.uid == newItem.tei?.uid override fun areContentsTheSame( oldItem: SearchTeiModel, - newItem: SearchTeiModel, - ): Boolean = - oldItem.tei?.uid() == newItem.tei?.uid() && - oldItem.tei?.state() == newItem.tei?.state() && - oldItem.attributeValues == newItem.attributeValues && - oldItem.enrollments == newItem.enrollments && - oldItem.profilePicturePath == newItem.profilePicturePath && - oldItem.isAttributeListOpen == newItem.isAttributeListOpen && - oldItem.sortingKey == newItem.sortingKey && - oldItem.sortingValue == newItem.sortingValue && - oldItem.enrolledOrgUnit == newItem.enrolledOrgUnit + newItem: SearchTeiModel + ): Boolean { + return oldItem.tei == newItem.tei + } + override fun getChangePayload( oldItem: SearchTeiModel, diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchRelationshipViewHolder.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchRelationshipViewHolder.kt index d6195b0c073..a0c9c0dd43f 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchRelationshipViewHolder.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchRelationshipViewHolder.kt @@ -21,7 +21,7 @@ class SearchRelationshipViewHolder( override fun itemViewClick() { itemView.setOnClickListener { - onAddRelationship(teiModel.tei.uid(), null, teiModel.isOnline) + onAddRelationship(teiModel.tei.uid, null, teiModel.tei.isOnline) } } } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchTEViewHolder.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchTEViewHolder.kt index 330961652fb..b4ec44dfff8 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchTEViewHolder.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchTEViewHolder.kt @@ -19,9 +19,8 @@ class SearchTEViewHolder( override fun itemViewClick() { binding.syncState.setOnClickListener { - if (teiModel.tei.deleted()!! || - teiModel.selectedEnrollment != null && - teiModel.selectedEnrollment.deleted()!! + if (teiModel.tei.deleted || + teiModel.tei.selectedEnrollment == null ) { Toast .makeText( @@ -30,28 +29,28 @@ class SearchTEViewHolder( Toast.LENGTH_SHORT, ).show() } else { - onSyncIconClick(teiModel.selectedEnrollment.uid()) + onSyncIconClick(teiModel.selectedEnrollment.uid) } } binding.download.setOnClickListener { onDownloadTei( - teiModel.tei.uid(), - teiModel.selectedEnrollment?.uid(), + teiModel.tei.uid, + teiModel.selectedEnrollment?.uid, ) } binding.cardView.setOnClickListener { - if (teiModel.isOnline) { + if (teiModel.tei.isOnline) { onDownloadTei( - teiModel.tei.uid(), - teiModel.selectedEnrollment?.uid(), + teiModel.tei.uid, + teiModel.selectedEnrollment?.uid, ) } else { onTeiClick( - teiModel.tei.uid(), - teiModel.selectedEnrollment?.uid(), - teiModel.isOnline, + teiModel.tei.uid, + teiModel.selectedEnrollment?.uid, + teiModel.tei.isOnline, ) } } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchTeiLiveAdapter.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchTeiLiveAdapter.kt index dfcc27b0d80..ff7f6f75061 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchTeiLiveAdapter.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchTeiLiveAdapter.kt @@ -98,19 +98,19 @@ class SearchTeiLiveAdapter( cardMapper.map( searchTEIModel = it, onSyncIconClick = { - onSyncIconClick.invoke(it.selectedEnrollment.uid()) + onSyncIconClick.invoke(it.selectedEnrollment.uid) }, onCardClick = { - if (it.isOnline) { + if (it.tei.isOnline) { onDownloadTei.invoke( - it.tei.uid(), - it.selectedEnrollment?.uid(), + it.tei.uid, + it.selectedEnrollment?.uid, ) } else { onTeiClick.invoke( - it.tei.uid(), - it.selectedEnrollment?.uid(), - it.isOnline, + it.tei.uid, + it.selectedEnrollment?.uid, + it.tei.isOnline, ) } }, diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchTeiModelExtensions.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchTeiModelExtensions.kt index 4574129cbfe..7d013ed988c 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchTeiModelExtensions.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchTeiModelExtensions.kt @@ -3,19 +3,34 @@ package org.dhis2.usescases.searchTrackEntity.adapters import android.content.Context import android.graphics.PorterDuff import android.graphics.PorterDuffColorFilter +import android.graphics.drawable.GradientDrawable +import android.view.LayoutInflater import android.view.View import android.widget.ImageView +import android.widget.LinearLayout import android.widget.TextView import androidx.appcompat.content.res.AppCompatResources +import androidx.core.content.res.ResourcesCompat +import androidx.core.graphics.toColorInt import com.bumptech.glide.Glide import com.bumptech.glide.load.resource.bitmap.CircleCrop import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions import org.dhis2.commons.R +import org.dhis2.commons.bindings.getRemainingEnrollmentsForTei +import org.dhis2.commons.data.EnrollmentIconData +import org.dhis2.commons.databinding.ItemFieldValueBinding +import org.dhis2.commons.date.toUiText import org.dhis2.commons.resources.ColorType import org.dhis2.commons.resources.ColorUtils import org.dhis2.commons.resources.ResourceManager +import org.dhis2.mobile.commons.model.MetadataIconData +import org.dhis2.tracker.search.model.DomainEnrollment +import org.dhis2.tracker.search.model.DomainProgram +import org.dhis2.tracker.search.model.EnrollmentStatus +import org.dhis2.tracker.search.model.TrackedEntitySearchItemAttributeDomain import org.dhis2.usescases.searchTrackEntity.SearchTeiModel import java.io.File +import java.util.Date fun SearchTeiModel.setTeiImage( context: Context, @@ -58,16 +73,16 @@ fun SearchTeiModel.setTeiImage( textAttributeValues != null && textAttributeValues.values.isNotEmpty() && - ArrayList(textAttributeValues.values)[0].value() != "-" -> { + ArrayList(textAttributeValues.values)[0].value != "-" -> { teiImageView.setImageDrawable(null) teiTextImageView.visibility = View.VISIBLE val valueToShow = ArrayList(textAttributeValues.values) - if (valueToShow[0]?.value()?.isEmpty() != false) { + if (valueToShow[0]?.value?.isEmpty() != false) { teiTextImageView.text = "?" } else { teiTextImageView.text = valueToShow[0] - .value() + .value ?.first() .toString() .uppercase() @@ -82,9 +97,9 @@ fun SearchTeiModel.setTeiImage( ) } - isOnline && + tei.isOnline && attributeValues.isNotEmpty() && - ArrayList(attributeValues.values).firstOrNull()?.value()?.isNotEmpty() == true -> { + ArrayList(attributeValues.values).firstOrNull()?.value?.isNotEmpty() == true -> { teiImageView.setImageDrawable(null) teiTextImageView.visibility = View.VISIBLE val valueToShow = ArrayList(attributeValues.values) @@ -93,7 +108,7 @@ fun SearchTeiModel.setTeiImage( } else { teiTextImageView.text = valueToShow[0] - .value() + .value ?.first() .toString() .uppercase() @@ -143,3 +158,147 @@ fun SearchTeiModel.setTeiImage( } } } + +fun LinkedHashMap.setAttributeList( + parentLayout: LinearLayout, + showAttributesButton: ImageView, + adapterPosition: Int, + listIsOpen: Boolean, + sortingKey: String?, + sortingValue: String?, + orgUnit: String?, + showList: () -> Unit, +) { + parentLayout.removeAllViews() + if (size > 3) { + for (pos in 1 until size) { + val fieldName = + keys.toTypedArray()[pos] + val fieldValue = this[fieldName]?.value + val itemFieldValueBinding = + ItemFieldValueBinding.inflate(LayoutInflater.from(parentLayout.context)) + itemFieldValueBinding.name = fieldName + itemFieldValueBinding.value = fieldValue + itemFieldValueBinding.root.tag = adapterPosition.toString() + "_" + fieldName + parentLayout.addView(itemFieldValueBinding.root) + } + val orgUnitKey = parentLayout.context.getString(R.string.enrolled_in) + val itemFieldValueBinding = + ItemFieldValueBinding.inflate(LayoutInflater.from(parentLayout.context)) + itemFieldValueBinding.name = orgUnitKey + itemFieldValueBinding.value = orgUnit + itemFieldValueBinding.root.tag = adapterPosition.toString() + "_" + orgUnitKey + parentLayout.addView(itemFieldValueBinding.root) + if (sortingKey != null) { + val binding = + ItemFieldValueBinding.inflate(LayoutInflater.from(parentLayout.context)) + binding.name = sortingKey + binding.fieldName.setTextColor( + ResourcesCompat.getColor( + binding.fieldName.context.resources, + R.color.sorting_attribute_key_color, + null, + ), + ) + binding.value = sortingValue + binding.fieldValue.setTextColor( + ResourcesCompat.getColor( + binding.fieldValue.context.resources, + R.color.sorting_attribute_value_color, + null, + ), + ) + binding.root.tag = adapterPosition.toString() + "_" + sortingValue + parentLayout.addView(binding.root) + } + showAttributesButton.scaleY = if (listIsOpen) -1F else 1F + showAttributesButton.setOnClickListener { + showList() + } + } else { + showAttributesButton.setOnClickListener(null) + } +} + + + +fun DomainEnrollment.setStatusText( + context: Context, + statusTextView: TextView, + isOverdue: Boolean, + dueDate: Date?, +) { + var textToShow: String? = null + var color = -1 + when { + isOverdue -> { + textToShow = dueDate.toUiText(context) + color = "#E91E63".toColorInt() + } + + status == EnrollmentStatus.CANCELLED -> { + textToShow = context.getString(R.string.cancelled) + color = "#E91E63".toColorInt() + } + + status == EnrollmentStatus.COMPLETED -> { + textToShow = context.getString(R.string.enrollment_status_completed) + color = "#8A333333".toColorInt() + } + } + statusTextView.visibility = if (textToShow == null) View.GONE else View.VISIBLE + statusTextView.text = textToShow + statusTextView.setTextColor(color) + val bgDrawable = + AppCompatResources.getDrawable( + context, + R.drawable.round_border_box_2, + ) as GradientDrawable? + bgDrawable!!.setStroke(2, color) + statusTextView.background = bgDrawable +} + + +fun List.hasFollowUp(): Boolean = + firstOrNull { enrollment -> + enrollment.followUp + }?.followUp ?: false + +fun List.getEnrollmentIconsData( + currentProgram: String?, + provideMetadataIconData: (String) -> MetadataIconData, +): List { + val enrollmentIconDataList: MutableList = mutableListOf() + + val filteredList = this.filter { it.uid != currentProgram } + this.filter { it.uid != currentProgram } + .forEachIndexed { index, program -> + filteredList.size.let { + if (it <= 4) { + enrollmentIconDataList.add( + EnrollmentIconData(0, 0, true, 0, + provideMetadataIconData(program.uid)), + ) + } else { + if (index in 0..2) { + enrollmentIconDataList.add( + EnrollmentIconData(0, 0, true, 0, provideMetadataIconData(program.uid)), + ) + } + if (index == 3) { + enrollmentIconDataList.add( + EnrollmentIconData( + 0, + 0, + false, + getRemainingEnrollmentsForTei(filteredList.size), + provideMetadataIconData(program.uid), + ), + ) + } + } + } + } + return enrollmentIconDataList +} + diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapper.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapper.kt index 794ba07e04d..c5d520c6d0b 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapper.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapper.kt @@ -17,17 +17,18 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.graphics.painter.BitmapPainter import org.dhis2.R -import org.dhis2.commons.bindings.hasFollowUp import org.dhis2.commons.bindings.isFilePathValid import org.dhis2.commons.date.toDateSpan import org.dhis2.commons.date.toOverdueOrScheduledUiText import org.dhis2.commons.resources.ResourceManager import org.dhis2.commons.ui.model.ListCardUiModel +import org.dhis2.mobile.commons.extensions.toJavaDate +import org.dhis2.tracker.search.model.DomainEnrollment +import org.dhis2.tracker.search.model.DomainProgram +import org.dhis2.tracker.search.model.EnrollmentStatus +import org.dhis2.tracker.search.model.SyncState import org.dhis2.usescases.searchTrackEntity.SearchTeiModel -import org.hisp.dhis.android.core.common.State -import org.hisp.dhis.android.core.enrollment.Enrollment -import org.hisp.dhis.android.core.enrollment.EnrollmentStatus -import org.hisp.dhis.android.core.program.Program +import org.dhis2.usescases.searchTrackEntity.adapters.hasFollowUp import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItem import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItemColor import org.hisp.dhis.mobile.ui.designsystem.component.Avatar @@ -53,7 +54,7 @@ class TEICardMapper( ListCardUiModel( avatar = { ProvideAvatar(searchTEIModel, onImageClick) }, title = getTitle(searchTEIModel), - lastUpdated = searchTEIModel.tei.lastUpdated().toDateSpan(context), + lastUpdated = searchTEIModel.tei.lastUpdated?.toJavaDate().toDateSpan(context), additionalInfo = getAdditionalInfoList(searchTEIModel), actionButton = { ProvideSyncButton(searchTEIModel, onSyncIconClick) }, expandLabelText = resourceManager.getString(R.string.show_more), @@ -68,7 +69,7 @@ class TEICardMapper( ) { val programUid: String? = if (item.selectedEnrollment != null) { - item.selectedEnrollment.program().toString() + item.selectedEnrollment.program } else { null } @@ -103,7 +104,7 @@ class TEICardMapper( item.header?.firstOrNull() ?: item.attributeValues.values .firstOrNull() - ?.value() + ?.value ?.firstOrNull() return when (firstLetter) { @@ -119,17 +120,17 @@ class TEICardMapper( val value = item.attributeValues.values .firstOrNull() - ?.value() ?: "-" + ?.value ?: "-" "$key: $value" } private fun getAdditionalInfoList(searchTEIModel: SearchTeiModel): List { val attributeList = - searchTEIModel.attributeValues + searchTEIModel.tei.attributeValues .map { AdditionalInfoItem( - key = it.key, - value = it.value.value() ?: "-", + key = it.displayName, + value = it.value ?: "-", ) }.toMutableList() @@ -139,82 +140,84 @@ class TEICardMapper( attributeList.removeIf { it.value.isEmpty() || it.value == "-" } return attributeList.also { list -> - if ( - !searchTEIModel.ownerOrgUnit.isNullOrEmpty() && - searchTEIModel.ownerOrgUnit != searchTEIModel.enrolledOrgUnit - ) { - addOwnedBy( - list = list, - ownerOrgUnit = searchTEIModel.ownerOrgUnit, - ) + searchTEIModel.tei.ownerOrgUnit?.let { + if (it != searchTEIModel.tei.enrollmentOrgUnit) { + addOwnedBy( + list = list, + ownerOrgUnit = it, + ) + } } - if (searchTEIModel.displayOrgUnit && searchTEIModel.enrolledOrgUnit != null) { + if (searchTEIModel.tei.shouldDisplayOrgUnit) { checkEnrolledIn( list = list, - enrolledOrgUnit = searchTEIModel.enrolledOrgUnit, + enrolledOrgUnit = searchTEIModel.tei.enrollmentOrgUnit, ) } checkEnrolledPrograms( list = list, - enrolledPrograms = searchTEIModel.programInfo, + enrolledPrograms = searchTEIModel.tei.enrolledPrograms, ) val programUid: String? = if (searchTEIModel.selectedEnrollment != null) { - searchTEIModel.selectedEnrollment.program().toString() + searchTEIModel.selectedEnrollment.program } else { null } checkEnrollmentStatus( programUid = programUid, list = list, - status = searchTEIModel.selectedEnrollment?.status(), + status = searchTEIModel.selectedEnrollment?.status?: EnrollmentStatus.ACTIVE, ) checkOverdue( list = list, - hasOverdue = searchTEIModel.isHasOverdue, - overdueDate = searchTEIModel.overdueDate, + hasOverdue = searchTEIModel.tei.overDueDate != null, + overdueDate = searchTEIModel.tei.overDueDate?.toJavaDate(), ) checkFollowUp( list = list, - enrollments = searchTEIModel.enrollments, + enrollments = searchTEIModel.tei.enrollments, ) checkSyncStatus( list = list, - state = searchTEIModel.tei.aggregatedSyncState(), + state = searchTEIModel.tei.syncState, ) } } private fun checkFollowUp( list: MutableList, - enrollments: List, + enrollments: List?, ) { - if (enrollments.hasFollowUp()) { - list.add( - AdditionalInfoItem( - icon = { - Icon( - imageVector = Icons.Outlined.Flag, - contentDescription = resourceManager.getString(R.string.marked_follow_up), - tint = AdditionalInfoItemColor.WARNING.color, - ) - }, - value = resourceManager.getString(R.string.marked_follow_up), - isConstantItem = true, - color = AdditionalInfoItemColor.WARNING.color, - ), - ) + enrollments?.let { + if (enrollments.hasFollowUp()) { + list.add( + AdditionalInfoItem( + icon = { + Icon( + imageVector = Icons.Outlined.Flag, + contentDescription = resourceManager.getString(R.string.marked_follow_up), + tint = AdditionalInfoItemColor.WARNING.color, + ) + }, + value = resourceManager.getString(R.string.marked_follow_up), + isConstantItem = true, + color = AdditionalInfoItemColor.WARNING.color, + ), + ) + } } + } private fun checkEnrollmentStatus( programUid: String?, list: MutableList, - status: EnrollmentStatus?, + status: EnrollmentStatus, ) { val item = when (status) { @@ -268,11 +271,11 @@ class TEICardMapper( private fun checkEnrolledPrograms( list: MutableList, - enrolledPrograms: List, + enrolledPrograms: List?, ) { - val programNames = enrolledPrograms.map { it.name() } + val programNames = enrolledPrograms?.map { it.displayName } - if (programNames.isNotEmpty()) { + programNames?.let { list.add( AdditionalInfoItem( key = resourceManager.getString(R.string.programs), @@ -285,15 +288,18 @@ class TEICardMapper( private fun checkEnrolledIn( list: MutableList, - enrolledOrgUnit: String, + enrolledOrgUnit: String?, ) { - list.add( - AdditionalInfoItem( - key = resourceManager.getString(R.string.enrolledIn), - value = enrolledOrgUnit, - isConstantItem = true, - ), - ) + enrolledOrgUnit?.let { + list.add( + AdditionalInfoItem( + key = resourceManager.getString(R.string.enrolledIn), + value = it, + isConstantItem = true, + ), + ) + } + } private fun addOwnedBy( @@ -315,16 +321,16 @@ class TEICardMapper( onSyncIconClick: () -> Unit, ) { val buttonText = - when (searchTEIModel.tei.aggregatedSyncState()) { - State.TO_POST, - State.TO_UPDATE, - -> { + when (searchTEIModel.tei.syncState) { + SyncState.TO_POST, + SyncState.TO_UPDATE, + -> { resourceManager.getString(R.string.sync) } - State.ERROR, - State.WARNING, - -> { + SyncState.ERROR, + SyncState.WARNING, + -> { resourceManager.getString(R.string.sync_retry) } @@ -373,13 +379,13 @@ class TEICardMapper( private fun checkSyncStatus( list: MutableList, - state: State?, + state: SyncState?, ) { val item = when (state) { - State.TO_POST, - State.TO_UPDATE, - -> { + SyncState.TO_POST, + SyncState.TO_UPDATE, + -> { AdditionalInfoItem( icon = { Icon( @@ -394,7 +400,7 @@ class TEICardMapper( ) } - State.UPLOADING -> { + SyncState.UPLOADING -> { AdditionalInfoItem( icon = { Icon( @@ -409,7 +415,7 @@ class TEICardMapper( ) } - State.ERROR -> { + SyncState.ERROR -> { AdditionalInfoItem( icon = { Icon( @@ -424,7 +430,7 @@ class TEICardMapper( ) } - State.WARNING -> { + SyncState.WARNING -> { AdditionalInfoItem( icon = { Icon( diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/relationships/RelationshipModule.java b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/relationships/RelationshipModule.java index ef142b8557c..c4274ef465b 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/relationships/RelationshipModule.java +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/relationships/RelationshipModule.java @@ -2,6 +2,7 @@ import android.content.Context; +import org.dhis2.R; import org.dhis2.commons.data.ProgramConfigurationRepository; import org.dhis2.commons.date.DateLabelProvider; import org.dhis2.commons.date.DateUtils; @@ -11,6 +12,8 @@ import org.dhis2.commons.resources.MetadataIconProvider; import org.dhis2.commons.resources.ResourceManager; import org.dhis2.commons.viewmodel.DispatcherProvider; +import org.dhis2.data.enrollment.EnrollmentUiDataHelper; +import org.dhis2.data.sorting.SearchSortingValueSetter; import org.dhis2.maps.geometry.bound.GetBoundingBox; import org.dhis2.maps.geometry.line.MapLineRelationshipToFeature; import org.dhis2.maps.geometry.mapper.featurecollection.MapRelationshipsToFeatureCollection; @@ -108,7 +111,8 @@ RelationshipMapsRepository providesRepository( ResourceManager resourceManager, MetadataIconProvider metadataIconProvider, DateLabelProvider dateLabelProvider, - DateUtils dateUtils + DateUtils dateUtils, + SearchSortingValueSetter sortingValueSetter ) { RelationshipConfiguration config; if (teiUid != null) { @@ -124,7 +128,8 @@ RelationshipMapsRepository providesRepository( d2, profilePictureProvider, dateLabelProvider, - metadataIconProvider + metadataIconProvider, + sortingValueSetter ), new EventInfoProvider( d2, @@ -137,6 +142,42 @@ RelationshipMapsRepository providesRepository( ); } + @Provides + @PerFragment + SearchSortingValueSetter searchSortingValueSetter( + Context context, + D2 d2, + EnrollmentUiDataHelper enrollmentUiDataHelper, + ResourceManager resourceManager) { + String unknownLabel = context.getString(R.string.unknownValue); + String eventDateLabel = context.getString(R.string.most_recent_event_date); + String enrollmentStatusLabel = resourceManager.formatWithEnrollmentLabel( + null, + R.string.filters_title_enrollment_status, + 1, + false); + String enrollmentDateDefaultLabel = resourceManager.formatWithEnrollmentLabel( + null, + R.string.enrollment_date_V2, + 1, + false); + String uiDateFormat = DateUtils.SIMPLE_DATE_FORMAT; + return new SearchSortingValueSetter(d2, + unknownLabel, + eventDateLabel, + enrollmentStatusLabel, + enrollmentDateDefaultLabel, + uiDateFormat, + enrollmentUiDataHelper); + } + + @Provides + @PerFragment + EnrollmentUiDataHelper enrollmentUiDataHelper(Context context) { + return new EnrollmentUiDataHelper(context); + } + + @Provides @PerFragment MapRelationshipsToFeatureCollection provideMapRelationshipToFeatureCollection() { diff --git a/app/src/main/java/org/dhis2/usescases/tracker/TrackedEntityInstanceInfoProvider.kt b/app/src/main/java/org/dhis2/usescases/tracker/TrackedEntityInstanceInfoProvider.kt index 875792b7dfa..35813fe568f 100644 --- a/app/src/main/java/org/dhis2/usescases/tracker/TrackedEntityInstanceInfoProvider.kt +++ b/app/src/main/java/org/dhis2/usescases/tracker/TrackedEntityInstanceInfoProvider.kt @@ -1,14 +1,19 @@ package org.dhis2.usescases.tracker import org.dhis2.commons.date.DateLabelProvider +import org.dhis2.commons.filters.sorting.SortingItem import org.dhis2.commons.resources.MetadataIconProvider +import org.dhis2.data.sorting.SearchSortingValueSetter import org.dhis2.maps.model.MapItemModel import org.dhis2.maps.model.RelatedInfo import org.dhis2.maps.model.RelationshipDirection import org.dhis2.mobile.commons.model.AvatarProviderConfiguration import org.dhis2.mobile.commons.model.AvatarProviderConfiguration.Metadata import org.dhis2.mobile.commons.model.AvatarProviderConfiguration.ProfilePic +import org.dhis2.mobile.commons.model.MetadataIconData import org.dhis2.tracker.data.ProfilePictureProvider +import org.dhis2.tracker.search.model.TrackedEntitySearchItemAttributeDomain +import org.dhis2.usescases.searchTrackEntity.SearchTeiModel import org.dhis2.utils.ValueUtils import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.arch.repositories.scope.RepositoryScope @@ -27,6 +32,7 @@ class TrackedEntityInstanceInfoProvider( private val profilePictureProvider: ProfilePictureProvider, private val dateLabelProvider: DateLabelProvider, private val metadataIconProvider: MetadataIconProvider, + private val sortingValueSetter: SearchSortingValueSetter, ) { fun getAvatar( tei: TrackedEntityInstance, @@ -75,6 +81,10 @@ class TrackedEntityInstanceInfoProvider( } } + fun getMetadataIcon(style: ObjectStyle) : MetadataIconData { + return metadataIconProvider.invoke(style) + } + fun getTeiTitle( header: String?, attributeValues: List, @@ -90,7 +100,7 @@ class TrackedEntityInstanceInfoProvider( fun getTeiLastUpdated(tei: TrackedEntitySearchItem) = dateLabelProvider.span(tei.lastUpdated) - fun getTeiAdditionalInfoList(attributeValues: List): List = + fun getTeiAdditionalInfoListForMap(attributeValues: List): List = attributeValues .filter { attribute -> attribute.displayInList && @@ -105,7 +115,7 @@ class TrackedEntityInstanceInfoProvider( key = attribute.displayFormName, value = if (attribute.value != null) { - ValueUtils.transformValue( + ValueUtils.transformValueLegacy( d2, attribute.value, attribute.valueType, @@ -117,6 +127,19 @@ class TrackedEntityInstanceInfoProvider( ) } + fun getTransformedValue(attr: TrackedEntitySearchItemAttributeDomain) : String? { + return if (attr.value != null) { + ValueUtils.transformValue( + d2, + attr.value, + attr.valueType, + attr.optionSet, + ) + } else { + null + } + } + fun getRelatedInfo( searchItem: TrackedEntitySearchItem, selectedProgram: Program?, @@ -203,4 +226,14 @@ class TrackedEntityInstanceInfoProvider( ), ) } + + fun getUnknownLabel(): String { + return sortingValueSetter.unknownLabel + } + + fun getSortingKeyValue(searchTei: SearchTeiModel, sortingItem: SortingItem): Pair? { + return sortingValueSetter.setSortingItem(searchTei, sortingItem) + } + + } diff --git a/app/src/main/java/org/dhis2/utils/ValueUtils.kt b/app/src/main/java/org/dhis2/utils/ValueUtils.kt index 26c9d9ed39a..8031fba6bc8 100644 --- a/app/src/main/java/org/dhis2/utils/ValueUtils.kt +++ b/app/src/main/java/org/dhis2/utils/ValueUtils.kt @@ -3,6 +3,7 @@ package org.dhis2.utils import org.dhis2.commons.extensions.toFriendlyDate import org.dhis2.commons.extensions.toFriendlyDateTime import org.dhis2.commons.extensions.toPercentage +import org.dhis2.tracker.input.model.TrackerInputType import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.android.core.trackedentity.TrackedEntityAttributeValue @@ -20,7 +21,7 @@ class ValueUtils private constructor() { optionSetUid: String?, ): TrackedEntityAttributeValue { val transformedValue = - transformValue(d2, attributeValue.value(), valueType, optionSetUid) + transformValueLegacy(d2, attributeValue.value(), valueType, optionSetUid) return if (transformedValue != attributeValue.value()) { attributeValue @@ -35,12 +36,12 @@ class ValueUtils private constructor() { fun transformValue( d2: D2, value: String?, - valueType: ValueType?, + valueType: TrackerInputType?, optionSetUid: String?, ): String? { var teAttrValue = value when (valueType) { - ValueType.ORGANISATION_UNIT -> { + TrackerInputType.ORGANISATION_UNIT -> { if (!d2 .organisationUnitModule() .organisationUnits() @@ -60,6 +61,45 @@ class ValueUtils private constructor() { teAttrValue = orgUnitName } } + TrackerInputType.DATE, TrackerInputType.AGE -> { + teAttrValue = teAttrValue?.toFriendlyDate() + } + TrackerInputType.DATE_TIME -> { + teAttrValue = teAttrValue?.toFriendlyDateTime() + } + + TrackerInputType.PERCENTAGE -> { + teAttrValue = teAttrValue?.toPercentage() + } + else -> { + teAttrValue = transformOptionSet(optionSetUid, d2, value) + } + } + return teAttrValue + } + + @Deprecated("Use transformValue with TrackerInputType instead of ValueType") + fun transformValueLegacy( + d2: D2, + value: String?, + valueType: ValueType?, + optionSetUid: String?, + ): String? { + var teAttrValue = value + when (valueType) { + ValueType.ORGANISATION_UNIT -> { + val orgUnit = + d2 + .organisationUnitModule() + .organisationUnits() + .byUid() + .eq(value) + .one() + .blockingGet() + if (orgUnit != null && orgUnit.displayName() != null) { + teAttrValue = orgUnit.displayName() + } + } ValueType.DATE, ValueType.AGE -> { teAttrValue = teAttrValue?.toFriendlyDate() } diff --git a/app/src/main/res/layout/item_search_tracked_entity.xml b/app/src/main/res/layout/item_search_tracked_entity.xml index 06af4e8de80..df9d01217d2 100644 --- a/app/src/main/res/layout/item_search_tracked_entity.xml +++ b/app/src/main/res/layout/item_search_tracked_entity.xml @@ -21,7 +21,7 @@ + type="java.util.List<org.dhis2.tracker.search.model.TrackedEntitySearchItemAttributeDomain>" /> = listOf( FieldUiModelImpl( diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapperTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapperTest.kt index 8e4c670254d..787a71b48d3 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapperTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapperTest.kt @@ -6,14 +6,20 @@ import org.dhis2.commons.date.DateUtils import org.dhis2.commons.date.toDateSpan import org.dhis2.commons.date.toOverdueOrScheduledUiText import org.dhis2.commons.resources.ResourceManager +import org.dhis2.mobile.commons.extensions.toJavaDate +import org.dhis2.mobile.commons.extensions.toKtxInstant +import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.search.model.DomainEnrollment +import org.dhis2.tracker.search.model.DomainObjectStyle +import org.dhis2.tracker.search.model.DomainProgram +import org.dhis2.tracker.search.model.EnrollmentStatus +import org.dhis2.tracker.search.model.GeometryFeatureType +import org.dhis2.tracker.search.model.SyncState +import org.dhis2.tracker.search.model.TrackedEntitySearchItemAttributeDomain +import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult +import org.dhis2.tracker.search.model.TrackedEntityTypeAttributeDomain +import org.dhis2.tracker.search.model.TrackedEntityTypeDomain import org.dhis2.usescases.searchTrackEntity.SearchTeiModel -import org.hisp.dhis.android.core.common.ObjectWithUid -import org.hisp.dhis.android.core.common.State -import org.hisp.dhis.android.core.enrollment.Enrollment -import org.hisp.dhis.android.core.enrollment.EnrollmentStatus -import org.hisp.dhis.android.core.program.Program -import org.hisp.dhis.android.core.trackedentity.TrackedEntityAttributeValue -import org.hisp.dhis.android.core.trackedentity.TrackedEntityInstance import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test @@ -23,6 +29,7 @@ import org.mockito.kotlin.mock import org.mockito.kotlin.whenever import java.util.Calendar import java.util.Date +import kotlin.time.Instant class TEICardMapperTest { private val context: Context = mock() @@ -30,6 +37,24 @@ class TEICardMapperTest { private lateinit var mapper: TEICardMapper + private val enrollmentUid = "EnrollmentUid" + private val programUid = "programUid" + private val enrollmentOrgUnit = "OrgUnit" + private val teiUid = "TEIUid" + private val selectedEnrollment = DomainEnrollment( + uid = enrollmentUid, + orgUnit = enrollmentOrgUnit, + program = programUid, + enrollmentDate = Instant.parse("2020-01-01T00:00:00.00Z"), + incidentDate = Instant.parse("2020-01-01T00:00:00.00Z"), + completedDate = Instant.parse("2020-01-01T00:00:00.00Z"), + followUp = true, + status = EnrollmentStatus.COMPLETED, + trackedEntityInstance = teiUid, + ) + private val enrollments = listOf( + selectedEnrollment + ) @Before fun setUp() { whenever(context.getString(R.string.interval_now)) doReturn "now" @@ -50,7 +75,7 @@ class TEICardMapperTest { @Test fun shouldReturnCardFull() { - val model = createFakeModel(isOverdue = true) + val model = createFakeModel() val result = mapper.map( @@ -61,24 +86,25 @@ class TEICardMapperTest { ) assertEquals(result.title, model.header) - assertEquals(result.lastUpdated, model.tei.lastUpdated().toDateSpan(context)) - assertEquals(result.additionalInfo[0].value, model.attributeValues["Name"]?.value()) - assertEquals(result.additionalInfo[1].value, model.enrolledOrgUnit) + assertEquals(result.lastUpdated, model.tei.lastUpdated?.toJavaDate().toDateSpan(context)) + assertEquals(result.additionalInfo[0].value, model.attributeValues["Name"]?.value) + assertEquals(result.additionalInfo[1].value, model.tei.ownerOrgUnit) + assertEquals(result.additionalInfo[2].value, model.tei.enrollmentOrgUnit) assertEquals( - result.additionalInfo[2].value, - model.programInfo.map { it.name() }.joinToString(", "), + result.additionalInfo[3].value, + model.tei.enrolledPrograms?.joinToString(", ") { it.displayName }, ) assertEquals( - result.additionalInfo[3].value, + result.additionalInfo[4].value, "Enrollment Completed", ) assertEquals( - result.additionalInfo[4].value, - model.overdueDate.toOverdueOrScheduledUiText(resourceManager), + result.additionalInfo[5].value, + model.tei.overDueDate?.toJavaDate().toOverdueOrScheduledUiText(resourceManager), ) assertEquals( - result.additionalInfo[5].value, + result.additionalInfo[6].value, resourceManager.getString(R.string.marked_follow_up), ) } @@ -90,7 +116,7 @@ class TEICardMapperTest { whenever(resourceManager.getPlural(any(), any(), any())) doReturn "2 days" - val model = createFakeModel(overdueDate.time, true) + val model = createFakeModel(overdueDate.time) val result = mapper.map( @@ -100,78 +126,82 @@ class TEICardMapperTest { onImageClick = {}, ) assertEquals( - result.additionalInfo[4].value, - model.overdueDate.toOverdueOrScheduledUiText(resourceManager), + result.additionalInfo[5].value, + model.tei.overDueDate?.toJavaDate().toOverdueOrScheduledUiText(resourceManager), ) } private fun createFakeModel( currentDate: Date = Date(), - isOverdue: Boolean = false, ): SearchTeiModel { - val attributeValues = LinkedHashMap() - attributeValues["Name"] = - TrackedEntityAttributeValue - .builder() - .value("Peter") - .build() - - val model = - SearchTeiModel().apply { - header = "TEI header" - tei = - TrackedEntityInstance - .builder() - .uid("TEIUid") - .lastUpdated(currentDate) - .organisationUnit("OrgUnit") - .aggregatedSyncState(State.SYNCED) - .build() - enrolledOrgUnit = "OrgUnit" - displayOrgUnit = true - setCurrentEnrollment( - Enrollment - .builder() - .uid("EnrollmentUid") - .program("programUid") - .status(EnrollmentStatus.COMPLETED) - .attributeOptionCombo("attributeOptionComboUid") - .build(), - ) - setAttributeValues(attributeValues) - - addProgramInfo( - Program - .builder() - .uid("Program1Uid") - .displayName("Program 1") - .categoryCombo(ObjectWithUid.create("categoryComboUid")) - .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) - .build(), - null, - ) - addProgramInfo( - Program - .builder() - .uid("Program2Uid") - .displayName("Program 2") - .categoryCombo(ObjectWithUid.create("categoryComboUid")) - .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) - .build(), - null, + val attributeValues = LinkedHashMap() + val attribute = TrackedEntitySearchItemAttributeDomain( + attribute = "attrUid1", + displayName = "Name", + displayFormName = "Name", + value = "Peter", + valueType = TrackerInputType.TEXT, + displayInList = true, + optionSet = null + ) + attributeValues["Name"] = attribute + + val tei = TrackedEntitySearchItemResult( + uid = "teiUid", + created = Instant.parse("2020-01-01T00:00:00.00Z"), + lastUpdated = Instant.parse("2020-01-01T00:00:00.00Z"), + createdAtClient = Instant.parse("2020-01-01T00:00:00.00Z"), + lastUpdatedAtClient = Instant.parse("2020-01-01T00:00:00.00Z"), + ownerOrgUnit = "ownerOrgUnit", + enrollmentOrgUnit = "enrollmentOrgUnit", + shouldDisplayOrgUnit = true, + geometry = null, + syncState = SyncState.SYNCED, + aggregatedSyncState = SyncState.SYNCED, + deleted = false, + isOnline = true, + teTypeName = "teTypeName", + type = TrackedEntityTypeDomain( + trackedEntityTypeAttributeDomains = listOf(TrackedEntityTypeAttributeDomain( + trackedEntityTypeUid= "trackedEntityTypeUid", + trackedEntityAttributeUid = "trackedEntityAttributeUid", + displayInList= true, + mandatory = false, + searchable = true, + sortOrder = 1, + )), + featureType = GeometryFeatureType.POINT, + ), + header = "TEI header", + overDueDate = currentDate.toKtxInstant(), + selectedEnrollment = selectedEnrollment, + profilePicture = null, + enrolledPrograms = listOf( + DomainProgram( + uid = "Program1Uid", + displayName = "Program 1", + style = DomainObjectStyle( + icon = "iconUid", + color = "colorUid" ) - overdueDate = currentDate - isHasOverdue = isOverdue - - addEnrollment( - Enrollment - .builder() - .uid("EnrollmentUid") - .followUp(true) - .attributeOptionCombo("attributeOptionComboUid") - .build(), + ), + DomainProgram( + uid = "Program2Uid", + displayName = "Program 2", + style = DomainObjectStyle( + icon = "iconUid2", + color = "colorUid2" ) - } - return model + ),), + enrollments = enrollments, + relationships = null, + defaultTypeIcon = null, + attributeValues = listOf(attribute), + ) + val searchTeiModel = SearchTeiModel() + searchTeiModel.tei = tei + searchTeiModel.attributeValues = attributeValues + + return searchTeiModel } } diff --git a/app/src/test/java/org/dhis2/usescases/tracker/TrackedEntityInstanceInfoProviderTests.kt b/app/src/test/java/org/dhis2/usescases/tracker/TrackedEntityInstanceInfoProviderTests.kt index 5827f790ab7..611d01a1214 100644 --- a/app/src/test/java/org/dhis2/usescases/tracker/TrackedEntityInstanceInfoProviderTests.kt +++ b/app/src/test/java/org/dhis2/usescases/tracker/TrackedEntityInstanceInfoProviderTests.kt @@ -3,6 +3,7 @@ package org.dhis2.usescases.tracker import androidx.compose.ui.graphics.Color import org.dhis2.commons.date.DateLabelProvider import org.dhis2.commons.resources.MetadataIconProvider +import org.dhis2.data.sorting.SearchSortingValueSetter import org.dhis2.mobile.commons.model.AvatarProviderConfiguration import org.dhis2.mobile.commons.model.MetadataIconData import org.dhis2.tracker.data.ProfilePictureProvider @@ -27,6 +28,7 @@ class TrackedEntityInstanceInfoProviderTests { private val d2: D2 = Mockito.mock(D2::class.java, Mockito.RETURNS_DEEP_STUBS) private val profilePictureProvider: ProfilePictureProvider = mock() private val dateLabelProvider: DateLabelProvider = mock() + private val searchSortingValueSetter: SearchSortingValueSetter = mock() private val metadataIconProvider: MetadataIconProvider = mock { on { invoke(any()) } doReturn MetadataIconData.defaultIcon() @@ -40,6 +42,8 @@ class TrackedEntityInstanceInfoProviderTests { profilePictureProvider, dateLabelProvider, metadataIconProvider, + searchSortingValueSetter, + ) } diff --git a/commons/src/main/java/org/dhis2/commons/bindings/TEICardExtensions.kt b/commons/src/main/java/org/dhis2/commons/bindings/TEICardExtensions.kt index a3974ce22b0..9b529192065 100644 --- a/commons/src/main/java/org/dhis2/commons/bindings/TEICardExtensions.kt +++ b/commons/src/main/java/org/dhis2/commons/bindings/TEICardExtensions.kt @@ -1,13 +1,5 @@ package org.dhis2.commons.bindings -import android.content.Context -import android.graphics.drawable.GradientDrawable -import android.view.LayoutInflater -import android.view.View -import android.widget.ImageView -import android.widget.LinearLayout -import android.widget.TextView -import androidx.appcompat.content.res.AppCompatResources import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement.Absolute.spacedBy import androidx.compose.foundation.layout.Box @@ -27,18 +19,11 @@ import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp -import androidx.core.content.res.ResourcesCompat -import androidx.core.graphics.toColorInt import org.dhis2.commons.R import org.dhis2.commons.data.EnrollmentIconData -import org.dhis2.commons.databinding.ItemFieldValueBinding -import org.dhis2.commons.date.toUiText import org.dhis2.mobile.commons.extensions.toColor import org.dhis2.mobile.commons.model.MetadataIconData -import org.hisp.dhis.android.core.enrollment.Enrollment -import org.hisp.dhis.android.core.enrollment.EnrollmentStatus import org.hisp.dhis.android.core.program.Program -import org.hisp.dhis.android.core.trackedentity.TrackedEntityAttributeValue import org.hisp.dhis.mobile.ui.designsystem.component.MetadataAvatar import org.hisp.dhis.mobile.ui.designsystem.component.MetadataAvatarSize import org.hisp.dhis.mobile.ui.designsystem.component.MetadataIcon @@ -49,12 +34,6 @@ import java.util.Date const val ENROLLMENT_ICONS_TO_SHOW = 3 const val MAX_NUMBER_REMAINING_ENROLLMENTS = 99 -fun List.hasFollowUp(): Boolean = - firstOrNull { enrollment -> - enrollment.followUp() == true - }?.let { - it.followUp() == true - } ?: false fun List.getEnrollmentIconsData( currentProgram: String?, @@ -158,99 +137,3 @@ fun getRemainingEnrollmentsForTei(teiEnrollmentCount: Int): Int = teiEnrollmentCount - ENROLLMENT_ICONS_TO_SHOW } -fun Enrollment.setStatusText( - context: Context, - statusTextView: TextView, - isOverdue: Boolean, - dueDate: Date?, -) { - var textToShow: String? = null - var color = -1 - when { - isOverdue -> { - textToShow = dueDate.toUiText(context) - color = "#E91E63".toColorInt() - } - - status() == EnrollmentStatus.CANCELLED -> { - textToShow = context.getString(R.string.cancelled) - color = "#E91E63".toColorInt() - } - - status() == EnrollmentStatus.COMPLETED -> { - textToShow = context.getString(R.string.enrollment_status_completed) - color = "#8A333333".toColorInt() - } - } - statusTextView.visibility = if (textToShow == null) View.GONE else View.VISIBLE - statusTextView.text = textToShow - statusTextView.setTextColor(color) - val bgDrawable = - AppCompatResources.getDrawable( - context, - R.drawable.round_border_box_2, - ) as GradientDrawable? - bgDrawable!!.setStroke(2, color) - statusTextView.background = bgDrawable -} - -fun LinkedHashMap.setAttributeList( - parentLayout: LinearLayout, - showAttributesButton: ImageView, - adapterPosition: Int, - listIsOpen: Boolean, - sortingKey: String?, - sortingValue: String?, - orgUnit: String, - showList: () -> Unit, -) { - parentLayout.removeAllViews() - if (size > 3) { - for (pos in 1 until size) { - val fieldName = - keys.toTypedArray()[pos] - val fieldValue = this[fieldName]?.value() - val itemFieldValueBinding = - ItemFieldValueBinding.inflate(LayoutInflater.from(parentLayout.context)) - itemFieldValueBinding.name = fieldName - itemFieldValueBinding.value = fieldValue - itemFieldValueBinding.root.tag = adapterPosition.toString() + "_" + fieldName - parentLayout.addView(itemFieldValueBinding.root) - } - val orgUnitKey = parentLayout.context.getString(R.string.enrolled_in) - val itemFieldValueBinding = - ItemFieldValueBinding.inflate(LayoutInflater.from(parentLayout.context)) - itemFieldValueBinding.name = orgUnitKey - itemFieldValueBinding.value = orgUnit - itemFieldValueBinding.root.tag = adapterPosition.toString() + "_" + orgUnitKey - parentLayout.addView(itemFieldValueBinding.root) - if (sortingKey != null) { - val binding = - ItemFieldValueBinding.inflate(LayoutInflater.from(parentLayout.context)) - binding.name = sortingKey - binding.fieldName.setTextColor( - ResourcesCompat.getColor( - binding.fieldName.context.resources, - R.color.sorting_attribute_key_color, - null, - ), - ) - binding.value = sortingValue - binding.fieldValue.setTextColor( - ResourcesCompat.getColor( - binding.fieldValue.context.resources, - R.color.sorting_attribute_value_color, - null, - ), - ) - binding.root.tag = adapterPosition.toString() + "_" + sortingValue - parentLayout.addView(binding.root) - } - showAttributesButton.scaleY = if (listIsOpen) -1F else 1F - showAttributesButton.setOnClickListener { - showList() - } - } else { - showAttributesButton.setOnClickListener(null) - } -} diff --git a/commons/src/main/java/org/dhis2/commons/data/CarouselItemModel.kt b/commons/src/main/java/org/dhis2/commons/data/CarouselItemModel.kt deleted file mode 100644 index be453285d0f..00000000000 --- a/commons/src/main/java/org/dhis2/commons/data/CarouselItemModel.kt +++ /dev/null @@ -1,5 +0,0 @@ -package org.dhis2.commons.data - -interface CarouselItemModel { - fun uid(): String -} diff --git a/commons/src/main/java/org/dhis2/commons/data/ProgramEventViewModel.kt b/commons/src/main/java/org/dhis2/commons/data/ProgramEventViewModel.kt index 289249854e0..342aa2d155f 100644 --- a/commons/src/main/java/org/dhis2/commons/data/ProgramEventViewModel.kt +++ b/commons/src/main/java/org/dhis2/commons/data/ProgramEventViewModel.kt @@ -17,6 +17,4 @@ data class ProgramEventViewModel( val attributeOptionComboName: String, val geometry: Geometry?, val canBeEdited: Boolean, -) : CarouselItemModel { - override fun uid() = uid -} +) diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/extensions/DateExtensions.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/extensions/DateExtensions.kt new file mode 100644 index 00000000000..9fa686dd94b --- /dev/null +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/extensions/DateExtensions.kt @@ -0,0 +1,14 @@ +package org.dhis2.mobile.commons.extensions + +import java.util.Date +import kotlin.time.Instant + +fun Date.toKtxInstant(): Instant = Instant.fromEpochMilliseconds(this.time) + +fun Instant.toJavaDate(): Date = Date(this.toEpochMilliseconds()) + +fun getTodayAsInstant(): Instant { + val nowMillis = System.currentTimeMillis() + + return Instant.fromEpochMilliseconds(nowMillis) +} diff --git a/dhis2_android_maps/src/main/java/org/dhis2/maps/model/RelationshipUiComponentModel.kt b/dhis2_android_maps/src/main/java/org/dhis2/maps/model/RelationshipUiComponentModel.kt index fa0a95f7286..ac597eb1f94 100644 --- a/dhis2_android_maps/src/main/java/org/dhis2/maps/model/RelationshipUiComponentModel.kt +++ b/dhis2_android_maps/src/main/java/org/dhis2/maps/model/RelationshipUiComponentModel.kt @@ -1,7 +1,5 @@ package org.dhis2.maps.model -import org.dhis2.commons.data.CarouselItemModel -import org.hisp.dhis.android.core.common.FeatureType import org.hisp.dhis.android.core.common.Geometry data class RelationshipUiComponentModel( @@ -13,11 +11,7 @@ data class RelationshipUiComponentModel( val from: TeiMap, val to: TeiMap, val canBeDeleted: Boolean? = true, -) : CarouselItemModel { - override fun uid(): String = relationshipUid - - fun shouldShowNavigationButton(): Boolean = to.geometry?.type() == FeatureType.POINT -} +) data class TeiMap( val teiUid: String?, diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index a9c2affeb03..4b4a9e9b973 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -22,937 +22,282 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -962,17 +307,6 @@ - - - - - - - - - - - @@ -983,255 +317,83 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1240,237 +402,98 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1479,432 +502,213 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1913,430 +717,118 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2345,202 +837,61 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2549,101 +900,28 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2652,93 +930,48 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2747,38 +980,23 @@ - - - - - - - - - - - - - - - @@ -2787,38 +1005,23 @@ - - - - - - - - - - - - - - - @@ -2827,35 +1030,18 @@ - - - - - - - - - - - - - - - - - @@ -2864,239 +1050,83 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -3105,579 +1135,308 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -3686,14 +1445,8 @@ - - - - - - @@ -3702,14 +1455,8 @@ - - - - - - @@ -3718,1604 +1465,828 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -5324,30 +2295,18 @@ - - - - - - - - - - - - @@ -5356,153 +2315,91 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -5513,321 +2410,153 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -5836,30 +2565,18 @@ - - - - - - - - - - - - @@ -5868,30 +2585,18 @@ - - - - - - - - - - - - @@ -5900,14 +2605,8 @@ - - - - - - @@ -5916,280 +2615,143 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -6198,22 +2760,13 @@ - - - - - - - - - @@ -6222,22 +2775,13 @@ - - - - - - - - - @@ -6246,30 +2790,18 @@ - - - - - - - - - - - - @@ -6278,14 +2810,8 @@ - - - - - - @@ -6294,30 +2820,18 @@ - - - - - - - - - - - - @@ -6326,14 +2840,8 @@ - - - - - - @@ -6342,14 +2850,8 @@ - - - - - - @@ -6358,14 +2860,8 @@ - - - - - - @@ -6374,14 +2870,8 @@ - - - - - - @@ -6390,22 +2880,13 @@ - - - - - - - - - @@ -6414,22 +2895,13 @@ - - - - - - - - - @@ -6438,27 +2910,13 @@ - - - - - - - - - - - - - - @@ -6467,22 +2925,13 @@ - - - - - - - - - @@ -6491,22 +2940,13 @@ - - - - - - - - - @@ -6515,14 +2955,8 @@ - - - - - - @@ -6531,14 +2965,8 @@ - - - - - - @@ -6547,14 +2975,8 @@ - - - - - - @@ -6563,343 +2985,198 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -6908,1047 +3185,456 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -7959,93 +3645,48 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -8054,335 +3695,136 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -8393,173 +3835,57 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -8569,51 +3895,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -8623,79 +3910,33 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -8704,54 +3945,33 @@ - - - - - - - - - - - - - - - - - - - - - @@ -8760,44 +3980,17 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -8807,185 +4000,77 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -8995,46 +4080,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -9042,46 +4093,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - + + + @@ -9089,70 +4106,25 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -9163,46 +4135,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -9212,144 +4150,42 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -9359,113 +4195,32 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -9475,262 +4230,156 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -9739,347 +4388,201 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10088,210 +4591,91 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10300,119 +4684,58 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10421,46 +4744,28 @@ - - - - - - - - - - - - - - - - - - @@ -10469,219 +4774,83 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10690,22 +4859,13 @@ - - - - - - - - - @@ -10714,81 +4874,28 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10797,64 +4904,33 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10863,61 +4939,28 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10926,17 +4969,11 @@ - - - - - - @@ -10948,216 +4985,77 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -11166,475 +5064,241 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tracker/build.gradle.kts b/tracker/build.gradle.kts index 6c026c526b3..c8e17ed83f4 100644 --- a/tracker/build.gradle.kts +++ b/tracker/build.gradle.kts @@ -41,6 +41,7 @@ kotlin { implementation("${designSystem.get().group}:${designSystem.get().name}:${designSystem.get().version}") { isChanging = true } + implementation(libs.kotlinx.datetime) implementation(libs.compose.material3.window) implementation(compose.components.resources) implementation(project(":commonskmm")) diff --git a/tracker/src/androidHostTest/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImplTest.kt b/tracker/src/androidHostTest/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImplTest.kt index 6cad077b456..8fe4610f73f 100644 --- a/tracker/src/androidHostTest/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImplTest.kt +++ b/tracker/src/androidHostTest/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImplTest.kt @@ -2,9 +2,11 @@ package org.dhis2.tracker.search.data import kotlinx.coroutines.test.runTest import org.dhis2.commons.filters.data.FilterPresenter +import org.dhis2.tracker.data.ProfilePictureProvider import org.dhis2.tracker.search.model.SearchOperator import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.arch.repositories.`object`.ReadOnlyOneObjectRepositoryFinalImpl +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.trackedentity.TrackedEntityAttribute import org.hisp.dhis.android.core.trackedentity.TrackedEntityTypeAttribute import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchCollectionRepository @@ -25,7 +27,7 @@ class SearchTrackedEntityRepositoryImplTest { private val d2: D2 = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) private val filterPresenter: FilterPresenter = mock() - + private val profilePictureProvider: ProfilePictureProvider = mock() private val teType = "personType" private val programUid = "programUid" @@ -35,6 +37,7 @@ class SearchTrackedEntityRepositoryImplTest { SearchTrackedEntityRepositoryImpl( d2 = d2, filterPresenter = filterPresenter, + profilePictureProvider = profilePictureProvider, ) } @@ -187,7 +190,7 @@ class SearchTrackedEntityRepositoryImplTest { .uid(attributeUid) .unique(false) .optionSet( - org.hisp.dhis.android.core.common.ObjectWithUid + ObjectWithUid .create("optionSetUid"), ).build() @@ -395,6 +398,7 @@ class SearchTrackedEntityRepositoryImplTest { isOnline = false, hasStateFilters = false, allowCache = true, + selectedProgram = programUid, ) // Then @@ -418,6 +422,7 @@ class SearchTrackedEntityRepositoryImplTest { isOnline = true, hasStateFilters = false, allowCache = false, + selectedProgram = programUid, ) // Then @@ -440,6 +445,7 @@ class SearchTrackedEntityRepositoryImplTest { isOnline = true, hasStateFilters = false, allowCache = true, + selectedProgram = programUid, ) // Then @@ -456,6 +462,7 @@ class SearchTrackedEntityRepositoryImplTest { isOnline = false, hasStateFilters = false, allowCache = true, + selectedProgram = programUid, ) // Then - exception is thrown diff --git a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/DomainToSDKTrackedEntitySearchItemMapper.kt b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/DomainToSDKTrackedEntitySearchItemMapper.kt deleted file mode 100644 index fbeb41ddb5e..00000000000 --- a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/DomainToSDKTrackedEntitySearchItemMapper.kt +++ /dev/null @@ -1,137 +0,0 @@ -package org.dhis2.tracker.search.data - -import org.dhis2.tracker.input.model.TrackerInputType -import org.dhis2.tracker.search.model.GeometryFeatureType -import org.dhis2.tracker.search.model.SyncState -import org.dhis2.tracker.search.model.TrackedEntityGeometry -import org.dhis2.tracker.search.model.TrackedEntitySearchItemAttributeDomain -import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult -import org.dhis2.tracker.search.model.TrackedEntityTypeDomain -import org.hisp.dhis.android.core.common.FeatureType -import org.hisp.dhis.android.core.common.Geometry -import org.hisp.dhis.android.core.common.State -import org.hisp.dhis.android.core.common.ValueType -import org.hisp.dhis.android.core.trackedentity.TrackedEntityType -import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItem -import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItemAttribute -import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItemProgramOwner - -fun transformDomainTeiToSDKTei(trackedEntitySearchItemResult: TrackedEntitySearchItemResult): TrackedEntitySearchItem = - TrackedEntitySearchItem( - uid = trackedEntitySearchItemResult.uid, - created = trackedEntitySearchItemResult.created, - lastUpdated = trackedEntitySearchItemResult.lastUpdated, - createdAtClient = trackedEntitySearchItemResult.createdAtClient, - lastUpdatedAtClient = trackedEntitySearchItemResult.lastUpdatedAtClient, - organisationUnit = trackedEntitySearchItemResult.organisationUnit, - geometry = trackedEntitySearchItemResult.geometry?.toSDKGeometry(), - syncState = trackedEntitySearchItemResult.syncState?.toSDKState(), - aggregatedSyncState = trackedEntitySearchItemResult.aggregatedSyncState?.toSDKState(), - deleted = trackedEntitySearchItemResult.deleted, - isOnline = trackedEntitySearchItemResult.isOnline, - type = mapTrackedEntityType(trackedEntitySearchItemResult.type), - header = trackedEntitySearchItemResult.header, - attributeValues = trackedEntitySearchItemResult.attributeValues.map { it.toSDKAttribute() }, - programOwners = - trackedEntitySearchItemResult.programOwners.map { - TrackedEntitySearchItemProgramOwner( - program = it.program, - ownerOrgUnit = it.organisationUnit, - ) - }, - ) - -private fun TrackedEntityGeometry.toSDKGeometry(): Geometry? = - coordinates?.let { - Geometry - .builder() - .type(geometryFeatureType.toSDKFeatureType()) - .coordinates(it) - .build() - } - -private fun GeometryFeatureType.toSDKFeatureType(): FeatureType = - when (this) { - GeometryFeatureType.POINT -> FeatureType.POINT - GeometryFeatureType.POLYGON -> FeatureType.POLYGON - GeometryFeatureType.MULTI_POLYGON -> FeatureType.MULTI_POLYGON - GeometryFeatureType.NONE -> FeatureType.NONE - GeometryFeatureType.SYMBOL -> FeatureType.SYMBOL - } - -private fun SyncState.toSDKState(): State = - when (this) { - SyncState.TO_POST -> State.TO_POST - SyncState.TO_UPDATE -> State.TO_UPDATE - SyncState.ERROR -> State.ERROR - SyncState.SYNCED -> State.SYNCED - SyncState.WARNING -> State.WARNING - SyncState.UPLOADING -> State.UPLOADING - SyncState.RELATIONSHIP -> State.RELATIONSHIP - SyncState.SENT_VIA_SMS -> State.SENT_VIA_SMS - SyncState.SYNCED_VIA_SMS -> State.SYNCED_VIA_SMS - } - -private fun TrackedEntitySearchItemAttributeDomain.toSDKAttribute(): TrackedEntitySearchItemAttribute = - TrackedEntitySearchItemAttribute( - attribute = attribute, - displayName = displayName, - displayFormName = displayFormName, - value = value, - created = created, - lastUpdated = lastUpdated, - valueType = valueType.toSDKValueType(), - displayInList = displayInList, - optionSet = optionSet, - ) - -private fun TrackerInputType.toSDKValueType(): ValueType = - when (this) { - TrackerInputType.TEXT -> ValueType.TEXT - TrackerInputType.LONG_TEXT -> ValueType.LONG_TEXT - TrackerInputType.LETTER -> ValueType.LETTER - TrackerInputType.PHONE_NUMBER -> ValueType.PHONE_NUMBER - TrackerInputType.EMAIL -> ValueType.EMAIL - TrackerInputType.URL -> ValueType.URL - TrackerInputType.NUMBER -> ValueType.NUMBER - TrackerInputType.INTEGER -> ValueType.INTEGER - TrackerInputType.INTEGER_POSITIVE -> ValueType.INTEGER_POSITIVE - TrackerInputType.INTEGER_NEGATIVE -> ValueType.INTEGER_NEGATIVE - TrackerInputType.INTEGER_ZERO_OR_POSITIVE -> ValueType.INTEGER_ZERO_OR_POSITIVE - TrackerInputType.PERCENTAGE -> ValueType.PERCENTAGE - TrackerInputType.UNIT_INTERVAL -> ValueType.UNIT_INTERVAL - TrackerInputType.AGE -> ValueType.AGE - TrackerInputType.ORGANISATION_UNIT -> ValueType.ORGANISATION_UNIT - TrackerInputType.DATE_TIME -> ValueType.DATETIME - TrackerInputType.DATE -> ValueType.DATE - TrackerInputType.TIME -> ValueType.TIME - TrackerInputType.HORIZONTAL_CHECKBOXES, - TrackerInputType.VERTICAL_CHECKBOXES, - TrackerInputType.HORIZONTAL_RADIOBUTTONS, - TrackerInputType.VERTICAL_RADIOBUTTONS, - -> ValueType.BOOLEAN - TrackerInputType.YES_ONLY_SWITCH, - TrackerInputType.YES_ONLY_CHECKBOX, - -> ValueType.TRUE_ONLY - TrackerInputType.QR_CODE, - TrackerInputType.BAR_CODE, - -> ValueType.TEXT - TrackerInputType.MULTI_SELECTION -> ValueType.MULTI_TEXT - TrackerInputType.DROPDOWN, - TrackerInputType.PERIOD_SELECTOR, - TrackerInputType.MATRIX, - TrackerInputType.SEQUENTIAL, - TrackerInputType.NOT_SUPPORTED, - TrackerInputType.CUSTOM_INTENT, - -> ValueType.TEXT - } - -private fun mapTrackedEntityType(trackedEntityTypeDomain: TrackedEntityTypeDomain): TrackedEntityType { - val firstAttribute = trackedEntityTypeDomain.trackedEntityTypeAttributeDomains.firstOrNull() - val teiTypeUid = firstAttribute?.trackedEntityTypeUid ?: "unknown" - - return TrackedEntityType - .builder() - .uid(teiTypeUid) - .build() -} diff --git a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImpl.kt b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImpl.kt index 0782420f8e5..1da0a90bc36 100644 --- a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImpl.kt +++ b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImpl.kt @@ -5,15 +5,37 @@ import androidx.paging.map import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import org.dhis2.commons.filters.data.FilterPresenter +import org.dhis2.mobile.commons.extensions.getTodayAsInstant +import org.dhis2.mobile.commons.extensions.toKtxInstant +import org.dhis2.tracker.data.ProfilePictureProvider +import org.dhis2.tracker.relationships.model.RelationshipDirection +import org.dhis2.tracker.relationships.model.RelationshipGeometry +import org.dhis2.tracker.relationships.model.RelationshipModel +import org.dhis2.tracker.relationships.model.RelationshipOwnerType +import org.dhis2.tracker.search.model.DomainEnrollment +import org.dhis2.tracker.search.model.DomainObjectStyle +import org.dhis2.tracker.search.model.DomainProgram import org.dhis2.tracker.search.model.SearchOperator import org.dhis2.tracker.search.model.SearchTrackedEntityAttribute import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.arch.repositories.scope.RepositoryScope +import org.hisp.dhis.android.core.common.State +import org.hisp.dhis.android.core.enrollment.EnrollmentStatus +import org.hisp.dhis.android.core.event.EventStatus +import org.hisp.dhis.android.core.relationship.RelationshipItem +import org.hisp.dhis.android.core.relationship.RelationshipItemTrackedEntityInstance +import org.hisp.dhis.android.core.trackedentity.TrackedEntityAttributeValue +import org.hisp.dhis.android.core.trackedentity.TrackedEntityInstance import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchCollectionRepository +import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItem +import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItemHelper.toTrackedEntityInstance +import kotlin.time.Instant class SearchTrackedEntityRepositoryImpl( private val d2: D2, private val filterPresenter: FilterPresenter, + private val profilePictureProvider: ProfilePictureProvider, ) : SearchTrackedEntityRepository { private var trackedEntityInstanceQuery: TrackedEntitySearchCollectionRepository? = null @@ -61,15 +83,19 @@ class SearchTrackedEntityRepositoryImpl( SearchOperator.LIKE -> { trackedEntityInstanceQuery?.byFilter(dataId)?.like(dataValues[0]) } + SearchOperator.SW -> { trackedEntityInstanceQuery?.byFilter(dataId)?.sw(dataValues[0]) } + SearchOperator.EW -> { trackedEntityInstanceQuery?.byFilter(dataId)?.ew(dataValues[0]) } + SearchOperator.EQ -> { trackedEntityInstanceQuery?.byFilter(dataId)?.eq(dataValues[0]) } + else -> trackedEntityInstanceQuery?.byFilter(dataId)?.like(dataValues[0]) } } @@ -94,6 +120,7 @@ class SearchTrackedEntityRepositoryImpl( isOnline: Boolean, hasStateFilters: Boolean, allowCache: Boolean, + selectedProgram: String?, ): Flow> { // if the device is online and there are no state filters, we can use online cache val pagerFlow = @@ -103,11 +130,11 @@ class SearchTrackedEntityRepositoryImpl( // otherwise we use offline only trackedEntityInstanceQuery?.allowOnlineCache()?.eq(allowCache)?.offlineOnly() } - + val displayOrgUnit = shouldDisplayOrgUnit(selectedProgram) // map the paging data to TrackedEntitySearchItemResult return pagerFlow?.getPagingData(10)?.map { pagingData -> pagingData.map { item -> - item.toTrackedEntitySearchItemResult() + mapItemToDomainResult(item, selectedProgram, hasStateFilters, displayOrgUnit, isOnline) } } ?: throw IllegalStateException("TrackedEntityInstanceQuery is not initialized") } @@ -115,6 +142,7 @@ class SearchTrackedEntityRepositoryImpl( override suspend fun fetchImmediateResults( isOnline: Boolean, hasStateFilters: Boolean, + selectedProgram: String?, ): List { // if the device is online and there are no state filters, we can use online cache val results = @@ -124,9 +152,440 @@ class SearchTrackedEntityRepositoryImpl( // otherwise we use offline only trackedEntityInstanceQuery?.offlineOnly()?.blockingGet() } - + val displayOrgUnit = shouldDisplayOrgUnit(selectedProgram) return results?.map { item -> - item.toTrackedEntitySearchItemResult() + mapItemToDomainResult(item, selectedProgram, hasStateFilters, displayOrgUnit, isOnline) } ?: throw IllegalStateException("TrackedEntityInstanceQuery is not initialized") } + + private fun mapItemToDomainResult( + item: TrackedEntitySearchItem, + selectedProgram: String?, + hasStateFilters: Boolean, + displayOrgUnit: Boolean, + deviceIsOnline: Boolean, + ): TrackedEntitySearchItemResult { + val dbTei = getDatabaseTei(item) + val selectedEnrollment = getSelectedEnrollment(dbTei, selectedProgram) + val isOnline = if (!deviceIsOnline) false else !(!item.isOnline && !hasStateFilters && dbTei.deleted() == false) + val enrollments = getTeiEnrollments(item.uid) + val overDueDate: Instant? = getOverdueDate(enrollments, selectedProgram) + val relationships = + if (dbTei.aggregatedSyncState() != State.RELATIONSHIP && selectedProgram?.isNotEmpty() == true) { + getRelationShips(item.uid, selectedProgram, item.type.uid()) + } else { + null + } + + val enrolledOrgUnit = + if (selectedEnrollment != null) { + orgUnitName(selectedEnrollment.orgUnit) + } else { + orgUnitName(item.organisationUnit) + } + + val ownerOrgUnit = item.programOwners?.firstOrNull()?.ownerOrgUnit + val ownerOrgUnitName = + if (ownerOrgUnit != selectedEnrollment?.orgUnit) { + orgUnitName(ownerOrgUnit) + } else { + null + } + + val profilePicture = profilePictureProvider.invoke(dbTei, selectedProgram) + val enrolledPrograms = getEnrolledPrograms(enrollments) + return item.toTrackedEntitySearchItemResult( + selectedEnrollment = selectedEnrollment, + isOnline = isOnline, + overDueDate = overDueDate, + ownerOrgUnit = ownerOrgUnitName, + enrollmentOrgUnit = enrolledOrgUnit, + shouldDisplayOrgUnit = displayOrgUnit, + profilePicture = profilePicture, + enrollments = enrollments, + enrolledPrograms = enrolledPrograms, + relationships = relationships, + ) + } + + private fun getEnrolledPrograms(enrollments: List): List? { + val programUids = + enrollments + .mapNotNull { it.program } + .distinct() + if (programUids.isEmpty()) { + return null + } + + val programs = + d2 + .programModule() + .programs() + .byUid() + .`in`(programUids) + .blockingGet() + if (programs.isEmpty()) { + return null + } + + val programsByUid = programs.associateBy { it.uid() } + val enrolledPrograms = + enrollments.mapNotNull { enrollment -> + val programUid = enrollment.program ?: return@mapNotNull null + val program = programsByUid[programUid] ?: return@mapNotNull null + DomainProgram( + uid = program.uid(), + displayName = program.displayName() ?: "", + style = + DomainObjectStyle( + icon = program.style()?.icon(), + color = program.style()?.color(), + ), + ) + } + return enrolledPrograms.ifEmpty { null } + } + + private fun shouldDisplayOrgUnit(selectedProgram: String?): Boolean = + if (selectedProgram != null) { + d2 + .organisationUnitModule() + .organisationUnits() + .byProgramUids(listOf(selectedProgram)) + .blockingCount() > 1 + } else { + false + } + + private fun orgUnitName(orgUnit: String?): String? = + orgUnit?.let { + d2 + .organisationUnitModule() + .organisationUnits() + .uid(it) + .blockingGet() + ?.displayName() + } + + private fun getRelationShips( + teiUid: String, + selectedProgram: String, + teType: String, + ): List { + val relationships = + d2.relationshipModule().relationships().getByItem( + RelationshipItem + .builder() + .trackedEntityInstance( + RelationshipItemTrackedEntityInstance + .builder() + .trackedEntityInstance(teiUid) + .build(), + ).build(), + ) + return relationships.mapNotNull { relationship -> + relationship + .from() + ?.trackedEntityInstance() + ?.let { trackedEntityInstanceFromRelationship -> + var relationshipTeiUid: String + + var direction: RelationshipDirection + if (trackedEntityInstanceFromRelationship.trackedEntityInstance() == teiUid) { + relationshipTeiUid = + trackedEntityInstanceFromRelationship.trackedEntityInstance() + direction = RelationshipDirection.FROM + } else { + relationshipTeiUid = + relationship.to()?.trackedEntityInstance()?.trackedEntityInstance() + ?: "" + direction = RelationshipDirection.TO + } + + val fromTeiUid = + relationship.from()?.trackedEntityInstance()?.trackedEntityInstance() + val toTeiUid = + relationship.to()?.trackedEntityInstance()?.trackedEntityInstance() + + val fromTei = + d2 + .trackedEntityModule() + .trackedEntityInstances() + .uid(fromTeiUid) + .blockingGet() + val toTei = + d2 + .trackedEntityModule() + .trackedEntityInstances() + .uid(toTeiUid) + .blockingGet() + val fromAttributes: List> = + getTrackedEntityAttributesForRelationship( + fromTeiUid, + selectedProgram, + teType, + ).mapNotNull { trackedEntityAttributeValue -> + val attribute = trackedEntityAttributeValue.trackedEntityAttribute() + val value = trackedEntityAttributeValue.value() + attribute?.let { attribute -> + value?.let { v -> + Pair(attribute, v) + } + } + } + val toAttributes: List> = + getTrackedEntityAttributesForRelationship( + toTeiUid, + selectedProgram, + teType, + ).mapNotNull { trackedEntityAttributeValue -> + val attribute = trackedEntityAttributeValue.trackedEntityAttribute() + val value = trackedEntityAttributeValue.value() + if (attribute != null && value != null) { + Pair(attribute, value) + } else { + null + } + } + + val fromGeometry = + fromTei?.geometry()?.let { geometry -> + RelationshipGeometry( + featureType = geometry.type()?.name, + coordinates = geometry.coordinates(), + ) + } + val toGeometry = + toTei?.geometry()?.let { geometry -> + RelationshipGeometry( + featureType = geometry.type()?.name, + coordinates = geometry.coordinates(), + ) + } + RelationshipModel( + relationshipUid = relationship.uid()!!, + relationshipState = relationship.syncState()?.name ?: State.TO_POST.name, + fromGeometry = fromGeometry, + toGeometry = toGeometry, + direction = direction, + ownerUid = relationshipTeiUid, + ownerType = RelationshipOwnerType.TEI, + fromValues = fromAttributes, + toValues = toAttributes, + fromImage = null, + toImage = null, + fromDefaultImageResource = -1, + toDefaultImageResource = -1, + ownerStyleIcon = null, + ownerStyleColor = null, + canBeOpened = true, + toLastUpdated = null, + fromLastUpdated = null, + toDescription = null, + fromDescription = null, + ) + } + } + } + + private fun getTrackedEntityAttributesForRelationship( + uid: String?, + selectedProgram: String, + teType: String, + ): List { + val attributeValues = + d2 + .trackedEntityModule() + .trackedEntityAttributeValues() + .byTrackedEntityInstance() + .eq(uid) + .byTrackedEntityAttribute() + .`in`(getProgramTrackedEntityAttributeUids(selectedProgram)) + .blockingGet() + return attributeValues.ifEmpty { + d2 + .trackedEntityModule() + .trackedEntityAttributeValues() + .byTrackedEntityInstance() + .eq(uid) + .byTrackedEntityAttribute() + .`in`(getTeTypeTrackedEntityAttributeUids(teType)) + .blockingGet() + } + } + + private fun getProgramTrackedEntityAttributeUids(selectedProgram: String): List = + d2 + .programModule() + .programTrackedEntityAttributes() + .byProgram() + .eq(selectedProgram) + .byDisplayInList() + .isTrue + .orderBySortOrder(RepositoryScope.OrderByDirection.ASC) + .blockingGet() + .map { it.uid() } + + private fun getTeTypeTrackedEntityAttributeUids(teTypeUid: String): List = + d2 + .trackedEntityModule() + .trackedEntityTypeAttributes() + .byTrackedEntityTypeUid() + .eq(teTypeUid) + .byDisplayInList() + .isTrue + .blockingGet() + .mapNotNull { + it.trackedEntityAttribute()?.uid() + } + + private fun getTeiEnrollments(teiUid: String): List { + val enrollments = + d2 + .enrollmentModule() + .enrollments() + .byTrackedEntityInstance() + .eq(teiUid) + .byDeleted() + .eq(false) + .orderByEnrollmentDate(RepositoryScope.OrderByDirection.DESC) + .blockingGet() + return enrollments.map { it.toDomainEnrollment() } + } + + /** + * Returns the most recent overdue date from events in the given enrollments. + * Returns null if there are no overdue events. + * + * This method checks: + * 1. Events with OVERDUE status + * 2. Events with SCHEDULE status that have passed their due date + * + * Uses kotlinx.datetime exclusively for date comparison (no java.util.Date operations) + */ + private fun getOverdueDate( + enrollments: List, + selectedProgram: String?, + ): Instant? { + if (enrollments.isEmpty()) return null + + val enrollmentUids = enrollments.map { it.uid } + + // Query for OVERDUE events + var overdueEventsQuery = + d2 + .eventModule() + .events() + .byEnrollmentUid() + .`in`(enrollmentUids) + .byStatus() + .eq(EventStatus.OVERDUE) + + // Query for SCHEDULE events that may be overdue + var scheduledEventsQuery = + d2 + .eventModule() + .events() + .byEnrollmentUid() + .`in`(enrollmentUids) + .byStatus() + .eq(EventStatus.SCHEDULE) + + // Filter by program if specified + if (selectedProgram != null) { + overdueEventsQuery = overdueEventsQuery.byProgramUid().eq(selectedProgram) + scheduledEventsQuery = scheduledEventsQuery.byProgramUid().eq(selectedProgram) + } + + // Get events ordered by due date (most recent first) + val overdueEvents = + overdueEventsQuery + .orderByDueDate(RepositoryScope.OrderByDirection.DESC) + .blockingGet() + + val scheduledEvents = + scheduledEventsQuery + .orderByDueDate(RepositoryScope.OrderByDirection.DESC) + .blockingGet() + + // Get today's date using kotlinx.datetime (non-deprecated way) + val today = getTodayAsInstant() + + // Filter events that are actually overdue (due date is before today) + val allOverdueEvents = + buildList { + // Add all OVERDUE events that have a due date before today + overdueEvents.forEach { event -> + event.dueDate()?.let { dueDate -> + val dueDateLocal = dueDate.toKtxInstant() + // Event is overdue if due date is before today (not equal to today) + if (dueDateLocal < today) { + add(event) + } + } + } + + // Add SCHEDULE events that have passed their due date + scheduledEvents.forEach { event -> + event.dueDate()?.let { dueDate -> + val dueDateLocal = dueDate.toKtxInstant() + // Event is overdue if due date is before today (not equal to today) + if (dueDateLocal < today) { + add(event) + } + } + } + } + + // Return the most recent overdue date as Instant, or null if no overdue events + return allOverdueEvents + .mapNotNull { it.dueDate()?.toKtxInstant() } + .maxOrNull() + } + + private fun getDatabaseTei(item: TrackedEntitySearchItem): TrackedEntityInstance { + val teiFromItem = toTrackedEntityInstance(item) + + return if (item.isOnline) { + d2 + .trackedEntityModule() + .trackedEntityInstances() + .uid(item.uid()) + .blockingGet() ?: teiFromItem + } else { + teiFromItem + } + } + + private fun getSelectedEnrollment( + dbTei: TrackedEntityInstance?, + selectedProgram: String?, + ): DomainEnrollment? { + var selectedEnrollment: DomainEnrollment? = null + // SDK mapping from SearchTrackedEntityItem to TrackedEntityInstance, this might not be needed + if (dbTei != null && dbTei.aggregatedSyncState() != State.RELATIONSHIP) { + // if dbTei is not null we will map the db tei instead of the online tei + + var enrollmentRepository = + d2 + .enrollmentModule() + .enrollments() + .byTrackedEntityInstance() + .eq(dbTei.uid()) + if (selectedProgram != null) { + enrollmentRepository = enrollmentRepository.byProgram().eq(selectedProgram) + } + val enrollmentsInProgram = + enrollmentRepository + .orderByEnrollmentDate(RepositoryScope.OrderByDirection.DESC) + .blockingGet() + if (selectedProgram != null && enrollmentsInProgram.isNotEmpty()) { + selectedEnrollment = + enrollmentsInProgram + .firstOrNull { it.status() == EnrollmentStatus.ACTIVE } + ?.toDomainEnrollment() ?: enrollmentsInProgram.firstOrNull()?.toDomainEnrollment() + } + } + return selectedEnrollment + } } diff --git a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/TrackedEntitySearchItemMapper.kt b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/TrackedEntitySearchItemMapper.kt index 6f61deeb5b7..7047a9cda58 100644 --- a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/TrackedEntitySearchItemMapper.kt +++ b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/TrackedEntitySearchItemMapper.kt @@ -1,11 +1,15 @@ package org.dhis2.tracker.search.data +import org.dhis2.mobile.commons.extensions.toKtxInstant import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.relationships.model.RelationshipModel +import org.dhis2.tracker.search.model.DomainEnrollment +import org.dhis2.tracker.search.model.DomainProgram +import org.dhis2.tracker.search.model.EnrollmentStatus import org.dhis2.tracker.search.model.GeometryFeatureType import org.dhis2.tracker.search.model.SyncState import org.dhis2.tracker.search.model.TrackedEntityGeometry import org.dhis2.tracker.search.model.TrackedEntitySearchItemAttributeDomain -import org.dhis2.tracker.search.model.TrackedEntitySearchItemProgramOwnerDomain import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult import org.dhis2.tracker.search.model.TrackedEntityTypeAttributeDomain import org.dhis2.tracker.search.model.TrackedEntityTypeDomain @@ -13,29 +17,70 @@ import org.hisp.dhis.android.core.common.FeatureType import org.hisp.dhis.android.core.common.Geometry import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.common.ValueType +import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.trackedentity.TrackedEntityType import org.hisp.dhis.android.core.trackedentity.TrackedEntityTypeAttribute import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItem import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItemAttribute -import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItemProgramOwner +import kotlin.time.Instant +import org.hisp.dhis.android.core.enrollment.EnrollmentStatus as SDKEnrollmentStatus -fun TrackedEntitySearchItem.toTrackedEntitySearchItemResult(): TrackedEntitySearchItemResult = +fun TrackedEntitySearchItem.toTrackedEntitySearchItemResult( + selectedEnrollment: DomainEnrollment?, + isOnline: Boolean, + overDueDate: Instant?, + ownerOrgUnit: String?, + enrollmentOrgUnit: String?, + shouldDisplayOrgUnit: Boolean, + profilePicture: String?, + enrollments: List?, + enrolledPrograms: List?, + relationships: List?, +): TrackedEntitySearchItemResult = TrackedEntitySearchItemResult( uid = this.uid, - created = this.created, - lastUpdated = this.lastUpdated, - createdAtClient = this.createdAtClient, - lastUpdatedAtClient = this.lastUpdatedAtClient, - organisationUnit = this.organisationUnit, + created = this.created?.toKtxInstant(), + lastUpdated = this.lastUpdated?.toKtxInstant(), + createdAtClient = this.createdAtClient?.toKtxInstant(), + lastUpdatedAtClient = this.lastUpdatedAtClient?.toKtxInstant(), + ownerOrgUnit = ownerOrgUnit, + enrollmentOrgUnit = enrollmentOrgUnit, + shouldDisplayOrgUnit = shouldDisplayOrgUnit, geometry = this.geometry.toDomainGeometry(), syncState = this.syncState?.toSyncState(), aggregatedSyncState = this.aggregatedSyncState?.toSyncState(), deleted = this.deleted, - isOnline = this.isOnline, + isOnline = isOnline, + teTypeName = this.type.displayName(), type = this.type.toTrackedEntityType(), header = this.header, + overDueDate = overDueDate, + selectedEnrollment = selectedEnrollment, + profilePicture = profilePicture, + enrolledPrograms = enrolledPrograms, + defaultTypeIcon = this.type.style()?.icon(), + enrollments = enrollments, + relationships = relationships, attributeValues = this.attributeValues?.map { it.toTrackedEntitySearchItemAttribute() } ?: emptyList(), - programOwners = this.programOwners?.map { it.toTrackedEntitySearchItemProgramOwner() } ?: emptyList(), + ) + +fun Enrollment.toDomainEnrollment(): DomainEnrollment = + DomainEnrollment( + uid = this.uid(), + orgUnit = this.organisationUnit(), + program = this.program(), + enrollmentDate = this.enrollmentDate()?.toKtxInstant(), + incidentDate = this.incidentDate()?.toKtxInstant(), + completedDate = this.completedDate()?.toKtxInstant(), + followUp = this.followUp() ?: false, + status = + when (this.status()) { + SDKEnrollmentStatus.ACTIVE -> EnrollmentStatus.ACTIVE + SDKEnrollmentStatus.COMPLETED -> EnrollmentStatus.COMPLETED + SDKEnrollmentStatus.CANCELLED -> EnrollmentStatus.CANCELLED + null -> EnrollmentStatus.ACTIVE + }, + trackedEntityInstance = this.trackedEntityInstance(), ) private fun Geometry?.toDomainGeometry(): TrackedEntityGeometry? = @@ -92,8 +137,6 @@ private fun TrackedEntitySearchItemAttribute.toTrackedEntitySearchItemAttribute( displayName = this.displayName, displayFormName = this.displayFormName, value = this.value, - created = this.created, - lastUpdated = this.lastUpdated, valueType = this.valueType.toTrackerInputType(), displayInList = this.displayInList, optionSet = this.optionSet, @@ -131,8 +174,15 @@ private fun ValueType.toTrackerInputType(): TrackerInputType = ValueType.MULTI_TEXT -> TrackerInputType.MULTI_SELECTION } -private fun TrackedEntitySearchItemProgramOwner.toTrackedEntitySearchItemProgramOwner(): TrackedEntitySearchItemProgramOwnerDomain = - TrackedEntitySearchItemProgramOwnerDomain( - program = this.program, - organisationUnit = this.ownerOrgUnit, - ) +fun SyncState.toSDKState(): State = + when (this) { + SyncState.SYNCED -> State.SYNCED + SyncState.TO_POST -> State.TO_POST + SyncState.TO_UPDATE -> State.TO_UPDATE + SyncState.ERROR -> State.ERROR + SyncState.WARNING -> State.WARNING + SyncState.UPLOADING -> State.UPLOADING + SyncState.RELATIONSHIP -> State.RELATIONSHIP + SyncState.SENT_VIA_SMS -> State.SENT_VIA_SMS + SyncState.SYNCED_VIA_SMS -> State.SYNCED_VIA_SMS + } diff --git a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.android.kt b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.android.kt index eb5df5f70ff..b9cb0aaa938 100644 --- a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.android.kt +++ b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.android.kt @@ -19,6 +19,7 @@ internal actual val trackerSearchRepositoryModule: Module = SearchTrackedEntityRepositoryImpl( d2 = get(), filterPresenter = get(), + profilePictureProvider = get(), ) } diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepository.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepository.kt index a1d605d507f..c434cefdfb0 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepository.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepository.kt @@ -31,10 +31,12 @@ interface SearchTrackedEntityRepository { isOnline: Boolean, hasStateFilters: Boolean, allowCache: Boolean, + selectedProgram: String?, ): Flow> suspend fun fetchImmediateResults( isOnline: Boolean, hasStateFilters: Boolean, + selectedProgram: String?, ): List } diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntities.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntities.kt index a96ff91a770..cc13a14e6d9 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntities.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntities.kt @@ -29,6 +29,7 @@ class SearchTrackedEntities( isOnline = input.isOnline, hasStateFilters = input.hasStateFilters, allowCache = input.allowCache, + selectedProgram = input.selectedProgram, ), ) } catch (domainError: DomainError) { @@ -53,6 +54,7 @@ class SearchTrackedEntities( repository.fetchImmediateResults( isOnline = input.isOnline, hasStateFilters = input.hasStateFilters, + selectedProgram = input.selectedProgram, ), ) } catch (domainError: DomainError) { diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/TrackedEntitySearchItemResult.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/TrackedEntitySearchItemResult.kt index 4daeecc39b6..30c973fa10b 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/TrackedEntitySearchItemResult.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/TrackedEntitySearchItemResult.kt @@ -1,33 +1,70 @@ package org.dhis2.tracker.search.model import org.dhis2.tracker.input.model.TrackerInputType -import java.util.Date +import org.dhis2.tracker.relationships.model.RelationshipModel +import kotlin.time.Instant data class TrackedEntitySearchItemResult( val uid: String, - val created: Date?, - val lastUpdated: Date?, - val createdAtClient: Date?, - val lastUpdatedAtClient: Date?, - val organisationUnit: String?, + val created: Instant?, + val lastUpdated: Instant?, + val createdAtClient: Instant?, + val lastUpdatedAtClient: Instant?, + val ownerOrgUnit: String?, + val enrollmentOrgUnit: String?, + val shouldDisplayOrgUnit: Boolean, val geometry: TrackedEntityGeometry?, val syncState: SyncState?, val aggregatedSyncState: SyncState?, val deleted: Boolean, - val isOnline: Boolean = false, + val isOnline: Boolean, + val teTypeName: String?, val type: TrackedEntityTypeDomain, - val header: String? = null, + val header: String?, + val overDueDate: Instant?, + val selectedEnrollment: DomainEnrollment?, + val profilePicture: String?, + val enrolledPrograms: List?, + val enrollments: List?, + val relationships: List?, + val defaultTypeIcon: String?, val attributeValues: List, - val programOwners: List, ) +class DomainEnrollment( + val uid: String, + val orgUnit: String?, + val program: String?, + val enrollmentDate: Instant?, + val incidentDate: Instant?, + val completedDate: Instant?, + val followUp: Boolean, + val status: EnrollmentStatus, + val trackedEntityInstance: String?, +) + +class DomainProgram( + val uid: String, + val displayName: String, + val style: DomainObjectStyle, +) + +class DomainObjectStyle( + val icon: String?, + val color: String?, +) + +enum class EnrollmentStatus { + ACTIVE, + COMPLETED, + CANCELLED, +} + data class TrackedEntitySearchItemAttributeDomain( val attribute: String, val displayName: String, val displayFormName: String, val value: String?, - val created: Date?, - val lastUpdated: Date?, val valueType: TrackerInputType, val displayInList: Boolean, val optionSet: String?, @@ -47,11 +84,6 @@ data class TrackedEntityTypeAttributeDomain( val sortOrder: Int, ) -data class TrackedEntitySearchItemProgramOwnerDomain( - val program: String, - val organisationUnit: String, -) - data class TrackedEntityGeometry( val geometryFeatureType: GeometryFeatureType, val coordinates: String?, diff --git a/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntitiesTest.kt b/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntitiesTest.kt index 3cf9ce9cb6d..1f36c0b3776 100644 --- a/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntitiesTest.kt +++ b/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntitiesTest.kt @@ -31,6 +31,7 @@ class SearchTrackedEntitiesTest { private val repository: SearchTrackedEntityRepository = mock() private val customIntentRepository: CustomIntentRepository = mock() private val teType = "personType" + private val programUid = "programUid" @Before fun setup() { @@ -61,7 +62,7 @@ class SearchTrackedEntitiesTest { ) val searchParams = SearchTrackedEntitiesInput( - selectedProgram = "programUid", + selectedProgram = programUid, allowCache = true, excludeValues = hashSetOf(), hasStateFilters = false, @@ -72,7 +73,7 @@ class SearchTrackedEntitiesTest { val mockPagingData: PagingData = PagingData.empty() val mockFlow: Flow> = flowOf(mockPagingData) - whenever(repository.isTETypeAttribute(eq(teType), any())) doReturn true + whenever(repository.isTETypeAttribute(any(), any())) doReturn true whenever(repository.getTEAttribute(any())) doReturn SearchTrackedEntityAttribute( isUnique = false, @@ -84,14 +85,14 @@ class SearchTrackedEntitiesTest { eq(CustomIntentActionTypeModel.SEARCH), ), ) doReturn false - whenever(repository.fetchResults(any(), any(), any())) doReturn mockFlow + whenever(repository.fetchResults(any(), any(), any(), any())) doReturn mockFlow // When val result = useCase.invoke(searchParams) // Then assertTrue(result.isSuccess) - verify(repository).addFiltersToQuery("programUid", teType) + verify(repository).addFiltersToQuery(programUid, teType) verify(repository).addToQuery( dataId = "attr1", dataValues = listOf("value1"), @@ -103,9 +104,10 @@ class SearchTrackedEntitiesTest { searchOperator = null, ) verify(repository).fetchResults( - isOnline = true, - hasStateFilters = false, - allowCache = true, + isOnline = eq(true), + hasStateFilters = eq(false), + allowCache = eq(true), + selectedProgram = eq(programUid), ) } @@ -115,7 +117,7 @@ class SearchTrackedEntitiesTest { // Given val searchParams = SearchTrackedEntitiesInput( - selectedProgram = "programUid", + selectedProgram = programUid, allowCache = true, excludeValues = hashSetOf(), hasStateFilters = false, @@ -126,7 +128,7 @@ class SearchTrackedEntitiesTest { val mockPagingData: PagingData = PagingData.empty() val mockFlow: Flow> = flowOf(mockPagingData) - whenever(repository.fetchResults(any(), any(), any())) doReturn mockFlow + whenever(repository.fetchResults(any(), any(), any(), any())) doReturn mockFlow // When val result = useCase.invoke(searchParams) @@ -139,6 +141,7 @@ class SearchTrackedEntitiesTest { isOnline = false, hasStateFilters = false, allowCache = true, + selectedProgram = programUid, ) } @@ -160,7 +163,7 @@ class SearchTrackedEntitiesTest { val mockPagingData: PagingData = PagingData.empty() val mockFlow: Flow> = flowOf(mockPagingData) - whenever(repository.fetchResults(any(), any(), any())) doReturn mockFlow + whenever(repository.fetchResults(any(), any(), any(), any())) doReturn mockFlow // When val result = useCase.invoke(searchParams) @@ -177,7 +180,7 @@ class SearchTrackedEntitiesTest { val excludedValues = hashSetOf("excludedUid1", "excludedUid2") val searchParams = SearchTrackedEntitiesInput( - selectedProgram = "programUid", + selectedProgram = programUid, allowCache = true, excludeValues = excludedValues, hasStateFilters = false, @@ -188,7 +191,7 @@ class SearchTrackedEntitiesTest { val mockPagingData: PagingData = PagingData.empty() val mockFlow: Flow> = flowOf(mockPagingData) - whenever(repository.fetchResults(any(), any(), any())) doReturn mockFlow + whenever(repository.fetchResults(any(), any(), any(), any())) doReturn mockFlow // When val result = useCase.invoke(searchParams) @@ -212,7 +215,7 @@ class SearchTrackedEntitiesTest { ) val searchParams = SearchTrackedEntitiesInput( - selectedProgram = "programUid", + selectedProgram = programUid, allowCache = true, excludeValues = hashSetOf(), hasStateFilters = false, @@ -235,7 +238,7 @@ class SearchTrackedEntitiesTest { eq(CustomIntentActionTypeModel.SEARCH), ), ) doReturn false - whenever(repository.fetchResults(any(), any(), any())) doReturn mockFlow + whenever(repository.fetchResults(any(), any(), any(), any())) doReturn mockFlow // When val result = useCase.invoke(searchParams) @@ -263,7 +266,7 @@ class SearchTrackedEntitiesTest { ) val searchParams = SearchTrackedEntitiesInput( - selectedProgram = "programUid", + selectedProgram = programUid, allowCache = true, excludeValues = hashSetOf(), hasStateFilters = false, @@ -286,7 +289,7 @@ class SearchTrackedEntitiesTest { eq(CustomIntentActionTypeModel.SEARCH), ), ) doReturn false - whenever(repository.fetchResults(any(), any(), any())) doReturn mockFlow + whenever(repository.fetchResults(any(), any(), any(), any())) doReturn mockFlow // When val result = useCase.invoke(searchParams) @@ -314,7 +317,7 @@ class SearchTrackedEntitiesTest { ) val searchParams = SearchTrackedEntitiesInput( - selectedProgram = "programUid", + selectedProgram = programUid, allowCache = true, excludeValues = hashSetOf(), hasStateFilters = false, @@ -337,7 +340,7 @@ class SearchTrackedEntitiesTest { CustomIntentActionTypeModel.SEARCH, ), ) doReturn false - whenever(repository.fetchResults(any(), any(), any())) doReturn mockFlow + whenever(repository.fetchResults(any(), any(), any(), any())) doReturn mockFlow // When val result = useCase.invoke(searchParams) @@ -365,7 +368,7 @@ class SearchTrackedEntitiesTest { ) val searchParams = SearchTrackedEntitiesInput( - selectedProgram = "programUid", + selectedProgram = programUid, allowCache = true, excludeValues = hashSetOf(), hasStateFilters = false, @@ -388,7 +391,7 @@ class SearchTrackedEntitiesTest { CustomIntentActionTypeModel.SEARCH, ), ) doReturn true - whenever(repository.fetchResults(any(), any(), any())) doReturn mockFlow + whenever(repository.fetchResults(any(), any(), any(), any())) doReturn mockFlow // When val result = useCase.invoke(searchParams) @@ -445,7 +448,7 @@ class SearchTrackedEntitiesTest { eq(CustomIntentActionTypeModel.SEARCH), ), ) doReturn false - whenever(repository.fetchResults(any(), any(), any())) doReturn mockFlow + whenever(repository.fetchResults(any(), any(), any(), any())) doReturn mockFlow // When val result = useCase.invoke(searchParams) @@ -466,7 +469,7 @@ class SearchTrackedEntitiesTest { // Given val searchParams = SearchTrackedEntitiesInput( - selectedProgram = "programUid", + selectedProgram = programUid, allowCache = true, excludeValues = hashSetOf(), hasStateFilters = false, @@ -476,7 +479,7 @@ class SearchTrackedEntitiesTest { val domainError = DomainError.UnexpectedError("Test error") - whenever(repository.fetchResults(any(), any(), any())).thenAnswer { throw domainError } + whenever(repository.fetchResults(any(), any(), any(), any())).thenAnswer { throw domainError } // When val result = useCase.invoke(searchParams) @@ -493,7 +496,7 @@ class SearchTrackedEntitiesTest { // Given val searchParams = SearchTrackedEntitiesInput( - selectedProgram = "programUid", + selectedProgram = programUid, allowCache = false, excludeValues = hashSetOf(), hasStateFilters = true, @@ -504,7 +507,7 @@ class SearchTrackedEntitiesTest { val mockPagingData: PagingData = PagingData.empty() val mockFlow: Flow> = flowOf(mockPagingData) - whenever(repository.fetchResults(any(), any(), any())) doReturn mockFlow + whenever(repository.fetchResults(any(), any(), any(), any())) doReturn mockFlow // When val result = useCase.invoke(searchParams) @@ -515,6 +518,7 @@ class SearchTrackedEntitiesTest { isOnline = true, hasStateFilters = true, allowCache = false, + selectedProgram = programUid, ) } @@ -524,7 +528,7 @@ class SearchTrackedEntitiesTest { // Given val searchParams = SearchTrackedEntitiesInput( - selectedProgram = "programUid", + selectedProgram = programUid, allowCache = true, excludeValues = hashSetOf(), hasStateFilters = false, @@ -535,7 +539,7 @@ class SearchTrackedEntitiesTest { val mockPagingData: PagingData = PagingData.empty() val mockFlow: Flow> = flowOf(mockPagingData) - whenever(repository.fetchResults(any(), any(), any())) doReturn mockFlow + whenever(repository.fetchResults(any(), any(), any(), any())) doReturn mockFlow // When val result = useCase.invoke(searchParams) @@ -546,6 +550,7 @@ class SearchTrackedEntitiesTest { isOnline = false, hasStateFilters = false, allowCache = true, + selectedProgram = programUid, ) } } From c9862a81789fdb48687cd95e2924509df4b9830b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Tue, 31 Mar 2026 09:35:25 +0200 Subject: [PATCH 121/260] ci: Remove [skip size] from verify-dependency-metadata.yml commit message (#4779) --- .github/workflows/verify-dependency-metadata.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/verify-dependency-metadata.yml b/.github/workflows/verify-dependency-metadata.yml index ab070ac4eaa..c6b792eefb3 100644 --- a/.github/workflows/verify-dependency-metadata.yml +++ b/.github/workflows/verify-dependency-metadata.yml @@ -53,6 +53,6 @@ jobs: if: steps.check-diff.outputs.changed == 'true' && github.event.pull_request.head.repo.full_name == github.repository uses: flex-development/gh-commit@177be4b5bca1b102400ca7220932d9ff7980fddb with: - message: 'chore: update dependency verification metadata [skip ci]' + message: 'chore: update dependency verification metadata' ref: ${{ github.head_ref }} token: ${{ secrets.DHIS2_BOT_GITHUB_TOKEN }} From c71791e04a7adfe8cbdd27a6d045da259706da56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manu=20Mu=C3=B1oz?= Date: Tue, 31 Mar 2026 16:03:19 +0200 Subject: [PATCH 122/260] fix: [ANDROAPP-7287] flicker when tei list is empty (#4777) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Manu Muñoz --- .../dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt index e585a6c3950..6a21ccd1268 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt @@ -316,7 +316,7 @@ class SearchTEList : FragmentGlobalAbstract() { viewModel.dataResult.observe(viewLifecycleOwner) { initLoading(emptyList()) it.firstOrNull()?.let { searchResult -> - if (searchResult.shouldClearProgramData()) { + if (searchResult.shouldClearProgramData() && liveAdapter.itemCount > 0) { liveAdapter.refresh() } if (searchResult.shouldClearGlobalData()) { From 0aa6a3ba4090c722725995ef4e3f277c8a0666dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Tue, 31 Mar 2026 16:40:51 +0200 Subject: [PATCH 123/260] Feature/androapp 7532 anr in tei dashboard with display analytics [skip size] (#4782) * refactor: [ANDROAPP-7551] Create GetEnrollmentAnalyticsUseCase (#4772) * refactor: - Introduce `GetEnrollmentAnalyticsUseCase` to handle enrollment analytics fetching logic. - Migrated `GroupAnalyticsViewModel` to use `StateFlow` instead of `LiveData` for `chipItems` and `analytics`. - Updated `GroupAnalyticsFragment` to collect flows within the `repeatOnLifecycle` block. * refactor: rename input parameter to enrollmentUid in GetEnrollmentAnalyticsUseCase * refactor: [ANDROAPP-7552] update enrollment charts retrieval to use coroutines [skip size] (#4773) * refactor: update enrollment charts retrieval to use coroutines - Update `Charts`, `ChartsRepository`, and `ChartCoordinatesProvider` interfaces and implementations to use `suspend` functions for enrollment analytics. - Refactor `DataElementToGraph`, `ProgramIndicatorToGraph`, and `AnalyticsTeiSettingsToGraph` mappers to be `suspend` functions. - Wrap blocking calls in `runBlocking` within `DashboardRepositoryImpl` and `TrackerAnalyticsRepository` to bridge RxJava/synchronous code with the new coroutine-based analytics API. - Update unit tests to use `runTest` or `runBlocking` for asynchronous repository calls. * refactor: update programHasAnalytics to suspend function and remove from PageConfigurator * refactor: replace RxJava with Coroutines in Indicators module - Migration of `IndicatorRepository` and its implementations (`TrackerAnalyticsRepository`, `EventIndicatorRepository`) to use `suspend` functions instead of RxJava `Flowable`. - Update `IndicatorsPresenter` to use `CoroutineScope` and `DispatcherProvider` for data fetching, replacing `CompositeDisposable` and `SchedulerProvider`. - Refactor `IndicatorsPresenterTest` and repository tests to use `runTest` and `StandardTestDispatcher` for coroutine testing. - Remove `runBlocking` calls within repository logic in favor of proper suspending calls. --- .../org/dhis2/data/server/ServerModule.kt | 19 ++- .../teiDashboard/DashboardRepository.kt | 6 +- .../teiDashboard/DashboardRepositoryImpl.kt | 12 +- .../teiDashboard/DashboardViewModel.kt | 6 +- .../TeiDashboardPageConfigurator.kt | 2 - .../indicators/EventIndicatorRepository.kt | 31 +++-- .../indicators/IndicatorRepository.kt | 3 +- .../indicators/IndicatorsModule.kt | 6 +- .../indicators/IndicatorsPresenter.kt | 42 +++--- .../indicators/TrackerAnalyticsRepository.kt | 47 +++---- .../TeiDashboardPageConfiguratorTest.kt | 12 -- .../EventIndicatorRepositoryTest.kt | 21 +-- .../indicators/IndicatorsPresenterTest.kt | 38 ++++-- .../TrackerAnalyticsRepositoryTest.kt | 43 +++--- .../java/dhis2/org/analytics/charts/Charts.kt | 2 +- .../org/analytics/charts/ChartsRepository.kt | 2 +- .../analytics/charts/ChartsRepositoryImpl.kt | 96 +++++++------- .../analytics/charts/DhisAnalyticCharts.kt | 2 +- .../org/analytics/charts/di/ChartsInjector.kt | 8 ++ .../domain/GetEnrollmentAnalyticsUseCase.kt | 20 +++ .../mappers/AnalyticsTeiSettingsToGraph.kt | 6 +- .../charts/mappers/DataElementToGraph.kt | 2 +- .../charts/mappers/ProgramIndicatorToGraph.kt | 2 +- .../providers/ChartCoordinatesProvider.kt | 8 +- .../providers/ChartCoordinatesProviderImpl.kt | 18 +-- .../charts/ui/GroupAnalyticsFragment.kt | 82 +++++++----- .../charts/ui/GroupAnalyticsViewModel.kt | 125 ++++++++++-------- .../ui/GroupAnalyticsViewModelFactory.kt | 6 + .../charts/ui/di/AnalyticsFragmentInjector.kt | 14 +- .../analytics/charts/ChartsRepositoryTest.kt | 13 +- .../GetEnrollmentAnalyticsUseCaseTest.kt | 74 +++++++++++ .../ChartCoordinatesProviderImplTest.kt | 9 +- 32 files changed, 467 insertions(+), 310 deletions(-) create mode 100644 dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/domain/GetEnrollmentAnalyticsUseCase.kt create mode 100644 dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/domain/GetEnrollmentAnalyticsUseCaseTest.kt diff --git a/app/src/main/java/org/dhis2/data/server/ServerModule.kt b/app/src/main/java/org/dhis2/data/server/ServerModule.kt index d1ae9f3e71f..0b2d8395d9b 100644 --- a/app/src/main/java/org/dhis2/data/server/ServerModule.kt +++ b/app/src/main/java/org/dhis2/data/server/ServerModule.kt @@ -5,7 +5,9 @@ import android.content.ContextWrapper import dagger.Module import dagger.Provides import dhis2.org.analytics.charts.Charts -import dhis2.org.analytics.charts.DhisAnalyticCharts +import dhis2.org.analytics.charts.di.ChartsComponent +import dhis2.org.analytics.charts.di.DaggerChartsComponent +import dhis2.org.analytics.charts.domain.GetEnrollmentAnalyticsUseCase import okhttp3.Interceptor import org.dhis2.BuildConfig import org.dhis2.R @@ -81,7 +83,20 @@ class ServerModule { @Provides @PerServer - fun provideCharts(serverComponent: ServerComponent): Charts = DhisAnalyticCharts.Provider.get(serverComponent) + fun provideChartsComponent(serverComponent: ServerComponent): ChartsComponent = + DaggerChartsComponent + .builder() + .dependencies(serverComponent) + .build() + + @Provides + @PerServer + fun provideCharts(chartsComponent: ChartsComponent): Charts = chartsComponent.charts() + + @Provides + @PerServer + fun provideGetEnrollmentAnalyticsUseCase(chartsComponent: ChartsComponent): GetEnrollmentAnalyticsUseCase = + chartsComponent.getEnrollmentAnalyticsUseCase() @Provides @PerServer diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepository.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepository.kt index b9a85cbdcdc..3eee5ec3f20 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepository.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepository.kt @@ -64,7 +64,7 @@ interface DashboardRepository { fun getTeiActivePrograms( teiUid: String, showOnlyActive: Boolean, - ): Observable>> + ): Observable>> fun getTEIEnrollments(teiUid: String): Observable> @@ -92,14 +92,14 @@ interface DashboardRepository { fun programHasRelationships(): Boolean - fun programHasAnalytics(): Boolean + suspend fun programHasAnalytics(): Boolean fun getTETypeName(): String? fun getAttributesMap( programUid: String, teiUid: String, - ): Observable>> + ): Observable>> fun getDashboardModel(): DashboardModel? diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepositoryImpl.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepositoryImpl.kt index db2f64169c2..74da93816da 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepositoryImpl.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepositoryImpl.kt @@ -573,7 +573,7 @@ class DashboardRepositoryImpl( override fun getTeiActivePrograms( teiUid: String, showOnlyActive: Boolean, - ): Observable>> { + ): Observable>> { val enrollmentRepo = d2 .enrollmentModule() @@ -746,7 +746,7 @@ class DashboardRepositoryImpl( } else { Observable.just(StatusChangeResultCode.WRITE_PERMISSION_FAIL) } - } catch (error: D2Error) { + } catch (_: D2Error) { Observable.just(StatusChangeResultCode.FAILED) } @@ -778,7 +778,7 @@ class DashboardRepositoryImpl( false } - override fun programHasAnalytics(): Boolean = + override suspend fun programHasAnalytics(): Boolean = if (!programUid.isNullOrEmpty()) { val enrollmentScopeRulesUids = d2 @@ -887,12 +887,12 @@ class DashboardRepositoryImpl( override fun getAttributesMap( programUid: String, teiUid: String, - ): Observable>> = + ): Observable>> = teiAttributesProvider .getProgramTrackedEntityAttributesByProgram(programUid, teiUid) .toObservable() - .flatMapIterable { list: List>? -> list } - .map { (attribute, attributeValue): kotlin.Pair -> + .flatMapIterable { list: List>? -> list } + .map { (attribute, attributeValue): Pair -> val formattedAttributeValue: TrackedEntityAttributeValue = if (attributeValue != null && attribute!!.valueType() != ValueType.IMAGE) { ValueUtils.transform( diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardViewModel.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardViewModel.kt index 0fb7b499c36..3cd6968a1ad 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardViewModel.kt @@ -120,7 +120,7 @@ class DashboardViewModel( } } - private fun loadNavigationBarItems() { + private suspend fun loadNavigationBarItems() { val enrollmentItems = mutableListOf>() if (isPortrait()) { @@ -134,7 +134,7 @@ class DashboardViewModel( ) } - if (pageConfigurator.displayAnalytics()) { + if (withContext(dispatcher.io()) { repository.programHasAnalytics() }) { enrollmentItems.add( NavigationBarItem( id = TEIDashboardItems.ANALYTICS, @@ -255,7 +255,7 @@ class DashboardViewModel( try { val hasMoreEnrollments = result.await() onSuccess(hasMoreEnrollments) - } catch (e: AuthorityException) { + } catch (_: AuthorityException) { onAuthorityError() } catch (e: Exception) { Timber.e(e) diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/TeiDashboardPageConfigurator.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/TeiDashboardPageConfigurator.kt index 3fbe0c1bacb..4385cf40dfd 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/TeiDashboardPageConfigurator.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/TeiDashboardPageConfigurator.kt @@ -8,8 +8,6 @@ class TeiDashboardPageConfigurator( ) : NavigationPageConfigurator { override fun displayDetails(): Boolean = isPortrait - override fun displayAnalytics(): Boolean = dashboardRepository.programHasAnalytics() - override fun displayRelationships(): Boolean = dashboardRepository.programHasRelationships() override fun displayNotes(): Boolean = true diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/EventIndicatorRepository.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/EventIndicatorRepository.kt index 229ec86cade..ccf47212cf1 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/EventIndicatorRepository.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/EventIndicatorRepository.kt @@ -1,7 +1,6 @@ package org.dhis2.usescases.teiDashboard.dashboardfragments.indicators import dhis2.org.analytics.charts.ui.AnalyticsModel -import io.reactivex.Flowable import org.dhis2.commons.resources.ResourceManager import org.dhis2.mobileProgramRules.RuleEngineHelper import org.hisp.dhis.android.core.D2 @@ -13,19 +12,19 @@ class EventIndicatorRepository( val eventUid: String, resourceManager: ResourceManager, ) : BaseIndicatorRepository(d2, ruleEngineHelper, programUid, resourceManager) { - override fun fetchData(): Flowable> = - Flowable.zip( - getIndicators { indicatorUid -> - d2 - .programModule() - .programIndicatorEngine() - .getEventProgramIndicatorValue( - eventUid, - indicatorUid, - ) ?: "" - }, - getRulesIndicators(), - ) { indicators, ruleIndicators -> - arrangeSections(indicators, ruleIndicators) - } + override suspend fun fetchData(): List { + val indicators = getIndicators { indicatorUid -> + d2 + .programModule() + .programIndicatorEngine() + .getEventProgramIndicatorValue( + eventUid, + indicatorUid, + ) ?: "" + }.blockingFirst(emptyList()) + + val ruleIndicators = getRulesIndicators().blockingFirst(emptyList()) + + return arrangeSections(indicators, ruleIndicators) + } } diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorRepository.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorRepository.kt index e2f0f78fb35..65f6562048c 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorRepository.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorRepository.kt @@ -3,12 +3,11 @@ package org.dhis2.usescases.teiDashboard.dashboardfragments.indicators import dhis2.org.analytics.charts.ui.AnalyticsModel import dhis2.org.analytics.charts.ui.ChartModel import dhis2.org.analytics.charts.ui.OrgUnitFilterType -import io.reactivex.Flowable import org.hisp.dhis.android.core.common.RelativePeriod import org.hisp.dhis.android.core.organisationunit.OrganisationUnit interface IndicatorRepository { - fun fetchData(): Flowable> + suspend fun fetchData(): List fun filterByPeriod( chartModel: ChartModel, diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorsModule.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorsModule.kt index e63ab42534b..b28c187d06d 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorsModule.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorsModule.kt @@ -5,7 +5,7 @@ import dagger.Provides import dhis2.org.analytics.charts.Charts import org.dhis2.commons.di.dagger.PerFragment import org.dhis2.commons.resources.ResourceManager -import org.dhis2.commons.schedulers.SchedulerProvider +import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.mobileProgramRules.RuleEngineHelper import org.hisp.dhis.android.core.D2 @@ -19,9 +19,9 @@ class IndicatorsModule( @Provides @PerFragment fun providesPresenter( - schedulerProvider: SchedulerProvider, + dispatcherProvider: DispatcherProvider, indicatorRepository: IndicatorRepository, - ): IndicatorsPresenter = IndicatorsPresenter(schedulerProvider, view, indicatorRepository) + ): IndicatorsPresenter = IndicatorsPresenter(dispatcherProvider, view, indicatorRepository) @Provides @PerFragment diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorsPresenter.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorsPresenter.kt index 407be11ed64..7495dd80bd2 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorsPresenter.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorsPresenter.kt @@ -4,34 +4,42 @@ import dhis2.org.analytics.charts.idling.AnalyticsCountingIdlingResource import dhis2.org.analytics.charts.ui.ChartFilter import dhis2.org.analytics.charts.ui.ChartModel import dhis2.org.analytics.charts.ui.OrgUnitFilterType -import io.reactivex.disposables.CompositeDisposable -import io.reactivex.processors.PublishProcessor -import org.dhis2.commons.schedulers.SchedulerProvider -import org.dhis2.commons.schedulers.defaultSubscribe +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import org.dhis2.commons.viewmodel.DispatcherProvider import org.hisp.dhis.android.core.common.RelativePeriod import org.hisp.dhis.android.core.organisationunit.OrganisationUnit import timber.log.Timber class IndicatorsPresenter( - val schedulerProvider: SchedulerProvider, + val dispatcherProvider: DispatcherProvider, val view: IndicatorsView, val indicatorRepository: IndicatorRepository, ) { - var compositeDisposable: CompositeDisposable = CompositeDisposable() - val publishProcessor = PublishProcessor.create() + private val scope = CoroutineScope(SupervisorJob() + dispatcherProvider.io()) fun init() { AnalyticsCountingIdlingResource.increment() + fetchData() + } - compositeDisposable.add( - publishProcessor - .startWith(Unit) - .flatMap { indicatorRepository.fetchData() } - .defaultSubscribe(schedulerProvider, { view.swapAnalytics(it) }, { Timber.d(it) }), - ) + private fun fetchData() { + scope.launch { + try { + val data = indicatorRepository.fetchData() + withContext(dispatcherProvider.ui()) { + view.swapAnalytics(data) + } + } catch (e: Exception) { + Timber.d(e) + } + } } - fun onDettach() = compositeDisposable.clear() + fun onDettach() = scope.cancel() fun displayMessage(message: String) = view.displayMessage(message) @@ -41,7 +49,7 @@ class IndicatorsPresenter( lineListingColumnId: Int?, ) { indicatorRepository.filterByPeriod(chartModel, selectedPeriods, lineListingColumnId) - publishProcessor.onNext(Unit) + fetchData() } fun filterByOrgUnit( @@ -56,7 +64,7 @@ class IndicatorsPresenter( filterType, lineListingColumnId, ) - publishProcessor.onNext(Unit) + fetchData() } fun resetFilter( @@ -87,6 +95,6 @@ class IndicatorsPresenter( ) } } - publishProcessor.onNext(Unit) + fetchData() } } diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/TrackerAnalyticsRepository.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/TrackerAnalyticsRepository.kt index 00a6d4f12d9..70cc359fe4b 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/TrackerAnalyticsRepository.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/TrackerAnalyticsRepository.kt @@ -4,8 +4,6 @@ import dhis2.org.analytics.charts.Charts import dhis2.org.analytics.charts.ui.AnalyticsModel import dhis2.org.analytics.charts.ui.ChartModel import dhis2.org.analytics.charts.ui.OrgUnitFilterType -import io.reactivex.Flowable -import io.reactivex.functions.Function3 import org.dhis2.commons.resources.ResourceManager import org.dhis2.mobileProgramRules.RuleEngineHelper import org.dhis2.utils.DhisTextUtils @@ -37,32 +35,25 @@ class TrackerAnalyticsRepository( enrollmentUid = enrollmentRepository.one().blockingGet()?.uid() ?: "" } - override fun fetchData(): Flowable> = - Flowable.zip< - List?, - List?, - List, - List, - >( - getIndicators( - !DhisTextUtils.isEmpty(enrollmentUid), - ) { indicatorUid -> - d2 - .programModule() - .programIndicatorEngine() - .getEnrollmentProgramIndicatorValue( - enrollmentUid, - indicatorUid, - ) ?: "" - }, - getRulesIndicators(), - Flowable.just( - charts?.geEnrollmentCharts(enrollmentUid)?.map { ChartModel(it) }, - ), - Function3 { indicators, ruleIndicators, charts -> - arrangeSections(indicators, ruleIndicators, charts) - }, - ) + override suspend fun fetchData(): List { + val indicators = getIndicators( + !DhisTextUtils.isEmpty(enrollmentUid), + ) { indicatorUid -> + d2 + .programModule() + .programIndicatorEngine() + .getEnrollmentProgramIndicatorValue( + enrollmentUid, + indicatorUid, + ) ?: "" + }.blockingFirst(emptyList()) + + val ruleIndicators = getRulesIndicators().blockingFirst(emptyList()) + + val chartModels = charts?.geEnrollmentCharts(enrollmentUid)?.map { ChartModel(it) } ?: emptyList() + + return arrangeSections(indicators, ruleIndicators, chartModels) + } override fun filterByPeriod( chartModel: ChartModel, diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiDashboardPageConfiguratorTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiDashboardPageConfiguratorTest.kt index 4849f3c652a..6ca5598b905 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiDashboardPageConfiguratorTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiDashboardPageConfiguratorTest.kt @@ -18,18 +18,6 @@ class TeiDashboardPageConfiguratorTest { assertTrue(pageConfigurator.displayDetails()) } - @Test - fun `Should display analytics screen if the program is configured`() { - whenever(dashboardRepository.programHasAnalytics()) doReturn true - assertTrue(pageConfigurator.displayAnalytics()) - } - - @Test - fun `Should not display analytics screen if the program is configured`() { - whenever(dashboardRepository.programHasAnalytics()) doReturn false - assertTrue(!pageConfigurator.displayAnalytics()) - } - @Test fun `Should display relationships screen if the program is configured`() { whenever(dashboardRepository.programHasRelationships()) doReturn true diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/EventIndicatorRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/EventIndicatorRepositoryTest.kt index c3623f11e80..3a0ecc6f7b2 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/EventIndicatorRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/EventIndicatorRepositoryTest.kt @@ -2,6 +2,7 @@ package org.dhis2.usescases.teiDashboard.dashboardfragments.indicators import dhis2.org.analytics.charts.ui.SectionTitle import io.reactivex.Single +import kotlinx.coroutines.test.runTest import org.dhis2.commons.resources.ResourceManager import org.dhis2.mobileProgramRules.RuleEngineHelper import org.hisp.dhis.android.core.D2 @@ -11,6 +12,7 @@ import org.hisp.dhis.android.core.program.ProgramRuleAction import org.hisp.dhis.android.core.program.ProgramRuleActionType import org.hisp.dhis.rules.models.RuleAction import org.hisp.dhis.rules.models.RuleEffect +import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import org.mockito.Mockito @@ -96,7 +98,7 @@ class EventIndicatorRepositoryTest { } @Test - fun `Should fetch analytic data for tracker`() { + fun `Should fetch analytic data for tracker`() = runTest { whenever( d2 .programModule() @@ -218,15 +220,14 @@ class EventIndicatorRepositoryTest { ruleEngineHelper.evaluate(), ) doReturn mockedEffects() - val testObserver = repository.fetchData().test() - testObserver.assertNoErrors() - testObserver.assertValue { - it.size == 5 && - it[0] is SectionTitle && - (it[0] as SectionTitle).title == "Feedback" && - it[2] is SectionTitle && - (it[2] as SectionTitle).title == "Indicators" - } + val result = repository.fetchData() + assertTrue( + result.size == 5 && + result[0] is SectionTitle && + (result[0] as SectionTitle).title == "Feedback" && + result[2] is SectionTitle && + (result[2] as SectionTitle).title == "Indicators", + ) } private fun mockedProgramIndicatorList(): List = diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorsPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorsPresenterTest.kt index 2e1298fadae..041236c9eb9 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorsPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorsPresenterTest.kt @@ -3,11 +3,15 @@ package org.dhis2.usescases.teiDashboard.dashboardfragments.indicators import dhis2.org.analytics.charts.ui.AnalyticsModel import dhis2.org.analytics.charts.ui.IndicatorModel import dhis2.org.analytics.charts.ui.LOCATION_INDICATOR_WIDGET -import io.reactivex.Flowable -import org.dhis2.commons.schedulers.SchedulerProvider -import org.dhis2.data.schedulers.TrampolineSchedulerProvider +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.resetMain +import kotlinx.coroutines.test.setMain +import org.dhis2.commons.viewmodel.DispatcherProvider import org.hisp.dhis.android.core.program.ProgramIndicator -import org.junit.Assert +import org.junit.After import org.junit.Before import org.junit.Test import org.mockito.kotlin.any @@ -16,33 +20,43 @@ import org.mockito.kotlin.mock import org.mockito.kotlin.verify import org.mockito.kotlin.whenever +@OptIn(ExperimentalCoroutinesApi::class) class IndicatorsPresenterTest { - private val schedulers: SchedulerProvider = TrampolineSchedulerProvider() + private val testDispatcher = StandardTestDispatcher() + private val dispatcherProvider: DispatcherProvider = mock { + on { io() } doReturn testDispatcher + on { ui() } doReturn testDispatcher + } private val view: IndicatorsView = mock() private val indicatorRepository: IndicatorRepository = mock() private lateinit var presenter: IndicatorsPresenter @Before fun setUp() { - presenter = IndicatorsPresenter(schedulers, view, indicatorRepository) + Dispatchers.setMain(testDispatcher) + presenter = IndicatorsPresenter(dispatcherProvider, view, indicatorRepository) + } + + @After + fun tearDown() { + Dispatchers.resetMain() } @Test fun `Should get indicators`() { - whenever( - indicatorRepository.fetchData(), - ) doReturn Flowable.just(analyticsModels()) + runBlocking { + whenever(indicatorRepository.fetchData()) doReturn analyticsModels() + } presenter.init() + testDispatcher.scheduler.advanceUntilIdle() verify(view).swapAnalytics(any()) } @Test - fun `Should clear disposables`() { + fun `Should clear scope on detach`() { presenter.onDettach() - - Assert.assertTrue(presenter.compositeDisposable.size() == 0) } @Test diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/TrackerAnalyticsRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/TrackerAnalyticsRepositoryTest.kt index 818520bae8e..d2ab6d2e6b9 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/TrackerAnalyticsRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/TrackerAnalyticsRepositoryTest.kt @@ -4,6 +4,7 @@ import dhis2.org.analytics.charts.Charts import dhis2.org.analytics.charts.data.Graph import dhis2.org.analytics.charts.ui.SectionTitle import io.reactivex.Single +import kotlinx.coroutines.test.runTest import org.dhis2.commons.resources.ResourceManager import org.dhis2.mobileProgramRules.RuleEngineHelper import org.hisp.dhis.android.core.D2 @@ -15,6 +16,7 @@ import org.hisp.dhis.android.core.program.ProgramRuleAction import org.hisp.dhis.android.core.program.ProgramRuleActionType import org.hisp.dhis.rules.models.RuleAction import org.hisp.dhis.rules.models.RuleEffect +import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import org.mockito.Mockito @@ -109,7 +111,7 @@ class TrackerAnalyticsRepositoryTest { } @Test - fun `Should fetch analytic data for tracker`() { + fun `Should fetch analytic data for tracker`() = runTest { whenever( d2 .programModule() @@ -235,19 +237,18 @@ class TrackerAnalyticsRepositoryTest { charts.geEnrollmentCharts(any()), ) doReturn mockedCharts() - val testObserver = repository.fetchData().test() - testObserver.assertNoErrors() - testObserver.assertValue { - it.size == 7 && - it[0] is SectionTitle && - (it[0] as SectionTitle).title == "Feedback" && - it[2] is SectionTitle && - (it[2] as SectionTitle).title == "Charts and indicators" - } + val result = repository.fetchData() + assertTrue( + result.size == 7 && + result[0] is SectionTitle && + (result[0] as SectionTitle).title == "Feedback" && + result[2] is SectionTitle && + (result[2] as SectionTitle).title == "Charts and indicators", + ) } @Test - fun `Should fetch analytic data for tracker with only indicator section`() { + fun `Should fetch analytic data for tracker with only indicator section`() = runTest { whenever( d2 .programModule() @@ -373,15 +374,14 @@ class TrackerAnalyticsRepositoryTest { charts.geEnrollmentCharts(any()), ) doReturn emptyList() - val testObserver = repository.fetchData().test() - testObserver.assertNoErrors() - testObserver.assertValue { - it[0] is SectionTitle && (it[0] as SectionTitle).title == "Indicators" - } + val result = repository.fetchData() + assertTrue( + result[0] is SectionTitle && (result[0] as SectionTitle).title == "Indicators", + ) } @Test - fun `Should fetch analytic data for tracker with only charts section`() { + fun `Should fetch analytic data for tracker with only charts section`() = runTest { whenever( d2 .programModule() @@ -508,11 +508,10 @@ class TrackerAnalyticsRepositoryTest { charts.geEnrollmentCharts(any()), ) doReturn mockedCharts() - val testObserver = repository.fetchData().test() - testObserver.assertNoErrors() - testObserver.assertValue { - it[0] is SectionTitle && (it[0] as SectionTitle).title == "Charts" - } + val result = repository.fetchData() + assertTrue( + result[0] is SectionTitle && (result[0] as SectionTitle).title == "Charts", + ) } private fun mockedProgramIndicatorList(): List = diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/Charts.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/Charts.kt index a579db69625..4d77861c022 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/Charts.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/Charts.kt @@ -16,7 +16,7 @@ interface Charts { fun getVisualizationGroups(uid: String?): List - fun geEnrollmentCharts(enrollmentUid: String): List + suspend fun geEnrollmentCharts(enrollmentUid: String): List fun getProgramVisualizations( groupUid: String?, diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ChartsRepository.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ChartsRepository.kt index fce0f75751f..0aa6577e4b7 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ChartsRepository.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ChartsRepository.kt @@ -7,7 +7,7 @@ import org.hisp.dhis.android.core.organisationunit.OrganisationUnit import org.hisp.dhis.android.core.settings.AnalyticsDhisVisualizationsGroup interface ChartsRepository { - fun getAnalyticsForEnrollment(enrollmentUid: String): List + suspend fun getAnalyticsForEnrollment(enrollmentUid: String): List fun getProgramVisualization( groupUid: String?, diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ChartsRepositoryImpl.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ChartsRepositoryImpl.kt index 596c9b30b91..e1ad5bc8641 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ChartsRepositoryImpl.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ChartsRepositoryImpl.kt @@ -40,7 +40,7 @@ class ChartsRepositoryImpl( ) : ChartsRepository { private val lineListHeaderCache: MutableMap> = mutableMapOf() - override fun getAnalyticsForEnrollment(enrollmentUid: String): List { + override suspend fun getAnalyticsForEnrollment(enrollmentUid: String): List { val enrollment = getEnrollment(enrollmentUid) if (enrollment?.trackedEntityInstance() == null) return emptyList() @@ -403,51 +403,51 @@ class ChartsRepositoryImpl( lineListHeaderCache.putIfAbsent(visualisationUid, trackerLineListResponse.headers) } - private fun getSettingsAnalytics(enrollment: Enrollment): List = - d2 + private suspend fun getSettingsAnalytics(enrollment: Enrollment): List { + val analyticsSettings = d2 .settingModule() .analyticsSetting() .teis() .byProgram() .eq(enrollment.program()) .blockingGet() - .let { analyticsSettings -> - analyticsTeiSettingsToGraph.map( - enrollment.trackedEntityInstance()!!, - analyticsSettings, - analyticsFilterProvider::visualizationPeriod, - analyticsFilterProvider::visualizationOrgUnits, - { dataElementUid -> - d2 - .dataElementModule() - .dataElements() - .uid(dataElementUid) - .blockingGet() - ?.displayFormName() ?: dataElementUid - }, - { indicatorUid -> - d2 - .programModule() - .programIndicators() - .uid(indicatorUid) - .blockingGet() - ?.displayName() ?: indicatorUid - }, - { nutritionGenderData -> - val genderValue = - d2 - .trackedEntityModule() - .trackedEntityAttributeValues() - .value( - nutritionGenderData.attributeUid, - enrollment.trackedEntityInstance()!!, - ).blockingGet() - nutritionGenderData.isFemale(genderValue?.value()) - }, - ) - } ?: emptyList() + if (analyticsSettings.isEmpty()) return emptyList() + return analyticsTeiSettingsToGraph.map( + enrollment.trackedEntityInstance()!!, + analyticsSettings, + analyticsFilterProvider::visualizationPeriod, + analyticsFilterProvider::visualizationOrgUnits, + { dataElementUid -> + d2 + .dataElementModule() + .dataElements() + .uid(dataElementUid) + .blockingGet() + ?.displayFormName() ?: dataElementUid + }, + { indicatorUid -> + d2 + .programModule() + .programIndicators() + .uid(indicatorUid) + .blockingGet() + ?.displayName() ?: indicatorUid + }, + { nutritionGenderData -> + val genderValue = + d2 + .trackedEntityModule() + .trackedEntityAttributeValues() + .value( + nutritionGenderData.attributeUid, + enrollment.trackedEntityInstance()!!, + ).blockingGet() + nutritionGenderData.isFemale(genderValue?.value()) + }, + ) + } - private fun getDefaultAnalytics(enrollment: Enrollment): List = + private suspend fun getDefaultAnalytics(enrollment: Enrollment): List = getRepeatableProgramStages(enrollment.program()) .map { programStage -> @@ -458,14 +458,14 @@ class ChartsRepositoryImpl( val selectedRelativePeriod = analyticsFilterProvider.visualizationPeriod( enrollment.trackedEntityInstance()!! + - programStage.uid() + - dataElement.uid(), + programStage.uid() + + dataElement.uid(), ) val selectedOrgUnits = analyticsFilterProvider.visualizationOrgUnits( enrollment.trackedEntityInstance()!! + - programStage.uid() + - dataElement.uid(), + programStage.uid() + + dataElement.uid(), ) dataElementToGraph.map( dataElement, @@ -481,14 +481,14 @@ class ChartsRepositoryImpl( val selectedRelativePeriod = analyticsFilterProvider.visualizationPeriod( enrollment.trackedEntityInstance()!! + - programStage.uid() + - programIndicator.uid(), + programStage.uid() + + programIndicator.uid(), ) val selectedOrgUnits = analyticsFilterProvider.visualizationOrgUnits( enrollment.trackedEntityInstance()!! + - programStage.uid() + - programIndicator.uid(), + programStage.uid() + + programIndicator.uid(), ) programIndicatorToGraph.map( programIndicator, @@ -619,7 +619,7 @@ class ChartsRepositoryImpl( analyticsFilterProvider.addColumnFilter( trackerVisualizationUid, columnIndex, - filterValue!!, + filterValue, ) } else { analyticsFilterProvider.removeColumnFilter(trackerVisualizationUid, columnIndex) diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/DhisAnalyticCharts.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/DhisAnalyticCharts.kt index d6c561f5e00..76c7a8d0f1a 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/DhisAnalyticCharts.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/DhisAnalyticCharts.kt @@ -18,7 +18,7 @@ class DhisAnalyticCharts override fun getVisualizationGroups(uid: String?): List = chartsRepository.getVisualizationGroups(uid) - override fun geEnrollmentCharts(enrollmentUid: String): List = chartsRepository.getAnalyticsForEnrollment(enrollmentUid) + override suspend fun geEnrollmentCharts(enrollmentUid: String): List = chartsRepository.getAnalyticsForEnrollment(enrollmentUid) override fun getProgramVisualizations( groupUid: String?, diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/di/ChartsInjector.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/di/ChartsInjector.kt index 3fc36dd9474..9b365ed6e9b 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/di/ChartsInjector.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/di/ChartsInjector.kt @@ -8,6 +8,7 @@ import dhis2.org.analytics.charts.Charts import dhis2.org.analytics.charts.ChartsRepository import dhis2.org.analytics.charts.ChartsRepositoryImpl import dhis2.org.analytics.charts.DhisAnalyticCharts +import dhis2.org.analytics.charts.domain.GetEnrollmentAnalyticsUseCase import dhis2.org.analytics.charts.data.AnalyticResources import dhis2.org.analytics.charts.mappers.AnalyticDataElementToDataElementData import dhis2.org.analytics.charts.mappers.AnalyticIndicatorToIndicatorData @@ -36,6 +37,7 @@ import javax.inject.Singleton ) interface ChartsComponent { fun charts(): Charts + fun getEnrollmentAnalyticsUseCase(): GetEnrollmentAnalyticsUseCase } @Module @@ -138,4 +140,10 @@ class ChartsModule { @Provides internal fun bindStorageFeatureImpl(analyticsCharts: DhisAnalyticCharts): Charts = analyticsCharts + + @Provides + internal fun provideGetEnrollmentAnalyticsUseCase( + chartsRepository: ChartsRepository, + dispatcherProvider: DispatcherProvider, + ): GetEnrollmentAnalyticsUseCase = GetEnrollmentAnalyticsUseCase(chartsRepository, dispatcherProvider) } diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/domain/GetEnrollmentAnalyticsUseCase.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/domain/GetEnrollmentAnalyticsUseCase.kt new file mode 100644 index 00000000000..bff08fe2811 --- /dev/null +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/domain/GetEnrollmentAnalyticsUseCase.kt @@ -0,0 +1,20 @@ +package dhis2.org.analytics.charts.domain + +import dhis2.org.analytics.charts.ChartsRepository +import dhis2.org.analytics.charts.data.Graph +import kotlinx.coroutines.withContext +import org.dhis2.commons.viewmodel.DispatcherProvider + +class GetEnrollmentAnalyticsUseCase( + private val chartsRepository: ChartsRepository, + private val dispatchers: DispatcherProvider, +) { + suspend operator fun invoke(enrollmentUid: String): Result> = + withContext(dispatchers.io()) { + try { + Result.success(chartsRepository.getAnalyticsForEnrollment(enrollmentUid)) + } catch (e: Exception) { + Result.failure(e) + } + } +} diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/AnalyticsTeiSettingsToGraph.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/AnalyticsTeiSettingsToGraph.kt index 3b25e7a3fcd..cdd8ffd7285 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/AnalyticsTeiSettingsToGraph.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/AnalyticsTeiSettingsToGraph.kt @@ -20,16 +20,16 @@ class AnalyticsTeiSettingsToGraph( private val periodStepProvider: PeriodStepProvider, private val chartCoordinatesProvider: ChartCoordinatesProvider, ) { - fun map( + suspend fun map( teiUid: String, - analytycsTeiSettings: List, + analyticsTeiSettings: List, selectedRelativePeriodProvider: (String) -> List?, selectedOrgUnitProvider: (String) -> List?, dataElementNameProvider: (String) -> String, indicatorNameProvider: (String) -> String, teiGenderProvider: (NutritionGenderData) -> Boolean, ): List = - analytycsTeiSettings.map { analyticsTeiSettings -> + analyticsTeiSettings.map { analyticsTeiSettings -> val analyticsSetting = analyticsSettingsMapper.map(analyticsTeiSettings) val selectedRelativePeriod = selectedRelativePeriodProvider(analyticsTeiSettings.uid()) val selectedOrgUnits = selectedOrgUnitProvider(analyticsTeiSettings.uid()) diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/DataElementToGraph.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/DataElementToGraph.kt index 14f5f6ae28a..ecd0098997e 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/DataElementToGraph.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/DataElementToGraph.kt @@ -13,7 +13,7 @@ class DataElementToGraph( private val periodStepProvider: PeriodStepProvider, private val chartCoordinatesProvider: ChartCoordinatesProvider, ) { - fun map( + suspend fun map( dataElement: DataElement, stageUid: String, teiUid: String, diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/ProgramIndicatorToGraph.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/ProgramIndicatorToGraph.kt index 7078afdd9f4..fef93ad9439 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/ProgramIndicatorToGraph.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/ProgramIndicatorToGraph.kt @@ -13,7 +13,7 @@ class ProgramIndicatorToGraph( private val periodStepProvider: PeriodStepProvider, private val chartCoordinatesProvider: ChartCoordinatesProvider, ) { - fun map( + suspend fun map( programIndicator: ProgramIndicator, stageUid: String, teiUid: String, diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/ChartCoordinatesProvider.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/ChartCoordinatesProvider.kt index 798f54f3c3c..d90cfb42159 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/ChartCoordinatesProvider.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/ChartCoordinatesProvider.kt @@ -6,7 +6,7 @@ import org.hisp.dhis.android.core.analytics.aggregated.MetadataItem import org.hisp.dhis.android.core.common.RelativePeriod interface ChartCoordinatesProvider { - fun dataElementCoordinates( + suspend fun dataElementCoordinates( stageUid: String, teiUid: String, dataElementUid: String, @@ -15,7 +15,7 @@ interface ChartCoordinatesProvider { isDefault: Boolean = false, ): List - fun indicatorCoordinates( + suspend fun indicatorCoordinates( stageUid: String, teiUid: String, indicatorUid: String, @@ -24,7 +24,7 @@ interface ChartCoordinatesProvider { isDefault: Boolean = false, ): List - fun nutritionCoordinates( + suspend fun nutritionCoordinates( stageUid: String, teiUid: String, zScoreValueContainerUid: String, @@ -35,7 +35,7 @@ interface ChartCoordinatesProvider { selectedOrgUnits: List?, ): List - fun pieChartCoordinates( + suspend fun pieChartCoordinates( stageUid: String, teiUid: String, dataElementUid: String, diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/ChartCoordinatesProviderImpl.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/ChartCoordinatesProviderImpl.kt index 6862fb6c474..67c2a778df6 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/ChartCoordinatesProviderImpl.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/ChartCoordinatesProviderImpl.kt @@ -21,7 +21,7 @@ class ChartCoordinatesProviderImpl( val periodStepProvider: PeriodStepProvider, val resourceManager: ResourceManager, ) : ChartCoordinatesProvider { - override fun dataElementCoordinates( + override suspend fun dataElementCoordinates( stageUid: String, teiUid: String, dataElementUid: String, @@ -65,7 +65,7 @@ class ChartCoordinatesProviderImpl( } else { periodStepProvider .getPeriodDiff( - initialPeriod!!, + initialPeriod, lineListResponse.period, ).toFloat() }, @@ -76,7 +76,7 @@ class ChartCoordinatesProviderImpl( } } - override fun indicatorCoordinates( + override suspend fun indicatorCoordinates( stageUid: String, teiUid: String, indicatorUid: String, @@ -112,7 +112,7 @@ class ChartCoordinatesProviderImpl( .value ?.toFloat() ?: Float.NaN ).isNaN() - } catch (e: java.lang.Exception) { + } catch (_: java.lang.Exception) { false } }.mapNotNull { lineListResponse -> @@ -131,7 +131,7 @@ class ChartCoordinatesProviderImpl( } else { periodStepProvider .getPeriodDiff( - initialPeriod!!, + initialPeriod, lineListResponse.period, ).toFloat() }, @@ -142,7 +142,7 @@ class ChartCoordinatesProviderImpl( } } - override fun nutritionCoordinates( + override suspend fun nutritionCoordinates( stageUid: String, teiUid: String, zScoreValueContainerUid: String, @@ -205,7 +205,7 @@ class ChartCoordinatesProviderImpl( } } - override fun pieChartCoordinates( + override suspend fun pieChartCoordinates( stageUid: String, teiUid: String, dataElementUid: String, @@ -294,11 +294,11 @@ class ChartCoordinatesProviderImpl( val formattedDateString = SimpleDateFormat("yyyy-MM-dd").format(date) val formattedDate = SimpleDateFormat("yyyy-MM-dd").parse(formattedDateString) formattedDate ?: date - } catch (e: Exception) { + } catch (_: Exception) { date } - private fun getLegend(legendUid: String?): Legend? = + private suspend fun getLegend(legendUid: String?): Legend? = legendUid?.let { d2 .legendSetModule() diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/GroupAnalyticsFragment.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/GroupAnalyticsFragment.kt index a1cf66320a1..a15accfc803 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/GroupAnalyticsFragment.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/GroupAnalyticsFragment.kt @@ -8,6 +8,9 @@ import android.view.ViewGroup import androidx.core.view.ViewCompat import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import com.github.mikephil.charting.utils.Utils import dhis2.org.R import dhis2.org.analytics.charts.data.AnalyticGroup @@ -18,6 +21,7 @@ import dhis2.org.analytics.charts.ui.di.AnalyticsFragmentModule import dhis2.org.analytics.charts.ui.dialog.SearchColumnDialog import dhis2.org.databinding.AnalyticsGroupBinding import dhis2.org.databinding.AnalyticsItemBinding +import kotlinx.coroutines.launch import org.dhis2.commons.bindings.clipWithRoundedCorners import org.dhis2.commons.bindings.scrollToPosition import org.dhis2.commons.dialogs.AlertBottomDialog @@ -220,47 +224,57 @@ class GroupAnalyticsFragment : Fragment() { savedInstanceState: Bundle?, ) { super.onViewCreated(view, savedInstanceState) - groupViewModel.chipItems.observe(viewLifecycleOwner) { chipResult -> - when { - chipResult.isSuccess -> { - val chips = chipResult.getOrDefault(emptyList()) - if (chips.isEmpty() || chips.size < MIN_SIZE_TO_SHOW) { - binding?.analyticChipGroup?.visibility = View.GONE - } else { - binding?.analyticChipGroup?.visibility = View.VISIBLE - disableToolbarElevation?.invoke() - addChips(chips) - } - } + viewLifecycleOwner.lifecycleScope.launch { + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { + launch { + groupViewModel.chipItems.collect { chipResult -> + chipResult ?: return@collect + when { + chipResult.isSuccess -> { + val chips = chipResult.getOrDefault(emptyList()) + if (chips.isEmpty() || chips.size < MIN_SIZE_TO_SHOW) { + binding?.analyticChipGroup?.visibility = View.GONE + } else { + binding?.analyticChipGroup?.visibility = View.VISIBLE + disableToolbarElevation?.invoke() + addChips(chips) + } + } - chipResult.isFailure -> { - binding?.progressLayout?.visibility = View.GONE - binding?.emptyAnalytics?.apply { - visibility = View.VISIBLE - text = getString(R.string.visualization_groups_failure) + chipResult.isFailure -> { + binding?.progressLayout?.visibility = View.GONE + binding?.emptyAnalytics?.apply { + visibility = View.VISIBLE + text = getString(R.string.visualization_groups_failure) + } + } + } + startPostponedEnterTransition() } } - } - startPostponedEnterTransition() - } - groupViewModel.analytics.observe(viewLifecycleOwner) { analytics -> - try { - when { - analytics.isSuccess -> - adapter.submitList(analytics.getOrDefault(emptyList())) { - binding?.progressLayout?.visibility = View.GONE - } + launch { + groupViewModel.analytics.collect { analytics -> + analytics ?: return@collect + try { + when { + analytics.isSuccess -> + adapter.submitList(analytics.getOrDefault(emptyList())) { + binding?.progressLayout?.visibility = View.GONE + } - analytics.isFailure -> { - binding?.progressLayout?.visibility = View.GONE - binding?.emptyAnalytics?.apply { - visibility = View.VISIBLE - text = getString(R.string.visualization_failure) + analytics.isFailure -> { + binding?.progressLayout?.visibility = View.GONE + binding?.emptyAnalytics?.apply { + visibility = View.VISIBLE + text = getString(R.string.visualization_failure) + } + } + } + } finally { + AnalyticsCountingIdlingResource.decrement() } } } - } finally { - AnalyticsCountingIdlingResource.decrement() } } } diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/GroupAnalyticsViewModel.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/GroupAnalyticsViewModel.kt index 0fa595dcd15..fe1609a3b88 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/GroupAnalyticsViewModel.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/GroupAnalyticsViewModel.kt @@ -1,19 +1,20 @@ package dhis2.org.analytics.charts.ui -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dhis2.org.analytics.charts.Charts import dhis2.org.analytics.charts.data.AnalyticGroup +import dhis2.org.analytics.charts.domain.GetEnrollmentAnalyticsUseCase import dhis2.org.analytics.charts.idling.AnalyticsCountingIdlingResource -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.async +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import org.dhis2.commons.matomo.Actions import org.dhis2.commons.matomo.Categories import org.dhis2.commons.matomo.Labels import org.dhis2.commons.matomo.MatomoAnalyticsController +import org.dhis2.commons.viewmodel.DispatcherProvider import org.hisp.dhis.android.core.common.RelativePeriod import org.hisp.dhis.android.core.organisationunit.OrganisationUnit import timber.log.Timber @@ -25,11 +26,13 @@ class GroupAnalyticsViewModel( private val uid: String?, private val charts: Charts, private val matomoAnalyticsController: MatomoAnalyticsController, + private val getEnrollmentAnalyticsUseCase: GetEnrollmentAnalyticsUseCase, + private val dispatchers: DispatcherProvider, ) : ViewModel() { - private val _chipItems = MutableLiveData>>() - val chipItems: LiveData>> = _chipItems - private val _analytics = MutableLiveData>>() - val analytics: LiveData>> = _analytics + private val _chipItems = MutableStateFlow>?>(null) + val chipItems: StateFlow>?> = _chipItems.asStateFlow() + private val _analytics = MutableStateFlow>?>(null) + val analytics: StateFlow>?> = _analytics.asStateFlow() private var currentGroup: String? = null init { @@ -44,19 +47,20 @@ class GroupAnalyticsViewModel( } private fun fetchAnalyticsGroup(onSuccess: () -> Unit) { - viewModelScope.launch { - val result = - async(context = Dispatchers.IO) { - charts.getVisualizationGroups(uid).map { - AnalyticGroup(it.id(), it.name()) - } - } + AnalyticsCountingIdlingResource.increment() + viewModelScope.launch(dispatchers.io()) { try { - _chipItems.value = Result.success(result.await()) + val groups = charts.getVisualizationGroups(uid).map { + AnalyticGroup(it.id(), it.name()) + } + _chipItems.value = Result.success(groups) onSuccess() } catch (e: Exception) { _chipItems.value = Result.failure(e) } + finally { + AnalyticsCountingIdlingResource.decrement() + } } } @@ -138,50 +142,55 @@ class GroupAnalyticsViewModel( fun fetchAnalytics(groupUid: String?) { AnalyticsCountingIdlingResource.increment() currentGroup = groupUid - viewModelScope.launch { - val result = - async(context = Dispatchers.IO) { - when (mode) { - AnalyticMode.ENROLLMENT -> - uid?.let { - charts - .geEnrollmentCharts(uid) - .map { ChartModel(it) } - } ?: emptyList() - - AnalyticMode.TRACKER_PROGRAM -> - uid?.let { - charts - .getProgramVisualizations(groupUid, uid) - .map { ChartModel(it) } - } ?: emptyList() - - AnalyticMode.EVENT_PROGRAM -> - uid?.let { - charts - .getProgramVisualizations(groupUid, uid) - .map { ChartModel(it) } - } ?: emptyList() - - AnalyticMode.HOME -> - charts - .getHomeVisualizations(groupUid) - .map { ChartModel(it) } - - AnalyticMode.DATASET -> - uid?.let { - charts - .getDataSetVisualizations(groupUid, uid) - .map { ChartModel(it) } - } ?: emptyList() + when (mode) { + AnalyticMode.ENROLLMENT -> + viewModelScope.launch { + uid?.let { + getEnrollmentAnalyticsUseCase(uid) + .onSuccess { graphs -> + _analytics.value = Result.success(graphs.map { ChartModel(it) }) + }.onFailure { e -> + Timber.e(e) + _analytics.value = Result.failure(e) + } + } ?: run { + _analytics.value = Result.success(emptyList()) + } + } + + else -> + viewModelScope.launch(dispatchers.io()) { + try { + val result = when (mode) { + AnalyticMode.TRACKER_PROGRAM -> + uid?.let { + charts.getProgramVisualizations(groupUid, uid) + .map { ChartModel(it) } + } ?: emptyList() + + AnalyticMode.EVENT_PROGRAM -> + uid?.let { + charts.getProgramVisualizations(groupUid, uid) + .map { ChartModel(it) } + } ?: emptyList() + + AnalyticMode.HOME -> + charts.getHomeVisualizations(groupUid).map { ChartModel(it) } + + AnalyticMode.DATASET -> + uid?.let { + charts.getDataSetVisualizations(groupUid, uid) + .map { ChartModel(it) } + } ?: emptyList() + + AnalyticMode.ENROLLMENT -> emptyList() + } + _analytics.value = Result.success(result) + } catch (e: Exception) { + Timber.e(e) + _analytics.value = Result.failure(e) } } - try { - _analytics.value = Result.success(result.await()) - } catch (e: Exception) { - Timber.e(e) - _analytics.value = Result.failure(e) - } } } diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/GroupAnalyticsViewModelFactory.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/GroupAnalyticsViewModelFactory.kt index 8ff1cd01259..11f9157b0e6 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/GroupAnalyticsViewModelFactory.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/GroupAnalyticsViewModelFactory.kt @@ -3,13 +3,17 @@ package dhis2.org.analytics.charts.ui import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import dhis2.org.analytics.charts.Charts +import dhis2.org.analytics.charts.domain.GetEnrollmentAnalyticsUseCase import org.dhis2.commons.matomo.MatomoAnalyticsController +import org.dhis2.commons.viewmodel.DispatcherProvider class GroupAnalyticsViewModelFactory( private val mode: AnalyticMode, private val uid: String?, private val charts: Charts, private val matomoAnalyticsController: MatomoAnalyticsController, + private val getEnrollmentAnalyticsUseCase: GetEnrollmentAnalyticsUseCase, + private val dispatchers: DispatcherProvider, ) : ViewModelProvider.Factory { override fun create(modelClass: Class): T = GroupAnalyticsViewModel( @@ -17,5 +21,7 @@ class GroupAnalyticsViewModelFactory( uid, charts, matomoAnalyticsController, + getEnrollmentAnalyticsUseCase, + dispatchers, ) as T } diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/di/AnalyticsFragmentInjector.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/di/AnalyticsFragmentInjector.kt index 94b65a9a769..d581d40b8a7 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/di/AnalyticsFragmentInjector.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/di/AnalyticsFragmentInjector.kt @@ -4,10 +4,12 @@ import dagger.Module import dagger.Provides import dagger.Subcomponent import dhis2.org.analytics.charts.Charts +import dhis2.org.analytics.charts.domain.GetEnrollmentAnalyticsUseCase import dhis2.org.analytics.charts.ui.AnalyticMode import dhis2.org.analytics.charts.ui.GroupAnalyticsFragment import dhis2.org.analytics.charts.ui.GroupAnalyticsViewModelFactory import org.dhis2.commons.matomo.MatomoAnalyticsController +import org.dhis2.commons.viewmodel.DispatcherProvider @Subcomponent(modules = [AnalyticsFragmentModule::class]) interface AnalyticsFragmentComponent { @@ -23,5 +25,15 @@ class AnalyticsFragmentModule( fun provideViewModelFactory( charts: Charts, matomoAnalyticsController: MatomoAnalyticsController, - ): GroupAnalyticsViewModelFactory = GroupAnalyticsViewModelFactory(mode, uid, charts, matomoAnalyticsController) + getEnrollmentAnalyticsUseCase: GetEnrollmentAnalyticsUseCase, + dispatcherProvider: DispatcherProvider, + ): GroupAnalyticsViewModelFactory = + GroupAnalyticsViewModelFactory( + mode, + uid, + charts, + matomoAnalyticsController, + getEnrollmentAnalyticsUseCase, + dispatcherProvider, + ) } diff --git a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ChartsRepositoryTest.kt b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ChartsRepositoryTest.kt index f9f6a6001eb..b3fcf716639 100644 --- a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ChartsRepositoryTest.kt +++ b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ChartsRepositoryTest.kt @@ -44,6 +44,7 @@ import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock import org.mockito.kotlin.verify import org.mockito.kotlin.whenever +import kotlinx.coroutines.test.runTest import java.util.Date class ChartsRepositoryTest { @@ -67,7 +68,7 @@ class ChartsRepositoryTest { ) @Test - fun `Should return empty list if enrollment teiUid is null`() { + fun `Should return empty list if enrollment teiUid is null`() = runTest { whenever( d2 .enrollmentModule() @@ -89,7 +90,7 @@ class ChartsRepositoryTest { } @Test - fun `Should get analytics if settings is not null`() { + fun `Should get analytics if settings is not null`() = runTest { mockEnrollmentCall() mockAnalyticsSettingsCall(mockedAnalyticsSettings()) whenever( @@ -105,7 +106,7 @@ class ChartsRepositoryTest { } @Test - fun `Should get default analytics if settings is null`() { + fun `Should get default analytics if settings is null`() = runTest { mockEnrollmentCall() mockAnalyticsSettingsCall(null) mockRepeatableStagesCall() @@ -136,7 +137,7 @@ class ChartsRepositoryTest { } @Test - fun `Should get default analytics if settings is null and return only dataElement graphs`() { + fun `Should get default analytics if settings is null and return only dataElement graphs`() = runTest { mockEnrollmentCall() mockAnalyticsSettingsCall(null) mockRepeatableStagesCall() @@ -154,7 +155,7 @@ class ChartsRepositoryTest { } @Test - fun `Should get default analytics if settings is null and return only indicator graphs`() { + fun `Should get default analytics if settings is null and return only indicator graphs`() = runTest { mockEnrollmentCall() mockAnalyticsSettingsCall(null) mockRepeatableStagesCall() @@ -180,7 +181,7 @@ class ChartsRepositoryTest { } @Test - fun `Should get default analytics if settings is null and return empty list`() { + fun `Should get default analytics if settings is null and return empty list`() = runTest { mockEnrollmentCall() mockAnalyticsSettingsCall(null) mockRepeatableStagesCall() diff --git a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/domain/GetEnrollmentAnalyticsUseCaseTest.kt b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/domain/GetEnrollmentAnalyticsUseCaseTest.kt new file mode 100644 index 00000000000..ae0c5364e57 --- /dev/null +++ b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/domain/GetEnrollmentAnalyticsUseCaseTest.kt @@ -0,0 +1,74 @@ +package dhis2.org.analytics.charts.domain + +import dhis2.org.analytics.charts.ChartsRepository +import dhis2.org.analytics.charts.data.Graph +import dhis2.org.analytics.charts.data.ChartType +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.runTest +import org.dhis2.commons.viewmodel.DispatcherProvider +import org.hisp.dhis.android.core.period.PeriodType +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Test +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.doThrow +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever + +@OptIn(ExperimentalCoroutinesApi::class) +class GetEnrollmentAnalyticsUseCaseTest { + + private val testDispatcher = UnconfinedTestDispatcher() + + private val dispatcherProvider: DispatcherProvider = mock { + on { io() } doReturn testDispatcher + on { computation() } doReturn testDispatcher + on { ui() } doReturn testDispatcher + } + + private val chartsRepository: ChartsRepository = mock() + + private val useCase = GetEnrollmentAnalyticsUseCase(chartsRepository, dispatcherProvider) + + @Test + fun `Should return success result with graph list when repository succeeds`() = runTest { + val expectedGraphs = listOf( + Graph( + title = "graph_1", + series = emptyList(), + periodToDisplayDefault = null, + eventPeriodType = PeriodType.Daily, + periodStep = 0L, + chartType = ChartType.LINE_CHART, + ), + ) + whenever(chartsRepository.getAnalyticsForEnrollment("enrollmentUid")) doReturn expectedGraphs + + val result = useCase("enrollmentUid") + + assertTrue(result.isSuccess) + assertEquals(expectedGraphs, result.getOrNull()) + } + + @Test + fun `Should return failure result when repository throws exception`() = runTest { + val exception = RuntimeException("Repository error") + whenever(chartsRepository.getAnalyticsForEnrollment("enrollmentUid")) doThrow exception + + val result = useCase("enrollmentUid") + + assertTrue(result.isFailure) + assertEquals(exception, result.exceptionOrNull()) + } + + @Test + fun `Should execute on io dispatcher`() = runTest { + whenever(chartsRepository.getAnalyticsForEnrollment("enrollmentUid")) doReturn emptyList() + + useCase("enrollmentUid") + + // Verifying io() was called means the use case used the injected dispatcher + org.mockito.kotlin.verify(dispatcherProvider).io() + } +} diff --git a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/providers/ChartCoordinatesProviderImplTest.kt b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/providers/ChartCoordinatesProviderImplTest.kt index 8522e0f6747..75bd4006f54 100644 --- a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/providers/ChartCoordinatesProviderImplTest.kt +++ b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/providers/ChartCoordinatesProviderImplTest.kt @@ -12,6 +12,7 @@ import org.mockito.Mockito import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock import org.mockito.kotlin.whenever +import kotlinx.coroutines.test.runTest import java.util.Date class ChartCoordinatesProviderImplTest { @@ -22,7 +23,7 @@ class ChartCoordinatesProviderImplTest { ChartCoordinatesProviderImpl(d2, periodStepProvider, resourceManager) @Test - fun `Should get coordinates for data elements`() { + fun `Should get coordinates for data elements`() = runTest { mockedLineListResponse(false) val result = coordinatesProvider.dataElementCoordinates( @@ -38,7 +39,7 @@ class ChartCoordinatesProviderImplTest { } @Test - fun `Should return empty coordinates for data elements`() { + fun `Should return empty coordinates for data elements`() = runTest { mockedLineListResponse(true) val result = coordinatesProvider.dataElementCoordinates( @@ -54,7 +55,7 @@ class ChartCoordinatesProviderImplTest { } @Test - fun `Should get coordinates for indicators`() { + fun `Should get coordinates for indicators`() = runTest { mockedIndicatorLineListResponse(false) val result = coordinatesProvider.indicatorCoordinates( @@ -70,7 +71,7 @@ class ChartCoordinatesProviderImplTest { } @Test - fun `Should return empty coordinates for indicator`() { + fun `Should return empty coordinates for indicator`() = runTest { mockedIndicatorLineListResponse(true) val result = coordinatesProvider.indicatorCoordinates( From 638adaa5489da7f9683308dfd9dd849d8f471248 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Wed, 1 Apr 2026 10:20:36 +0200 Subject: [PATCH 124/260] docs: update developer and agent guidelines for KMP testing [skip size] (#4775) * docs: update developer and agent guidelines for KMP testing * build: relocate android-testing skill to .claude directory and update CLAUDE.md * docs: update developer guides and testing documentation --- .claude/skills/android-testing/SKILL.md | 220 ++++++++ .github/agents/testing.agent.md | 650 ++++++++++++------------ AGENTS.md | 525 +++++++------------ CLAUDE.md | 4 + 4 files changed, 717 insertions(+), 682 deletions(-) create mode 100644 .claude/skills/android-testing/SKILL.md diff --git a/.claude/skills/android-testing/SKILL.md b/.claude/skills/android-testing/SKILL.md new file mode 100644 index 00000000000..04fd703ca63 --- /dev/null +++ b/.claude/skills/android-testing/SKILL.md @@ -0,0 +1,220 @@ +--- +name: android-testing +description: > + Guidelines for writing unit tests (mockito-kotlin, Turbine, runTest) and + UI instrumented tests (Robot pattern, CoroutineTracker, Compose test tags) + for the DHIS2 Android KMP project. Load this when creating, fixing, or + reviewing any test in the codebase. +--- + +# DHIS2 Android Testing Guidelines + +## Testing Stack + +- **Unit Tests**: `mockito-kotlin` (`mock()`, `whenever()`, `verify()`), JUnit / `kotlin.test` +- **Flow tests**: Turbine (`app.cash.turbine`) + `kotlinx-coroutines-test` +- **UI Tests**: Compose Testing + Espresso with Robot pattern +- **Test locations**: + - `commonTest/` — platform-agnostic unit tests (`kotlin.test` annotations: `@Test`, `@BeforeTest`) + - `androidUnitTest/` — Android-specific unit tests (JUnit `@Test`) + - `androidInstrumentedTest/` / `androidTest/` — UI/instrumented tests + +## Run Commands + +```bash +# All unit tests +./gradlew testDebugUnitTest testDhis2DebugUnitTest testAndroidHostTest + +# Single KMP module test class (commonTest source set) +./gradlew :login:testAndroidHostTest --tests "org.dhis2.mobile.login.main.ui.viewmodel.LoginViewModelTest" + +# Single legacy Android module test class +./gradlew :form:testDebugUnitTest --tests "org.dhis2.form.ui.FormViewModelTest" + +# Single test method (commonTest source set) +./gradlew :login:testAndroidHostTest --tests "org.dhis2.mobile.login.main.ui.viewmodel.LoginViewModelTest.initial screen is set correctly when starting" +``` + +## Critical Rule: No Hard-Coded Delays + +ViewModels use `launchUseCase { }` which wraps `CoroutineTracker`. Espresso's +`IdlingResource` automatically waits for tracked coroutines. `Thread.sleep()` and +hard-coded timeouts are **forbidden**. + +```kotlin +// ✅ CORRECT — IdlingResource waits automatically +@Test +fun shouldLoadData() { + exampleRobot(composeTestRule) { + clickLoadButton() + verifyDataDisplayed() // no delay needed + } +} + +// ❌ WRONG +@Test +fun shouldLoadData() { + clickLoadButton() + Thread.sleep(2000) // FORBIDDEN + verifyDataDisplayed() +} +``` + +## Mocking: mockito-kotlin only + +Use `mock()`, `whenever()`, `verify()` from `org.mockito.kotlin`. Do **not** use MockK. + +```kotlin +import org.mockito.kotlin.mock +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever +``` + +## Unit Test Patterns + +### Use Case test +```kotlin +class SavePinUseCaseTest { + private val repository: SessionRepository = mock() + private val useCase = SavePinUseCase(repository) + + @Test + fun `should return success when pin is saved`() = runTest { + whenever(repository.savePin("1234")).thenReturn(Unit) + + val result = useCase("1234") + + assertTrue(result.isSuccess) + verify(repository).savePin("1234") + } +} +``` + +### ViewModel test +```kotlin +class ExampleViewModelTest { + private val useCase: GetDataUseCase = mock() + private val testDispatcher = UnconfinedTestDispatcher() + private lateinit var viewModel: ExampleViewModel + + @BeforeTest + fun setUp() { + Dispatchers.setMain(testDispatcher) + } + + @AfterTest + fun tearDown() { + Dispatchers.resetMain() + } + + @Test + fun `should emit success state when use case succeeds`() = runTest { + whenever(useCase()).thenReturn(Result.success(flowOf(listOf(item)))) + + viewModel = ExampleViewModel(useCase) + + viewModel.uiState.test { + assertEquals(UiState.Success(listOf(item)), awaitItem()) + } + } +} +``` + +### Repository test +```kotlin +class ExampleRepositoryTest { + // D2 chains calls across multiple intermediate objects — RETURNS_DEEP_STUBS is required + // so that d2.someModule().someRepository().blockingGet() doesn't NPE on the intermediates. + private val d2: D2 = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) + private val domainErrorMapper: DomainErrorMapper = mock() + private val repository = ExampleRepositoryImpl(d2, domainErrorMapper) + + @Test + fun `should map D2Error to domain error`() = runTest { + val d2Error = D2Error.builder().errorCode(D2ErrorCode.API_RESPONSE_PROCESS_ERROR).build() + whenever(d2.exampleModule().examples().blockingGet()).thenThrow(d2Error) + whenever(domainErrorMapper.mapToDomainError(d2Error)).thenReturn(DomainException("error")) + + val result = runCatching { repository.getData() } + + assertTrue(result.isFailure) + verify(domainErrorMapper).mapToDomainError(d2Error) + } +} +``` + +## UI Tests: Robot Pattern + +All UI tests go in `androidInstrumentedTest/`. Always use the Robot pattern. + +```kotlin +fun exampleRobot(rule: ComposeTestRule, body: ExampleRobot.() -> Unit) = + ExampleRobot(rule).apply { body() } + +class ExampleRobot(val rule: ComposeTestRule) : BaseRobot() { + fun typeUsername(username: String) { + rule.waitUntilExactlyOneExists(hasTestTag(USERNAME_TAG), TIMEOUT) + rule.onNodeWithTag(USERNAME_TAG).performClick() + rule.onAllNodesWithTag("INPUT_TEXT_FIELD")[0].performTextInput(username) + } + + fun clickSubmitButton() { + rule.waitUntilExactlyOneExists(hasTestTag(SUBMIT_TAG), TIMEOUT) + rule.onNodeWithTag(SUBMIT_TAG).performClick() + } +} + +class ExampleTest : BaseTest() { + @get:Rule val rule = createComposeRule() + + @Test + fun shouldPerformSuccessfulAction() { + mockWebServerRobot.addResponse(GET, "/api/endpoint", MOCK_RESPONSE, 200) + exampleRobot(rule) { + typeUsername("user") + clickSubmitButton() + verifySuccessMessageDisplayed() + } + cleanDatabase() + } +} +``` + +## Test Tags + +Export constants from the screen file. Format: `{SCREEN}_{COMPONENT}_TAG`. + +```kotlin +const val LOGIN_BUTTON_TAG = "LOGIN_BUTTON_TAG" +const val USERNAME_INPUT_TAG = "USERNAME_INPUT_TAG" + +@Composable +fun LoginScreen() { + InputField(modifier = Modifier.testTag(USERNAME_INPUT_TAG)) + Button(modifier = Modifier.testTag(LOGIN_BUTTON_TAG)) { ... } +} +``` + +## DHIS2 Design System Inputs + +DHIS2 input components are composite. Click the wrapper to focus, then target the +inner `"INPUT_TEXT_FIELD"` node. Use `performTextInput()`, never `performTextReplacement()`. + +```kotlin +// ✅ CORRECT +rule.onNodeWithTag(USERNAME_TAG).performClick() +rule.onAllNodesWithTag("INPUT_TEXT_FIELD")[0].performTextInput(username) + +// ❌ WRONG +rule.onNodeWithTag(USERNAME_TAG).performTextReplacement(username) +``` + +## Common Mistakes to Avoid + +- Using `Thread.sleep()` or any hard-coded delays +- Using MockK (`mockk()`, `every {}`, `coEvery {}`) — use mockito-kotlin instead +- Using `performTextReplacement()` on DHIS2 design system components +- Not exporting test tag constants from screen files +- Not extending `BaseRobot` for robot classes +- Not cleaning up after tests (`cleanDatabase()`, clear preferences) +- Testing implementation details instead of user flows diff --git a/.github/agents/testing.agent.md b/.github/agents/testing.agent.md index fd9dd950239..df73f8d9888 100644 --- a/.github/agents/testing.agent.md +++ b/.github/agents/testing.agent.md @@ -10,335 +10,321 @@ description: Agent expert on Android testing # DHIS2 Android Testing Expert Agent - You are an expert testing engineer specializing in the DHIS2 Android Capture - App. Your role is to create, maintain, and improve tests following the project's - strict testing guidelines and architecture patterns. - - Project Context - - This is a Kotlin Multiplatform (KMP) project migrating to Compose Multiplatform, - targeting Android, iOS, and Desktop platforms. The app uses: - - - DHIS2 Android SDK (org.hisp.dhis.android.core.*) for all data operations - - DHIS2 Mobile UI (org.hisp.dhis.mobile.ui.designsystem.*) design system - - Koin for dependency injection - - MVVM architecture with ViewModels, Use Cases, and Repositories - - Coroutines and Flow for async operations - - Testing Stack - - - Unit Tests: MockK for mocking, JUnit - - UI Tests: Compose Testing, Espresso with Robot pattern - - Test Locations: - - commonTest/ - Platform-agnostic tests - - androidUnitTest/ - Android unit tests - - androidInstrumentedTest/ - UI/instrumented tests - - Critical Testing Rules - - Async Handling - NEVER USE HARD-CODED DELAYS - - CRITICAL: Use CoroutineTracker with launchUseCase for all async operations in - tests: - - - ViewModels use launchUseCase { } extension which increments/decrements - CoroutineTracker - - Espresso's IdlingResource automatically waits for tracked operations - - This enables fast, reliable tests without Thread.sleep() or manual waits - - NEVER write Thread.sleep(), delay(), or hard-coded timeouts in tests - - // ✅ CORRECT - ViewModel uses launchUseCase - class ExampleViewModel(private val useCase: GetDataUseCase) : ViewModel() { - fun loadData() { - launchUseCase { // Automatically tracked - val result = getDataUseCase() - // ... handle result - } - } - } - - // ✅ CORRECT - Test waits automatically via IdlingResource - @Test - fun shouldLoadData() { - exampleRobot(composeTestRule) { - clickLoadButton() - // IdlingResource waits for launchUseCase to complete - verifyDataDisplayed() // No delay needed! - } - } - - // ❌ WRONG - Never do this - @Test - fun shouldLoadData() { - clickLoadButton() - Thread.sleep(2000) // NEVER DO THIS - verifyDataDisplayed() - } - - UI Testing Guidelines - Robot Pattern - - Location: All UI tests go in androidInstrumentedTest/ - - Pattern: Use Robot pattern for all UI interactions: - - // Robot function wrapper - fun exampleRobot( - composeTestRule: ComposeTestRule, - robotBody: ExampleRobot.() -> Unit - ) { - ExampleRobot(composeTestRule).apply { robotBody() } - } - - // Robot class extending BaseRobot - class ExampleRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { - fun typeUsername(username: String) { - composeTestRule.waitUntilExactlyOneExists(hasTestTag(USERNAME_TAG), TIMEOUT) - composeTestRule.onNodeWithTag(USERNAME_TAG).performClick() - - composeTestRule.onAllNodesWithTag("INPUT_TEXT_FIELD")[0].performTextInput(username) - } - - fun clickSubmitButton() { - composeTestRule.waitUntilExactlyOneExists(hasTestTag(SUBMIT_TAG), TIMEOUT) - composeTestRule.onNodeWithTag(SUBMIT_TAG).performClick() - } - - fun verifySuccessMessageDisplayed() { - composeTestRule.waitUntilExactlyOneExists(hasTestTag(SUCCESS_TAG), TIMEOUT) - } - } - - Test Structure: - - class ExampleTest : BaseTest() { - @get:Rule - val composeTestRule = createComposeRule() - - @Test - fun shouldPerformSuccessfulAction() { - // Setup mocks - mockWebServerRobot.addResponse(GET, "/api/endpoint", MOCK_RESPONSE, 200) - - // Execute test using robot - exampleRobot(composeTestRule) { - typeUsername("user") - clickSubmitButton() - verifySuccessMessageDisplayed() - } - - // Cleanup - cleanDatabase() - } - } - - Test Tags for Compose UI - - ALWAYS add test tags to interactive components: - - // ✅ In the Screen composable - export tag constants - const val LOGIN_BUTTON_TAG = "LOGIN_BUTTON_TAG" - const val USERNAME_INPUT_TAG = "USERNAME_INPUT_TAG" - - @Composable - fun LoginScreen() { - InputField( - modifier = Modifier.testTag(USERNAME_INPUT_TAG) - ) - Button( - modifier = Modifier.testTag(LOGIN_BUTTON_TAG) - ) - } - - Format: {SCREEN}_{COMPONENT}_TAG (e.g., LOGIN_BUTTON_TAG, HOME_MENU_TAG) - - DHIS2 Design System Components - - DHIS2 components are composite. Special handling required: - - // ✅ CORRECT - For InputField and similar components - fun typeUsername(username: String) { - // 1. Click wrapper to focus - composeTestRule.onNodeWithTag(USERNAME_TAG).performClick() - - // 2. Find inner INPUT_TEXT_FIELD - composeTestRule.onAllNodesWithTag("INPUT_TEXT_FIELD")[0] - .performTextInput(username) // Use performTextInput, NOT performTextReplacement - } - - // ❌ WRONG - fun typeUsername(username: String) { - composeTestRule.onNodeWithTag(USERNAME_TAG) - .performTextReplacement(username) // Won't work with composite components - } - - Mock Server Usage - - Use MockWebServerRobot for API mocking: - - @Test - fun shouldHandleApiResponse() { - // Setup mock response - mockWebServerRobot.addResponse( - method = GET, - path = "/api/dataElements", - response = MOCK_DATA_ELEMENTS_JSON, - responseCode = 200 - ) - - // Run test - exampleRobot(composeTestRule) { - clickSyncButton() - verifyDataSynced() - } - } - - Best Practices Checklist - - - ✅ Use waitUntilExactlyOneExists() before interacting with elements - - ✅ Robot methods have descriptive names (clickLoginButton(), not click()) - - ✅ Keep robots focused on actions, separate assertion methods - - ✅ Test user flows, not isolated components - - ✅ Mock all external dependencies (network, SDK, databases) - - ✅ Clean up after tests (call cleanDatabase(), clear preferences) - - ❌ NEVER use Thread.sleep() or hard-coded delays - - ✅ Use performTextInput() for DHIS2 design system inputs - - ✅ Export test tag constants from screen files - - Unit Testing Guidelines - - Repository Tests - - Mock DHIS2 SDK components and DomainErrorMapper: - - class ExampleRepositoryTest { - private val d2: D2 = mockk() - private val domainErrorMapper: DomainErrorMapper = mockk() - private val repository = ExampleRepositoryImpl(d2, domainErrorMapper) - - @Test - fun `should map SDK data to domain models`() = runTest { - // Given - val sdkData = mockk>() - every { d2.exampleModule().examples().get() } returns sdkData - - // When - val result = repository.getData() - - // Then - verify { d2.exampleModule().examples().get() } - // Assert domain mapping - } - - @Test - fun `should map D2Error to domain error`() = runTest { - // Given - val d2Error = - D2Error.builder().errorCode(D2ErrorCode.API_RESPONSE_PROCESS_ERROR).build() - every { d2.exampleModule().examples().get() } throws d2Error - every { domainErrorMapper.mapToDomainError(d2Error) } returns - DomainException("Mapped error") - - // When/Then - assertThrows { - repository.getData() - } - verify { domainErrorMapper.mapToDomainError(d2Error) } - } - } - - ViewModel Tests - - Test state transitions and use case coordination: - - class ExampleViewModelTest { - private val getDataUseCase: GetDataUseCase = mockk() - private lateinit var viewModel: ExampleViewModel - - @Test - fun `should emit success state when use case succeeds`() = runTest { - // Given - val data = listOf(ExampleData("test")) - coEvery { getDataUseCase() } returns Result.success(flowOf(data)) - - // When - viewModel = ExampleViewModel(getDataUseCase) - - // Then - assertEquals(UiState.Success(data), viewModel.uiState.value) - } - } - - Use Case Tests - - Test business logic and error handling: - - class GetDataUseCaseTest { - private val repository: ExampleRepository = mockk() - private val useCase = GetDataUseCase(repository) - - @Test - fun `should filter invalid data`() = runTest { - // Given - val allData = listOf( - ExampleData(isValid = true), - ExampleData(isValid = false) - ) - coEvery { repository.getData() } returns flowOf(allData) - - // When - val result = useCase(Unit) - - // Then - result.onSuccess { flow -> - flow.collect { data -> - assertTrue(data.all { it.isValid }) - } - } - } - } - - Test Organization - - modulekmm/ - ├── src/ - │ ├── commonTest/kotlin/ # Shared unit tests - │ │ ├── domain/ # Use case tests - │ │ ├── data/ # Repository interface tests - │ ├── androidUnitTest/kotlin/ # Android-specific unit tests - │ │ ├── data/ # Repository implementation tests - │ │ ├── ui/ # ViewModel tests - │ ├── androidInstrumentedTest/ # UI tests with Robot pattern - │ │ ├── robots/ # Robot classes - │ │ ├── tests/ # Test classes - - When Writing Tests - - - Identify test type: Unit (repository, use case, ViewModel) or UI (instrumented) - - For UI tests: Always use Robot pattern, export test tags, use CoroutineTracker - - For unit tests: Mock dependencies with MockK, test business logic and mappings - - Mock external dependencies: SDK, network, database - - Clean up: Database, preferences, mock servers - - Never delay: Trust CoroutineTracker and IdlingResource - - Common Mistakes to Avoid - - ❌ Using Thread.sleep() or hard-coded delays ❌ Using performTextReplacement() on - DHIS2 design system components ❌ Forgetting to export test tag constants ❌ Not - extending BaseRobot for robot classes ❌ Not cleaning up after tests ❌ Testing - implementation details instead of user flows ❌ Forgetting to mock external - dependencies - - Your Responsibilities - - When asked to create or fix tests: - - - Analyze the component/feature being tested - - Determine test type (unit vs UI) - - Create/update test following all guidelines above - - Ensure proper mocking, async handling, and cleanup - - Verify test follows Robot pattern (for UI) or proper structure (for unit) - - Add test tags to components if missing - - Run tests to verify they pass - - You are the testing expert. Write clean, maintainable, reliable tests that - follow DHIS2 project standards. +You are an expert testing engineer specializing in the DHIS2 Android Capture App. +Your role is to create, maintain, and improve tests following the project's strict +testing guidelines and architecture patterns. + +## Project Context + +This is a Kotlin Multiplatform (KMP) project migrating to Compose Multiplatform, +targeting Android, iOS, and Desktop platforms. The app uses: + +- DHIS2 Android SDK (`org.hisp.dhis.android.core.*`) for all data operations +- DHIS2 Mobile UI (`org.hisp.dhis.mobile.ui.designsystem.*`) design system +- Koin for dependency injection +- MVVM architecture with ViewModels, Use Cases, and Repositories +- Coroutines and Flow for async operations + +## Testing Stack + +- **Unit Tests**: `mockito-kotlin` for mocking (`mock()`, `whenever()`, `verify()`), JUnit / `kotlin.test` +- **Flow tests**: Turbine (`app.cash.turbine`) + `kotlinx-coroutines-test` +- **UI Tests**: Compose Testing + Espresso with Robot pattern +- **Test locations**: + - `commonTest/` — platform-agnostic unit tests (use `kotlin.test` annotations) + - `androidUnitTest/` — Android-specific unit tests (use `@Test` from JUnit) + - `androidInstrumentedTest/` / `androidTest/` — UI/instrumented tests + +## Run Commands + +```bash +# All unit tests +./gradlew testDebugUnitTest testDhis2DebugUnitTest testAndroidHostTest + +# Single KMP module test class +./gradlew :login:testAndroidDebugUnitTest --tests "org.dhis2.mobile.login.main.ui.viewmodel.LoginViewModelTest" + +# Single legacy Android module test class +./gradlew :form:testDebugUnitTest --tests "org.dhis2.form.ui.FormViewModelTest" + +# Single test method +./gradlew :login:testAndroidDebugUnitTest --tests "org.dhis2.mobile.login.main.ui.viewmodel.LoginViewModelTest.initial screen is set correctly when starting" +``` + +## Critical Testing Rules + +### Async Handling — NEVER use hard-coded delays + +ViewModels use `launchUseCase { }` which wraps `CoroutineTracker`. Espresso's +`IdlingResource` automatically waits for tracked coroutines to complete. This makes +`Thread.sleep()` and hard-coded timeouts unnecessary and forbidden. + +```kotlin +// ✅ CORRECT — ViewModel uses launchUseCase +class ExampleViewModel(private val useCase: GetDataUseCase) : ViewModel() { + fun loadData() { + launchUseCase { // increments/decrements CoroutineTracker automatically + val result = useCase() + // ... handle result + } + } +} + +// ✅ CORRECT — Test waits automatically via IdlingResource +@Test +fun shouldLoadData() { + exampleRobot(composeTestRule) { + clickLoadButton() + verifyDataDisplayed() // no delay needed + } +} + +// ❌ WRONG — never do this +@Test +fun shouldLoadData() { + clickLoadButton() + Thread.sleep(2000) // FORBIDDEN + verifyDataDisplayed() +} +``` + +## UI Testing Guidelines — Robot Pattern + +All UI tests go in `androidInstrumentedTest/`. Always use the Robot pattern. + +```kotlin +// Robot function wrapper +fun exampleRobot( + composeTestRule: ComposeTestRule, + robotBody: ExampleRobot.() -> Unit, +) { + ExampleRobot(composeTestRule).apply { robotBody() } +} + +// Robot class extending BaseRobot +class ExampleRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { + fun typeUsername(username: String) { + composeTestRule.waitUntilExactlyOneExists(hasTestTag(USERNAME_TAG), TIMEOUT) + composeTestRule.onNodeWithTag(USERNAME_TAG).performClick() + composeTestRule.onAllNodesWithTag("INPUT_TEXT_FIELD")[0].performTextInput(username) + } + + fun clickSubmitButton() { + composeTestRule.waitUntilExactlyOneExists(hasTestTag(SUBMIT_TAG), TIMEOUT) + composeTestRule.onNodeWithTag(SUBMIT_TAG).performClick() + } + + fun verifySuccessMessageDisplayed() { + composeTestRule.waitUntilExactlyOneExists(hasTestTag(SUCCESS_TAG), TIMEOUT) + } +} + +// Test class +class ExampleTest : BaseTest() { + @get:Rule + val composeTestRule = createComposeRule() + + @Test + fun shouldPerformSuccessfulAction() { + mockWebServerRobot.addResponse(GET, "/api/endpoint", MOCK_RESPONSE, 200) + + exampleRobot(composeTestRule) { + typeUsername("user") + clickSubmitButton() + verifySuccessMessageDisplayed() + } + + cleanDatabase() + } +} +``` + +### Test Tags for Compose UI + +Always add test tags to interactive components. Export constants from the screen file. + +```kotlin +// In the screen composable file +const val LOGIN_BUTTON_TAG = "LOGIN_BUTTON_TAG" +const val USERNAME_INPUT_TAG = "USERNAME_INPUT_TAG" + +@Composable +fun LoginScreen() { + InputField(modifier = Modifier.testTag(USERNAME_INPUT_TAG)) + Button(modifier = Modifier.testTag(LOGIN_BUTTON_TAG)) { ... } +} +``` + +Format: `{SCREEN}_{COMPONENT}_TAG` (e.g., `LOGIN_BUTTON_TAG`, `HOME_MENU_TAG`) + +### DHIS2 Design System Components + +DHIS2 components are composite. Click the wrapper tag to focus, then target the +inner `"INPUT_TEXT_FIELD"` node. Always use `performTextInput()`, not +`performTextReplacement()`. + +```kotlin +// ✅ CORRECT +fun typeUsername(username: String) { + composeTestRule.onNodeWithTag(USERNAME_TAG).performClick() + composeTestRule.onAllNodesWithTag("INPUT_TEXT_FIELD")[0].performTextInput(username) +} + +// ❌ WRONG +fun typeUsername(username: String) { + composeTestRule.onNodeWithTag(USERNAME_TAG).performTextReplacement(username) +} +``` + +### Mock Server + +```kotlin +mockWebServerRobot.addResponse( + method = GET, + path = "/api/dataElements", + response = MOCK_DATA_ELEMENTS_JSON, + responseCode = 200, +) +``` + +## Unit Testing Guidelines + +### Mocking library: mockito-kotlin + +Use `mock()`, `whenever()`, `verify()` from `org.mockito.kotlin`. Do **not** use MockK. + +```kotlin +import org.mockito.kotlin.mock +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever +``` + +### Repository Tests + +```kotlin +class ExampleRepositoryTest { + private val d2: D2 = mock() + private val domainErrorMapper: DomainErrorMapper = mock() + private val repository = ExampleRepositoryImpl(d2, domainErrorMapper) + + @Test + fun `should map SDK data to domain models`() = runTest { + val sdkData = listOf() + whenever(d2.exampleModule().examples().blockingGet()).thenReturn(sdkData) + + val result = repository.getData() + + verify(d2.exampleModule().examples()).blockingGet() + } + + @Test + fun `should map D2Error to domain error`() = runTest { + val d2Error = D2Error.builder().errorCode(D2ErrorCode.API_RESPONSE_PROCESS_ERROR).build() + whenever(d2.exampleModule().examples().blockingGet()).thenThrow(d2Error) + whenever(domainErrorMapper.mapToDomainError(d2Error)).thenReturn(DomainException("Mapped error")) + + val result = runCatching { repository.getData() } + + assertTrue(result.isFailure) + verify(domainErrorMapper).mapToDomainError(d2Error) + } +} +``` + +### ViewModel Tests + +```kotlin +class ExampleViewModelTest { + private val getDataUseCase: GetDataUseCase = mock() + private val testDispatcher = UnconfinedTestDispatcher() + private lateinit var viewModel: ExampleViewModel + + @BeforeTest + fun setUp() { + Dispatchers.setMain(testDispatcher) + } + + @Test + fun `should emit success state when use case succeeds`() = runTest { + val data = listOf(ExampleData("test")) + whenever(getDataUseCase()).thenReturn(Result.success(flowOf(data))) + + viewModel = ExampleViewModel(getDataUseCase) + + assertEquals(UiState.Success(data), viewModel.uiState.value) + } +} +``` + +### Use Case Tests + +```kotlin +class GetDataUseCaseTest { + private val repository: ExampleRepository = mock() + private val useCase = GetDataUseCase(repository) + + @Test + fun `should filter invalid data`() = runTest { + val allData = listOf(ExampleData(isValid = true), ExampleData(isValid = false)) + whenever(repository.getData()).thenReturn(flowOf(allData)) + + val result = useCase(Unit) + + result.onSuccess { flow -> + flow.test { + val data = awaitItem() + assertTrue(data.all { it.isValid }) + awaitComplete() + } + } + } +} +``` + +## Test Organization + +``` +modulekmm/src/ +├── commonTest/kotlin/ # Shared unit tests (kotlin.test + mockito-kotlin + turbine) +│ ├── domain/ # Use case tests +│ └── data/ # Repository interface tests +├── androidUnitTest/kotlin/ # Android-specific unit tests +│ ├── data/ # Repository implementation tests +│ └── ui/ # ViewModel tests +└── androidInstrumentedTest/ # UI tests with Robot pattern + ├── robots/ # Robot classes + └── tests/ # Test classes +``` + +## Best Practices Checklist + +- Use `waitUntilExactlyOneExists()` before interacting with elements +- Robot methods use descriptive names (`clickLoginButton()`, not `click()`) +- Keep robots focused on actions; use separate methods for assertions +- Test user flows, not isolated components +- Mock all external dependencies (network, SDK, databases) +- Clean up after tests (`cleanDatabase()`, clear preferences) +- Use `performTextInput()` for DHIS2 design system inputs +- Export test tag constants from screen files + +## Common Mistakes to Avoid + +- Using `Thread.sleep()` or any hard-coded delays +- Using `performTextReplacement()` on DHIS2 design system components +- Using MockK (`mockk()`, `every {}`, `coEvery {}`) — use mockito-kotlin instead +- Forgetting to export test tag constants from screen files +- Not extending `BaseRobot` for robot classes +- Not cleaning up after tests +- Testing implementation details instead of user flows +- Forgetting to mock external dependencies before the test runs + +## Your Responsibilities + +When asked to create or fix tests: + +1. Identify test type: unit (use case / repository / ViewModel) or UI (instrumented) +2. Place tests in the correct source set (`commonTest`, `androidUnitTest`, or `androidInstrumentedTest`) +3. Use `mockito-kotlin` for all mocking — never MockK +4. For UI tests: apply the Robot pattern, export test tags, rely on `CoroutineTracker` +5. Ensure proper cleanup (database, preferences, mock server) +6. Run the relevant Gradle task to verify the test passes before finishing diff --git a/AGENTS.md b/AGENTS.md index 52be33a15d8..97ace46c9e7 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,414 +1,239 @@ -# DHIS2 Android Capture App - Development Guidelines +# DHIS2 Android Capture App - Agent Guidelines -This document serves as a comprehensive guide for developers working on the DHIS2 Android Capture -App, outlining best practices, architecture patterns, and implementation examples. It is designed to -be useful for both human developers and AI assistants like Copilot. +This is a **Kotlin Multiplatform (KMP)** Android project migrating to Compose Multiplatform, +targeting Android, Desktop, and iOS. The app uses MVVM + Repository + Use Case architecture. -## Project Overview +--- -This project is a DHIS2 Android application that is migrating from a traditional Android app to a * -*Kotlin Multiplatform (KMP)** project. The migration is ongoing with the goal of eventually becoming -a full Compose Multiplatform application supporting Android, iOS, and Desktop platforms. +## Build & Lint Commands -## Technology Stack +```bash +# Full lint check (ktlint 1.7.1, ktlint_official style) +./gradlew ktlintCheck -### Core Technologies +# Auto-format all sources +./gradlew ktlintFormat -- **Kotlin**: Primary programming language -- **Kotlin Multiplatform (KMP)**: Target platform for cross-platform development -- **Compose Multiplatform**: UI framework for all platforms -- **Gradle**: Build system with Kotlin DSL +# Run all unit tests (debug + KMP host tests) +./gradlew testDebugUnitTest testDhis2DebugUnitTest testAndroidHostTest -### UI Framework +# Shortcut: lint + all unit tests (mirrors CI) +./run_tests.sh -- **Primary UI**: Use `@dhis2/dhis2-mobile-ui` design system (based on Compose Multiplatform) - - Use latest stable version (check `gradle/libs.versions.toml` for current version) - - Import: `org.hisp.dhis.mobile.ui.designsystem.*` - - Always prefer DHIS2 design system components over Material components when available +# Run a single test class (KMP commonTest) +./gradlew :login:testAndroidHostTest --tests "org.dhis2.mobile.login.main.ui.viewmodel.LoginViewModelTest" -### Data Layer +# Run a single test method (KMP commonTest) +./gradlew :login:testAndroidHostTest --tests "org.dhis2.mobile.login.main.ui.viewmodel.LoginViewModelTest.initial screen is set correctly when starting" -- **DHIS2 Android SDK**: Use `@dhis2/dhis2-android-sdk` for all data operations - - Use latest stable version (check `gradle/libs.versions.toml` for current version) - - Import: `org.hisp.dhis.android.core.*` - - Handles persistence, offline/online synchronization, and DHIS2 API communication - - Never create direct network calls or database operations - use the SDK +# Build debug APK +./gradlew assembleDhis2Debug -## Architecture and Patterns +# Build all modules +./gradlew assemble +``` -This section describes the core architecture patterns used in the project, along with implementation -examples and best practices. +**Gradle task naming by module type:** +- Legacy Android modules (`form`, `commons`, `tracker`, etc.): `testDebugUnitTest` +- KMP modules (`login`, `commonskmm`, `sync`, `aggregates`), `commonTest` source set: `testAndroidHostTest` +- KMP modules, `androidUnitTest` source set: `testAndroidDebugUnitTest` +- Desktop targets in KMP modules: `desktopTest` -### MVVM Architecture +--- -The Model-View-ViewModel (MVVM) pattern is used to separate concerns between the UI (View), business -logic (ViewModel), and data (Model). +## Project Structure -- **ViewModels**: Manage UI state and business logic - - Use `androidx.lifecycle.ViewModel` or platform-specific equivalents - - Expose state via `StateFlow` and `Flow` - - Handle UI events and coordinate with repositories/use cases +``` +root/ +├── app/ # Main Android application +├── commonskmm/ # KMP shared utilities, base classes, DI helpers +├── login/ # KMP login feature (Android + Desktop) +├── sync/ # KMP sync feature +├── aggregates/ # KMP aggregate data feature +├── tracker/ # Android tracker feature +├── form/ # Android form module +├── commons/ # Android shared utilities (legacy) +├── compose-table/ # Compose table component +├── dhis2-mobile-program-rules/ # KMP program rules engine +└── gradle/libs.versions.toml # Central dependency catalog +``` -- **Views/Composables**: UI layer that observes ViewModel state - - Use `@Composable` functions for UI components - - Collect state using `collectAsState()` - - Keep composables pure and stateless when possible - - Use Compose multiplatform previews (`@Preview`) to validate UI components +**KMP module source sets:** +``` +modulekmm/src/ +├── commonMain/kotlin/ # Shared business logic, interfaces, use cases +├── commonTest/kotlin/ # Shared unit tests (kotlin-test + mockito-kotlin + turbine) +├── androidMain/kotlin/ # Android implementations, SDK access +├── androidUnitTest/kotlin/ # Android-specific unit tests +├── desktopMain/kotlin/ # Desktop implementations +└── composeResources/ # Shared Compose resources (strings, images) +``` -#### ViewModel Implementation Example +--- -```kotlin -class ExampleViewModel( - private val getDataUseCase: GetDataUseCase -) : ViewModel() { - private val _uiState = MutableStateFlow(UiState.Loading) - val uiState: StateFlow = _uiState.asStateFlow() - - init { - loadData() - } +## Code Style (enforced by ktlint 1.7.1) - private fun loadData() { - // Use the `launchUseCase` ViewModel extension which wraps coroutine tracking and uses - // a background dispatcher by default (it increments/decrements CoroutineTracker). - launchUseCase { - // `getDataUseCase()` is an extension for `UseCase` that calls the use case with Unit - val result = getDataUseCase() - result.fold( - onSuccess = { flow -> - flow - .catch { _uiState.value = UiState.Error(it.message ?: "Unknown error") } - .collect { _uiState.value = UiState.Success(it) } - }, - onFailure = { throwable -> - _uiState.value = UiState.Error(throwable.message ?: "Unknown error") - } - ) - } - } -} -``` +Config in `.editorconfig`: +- **Style**: `ktlint_official` +- **No wildcard imports** (`ktlint_standard_no-wildcard-imports = enabled`) +- **No unused imports** (`ktlint_standard_no-unused-imports = enabled`) +- **Trailing commas required** on both call and declaration sites +- **Ordered imports** (`ktlint_standard_import-ordering = enabled`) +- **Function naming**: standard rule disabled — composables may use PascalCase per Compose conventions -#### Composable Implementation Example +**General Kotlin conventions:** +- JVM target: Java 17 (`sourceCompatibility = JavaVersion.VERSION_17`) +- Prefer `data class` over plain class for models +- Use `sealed class` / `sealed interface` for UI state +- Use `object` for singletons, companion objects for constants +- Prefer expression bodies for single-expression functions +- Document public APIs with KDoc -```kotlin -@Composable -fun ExampleScreen( - viewModel: ExampleViewModel = koinViewModel() -) { - val uiState by viewModel.uiState.collectAsState() - - DHIS2Theme { - when (uiState) { - is UiState.Loading -> LoadingIndicator() - is UiState.Success -> ExampleContent(uiState.data) - is UiState.Error -> ErrorMessage(uiState.message) - } - } -} +--- + +## Architecture Patterns + +### Layer structure (per feature module) +``` +domain/ + model/ # Pure data classes / sealed states + usecase/ # Business logic, implements UseCase + repository/ # Repository interfaces +data/ + repository/ # Repository implementations (androidMain) +ui/ + state/ # UiState sealed classes + viewmodel/ # ViewModels (expose StateFlow) + screen/ # @Composable screens + component/ # Reusable composables +di/ # Koin module definitions ``` -### Repository Pattern - -Repositories provide an abstraction layer over data sources, handling data access and mapping -between SDK models and domain models. - -- **Repositories**: Abstract data access layer - - Define interfaces in `commonMain` - - Implement platform-specific versions in `androidMain`, `desktopMain`, etc. - - Use DHIS2 SDK for data operations - - Handle data mapping between SDK models and domain models - - Map SDK exceptions to domain errors: repository implementations should translate platform/SDK - exceptions into domain-level errors using the project's `DomainErrorMapper` (or equivalent). - This keeps the domain layer SDK-agnostic and makes error handling consistent across the app. - - Imports you will commonly need in Android implementations: - ``` - import org.dhis2.mobile.commons.error.DomainErrorMapper - import org.hisp.dhis.android.core.maintenance.D2Error - ``` - - Recommendations: - - Keep repository method signatures `suspend` and let them throw domain-level exceptions - rather than returning raw SDK exceptions. - - Catch/translate only SDK-specific exceptions; allow unexpected exceptions to bubble up - or wrap them in a generic domain error if appropriate. - - Write unit tests that mock `DomainErrorMapper` to assert error mapping behavior. - -#### Repository Implementation Example +### UseCase interface (commonskmm) +All use cases must implement `UseCase` from +`commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/domain/UseCase.kt`: ```kotlin -class ExampleRepositoryImpl( - private val d2: D2, - private val domainErrorMapper: DomainErrorMapper -) : ExampleRepository { - override suspend fun getData(): Flow> { - return try { - d2.exampleModule().examples() - .get() - .asFlow() - .map { it.map { example -> example.toDomainModel() } } - } catch (d2Error: D2Error) { - throw domainErrorMapper.mapToDomainError(d2Error) - } - } +// Interface definition +fun interface UseCase { + suspend operator fun invoke(input: R): Result } +// Parameterless convenience extension +suspend operator fun UseCase.invoke() = this(Unit) ``` -### Use Cases - -Use cases encapsulate complex business logic, providing a clear interface for ViewModels to interact -with the domain layer. - -- **Use Cases**: Encapsulate complex business logic - - Single responsibility principle - - Implement the shared `UseCase` interface: `UseCase` (see - `commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/domain/UseCase.kt`). Use cases must - implement/extend this interface so they return a `Result` from their `invoke` method. - - For parameterless use cases use `UseCase` and the provided extension - `suspend operator fun UseCase.invoke() = this(Unit)` to call them without passing - `Unit` explicitly. - - Return `Result` (often wrapping a `Flow` when the use case emits a stream). Handle - exceptions inside the use case and wrap success/failure using `Result.success` / - `Result.failure`. - - Coordinate between multiple repositories if needed - - Return `Flow` or `suspend` functions for async operations - - Place in domain layer - -#### Use Case Implementation Example - +Implementation pattern: ```kotlin -class GetDataUseCase( - private val repository: ExampleRepository -) : UseCase>> { - override suspend operator fun invoke(input: Unit): Result>> { - return try { - val flow = repository.getData() - .map { data -> data.filter { it.isValid } } - Result.success(flow) +class SavePinUseCase(private val repo: SessionRepository) : UseCase { + override suspend fun invoke(input: String): Result = + try { + repo.savePin(input) + Result.success(Unit) } catch (e: Exception) { Result.failure(e) } - } } ``` -### State Management +### ViewModel pattern +- Use `launchUseCase { }` (not `viewModelScope.launch`) — it wraps `CoroutineTracker` + which integrates with Espresso's `IdlingResource` for reliable UI tests +- Expose state via `StateFlow`; collect in composables with `collectAsState()` -Use sealed classes to represent different UI states in a type-safe manner. - -- **Sealed Classes**: Use for representing different states +### Repository pattern (Android implementations) +- Translate `D2Error` → domain errors via `DomainErrorMapper` +- Required imports for Android impls: ```kotlin - sealed class UiState { - object Loading : UiState() - data class Success(val data: T) : UiState() - data class Error(val message: String) : UiState() - } + import org.dhis2.mobile.commons.error.DomainErrorMapper + import org.hisp.dhis.android.core.maintenance.D2Error ``` -### Reactive Programming +### Dependency Injection (Koin 4.x) +```kotlin +val featureModule = module { + single { MyRepositoryImpl(get(), get()) } + factory { MyUseCase(get()) } + viewModel { MyViewModel(get()) } +} +``` +- Define modules in `commonMain` where possible; use `expect`/`actual` for platform DI +- Inject ViewModels in composables with `koinViewModel()` -Leverage Kotlin's Flow and Coroutines for reactive and asynchronous programming. +--- -- **Flow**: For reactive data streams - - Use `StateFlow` for state that can be observed - - Use `Flow` for data streams - - Combine flows using operators like `combine`, `flatMapLatest` +## UI Guidelines -- **Coroutines**: For asynchronous programming - - Use `viewModelScope` in ViewModels - - Handle errors with try-catch blocks - - Use `Dispatchers.IO` for I/O operations +- **Always prefer** DHIS2 design system components (`org.hisp.dhis.mobile.ui.designsystem.*`) + over Material components +- Wrap screens in `DHIS2Theme { }` from `org.hisp.dhis.mobile.ui.designsystem.theme` +- Place shared Compose resources in `commonMain/composeResources/` +- Use multiplatform Compose Navigation (`org.jetbrains.androidx.navigation:navigation-compose`) +- Add `@Preview` annotations to validate composables in isolation -### Dependency Injection +--- -Koin is used for dependency injection, supporting multiplatform development. +## Testing -- **Koin**: Dependency injection framework - - Use latest stable version (check `gradle/libs.versions.toml` for current version) - - Define modules in `commonMain` when possible - - Use `expect`/`actual` pattern for platform-specific dependencies - - Module structure: `val commonModule: Module = module { ... }` +### Mocking library +- **KMP modules** (`commonTest`): `mockito-kotlin` (`org.mockito.kotlin.mock`, `whenever`, `verify`) +- **Legacy Android modules**: `mockito-kotlin` or `mockito-core` +- Turbine (`app.cash.turbine`) for Flow assertions; `kotlinx-coroutines-test` for coroutine testing -#### Koin Module Definition Example +### Running a single test +```bash +# KMP module (commonTest source set) +./gradlew :login:testAndroidHostTest --tests "fully.qualified.ClassName.method name" -```kotlin -val exampleModule = module { - single { ExampleRepositoryImpl(get()) } - single { GetDataUseCase(get()) } - viewModel { ExampleViewModel(get()) } -} -``` - -## Project Structure - -### Multiplatform Module Organization +# KMP module (androidUnitTest source set) +./gradlew :login:testAndroidDebugUnitTest --tests "fully.qualified.ClassName.method name" +# Legacy Android module +./gradlew :form:testDebugUnitTest --tests "org.dhis2.form.ui.FormViewModelTest" ``` -modulekmm/ -├── src/ -│ ├── commonMain/kotlin/ # Shared code -│ ├── commonTest/kotlin/ # Shared tests -│ ├── androidMain/kotlin/ # Android-specific code -│ ├── androidUnitTest/kotlin/# Android unit tests -│ ├── desktopMain/kotlin/ # Desktop-specific code -│ └── iosMain/kotlin/ # iOS-specific code (when applicable) -``` - -### Code Organization - -- **Domain Layer**: Models, use cases, repository interfaces -- **Data Layer**: Repository implementations, data sources -- **UI Layer**: Composables, ViewModels, navigation -- **DI Layer**: Dependency injection modules - -### Platform-Specific Code - -- Use `expect`/`actual` pattern for platform differences -- Keep platform-specific code minimal -- Prefer shared implementations in `commonMain` - -## Development Guidelines - -### Compose Multiplatform - -- **Components**: Always check DHIS2 design system first - - Use components from `org.hisp.dhis.mobile.ui.designsystem.component.*` - - Use theme from `org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme` -- **Navigation**: Use Compose Navigation for multiplatform -- **Resources**: Place in `commonMain/composeResources/` -- **Theming**: Use DHIS2Theme wrapper - -### Data Operations - -- **Never bypass the SDK**: Always use DHIS2 Android SDK for all data operations - - Use components from `org.hisp.dhis.android.core.*` -- **Offline-first**: Design with offline capabilities in mind -- **Sync handling**: Let the SDK handle synchronization -- **Error handling**: Handle SDK exceptions appropriately - -### Testing - -- **Unit Tests**: Place in appropriate test directories -- **Shared Tests**: Use `commonTest` for platform-agnostic tests -- **Mocking**: Use MockK for Kotlin-friendly mocking -- **Repository Tests**: Mock DHIS2 SDK components -- **UI Tests**: Follow the Robot pattern for instrumented tests (see detailed section below) - -### UI Testing Guidelines - -- **Location**: Place UI tests in `androidInstrumentedTest` -- **Pattern**: Use Robot pattern for test actions and assertions -- **Async handling**: Use `CoroutineTracker` with `launchUseCase` - never use hard-coded delays - - Espresso's `IdlingResource` automatically waits for tracked operations to complete - - This enables faster, more reliable tests without manual wait mechanisms -- **Test tags**: Add `Modifier.testTag()` to interactive UI components - - Format: `{SCREEN}_{COMPONENT}_TAG` (e.g., `LOGIN_BUTTON_TAG`) - - Export constants from screen files for test imports -- **DHIS2 design system components**: These are composite components - - Click the wrapper with your test tag to focus it - - Use `"INPUT_TEXT_FIELD"` tag to find inner fields - - Use `performTextInput()` (not `performTextReplacement()`) -- **Mock server**: Use `MockWebServerRobot` for API mocking -- **Best practices**: - 1. Use `waitUntilExactlyOneExists()` for element visibility - 2. Use descriptive robot method names (e.g., `clickLoginButton()`) - 3. Keep robots focused on actions, not assertions - 4. Test user flows, not isolated components - 5. Mock all external dependencies (network, SDK responses) - 6. Clean up after tests (databases, preferences) - -#### Example: Robot Class +### Unit test structure (KMP commonTest) ```kotlin -fun exampleRobot( - composeTestRule: ComposeTestRule, - robotBody: ExampleRobot.() -> Unit -) { - ExampleRobot(composeTestRule).apply { robotBody() } -} +class MyUseCaseTest { + private val repository: MyRepository = mock() + private val useCase = MyUseCase(repository) -class ExampleRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { - fun typeUsername(username: String) { - composeTestRule.waitUntilExactlyOneExists(hasTestTag(USERNAME_TAG), TIMEOUT) - composeTestRule.onNodeWithTag(USERNAME_TAG).performClick() - composeTestRule.onAllNodesWithTag("INPUT_TEXT_FIELD")[0].performTextInput(username) - } - - fun clickSubmitButton() { - composeTestRule.waitUntilExactlyOneExists(hasTestTag(SUBMIT_TAG), TIMEOUT) - composeTestRule.onNodeWithTag(SUBMIT_TAG).performClick() + @Test + fun `should return success when data is valid`() = runTest { + whenever(repository.getData()).thenReturn(listOf(item)) + val result = useCase() + assertTrue(result.isSuccess) } } ``` -#### Example: Test Structure +### UI / instrumented tests (Robot pattern) +- Location: `androidInstrumentedTest/` or `androidTest/` +- Extend `BaseTest`; use `MockWebServerRobot` for API mocking +- **Never use `Thread.sleep()` or hard-coded delays** — `launchUseCase` + `CoroutineTracker` + integrates with Espresso `IdlingResource` automatically +- Tag UI components with `Modifier.testTag(CONSTANT)` using format `{SCREEN}_{COMPONENT}_TAG` +- For DHIS2 composite inputs: click wrapper tag first, then find inner `"INPUT_TEXT_FIELD"` node, + use `performTextInput()` (not `performTextReplacement()`) ```kotlin -class ExampleTest : BaseTest() { - @get:Rule - val composeTestRule = createComposeRule() - - @Test - fun shouldPerformSuccessfulAction() { - mockWebServerRobot.addResponse(GET, "/api/endpoint", MOCK_RESPONSE, 200) - - exampleRobot(composeTestRule) { - typeUsername("user") - clickSubmitButton() - // IdlingResource handles async automatically - checkSuccessMessageDisplayed() - } - - cleanDatabase() +fun loginRobot(rule: ComposeTestRule, body: LoginRobot.() -> Unit) = + LoginRobot(rule).apply { body() } + +class LoginRobot(val rule: ComposeTestRule) : BaseRobot() { + fun typeServer(url: String) { + rule.waitUntilExactlyOneExists(hasTestTag(SERVER_INPUT_TAG), TIMEOUT) + rule.onNodeWithTag(SERVER_INPUT_TAG).performClick() + rule.onAllNodesWithTag("INPUT_TEXT_FIELD")[0].performTextInput(url) } } ``` -### Code Style - -- **Kotlin conventions**: Follow official Kotlin coding conventions -- **ktlint**: Project uses ktlint for formatting -- **Imports**: Organize imports, prefer explicit imports -- **Documentation**: Document public APIs with KDoc - -## Best Practices & Migration Guidelines - -### Core Development Practices - -1. **Always use DHIS2 design system components** before falling back to Material components -2. **Never create direct database or network operations** - use DHIS2 SDK exclusively -3. **Keep business logic in ViewModels or Use Cases**, not in Composables -4. **Use sealed classes for state representation** -5. **Prefer composition over inheritance** -6. **Write tests for business logic and repositories** -7. **Handle loading and error states appropriately** -8. **Follow offline-first design principles** -9. **Keep platform-specific code minimal** - use `expect`/`actual` pattern -10. **Use meaningful commit messages and follow Git flow** - -### Important Warnings - -- **Coroutine cancellation**: Remember to handle coroutine cancellation properly -- **SDK exception handling**: DHIS2 SDK operations might throw exceptions - always handle them -- **Component availability**: Some DHIS2 design system components might not be available yet - check documentation -- **RxJava migration**: When migrating from RxJava to Coroutines/Flow, ensure proper error handling -- **Platform-specific resources**: Handle resources differently in multiplatform (not all platforms support identical APIs) - -### Migrating from Android to KMP - -- **Code organization**: Move shared logic to `commonMain`; extract platform-specific code to `androidMain`, `desktopMain`, etc. -- **UI conversion**: Convert View-based UI to Compose Multiplatform -- **Dependency injection**: Update to use Koin multiplatform -- **Libraries**: Prefer multiplatform libraries over platform-specific ones -- **Compatibility**: Check compatibility with Compose Multiplatform before selecting dependencies -- **Documentation**: Document public APIs with KDoc - +--- -## Resources +## Key Constraints -- [DHIS2 Mobile UI Documentation](https://ui.dhis2.nu/components) -- [DHIS2 Android SDK Documentation](https://docs.dhis2.org/en/develop/using-the-api/dhis-core-version-master/android-sdk.html) -- [Compose Multiplatform Documentation](https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-multiplatform-getting-started.html) -- [Koin Multiplatform Documentation](https://insert-koin.io/docs/reference/koin-mp/kmp) -- [Android Architecture Guidelines](https://developer.android.com/topic/architecture) -- [Compose Testing Documentation](https://developer.android.com/jetpack/compose/testing) -- [Espresso Idling Resources](https://developer.android.com/training/testing/espresso/idling-resource) +1. **Never create direct network or database calls** — use the DHIS2 Android SDK (`org.hisp.dhis.android.core.*`) +2. **Offline-first**: design features to work without connectivity; let the SDK handle sync +3. **KMP first**: put business logic in `commonMain`; keep `androidMain` to SDK/platform specifics +4. **No RxJava in new code**: migrate to Coroutines/Flow; wrap existing RxJava at boundaries +5. **ktlint must pass** before committing — run `./gradlew ktlintFormat` then `ktlintCheck` diff --git a/CLAUDE.md b/CLAUDE.md index eef4bd20cf9..9aa330bf2e0 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1 +1,5 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + @AGENTS.md \ No newline at end of file From 98c13da713c25bcf1f10e3c4badb21e3f3b9345f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Apr 2026 11:47:32 +0200 Subject: [PATCH 125/260] deps: bump the gradle-updates group across 1 directory with 10 updates (#4781) * deps: bump the gradle-updates group across 1 directory with 10 updates Bumps the gradle-updates group with 10 updates in the / directory: | Package | From | To | | --- | --- | --- | | [org.hisp.dhis.rules:rule-engine-jvm](https://github.com/dhis2/dhis2-rule-engine) | `3.7.1` | `3.7.2` | | androidx.compose.material:material | `1.10.5` | `1.10.6` | | androidx.compose.ui:ui | `1.10.5` | `1.10.6` | | androidx.compose.runtime:runtime-livedata | `1.10.5` | `1.10.6` | | androidx.compose.ui:ui-tooling | `1.10.5` | `1.10.6` | | androidx.compose.ui:ui-tooling-preview | `1.10.5` | `1.10.6` | | androidx.compose.ui:ui-test-junit4 | `1.10.5` | `1.10.6` | | androidx.compose.ui:ui-test-manifest | `1.10.5` | `1.10.6` | | androidx.compose.ui:ui-test-junit4-android | `1.10.5` | `1.10.6` | | androidx.work:work-runtime-ktx | `2.11.1` | `2.11.2` | Updates `org.hisp.dhis.rules:rule-engine-jvm` from 3.7.1 to 3.7.2 - [Release notes](https://github.com/dhis2/dhis2-rule-engine/releases) - [Commits](https://github.com/dhis2/dhis2-rule-engine/compare/v3.7.1...v3.7.2) Updates `androidx.compose.material:material` from 1.10.5 to 1.10.6 Updates `androidx.compose.ui:ui` from 1.10.5 to 1.10.6 Updates `androidx.compose.runtime:runtime-livedata` from 1.10.5 to 1.10.6 Updates `androidx.compose.ui:ui-tooling` from 1.10.5 to 1.10.6 Updates `androidx.compose.ui:ui-tooling-preview` from 1.10.5 to 1.10.6 Updates `androidx.compose.ui:ui-test-junit4` from 1.10.5 to 1.10.6 Updates `androidx.compose.ui:ui-test-manifest` from 1.10.5 to 1.10.6 Updates `androidx.compose.ui:ui-test-junit4-android` from 1.10.5 to 1.10.6 Updates `androidx.compose.ui:ui` from 1.10.5 to 1.10.6 Updates `androidx.compose.runtime:runtime-livedata` from 1.10.5 to 1.10.6 Updates `androidx.compose.ui:ui-tooling` from 1.10.5 to 1.10.6 Updates `androidx.compose.ui:ui-tooling-preview` from 1.10.5 to 1.10.6 Updates `androidx.compose.ui:ui-test-junit4` from 1.10.5 to 1.10.6 Updates `androidx.compose.ui:ui-test-manifest` from 1.10.5 to 1.10.6 Updates `androidx.compose.ui:ui-test-junit4-android` from 1.10.5 to 1.10.6 Updates `androidx.work:work-runtime-ktx` from 2.11.1 to 2.11.2 --- updated-dependencies: - dependency-name: org.hisp.dhis.rules:rule-engine-jvm dependency-version: 3.7.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.material:material dependency-version: 1.10.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui dependency-version: 1.10.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.runtime:runtime-livedata dependency-version: 1.10.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-tooling dependency-version: 1.10.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-tooling-preview dependency-version: 1.10.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-test-junit4 dependency-version: 1.10.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-test-manifest dependency-version: 1.10.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-test-junit4-android dependency-version: 1.10.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui dependency-version: 1.10.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.runtime:runtime-livedata dependency-version: 1.10.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-tooling dependency-version: 1.10.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-tooling-preview dependency-version: 1.10.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-test-junit4 dependency-version: 1.10.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-test-manifest dependency-version: 1.10.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.compose.ui:ui-test-junit4-android dependency-version: 1.10.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates - dependency-name: androidx.work:work-runtime-ktx dependency-version: 2.11.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates ... Signed-off-by: dependabot[bot] * chore: update dependency verification metadata * deps: remove unused dependencies --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: @dhis2-bot Co-authored-by: andresmr --- gradle/libs.versions.toml | 12 +- gradle/verification-metadata.xml | 185 +++++++++++++++++++++++++++++++ 2 files changed, 187 insertions(+), 10 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c4c37370328..085f1b40b0a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -12,13 +12,12 @@ dagger = '2.57.2' jacoco = '0.8.14' designSystem = "0.7.1-SNAPSHOT" dhis2sdk = "1.14.1-SNAPSHOT" -ruleEngine = "3.7.1" +ruleEngine = "3.7.2" expressionParser = "1.4.0" appcompat = "1.7.1" annotation = "1.9.1" cardview = "1.0.0" legacysupport = "1.0.0" -multidex = "2.0.1" constraintlayout = "2.2.1" lifecycle = "2.9.4" work = "2.10.5" @@ -26,7 +25,7 @@ exif = "1.4.2" corektx = "1.17.0" fragmentktx = "1.8.9" recyclerview = "1.4.0" -compose = "1.10.5" +compose = "1.10.6" composePluginVersion = "1.10.3" composePaging = "3.4.2" pagingTesting = "3.4.2" @@ -35,7 +34,6 @@ activityCompose = "1.11.0" viewModelCompose = "2.9.4" material = "1.13.0" material3 = "1.4.0" -themeAdapter = "0.36.0" fancyshowcase = "1.4.0" lottie = "6.6.10" rxjava = "2.2.21" @@ -96,7 +94,6 @@ browser = "1.9.0" biometric = "1.1.0" coil = "3.3.0" cyclonedx = "2.1.0" -workRuntimeKtx = "2.11.1" [libraries] gradlePlugin = { group = "com.android.tools.build", name = "gradle", version.ref = "gradle" } @@ -129,7 +126,6 @@ androidx-activity-compose = { group = "androidx.activity", name = "activity-comp androidx-annotation = { group = "androidx.annotation", name = "annotation", version.ref = "annotation" } androidx-cardview = { group = "androidx.cardview", name = "cardview", version.ref = "cardview" } androidx-legacy-support-v4 = { group = "androidx.legacy", name = "legacy-support-v4", version.ref = "legacysupport" } -androidx-multidex = { group = "androidx.multidex", name = "multidex", version.ref = "multidex" } androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" } androidx-work = { group = "androidx.work", name = "work-runtime", version.ref = "work" } androidx-workrx = { group = "androidx.work", name = "work-rxjava2", version.ref = "work" } @@ -146,7 +142,6 @@ google-guava = { group = "com.google.guava", name = "guava", version.ref = "guav google-auth = { group = "com.google.android.gms", name = "play-services-auth", version.ref = "playservicesauth" } google-auth-apiphone = { group = "com.google.android.gms", name = "play-services-auth-api-phone", version.ref = "playservicesphone" } google-material = { group = "com.google.android.material", name = "material", version.ref = "material" } -google-material3-themeadapter = { group = "com.google.accompanist", name = "accompanist-themeadapter-material3", version.ref = "themeAdapter" } google-gson = { group = "com.google.code.gson", name = "gson", version.ref = "gson" } kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "kotlinxDatetime" } network-okhttp = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhttp" } @@ -220,7 +215,6 @@ ktxml = { module = "org.kobjects.ktxml:core", version.ref = "ktxml" } commons-text = { module = "org.apache.commons:commons-text", version.ref = "commonsText" } coil = { module = "io.coil-kt.coil3:coil-compose", version.ref = "coil"} coil-network = { module = "io.coil-kt.coil3:coil-network-okhttp", version.ref = "coil"} -androidx-work-runtime-ktx = { group = "androidx.work", name = "work-runtime-ktx", version.ref = "workRuntimeKtx" } [plugins] kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } @@ -249,5 +243,3 @@ table-androidTest = ["test-compose-ui-test", "test-uiautomator", "test-junitKtx" stock-implementation = ["androidx-activity-compose", "androidx-annotation", "rx-relay", "security-openId", "androidx-preferenceKtx", "androidx-work", "androidx-activityKtx", "androidx-lifecycle-viewmodel-compose", "analytics-customactivityoncrash"] stock-core = ["desugar"] stock-test = ["test-mockitoKotlin", "test-mockitoInline", "test-archCoreTesting", "test-javafaker", "test-kotlinCoroutines"] -tracker-implementation = ["androidx-lifecycle-viewmodel-compose", "androidx-activity-compose"] -tracker-test = ["test-mockitoCore", "test-mockitoInline", "test-mockitoKotlin", "test-testCore", "test-archCoreTesting", "test-kotlinCoroutines"] diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 4b4a9e9b973..40072bd346d 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -148,6 +148,11 @@ + + + + + @@ -163,6 +168,11 @@ + + + + + @@ -178,6 +188,11 @@ + + + + + @@ -193,6 +208,11 @@ + + + + + @@ -203,6 +223,11 @@ + + + + + @@ -283,21 +308,41 @@ + + + + + + + + + + + + + + + + + + + + @@ -323,16 +368,31 @@ + + + + + + + + + + + + + + + @@ -343,11 +403,21 @@ + + + + + + + + + + @@ -358,111 +428,221 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3641,6 +3821,11 @@ + + + + + From e6341f5d5d4b8462bc69f7adb8ee27704cd00004 Mon Sep 17 00:00:00 2001 From: Pablo Date: Wed, 1 Apr 2026 12:29:51 +0200 Subject: [PATCH 126/260] feat: [ANDROAPP-7509][1] Add and update classes [skip size] (#4763) * feat: [ANDROAPP-7509] Add and update classes * feat: [ANDROAPP-7509][2] Set up koin and update classes (#4764) * feat: [ANDROAPP-7509] Set up koin and update classes * feat: [ANDROAPP-7509][3] Update MainViewModel [skip size] (#4765) * feat: [ANDROAPP-7509] Update MainViewModel * feat: [ANDROAPP-7509][4] Composable MainScreen (#4766) * feat: [ANDROAPP-7509] Composable MainScreen * feat: [ANDROAPP-7509][5] Update MainScreen [skip size] (#4767) * feat: [ANDROAPP-7509] Update MainScreen * feat: [ANDROAPP-7509][6] Remove unused code [skip size] (#4768) * feat: [ANDROAPP-7509] Remove unused code * feat: [ANDROAPP-7509] Fix tests * feat: [ANDROAPP-7509] Fix tests * refactor: simplify navigation logic in MainViewModel and update MainRobot tests * refactor: MainNavigator scoping and threading - Change MainNavigator from single to factory in MainModule. - Remove DispatcherProvider and coroutine logic from MainNavigator. - Move UI thread enforcement for initial screen navigation to MainViewModel. --------- Co-authored-by: andresmr --------- Co-authored-by: andresmr --------- Co-authored-by: andresmr --------- Co-authored-by: andresmr --------- Co-authored-by: andresmr * refactor: update AnalyticsHelper dependency injection to use Koin bind and lazy injection * fix: various improvements in Main module logic and session initialization - fix resource type for Troubleshooting title in MainScreen - prevent duplicate NewVersionDialog in MainActivity - add initialization check for sessionManagerServiceImpl - buffer HomeEvent channel in MainViewModel - reuse fragment instance in MainNavigator * refactor: rename HomeEvent to HomeEffect and introduce HomeAction - Rename `HomeEvent` to `HomeEffect` to better represent ViewModel-to-UI communication. - Introduce `HomeAction` sealed interface to encapsulate UI-to-ViewModel interactions (Back, Menu, Sync, Filter, Screen Change, and Pin Set). - Refactor `MainViewModel` to expose a single `onAction` method, streamlining how the UI triggers logic. - Update `MainActivity` and `MainScreen` to use the new action/effect pattern and improve state collection using `collectAsState`. - Update `MainViewModelTest` to reflect naming changes and action-based interactions. * refactor: remove SyncIsPerformedInteractor and simplify MainViewModel navigation logic * test: add integration tests for MainViewModel --------- Co-authored-by: andresmr Co-authored-by: andresmr --- .../org/dhis2/usescases/about/AboutTest.kt | 17 +- .../org/dhis2/usescases/main/MainRobot.kt | 37 +- .../java/org/dhis2/usescases/main/MainTest.kt | 26 +- .../dhis2/usescases/settings/SettingsRobot.kt | 9 +- .../dhis2/usescases/settings/SettingsTest.kt | 53 +- app/src/main/java/org/dhis2/AppModule.kt | 4 + .../dhis2/data/service/CheckVersionWorker.kt | 13 +- .../org/dhis2/data/user/UserComponent.java | 6 - .../java/org/dhis2/di/KoinInitialization.kt | 2 + .../main/java/org/dhis2/di/ServerModule.kt | 3 + .../general/ActivityGlobalAbstract.java | 4 +- .../general/SessionManagerActivity.kt | 8 +- .../login/SyncIsPerformedInteractor.kt | 58 -- .../usescases/main/HomePageConfigurator.kt | 39 -- .../dhis2/usescases/main/HomeRepository.kt | 35 - .../usescases/main/HomeRepositoryImpl.kt | 159 ----- .../org/dhis2/usescases/main/MainActivity.kt | 611 ++++++------------ .../org/dhis2/usescases/main/MainComponent.kt | 14 - .../org/dhis2/usescases/main/MainModule.kt | 256 ++++---- .../org/dhis2/usescases/main/MainNavigator.kt | 160 ++--- .../org/dhis2/usescases/main/MainPresenter.kt | 406 ------------ .../dhis2/usescases/main/MainScreenType.kt | 24 + .../java/org/dhis2/usescases/main/MainView.kt | 70 -- .../org/dhis2/usescases/main/MainViewModel.kt | 255 ++++---- .../usescases/main/data/HomeRepository.kt | 4 +- .../usescases/main/data/HomeRepositoryImpl.kt | 2 + .../main/domain/ConfigureHomeNavigationBar.kt | 37 +- .../dhis2/usescases/main/domain/LogoutUser.kt | 4 +- .../main/domain/ScheduleNewVersionAlert.kt | 3 + .../usescases/main/ui/model/HomeAction.kt | 15 + .../usescases/main/ui/model/HomeEffect.kt | 36 ++ .../usescases/main/ui/model/HomeEvent.kt | 35 - .../main/ui/model/HomeScreenState.kt | 12 +- .../usescases/main/ui/screens/MainScreen.kt | 228 +++++++ .../TroubleshootingFragment.kt | 28 +- .../TroubleshootingInjector.kt | 44 -- .../analytics/matomo/MatomoAnalyticsModule.kt | 3 +- app/src/main/res/layout/activity_main.xml | 115 +--- app/src/main/res/menu/main_menu.xml | 6 + app/src/main/res/values/strings.xml | 1 + .../login/SyncIsPerformedInteractorTest.kt | 115 ---- .../dhis2/usescases/main/MainPresenterTest.kt | 328 ---------- .../main/MainViewModelIntegrationTest.kt | 462 +++++++++++++ .../dhis2/usescases/main/MainViewModelTest.kt | 137 +++- .../domain/ConfigureHomeNavigationBarTest.kt | 6 + .../usescases/main/domain/LogoutUserTest.kt | 10 +- .../dhis2/commons/filters/FilterManager.java | 3 +- .../org/analytics/charts/di/ChartsModule.kt | 114 ++++ 48 files changed, 1606 insertions(+), 2411 deletions(-) delete mode 100644 app/src/main/java/org/dhis2/usescases/login/SyncIsPerformedInteractor.kt delete mode 100644 app/src/main/java/org/dhis2/usescases/main/HomePageConfigurator.kt delete mode 100644 app/src/main/java/org/dhis2/usescases/main/HomeRepository.kt delete mode 100644 app/src/main/java/org/dhis2/usescases/main/HomeRepositoryImpl.kt delete mode 100644 app/src/main/java/org/dhis2/usescases/main/MainComponent.kt delete mode 100644 app/src/main/java/org/dhis2/usescases/main/MainPresenter.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/MainScreenType.kt delete mode 100644 app/src/main/java/org/dhis2/usescases/main/MainView.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/ui/model/HomeAction.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/ui/model/HomeEffect.kt delete mode 100644 app/src/main/java/org/dhis2/usescases/main/ui/model/HomeEvent.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/ui/screens/MainScreen.kt delete mode 100644 app/src/main/java/org/dhis2/usescases/troubleshooting/TroubleshootingInjector.kt delete mode 100644 app/src/test/java/org/dhis2/usescases/login/SyncIsPerformedInteractorTest.kt delete mode 100644 app/src/test/java/org/dhis2/usescases/main/MainPresenterTest.kt create mode 100644 app/src/test/java/org/dhis2/usescases/main/MainViewModelIntegrationTest.kt create mode 100644 dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/di/ChartsModule.kt diff --git a/app/src/androidTest/java/org/dhis2/usescases/about/AboutTest.kt b/app/src/androidTest/java/org/dhis2/usescases/about/AboutTest.kt index d2b1c598757..8e993e8df84 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/about/AboutTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/about/AboutTest.kt @@ -1,14 +1,15 @@ package org.dhis2.usescases.about import androidx.compose.ui.test.junit4.createComposeRule +import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.rule.ActivityTestRule -import org.dhis2.bindings.buildInfo import org.dhis2.BuildConfig import org.dhis2.R +import org.dhis2.bindings.buildInfo import org.dhis2.usescases.BaseTest import org.dhis2.usescases.main.MainActivity -import org.dhis2.usescases.main.homeRobot +import org.dhis2.usescases.main.MainScreenType import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -28,18 +29,18 @@ class AboutTest : BaseTest() { val appVersion = getAppVersionName() val sdkVersion = getSDKVersionName() - homeRobot(composeTestRule) { - clickOnNavigationDrawerMenu() - clickAbout() - } - aboutRobot { checkVersionNames(appVersion, sdkVersion) } } private fun startActivity() { - rule.launchActivity(null) + rule.launchActivity( + MainActivity.intent( + ApplicationProvider.getApplicationContext(), + MainScreenType.About, + ) + ) } private fun getAppVersionName(): String { diff --git a/app/src/androidTest/java/org/dhis2/usescases/main/MainRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/main/MainRobot.kt index daa49524a31..5c37733e3a5 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/main/MainRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/main/MainRobot.kt @@ -1,6 +1,5 @@ package org.dhis2.usescases.main -import androidx.compose.ui.semantics.getOrNull import androidx.compose.ui.test.ExperimentalTestApi import androidx.compose.ui.test.SemanticsMatcher import androidx.compose.ui.test.assert @@ -8,15 +7,12 @@ import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.hasTestTag import androidx.compose.ui.test.junit4.ComposeTestRule import androidx.compose.ui.test.onNodeWithTag -import androidx.test.espresso.Espresso.onView -import androidx.test.espresso.action.ViewActions.click -import androidx.test.espresso.contrib.NavigationViewActions -import androidx.test.espresso.matcher.ViewMatchers.withId -import org.dhis2.R import org.dhis2.common.BaseRobot import org.dhis2.usescases.main.program.HOME_ITEMS import org.dhis2.usescases.main.program.hasPrograms +private const val HOME_NAVIGATION_TIMEOUT = 15000L + fun homeRobot( composeTestRule: ComposeTestRule, robotBody: MainRobot.() -> Unit @@ -28,25 +24,12 @@ fun homeRobot( class MainRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { - fun clickOnNavigationDrawerMenu() = apply { - waitForView(withId(R.id.menu)).perform(click()) - } - - fun clickOnSettings() = apply { - waitForView(withId(R.id.nav_view)).perform(NavigationViewActions.navigateTo(R.id.sync_manager)) - waitToDebounce(FRAGMENT_TRANSITION) - } - - fun clickAbout() = apply { - onView(withId(R.id.nav_view)).perform(NavigationViewActions.navigateTo(R.id.menu_about)) - waitToDebounce(FRAGMENT_TRANSITION) - } - + @OptIn(ExperimentalTestApi::class) fun checkViewIsNotEmpty(composeTestRule: ComposeTestRule) { - composeTestRule.waitUntil() { - composeTestRule.onNodeWithTag(HOME_ITEMS) - .fetchSemanticsNode().config.getOrNull(hasPrograms) == true - } + composeTestRule.waitUntilAtLeastOneExists( + hasTestTag(HOME_ITEMS) and SemanticsMatcher.expectValue(hasPrograms, true), + HOME_NAVIGATION_TIMEOUT, + ) composeTestRule.onNodeWithTag(HOME_ITEMS).assert( SemanticsMatcher.expectValue(hasPrograms, true) ) @@ -54,11 +37,7 @@ class MainRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { @OptIn(ExperimentalTestApi::class) fun checkHomeIsDisplayed(composeTestRule: ComposeTestRule) { - composeTestRule.waitUntilAtLeastOneExists(hasTestTag(HOME_ITEMS), TIMEOUT) + composeTestRule.waitUntilAtLeastOneExists(hasTestTag(HOME_ITEMS), HOME_NAVIGATION_TIMEOUT) composeTestRule.onNodeWithTag(HOME_ITEMS).assertIsDisplayed() } - - companion object { - const val FRAGMENT_TRANSITION = 1500L - } } diff --git a/app/src/androidTest/java/org/dhis2/usescases/main/MainTest.kt b/app/src/androidTest/java/org/dhis2/usescases/main/MainTest.kt index 5e90b83bcdf..902fee96ce7 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/main/MainTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/main/MainTest.kt @@ -3,14 +3,9 @@ package org.dhis2.usescases.main import android.content.Intent import androidx.compose.ui.test.junit4.createComposeRule import androidx.test.core.app.ApplicationProvider -import androidx.test.ext.junit.rules.ActivityScenarioRule import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.rule.ActivityTestRule import org.dhis2.lazyActivityScenarioRule import org.dhis2.usescases.BaseTest -import org.dhis2.usescases.development.DevelopmentActivity -import org.dhis2.usescases.eventsWithoutRegistration.eventCapture.EventCaptureActivity -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -27,11 +22,16 @@ class MainTest : BaseTest() { @Throws(Exception::class) override fun setUp() { super.setUp() - startActivity() } @Test fun checkHomeScreenRecyclerviewHasElements() { + startActivity( + MainActivity.intent( + ApplicationProvider.getApplicationContext(), + MainScreenType.Home(HomeScreen.Programs), + ) + ) homeRobot(composeTestRule) { composeTestRule.waitForIdle() checkViewIsNotEmpty(composeTestRule) @@ -40,19 +40,19 @@ class MainTest : BaseTest() { @Test fun shouldNavigateToHomeWhenBackPressed() { + startActivity( + MainActivity.intent( + ApplicationProvider.getApplicationContext(), + MainScreenType.Settings, + ) + ) homeRobot(composeTestRule) { - clickOnNavigationDrawerMenu() - clickOnSettings() pressBack() checkHomeIsDisplayed(composeTestRule) } } - private fun startActivity() { - val intent = Intent( - ApplicationProvider.getApplicationContext(), - MainActivity::class.java - ).putExtra(AVOID_SYNC, true) + private fun startActivity(intent: Intent) { rule.launch(intent) } } diff --git a/app/src/androidTest/java/org/dhis2/usescases/settings/SettingsRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/settings/SettingsRobot.kt index 185332def79..224760e655c 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/settings/SettingsRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/settings/SettingsRobot.kt @@ -1,8 +1,8 @@ package org.dhis2.usescases.settings +import androidx.compose.ui.test.ExperimentalTestApi import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsNotDisplayed -import androidx.compose.ui.test.hasAnyAncestor import androidx.compose.ui.test.hasTestTag import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.ComposeTestRule @@ -77,13 +77,13 @@ class SettingsRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { fun clickOnReservedValues() { composeTestRule.onNodeWithTag(SettingItem.RESERVED_VALUES.name).performClick() + composeTestRule.waitForIdle() } fun clickOnManageReservedValues() { composeTestRule.onNode( hasText(getString(R.string.manage_reserved_values_button), ignoreCase = true) ).performClick() - Intents.intended(IntentMatchers.hasComponent(ReservedValueActivity::class.java.name)) } @@ -95,7 +95,12 @@ class SettingsRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { waitForView(withId(R.id.errorRecycler)).check(matches(isDisplayed())) } + @OptIn(ExperimentalTestApi::class) fun checkTwoFAOptionIsDisplayed() { + composeTestRule.waitUntilAtLeastOneExists( + hasTestTag(SettingItem.TWO_FACTOR_AUTH.name), + TIMEOUT + ) composeTestRule.onNodeWithTag(SettingItem.TWO_FACTOR_AUTH.name).assertIsDisplayed() } diff --git a/app/src/androidTest/java/org/dhis2/usescases/settings/SettingsTest.kt b/app/src/androidTest/java/org/dhis2/usescases/settings/SettingsTest.kt index bd1ffb25c07..df2a7e4227e 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/settings/SettingsTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/settings/SettingsTest.kt @@ -1,15 +1,13 @@ package org.dhis2.usescases.settings -import android.content.Intent import androidx.compose.ui.test.junit4.createComposeRule import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import org.dhis2.commons.featureconfig.model.Feature import org.dhis2.lazyActivityScenarioRule import org.dhis2.usescases.BaseTest -import org.dhis2.usescases.main.AVOID_SYNC import org.dhis2.usescases.main.MainActivity -import org.dhis2.usescases.main.homeRobot +import org.dhis2.usescases.main.MainScreenType import org.junit.Before import org.junit.Rule import org.junit.Test @@ -33,12 +31,6 @@ class SettingsTest : BaseTest() { @Test fun shouldFindEditPeriodDisabledWhenClickOnSyncData() { startActivity() - - homeRobot(composeTestRule) { - clickOnNavigationDrawerMenu() - clickOnSettings() - } - settingsRobot(composeTestRule) { clickOnSyncData() checkEditPeriodIsDisableForData() @@ -48,12 +40,6 @@ class SettingsTest : BaseTest() { @Test fun shouldFindEditDisabledWhenClickOnSyncConfiguration() { startActivity() - - homeRobot(composeTestRule) { - clickOnNavigationDrawerMenu() - clickOnSettings() - } - settingsRobot(composeTestRule) { clickOnSyncConfiguration() checkEditPeriodIsDisableForConfiguration() @@ -63,12 +49,6 @@ class SettingsTest : BaseTest() { @Test fun shouldFindEditDisableWhenClickOnSyncParameters() { startActivity() - - homeRobot(composeTestRule) { - clickOnNavigationDrawerMenu() - clickOnSettings() - } - settingsRobot(composeTestRule) { clickOnSyncParameters() checkEditPeriodIsDisableForParameters() @@ -78,12 +58,6 @@ class SettingsTest : BaseTest() { @Test fun shouldRefillValuesWhenClickOnReservedValues() { startActivity() - - homeRobot(composeTestRule) { - clickOnNavigationDrawerMenu() - clickOnSettings() - } - settingsRobot(composeTestRule) { clickOnReservedValues() clickOnManageReservedValues() @@ -93,12 +67,6 @@ class SettingsTest : BaseTest() { @Test fun shouldSuccessfullyOpenLogs() { startActivity() - - homeRobot(composeTestRule) { - clickOnNavigationDrawerMenu() - clickOnSettings() - } - settingsRobot(composeTestRule) { clickOnOpenSyncErrorLog() checkLogViewIsDisplayed() @@ -109,14 +77,7 @@ class SettingsTest : BaseTest() { @Test fun shouldNotShowTwoFAOption() { disableFeatureConfigValue(Feature.TWO_FACTOR_AUTHENTICATION) - startActivity() - - homeRobot(composeTestRule) { - clickOnNavigationDrawerMenu() - clickOnSettings() - } - settingsRobot(composeTestRule) { checkTwoFAOptionIsNotDisplayed() } @@ -128,12 +89,6 @@ class SettingsTest : BaseTest() { enableFeatureConfigValue(Feature.TWO_FACTOR_AUTHENTICATION) startActivity() - - homeRobot(composeTestRule) { - clickOnNavigationDrawerMenu() - clickOnSettings() - } - settingsRobot(composeTestRule) { checkTwoFAOptionIsDisplayed() clickOnTwoFASettings() @@ -142,10 +97,10 @@ class SettingsTest : BaseTest() { } private fun startActivity() { - val intent = Intent( + val intent = MainActivity.intent( ApplicationProvider.getApplicationContext(), - MainActivity::class.java - ).putExtra(AVOID_SYNC, true) + MainScreenType.Settings + ) rule.launch(intent) } } diff --git a/app/src/main/java/org/dhis2/AppModule.kt b/app/src/main/java/org/dhis2/AppModule.kt index 32f408bfa99..77311e07784 100644 --- a/app/src/main/java/org/dhis2/AppModule.kt +++ b/app/src/main/java/org/dhis2/AppModule.kt @@ -4,7 +4,9 @@ import android.content.Context import dagger.Module import dagger.Provides import org.dhis2.commons.resources.ColorUtils +import org.dhis2.data.service.CheckVersionWorker import org.dhis2.data.service.SyncGranularWorker +import org.dhis2.usescases.main.mainModule import org.koin.androidx.workmanager.dsl.workerOf import org.koin.dsl.module import javax.inject.Singleton @@ -24,5 +26,7 @@ class AppModule( val appModule = module { + includes(mainModule) workerOf(::SyncGranularWorker) + workerOf(::CheckVersionWorker) } diff --git a/app/src/main/java/org/dhis2/data/service/CheckVersionWorker.kt b/app/src/main/java/org/dhis2/data/service/CheckVersionWorker.kt index 62ba41d5c77..531d10c6f03 100644 --- a/app/src/main/java/org/dhis2/data/service/CheckVersionWorker.kt +++ b/app/src/main/java/org/dhis2/data/service/CheckVersionWorker.kt @@ -1,20 +1,17 @@ package org.dhis2.data.service import android.content.Context -import androidx.work.Worker +import androidx.work.CoroutineWorker import androidx.work.WorkerParameters -import org.dhis2.usescases.main.MainPresenter -import javax.inject.Inject class CheckVersionWorker( context: Context, workerParams: WorkerParameters, -) : Worker(context, workerParams) { - @Inject - internal lateinit var presenter: MainPresenter + private val versionRepository: VersionRepository, +) : CoroutineWorker(context, workerParams) { - override fun doWork(): Result { - presenter.checkVersionUpdate() + override suspend fun doWork(): Result { + versionRepository.checkVersionUpdates() return Result.success() } } diff --git a/app/src/main/java/org/dhis2/data/user/UserComponent.java b/app/src/main/java/org/dhis2/data/user/UserComponent.java index 821e61f4cd7..c2f47d587c3 100644 --- a/app/src/main/java/org/dhis2/data/user/UserComponent.java +++ b/app/src/main/java/org/dhis2/data/user/UserComponent.java @@ -26,8 +26,6 @@ import org.dhis2.usescases.eventsWithoutRegistration.eventDetails.injection.EventDetailsModule; import org.dhis2.usescases.eventsWithoutRegistration.eventInitial.EventInitialComponent; import org.dhis2.usescases.eventsWithoutRegistration.eventInitial.EventInitialModule; -import org.dhis2.usescases.main.MainComponent; -import org.dhis2.usescases.main.MainModule; import org.dhis2.usescases.main.program.ProgramComponent; import org.dhis2.usescases.main.program.ProgramModule; import org.dhis2.usescases.notes.NotesComponent; @@ -75,10 +73,6 @@ public interface UserComponent { FilterPresenter filterPresenter(); - @NonNull - MainComponent plus(@NonNull MainModule mainModule); - - @NonNull ProgramEventDetailComponent plus(@NonNull ProgramEventDetailModule programEventDetailModule); diff --git a/app/src/main/java/org/dhis2/di/KoinInitialization.kt b/app/src/main/java/org/dhis2/di/KoinInitialization.kt index be3b7cb076c..362d8ca91d0 100644 --- a/app/src/main/java/org/dhis2/di/KoinInitialization.kt +++ b/app/src/main/java/org/dhis2/di/KoinInitialization.kt @@ -1,6 +1,7 @@ package org.dhis2.di import android.app.Application +import dhis2.org.analytics.charts.di.chartsModule import org.dhis2.BuildConfig import org.dhis2.android.rtsm.di.stockModule import org.dhis2.appModule @@ -52,6 +53,7 @@ object KoinInitialization { biometricModule, matomoModule, syncModule, + chartsModule, ) } } diff --git a/app/src/main/java/org/dhis2/di/ServerModule.kt b/app/src/main/java/org/dhis2/di/ServerModule.kt index dd41ceb12e9..e7c4ea4805f 100644 --- a/app/src/main/java/org/dhis2/di/ServerModule.kt +++ b/app/src/main/java/org/dhis2/di/ServerModule.kt @@ -1,7 +1,9 @@ package org.dhis2.di +import org.dhis2.data.service.VersionRepository import org.hisp.dhis.android.core.D2Configuration import org.hisp.dhis.android.core.D2Manager +import org.koin.core.module.dsl.factoryOf import org.koin.dsl.module fun serverModule(d2Configuration: D2Configuration) = @@ -17,4 +19,5 @@ fun serverModule(d2Configuration: D2Configuration) = D2Manager.getD2() } } + factoryOf(::VersionRepository) } diff --git a/app/src/main/java/org/dhis2/usescases/general/ActivityGlobalAbstract.java b/app/src/main/java/org/dhis2/usescases/general/ActivityGlobalAbstract.java index cbb05962c84..d78c791a753 100644 --- a/app/src/main/java/org/dhis2/usescases/general/ActivityGlobalAbstract.java +++ b/app/src/main/java/org/dhis2/usescases/general/ActivityGlobalAbstract.java @@ -74,7 +74,7 @@ public void showMoreOptions(View view) { return Unit.INSTANCE; }) .onMenuItemClicked(item -> { - analyticsHelper.setEvent(SHOW_HELP, CLICK, SHOW_HELP); + getAnalyticsHelper().setEvent(SHOW_HELP, CLICK, SHOW_HELP); showTutorial(false); return false; }) @@ -191,6 +191,6 @@ public void showSyncDialog(SyncStatusDialog dialog) { @Override public AnalyticsHelper analyticsHelper() { - return analyticsHelper; + return getAnalyticsHelper(); } } diff --git a/app/src/main/java/org/dhis2/usescases/general/SessionManagerActivity.kt b/app/src/main/java/org/dhis2/usescases/general/SessionManagerActivity.kt index a8bd1f4a477..51816c652b5 100644 --- a/app/src/main/java/org/dhis2/usescases/general/SessionManagerActivity.kt +++ b/app/src/main/java/org/dhis2/usescases/general/SessionManagerActivity.kt @@ -47,8 +47,7 @@ abstract class SessionManagerActivity : open var handleEdgeToEdge = true - @Inject - lateinit var analyticsHelper: AnalyticsHelper + val analyticsHelper: AnalyticsHelper by inject() private var pinComposeView: androidx.compose.ui.platform.ComposeView? = null @@ -70,7 +69,6 @@ abstract class SessionManagerActivity : true, null, ) - Unit } if (serverComponent.userManager().isUserLoggedIn().blockingFirst() && !serverComponent.userManager().allowScreenShare() @@ -194,7 +192,7 @@ abstract class SessionManagerActivity : resultCode: Int, data: Intent?, ) { - if (activityResultObserver != null && sessionManagerServiceImpl.isUserLoggedIn()) { + if (activityResultObserver != null && ::sessionManagerServiceImpl.isInitialized && sessionManagerServiceImpl.isUserLoggedIn()) { comesFromImageSource = true activityResultObserver!!.onActivityResult(requestCode, resultCode, data) activityResultObserver = null @@ -267,7 +265,7 @@ abstract class SessionManagerActivity : private fun navigateToLogin(accountsCount: Int) { startActivity( LoginActivity::class.java, - LoginActivity.bundle( + bundle( accountsCount = accountsCount, isDeletion = false, ), diff --git a/app/src/main/java/org/dhis2/usescases/login/SyncIsPerformedInteractor.kt b/app/src/main/java/org/dhis2/usescases/login/SyncIsPerformedInteractor.kt deleted file mode 100644 index cd676dd789b..00000000000 --- a/app/src/main/java/org/dhis2/usescases/login/SyncIsPerformedInteractor.kt +++ /dev/null @@ -1,58 +0,0 @@ -package org.dhis2.usescases.login - -import org.dhis2.data.server.UserManager -import org.dhis2.usescases.sync.WAS_INITIAL_SYNC_DONE - -class SyncIsPerformedInteractor( - private val userManager: UserManager?, -) { - fun execute(): Boolean { - if (userManager == null) return false - - val entryExists = - userManager.d2 - .dataStoreModule() - .localDataStore() - .value( - WAS_INITIAL_SYNC_DONE, - ).blockingExists() - - val serverUrl = - userManager.d2 - .systemInfoModule() - .systemInfo() - .blockingGet() - ?.contextPath() - val username = - userManager.d2 - .userModule() - .user() - .blockingGet() - ?.username() - - val dataBaseIsImport = - userManager.d2 - .userModule() - .accountManager() - .getCurrentAccount() - ?.let { - it.serverUrl() == serverUrl && it.username() == username && it.importDB() != null - } ?: false - - return when { - dataBaseIsImport -> true - entryExists -> { - val entry = - userManager.d2 - .dataStoreModule() - .localDataStore() - .value( - WAS_INITIAL_SYNC_DONE, - ).blockingGet() - !entry?.value().isNullOrEmpty() && entry?.value() == "True" - } - - else -> false - } - } -} diff --git a/app/src/main/java/org/dhis2/usescases/main/HomePageConfigurator.kt b/app/src/main/java/org/dhis2/usescases/main/HomePageConfigurator.kt deleted file mode 100644 index 8563d33d439..00000000000 --- a/app/src/main/java/org/dhis2/usescases/main/HomePageConfigurator.kt +++ /dev/null @@ -1,39 +0,0 @@ -package org.dhis2.usescases.main - -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.BarChart -import org.dhis2.R -import org.dhis2.commons.resources.ResourceManager -import org.dhis2.usescases.main.ui.Form -import org.dhis2.utils.customviews.navigationbar.NavigationPage -import org.dhis2.utils.customviews.navigationbar.NavigationPageConfigurator -import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarItem - -class HomePageConfigurator( - private val homeRepository: HomeRepository, - private val resourceManager: ResourceManager, -) : NavigationPageConfigurator { - override fun displayPrograms(): Boolean = true - - override fun displayAnalytics(): Boolean = homeRepository.hasHomeAnalytics() - - override fun navigationItems(): List> = - buildList { - add( - NavigationBarItem( - id = NavigationPage.PROGRAMS, - icon = Icons.Filled.Form, - label = resourceManager.getString(R.string.navigation_programs), - ), - ) - if (displayAnalytics()) { - add( - NavigationBarItem( - id = NavigationPage.ANALYTICS, - icon = Icons.Filled.BarChart, - label = resourceManager.getString(R.string.navigation_charts), - ), - ) - } - } -} diff --git a/app/src/main/java/org/dhis2/usescases/main/HomeRepository.kt b/app/src/main/java/org/dhis2/usescases/main/HomeRepository.kt deleted file mode 100644 index d58baa1ecf9..00000000000 --- a/app/src/main/java/org/dhis2/usescases/main/HomeRepository.kt +++ /dev/null @@ -1,35 +0,0 @@ -package org.dhis2.usescases.main - -import io.reactivex.Single -import org.hisp.dhis.android.core.category.CategoryCombo -import org.hisp.dhis.android.core.category.CategoryOptionCombo -import org.hisp.dhis.android.core.systeminfo.SystemInfo -import org.hisp.dhis.android.core.user.User - -interface HomeRepository { - fun user(): Single - - fun defaultCatCombo(): Single - - fun defaultCatOptCombo(): Single - - fun hasProgramWithAssignment(): Boolean - - fun checkDeleteBiometricsPermission() - - fun hasHomeAnalytics(): Boolean - - fun getServerVersion(): Single - - fun accountsCount(): Int - - fun isPinStored(): Boolean - - fun homeItemCount(): Int - - suspend fun singleHomeItemData(): HomeItemData? - - suspend fun logOut(): Result - - suspend fun clearSessionLock(): Result -} diff --git a/app/src/main/java/org/dhis2/usescases/main/HomeRepositoryImpl.kt b/app/src/main/java/org/dhis2/usescases/main/HomeRepositoryImpl.kt deleted file mode 100644 index 3161fe3b480..00000000000 --- a/app/src/main/java/org/dhis2/usescases/main/HomeRepositoryImpl.kt +++ /dev/null @@ -1,159 +0,0 @@ -package org.dhis2.usescases.main - -import dhis2.org.analytics.charts.Charts -import io.reactivex.Single -import kotlinx.coroutines.withContext -import org.dhis2.commons.bindings.dataSet -import org.dhis2.commons.bindings.dataSetInstanceSummaries -import org.dhis2.commons.bindings.isStockProgram -import org.dhis2.commons.bindings.programs -import org.dhis2.commons.prefs.Preference -import org.dhis2.commons.prefs.Preference.Companion.PIN -import org.dhis2.commons.prefs.PreferenceProvider -import org.dhis2.mobile.commons.biometrics.CryptographicActions -import org.dhis2.mobile.commons.coroutine.Dispatcher -import org.dhis2.mobile.commons.error.DomainErrorMapper -import org.hisp.dhis.android.core.D2 -import org.hisp.dhis.android.core.category.CategoryCombo -import org.hisp.dhis.android.core.category.CategoryOptionCombo -import org.hisp.dhis.android.core.maintenance.D2Error -import org.hisp.dhis.android.core.program.ProgramType -import org.hisp.dhis.android.core.systeminfo.SystemInfo -import org.hisp.dhis.android.core.user.User - -class HomeRepositoryImpl( - private val d2: D2, - private val charts: Charts?, - private val preferences: PreferenceProvider, - private val cryptographyManager: CryptographicActions, - private val dispatcher: Dispatcher, - private val domainErrorMapper: DomainErrorMapper, -) : HomeRepository { - companion object { - const val BIOMETRICS_PERMISSION = "biometrics_permission" - } - - private suspend fun execute(block: suspend () -> Result): Result = - withContext(dispatcher.io) { - try { - block() - } catch (d2Error: D2Error) { - Result.failure(domainErrorMapper.mapToDomainError(d2Error)) - } - } - - override fun user(): Single = d2.userModule().user().get() - - override fun defaultCatCombo(): Single = - d2 - .categoryModule() - .categoryCombos() - .byIsDefault() - .eq(true) - .one() - .get() - - override fun defaultCatOptCombo(): Single = - d2 - .categoryModule() - .categoryOptionCombos() - .byCode() - .eq(DEFAULT) - .one() - .get() - - override suspend fun logOut(): Result = - execute { - Result.success(d2.userModule().blockingLogOut()) - } - - override suspend fun clearSessionLock(): Result = - execute { - preferences.setValue(Preference.SESSION_LOCKED, false) - d2 - .dataStoreModule() - .localDataStore() - .value(PIN) - .blockingDeleteIfExist() - Result.success(Unit) - } - - override fun hasProgramWithAssignment(): Boolean = - if (d2.userModule().isLogged().blockingGet()) { - !d2 - .programModule() - .programStages() - .byEnableUserAssignment() - .isTrue - .blockingIsEmpty() - } else { - false - } - - override fun checkDeleteBiometricsPermission() { - val hasLessThanTwoAccounts = - d2 - .userModule() - .accountManager() - .getAccounts() - .count() <= 2 - if (hasLessThanTwoAccounts) { - preferences.removeValue(BIOMETRICS_PERMISSION) - cryptographyManager.deleteInvalidKey() - } - } - - override fun hasHomeAnalytics(): Boolean = charts?.getVisualizationGroups(null)?.isNotEmpty() == true - - override fun getServerVersion(): Single = d2.systemInfoModule().systemInfo().get() - - override fun accountsCount() = - d2 - .userModule() - .accountManager() - .getAccounts() - .count() - - override fun isPinStored() = - d2 - .dataStoreModule() - .localDataStore() - .value(PIN) - .blockingExists() - - override fun homeItemCount(): Int = d2.programs().size + d2.dataSetInstanceSummaries().size - - override suspend fun singleHomeItemData(): HomeItemData? { - val program = d2.programs().firstOrNull() - val dataSetInstance = d2.dataSetInstanceSummaries().firstOrNull() - - return when { - program?.programType() == ProgramType.WITH_REGISTRATION -> - HomeItemData.TrackerProgram( - program.uid(), - program.displayName() ?: program.uid(), - program.access().data().write() == true, - program.trackedEntityType()?.uid() ?: "", - isStockUseCase = d2.isStockProgram(program.uid()), - ) - - program?.programType() == ProgramType.WITHOUT_REGISTRATION -> - HomeItemData.EventProgram( - program.uid(), - program.displayName() ?: program.uid(), - program.access().data().write() == true, - ) - - dataSetInstance != null -> { - val dataSet = d2.dataSet(dataSetInstance.dataSetUid()) - HomeItemData.DataSet( - dataSetInstance.dataSetUid(), - dataSetInstance.dataSetDisplayName(), - dataSet?.access()?.data()?.write() == true, - ) - } - - else -> null - } - } -} diff --git a/app/src/main/java/org/dhis2/usescases/main/MainActivity.kt b/app/src/main/java/org/dhis2/usescases/main/MainActivity.kt index a457e2570ab..c113b086db6 100644 --- a/app/src/main/java/org/dhis2/usescases/main/MainActivity.kt +++ b/app/src/main/java/org/dhis2/usescases/main/MainActivity.kt @@ -15,30 +15,20 @@ import android.view.View import android.webkit.MimeTypeMap import android.widget.TextView import android.widget.Toast -import androidx.activity.OnBackPressedCallback +import androidx.activity.compose.setContent import androidx.activity.result.contract.ActivityResultContracts -import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue -import androidx.compose.runtime.livedata.observeAsState -import androidx.compose.runtime.remember -import androidx.compose.ui.platform.ComposeView -import androidx.compose.ui.platform.ViewCompositionStrategy import androidx.constraintlayout.widget.ConstraintSet import androidx.core.app.NotificationCompat import androidx.core.net.toUri -import androidx.databinding.DataBindingUtil +import androidx.core.view.GravityCompat import androidx.drawerlayout.widget.DrawerLayout -import androidx.lifecycle.lifecycleScope import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar -import kotlinx.coroutines.launch import org.dhis2.BuildConfig import org.dhis2.R -import org.dhis2.bindings.app import org.dhis2.bindings.hasPermissions -import org.dhis2.commons.animations.hide -import org.dhis2.commons.animations.show -import org.dhis2.commons.filters.FilterItem import org.dhis2.commons.filters.FilterManager import org.dhis2.commons.filters.Filters import org.dhis2.commons.filters.FiltersAdapter @@ -48,63 +38,51 @@ import org.dhis2.commons.orgunitselector.OUTreeFragment import org.dhis2.commons.sync.OnDismissListener import org.dhis2.commons.sync.SyncContext import org.dhis2.databinding.ActivityMainBinding -import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.usescases.development.DevelopmentActivity import org.dhis2.usescases.general.ActivityGlobalAbstract import org.dhis2.usescases.login.LoginActivity import org.dhis2.usescases.main.ui.NewVersionDialog -import org.dhis2.utils.analytics.CLICK -import org.dhis2.utils.analytics.CLOSE_SESSION -import org.dhis2.utils.customviews.navigationbar.NavigationPage -import org.dhis2.utils.customviews.navigationbar.NavigationPageConfigurator -import org.dhis2.utils.extension.navigateTo +import org.dhis2.usescases.main.ui.TAG +import org.dhis2.usescases.main.ui.model.HomeEffect +import org.dhis2.usescases.main.ui.model.HomeScreenState +import org.dhis2.usescases.main.ui.model.VersionToUpdateState +import org.dhis2.usescases.main.ui.screens.MainScreen import org.dhis2.utils.granularsync.SyncStatusDialog -import org.dhis2.mobile.login.pin.addPinBottomSheet -import org.dhis2.mobile.login.pin.domain.model.PinMode -import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBar -import org.koin.android.ext.android.inject -import java.io.File -import javax.inject.Inject +import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme +import org.koin.androidx.viewmodel.ext.android.viewModel +import org.koin.core.parameter.parametersOf private const val FRAGMENT = "Fragment" -private const val SINGLE_PROGRAM_NAVIGATION = "SINGLE_PROGRAM_NAVIGATION" private const val INIT_DATA_SYNC = "INIT_DATA_SYNC" private const val WIPE_NOTIFICATION = "wipe_notification" private const val RESTART = "Restart" const val AVOID_SYNC = "AvoidSync" -class MainActivity : - ActivityGlobalAbstract(), - MainView, - DrawerLayout.DrawerListener { +class MainActivity : ActivityGlobalAbstract() { private lateinit var binding: ActivityMainBinding + private val mainViewModel: MainViewModel by viewModel(parameters = { + parametersOf( + context, + supportFragmentManager, + intent.getBooleanExtra(AVOID_SYNC, false), + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + intent.getParcelableExtra(FRAGMENT, MainScreenType::class.java) + ?: MainScreenType.Home( + HomeScreen.Programs + ) + } else { + @Suppress("DEPRECATION") + intent.getParcelableExtra(FRAGMENT) ?: MainScreenType.Home(HomeScreen.Programs) + } + ) + }) - lateinit var mainComponent: MainComponent - - @Inject - lateinit var presenter: MainPresenter - - @Inject - lateinit var newAdapter: FiltersAdapter - - @Inject - lateinit var pageConfigurator: NavigationPageConfigurator - - private val syncBackgroundJobAction: SyncBackgroundJobAction by inject() - - private val getDevActivityContent = - registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - // no-op - } + private val filtersAdapter: FiltersAdapter = FiltersAdapter() private var backDropActive = false - private var pinComposeView: ComposeView? = null - private val requestWritePermissions = registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted -> - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - onDownloadNewVersion() - } else if (granted) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R || granted) { onDownloadNewVersion() } else { Toast @@ -116,30 +94,30 @@ class MainActivity : } } - private lateinit var mainNavigator: MainNavigator - private val navigationLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { } companion object { fun intent( context: Context, - initScreen: MainNavigator.MainScreen? = null, + initScreen: MainScreenType? = null, launchDataSync: Boolean = false, ): Intent = Intent(context, MainActivity::class.java).apply { - initScreen?.let { - putExtra(FRAGMENT, initScreen.name) - } - putExtra(INIT_DATA_SYNC, launchDataSync) + putExtras( + bundle( + initScreen = initScreen, + launchDataSync = launchDataSync + ) + ) } fun bundle( - initScreen: MainNavigator.MainScreen? = null, + initScreen: MainScreenType? = null, launchDataSync: Boolean = false, ) = Bundle().apply { initScreen?.let { - putString(FRAGMENT, initScreen.name) + putParcelable(FRAGMENT, initScreen) } putBoolean(INIT_DATA_SYNC, launchDataSync) } @@ -147,234 +125,129 @@ class MainActivity : //region LIFECYCLE override fun onCreate(savedInstanceState: Bundle?) { - app().userComponent()?.let { - mainComponent = - it.plus( - MainModule( - view = this, - syncStatusController = syncStatusController, - syncBackgroundJobAction = syncBackgroundJobAction, - forceToNotSynced = intent.getBooleanExtra(AVOID_SYNC, false), - ), - ) - mainComponent.inject(this@MainActivity) - } ?: navigateTo(true) - mainNavigator = - MainNavigator( - dispatcherProvider = presenter.dispatcherProvider, - supportFragmentManager, - { - if (backDropActive) { - showHideFilter() - } - }, - ) { titleRes, showFilterButton, showBottomNavigation -> - setTitle(getString(titleRes)) - setFilterButtonVisibility(showFilterButton) - setBottomNavigationVisibility(showBottomNavigation) - } super.onCreate(savedInstanceState) - binding = DataBindingUtil.setContentView(this, R.layout.activity_main) - if (::presenter.isInitialized) { - binding.presenter = presenter - } else { - navigateTo(true) + setContent { + DHIS2Theme { + val screenState by mainViewModel.homeScreenState.collectAsState() + MainScreen( + screenState = screenState, + effects = mainViewModel.homeEffects, + onAction = mainViewModel::onAction, + onEffect = { effect -> + when (effect) { + HomeEffect.BlockSession -> finish() + is HomeEffect.GoToLogin -> goToLogin( + accountsCount = effect.accountsCount, + isDeletion = effect.isDeletion, + ) + HomeEffect.OrgUnitFilterRequest -> openOrgUnitTreeSelector() + is HomeEffect.PeriodFilterRequest -> showPeriodRequest(effect.periodRequest) + HomeEffect.ShowDeleteNotification -> showProgressDeleteNotification() + HomeEffect.ShowGranularSync -> showGranularSync() + is HomeEffect.SingleProgramNavigation -> navigationLauncher.navigateTo( + this@MainActivity, + effect.homeItemData, + ) + HomeEffect.ShowPinDialog -> { /*handled in composable*/ } + HomeEffect.ToggleSideMenu -> openDrawer() + HomeEffect.ToggleFilters -> showHideFilter() + } + }, + onNewState = { state -> + if (::binding.isInitialized) { + updateScreen(state) + } + }, + onNewScreen = { currentScreen -> + if (backDropActive) { + showHideFilter() + } + val navigationId = when (currentScreen) { + MainScreenType.About -> R.id.menu_about + is MainScreenType.Home -> R.id.menu_home + MainScreenType.Loading -> null + MainScreenType.QRScanner -> R.id.qr_scan + MainScreenType.Settings -> R.id.sync_manager + MainScreenType.TroubleShooting -> R.id.menu_troubleshooting + } + navigationId?.let { + changeFragment(it) + initCurrentScreen() + } + }, + onLayoutInflated = { + binding = it + initBinding() + }, + ) + } } + } + private fun initBinding() { binding.navView.setNavigationItemSelectedListener { item -> changeFragment(item.itemId) false } - binding.mainDrawerLayout.addDrawerListener(this) - - binding.filterRecycler.adapter = newAdapter + binding.mainDrawerLayout.addDrawerListener(object : DrawerLayout.DrawerListener { + override fun onDrawerSlide(drawerView: View, slideOffset: Float) = Unit - setUpNavigationBar() - setUpDevelopmentMode() + override fun onDrawerOpened(drawerView: View) = Unit - val restoreScreenName = savedInstanceState?.getString(FRAGMENT) - presenter.updateSingleProgramNavigationDone( - savedInstanceState?.getBoolean( - SINGLE_PROGRAM_NAVIGATION, - ) ?: false, - ) - - val openScreen = intent.getStringExtra(FRAGMENT) - - when { - openScreen != null || restoreScreenName != null -> { - changeFragment( - mainNavigator.currentNavigationViewItemId( - openScreen ?: restoreScreenName!!, - ), - ) - mainNavigator.restoreScreen( - screenToRestoreName = openScreen ?: restoreScreenName!!, - languageSelectorOpened = - openScreen != null && - MainNavigator.MainScreen.valueOf(openScreen) == - MainNavigator.MainScreen.TROUBLESHOOTING, - ) - } - - else -> { - changeFragment(R.id.menu_home) + override fun onDrawerClosed(drawerView: View) { initCurrentScreen() } - } - - observeSyncState() - observeVersionUpdate() - observeSingleProgram() - if (!presenter.wasSyncAlreadyDone()) { - presenter.launchInitialDataSync() - } else { - presenter.checkSingleProgramNavigation() - } - - checkNotificationPermission() + override fun onDrawerStateChanged(newState: Int) = Unit + }) - registerOnBackPressedCallback() - } + binding.filterRecycler.adapter = filtersAdapter - private fun checkNotificationPermission() { - if (!hasPermissions(arrayOf(Manifest.permission.POST_NOTIFICATIONS)) and - (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) - ) { - requestNotificationPermission.launch(Manifest.permission.POST_NOTIFICATIONS) - } - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - outState.putBoolean(SINGLE_PROGRAM_NAVIGATION, presenter.isSingleProgramNavigationDone()) - outState.putString(FRAGMENT, mainNavigator.currentScreenName()) - } - - override fun onResume() { - super.onResume() - if (sessionManagerServiceImpl.isUserLoggedIn()) { - presenter.init() - presenter.initFilters() - binding.totalFilters = FilterManager.getInstance().totalFilters - } - } - - override fun onPause() { - presenter.onDetach() - removePinBottomSheet() - super.onPause() - } - - private fun setUpDevelopmentMode() { if (BuildConfig.DEBUG || BuildConfig.FLAVOR == "dhis2Training") { binding.navView.menu .findItem(R.id.menu_troubleshooting) .isVisible = true - binding.menu.setOnLongClickListener { - getDevActivityContent.launch(Intent(this, DevelopmentActivity::class.java)) - false - } + binding.navView.menu + .findItem(R.id.menu_dev) + .isVisible = true } + checkNotificationPermission() } - private fun registerOnBackPressedCallback() { - onBackPressedDispatcher.addCallback( - object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - backPressed() - } - }, - ) - } + private fun updateScreen(screenState: HomeScreenState) { + binding.navView.getHeaderView(0).findViewById(R.id.user_info) + .text = screenState.userName - private fun setUpNavigationBar() { - binding.navigationBar.apply { - setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) - setContent { - val currentScreen by mainNavigator.selectedScreen.observeAsState() - val selectedItemIndex by remember { - derivedStateOf { - when (currentScreen) { - MainNavigator.MainScreen.PROGRAMS -> 0 - MainNavigator.MainScreen.VISUALIZATIONS -> 1 - else -> null - } - } - } - if (pageConfigurator.navigationItems().size > 1) { - NavigationBar( - items = pageConfigurator.navigationItems(), - selectedItemIndex = selectedItemIndex ?: 0, - ) { navigationPage -> - when (navigationPage) { - NavigationPage.ANALYTICS -> { - presenter.trackHomeAnalytics() - mainNavigator.openVisualizations() - } - - NavigationPage.PROGRAMS -> mainNavigator.openPrograms() - else -> { - // no-op - } - } - } - } - } + if (screenState.homeFilters.isNotEmpty()) { + filtersAdapter.submitList(screenState.homeFilters) } - } - private fun observeSyncState() { - lifecycleScope.launch { - presenter.observeDataSync().collect { - when (it.running) { - true -> { - binding.syncActionButton.visibility = View.GONE - setFilterButtonVisibility(false) - setBottomNavigationVisibility(false) - } - - false -> { - setFilterButtonVisibility(true) - binding.syncActionButton.visibility = View.VISIBLE - setBottomNavigationVisibility(true) - presenter.onDataSuccess() - presenter.checkSingleProgramNavigation() - } + when (val versionState = screenState.versionToUpdate) { + VersionToUpdateState.Downloading -> + binding.toolbarProgress.show() - else -> { - // no action - } + is VersionToUpdateState.New -> + if (supportFragmentManager.findFragmentByTag(TAG) == null) { + showNewVersionAlert(versionState.version) } - } - } - } - private fun observeVersionUpdate() { - presenter.versionToUpdate.observe(this) { versionName -> - versionName?.takeIf { it.isNotEmpty() }?.let { showNewVersionAlert(it) } - } - presenter.downloadingVersion.observe(this) { downloading -> - if (downloading) { - binding.toolbarProgress.show() - } else { + VersionToUpdateState.None -> binding.toolbarProgress.hide() - } } } - private fun observeSingleProgram() { - lifecycleScope.launch { - presenter.singleProgramNavigationChannel.collect { homeItemData -> - navigationLauncher.navigateTo(this@MainActivity, homeItemData) - } + /*TODO: MOVE TO BE HANDLED AFTER LOGIN*/ + private fun checkNotificationPermission() { + if (!hasPermissions(arrayOf(Manifest.permission.POST_NOTIFICATIONS)) and + (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) + ) { + requestNotificationPermission.launch(Manifest.permission.POST_NOTIFICATIONS) } } - override fun showHideFilter() { + private fun showHideFilter() { val transition = ChangeBounds() transition.duration = 200 TransitionManager.beginDelayedTransition(binding.backdropLayout, transition) @@ -389,21 +262,21 @@ class MainActivity : ConstraintSet.BOTTOM, 50, ) - binding.navigationBar.hide() + mainViewModel.updateNavigationBarVisibility(false) } else { initSet.connect( R.id.fragment_container, ConstraintSet.TOP, - R.id.toolbar, + R.id.toolbarProgress, ConstraintSet.BOTTOM, 0, ) - binding.navigationBar.show() + mainViewModel.updateNavigationBarVisibility(true) } initSet.applyTo(binding.backdropLayout) } - override fun showGranularSync() { + private fun showGranularSync() { SyncStatusDialog .Builder() .withContext(this) @@ -411,9 +284,7 @@ class MainActivity : .onDismissListener( object : OnDismissListener { override fun onDismiss(hasChanged: Boolean) { - if (hasChanged) { - mainNavigator.getCurrentIfProgram()?.programViewModel?.updateProgramQueries() - } + mainViewModel.onGranularSyncFinished(hasChanged) } }, ).onNoConnectionListener { @@ -427,11 +298,7 @@ class MainActivity : }.show("ALL_SYNC") } - override fun updateFilters(totalFilters: Int) { - binding.totalFilters = totalFilters - } - - override fun showPeriodRequest(periodRequest: FilterManager.PeriodRequest) { + private fun showPeriodRequest(periodRequest: FilterManager.PeriodRequest) { if (periodRequest == FilterManager.PeriodRequest.FROM_TO) { FilterPeriodsDialog .newPeriodsFilter(filterType = Filters.PERIOD, isFromToFilter = true) @@ -443,7 +310,7 @@ class MainActivity : } } - override fun openOrgUnitTreeSelector() { + private fun openOrgUnitTreeSelector() { OUTreeFragment .Builder() .withPreselectedOrgUnits( @@ -452,13 +319,12 @@ class MainActivity : .orgUnitFilters .map { it.uid() } .toMutableList(), - ).onSelection { selectedOrgUnits -> - presenter.setOrgUnitFilters(selectedOrgUnits) - }.build() + ).onSelection(mainViewModel::setOrgUnitFilters) + .build() .show(supportFragmentManager, "OUTreeFragment") } - override fun goToLogin( + private fun goToLogin( accountsCount: Int, isDeletion: Boolean, ) { @@ -469,158 +335,54 @@ class MainActivity : isDeletion = isDeletion, fromMainActivity = true, ), - true, - true, - null, + finishCurrent = true, + finishAll = true, + transition = null, ) } - override fun renderUsername(username: String) { - binding.userName = username - (binding.navView.getHeaderView(0).findViewById(R.id.user_info) as TextView) - .text = username - binding.executePendingBindings() - } - - private fun setFilterButtonVisibility(showFilterButton: Boolean) { - binding.filterActionButton.visibility = - if (showFilterButton && presenter.hasFilters()) { - View.VISIBLE - } else { - View.GONE - } - binding.syncActionButton.visibility = - if (showFilterButton) { - View.VISIBLE - } else { - View.GONE - } - } - - override fun openDrawer(gravity: Int) { - if (!binding.mainDrawerLayout.isDrawerOpen(gravity)) { - binding.mainDrawerLayout.openDrawer(gravity) - } else { - binding.mainDrawerLayout.closeDrawer(gravity) - } - } - - override fun setFilters(filters: List) { - newAdapter.submitList(filters) - } - - override fun hideFilters() { - binding.filterActionButton.visibility = View.GONE - } - - override fun onLockClick() { - if (!presenter.isPinStored()) { - if (pinComposeView != null) return - binding.mainDrawerLayout.closeDrawers() - pinComposeView = addPinBottomSheet( - mode = PinMode.SET, - onSuccess = { - removePinBottomSheet() - presenter.blockSession() - }, - onDismiss = { removePinBottomSheet() }, - ) + private fun openDrawer() { + if (!binding.mainDrawerLayout.isDrawerOpen(GravityCompat.START)) { + binding.mainDrawerLayout.openDrawer(GravityCompat.START) } else { - presenter.blockSession() - } - } - - private fun removePinBottomSheet() { - pinComposeView?.let { view -> - (window?.decorView as? android.view.ViewGroup)?.removeView(view) - } - pinComposeView = null - } - - private fun backPressed() { - when { - !mainNavigator.isHome() -> presenter.onNavigateBackToHome() - else -> back() + binding.mainDrawerLayout.closeDrawer(GravityCompat.START) } } - override fun goToHome() { - mainNavigator.openHome() - } - - override fun changeFragment(id: Int) { + private fun changeFragment(id: Int) { binding.navView.setCheckedItem(id) binding.mainDrawerLayout.closeDrawers() } - fun setTitle(title: String) { - binding.title.text = title - } - - private fun setBottomNavigationVisibility(showBottomNavigation: Boolean) { - if (showBottomNavigation) { - binding.navigationBar.show() - } else { - binding.navigationBar.hide() - } - } - - override fun onDrawerStateChanged(newState: Int) { - // no op - } - - override fun onDrawerSlide( - drawerView: View, - slideOffset: Float, - ) { - // no op - } - - override fun onDrawerClosed(drawerView: View) { - initCurrentScreen() - } - - override fun onDrawerOpened(drawerView: View) { - // no op - } - private fun initCurrentScreen() { when (binding.navView.checkedItem?.itemId) { - R.id.sync_manager -> { - presenter.onClickSyncManager() - mainNavigator.openSettings() - } + R.id.sync_manager -> + mainViewModel.onChangeScreen(MainScreenType.Settings) - R.id.qr_scan -> { - presenter.trackQRScanner() - mainNavigator.openQR() - } + R.id.qr_scan -> + mainViewModel.onChangeScreen(MainScreenType.QRScanner) - R.id.menu_about -> { - mainNavigator.openAbout() - } + R.id.menu_about -> + mainViewModel.onChangeScreen(MainScreenType.About) - R.id.block_button -> { - presenter.trackPinDialog() - onLockClick() - } + R.id.block_button -> + mainViewModel.onBlockSession() - R.id.logout_button -> { - analyticsHelper.setEvent(CLOSE_SESSION, CLICK, CLOSE_SESSION) - presenter.logOut() - } + R.id.logout_button -> + mainViewModel.logOut() - R.id.menu_home -> { - mainNavigator.openHome() - } + R.id.menu_home -> + mainViewModel.onChangeToHome() - R.id.menu_troubleshooting -> { - mainNavigator.openTroubleShooting() - } + R.id.menu_troubleshooting -> + mainViewModel.onChangeScreen(MainScreenType.TroubleShooting) - R.id.delete_account -> { + R.id.menu_dev -> + startActivity(Intent(this, DevelopmentActivity::class.java)) + + R.id.delete_account -> confirmAccountDelete() - } + } } @@ -629,14 +391,13 @@ class MainActivity : .setTitle(getString(R.string.delete_account)) .setMessage(getString(R.string.wipe_data_meesage)) .setView(R.layout.warning_layout) - .setPositiveButton(getString(R.string.wipe_data_ok)) { _, _ -> - presenter.onDeleteAccount() - }.setNegativeButton(getString(R.string.wipe_data_no)) { dialog, _ -> + .setPositiveButton(getString(R.string.wipe_data_ok)) { _, _ -> mainViewModel.onDeleteAccount() } + .setNegativeButton(getString(R.string.wipe_data_no)) { dialog, _ -> dialog.dismiss() }.show() } - override fun showProgressDeleteNotification() { + private fun showProgressDeleteNotification() { val notificationManager = context.getSystemService(NOTIFICATION_SERVICE) as NotificationManager if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { @@ -661,18 +422,10 @@ class MainActivity : notificationManager.notify(123456, notificationBuilder.build()) } - override fun obtainFileView(): File? = this.cacheDir - - override fun cancelNotifications() { - val notificationManager: NotificationManager = - getSystemService(NOTIFICATION_SERVICE) as NotificationManager - notificationManager.cancelAll() - } - private fun showNewVersionAlert(version: String) { NewVersionDialog( newVersion = version, - onRemindMeLater = presenter::remindLaterAlertNewVersion, + onRemindMeLater = mainViewModel::remindLaterAlertNewVersion, onDownloadVersion = { if (hasPermissions(arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE))) { onDownloadNewVersion() @@ -684,8 +437,7 @@ class MainActivity : } private fun onDownloadNewVersion() { - presenter.downloadVersion( - context = context, + mainViewModel.downloadVersion( onDownloadCompleted = ::installAPK, onLaunchUrl = ::launchUrl, ) @@ -716,7 +468,7 @@ class MainActivity : private fun hasNoPermissionToInstall(): Boolean = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && - !packageManager.canRequestPackageInstalls() + !packageManager.canRequestPackageInstalls() private val manageUnknownSources = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { @@ -750,25 +502,24 @@ class MainActivity : private val requestNotificationPermission = registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted -> - if (granted) { - Toast - .makeText( - context, - getString(R.string.permission_notification_granted), - Toast.LENGTH_SHORT, - ).show() + val message = if (granted) { + getString(R.string.permission_notification_granted) } else { - Toast - .makeText( - context, - getString(R.string.permission_notification_denied), - Toast.LENGTH_SHORT, - ).show() + getString(R.string.permission_notification_denied) } + + Toast.makeText(context, message, Toast.LENGTH_SHORT).show() } private fun launchUrl(uri: Uri) { val intent = Intent(Intent.ACTION_VIEW, uri) startActivity(intent) } + + /** Required by QrReaderFragment. It should retrieve the activity mainViewModel and call + * onChangeToHome directly + * */ + fun goToHome() { + mainViewModel.onChangeToHome() + } } diff --git a/app/src/main/java/org/dhis2/usescases/main/MainComponent.kt b/app/src/main/java/org/dhis2/usescases/main/MainComponent.kt deleted file mode 100644 index 74662be2455..00000000000 --- a/app/src/main/java/org/dhis2/usescases/main/MainComponent.kt +++ /dev/null @@ -1,14 +0,0 @@ -package org.dhis2.usescases.main - -import dagger.Subcomponent -import org.dhis2.commons.di.dagger.PerActivity -import org.dhis2.usescases.troubleshooting.TroubleshootingComponent -import org.dhis2.usescases.troubleshooting.TroubleshootingModule - -@PerActivity -@Subcomponent(modules = [MainModule::class]) -interface MainComponent { - fun inject(mainActivity: MainActivity) - - fun plus(troubleShootingModule: TroubleshootingModule): TroubleshootingComponent -} diff --git a/app/src/main/java/org/dhis2/usescases/main/MainModule.kt b/app/src/main/java/org/dhis2/usescases/main/MainModule.kt index 323fe43e729..4e9b14cc5fa 100644 --- a/app/src/main/java/org/dhis2/usescases/main/MainModule.kt +++ b/app/src/main/java/org/dhis2/usescases/main/MainModule.kt @@ -1,161 +1,137 @@ package org.dhis2.usescases.main -import dagger.Module -import dagger.Provides -import dhis2.org.analytics.charts.Charts -import org.dhis2.commons.di.dagger.PerActivity +import android.content.Context +import androidx.fragment.app.FragmentManager +import androidx.work.WorkManager +import kotlinx.coroutines.Dispatchers import org.dhis2.commons.filters.FilterManager -import org.dhis2.commons.filters.FiltersAdapter -import org.dhis2.commons.filters.data.FilterRepository -import org.dhis2.commons.matomo.MatomoAnalyticsController -import org.dhis2.commons.prefs.PreferenceProvider -import org.dhis2.commons.resources.ColorUtils +import org.dhis2.commons.resources.LocaleSelector +import org.dhis2.commons.resources.MetadataIconProvider import org.dhis2.commons.resources.ResourceManager -import org.dhis2.commons.schedulers.SchedulerProvider import org.dhis2.commons.viewmodel.DispatcherProvider -import org.dhis2.data.biometric.CryptographyManager -import org.dhis2.data.server.UserManager import org.dhis2.data.service.VersionRepository import org.dhis2.data.service.workManager.WorkManagerController -import org.dhis2.mobile.commons.biometrics.CryptographicActions -import org.dhis2.mobile.commons.coroutine.Dispatcher -import org.dhis2.mobile.commons.error.DomainErrorMapper -import org.dhis2.mobile.commons.network.NetworkStatusProvider -import org.dhis2.mobile.commons.network.NetworkStatusProviderImpl -import org.dhis2.mobile.commons.resources.D2ErrorMessageProvider -import org.dhis2.mobile.commons.resources.D2ErrorMessageProviderImpl -import org.dhis2.mobile.sync.data.SyncBackgroundJobAction -import org.dhis2.mobile.sync.domain.SyncStatusController -import org.dhis2.usescases.login.SyncIsPerformedInteractor +import org.dhis2.data.service.workManager.WorkManagerControllerImpl +import org.dhis2.usescases.main.data.HomeRepository +import org.dhis2.usescases.main.data.HomeRepositoryImpl +import org.dhis2.usescases.main.domain.CheckSingleNavigation +import org.dhis2.usescases.main.domain.ConfigureHomeNavigationBar +import org.dhis2.usescases.main.domain.DeleteAccount +import org.dhis2.usescases.main.domain.DownloadNewVersion +import org.dhis2.usescases.main.domain.GetHomeFilters +import org.dhis2.usescases.main.domain.GetLockAction +import org.dhis2.usescases.main.domain.GetUserName +import org.dhis2.usescases.main.domain.LaunchInitialSync import org.dhis2.usescases.main.domain.LogoutUser -import org.dhis2.usescases.settings.DeleteUserData -import org.dhis2.utils.customviews.navigationbar.NavigationPageConfigurator -import org.hisp.dhis.android.core.D2 +import org.dhis2.usescases.main.domain.ScheduleNewVersionAlert +import org.dhis2.usescases.main.domain.UpdateInitialSyncStatus +import org.dhis2.usescases.troubleshooting.TroubleshootingRepository +import org.dhis2.usescases.troubleshooting.TroubleshootingViewModel +import org.koin.android.ext.koin.androidContext +import org.koin.core.module.dsl.factoryOf +import org.koin.core.module.dsl.singleOf +import org.koin.core.module.dsl.viewModel +import org.koin.core.parameter.parametersOf +import org.koin.dsl.module -@Module -class MainModule( - val view: MainView, - private val forceToNotSynced: Boolean, - private val syncStatusController: SyncStatusController, - private val syncBackgroundJobAction: SyncBackgroundJobAction, -) { - @Provides - @PerActivity - fun homePresenter( - homeRepository: HomeRepository, - schedulerProvider: SchedulerProvider, - preferences: PreferenceProvider, - workManagerController: WorkManagerController, - filterManager: FilterManager, - filterRepository: FilterRepository, - matomoAnalyticsController: MatomoAnalyticsController, - userManager: UserManager, - deleteUserData: DeleteUserData, - syncIsPerformedInteractor: SyncIsPerformedInteractor, - versionRepository: VersionRepository, - dispatcherProvider: DispatcherProvider, - logoutUser: LogoutUser, - ): MainPresenter = - MainPresenter( - view, - homeRepository, - schedulerProvider, - preferences, - workManagerController, - filterManager, - filterRepository, - matomoAnalyticsController, - userManager, - deleteUserData, - syncIsPerformedInteractor, - syncStatusController, - syncBackgroundJobAction, - versionRepository, - dispatcherProvider, - forceToNotSynced, - logoutUser, - ) +val mainModule = module { - @Provides - @PerActivity - fun provideLogoutUser( - homeRepository: HomeRepository, - filterManager: FilterManager, - ): LogoutUser = - LogoutUser( - homeRepository, - syncBackgroundJobAction, - syncStatusController, - filterManager, - ) + val dispatcher = object : DispatcherProvider { + override fun io() = Dispatchers.IO + override fun computation() = Dispatchers.Unconfined + override fun ui() = Dispatchers.Main + } - @Provides - @PerActivity - fun provideSyncIsPerfomedInteractor(userManager: UserManager): SyncIsPerformedInteractor = SyncIsPerformedInteractor(userManager) + factory { + WorkManagerControllerImpl(WorkManager.getInstance(androidContext())) + } - @Provides - @PerActivity - fun provideHomeRepository( - d2: D2, - charts: Charts?, - preferencesProvider: PreferenceProvider, - cryptographyManager: CryptographicActions, - domainErrorMapper: DomainErrorMapper, - ): HomeRepository = + factory { HomeRepositoryImpl( - d2, - charts, - preferencesProvider, - cryptographyManager, - Dispatcher(), - domainErrorMapper, + d2 = get(), + charts = get(), + preferences = get(), + workManagerController = get(), + syncStatusController = get(), + domainErrorMapper = get(), + dispatcher = get(), ) - - @Provides - @PerActivity - fun provideDomainErrorMapper( - d2ErrorMessageProvider: D2ErrorMessageProvider, - networkStatusProvider: NetworkStatusProvider, - ): DomainErrorMapper = - DomainErrorMapper( - d2ErrorMessageProvider = d2ErrorMessageProvider, - networkStatusProvider = networkStatusProvider, + } + factory { + FilterManager.getInstance() + } + singleOf(::VersionRepository) + factoryOf(::ResourceManager) + factory { params -> + MainNavigator( + fragmentManager = params.get(), ) - - @Provides - @PerActivity - fun provideD2ErrorMessageProvider(): D2ErrorMessageProvider = D2ErrorMessageProviderImpl() - - @Provides - @PerActivity - fun provideNetworkStatusProvider(): NetworkStatusProvider = - NetworkStatusProviderImpl( - context = view.context, + } + factory { params -> + GetUserName( + homeRepository = get { parametersOf(params.get()) } ) + } + factory { params -> + ConfigureHomeNavigationBar( + homeRepository = get { parametersOf(params.get()) }, + resourceManager = get() + ) + } + factoryOf(::GetHomeFilters) + factoryOf(::DownloadNewVersion) + factoryOf(::LogoutUser) + factoryOf(::DeleteAccount) + factoryOf(::GetLockAction) + factoryOf(::UpdateInitialSyncStatus) + factoryOf(::CheckSingleNavigation) + factoryOf(::LaunchInitialSync) + factory { + ScheduleNewVersionAlert( + workManagerController = get(), + versionRepository = get() + ) + } - @Provides - @PerActivity - fun provideCryptographicManager(): CryptographicActions = CryptographyManager() - - @Provides - @PerActivity - fun provideNewFiltersAdapter(): FiltersAdapter = FiltersAdapter() + viewModel { params -> + val context = params.get() + val fragmentManager: FragmentManager = params.get() + val skipInitialSync = params.get() + val initialScreen = params.get() - @Provides - @PerActivity - fun providePageConfigurator(homeRepository: HomeRepository): NavigationPageConfigurator = - HomePageConfigurator(homeRepository, ResourceManager(view.context, ColorUtils())) + MainViewModel( + preferences = get { parametersOf(context) }, + filterManager = get(), + matomoAnalyticsController = get(), + syncStatusController = get(), + mainNavigator = get { parametersOf(fragmentManager) }, + getUserName = get { parametersOf(context) }, + configureHomeNavigationBar = get { parametersOf(context) }, + getHomeFilters = get(), + downloadNewVersion = get(), + logOutUser = get { parametersOf(context) }, + deleteAccount = get(), + getLockAction = get(), + updateInitialSyncStatus = get(), + checkSingleNavigation = get { parametersOf(skipInitialSync) }, + launchInitialSync = get(), + scheduleNewVersionAlert = get(), + syncBackgroundJobAction = get(), + initialScreen = initialScreen, + dispatcher = dispatcher, + ) + } - @Provides - @PerActivity - fun provideDeleteUserData( - workManagerController: WorkManagerController, - preferencesProvider: PreferenceProvider, - filterManager: FilterManager, - ): DeleteUserData = - DeleteUserData( - workManagerController, - filterManager, - preferencesProvider, + factoryOf(::MetadataIconProvider) + factoryOf(::TroubleshootingRepository) + factory { + LocaleSelector(androidContext(), get()) + } + viewModel { params -> + TroubleshootingViewModel( + localeSelector = get(), + repository = get(), + openLanguageSection = params.get() ) + } } diff --git a/app/src/main/java/org/dhis2/usescases/main/MainNavigator.kt b/app/src/main/java/org/dhis2/usescases/main/MainNavigator.kt index 0b45b03ad7a..a7f3912affd 100644 --- a/app/src/main/java/org/dhis2/usescases/main/MainNavigator.kt +++ b/app/src/main/java/org/dhis2/usescases/main/MainNavigator.kt @@ -2,24 +2,10 @@ package org.dhis2.usescases.main import android.transition.ChangeBounds import android.view.View -import androidx.annotation.IdRes -import androidx.annotation.StringRes import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager -import androidx.fragment.app.FragmentTransaction -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData import dhis2.org.analytics.charts.ui.GroupAnalyticsFragment -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.channels.Channel -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.receiveAsFlow -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import org.dhis2.R -import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.usescases.about.AboutFragment import org.dhis2.usescases.main.program.ProgramFragment import org.dhis2.usescases.qrReader.QrReaderFragment @@ -27,167 +13,97 @@ import org.dhis2.usescases.settings.SyncManagerFragment import org.dhis2.usescases.troubleshooting.TroubleshootingFragment class MainNavigator( - private val dispatcherProvider: DispatcherProvider, private val fragmentManager: FragmentManager, - private val onTransitionStart: () -> Unit, - private val onScreenChanged: ( - titleRes: Int, - showFilterButton: Boolean, - showBottomNavigation: Boolean, - ) -> Unit, ) { - enum class MainScreen( - @StringRes val title: Int, - @IdRes val navViewId: Int, - ) { - NONE(-1, -1), - PROGRAMS(R.string.done_task, R.id.menu_home), - VISUALIZATIONS(R.string.done_task, R.id.menu_home), - QR(R.string.QR_SCANNER, R.id.qr_scan), - SETTINGS(R.string.SYNC_MANAGER, R.id.sync_manager), - TROUBLESHOOTING(R.string.main_menu_troubleshooting, R.id.menu_troubleshooting), - ABOUT(R.string.about, R.id.menu_about), - } - - private var currentScreen = MutableLiveData(null) - var selectedScreen: LiveData = currentScreen - - private var _currentScreen = MutableStateFlow(MainScreen.NONE) - var selectedScreenFlow: StateFlow = _currentScreen.asStateFlow() - private var currentFragment: Fragment? = null + private var lastHomeFragment: Fragment? = null - private val _transitionChannel = Channel() - val transitionChannel = _transitionChannel.receiveAsFlow() + fun getCurrentIfProgram(): ProgramFragment? = + currentFragment?.takeIf { it is ProgramFragment } as? ProgramFragment - fun isHome(): Boolean = isPrograms() || isVisualizations() - fun isPrograms(): Boolean = currentScreen.value == MainScreen.PROGRAMS - - fun isVisualizations(): Boolean = currentScreen.value == MainScreen.VISUALIZATIONS - - fun getCurrentIfProgram(): ProgramFragment? = currentFragment?.takeIf { it is ProgramFragment } as? ProgramFragment - - fun currentScreenName() = currentScreen.value?.name - - fun currentNavigationViewItemId(screenName: String): Int = MainScreen.valueOf(screenName).navViewId + fun openHome(): MainScreenType { + return when { + lastHomeFragment is GroupAnalyticsFragment -> { + MainScreenType.Home(HomeScreen.Visualizations) + } - fun openHome() { - when { - isVisualizations() -> openVisualizations() - else -> openPrograms() + else -> { + MainScreenType.Home(HomeScreen.Programs) + } } } fun openPrograms() { val programFragment = ProgramFragment() + lastHomeFragment = programFragment val sharedView = - if (isVisualizations()) { - (currentFragment as GroupAnalyticsFragment).sharedView() - } else { - null + (currentFragment as? GroupAnalyticsFragment)?.sharedView()?.let { sharedView -> + programFragment.sharedElementEnterTransition = ChangeBounds() + programFragment.sharedElementReturnTransition = ChangeBounds() + sharedView } - if (sharedView != null) { - programFragment.sharedElementEnterTransition = ChangeBounds() - programFragment.sharedElementReturnTransition = ChangeBounds() - } + beginTransaction( - ProgramFragment(), - MainScreen.PROGRAMS, + programFragment, sharedView, ) } - fun restoreScreen( - screenToRestoreName: String, - languageSelectorOpened: Boolean = false, - ) { - when (MainScreen.valueOf(screenToRestoreName)) { - MainScreen.NONE -> return - MainScreen.PROGRAMS -> openPrograms() - MainScreen.VISUALIZATIONS -> openVisualizations() - MainScreen.QR -> openQR() - MainScreen.SETTINGS -> openSettings() - MainScreen.ABOUT -> openAbout() - MainScreen.TROUBLESHOOTING -> openTroubleShooting(languageSelectorOpened) - } - } - fun openVisualizations() { - beginTransaction(GroupAnalyticsFragment.forHome(), MainScreen.VISUALIZATIONS) + val visualizationsFragment = GroupAnalyticsFragment.forHome() + lastHomeFragment = visualizationsFragment + beginTransaction(visualizationsFragment) } fun openSettings() { beginTransaction( SyncManagerFragment(), - MainScreen.SETTINGS, ) } fun openQR() { beginTransaction( QrReaderFragment(), - MainScreen.QR, ) } fun openAbout() { beginTransaction( AboutFragment(), - MainScreen.ABOUT, ) } fun openTroubleShooting(languageSelectorOpened: Boolean = false) { beginTransaction( fragment = TroubleshootingFragment.instance(languageSelectorOpened), - screen = MainScreen.TROUBLESHOOTING, useFadeInTransition = languageSelectorOpened, ) } - /*** - * Replace with _transitionChannel.send(Unit) once the MainViewModel is used - * */ private fun beginTransaction( fragment: Fragment, - screen: MainScreen, sharedView: View? = null, useFadeInTransition: Boolean = false, ) { - if (currentScreen.value != screen) { - onTransitionStart() - currentScreen.value = screen - currentFragment = fragment - - CoroutineScope(dispatcherProvider.ui()).launch { - withContext(dispatcherProvider.io()) { - val transaction: FragmentTransaction = fragmentManager.beginTransaction() - transaction - .apply { - if (sharedView == null) { - val (enterAnimation, exitAnimation) = getEnterExitAnimation(useFadeInTransition) - val (enterPopAnimation, exitPopAnimation) = getEnterExitPopAnimation(useFadeInTransition) - setCustomAnimations( - enterAnimation, - exitAnimation, - enterPopAnimation, - exitPopAnimation, - ) - } else { - setReorderingAllowed(true) - addSharedElement(sharedView, "contenttest") - } - }.replace(R.id.fragment_container, fragment, fragment::class.simpleName) - .commitAllowingStateLoss() + currentFragment = fragment + fragmentManager.beginTransaction() + .apply { + if (sharedView == null) { + val (enterAnimation, exitAnimation) = getEnterExitAnimation(useFadeInTransition) + val (enterPopAnimation, exitPopAnimation) = getEnterExitPopAnimation(useFadeInTransition) + setCustomAnimations( + enterAnimation, + exitAnimation, + enterPopAnimation, + exitPopAnimation, + ) + } else { + setReorderingAllowed(true) + addSharedElement(sharedView, "contenttest") } - onScreenChanged( - screen.title, - isPrograms(), - isHome(), - ) - } - } + }.replace(R.id.fragment_container, fragment, fragment::class.simpleName) + .commitAllowingStateLoss() } private fun getEnterExitPopAnimation(useFadeInTransition: Boolean): Pair = diff --git a/app/src/main/java/org/dhis2/usescases/main/MainPresenter.kt b/app/src/main/java/org/dhis2/usescases/main/MainPresenter.kt deleted file mode 100644 index d1b2cccb56e..00000000000 --- a/app/src/main/java/org/dhis2/usescases/main/MainPresenter.kt +++ /dev/null @@ -1,406 +0,0 @@ -package org.dhis2.usescases.main - -import android.content.Context -import android.net.Uri -import android.view.Gravity -import androidx.core.net.toUri -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.asLiveData -import androidx.work.ExistingWorkPolicy -import io.reactivex.Flowable -import io.reactivex.disposables.CompositeDisposable -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Job -import kotlinx.coroutines.channels.Channel -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.flow.receiveAsFlow -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext -import org.dhis2.BuildConfig -import org.dhis2.commons.Constants -import org.dhis2.commons.filters.FilterManager -import org.dhis2.commons.filters.data.FilterRepository -import org.dhis2.commons.matomo.Actions.Companion.BLOCK_SESSION_PIN -import org.dhis2.commons.matomo.Actions.Companion.OPEN_ANALYTICS -import org.dhis2.commons.matomo.Actions.Companion.QR_SCANNER -import org.dhis2.commons.matomo.Actions.Companion.SETTINGS -import org.dhis2.commons.matomo.Categories.Companion.HOME -import org.dhis2.commons.matomo.Labels.Companion.CLICK -import org.dhis2.commons.matomo.MatomoAnalyticsController -import org.dhis2.commons.prefs.Preference -import org.dhis2.commons.prefs.Preference.Companion.DEFAULT_CAT_COMBO -import org.dhis2.commons.prefs.Preference.Companion.PREF_DEFAULT_CAT_OPTION_COMBO -import org.dhis2.commons.prefs.PreferenceProvider -import org.dhis2.commons.schedulers.SchedulerProvider -import org.dhis2.commons.viewmodel.DispatcherProvider -import org.dhis2.data.server.UserManager -import org.dhis2.data.service.VersionRepository -import org.dhis2.data.service.workManager.WorkManagerController -import org.dhis2.data.service.workManager.WorkerItem -import org.dhis2.data.service.workManager.WorkerType -import org.dhis2.mobile.commons.domain.invoke -import org.dhis2.mobile.sync.data.SyncBackgroundJobAction -import org.dhis2.mobile.sync.domain.SyncStatusController -import org.dhis2.mobile.sync.model.SyncStatusData -import org.dhis2.usescases.login.SyncIsPerformedInteractor -import org.dhis2.usescases.main.domain.LogoutUser -import org.dhis2.usescases.settings.DeleteUserData -import org.dhis2.usescases.sync.WAS_INITIAL_SYNC_DONE -import org.dhis2.utils.TRUE -import org.hisp.dhis.android.core.organisationunit.OrganisationUnit -import org.hisp.dhis.android.core.systeminfo.SystemInfo -import org.hisp.dhis.android.core.user.User -import timber.log.Timber -import kotlin.concurrent.atomics.AtomicBoolean -import kotlin.concurrent.atomics.ExperimentalAtomicApi -import kotlin.coroutines.CoroutineContext - -const val PLAY_FLAVOR = "dhisPlayServices" - -@OptIn(ExperimentalAtomicApi::class) -class MainPresenter( - private val view: MainView, - private val repository: HomeRepository, - private val schedulerProvider: SchedulerProvider, - private val preferences: PreferenceProvider, - private val workManagerController: WorkManagerController, - private val filterManager: FilterManager, - private val filterRepository: FilterRepository, - private val matomoAnalyticsController: MatomoAnalyticsController, - private val userManager: UserManager, - private val deleteUserData: DeleteUserData, - private val syncIsPerformedInteractor: SyncIsPerformedInteractor, - private val syncStatusController: SyncStatusController, - private val syncBackgroundJobAction: SyncBackgroundJobAction, - private val versionRepository: VersionRepository, - val dispatcherProvider: DispatcherProvider, - private val forceToNotSynced: Boolean, - private val logoutUser: LogoutUser, -) : CoroutineScope { - private var job = Job() - override val coroutineContext: CoroutineContext - get() = job + dispatcherProvider.io() - - var disposable: CompositeDisposable = CompositeDisposable() - - val versionToUpdate = versionRepository.newAppVersion.asLiveData(coroutineContext) - val downloadingVersion = MutableLiveData(false) - - private val _singleProgramNavigationChannel = Channel() - val singleProgramNavigationChannel = - _singleProgramNavigationChannel - .receiveAsFlow() - .onEach { - singleProgramNavigationDone.store(true) - } - - private var singleProgramNavigationDone = AtomicBoolean(false) - - fun init() { - preferences.removeValue(Preference.CURRENT_ORG_UNIT) - disposable.add( - repository - .user() - .map { username(it) } - .subscribeOn(schedulerProvider.io()) - .observeOn(schedulerProvider.ui()) - .subscribe( - { view.renderUsername(it) }, - { Timber.e(it) }, - ), - ) - - disposable.add( - repository - .defaultCatCombo() - .subscribeOn(schedulerProvider.io()) - .subscribe( - { categoryCombo -> - preferences.setValue(DEFAULT_CAT_COMBO, categoryCombo?.uid()) - }, - { Timber.e(it) }, - ), - ) - - disposable.add( - repository - .defaultCatOptCombo() - .subscribeOn(schedulerProvider.io()) - .subscribe( - { categoryOptionCombo -> - preferences.setValue( - PREF_DEFAULT_CAT_OPTION_COMBO, - categoryOptionCombo?.uid(), - ) - }, - { Timber.e(it) }, - ), - ) - trackDhis2Server() - } - - fun initFilters() { - disposable.add( - Flowable - .just(filterRepository.homeFilters()) - .subscribeOn(schedulerProvider.io()) - .observeOn(schedulerProvider.ui()) - .subscribe( - { filters -> - if (filters.isEmpty()) { - view.hideFilters() - } else { - view.setFilters(filters) - } - }, - { Timber.e(it) }, - ), - ) - - disposable.add( - filterManager - .asFlowable() - .subscribeOn(schedulerProvider.io()) - .observeOn(schedulerProvider.ui()) - .subscribe( - { filterManager -> view.updateFilters(filterManager.totalFilters) }, - { Timber.e(it) }, - ), - ) - - disposable.add( - filterManager.periodRequest - .subscribeOn(schedulerProvider.io()) - .observeOn(schedulerProvider.ui()) - .subscribe( - { periodRequest -> view.showPeriodRequest(periodRequest.first) }, - { Timber.e(it) }, - ), - ) - - disposable.add( - filterManager - .ouTreeFlowable() - .subscribeOn(schedulerProvider.io()) - .observeOn(schedulerProvider.ui()) - .subscribe( - { view.openOrgUnitTreeSelector() }, - { Timber.e(it) }, - ), - ) - } - - fun trackDhis2Server() { - disposable.add( - repository - .getServerVersion() - .subscribeOn(schedulerProvider.io()) - .observeOn(schedulerProvider.ui()) - .subscribe( - { systemInfo -> systemInfo?.let { compareAndTrack(systemInfo) } }, - { Timber.e(it) }, - ), - ) - } - - private fun compareAndTrack(systemInfo: SystemInfo) { - val dhis2ServerTracked = preferences.getString("$DHIS2${getUserUid()}", "") - val currentDhis2Server = systemInfo.version() ?: "" - - if ((dhis2ServerTracked.isNullOrEmpty() || dhis2ServerTracked != currentDhis2Server) && - currentDhis2Server.isNotEmpty() - ) { - matomoAnalyticsController.trackEvent( - HOME, - SERVER_ACTION, - currentDhis2Server, - ) - preferences.setValue("$DHIS2${getUserUid()}", currentDhis2Server) - } - } - - fun setOrgUnitFilters(selectedOrgUnits: List) { - filterManager.addOrgUnits(selectedOrgUnits) - } - - private fun getUserUid(): String = - try { - userManager.d2 - .userModule() - .user() - .blockingGet() - ?.uid() ?: "" - } catch (_: Exception) { - "" - } - - fun logOut() { - launch(dispatcherProvider.ui()) { - logoutUser().fold( - onSuccess = { accounts -> - view.goToLogin(accounts, isDeletion = false) - }, - onFailure = { - Timber.e(it) - }, - ) - } - } - - fun onDeleteAccount() { - view.showProgressDeleteNotification() - launch(dispatcherProvider.io()) { - try { - repository.checkDeleteBiometricsPermission() - syncBackgroundJobAction.cancelAll() - syncStatusController.restore() - deleteUserData.wipeCacheAndPreferences(view.obtainFileView()) - userManager.d2?.wipeModule()?.wipeEverything() - userManager.d2 - ?.userModule() - ?.accountManager() - ?.deleteCurrentAccount() - - view.cancelNotifications() - - withContext(dispatcherProvider.ui()) { - view.goToLogin(repository.accountsCount(), isDeletion = true) - } - } catch (exception: Exception) { - Timber.e(exception) - } - } - } - - fun onSyncAllClick() { - view.showGranularSync() - } - - fun blockSession() { - workManagerController.cancelAllWork() - view.back() - } - - fun showFilter() { - view.showHideFilter() - } - - fun onDetach() { - disposable.clear() - } - - fun onMenuClick() { - view.openDrawer(Gravity.START) - } - - private fun username(user: User): String = - String.format( - "%s %s", - if (user.firstName().isNullOrEmpty()) "" else user.firstName(), - if (user.surname().isNullOrEmpty()) "" else user.surname(), - ) - - fun onNavigateBackToHome() { - view.goToHome() - initFilters() - } - - fun onClickSyncManager() { - matomoAnalyticsController.trackEvent(HOME, SETTINGS, CLICK) - } - - fun isPinStored() = repository.isPinStored() - - fun launchInitialDataSync() { - checkVersionUpdate() - syncBackgroundJobAction.launchDataSync(0) - } - - fun observeDataSync(): StateFlow = syncStatusController.observeDownloadProcess() - - fun wasSyncAlreadyDone(): Boolean { - if (forceToNotSynced) { - return true - } - return syncIsPerformedInteractor.execute() - } - - fun onDataSuccess() { - launch(dispatcherProvider.io()) { - userManager.d2 - .dataStoreModule() - .localDataStore() - .value(WAS_INITIAL_SYNC_DONE) - .blockingSet(TRUE) - } - } - - fun trackHomeAnalytics() { - matomoAnalyticsController.trackEvent(HOME, OPEN_ANALYTICS, CLICK) - } - - fun trackPinDialog() { - matomoAnalyticsController.trackEvent(HOME, BLOCK_SESSION_PIN, CLICK) - } - - fun trackQRScanner() { - matomoAnalyticsController.trackEvent(HOME, QR_SCANNER, CLICK) - } - - fun checkVersionUpdate() { - launch { - versionRepository.checkVersionUpdates() - } - } - - fun remindLaterAlertNewVersion() { - val workerItem = - WorkerItem( - Constants.NEW_APP_VERSION, - WorkerType.NEW_VERSION, - delayInSeconds = 24 * 60 * 60, - policy = ExistingWorkPolicy.REPLACE, - ) - workManagerController.beginUniqueWork(workerItem) - versionRepository.removeVersionInfo() - } - - fun downloadVersion( - context: Context, - onDownloadCompleted: (Uri) -> Unit, - onLaunchUrl: (Uri) -> Unit, - ) { - if (BuildConfig.FLAVOR == PLAY_FLAVOR) { - val url = versionRepository.getUrl() - url?.toUri()?.let { onLaunchUrl(it) } - } else { - versionRepository.download( - context = context, - onDownloadCompleted = { - onDownloadCompleted(it.toUri()) - downloadingVersion.value = false - }, - onDownloading = { downloadingVersion.value = true }, - ) - } - } - - fun checkSingleProgramNavigation() { - if (!singleProgramNavigationDone.load() && repository.homeItemCount() == 1) { - launch(coroutineContext) { - repository.singleHomeItemData()?.let { - _singleProgramNavigationChannel.send(it) - } - } - } - } - - fun hasFilters(): Boolean = filterRepository.homeFilters().isNotEmpty() - - fun updateSingleProgramNavigationDone(done: Boolean) { - singleProgramNavigationDone.store(done) - } - - fun isSingleProgramNavigationDone() = singleProgramNavigationDone.load() -} diff --git a/app/src/main/java/org/dhis2/usescases/main/MainScreenType.kt b/app/src/main/java/org/dhis2/usescases/main/MainScreenType.kt new file mode 100644 index 00000000000..dfff1ba3dda --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/MainScreenType.kt @@ -0,0 +1,24 @@ +package org.dhis2.usescases.main + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Parcelize +sealed class MainScreenType : Parcelable { + data object Loading : MainScreenType() + data class Home(val homeScreen: HomeScreen) : MainScreenType() + data object QRScanner : MainScreenType() + data object Settings : MainScreenType() + data object About : MainScreenType() + data object TroubleShooting : MainScreenType() + + fun isHome() = this is Home + fun isPrograms() = this is Home && this.homeScreen == HomeScreen.Programs + fun isVisualizations() = this is Home && this.homeScreen == HomeScreen.Visualizations +} + +@Parcelize +sealed interface HomeScreen : Parcelable { + data object Programs : HomeScreen + data object Visualizations : HomeScreen +} \ No newline at end of file diff --git a/app/src/main/java/org/dhis2/usescases/main/MainView.kt b/app/src/main/java/org/dhis2/usescases/main/MainView.kt deleted file mode 100644 index e870cbbc861..00000000000 --- a/app/src/main/java/org/dhis2/usescases/main/MainView.kt +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2004 - 2019, University of Oslo - * All rights reserved. - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * Neither the name of the HISP project nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package org.dhis2.usescases.main - -import androidx.annotation.UiThread -import org.dhis2.commons.filters.FilterItem -import org.dhis2.commons.filters.FilterManager -import org.dhis2.usescases.general.AbstractActivityContracts -import java.io.File - -interface MainView : AbstractActivityContracts.View { - @UiThread - fun renderUsername(username: String) - - fun openDrawer(gravity: Int) - - fun showHideFilter() - - fun onLockClick() - - fun changeFragment(id: Int) - - fun updateFilters(totalFilters: Int) - - fun showPeriodRequest(periodRequest: FilterManager.PeriodRequest) - - fun openOrgUnitTreeSelector() - - fun goToHome() - - fun setFilters(filters: List) - - fun hideFilters() - - fun showGranularSync() - - fun goToLogin( - accountsCount: Int, - isDeletion: Boolean, - ) - - fun showProgressDeleteNotification() - - fun obtainFileView(): File? - - fun cancelNotifications() -} diff --git a/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt b/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt index f7cb517ffc2..02a2eeddcd6 100644 --- a/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt @@ -6,16 +6,15 @@ import androidx.core.net.toUri import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.withContext import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted -import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update -import kotlinx.coroutines.launch import kotlinx.coroutines.reactive.asFlow import org.dhis2.commons.filters.FilterManager import org.dhis2.commons.matomo.Actions.Companion.BLOCK_SESSION_PIN @@ -26,11 +25,11 @@ import org.dhis2.commons.matomo.Categories.Companion.HOME import org.dhis2.commons.matomo.Labels.Companion.CLICK import org.dhis2.commons.matomo.MatomoAnalyticsController import org.dhis2.commons.prefs.Preference -import org.dhis2.commons.prefs.PreferenceProvider -import org.dhis2.commons.resources.ResourceManager -import org.dhis2.data.service.VersionRepository +import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.mobile.commons.domain.invoke import org.dhis2.mobile.commons.extensions.launchUseCase +import org.dhis2.mobile.commons.providers.PreferenceProvider +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.mobile.sync.domain.SyncStatusController import org.dhis2.mobile.sync.model.SyncStatusData import org.dhis2.usescases.main.domain.CheckSingleNavigation @@ -47,7 +46,8 @@ import org.dhis2.usescases.main.domain.ScheduleNewVersionAlert import org.dhis2.usescases.main.domain.UpdateInitialSyncStatus import org.dhis2.usescases.main.domain.model.DownloadMethod import org.dhis2.usescases.main.domain.model.LockAction -import org.dhis2.usescases.main.ui.model.HomeEvent +import org.dhis2.usescases.main.ui.model.HomeAction +import org.dhis2.usescases.main.ui.model.HomeEffect import org.dhis2.usescases.main.ui.model.HomeScreenState import org.dhis2.usescases.main.ui.model.VersionToUpdateState import org.dhis2.usescases.main.ui.model.defaultHomeScreenState @@ -55,18 +55,12 @@ import org.dhis2.utils.analytics.CLOSE_SESSION import org.hisp.dhis.android.core.organisationunit.OrganisationUnit import timber.log.Timber -const val DEFAULT = "default" -const val SERVER_ACTION = "Server" -const val DHIS2 = "dhis2_server" - class MainViewModel( private val preferences: PreferenceProvider, private val filterManager: FilterManager, private val matomoAnalyticsController: MatomoAnalyticsController, syncStatusController: SyncStatusController, - versionRepository: VersionRepository, - private val resourceManager: ResourceManager, - private val mainNavigator: MainNavigator, + val mainNavigator: MainNavigator, private val getUserName: GetUserName, private val configureHomeNavigationBar: ConfigureHomeNavigationBar, private val getHomeFilters: GetHomeFilters, @@ -78,16 +72,19 @@ class MainViewModel( private val checkSingleNavigation: CheckSingleNavigation, private val launchInitialSync: LaunchInitialSync, private val scheduleNewVersionAlert: ScheduleNewVersionAlert, + private val syncBackgroundJobAction: SyncBackgroundJobAction, + private val initialScreen: MainScreenType, + private val dispatcher: DispatcherProvider, ) : ViewModel() { private val _homeScreenState = MutableStateFlow(defaultHomeScreenState) - private val _homeEvents = Channel() - val homeEvents = _homeEvents.receiveAsFlow() + private val _homeEffects = Channel(Channel.BUFFERED) + val homeEffects = _homeEffects.receiveAsFlow() val homeScreenState = _homeScreenState .onStart { - loadData() + loadData(initialScreen) }.stateIn( viewModelScope, SharingStarted.WhileSubscribed(5000), @@ -96,7 +93,7 @@ class MainViewModel( init { - launchUseCase { + launchUseCase(dispatcher.io()) { preferences.removeValue(Preference.CURRENT_ORG_UNIT) } @@ -105,12 +102,7 @@ class MainViewModel( .onEach(::handleDownloadProcess) .launchIn(viewModelScope) - mainNavigator.selectedScreenFlow - .filter { it != MainNavigator.MainScreen.NONE } - .onEach(::handleScreen) - .launchIn(viewModelScope) - - versionRepository.newAppVersion + scheduleNewVersionAlert.newVersionFlow .onEach(::onNewVersionAvailable) .launchIn(viewModelScope) @@ -125,17 +117,17 @@ class MainViewModel( filterManager.periodRequest .asFlow() .onEach { - _homeEvents.send(HomeEvent.PeriodFilterRequest(it.first)) + _homeEffects.send(HomeEffect.PeriodFilterRequest(it.first)) }.launchIn(viewModelScope) filterManager .ouTreeFlowable() .asFlow() .onEach { - _homeEvents.send(HomeEvent.OrgUnitFilterRequest) + _homeEffects.send(HomeEffect.OrgUnitFilterRequest) }.launchIn(viewModelScope) - launchUseCase { + launchUseCase(dispatcher.io()) { launchInitialSync().fold( onSuccess = ::handleInitialSyncResult, onFailure = { @@ -166,48 +158,28 @@ class MainViewModel( } } - private fun handleScreen(selectedScreen: MainNavigator.MainScreen) { - when (selectedScreen) { - MainNavigator.MainScreen.VISUALIZATIONS -> - trackHomeAnalytics() - - MainNavigator.MainScreen.QR -> - trackQRScanner() - - else -> { - // do nothing - } - } - _homeScreenState.update { - it.copy( - title = resourceManager.getString(selectedScreen.title), - filterButtonVisible = mainNavigator.isPrograms(), - bottomNavigationBarVisible = mainNavigator.isHome(), - syncButtonVisible = mainNavigator.isHome(), - ) - } - } - - private fun loadData() { - launchUseCase { + private fun loadData(initialScreen: MainScreenType) { + launchUseCase(dispatcher.io()) { val userName = getUserName().getOrDefault("") val navigationBarItems = configureHomeNavigationBar().getOrDefault(emptyList()) val homeFilters = getHomeFilters().getOrDefault(emptyList()) - val currentScreen = mainNavigator.selectedScreenFlow.value _homeScreenState.update { HomeScreenState( userName = userName, - title = resourceManager.getString(currentScreen.title), navigationBarItems = navigationBarItems, homeFilters = homeFilters, activeFilters = filterManager.totalFilters, versionToUpdate = VersionToUpdateState.None, - filterButtonVisible = mainNavigator.isPrograms(), - bottomNavigationBarVisible = mainNavigator.isHome(), - syncButtonVisible = mainNavigator.isHome(), + filterButtonVisible = initialScreen.isPrograms(), + bottomNavigationBarVisible = initialScreen.isHome() && navigationBarItems.size > 1, + syncButtonVisible = initialScreen.isHome(), + currentScreen = initialScreen, ) } + withContext(dispatcher.ui()) { + openScreen(initialScreen) + } } } @@ -243,15 +215,10 @@ class MainViewModel( } private fun shouldNavigateToSingleProgram() { - launchUseCase { - checkSingleNavigation().fold( - onSuccess = { homeItemData -> - _homeEvents.send(HomeEvent.SingleProgramNavigation(homeItemData)) - }, - onFailure = { - Timber.e(it) - }, - ) + launchUseCase(dispatcher.io()) { + checkSingleNavigation().getOrNull()?.let { + _homeEffects.send(HomeEffect.SingleProgramNavigation(it)) + } } } @@ -260,11 +227,11 @@ class MainViewModel( } fun logOut() { - launchUseCase { + launchUseCase(dispatcher.io()) { matomoAnalyticsController.trackEvent(HOME, CLOSE_SESSION, CLICK) logOutUser().fold( onSuccess = { accountCount -> - _homeEvents.send(HomeEvent.GoToLogin(accountCount, false)) + _homeEffects.send(HomeEffect.GoToLogin(accountCount, false)) }, onFailure = { Timber.e(it) @@ -275,12 +242,12 @@ class MainViewModel( context(context: Context) fun onDeleteAccount() { - launchUseCase { - _homeEvents.send(HomeEvent.ShowDeleteNotification) + launchUseCase(dispatcher.io()) { + _homeEffects.send(HomeEffect.ShowDeleteNotification) deleteAccount(context.cacheDir).fold( onSuccess = { accountCount -> - _homeEvents.send(HomeEvent.CancelAllNotifications) - _homeEvents.send(HomeEvent.GoToLogin(accountCount, true)) + syncBackgroundJobAction.cancelAll() + _homeEffects.send(HomeEffect.GoToLogin(accountCount, true)) }, onFailure = { Timber.e(it) @@ -289,37 +256,31 @@ class MainViewModel( } } - fun onSyncAllClick() { - viewModelScope.launch { - _homeEvents.send(HomeEvent.ShowGranularSync) + private fun onSyncAllClick() { + launchUseCase(dispatcher.io()) { + _homeEffects.send(HomeEffect.ShowGranularSync) } } - fun showFilter() { - viewModelScope.launch { - _homeEvents.send(HomeEvent.ToggleFilters) + private fun showFilter() { + launchUseCase(dispatcher.io()) { + _homeEffects.send(HomeEffect.ToggleFilters) _homeScreenState.update { it.copy( - bottomNavigationBarVisible = !it.bottomNavigationBarVisible, + bottomNavigationBarVisible = !it.bottomNavigationBarVisible && it.currentScreen.isHome() && it.navigationBarItems.size > 1, ) } } } - fun onMenuClick() { - viewModelScope.launch { - _homeEvents.send(HomeEvent.ToggleSideMenu) - } - } - - fun onClickSyncManager() { - viewModelScope.launch { - matomoAnalyticsController.trackEvent(HOME, SETTINGS, CLICK) + private fun onMenuClick() { + launchUseCase(dispatcher.io()) { + _homeEffects.send(HomeEffect.ToggleSideMenu) } } fun onDataSuccess() { - launchUseCase { + launchUseCase(dispatcher.io()) { updateInitialSyncStatus().fold( onSuccess = { // Do nothing @@ -331,22 +292,16 @@ class MainViewModel( } } - fun trackHomeAnalytics() { - viewModelScope.launch { - matomoAnalyticsController.trackEvent(HOME, OPEN_ANALYTICS, CLICK) - } - } - fun onBlockSession() { - launchUseCase { + launchUseCase(dispatcher.io()) { getLockAction().fold( onSuccess = { result -> when (result) { LockAction.BlockSession -> - _homeEvents.send(HomeEvent.BlockSession) + _homeEffects.send(HomeEffect.BlockSession) LockAction.CreatePin -> - _homeEvents.send(HomeEvent.ShowPinDialog) + _homeEffects.send(HomeEffect.ShowPinDialog) } }, onFailure = { Timber.e(it) }, @@ -355,19 +310,13 @@ class MainViewModel( matomoAnalyticsController.trackEvent(HOME, BLOCK_SESSION_PIN, CLICK) } - fun trackQRScanner() { - viewModelScope.launch { - matomoAnalyticsController.trackEvent(HOME, QR_SCANNER, CLICK) - } - } - fun remindLaterAlertNewVersion() { _homeScreenState.update { it.copy( versionToUpdate = VersionToUpdateState.None, ) } - launchUseCase { + launchUseCase(dispatcher.io()) { scheduleNewVersionAlert() } } @@ -377,7 +326,7 @@ class MainViewModel( onDownloadCompleted: (Uri) -> Unit, onLaunchUrl: (Uri) -> Unit, ) { - launchUseCase { + launchUseCase(dispatcher.io()) { _homeScreenState.update { it.copy( versionToUpdate = VersionToUpdateState.Downloading, @@ -400,12 +349,100 @@ class MainViewModel( } } - fun onBackPressed() { - viewModelScope.launch { - when { - !mainNavigator.isHome() -> mainNavigator.openHome() - else -> _homeEvents.send(HomeEvent.BlockSession) + private fun onBackPressed() { + if (!_homeScreenState.value.currentScreen.isHome()) { + navigateToScreen(mainNavigator.openHome()) + } else { + launchUseCase { _homeEffects.send(HomeEffect.BlockSession) } + } + } + + fun onChangeToHome() { + navigateToScreen(mainNavigator.openHome()) + } + + fun updateNavigationBarVisibility(bottomNavigationBarIsVisible: Boolean) { + launchUseCase(dispatcher.io()) { + _homeScreenState.update { + it.copy(bottomNavigationBarVisible = bottomNavigationBarIsVisible && it.currentScreen.isHome() && it.navigationBarItems.size > 1) + } + } + } + + fun onChangeScreen(screenToOpen: MainScreenType) { + navigateToScreen(screenToOpen) + } + + private fun navigateToScreen(screenToOpen: MainScreenType) { + if (_homeScreenState.value.currentScreen == screenToOpen) return + _homeScreenState.update { + it.copy( + filterButtonVisible = screenToOpen.isPrograms(), + bottomNavigationBarVisible = screenToOpen.isHome() && it.navigationBarItems.size > 1, + syncButtonVisible = screenToOpen.isHome(), + currentScreen = screenToOpen, + ) + } + openScreen(screenToOpen) + } + + private fun openScreen(screenToOpen: MainScreenType) { + when (screenToOpen) { + MainScreenType.About -> mainNavigator.openAbout() + is MainScreenType.Home -> { + when (screenToOpen.homeScreen) { + HomeScreen.Programs -> + mainNavigator.openPrograms() + + HomeScreen.Visualizations -> { + matomoAnalyticsController.trackEvent(HOME, OPEN_ANALYTICS, CLICK) + mainNavigator.openVisualizations() + } + } + } + + MainScreenType.Loading -> { + /*no-op*/ + } + + MainScreenType.QRScanner -> { + matomoAnalyticsController.trackEvent(HOME, QR_SCANNER, CLICK) + mainNavigator.openQR() + } + + MainScreenType.Settings -> { + matomoAnalyticsController.trackEvent(HOME, SETTINGS, CLICK) + mainNavigator.openSettings() } + + MainScreenType.TroubleShooting -> + mainNavigator.openTroubleShooting() + + } + } + + fun onGranularSyncFinished(hasChanged: Boolean) { + launchUseCase(dispatcher.io()) { + if (hasChanged) { + mainNavigator.getCurrentIfProgram()?.programViewModel?.updateProgramQueries() + } + } + } + + private fun onPinSet() { + launchUseCase(dispatcher.io()) { + _homeEffects.send(HomeEffect.BlockSession) + } + } + + fun onAction(action: HomeAction) { + when (action) { + HomeAction.BackPressed -> onBackPressed() + HomeAction.MenuClicked -> onMenuClick() + HomeAction.SyncClicked -> onSyncAllClick() + HomeAction.FilterClicked -> showFilter() + is HomeAction.ScreenChanged -> onChangeScreen(action.screen) + HomeAction.PinSet -> onPinSet() } } } \ No newline at end of file diff --git a/app/src/main/java/org/dhis2/usescases/main/data/HomeRepository.kt b/app/src/main/java/org/dhis2/usescases/main/data/HomeRepository.kt index 5b3f7ec6aa3..3b13b4ecc97 100644 --- a/app/src/main/java/org/dhis2/usescases/main/data/HomeRepository.kt +++ b/app/src/main/java/org/dhis2/usescases/main/data/HomeRepository.kt @@ -7,9 +7,9 @@ import java.io.File interface HomeRepository { suspend fun user(): User? - suspend fun logOut() + suspend fun logOut(): Result - suspend fun clearPin() + suspend fun clearPin(): Result suspend fun hasHomeAnalytics(): Boolean diff --git a/app/src/main/java/org/dhis2/usescases/main/data/HomeRepositoryImpl.kt b/app/src/main/java/org/dhis2/usescases/main/data/HomeRepositoryImpl.kt index 64ea8dc8aa4..eb521b6fb4b 100644 --- a/app/src/main/java/org/dhis2/usescases/main/data/HomeRepositoryImpl.kt +++ b/app/src/main/java/org/dhis2/usescases/main/data/HomeRepositoryImpl.kt @@ -93,6 +93,7 @@ class HomeRepositoryImpl( override suspend fun logOut() = execute { d2.userModule().blockingLogOut() + Result.success(Unit) } override suspend fun clearPin() = @@ -103,6 +104,7 @@ class HomeRepositoryImpl( .localDataStore() .value(PIN) .blockingDeleteIfExist() + Result.success(Unit) } override suspend fun hasHomeAnalytics(): Boolean = diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/ConfigureHomeNavigationBar.kt b/app/src/main/java/org/dhis2/usescases/main/domain/ConfigureHomeNavigationBar.kt index 2d2d368432d..ebd125de769 100644 --- a/app/src/main/java/org/dhis2/usescases/main/domain/ConfigureHomeNavigationBar.kt +++ b/app/src/main/java/org/dhis2/usescases/main/domain/ConfigureHomeNavigationBar.kt @@ -1,24 +1,51 @@ package org.dhis2.usescases.main.domain +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.BarChart +import org.dhis2.R +import org.dhis2.commons.resources.ResourceManager import org.dhis2.mobile.commons.domain.UseCase import org.dhis2.mobile.commons.error.DomainError import org.dhis2.usescases.main.data.HomeRepository -import org.dhis2.usescases.main.domain.model.BottomNavigationItem +import org.dhis2.usescases.main.ui.Form +import org.dhis2.utils.customviews.navigationbar.NavigationPage +import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarItem class ConfigureHomeNavigationBar( private val homeRepository: HomeRepository, -) : UseCase> { + private val resourceManager: ResourceManager, +) : UseCase>> { override suspend operator fun invoke(input: Unit) = try { val list = buildList { - add(BottomNavigationItem.Program) + add( + NavigationBarItem( + id = NavigationPage.PROGRAMS, + icon = Icons.Filled.Form, + label = resourceManager.getString(R.string.navigation_programs), + ) + ) if (homeRepository.hasHomeAnalytics()) { - add(BottomNavigationItem.Analytics) + add( + NavigationBarItem( + id = NavigationPage.ANALYTICS, + icon = Icons.Filled.BarChart, + label = resourceManager.getString(R.string.navigation_charts), + ) + ) } } Result.success(list) } catch (_: DomainError) { - Result.success(listOf(BottomNavigationItem.Program)) + Result.success( + listOf( + NavigationBarItem( + id = NavigationPage.PROGRAMS, + icon = Icons.Filled.Form, + label = resourceManager.getString(R.string.navigation_programs), + ) + ) + ) } } diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/LogoutUser.kt b/app/src/main/java/org/dhis2/usescases/main/domain/LogoutUser.kt index 7ce9f53b918..b9243b956f5 100644 --- a/app/src/main/java/org/dhis2/usescases/main/domain/LogoutUser.kt +++ b/app/src/main/java/org/dhis2/usescases/main/domain/LogoutUser.kt @@ -4,7 +4,7 @@ import org.dhis2.commons.filters.FilterManager import org.dhis2.mobile.commons.domain.UseCase import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.mobile.sync.domain.SyncStatusController -import org.dhis2.usescases.main.HomeRepository +import org.dhis2.usescases.main.data.HomeRepository typealias AccountCount = Int @@ -20,7 +20,7 @@ class LogoutUser( filterManager.clearAllFilters() repository - .clearSessionLock() + .clearPin() .onFailure { return Result.failure(it) } repository diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/ScheduleNewVersionAlert.kt b/app/src/main/java/org/dhis2/usescases/main/domain/ScheduleNewVersionAlert.kt index ef60d039491..213c1000fac 100644 --- a/app/src/main/java/org/dhis2/usescases/main/domain/ScheduleNewVersionAlert.kt +++ b/app/src/main/java/org/dhis2/usescases/main/domain/ScheduleNewVersionAlert.kt @@ -14,6 +14,9 @@ class ScheduleNewVersionAlert( private val workManagerController: WorkManagerController, private val versionRepository: VersionRepository, ) : UseCase { + + val newVersionFlow = versionRepository.newAppVersion + override suspend fun invoke(input: Unit): Result = try { val workerItem = diff --git a/app/src/main/java/org/dhis2/usescases/main/ui/model/HomeAction.kt b/app/src/main/java/org/dhis2/usescases/main/ui/model/HomeAction.kt new file mode 100644 index 00000000000..a21ea33e4be --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/ui/model/HomeAction.kt @@ -0,0 +1,15 @@ +package org.dhis2.usescases.main.ui.model + +import org.dhis2.usescases.main.MainScreenType + +/** + * Actions sent to the ViewModel from the UI. + */ +sealed interface HomeAction { + data object BackPressed : HomeAction + data object MenuClicked : HomeAction + data object SyncClicked : HomeAction + data object FilterClicked : HomeAction + data class ScreenChanged(val screen: MainScreenType) : HomeAction + data object PinSet : HomeAction +} diff --git a/app/src/main/java/org/dhis2/usescases/main/ui/model/HomeEffect.kt b/app/src/main/java/org/dhis2/usescases/main/ui/model/HomeEffect.kt new file mode 100644 index 00000000000..0830de90c0f --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/ui/model/HomeEffect.kt @@ -0,0 +1,36 @@ +package org.dhis2.usescases.main.ui.model + +import org.dhis2.commons.filters.FilterManager +import org.dhis2.usescases.main.HomeItemData + +/** + * Effects generated by the ViewModel and sent to the UI. + */ +sealed interface HomeEffect { + data class SingleProgramNavigation( + val homeItemData: HomeItemData, + ) : HomeEffect + + data class GoToLogin( + val accountsCount: Int, + val isDeletion: Boolean, + ) : HomeEffect + + data object ShowDeleteNotification : HomeEffect + + data object ShowGranularSync : HomeEffect + + data object BlockSession : HomeEffect + + data object ShowPinDialog : HomeEffect + + data class PeriodFilterRequest( + val periodRequest: FilterManager.PeriodRequest, + ) : HomeEffect + + data object OrgUnitFilterRequest : HomeEffect + + data object ToggleSideMenu : HomeEffect + + data object ToggleFilters : HomeEffect +} diff --git a/app/src/main/java/org/dhis2/usescases/main/ui/model/HomeEvent.kt b/app/src/main/java/org/dhis2/usescases/main/ui/model/HomeEvent.kt deleted file mode 100644 index bcd4df86591..00000000000 --- a/app/src/main/java/org/dhis2/usescases/main/ui/model/HomeEvent.kt +++ /dev/null @@ -1,35 +0,0 @@ -package org.dhis2.usescases.main.ui.model - -import org.dhis2.commons.filters.FilterManager -import org.dhis2.usescases.main.HomeItemData - -sealed interface HomeEvent { - data class SingleProgramNavigation( - val homeItemData: HomeItemData, - ) : HomeEvent - - data class GoToLogin( - val accountsCount: Int, - val isDeletion: Boolean, - ) : HomeEvent - - data object ShowDeleteNotification : HomeEvent - - data object CancelAllNotifications : HomeEvent - - data object ShowGranularSync : HomeEvent - - data object BlockSession : HomeEvent - - data object ShowPinDialog : HomeEvent - - data class PeriodFilterRequest( - val periodRequest: FilterManager.PeriodRequest, - ) : HomeEvent - - data object OrgUnitFilterRequest : HomeEvent - - data object ToggleSideMenu : HomeEvent - - data object ToggleFilters : HomeEvent -} diff --git a/app/src/main/java/org/dhis2/usescases/main/ui/model/HomeScreenState.kt b/app/src/main/java/org/dhis2/usescases/main/ui/model/HomeScreenState.kt index 82a05a193b4..9be1e1b0f42 100644 --- a/app/src/main/java/org/dhis2/usescases/main/ui/model/HomeScreenState.kt +++ b/app/src/main/java/org/dhis2/usescases/main/ui/model/HomeScreenState.kt @@ -1,24 +1,27 @@ package org.dhis2.usescases.main.ui.model +import androidx.compose.runtime.Stable import org.dhis2.commons.filters.FilterItem -import org.dhis2.usescases.main.domain.model.BottomNavigationItem +import org.dhis2.usescases.main.MainScreenType +import org.dhis2.utils.customviews.navigationbar.NavigationPage +import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarItem +@Stable data class HomeScreenState( val userName: String, - val title: String, - val navigationBarItems: List, + val navigationBarItems: List>, val homeFilters: List, val activeFilters: Int, val versionToUpdate: VersionToUpdateState, val filterButtonVisible: Boolean, val bottomNavigationBarVisible: Boolean, val syncButtonVisible: Boolean, + val currentScreen: MainScreenType, ) val defaultHomeScreenState = HomeScreenState( userName = "", - title = "", navigationBarItems = emptyList(), homeFilters = emptyList(), activeFilters = 0, @@ -26,6 +29,7 @@ val defaultHomeScreenState = filterButtonVisible = false, bottomNavigationBarVisible = false, syncButtonVisible = false, + currentScreen = MainScreenType.Loading, ) sealed class VersionToUpdateState { diff --git a/app/src/main/java/org/dhis2/usescases/main/ui/screens/MainScreen.kt b/app/src/main/java/org/dhis2/usescases/main/ui/screens/MainScreen.kt new file mode 100644 index 00000000000..e4d74b7709d --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/ui/screens/MainScreen.kt @@ -0,0 +1,228 @@ +package org.dhis2.usescases.main.ui.screens + +import android.view.LayoutInflater +import androidx.activity.compose.BackHandler +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Menu +import androidx.compose.material.icons.filled.Sync +import androidx.compose.material3.BadgedBox +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.viewinterop.AndroidView +import kotlinx.coroutines.flow.Flow +import org.dhis2.R +import org.dhis2.databinding.ActivityMainBinding +import org.dhis2.mobile.commons.extensions.ObserveAsEvents +import org.dhis2.mobile.login.pin.domain.model.PinMode +import org.dhis2.mobile.login.pin.ui.components.PinDialog +import org.dhis2.usescases.main.HomeScreen +import org.dhis2.usescases.main.MainScreenType +import org.dhis2.usescases.main.ui.model.HomeAction +import org.dhis2.usescases.main.ui.model.HomeEffect +import org.dhis2.usescases.main.ui.model.HomeScreenState +import org.dhis2.utils.customviews.navigationbar.NavigationPage +import org.hisp.dhis.mobile.ui.designsystem.component.Badge +import org.hisp.dhis.mobile.ui.designsystem.component.IconButton +import org.hisp.dhis.mobile.ui.designsystem.component.TopBar +import org.hisp.dhis.mobile.ui.designsystem.component.TopBarActionIcon +import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBar + +@Composable +fun MainScreen( + screenState: HomeScreenState, + effects: Flow, + onAction: (HomeAction) -> Unit, + onEffect: (HomeEffect) -> Unit, + onNewState: (HomeScreenState) -> Unit, + onNewScreen: (MainScreenType) -> Unit, + onLayoutInflated: (ActivityMainBinding) -> Unit, +) { + var showPinDialog by remember { mutableStateOf(false) } + + BackHandler { onAction(HomeAction.BackPressed) } + + ObserveAsEvents(effects) { effect -> + if (effect is HomeEffect.ShowPinDialog) { + showPinDialog = true + } else { + onEffect(effect) + } + } + + LaunchedEffect(screenState) { + onNewState(screenState) + } + LaunchedEffect(screenState.currentScreen) { + onNewScreen(screenState.currentScreen) + } + + Scaffold( + topBar = { + HomeTopBar( + screenState = screenState, + onMenuClicked = { onAction(HomeAction.MenuClicked) }, + onSyncClicked = { onAction(HomeAction.SyncClicked) }, + onFilterClicked = { onAction(HomeAction.FilterClicked) }, + ) + }, + bottomBar = { + if (screenState.bottomNavigationBarVisible) { + HomeBottomBar(screenState) { navigationPage -> + when (navigationPage) { + NavigationPage.ANALYTICS -> onAction(HomeAction.ScreenChanged(MainScreenType.Home(HomeScreen.Visualizations))) + NavigationPage.PROGRAMS -> onAction(HomeAction.ScreenChanged(MainScreenType.Home(HomeScreen.Programs))) + else -> { /*no op*/ } + } + } + } + }, + ) { paddingValues -> + AndroidView( + modifier = Modifier + .fillMaxSize() + .padding(paddingValues), + factory = { context -> + ActivityMainBinding + .inflate(LayoutInflater.from(context)) + .also { onLayoutInflated(it) } + .root + }, + ) + if (showPinDialog) { + PinDialog( + mode = PinMode.SET, + onSuccess = { + onAction(HomeAction.PinSet) + showPinDialog = false + }, + onDismiss = { showPinDialog = false }, + ) + } + } +} + +@Composable +fun HomeTopBar( + screenState: HomeScreenState, + onMenuClicked: () -> Unit, + onSyncClicked: () -> Unit, + onFilterClicked: () -> Unit, +) { + TopBar( + navigationIcon = { + TopBarActionIcon( + icon = Icons.Filled.Menu, + tint = MaterialTheme.colorScheme.onPrimary, + contentDescription = "menu", + onClick = onMenuClicked, + ) + }, + actions = { + AnimatedVisibility(visible = screenState.syncButtonVisible) { + IconButton( + onClick = onSyncClicked, + icon = { + Icon( + imageVector = Icons.Filled.Sync, + contentDescription = "Sync", + tint = MaterialTheme.colorScheme.onPrimary, + ) + }, + ) + } + AnimatedVisibility( + visible = screenState.filterButtonVisible && screenState.homeFilters.isNotEmpty(), + ) { + IconButton( + onClick = onFilterClicked, + icon = { + BadgedBox( + badge = { + if (screenState.activeFilters > 0) { + Badge( + text = "${screenState.activeFilters}", + color = MaterialTheme.colorScheme.onPrimary, + textColor = MaterialTheme.colorScheme.primary, + ) + } + }, + ) { + Icon( + painter = painterResource(R.drawable.ic_filter), + contentDescription = "Filters", + tint = MaterialTheme.colorScheme.onPrimary, + ) + } + }, + ) + } + }, + title = { + when (screenState.currentScreen) { + MainScreenType.About -> R.string.about + is MainScreenType.Home -> R.string.done_task + MainScreenType.Loading -> null + MainScreenType.QRScanner -> R.string.QR_SCANNER + MainScreenType.Settings -> R.string.SYNC_MANAGER + MainScreenType.TroubleShooting -> R.string.main_menu_troubleshooting + }?.let { titleId -> + Text( + text = stringResource(titleId), + color = MaterialTheme.colorScheme.onPrimary, + style = MaterialTheme.typography.titleLarge, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + } + }, + colors = TopAppBarDefaults.topAppBarColors().copy( + containerColor = MaterialTheme.colorScheme.primary, + titleContentColor = MaterialTheme.colorScheme.onPrimary, + ), + ) +} + +@Composable +fun HomeBottomBar( + homeScreenState: HomeScreenState, + onNavigationSelected: (NavigationPage) -> Unit, +) { + val navigationItems = homeScreenState.navigationBarItems + + val selectedItemIndex by remember(homeScreenState) { + derivedStateOf { + when { + homeScreenState.currentScreen.isPrograms() -> 0 + homeScreenState.currentScreen.isVisualizations() -> 1 + else -> null + } + } + } + NavigationBar( + modifier = Modifier + .fillMaxWidth() + .wrapContentHeight(), + items = navigationItems, + selectedItemIndex = selectedItemIndex ?: 0, + onItemClick = { navigationPage -> onNavigationSelected(navigationPage) }, + ) +} diff --git a/app/src/main/java/org/dhis2/usescases/troubleshooting/TroubleshootingFragment.kt b/app/src/main/java/org/dhis2/usescases/troubleshooting/TroubleshootingFragment.kt index 741f56d073c..b07de6c16c2 100644 --- a/app/src/main/java/org/dhis2/usescases/troubleshooting/TroubleshootingFragment.kt +++ b/app/src/main/java/org/dhis2/usescases/troubleshooting/TroubleshootingFragment.kt @@ -1,7 +1,6 @@ package org.dhis2.usescases.troubleshooting import android.R -import android.content.Context import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -10,22 +9,19 @@ import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ViewCompositionStrategy -import androidx.fragment.app.viewModels import org.dhis2.usescases.general.FragmentGlobalAbstract import org.dhis2.usescases.main.MainActivity -import org.dhis2.usescases.main.MainNavigator +import org.dhis2.usescases.main.MainScreenType import org.dhis2.usescases.troubleshooting.ui.TroubleshootingScreen import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme -import javax.inject.Inject +import org.koin.androidx.viewmodel.ext.android.viewModel +import org.koin.core.parameter.parametersOf const val OPEN_LANGUAGE_SECTION = "OPEN_LANGUAGE_SECTION" class TroubleshootingFragment : FragmentGlobalAbstract() { - @Inject - lateinit var troubleshootingViewModelFactory: TroubleshootingViewModelFactory - - private val troubleshootingViewModel: TroubleshootingViewModel by viewModels { - troubleshootingViewModelFactory + private val troubleshootingViewModel: TroubleshootingViewModel by viewModel { + parametersOf(arguments?.getBoolean(OPEN_LANGUAGE_SECTION) ?: false) } companion object { @@ -38,18 +34,6 @@ class TroubleshootingFragment : FragmentGlobalAbstract() { } } - override fun onAttach(context: Context) { - super.onAttach(context) - if (context is MainActivity) { - context.mainComponent - .plus( - TroubleshootingModule( - arguments?.getBoolean(OPEN_LANGUAGE_SECTION) ?: false, - ), - ).inject(this) - } - } - @ExperimentalFoundationApi @ExperimentalAnimationApi override fun onCreateView( @@ -74,7 +58,7 @@ class TroubleshootingFragment : FragmentGlobalAbstract() { startActivity( MainActivity.intent( requireContext(), - MainNavigator.MainScreen.TROUBLESHOOTING, + MainScreenType.TroubleShooting, ), ) requireActivity().finish() diff --git a/app/src/main/java/org/dhis2/usescases/troubleshooting/TroubleshootingInjector.kt b/app/src/main/java/org/dhis2/usescases/troubleshooting/TroubleshootingInjector.kt deleted file mode 100644 index f6c37854208..00000000000 --- a/app/src/main/java/org/dhis2/usescases/troubleshooting/TroubleshootingInjector.kt +++ /dev/null @@ -1,44 +0,0 @@ -package org.dhis2.usescases.troubleshooting - -import android.content.Context -import dagger.Module -import dagger.Provides -import dagger.Subcomponent -import org.dhis2.commons.di.dagger.PerFragment -import org.dhis2.commons.resources.LocaleSelector -import org.dhis2.commons.resources.MetadataIconProvider -import org.hisp.dhis.android.core.D2 - -@PerFragment -@Subcomponent(modules = [TroubleshootingModule::class]) -interface TroubleshootingComponent { - fun inject(programFragment: TroubleshootingFragment) -} - -@Module -class TroubleshootingModule( - private val openLanguageSection: Boolean, -) { - @Provides - fun providesViewModelFactory( - localeSelector: LocaleSelector, - repository: TroubleshootingRepository, - ): TroubleshootingViewModelFactory = - TroubleshootingViewModelFactory( - localeSelector, - repository, - openLanguageSection, - ) - - @Provides - fun providesLocaleSelector( - context: Context, - d2: D2, - ) = LocaleSelector(context, d2) - - @Provides - fun provideRepository( - d2: D2, - metadataIconProvider: MetadataIconProvider, - ) = TroubleshootingRepository(d2, metadataIconProvider) -} diff --git a/app/src/main/java/org/dhis2/utils/analytics/matomo/MatomoAnalyticsModule.kt b/app/src/main/java/org/dhis2/utils/analytics/matomo/MatomoAnalyticsModule.kt index bdf72ac4bf2..5e39d3ad262 100644 --- a/app/src/main/java/org/dhis2/utils/analytics/matomo/MatomoAnalyticsModule.kt +++ b/app/src/main/java/org/dhis2/utils/analytics/matomo/MatomoAnalyticsModule.kt @@ -6,6 +6,7 @@ import dagger.Provides import org.dhis2.commons.matomo.MatomoAnalyticsController import org.dhis2.mobile.commons.reporting.AnalyticActions import org.dhis2.utils.analytics.AnalyticsHelper +import org.koin.dsl.bind import org.koin.dsl.module import org.matomo.sdk.Matomo import org.matomo.sdk.extra.DownloadTracker @@ -34,5 +35,5 @@ val matomoModule = single { DownloadTracker.Extra.ApkChecksum(get()) } single { Matomo.getInstance(get()) } single { MatomoAnalyticsControllerImpl(get(), get()) } - single { AnalyticsHelper(get()) } + single { AnalyticsHelper(get()) } bind AnalyticActions::class } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 046b0745396..8537db061a2 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -8,22 +8,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - + app:layout_constraintTop_toBottomOf="@id/toolbarProgress" + tools:listitem="@layout/item_header_filter" /> + app:layout_constraintTop_toTopOf="parent" /> - - - diff --git a/app/src/main/res/menu/main_menu.xml b/app/src/main/res/menu/main_menu.xml index f17b3bdf1b5..e1eb40687e4 100644 --- a/app/src/main/res/menu/main_menu.xml +++ b/app/src/main/res/menu/main_menu.xml @@ -50,6 +50,12 @@ android:icon="@drawable/ic_troubleshooting" android:title="@string/main_menu_troubleshooting"/> + + Complete %s Deactivate %s Re-open %s + Developer options %s error diff --git a/app/src/test/java/org/dhis2/usescases/login/SyncIsPerformedInteractorTest.kt b/app/src/test/java/org/dhis2/usescases/login/SyncIsPerformedInteractorTest.kt deleted file mode 100644 index da548816f47..00000000000 --- a/app/src/test/java/org/dhis2/usescases/login/SyncIsPerformedInteractorTest.kt +++ /dev/null @@ -1,115 +0,0 @@ -package org.dhis2.usescases.login - -import org.dhis2.data.server.UserManager -import org.dhis2.usescases.sync.WAS_INITIAL_SYNC_DONE -import org.hisp.dhis.android.core.configuration.internal.DatabaseAccount -import org.hisp.dhis.android.core.systeminfo.SystemInfo -import org.hisp.dhis.android.core.user.User -import org.junit.Before -import org.junit.Test -import org.mockito.Mockito -import org.mockito.kotlin.doReturn -import org.mockito.kotlin.mock -import org.mockito.kotlin.whenever - -class SyncIsPerformedInteractorTest { - private lateinit var interactor: SyncIsPerformedInteractor - private val userManager: UserManager = - Mockito.mock(UserManager::class.java, Mockito.RETURNS_DEEP_STUBS) - - @Before - fun setup() { - interactor = SyncIsPerformedInteractor(userManager) - } - - @Test - fun `Should check if entry exists on datastore module`() { - whenever(userManager.d2.dataStoreModule().localDataStore()) doReturn mock() - whenever( - userManager.d2 - .dataStoreModule() - .localDataStore() - .value(WAS_INITIAL_SYNC_DONE), - ) doReturn mock() - whenever( - userManager.d2 - .dataStoreModule() - .localDataStore() - .value(WAS_INITIAL_SYNC_DONE) - .blockingExists(), - ) doReturn false - whenever( - userManager.d2 - .userModule() - .accountManager() - .getCurrentAccount(), - ) doReturn null - - val result = interactor.execute() - - assert(!result) - } - - @Test - fun `Should check if import exists on datastore module`() { - val serverUrl = "https://play.dhis2.org/40" - val userName = "pepe" - - whenever(userManager.d2.dataStoreModule().localDataStore()) doReturn mock() - whenever( - userManager.d2 - .dataStoreModule() - .localDataStore() - .value(WAS_INITIAL_SYNC_DONE), - ) doReturn mock() - whenever( - userManager.d2 - .dataStoreModule() - .localDataStore() - .value(WAS_INITIAL_SYNC_DONE) - .blockingExists(), - ) doReturn false - - val mockedSystemInfo: SystemInfo = - mock { - on { contextPath() } doReturn serverUrl - } - - val mockedUser: User = - mock { - on { username() } doReturn userName - } - - whenever( - userManager.d2 - .userModule() - .user() - .blockingGet(), - ) doReturn mockedUser - - whenever( - userManager.d2 - .systemInfoModule() - .systemInfo() - .blockingGet(), - ) doReturn mockedSystemInfo - - val mockedAccount: DatabaseAccount = - mock { - on { serverUrl() } doReturn serverUrl - on { username() } doReturn userName - on { importDB() } doReturn mock() - } - - whenever( - userManager.d2 - .userModule() - .accountManager() - .getCurrentAccount(), - ) doReturn mockedAccount - - val result = interactor.execute() - - assert(result) - } -} diff --git a/app/src/test/java/org/dhis2/usescases/main/MainPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/main/MainPresenterTest.kt deleted file mode 100644 index 2a717b07015..00000000000 --- a/app/src/test/java/org/dhis2/usescases/main/MainPresenterTest.kt +++ /dev/null @@ -1,328 +0,0 @@ -package org.dhis2.usescases.main - -import androidx.arch.core.executor.testing.InstantTaskExecutorRule -import io.reactivex.Flowable -import io.reactivex.Single -import io.reactivex.processors.BehaviorProcessor -import io.reactivex.processors.FlowableProcessor -import io.reactivex.processors.PublishProcessor -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.test.UnconfinedTestDispatcher -import kotlinx.coroutines.test.runTest -import kotlinx.coroutines.test.setMain -import org.dhis2.commons.filters.FilterManager -import org.dhis2.commons.filters.FilterManager.PeriodRequest -import org.dhis2.commons.filters.Filters -import org.dhis2.commons.filters.data.FilterRepository -import org.dhis2.commons.matomo.Categories.Companion.HOME -import org.dhis2.commons.matomo.MatomoAnalyticsController -import org.dhis2.commons.prefs.Preference.Companion.DEFAULT_CAT_COMBO -import org.dhis2.commons.prefs.Preference.Companion.PREF_DEFAULT_CAT_OPTION_COMBO -import org.dhis2.commons.prefs.PreferenceProvider -import org.dhis2.commons.schedulers.SchedulerProvider -import org.dhis2.commons.viewmodel.DispatcherProvider -import org.dhis2.data.schedulers.TrampolineSchedulerProvider -import org.dhis2.data.server.UserManager -import org.dhis2.data.service.VersionRepository -import org.dhis2.data.service.workManager.WorkManagerController -import org.dhis2.mobile.commons.domain.invoke -import org.dhis2.mobile.sync.data.SyncBackgroundJobAction -import org.dhis2.mobile.sync.domain.SyncStatusController -import org.dhis2.usescases.login.SyncIsPerformedInteractor -import org.dhis2.usescases.main.domain.LogoutUser -import org.dhis2.usescases.settings.DeleteUserData -import org.hisp.dhis.android.core.arch.helpers.DateUtils -import org.hisp.dhis.android.core.category.CategoryCombo -import org.hisp.dhis.android.core.category.CategoryOptionCombo -import org.hisp.dhis.android.core.configuration.internal.DatabaseAccount -import org.hisp.dhis.android.core.systeminfo.SystemInfo -import org.hisp.dhis.android.core.user.User -import org.junit.Assert.assertTrue -import org.junit.Before -import org.junit.Rule -import org.junit.Test -import org.mockito.kotlin.any -import org.mockito.kotlin.doReturn -import org.mockito.kotlin.mock -import org.mockito.kotlin.times -import org.mockito.kotlin.verify -import org.mockito.kotlin.verifyNoMoreInteractions -import org.mockito.kotlin.whenever -import java.io.File -import java.util.Date - -@OptIn(ExperimentalCoroutinesApi::class) -class MainPresenterTest { - private lateinit var presenter: MainPresenter - private val repository: HomeRepository = mock() - private val schedulers: SchedulerProvider = TrampolineSchedulerProvider() - private val view: MainView = mock() - private val preferences: PreferenceProvider = mock() - private val workManagerController: WorkManagerController = mock() - private val filterManager: FilterManager = mock() - private val filterRepository: FilterRepository = mock() - - private val matomoAnalyticsController: MatomoAnalyticsController = mock() - private val userManager: UserManager = mock() - private val deleteUserData: DeleteUserData = mock() - private val syncIsPerfomedInteractor: SyncIsPerformedInteractor = mock() - private val syncStatusController: SyncStatusController = mock() - private val syncBackgroundJobAction: SyncBackgroundJobAction = mock() - private val versionRepository: VersionRepository = mock() - private val testingDispatcher = UnconfinedTestDispatcher() - private val dispatcherProvider: DispatcherProvider = - mock { - on { io() } doReturn testingDispatcher - on { ui() } doReturn testingDispatcher - } - - private val forceToNotSynced: Boolean = false - - private val logoutUser: LogoutUser = mock() - - @Rule - @JvmField - val rule = InstantTaskExecutorRule() - - @Before - fun setUp() { - Dispatchers.setMain(testingDispatcher) - whenever(versionRepository.newAppVersion) doReturn MutableSharedFlow() - presenter = - MainPresenter( - view, - repository, - schedulers, - preferences, - workManagerController, - filterManager, - filterRepository, - matomoAnalyticsController, - userManager, - deleteUserData, - syncIsPerfomedInteractor, - syncStatusController, - syncBackgroundJobAction, - versionRepository, - dispatcherProvider, - forceToNotSynced, - logoutUser, - ) - } - - @Test - fun `Should save default settings and render user name when the activity is resumed`() { - presenterMocks() - - presenter.init() - - verify(view).renderUsername(any()) - verify(preferences).setValue(DEFAULT_CAT_COMBO, "uid") - verify(preferences).setValue(PREF_DEFAULT_CAT_OPTION_COMBO, "uid") - } - - @Test - fun `Should log out`() = - runTest { - val accountsCount = 1 - whenever(logoutUser()) doReturn Result.success(accountsCount) - - presenter.logOut() - - verify(logoutUser, times(1)).invoke() - verify(view).goToLogin(accountsCount, false) - } - - @Test - fun `Should block session`() { - presenter.blockSession() - - verify(workManagerController).cancelAllWork() - verify(view).back() - } - - @Test - fun `Should clear disposable when activity is paused`() { - presenter.onDetach() - - val disposableSize = presenter.disposable.size() - - assertTrue(disposableSize == 0) - } - - @Test - fun `Should open drawer when menu is clicked`() { - presenter.onMenuClick() - - verify(view).openDrawer(any()) - } - - @Test - fun `should return to home section when user taps back in a different section`() { - val filterProcessor: FlowableProcessor = PublishProcessor.create() - val filterManagerFlowable = Flowable.just(filterManager).startWith(filterProcessor) - val periodRequest: FlowableProcessor> = - BehaviorProcessor.create() - whenever(filterManager.asFlowable()) doReturn filterManagerFlowable - whenever(filterManager.periodRequest) doReturn periodRequest - whenever(filterManager.ouTreeFlowable()) doReturn Flowable.just(true) - - presenter.onNavigateBackToHome() - - verify(view).goToHome() - } - - @Test - fun `Should track event when clicking on SyncManager`() { - presenter.onClickSyncManager() - - verify(matomoAnalyticsController).trackEvent(any(), any(), any()) - } - - @Test - fun `Should go to delete account`() { - val randomFile = File("random") - whenever(view.obtainFileView()) doReturn randomFile - whenever(userManager.d2) doReturn mock() - whenever(userManager.d2.userModule()) doReturn mock() - whenever(userManager.d2.userModule().accountManager()) doReturn mock() - whenever(view.obtainFileView()) doReturn randomFile - whenever(repository.accountsCount()) doReturn 1 - - presenter.onDeleteAccount() - - verify(view).showProgressDeleteNotification() - verify(deleteUserData).wipeCacheAndPreferences(randomFile) - verify(userManager.d2?.userModule()?.accountManager())?.deleteCurrentAccount() - verify(view).cancelNotifications() - verify(view).goToLogin(1, true) - } - - @Test - fun `Should go to manage account`() { - val firstRandomUserAccount = - DatabaseAccount - .builder() - .username("random") - .serverUrl("https://www.random.com/") - .encrypted(false) - .databaseName("none") - .databaseCreationDate(DateUtils.SIMPLE_DATE_FORMAT.parse("2012-2-16")) - .build() - val secondRandomUserAccount = - DatabaseAccount - .builder() - .username("random") - .serverUrl("https://www.random.com/") - .encrypted(false) - .databaseName("none") - .databaseCreationDate(DateUtils.SIMPLE_DATE_FORMAT.parse("2012-2-16")) - .build() - - val randomFile = File("random") - - whenever(view.obtainFileView()) doReturn randomFile - whenever(userManager.d2) doReturn mock() - whenever(userManager.d2.userModule()) doReturn mock() - whenever(userManager.d2.userModule().accountManager()) doReturn mock() - whenever( - userManager.d2 - .userModule() - .accountManager() - .getAccounts(), - ) doReturn - listOf( - firstRandomUserAccount, - secondRandomUserAccount, - ) - whenever(repository.accountsCount()) doReturn 2 - - presenter.onDeleteAccount() - - verify(deleteUserData).wipeCacheAndPreferences(randomFile) - verify(userManager.d2?.userModule()?.accountManager())?.deleteCurrentAccount() - verify(view).showProgressDeleteNotification() - verify(view).cancelNotifications() - verify(view).goToLogin(2, true) - } - - @Test - fun `Should track server first time`() { - val serverVersion = "2.38" - whenever(repository.getServerVersion()) doReturn Single.just(systemInfo()) - whenever(preferences.getString(DHIS2, "")) doReturn "" - - presenter.trackDhis2Server() - - verify(matomoAnalyticsController).trackEvent(HOME, SERVER_ACTION, serverVersion) - verify(preferences).setValue(DHIS2, serverVersion) - } - - @Test - fun `Should track server when there is an update`() { - val oldVersion = "2.37" - val newVersion = "2.38" - whenever(repository.getServerVersion()) doReturn Single.just(systemInfo()) - whenever(preferences.getString(DHIS2, "")) doReturn oldVersion - - presenter.trackDhis2Server() - - verify(matomoAnalyticsController).trackEvent(HOME, SERVER_ACTION, newVersion) - verify(preferences).setValue(DHIS2, newVersion) - } - - @Test - fun `Should not track server`() { - whenever(repository.getServerVersion()) doReturn Single.just(systemInfo("")) - whenever(preferences.getString(DHIS2, "")) doReturn "" - - presenter.trackDhis2Server() - - verifyNoMoreInteractions(matomoAnalyticsController) - } - - private fun presenterMocks() { - // UserModule - whenever(repository.user()) doReturn Single.just(createUser()) - - // categoryModule - whenever(repository.defaultCatCombo()) doReturn Single.just(createCategoryCombo()) - whenever(repository.defaultCatOptCombo()) doReturn Single.just(createCategoryOptionCombo()) - - val oldVersion = "2.37" - whenever(repository.getServerVersion()) doReturn Single.just(systemInfo()) - whenever(preferences.getString(DHIS2, "")) doReturn oldVersion - } - - private fun systemInfo(server: String = "2.38") = - SystemInfo - .builder() - .systemName("random") - .contextPath("random too") - .dateFormat("dd/mm/yyyy") - .serverDate(Date()) - .version(server) - .build() - - private fun createUser(): User = - User - .builder() - .uid("userUid") - .firstName("test_name") - .surname("test_surName") - .build() - - private fun createCategoryCombo(): CategoryCombo = - CategoryCombo - .builder() - .uid("uid") - .build() - - private fun createCategoryOptionCombo(): CategoryOptionCombo = - CategoryOptionCombo - .builder() - .uid("uid") - .build() -} diff --git a/app/src/test/java/org/dhis2/usescases/main/MainViewModelIntegrationTest.kt b/app/src/test/java/org/dhis2/usescases/main/MainViewModelIntegrationTest.kt new file mode 100644 index 00000000000..9f14b3c78b5 --- /dev/null +++ b/app/src/test/java/org/dhis2/usescases/main/MainViewModelIntegrationTest.kt @@ -0,0 +1,462 @@ +package org.dhis2.usescases.main + +import android.content.Context +import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import app.cash.turbine.test +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.runTest +import kotlinx.coroutines.test.setMain +import org.dhis2.commons.filters.FilterManager +import org.dhis2.commons.filters.data.FilterRepository +import org.dhis2.commons.matomo.MatomoAnalyticsController +import org.dhis2.commons.resources.ResourceManager +import org.dhis2.commons.viewmodel.DispatcherProvider +import org.dhis2.mobile.commons.providers.PreferenceProvider +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.domain.SyncStatusController +import org.dhis2.mobile.sync.model.SyncStatusData +import org.dhis2.usescases.main.data.HomeRepository +import org.dhis2.usescases.main.domain.CheckSingleNavigation +import org.dhis2.usescases.main.domain.ConfigureHomeNavigationBar +import org.dhis2.usescases.main.domain.DeleteAccount +import org.dhis2.usescases.main.domain.DownloadNewVersion +import org.dhis2.usescases.main.domain.GetHomeFilters +import org.dhis2.usescases.main.domain.GetLockAction +import org.dhis2.usescases.main.domain.GetUserName +import org.dhis2.usescases.main.domain.LaunchInitialSync +import org.dhis2.usescases.main.domain.LogoutUser +import org.dhis2.usescases.main.domain.ScheduleNewVersionAlert +import org.dhis2.usescases.main.domain.UpdateInitialSyncStatus +import org.dhis2.usescases.main.ui.model.HomeEffect +import org.dhis2.utils.MainCoroutineScopeRule +import org.hisp.dhis.android.core.user.User +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.mockito.kotlin.any +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever +import java.io.File + +/** + * Integration test for [MainViewModel]. + * + * Use cases are real instances wired with a mocked [HomeRepository]. Only infrastructure + * boundaries (repository, sync, analytics) are mocked. This validates the contract between + * the ViewModel and the domain layer end-to-end. + */ +@OptIn(ExperimentalCoroutinesApi::class) +class MainViewModelIntegrationTest { + + @get:Rule + val instantExecutorRule = InstantTaskExecutorRule() + + @get:Rule + val coroutineScopeRule = MainCoroutineScopeRule() + + private val testingDispatcher = StandardTestDispatcher() + + // --- Repository mocks (boundary under test) --- + private val homeRepository: HomeRepository = mock() + private val filterRepository: FilterRepository = mock() + + // --- Infrastructure mocks --- + private val filterManager: FilterManager = mock() + private val matomoAnalyticsController: MatomoAnalyticsController = mock() + private val syncStatusController: SyncStatusController = mock() + private val resourceManager: ResourceManager = mock() + private val mainNavigator: MainNavigator = mock() + private val preferences: PreferenceProvider = mock() + private val syncBackgroundJobAction: SyncBackgroundJobAction = mock() + private val downloadNewVersion: DownloadNewVersion = mock() + private val scheduleNewVersionAlert: ScheduleNewVersionAlert = mock() + + private val syncStatusFlow = MutableStateFlow(SyncStatusData()) + private val newVersionFlow = MutableSharedFlow() + private val filterManagerFlow = MutableStateFlow(0) + + // --- Real use cases (wired with mocked repos) --- + private lateinit var getUserName: GetUserName + private lateinit var configureHomeNavigationBar: ConfigureHomeNavigationBar + private lateinit var getHomeFilters: GetHomeFilters + private lateinit var getLockAction: GetLockAction + private lateinit var checkSingleNavigation: CheckSingleNavigation + private lateinit var launchInitialSync: LaunchInitialSync + private lateinit var logOutUser: LogoutUser + private lateinit var deleteAccount: DeleteAccount + private lateinit var updateInitialSyncStatus: UpdateInitialSyncStatus + + private lateinit var viewModel: MainViewModel + + @Before + fun setUp() = runTest { + Dispatchers.setMain(testingDispatcher) + + getUserName = GetUserName(homeRepository) + configureHomeNavigationBar = ConfigureHomeNavigationBar(homeRepository, resourceManager) + getHomeFilters = GetHomeFilters(filterRepository) + getLockAction = GetLockAction(homeRepository) + checkSingleNavigation = CheckSingleNavigation(homeRepository) + updateInitialSyncStatus = UpdateInitialSyncStatus(homeRepository) + logOutUser = LogoutUser(homeRepository, syncBackgroundJobAction, syncStatusController, filterManager) + deleteAccount = DeleteAccount(filterManager, homeRepository) + // skipSync = true avoids triggering a background sync in every test + launchInitialSync = LaunchInitialSync( + skipSync = true, + homeRepository = homeRepository, + versionRepository = mock(), + syncBackgroundJobAction = syncBackgroundJobAction, + ) + + whenever(syncStatusController.observeDownloadProcess()) doReturn syncStatusFlow + whenever(scheduleNewVersionAlert.newVersionFlow) doReturn newVersionFlow + whenever(filterManager.asFlow(any())) doReturn filterManagerFlow + whenever(filterManager.periodRequest) doReturn mock() + whenever(filterManager.ouTreeFlowable()) doReturn mock() + // ConfigureHomeNavigationBar builds NavigationBarItem(label = getString(...)); a null + // label causes a NPE that silently crashes loadData. Stub it globally here. + whenever(resourceManager.getString(any())) doReturn "" + + // Default: multiple programs → CheckSingleNavigation fails silently, no effect emitted + whenever(homeRepository.homeItemCount()) doReturn 2 + } + + // ------------------------------------------------------------------ helpers + + private fun buildViewModel( + initialScreen: MainScreenType = MainScreenType.Home(HomeScreen.Programs), + ) { + viewModel = MainViewModel( + preferences = preferences, + filterManager = filterManager, + matomoAnalyticsController = matomoAnalyticsController, + syncStatusController = syncStatusController, + mainNavigator = mainNavigator, + getUserName = getUserName, + configureHomeNavigationBar = configureHomeNavigationBar, + getHomeFilters = getHomeFilters, + downloadNewVersion = downloadNewVersion, + logOutUser = logOutUser, + deleteAccount = deleteAccount, + getLockAction = getLockAction, + updateInitialSyncStatus = updateInitialSyncStatus, + checkSingleNavigation = checkSingleNavigation, + launchInitialSync = launchInitialSync, + scheduleNewVersionAlert = scheduleNewVersionAlert, + syncBackgroundJobAction = syncBackgroundJobAction, + initialScreen = initialScreen, + dispatcher = object : DispatcherProvider { + override fun io(): CoroutineDispatcher = testingDispatcher + override fun computation(): CoroutineDispatcher = testingDispatcher + override fun ui(): CoroutineDispatcher = testingDispatcher + }, + ) + } + + // NOTE: The User mock must be created before any `whenever` call is opened, because + // Mockito's stubbing state machine gets confused if another mock is configured while a + // stubbing is "in progress" (hint #3 of UnfinishedStubbingException). + private fun mockUser(firstName: String?, surname: String?): User = mock { + on { firstName() } doReturn firstName + on { surname() } doReturn surname + } + + // ------------------------------------------------------------------ state tests + + @Test + fun `should expose full name built by GetUserName use case`() = runTest { + val user = mockUser("Jane", "Doe") + whenever(homeRepository.user()) doReturn user + whenever(homeRepository.hasHomeAnalytics()) doReturn false + whenever(filterRepository.homeFilters()) doReturn emptyList() + whenever(filterManager.totalFilters) doReturn 0 + + buildViewModel() + + viewModel.homeScreenState.test { + awaitItem() // default / loading state + assertEquals("Jane Doe", awaitItem().userName) + } + } + + @Test + fun `should expose only first name when surname is absent`() = runTest { + val user = mockUser("Jane", null) + whenever(homeRepository.user()) doReturn user + whenever(homeRepository.hasHomeAnalytics()) doReturn false + whenever(filterRepository.homeFilters()) doReturn emptyList() + whenever(filterManager.totalFilters) doReturn 0 + + buildViewModel() + + viewModel.homeScreenState.test { + awaitItem() + assertEquals("Jane", awaitItem().userName) + } + } + + @Test + fun `should show two nav items and bottom bar when analytics are configured`() = runTest { + val user = mockUser("User", null) + whenever(homeRepository.user()) doReturn user + whenever(homeRepository.hasHomeAnalytics()) doReturn true + whenever(filterRepository.homeFilters()) doReturn emptyList() + whenever(filterManager.totalFilters) doReturn 0 + whenever(resourceManager.getString(any())) doReturn "" + + buildViewModel() + + viewModel.homeScreenState.test { + awaitItem() + val state = awaitItem() + assertEquals(2, state.navigationBarItems.size) + assertTrue(state.bottomNavigationBarVisible) + } + } + + @Test + fun `should show one nav item and hide bottom bar when analytics are not configured`() = runTest { + val user = mockUser("User", null) + whenever(homeRepository.user()) doReturn user + whenever(homeRepository.hasHomeAnalytics()) doReturn false + whenever(filterRepository.homeFilters()) doReturn emptyList() + whenever(filterManager.totalFilters) doReturn 0 + + buildViewModel() + + viewModel.homeScreenState.test { + awaitItem() + val state = awaitItem() + assertEquals(1, state.navigationBarItems.size) + assertFalse(state.bottomNavigationBarVisible) + } + } + + @Test + fun `should expose active filter count from filterManager`() = runTest { + // FilterItem is a sealed abstract class and cannot be mocked; test activeFilters + // (from FilterManager) and homeFilters (from FilterRepository) independently. + val user = mockUser("User", null) + whenever(homeRepository.user()) doReturn user + whenever(homeRepository.hasHomeAnalytics()) doReturn false + whenever(filterRepository.homeFilters()) doReturn emptyList() + whenever(filterManager.totalFilters) doReturn 3 + + buildViewModel() + + viewModel.homeScreenState.test { + awaitItem() // default state + // filterManager.asFlow fires before loadData completes → intermediate state with + // activeFilters=3 on the default skeleton. Both this state and the fully-loaded + // state will have activeFilters=3, so checking the first non-default item is enough. + assertEquals(3, awaitItem().activeFilters) + cancelAndIgnoreRemainingEvents() + } + } + + // ------------------------------------------------------------------ lock / pin effects + + @Test + fun `should emit ShowPinDialog when no pin is stored`() = runTest { + whenever(homeRepository.isPinStored()) doReturn false + + buildViewModel() + + viewModel.homeEffects.test { + viewModel.onBlockSession() + assertEquals(HomeEffect.ShowPinDialog, awaitItem()) + } + } + + @Test + fun `should emit BlockSession when a pin is already stored`() = runTest { + whenever(homeRepository.isPinStored()) doReturn true + + buildViewModel() + + viewModel.homeEffects.test { + viewModel.onBlockSession() + assertEquals(HomeEffect.BlockSession, awaitItem()) + } + } + + // ------------------------------------------------------------------ logout + + @Test + fun `should emit GoToLogin with correct account count after logout`() = runTest { + whenever(homeRepository.clearPin()) doReturn Result.success(Unit) + whenever(homeRepository.logOut()) doReturn Result.success(Unit) + whenever(homeRepository.accountsCount()) doReturn 2 + + buildViewModel() + + viewModel.homeEffects.test { + viewModel.logOut() + assertEquals(HomeEffect.GoToLogin(accountsCount = 2, isDeletion = false), awaitItem()) + } + } + + @Test + fun `should cancel sync jobs and restore sync state on logout`() = runTest { + whenever(homeRepository.clearPin()) doReturn Result.success(Unit) + whenever(homeRepository.logOut()) doReturn Result.success(Unit) + whenever(homeRepository.accountsCount()) doReturn 1 + + buildViewModel() + viewModel.logOut() + advanceUntilIdle() + + verify(syncBackgroundJobAction).cancelAll() + verify(syncStatusController).restore() + verify(homeRepository).logOut() + } + + // ------------------------------------------------------------------ delete account + + @Test + fun `should emit ShowDeleteNotification then GoToLogin after account deletion`() = runTest { + // Explicitly stub all suspend funs used by DeleteAccount so mockito-kotlin + // resumes the continuation correctly (unspecified suspend funs may not resume). + whenever(homeRepository.clearCache(any())) doReturn false + whenever(homeRepository.clearPreferences()) doReturn Unit + whenever(homeRepository.wipeAll()) doReturn Unit + whenever(homeRepository.deleteCurrentAccount()) doReturn Unit + whenever(homeRepository.accountsCount()) doReturn 0 + + buildViewModel() + + viewModel.homeEffects.test { + val mockedContext = mock() + whenever(mockedContext.cacheDir) doReturn File("cache") + with(mockedContext) { viewModel.onDeleteAccount() } + + assertEquals(HomeEffect.ShowDeleteNotification, awaitItem()) + assertEquals(HomeEffect.GoToLogin(accountsCount = 0, isDeletion = true), awaitItem()) + } + } + + @Test + fun `should wipe account data and cancel sync on account deletion`() = runTest { + whenever(homeRepository.clearCache(any())) doReturn false + whenever(homeRepository.clearPreferences()) doReturn Unit + whenever(homeRepository.wipeAll()) doReturn Unit + whenever(homeRepository.deleteCurrentAccount()) doReturn Unit + whenever(homeRepository.accountsCount()) doReturn 0 + + buildViewModel() + + val mockedContext = mock() + whenever(mockedContext.cacheDir) doReturn File("cache") + with(mockedContext) { viewModel.onDeleteAccount() } + advanceUntilIdle() + + verify(homeRepository).wipeAll() + verify(homeRepository).deleteCurrentAccount() + verify(syncBackgroundJobAction).cancelAll() + } + + // ------------------------------------------------------------------ sync status + + @Test + fun `should mark initial sync done when sync process completes`() = runTest { + buildViewModel() + + syncStatusFlow.emit(SyncStatusData(running = false)) + advanceUntilIdle() + + verify(homeRepository).setInitialSyncDone() + } + + @Test + fun `should hide filter and sync buttons while sync is running`() = runTest { + val user = mockUser("User", null) + whenever(homeRepository.user()) doReturn user + whenever(homeRepository.hasHomeAnalytics()) doReturn false + whenever(filterRepository.homeFilters()) doReturn emptyList() + whenever(filterManager.totalFilters) doReturn 0 + + buildViewModel() + + viewModel.homeScreenState.test { + awaitItem() // loading state + awaitItem() // loaded state + + syncStatusFlow.emit(SyncStatusData(running = true)) + with(awaitItem()) { + assertFalse(filterButtonVisible) + assertFalse(syncButtonVisible) + assertFalse(bottomNavigationBarVisible) + } + } + } + + @Test + fun `should restore filter and sync buttons after sync completes`() = runTest { + val user = mockUser("User", null) + whenever(homeRepository.user()) doReturn user + whenever(homeRepository.hasHomeAnalytics()) doReturn true + whenever(filterRepository.homeFilters()) doReturn emptyList() + whenever(filterManager.totalFilters) doReturn 0 + whenever(resourceManager.getString(any())) doReturn "" + + buildViewModel() + + viewModel.homeScreenState.test { + awaitItem() + awaitItem() // loaded state + + syncStatusFlow.emit(SyncStatusData(running = true)) + awaitItem() // running state + + syncStatusFlow.emit(SyncStatusData(running = false)) + with(awaitItem()) { + assertTrue(filterButtonVisible) + assertTrue(syncButtonVisible) + } + } + } + + // ------------------------------------------------------------------ single program navigation + + @Test + fun `should emit SingleProgramNavigation when only one home item exists`() = runTest { + val singleItem = HomeItemData.EventProgram( + uid = "program_uid", + label = "Only Program", + accessDataWrite = true, + ) + whenever(homeRepository.homeItemCount()) doReturn 1 + whenever(homeRepository.singleHomeItemData()) doReturn singleItem + + buildViewModel() + + viewModel.homeEffects.test { + val effect = awaitItem() + assertTrue(effect is HomeEffect.SingleProgramNavigation) + assertEquals(singleItem, (effect as HomeEffect.SingleProgramNavigation).homeItemData) + } + } + + @Test + fun `should not emit SingleProgramNavigation when multiple home items exist`() = runTest { + whenever(homeRepository.homeItemCount()) doReturn 3 + + buildViewModel() + + viewModel.homeEffects.test { + advanceUntilIdle() + expectNoEvents() + } + } +} diff --git a/app/src/test/java/org/dhis2/usescases/main/MainViewModelTest.kt b/app/src/test/java/org/dhis2/usescases/main/MainViewModelTest.kt index f52dc355fdb..34d6b3e81f6 100644 --- a/app/src/test/java/org/dhis2/usescases/main/MainViewModelTest.kt +++ b/app/src/test/java/org/dhis2/usescases/main/MainViewModelTest.kt @@ -2,23 +2,29 @@ package org.dhis2.usescases.main import android.content.Context import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.BarChart import app.cash.turbine.test +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest +import kotlinx.coroutines.test.setMain import org.dhis2.commons.filters.FilterManager import org.dhis2.commons.matomo.Actions.Companion.BLOCK_SESSION_PIN import org.dhis2.commons.matomo.Actions.Companion.SETTINGS import org.dhis2.commons.matomo.Categories.Companion.HOME -import org.dhis2.commons.matomo.Labels import org.dhis2.commons.matomo.Labels.Companion.CLICK import org.dhis2.commons.matomo.MatomoAnalyticsController -import org.dhis2.commons.prefs.PreferenceProvider import org.dhis2.commons.resources.ResourceManager -import org.dhis2.data.service.VersionRepository +import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.commons.providers.PreferenceProvider +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.mobile.sync.domain.SyncStatusController import org.dhis2.mobile.sync.model.SyncStatusData import org.dhis2.usescases.main.domain.CheckSingleNavigation @@ -34,9 +40,14 @@ import org.dhis2.usescases.main.domain.LogoutUser import org.dhis2.usescases.main.domain.ScheduleNewVersionAlert import org.dhis2.usescases.main.domain.UpdateInitialSyncStatus import org.dhis2.usescases.main.domain.model.LockAction -import org.dhis2.usescases.main.ui.model.HomeEvent +import org.dhis2.usescases.main.ui.Form +import org.dhis2.usescases.main.ui.model.HomeAction +import org.dhis2.usescases.main.ui.model.HomeEffect +import org.dhis2.usescases.main.ui.model.VersionToUpdateState import org.dhis2.utils.MainCoroutineScopeRule import org.dhis2.utils.analytics.CLOSE_SESSION +import org.dhis2.utils.customviews.navigationbar.NavigationPage +import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarItem import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Rule @@ -58,11 +69,12 @@ class MainViewModelTest { @get:Rule val coroutineScopeRule = MainCoroutineScopeRule() + private val testingDispatcher = StandardTestDispatcher() + private val preferences: PreferenceProvider = mock() private val filterManager: FilterManager = mock() private val matomoAnalyticsController: MatomoAnalyticsController = mock() private val syncStatusController: SyncStatusController = mock() - private val versionRepository: VersionRepository = mock() private val resourceManager: ResourceManager = mock() private val mainNavigator: MainNavigator = mock() private val getUserName: GetUserName = mock() @@ -76,20 +88,21 @@ class MainViewModelTest { private val checkSingleNavigation: CheckSingleNavigation = mock() private val launchInitialSync: LaunchInitialSync = mock() private val scheduleNewVersionAlert: ScheduleNewVersionAlert = mock() + private val syncBackgroundJobAction: SyncBackgroundJobAction = mock() private lateinit var viewModel: MainViewModel private val mockedFilterManagerMock = MutableStateFlow(0) private val syncStatusFlow = MutableStateFlow(SyncStatusData()) - private val screenFlow = MutableStateFlow(MainNavigator.MainScreen.NONE) private val newVersionFlow = MutableSharedFlow() @Before fun setUp() = runTest { + Dispatchers.setMain(testingDispatcher) + whenever(syncStatusController.observeDownloadProcess()) doReturn syncStatusFlow - whenever(mainNavigator.selectedScreenFlow) doReturn screenFlow - whenever(versionRepository.newAppVersion) doReturn newVersionFlow + whenever(scheduleNewVersionAlert.newVersionFlow) doReturn newVersionFlow whenever(filterManager.asFlow(any())) doReturn mockedFilterManagerMock whenever(filterManager.periodRequest) doReturn mock() whenever(filterManager.ouTreeFlowable()) doReturn mock() @@ -101,8 +114,6 @@ class MainViewModelTest { filterManager = filterManager, matomoAnalyticsController = matomoAnalyticsController, syncStatusController = syncStatusController, - versionRepository = versionRepository, - resourceManager = resourceManager, mainNavigator = mainNavigator, getUserName = getUserName, configureHomeNavigationBar = configureHomeNavigationBar, @@ -114,7 +125,16 @@ class MainViewModelTest { updateInitialSyncStatus = updateInitialSyncStatus, checkSingleNavigation = checkSingleNavigation, launchInitialSync = launchInitialSync, - scheduleNewVersionAlert = scheduleNewVersionAlert + scheduleNewVersionAlert = scheduleNewVersionAlert, + syncBackgroundJobAction = syncBackgroundJobAction, + initialScreen = MainScreenType.Home(HomeScreen.Programs), + dispatcher = object : DispatcherProvider { + override fun io(): CoroutineDispatcher = testingDispatcher + + override fun computation(): CoroutineDispatcher = testingDispatcher + + override fun ui(): CoroutineDispatcher = testingDispatcher + }, ) } @@ -126,8 +146,6 @@ class MainViewModelTest { whenever(getHomeFilters()) doReturn Result.success(emptyList()) whenever(resourceManager.getString(-1)) doReturn "" whenever(filterManager.totalFilters) doReturn 0 - whenever(mainNavigator.isPrograms()) doReturn false - whenever(mainNavigator.isHome()) doReturn true viewModel.homeScreenState.test { awaitItem() @@ -139,11 +157,11 @@ class MainViewModelTest { fun `Should log out`() = runTest { whenever(logOutUser()) doReturn Result.success(1) - viewModel.homeEvents.test { + viewModel.homeEffects.test { viewModel.logOut() advanceUntilIdle() verify(matomoAnalyticsController).trackEvent(HOME, CLOSE_SESSION, CLICK) - assertTrue(awaitItem() == HomeEvent.GoToLogin(1, false)) + assertTrue(awaitItem() == HomeEffect.GoToLogin(1, false)) } } @@ -152,43 +170,44 @@ class MainViewModelTest { whenever(getLockAction()) doReturn Result.success(LockAction.BlockSession) - viewModel.homeEvents.test { + viewModel.homeEffects.test { viewModel.onBlockSession() - assertTrue(awaitItem() == HomeEvent.BlockSession) + assertTrue(awaitItem() == HomeEffect.BlockSession) verify(matomoAnalyticsController).trackEvent( - HOME, BLOCK_SESSION_PIN, Labels.CLICK + HOME, BLOCK_SESSION_PIN, CLICK ) } } @Test fun `Should open drawer when menu is clicked`() = runTest { - viewModel.homeEvents.test { - viewModel.onMenuClick() - assertTrue(awaitItem() == HomeEvent.ToggleSideMenu) + viewModel.homeEffects.test { + viewModel.onAction(HomeAction.MenuClicked) + assertTrue(awaitItem() == HomeEffect.ToggleSideMenu) } } @Test fun `should return to home section when user taps back in a different section`() = runTest { - whenever(mainNavigator.isHome()) doReturn false - viewModel.onBackPressed() + whenever(mainNavigator.openHome()) doReturn MainScreenType.Home(HomeScreen.Programs) + viewModel.onChangeScreen(MainScreenType.Settings) + viewModel.onAction(HomeAction.BackPressed) advanceUntilIdle() verify(mainNavigator, times(1)).openHome() } @Test fun `should close app when user taps back in a home section`() = runTest { - whenever(mainNavigator.isHome()) doReturn true - viewModel.homeEvents.test { - viewModel.onBackPressed() - assertTrue(awaitItem() is HomeEvent.BlockSession) + viewModel.homeEffects.test { + viewModel.onChangeScreen(MainScreenType.Home(HomeScreen.Programs)) + viewModel.onAction(HomeAction.BackPressed) + assertTrue(awaitItem() is HomeEffect.BlockSession) } } @Test fun `Should track event when clicking on SyncManager`() = runTest { - viewModel.onClickSyncManager() + viewModel.onChangeScreen(MainScreenType.Settings) advanceUntilIdle() verify(matomoAnalyticsController).trackEvent(HOME, SETTINGS, CLICK) } @@ -198,17 +217,71 @@ class MainViewModelTest { whenever(deleteAccount(any())) doReturn Result.success(1) - viewModel.homeEvents.test { + viewModel.homeEffects.test { val mockedContext = mock() whenever(mockedContext.cacheDir) doReturn File("random") with(mockedContext) { viewModel.onDeleteAccount() } - assertTrue(awaitItem() == HomeEvent.ShowDeleteNotification) - assertTrue(awaitItem() == HomeEvent.CancelAllNotifications) - assertTrue(awaitItem() == HomeEvent.GoToLogin(1, true)) + assertTrue(awaitItem() == HomeEffect.ShowDeleteNotification) + verify(syncBackgroundJobAction).cancelAll() + assertTrue(awaitItem() == HomeEffect.GoToLogin(1, true)) + + } + } + + @Test + fun shouldSetVersionToUpdate() = runTest { + whenever(getUserName()) doReturn Result.success("username") + whenever(configureHomeNavigationBar()) doReturn Result.success(emptyList()) + whenever(getHomeFilters()) doReturn Result.success(emptyList()) + whenever(filterManager.totalFilters) doReturn 0 + + viewModel.homeScreenState.test { + awaitItem() + newVersionFlow.emit("test.test.test") + with(awaitItem()) { + assertTrue(versionToUpdate is VersionToUpdateState.New) + assertTrue((versionToUpdate as VersionToUpdateState.New).version == "test.test.test") + } + } + } + + @Test + fun shouldSendGranularSyncEvent() = runTest { + viewModel.homeEffects.test { + viewModel.onAction(HomeAction.SyncClicked) + assertTrue(awaitItem() is HomeEffect.ShowGranularSync) + } + } + @Test + fun shouldToggleFilters() = runTest { + whenever(getUserName()) doReturn Result.success("username") + whenever(configureHomeNavigationBar()) doReturn Result.success( + listOf( + NavigationBarItem( + id = NavigationPage.PROGRAMS, + icon = Icons.Filled.Form, + label = "Program" + ), + NavigationBarItem( + id = NavigationPage.ANALYTICS, + icon = Icons.Filled.BarChart, + label = "Analytics", + ) + ) + ) + whenever(getHomeFilters()) doReturn Result.success(emptyList()) + whenever(filterManager.totalFilters) doReturn 0 + + viewModel.homeScreenState.test { + viewModel.onAction(HomeAction.FilterClicked) + viewModel.homeEffects.test { + assertTrue((this).awaitItem() is HomeEffect.ToggleFilters) + } + assertTrue((this@test).awaitItem().bottomNavigationBarVisible.not()) } } } diff --git a/app/src/test/java/org/dhis2/usescases/main/domain/ConfigureHomeNavigationBarTest.kt b/app/src/test/java/org/dhis2/usescases/main/domain/ConfigureHomeNavigationBarTest.kt index 27aa04a1d22..63b2cb40869 100644 --- a/app/src/test/java/org/dhis2/usescases/main/domain/ConfigureHomeNavigationBarTest.kt +++ b/app/src/test/java/org/dhis2/usescases/main/domain/ConfigureHomeNavigationBarTest.kt @@ -1,6 +1,8 @@ package org.dhis2.usescases.main.domain import kotlinx.coroutines.test.runTest +import org.dhis2.R +import org.dhis2.commons.resources.ResourceManager import org.dhis2.mobile.commons.domain.invoke import org.dhis2.mobile.commons.error.DomainError import org.dhis2.usescases.main.data.HomeRepository @@ -15,13 +17,17 @@ import org.mockito.kotlin.willAnswer class ConfigureHomeNavigationBarTest { private val homeRepository: HomeRepository = mock() + private val resourceManager: ResourceManager = mock() lateinit var configureHomeNavigationBar: ConfigureHomeNavigationBar @Before fun setUp() { + whenever(resourceManager.getString(R.string.navigation_programs)) doReturn "Programs" + whenever(resourceManager.getString(R.string.navigation_charts)) doReturn "Analytics" configureHomeNavigationBar = ConfigureHomeNavigationBar( homeRepository = homeRepository, + resourceManager = resourceManager, ) } diff --git a/app/src/test/java/org/dhis2/usescases/main/domain/LogoutUserTest.kt b/app/src/test/java/org/dhis2/usescases/main/domain/LogoutUserTest.kt index 7c3b8170f4f..c45b523215b 100644 --- a/app/src/test/java/org/dhis2/usescases/main/domain/LogoutUserTest.kt +++ b/app/src/test/java/org/dhis2/usescases/main/domain/LogoutUserTest.kt @@ -6,7 +6,7 @@ import org.dhis2.mobile.commons.domain.invoke import org.dhis2.mobile.commons.error.DomainError import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.mobile.sync.domain.SyncStatusController -import org.dhis2.usescases.main.HomeRepository +import org.dhis2.usescases.main.data.HomeRepository import org.junit.Assert.assertTrue import org.junit.Assert.fail import org.junit.Before @@ -45,7 +45,7 @@ class LogoutUserTest { verify(syncBackgroundJobAction).cancelAll() verify(syncStatusController).restore() verify(filterManager).clearAllFilters() - verify(repository).clearSessionLock() + verify(repository).clearPin() verify(repository).logOut() verify(repository).accountsCount() @@ -56,12 +56,12 @@ class LogoutUserTest { fun `GIVEN the user logs out WHEN domain error THEN exception is returned`() = runTest { val testException = DomainError.UnexpectedError("test") - whenever(repository.clearSessionLock()) doReturn Result.failure(testException) + whenever(repository.clearPin()) doReturn Result.failure(testException) val result = logoutUser() verify(syncBackgroundJobAction).cancelAll() verify(syncStatusController).restore() verify(filterManager).clearAllFilters() - verify(repository).clearSessionLock() + verify(repository).clearPin() verify(repository, never()).logOut() verify(repository, never()).accountsCount() @@ -84,7 +84,7 @@ class LogoutUserTest { verify(syncBackgroundJobAction).cancelAll() verify(syncStatusController).restore() verify(filterManager).clearAllFilters() - verify(repository).clearSessionLock() + verify(repository).clearPin() verify(repository).logOut() verify(repository, never()).accountsCount() } diff --git a/commons/src/main/java/org/dhis2/commons/filters/FilterManager.java b/commons/src/main/java/org/dhis2/commons/filters/FilterManager.java index fb2d4a6b163..9a9e1ebfa91 100644 --- a/commons/src/main/java/org/dhis2/commons/filters/FilterManager.java +++ b/commons/src/main/java/org/dhis2/commons/filters/FilterManager.java @@ -37,7 +37,6 @@ import kotlinx.coroutines.CoroutineScope; import kotlinx.coroutines.flow.Flow; import kotlinx.coroutines.flow.MutableSharedFlow; -import kotlinx.coroutines.flow.MutableStateFlow; import timber.log.Timber; public class FilterManager implements Serializable { @@ -590,7 +589,7 @@ public void clearAllFilters() { stateFilters.clear(); observableStates.postValue(stateFilters); ouFilters.clear(); - liveDataOUFilter.setValue(ouFilters); + liveDataOUFilter.postValue(ouFilters); periodFilters = new ArrayList<>(); observablePeriodFilters.set(periodFilters); enrollmentPeriodFilters = new ArrayList<>(); diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/di/ChartsModule.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/di/ChartsModule.kt new file mode 100644 index 00000000000..d57cbeb7018 --- /dev/null +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/di/ChartsModule.kt @@ -0,0 +1,114 @@ +package dhis2.org.analytics.charts.di + +import dhis2.org.analytics.charts.Charts +import dhis2.org.analytics.charts.ChartsRepository +import dhis2.org.analytics.charts.ChartsRepositoryImpl +import dhis2.org.analytics.charts.DhisAnalyticCharts +import dhis2.org.analytics.charts.data.AnalyticResources +import dhis2.org.analytics.charts.mappers.AnalyticDataElementToDataElementData +import dhis2.org.analytics.charts.mappers.AnalyticIndicatorToIndicatorData +import dhis2.org.analytics.charts.mappers.AnalyticTeiSettingsToSettingsAnalyticsModel +import dhis2.org.analytics.charts.mappers.AnalyticsTeiSettingsToGraph +import dhis2.org.analytics.charts.mappers.DataElementToGraph +import dhis2.org.analytics.charts.mappers.ProgramIndicatorToGraph +import dhis2.org.analytics.charts.mappers.VisualizationToGraph +import dhis2.org.analytics.charts.providers.AnalyticsFilterProvider +import dhis2.org.analytics.charts.providers.ChartCoordinatesProvider +import dhis2.org.analytics.charts.providers.ChartCoordinatesProviderImpl +import dhis2.org.analytics.charts.providers.NutritionDataProvider +import dhis2.org.analytics.charts.providers.PeriodStepProvider +import dhis2.org.analytics.charts.providers.PeriodStepProviderImpl +import dhis2.org.analytics.charts.providers.RuleEngineNutritionDataProviderImpl +import kotlinx.coroutines.Dispatchers +import org.dhis2.commons.viewmodel.DispatcherProvider +import org.koin.core.module.dsl.factoryOf +import org.koin.dsl.module + +val chartsModule = module { + + factory { + PeriodStepProviderImpl( + d2 = get(), + dispatcherProvider = object : DispatcherProvider { + override fun io() = Dispatchers.IO + + override fun computation() = Dispatchers.Default + + override fun ui() = Dispatchers.Main + + } + ) + } + + factory { + ChartCoordinatesProviderImpl( + d2 = get(), + periodStepProvider = get(), + resourceManager = get() + ) + } + + factory { + VisualizationToGraph( + periodStepProvider = get(), + chartCoordinatesProvider = get() + ) + } + + factoryOf(::AnalyticDataElementToDataElementData) + factoryOf(::AnalyticIndicatorToIndicatorData) + factory { + AnalyticTeiSettingsToSettingsAnalyticsModel( + analyticDataElementMapper = get(), + analyticIndicatorMapper = get() + ) + } + + factory { + RuleEngineNutritionDataProviderImpl() + } + + factory { + AnalyticsTeiSettingsToGraph( + analyticsSettingsMapper = get(), + nutritionDataProvider = get(), + periodStepProvider = get(), + chartCoordinatesProvider = get() + ) + } + + factory { + DataElementToGraph( + periodStepProvider = get(), + chartCoordinatesProvider = get() + ) + } + + factory { + ProgramIndicatorToGraph( + periodStepProvider = get(), + chartCoordinatesProvider = get() + ) + } + + factoryOf(::AnalyticResources) + + factoryOf(::AnalyticsFilterProvider) + + factory { + ChartsRepositoryImpl( + d2 = get(), + visualizationToGraph = get(), + analyticsTeiSettingsToGraph = get(), + dataElementToGraph = get(), + programIndicatorToGraph = get(), + analyticsResources = get(), + analyticsFilterProvider = get() + ) + } + factory { + DhisAnalyticCharts( + chartsRepository = get() + ) + } +} \ No newline at end of file From de2cd0fff34f68bc4817f1bf7f87c33b3bcd8638 Mon Sep 17 00:00:00 2001 From: Xavier Molloy Date: Mon, 6 Apr 2026 09:52:07 +0200 Subject: [PATCH 127/260] fix: [ANDROAPP-7550] Update filters in main thread (#4783) * fix: [ANDROAPP-7495] Update filters in main thread * fix: [ANDROAPP-7495] fix tests * fix: [ANDROAPP-7495] inject dispather --- .../org/dhis2/usescases/main/MainModule.kt | 2 + .../usescases/settings/DeleteUserData.kt | 11 +++-- .../dhis2/usescases/main/MainPresenterTest.kt | 42 +++++++++---------- .../usescases/settings/DeleteUserDataTest.kt | 15 ++++++- 4 files changed, 44 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/org/dhis2/usescases/main/MainModule.kt b/app/src/main/java/org/dhis2/usescases/main/MainModule.kt index 323fe43e729..7de752f9734 100644 --- a/app/src/main/java/org/dhis2/usescases/main/MainModule.kt +++ b/app/src/main/java/org/dhis2/usescases/main/MainModule.kt @@ -152,10 +152,12 @@ class MainModule( workManagerController: WorkManagerController, preferencesProvider: PreferenceProvider, filterManager: FilterManager, + dispatcherProvider: DispatcherProvider ): DeleteUserData = DeleteUserData( workManagerController, filterManager, preferencesProvider, + dispatcherProvider, ) } diff --git a/app/src/main/java/org/dhis2/usescases/settings/DeleteUserData.kt b/app/src/main/java/org/dhis2/usescases/settings/DeleteUserData.kt index 42f9f2f0762..1d8bbcf8856 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/DeleteUserData.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/DeleteUserData.kt @@ -1,17 +1,22 @@ package org.dhis2.usescases.settings +import kotlinx.coroutines.withContext import org.dhis2.commons.filters.FilterManager import org.dhis2.commons.prefs.PreferenceProvider +import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.service.workManager.WorkManagerController import java.io.File -class DeleteUserData( +class DeleteUserData( private val workManagerController: WorkManagerController, private val filterManager: FilterManager, private val preferencesProvider: PreferenceProvider, + private val dispatcherProvider: DispatcherProvider, ) { - fun wipeCacheAndPreferences(file: File?) { - filterManager.clearAllFilters() + suspend fun wipeCacheAndPreferences(file: File?) { + withContext(dispatcherProvider.ui()) { + filterManager.clearAllFilters() + } workManagerController.cancelAllWork() workManagerController.pruneWork() if (file != null) { diff --git a/app/src/test/java/org/dhis2/usescases/main/MainPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/main/MainPresenterTest.kt index 2a717b07015..19cf71e08ef 100644 --- a/app/src/test/java/org/dhis2/usescases/main/MainPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/main/MainPresenterTest.kt @@ -33,12 +33,15 @@ import org.dhis2.mobile.sync.domain.SyncStatusController import org.dhis2.usescases.login.SyncIsPerformedInteractor import org.dhis2.usescases.main.domain.LogoutUser import org.dhis2.usescases.settings.DeleteUserData +import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.arch.helpers.DateUtils import org.hisp.dhis.android.core.category.CategoryCombo import org.hisp.dhis.android.core.category.CategoryOptionCombo import org.hisp.dhis.android.core.configuration.internal.DatabaseAccount import org.hisp.dhis.android.core.systeminfo.SystemInfo +import org.hisp.dhis.android.core.user.AccountManager import org.hisp.dhis.android.core.user.User +import org.hisp.dhis.android.core.user.UserModule import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Rule @@ -81,6 +84,9 @@ class MainPresenterTest { private val forceToNotSynced: Boolean = false private val logoutUser: LogoutUser = mock() + private val accountManager: AccountManager = mock() + private val userModule: UserModule = mock() + private val d2: D2 = mock() @Rule @JvmField @@ -182,26 +188,26 @@ class MainPresenterTest { } @Test - fun `Should go to delete account`() { + fun `Should go to delete account`() = runTest { val randomFile = File("random") + whenever(view.obtainFileView()) doReturn randomFile - whenever(userManager.d2) doReturn mock() - whenever(userManager.d2.userModule()) doReturn mock() - whenever(userManager.d2.userModule().accountManager()) doReturn mock() - whenever(view.obtainFileView()) doReturn randomFile + whenever(userManager.d2) doReturn d2 + whenever(d2.userModule()) doReturn userModule + whenever(userModule.accountManager()) doReturn accountManager whenever(repository.accountsCount()) doReturn 1 presenter.onDeleteAccount() verify(view).showProgressDeleteNotification() verify(deleteUserData).wipeCacheAndPreferences(randomFile) - verify(userManager.d2?.userModule()?.accountManager())?.deleteCurrentAccount() + verify(accountManager).deleteCurrentAccount() verify(view).cancelNotifications() verify(view).goToLogin(1, true) } @Test - fun `Should go to manage account`() { + fun `Should go to manage account`() = runTest { val firstRandomUserAccount = DatabaseAccount .builder() @@ -224,25 +230,19 @@ class MainPresenterTest { val randomFile = File("random") whenever(view.obtainFileView()) doReturn randomFile - whenever(userManager.d2) doReturn mock() - whenever(userManager.d2.userModule()) doReturn mock() - whenever(userManager.d2.userModule().accountManager()) doReturn mock() - whenever( - userManager.d2 - .userModule() - .accountManager() - .getAccounts(), - ) doReturn - listOf( - firstRandomUserAccount, - secondRandomUserAccount, - ) + whenever(userManager.d2) doReturn d2 + whenever(d2.userModule()) doReturn userModule + whenever(userModule.accountManager()) doReturn accountManager + whenever(accountManager.getAccounts()) doReturn listOf( + firstRandomUserAccount, + secondRandomUserAccount, + ) whenever(repository.accountsCount()) doReturn 2 presenter.onDeleteAccount() verify(deleteUserData).wipeCacheAndPreferences(randomFile) - verify(userManager.d2?.userModule()?.accountManager())?.deleteCurrentAccount() + verify(accountManager).deleteCurrentAccount() verify(view).showProgressDeleteNotification() verify(view).cancelNotifications() verify(view).goToLogin(2, true) diff --git a/app/src/test/java/org/dhis2/usescases/settings/DeleteUserDataTest.kt b/app/src/test/java/org/dhis2/usescases/settings/DeleteUserDataTest.kt index 76e9340f115..ede8a776864 100644 --- a/app/src/test/java/org/dhis2/usescases/settings/DeleteUserDataTest.kt +++ b/app/src/test/java/org/dhis2/usescases/settings/DeleteUserDataTest.kt @@ -1,28 +1,39 @@ package org.dhis2.usescases.settings +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.runTest import org.dhis2.commons.filters.FilterManager import org.dhis2.commons.prefs.PreferenceProvider +import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.service.workManager.WorkManagerController import org.junit.Before import org.junit.Test +import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock import org.mockito.kotlin.verify +@OptIn(ExperimentalCoroutinesApi::class) class DeleteUserDataTest { private lateinit var deleteUserData: DeleteUserData private val workManagerController: WorkManagerController = mock() private val filterManager: FilterManager = mock() private val preferencesProvider: PreferenceProvider = mock() + private val testingDispatcher = UnconfinedTestDispatcher() + private val dispatcherProvider: DispatcherProvider = mock { + on { io() } doReturn testingDispatcher + on { ui() } doReturn testingDispatcher + } @Before fun setup() { deleteUserData = - DeleteUserData(workManagerController, filterManager, preferencesProvider) + DeleteUserData(workManagerController, filterManager, preferencesProvider, dispatcherProvider) } @Test - fun `Should delete user data`() { + fun `Should delete user data`() = runTest { deleteUserData.wipeCacheAndPreferences(null) verify(workManagerController).cancelAllWork() From e0edafb64db74c79d4afa93d8193f95f36903a26 Mon Sep 17 00:00:00 2001 From: Xavier Molloy Date: Fri, 10 Apr 2026 10:47:18 +0200 Subject: [PATCH 128/260] fix: [ANDROAPP-7550] maintain running status in syncStatusController if sync is still running (#4789) --- .../dhis2/mobile/sync/domain/SyncStatusController.kt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncStatusController.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncStatusController.kt index 7f8db975878..273104e5424 100644 --- a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncStatusController.kt +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncStatusController.kt @@ -121,7 +121,16 @@ class SyncStatusController { } suspend fun restore() { - downloadStatus.emit(SyncStatusData()) + if (downloadStatus.value.running == true) { + downloadStatus.emit( + SyncStatusData( + isInitialSync = true, + running = true, + ), + ) + } else { + downloadStatus.emit(SyncStatusData()) + } } suspend fun onNetworkUnavailable() { From aa1503442a9c5897fdcb14998181c60b20b85d5c Mon Sep 17 00:00:00 2001 From: Xavier Molloy Date: Fri, 10 Apr 2026 13:52:09 +0200 Subject: [PATCH 129/260] fix: [ANDROAPP-7569] change sync settings job period to one hour, sync metadata settings triggered when job is set to manual initially (#4792) --- .../mobile/sync/data/AndroidSyncBackgroundJobAction.kt | 4 ++-- .../kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt | 2 +- .../kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt | 6 +++--- .../kotlin/org/dhis2/mobile/sync/domain/SyncSettings.kt | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncBackgroundJobAction.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncBackgroundJobAction.kt index eb2c8ae402f..872a5f597ed 100644 --- a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncBackgroundJobAction.kt +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncBackgroundJobAction.kt @@ -12,7 +12,7 @@ import kotlinx.coroutines.flow.map import org.dhis2.mobile.sync.model.SyncJobStatus import org.dhis2.mobile.sync.model.SyncStatus import java.util.concurrent.TimeUnit -import kotlin.time.Duration.Companion.days +import kotlin.time.Duration.Companion.hours const val METADATA_SYNC = "METADATA_SYNC" const val METADATA_SYNC_NOW = "METADATA_SYNC_NOW" @@ -100,7 +100,7 @@ class AndroidSyncBackgroundJobAction( PeriodicWorkRequest .Builder( workerClass = SyncSettingsWorker::class.java, - repeatInterval = 1.days.inWholeSeconds, + repeatInterval = 1.hours.inWholeSeconds, repeatIntervalTimeUnit = TimeUnit.SECONDS, ).setInitialDelay(1, TimeUnit.MINUTES) .addTag( diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt index a403d6044f7..8bc887dcfd8 100644 --- a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt @@ -6,7 +6,7 @@ import org.dhis2.mobile.sync.model.SyncPeriod interface SyncRepository { suspend fun refreshSyncSettings(): Result - suspend fun currentMetadataSyncPeriod(): SyncPeriod + suspend fun currentMetadataSyncPeriod(): SyncPeriod? suspend fun currentDataSyncPeriod(): SyncPeriod diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt index 621243a788d..728667af731 100644 --- a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt @@ -48,8 +48,8 @@ class SyncMetadata( } private suspend fun handleMetadataPeriodChange( - initialMetadataSyncPeriod: SyncPeriod, - finalMetadataSyncPeriod: SyncPeriod, + initialMetadataSyncPeriod: SyncPeriod?, + finalMetadataSyncPeriod: SyncPeriod?, ) { val metadataSyncPeriodChanged = initialMetadataSyncPeriod != finalMetadataSyncPeriod @@ -63,7 +63,7 @@ class SyncMetadata( } metadataSyncPeriodChanged -> { - syncBackgroundJobAction.launchMetadataSync(finalMetadataSyncPeriod.toSeconds()) + syncBackgroundJobAction.launchMetadataSync(finalMetadataSyncPeriod?.toSeconds() ?: 0L) } } } diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncSettings.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncSettings.kt index dd97e76bb4d..5d2d4da4a76 100644 --- a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncSettings.kt +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncSettings.kt @@ -18,11 +18,11 @@ class SyncSettings( val currentMetadataSyncPeriod = repository.currentMetadataSyncPeriod() val metadataPeriodChangedFromManual = - previousMetadataSyncPeriod is SyncPeriod.Manual && + (previousMetadataSyncPeriod is SyncPeriod.Manual || previousMetadataSyncPeriod == null) && currentMetadataSyncPeriod !is SyncPeriod.Manual if (metadataPeriodChangedFromManual) { - syncBackgroundJobAction.launchMetadataSync(currentMetadataSyncPeriod.toSeconds()) + syncBackgroundJobAction.launchMetadataSync(currentMetadataSyncPeriod?.toSeconds() ?: 0L) syncBackgroundJobAction.cancelSyncSettings() } } From 513553553b8adc475099c76971476533e1ec115c Mon Sep 17 00:00:00 2001 From: Ferdy Rodriguez Date: Mon, 13 Apr 2026 07:19:12 +0200 Subject: [PATCH 130/260] chore: [ANDROAPP-7540] Adds the compose multiplatform dependencies directly (#4788) * Adds the compose multiplatform dependencies directly in libs.versions.toml * chore: update dependency verification metadata * correct material3 dependency --------- Co-authored-by: @dhis2-bot --- aggregates/build.gradle.kts | 16 ++++++++-------- commonskmm/build.gradle.kts | 12 ++++++------ gradle/libs.versions.toml | 12 +++++++++++- gradle/verification-metadata.xml | 10 ++++++++++ login/build.gradle.kts | 18 +++++++++--------- .../ui/screen/TwoFAToEnableScreen.kt | 2 +- .../mobile/login/main/ui/screen/LoginScreen.kt | 2 +- .../login/pin/ui/components/PinDialog.kt | 2 +- sync/build.gradle.kts | 12 ++++++------ tracker/build.gradle.kts | 16 ++++++++-------- 10 files changed, 61 insertions(+), 41 deletions(-) diff --git a/aggregates/build.gradle.kts b/aggregates/build.gradle.kts index b7e394b50bf..6243cf76e34 100644 --- a/aggregates/build.gradle.kts +++ b/aggregates/build.gradle.kts @@ -32,17 +32,17 @@ kotlin { } commonMain.dependencies { - implementation(compose.runtime) - implementation(compose.foundation) - implementation(compose.ui) - implementation(compose.material3) - api(compose.materialIconsExtended) + implementation(libs.compose.runtime) + implementation(libs.compose.foundation) + implementation(libs.compose.ui) + implementation(libs.compose.material3) + api(libs.compose.material3.iconsExtendend) val designSystem = libs.dhis2.mobile.designsystem implementation("${designSystem.get().group}:${designSystem.get().name}:${designSystem.get().version}"){ isChanging= true } implementation(libs.compose.material3.window) - implementation(compose.components.resources) + implementation(libs.compose.components.resources) implementation(project(":commonskmm")) // Koin @@ -60,7 +60,7 @@ kotlin { implementation(libs.test.turbine) implementation(libs.test.kotlinCoroutines) implementation(libs.test.mockitoKotlin) - implementation(compose.components.resources) + implementation(libs.compose.components.resources) } androidMain.dependencies { @@ -80,7 +80,7 @@ kotlin { val desktopMain by getting { dependencies { - implementation(compose.desktop.common) + implementation(libs.compose.desktop.common) } } } diff --git a/commonskmm/build.gradle.kts b/commonskmm/build.gradle.kts index bd3c8f6b8e3..be788975ab8 100644 --- a/commonskmm/build.gradle.kts +++ b/commonskmm/build.gradle.kts @@ -31,11 +31,11 @@ kotlin { sourceSets { commonMain.dependencies { - implementation(compose.runtime) - implementation(compose.foundation) - implementation(compose.ui) - implementation(compose.material3) - implementation(compose.components.resources) + implementation(libs.compose.runtime) + implementation(libs.compose.foundation) + implementation(libs.compose.ui) + implementation(libs.compose.material3) + implementation(libs.compose.components.resources) implementation(libs.compose.material3.window) implementation(libs.lifecycle.runtime.compose) @@ -94,7 +94,7 @@ kotlin { val desktopMain by getting { dependencies { - implementation(compose.desktop.common) + implementation(libs.compose.desktop.common) } } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 085f1b40b0a..c83a1e59a7b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -94,6 +94,8 @@ browser = "1.9.0" biometric = "1.1.0" coil = "3.3.0" cyclonedx = "2.1.0" +jetbrains-material3="1.9.0" +materialIconsExtended = "1.7.3" [libraries] gradlePlugin = { group = "com.android.tools.build", name = "gradle", version.ref = "gradle" } @@ -215,6 +217,14 @@ ktxml = { module = "org.kobjects.ktxml:core", version.ref = "ktxml" } commons-text = { module = "org.apache.commons:commons-text", version.ref = "commonsText" } coil = { module = "io.coil-kt.coil3:coil-compose", version.ref = "coil"} coil-network = { module = "io.coil-kt.coil3:coil-network-okhttp", version.ref = "coil"} +compose-runtime = { group = "org.jetbrains.compose.runtime", name = "runtime", version.ref = "composePluginVersion" } +compose-foundation = { group = "org.jetbrains.compose.foundation", name = "foundation", version.ref = "composePluginVersion" } +compose-ui = { group = "org.jetbrains.compose.ui", name = "ui", version.ref = "composePluginVersion" } +compose-ui-uiToolingPreview = { group = "org.jetbrains.compose.ui", name = "ui-tooling-preview", version.ref = "composePluginVersion" } +compose-material3 = { group = "org.jetbrains.compose.material3", name = "material3", version.ref = "jetbrains-material3" } +compose-components-resources = { group = "org.jetbrains.compose.components", name = "components-resources", version.ref = "composePluginVersion" } +compose-desktop-common = { group = "org.jetbrains.compose.desktop", name = "desktop", version.ref = "composePluginVersion" } +compose-material3-iconsExtendend = { group = "org.jetbrains.compose.material", name = "material-icons-extended", version.ref = "materialIconsExtended" } [plugins] kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } @@ -242,4 +252,4 @@ table-test = ["test-junit"] table-androidTest = ["test-compose-ui-test", "test-uiautomator", "test-junitKtx", "test-espresso"] stock-implementation = ["androidx-activity-compose", "androidx-annotation", "rx-relay", "security-openId", "androidx-preferenceKtx", "androidx-work", "androidx-activityKtx", "androidx-lifecycle-viewmodel-compose", "analytics-customactivityoncrash"] stock-core = ["desugar"] -stock-test = ["test-mockitoKotlin", "test-mockitoInline", "test-archCoreTesting", "test-javafaker", "test-kotlinCoroutines"] +stock-test = ["test-mockitoKotlin", "test-mockitoInline", "test-archCoreTesting", "test-javafaker", "test-kotlinCoroutines"] \ No newline at end of file diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 40072bd346d..1bff7d755d7 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -278,6 +278,11 @@ + + + + + @@ -293,6 +298,11 @@ + + + + + diff --git a/login/build.gradle.kts b/login/build.gradle.kts index 2f0a3fa1a72..380aa71c941 100644 --- a/login/build.gradle.kts +++ b/login/build.gradle.kts @@ -41,20 +41,20 @@ kotlin { resources.srcDirs("src/commonMain/composeResources") dependencies { - implementation(compose.runtime) - implementation(compose.foundation) - implementation(compose.ui) - implementation(compose.material3) - api(compose.materialIconsExtended) + implementation(libs.compose.runtime) + implementation(libs.compose.foundation) + implementation(libs.compose.ui) + implementation(libs.compose.material3) + api(libs.compose.material3.iconsExtendend) val designSystem = libs.dhis2.mobile.designsystem implementation("${designSystem.get().group}:${designSystem.get().name}:${designSystem.get().version}") { isChanging = true } implementation(libs.compose.material3.window) - implementation(compose.components.resources) + implementation(libs.compose.components.resources) implementation(project(":commonskmm")) implementation(libs.navigation.compose) - implementation(compose.components.uiToolingPreview) + implementation(libs.compose.ui.uiToolingPreview) // Koin api(libs.koin.core) @@ -69,7 +69,7 @@ kotlin { implementation(libs.test.turbine) implementation(libs.test.kotlinCoroutines) implementation(libs.test.mockitoKotlin) - implementation(compose.components.resources) + implementation(libs.compose.components.resources) } } @@ -101,7 +101,7 @@ kotlin { val desktopMain by getting { dependencies { - implementation(compose.desktop.common) + implementation(libs.compose.desktop.common) } } } diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/ui/screen/TwoFAToEnableScreen.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/ui/screen/TwoFAToEnableScreen.kt index b72adec67f8..9846e3b312c 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/ui/screen/TwoFAToEnableScreen.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/ui/screen/TwoFAToEnableScreen.kt @@ -26,6 +26,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.testTag import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import org.dhis2.mobile.login.authentication.ui.state.TwoFAUiState @@ -61,7 +62,6 @@ import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor import org.hisp.dhis.mobile.ui.designsystem.theme.TextColor import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.stringResource -import org.jetbrains.compose.ui.tooling.preview.Preview const val TURN_ON_BUTTON_TEST_TAG = "turn_on_button_test_tag" diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/LoginScreen.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/LoginScreen.kt index 04650c2d270..02f02fdde93 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/LoginScreen.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/LoginScreen.kt @@ -46,6 +46,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalLayoutDirection +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost @@ -76,7 +77,6 @@ import org.hisp.dhis.mobile.ui.designsystem.theme.dropShadow import org.jetbrains.compose.resources.getString import org.jetbrains.compose.resources.stringResource import org.jetbrains.compose.resources.vectorResource -import org.jetbrains.compose.ui.tooling.preview.Preview import org.koin.compose.viewmodel.koinViewModel import org.koin.core.parameter.parametersOf diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/components/PinDialog.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/components/PinDialog.kt index 59aaa8ed19d..666ebd05609 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/components/PinDialog.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/components/PinDialog.kt @@ -32,6 +32,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.DpSize import androidx.compose.ui.unit.dp import org.dhis2.mobile.commons.extensions.deviceIsInLandscapeMode @@ -49,7 +50,6 @@ import org.hisp.dhis.mobile.ui.designsystem.component.model.SegmentedShellType import org.hisp.dhis.mobile.ui.designsystem.component.state.BottomSheetShellDefaults import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme import org.hisp.dhis.mobile.ui.designsystem.theme.Spacing -import org.jetbrains.compose.ui.tooling.preview.Preview import org.koin.compose.viewmodel.koinViewModel import org.koin.core.parameter.parametersOf diff --git a/sync/build.gradle.kts b/sync/build.gradle.kts index ee7b03718fb..6ec44b2d670 100644 --- a/sync/build.gradle.kts +++ b/sync/build.gradle.kts @@ -37,11 +37,11 @@ kotlin { dependencies { implementation(project(":commonskmm")) - implementation(compose.runtime) - implementation(compose.foundation) - implementation(compose.ui) - implementation(compose.material3) - implementation(compose.components.resources) + implementation(libs.compose.runtime) + implementation(libs.compose.foundation) + implementation(libs.compose.ui) + implementation(libs.compose.material3) + implementation(libs.compose.components.resources) implementation(libs.compose.material3.window) implementation(libs.lifecycle.runtime.compose) @@ -86,7 +86,7 @@ kotlin { val desktopMain by getting { dependencies { - implementation(compose.desktop.common) + implementation(libs.compose.desktop.common) } } } diff --git a/tracker/build.gradle.kts b/tracker/build.gradle.kts index c8e17ed83f4..ae21c54eb6d 100644 --- a/tracker/build.gradle.kts +++ b/tracker/build.gradle.kts @@ -32,18 +32,18 @@ kotlin { } commonMain.dependencies { - implementation(compose.runtime) - implementation(compose.foundation) - implementation(compose.ui) - implementation(compose.material3) - api(compose.materialIconsExtended) + implementation(libs.compose.runtime) + implementation(libs.compose.foundation) + implementation(libs.compose.ui) + implementation(libs.compose.material3) + implementation(libs.compose.components.resources) + api(libs.compose.material3.iconsExtendend) val designSystem = libs.dhis2.mobile.designsystem implementation("${designSystem.get().group}:${designSystem.get().name}:${designSystem.get().version}") { isChanging = true } implementation(libs.kotlinx.datetime) implementation(libs.compose.material3.window) - implementation(compose.components.resources) implementation(project(":commonskmm")) implementation(libs.androidx.compose.paging) @@ -60,7 +60,7 @@ kotlin { implementation(libs.test.turbine) implementation(libs.test.kotlinCoroutines) implementation(libs.test.mockitoKotlin) - implementation(compose.components.resources) + implementation(libs.compose.components.resources) } androidMain.dependencies { @@ -86,7 +86,7 @@ kotlin { val desktopMain by getting { dependencies { - implementation(compose.desktop.common) + implementation(libs.compose.desktop.common) } } } From b53d3e5691beb8b8eeda4e096a81f747fb3361f1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 09:55:21 +0000 Subject: [PATCH 131/260] Add tracker search flow instrumented test for TB program (ANDROAPP-5971/5861/2458/5862/5970/7488/7489/7490/1056/7491) Co-authored-by: andresmr <3330344+andresmr@users.noreply.github.com> --- .../dhis2/usescases/searchte/SearchTETest.kt | 85 ++++++++++++++ .../searchte/robot/SearchTeiRobot.kt | 110 +++++++++++++++++- .../searchTrackEntity/ui/SearchTEUi.kt | 2 + 3 files changed, 196 insertions(+), 1 deletion(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt index 93d3178ed9f..31d028efc75 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt @@ -111,6 +111,73 @@ class SearchTETest : BaseTest() { } } + @Test + fun shouldFollowTBProgramSearchFlow() { + // Mock the online search to return empty results (only local DB results shown) + mockWebServerRobot.addResponse( + ResponseController.GET, + API_TRACKED_ENTITY_PATH, + API_TRACKED_ENTITY_EMPTY_RESPONSE, + ) + + prepareTBIntentAndLaunchActivity(rule) + + searchTeiRobot(composeTestRule) { + waitUntilActivityVisible() + + // ANDROAPP-5971: Search/Add new [TET] button is visible and enabled + checkAddNewTEIButtonIsDisplayedAndEnabled() + + // Open the search parameters panel + clickOnOpenSearch() + + // ANDROAPP-5861: Unique attribute (TB identifier) is first after sort ordering + checkFirstSearchParamIsBarcodeOrQROrUnique(TB_IDENTIFIER_LABEL) + + // ANDROAPP-2458: Verify count of searchable attributes + checkSearchParamCount(TB_PROGRAM_SEARCH_ATTR_COUNT) + + // ANDROAPP-5862: Search button is disabled when no values are entered + checkSearchButtonIsDisabled() + + // Enter a value to enable the search button (Part A entry) + typeOnSearchParameter(TB_SEARCH_ATTR_CITY, TB_SEARCH_CITY_SHORT) + + // [Part A] ANDROAPP-5862: Search button is now enabled + checkSearchButtonIsEnabled() + + // ANDROAPP-5970: Reset search field + clickOnClearSearch() + + // Re-enter a short value (1 char) to enable the button + typeOnSearchParameter(TB_SEARCH_ATTR_CITY, TB_SEARCH_CITY_SHORT) + + // ANDROAPP-7488: Focus a field with operator to verify operator description as supporting text + typeOnSearchParameter(TB_SEARCH_ATTR_ZIP, "") + checkFocusedFieldShowsOperatorSupportingText() + + // Click Search – triggers per-field min-character validation + clickOnSearch() + + // [Part B] ANDROAPP-7489/7490 & ANDROAPP-1056/7491: + // Error is displayed because value is below the minimum character requirement + checkMinCharactersErrorIsDisplayed() + + // Update to valid search values and search again + typeOnSearchParameter(TB_SEARCH_ATTR_CITY, TB_SEARCH_CITY) + typeOnSearchParameter(TB_SEARCH_ATTR_STATE, TB_SEARCH_STATE) + typeOnSearchParameter(TB_SEARCH_ATTR_ZIP, TB_SEARCH_ZIP) + typeOnSearchParameter(TB_SEARCH_ATTR_TB_NUMBER, TB_SEARCH_TB_NUMBER) + + // Click Search with valid values + clickOnSearch() + + // Verify results: Lynn Dunn and Inés Bebea are displayed + checkSearchResultDisplayed(TB_RESULT_DUNN) + checkSearchResultDisplayed(TB_RESULT_BEBEA) + } + } + private fun createRegisterTEI() = RegisterTEIUIModel( "Claire", "Jones", @@ -139,5 +206,23 @@ class SearchTETest : BaseTest() { const val CHILD_TE_TYPE_VALUE = "nEenWmSyUEp" const val CHILD_TE_TYPE = "TRACKED_ENTITY_UID" + + // TB Program search flow test constants + const val TB_PROGRAM_SEARCH_ATTR_COUNT = 8 + const val TB_IDENTIFIER_LABEL = "TB identifier" + + const val TB_SEARCH_ATTR_CITY = "City" + const val TB_SEARCH_ATTR_STATE = "State" + const val TB_SEARCH_ATTR_ZIP = "Zip code" + const val TB_SEARCH_ATTR_TB_NUMBER = "TB number" + + const val TB_SEARCH_CITY_SHORT = "C" + const val TB_SEARCH_CITY = "City" + const val TB_SEARCH_STATE = "State" + const val TB_SEARCH_ZIP = "404" + const val TB_SEARCH_TB_NUMBER = "123456789" + + const val TB_RESULT_DUNN = "Dunn" + const val TB_RESULT_BEBEA = "Bebea" } } diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index d2c48a74aa1..18f10d8e344 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -2,7 +2,11 @@ package org.dhis2.usescases.searchte.robot import androidx.compose.ui.test.ExperimentalTestApi import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.assertIsEnabled +import androidx.compose.ui.test.assertIsNotEnabled import androidx.compose.ui.test.hasAnyAncestor +import androidx.compose.ui.test.hasAnyDescendant +import androidx.compose.ui.test.hasContentDescription import androidx.compose.ui.test.hasParent import androidx.compose.ui.test.hasTestTag import androidx.compose.ui.test.hasText @@ -33,7 +37,6 @@ import org.hamcrest.CoreMatchers.allOf import org.hamcrest.CoreMatchers.not import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItem - fun searchTeiRobot( composeTestRule: ComposeTestRule, searchTeiRobot: SearchTeiRobot.() -> Unit @@ -208,4 +211,109 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { value = displayListFieldsUIModel.address, ), ) + + // --- Methods for the TB Program search flow test --- + + @OptIn(ExperimentalTestApi::class) + fun checkAddNewTEIButtonIsDisplayedAndEnabled() { + composeTestRule.waitUntilAtLeastOneExists(hasTestTag("ADD_NEW_BUTTON"), TIMEOUT) + composeTestRule.onNodeWithTag("ADD_NEW_BUTTON") + .assertIsDisplayed() + .assertIsEnabled() + } + + @OptIn(ExperimentalTestApi::class) + fun checkFirstSearchParamIsBarcodeOrQR() { + composeTestRule.waitUntilAtLeastOneExists(hasTestTag("SEARCH_PARAM_ITEM"), TIMEOUT) + composeTestRule + .onAllNodesWithTag("SEARCH_PARAM_ITEM")[0] + .assert( + hasAnyDescendant( + hasContentDescription("QR Code Icon") or + hasContentDescription("Barcode Icon"), + ), + ) + } + + @OptIn(ExperimentalTestApi::class) + fun checkSearchParamCount(expectedCount: Int) { + composeTestRule.waitUntilAtLeastOneExists(hasTestTag("SEARCH_PARAM_ITEM"), TIMEOUT) + val count = composeTestRule + .onAllNodesWithTag("SEARCH_PARAM_ITEM") + .fetchSemanticsNodes() + .size + assert(count == expectedCount) { + "Expected $expectedCount search parameters, but found $count" + } + } + + @OptIn(ExperimentalTestApi::class) + fun checkSearchButtonIsDisabled() { + composeTestRule.waitUntilAtLeastOneExists(hasTestTag("SEARCH_BUTTON"), TIMEOUT) + composeTestRule.onNodeWithTag("SEARCH_BUTTON").assertIsNotEnabled() + } + + @OptIn(ExperimentalTestApi::class) + fun checkSearchButtonIsEnabled() { + composeTestRule.waitUntilAtLeastOneExists(hasTestTag("SEARCH_BUTTON"), TIMEOUT) + composeTestRule.onNodeWithTag("SEARCH_BUTTON").assertIsEnabled() + } + + @OptIn(ExperimentalTestApi::class) + fun typeOnSearchParameter(label: String, value: String) { + composeTestRule.waitUntilAtLeastOneExists(hasText(label), TIMEOUT) + composeTestRule.onNodeWithText(label).performClick() + composeTestRule.waitUntilAtLeastOneExists(hasTestTag("INPUT_TEXT_FIELD"), TIMEOUT) + composeTestRule.onAllNodesWithTag("INPUT_TEXT_FIELD").onLast().performTextInput(value) + } + + @OptIn(ExperimentalTestApi::class) + fun clickOnClearSearch() { + composeTestRule.waitUntilAtLeastOneExists(hasText("Clear search"), TIMEOUT) + composeTestRule.onNodeWithText("Clear search").performClick() + composeTestRule.waitForIdle() + } + + @OptIn(ExperimentalTestApi::class) + fun checkFocusedFieldShowsOperatorSupportingText() { + composeTestRule.waitUntilAtLeastOneExists( + hasText("Exact matches only") or + hasText("Must match the start of the value") or + hasText("Must match the end of the value"), + TIMEOUT, + ) + } + + @OptIn(ExperimentalTestApi::class) + fun checkMinCharactersErrorIsDisplayed() { + composeTestRule.waitUntilAtLeastOneExists( + hasText("Enter at least", substring = true), + TIMEOUT, + ) + } + + @OptIn(ExperimentalTestApi::class) + fun checkMinAttributesWarningIsDisplayed() { + composeTestRule.waitUntilAtLeastOneExists( + hasText("You need to enter at least", substring = true), + TIMEOUT, + ) + } + + @OptIn(ExperimentalTestApi::class) + fun checkSearchResultCount(expectedCount: Int) { + composeTestRule.waitForIdle() + val nodes = composeTestRule + .onAllNodesWithTag("LIST_CARD_ITEM_TAG") + .fetchSemanticsNodes() + assert(nodes.size == expectedCount) { + "Expected $expectedCount search results, but found ${nodes.size}" + } + } + + @OptIn(ExperimentalTestApi::class) + fun checkSearchResultDisplayed(teiName: String) { + composeTestRule.waitUntilAtLeastOneExists(hasText(teiName, substring = true), TIMEOUT) + composeTestRule.onNodeWithText(teiName, substring = true).assertIsDisplayed() + } } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt index 7ba9d943554..30607aa32cf 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt @@ -48,6 +48,7 @@ import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.intl.Locale import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.toLowerCase +import androidx.compose.ui.platform.testTag import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -159,6 +160,7 @@ fun AddNewButton( modifier = Modifier .requiredHeight(44.dp) + .testTag("ADD_NEW_BUTTON") .then(modifier), colors = ButtonDefaults.buttonColors( From dc8818a6ad9dd79d476ed61c9baca965cfb62e8c Mon Sep 17 00:00:00 2001 From: rohit Date: Fri, 27 Mar 2026 15:17:23 +0100 Subject: [PATCH 132/260] test: Add TB Program search flow instrumentation test - Add shouldFollowTBProgramSearchFlow test to validate TB Program search functionality - Implement checkFirstSearchParamIsBarcodeOrQROrUnique() validation method - Add support for clear/reset button (INPUT_TEXT_RESET_BUTTON) in search fields - Add minimum character validation test for search parameters - Test validates complete search flow: parameter ordering, button states, field clearing, validation errors, and search results - Remove unused TB_PROGRAM_SEARCH_ATTR_COUNT constant - Add assert import to SearchTeiRobot --- .../dhis2/usescases/searchte/SearchTETest.kt | 20 +++++++------------ .../searchte/robot/SearchTeiRobot.kt | 15 ++++++++++++-- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt index 31d028efc75..59e65b0ae2f 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt @@ -134,9 +134,6 @@ class SearchTETest : BaseTest() { // ANDROAPP-5861: Unique attribute (TB identifier) is first after sort ordering checkFirstSearchParamIsBarcodeOrQROrUnique(TB_IDENTIFIER_LABEL) - // ANDROAPP-2458: Verify count of searchable attributes - checkSearchParamCount(TB_PROGRAM_SEARCH_ATTR_COUNT) - // ANDROAPP-5862: Search button is disabled when no values are entered checkSearchButtonIsDisabled() @@ -152,10 +149,6 @@ class SearchTETest : BaseTest() { // Re-enter a short value (1 char) to enable the button typeOnSearchParameter(TB_SEARCH_ATTR_CITY, TB_SEARCH_CITY_SHORT) - // ANDROAPP-7488: Focus a field with operator to verify operator description as supporting text - typeOnSearchParameter(TB_SEARCH_ATTR_ZIP, "") - checkFocusedFieldShowsOperatorSupportingText() - // Click Search – triggers per-field min-character validation clickOnSearch() @@ -163,10 +156,12 @@ class SearchTETest : BaseTest() { // Error is displayed because value is below the minimum character requirement checkMinCharactersErrorIsDisplayed() + // Clear the field + clickOnClearSearch() + // Update to valid search values and search again typeOnSearchParameter(TB_SEARCH_ATTR_CITY, TB_SEARCH_CITY) typeOnSearchParameter(TB_SEARCH_ATTR_STATE, TB_SEARCH_STATE) - typeOnSearchParameter(TB_SEARCH_ATTR_ZIP, TB_SEARCH_ZIP) typeOnSearchParameter(TB_SEARCH_ATTR_TB_NUMBER, TB_SEARCH_TB_NUMBER) // Click Search with valid values @@ -208,7 +203,6 @@ class SearchTETest : BaseTest() { const val CHILD_TE_TYPE = "TRACKED_ENTITY_UID" // TB Program search flow test constants - const val TB_PROGRAM_SEARCH_ATTR_COUNT = 8 const val TB_IDENTIFIER_LABEL = "TB identifier" const val TB_SEARCH_ATTR_CITY = "City" @@ -217,10 +211,10 @@ class SearchTETest : BaseTest() { const val TB_SEARCH_ATTR_TB_NUMBER = "TB number" const val TB_SEARCH_CITY_SHORT = "C" - const val TB_SEARCH_CITY = "City" - const val TB_SEARCH_STATE = "State" - const val TB_SEARCH_ZIP = "404" - const val TB_SEARCH_TB_NUMBER = "123456789" + const val TB_SEARCH_CITY = "Cit" + const val TB_SEARCH_STATE = "Sta" + const val TB_SEARCH_ZIP = "40" + const val TB_SEARCH_TB_NUMBER = "34567" const val TB_RESULT_DUNN = "Dunn" const val TB_RESULT_BEBEA = "Bebea" diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index 18f10d8e344..29b18135ae0 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -1,6 +1,7 @@ package org.dhis2.usescases.searchte.robot import androidx.compose.ui.test.ExperimentalTestApi +import androidx.compose.ui.test.assert import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsEnabled import androidx.compose.ui.test.assertIsNotEnabled @@ -36,6 +37,7 @@ import org.dhis2.usescases.searchte.entity.DisplayListFieldsUIModel import org.hamcrest.CoreMatchers.allOf import org.hamcrest.CoreMatchers.not import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItem +import kotlin.test.assertContains fun searchTeiRobot( composeTestRule: ComposeTestRule, @@ -235,6 +237,14 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { ) } + @OptIn(ExperimentalTestApi::class) + fun checkFirstSearchParamIsBarcodeOrQROrUnique(expectedLabel: String) { + composeTestRule.waitUntilAtLeastOneExists(hasTestTag("SEARCH_PARAM_ITEM"), TIMEOUT) + composeTestRule + .onAllNodesWithTag("SEARCH_PARAM_ITEM")[0] + .assert(hasText(expectedLabel)) + } + @OptIn(ExperimentalTestApi::class) fun checkSearchParamCount(expectedCount: Int) { composeTestRule.waitUntilAtLeastOneExists(hasTestTag("SEARCH_PARAM_ITEM"), TIMEOUT) @@ -269,8 +279,9 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { @OptIn(ExperimentalTestApi::class) fun clickOnClearSearch() { - composeTestRule.waitUntilAtLeastOneExists(hasText("Clear search"), TIMEOUT) - composeTestRule.onNodeWithText("Clear search").performClick() + // The reset button in InputText has the test tag "INPUT_TEXT_RESET_BUTTON" + composeTestRule.waitUntilAtLeastOneExists(hasTestTag("INPUT_TEXT_RESET_BUTTON"), TIMEOUT) + composeTestRule.onNodeWithTag("INPUT_TEXT_RESET_BUTTON").performClick() composeTestRule.waitForIdle() } From cd95391d4c78ac0c1a960908abe8ab6d319e2e5e Mon Sep 17 00:00:00 2001 From: rohit Date: Wed, 1 Apr 2026 13:03:46 +0200 Subject: [PATCH 133/260] Test updated to complete Search operators flow test --- .../dhis2/usescases/searchte/SearchTETest.kt | 13 ++++++-- .../searchte/robot/SearchTeiRobot.kt | 33 +++++++++++++++++-- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt index 59e65b0ae2f..8c334ff3da9 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt @@ -143,18 +143,25 @@ class SearchTETest : BaseTest() { // [Part A] ANDROAPP-5862: Search button is now enabled checkSearchButtonIsEnabled() - // ANDROAPP-5970: Reset search field clickOnClearSearch() // Re-enter a short value (1 char) to enable the button typeOnSearchParameter(TB_SEARCH_ATTR_CITY, TB_SEARCH_CITY_SHORT) + checkFocusedFieldShowsOperatorSupportingText() + typeOnSearchParameter(TB_SEARCH_ATTR_STATE, TB_SEARCH_CITY_SHORT) + checkFocusedFieldShowsOperatorSupportingText() + typeOnSearchParameter(TB_SEARCH_ATTR_TB_NUMBER, TB_SEARCH_CITY_SHORT) // Click Search – triggers per-field min-character validation clickOnSearch() - // [Part B] ANDROAPP-7489/7490 & ANDROAPP-1056/7491: + // ANDROAPP-7489/7490 & ANDROAPP-1056/7491: // Error is displayed because value is below the minimum character requirement - checkMinCharactersErrorIsDisplayed() + checkMinCharactersErrorIsDisplayed( + TB_SEARCH_ATTR_CITY, + TB_SEARCH_ATTR_STATE, + TB_SEARCH_ATTR_TB_NUMBER + ) // Clear the field clickOnClearSearch() diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index 29b18135ae0..8944dfb6502 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -18,6 +18,8 @@ import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.performScrollTo +import androidx.compose.ui.test.performScrollToNode import androidx.compose.ui.test.performTextInput import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click @@ -271,18 +273,30 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { @OptIn(ExperimentalTestApi::class) fun typeOnSearchParameter(label: String, value: String) { + composeTestRule.waitForIdle() + composeTestRule.waitUntilAtLeastOneExists(hasText(label), TIMEOUT) composeTestRule.onNodeWithText(label).performClick() composeTestRule.waitUntilAtLeastOneExists(hasTestTag("INPUT_TEXT_FIELD"), TIMEOUT) composeTestRule.onAllNodesWithTag("INPUT_TEXT_FIELD").onLast().performTextInput(value) + + // Close keyboard after typing to reveal fields that might be hidden behind it + closeKeyboard() + composeTestRule.waitForIdle() } @OptIn(ExperimentalTestApi::class) fun clickOnClearSearch() { // The reset button in InputText has the test tag "INPUT_TEXT_RESET_BUTTON" composeTestRule.waitUntilAtLeastOneExists(hasTestTag("INPUT_TEXT_RESET_BUTTON"), TIMEOUT) - composeTestRule.onNodeWithTag("INPUT_TEXT_RESET_BUTTON").performClick() - composeTestRule.waitForIdle() + // Click all reset buttons to clear all fields + val resetButtons = composeTestRule.onAllNodesWithTag("INPUT_TEXT_RESET_BUTTON") + val count = resetButtons.fetchSemanticsNodes().size + for (i in 0 until count) { + // Always click the first one (indices shift as we clear fields) + composeTestRule.onAllNodesWithTag("INPUT_TEXT_RESET_BUTTON")[0].performClick() + composeTestRule.waitForIdle() + } } @OptIn(ExperimentalTestApi::class) @@ -296,11 +310,24 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { } @OptIn(ExperimentalTestApi::class) - fun checkMinCharactersErrorIsDisplayed() { + fun checkMinCharactersErrorIsDisplayed(vararg fieldLabels: String) { + // Wait for error messages to appear + composeTestRule.waitForIdle() + + // Count the number of "Enter at least" error messages composeTestRule.waitUntilAtLeastOneExists( hasText("Enter at least", substring = true), TIMEOUT, ) + + val errorNodes = composeTestRule + .onAllNodes(hasText("Enter at least", substring = true)) + .fetchSemanticsNodes() + + // Verify that we have the expected number of error messages (one per field) + assert(errorNodes.size >= fieldLabels.size) { + "Expected at least ${fieldLabels.size} error messages but found ${errorNodes.size}" + } } @OptIn(ExperimentalTestApi::class) From 9b6848809c74d0685f9a7364821f71a0c4881e6d Mon Sep 17 00:00:00 2001 From: rohit Date: Wed, 1 Apr 2026 13:33:13 +0200 Subject: [PATCH 134/260] [Test]: Added test to count and verify number of search fields. --- .../java/org/dhis2/usescases/searchte/SearchTETest.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt index 8c334ff3da9..058f10f266b 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt @@ -134,6 +134,9 @@ class SearchTETest : BaseTest() { // ANDROAPP-5861: Unique attribute (TB identifier) is first after sort ordering checkFirstSearchParamIsBarcodeOrQROrUnique(TB_IDENTIFIER_LABEL) + // Check that all 9 search fields are displayed + checkSearchParamCount(9) + // ANDROAPP-5862: Search button is disabled when no values are entered checkSearchButtonIsDisabled() From 4821c50ee27605616e9254d2c7e8ce863622f707 Mon Sep 17 00:00:00 2001 From: Rohit <168576901+rohit-wa@users.noreply.github.com> Date: Wed, 1 Apr 2026 15:28:36 +0200 Subject: [PATCH 135/260] Update app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt The fields were hidden behind the keyboard so no need to scroll Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index 8944dfb6502..90bca74acb0 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -19,7 +19,6 @@ import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performScrollTo -import androidx.compose.ui.test.performScrollToNode import androidx.compose.ui.test.performTextInput import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click From d86236353e330a3a32addb6102b6a1505f05f0c7 Mon Sep 17 00:00:00 2001 From: Rohit <168576901+rohit-wa@users.noreply.github.com> Date: Wed, 1 Apr 2026 15:29:02 +0200 Subject: [PATCH 136/260] Update app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index 90bca74acb0..574dfeac37d 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -273,12 +273,11 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { @OptIn(ExperimentalTestApi::class) fun typeOnSearchParameter(label: String, value: String) { composeTestRule.waitForIdle() - + composeTestRule.waitUntilAtLeastOneExists(hasText(label), TIMEOUT) composeTestRule.onNodeWithText(label).performClick() composeTestRule.waitUntilAtLeastOneExists(hasTestTag("INPUT_TEXT_FIELD"), TIMEOUT) composeTestRule.onAllNodesWithTag("INPUT_TEXT_FIELD").onLast().performTextInput(value) - // Close keyboard after typing to reveal fields that might be hidden behind it closeKeyboard() composeTestRule.waitForIdle() From 7c359b1869f98d74ff38652c101d6e349c2c20d3 Mon Sep 17 00:00:00 2001 From: Rohit <168576901+rohit-wa@users.noreply.github.com> Date: Wed, 1 Apr 2026 15:30:51 +0200 Subject: [PATCH 137/260] Update app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../java/org/dhis2/usescases/searchte/SearchTETest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt index 058f10f266b..7ae25fa0fce 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt @@ -163,7 +163,7 @@ class SearchTETest : BaseTest() { checkMinCharactersErrorIsDisplayed( TB_SEARCH_ATTR_CITY, TB_SEARCH_ATTR_STATE, - TB_SEARCH_ATTR_TB_NUMBER + TB_SEARCH_ATTR_TB_NUMBER, ) // Clear the field From ffd91a96a1639d07b0f297821be10cb977e2c0cf Mon Sep 17 00:00:00 2001 From: Rohit <168576901+rohit-wa@users.noreply.github.com> Date: Wed, 1 Apr 2026 15:31:24 +0200 Subject: [PATCH 138/260] Update app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../java/org/dhis2/usescases/searchte/SearchTETest.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt index 7ae25fa0fce..29600df063f 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt @@ -217,7 +217,6 @@ class SearchTETest : BaseTest() { const val TB_SEARCH_ATTR_CITY = "City" const val TB_SEARCH_ATTR_STATE = "State" - const val TB_SEARCH_ATTR_ZIP = "Zip code" const val TB_SEARCH_ATTR_TB_NUMBER = "TB number" const val TB_SEARCH_CITY_SHORT = "C" From ef9bbafc93d6759bbff84dc55b5a69d6bda2648a Mon Sep 17 00:00:00 2001 From: Rohit <168576901+rohit-wa@users.noreply.github.com> Date: Wed, 1 Apr 2026 15:31:35 +0200 Subject: [PATCH 139/260] Update app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../java/org/dhis2/usescases/searchte/SearchTETest.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt index 29600df063f..49d02f437f3 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt @@ -222,7 +222,6 @@ class SearchTETest : BaseTest() { const val TB_SEARCH_CITY_SHORT = "C" const val TB_SEARCH_CITY = "Cit" const val TB_SEARCH_STATE = "Sta" - const val TB_SEARCH_ZIP = "40" const val TB_SEARCH_TB_NUMBER = "34567" const val TB_RESULT_DUNN = "Dunn" From e557f9ee5f73612cd6d6e88a5ecdac07ee7cf2be Mon Sep 17 00:00:00 2001 From: Rohit <168576901+rohit-wa@users.noreply.github.com> Date: Wed, 1 Apr 2026 15:31:50 +0200 Subject: [PATCH 140/260] Update app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index 574dfeac37d..70584165b6c 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -38,7 +38,6 @@ import org.dhis2.usescases.searchte.entity.DisplayListFieldsUIModel import org.hamcrest.CoreMatchers.allOf import org.hamcrest.CoreMatchers.not import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItem -import kotlin.test.assertContains fun searchTeiRobot( composeTestRule: ComposeTestRule, From fea532cde32ee05899b70627b3bca08016df0b8b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 1 Apr 2026 13:38:47 +0000 Subject: [PATCH 141/260] Fix unused imports and replace Kotlin assert with JUnit assertions Agent-Logs-Url: https://github.com/dhis2/dhis2-android-capture-app/sessions/7db320be-6b80-472f-be68-59abedc823d1 Co-authored-by: rohit-wa <168576901+rohit-wa@users.noreply.github.com> --- .../usescases/searchte/robot/SearchTeiRobot.kt | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index 70584165b6c..89d7d3e7a00 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -18,7 +18,6 @@ import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick -import androidx.compose.ui.test.performScrollTo import androidx.compose.ui.test.performTextInput import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click @@ -38,6 +37,8 @@ import org.dhis2.usescases.searchte.entity.DisplayListFieldsUIModel import org.hamcrest.CoreMatchers.allOf import org.hamcrest.CoreMatchers.not import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItem +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue fun searchTeiRobot( composeTestRule: ComposeTestRule, @@ -252,9 +253,7 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { .onAllNodesWithTag("SEARCH_PARAM_ITEM") .fetchSemanticsNodes() .size - assert(count == expectedCount) { - "Expected $expectedCount search parameters, but found $count" - } + assertEquals("Expected $expectedCount search parameters, but found $count", expectedCount, count) } @OptIn(ExperimentalTestApi::class) @@ -322,9 +321,10 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { .fetchSemanticsNodes() // Verify that we have the expected number of error messages (one per field) - assert(errorNodes.size >= fieldLabels.size) { - "Expected at least ${fieldLabels.size} error messages but found ${errorNodes.size}" - } + assertTrue( + "Expected at least ${fieldLabels.size} error messages but found ${errorNodes.size}", + errorNodes.size >= fieldLabels.size, + ) } @OptIn(ExperimentalTestApi::class) @@ -341,9 +341,7 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { val nodes = composeTestRule .onAllNodesWithTag("LIST_CARD_ITEM_TAG") .fetchSemanticsNodes() - assert(nodes.size == expectedCount) { - "Expected $expectedCount search results, but found ${nodes.size}" - } + assertEquals("Expected $expectedCount search results, but found ${nodes.size}", expectedCount, nodes.size) } @OptIn(ExperimentalTestApi::class) From 16f194f40b58d56e90b689c15d7f1961188cdae5 Mon Sep 17 00:00:00 2001 From: rohit Date: Wed, 1 Apr 2026 17:43:48 +0200 Subject: [PATCH 142/260] Add performScrollTo() to make the clear button visible --- .../org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index 89d7d3e7a00..c0ed272cc37 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -283,6 +283,10 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { @OptIn(ExperimentalTestApi::class) fun clickOnClearSearch() { + // Ensure keyboard is fully closed and UI has settled + closeKeyboard() + composeTestRule.waitForIdle() + // The reset button in InputText has the test tag "INPUT_TEXT_RESET_BUTTON" composeTestRule.waitUntilAtLeastOneExists(hasTestTag("INPUT_TEXT_RESET_BUTTON"), TIMEOUT) // Click all reset buttons to clear all fields @@ -290,7 +294,10 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { val count = resetButtons.fetchSemanticsNodes().size for (i in 0 until count) { // Always click the first one (indices shift as we clear fields) - composeTestRule.onAllNodesWithTag("INPUT_TEXT_RESET_BUTTON")[0].performClick() + // Scroll to make sure the button is visible before clicking + composeTestRule.onAllNodesWithTag("INPUT_TEXT_RESET_BUTTON")[0] + .performScrollTo() + .performClick() composeTestRule.waitForIdle() } } From 116cc516ce9a515914818fc0ff0f5e1c4b134827 Mon Sep 17 00:00:00 2001 From: Rohit <168576901+rohit-wa@users.noreply.github.com> Date: Tue, 7 Apr 2026 13:50:31 +0200 Subject: [PATCH 143/260] Update app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt index 30607aa32cf..1030501c4d5 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt @@ -160,8 +160,8 @@ fun AddNewButton( modifier = Modifier .requiredHeight(44.dp) - .testTag("ADD_NEW_BUTTON") - .then(modifier), + .then(modifier) + .testTag("ADD_NEW_BUTTON"), colors = ButtonDefaults.buttonColors( containerColor = SurfaceColor.PrimaryContainer, From 263ddd8edfd5b90e17512f25fc6a653d43363730 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 7 Apr 2026 11:56:46 +0000 Subject: [PATCH 144/260] Add missing onAllNodes import and improve per-field error validation Agent-Logs-Url: https://github.com/dhis2/dhis2-android-capture-app/sessions/c0a2b3e6-1ccf-41f3-aaea-3eb470c31d26 Co-authored-by: rohit-wa <168576901+rohit-wa@users.noreply.github.com> --- .../searchte/robot/SearchTeiRobot.kt | 39 +++++++++++-------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index c0ed272cc37..29adc353142 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -12,6 +12,7 @@ import androidx.compose.ui.test.hasParent import androidx.compose.ui.test.hasTestTag import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.ComposeTestRule +import androidx.compose.ui.test.onAllNodes import androidx.compose.ui.test.onAllNodesWithTag import androidx.compose.ui.test.onLast import androidx.compose.ui.test.onNodeWithContentDescription @@ -314,24 +315,28 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { @OptIn(ExperimentalTestApi::class) fun checkMinCharactersErrorIsDisplayed(vararg fieldLabels: String) { - // Wait for error messages to appear + // Wait for UI to settle before checking for errors composeTestRule.waitForIdle() - - // Count the number of "Enter at least" error messages - composeTestRule.waitUntilAtLeastOneExists( - hasText("Enter at least", substring = true), - TIMEOUT, - ) - - val errorNodes = composeTestRule - .onAllNodes(hasText("Enter at least", substring = true)) - .fetchSemanticsNodes() - - // Verify that we have the expected number of error messages (one per field) - assertTrue( - "Expected at least ${fieldLabels.size} error messages but found ${errorNodes.size}", - errorNodes.size >= fieldLabels.size, - ) + + fieldLabels.forEach { label -> + // Look for a container that has both the field label and its corresponding + // "Enter at least" error message as descendants. This ensures the error is + // associated with the correct field. + val containerMatcher = + hasAnyDescendant(hasText(label)) and + hasAnyDescendant(hasText("Enter at least", substring = true)) + + composeTestRule.waitUntilAtLeastOneExists(containerMatcher, TIMEOUT) + + val matchingNodes = composeTestRule + .onAllNodes(containerMatcher) + .fetchSemanticsNodes() + + assertTrue( + "Expected a min-characters error associated with field label \"$label\", but none was found.", + matchingNodes.isNotEmpty(), + ) + } } @OptIn(ExperimentalTestApi::class) From dda590c407851ad72774dad2468b118d073c3fa2 Mon Sep 17 00:00:00 2001 From: Rohit <168576901+rohit-wa@users.noreply.github.com> Date: Thu, 9 Apr 2026 16:54:17 +0200 Subject: [PATCH 145/260] Update app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index 29adc353142..d609e3a7198 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -287,7 +287,6 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { // Ensure keyboard is fully closed and UI has settled closeKeyboard() composeTestRule.waitForIdle() - // The reset button in InputText has the test tag "INPUT_TEXT_RESET_BUTTON" composeTestRule.waitUntilAtLeastOneExists(hasTestTag("INPUT_TEXT_RESET_BUTTON"), TIMEOUT) // Click all reset buttons to clear all fields From 49890e7b84be56c620eda6bff91a4ec71a90279e Mon Sep 17 00:00:00 2001 From: rohit Date: Fri, 10 Apr 2026 14:27:34 +0200 Subject: [PATCH 146/260] adding missing dependencies and edits for landscape testing --- .../java/org/dhis2/usescases/searchte/SearchTETest.kt | 8 ++++---- .../dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt index 49d02f437f3..2d6ca20f555 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt @@ -126,7 +126,8 @@ class SearchTETest : BaseTest() { waitUntilActivityVisible() // ANDROAPP-5971: Search/Add new [TET] button is visible and enabled - checkAddNewTEIButtonIsDisplayedAndEnabled() + // Commented out - not part of search flow validation + checkAddNewTEIButtonIsDisplayedAndEnabled() // Open the search parameters panel clickOnOpenSearch() @@ -146,14 +147,13 @@ class SearchTETest : BaseTest() { // [Part A] ANDROAPP-5862: Search button is now enabled checkSearchButtonIsEnabled() - clickOnClearSearch() - // Re-enter a short value (1 char) to enable the button typeOnSearchParameter(TB_SEARCH_ATTR_CITY, TB_SEARCH_CITY_SHORT) checkFocusedFieldShowsOperatorSupportingText() typeOnSearchParameter(TB_SEARCH_ATTR_STATE, TB_SEARCH_CITY_SHORT) checkFocusedFieldShowsOperatorSupportingText() typeOnSearchParameter(TB_SEARCH_ATTR_TB_NUMBER, TB_SEARCH_CITY_SHORT) + closeKeyboard() // Click Search – triggers per-field min-character validation clickOnSearch() @@ -165,7 +165,7 @@ class SearchTETest : BaseTest() { TB_SEARCH_ATTR_STATE, TB_SEARCH_ATTR_TB_NUMBER, ) - + closeKeyboard() // Clear the field clickOnClearSearch() diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt index 1030501c4d5..449bb2d83f9 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt @@ -663,7 +663,7 @@ fun CreateNewButton( ) { if (it) { ExtendedFAB( - modifier = modifier, + modifier = modifier.testTag("ADD_NEW_BUTTON"), onClick = onClick, text = stringResource(R.string.search_new_te_type, teTypeName.lowercase()), icon = icon, @@ -671,7 +671,7 @@ fun CreateNewButton( ) } else { FAB( - modifier = modifier, + modifier = modifier.testTag("ADD_NEW_BUTTON"), onClick = onClick, icon = icon, style = FABStyle.SECONDARY, From 2056e897040fbe44a00d56dd991299bca93e77d2 Mon Sep 17 00:00:00 2001 From: rohit Date: Fri, 10 Apr 2026 15:23:00 +0200 Subject: [PATCH 147/260] edit imports - remove onAllNodes and add performScrollTo --- .../java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index d609e3a7198..888cd9d2a1e 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -12,13 +12,13 @@ import androidx.compose.ui.test.hasParent import androidx.compose.ui.test.hasTestTag import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.ComposeTestRule -import androidx.compose.ui.test.onAllNodes import androidx.compose.ui.test.onAllNodesWithTag import androidx.compose.ui.test.onLast import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.performScrollTo import androidx.compose.ui.test.performTextInput import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click From d4394ee97d0b39cd898516c76b1c975c317c575a Mon Sep 17 00:00:00 2001 From: Rohit <168576901+rohit-wa@users.noreply.github.com> Date: Fri, 10 Apr 2026 15:39:55 +0200 Subject: [PATCH 148/260] Update app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../java/org/dhis2/usescases/searchte/SearchTETest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt index 2d6ca20f555..88615828c2d 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt @@ -126,8 +126,8 @@ class SearchTETest : BaseTest() { waitUntilActivityVisible() // ANDROAPP-5971: Search/Add new [TET] button is visible and enabled - // Commented out - not part of search flow validation - checkAddNewTEIButtonIsDisplayedAndEnabled() + // Verify the button is displayed and enabled before opening search + checkAddNewTEIButtonIsDisplayedAndEnabled() // Open the search parameters panel clickOnOpenSearch() From 8d2aad0d954dcb3479e84109357681c6dd01a7a3 Mon Sep 17 00:00:00 2001 From: rohit Date: Fri, 10 Apr 2026 16:19:05 +0200 Subject: [PATCH 149/260] restore working clickOnClearSearch implementation for landscape testing --- .../dhis2/usescases/searchte/SearchTETest.kt | 1 - .../searchte/robot/SearchTeiRobot.kt | 69 ++++++++++++++++--- 2 files changed, 58 insertions(+), 12 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt index 88615828c2d..fe7779c7eeb 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt @@ -148,7 +148,6 @@ class SearchTETest : BaseTest() { checkSearchButtonIsEnabled() // Re-enter a short value (1 char) to enable the button - typeOnSearchParameter(TB_SEARCH_ATTR_CITY, TB_SEARCH_CITY_SHORT) checkFocusedFieldShowsOperatorSupportingText() typeOnSearchParameter(TB_SEARCH_ATTR_STATE, TB_SEARCH_CITY_SHORT) checkFocusedFieldShowsOperatorSupportingText() diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index 888cd9d2a1e..6142de1793e 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -287,19 +287,66 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { // Ensure keyboard is fully closed and UI has settled closeKeyboard() composeTestRule.waitForIdle() - // The reset button in InputText has the test tag "INPUT_TEXT_RESET_BUTTON" - composeTestRule.waitUntilAtLeastOneExists(hasTestTag("INPUT_TEXT_RESET_BUTTON"), TIMEOUT) - // Click all reset buttons to clear all fields - val resetButtons = composeTestRule.onAllNodesWithTag("INPUT_TEXT_RESET_BUTTON") - val count = resetButtons.fetchSemanticsNodes().size - for (i in 0 until count) { - // Always click the first one (indices shift as we clear fields) - // Scroll to make sure the button is visible before clicking - composeTestRule.onAllNodesWithTag("INPUT_TEXT_RESET_BUTTON")[0] - .performScrollTo() - .performClick() + + // Additional wait to ensure UI is fully settled on slower devices + Thread.sleep(500) + + // Clear all input fields by clicking the X (reset/cancel) icons + // The X icons are IconButtons with Cancel icon that appear when fields have text + // After clicking each button, the keyboard may reappear, hiding other buttons + + var attempts = 0 + val maxAttempts = 10 // Should be enough for 3 fields + + while (attempts < maxAttempts) { + attempts++ + + // Close keyboard and wait before looking for buttons + closeKeyboard() composeTestRule.waitForIdle() + + try { + // Find all Icon Buttons with content description "Icon Button" + // These are the X/Cancel buttons in the input fields + val iconButtons = composeTestRule.onAllNodes( + hasContentDescription("Icon Button"), + useUnmergedTree = true + ) + + val buttonCount = iconButtons.fetchSemanticsNodes().size + println("DEBUG: clickOnClearSearch - buttonCount = $buttonCount, attempt = $attempts") + + if (buttonCount == 0) { + // No more reset buttons, all fields cleared + break + } + + // Click the first visible clear button + try { + iconButtons[0].performScrollTo() + composeTestRule.waitForIdle() + } catch (e: Exception) { + println("DEBUG: performScrollTo failed: ${e.message}") + } + + iconButtons[0].performClick() + composeTestRule.waitForIdle() + + // After clicking, keyboard may reappear, close it again + closeKeyboard() + composeTestRule.waitForIdle() + + } catch (e: Exception) { + // No more buttons to click + println("DEBUG: Exception in clickOnClearSearch loop: ${e.message}") + break + } } + + // After clearing all fields, ensure keyboard is closed + // This is critical because clicking X buttons might have opened the keyboard + closeKeyboard() + composeTestRule.waitForIdle() } @OptIn(ExperimentalTestApi::class) From 57f61a070f7b4ab2712dbb81686befe2e43b0a16 Mon Sep 17 00:00:00 2001 From: rohit Date: Mon, 13 Apr 2026 17:39:03 +0200 Subject: [PATCH 150/260] updated navigation between inputfields --- .../dhis2/usescases/searchte/SearchTETest.kt | 7 +++-- .../searchte/robot/SearchTeiRobot.kt | 28 +++---------------- 2 files changed, 8 insertions(+), 27 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt index fe7779c7eeb..8aa6c6271d7 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt @@ -152,7 +152,6 @@ class SearchTETest : BaseTest() { typeOnSearchParameter(TB_SEARCH_ATTR_STATE, TB_SEARCH_CITY_SHORT) checkFocusedFieldShowsOperatorSupportingText() typeOnSearchParameter(TB_SEARCH_ATTR_TB_NUMBER, TB_SEARCH_CITY_SHORT) - closeKeyboard() // Click Search – triggers per-field min-character validation clickOnSearch() @@ -164,13 +163,14 @@ class SearchTETest : BaseTest() { TB_SEARCH_ATTR_STATE, TB_SEARCH_ATTR_TB_NUMBER, ) - closeKeyboard() - // Clear the field clickOnClearSearch() // Update to valid search values and search again + openNextSearchParameter(TB_SEARCH_ATTR_CITY) typeOnSearchParameter(TB_SEARCH_ATTR_CITY, TB_SEARCH_CITY) + openNextSearchParameter(TB_SEARCH_ATTR_STATE) typeOnSearchParameter(TB_SEARCH_ATTR_STATE, TB_SEARCH_STATE) + openNextSearchParameter(TB_SEARCH_ATTR_TB_NUMBER) typeOnSearchParameter(TB_SEARCH_ATTR_TB_NUMBER, TB_SEARCH_TB_NUMBER) // Click Search with valid values @@ -179,6 +179,7 @@ class SearchTETest : BaseTest() { // Verify results: Lynn Dunn and Inés Bebea are displayed checkSearchResultDisplayed(TB_RESULT_DUNN) checkSearchResultDisplayed(TB_RESULT_BEBEA) + } } diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index 6142de1793e..b3283bc9eab 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -92,7 +92,6 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { fun clickOnSearch() { closeKeyboard() composeTestRule.onNodeWithTag("SEARCH_BUTTON").performClick() - composeTestRule.waitForIdle() } @OptIn(ExperimentalTestApi::class) @@ -226,19 +225,6 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { .assertIsEnabled() } - @OptIn(ExperimentalTestApi::class) - fun checkFirstSearchParamIsBarcodeOrQR() { - composeTestRule.waitUntilAtLeastOneExists(hasTestTag("SEARCH_PARAM_ITEM"), TIMEOUT) - composeTestRule - .onAllNodesWithTag("SEARCH_PARAM_ITEM")[0] - .assert( - hasAnyDescendant( - hasContentDescription("QR Code Icon") or - hasContentDescription("Barcode Icon"), - ), - ) - } - @OptIn(ExperimentalTestApi::class) fun checkFirstSearchParamIsBarcodeOrQROrUnique(expectedLabel: String) { composeTestRule.waitUntilAtLeastOneExists(hasTestTag("SEARCH_PARAM_ITEM"), TIMEOUT) @@ -286,8 +272,7 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { fun clickOnClearSearch() { // Ensure keyboard is fully closed and UI has settled closeKeyboard() - composeTestRule.waitForIdle() - + // Additional wait to ensure UI is fully settled on slower devices Thread.sleep(500) @@ -303,8 +288,7 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { // Close keyboard and wait before looking for buttons closeKeyboard() - composeTestRule.waitForIdle() - + try { // Find all Icon Buttons with content description "Icon Button" // These are the X/Cancel buttons in the input fields @@ -324,18 +308,15 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { // Click the first visible clear button try { iconButtons[0].performScrollTo() - composeTestRule.waitForIdle() } catch (e: Exception) { println("DEBUG: performScrollTo failed: ${e.message}") } iconButtons[0].performClick() - composeTestRule.waitForIdle() - + // After clicking, keyboard may reappear, close it again closeKeyboard() - composeTestRule.waitForIdle() - + } catch (e: Exception) { // No more buttons to click println("DEBUG: Exception in clickOnClearSearch loop: ${e.message}") @@ -346,7 +327,6 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { // After clearing all fields, ensure keyboard is closed // This is critical because clicking X buttons might have opened the keyboard closeKeyboard() - composeTestRule.waitForIdle() } @OptIn(ExperimentalTestApi::class) From 9221b2bd074b28d48f50c0f1b5eb7d5f22e8a6dc Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Tue, 14 Apr 2026 14:32:38 +0200 Subject: [PATCH 151/260] fix(translations): sync translations from transifex (develop) (#4796) * fix(translations): sync translations from transifex (develop) WARNING: This automated sync from transifex removed more lines than it added. Please check carefully before merging! * fix(translations): remove KMP-incompatible escaped question marks [skip ci] --------- Co-authored-by: github-actions[bot] --- app/src/main/res/values-cs/strings.xml | 1 - app/src/main/res/values-zh/strings.xml | 1 - 2 files changed, 2 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 5cc1d3598dc..425476efe9c 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -606,7 +606,6 @@ Dokončeno %s Deaktivovat %s Znovu otevřít %s - %s chyba %s chyby diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 11b458b2e71..342342dea9d 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -606,7 +606,6 @@ 完整%s 停用%s 重新打开%s - %s 错误 From 485d9b250c0b4dedfc66d1bec8aca82ad4aa3c22 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 15:38:25 +0200 Subject: [PATCH 152/260] deps: bump org.hisp.dhis.lib.expression:expression-parser-jvm from 1.4.0 to 1.4.1 in the gradle-updates group across 1 directory (#4791) * deps: bump org.hisp.dhis.lib.expression:expression-parser-jvm Bumps the gradle-updates group with 1 update: [org.hisp.dhis.lib.expression:expression-parser-jvm](https://github.com/dhis2/expression-parser). Updates `org.hisp.dhis.lib.expression:expression-parser-jvm` from 1.4.0 to 1.4.1 - [Release notes](https://github.com/dhis2/expression-parser/releases) - [Commits](https://github.com/dhis2/expression-parser/compare/v1.4.0...v1.4.1) --- updated-dependencies: - dependency-name: org.hisp.dhis.lib.expression:expression-parser-jvm dependency-version: 1.4.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates ... Signed-off-by: dependabot[bot] * chore: update dependency verification metadata --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: @dhis2-bot --- gradle/libs.versions.toml | 2 +- gradle/verification-metadata.xml | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c83a1e59a7b..6ed427c5126 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -13,7 +13,7 @@ jacoco = '0.8.14' designSystem = "0.7.1-SNAPSHOT" dhis2sdk = "1.14.1-SNAPSHOT" ruleEngine = "3.7.2" -expressionParser = "1.4.0" +expressionParser = "1.4.1" appcompat = "1.7.1" annotation = "1.9.1" cardview = "1.0.0" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 1bff7d755d7..0af10f3aad1 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -3821,6 +3821,11 @@ + + + + + From d4c1af5352a878d8cc25b18999029bd3c202afcf Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Tue, 14 Apr 2026 14:32:38 +0200 Subject: [PATCH 153/260] fix(translations): sync translations from transifex (develop) (#4796) * fix(translations): sync translations from transifex (develop) WARNING: This automated sync from transifex removed more lines than it added. Please check carefully before merging! * fix(translations): remove KMP-incompatible escaped question marks [skip ci] --------- Co-authored-by: github-actions[bot] --- app/src/main/res/values-cs/strings.xml | 1 - app/src/main/res/values-zh/strings.xml | 1 - 2 files changed, 2 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 5cc1d3598dc..425476efe9c 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -606,7 +606,6 @@ Dokončeno %s Deaktivovat %s Znovu otevřít %s - %s chyba %s chyby diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 11b458b2e71..342342dea9d 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -606,7 +606,6 @@ 完整%s 停用%s 重新打开%s - %s 错误 From 59f08217efc197b087d34fb9fc741544af808151 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 15:38:25 +0200 Subject: [PATCH 154/260] deps: bump org.hisp.dhis.lib.expression:expression-parser-jvm from 1.4.0 to 1.4.1 in the gradle-updates group across 1 directory (#4791) * deps: bump org.hisp.dhis.lib.expression:expression-parser-jvm Bumps the gradle-updates group with 1 update: [org.hisp.dhis.lib.expression:expression-parser-jvm](https://github.com/dhis2/expression-parser). Updates `org.hisp.dhis.lib.expression:expression-parser-jvm` from 1.4.0 to 1.4.1 - [Release notes](https://github.com/dhis2/expression-parser/releases) - [Commits](https://github.com/dhis2/expression-parser/compare/v1.4.0...v1.4.1) --- updated-dependencies: - dependency-name: org.hisp.dhis.lib.expression:expression-parser-jvm dependency-version: 1.4.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gradle-updates ... Signed-off-by: dependabot[bot] * chore: update dependency verification metadata --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: @dhis2-bot --- gradle/libs.versions.toml | 2 +- gradle/verification-metadata.xml | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c83a1e59a7b..6ed427c5126 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -13,7 +13,7 @@ jacoco = '0.8.14' designSystem = "0.7.1-SNAPSHOT" dhis2sdk = "1.14.1-SNAPSHOT" ruleEngine = "3.7.2" -expressionParser = "1.4.0" +expressionParser = "1.4.1" appcompat = "1.7.1" annotation = "1.9.1" cardview = "1.0.0" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 1bff7d755d7..0af10f3aad1 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -3821,6 +3821,11 @@ + + + + + From 66cc62f66f88d67aec2c16fe7d33f9ff80375cfb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 08:46:02 +0000 Subject: [PATCH 155/260] Initial plan From 9951df1d368a02f8edb319ee2b6b8dc9dc9664d3 Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Fri, 27 Mar 2026 11:01:24 +0100 Subject: [PATCH 156/260] fix(translations): sync translations from transifex (develop) (#4771) * fix(translations): sync translations from transifex (develop) * fix(translations): remove unnecessary question mark escapes --------- Co-authored-by: andresmr From c5f9ad367645b61e60677cb0764b818fff281600 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 08:46:02 +0000 Subject: [PATCH 157/260] Initial plan From 9554ea26a3fcb2f86a96967141e97ce2f1ecccb4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 08:46:02 +0000 Subject: [PATCH 158/260] Initial plan From 4764950ebb9f60f42bbac8edee87adf133970272 Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Fri, 27 Mar 2026 11:01:24 +0100 Subject: [PATCH 159/260] fix(translations): sync translations from transifex (develop) (#4771) * fix(translations): sync translations from transifex (develop) * fix(translations): remove unnecessary question mark escapes --------- Co-authored-by: andresmr From 7f7d7724c8b87b6d27545191be8e8679332a0b62 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 08:46:02 +0000 Subject: [PATCH 160/260] Initial plan From d62d52d468525d3117ce618b0fb2b9e81b00dbf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Tue, 14 Apr 2026 17:36:24 +0200 Subject: [PATCH 161/260] test: improve synchronization in `NoteRobot` and `TeiDashboardRobot` (#4797) * test: improve synchronization in `NoteRobot` and `TeiDashboardRobot` - Add `waitMillis` timeout to note visibility checks in `NoteRobot`. - Replace `waitToDebounce` with `waitForView` for the add note button in `TeiDashboardRobot`. * fix: close soft keyboard before clicking clear button in NoteRobot --- .../org/dhis2/usescases/teidashboard/robot/NoteRobot.kt | 9 ++++++--- .../usescases/teidashboard/robot/TeiDashboardRobot.kt | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt index ed7f3e92a96..e49f454bf41 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt @@ -2,6 +2,7 @@ package org.dhis2.usescases.teidashboard.robot import androidx.test.espresso.action.TypeTextAction import androidx.test.espresso.action.ViewActions.click +import androidx.test.espresso.action.ViewActions.closeSoftKeyboard import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.intent.Intents import androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent @@ -81,7 +82,7 @@ class NoteRobot : BaseRobot() { fun clickOnClearButton() { waitForView(withText(R.string.clear)) .check(matches(allOf(isDisplayed(), isEnabled()))) - .perform(click()) + .perform(closeSoftKeyboard(), click()) } fun checkNoteDetails(user: String, noteText: String) { @@ -92,7 +93,8 @@ class NoteRobot : BaseRobot() { withId(R.id.storeBy), withEffectiveVisibility(Visibility.VISIBLE), withText(user) - ) + ), + waitMillis = NOTES_WAIT_TIMEOUT_MS, ) .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) waitForView( @@ -100,7 +102,8 @@ class NoteRobot : BaseRobot() { withId(R.id.note_text), withEffectiveVisibility(Visibility.VISIBLE), withText(noteText) - ) + ), + waitMillis = NOTES_WAIT_TIMEOUT_MS, ) .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) } diff --git a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/TeiDashboardRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/TeiDashboardRobot.kt index d43cf6a216f..4b529449d65 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/TeiDashboardRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/TeiDashboardRobot.kt @@ -58,7 +58,7 @@ class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { R.string.navigation_notes ) ).performClick() - waitToDebounce(500) + waitForView(withId(R.id.addNoteButton)) } fun goToRelationships() { From 6e2bce9cac81f8e4efcbe544771c6ee14a0e057f Mon Sep 17 00:00:00 2001 From: rohit Date: Tue, 14 Apr 2026 17:49:51 +0200 Subject: [PATCH 162/260] adding step to close keyboard to make the test less flaky --- .../java/org/dhis2/usescases/searchte/SearchTETest.kt | 4 +++- .../java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt index 8aa6c6271d7..69f60ec2388 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt @@ -164,13 +164,15 @@ class SearchTETest : BaseTest() { TB_SEARCH_ATTR_TB_NUMBER, ) clickOnClearSearch() + closeKeyboard() // Update to valid search values and search again openNextSearchParameter(TB_SEARCH_ATTR_CITY) typeOnSearchParameter(TB_SEARCH_ATTR_CITY, TB_SEARCH_CITY) + closeKeyboard() openNextSearchParameter(TB_SEARCH_ATTR_STATE) typeOnSearchParameter(TB_SEARCH_ATTR_STATE, TB_SEARCH_STATE) - openNextSearchParameter(TB_SEARCH_ATTR_TB_NUMBER) + closeKeyboard() typeOnSearchParameter(TB_SEARCH_ATTR_TB_NUMBER, TB_SEARCH_TB_NUMBER) // Click Search with valid values diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index b3283bc9eab..03167649427 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -265,7 +265,6 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { composeTestRule.onAllNodesWithTag("INPUT_TEXT_FIELD").onLast().performTextInput(value) // Close keyboard after typing to reveal fields that might be hidden behind it closeKeyboard() - composeTestRule.waitForIdle() } @OptIn(ExperimentalTestApi::class) From c59c73e7a61a17683136aa51f2dd4d7a5f2fa22f Mon Sep 17 00:00:00 2001 From: andresmr Date: Wed, 15 Apr 2026 14:42:04 +0200 Subject: [PATCH 163/260] test: Wait closeKeyboard animation before continue --- .../searchte/robot/SearchTeiRobot.kt | 68 ++++++------------- 1 file changed, 22 insertions(+), 46 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index 03167649427..9d1ebb9f8f0 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -89,8 +89,11 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { } } + @OptIn(ExperimentalTestApi::class) fun clickOnSearch() { closeKeyboard() + composeTestRule.waitForIdle() + composeTestRule.waitUntilAtLeastOneExists(hasTestTag("SEARCH_BUTTON"), TIMEOUT) composeTestRule.onNodeWithTag("SEARCH_BUTTON").performClick() } @@ -269,62 +272,35 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { @OptIn(ExperimentalTestApi::class) fun clickOnClearSearch() { - // Ensure keyboard is fully closed and UI has settled closeKeyboard() + composeTestRule.waitForIdle() - // Additional wait to ensure UI is fully settled on slower devices - Thread.sleep(500) - - // Clear all input fields by clicking the X (reset/cancel) icons - // The X icons are IconButtons with Cancel icon that appear when fields have text - // After clicking each button, the keyboard may reappear, hiding other buttons - var attempts = 0 - val maxAttempts = 10 // Should be enough for 3 fields - + val maxAttempts = 10 + while (attempts < maxAttempts) { attempts++ - - // Close keyboard and wait before looking for buttons closeKeyboard() + composeTestRule.waitForIdle() + + val iconButtons = composeTestRule.onAllNodes( + hasContentDescription("Icon Button"), + useUnmergedTree = true, + ) + + if (iconButtons.fetchSemanticsNodes().isEmpty()) break try { - // Find all Icon Buttons with content description "Icon Button" - // These are the X/Cancel buttons in the input fields - val iconButtons = composeTestRule.onAllNodes( - hasContentDescription("Icon Button"), - useUnmergedTree = true - ) - - val buttonCount = iconButtons.fetchSemanticsNodes().size - println("DEBUG: clickOnClearSearch - buttonCount = $buttonCount, attempt = $attempts") - - if (buttonCount == 0) { - // No more reset buttons, all fields cleared - break - } - - // Click the first visible clear button - try { - iconButtons[0].performScrollTo() - } catch (e: Exception) { - println("DEBUG: performScrollTo failed: ${e.message}") - } - - iconButtons[0].performClick() - - // After clicking, keyboard may reappear, close it again - closeKeyboard() - - } catch (e: Exception) { - // No more buttons to click - println("DEBUG: Exception in clickOnClearSearch loop: ${e.message}") - break + iconButtons[0].performScrollTo() + } catch (_: Exception) { + // Scroll not needed or not applicable } + + iconButtons[0].performClick() + closeKeyboard() + composeTestRule.waitForIdle() } - - // After clearing all fields, ensure keyboard is closed - // This is critical because clicking X buttons might have opened the keyboard + closeKeyboard() } From b69b8595466a7d384cdca6034eef21809c6db8b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Thu, 16 Apr 2026 14:31:32 +0200 Subject: [PATCH 164/260] doc: update AGENTS.md and SKILL.md reducing duplications (#4801) --- .claude/skills/android-testing/SKILL.md | 23 ++++++++-- AGENTS.md | 57 +++---------------------- 2 files changed, 24 insertions(+), 56 deletions(-) diff --git a/.claude/skills/android-testing/SKILL.md b/.claude/skills/android-testing/SKILL.md index 04fd703ca63..cef45a987f1 100644 --- a/.claude/skills/android-testing/SKILL.md +++ b/.claude/skills/android-testing/SKILL.md @@ -22,16 +22,25 @@ description: > ## Run Commands ```bash -# All unit tests +# Shortcut: lint + all unit tests (mirrors CI) +./run_tests.sh + +# All unit tests (legacy + KMP host + KMP debug) ./gradlew testDebugUnitTest testDhis2DebugUnitTest testAndroidHostTest -# Single KMP module test class (commonTest source set) +# Desktop targets in KMP modules +./gradlew desktopTest + +# Single KMP module test class (commonTest + androidUnitTest source sets) ./gradlew :login:testAndroidHostTest --tests "org.dhis2.mobile.login.main.ui.viewmodel.LoginViewModelTest" +# Single KMP module test class (androidUnitTest source set only) +./gradlew :login:testAndroidDebugUnitTest --tests "org.dhis2.mobile.login.main.ui.viewmodel.LoginViewModelTest" + # Single legacy Android module test class ./gradlew :form:testDebugUnitTest --tests "org.dhis2.form.ui.FormViewModelTest" -# Single test method (commonTest source set) +# Single test method (commonTest + androidUnitTest source sets) ./gradlew :login:testAndroidHostTest --tests "org.dhis2.mobile.login.main.ui.viewmodel.LoginViewModelTest.initial screen is set correctly when starting" ``` @@ -145,7 +154,10 @@ class ExampleRepositoryTest { ## UI Tests: Robot Pattern -All UI tests go in `androidInstrumentedTest/`. Always use the Robot pattern. +All UI tests go in `androidInstrumentedTest/`. Always use the Robot pattern. Tests extend +`BaseTest`, which provides `mockWebServerRobot` — a helper that stubs HTTP responses from the +DHIS2 server so tests run fully offline against a local `MockWebServer`. Register stubs +**before** launching the robot body. ```kotlin fun exampleRobot(rule: ComposeTestRule, body: ExampleRobot.() -> Unit) = @@ -169,12 +181,15 @@ class ExampleTest : BaseTest() { @Test fun shouldPerformSuccessfulAction() { + // Stub the network response before any UI interaction mockWebServerRobot.addResponse(GET, "/api/endpoint", MOCK_RESPONSE, 200) exampleRobot(rule) { typeUsername("user") clickSubmitButton() verifySuccessMessageDisplayed() } + // Call cleanDatabase() after any test that writes to the local DB — + // it clears all DHIS2 SDK tables so state doesn't leak into the next test. cleanDatabase() } } diff --git a/AGENTS.md b/AGENTS.md index 97ace46c9e7..104fec32f4c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -174,59 +174,12 @@ val featureModule = module { ## Testing -### Mocking library -- **KMP modules** (`commonTest`): `mockito-kotlin` (`org.mockito.kotlin.mock`, `whenever`, `verify`) -- **Legacy Android modules**: `mockito-kotlin` or `mockito-core` -- Turbine (`app.cash.turbine`) for Flow assertions; `kotlinx-coroutines-test` for coroutine testing +- **Unit tests**: `mockito-kotlin` + `kotlin.test` in `commonTest`; `mockito-kotlin` + JUnit in `androidUnitTest` and legacy modules +- **Flow assertions**: Turbine (`app.cash.turbine`) + `kotlinx-coroutines-test` +- **UI tests**: Compose Testing + Espresso, Robot pattern, located in `androidInstrumentedTest/` +- **ViewModel coroutines**: always use `launchUseCase { }` — it wraps `CoroutineTracker` which integrates with Espresso's `IdlingResource`; never use `Thread.sleep()` -### Running a single test -```bash -# KMP module (commonTest source set) -./gradlew :login:testAndroidHostTest --tests "fully.qualified.ClassName.method name" - -# KMP module (androidUnitTest source set) -./gradlew :login:testAndroidDebugUnitTest --tests "fully.qualified.ClassName.method name" - -# Legacy Android module -./gradlew :form:testDebugUnitTest --tests "org.dhis2.form.ui.FormViewModelTest" -``` - -### Unit test structure (KMP commonTest) -```kotlin -class MyUseCaseTest { - private val repository: MyRepository = mock() - private val useCase = MyUseCase(repository) - - @Test - fun `should return success when data is valid`() = runTest { - whenever(repository.getData()).thenReturn(listOf(item)) - val result = useCase() - assertTrue(result.isSuccess) - } -} -``` - -### UI / instrumented tests (Robot pattern) -- Location: `androidInstrumentedTest/` or `androidTest/` -- Extend `BaseTest`; use `MockWebServerRobot` for API mocking -- **Never use `Thread.sleep()` or hard-coded delays** — `launchUseCase` + `CoroutineTracker` - integrates with Espresso `IdlingResource` automatically -- Tag UI components with `Modifier.testTag(CONSTANT)` using format `{SCREEN}_{COMPONENT}_TAG` -- For DHIS2 composite inputs: click wrapper tag first, then find inner `"INPUT_TEXT_FIELD"` node, - use `performTextInput()` (not `performTextReplacement()`) - -```kotlin -fun loginRobot(rule: ComposeTestRule, body: LoginRobot.() -> Unit) = - LoginRobot(rule).apply { body() } - -class LoginRobot(val rule: ComposeTestRule) : BaseRobot() { - fun typeServer(url: String) { - rule.waitUntilExactlyOneExists(hasTestTag(SERVER_INPUT_TAG), TIMEOUT) - rule.onNodeWithTag(SERVER_INPUT_TAG).performClick() - rule.onAllNodesWithTag("INPUT_TEXT_FIELD")[0].performTextInput(url) - } -} -``` +For patterns, examples, and common mistakes load the **android-testing** skill. --- From 55ece22995f309c9f4014d9c914ef2158831b0b1 Mon Sep 17 00:00:00 2001 From: Ferdy Rodriguez Date: Fri, 17 Apr 2026 14:26:22 +0200 Subject: [PATCH 165/260] refactor: [ANDROAPP-7527] change granular sync's state from RxJava to coroutines [skip size] (#4762) --- .../utils/granularsync/GranularSyncModule.kt | 8 + .../utils/granularsync/GranularSyncModule.kt | 6 + .../utils/granularsync/GranularSyncModule.kt | 6 + .../granularsync/GranularSyncPresenter.kt | 31 +- .../GranularSyncViewModelFactory.kt | 4 + .../utils/granularsync/SyncStatusDialog.kt | 6 +- .../utils/granularsync/SyncStatusItem.kt | 59 +++ .../{ => data}/GranularSyncRepository.kt | 368 ++++++------------ .../domain/MissingSyncTargetException.kt | 5 + .../utils/granularsync/domain/SyncStatus.kt | 12 + .../granularsync/domain/SyncStatusData.kt | 11 + .../granularsync/{ => ui}/SyncUiState.kt | 9 +- .../granularsync/ui/SyncUiStateMapper.kt | 160 ++++++++ .../data/forms/dataentry/ValueStoreTest.kt | 2 + .../DataSetDetailViewModelTest.kt | 7 + .../datasetlist/DataSetListViewModelTest.kt | 7 + .../teiDashboard/DashboardViewModelTest.kt | 7 + .../scheduling/SchedulingViewModelTest.kt | 73 ++-- .../granularsync/GranularSyncPresenterTest.kt | 124 +++++- .../GranularSyncRepositoryTest.kt | 124 ++++++ .../dhis2/commons/bindings/SdkExtensions.kt | 58 --- 21 files changed, 708 insertions(+), 379 deletions(-) rename app/src/main/java/org/dhis2/utils/granularsync/{ => data}/GranularSyncRepository.kt (79%) create mode 100644 app/src/main/java/org/dhis2/utils/granularsync/domain/MissingSyncTargetException.kt create mode 100644 app/src/main/java/org/dhis2/utils/granularsync/domain/SyncStatus.kt create mode 100644 app/src/main/java/org/dhis2/utils/granularsync/domain/SyncStatusData.kt rename app/src/main/java/org/dhis2/utils/granularsync/{ => ui}/SyncUiState.kt (64%) create mode 100644 app/src/main/java/org/dhis2/utils/granularsync/ui/SyncUiStateMapper.kt create mode 100644 app/src/test/java/org/dhis2/utils/granularsync/GranularSyncRepositoryTest.kt diff --git a/app/src/dhis2/java/org/dhis2/utils/granularsync/GranularSyncModule.kt b/app/src/dhis2/java/org/dhis2/utils/granularsync/GranularSyncModule.kt index 104cdc50a17..12ed81557f2 100644 --- a/app/src/dhis2/java/org/dhis2/utils/granularsync/GranularSyncModule.kt +++ b/app/src/dhis2/java/org/dhis2/utils/granularsync/GranularSyncModule.kt @@ -13,6 +13,8 @@ import org.dhis2.commons.sync.SyncContext import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.dhislogic.DhisProgramUtils import org.dhis2.data.service.workManager.WorkManagerController +import org.dhis2.utils.granularsync.data.GranularSyncRepository +import org.dhis2.utils.granularsync.ui.SyncUiStateMapper import org.hisp.dhis.android.core.D2 @Module @@ -21,6 +23,10 @@ class GranularSyncModule( private val view: GranularSyncContracts.View, private val syncContext: SyncContext, ) { + @Provides + fun provideSyncUiStateMapper(resourceManager: ResourceManager): SyncUiStateMapper = + SyncUiStateMapper(syncContext, resourceManager) + @Provides fun providesViewModelFactory( d2: D2, @@ -28,6 +34,7 @@ class GranularSyncModule( workManagerController: WorkManagerController, smsSyncProvider: SMSSyncProvider, repository: GranularSyncRepository, + mapper: SyncUiStateMapper, ): GranularSyncViewModelFactory = GranularSyncViewModelFactory( d2, @@ -38,6 +45,7 @@ class GranularSyncModule( syncContext, workManagerController, smsSyncProvider, + mapper, ) @Provides diff --git a/app/src/dhis2PlayServices/java/org/dhis2/utils/granularsync/GranularSyncModule.kt b/app/src/dhis2PlayServices/java/org/dhis2/utils/granularsync/GranularSyncModule.kt index ab5d88c7950..0dc5904cd6d 100644 --- a/app/src/dhis2PlayServices/java/org/dhis2/utils/granularsync/GranularSyncModule.kt +++ b/app/src/dhis2PlayServices/java/org/dhis2/utils/granularsync/GranularSyncModule.kt @@ -46,6 +46,10 @@ class GranularSyncModule( private val view: GranularSyncContracts.View, private val syncContext: SyncContext, ) { + @Provides + fun provideSyncUiStateMapper(resourceManager: ResourceManager): SyncUiStateMapper = + SyncUiStateMapper(syncContext, resourceManager) + @Provides fun providesViewModelFactory( d2: D2, @@ -53,6 +57,7 @@ class GranularSyncModule( workManagerController: WorkManagerController, smsSyncProvider: SMSSyncProvider, repository: GranularSyncRepository, + mapper: SyncUiStateMapper, ): GranularSyncViewModelFactory = GranularSyncViewModelFactory( d2, @@ -69,6 +74,7 @@ class GranularSyncModule( syncContext, workManagerController, smsSyncProvider, + mapper, ) @Provides diff --git a/app/src/dhis2Training/java/org/dhis2/utils/granularsync/GranularSyncModule.kt b/app/src/dhis2Training/java/org/dhis2/utils/granularsync/GranularSyncModule.kt index 104cdc50a17..d23e72d0366 100644 --- a/app/src/dhis2Training/java/org/dhis2/utils/granularsync/GranularSyncModule.kt +++ b/app/src/dhis2Training/java/org/dhis2/utils/granularsync/GranularSyncModule.kt @@ -21,6 +21,10 @@ class GranularSyncModule( private val view: GranularSyncContracts.View, private val syncContext: SyncContext, ) { + @Provides + fun provideSyncUiStateMapper(resourceManager: ResourceManager): SyncUiStateMapper = + SyncUiStateMapper(syncContext, resourceManager) + @Provides fun providesViewModelFactory( d2: D2, @@ -28,6 +32,7 @@ class GranularSyncModule( workManagerController: WorkManagerController, smsSyncProvider: SMSSyncProvider, repository: GranularSyncRepository, + mapper: SyncUiStateMapper, ): GranularSyncViewModelFactory = GranularSyncViewModelFactory( d2, @@ -38,6 +43,7 @@ class GranularSyncModule( syncContext, workManagerController, smsSyncProvider, + mapper, ) @Provides diff --git a/app/src/main/java/org/dhis2/utils/granularsync/GranularSyncPresenter.kt b/app/src/main/java/org/dhis2/utils/granularsync/GranularSyncPresenter.kt index cadabacca57..08d89be2a89 100644 --- a/app/src/main/java/org/dhis2/utils/granularsync/GranularSyncPresenter.kt +++ b/app/src/main/java/org/dhis2/utils/granularsync/GranularSyncPresenter.kt @@ -34,7 +34,6 @@ import androidx.work.Data import androidx.work.ExistingWorkPolicy import androidx.work.WorkInfo import io.reactivex.disposables.CompositeDisposable -import kotlinx.coroutines.async import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.update @@ -61,6 +60,11 @@ import org.dhis2.data.service.workManager.WorkerItem import org.dhis2.data.service.workManager.WorkerType import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.usescases.sms.SmsSendingService +import org.dhis2.utils.granularsync.data.GranularSyncRepository +import org.dhis2.utils.granularsync.domain.MissingSyncTargetException +import org.dhis2.utils.granularsync.domain.SyncStatus +import org.dhis2.utils.granularsync.ui.SyncUiState +import org.dhis2.utils.granularsync.ui.SyncUiStateMapper import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.common.State import org.koin.core.component.KoinComponent @@ -76,6 +80,7 @@ class GranularSyncPresenter( private val syncContext: SyncContext, private val workManagerController: WorkManagerController, private val smsSyncProvider: SMSSyncProvider, + private val mapper: SyncUiStateMapper, ) : ViewModel(), KoinComponent { private val workerName: String @@ -97,14 +102,18 @@ class GranularSyncPresenter( private fun loadSyncInfo(forcedState: State? = null) { viewModelScope.launch(dispatcher.io()) { - val syncState = - async { - repository.getUiState(forcedState) - }.await() - val dismissOnUpdate = refreshing && syncState.syncState == State.SYNCED - refreshing = false - _currentState.update { - syncState.copy(shouldDismissOnUpdate = dismissOnUpdate) + try { + val syncStatusData = repository.getSyncStatus(forcedState) + val dismissOnUpdate = refreshing && syncStatusData.syncState == SyncStatus.SYNCED + refreshing = false + _currentState.update { + mapper.toUiState(syncStatusData, dismissOnUpdate) + } + } catch (e: MissingSyncTargetException) { + refreshing = false + _currentState.update { + mapper.missingTargetUiState(e.recordUid) + } } } } @@ -398,7 +407,7 @@ class GranularSyncPresenter( restartSmsSender() } - private suspend fun getDataSetCatOptCombos(): List { + private fun getDataSetCatOptCombos(): List { val dataSet = d2 .dataSetModule() @@ -460,7 +469,7 @@ class GranularSyncPresenter( try { repository.checkServerAvailability() _serverAvailability.value = true - } catch (error: RuntimeException) { + } catch (_: RuntimeException) { _serverAvailability.value = false } } diff --git a/app/src/main/java/org/dhis2/utils/granularsync/GranularSyncViewModelFactory.kt b/app/src/main/java/org/dhis2/utils/granularsync/GranularSyncViewModelFactory.kt index 643bffcb0ac..981a8803f0d 100644 --- a/app/src/main/java/org/dhis2/utils/granularsync/GranularSyncViewModelFactory.kt +++ b/app/src/main/java/org/dhis2/utils/granularsync/GranularSyncViewModelFactory.kt @@ -6,6 +6,8 @@ import org.dhis2.commons.schedulers.SchedulerProvider import org.dhis2.commons.sync.SyncContext import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.service.workManager.WorkManagerController +import org.dhis2.utils.granularsync.data.GranularSyncRepository +import org.dhis2.utils.granularsync.ui.SyncUiStateMapper import org.hisp.dhis.android.core.D2 class GranularSyncViewModelFactory( @@ -17,6 +19,7 @@ class GranularSyncViewModelFactory( private val syncContext: SyncContext, private val workManagerController: WorkManagerController, private val smsSyncProvider: SMSSyncProvider, + private val mapper: SyncUiStateMapper, ) : ViewModelProvider.Factory { override fun create(modelClass: Class): T = GranularSyncPresenter( @@ -28,5 +31,6 @@ class GranularSyncViewModelFactory( syncContext, workManagerController, smsSyncProvider, + mapper, ) as T } diff --git a/app/src/main/java/org/dhis2/utils/granularsync/SyncStatusDialog.kt b/app/src/main/java/org/dhis2/utils/granularsync/SyncStatusDialog.kt index ea90a4b0dd3..6d9cdfcfefa 100644 --- a/app/src/main/java/org/dhis2/utils/granularsync/SyncStatusDialog.kt +++ b/app/src/main/java/org/dhis2/utils/granularsync/SyncStatusDialog.kt @@ -41,7 +41,7 @@ import org.dhis2.commons.ui.icons.SyncStateIcon import org.dhis2.usescases.sms.SmsSendingService import org.dhis2.utils.analytics.AnalyticsHelper import org.dhis2.utils.customviews.MessageAmountDialog -import org.hisp.dhis.android.core.common.State +import org.dhis2.utils.granularsync.domain.SyncStatus import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme import javax.inject.Inject @@ -113,7 +113,7 @@ class SyncStatusDialog : syncState?.let { syncUiState -> when { syncUiState.shouldDismissOnUpdate -> dismiss() - syncing && syncUiState.syncState == State.SYNCED -> { + syncing && syncUiState.syncState == SyncStatus.SYNCED -> { dismiss() Toast .makeText( @@ -149,7 +149,7 @@ class SyncStatusDialog : dismiss() }, icon = { - SyncStateIcon(state = syncUiState.syncState) + SyncUiStatusIcon(status = syncUiState.syncState) }, extraContent = if (syncUiState.content.isNotEmpty()) { diff --git a/app/src/main/java/org/dhis2/utils/granularsync/SyncStatusItem.kt b/app/src/main/java/org/dhis2/utils/granularsync/SyncStatusItem.kt index a0557714a75..03ef9ae08ed 100644 --- a/app/src/main/java/org/dhis2/utils/granularsync/SyncStatusItem.kt +++ b/app/src/main/java/org/dhis2/utils/granularsync/SyncStatusItem.kt @@ -18,7 +18,11 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.vectorResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.core.graphics.toColorInt import org.dhis2.commons.R +import org.dhis2.commons.ui.icons.SyncingIcon +import org.dhis2.utils.granularsync.domain.SyncStatus +import org.hisp.dhis.mobile.ui.designsystem.theme.TextColor @Composable fun SyncStatusItem( @@ -59,6 +63,61 @@ fun SyncStatusItem( } } +@Composable +fun SyncUiStatusIcon(status: SyncStatus) { + if (status == SyncStatus.UPLOADING) { + SyncingIcon() + } else { + val (imageVector, tint) = status.toIconData() + Icon( + imageVector = imageVector, + tint = tint, + contentDescription = "sync", + ) + } +} + +@Composable +private fun SyncStatus.toIconData(): Pair { + val imageVector = + when (this) { + SyncStatus.NOT_SYNCED, + SyncStatus.UPLOADING, + -> ImageVector.vectorResource(id = R.drawable.ic_sync_problem_grey) + + SyncStatus.ERROR -> + ImageVector.vectorResource(id = R.drawable.ic_sync_problem_red) + + SyncStatus.WARNING -> + ImageVector.vectorResource(id = R.drawable.ic_sync_warning) + + SyncStatus.SENT_VIA_SMS, + SyncStatus.SYNCED_VIA_SMS, + -> ImageVector.vectorResource(id = R.drawable.ic_sync_sms) + + SyncStatus.SYNCED, + SyncStatus.RELATIONSHIP, + -> ImageVector.vectorResource(id = R.drawable.ic_status_synced) + } + val tint = + when (this) { + SyncStatus.NOT_SYNCED, + SyncStatus.UPLOADING, + -> Color("#333333".toColorInt()) + + SyncStatus.ERROR -> Color("#E91E63".toColorInt()) + SyncStatus.WARNING -> Color("#FF9800".toColorInt()) + SyncStatus.SENT_VIA_SMS, + SyncStatus.SYNCED_VIA_SMS, + -> Color("#03A9F4".toColorInt()) + + SyncStatus.SYNCED, + SyncStatus.RELATIONSHIP, + -> TextColor.OnSurfaceLight + } + return Pair(imageVector, tint) +} + @Preview(showBackground = true) @Composable fun SyncStatusItemPreview() { diff --git a/app/src/main/java/org/dhis2/utils/granularsync/GranularSyncRepository.kt b/app/src/main/java/org/dhis2/utils/granularsync/data/GranularSyncRepository.kt similarity index 79% rename from app/src/main/java/org/dhis2/utils/granularsync/GranularSyncRepository.kt rename to app/src/main/java/org/dhis2/utils/granularsync/data/GranularSyncRepository.kt index 31eecdd3c15..cc2bcc13c38 100644 --- a/app/src/main/java/org/dhis2/utils/granularsync/GranularSyncRepository.kt +++ b/app/src/main/java/org/dhis2/utils/granularsync/data/GranularSyncRepository.kt @@ -1,12 +1,14 @@ -package org.dhis2.utils.granularsync +package org.dhis2.utils.granularsync.data -import io.reactivex.Single +import kotlinx.coroutines.async +import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.withContext import org.dhis2.R import org.dhis2.commons.bindings.categoryOptionCombo import org.dhis2.commons.bindings.countEventImportConflicts import org.dhis2.commons.bindings.countTeiImportConflicts import org.dhis2.commons.bindings.dataElement +import org.dhis2.commons.bindings.dataSet import org.dhis2.commons.bindings.dataSetInstanceSummaries import org.dhis2.commons.bindings.dataSetInstancesBy import org.dhis2.commons.bindings.dataSetSummaryBy @@ -19,13 +21,10 @@ import org.dhis2.commons.bindings.event import org.dhis2.commons.bindings.eventImportConflictsBy import org.dhis2.commons.bindings.eventsBy import org.dhis2.commons.bindings.isStockProgram -import org.dhis2.commons.bindings.observeDataSetInstancesBy -import org.dhis2.commons.bindings.observeEvent -import org.dhis2.commons.bindings.observeProgram -import org.dhis2.commons.bindings.observeTei import org.dhis2.commons.bindings.organisationUnit import org.dhis2.commons.bindings.period import org.dhis2.commons.bindings.program +import org.dhis2.commons.bindings.programStage import org.dhis2.commons.bindings.programs import org.dhis2.commons.bindings.stockUseCase import org.dhis2.commons.bindings.tei @@ -44,6 +43,10 @@ import org.dhis2.commons.sync.SyncStatusItem import org.dhis2.commons.sync.SyncStatusType import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.dhislogic.DhisProgramUtils +import org.dhis2.utils.granularsync.domain.MissingSyncTargetException +import org.dhis2.utils.granularsync.SyncDate +import org.dhis2.utils.granularsync.domain.SyncStatus +import org.dhis2.utils.granularsync.domain.SyncStatusData import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.dataset.DataSetInstance @@ -61,246 +64,125 @@ class GranularSyncRepository( private val resourceManager: ResourceManager, private val dispatcher: DispatcherProvider, ) { - fun getUiState(forcedState: State? = null): SyncUiState = - Single - .zip( - getState(), - getLastSynced(), - ) { state, lastSync -> - buildUiState( - forcedState.takeIf { it != null } ?: state, - lastSync, - ) - }.blockingGet() + suspend fun getSyncStatus(forcedState: State? = null): SyncStatusData = + coroutineScope { + val lastSync = async { getLastSynced() } + val state = forcedState ?: getState() + SyncStatusData( + syncState = state.toSyncStatus(), + lastSyncDate = lastSync.await().takeIf { state != State.UPLOADING }?.date, + content = getContent(state), + targetName = getTitle(), + ) + } - private fun getState(): Single = + private fun getState(): State = when (syncContext.conflictType()) { ConflictType.PROGRAM -> d2 - .observeProgram(syncContext.recordUid()) - .map { dhisProgramUtils.getProgramState(it) } + .program(syncContext.recordUid()) + ?.let { dhisProgramUtils.getProgramState(it) } + ?: throw missingSyncTargetException() ConflictType.TEI -> { val enrollment = d2.enrollment(syncContext.recordUid()) d2 - .observeTei(enrollment?.trackedEntityInstance() ?: syncContext.recordUid()) - .map { it.aggregatedSyncState() } + .tei(enrollment?.trackedEntityInstance() ?: syncContext.recordUid()) + ?.aggregatedSyncState() + ?: throw missingSyncTargetException() } ConflictType.EVENT -> - d2.observeEvent(syncContext.recordUid()).map { it.aggregatedSyncState() } + d2.event(syncContext.recordUid())?.aggregatedSyncState() ?: throw missingSyncTargetException() - ConflictType.DATA_SET -> - d2 - .observeDataSetInstancesBy(syncContext.recordUid()) - .map { dataSetInstances -> - getStateFromCandidates(dataSetInstances.map { it.state() }.toMutableList()) - } + ConflictType.DATA_SET -> { + d2.dataSet(syncContext.recordUid()) ?: throw missingSyncTargetException() + getStateFromCandidates( + d2 + .dataSetInstancesBy(syncContext.recordUid()) + .map { it.state() } + .toMutableList(), + ) + } ConflictType.DATA_VALUES -> with(syncContext as SyncContext.DataSetInstance) { - d2 - .observeDataSetInstancesBy( - dataSetUid = dataSetUid, - orgUnitUid = orgUnitUid, - periodId = periodId, - attrOptionComboUid = attributeOptionComboUid, - ).map { dataSetInstance -> - getStateFromCandidates(dataSetInstance.map { it.state() }.toMutableList()) - } + val dataSetInstances = + d2 + .dataSetModule() + .dataSetInstances() + .byDataSetUid() + .eq(dataSetUid) + .byOrganisationUnitUid() + .eq(orgUnitUid) + .byPeriod() + .eq(periodId) + .byAttributeOptionComboUid() + .eq(attributeOptionComboUid) + .blockingGet() + + if (dataSetInstances.isEmpty()) { + throw missingSyncTargetException() + } + + getStateFromCandidates( + dataSetInstances + .map { it.state() } + .toMutableList(), + ) } - ConflictType.ALL -> Single.just(dhisProgramUtils.getServerState()) + ConflictType.ALL -> dhisProgramUtils.getServerState() } - private fun getLastSynced(returnEmpty: Boolean = true): Single = + private fun getLastSynced(returnEmpty: Boolean = true): SyncDate = if (returnEmpty) { - Single.just(SyncDate(null)) + SyncDate(null) } else { when (syncContext.conflictType()) { ConflictType.PROGRAM -> - d2.observeProgram(syncContext.recordUid()).map { SyncDate(it.lastUpdated()) } + SyncDate(d2.program(syncContext.recordUid())?.lastUpdated()) ConflictType.TEI -> { val enrollment = d2.enrollment(syncContext.recordUid()) - d2 - .observeTei(enrollment?.trackedEntityInstance() ?: syncContext.recordUid()) - .map { SyncDate(it.lastUpdated()) } + SyncDate( + d2 + .tei(enrollment?.trackedEntityInstance() ?: syncContext.recordUid()) + ?.lastUpdated(), + ) } ConflictType.EVENT -> - d2.observeEvent(syncContext.recordUid()).map { SyncDate(it.lastUpdated()) } + SyncDate(d2.event(syncContext.recordUid())?.lastUpdated()) ConflictType.DATA_SET -> - d2 - .dataSetModule() - .dataSets() - .uid(syncContext.recordUid()) - .get() - .map { dataSet -> SyncDate(dataSet.lastUpdated()) } + SyncDate(d2.dataSet(syncContext.recordUid())?.lastUpdated()) ConflictType.DATA_VALUES -> with(syncContext as SyncContext.DataSetInstance) { - d2 - .observeDataSetInstancesBy( - dataSetUid = dataSetUid, - orgUnitUid = orgUnitUid, - periodId = periodId, - attrOptionComboUid = attributeOptionComboUid, - ).map { dataSetInstance -> - dataSetInstance.sortedBy { it.lastUpdated() } - SyncDate( - dataSetInstance - .apply { - sortedBy { it.lastUpdated() } - }.first() - .lastUpdated(), - ) - } + SyncDate( + d2 + .dataSetModule() + .dataSetInstances() + .byDataSetUid() + .eq(dataSetUid) + .byOrganisationUnitUid() + .eq(orgUnitUid) + .byPeriod() + .eq(periodId) + .byAttributeOptionComboUid() + .eq(attributeOptionComboUid) + .blockingGet() + .mapNotNull { it.lastUpdated() } + .minOrNull(), + ) } ConflictType.ALL -> - Single.just(SyncDate(preferenceProvider.lastSync())) + SyncDate(preferenceProvider.lastSync()) } } - private fun buildUiState( - state: State, - lastSync: SyncDate, - ): SyncUiState = - SyncUiState( - syncState = state, - title = getTitleForState(state), - lastSyncDate = lastSync.takeIf { state != State.UPLOADING }, - message = getMessageForState(state), - mainActionLabel = getMainActionLabel(state), - secondaryActionLabel = getSecondaryActionLabel(state), - content = getContent(state), - ) - - private fun getTitleForState(state: State): String = - when (state) { - State.TO_POST, - State.TO_UPDATE, - -> resourceManager.getString(R.string.sync_dialog_title_not_synced) - - State.ERROR -> resourceManager.getString(R.string.sync_dialog_title_error) - State.RELATIONSHIP, - State.SYNCED, - -> resourceManager.getString(R.string.sync_dialog_title_synced) - - State.WARNING -> resourceManager.getString(R.string.sync_dialog_title_warning) - State.UPLOADING -> resourceManager.getString(R.string.sync_dialog_title_syncing) - State.SENT_VIA_SMS, - State.SYNCED_VIA_SMS, - -> resourceManager.getString(R.string.sync_dialog_title_sms_syced) - } - - private fun getMessageForState(state: State): String? = - when (state) { - State.TO_POST, - State.TO_UPDATE, - -> getNotSyncedMessage() - - State.SYNCED -> getSyncedMessage() - State.SENT_VIA_SMS, - State.SYNCED_VIA_SMS, - -> getSmsSyncedMessage() - - State.ERROR, - State.WARNING, - State.RELATIONSHIP, - State.UPLOADING, - -> null - } - - private fun getNotSyncedMessage(): String = - when (syncContext.conflictType()) { - ConflictType.ALL -> - resourceManager.getString(R.string.sync_dialog_message_not_synced_all) - - ConflictType.DATA_SET, - ConflictType.DATA_VALUES, - ConflictType.PROGRAM, - -> - resourceManager.getString( - R.string.sync_dialog_message_not_synced_program, - getMessageArgument(), - ) - - ConflictType.TEI, ConflictType.EVENT -> - resourceManager.getString( - R.string.sync_dialog_message_not_synced_tei, - getMessageArgument(), - ) - } - - private fun getSyncedMessage(): String = - when (syncContext.conflictType()) { - ConflictType.ALL -> resourceManager.getString(R.string.sync_dialog_message_synced_all) - ConflictType.DATA_SET, - ConflictType.DATA_VALUES, - ConflictType.PROGRAM, - -> - resourceManager.getString( - R.string.sync_dialog_message_synced_program, - getMessageArgument(), - ) - - ConflictType.TEI, ConflictType.EVENT -> - resourceManager.getString( - R.string.sync_dialog_message_synced_tei, - getMessageArgument(), - ) - } - - private fun getSmsSyncedMessage(): String? = - when (syncContext.conflictType()) { - ConflictType.ALL, - ConflictType.DATA_SET, - ConflictType.PROGRAM, - -> null - - ConflictType.DATA_VALUES, - ConflictType.TEI, - ConflictType.EVENT, - -> resourceManager.getString(R.string.sync_dialog_message_sms_synced) - } - - private fun getMainActionLabel(state: State): String? = - when (state) { - State.TO_POST, - State.SENT_VIA_SMS, - State.SYNCED_VIA_SMS, - State.TO_UPDATE, - -> resourceManager.getString(R.string.sync_dialog_action_send) - - State.ERROR, - State.SYNCED, - State.WARNING, - -> resourceManager.getString(R.string.sync_dialog_action_refresh) - - State.UPLOADING, - State.RELATIONSHIP, - -> null - } - - private fun getSecondaryActionLabel(state: State): String? = - when (state) { - State.UPLOADING, - State.RELATIONSHIP, - -> null - - State.TO_POST, - State.TO_UPDATE, - State.ERROR, - State.SYNCED, - State.SENT_VIA_SMS, - State.SYNCED_VIA_SMS, - State.WARNING, - -> resourceManager.getString(R.string.sync_dialog_action_not_now) - } - private fun getContent(state: State): List = when (state) { State.TO_POST, @@ -1020,61 +902,55 @@ class GranularSyncRepository( } } - private fun getMessageArgument(): String = getTitle().blockingGet() + private fun State.toSyncStatus(): SyncStatus = + when (this) { + State.TO_POST, + State.TO_UPDATE, + -> SyncStatus.NOT_SYNCED + + State.ERROR -> SyncStatus.ERROR + State.WARNING -> SyncStatus.WARNING + State.SYNCED -> SyncStatus.SYNCED + State.RELATIONSHIP -> SyncStatus.RELATIONSHIP + State.UPLOADING -> SyncStatus.UPLOADING + State.SENT_VIA_SMS -> SyncStatus.SENT_VIA_SMS + State.SYNCED_VIA_SMS -> SyncStatus.SYNCED_VIA_SMS + } + + private fun missingSyncTargetException(): MissingSyncTargetException = + MissingSyncTargetException(syncContext.recordUid()) - private fun getTitle(): Single = + private fun getTitle(): String = when (syncContext.conflictType()) { - ConflictType.ALL -> Single.just("") + ConflictType.ALL -> "" ConflictType.PROGRAM -> d2 - .programModule() - .programs() - .uid(syncContext.recordUid()) - .get() - .map { it.displayName() } + .program(syncContext.recordUid()) + ?.displayName() + ?: syncContext.recordUid() ConflictType.TEI -> { val enrollment = - d2 - .enrollmentModule() - .enrollments() - .uid(syncContext.recordUid()) - .blockingGet() + d2.enrollment(syncContext.recordUid()) d2 - .trackedEntityModule() - .trackedEntityTypes() - .uid( - d2 - .trackedEntityModule() - .trackedEntityInstances() - .uid(enrollment?.trackedEntityInstance() ?: syncContext.recordUid()) - .blockingGet() - ?.trackedEntityType(), - ).get() - .map { it.displayName() } + .tei(enrollment?.trackedEntityInstance() ?: syncContext.recordUid()) + ?.trackedEntityType() + ?.let { d2.trackedEntityType(it)?.displayName() } + ?: syncContext.recordUid() } ConflictType.EVENT -> d2 - .programModule() - .programStages() - .uid( - d2 - .eventModule() - .events() - .uid(syncContext.recordUid()) - .blockingGet() - ?.programStage(), - ).get() - .map { it.displayName() } + .event(syncContext.recordUid()) + ?.programStage() + ?.let { d2.programStage(it)?.displayName() } + ?: syncContext.recordUid() ConflictType.DATA_SET, ConflictType.DATA_VALUES -> d2 - .dataSetModule() - .dataSets() - .uid(syncContext.recordUid()) - .get() - .map { it.displayName() } + .dataSet(syncContext.recordUid()) + ?.displayName() + ?: syncContext.recordUid() } suspend fun checkServerAvailability() = diff --git a/app/src/main/java/org/dhis2/utils/granularsync/domain/MissingSyncTargetException.kt b/app/src/main/java/org/dhis2/utils/granularsync/domain/MissingSyncTargetException.kt new file mode 100644 index 00000000000..99966aaee3c --- /dev/null +++ b/app/src/main/java/org/dhis2/utils/granularsync/domain/MissingSyncTargetException.kt @@ -0,0 +1,5 @@ +package org.dhis2.utils.granularsync.domain + +class MissingSyncTargetException( + val recordUid: String, +) : IllegalStateException("Resource not found: $recordUid") \ No newline at end of file diff --git a/app/src/main/java/org/dhis2/utils/granularsync/domain/SyncStatus.kt b/app/src/main/java/org/dhis2/utils/granularsync/domain/SyncStatus.kt new file mode 100644 index 00000000000..81a2f4a0914 --- /dev/null +++ b/app/src/main/java/org/dhis2/utils/granularsync/domain/SyncStatus.kt @@ -0,0 +1,12 @@ +package org.dhis2.utils.granularsync.domain + +enum class SyncStatus { + NOT_SYNCED, + ERROR, + WARNING, + SYNCED, + RELATIONSHIP, + UPLOADING, + SENT_VIA_SMS, + SYNCED_VIA_SMS, +} \ No newline at end of file diff --git a/app/src/main/java/org/dhis2/utils/granularsync/domain/SyncStatusData.kt b/app/src/main/java/org/dhis2/utils/granularsync/domain/SyncStatusData.kt new file mode 100644 index 00000000000..4c7feaf84ca --- /dev/null +++ b/app/src/main/java/org/dhis2/utils/granularsync/domain/SyncStatusData.kt @@ -0,0 +1,11 @@ +package org.dhis2.utils.granularsync.domain + +import org.dhis2.commons.sync.SyncStatusItem +import java.util.Date + +data class SyncStatusData( + val syncState: SyncStatus, + val lastSyncDate: Date?, + val content: List, + val targetName: String, +) diff --git a/app/src/main/java/org/dhis2/utils/granularsync/SyncUiState.kt b/app/src/main/java/org/dhis2/utils/granularsync/ui/SyncUiState.kt similarity index 64% rename from app/src/main/java/org/dhis2/utils/granularsync/SyncUiState.kt rename to app/src/main/java/org/dhis2/utils/granularsync/ui/SyncUiState.kt index 92dbe1e8dd5..553d86bd675 100644 --- a/app/src/main/java/org/dhis2/utils/granularsync/SyncUiState.kt +++ b/app/src/main/java/org/dhis2/utils/granularsync/ui/SyncUiState.kt @@ -1,10 +1,11 @@ -package org.dhis2.utils.granularsync +package org.dhis2.utils.granularsync.ui import org.dhis2.commons.sync.SyncStatusItem -import org.hisp.dhis.android.core.common.State +import org.dhis2.utils.granularsync.SyncDate +import org.dhis2.utils.granularsync.domain.SyncStatus data class SyncUiState( - val syncState: State, + val syncState: SyncStatus, val title: String, val lastSyncDate: SyncDate?, val message: String?, @@ -12,4 +13,4 @@ data class SyncUiState( val secondaryActionLabel: String?, val content: List, val shouldDismissOnUpdate: Boolean = false, -) +) \ No newline at end of file diff --git a/app/src/main/java/org/dhis2/utils/granularsync/ui/SyncUiStateMapper.kt b/app/src/main/java/org/dhis2/utils/granularsync/ui/SyncUiStateMapper.kt new file mode 100644 index 00000000000..34a98ac2b9b --- /dev/null +++ b/app/src/main/java/org/dhis2/utils/granularsync/ui/SyncUiStateMapper.kt @@ -0,0 +1,160 @@ +package org.dhis2.utils.granularsync.ui + +import org.dhis2.R +import org.dhis2.commons.resources.ResourceManager +import org.dhis2.commons.sync.ConflictType +import org.dhis2.commons.sync.SyncContext +import org.dhis2.utils.granularsync.SyncDate +import org.dhis2.utils.granularsync.domain.SyncStatus +import org.dhis2.utils.granularsync.domain.SyncStatusData + +class SyncUiStateMapper( + private val syncContext: SyncContext, + private val resourceManager: ResourceManager, +) { + fun toUiState( + data: SyncStatusData, + shouldDismissOnUpdate: Boolean = false, + ): SyncUiState = + SyncUiState( + syncState = data.syncState, + title = getTitleForState(data.syncState), + lastSyncDate = data.lastSyncDate?.let { SyncDate(it) }, + message = getMessageForState(data.syncState, data.targetName), + mainActionLabel = getMainActionLabel(data.syncState), + secondaryActionLabel = getSecondaryActionLabel(data.syncState), + content = data.content, + shouldDismissOnUpdate = shouldDismissOnUpdate, + ) + + fun missingTargetUiState(recordUid: String): SyncUiState = + SyncUiState( + syncState = SyncStatus.ERROR, + title = getTitleForState(SyncStatus.ERROR), + lastSyncDate = null, + message = resourceManager.getString(R.string.resource_not_found, recordUid), + mainActionLabel = getMainActionLabel(SyncStatus.ERROR), + secondaryActionLabel = getSecondaryActionLabel(SyncStatus.ERROR), + content = emptyList(), + ) + + private fun getTitleForState(status: SyncStatus): String = + when (status) { + SyncStatus.NOT_SYNCED -> + resourceManager.getString(R.string.sync_dialog_title_not_synced) + + SyncStatus.ERROR -> resourceManager.getString(R.string.sync_dialog_title_error) + SyncStatus.RELATIONSHIP, + SyncStatus.SYNCED, + -> resourceManager.getString(R.string.sync_dialog_title_synced) + + SyncStatus.WARNING -> resourceManager.getString(R.string.sync_dialog_title_warning) + SyncStatus.UPLOADING -> resourceManager.getString(R.string.sync_dialog_title_syncing) + SyncStatus.SENT_VIA_SMS, + SyncStatus.SYNCED_VIA_SMS, + -> resourceManager.getString(R.string.sync_dialog_title_sms_syced) + } + + private fun getMessageForState( + status: SyncStatus, + targetName: String, + ): String? = + when (status) { + SyncStatus.NOT_SYNCED -> getNotSyncedMessage(targetName) + SyncStatus.SYNCED -> getSyncedMessage(targetName) + SyncStatus.SENT_VIA_SMS, + SyncStatus.SYNCED_VIA_SMS, + -> getSmsSyncedMessage() + + SyncStatus.ERROR, + SyncStatus.WARNING, + SyncStatus.RELATIONSHIP, + SyncStatus.UPLOADING, + -> null + } + + private fun getNotSyncedMessage(targetName: String): String = + when (syncContext.conflictType()) { + ConflictType.ALL -> + resourceManager.getString(R.string.sync_dialog_message_not_synced_all) + + ConflictType.DATA_SET, + ConflictType.DATA_VALUES, + ConflictType.PROGRAM, + -> + resourceManager.getString( + R.string.sync_dialog_message_not_synced_program, + targetName, + ) + + ConflictType.TEI, ConflictType.EVENT -> + resourceManager.getString( + R.string.sync_dialog_message_not_synced_tei, + targetName, + ) + } + + private fun getSyncedMessage(targetName: String): String = + when (syncContext.conflictType()) { + ConflictType.ALL -> resourceManager.getString(R.string.sync_dialog_message_synced_all) + ConflictType.DATA_SET, + ConflictType.DATA_VALUES, + ConflictType.PROGRAM, + -> + resourceManager.getString( + R.string.sync_dialog_message_synced_program, + targetName, + ) + + ConflictType.TEI, ConflictType.EVENT -> + resourceManager.getString( + R.string.sync_dialog_message_synced_tei, + targetName, + ) + } + + private fun getSmsSyncedMessage(): String? = + when (syncContext.conflictType()) { + ConflictType.ALL, + ConflictType.DATA_SET, + ConflictType.PROGRAM, + -> null + + ConflictType.DATA_VALUES, + ConflictType.TEI, + ConflictType.EVENT, + -> resourceManager.getString(R.string.sync_dialog_message_sms_synced) + } + + private fun getMainActionLabel(status: SyncStatus): String? = + when (status) { + SyncStatus.NOT_SYNCED, + SyncStatus.SENT_VIA_SMS, + SyncStatus.SYNCED_VIA_SMS, + -> resourceManager.getString(R.string.sync_dialog_action_send) + + SyncStatus.ERROR, + SyncStatus.SYNCED, + SyncStatus.WARNING, + -> resourceManager.getString(R.string.sync_dialog_action_refresh) + + SyncStatus.UPLOADING, + SyncStatus.RELATIONSHIP, + -> null + } + + private fun getSecondaryActionLabel(status: SyncStatus): String? = + when (status) { + SyncStatus.UPLOADING, + SyncStatus.RELATIONSHIP, + -> null + + SyncStatus.NOT_SYNCED, + SyncStatus.ERROR, + SyncStatus.SYNCED, + SyncStatus.SENT_VIA_SMS, + SyncStatus.SYNCED_VIA_SMS, + SyncStatus.WARNING, + -> resourceManager.getString(R.string.sync_dialog_action_not_now) + } +} \ No newline at end of file diff --git a/app/src/test/java/org/dhis2/data/forms/dataentry/ValueStoreTest.kt b/app/src/test/java/org/dhis2/data/forms/dataentry/ValueStoreTest.kt index d686b14769a..c8442c42f7d 100644 --- a/app/src/test/java/org/dhis2/data/forms/dataentry/ValueStoreTest.kt +++ b/app/src/test/java/org/dhis2/data/forms/dataentry/ValueStoreTest.kt @@ -1,6 +1,7 @@ package org.dhis2.data.forms.dataentry import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.flowOf import org.dhis2.commons.data.EntryMode import org.dhis2.commons.network.NetworkUtils import org.dhis2.commons.resources.ResourceManager @@ -42,6 +43,7 @@ class ValueStoreTest { @Before fun setUp() { + whenever(networkStatusProvider.connectionStatus) doReturn flowOf(false) attrValueStore = ValueStoreImpl( d2, diff --git a/app/src/test/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailViewModelTest.kt b/app/src/test/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailViewModelTest.kt index bcebeeba2ab..7b755a93ee0 100644 --- a/app/src/test/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailViewModelTest.kt +++ b/app/src/test/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailViewModelTest.kt @@ -5,8 +5,10 @@ import junit.framework.TestCase.assertEquals import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.setMain import org.dhis2.commons.viewmodel.DispatcherProvider +import org.junit.After import org.junit.Before import org.junit.Rule import org.junit.Test @@ -28,6 +30,11 @@ class DataSetDetailViewModelTest { private lateinit var viewModel: DataSetDetailViewModel + @After + fun tearDown() { + Dispatchers.resetMain() + } + @Before fun setUp() { Dispatchers.setMain(UnconfinedTestDispatcher()) diff --git a/app/src/test/java/org/dhis2/usescases/datasets/datasetDetail/datasetlist/DataSetListViewModelTest.kt b/app/src/test/java/org/dhis2/usescases/datasets/datasetDetail/datasetlist/DataSetListViewModelTest.kt index 0d5e30f80a3..9c47451c580 100644 --- a/app/src/test/java/org/dhis2/usescases/datasets/datasetDetail/datasetlist/DataSetListViewModelTest.kt +++ b/app/src/test/java/org/dhis2/usescases/datasets/datasetDetail/datasetlist/DataSetListViewModelTest.kt @@ -8,6 +8,7 @@ import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.setMain import org.dhis2.commons.filters.FilterManager import org.dhis2.commons.matomo.Actions @@ -19,6 +20,7 @@ import org.dhis2.usescases.datasets.datasetDetail.DataSetDetailModel import org.dhis2.usescases.datasets.datasetDetail.DataSetDetailRepository import org.dhis2.usescases.datasets.datasetDetail.datasetList.DataSetListViewModel import org.hisp.dhis.android.core.common.State +import org.junit.After import org.junit.Before import org.junit.Rule import org.junit.Test @@ -43,6 +45,11 @@ class DataSetListViewModelTest { private val filterProcessor: FlowableProcessor = PublishProcessor.create() private val filterManagerFlowable = Flowable.just(filterManager).startWith(filterProcessor) + @After + fun tearDown() { + Dispatchers.resetMain() + } + @OptIn(ExperimentalCoroutinesApi::class) @Before fun setUp() { diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/DashboardViewModelTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/DashboardViewModelTest.kt index 48dd0e14fd5..15fafeeb496 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/DashboardViewModelTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/DashboardViewModelTest.kt @@ -6,6 +6,7 @@ import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.setMain import org.dhis2.commons.resources.ResourceManager import org.dhis2.commons.viewmodel.DispatcherProvider @@ -16,6 +17,7 @@ import org.dhis2.utils.customviews.navigationbar.NavigationPageConfigurator import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.enrollment.EnrollmentStatus +import org.junit.After import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Rule @@ -36,6 +38,11 @@ class DashboardViewModelTest { private val pageConfigurator: NavigationPageConfigurator = mock() private val resoourcesManager: ResourceManager = mock() + @After + fun tearDown() { + Dispatchers.resetMain() + } + @OptIn(ExperimentalCoroutinesApi::class) @Before fun setUp() { diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/dialogs/scheduling/SchedulingViewModelTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/dialogs/scheduling/SchedulingViewModelTest.kt index 14400aa54d3..9909ea134db 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/dialogs/scheduling/SchedulingViewModelTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/dialogs/scheduling/SchedulingViewModelTest.kt @@ -3,35 +3,31 @@ package org.dhis2.usescases.teiDashboard.dialogs.scheduling import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.setMain -import org.dhis2.commons.bindings.enrollment -import org.dhis2.commons.bindings.programStage import org.dhis2.commons.data.EventCreationType import org.dhis2.commons.viewmodel.DispatcherProvider import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.arch.helpers.DateUtils -import org.hisp.dhis.android.core.arch.repositories.`object`.ReadOnlyOneObjectRepositoryFinalImpl import org.hisp.dhis.android.core.enrollment.Enrollment -import org.hisp.dhis.android.core.enrollment.EnrollmentCollectionRepository -import org.hisp.dhis.android.core.enrollment.EnrollmentModule -import org.hisp.dhis.android.core.enrollment.EnrollmentObjectRepository -import org.hisp.dhis.android.core.period.PeriodModule -import org.hisp.dhis.android.core.program.ProgramModule +import org.hisp.dhis.android.core.event.EventCollectionRepository +import org.hisp.dhis.android.core.program.ProgramCollectionRepository import org.hisp.dhis.android.core.program.ProgramStage -import org.hisp.dhis.android.core.program.ProgramStageCollectionRepository +import org.junit.After import org.junit.Before import org.junit.Test -import org.mockito.Mockito.spy +import org.mockito.Mockito import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever @OptIn(ExperimentalCoroutinesApi::class) class SchedulingViewModelTest { private lateinit var schedulingViewModel: SchedulingViewModel - private val testingDispatcher = UnconfinedTestDispatcher() + private val testingDispatcher = StandardTestDispatcher() private val enrollment = Enrollment @@ -39,50 +35,25 @@ class SchedulingViewModelTest { .uid(ENROLLMENT_UID) .attributeOptionCombo("attributeOptionComboUid") .build() - private val programStage = ProgramStage.builder().uid(STAGE).build() - private val enrollmentObjectRepository: EnrollmentObjectRepository = - mock { - on { blockingGet() } doReturn enrollment - } - private val enrollmentCollectionRepository: EnrollmentCollectionRepository = - mock { - on { uid(ENROLLMENT_UID) } doReturn enrollmentObjectRepository - } - private val enrollmentModule: EnrollmentModule = - mock { - on { enrollments() } doReturn enrollmentCollectionRepository - } + private val d2: D2 = Mockito.mock(D2::class.java, Mockito.RETURNS_DEEP_STUBS) - private val readOnlyOneObjectRepositoryFinalImpl: ReadOnlyOneObjectRepositoryFinalImpl = - mock { - on { blockingGet() } doReturn programStage - } - private val programStageCollectionRepository: ProgramStageCollectionRepository = - mock { - on { uid(STAGE) } doReturn readOnlyOneObjectRepositoryFinalImpl - } - private val programModule: ProgramModule = - mock { - on { programStages() } doReturn programStageCollectionRepository - } - - private val periodModule: PeriodModule = - mock { - on { periodHelper() } doReturn mock() - } - - private val d2: D2 = - mock { - on { enrollmentModule() } doReturn enrollmentModule - on { programModule() } doReturn programModule - on { periodModule() } doReturn periodModule - } + @After + fun tearDown() { + Dispatchers.resetMain() + } @OptIn(ExperimentalCoroutinesApi::class) @Before fun setUp() { Dispatchers.setMain(testingDispatcher) + whenever(d2.enrollmentModule().enrollments().uid(ENROLLMENT_UID).blockingGet()) doReturn enrollment + whenever(d2.programModule().programStages().uid(STAGE).blockingGet()) doReturn + ProgramStage.builder().uid(STAGE).build() + whenever(d2.eventModule().events()) doReturn + Mockito.mock(EventCollectionRepository::class.java, Mockito.RETURNS_DEEP_STUBS) + whenever(d2.programModule().programs()) doReturn + Mockito.mock(ProgramCollectionRepository::class.java, Mockito.RETURNS_DEEP_STUBS) schedulingViewModel = SchedulingViewModel( d2 = d2, @@ -113,7 +84,7 @@ class SchedulingViewModelTest { @Test fun shouldSetReportDate() { val date = DateUtils.DATE_FORMAT.parse(REPORT_DATE) - val spy = spy(schedulingViewModel) + val spy = Mockito.spy(schedulingViewModel) spy.onDateSet(2024, 4, 14) verify(spy).setUpEventReportDate(date) } @@ -121,7 +92,7 @@ class SchedulingViewModelTest { @Test fun shouldSetReportDateForIncreasedNumberOfMonth() { val date = DateUtils.DATE_FORMAT.parse(REPORT_DATE_INCREASED_MONTH) - val spy = spy(schedulingViewModel) + val spy = Mockito.spy(schedulingViewModel) spy.onDateSet(2024, 13, 31) verify(spy).setUpEventReportDate(date) } diff --git a/app/src/test/java/org/dhis2/utils/granularsync/GranularSyncPresenterTest.kt b/app/src/test/java/org/dhis2/utils/granularsync/GranularSyncPresenterTest.kt index ae77334adfb..65993532019 100644 --- a/app/src/test/java/org/dhis2/utils/granularsync/GranularSyncPresenterTest.kt +++ b/app/src/test/java/org/dhis2/utils/granularsync/GranularSyncPresenterTest.kt @@ -19,7 +19,14 @@ import org.dhis2.commons.sync.SyncContext import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.schedulers.TrampolineSchedulerProvider import org.dhis2.data.service.workManager.WorkManagerController +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.usescases.sms.SmsSendingService +import org.dhis2.utils.granularsync.data.GranularSyncRepository +import org.dhis2.utils.granularsync.domain.MissingSyncTargetException +import org.dhis2.utils.granularsync.domain.SyncStatus +import org.dhis2.utils.granularsync.domain.SyncStatusData +import org.dhis2.utils.granularsync.ui.SyncUiState +import org.dhis2.utils.granularsync.ui.SyncUiStateMapper import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.common.State @@ -35,12 +42,16 @@ import org.junit.Test import org.mockito.ArgumentMatchers.anyList import org.mockito.Mockito import org.mockito.kotlin.any +import org.mockito.kotlin.anyOrNull import org.mockito.kotlin.doReturn import org.mockito.kotlin.doThrow import org.mockito.kotlin.mock import org.mockito.kotlin.times import org.mockito.kotlin.verify import org.mockito.kotlin.whenever +import org.koin.core.context.startKoin +import org.koin.core.context.stopKoin +import org.koin.dsl.module import java.util.Date @OptIn(ExperimentalCoroutinesApi::class) @@ -60,16 +71,45 @@ class GranularSyncPresenterTest { } private val workManager = Mockito.mock(WorkManagerController::class.java) private val smsSyncProvider: SMSSyncProvider = mock() + private val mapper: SyncUiStateMapper = mock() private val context: Context = mock() private val syncContext: SyncContext = SyncContext.Global() + private val syncBackgroundJobAction: SyncBackgroundJobAction = mock() @Before fun setUp() { + startKoin { + modules( + module { + single { syncBackgroundJobAction } + }, + ) + } Dispatchers.setMain(testingDispatcher) + runBlocking { + whenever(repository.getSyncStatus(anyOrNull())) doReturn + SyncStatusData( + syncState = SyncStatus.SYNCED, + lastSyncDate = null, + content = emptyList(), + targetName = "", + ) + } + whenever(mapper.toUiState(any(), any())) doReturn + SyncUiState( + syncState = SyncStatus.SYNCED, + title = "Title", + lastSyncDate = null, + message = null, + mainActionLabel = null, + secondaryActionLabel = null, + content = emptyList(), + ) } @After fun tearDown() { + stopKoin() Dispatchers.resetMain() } @@ -85,11 +125,19 @@ class GranularSyncPresenterTest { SyncContext.TrackerProgram("test_uid"), workManager, smsSyncProvider, + mapper, ) + val mockedStatusData = + SyncStatusData( + syncState = SyncStatus.ERROR, + lastSyncDate = Date(), + content = emptyList(), + targetName = "test", + ) val mockedState = SyncUiState( - syncState = State.ERROR, + syncState = SyncStatus.ERROR, title = "Title", lastSyncDate = SyncDate(Date()), message = "message", @@ -97,13 +145,53 @@ class GranularSyncPresenterTest { secondaryActionLabel = "action 2", content = emptyList(), ) - whenever(repository.getUiState()) doReturn mockedState + runBlocking { + whenever(repository.getSyncStatus(anyOrNull())) doReturn mockedStatusData + } + whenever(mapper.toUiState(any(), any())) doReturn mockedState presenter.refreshContent() val result = presenter.currentState.value assertEquals(mockedState, result) } + @Test + fun `should map missing target exception to error ui state`() { + val presenter = + GranularSyncPresenter( + d2, + view, + repository, + trampolineSchedulerProvider, + testDispatcher, + SyncContext.TrackerProgram("missing_uid"), + workManager, + smsSyncProvider, + mapper, + ) + + val missingTargetUiState = + SyncUiState( + syncState = SyncStatus.ERROR, + title = "Sync error", + lastSyncDate = null, + message = "missing_uid not found", + mainActionLabel = "Refresh", + secondaryActionLabel = "Not now", + content = emptyList(), + ) + + runBlocking { + whenever(repository.getSyncStatus(anyOrNull())) doThrow + MissingSyncTargetException("missing_uid") + } + whenever(mapper.missingTargetUiState("missing_uid")) doReturn missingTargetUiState + + presenter.refreshContent() + + assertEquals(missingTargetUiState, presenter.currentState.value) + } + @Test fun `should block sms for some conflict types`() { whenever( @@ -138,6 +226,7 @@ class GranularSyncPresenterTest { it, workManager, smsSyncProvider, + mapper, ).canSendSMS() it to enable }.forEach { (syncContext, canSendSMS) -> @@ -166,6 +255,7 @@ class GranularSyncPresenterTest { syncContext, workManager, smsSyncProvider, + mapper, ) val testingMsg = "testingMsg" @@ -194,6 +284,7 @@ class GranularSyncPresenterTest { syncContext, workManager, smsSyncProvider, + mapper, ) presenter.onSmsNotManuallySent(context) @@ -212,6 +303,7 @@ class GranularSyncPresenterTest { syncContext, workManager, smsSyncProvider, + mapper, ) whenever(smsSyncProvider.isPlayServicesEnabled()) doReturn false @@ -246,6 +338,7 @@ class GranularSyncPresenterTest { syncContext, workManager, smsSyncProvider, + mapper, ) whenever(smsSyncProvider.expectsResponseSMS()) doReturn false @@ -254,7 +347,9 @@ class GranularSyncPresenterTest { presenter.onSmsManuallySent(context) { } - verify(repository).getUiState() + runBlocking { + verify(repository).getSyncStatus(anyOrNull()) + } } @Test @@ -269,13 +364,16 @@ class GranularSyncPresenterTest { syncContext, workManager, smsSyncProvider, + mapper, ) whenever(smsSyncProvider.expectsResponseSMS()) doReturn true presenter.onSmsManuallySent(context) { } - verify(repository, times(0)).getUiState() + runBlocking { + verify(repository, times(0)).getSyncStatus(anyOrNull()) + } } @Test @@ -290,6 +388,7 @@ class GranularSyncPresenterTest { syncContext, workManager, smsSyncProvider, + mapper, ) whenever(smsSyncProvider.smsSender) doReturn mock() @@ -297,7 +396,9 @@ class GranularSyncPresenterTest { presenter.onConfirmationMessageStateChanged(true) - verify(repository).getUiState() + runBlocking { + verify(repository).getSyncStatus(anyOrNull()) + } } @Test @@ -312,6 +413,7 @@ class GranularSyncPresenterTest { syncContext, workManager, smsSyncProvider, + mapper, ) whenever(smsSyncProvider.smsSender) doReturn mock() @@ -319,7 +421,9 @@ class GranularSyncPresenterTest { presenter.onConfirmationMessageStateChanged(false) - verify(repository).getUiState() + runBlocking { + verify(repository).getSyncStatus(anyOrNull()) + } } @Test @@ -334,6 +438,7 @@ class GranularSyncPresenterTest { SyncContext.TrackerProgram("programUid"), workManager, smsSyncProvider, + mapper, ) val workInfoList = MutableLiveData>(emptyList()) @@ -359,6 +464,7 @@ class GranularSyncPresenterTest { SyncContext.TrackerProgramTei("enrollmentUid"), workManager, smsSyncProvider, + mapper, ) val workInfoList = MutableLiveData>(emptyList()) @@ -384,6 +490,7 @@ class GranularSyncPresenterTest { SyncContext.Event("eventUid"), workManager, smsSyncProvider, + mapper, ) val workInfoList = MutableLiveData>(emptyList()) @@ -409,6 +516,7 @@ class GranularSyncPresenterTest { SyncContext.DataSet("dataSetUid"), workManager, smsSyncProvider, + mapper, ) val workInfoList = MutableLiveData>(emptyList()) @@ -439,6 +547,7 @@ class GranularSyncPresenterTest { ), workManager, smsSyncProvider, + mapper, ) val mockedDataSet: DataSet = @@ -502,6 +611,7 @@ class GranularSyncPresenterTest { SyncContext.Global(), workManager, smsSyncProvider, + mapper, ) val workInfoList = MutableLiveData>(emptyList()) @@ -529,6 +639,7 @@ class GranularSyncPresenterTest { SyncContext.Global(), workManager, smsSyncProvider, + mapper, ) presenter.checkServerAvailability() @@ -551,6 +662,7 @@ class GranularSyncPresenterTest { SyncContext.Global(), workManager, smsSyncProvider, + mapper, ) presenter.checkServerAvailability() diff --git a/app/src/test/java/org/dhis2/utils/granularsync/GranularSyncRepositoryTest.kt b/app/src/test/java/org/dhis2/utils/granularsync/GranularSyncRepositoryTest.kt new file mode 100644 index 00000000000..6776c8c9025 --- /dev/null +++ b/app/src/test/java/org/dhis2/utils/granularsync/GranularSyncRepositoryTest.kt @@ -0,0 +1,124 @@ +package org.dhis2.utils.granularsync + +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.resetMain +import kotlinx.coroutines.test.runTest +import kotlinx.coroutines.test.setMain +import org.dhis2.commons.prefs.PreferenceProvider +import org.dhis2.commons.resources.DhisPeriodUtils +import org.dhis2.commons.resources.ResourceManager +import org.dhis2.commons.sync.SyncContext +import org.dhis2.commons.viewmodel.DispatcherProvider +import org.dhis2.data.dhislogic.DhisProgramUtils +import org.dhis2.utils.granularsync.data.GranularSyncRepository +import org.dhis2.utils.granularsync.domain.MissingSyncTargetException +import org.hisp.dhis.android.core.D2 +import org.junit.After +import org.junit.Assert.assertEquals +import org.junit.Assert.fail +import org.junit.Before +import org.junit.Test +import org.mockito.Mockito +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever + +@OptIn(ExperimentalCoroutinesApi::class) +class GranularSyncRepositoryTest { + private val d2: D2 = Mockito.mock(D2::class.java, Mockito.RETURNS_DEEP_STUBS) + private val preferenceProvider: PreferenceProvider = mock() + private val dhisProgramUtils: DhisProgramUtils = mock() + private val periodUtils: DhisPeriodUtils = mock() + private val resourceManager: ResourceManager = mock() + private val testingDispatcher = UnconfinedTestDispatcher() + private val dispatcherProvider: DispatcherProvider = + mock { + on { io() } doReturn testingDispatcher + } + + @Before + fun setUp() { + Dispatchers.setMain(testingDispatcher) + } + + @After + fun tearDown() { + Dispatchers.resetMain() + } + + @Test + fun `should return error ui state when program is missing`() { + runTest { + whenever(d2.programModule().programs().uid("programUid").blockingGet()) doReturn null + + assertMissingSyncTarget( + syncContext = SyncContext.TrackerProgram("programUid"), + expectedRecordUid = "programUid", + ) + } + } + + @Test + fun `should return error ui state when tei is missing`() { + runTest { + whenever(d2.enrollmentModule().enrollments().uid("enrollmentUid").blockingGet()) doReturn null + whenever(d2.trackedEntityModule().trackedEntityInstances().uid("enrollmentUid").blockingGet()) doReturn null + + assertMissingSyncTarget( + syncContext = SyncContext.TrackerProgramTei("enrollmentUid"), + expectedRecordUid = "enrollmentUid", + ) + } + } + + @Test + fun `should return error ui state when event is missing`() { + runTest { + whenever(d2.eventModule().events().uid("eventUid").blockingGet()) doReturn null + + assertMissingSyncTarget( + syncContext = SyncContext.Event("eventUid"), + expectedRecordUid = "eventUid", + ) + } + } + + @Test + fun `should return error ui state when data set is missing`() { + runTest { + whenever(d2.dataSetModule().dataSets().uid("dataSetUid").blockingGet()) doReturn null + + assertMissingSyncTarget( + syncContext = SyncContext.DataSet("dataSetUid"), + expectedRecordUid = "dataSetUid", + ) + } + } + + private suspend fun assertMissingSyncTarget( + syncContext: SyncContext, + expectedRecordUid: String, + ) { + val repository = repositoryFor(syncContext) + + try { + repository.getSyncStatus() + fail("Expected MissingSyncTargetException") + } catch (exception: MissingSyncTargetException) { + assertEquals(expectedRecordUid, exception.recordUid) + } + } + + private fun repositoryFor(syncContext: SyncContext) = + GranularSyncRepository( + d2 = d2, + syncContext = syncContext, + preferenceProvider = preferenceProvider, + dhisProgramUtils = dhisProgramUtils, + periodUtils = periodUtils, + resourceManager = resourceManager, + dispatcher = dispatcherProvider, + ) +} diff --git a/commons/src/main/java/org/dhis2/commons/bindings/SdkExtensions.kt b/commons/src/main/java/org/dhis2/commons/bindings/SdkExtensions.kt index ee3b541d713..d60e42c8918 100644 --- a/commons/src/main/java/org/dhis2/commons/bindings/SdkExtensions.kt +++ b/commons/src/main/java/org/dhis2/commons/bindings/SdkExtensions.kt @@ -20,8 +20,6 @@ fun D2.programs(): List = programModule().programs().blockingGet() fun D2.program(programUid: String): Program? = programModule().programs().uid(programUid).blockingGet() -fun D2.observeProgram(programUid: String): Single = programModule().programs().uid(programUid).get() - fun D2.isStockProgram(programUid: String): Boolean = useCaseModule() .stockUseCases() @@ -74,12 +72,6 @@ fun D2.tei(teiUid: String) = .uid(teiUid) .blockingGet() -fun D2.observeTei(teiUid: String) = - trackedEntityModule() - .trackedEntityInstances() - .uid(teiUid) - .get() - fun D2.teisBy( programs: List? = null, aggregatedSynStates: List? = null, @@ -92,13 +84,6 @@ fun D2.teisBy( return repository.blockingGet() } -fun D2.teiImportConflicts(teiUid: String): List = - importModule() - .trackerImportConflicts() - .byTrackedEntityInstanceUid() - .eq(teiUid) - .blockingGet() - fun D2.teiImportConflictsBy( teiUid: String? = null, enrollmentUid: String? = null, @@ -217,12 +202,6 @@ fun D2.event(uid: String) = .uid(uid) .blockingGet() -fun D2.observeEvent(uid: String) = - eventModule() - .events() - .uid(uid) - .get() - fun D2.eventsBy( programUid: String? = null, enrollmentUid: String? = null, @@ -268,26 +247,6 @@ fun D2.dataSetInstancesBy( return repository.blockingGet() } -fun D2.observeDataSetInstancesBy( - dataSetUid: String? = null, - orgUnitUid: String? = null, - periodId: String? = null, - attrOptionComboUid: String? = null, - states: List? = null, -): Single> { - var repository = dataSetModule().dataSetInstances() - repository = dataSetUid?.let { repository.byDataSetUid().eq(dataSetUid) } ?: repository - repository = states?.let { - repository.byState().`in`(states) - } ?: repository - repository = orgUnitUid?.let { repository.byOrganisationUnitUid().eq(orgUnitUid) } ?: repository - repository = periodId?.let { repository.byPeriod().eq(periodId) } ?: repository - repository = attrOptionComboUid?.let { - repository.byAttributeOptionComboUid().eq(attrOptionComboUid) - } ?: repository - return repository.get() -} - fun D2.dataValueConflictsBy(dataSetUid: String): List = dataValueModule() .dataValueConflicts() @@ -311,23 +270,6 @@ fun D2.dataValueConflicts( .eq(attrOptionComboUid) .blockingGet() -fun D2.countDataValueConflicts( - dataSetUid: String, - periodId: String, - orgUnitUid: String, - attrOptionComboUid: String, -): Int = - dataValueModule() - .dataValueConflicts() - .byDataSet(dataSetUid) - .byPeriod() - .eq(periodId) - .byOrganisationUnitUid() - .eq(orgUnitUid) - .byAttributeOptionCombo() - .eq(attrOptionComboUid) - .blockingCount() - fun D2.period(periodId: String) = periodModule() .periods() From 339fbeab8d04c0b1bd25dc77cd4232167c2c80f3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 09:55:21 +0000 Subject: [PATCH 166/260] Add tracker search flow instrumented test for TB program (ANDROAPP-5971/5861/2458/5862/5970/7488/7489/7490/1056/7491) Co-authored-by: andresmr <3330344+andresmr@users.noreply.github.com> --- .../dhis2/usescases/searchte/SearchTETest.kt | 85 ++++++++++++++ .../searchte/robot/SearchTeiRobot.kt | 110 +++++++++++++++++- .../searchTrackEntity/ui/SearchTEUi.kt | 2 + 3 files changed, 196 insertions(+), 1 deletion(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt index 93d3178ed9f..31d028efc75 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt @@ -111,6 +111,73 @@ class SearchTETest : BaseTest() { } } + @Test + fun shouldFollowTBProgramSearchFlow() { + // Mock the online search to return empty results (only local DB results shown) + mockWebServerRobot.addResponse( + ResponseController.GET, + API_TRACKED_ENTITY_PATH, + API_TRACKED_ENTITY_EMPTY_RESPONSE, + ) + + prepareTBIntentAndLaunchActivity(rule) + + searchTeiRobot(composeTestRule) { + waitUntilActivityVisible() + + // ANDROAPP-5971: Search/Add new [TET] button is visible and enabled + checkAddNewTEIButtonIsDisplayedAndEnabled() + + // Open the search parameters panel + clickOnOpenSearch() + + // ANDROAPP-5861: Unique attribute (TB identifier) is first after sort ordering + checkFirstSearchParamIsBarcodeOrQROrUnique(TB_IDENTIFIER_LABEL) + + // ANDROAPP-2458: Verify count of searchable attributes + checkSearchParamCount(TB_PROGRAM_SEARCH_ATTR_COUNT) + + // ANDROAPP-5862: Search button is disabled when no values are entered + checkSearchButtonIsDisabled() + + // Enter a value to enable the search button (Part A entry) + typeOnSearchParameter(TB_SEARCH_ATTR_CITY, TB_SEARCH_CITY_SHORT) + + // [Part A] ANDROAPP-5862: Search button is now enabled + checkSearchButtonIsEnabled() + + // ANDROAPP-5970: Reset search field + clickOnClearSearch() + + // Re-enter a short value (1 char) to enable the button + typeOnSearchParameter(TB_SEARCH_ATTR_CITY, TB_SEARCH_CITY_SHORT) + + // ANDROAPP-7488: Focus a field with operator to verify operator description as supporting text + typeOnSearchParameter(TB_SEARCH_ATTR_ZIP, "") + checkFocusedFieldShowsOperatorSupportingText() + + // Click Search – triggers per-field min-character validation + clickOnSearch() + + // [Part B] ANDROAPP-7489/7490 & ANDROAPP-1056/7491: + // Error is displayed because value is below the minimum character requirement + checkMinCharactersErrorIsDisplayed() + + // Update to valid search values and search again + typeOnSearchParameter(TB_SEARCH_ATTR_CITY, TB_SEARCH_CITY) + typeOnSearchParameter(TB_SEARCH_ATTR_STATE, TB_SEARCH_STATE) + typeOnSearchParameter(TB_SEARCH_ATTR_ZIP, TB_SEARCH_ZIP) + typeOnSearchParameter(TB_SEARCH_ATTR_TB_NUMBER, TB_SEARCH_TB_NUMBER) + + // Click Search with valid values + clickOnSearch() + + // Verify results: Lynn Dunn and Inés Bebea are displayed + checkSearchResultDisplayed(TB_RESULT_DUNN) + checkSearchResultDisplayed(TB_RESULT_BEBEA) + } + } + private fun createRegisterTEI() = RegisterTEIUIModel( "Claire", "Jones", @@ -139,5 +206,23 @@ class SearchTETest : BaseTest() { const val CHILD_TE_TYPE_VALUE = "nEenWmSyUEp" const val CHILD_TE_TYPE = "TRACKED_ENTITY_UID" + + // TB Program search flow test constants + const val TB_PROGRAM_SEARCH_ATTR_COUNT = 8 + const val TB_IDENTIFIER_LABEL = "TB identifier" + + const val TB_SEARCH_ATTR_CITY = "City" + const val TB_SEARCH_ATTR_STATE = "State" + const val TB_SEARCH_ATTR_ZIP = "Zip code" + const val TB_SEARCH_ATTR_TB_NUMBER = "TB number" + + const val TB_SEARCH_CITY_SHORT = "C" + const val TB_SEARCH_CITY = "City" + const val TB_SEARCH_STATE = "State" + const val TB_SEARCH_ZIP = "404" + const val TB_SEARCH_TB_NUMBER = "123456789" + + const val TB_RESULT_DUNN = "Dunn" + const val TB_RESULT_BEBEA = "Bebea" } } diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index d2c48a74aa1..18f10d8e344 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -2,7 +2,11 @@ package org.dhis2.usescases.searchte.robot import androidx.compose.ui.test.ExperimentalTestApi import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.assertIsEnabled +import androidx.compose.ui.test.assertIsNotEnabled import androidx.compose.ui.test.hasAnyAncestor +import androidx.compose.ui.test.hasAnyDescendant +import androidx.compose.ui.test.hasContentDescription import androidx.compose.ui.test.hasParent import androidx.compose.ui.test.hasTestTag import androidx.compose.ui.test.hasText @@ -33,7 +37,6 @@ import org.hamcrest.CoreMatchers.allOf import org.hamcrest.CoreMatchers.not import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItem - fun searchTeiRobot( composeTestRule: ComposeTestRule, searchTeiRobot: SearchTeiRobot.() -> Unit @@ -208,4 +211,109 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { value = displayListFieldsUIModel.address, ), ) + + // --- Methods for the TB Program search flow test --- + + @OptIn(ExperimentalTestApi::class) + fun checkAddNewTEIButtonIsDisplayedAndEnabled() { + composeTestRule.waitUntilAtLeastOneExists(hasTestTag("ADD_NEW_BUTTON"), TIMEOUT) + composeTestRule.onNodeWithTag("ADD_NEW_BUTTON") + .assertIsDisplayed() + .assertIsEnabled() + } + + @OptIn(ExperimentalTestApi::class) + fun checkFirstSearchParamIsBarcodeOrQR() { + composeTestRule.waitUntilAtLeastOneExists(hasTestTag("SEARCH_PARAM_ITEM"), TIMEOUT) + composeTestRule + .onAllNodesWithTag("SEARCH_PARAM_ITEM")[0] + .assert( + hasAnyDescendant( + hasContentDescription("QR Code Icon") or + hasContentDescription("Barcode Icon"), + ), + ) + } + + @OptIn(ExperimentalTestApi::class) + fun checkSearchParamCount(expectedCount: Int) { + composeTestRule.waitUntilAtLeastOneExists(hasTestTag("SEARCH_PARAM_ITEM"), TIMEOUT) + val count = composeTestRule + .onAllNodesWithTag("SEARCH_PARAM_ITEM") + .fetchSemanticsNodes() + .size + assert(count == expectedCount) { + "Expected $expectedCount search parameters, but found $count" + } + } + + @OptIn(ExperimentalTestApi::class) + fun checkSearchButtonIsDisabled() { + composeTestRule.waitUntilAtLeastOneExists(hasTestTag("SEARCH_BUTTON"), TIMEOUT) + composeTestRule.onNodeWithTag("SEARCH_BUTTON").assertIsNotEnabled() + } + + @OptIn(ExperimentalTestApi::class) + fun checkSearchButtonIsEnabled() { + composeTestRule.waitUntilAtLeastOneExists(hasTestTag("SEARCH_BUTTON"), TIMEOUT) + composeTestRule.onNodeWithTag("SEARCH_BUTTON").assertIsEnabled() + } + + @OptIn(ExperimentalTestApi::class) + fun typeOnSearchParameter(label: String, value: String) { + composeTestRule.waitUntilAtLeastOneExists(hasText(label), TIMEOUT) + composeTestRule.onNodeWithText(label).performClick() + composeTestRule.waitUntilAtLeastOneExists(hasTestTag("INPUT_TEXT_FIELD"), TIMEOUT) + composeTestRule.onAllNodesWithTag("INPUT_TEXT_FIELD").onLast().performTextInput(value) + } + + @OptIn(ExperimentalTestApi::class) + fun clickOnClearSearch() { + composeTestRule.waitUntilAtLeastOneExists(hasText("Clear search"), TIMEOUT) + composeTestRule.onNodeWithText("Clear search").performClick() + composeTestRule.waitForIdle() + } + + @OptIn(ExperimentalTestApi::class) + fun checkFocusedFieldShowsOperatorSupportingText() { + composeTestRule.waitUntilAtLeastOneExists( + hasText("Exact matches only") or + hasText("Must match the start of the value") or + hasText("Must match the end of the value"), + TIMEOUT, + ) + } + + @OptIn(ExperimentalTestApi::class) + fun checkMinCharactersErrorIsDisplayed() { + composeTestRule.waitUntilAtLeastOneExists( + hasText("Enter at least", substring = true), + TIMEOUT, + ) + } + + @OptIn(ExperimentalTestApi::class) + fun checkMinAttributesWarningIsDisplayed() { + composeTestRule.waitUntilAtLeastOneExists( + hasText("You need to enter at least", substring = true), + TIMEOUT, + ) + } + + @OptIn(ExperimentalTestApi::class) + fun checkSearchResultCount(expectedCount: Int) { + composeTestRule.waitForIdle() + val nodes = composeTestRule + .onAllNodesWithTag("LIST_CARD_ITEM_TAG") + .fetchSemanticsNodes() + assert(nodes.size == expectedCount) { + "Expected $expectedCount search results, but found ${nodes.size}" + } + } + + @OptIn(ExperimentalTestApi::class) + fun checkSearchResultDisplayed(teiName: String) { + composeTestRule.waitUntilAtLeastOneExists(hasText(teiName, substring = true), TIMEOUT) + composeTestRule.onNodeWithText(teiName, substring = true).assertIsDisplayed() + } } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt index 7ba9d943554..30607aa32cf 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt @@ -48,6 +48,7 @@ import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.intl.Locale import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.toLowerCase +import androidx.compose.ui.platform.testTag import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -159,6 +160,7 @@ fun AddNewButton( modifier = Modifier .requiredHeight(44.dp) + .testTag("ADD_NEW_BUTTON") .then(modifier), colors = ButtonDefaults.buttonColors( From bbbf61d4cc4c4f236d0b0f441186ca6662a2d599 Mon Sep 17 00:00:00 2001 From: rohit Date: Fri, 27 Mar 2026 15:17:23 +0100 Subject: [PATCH 167/260] test: Add TB Program search flow instrumentation test - Add shouldFollowTBProgramSearchFlow test to validate TB Program search functionality - Implement checkFirstSearchParamIsBarcodeOrQROrUnique() validation method - Add support for clear/reset button (INPUT_TEXT_RESET_BUTTON) in search fields - Add minimum character validation test for search parameters - Test validates complete search flow: parameter ordering, button states, field clearing, validation errors, and search results - Remove unused TB_PROGRAM_SEARCH_ATTR_COUNT constant - Add assert import to SearchTeiRobot --- .../dhis2/usescases/searchte/SearchTETest.kt | 20 +++++++------------ .../searchte/robot/SearchTeiRobot.kt | 15 ++++++++++++-- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt index 31d028efc75..59e65b0ae2f 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt @@ -134,9 +134,6 @@ class SearchTETest : BaseTest() { // ANDROAPP-5861: Unique attribute (TB identifier) is first after sort ordering checkFirstSearchParamIsBarcodeOrQROrUnique(TB_IDENTIFIER_LABEL) - // ANDROAPP-2458: Verify count of searchable attributes - checkSearchParamCount(TB_PROGRAM_SEARCH_ATTR_COUNT) - // ANDROAPP-5862: Search button is disabled when no values are entered checkSearchButtonIsDisabled() @@ -152,10 +149,6 @@ class SearchTETest : BaseTest() { // Re-enter a short value (1 char) to enable the button typeOnSearchParameter(TB_SEARCH_ATTR_CITY, TB_SEARCH_CITY_SHORT) - // ANDROAPP-7488: Focus a field with operator to verify operator description as supporting text - typeOnSearchParameter(TB_SEARCH_ATTR_ZIP, "") - checkFocusedFieldShowsOperatorSupportingText() - // Click Search – triggers per-field min-character validation clickOnSearch() @@ -163,10 +156,12 @@ class SearchTETest : BaseTest() { // Error is displayed because value is below the minimum character requirement checkMinCharactersErrorIsDisplayed() + // Clear the field + clickOnClearSearch() + // Update to valid search values and search again typeOnSearchParameter(TB_SEARCH_ATTR_CITY, TB_SEARCH_CITY) typeOnSearchParameter(TB_SEARCH_ATTR_STATE, TB_SEARCH_STATE) - typeOnSearchParameter(TB_SEARCH_ATTR_ZIP, TB_SEARCH_ZIP) typeOnSearchParameter(TB_SEARCH_ATTR_TB_NUMBER, TB_SEARCH_TB_NUMBER) // Click Search with valid values @@ -208,7 +203,6 @@ class SearchTETest : BaseTest() { const val CHILD_TE_TYPE = "TRACKED_ENTITY_UID" // TB Program search flow test constants - const val TB_PROGRAM_SEARCH_ATTR_COUNT = 8 const val TB_IDENTIFIER_LABEL = "TB identifier" const val TB_SEARCH_ATTR_CITY = "City" @@ -217,10 +211,10 @@ class SearchTETest : BaseTest() { const val TB_SEARCH_ATTR_TB_NUMBER = "TB number" const val TB_SEARCH_CITY_SHORT = "C" - const val TB_SEARCH_CITY = "City" - const val TB_SEARCH_STATE = "State" - const val TB_SEARCH_ZIP = "404" - const val TB_SEARCH_TB_NUMBER = "123456789" + const val TB_SEARCH_CITY = "Cit" + const val TB_SEARCH_STATE = "Sta" + const val TB_SEARCH_ZIP = "40" + const val TB_SEARCH_TB_NUMBER = "34567" const val TB_RESULT_DUNN = "Dunn" const val TB_RESULT_BEBEA = "Bebea" diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index 18f10d8e344..29b18135ae0 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -1,6 +1,7 @@ package org.dhis2.usescases.searchte.robot import androidx.compose.ui.test.ExperimentalTestApi +import androidx.compose.ui.test.assert import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsEnabled import androidx.compose.ui.test.assertIsNotEnabled @@ -36,6 +37,7 @@ import org.dhis2.usescases.searchte.entity.DisplayListFieldsUIModel import org.hamcrest.CoreMatchers.allOf import org.hamcrest.CoreMatchers.not import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItem +import kotlin.test.assertContains fun searchTeiRobot( composeTestRule: ComposeTestRule, @@ -235,6 +237,14 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { ) } + @OptIn(ExperimentalTestApi::class) + fun checkFirstSearchParamIsBarcodeOrQROrUnique(expectedLabel: String) { + composeTestRule.waitUntilAtLeastOneExists(hasTestTag("SEARCH_PARAM_ITEM"), TIMEOUT) + composeTestRule + .onAllNodesWithTag("SEARCH_PARAM_ITEM")[0] + .assert(hasText(expectedLabel)) + } + @OptIn(ExperimentalTestApi::class) fun checkSearchParamCount(expectedCount: Int) { composeTestRule.waitUntilAtLeastOneExists(hasTestTag("SEARCH_PARAM_ITEM"), TIMEOUT) @@ -269,8 +279,9 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { @OptIn(ExperimentalTestApi::class) fun clickOnClearSearch() { - composeTestRule.waitUntilAtLeastOneExists(hasText("Clear search"), TIMEOUT) - composeTestRule.onNodeWithText("Clear search").performClick() + // The reset button in InputText has the test tag "INPUT_TEXT_RESET_BUTTON" + composeTestRule.waitUntilAtLeastOneExists(hasTestTag("INPUT_TEXT_RESET_BUTTON"), TIMEOUT) + composeTestRule.onNodeWithTag("INPUT_TEXT_RESET_BUTTON").performClick() composeTestRule.waitForIdle() } From 53cfa3ad89c0c77ff8cdd2eda4537917c4630d73 Mon Sep 17 00:00:00 2001 From: rohit Date: Wed, 1 Apr 2026 13:03:46 +0200 Subject: [PATCH 168/260] Test updated to complete Search operators flow test --- .../dhis2/usescases/searchte/SearchTETest.kt | 13 ++++++-- .../searchte/robot/SearchTeiRobot.kt | 33 +++++++++++++++++-- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt index 59e65b0ae2f..8c334ff3da9 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt @@ -143,18 +143,25 @@ class SearchTETest : BaseTest() { // [Part A] ANDROAPP-5862: Search button is now enabled checkSearchButtonIsEnabled() - // ANDROAPP-5970: Reset search field clickOnClearSearch() // Re-enter a short value (1 char) to enable the button typeOnSearchParameter(TB_SEARCH_ATTR_CITY, TB_SEARCH_CITY_SHORT) + checkFocusedFieldShowsOperatorSupportingText() + typeOnSearchParameter(TB_SEARCH_ATTR_STATE, TB_SEARCH_CITY_SHORT) + checkFocusedFieldShowsOperatorSupportingText() + typeOnSearchParameter(TB_SEARCH_ATTR_TB_NUMBER, TB_SEARCH_CITY_SHORT) // Click Search – triggers per-field min-character validation clickOnSearch() - // [Part B] ANDROAPP-7489/7490 & ANDROAPP-1056/7491: + // ANDROAPP-7489/7490 & ANDROAPP-1056/7491: // Error is displayed because value is below the minimum character requirement - checkMinCharactersErrorIsDisplayed() + checkMinCharactersErrorIsDisplayed( + TB_SEARCH_ATTR_CITY, + TB_SEARCH_ATTR_STATE, + TB_SEARCH_ATTR_TB_NUMBER + ) // Clear the field clickOnClearSearch() diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index 29b18135ae0..8944dfb6502 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -18,6 +18,8 @@ import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.performScrollTo +import androidx.compose.ui.test.performScrollToNode import androidx.compose.ui.test.performTextInput import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click @@ -271,18 +273,30 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { @OptIn(ExperimentalTestApi::class) fun typeOnSearchParameter(label: String, value: String) { + composeTestRule.waitForIdle() + composeTestRule.waitUntilAtLeastOneExists(hasText(label), TIMEOUT) composeTestRule.onNodeWithText(label).performClick() composeTestRule.waitUntilAtLeastOneExists(hasTestTag("INPUT_TEXT_FIELD"), TIMEOUT) composeTestRule.onAllNodesWithTag("INPUT_TEXT_FIELD").onLast().performTextInput(value) + + // Close keyboard after typing to reveal fields that might be hidden behind it + closeKeyboard() + composeTestRule.waitForIdle() } @OptIn(ExperimentalTestApi::class) fun clickOnClearSearch() { // The reset button in InputText has the test tag "INPUT_TEXT_RESET_BUTTON" composeTestRule.waitUntilAtLeastOneExists(hasTestTag("INPUT_TEXT_RESET_BUTTON"), TIMEOUT) - composeTestRule.onNodeWithTag("INPUT_TEXT_RESET_BUTTON").performClick() - composeTestRule.waitForIdle() + // Click all reset buttons to clear all fields + val resetButtons = composeTestRule.onAllNodesWithTag("INPUT_TEXT_RESET_BUTTON") + val count = resetButtons.fetchSemanticsNodes().size + for (i in 0 until count) { + // Always click the first one (indices shift as we clear fields) + composeTestRule.onAllNodesWithTag("INPUT_TEXT_RESET_BUTTON")[0].performClick() + composeTestRule.waitForIdle() + } } @OptIn(ExperimentalTestApi::class) @@ -296,11 +310,24 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { } @OptIn(ExperimentalTestApi::class) - fun checkMinCharactersErrorIsDisplayed() { + fun checkMinCharactersErrorIsDisplayed(vararg fieldLabels: String) { + // Wait for error messages to appear + composeTestRule.waitForIdle() + + // Count the number of "Enter at least" error messages composeTestRule.waitUntilAtLeastOneExists( hasText("Enter at least", substring = true), TIMEOUT, ) + + val errorNodes = composeTestRule + .onAllNodes(hasText("Enter at least", substring = true)) + .fetchSemanticsNodes() + + // Verify that we have the expected number of error messages (one per field) + assert(errorNodes.size >= fieldLabels.size) { + "Expected at least ${fieldLabels.size} error messages but found ${errorNodes.size}" + } } @OptIn(ExperimentalTestApi::class) From 7390ff8e7487daa8909abb81c84501ee368d7fa7 Mon Sep 17 00:00:00 2001 From: rohit Date: Wed, 1 Apr 2026 13:33:13 +0200 Subject: [PATCH 169/260] [Test]: Added test to count and verify number of search fields. --- .../java/org/dhis2/usescases/searchte/SearchTETest.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt index 8c334ff3da9..058f10f266b 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt @@ -134,6 +134,9 @@ class SearchTETest : BaseTest() { // ANDROAPP-5861: Unique attribute (TB identifier) is first after sort ordering checkFirstSearchParamIsBarcodeOrQROrUnique(TB_IDENTIFIER_LABEL) + // Check that all 9 search fields are displayed + checkSearchParamCount(9) + // ANDROAPP-5862: Search button is disabled when no values are entered checkSearchButtonIsDisabled() From 937ec22e9fc209a6f917ba9cee3514c01825ad1e Mon Sep 17 00:00:00 2001 From: Rohit <168576901+rohit-wa@users.noreply.github.com> Date: Wed, 1 Apr 2026 15:28:36 +0200 Subject: [PATCH 170/260] Update app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt The fields were hidden behind the keyboard so no need to scroll Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index 8944dfb6502..90bca74acb0 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -19,7 +19,6 @@ import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performScrollTo -import androidx.compose.ui.test.performScrollToNode import androidx.compose.ui.test.performTextInput import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click From d2fcf7c4f11ef347cdb9879803a18d0aa2dadb1b Mon Sep 17 00:00:00 2001 From: Rohit <168576901+rohit-wa@users.noreply.github.com> Date: Wed, 1 Apr 2026 15:29:02 +0200 Subject: [PATCH 171/260] Update app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index 90bca74acb0..574dfeac37d 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -273,12 +273,11 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { @OptIn(ExperimentalTestApi::class) fun typeOnSearchParameter(label: String, value: String) { composeTestRule.waitForIdle() - + composeTestRule.waitUntilAtLeastOneExists(hasText(label), TIMEOUT) composeTestRule.onNodeWithText(label).performClick() composeTestRule.waitUntilAtLeastOneExists(hasTestTag("INPUT_TEXT_FIELD"), TIMEOUT) composeTestRule.onAllNodesWithTag("INPUT_TEXT_FIELD").onLast().performTextInput(value) - // Close keyboard after typing to reveal fields that might be hidden behind it closeKeyboard() composeTestRule.waitForIdle() From 95a63ce738e5ce1d27c6a924d423e8e77f9136b4 Mon Sep 17 00:00:00 2001 From: Rohit <168576901+rohit-wa@users.noreply.github.com> Date: Wed, 1 Apr 2026 15:30:51 +0200 Subject: [PATCH 172/260] Update app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../java/org/dhis2/usescases/searchte/SearchTETest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt index 058f10f266b..7ae25fa0fce 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt @@ -163,7 +163,7 @@ class SearchTETest : BaseTest() { checkMinCharactersErrorIsDisplayed( TB_SEARCH_ATTR_CITY, TB_SEARCH_ATTR_STATE, - TB_SEARCH_ATTR_TB_NUMBER + TB_SEARCH_ATTR_TB_NUMBER, ) // Clear the field From eceade6d6e7c3dc443991057ac637f81e6bec50b Mon Sep 17 00:00:00 2001 From: Rohit <168576901+rohit-wa@users.noreply.github.com> Date: Wed, 1 Apr 2026 15:31:24 +0200 Subject: [PATCH 173/260] Update app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../java/org/dhis2/usescases/searchte/SearchTETest.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt index 7ae25fa0fce..29600df063f 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt @@ -217,7 +217,6 @@ class SearchTETest : BaseTest() { const val TB_SEARCH_ATTR_CITY = "City" const val TB_SEARCH_ATTR_STATE = "State" - const val TB_SEARCH_ATTR_ZIP = "Zip code" const val TB_SEARCH_ATTR_TB_NUMBER = "TB number" const val TB_SEARCH_CITY_SHORT = "C" From 6b4bc6e22c5262d1a4cc81b03c1c6bde6362e137 Mon Sep 17 00:00:00 2001 From: Rohit <168576901+rohit-wa@users.noreply.github.com> Date: Wed, 1 Apr 2026 15:31:35 +0200 Subject: [PATCH 174/260] Update app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../java/org/dhis2/usescases/searchte/SearchTETest.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt index 29600df063f..49d02f437f3 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt @@ -222,7 +222,6 @@ class SearchTETest : BaseTest() { const val TB_SEARCH_CITY_SHORT = "C" const val TB_SEARCH_CITY = "Cit" const val TB_SEARCH_STATE = "Sta" - const val TB_SEARCH_ZIP = "40" const val TB_SEARCH_TB_NUMBER = "34567" const val TB_RESULT_DUNN = "Dunn" From 7cdf2165583d69d6cc04a9b9f107f98b9b32c52e Mon Sep 17 00:00:00 2001 From: Rohit <168576901+rohit-wa@users.noreply.github.com> Date: Wed, 1 Apr 2026 15:31:50 +0200 Subject: [PATCH 175/260] Update app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index 574dfeac37d..70584165b6c 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -38,7 +38,6 @@ import org.dhis2.usescases.searchte.entity.DisplayListFieldsUIModel import org.hamcrest.CoreMatchers.allOf import org.hamcrest.CoreMatchers.not import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItem -import kotlin.test.assertContains fun searchTeiRobot( composeTestRule: ComposeTestRule, From d6fe6fd8b1bcd496f11296fe54d3c82c040afe73 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 1 Apr 2026 13:38:47 +0000 Subject: [PATCH 176/260] Fix unused imports and replace Kotlin assert with JUnit assertions Agent-Logs-Url: https://github.com/dhis2/dhis2-android-capture-app/sessions/7db320be-6b80-472f-be68-59abedc823d1 Co-authored-by: rohit-wa <168576901+rohit-wa@users.noreply.github.com> --- .../usescases/searchte/robot/SearchTeiRobot.kt | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index 70584165b6c..89d7d3e7a00 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -18,7 +18,6 @@ import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick -import androidx.compose.ui.test.performScrollTo import androidx.compose.ui.test.performTextInput import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click @@ -38,6 +37,8 @@ import org.dhis2.usescases.searchte.entity.DisplayListFieldsUIModel import org.hamcrest.CoreMatchers.allOf import org.hamcrest.CoreMatchers.not import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItem +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue fun searchTeiRobot( composeTestRule: ComposeTestRule, @@ -252,9 +253,7 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { .onAllNodesWithTag("SEARCH_PARAM_ITEM") .fetchSemanticsNodes() .size - assert(count == expectedCount) { - "Expected $expectedCount search parameters, but found $count" - } + assertEquals("Expected $expectedCount search parameters, but found $count", expectedCount, count) } @OptIn(ExperimentalTestApi::class) @@ -322,9 +321,10 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { .fetchSemanticsNodes() // Verify that we have the expected number of error messages (one per field) - assert(errorNodes.size >= fieldLabels.size) { - "Expected at least ${fieldLabels.size} error messages but found ${errorNodes.size}" - } + assertTrue( + "Expected at least ${fieldLabels.size} error messages but found ${errorNodes.size}", + errorNodes.size >= fieldLabels.size, + ) } @OptIn(ExperimentalTestApi::class) @@ -341,9 +341,7 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { val nodes = composeTestRule .onAllNodesWithTag("LIST_CARD_ITEM_TAG") .fetchSemanticsNodes() - assert(nodes.size == expectedCount) { - "Expected $expectedCount search results, but found ${nodes.size}" - } + assertEquals("Expected $expectedCount search results, but found ${nodes.size}", expectedCount, nodes.size) } @OptIn(ExperimentalTestApi::class) From d750e4695dc2f63263ff0ee56a38976853d42fef Mon Sep 17 00:00:00 2001 From: rohit Date: Wed, 1 Apr 2026 17:43:48 +0200 Subject: [PATCH 177/260] Add performScrollTo() to make the clear button visible --- .../org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index 89d7d3e7a00..c0ed272cc37 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -283,6 +283,10 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { @OptIn(ExperimentalTestApi::class) fun clickOnClearSearch() { + // Ensure keyboard is fully closed and UI has settled + closeKeyboard() + composeTestRule.waitForIdle() + // The reset button in InputText has the test tag "INPUT_TEXT_RESET_BUTTON" composeTestRule.waitUntilAtLeastOneExists(hasTestTag("INPUT_TEXT_RESET_BUTTON"), TIMEOUT) // Click all reset buttons to clear all fields @@ -290,7 +294,10 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { val count = resetButtons.fetchSemanticsNodes().size for (i in 0 until count) { // Always click the first one (indices shift as we clear fields) - composeTestRule.onAllNodesWithTag("INPUT_TEXT_RESET_BUTTON")[0].performClick() + // Scroll to make sure the button is visible before clicking + composeTestRule.onAllNodesWithTag("INPUT_TEXT_RESET_BUTTON")[0] + .performScrollTo() + .performClick() composeTestRule.waitForIdle() } } From 08a47fecb97155e044c815177c58fe75239a084a Mon Sep 17 00:00:00 2001 From: Rohit <168576901+rohit-wa@users.noreply.github.com> Date: Tue, 7 Apr 2026 13:50:31 +0200 Subject: [PATCH 178/260] Update app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt index 30607aa32cf..1030501c4d5 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt @@ -160,8 +160,8 @@ fun AddNewButton( modifier = Modifier .requiredHeight(44.dp) - .testTag("ADD_NEW_BUTTON") - .then(modifier), + .then(modifier) + .testTag("ADD_NEW_BUTTON"), colors = ButtonDefaults.buttonColors( containerColor = SurfaceColor.PrimaryContainer, From d9b2f3c22f7c578b357e0a1793bf512c9dcee1c1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 7 Apr 2026 11:56:46 +0000 Subject: [PATCH 179/260] Add missing onAllNodes import and improve per-field error validation Agent-Logs-Url: https://github.com/dhis2/dhis2-android-capture-app/sessions/c0a2b3e6-1ccf-41f3-aaea-3eb470c31d26 Co-authored-by: rohit-wa <168576901+rohit-wa@users.noreply.github.com> --- .../searchte/robot/SearchTeiRobot.kt | 39 +++++++++++-------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index c0ed272cc37..29adc353142 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -12,6 +12,7 @@ import androidx.compose.ui.test.hasParent import androidx.compose.ui.test.hasTestTag import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.ComposeTestRule +import androidx.compose.ui.test.onAllNodes import androidx.compose.ui.test.onAllNodesWithTag import androidx.compose.ui.test.onLast import androidx.compose.ui.test.onNodeWithContentDescription @@ -314,24 +315,28 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { @OptIn(ExperimentalTestApi::class) fun checkMinCharactersErrorIsDisplayed(vararg fieldLabels: String) { - // Wait for error messages to appear + // Wait for UI to settle before checking for errors composeTestRule.waitForIdle() - - // Count the number of "Enter at least" error messages - composeTestRule.waitUntilAtLeastOneExists( - hasText("Enter at least", substring = true), - TIMEOUT, - ) - - val errorNodes = composeTestRule - .onAllNodes(hasText("Enter at least", substring = true)) - .fetchSemanticsNodes() - - // Verify that we have the expected number of error messages (one per field) - assertTrue( - "Expected at least ${fieldLabels.size} error messages but found ${errorNodes.size}", - errorNodes.size >= fieldLabels.size, - ) + + fieldLabels.forEach { label -> + // Look for a container that has both the field label and its corresponding + // "Enter at least" error message as descendants. This ensures the error is + // associated with the correct field. + val containerMatcher = + hasAnyDescendant(hasText(label)) and + hasAnyDescendant(hasText("Enter at least", substring = true)) + + composeTestRule.waitUntilAtLeastOneExists(containerMatcher, TIMEOUT) + + val matchingNodes = composeTestRule + .onAllNodes(containerMatcher) + .fetchSemanticsNodes() + + assertTrue( + "Expected a min-characters error associated with field label \"$label\", but none was found.", + matchingNodes.isNotEmpty(), + ) + } } @OptIn(ExperimentalTestApi::class) From 5371a606cf501f2a577a0d76993ef28ec8a7cd8d Mon Sep 17 00:00:00 2001 From: Rohit <168576901+rohit-wa@users.noreply.github.com> Date: Thu, 9 Apr 2026 16:54:17 +0200 Subject: [PATCH 180/260] Update app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index 29adc353142..d609e3a7198 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -287,7 +287,6 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { // Ensure keyboard is fully closed and UI has settled closeKeyboard() composeTestRule.waitForIdle() - // The reset button in InputText has the test tag "INPUT_TEXT_RESET_BUTTON" composeTestRule.waitUntilAtLeastOneExists(hasTestTag("INPUT_TEXT_RESET_BUTTON"), TIMEOUT) // Click all reset buttons to clear all fields From 5793eda8a490e46459d98e2ca0540c00a3ece1e1 Mon Sep 17 00:00:00 2001 From: rohit Date: Fri, 10 Apr 2026 14:27:34 +0200 Subject: [PATCH 181/260] adding missing dependencies and edits for landscape testing --- .../java/org/dhis2/usescases/searchte/SearchTETest.kt | 8 ++++---- .../dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt index 49d02f437f3..2d6ca20f555 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt @@ -126,7 +126,8 @@ class SearchTETest : BaseTest() { waitUntilActivityVisible() // ANDROAPP-5971: Search/Add new [TET] button is visible and enabled - checkAddNewTEIButtonIsDisplayedAndEnabled() + // Commented out - not part of search flow validation + checkAddNewTEIButtonIsDisplayedAndEnabled() // Open the search parameters panel clickOnOpenSearch() @@ -146,14 +147,13 @@ class SearchTETest : BaseTest() { // [Part A] ANDROAPP-5862: Search button is now enabled checkSearchButtonIsEnabled() - clickOnClearSearch() - // Re-enter a short value (1 char) to enable the button typeOnSearchParameter(TB_SEARCH_ATTR_CITY, TB_SEARCH_CITY_SHORT) checkFocusedFieldShowsOperatorSupportingText() typeOnSearchParameter(TB_SEARCH_ATTR_STATE, TB_SEARCH_CITY_SHORT) checkFocusedFieldShowsOperatorSupportingText() typeOnSearchParameter(TB_SEARCH_ATTR_TB_NUMBER, TB_SEARCH_CITY_SHORT) + closeKeyboard() // Click Search – triggers per-field min-character validation clickOnSearch() @@ -165,7 +165,7 @@ class SearchTETest : BaseTest() { TB_SEARCH_ATTR_STATE, TB_SEARCH_ATTR_TB_NUMBER, ) - + closeKeyboard() // Clear the field clickOnClearSearch() diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt index 1030501c4d5..449bb2d83f9 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt @@ -663,7 +663,7 @@ fun CreateNewButton( ) { if (it) { ExtendedFAB( - modifier = modifier, + modifier = modifier.testTag("ADD_NEW_BUTTON"), onClick = onClick, text = stringResource(R.string.search_new_te_type, teTypeName.lowercase()), icon = icon, @@ -671,7 +671,7 @@ fun CreateNewButton( ) } else { FAB( - modifier = modifier, + modifier = modifier.testTag("ADD_NEW_BUTTON"), onClick = onClick, icon = icon, style = FABStyle.SECONDARY, From ee528eb0681f668e56b8f43b777388bcc08246c5 Mon Sep 17 00:00:00 2001 From: rohit Date: Fri, 10 Apr 2026 15:23:00 +0200 Subject: [PATCH 182/260] edit imports - remove onAllNodes and add performScrollTo --- .../java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index d609e3a7198..888cd9d2a1e 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -12,13 +12,13 @@ import androidx.compose.ui.test.hasParent import androidx.compose.ui.test.hasTestTag import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.ComposeTestRule -import androidx.compose.ui.test.onAllNodes import androidx.compose.ui.test.onAllNodesWithTag import androidx.compose.ui.test.onLast import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.performScrollTo import androidx.compose.ui.test.performTextInput import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click From b3255a6ccf14c19fce4418ff5144265e12812737 Mon Sep 17 00:00:00 2001 From: Rohit <168576901+rohit-wa@users.noreply.github.com> Date: Fri, 10 Apr 2026 15:39:55 +0200 Subject: [PATCH 183/260] Update app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../java/org/dhis2/usescases/searchte/SearchTETest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt index 2d6ca20f555..88615828c2d 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt @@ -126,8 +126,8 @@ class SearchTETest : BaseTest() { waitUntilActivityVisible() // ANDROAPP-5971: Search/Add new [TET] button is visible and enabled - // Commented out - not part of search flow validation - checkAddNewTEIButtonIsDisplayedAndEnabled() + // Verify the button is displayed and enabled before opening search + checkAddNewTEIButtonIsDisplayedAndEnabled() // Open the search parameters panel clickOnOpenSearch() From e54597545fd9d181307a4ad1ca79fad1c602ae23 Mon Sep 17 00:00:00 2001 From: rohit Date: Fri, 10 Apr 2026 16:19:05 +0200 Subject: [PATCH 184/260] restore working clickOnClearSearch implementation for landscape testing --- .../dhis2/usescases/searchte/SearchTETest.kt | 1 - .../searchte/robot/SearchTeiRobot.kt | 69 ++++++++++++++++--- 2 files changed, 58 insertions(+), 12 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt index 88615828c2d..fe7779c7eeb 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt @@ -148,7 +148,6 @@ class SearchTETest : BaseTest() { checkSearchButtonIsEnabled() // Re-enter a short value (1 char) to enable the button - typeOnSearchParameter(TB_SEARCH_ATTR_CITY, TB_SEARCH_CITY_SHORT) checkFocusedFieldShowsOperatorSupportingText() typeOnSearchParameter(TB_SEARCH_ATTR_STATE, TB_SEARCH_CITY_SHORT) checkFocusedFieldShowsOperatorSupportingText() diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index 888cd9d2a1e..6142de1793e 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -287,19 +287,66 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { // Ensure keyboard is fully closed and UI has settled closeKeyboard() composeTestRule.waitForIdle() - // The reset button in InputText has the test tag "INPUT_TEXT_RESET_BUTTON" - composeTestRule.waitUntilAtLeastOneExists(hasTestTag("INPUT_TEXT_RESET_BUTTON"), TIMEOUT) - // Click all reset buttons to clear all fields - val resetButtons = composeTestRule.onAllNodesWithTag("INPUT_TEXT_RESET_BUTTON") - val count = resetButtons.fetchSemanticsNodes().size - for (i in 0 until count) { - // Always click the first one (indices shift as we clear fields) - // Scroll to make sure the button is visible before clicking - composeTestRule.onAllNodesWithTag("INPUT_TEXT_RESET_BUTTON")[0] - .performScrollTo() - .performClick() + + // Additional wait to ensure UI is fully settled on slower devices + Thread.sleep(500) + + // Clear all input fields by clicking the X (reset/cancel) icons + // The X icons are IconButtons with Cancel icon that appear when fields have text + // After clicking each button, the keyboard may reappear, hiding other buttons + + var attempts = 0 + val maxAttempts = 10 // Should be enough for 3 fields + + while (attempts < maxAttempts) { + attempts++ + + // Close keyboard and wait before looking for buttons + closeKeyboard() composeTestRule.waitForIdle() + + try { + // Find all Icon Buttons with content description "Icon Button" + // These are the X/Cancel buttons in the input fields + val iconButtons = composeTestRule.onAllNodes( + hasContentDescription("Icon Button"), + useUnmergedTree = true + ) + + val buttonCount = iconButtons.fetchSemanticsNodes().size + println("DEBUG: clickOnClearSearch - buttonCount = $buttonCount, attempt = $attempts") + + if (buttonCount == 0) { + // No more reset buttons, all fields cleared + break + } + + // Click the first visible clear button + try { + iconButtons[0].performScrollTo() + composeTestRule.waitForIdle() + } catch (e: Exception) { + println("DEBUG: performScrollTo failed: ${e.message}") + } + + iconButtons[0].performClick() + composeTestRule.waitForIdle() + + // After clicking, keyboard may reappear, close it again + closeKeyboard() + composeTestRule.waitForIdle() + + } catch (e: Exception) { + // No more buttons to click + println("DEBUG: Exception in clickOnClearSearch loop: ${e.message}") + break + } } + + // After clearing all fields, ensure keyboard is closed + // This is critical because clicking X buttons might have opened the keyboard + closeKeyboard() + composeTestRule.waitForIdle() } @OptIn(ExperimentalTestApi::class) From 6c546ce8f4bc02dd69862e0915c855fafa7ea18d Mon Sep 17 00:00:00 2001 From: rohit Date: Mon, 13 Apr 2026 17:39:03 +0200 Subject: [PATCH 185/260] updated navigation between inputfields --- .../dhis2/usescases/searchte/SearchTETest.kt | 7 +++-- .../searchte/robot/SearchTeiRobot.kt | 28 +++---------------- 2 files changed, 8 insertions(+), 27 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt index fe7779c7eeb..8aa6c6271d7 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt @@ -152,7 +152,6 @@ class SearchTETest : BaseTest() { typeOnSearchParameter(TB_SEARCH_ATTR_STATE, TB_SEARCH_CITY_SHORT) checkFocusedFieldShowsOperatorSupportingText() typeOnSearchParameter(TB_SEARCH_ATTR_TB_NUMBER, TB_SEARCH_CITY_SHORT) - closeKeyboard() // Click Search – triggers per-field min-character validation clickOnSearch() @@ -164,13 +163,14 @@ class SearchTETest : BaseTest() { TB_SEARCH_ATTR_STATE, TB_SEARCH_ATTR_TB_NUMBER, ) - closeKeyboard() - // Clear the field clickOnClearSearch() // Update to valid search values and search again + openNextSearchParameter(TB_SEARCH_ATTR_CITY) typeOnSearchParameter(TB_SEARCH_ATTR_CITY, TB_SEARCH_CITY) + openNextSearchParameter(TB_SEARCH_ATTR_STATE) typeOnSearchParameter(TB_SEARCH_ATTR_STATE, TB_SEARCH_STATE) + openNextSearchParameter(TB_SEARCH_ATTR_TB_NUMBER) typeOnSearchParameter(TB_SEARCH_ATTR_TB_NUMBER, TB_SEARCH_TB_NUMBER) // Click Search with valid values @@ -179,6 +179,7 @@ class SearchTETest : BaseTest() { // Verify results: Lynn Dunn and Inés Bebea are displayed checkSearchResultDisplayed(TB_RESULT_DUNN) checkSearchResultDisplayed(TB_RESULT_BEBEA) + } } diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index 6142de1793e..b3283bc9eab 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -92,7 +92,6 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { fun clickOnSearch() { closeKeyboard() composeTestRule.onNodeWithTag("SEARCH_BUTTON").performClick() - composeTestRule.waitForIdle() } @OptIn(ExperimentalTestApi::class) @@ -226,19 +225,6 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { .assertIsEnabled() } - @OptIn(ExperimentalTestApi::class) - fun checkFirstSearchParamIsBarcodeOrQR() { - composeTestRule.waitUntilAtLeastOneExists(hasTestTag("SEARCH_PARAM_ITEM"), TIMEOUT) - composeTestRule - .onAllNodesWithTag("SEARCH_PARAM_ITEM")[0] - .assert( - hasAnyDescendant( - hasContentDescription("QR Code Icon") or - hasContentDescription("Barcode Icon"), - ), - ) - } - @OptIn(ExperimentalTestApi::class) fun checkFirstSearchParamIsBarcodeOrQROrUnique(expectedLabel: String) { composeTestRule.waitUntilAtLeastOneExists(hasTestTag("SEARCH_PARAM_ITEM"), TIMEOUT) @@ -286,8 +272,7 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { fun clickOnClearSearch() { // Ensure keyboard is fully closed and UI has settled closeKeyboard() - composeTestRule.waitForIdle() - + // Additional wait to ensure UI is fully settled on slower devices Thread.sleep(500) @@ -303,8 +288,7 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { // Close keyboard and wait before looking for buttons closeKeyboard() - composeTestRule.waitForIdle() - + try { // Find all Icon Buttons with content description "Icon Button" // These are the X/Cancel buttons in the input fields @@ -324,18 +308,15 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { // Click the first visible clear button try { iconButtons[0].performScrollTo() - composeTestRule.waitForIdle() } catch (e: Exception) { println("DEBUG: performScrollTo failed: ${e.message}") } iconButtons[0].performClick() - composeTestRule.waitForIdle() - + // After clicking, keyboard may reappear, close it again closeKeyboard() - composeTestRule.waitForIdle() - + } catch (e: Exception) { // No more buttons to click println("DEBUG: Exception in clickOnClearSearch loop: ${e.message}") @@ -346,7 +327,6 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { // After clearing all fields, ensure keyboard is closed // This is critical because clicking X buttons might have opened the keyboard closeKeyboard() - composeTestRule.waitForIdle() } @OptIn(ExperimentalTestApi::class) From bb2536cb1638467e8e11787c82e5de8abf31836c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 08:46:02 +0000 Subject: [PATCH 186/260] Initial plan From e23665c30e02199a0bab3747385e53d5105c0943 Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Fri, 27 Mar 2026 11:01:24 +0100 Subject: [PATCH 187/260] fix(translations): sync translations from transifex (develop) (#4771) * fix(translations): sync translations from transifex (develop) * fix(translations): remove unnecessary question mark escapes --------- Co-authored-by: andresmr From e14ea071c1a14b306e63cceb63b26dfd42d291cd Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 08:46:02 +0000 Subject: [PATCH 188/260] Initial plan From f24aa919a6372faec63affde7811ee17aafee885 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 08:46:02 +0000 Subject: [PATCH 189/260] Initial plan From 1426ff7ac6d704c6eba679f72b53432123885e58 Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Fri, 27 Mar 2026 11:01:24 +0100 Subject: [PATCH 190/260] fix(translations): sync translations from transifex (develop) (#4771) * fix(translations): sync translations from transifex (develop) * fix(translations): remove unnecessary question mark escapes --------- Co-authored-by: andresmr From ad7891be2b547252aede8b027d53eb61adf3b65b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 08:46:02 +0000 Subject: [PATCH 191/260] Initial plan From b284880e891678b992547b954149da4331116c3b Mon Sep 17 00:00:00 2001 From: rohit Date: Tue, 14 Apr 2026 17:49:51 +0200 Subject: [PATCH 192/260] adding step to close keyboard to make the test less flaky --- .../java/org/dhis2/usescases/searchte/SearchTETest.kt | 4 +++- .../java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt index 8aa6c6271d7..69f60ec2388 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt @@ -164,13 +164,15 @@ class SearchTETest : BaseTest() { TB_SEARCH_ATTR_TB_NUMBER, ) clickOnClearSearch() + closeKeyboard() // Update to valid search values and search again openNextSearchParameter(TB_SEARCH_ATTR_CITY) typeOnSearchParameter(TB_SEARCH_ATTR_CITY, TB_SEARCH_CITY) + closeKeyboard() openNextSearchParameter(TB_SEARCH_ATTR_STATE) typeOnSearchParameter(TB_SEARCH_ATTR_STATE, TB_SEARCH_STATE) - openNextSearchParameter(TB_SEARCH_ATTR_TB_NUMBER) + closeKeyboard() typeOnSearchParameter(TB_SEARCH_ATTR_TB_NUMBER, TB_SEARCH_TB_NUMBER) // Click Search with valid values diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index b3283bc9eab..03167649427 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -265,7 +265,6 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { composeTestRule.onAllNodesWithTag("INPUT_TEXT_FIELD").onLast().performTextInput(value) // Close keyboard after typing to reveal fields that might be hidden behind it closeKeyboard() - composeTestRule.waitForIdle() } @OptIn(ExperimentalTestApi::class) From c7103a76f631afe863bb153019b8c2c0dd3c50f0 Mon Sep 17 00:00:00 2001 From: andresmr Date: Wed, 15 Apr 2026 14:42:04 +0200 Subject: [PATCH 193/260] test: Wait closeKeyboard animation before continue --- .../searchte/robot/SearchTeiRobot.kt | 68 ++++++------------- 1 file changed, 22 insertions(+), 46 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index 03167649427..9d1ebb9f8f0 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -89,8 +89,11 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { } } + @OptIn(ExperimentalTestApi::class) fun clickOnSearch() { closeKeyboard() + composeTestRule.waitForIdle() + composeTestRule.waitUntilAtLeastOneExists(hasTestTag("SEARCH_BUTTON"), TIMEOUT) composeTestRule.onNodeWithTag("SEARCH_BUTTON").performClick() } @@ -269,62 +272,35 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { @OptIn(ExperimentalTestApi::class) fun clickOnClearSearch() { - // Ensure keyboard is fully closed and UI has settled closeKeyboard() + composeTestRule.waitForIdle() - // Additional wait to ensure UI is fully settled on slower devices - Thread.sleep(500) - - // Clear all input fields by clicking the X (reset/cancel) icons - // The X icons are IconButtons with Cancel icon that appear when fields have text - // After clicking each button, the keyboard may reappear, hiding other buttons - var attempts = 0 - val maxAttempts = 10 // Should be enough for 3 fields - + val maxAttempts = 10 + while (attempts < maxAttempts) { attempts++ - - // Close keyboard and wait before looking for buttons closeKeyboard() + composeTestRule.waitForIdle() + + val iconButtons = composeTestRule.onAllNodes( + hasContentDescription("Icon Button"), + useUnmergedTree = true, + ) + + if (iconButtons.fetchSemanticsNodes().isEmpty()) break try { - // Find all Icon Buttons with content description "Icon Button" - // These are the X/Cancel buttons in the input fields - val iconButtons = composeTestRule.onAllNodes( - hasContentDescription("Icon Button"), - useUnmergedTree = true - ) - - val buttonCount = iconButtons.fetchSemanticsNodes().size - println("DEBUG: clickOnClearSearch - buttonCount = $buttonCount, attempt = $attempts") - - if (buttonCount == 0) { - // No more reset buttons, all fields cleared - break - } - - // Click the first visible clear button - try { - iconButtons[0].performScrollTo() - } catch (e: Exception) { - println("DEBUG: performScrollTo failed: ${e.message}") - } - - iconButtons[0].performClick() - - // After clicking, keyboard may reappear, close it again - closeKeyboard() - - } catch (e: Exception) { - // No more buttons to click - println("DEBUG: Exception in clickOnClearSearch loop: ${e.message}") - break + iconButtons[0].performScrollTo() + } catch (_: Exception) { + // Scroll not needed or not applicable } + + iconButtons[0].performClick() + closeKeyboard() + composeTestRule.waitForIdle() } - - // After clearing all fields, ensure keyboard is closed - // This is critical because clicking X buttons might have opened the keyboard + closeKeyboard() } From b7165ebbbdcfa837f23a3507fd26fdc390a1a98c Mon Sep 17 00:00:00 2001 From: rohit Date: Mon, 20 Apr 2026 18:26:00 +0200 Subject: [PATCH 194/260] refactored clickOnClearSearch to include the correct test tag --- .../searchte/robot/SearchTeiRobot.kt | 33 +++++-------------- 1 file changed, 9 insertions(+), 24 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index 9d1ebb9f8f0..44167ec5388 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -274,36 +274,21 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { fun clickOnClearSearch() { closeKeyboard() composeTestRule.waitForIdle() - - var attempts = 0 - val maxAttempts = 10 - - while (attempts < maxAttempts) { - attempts++ - closeKeyboard() - composeTestRule.waitForIdle() - - val iconButtons = composeTestRule.onAllNodes( - hasContentDescription("Icon Button"), - useUnmergedTree = true, - ) - - if (iconButtons.fetchSemanticsNodes().isEmpty()) break - - try { - iconButtons[0].performScrollTo() - } catch (_: Exception) { - // Scroll not needed or not applicable - } - - iconButtons[0].performClick() + val count = composeTestRule + .onAllNodesWithTag("INPUT_TEXT_RESET_BUTTON", useUnmergedTree = true) + .fetchSemanticsNodes().size + repeat(count) { closeKeyboard() composeTestRule.waitForIdle() + composeTestRule + .onAllNodesWithTag("INPUT_TEXT_RESET_BUTTON", useUnmergedTree = true)[0] + .performClick() } - closeKeyboard() + composeTestRule.waitForIdle() } + @OptIn(ExperimentalTestApi::class) fun checkFocusedFieldShowsOperatorSupportingText() { composeTestRule.waitUntilAtLeastOneExists( From 1ff931e82b572ef7ded5029b44a6b2a0209c1295 Mon Sep 17 00:00:00 2001 From: Pablo Date: Tue, 21 Apr 2026 14:38:06 +0200 Subject: [PATCH 195/260] fix: [ANDROAPP-7569] Crash when rotating device in event programs (#4818) --- .../ProgramEventDetailViewModel.kt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailViewModel.kt b/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailViewModel.kt index 1cf2f62d25b..256591f4ade 100644 --- a/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailViewModel.kt @@ -14,9 +14,11 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.distinctUntilChanged import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.launch import org.dhis2.R import org.dhis2.commons.resources.ResourceManager @@ -58,12 +60,10 @@ class ProgramEventDetailViewModel( private val _backdropActive = MutableLiveData() val backdropActive: LiveData get() = _backdropActive - private val _shouldNavigateToEventDetails: MutableSharedFlow = - MutableSharedFlow( - replay = Int.MAX_VALUE, - ) - val shouldNavigateToEventDetails: SharedFlow - get() = _shouldNavigateToEventDetails + private val _shouldNavigateToEventDetails = Channel() + + val shouldNavigateToEventDetails: Flow + get() = _shouldNavigateToEventDetails.receiveAsFlow() private val _navigationBarUIState = mutableStateOf(NavigationBarUIState()) val navigationBarUIState: State> = _navigationBarUIState @@ -172,7 +172,7 @@ class ProgramEventDetailViewModel( programStageUid = programStageUid, enrollmentUid = null, ).getOrNull()?.let { eventUid -> - _shouldNavigateToEventDetails.emit(eventUid) + _shouldNavigateToEventDetails.send(eventUid) } } } From 75165b5c8253b94243131c02b6a8c4e472fbd28e Mon Sep 17 00:00:00 2001 From: Ferdy Rodriguez Date: Tue, 21 Apr 2026 17:14:19 +0200 Subject: [PATCH 196/260] Set up notation parameter to InputNumber in TrackerInputProvider (#4815) --- .../org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt index 4cbe893f4de..fe12d6d7d85 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt @@ -48,6 +48,7 @@ import org.hisp.dhis.mobile.ui.designsystem.component.InputText import org.hisp.dhis.mobile.ui.designsystem.component.InputUnitInterval import org.hisp.dhis.mobile.ui.designsystem.component.InputYesOnlyCheckBox import org.hisp.dhis.mobile.ui.designsystem.component.InputYesOnlySwitch +import org.hisp.dhis.mobile.ui.designsystem.component.model.RegExValidations import org.jetbrains.compose.resources.stringResource @Composable @@ -277,6 +278,7 @@ fun TrackerInputProvider( onUiEvent = onUiEvent, ) }, + notation = RegExValidations.BRITISH_DECIMAL_NOTATION, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, onFocusChanged = { isFocused -> From b51f330a9815bc85e71f436c632ce55e6d06d828 Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Wed, 22 Apr 2026 07:11:57 +0200 Subject: [PATCH 197/260] Update version to 3.4.1 --- gradle/libs.versions.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6ed427c5126..f541e9dfbf9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ navigationCompose = "2.9.2" sdk = "36" minSdk = "23" vCode = "151" -vName = "3.4.1-Dev" +vName = "3.4.1" gradle = "9.0.1" kotlin = '2.3.20' dagger = '2.57.2' @@ -252,4 +252,4 @@ table-test = ["test-junit"] table-androidTest = ["test-compose-ui-test", "test-uiautomator", "test-junitKtx", "test-espresso"] stock-implementation = ["androidx-activity-compose", "androidx-annotation", "rx-relay", "security-openId", "androidx-preferenceKtx", "androidx-work", "androidx-activityKtx", "androidx-lifecycle-viewmodel-compose", "analytics-customactivityoncrash"] stock-core = ["desugar"] -stock-test = ["test-mockitoKotlin", "test-mockitoInline", "test-archCoreTesting", "test-javafaker", "test-kotlinCoroutines"] \ No newline at end of file +stock-test = ["test-mockitoKotlin", "test-mockitoInline", "test-archCoreTesting", "test-javafaker", "test-kotlinCoroutines"] From 08d194f03c164204eae5f2dccaf619cf5352f621 Mon Sep 17 00:00:00 2001 From: Pablo Date: Thu, 23 Apr 2026 07:25:42 +0200 Subject: [PATCH 198/260] build: [ANDROAPP-7565] Migrage EventCaptureRepositoryImpl to kotlin [skip size] (#4819) * Rename .java to .kt * build: [ANDROAPP-7569] migrate EventCaptureRepositoryImpl to kotlin --- .../eventCapture/EventCaptureContract.kt | 4 +- .../eventCapture/EventCaptureModule.kt | 2 +- .../EventCaptureRepositoryImpl.java | 239 ------------------ .../EventCaptureRepositoryImpl.kt | 199 +++++++++++++++ .../EventCaptureRepositoryImplTest.kt | 94 ++----- 5 files changed, 228 insertions(+), 310 deletions(-) delete mode 100644 app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImpl.java create mode 100644 app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImpl.kt diff --git a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureContract.kt b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureContract.kt index ac344e9bf8f..688f6cad1b1 100644 --- a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureContract.kt +++ b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureContract.kt @@ -110,9 +110,9 @@ class EventCaptureContract { fun deleteEvent(): Observable - fun updateEventStatus(skipped: EventStatus): Observable + fun updateEventStatus(status: EventStatus): Observable - fun rescheduleEvent(time: Date): Observable + fun rescheduleEvent(newDate: Date): Observable fun programStage(): Observable diff --git a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureModule.kt b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureModule.kt index 95f54659e26..7d3124bcd97 100644 --- a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureModule.kt +++ b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureModule.kt @@ -62,7 +62,7 @@ class EventCaptureModule( @Provides @PerActivity - fun provideRepository(d2: D2?): EventCaptureRepository = EventCaptureRepositoryImpl(eventUid, d2) + fun provideRepository(d2: D2): EventCaptureRepository = EventCaptureRepositoryImpl(d2, eventUid) @Provides @PerActivity diff --git a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImpl.java b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImpl.java deleted file mode 100644 index 036c40507d4..00000000000 --- a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImpl.java +++ /dev/null @@ -1,239 +0,0 @@ -package org.dhis2.usescases.eventsWithoutRegistration.eventCapture; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import org.dhis2.commons.bindings.SdkExtensionsKt; -import org.dhis2.data.dhislogic.AuthoritiesKt; -import org.hisp.dhis.android.core.D2; -import org.hisp.dhis.android.core.common.BaseIdentifiableObject; -import org.hisp.dhis.android.core.common.ValidationStrategy; -import org.hisp.dhis.android.core.enrollment.Enrollment; -import org.hisp.dhis.android.core.enrollment.EnrollmentStatus; -import org.hisp.dhis.android.core.event.Event; -import org.hisp.dhis.android.core.event.EventEditableStatus; -import org.hisp.dhis.android.core.event.EventNonEditableReason; -import org.hisp.dhis.android.core.event.EventStatus; -import org.hisp.dhis.android.core.organisationunit.OrganisationUnit; -import org.hisp.dhis.android.core.program.ProgramRule; -import org.hisp.dhis.android.core.program.ProgramRuleAction; -import org.hisp.dhis.android.core.program.ProgramRuleActionType; -import org.hisp.dhis.android.core.settings.ProgramConfigurationSetting; - -import java.util.Date; -import java.util.List; -import java.util.Objects; - -import io.reactivex.Flowable; -import io.reactivex.Observable; -import io.reactivex.Single; - -public class EventCaptureRepositoryImpl implements EventCaptureContract.EventCaptureRepository { - - private final String eventUid; - private final D2 d2; - - public EventCaptureRepositoryImpl(String eventUid, D2 d2) { - this.eventUid = eventUid; - this.d2 = d2; - } - - private Event getCurrentEvent() { - return d2.eventModule().events().uid(eventUid).blockingGet(); - } - - @Override - public boolean isEnrollmentOpen() { - Event currentEvent = getCurrentEvent(); - return currentEvent.enrollment() == null || d2.enrollmentModule().enrollmentService().blockingIsOpen(currentEvent.enrollment()); - } - - @Override - public boolean isEnrollmentCancelled() { - Enrollment enrollment = d2.enrollmentModule().enrollments().uid(getCurrentEvent().enrollment()).blockingGet(); - if (enrollment == null) - return false; - else - return enrollment.status() == EnrollmentStatus.CANCELLED; - } - - @Override - public boolean isEventEditable(@NonNull String eventUid) { - return d2.eventModule().eventService().blockingIsEditable(eventUid); - } - - @NonNull - @Override - public Flowable programStageName() { - return d2.programModule().programStages().uid(getCurrentEvent().programStage()).get() - .map(BaseIdentifiableObject::displayName) - .toFlowable(); - } - - @NonNull - @Override - public Flowable orgUnit() { - return Flowable.just( - Objects.requireNonNull( - d2.organisationUnitModule() - .organisationUnits() - .uid(getCurrentEvent().organisationUnit()) - .blockingGet() - ) - ); - } - - @NonNull - @Override - public Observable deleteEvent() { - return d2.eventModule().events().uid(eventUid).delete() - .andThen(Observable.just(true)); - } - - @NonNull - @Override - public Observable updateEventStatus(@NonNull EventStatus status) { - - return Observable.fromCallable(() -> { - d2.eventModule().events().uid(eventUid) - .setStatus(status); - return true; - }); - } - - @NonNull - @Override - public Observable rescheduleEvent(@NonNull Date newDate) { - return Observable.fromCallable(() -> { - d2.eventModule().events().uid(eventUid) - .setDueDate(newDate); - d2.eventModule().events().uid(eventUid) - .setStatus(EventStatus.SCHEDULE); - return true; - }); - } - - @NonNull - @Override - public Observable programStage() { - return Observable.just(Objects.requireNonNull(getCurrentEvent().programStage())); - } - - @Override - public boolean getAccessDataWrite() { - return d2.eventModule().eventService().blockingIsEditable(eventUid); - } - - @NonNull - @Override - public Flowable eventStatus() { - return Flowable.just(Objects.requireNonNull(getCurrentEvent().status())); - } - - @NonNull - @Override - public Single canReOpenEvent() { - return Single.fromCallable(() -> d2.userModule().authorities() - .byName().in(AuthoritiesKt.AUTH_UNCOMPLETE_EVENT, AuthoritiesKt.AUTH_ALL).one().blockingExists() - ); - } - - @NonNull - @Override - public Observable isCompletedEventExpired(@NonNull String eventUid) { - return d2.eventModule().eventService().getEditableStatus(eventUid).map(editionStatus -> { - if (editionStatus instanceof EventEditableStatus.NonEditable nonEditableStatus) { - return nonEditableStatus.getReason() == EventNonEditableReason.EXPIRED; - } else { - return false; - } - }).toObservable(); - } - - @NonNull - @Override - public Flowable eventIntegrityCheck() { - Event currentEvent = getCurrentEvent(); - return Flowable.just(currentEvent).map(event -> - (event.status() == EventStatus.COMPLETED || - event.status() == EventStatus.ACTIVE || - event.status() == EventStatus.SKIPPED) && - (event.eventDate() == null || !event.eventDate().after(new Date())) - ); - } - - @NonNull - @Override - public Single getNoteCount() { - return d2.noteModule().notes().byEventUid().eq(eventUid).count(); - } - - @Override - public boolean showCompletionPercentage() { - if (getCurrentEvent() != null && d2.settingModule().appearanceSettings().blockingExists()) { - ProgramConfigurationSetting programConfigurationSetting = d2.settingModule() - .appearanceSettings() - .getProgramConfigurationByUid(getCurrentEvent().program()); - - if (programConfigurationSetting != null && - programConfigurationSetting.completionSpinner() != null) { - return programConfigurationSetting.completionSpinner(); - } - } - return true; - } - - @Override - public boolean hasAnalytics() { - Event currentEvent = getCurrentEvent(); - boolean hasProgramIndicators = !d2.programModule().programIndicators().byProgramUid().eq(currentEvent.program()).blockingIsEmpty(); - List programRules = d2.programModule().programRules().withProgramRuleActions() - .byProgramUid().eq(currentEvent.program()).blockingGet(); - boolean hasProgramRules = false; - for (ProgramRule rule : programRules) { - for (ProgramRuleAction action : Objects.requireNonNull(rule.programRuleActions())) { - if (action.programRuleActionType() == ProgramRuleActionType.DISPLAYKEYVALUEPAIR || - action.programRuleActionType() == ProgramRuleActionType.DISPLAYTEXT) { - hasProgramRules = true; - } - } - } - return hasProgramIndicators || hasProgramRules; - } - - @Override - public boolean hasRelationships() { - return !d2.relationshipModule().relationshipTypes() - .byAvailableForEvent(eventUid) - .blockingIsEmpty(); - } - - @NonNull - @Override - public ValidationStrategy validationStrategy() { - ValidationStrategy validationStrategy = - SdkExtensionsKt.programStage(d2, programStage().blockingFirst()) - .validationStrategy(); - - return validationStrategy != null ? validationStrategy : ValidationStrategy.ON_COMPLETE; - } - - @Override - @Nullable - public String getEnrollmentUid() { - Event currentEvent = getCurrentEvent(); - if (currentEvent == null) { - return null; - }else{ - return currentEvent.enrollment(); - } - } - - @Override - @Nullable - public String getTeiUid() { - Enrollment enrollment = d2.enrollmentModule().enrollments().uid(getEnrollmentUid()).blockingGet(); - return enrollment != null ? enrollment.trackedEntityInstance() : null; - } -} - diff --git a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImpl.kt b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImpl.kt new file mode 100644 index 00000000000..72fbf8170a0 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImpl.kt @@ -0,0 +1,199 @@ +package org.dhis2.usescases.eventsWithoutRegistration.eventCapture + +import io.reactivex.Flowable +import io.reactivex.Observable +import io.reactivex.Single +import org.dhis2.commons.bindings.programStage +import org.dhis2.data.dhislogic.AUTH_ALL +import org.dhis2.data.dhislogic.AUTH_UNCOMPLETE_EVENT +import org.dhis2.usescases.eventsWithoutRegistration.eventCapture.EventCaptureContract.EventCaptureRepository +import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.common.ValidationStrategy +import org.hisp.dhis.android.core.enrollment.EnrollmentStatus +import org.hisp.dhis.android.core.event.EventEditableStatus +import org.hisp.dhis.android.core.event.EventNonEditableReason +import org.hisp.dhis.android.core.event.EventStatus +import org.hisp.dhis.android.core.organisationunit.OrganisationUnit +import org.hisp.dhis.android.core.program.ProgramRuleActionType +import java.util.Date +import java.util.Objects +import java.util.concurrent.Callable + +class EventCaptureRepositoryImpl( + private val d2: D2, + private val eventUid: String, +) : EventCaptureRepository { + private val currentEvent by lazy { + requireNotNull( + d2.eventModule().events().uid(eventUid).blockingGet() + ) + } + + override val isEnrollmentOpen: Boolean + get() { + val currentEvent = this.currentEvent + return currentEvent.enrollment() == null || d2.enrollmentModule().enrollmentService() + .blockingIsOpen(currentEvent.enrollment()!!) + } + + override val isEnrollmentCancelled: Boolean + get() { + val enrollment = + d2.enrollmentModule().enrollments().uid(this.currentEvent.enrollment()) + .blockingGet() + return if (enrollment == null) { + false + } else { + enrollment.status() == EnrollmentStatus.CANCELLED + } + } + + override fun isEventEditable(eventUid: String): Boolean { + return d2.eventModule().eventService().blockingIsEditable(eventUid) + } + + override fun programStageName(): Flowable { + return d2.programModule().programStages().uid(this.currentEvent.programStage()).get() + .map { programStage -> programStage.displayName() ?: programStage.uid() } + .toFlowable() + } + + override fun orgUnit(): Flowable { + return Flowable.just( + Objects.requireNonNull( + d2.organisationUnitModule() + .organisationUnits() + .uid(this.currentEvent.organisationUnit()) + .blockingGet() + ) + ) + } + + override fun deleteEvent(): Observable { + return d2.eventModule().events().uid(eventUid).delete() + .andThen(Observable.just(true)) + } + + override fun updateEventStatus(status: EventStatus): Observable { + return Observable.fromCallable(Callable { + d2.eventModule().events().uid(eventUid) + .setStatus(status) + true + }) + } + + override fun rescheduleEvent(newDate: Date): Observable { + return Observable.fromCallable(Callable { + d2.eventModule().events().uid(eventUid) + .setDueDate(newDate) + d2.eventModule().events().uid(eventUid) + .setStatus(EventStatus.SCHEDULE) + true + }) + } + + override fun programStage(): Observable { + return Observable.just( + Objects.requireNonNull( + this.currentEvent.programStage() + ) + ) + } + + override val accessDataWrite: Boolean + get() = d2.eventModule().eventService().blockingIsEditable(eventUid) + + override fun eventStatus(): Flowable { + return Flowable.just(Objects.requireNonNull(this.currentEvent.status())) + } + + override fun canReOpenEvent(): Single { + return Single.fromCallable(Callable { + d2.userModule().authorities() + .byName().`in`(AUTH_UNCOMPLETE_EVENT, AUTH_ALL).one().blockingExists() + } + ) + } + + override fun isCompletedEventExpired(eventUid: String): Observable { + return d2.eventModule().eventService().getEditableStatus(eventUid) + .map { editionStatus -> + if (editionStatus is EventEditableStatus.NonEditable) { + editionStatus.reason == EventNonEditableReason.EXPIRED + } else { + false + } + }.toObservable() + } + + override fun eventIntegrityCheck(): Flowable { + val currentEvent = this.currentEvent + return Flowable.just(currentEvent).map { event -> + (event.status() == EventStatus.COMPLETED || event.status() == EventStatus.ACTIVE || event.status() == EventStatus.SKIPPED) && + (event.eventDate() == null || !event.eventDate()!!.after(Date())) + } + } + + override val noteCount: Single + get() = d2.noteModule().notes().byEventUid().eq(eventUid).count() + + override fun showCompletionPercentage(): Boolean { + if (d2.settingModule().appearanceSettings().blockingExists()) { + val programConfigurationSetting = d2.settingModule() + .appearanceSettings() + .getProgramConfigurationByUid(this.currentEvent.program()) + + if (programConfigurationSetting != null && + programConfigurationSetting.completionSpinner() != null + ) { + return programConfigurationSetting.completionSpinner()!! + } + } + return true + } + + override fun hasAnalytics(): Boolean { + val currentEvent = this.currentEvent + val hasProgramIndicators = + !d2.programModule().programIndicators().byProgramUid().eq(currentEvent.program()) + .blockingIsEmpty() + val programRules = + d2.programModule().programRules().withProgramRuleActions() + .byProgramUid().eq(currentEvent.program()).blockingGet() + var hasProgramRules = false + for (rule in programRules) { + for (action in Objects.requireNonNull(rule.programRuleActions())) { + if (action.programRuleActionType() == ProgramRuleActionType.DISPLAYKEYVALUEPAIR || + action.programRuleActionType() == ProgramRuleActionType.DISPLAYTEXT + ) { + hasProgramRules = true + } + } + } + return hasProgramIndicators || hasProgramRules + } + + override fun hasRelationships(): Boolean { + return !d2.relationshipModule().relationshipTypes() + .byAvailableForEvent(eventUid) + .blockingIsEmpty() + } + + override fun validationStrategy(): ValidationStrategy { + val validationStrategy = + d2.programStage(programStage().blockingFirst()!!)!! + .validationStrategy() + + return validationStrategy ?: ValidationStrategy.ON_COMPLETE + } + + override fun getEnrollmentUid(): String? { + return currentEvent.enrollment() + } + + override fun getTeiUid(): String? { + val enrollment = d2.enrollmentModule().enrollments().uid(getEnrollmentUid()).blockingGet() + return enrollment?.trackedEntityInstance() + } +} + diff --git a/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImplTest.kt b/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImplTest.kt index 6329a7dbeb8..7006e8c25a3 100644 --- a/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImplTest.kt +++ b/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImplTest.kt @@ -64,8 +64,8 @@ class EventCaptureRepositoryImplTest { val repository = EventCaptureRepositoryImpl( - eventUid, d2, + eventUid, ) assertTrue(repository.isEnrollmentOpen) @@ -82,8 +82,8 @@ class EventCaptureRepositoryImplTest { val repository = EventCaptureRepositoryImpl( - eventUid, d2, + eventUid, ) repository.isEnrollmentOpen @@ -107,8 +107,8 @@ class EventCaptureRepositoryImplTest { val repository = EventCaptureRepositoryImpl( - eventUid, d2, + eventUid, ) assertTrue(!repository.isEnrollmentCancelled) @@ -135,8 +135,8 @@ class EventCaptureRepositoryImplTest { val repository = EventCaptureRepositoryImpl( - eventUid, d2, + eventUid, ) assertTrue(repository.isEnrollmentCancelled) @@ -149,8 +149,8 @@ class EventCaptureRepositoryImplTest { val repository = EventCaptureRepositoryImpl( - eventUid, d2, + eventUid, ) repository.isEventEditable(eventUid) @@ -182,8 +182,8 @@ class EventCaptureRepositoryImplTest { val repository = EventCaptureRepositoryImpl( - eventUid, d2, + eventUid, ) val testObserver = repository.programStageName().test() @@ -199,8 +199,8 @@ class EventCaptureRepositoryImplTest { val repository = EventCaptureRepositoryImpl( - eventUid, d2, + eventUid, ) whenever( @@ -229,8 +229,8 @@ class EventCaptureRepositoryImplTest { val repository = EventCaptureRepositoryImpl( - eventUid, d2, + eventUid, ) whenever( @@ -255,8 +255,8 @@ class EventCaptureRepositoryImplTest { val repository = EventCaptureRepositoryImpl( - eventUid, d2, + eventUid, ) val testStatus = EventStatus.SKIPPED whenever( @@ -277,8 +277,8 @@ class EventCaptureRepositoryImplTest { val repository = EventCaptureRepositoryImpl( - eventUid, d2, + eventUid, ) val testNewDate = GregorianCalendar(3021, 11, 1).time whenever( @@ -302,8 +302,8 @@ class EventCaptureRepositoryImplTest { val repository = EventCaptureRepositoryImpl( - eventUid, d2, + eventUid, ) repository @@ -318,7 +318,7 @@ class EventCaptureRepositoryImplTest { mockEvent() mockSections() - val repository = EventCaptureRepositoryImpl(eventUid, d2) + val repository = EventCaptureRepositoryImpl(d2 = d2, eventUid = eventUid) whenever( d2 @@ -337,7 +337,7 @@ class EventCaptureRepositoryImplTest { mockEvent() mockSections() - val repository = EventCaptureRepositoryImpl(eventUid, d2) + val repository = EventCaptureRepositoryImpl(d2 = d2, eventUid = eventUid) whenever( d2 @@ -356,11 +356,7 @@ class EventCaptureRepositoryImplTest { mockEvent() mockSections() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - ) + val repository = EventCaptureRepositoryImpl(d2 = d2, eventUid = eventUid) repository .eventStatus() @@ -374,11 +370,7 @@ class EventCaptureRepositoryImplTest { mockEvent() mockSections() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - ) + val repository = EventCaptureRepositoryImpl(d2 = d2, eventUid = eventUid) whenever( d2 @@ -426,11 +418,7 @@ class EventCaptureRepositoryImplTest { mockEvent(status = EventStatus.COMPLETED) mockSections() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - ) + val repository = EventCaptureRepositoryImpl(d2 = d2, eventUid = eventUid) whenever( d2.eventModule().eventService().getEditableStatus(eventUid), @@ -451,11 +439,7 @@ class EventCaptureRepositoryImplTest { mockEvent(status = EventStatus.COMPLETED) mockSections() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - ) + val repository = EventCaptureRepositoryImpl(d2 = d2, eventUid = eventUid) whenever( d2.eventModule().eventService().getEditableStatus(eventUid), @@ -476,11 +460,7 @@ class EventCaptureRepositoryImplTest { mockEvent() mockSections() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - ) + val repository = EventCaptureRepositoryImpl(d2 = d2, eventUid = eventUid) repository .eventIntegrityCheck() @@ -494,11 +474,7 @@ class EventCaptureRepositoryImplTest { mockEvent(eventDate = GregorianCalendar(3021, 0, 1).time) mockSections() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - ) + val repository = EventCaptureRepositoryImpl(d2 = d2, eventUid = eventUid) repository .eventIntegrityCheck() @@ -512,11 +488,8 @@ class EventCaptureRepositoryImplTest { mockEvent() mockSections() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - ) + val repository = EventCaptureRepositoryImpl(d2 = d2, eventUid = eventUid) + val numberOfNotes = 12 whenever( d2.noteModule().notes().byEventUid(), @@ -548,11 +521,7 @@ class EventCaptureRepositoryImplTest { mockEvent() mockSections() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - ) + val repository = EventCaptureRepositoryImpl(d2 = d2, eventUid = eventUid) whenever( d2.settingModule().appearanceSettings().blockingExists(), @@ -566,11 +535,7 @@ class EventCaptureRepositoryImplTest { mockEvent() mockSections() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - ) + val repository = EventCaptureRepositoryImpl(d2 = d2, eventUid = eventUid) whenever( d2.settingModule().appearanceSettings().blockingExists(), @@ -595,11 +560,7 @@ class EventCaptureRepositoryImplTest { mockEvent() mockSections() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - ) + val repository = EventCaptureRepositoryImpl(d2 = d2, eventUid = eventUid) whenever( d2.settingModule().appearanceSettings().blockingExists(), @@ -624,11 +585,8 @@ class EventCaptureRepositoryImplTest { mockEvent() mockSections() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - ) + val repository = EventCaptureRepositoryImpl(d2 = d2, eventUid = eventUid) + whenever( d2 .programModule() From d49a5a9ad143aa3a3b24afe8bfc8480d6ee76f0e Mon Sep 17 00:00:00 2001 From: Pablo Date: Thu, 23 Apr 2026 10:33:39 +0200 Subject: [PATCH 199/260] fix: [ANDROAPP-7533] Polygons should end with initial coordinate (#4794) --- .../org/dhis2/maps/utils/CoordinateUtils.kt | 6 +- .../dhis2/maps/utils/CoordinateUtilsTest.kt | 71 +++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 dhis2_android_maps/src/test/java/org/dhis2/maps/utils/CoordinateUtilsTest.kt diff --git a/dhis2_android_maps/src/main/java/org/dhis2/maps/utils/CoordinateUtils.kt b/dhis2_android_maps/src/main/java/org/dhis2/maps/utils/CoordinateUtils.kt index 97c301ac38f..4d0769d1268 100644 --- a/dhis2_android_maps/src/main/java/org/dhis2/maps/utils/CoordinateUtils.kt +++ b/dhis2_android_maps/src/main/java/org/dhis2/maps/utils/CoordinateUtils.kt @@ -42,9 +42,13 @@ object CoordinateUtils { is Polygon -> { val value = geometry.coordinates().map { polygon -> - polygon.map { point -> + val polygonCoordinates = polygon.map { point -> point.coordinates().map { coordinate -> coordinate.truncate() } + }.toMutableList() + if (polygonCoordinates.first() != polygonCoordinates.last()) { + polygonCoordinates.add(polygonCoordinates.first()) } + polygonCoordinates } Gson().toJson(value) } diff --git a/dhis2_android_maps/src/test/java/org/dhis2/maps/utils/CoordinateUtilsTest.kt b/dhis2_android_maps/src/test/java/org/dhis2/maps/utils/CoordinateUtilsTest.kt new file mode 100644 index 00000000000..20d50923108 --- /dev/null +++ b/dhis2_android_maps/src/test/java/org/dhis2/maps/utils/CoordinateUtilsTest.kt @@ -0,0 +1,71 @@ +package org.dhis2.maps.utils + +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull +import org.junit.Test +import org.maplibre.geojson.Point +import org.maplibre.geojson.Polygon + +class CoordinateUtilsTest { + + private val gson = Gson() + private val ringType = object : TypeToken>>>() {}.type + + @Test + fun `geometryCoordinates returns null when geometry is null`() { + assertNull(CoordinateUtils.geometryCoordinates(null)) + } + + @Test + fun `geometryCoordinates returns truncated JSON coordinates for Point`() { + val point = Point.fromLngLat(10.123456789, 20.987654321) + + val result = CoordinateUtils.geometryCoordinates(point) + + val coordinates: List = gson.fromJson( + result, + object : TypeToken>() {}.type, + ) + assertEquals(10.12345, coordinates[0], 0.0) + assertEquals(20.98765, coordinates[1], 0.0) + } + + @Test + fun `geometryCoordinates closes open polygon ring when first and last coordinates differ`() { + val pointA = Point.fromLngLat(0.0, 0.0) + val pointB = Point.fromLngLat(1.0, 0.0) + val pointC = Point.fromLngLat(0.0, 1.0) + val polygon = Polygon.fromLngLats(listOf(listOf(pointA, pointB, pointC))) + + val result = CoordinateUtils.geometryCoordinates(polygon) + + val rings: List>> = gson.fromJson(result, ringType) + val ring = rings[0] + assertEquals( + "Ring should start and end with the same coordinates", + ring.first(), + ring.last() + ) + } + + @Test + fun `geometryCoordinates does not duplicate closing coordinate when polygon ring is already closed`() { + val pointA = Point.fromLngLat(0.0, 0.0) + val pointB = Point.fromLngLat(1.0, 0.0) + val pointC = Point.fromLngLat(0.0, 1.0) + val polygon = Polygon.fromLngLats(listOf(listOf(pointA, pointB, pointC, pointA))) + + val result = CoordinateUtils.geometryCoordinates(polygon) + + val rings: List>> = gson.fromJson(result, ringType) + val ring = rings[0] + assertEquals( + "Ring should start and end with the same coordinates", + ring.first(), + ring.last() + ) + assertEquals("Closing coordinate must not be duplicated", 4, ring.size) + } +} From 481a204e26fb7361ceee37ba31de8a31695e905d Mon Sep 17 00:00:00 2001 From: Ferdy Rodriguez Date: Thu, 23 Apr 2026 13:51:35 +0200 Subject: [PATCH 200/260] Saves cursor's position (#4817) --- .../input/ui/provider/TrackerInputProvider.kt | 136 ++++-------------- 1 file changed, 30 insertions(+), 106 deletions(-) diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt index fe12d6d7d85..4af849e4123 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt @@ -59,11 +59,15 @@ fun TrackerInputProvider( onNextClicked: () -> Unit, onUiEvent: (TrackerInputUiEvent) -> Unit, ) { + var savedTextSelection by remember(inputModel.uid) { + mutableStateOf(TextRange(inputModel.value?.length ?: 0)) + } + var textValue by remember(inputModel.uid, inputModel.value) { mutableStateOf( TextFieldValue( text = inputModel.value ?: "", - selection = TextRange(inputModel.value?.length ?: 0), + selection = savedTextSelection, ), ) } @@ -77,6 +81,16 @@ fun TrackerInputProvider( } } + val onTextValueChanged: (TextFieldValue?) -> Unit = { newValue -> + textValue = newValue ?: TextFieldValue() + savedTextSelection = newValue?.selection ?: TextRange.Zero + manageOnValueChange( + newValue = newValue?.text, + inputModel = inputModel, + onUiEvent = onUiEvent, + ) + } + val onImeActionClick: (ImeAction) -> Unit = { imeAction -> if (imeAction == ImeAction.Next) { onNextClicked() @@ -94,13 +108,7 @@ fun TrackerInputProvider( isRequiredField = inputModel.mandatory, inputStyle = inputStyle, inputTextFieldValue = textValue, - onValueChanged = { newValue -> - manageOnValueChange( - newValue = newValue?.text, - inputModel = inputModel, - onUiEvent = onUiEvent, - ) - }, + onValueChanged = onTextValueChanged, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, onFocusChanged = { isFocused -> @@ -123,13 +131,7 @@ fun TrackerInputProvider( isRequiredField = inputModel.mandatory, inputStyle = inputStyle, inputTextFieldValue = textValue, - onValueChanged = { newValue -> - manageOnValueChange( - newValue = newValue?.text, - inputModel = inputModel, - onUiEvent = onUiEvent, - ) - }, + onValueChanged = onTextValueChanged, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, onFocusChanged = { isFocused -> @@ -152,13 +154,7 @@ fun TrackerInputProvider( isRequiredField = inputModel.mandatory, inputStyle = inputStyle, inputTextFieldValue = textValue, - onValueChanged = { newValue -> - manageOnValueChange( - newValue = newValue?.text, - inputModel = inputModel, - onUiEvent = onUiEvent, - ) - }, + onValueChanged = onTextValueChanged, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, onFocusChanged = { isFocused -> @@ -182,13 +178,7 @@ fun TrackerInputProvider( inputStyle = inputStyle, inputTextFieldValue = textValue, onEmailActionCLicked = {}, - onValueChanged = { newValue -> - manageOnValueChange( - newValue = newValue?.text, - inputModel = inputModel, - onUiEvent = onUiEvent, - ) - }, + onValueChanged = onTextValueChanged, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, onFocusChanged = { isFocused -> @@ -212,13 +202,7 @@ fun TrackerInputProvider( inputStyle = inputStyle, inputTextFieldValue = textValue, onCallActionClicked = {}, - onValueChanged = { newValue -> - manageOnValueChange( - newValue = newValue?.text, - inputModel = inputModel, - onUiEvent = onUiEvent, - ) - }, + onValueChanged = onTextValueChanged, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, onFocusChanged = { isFocused -> @@ -242,13 +226,7 @@ fun TrackerInputProvider( inputStyle = inputStyle, inputTextFieldValue = textValue, onLinkActionCLicked = {}, - onValueChanged = { newValue -> - manageOnValueChange( - newValue = newValue?.text, - inputModel = inputModel, - onUiEvent = onUiEvent, - ) - }, + onValueChanged = onTextValueChanged, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, onFocusChanged = { isFocused -> @@ -271,13 +249,7 @@ fun TrackerInputProvider( isRequiredField = inputModel.mandatory, inputStyle = inputStyle, inputTextFieldValue = textValue, - onValueChanged = { newValue -> - manageOnValueChange( - newValue = newValue?.text, - inputModel = inputModel, - onUiEvent = onUiEvent, - ) - }, + onValueChanged = onTextValueChanged, notation = RegExValidations.BRITISH_DECIMAL_NOTATION, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, @@ -301,13 +273,7 @@ fun TrackerInputProvider( isRequiredField = inputModel.mandatory, inputStyle = inputStyle, inputTextFieldValue = textValue, - onValueChanged = { newValue -> - manageOnValueChange( - newValue = newValue?.text, - inputModel = inputModel, - onUiEvent = onUiEvent, - ) - }, + onValueChanged = onTextValueChanged, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, onFocusChanged = { isFocused -> @@ -330,13 +296,7 @@ fun TrackerInputProvider( isRequiredField = inputModel.mandatory, inputStyle = inputStyle, inputTextFieldValue = textValue, - onValueChanged = { newValue -> - manageOnValueChange( - newValue = newValue?.text, - inputModel = inputModel, - onUiEvent = onUiEvent, - ) - }, + onValueChanged = onTextValueChanged, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, onFocusChanged = { isFocused -> @@ -359,13 +319,7 @@ fun TrackerInputProvider( isRequiredField = inputModel.mandatory, inputStyle = inputStyle, inputTextFieldValue = textValue, - onValueChanged = { newValue -> - manageOnValueChange( - newValue = newValue?.text, - inputModel = inputModel, - onUiEvent = onUiEvent, - ) - }, + onValueChanged = onTextValueChanged, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, onFocusChanged = { isFocused -> @@ -388,13 +342,7 @@ fun TrackerInputProvider( isRequiredField = inputModel.mandatory, inputStyle = inputStyle, inputTextFieldValue = textValue, - onValueChanged = { newValue -> - manageOnValueChange( - newValue = newValue?.text, - inputModel = inputModel, - onUiEvent = onUiEvent, - ) - }, + onValueChanged = onTextValueChanged, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, onFocusChanged = { isFocused -> @@ -417,13 +365,7 @@ fun TrackerInputProvider( isRequiredField = inputModel.mandatory, inputStyle = inputStyle, inputTextFieldValue = textValue, - onValueChanged = { newValue -> - manageOnValueChange( - newValue = newValue?.text, - inputModel = inputModel, - onUiEvent = onUiEvent, - ) - }, + onValueChanged = onTextValueChanged, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, onFocusChanged = { isFocused -> @@ -446,13 +388,7 @@ fun TrackerInputProvider( isRequiredField = inputModel.mandatory, inputStyle = inputStyle, inputTextFieldValue = textValue, - onValueChanged = { newValue -> - manageOnValueChange( - newValue = newValue?.text, - inputModel = inputModel, - onUiEvent = onUiEvent, - ) - }, + onValueChanged = onTextValueChanged, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, ) @@ -593,13 +529,7 @@ fun TrackerInputProvider( ), ) }, - onValueChanged = { newValue -> - manageOnValueChange( - newValue = newValue?.text, - inputModel = inputModel, - onUiEvent = onUiEvent, - ) - }, + onValueChanged = onTextValueChanged, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, ) @@ -624,13 +554,7 @@ fun TrackerInputProvider( ), ) }, - onValueChanged = { newValue -> - manageOnValueChange( - newValue = newValue?.text, - inputModel = inputModel, - onUiEvent = onUiEvent, - ) - }, + onValueChanged = onTextValueChanged, imeAction = ImeAction.Next, onImeActionClick = onImeActionClick, ) From 44d359b766fc2826032b4e2f920f14b2e5f035c5 Mon Sep 17 00:00:00 2001 From: Xavier Molloy Date: Fri, 24 Apr 2026 09:24:07 +0200 Subject: [PATCH 201/260] fix: [ANDROAPP-7520] bind openIdController to the Fragment everytime the Activity is created (#4822) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: bind openIdController to the Fragment everytime the Activity is created (#4787) * fix: bind openIdController to the Fragment everytime the Activity is created * refactor: register OpenIdControllerImpl as both concrete type and interface in LoginModule * refactor: implement unbind() in OpenIdControllerImpl.kt to clean up resources and prevent memory leaks. * refactor: simplify OpenIdController dependency injection * refactor: move and rename OpenID string resources * refactor: check FragmentActivity on bind * refactor: optimize imports * refactor: optimize imports * Update app/src/main/java/org/dhis2/usescases/login/LoginActivity.kt Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * feat: Enabling openid for debug mode * feat: Refactor OpenID configuration to support multiple authentication types * fix: add default button txt when there is no text configured --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix: [ANDROAPP-7520] fix test --------- Co-authored-by: Andrés Miguel Rubio Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .github/workflows/continuous-delivery.yml | 9 ++ app/build.gradle.kts | 36 +++++++ .../usescases/teidashboard/robot/NoteRobot.kt | 4 + .../teidashboard/robot/TeiDashboardRobot.kt | 3 + app/src/debug/AndroidManifest.xml | 1 - app/src/main/AndroidManifest.xml | 11 +++ .../java/org/dhis2/di/KoinInitialization.kt | 8 ++ .../dhis2/usescases/login/LoginActivity.kt | 10 ++ .../commons/auth/OpenIdControllerImpl.kt | 53 ---------- .../composeResources/values/strings.xml | 1 - .../mobile/commons/auth/OpenIdController.kt | 8 -- .../authentication/OpenIdControllerImpl.kt | 99 +++++++++++++++++++ .../login/main/data/LoginRepositoryImpl.kt | 2 +- .../login/main/di/LoginModule.android.kt | 34 +++++-- .../composeResources/values/strings.xml | 3 + .../login/authentication/OpenIdController.kt | 12 +++ .../login/main/ui/screen/CredentialsScreen.kt | 4 +- .../login/main/ui/screen/LoginScreen.kt | 16 +-- .../login/main/di/LoginModule.desktop.kt | 4 +- 19 files changed, 238 insertions(+), 80 deletions(-) delete mode 100644 commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/auth/OpenIdControllerImpl.kt delete mode 100644 commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/auth/OpenIdController.kt create mode 100644 login/src/androidMain/kotlin/org/dhis2/mobile/login/authentication/OpenIdControllerImpl.kt create mode 100644 login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/OpenIdController.kt diff --git a/.github/workflows/continuous-delivery.yml b/.github/workflows/continuous-delivery.yml index e808ea79d35..a9eccc75424 100644 --- a/.github/workflows/continuous-delivery.yml +++ b/.github/workflows/continuous-delivery.yml @@ -58,6 +58,15 @@ jobs: DEBUG_KEY_PASS: ${{ secrets.DEBUG_KEY_PASS }} DEBUG_KEYSTORE_PASSWORD: ${{ secrets.DEBUG_KEYSTORE_PASSWORD }} DEBUG_KEYSTORE_PATH: ${{ steps.decode_keystore.outputs.filePath }} + OPEN_ID_AUTH_SCHEME: ${{ secrets.OPEN_ID_AUTH_SCHEME }} + OPEN_ID_TYPE: ${{ secrets.OPEN_ID_TYPE }} + OPEN_ID_SERVER: ${{ secrets.OPEN_ID_SERVER }} + OPEN_ID_CLIENT: ${{ secrets.OPEN_ID_CLIENT }} + OPEN_ID_REDIRECT_URI: ${{ secrets.OPEN_ID_REDIRECT_URI }} + OPEN_ID_DISCOVERY_URI: ${{ secrets.OPEN_ID_DISCOVERY_URI }} + OPEN_ID_AUTHORIZATION_URL: ${{ secrets.OPEN_ID_AUTHORIZATION_URL }} + OPEN_ID_TOKEN_URL: ${{ secrets.OPEN_ID_TOKEN_URL }} + OPEN_ID_BUTTON_TEXT: ${{ secrets.OPEN_ID_BUTTON_TEXT }} - name: Locate built APK id: apk-path diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 2c6219b2902..2bf02fc2491 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -2,6 +2,14 @@ import com.android.build.api.variant.impl.VariantOutputImpl import org.jetbrains.kotlin.gradle.dsl.JvmTarget import java.text.SimpleDateFormat import java.util.Date +import java.util.Properties + +val localProps = + Properties().also { props -> + rootProject.file("local.properties").takeIf { it.exists() }?.inputStream()?.use(props::load) + } + +fun envOrLocal(key: String, default: String = "") = System.getenv(key) ?: localProps.getProperty(key) ?: default plugins { id("com.android.application") @@ -125,6 +133,34 @@ android { buildConfigField("long", "VERSION_CODE", "${defaultConfig.versionCode}") buildConfigField("String", "VERSION_NAME", "\"${defaultConfig.versionName}\"") buildConfigField("String", "SENTRY_DSN", "\"${bitriseSentryDSN}\"") + + // Open id configuration + val openIdAuthScheme = envOrLocal("OPEN_ID_AUTH_SCHEME", "open.id.app.fallback") + manifestPlaceholders["openIdAuthScheme"] = openIdAuthScheme + + val openIdType = envOrLocal("OPEN_ID_TYPE") + buildConfigField("String", "OPEN_ID_TYPE", "\"$openIdType\"") + + val openIdServer = envOrLocal("OPEN_ID_SERVER") + buildConfigField("String", "OPEN_ID_SERVER", "\"$openIdServer\"") + + val openIdClient = envOrLocal("OPEN_ID_CLIENT") + buildConfigField("String", "OPEN_ID_CLIENT", "\"$openIdClient\"") + + val openIdRedirectUri = envOrLocal("OPEN_ID_REDIRECT_URI") + buildConfigField("String", "OPEN_ID_REDIRECT_URI", "\"$openIdRedirectUri\"") + + val openIdDiscoveryUri = envOrLocal("OPEN_ID_DISCOVERY_URI") + buildConfigField("String", "OPEN_ID_DISCOVERY_URI", "\"$openIdDiscoveryUri\"") + + val openIdAuthorizationUrl = envOrLocal("OPEN_ID_AUTHORIZATION_URL") + buildConfigField("String", "OPEN_ID_AUTHORIZATION_URL", "\"$openIdAuthorizationUrl\"") + + val openIdTokenUrl = envOrLocal("OPEN_ID_TOKEN_URL") + buildConfigField("String", "OPEN_ID_TOKEN_URL", "\"$openIdTokenUrl\"") + + val openIdButtonText = envOrLocal("OPEN_ID_BUTTON_TEXT") + buildConfigField("String", "OPEN_ID_BUTTON_TEXT", "\"$openIdButtonText\"") } packaging { jniLibs { diff --git a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt index e49f454bf41..b2c8a850683 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt @@ -68,6 +68,10 @@ class NoteRobot : BaseRobot() { } fun checkNewNoteWasCreated(text: String) { + // First wait for the RecyclerView to be visible + waitForView(withId(R.id.notes_recycler), waitMillis = NOTES_WAIT_TIMEOUT_MS) + .check(matches(isDisplayed())) + // Now check for the note content waitForView( allOf( withId(R.id.notes_recycler), diff --git a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/TeiDashboardRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/TeiDashboardRobot.kt index 4b529449d65..4f15a180f93 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/TeiDashboardRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/TeiDashboardRobot.kt @@ -59,6 +59,9 @@ class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { ) ).performClick() waitForView(withId(R.id.addNoteButton)) + // Wait for notes RecyclerView to be ready after navigation + waitForView(withId(R.id.notes_recycler), waitMillis = 10000) + composeTestRule.waitForIdle() } fun goToRelationships() { diff --git a/app/src/debug/AndroidManifest.xml b/app/src/debug/AndroidManifest.xml index caeb2a6c54c..2ee086aad09 100644 --- a/app/src/debug/AndroidManifest.xml +++ b/app/src/debug/AndroidManifest.xml @@ -19,7 +19,6 @@ android:icon="@mipmap/ic_launcher"> - \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 40613e869a7..ab678935476 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -166,6 +166,17 @@ android:resource="@xml/provider_paths" tools:replace="android:resource" /> + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/org/dhis2/di/KoinInitialization.kt b/app/src/main/java/org/dhis2/di/KoinInitialization.kt index 362d8ca91d0..33716000dc5 100644 --- a/app/src/main/java/org/dhis2/di/KoinInitialization.kt +++ b/app/src/main/java/org/dhis2/di/KoinInitialization.kt @@ -33,6 +33,14 @@ object KoinInitialization { mapOf( "sentryDsn" to BuildConfig.SENTRY_DSN, "isTrainingFlavor" to (BuildConfig.FLAVOR == "dhis2Training"), + "openIdType" to BuildConfig.OPEN_ID_TYPE, + "openIdServer" to BuildConfig.OPEN_ID_SERVER, + "openIdClient" to BuildConfig.OPEN_ID_CLIENT, + "openIdRedirectUri" to BuildConfig.OPEN_ID_REDIRECT_URI, + "openIdDiscoveryUri" to BuildConfig.OPEN_ID_DISCOVERY_URI, + "openIdAuthorizationUrl" to BuildConfig.OPEN_ID_AUTHORIZATION_URL, + "openIdTokenUrl" to BuildConfig.OPEN_ID_TOKEN_URL, + "openIdButtonText" to BuildConfig.OPEN_ID_BUTTON_TEXT, ), ) workManagerFactory() diff --git a/app/src/main/java/org/dhis2/usescases/login/LoginActivity.kt b/app/src/main/java/org/dhis2/usescases/login/LoginActivity.kt index 17341a2e655..a60ba03698b 100644 --- a/app/src/main/java/org/dhis2/usescases/login/LoginActivity.kt +++ b/app/src/main/java/org/dhis2/usescases/login/LoginActivity.kt @@ -15,6 +15,7 @@ import org.dhis2.commons.Constants.SESSION_DIALOG_RQ import org.dhis2.commons.dialogs.CustomDialog import org.dhis2.commons.resources.ResourceManager import org.dhis2.data.server.OpenIdSession +import org.dhis2.mobile.login.authentication.OpenIdController import org.dhis2.mobile.login.main.ui.navigation.AppLinkNavigation import org.dhis2.mobile.login.main.ui.screen.LoginScreen import org.dhis2.usescases.about.PolicyView @@ -25,6 +26,7 @@ import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor import org.koin.android.ext.android.inject import javax.inject.Inject +import kotlin.getValue const val EXTRA_SKIP_SYNC = "SKIP_SYNC" const val FROM_MAIN_ACTIVITY = "FROM_MAIN_ACTIVITY" @@ -41,6 +43,7 @@ class LoginActivity : ActivityGlobalAbstract() { lateinit var resourceManager: ResourceManager private val appLinkNavigation: AppLinkNavigation by inject() + private val openIdController: OpenIdController by inject() private var isPinScreenVisible = false @@ -84,6 +87,8 @@ class LoginActivity : ActivityGlobalAbstract() { ) super.onCreate(savedInstanceState) + openIdController.bind(this) + checkMessage() skipSync = intent.getBooleanExtra(EXTRA_SKIP_SYNC, false) @@ -130,6 +135,11 @@ class LoginActivity : ActivityGlobalAbstract() { } } + override fun onDestroy() { + super.onDestroy() + openIdController.unbind() + } + @Deprecated("Deprecated in Java") override fun onBackPressed() { if (isPinScreenVisible) { diff --git a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/auth/OpenIdControllerImpl.kt b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/auth/OpenIdControllerImpl.kt deleted file mode 100644 index 7fb9d63220c..00000000000 --- a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/auth/OpenIdControllerImpl.kt +++ /dev/null @@ -1,53 +0,0 @@ -package org.dhis2.mobile.commons.auth - -import android.app.Activity.RESULT_OK -import androidx.activity.result.contract.ActivityResultContracts -import androidx.fragment.app.FragmentActivity -import androidx.lifecycle.lifecycleScope -import kotlinx.coroutines.launch -import org.dhis2.mobile.commons.resources.Res -import org.dhis2.mobile.commons.resources.openid_login_cancelled -import org.hisp.dhis.android.core.user.openid.IntentWithRequestCode -import org.jetbrains.compose.resources.getString - -class OpenIdControllerImpl( - context: FragmentActivity, -) : OpenIdController { - private var openIDRequestCode = -1 - private lateinit var onResultCallback: (suspend (Result) -> Unit) - - private val openIdLauncher = - context.activityResultRegistry.register( - key = "OPEN_ID_LAUNCHER", - contract = ActivityResultContracts.StartActivityForResult(), - ) { result -> - if (result.resultCode == RESULT_OK) { - result.data?.let { - val intentResult = - IntentWithRequestCode( - intent = it, - requestCode = openIDRequestCode, - ) - context.lifecycleScope.launch { - onResultCallback(Result.success(intentResult)) - } - } - } else { - context.lifecycleScope.launch { - onResultCallback( - Result.failure(Exception(getString(Res.string.openid_login_cancelled))), - ) - } - } - } - - override fun handleIntent( - intent: Any, - onResult: suspend (Result) -> Unit, - ) { - if (intent !is IntentWithRequestCode) return - onResultCallback = onResult - openIDRequestCode = intent.requestCode - openIdLauncher.launch(intent.intent) - } -} diff --git a/commonskmm/src/commonMain/composeResources/values/strings.xml b/commonskmm/src/commonMain/composeResources/values/strings.xml index 22dadf90ef4..a5ecad6faa6 100644 --- a/commonskmm/src/commonMain/composeResources/values/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values/strings.xml @@ -187,7 +187,6 @@ Database import failed Invalid file Not in TOTP 2FA enrollment mode - Authentication cancelled diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/auth/OpenIdController.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/auth/OpenIdController.kt deleted file mode 100644 index 587ab961235..00000000000 --- a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/auth/OpenIdController.kt +++ /dev/null @@ -1,8 +0,0 @@ -package org.dhis2.mobile.commons.auth - -fun interface OpenIdController { - fun handleIntent( - intent: Any, - onResult: suspend (Result) -> Unit, - ) -} diff --git a/login/src/androidMain/kotlin/org/dhis2/mobile/login/authentication/OpenIdControllerImpl.kt b/login/src/androidMain/kotlin/org/dhis2/mobile/login/authentication/OpenIdControllerImpl.kt new file mode 100644 index 00000000000..70e10603007 --- /dev/null +++ b/login/src/androidMain/kotlin/org/dhis2/mobile/login/authentication/OpenIdControllerImpl.kt @@ -0,0 +1,99 @@ +package org.dhis2.mobile.login.authentication + +import android.app.Activity.RESULT_OK +import android.content.Intent +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts +import androidx.fragment.app.FragmentActivity +import androidx.lifecycle.LifecycleCoroutineScope +import androidx.lifecycle.lifecycleScope +import kotlinx.coroutines.launch +import org.dhis2.mobile.login.resources.Res +import org.dhis2.mobile.login.resources.openid_error_controller_not_bounded +import org.dhis2.mobile.login.resources.openid_error_expected_intent +import org.dhis2.mobile.login.resources.openid_login_cancelled +import org.hisp.dhis.android.core.user.openid.IntentWithRequestCode +import org.jetbrains.compose.resources.getString + +class OpenIdControllerImpl : OpenIdController { + private var openIDRequestCode = -1 + private var onResultCallback: (suspend (Result) -> Unit)? = null + private var openIdLauncher: ActivityResultLauncher? = null + private var lifecycleScope: LifecycleCoroutineScope? = null + + override fun bind(context: Any) { + if (context !is FragmentActivity) { + unbind() + throw IllegalArgumentException( + "Context must be an instance of FragmentActivity", + ) + } + + openIdLauncher?.unregister() + lifecycleScope = context.lifecycleScope + openIdLauncher = + context.activityResultRegistry.register( + key = "OPEN_ID_LAUNCHER", + contract = ActivityResultContracts.StartActivityForResult(), + ) { result -> + val scope = lifecycleScope ?: return@register + if (result.resultCode == RESULT_OK && result.data != null) { + val intentResult = + IntentWithRequestCode( + intent = result.data!!, + requestCode = openIDRequestCode, + ) + scope.launch { + onResultCallback?.invoke(Result.success(intentResult)) + } + } else { + scope.launch { + onResultCallback?.invoke( + Result.failure( + Exception(getString(Res.string.openid_login_cancelled)), + ), + ) + } + } + } + } + + override fun unbind() { + openIdLauncher?.unregister() + openIdLauncher = null + lifecycleScope = null + onResultCallback = null + } + + override fun handleIntent( + intent: Any, + onResult: suspend (Result) -> Unit, + ) { + if (intent !is IntentWithRequestCode) { + lifecycleScope?.launch { + onResult( + Result.failure( + IllegalArgumentException(getString(Res.string.openid_error_expected_intent)), + ), + ) + } ?: throw IllegalStateException() + return + } + + val launcher = openIdLauncher + if (launcher == null) { + lifecycleScope?.launch { + onResult( + Result.failure( + IllegalStateException(getString(Res.string.openid_error_controller_not_bounded)), + ), + ) + } ?: throw IllegalStateException() + return + } + + onResultCallback = onResult + openIDRequestCode = intent.requestCode + launcher.launch(intent.intent) + } +} diff --git a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt index 99e15bb519e..5e84656c011 100644 --- a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt +++ b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt @@ -4,7 +4,6 @@ import androidx.core.net.toUri import coil3.PlatformContext import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.withContext -import org.dhis2.mobile.commons.auth.OpenIdController import org.dhis2.mobile.commons.biometrics.BiometricActions import org.dhis2.mobile.commons.biometrics.CryptographicActions import org.dhis2.mobile.commons.coroutine.Dispatcher @@ -17,6 +16,7 @@ import org.dhis2.mobile.commons.providers.SECURE_SERVER_URL import org.dhis2.mobile.commons.reporting.AnalyticActions import org.dhis2.mobile.commons.reporting.CrashReportController import org.dhis2.mobile.commons.resources.D2ErrorMessageProvider +import org.dhis2.mobile.login.authentication.OpenIdController import org.dhis2.mobile.login.main.domain.model.ServerValidationResult import org.dhis2.mobile.login.resources.Res import org.dhis2.mobile.login.resources.error_device_not_registered diff --git a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.android.kt b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.android.kt index 75e5b511142..7538284d023 100644 --- a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.android.kt +++ b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.android.kt @@ -2,13 +2,14 @@ package org.dhis2.mobile.login.main.di import android.content.Context import android.content.pm.ApplicationInfo -import org.dhis2.mobile.commons.auth.OpenIdController -import org.dhis2.mobile.commons.auth.OpenIdControllerImpl import org.dhis2.mobile.login.accounts.data.repository.AccountRepository import org.dhis2.mobile.login.accounts.data.repository.AccountRepositoryImpl import org.dhis2.mobile.login.accounts.ui.viewmodel.AccountsViewModel +import org.dhis2.mobile.login.authentication.OpenIdController +import org.dhis2.mobile.login.authentication.OpenIdControllerImpl import org.dhis2.mobile.login.main.data.LoginRepository import org.dhis2.mobile.login.main.data.LoginRepositoryImpl +import org.dhis2.mobile.login.main.ui.state.OidcInfo import org.koin.core.module.dsl.viewModel import org.koin.core.parameter.parametersOf import org.koin.dsl.module @@ -26,11 +27,32 @@ internal actual val accountModule = ) } - single { params -> - OpenIdControllerImpl(params.get()) + single { OpenIdControllerImpl() } + + single { + when (getProperty("openIdType", "")) { + "token" -> + OidcInfo.Token( + server = getProperty("openIdServer", ""), + loginLabel = getProperty("openIdButtonText", ""), + clientId = getProperty("openIdClient", ""), + redirectUri = getProperty("openIdRedirectUri", ""), + authorizationUrl = getProperty("openIdAuthorizationUrl", ""), + tokenUrl = getProperty("openIdTokenUrl", ""), + ) + + else -> + OidcInfo.Discovery( + server = getProperty("openIdServer", ""), + loginButtonText = getProperty("openIdButtonText", ""), + clientId = getProperty("openIdClient", ""), + redirectUri = getProperty("openIdRedirectUri", ""), + discoveryUri = getProperty("openIdDiscoveryUri", ""), + ) + } } - factory { params -> + factory { _ -> LoginRepositoryImpl( d2 = get(), authenticator = get(), @@ -39,7 +61,7 @@ internal actual val accountModule = d2ErrorMessageProvider = get(), crashReportController = get(), analyticActions = get(), - openIdController = get { parametersOf(params.get()) }, + openIdController = get(), dispatcher = get(), domainErrorMapper = get(), ) diff --git a/login/src/commonMain/composeResources/values/strings.xml b/login/src/commonMain/composeResources/values/strings.xml index 0fde0a09b5a..7d42b2b0719 100644 --- a/login/src/commonMain/composeResources/values/strings.xml +++ b/login/src/commonMain/composeResources/values/strings.xml @@ -66,6 +66,9 @@ Import successful The login was cancelled Invalid authorization result + Expected IntentWithRequestCode + OpenIdController is not bound to a lifecycle scope + Authentication cancelled Device not registered Missing username from OAuth login response \ No newline at end of file diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/OpenIdController.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/OpenIdController.kt new file mode 100644 index 00000000000..9af4d7672b0 --- /dev/null +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/OpenIdController.kt @@ -0,0 +1,12 @@ +package org.dhis2.mobile.login.authentication + +interface OpenIdController { + fun handleIntent( + intent: Any, + onResult: suspend (Result) -> Unit, + ) + + fun bind(context: Any) + + fun unbind() +} diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/CredentialsScreen.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/CredentialsScreen.kt index 491f5ca2de5..09e10afd240 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/CredentialsScreen.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/CredentialsScreen.kt @@ -590,7 +590,9 @@ private fun CredentialActions( } Button( modifier = Modifier.fillMaxWidth(), - text = oidcInfo.buttonText ?: stringResource(Res.string.action_openid_log_in), + text = + oidcInfo.buttonText.takeIf { !it.isNullOrEmpty() } + ?: stringResource(Res.string.action_openid_log_in), icon = { Icon( imageVector = Icons.AutoMirrored.Outlined.Login, diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/LoginScreen.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/LoginScreen.kt index 02f02fdde93..fd29c0ee589 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/LoginScreen.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/LoginScreen.kt @@ -77,6 +77,7 @@ import org.hisp.dhis.mobile.ui.designsystem.theme.dropShadow import org.jetbrains.compose.resources.getString import org.jetbrains.compose.resources.stringResource import org.jetbrains.compose.resources.vectorResource +import org.koin.compose.koinInject import org.koin.compose.viewmodel.koinViewModel import org.koin.core.parameter.parametersOf @@ -93,6 +94,7 @@ fun LoginScreen( ) { val context = LocalPlatformContext.current val viewModel = koinViewModel { parametersOf(context) } + val fixedOidcInfo = koinInject() var displayMoreActions by remember { mutableStateOf(false) } var displayBackArrow by remember { mutableStateOf(false) } val snackBarHostState = remember { SnackbarHostState() } @@ -212,7 +214,7 @@ fun LoginScreen( selectedServerFlag = arg.selectedServerFlag, allowRecovery = arg.allowRecovery, oidcInfo = - fixedOpenIdProvider()?.takeIf { info -> + fixedOpenIdProvider(fixedOidcInfo).takeIf { info -> info.serverUrl == arg.selectedServer }, fromHome = fromHome, @@ -249,14 +251,12 @@ fun LoginScreen( /** * OpenId Configuration - * Return either OidcInfo.Token or OidcInfo.Discovery classes to configure the login screen. - * Don't forget to add the RedirectUriReceiverActivity in the android manifest. Check the - * documentation for more info. + * Returns oidcInfo setup by environment variables, if you want to configure manually, + * replace it by either OidcInfo.Token or OidcInfo.Discovery classes. + * Don't forget to add the auth scheme in RedirectUriReceiverActivity in the android manifest. + * Check the documentation for more info. * */ -private fun fixedOpenIdProvider(): OidcInfo? { - // Change to the correct provider - return null -} +private fun fixedOpenIdProvider(oidcInfo: OidcInfo): OidcInfo = oidcInfo @Composable fun LoginTopBar( diff --git a/login/src/desktopMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.desktop.kt b/login/src/desktopMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.desktop.kt index 2a0dba63de3..ed7aa425c62 100644 --- a/login/src/desktopMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.desktop.kt +++ b/login/src/desktopMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.desktop.kt @@ -4,4 +4,6 @@ import org.koin.core.module.Module import org.koin.dsl.module internal actual val accountModule: Module - get() = module { } + get() = + module { + } From d25eecb5fafc5937baba9608f41276309f20c454 Mon Sep 17 00:00:00 2001 From: Pablo Date: Fri, 24 Apr 2026 10:55:00 +0200 Subject: [PATCH 202/260] feat: [ANDROAPP-7541] Set text and icon colors for theme (#4790) * feat: [ANDROAPP-7541] Set text and icon colors for theme * feat: [ANDROAPP-7541] change color on toolbars --- .../data/forms/dataentry/ProgramAdapter.java | 27 ++-- .../usescases/main/ui/screens/MainScreen.kt | 20 +-- .../usescases/teiDashboard/ui/TopBarIcons.kt | 8 +- .../main/java/org/dhis2/utils/ThemeColors.kt | 27 ++++ .../dhis2/utils/customviews/MoreMenuView.kt | 5 +- .../layout-land/activity_dashboard_mobile.xml | 7 +- .../main/res/layout-land/activity_search.xml | 7 +- .../res/layout/activity_dashboard_mobile.xml | 7 +- .../res/layout/activity_dataset_detail.xml | 7 +- .../res/layout/activity_dataset_initial.xml | 5 +- .../res/layout/activity_event_capture.xml | 11 +- .../layout/activity_program_event_detail.xml | 9 +- app/src/main/res/layout/activity_search.xml | 7 +- .../layout/spinner_program_item_layout.xml | 28 ++++ .../res/layout/spinner_program_layout.xml | 5 +- .../main/res/layout/item_header_filter.xml | 12 +- commons/src/main/res/values/attrs.xml | 2 +- commons/src/main/res/values/themes.xml | 136 ++++++++++++++++++ 18 files changed, 278 insertions(+), 52 deletions(-) create mode 100644 app/src/main/java/org/dhis2/utils/ThemeColors.kt create mode 100644 app/src/main/res/layout/spinner_program_item_layout.xml diff --git a/app/src/main/java/org/dhis2/data/forms/dataentry/ProgramAdapter.java b/app/src/main/java/org/dhis2/data/forms/dataentry/ProgramAdapter.java index 3f9acf0e0ff..259da33a460 100644 --- a/app/src/main/java/org/dhis2/data/forms/dataentry/ProgramAdapter.java +++ b/app/src/main/java/org/dhis2/data/forms/dataentry/ProgramAdapter.java @@ -1,19 +1,18 @@ package org.dhis2.data.forms.dataentry; import android.content.Context; -import androidx.databinding.DataBindingUtil; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.content.ContextCompat; -import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.databinding.DataBindingUtil; + import org.dhis2.R; +import org.dhis2.databinding.SpinnerProgramItemLayoutBinding; import org.dhis2.databinding.SpinnerProgramLayoutBinding; - import org.dhis2.usescases.searchTrackEntity.ProgramSpinnerModel; import java.util.List; @@ -38,8 +37,6 @@ public View getView(int position, @Nullable View convertView, @NonNull ViewGroup SpinnerProgramLayoutBinding binding = DataBindingUtil.inflate(inflater, R.layout.spinner_program_layout, parent, false); convertView = binding.getRoot(); setProgram(binding, position); - binding.spinnerText.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); - binding.spinnerText.setTextColor(ContextCompat.getColor(binding.spinnerText.getContext(), R.color.white_faf)); } return convertView; @@ -48,7 +45,7 @@ public View getView(int position, @Nullable View convertView, @NonNull ViewGroup @Override public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - SpinnerProgramLayoutBinding binding = DataBindingUtil.inflate(inflater, R.layout.spinner_program_layout, parent, false); + SpinnerProgramItemLayoutBinding binding = DataBindingUtil.inflate(inflater, R.layout.spinner_program_item_layout, parent, false); setProgram(binding, position); return binding.getRoot(); } @@ -65,6 +62,18 @@ private void setProgram(SpinnerProgramLayoutBinding binding, int position) { } } + private void setProgram(SpinnerProgramItemLayoutBinding binding, int position) { + if (position != 0) { + binding.setProgram(programs.get(position - 1)); + } else { + binding.setProgram(new ProgramSpinnerModel( + trackedEntityName, + String.format(getContext().getString(R.string.all_tei_type), trackedEntityName), + false + )); + } + } + @Override public int getCount() { return super.getCount() + 1; diff --git a/app/src/main/java/org/dhis2/usescases/main/ui/screens/MainScreen.kt b/app/src/main/java/org/dhis2/usescases/main/ui/screens/MainScreen.kt index e4d74b7709d..e2932bef505 100644 --- a/app/src/main/java/org/dhis2/usescases/main/ui/screens/MainScreen.kt +++ b/app/src/main/java/org/dhis2/usescases/main/ui/screens/MainScreen.kt @@ -40,6 +40,8 @@ import org.dhis2.usescases.main.ui.model.HomeAction import org.dhis2.usescases.main.ui.model.HomeEffect import org.dhis2.usescases.main.ui.model.HomeScreenState import org.dhis2.utils.customviews.navigationbar.NavigationPage +import org.dhis2.utils.getOnToolbarColor +import org.dhis2.utils.getThemePrimaryColor import org.hisp.dhis.mobile.ui.designsystem.component.Badge import org.hisp.dhis.mobile.ui.designsystem.component.IconButton import org.hisp.dhis.mobile.ui.designsystem.component.TopBar @@ -127,11 +129,13 @@ fun HomeTopBar( onSyncClicked: () -> Unit, onFilterClicked: () -> Unit, ) { + val primaryColor = getThemePrimaryColor() + val onToolbarColor = getOnToolbarColor() TopBar( navigationIcon = { TopBarActionIcon( icon = Icons.Filled.Menu, - tint = MaterialTheme.colorScheme.onPrimary, + tint = onToolbarColor, contentDescription = "menu", onClick = onMenuClicked, ) @@ -144,7 +148,7 @@ fun HomeTopBar( Icon( imageVector = Icons.Filled.Sync, contentDescription = "Sync", - tint = MaterialTheme.colorScheme.onPrimary, + tint = onToolbarColor, ) }, ) @@ -160,8 +164,8 @@ fun HomeTopBar( if (screenState.activeFilters > 0) { Badge( text = "${screenState.activeFilters}", - color = MaterialTheme.colorScheme.onPrimary, - textColor = MaterialTheme.colorScheme.primary, + color = onToolbarColor, + textColor = primaryColor, ) } }, @@ -169,7 +173,7 @@ fun HomeTopBar( Icon( painter = painterResource(R.drawable.ic_filter), contentDescription = "Filters", - tint = MaterialTheme.colorScheme.onPrimary, + tint = onToolbarColor, ) } }, @@ -187,7 +191,7 @@ fun HomeTopBar( }?.let { titleId -> Text( text = stringResource(titleId), - color = MaterialTheme.colorScheme.onPrimary, + color = onToolbarColor, style = MaterialTheme.typography.titleLarge, maxLines = 1, overflow = TextOverflow.Ellipsis, @@ -195,8 +199,8 @@ fun HomeTopBar( } }, colors = TopAppBarDefaults.topAppBarColors().copy( - containerColor = MaterialTheme.colorScheme.primary, - titleContentColor = MaterialTheme.colorScheme.onPrimary, + containerColor = primaryColor, + titleContentColor = onToolbarColor, ), ) } diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/ui/TopBarIcons.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/ui/TopBarIcons.kt index d6ad22584cc..934879270f7 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/ui/TopBarIcons.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/ui/TopBarIcons.kt @@ -5,11 +5,11 @@ import androidx.compose.material.icons.outlined.Edit import androidx.compose.material3.Icon import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.res.stringResource import org.dhis2.R import org.dhis2.tracker.relationships.ui.state.RelationshipTopBarIconState +import org.dhis2.utils.getOnToolbarColor import org.hisp.dhis.mobile.ui.designsystem.component.Button import org.hisp.dhis.mobile.ui.designsystem.component.ButtonStyle import org.hisp.dhis.mobile.ui.designsystem.component.IconButton @@ -19,13 +19,14 @@ fun ComposeView?.setButtonContent( onButtonClicked: () -> Unit, ) { this?.setContent { + val onToolbarColor = getOnToolbarColor() Button( text = "${stringResource(id = R.string.edit)} ${trackedEntityName.lowercase()}", style = ButtonStyle.TEXT_LIGHT, icon = { Icon( imageVector = Icons.Outlined.Edit, - tint = Color.White, + tint = onToolbarColor, contentDescription = "Edit", ) }, @@ -39,13 +40,14 @@ fun RelationshipTopBarIcon( relationshipTopBarIconState: RelationshipTopBarIconState, onButtonClicked: () -> Unit, ) { + val onToolbarColor = getOnToolbarColor() IconButton( modifier = Modifier, icon = { Icon( imageVector = relationshipTopBarIconState.icon, contentDescription = stringResource(R.string.relationships), - tint = Color.White, + tint = onToolbarColor, ) }, ) { diff --git a/app/src/main/java/org/dhis2/utils/ThemeColors.kt b/app/src/main/java/org/dhis2/utils/ThemeColors.kt new file mode 100644 index 00000000000..93b1f3e49c6 --- /dev/null +++ b/app/src/main/java/org/dhis2/utils/ThemeColors.kt @@ -0,0 +1,27 @@ +package org.dhis2.utils + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import org.dhis2.R +import org.dhis2.commons.resources.ColorUtils + +@Composable +fun getThemePrimaryColor(): Color { + val context = LocalContext.current + val primaryColor = remember(context) { ColorUtils().getThemePrimaryColor(context) } + return primaryColor +} + +@Composable +fun getOnToolbarColor(): Color { + val context = LocalContext.current + val onToolbarColor = remember(context) { + val ta = context.obtainStyledAttributes(intArrayOf(R.attr.onToolbarColor)) + val color = Color(ta.getColor(0, android.graphics.Color.WHITE)) + ta.recycle() + color + } + return onToolbarColor +} \ No newline at end of file diff --git a/app/src/main/java/org/dhis2/utils/customviews/MoreMenuView.kt b/app/src/main/java/org/dhis2/utils/customviews/MoreMenuView.kt index f71d73954e1..9c90aaabe24 100644 --- a/app/src/main/java/org/dhis2/utils/customviews/MoreMenuView.kt +++ b/app/src/main/java/org/dhis2/utils/customviews/MoreMenuView.kt @@ -9,11 +9,11 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.DpOffset +import org.dhis2.utils.getOnToolbarColor import org.hisp.dhis.mobile.ui.designsystem.component.IconButton import org.hisp.dhis.mobile.ui.designsystem.component.menu.DropDownMenu import org.hisp.dhis.mobile.ui.designsystem.component.menu.MenuItemData import org.hisp.dhis.mobile.ui.designsystem.theme.Spacing -import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor @Composable fun MoreOptionsWithDropDownMenuButton( @@ -22,12 +22,13 @@ fun MoreOptionsWithDropDownMenuButton( onMenuToggle: (Boolean) -> Unit, onItemClick: (T) -> Unit, ) { + val onToolbarColor = getOnToolbarColor() IconButton( modifier = Modifier, icon = { Icon( imageVector = Icons.Outlined.MoreVert, - tint = SurfaceColor.SurfaceBright, + tint = onToolbarColor, contentDescription = null, ) }, diff --git a/app/src/main/res/layout-land/activity_dashboard_mobile.xml b/app/src/main/res/layout-land/activity_dashboard_mobile.xml index dbb50705748..c19252df565 100644 --- a/app/src/main/res/layout-land/activity_dashboard_mobile.xml +++ b/app/src/main/res/layout-land/activity_dashboard_mobile.xml @@ -38,7 +38,8 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/ic_arrow_back" - tools:ignore="ContentDescription" /> + tools:ignore="ContentDescription" + app:tint="?onToolbarColor" /> diff --git a/app/src/main/res/layout-land/activity_search.xml b/app/src/main/res/layout-land/activity_search.xml index c529486d080..2092884aa71 100644 --- a/app/src/main/res/layout-land/activity_search.xml +++ b/app/src/main/res/layout-land/activity_search.xml @@ -62,6 +62,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/ic_arrow_back" + app:tint="?onToolbarColor" tools:ignore="ContentDescription" /> @@ -88,7 +89,7 @@ app:layout_constraintEnd_toStartOf="@id/moreOptions" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/ic_map" - app:tint="@color/white" + app:tint="?onToolbarColor" tools:ignore="ContentDescription" tools:visibility="gone" /> diff --git a/app/src/main/res/layout/activity_dataset_detail.xml b/app/src/main/res/layout/activity_dataset_detail.xml index ff9ea62e1c7..10aaee1ac5d 100644 --- a/app/src/main/res/layout/activity_dataset_detail.xml +++ b/app/src/main/res/layout/activity_dataset_detail.xml @@ -42,6 +42,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:srcCompat="@drawable/ic_arrow_back" + app:tint="?onToolbarColor" tools:ignore="ContentDescription" /> @@ -101,6 +103,7 @@ android:includeFontPadding="false" android:text='@{""+totalFilters}' android:textColor="?colorPrimary" + android:backgroundTint="?onToolbarColor" android:textSize="10sp" android:visibility="@{totalFilters>0?View.VISIBLE:View.GONE}" tools:text="1" /> diff --git a/app/src/main/res/layout/activity_dataset_initial.xml b/app/src/main/res/layout/activity_dataset_initial.xml index 13ae1610f6f..f3030a387e4 100644 --- a/app/src/main/res/layout/activity_dataset_initial.xml +++ b/app/src/main/res/layout/activity_dataset_initial.xml @@ -39,7 +39,8 @@ android:onClick="@{()->presenter.onBackClick()}" android:layout_marginStart="4dp" app:srcCompat="@drawable/ic_arrow_back" - tools:ignore="ContentDescription" /> + tools:ignore="ContentDescription" + app:tint="?onToolbarColor" /> diff --git a/app/src/main/res/layout/activity_event_capture.xml b/app/src/main/res/layout/activity_event_capture.xml index 01e4321e76b..88bb161e684 100644 --- a/app/src/main/res/layout/activity_event_capture.xml +++ b/app/src/main/res/layout/activity_event_capture.xml @@ -35,7 +35,8 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - app:srcCompat="@drawable/ic_arrow_back" /> + app:srcCompat="@drawable/ic_arrow_back" + app:tint="?onToolbarColor" /> diff --git a/app/src/main/res/layout/activity_program_event_detail.xml b/app/src/main/res/layout/activity_program_event_detail.xml index 72e09e38d90..036801f79bc 100644 --- a/app/src/main/res/layout/activity_program_event_detail.xml +++ b/app/src/main/res/layout/activity_program_event_detail.xml @@ -42,6 +42,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/ic_arrow_back" + app:tint="?onToolbarColor" tools:ignore="ContentDescription" /> + tools:ignore="ContentDescription" + app:tint="?onToolbarColor" /> + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/spinner_program_layout.xml b/app/src/main/res/layout/spinner_program_layout.xml index 2baa2e324a2..0a3571cfb61 100644 --- a/app/src/main/res/layout/spinner_program_layout.xml +++ b/app/src/main/res/layout/spinner_program_layout.xml @@ -17,12 +17,13 @@ android:gravity="center_vertical" android:padding="5dp" android:text="@{program.displayName}" - android:textColor="@color/text_black_333" + android:textColor="?onToolbarColor" android:maxLines="1" android:alpha="@{program.downloading ? 0.5f : 1f}" android:clickable="@{program.downloading}" android:ellipsize="end" - android:textSize="16sp" + android:textSize="20sp" + android:drawableTint="?onToolbarColor" tools:text="nameddddddddddddddddddddddddddddddddddddddddddddddddddddddd" tools:drawableEnd="@drawable/ic_arrow_drop_down_black_24dp"/> \ No newline at end of file diff --git a/commons/src/main/res/layout/item_header_filter.xml b/commons/src/main/res/layout/item_header_filter.xml index 36920bd1b42..45f259dfdbb 100644 --- a/commons/src/main/res/layout/item_header_filter.xml +++ b/commons/src/main/res/layout/item_header_filter.xml @@ -41,7 +41,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - app:tint="@color/white" + app:tint="?onToolbarColor" tools:src="@drawable/ic_calendar_positive" /> + app:srcCompat="@drawable/ic_sort_deactivated" + app:tint="?onToolbarColor" /> + app:tint="?onToolbarColor" /> diff --git a/commons/src/main/res/values/attrs.xml b/commons/src/main/res/values/attrs.xml index 33704780956..2f5e07a270d 100644 --- a/commons/src/main/res/values/attrs.xml +++ b/commons/src/main/res/values/attrs.xml @@ -15,7 +15,7 @@ - + diff --git a/commons/src/main/res/values/themes.xml b/commons/src/main/res/values/themes.xml index e1a45162b6b..e0284d4cd05 100644 --- a/commons/src/main/res/values/themes.xml +++ b/commons/src/main/res/values/themes.xml @@ -43,6 +43,8 @@ @style/Widget.MaterialComponents.ChipGroup @style/Widget.MaterialComponents.Chip.Action locale + @color/white + false @@ -154,6 +162,8 @@ @color/colorAccent @style/DatePickerThemetrue @color/white + @color/black_de0 + true \ No newline at end of file From 242dd6e57bde288e0a15ea37ef7910ff8eb6ca2c Mon Sep 17 00:00:00 2001 From: rohit Date: Mon, 27 Apr 2026 15:27:04 +0200 Subject: [PATCH 203/260] fix flaky test by using hardware back press to dismiss the keyboard. --- .../dhis2/usescases/searchte/SearchTETest.kt | 7 ++----- .../searchte/robot/SearchTeiRobot.kt | 20 +++++++++++++------ 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt index 69f60ec2388..3c8674f9c97 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt @@ -113,7 +113,6 @@ class SearchTETest : BaseTest() { @Test fun shouldFollowTBProgramSearchFlow() { - // Mock the online search to return empty results (only local DB results shown) mockWebServerRobot.addResponse( ResponseController.GET, API_TRACKED_ENTITY_PATH, @@ -125,8 +124,7 @@ class SearchTETest : BaseTest() { searchTeiRobot(composeTestRule) { waitUntilActivityVisible() - // ANDROAPP-5971: Search/Add new [TET] button is visible and enabled - // Verify the button is displayed and enabled before opening search + // ANDROAPP-5971: Verify the button is displayed and enabled before opening search checkAddNewTEIButtonIsDisplayedAndEnabled() // Open the search parameters panel @@ -144,7 +142,7 @@ class SearchTETest : BaseTest() { // Enter a value to enable the search button (Part A entry) typeOnSearchParameter(TB_SEARCH_ATTR_CITY, TB_SEARCH_CITY_SHORT) - // [Part A] ANDROAPP-5862: Search button is now enabled + // ANDROAPP-5862: Search button is now enabled checkSearchButtonIsEnabled() // Re-enter a short value (1 char) to enable the button @@ -157,7 +155,6 @@ class SearchTETest : BaseTest() { clickOnSearch() // ANDROAPP-7489/7490 & ANDROAPP-1056/7491: - // Error is displayed because value is below the minimum character requirement checkMinCharactersErrorIsDisplayed( TB_SEARCH_ATTR_CITY, TB_SEARCH_ATTR_STATE, diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index 44167ec5388..ede88f68e63 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -260,14 +260,18 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { @OptIn(ExperimentalTestApi::class) fun typeOnSearchParameter(label: String, value: String) { + // Dismiss the keyboard first so the LazyColumn recomposes and exposes all field labels. + // Without this, items scrolled behind an open keyboard are dropped from composition and + // waitUntilAtLeastOneExists(hasText(label)) times out on the next field. + // We do NOT close the keyboard at the end: keeping focus on the typed field lets + // checkFocusedFieldShowsOperatorSupportingText() read its supporting text. + // Any focus jump caused by the IMM dismiss is immediately overridden by clicking the label. + closeKeyboard() composeTestRule.waitForIdle() - composeTestRule.waitUntilAtLeastOneExists(hasText(label), TIMEOUT) composeTestRule.onNodeWithText(label).performClick() composeTestRule.waitUntilAtLeastOneExists(hasTestTag("INPUT_TEXT_FIELD"), TIMEOUT) composeTestRule.onAllNodesWithTag("INPUT_TEXT_FIELD").onLast().performTextInput(value) - // Close keyboard after typing to reveal fields that might be hidden behind it - closeKeyboard() } @OptIn(ExperimentalTestApi::class) @@ -278,14 +282,18 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { .onAllNodesWithTag("INPUT_TEXT_RESET_BUTTON", useUnmergedTree = true) .fetchSemanticsNodes().size repeat(count) { - closeKeyboard() composeTestRule.waitForIdle() composeTestRule .onAllNodesWithTag("INPUT_TEXT_RESET_BUTTON", useUnmergedTree = true)[0] + .performScrollTo() .performClick() + // Use hardware back press to dismiss the keyboard that appears after clicking X. + // Unlike closeKeyboard() (IMM-based), the back key is consumed by the keyboard + // itself before reaching Compose, so focus does not jump to the first focusable + // item (Unique ID) in the LazyColumn. + pressBack() + composeTestRule.waitForIdle() } - closeKeyboard() - composeTestRule.waitForIdle() } From d9011769cdc9f86188189e385894542076d60ae0 Mon Sep 17 00:00:00 2001 From: Pablo Date: Tue, 28 Apr 2026 09:26:19 +0200 Subject: [PATCH 204/260] fix: [ANDROAPP-7569] Workers not been properly scheduled (#4807) --- .../usescases/settings/SettingsRepository.kt | 14 ++++ .../usescases/settings/SyncManagerModule.kt | 1 + .../settings/models/DataSettingsViewModel.kt | 1 + .../models/MetadataSettingsViewModel.kt | 2 + .../settings/ui/SyncDataSettingItem.kt | 58 +++++++++++------ .../settings/ui/SyncMetadataSettingItem.kt | 64 ++++++++++++++----- .../settings/SettingsRepositoryTest.kt | 7 ++ .../settings/SyncManagerPresenterTest.kt | 3 + .../data/AndroidSyncBackgroundJobAction.kt | 44 +++++++++++-- .../mobile/sync/data/AndroidSyncRepository.kt | 8 +++ .../dhis2/mobile/sync/data/SyncDataWorker.kt | 18 ++++-- .../mobile/sync/data/SyncMetadataWorker.kt | 18 ++++-- .../mobile/sync/data/SyncSettingsWorker.kt | 18 ------ .../sync/data/SyncBackgroundJobAction.kt | 6 ++ .../dhis2/mobile/sync/data/SyncRepository.kt | 4 +- .../org/dhis2/mobile/sync/domain/SyncData.kt | 6 +- .../dhis2/mobile/sync/domain/SyncMetadata.kt | 6 +- .../dhis2/mobile/sync/domain/SyncSettings.kt | 11 ++++ 18 files changed, 215 insertions(+), 74 deletions(-) diff --git a/app/src/main/java/org/dhis2/usescases/settings/SettingsRepository.kt b/app/src/main/java/org/dhis2/usescases/settings/SettingsRepository.kt index 96f70fc217b..e3206c93de6 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/SettingsRepository.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/SettingsRepository.kt @@ -1,5 +1,6 @@ package org.dhis2.usescases.settings +import android.text.format.DateFormat import io.reactivex.Single import org.dhis2.BuildConfig import org.dhis2.bindings.toSeconds @@ -15,6 +16,7 @@ import org.dhis2.commons.prefs.Preference.Companion.TIME_DAILY import org.dhis2.commons.prefs.Preference.Companion.TIME_WEEKLY import org.dhis2.commons.prefs.PreferenceProvider import org.dhis2.data.service.SyncResult +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.usescases.settings.models.DataSettingsViewModel import org.dhis2.usescases.settings.models.MetadataSettingsViewModel import org.dhis2.usescases.settings.models.ReservedValueSettingsViewModel @@ -29,10 +31,13 @@ import org.hisp.dhis.android.core.settings.SynchronizationSettings import org.hisp.dhis.android.core.sms.domain.interactor.ConfigCase import timber.log.Timber +private const val dateTimeFormat = "dd/MM/yyyy HH:mm" + class SettingsRepository( val d2: D2, val prefs: PreferenceProvider, val featureConfigRepository: FeatureConfigRepository, + private val syncBackgroundJobAction: SyncBackgroundJobAction, ) { private val syncSettings: SynchronizationSettings? get() = @@ -63,6 +68,9 @@ class SettingsRepository( DataSettingsViewModel( dataSyncPeriod = dataPeriod(), lastDataSync = prefs.getString(Constants.LAST_DATA_SYNC, "-")!!, + nextDataSync = syncBackgroundJobAction.getNextDataSync()?.let { + DateFormat.format(dateTimeFormat, it).toString() + }, syncHasErrors = !prefs.getBoolean(Constants.LAST_DATA_SYNC_STATUS, true), dataHasErrors = dataHasErrors(), dataHasWarnings = dataHasWarning(), @@ -80,6 +88,12 @@ class SettingsRepository( MetadataSettingsViewModel( metadataSyncPeriod = metadataPeriod(), lastMetadataSync = prefs.getString(Constants.LAST_META_SYNC, "-")!!, + nextMetadataSync = syncBackgroundJobAction.getNextMetadataSync()?.let { + DateFormat.format(dateTimeFormat, it).toString() + }, + nextSettingsSync = syncBackgroundJobAction.getNextSettingsSync()?.let { + DateFormat.format(dateTimeFormat, it).toString() + }, hasErrors = !prefs.getBoolean(Constants.LAST_META_SYNC_STATUS, true), canEdit = syncSettings?.metadataSync() == null, syncInProgress = false, diff --git a/app/src/main/java/org/dhis2/usescases/settings/SyncManagerModule.kt b/app/src/main/java/org/dhis2/usescases/settings/SyncManagerModule.kt index 61678bfba2c..c1819f82b8e 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/SyncManagerModule.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/SyncManagerModule.kt @@ -171,6 +171,7 @@ class SyncManagerModule( d2, preferenceProvider, featureConfigRepository, + syncBackgroundJobAction, ) @Provides diff --git a/app/src/main/java/org/dhis2/usescases/settings/models/DataSettingsViewModel.kt b/app/src/main/java/org/dhis2/usescases/settings/models/DataSettingsViewModel.kt index 2b33dc87b92..b5da929d972 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/models/DataSettingsViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/models/DataSettingsViewModel.kt @@ -5,6 +5,7 @@ import org.dhis2.data.service.SyncResult data class DataSettingsViewModel( val dataSyncPeriod: Int, val lastDataSync: String, + val nextDataSync: String?, val syncHasErrors: Boolean, val dataHasErrors: Boolean, val dataHasWarnings: Boolean, diff --git a/app/src/main/java/org/dhis2/usescases/settings/models/MetadataSettingsViewModel.kt b/app/src/main/java/org/dhis2/usescases/settings/models/MetadataSettingsViewModel.kt index ab89e43b8ee..ebe42e80c1e 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/models/MetadataSettingsViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/models/MetadataSettingsViewModel.kt @@ -3,6 +3,8 @@ package org.dhis2.usescases.settings.models data class MetadataSettingsViewModel( val metadataSyncPeriod: Int, val lastMetadataSync: String, + val nextMetadataSync: String?, + val nextSettingsSync: String?, val hasErrors: Boolean, val canEdit: Boolean, val syncInProgress: Boolean, diff --git a/app/src/main/java/org/dhis2/usescases/settings/ui/SyncDataSettingItem.kt b/app/src/main/java/org/dhis2/usescases/settings/ui/SyncDataSettingItem.kt index b1711f42252..b3851633d18 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/ui/SyncDataSettingItem.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/ui/SyncDataSettingItem.kt @@ -23,6 +23,7 @@ import androidx.compose.ui.semantics.semantics import androidx.compose.ui.semantics.testTag import androidx.compose.ui.text.capitalize import androidx.compose.ui.text.intl.Locale +import org.dhis2.BuildConfig import org.dhis2.R import org.dhis2.bindings.EVERY_12_HOUR import org.dhis2.bindings.EVERY_24_HOUR @@ -76,7 +77,12 @@ internal fun SyncDataSettingItem( } else -> { - provideDefaultInfoItems(dataSettings.dataSyncPeriod, dataSettings.lastDataSync, context) + provideDefaultInfoItems( + dataSettings.dataSyncPeriod, + dataSettings.lastDataSync, + dataSettings.nextDataSync, + context + ) } } @@ -95,13 +101,13 @@ internal fun SyncDataSettingItem( ) { if (dataSettings.canEdit) { var selectedItem by - remember { - mutableStateOf( - DropdownItem( - label = syncPeriodLabel(dataSettings.dataSyncPeriod, context), - ), - ) - } + remember { + mutableStateOf( + DropdownItem( + label = syncPeriodLabel(dataSettings.dataSyncPeriod, context), + ), + ) + } val dataSyncPeriods = listOf( stringResource(R.string.thirty_minutes), @@ -173,19 +179,33 @@ internal fun SyncDataSettingItem( private fun provideDefaultInfoItems( dataSyncPeriod: Int, lastDataSync: String, + nextDataSync: String?, context: Context, ): List = - listOf( - AdditionalInfoItem( - key = stringResource(R.string.settings_sync_period_v2), - value = syncPeriodLabel(dataSyncPeriod, context), - ), - AdditionalInfoItem( - key = stringResource(R.string.last_data_sync), - value = lastDataSync, - color = TextColor.OnSurface, - ), - ) + buildList { + add( + AdditionalInfoItem( + key = stringResource(R.string.settings_sync_period_v2), + value = syncPeriodLabel(dataSyncPeriod, context), + ) + ) + add( + AdditionalInfoItem( + key = stringResource(R.string.last_data_sync), + value = lastDataSync, + color = TextColor.OnSurface, + ) + ) + nextDataSync?.takeIf { BuildConfig.DEBUG }?.let { + add( + AdditionalInfoItem( + key = "Next Sync On", + value = nextDataSync, + color = TextColor.OnSurface, + ) + ) + } + } @Composable private fun provideSyncErrorInfo( diff --git a/app/src/main/java/org/dhis2/usescases/settings/ui/SyncMetadataSettingItem.kt b/app/src/main/java/org/dhis2/usescases/settings/ui/SyncMetadataSettingItem.kt index df68e65dbfe..3b983201d0b 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/ui/SyncMetadataSettingItem.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/ui/SyncMetadataSettingItem.kt @@ -21,6 +21,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.capitalize import androidx.compose.ui.text.intl.Locale import androidx.compose.ui.unit.dp +import org.dhis2.BuildConfig import org.dhis2.R import org.dhis2.bindings.EVERY_12_HOUR import org.dhis2.bindings.EVERY_24_HOUR @@ -62,6 +63,8 @@ internal fun SyncMetadataSettingItem( provideDefaultInfoItems( metadataSettings.metadataSyncPeriod, metadataSettings.lastMetadataSync, + metadataSettings.nextMetadataSync, + metadataSettings.nextSettingsSync, context, ) } @@ -93,13 +96,16 @@ internal fun SyncMetadataSettingItem( } var selectedItem by - remember { - mutableStateOf( - DropdownItem( - label = syncPeriodLabel(metadataSettings.metadataSyncPeriod, context), + remember { + mutableStateOf( + DropdownItem( + label = syncPeriodLabel( + metadataSettings.metadataSyncPeriod, + context ), - ) - } + ), + ) + } var inputSyncConfigurationState by remember { mutableStateOf(InputShellState.UNFOCUSED) } @@ -151,18 +157,42 @@ internal fun SyncMetadataSettingItem( private fun provideDefaultInfoItems( metadataSyncPeriod: Int, lastMetadataSync: String, + nextMetadataSync: String?, + nextSettingsSync: String?, context: Context, -) = listOf( - AdditionalInfoItem( - key = stringResource(R.string.settings_sync_period_v2), - value = syncPeriodLabel(metadataSyncPeriod, context), - ), - AdditionalInfoItem( - key = stringResource(R.string.last_data_sync), - value = lastMetadataSync, - color = TextColor.OnSurface, - ), -) +) = buildList { + add( + AdditionalInfoItem( + key = stringResource(R.string.settings_sync_period_v2), + value = syncPeriodLabel(metadataSyncPeriod, context), + ) + ) + add( + AdditionalInfoItem( + key = stringResource(R.string.last_data_sync), + value = lastMetadataSync, + color = TextColor.OnSurface, + ) + ) + nextMetadataSync?.takeIf { BuildConfig.DEBUG }?.let { + add( + AdditionalInfoItem( + key = "Next sync on", + value = it, + color = TextColor.OnSurface, + ) + ) + } + nextSettingsSync?.takeIf { BuildConfig.DEBUG }?.let { + add( + AdditionalInfoItem( + key = "Next settings sync on", + value = it, + color = TextColor.OnSurface, + ) + ) + } +} @Composable private fun provideHasErrorItems( diff --git a/app/src/test/java/org/dhis2/usescases/settings/SettingsRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/settings/SettingsRepositoryTest.kt index 6fc5636760c..fd3c9394c0f 100644 --- a/app/src/test/java/org/dhis2/usescases/settings/SettingsRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/usescases/settings/SettingsRepositoryTest.kt @@ -19,6 +19,7 @@ import org.dhis2.commons.prefs.Preference.Companion.TIME_META import org.dhis2.commons.prefs.Preference.Companion.TIME_WEEKLY import org.dhis2.commons.prefs.PreferenceProvider import org.dhis2.data.server.UserManager +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.settings.DataSyncPeriod @@ -43,6 +44,11 @@ class SettingsRepositoryTest { Mockito.mock(UserManager::class.java, Mockito.RETURNS_DEEP_STUBS) private val preferencesProvider: PreferenceProvider = mock() private val featureConfigRepository: FeatureConfigRepository = mock() + private val syncBackgroundJobAction: SyncBackgroundJobAction = mock { + on { getNextSettingsSync() } doReturn null + on { getNextMetadataSync() } doReturn null + on { getNextDataSync() } doReturn null + } private val smsConfig: ConfigCase.SmsConfig = mock { on { isModuleEnabled } doReturn true @@ -63,6 +69,7 @@ class SettingsRepositoryTest { d2, preferencesProvider, featureConfigRepository, + syncBackgroundJobAction, ) configurePreferences() configureDataCount() diff --git a/app/src/test/java/org/dhis2/usescases/settings/SyncManagerPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/settings/SyncManagerPresenterTest.kt index 21c59026565..7fe223dfad8 100644 --- a/app/src/test/java/org/dhis2/usescases/settings/SyncManagerPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/settings/SyncManagerPresenterTest.kt @@ -129,6 +129,8 @@ class SyncManagerPresenterTest { MetadataSettingsViewModel( metadataSyncPeriod = 100, lastMetadataSync = "test", + nextMetadataSync = null, + nextSettingsSync = null, hasErrors = false, canEdit = false, syncInProgress = false, @@ -138,6 +140,7 @@ class SyncManagerPresenterTest { DataSettingsViewModel( dataSyncPeriod = 100, lastDataSync = "test", + nextDataSync = null, syncHasErrors = false, dataHasErrors = false, dataHasWarnings = false, diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncBackgroundJobAction.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncBackgroundJobAction.kt index 872a5f597ed..14f3092d944 100644 --- a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncBackgroundJobAction.kt +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncBackgroundJobAction.kt @@ -8,12 +8,14 @@ import androidx.work.WorkInfo import androidx.work.WorkManager import androidx.work.WorkQuery import androidx.work.await +import androidx.work.workDataOf import kotlinx.coroutines.flow.map import org.dhis2.mobile.sync.model.SyncJobStatus import org.dhis2.mobile.sync.model.SyncStatus import java.util.concurrent.TimeUnit import kotlin.time.Duration.Companion.hours +const val IS_PERIODIC = "IS_PERIODIC" const val METADATA_SYNC = "METADATA_SYNC" const val METADATA_SYNC_NOW = "METADATA_SYNC_NOW" const val DATA_SYNC = "DATA_SYNC" @@ -49,11 +51,12 @@ class AndroidSyncBackgroundJobAction( ).setInitialDelay( syncingPeriod, TimeUnit.SECONDS, - ).build() + ).setInputData(workDataOf(IS_PERIODIC to true)) + .build() workManager.enqueueUniquePeriodicWork( uniqueWorkName = METADATA_SYNC, - existingPeriodicWorkPolicy = ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE, + existingPeriodicWorkPolicy = ExistingPeriodicWorkPolicy.UPDATE, request = request, ) } @@ -85,11 +88,12 @@ class AndroidSyncBackgroundJobAction( ).setInitialDelay( syncingPeriod, TimeUnit.SECONDS, - ).build() + ).setInputData(workDataOf(IS_PERIODIC to true)) + .build() workManager.enqueueUniquePeriodicWork( uniqueWorkName = DATA_SYNC, - existingPeriodicWorkPolicy = ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE, + existingPeriodicWorkPolicy = ExistingPeriodicWorkPolicy.UPDATE, request = request, ) } @@ -102,14 +106,16 @@ class AndroidSyncBackgroundJobAction( workerClass = SyncSettingsWorker::class.java, repeatInterval = 1.hours.inWholeSeconds, repeatIntervalTimeUnit = TimeUnit.SECONDS, - ).setInitialDelay(1, TimeUnit.MINUTES) - .addTag( + ).setInitialDelay( + 1, + TimeUnit.HOURS, + ).addTag( SYNC_SETTINGS, ).build() workManager.enqueueUniquePeriodicWork( SYNC_SETTINGS, - ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE, + ExistingPeriodicWorkPolicy.UPDATE, request, ) } @@ -139,6 +145,30 @@ class AndroidSyncBackgroundJobAction( } } + override fun getNextMetadataSync() = + workManager + .getWorkInfosForUniqueWork(METADATA_SYNC) + .get() + .firstOrNull() + ?.takeIf { it.state == WorkInfo.State.ENQUEUED } + ?.nextScheduleTimeMillis + + override fun getNextDataSync() = + workManager + .getWorkInfosForUniqueWork(DATA_SYNC) + .get() + .firstOrNull() + ?.takeIf { it.state == WorkInfo.State.ENQUEUED } + ?.nextScheduleTimeMillis + + override fun getNextSettingsSync(): Long? = + workManager + .getWorkInfosForUniqueWork(SYNC_SETTINGS) + .get() + .firstOrNull() + ?.takeIf { it.state == WorkInfo.State.ENQUEUED } + ?.nextScheduleTimeMillis + override fun observeDataJob() = workManager .getWorkInfosFlow( diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt index dc77ae328f5..b45c9842a22 100644 --- a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt @@ -185,6 +185,14 @@ class AndroidSyncRepository( Result.success(uids) } + override suspend fun saveDataSyncError(stackTrace: String) { + d2 + .dataStoreModule() + .localDataStore() + .value("DATASYNCERROR") + .blockingSet(stackTrace) + } + private suspend fun syncResult(): SyncResult { val eventsOk = d2 diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncDataWorker.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncDataWorker.kt index 0d828dc9548..1c45e0d1bbf 100644 --- a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncDataWorker.kt +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncDataWorker.kt @@ -20,12 +20,18 @@ class SyncDataWorker( private val syncData: SyncData, private val notificationManager: NotificationManager, ) : CoroutineWorker(context, workerParams) { + private lateinit var notificationTitle: String + private lateinit var notificationText: String + override suspend fun doWork(): Result { - setForegroundAsync(getForegroundInfo()) + val isPeriodic = inputData.getBoolean(IS_PERIODIC, false) - val notificationTitle = getString(Res.string.app_name) - val notificationText = getString(Res.string.syncing_data) + if (!isPeriodic) { + setForeground(getForegroundInfo()) + } + notificationTitle = getString(Res.string.app_name) + notificationText = getString(Res.string.syncing_data) notificationManager.displayDataSyncNotification( smallIcon = R.drawable.ic_sync, contentTitle = notificationTitle, @@ -52,7 +58,11 @@ class SyncDataWorker( progress = progressData.progress?.toInt() ?: -1, ) } - notificationManager.cancelDataSyncNotification() + + if (!isPeriodic) { + notificationManager.cancelDataSyncNotification() + } + return when { result.isSuccess -> Result.success() else -> Result.failure() diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncMetadataWorker.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncMetadataWorker.kt index 07edcda20ae..d6fc7f871e9 100644 --- a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncMetadataWorker.kt +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncMetadataWorker.kt @@ -22,11 +22,18 @@ class SyncMetadataWorker( private val syncMetadata: SyncMetadata, private val notificationManager: NotificationManager, ) : CoroutineWorker(context, workerParams) { + private lateinit var notificationTitle: String + private lateinit var notificationText: String + + private val isPeriodic by lazy { inputData.getBoolean(IS_PERIODIC, false) } + override suspend fun doWork(): Result { - setForegroundAsync(getForegroundInfo()) + if (!isPeriodic) { + setForeground(getForegroundInfo()) + } - val notificationTitle = getString(Res.string.app_name) - val notificationText = getString(Res.string.syncing_configuration) + notificationTitle = getString(Res.string.app_name) + notificationText = getString(Res.string.syncing_configuration) notificationManager.displayMetadataSyncNotification( smallIcon = R.drawable.ic_sync, @@ -45,7 +52,10 @@ class SyncMetadataWorker( ) } - notificationManager.cancelMetadataSyncNotification() + if (!isPeriodic) { + notificationManager.cancelMetadataSyncNotification() + } + return when { result.isSuccess -> Result.success() else -> diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncSettingsWorker.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncSettingsWorker.kt index 4f4a897fcea..e7ac7f2f1bd 100644 --- a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncSettingsWorker.kt +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncSettingsWorker.kt @@ -2,11 +2,9 @@ package org.dhis2.mobile.sync.data import android.content.Context import androidx.work.CoroutineWorker -import androidx.work.ForegroundInfo import androidx.work.WorkerParameters import org.dhis2.mobile.commons.domain.invoke import org.dhis2.mobile.commons.notifications.NotificationManager -import org.dhis2.mobile.commons.notifications.WorkerNotificationInfo import org.dhis2.mobile.sync.R import org.dhis2.mobile.sync.domain.SyncSettings import org.dhis2.mobile.sync.resources.Res @@ -21,7 +19,6 @@ class SyncSettingsWorker( private val notificationManager: NotificationManager, ) : CoroutineWorker(context, workerParams) { override suspend fun doWork(): Result { - setForegroundAsync(getForegroundInfo()) notificationManager.displaySyncSettingsNotification( smallIcon = R.drawable.ic_sync, contentTitle = getString(Res.string.app_name), @@ -34,19 +31,4 @@ class SyncSettingsWorker( else -> Result.failure() } } - - override suspend fun getForegroundInfo(): ForegroundInfo { - val notificationModel = - notificationManager.getSyncSettingsNotificationModel( - smallIcon = R.drawable.ic_sync, - contentTitle = getString(Res.string.app_name), - contentText = getString(Res.string.syncing_settings), - ) - val notificationInfo = - notificationModel as? WorkerNotificationInfo - ?: throw IllegalStateException( - "Expected WorkerNotificationInfo but got ${notificationModel::class.qualifiedName}", - ) - return notificationInfo.foregroundInfo - } } diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncBackgroundJobAction.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncBackgroundJobAction.kt index 74c15de185a..3e9f8adc8ff 100644 --- a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncBackgroundJobAction.kt +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncBackgroundJobAction.kt @@ -21,4 +21,10 @@ interface SyncBackgroundJobAction { suspend fun cancelDataSync() suspend fun cancelAll() + + fun getNextMetadataSync(): Long? + + fun getNextDataSync(): Long? + + fun getNextSettingsSync(): Long? } diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt index 8bc887dcfd8..e83819b2c8e 100644 --- a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt @@ -8,7 +8,7 @@ interface SyncRepository { suspend fun currentMetadataSyncPeriod(): SyncPeriod? - suspend fun currentDataSyncPeriod(): SyncPeriod + suspend fun currentDataSyncPeriod(): SyncPeriod? suspend fun syncMetadata(onProgressUpdate: (Int) -> Unit): Result @@ -47,4 +47,6 @@ interface SyncRepository { suspend fun getAllTrackerPrograms(): Result> suspend fun getAllDataSets(): Result> + + suspend fun saveDataSyncError(stackTrace: String) } diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncData.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncData.kt index d01f2af3031..82ada6462a8 100644 --- a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncData.kt +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncData.kt @@ -75,12 +75,16 @@ class SyncData( repository.saveDataSyncState(isSuccess) - syncStatusController.finishSync() Result.success(Unit) } catch (domainError: DomainError) { if (domainError is DomainError.NetworkError) { syncStatusController.onNetworkUnavailable() } Result.failure(domainError) + } catch (e: Exception) { + repository.saveDataSyncError(e.stackTraceToString()) + Result.failure(e) + } finally { + syncStatusController.finishSync() } } diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt index 728667af731..bd4ccd968f1 100644 --- a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt @@ -69,8 +69,8 @@ class SyncMetadata( } private suspend fun handleDataPeriodChange( - initialDataSyncPeriod: SyncPeriod, - finalDataSyncPeriod: SyncPeriod, + initialDataSyncPeriod: SyncPeriod?, + finalDataSyncPeriod: SyncPeriod?, ) { val dataSyncPeriodChanged = initialDataSyncPeriod != finalDataSyncPeriod val dataSyncPeriodChangedToManual = @@ -82,7 +82,7 @@ class SyncMetadata( } dataSyncPeriodChanged -> { - syncBackgroundJobAction.launchDataSync(finalDataSyncPeriod.toSeconds()) + syncBackgroundJobAction.launchDataSync(finalDataSyncPeriod?.toSeconds() ?: 0) } } } diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncSettings.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncSettings.kt index 5d2d4da4a76..7ddf2666f1f 100644 --- a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncSettings.kt +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncSettings.kt @@ -13,9 +13,20 @@ class SyncSettings( override suspend fun invoke(input: Unit): Result = try { val previousMetadataSyncPeriod = repository.currentMetadataSyncPeriod() + val previousDataSyncPeriod = repository.currentDataSyncPeriod() + val result = repository.refreshSyncSettings() if (result.isSuccess) { val currentMetadataSyncPeriod = repository.currentMetadataSyncPeriod() + val currentDataSyncPeriod = repository.currentDataSyncPeriod() + + val dataPeriodChangedFromManual = + (previousDataSyncPeriod is SyncPeriod.Manual || previousDataSyncPeriod == null) && + currentDataSyncPeriod !is SyncPeriod.Manual + + if (dataPeriodChangedFromManual) { + syncBackgroundJobAction.launchDataSync(currentDataSyncPeriod?.toSeconds() ?: 0L) + } val metadataPeriodChangedFromManual = (previousMetadataSyncPeriod is SyncPeriod.Manual || previousMetadataSyncPeriod == null) && From b62c03b841fcc061a28839459a4f829d2ae31ca6 Mon Sep 17 00:00:00 2001 From: andresmr Date: Tue, 28 Apr 2026 12:32:31 +0200 Subject: [PATCH 205/260] fix: improve search test stability and coroutine tracking - Add explicit scrolling to `SearchTeiRobot` to ensure Compose nodes are in composition before interaction, preventing timeouts on slow devices. - Update `CoroutineTracker` to use atomic compare-and-set for thread-safe decrements and prevent negative values. - Properly manage `CoroutineTracker` lifecycle in `SearchTEIViewModel` using try-finally blocks. - Fix a listener leak in `SearchTEList` by managing the `OnPagesUpdatedListener` lifecycle and switching to `collectLatest` for paging data. - Add `SEARCH_PARAMETERS_LIST_TAG` to the search parameters `LazyColumn` for test identification. --- .../searchte/robot/SearchTeiRobot.kt | 157 ++++-------------- .../searchTrackEntity/SearchTEIViewModel.kt | 5 + .../listView/SearchTEList.kt | 21 ++- .../commons/coroutine/CoroutineTracker.kt | 15 +- .../ui/screen/SearchParametersScreen.kt | 5 +- 5 files changed, 62 insertions(+), 141 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index ede88f68e63..a30bfb07bdc 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -7,18 +7,16 @@ import androidx.compose.ui.test.assertIsEnabled import androidx.compose.ui.test.assertIsNotEnabled import androidx.compose.ui.test.hasAnyAncestor import androidx.compose.ui.test.hasAnyDescendant -import androidx.compose.ui.test.hasContentDescription -import androidx.compose.ui.test.hasParent import androidx.compose.ui.test.hasTestTag import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.ComposeTestRule import androidx.compose.ui.test.onAllNodesWithTag import androidx.compose.ui.test.onLast -import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performScrollTo +import androidx.compose.ui.test.performScrollToNode import androidx.compose.ui.test.performTextInput import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click @@ -26,18 +24,12 @@ import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers.hasDescendant import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText -import androidx.test.platform.app.InstrumentationRegistry import org.dhis2.R import org.dhis2.common.BaseRobot -import org.dhis2.common.matchers.RecyclerviewMatchers import org.dhis2.common.matchers.RecyclerviewMatchers.Companion.hasItem -import org.dhis2.common.matchers.RecyclerviewMatchers.Companion.hasNoMoreResultsInProgram -import org.dhis2.common.viewactions.openSpinnerPopup -import org.dhis2.usescases.searchTrackEntity.listView.SearchResult -import org.dhis2.usescases.searchte.entity.DisplayListFieldsUIModel +import org.dhis2.tracker.search.ui.screen.SEARCH_PARAMETERS_LIST_TAG import org.hamcrest.CoreMatchers.allOf import org.hamcrest.CoreMatchers.not -import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItem import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue @@ -73,7 +65,14 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { ) } + @OptIn(ExperimentalTestApi::class) fun openNextSearchParameter(parameterValue: String) { + closeKeyboard() + composeTestRule.waitForIdle() + composeTestRule + .onNodeWithTag(SEARCH_PARAMETERS_LIST_TAG) + .performScrollToNode(hasText(parameterValue)) + composeTestRule.waitUntilAtLeastOneExists(hasText(parameterValue), TIMEOUT) composeTestRule.onNodeWithText(parameterValue).performClick() } @@ -97,74 +96,9 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { composeTestRule.onNodeWithTag("SEARCH_BUTTON").performClick() } - @OptIn(ExperimentalTestApi::class) - fun checkListOfSearchTEI(title: String, attributes: Map) { - //Checks title and all attributes are displayed - composeTestRule.waitUntilAtLeastOneExists(hasText(title)) - composeTestRule.onNodeWithText(title).assertIsDisplayed() - attributes.forEach { item -> - item.key?.let { composeTestRule.onNodeWithText("$it:", true).assertIsDisplayed() } - composeTestRule.onNode( - hasParent(hasTestTag("LIST_CARD_ADDITIONAL_INFO_COLUMN")) - and hasText(item.value, true), useUnmergedTree = true - ).assertIsDisplayed() - } - } - - fun checkNoSearchResult() { - onView(withId(R.id.scrollView)) - .check( - matches( - RecyclerviewMatchers.allElementsWithHolderTypeHave( - SearchResult::class.java, - allOf( - hasNoMoreResultsInProgram() - ) - ) - ) - ) - } - - fun clickOnProgramSpinner() { - onView(withId(R.id.program_spinner)).perform(openSpinnerPopup()) - } - - fun selectAProgram(program: String) { - onView(allOf(withId(R.id.spinner_text), withText(program))) - .perform(click()) - } - - fun checkProgramHasChanged(program: String) { - onView(withId(R.id.spinner_text)).check(matches(withText(program))) - } - - @OptIn(ExperimentalTestApi::class) - fun checkFieldsFromDisplayList( - displayListFieldsUIModel: DisplayListFieldsUIModel - ) { - //Given the title is the first attribute - val title = "First name: ${displayListFieldsUIModel.name}" - val displayedAttributes = createAttributesList(displayListFieldsUIModel) - val showMoreText = InstrumentationRegistry.getInstrumentation() - .targetContext.getString(R.string.show_more) - composeTestRule.waitForIdle() - composeTestRule.waitUntilAtLeastOneExists(hasText(showMoreText)) - //When we expand all attribute list - composeTestRule.onNodeWithText(showMoreText, true, useUnmergedTree = true).performClick() - //Then The title and all attributes are displayed - composeTestRule.onNodeWithText(title).assertIsDisplayed() - displayedAttributes.forEach { item -> - item.key?.let { composeTestRule.onNodeWithText("$it:", true).assertIsDisplayed() } - composeTestRule.onNode( - hasParent(hasTestTag("LIST_CARD_ADDITIONAL_INFO_COLUMN")) - and hasText(item.value, true), useUnmergedTree = true - ).assertIsDisplayed() - } - } - @OptIn(ExperimentalTestApi::class) fun clickOnShowMap() { - composeTestRule.waitUntilAtLeastOneExists(hasTestTag("NAVIGATION_BAR_ITEM_Map"),TIMEOUT) + composeTestRule.waitUntilAtLeastOneExists(hasTestTag("NAVIGATION_BAR_ITEM_Map"), TIMEOUT) composeTestRule.onNodeWithTag("NAVIGATION_BAR_ITEM_Map").performClick() } @@ -181,7 +115,7 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { // Finally assert that the text is displayed composeTestRule.onNode( hasAnyAncestor(hasTestTag("LIST_CARD_ADDITIONAL_INFO_COLUMN")) - and hasText(firstName, ignoreCase = true, substring = true), + and hasText(firstName, ignoreCase = true, substring = true), useUnmergedTree = true ).assertIsDisplayed() } @@ -194,30 +128,6 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { onView(withId(R.id.createButton)).perform(click()) } - fun checkListOfSearchTEIWithAdditionalInfo(title: String, additionalText: String) { - composeTestRule.onNodeWithText(title).assertIsDisplayed() - composeTestRule.onNodeWithContentDescription(additionalText).assertIsDisplayed() - } - - private fun createAttributesList(displayListFieldsUIModel: DisplayListFieldsUIModel) = listOf( - AdditionalInfoItem( - key = "Last name", - value = displayListFieldsUIModel.lastName, - ), - AdditionalInfoItem( - key = "Email", - value = displayListFieldsUIModel.email, - ), - AdditionalInfoItem( - key = "Date of birth", - value = displayListFieldsUIModel.birthday, - ), - AdditionalInfoItem( - key = "Address", - value = displayListFieldsUIModel.address, - ), - ) - // --- Methods for the TB Program search flow test --- @OptIn(ExperimentalTestApi::class) @@ -243,7 +153,11 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { .onAllNodesWithTag("SEARCH_PARAM_ITEM") .fetchSemanticsNodes() .size - assertEquals("Expected $expectedCount search parameters, but found $count", expectedCount, count) + assertEquals( + "Expected $expectedCount search parameters, but found $count", + expectedCount, + count + ) } @OptIn(ExperimentalTestApi::class) @@ -268,6 +182,10 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { // Any focus jump caused by the IMM dismiss is immediately overridden by clicking the label. closeKeyboard() composeTestRule.waitForIdle() + // Scroll the LazyColumn to ensure the target field is in composition before clicking. + composeTestRule + .onNodeWithTag(SEARCH_PARAMETERS_LIST_TAG) + .performScrollToNode(hasText(label)) composeTestRule.waitUntilAtLeastOneExists(hasText(label), TIMEOUT) composeTestRule.onNodeWithText(label).performClick() composeTestRule.waitUntilAtLeastOneExists(hasTestTag("INPUT_TEXT_FIELD"), TIMEOUT) @@ -301,24 +219,28 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { fun checkFocusedFieldShowsOperatorSupportingText() { composeTestRule.waitUntilAtLeastOneExists( hasText("Exact matches only") or - hasText("Must match the start of the value") or - hasText("Must match the end of the value"), + hasText("Must match the start of the value") or + hasText("Must match the end of the value"), TIMEOUT, ) } @OptIn(ExperimentalTestApi::class) fun checkMinCharactersErrorIsDisplayed(vararg fieldLabels: String) { - // Wait for UI to settle before checking for errors composeTestRule.waitForIdle() fieldLabels.forEach { label -> - // Look for a container that has both the field label and its corresponding - // "Enter at least" error message as descendants. This ensures the error is - // associated with the correct field. + // Scroll the LazyColumn to compose the target field before asserting. + // Off-screen items are dropped from composition on slow CI devices, causing + // waitUntilAtLeastOneExists to time out even though the error is present. + composeTestRule + .onNodeWithTag(SEARCH_PARAMETERS_LIST_TAG) + .performScrollToNode(hasText(label)) + composeTestRule.waitForIdle() + val containerMatcher = hasAnyDescendant(hasText(label)) and - hasAnyDescendant(hasText("Enter at least", substring = true)) + hasAnyDescendant(hasText("Enter at least", substring = true)) composeTestRule.waitUntilAtLeastOneExists(containerMatcher, TIMEOUT) @@ -333,23 +255,6 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { } } - @OptIn(ExperimentalTestApi::class) - fun checkMinAttributesWarningIsDisplayed() { - composeTestRule.waitUntilAtLeastOneExists( - hasText("You need to enter at least", substring = true), - TIMEOUT, - ) - } - - @OptIn(ExperimentalTestApi::class) - fun checkSearchResultCount(expectedCount: Int) { - composeTestRule.waitForIdle() - val nodes = composeTestRule - .onAllNodesWithTag("LIST_CARD_ITEM_TAG") - .fetchSemanticsNodes() - assertEquals("Expected $expectedCount search results, but found ${nodes.size}", expectedCount, nodes.size) - } - @OptIn(ExperimentalTestApi::class) fun checkSearchResultDisplayed(teiName: String) { composeTestRule.waitUntilAtLeastOneExists(hasText(teiName, substring = true), TIMEOUT) diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt index 1991f8d981b..93d48a728c2 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt @@ -18,6 +18,7 @@ import androidx.lifecycle.viewModelScope import androidx.paging.PagingData import androidx.paging.cachedIn import androidx.paging.map +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.Job import kotlinx.coroutines.async import kotlinx.coroutines.channels.Channel @@ -77,6 +78,7 @@ import timber.log.Timber const val TEI_TYPE_SEARCH_MAX_RESULTS = 5 +@OptIn(ExperimentalCoroutinesApi::class) class SearchTEIViewModel( val initialProgramUid: String?, initialQuery: MutableMap?>?, @@ -677,6 +679,7 @@ class SearchTEIViewModel( private fun performSearch() { viewModelScope.launch(dispatchers.io()) { + CoroutineTracker.increment() try { if (canPerformSearch()) { searching = queryDataList.isNotEmpty() @@ -720,6 +723,8 @@ class SearchTEIViewModel( } } catch (e: Exception) { Timber.d(e) + } finally { + CoroutineTracker.decrement() } } } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt index 6a21ccd1268..47fc387e9d2 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt @@ -112,6 +112,8 @@ class SearchTEList : FragmentGlobalAbstract() { arguments?.getBoolean(ARG_FROM_RELATIONSHIP) ?: false } + private var pagesUpdatedListener: (() -> Unit)? = null + companion object { fun get(fromRelationships: Boolean): SearchTEList = SearchTEList().apply { @@ -151,6 +153,12 @@ class SearchTEList : FragmentGlobalAbstract() { observeNewData() }.root + override fun onDestroyView() { + pagesUpdatedListener?.let { liveAdapter.removeOnPagesUpdatedListener(it) } + pagesUpdatedListener = null + super.onDestroyView() + } + override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) val layoutManager = recycler.layoutManager as? LinearLayoutManager @@ -370,13 +378,16 @@ class SearchTEList : FragmentGlobalAbstract() { private fun initData() { displayLoadingData() + val listener: () -> Unit = { + onInitDataLoaded() + CoroutineTracker.decrement() + } + pagesUpdatedListener = listener + liveAdapter.addOnPagesUpdatedListener(listener) + lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.searchPagingData.collect { data -> - liveAdapter.addOnPagesUpdatedListener { - onInitDataLoaded() - CoroutineTracker.decrement() - } + viewModel.searchPagingData.collectLatest { data -> liveAdapter.submitData(lifecycle, data) } } diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/coroutine/CoroutineTracker.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/coroutine/CoroutineTracker.kt index 0d05bcfa71e..e51ac96bca3 100644 --- a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/coroutine/CoroutineTracker.kt +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/coroutine/CoroutineTracker.kt @@ -1,24 +1,21 @@ package org.dhis2.mobile.commons.coroutine import kotlinx.atomicfu.atomic -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow object CoroutineTracker { private val activeTasks = atomic(0) - private val _isIdle = MutableStateFlow(true) - - val isIdle: StateFlow get() = _isIdle fun increment() { - val count = activeTasks.incrementAndGet() - _isIdle.value = false IdlingResourceProvider.idlingResource.increment() } fun decrement() { - val count = activeTasks.decrementAndGet() - _isIdle.value = (count == 0) + var current: Int + var next: Int + do { + current = activeTasks.value + next = (current - 1).coerceAtLeast(0) + } while (!activeTasks.compareAndSet(current, next)) IdlingResourceProvider.idlingResource.decrement() } } diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/screen/SearchParametersScreen.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/screen/SearchParametersScreen.kt index e29700ffe6b..cacf4b0d15a 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/screen/SearchParametersScreen.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/screen/SearchParametersScreen.kt @@ -149,7 +149,8 @@ fun SearchParametersScreen( LazyColumn( modifier = Modifier - .weight(1F), + .weight(1F) + .testTag(SEARCH_PARAMETERS_LIST_TAG), ) { if (uiState.items.isEmpty()) { item { @@ -303,3 +304,5 @@ fun getButtonColour(enabled: Boolean): Color = } else { TextColor.OnDisabledSurface } + +const val SEARCH_PARAMETERS_LIST_TAG = "SEARCH_PARAMETERS_LIST_TAG" From 20ebb7f210cfd540834f0524b94dba071cf82d74 Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Tue, 28 Apr 2026 12:37:33 +0200 Subject: [PATCH 206/260] fix(translations): sync translations from transifex (main) (#4833) --- sync/src/commonMain/composeResources/values-cnr/strings.xml | 5 +++++ sync/src/commonMain/composeResources/values-de/strings.xml | 5 +++++ sync/src/commonMain/composeResources/values-el/strings.xml | 5 +++++ sync/src/commonMain/composeResources/values-ga/strings.xml | 5 +++++ sync/src/commonMain/composeResources/values-hr/strings.xml | 5 +++++ sync/src/commonMain/composeResources/values-lb/strings.xml | 5 +++++ sync/src/commonMain/composeResources/values-mt/strings.xml | 5 +++++ 7 files changed, 35 insertions(+) create mode 100644 sync/src/commonMain/composeResources/values-cnr/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-de/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-el/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-ga/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-hr/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-lb/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-mt/strings.xml diff --git a/sync/src/commonMain/composeResources/values-cnr/strings.xml b/sync/src/commonMain/composeResources/values-cnr/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-cnr/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-de/strings.xml b/sync/src/commonMain/composeResources/values-de/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-de/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-el/strings.xml b/sync/src/commonMain/composeResources/values-el/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-el/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-ga/strings.xml b/sync/src/commonMain/composeResources/values-ga/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-ga/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-hr/strings.xml b/sync/src/commonMain/composeResources/values-hr/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-hr/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-lb/strings.xml b/sync/src/commonMain/composeResources/values-lb/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-lb/strings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sync/src/commonMain/composeResources/values-mt/strings.xml b/sync/src/commonMain/composeResources/values-mt/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-mt/strings.xml @@ -0,0 +1,5 @@ + + + + + From a09d8508520cb2c84ecf0317cf370e7ef2e9ec30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manu=20Mu=C3=B1oz?= Date: Tue, 28 Apr 2026 13:50:08 +0200 Subject: [PATCH 207/260] fix: [ANDROAPP-6516] update event when synced (#4795) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Manu Muñoz --- .../dhis2/data/service/SyncPresenterImpl.kt | 12 ++++++++---- .../org/dhis2/data/service/SyncRepository.kt | 5 ++++- .../dhis2/data/service/SyncRepositoryImpl.kt | 19 ++++++++++--------- .../eventCapture/EventCaptureActivity.kt | 16 ++++++++++++++-- .../eventCapture/EventCapturePagerAdapter.kt | 17 +++++++++++++++++ .../dhis2/data/services/SyncPresenterTest.kt | 9 ++++++++- 6 files changed, 61 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/org/dhis2/data/service/SyncPresenterImpl.kt b/app/src/main/java/org/dhis2/data/service/SyncPresenterImpl.kt index f4df0fcb443..28f480d09f8 100644 --- a/app/src/main/java/org/dhis2/data/service/SyncPresenterImpl.kt +++ b/app/src/main/java/org/dhis2/data/service/SyncPresenterImpl.kt @@ -7,6 +7,7 @@ import io.reactivex.Completable import io.reactivex.Observable import kotlinx.coroutines.runBlocking import org.dhis2.commons.bindings.enrollment +import org.dhis2.commons.bindings.event import org.dhis2.commons.bindings.program import org.dhis2.commons.date.DateUtils import org.dhis2.commons.prefs.Preference.Companion.EVENT_MAX @@ -57,10 +58,13 @@ class SyncPresenterImpl( override fun syncGranularEvent(eventUid: String): Observable { Completable.fromObservable(syncRepository.uploadEvent(eventUid)).blockingAwait() - return syncRepository - .downLoadEvent(eventUid) - .map { it as D2Progress } - .mergeWith(syncRepository.downloadEventFiles(eventUid)) + val programUid = d2.event(eventUid)?.program() + return programUid?.let { + syncRepository + .downLoadEvent(eventUid, programUid) + .map { it as D2Progress } + .mergeWith(syncRepository.downloadEventFiles(eventUid)) + } ?: Observable.empty() } override fun blockSyncGranularProgram(programUid: String): ListenableWorker.Result { diff --git a/app/src/main/java/org/dhis2/data/service/SyncRepository.kt b/app/src/main/java/org/dhis2/data/service/SyncRepository.kt index 1d317d969af..8eaf15b5ac6 100644 --- a/app/src/main/java/org/dhis2/data/service/SyncRepository.kt +++ b/app/src/main/java/org/dhis2/data/service/SyncRepository.kt @@ -25,7 +25,10 @@ interface SyncRepository { fun uploadEvent(eventUid: String): Observable - fun downLoadEvent(eventUid: String): Observable + fun downLoadEvent( + eventUid: String, + programUid: String, + ): Observable fun downloadEventFiles(eventUid: String): Observable diff --git a/app/src/main/java/org/dhis2/data/service/SyncRepositoryImpl.kt b/app/src/main/java/org/dhis2/data/service/SyncRepositoryImpl.kt index 3fdcf93e39b..5bcde1cf077 100644 --- a/app/src/main/java/org/dhis2/data/service/SyncRepositoryImpl.kt +++ b/app/src/main/java/org/dhis2/data/service/SyncRepositoryImpl.kt @@ -1,8 +1,6 @@ package org.dhis2.data.service -import io.reactivex.Observable import org.hisp.dhis.android.core.D2 -import org.hisp.dhis.android.core.arch.call.D2Progress import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.event.Event import org.hisp.dhis.android.core.trackedentity.TrackedEntityInstance @@ -57,13 +55,16 @@ class SyncRepositoryImpl( .eq(eventUid) .upload() - override fun downLoadEvent(eventUid: String): Observable = - d2 - .eventModule() - .eventDownloader() - .byUid() - .eq(eventUid) - .download() + override fun downLoadEvent( + eventUid: String, + programUid: String, + ) = d2 + .eventModule() + .eventDownloader() + .byProgramUid(programUid) + .byUid() + .eq(eventUid) + .download() override fun downloadEventFiles(eventUid: String) = d2 diff --git a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureActivity.kt b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureActivity.kt index 1341577322f..daa9d93d5db 100644 --- a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureActivity.kt +++ b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureActivity.kt @@ -572,8 +572,20 @@ class EventCaptureActivity : .onDismissListener( object : OnDismissListener { override fun onDismiss(hasChanged: Boolean) { - if (hasChanged && syncType == TEI_SYNC) { - dashboardViewModel?.updateDashboard() + if (hasChanged) { + when (syncType) { + TEI_SYNC -> { + dashboardViewModel?.updateDashboard() + } + + EVENT_SYNC -> { + if (isLandscape()) { + eventUid?.let { uid -> setUpEventCaptureFormLandscape(uid) } + } else { + adapter?.refreshDataEntry() + } + } + } } } }, diff --git a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCapturePagerAdapter.kt b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCapturePagerAdapter.kt index 810b1550e3a..c6a9aec9f7e 100644 --- a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCapturePagerAdapter.kt +++ b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCapturePagerAdapter.kt @@ -25,6 +25,7 @@ class EventCapturePagerAdapter( ) : FragmentStateAdapter(fragmentActivity) { private val landscapePages: MutableList = ArrayList() private val portraitPages: MutableList = ArrayList() + private val itemIds: MutableList = ArrayList() fun isFormScreenShown(currentItem: Int?): Boolean = currentItem != null && portraitPages[currentItem] == EventPageType.DATA_ENTRY @@ -50,6 +51,12 @@ class EventCapturePagerAdapter( } portraitPages.add(EventPageType.NOTES) landscapePages.add(EventPageType.NOTES) + + if (isPortrait) { + portraitPages.forEach { itemIds.add(it.ordinal * 1000L) } + } else { + landscapePages.forEach { itemIds.add(it.ordinal * 1000L) } + } } override fun createFragment(position: Int): Fragment = @@ -125,4 +132,14 @@ class EventCapturePagerAdapter( companion object { const val NO_POSITION: Int = -1 } + + fun refreshDataEntry() { + val index = portraitPages.indexOf(EventPageType.DATA_ENTRY) + itemIds[index] = itemIds[index] + 1 + notifyItemChanged(index) + } + + override fun getItemId(position: Int): Long { + return itemIds[position] + } } diff --git a/app/src/test/java/org/dhis2/data/services/SyncPresenterTest.kt b/app/src/test/java/org/dhis2/data/services/SyncPresenterTest.kt index 32d7b2e1199..8c262cbac20 100644 --- a/app/src/test/java/org/dhis2/data/services/SyncPresenterTest.kt +++ b/app/src/test/java/org/dhis2/data/services/SyncPresenterTest.kt @@ -1,6 +1,7 @@ package org.dhis2.data.services import io.reactivex.Observable +import org.dhis2.commons.bindings.event import org.dhis2.commons.bindings.program import org.dhis2.commons.prefs.PreferenceProvider import org.dhis2.data.service.SyncPresenterImpl @@ -316,8 +317,14 @@ class SyncPresenterTest { eventUid: String = "uid", programUid: String = "programUid", ) { + whenever(d2.event(eventUid)) doReturn + Event + .builder() + .uid(eventUid) + .program(programUid) + .build() whenever( - syncRepository.downLoadEvent(eventUid), + syncRepository.downLoadEvent(eventUid, programUid), ) doReturn Observable.fromArray( TrackerD2Progress.builder().build(), From 94f889d420316fbd1a8b3ded0f871af53261bc6c Mon Sep 17 00:00:00 2001 From: Pablo Date: Tue, 28 Apr 2026 15:02:43 +0200 Subject: [PATCH 208/260] fix: [ANDROAPP-7569] Set default sync periods if ASWA is not configured (#4835) * fix: [ANDROAPP-7569] Set default sync periods if ASWA is not configured * fix: [ANDROAPP-7569] Set default sync periods if ASWA is not configured --- .../dhis2/mobile/sync/domain/SyncMetadata.kt | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt index bd4ccd968f1..8fa0645a988 100644 --- a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt @@ -56,14 +56,19 @@ class SyncMetadata( val metadataSyncPeriodChangedToManual = initialMetadataSyncPeriod !is SyncPeriod.Manual && finalMetadataSyncPeriod is SyncPeriod.Manual + val notScheduled = + syncBackgroundJobAction.getNextMetadataSync() == null && finalMetadataSyncPeriod !is SyncPeriod.Manual + when { metadataSyncPeriodChangedToManual -> { syncBackgroundJobAction.cancelMetadataSync() syncBackgroundJobAction.launchSyncSettings() } - metadataSyncPeriodChanged -> { - syncBackgroundJobAction.launchMetadataSync(finalMetadataSyncPeriod?.toSeconds() ?: 0L) + metadataSyncPeriodChanged || notScheduled -> { + syncBackgroundJobAction.launchMetadataSync( + finalMetadataSyncPeriod?.toSeconds() ?: SyncPeriod.Every7Days.toSeconds(), + ) } } } @@ -76,13 +81,18 @@ class SyncMetadata( val dataSyncPeriodChangedToManual = initialDataSyncPeriod !is SyncPeriod.Manual && finalDataSyncPeriod is SyncPeriod.Manual + val notScheduled = + syncBackgroundJobAction.getNextDataSync() == null && finalDataSyncPeriod !is SyncPeriod.Manual + when { dataSyncPeriodChangedToManual -> { syncBackgroundJobAction.cancelDataSync() } - dataSyncPeriodChanged -> { - syncBackgroundJobAction.launchDataSync(finalDataSyncPeriod?.toSeconds() ?: 0) + dataSyncPeriodChanged || notScheduled -> { + syncBackgroundJobAction.launchDataSync( + finalDataSyncPeriod?.toSeconds() ?: SyncPeriod.Every24Hour.toSeconds(), + ) } } } From 4721fc7292a247b7a1d2668bc68560bfb53b0652 Mon Sep 17 00:00:00 2001 From: Xavier Molloy Date: Wed, 29 Apr 2026 12:24:16 +0200 Subject: [PATCH 209/260] fix: [ANDROAPP-7567] Hide unsupported value types in search (#4836) * fix: [ANDROAPP-7567] Do not display image or coordinate inputs in search parameter screen * imput tracker type simplification * fix: [ANDROAPP-7531] Text inputs save value after 1 seconds of not typing * fix: [ANDROAPP-7567] Add the rest of unsupported fields to hidden items --------- Co-authored-by: Pablo Pajuelo Cabezas --- .../SearchRepositoryImplKt.kt | 2 ++ .../data/SearchParametersRepositoryImpl.kt | 5 +++-- .../tracker/input/model/TrackerInputType.kt | 2 ++ .../input/ui/provider/TrackerInputProvider.kt | 9 +++------ .../search/domain/FetchSearchParameters.kt | 19 ++++++++++++++++++- .../domain/FetchSearchParametersTest.kt | 5 +++++ 6 files changed, 33 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImplKt.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImplKt.kt index d1b4f4fc90e..ebe848c5748 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImplKt.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImplKt.kt @@ -209,6 +209,8 @@ class SearchRepositoryImplKt( TrackerInputType.NOT_SUPPORTED, TrackerInputType.CUSTOM_INTENT, -> ValueType.TEXT + TrackerInputType.COORDINATES -> ValueType.COORDINATE + TrackerInputType.IMAGE -> ValueType.IMAGE } override fun mapTrackedEntitySearchItemResultToSearchTeiModel( diff --git a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchParametersRepositoryImpl.kt b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchParametersRepositoryImpl.kt index f09c06d7074..45b2145bed7 100644 --- a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchParametersRepositoryImpl.kt +++ b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchParametersRepositoryImpl.kt @@ -207,13 +207,14 @@ class SearchParametersRepositoryImpl( ValueType.UNIT_INTERVAL, ValueType.TRACKER_ASSOCIATE, ValueType.REFERENCE, - ValueType.COORDINATE, - ValueType.IMAGE, ValueType.FILE_RESOURCE, ValueType.GEOJSON, ValueType.URL, null, -> TrackerInputType.NOT_SUPPORTED + + ValueType.COORDINATE -> TrackerInputType.COORDINATES + ValueType.IMAGE -> TrackerInputType.IMAGE } private fun getInputTypeForOptionSetByRenderingType(valueTypeRenderingType: ValueTypeRenderingType?): TrackerInputType = diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/model/TrackerInputType.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/model/TrackerInputType.kt index a8debd148c1..baf77aeb8c1 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/model/TrackerInputType.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/model/TrackerInputType.kt @@ -33,5 +33,7 @@ enum class TrackerInputType { SEQUENTIAL, DROPDOWN, NOT_SUPPORTED, + COORDINATES, + IMAGE, CUSTOM_INTENT, } diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt index 4af849e4123..0965f46d189 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt @@ -35,7 +35,6 @@ import org.hisp.dhis.mobile.ui.designsystem.component.InputLink import org.hisp.dhis.mobile.ui.designsystem.component.InputLongText import org.hisp.dhis.mobile.ui.designsystem.component.InputMultiSelection import org.hisp.dhis.mobile.ui.designsystem.component.InputNegativeInteger -import org.hisp.dhis.mobile.ui.designsystem.component.InputNotSupported import org.hisp.dhis.mobile.ui.designsystem.component.InputNumber import org.hisp.dhis.mobile.ui.designsystem.component.InputOrgUnit import org.hisp.dhis.mobile.ui.designsystem.component.InputPercentage @@ -756,12 +755,10 @@ fun TrackerInputProvider( TrackerInputType.MATRIX, TrackerInputType.SEQUENTIAL, TrackerInputType.NOT_SUPPORTED, + TrackerInputType.COORDINATES, + TrackerInputType.IMAGE, -> { - InputNotSupported( - modifier = modifierWithFocus.fillMaxWidth(), - title = inputModel.label, - inputStyle = inputStyle, - ) + // no-op } } } diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/FetchSearchParameters.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/FetchSearchParameters.kt index 15995134fca..df57dfdbceb 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/FetchSearchParameters.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/FetchSearchParameters.kt @@ -13,6 +13,17 @@ class FetchSearchParameters( val dispatcher: Dispatcher, val repository: SearchParametersRepository, ) : UseCase> { + val hiddenInputTypes = + listOf( + TrackerInputType.IMAGE, + TrackerInputType.COORDINATES, + TrackerInputType.LETTER, + TrackerInputType.UNIT_INTERVAL, + TrackerInputType.COORDINATES, + TrackerInputType.URL, + TrackerInputType.NOT_SUPPORTED, + ) + override suspend fun invoke(input: FetchSearchParametersData): Result> = withContext(dispatcher.io) { try { @@ -21,7 +32,13 @@ class FetchSearchParameters( repository.getSearchParametersByProgram(it) } ?: repository.getSearchParametersByTrackedEntityType(input.teiTypeUid) - Result.success(sortSearchParameters(searchParameters)) + val filteredSearchParameters = + searchParameters + .filter { + it.inputType !in hiddenInputTypes + } + + Result.success(sortSearchParameters(filteredSearchParameters)) } catch (e: DomainError) { Result.failure(e) } diff --git a/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/domain/FetchSearchParametersTest.kt b/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/domain/FetchSearchParametersTest.kt index e0fdab3c52a..9b97999b5c5 100644 --- a/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/domain/FetchSearchParametersTest.kt +++ b/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/domain/FetchSearchParametersTest.kt @@ -57,6 +57,11 @@ class FetchSearchParametersTest { createSearchParameter("param1", TrackerInputType.TEXT, isUnique = false), createSearchParameter("param2", TrackerInputType.QR_CODE, isUnique = true), createSearchParameter("param3", TrackerInputType.BAR_CODE, isUnique = false), + createSearchParameter( + "param4", + TrackerInputType.IMAGE, + isUnique = false, + ), ) whenever(repository.getSearchParametersByProgram(programUid)) doReturn parameters From bdf18a477f0840125d40005981060f9c7767d850 Mon Sep 17 00:00:00 2001 From: Pablo Date: Thu, 30 Apr 2026 08:17:40 +0200 Subject: [PATCH 210/260] fix: [ANDROAPP-7533] Multiple clicks on WorkingList item not updating properly the displayed list (#4793) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: [ANDROAPP-7533] Multiple clicks on WorkingList item not updating properly the displayed list * fix: [ANDROAPP-7533] check working list scope by uid to avoid loop Signed-off-by: Manu Muñoz --------- Signed-off-by: Manu Muñoz Co-authored-by: Manu Muñoz --- .../searchTrackEntity/listView/SearchTEList.kt | 13 +++++++------ .../org/dhis2/utils/filters/FilterManagerTest.kt | 2 ++ .../org/dhis2/commons/filters/FilterManager.java | 2 +- .../data/EventProgramFilterSearchHelper.kt | 1 + .../commons/filters/data/TeiWorkingListScope.kt | 16 ++++++++++++++-- .../filters/data/TrackerFilterSearchHelper.kt | 5 ++++- 6 files changed, 29 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt index 6a21ccd1268..d3b834095ff 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt @@ -370,14 +370,15 @@ class SearchTEList : FragmentGlobalAbstract() { private fun initData() { displayLoadingData() + liveAdapter.addOnPagesUpdatedListener { + onInitDataLoaded() + CoroutineTracker.decrement() + } + lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.searchPagingData.collect { data -> - liveAdapter.addOnPagesUpdatedListener { - onInitDataLoaded() - CoroutineTracker.decrement() - } - liveAdapter.submitData(lifecycle, data) + viewModel.searchPagingData.collectLatest { data -> + liveAdapter.submitData(data) } } } diff --git a/app/src/test/java/org/dhis2/utils/filters/FilterManagerTest.kt b/app/src/test/java/org/dhis2/utils/filters/FilterManagerTest.kt index e9e402e3f18..274245d70b5 100644 --- a/app/src/test/java/org/dhis2/utils/filters/FilterManagerTest.kt +++ b/app/src/test/java/org/dhis2/utils/filters/FilterManagerTest.kt @@ -164,6 +164,7 @@ class FilterManagerTest { fun `Should count filters in total for event working list`() { val workingListScope = EventWorkingListScope( + workingListUid = "uid", stageUid = "uid", eventDate = "23/11/2023", eventStatusList = listOf("status"), @@ -179,6 +180,7 @@ class FilterManagerTest { fun `Should count filters in total for tei working list`() { val workingListScope = TeiWorkingListScope( + workingListUid = "uid", enrollmentStatusList = listOf("status", "status"), enrollmentDate = null, eventStatusList = listOf(), diff --git a/commons/src/main/java/org/dhis2/commons/filters/FilterManager.java b/commons/src/main/java/org/dhis2/commons/filters/FilterManager.java index 9a9e1ebfa91..d993da4e34f 100644 --- a/commons/src/main/java/org/dhis2/commons/filters/FilterManager.java +++ b/commons/src/main/java/org/dhis2/commons/filters/FilterManager.java @@ -683,7 +683,7 @@ public boolean workingListActive() { } public void setWorkingListScope(WorkingListScope scope) { - if (!currentWorkingListScope.get().equals(scope)) { + if (!Objects.equals(currentWorkingListScope.get().workingListUid(), scope.workingListUid())) { currentWorkingListScope.set(scope); setFilterCountersForWorkingList(scope); } diff --git a/commons/src/main/java/org/dhis2/commons/filters/data/EventProgramFilterSearchHelper.kt b/commons/src/main/java/org/dhis2/commons/filters/data/EventProgramFilterSearchHelper.kt index 0be3b29d4c8..08262650f92 100644 --- a/commons/src/main/java/org/dhis2/commons/filters/data/EventProgramFilterSearchHelper.kt +++ b/commons/src/main/java/org/dhis2/commons/filters/data/EventProgramFilterSearchHelper.kt @@ -40,6 +40,7 @@ class EventProgramFilterSearchHelper filterManager.setWorkingListScope( it.scope.mapToEventWorkingListScope( filterRepository.resources, + filterManager.currentWorkingList()?.uid, ), ) } diff --git a/commons/src/main/java/org/dhis2/commons/filters/data/TeiWorkingListScope.kt b/commons/src/main/java/org/dhis2/commons/filters/data/TeiWorkingListScope.kt index bd75e3c9bbc..8f0bd2650b1 100644 --- a/commons/src/main/java/org/dhis2/commons/filters/data/TeiWorkingListScope.kt +++ b/commons/src/main/java/org/dhis2/commons/filters/data/TeiWorkingListScope.kt @@ -28,6 +28,8 @@ sealed class WorkingListScope { abstract fun assignCount(): Int abstract fun value(filterType: Filters): String + + abstract fun workingListUid(): String? } data class EmptyWorkingList( @@ -54,9 +56,12 @@ data class EmptyWorkingList( override fun assignCount(): Int = 0 override fun value(filterType: Filters) = "" + + override fun workingListUid() = null } data class TeiWorkingListScope( + val workingListUid: String?, val enrollmentStatusList: List?, val enrollmentDate: String?, val eventStatusList: List?, @@ -99,9 +104,12 @@ data class TeiWorkingListScope( Filters.ENROLLMENT_STATUS -> enrollmentStatusList?.joinToString() ?: "" else -> "" } + + override fun workingListUid(): String? = workingListUid } data class EventWorkingListScope( + val workingListUid: String?, val stageUid: String?, val eventDate: String?, val eventStatusList: List?, @@ -133,10 +141,13 @@ data class EventWorkingListScope( Filters.EVENT_STATUS -> eventStatusList?.joinToString() ?: "" else -> "" } + + override fun workingListUid(): String? = workingListUid } -fun TrackedEntityInstanceQueryRepositoryScope.mapToWorkingListScope(resources: FilterResources): TeiWorkingListScope = +fun TrackedEntityInstanceQueryRepositoryScope.mapToWorkingListScope(resources: FilterResources, workingListUid: String?): TeiWorkingListScope = TeiWorkingListScope( + workingListUid, enrollmentStatus()?.let { resources.enrollmentStatusToText(it) }, programDate()?.let { resources.dateFilterPeriodToText(it) }, resources.eventStatusToText( @@ -154,8 +165,9 @@ fun TrackedEntityInstanceQueryRepositoryScope.mapToWorkingListScope(resources: F dataValue().associateBy({ it.key() }, { it.value() }), ) -fun EventQueryRepositoryScope.mapToEventWorkingListScope(resources: FilterResources): EventWorkingListScope = +fun EventQueryRepositoryScope.mapToEventWorkingListScope(resources: FilterResources, workingListUid: String?): EventWorkingListScope = EventWorkingListScope( + workingListUid, programStage(), eventDate()?.let { resources.dateFilterPeriodToText(it) }, eventStatus()?.let { resources.eventStatusToText(it) }, diff --git a/commons/src/main/java/org/dhis2/commons/filters/data/TrackerFilterSearchHelper.kt b/commons/src/main/java/org/dhis2/commons/filters/data/TrackerFilterSearchHelper.kt index 9b0067c04f5..21f77b9abaa 100644 --- a/commons/src/main/java/org/dhis2/commons/filters/data/TrackerFilterSearchHelper.kt +++ b/commons/src/main/java/org/dhis2/commons/filters/data/TrackerFilterSearchHelper.kt @@ -46,7 +46,10 @@ class TrackerFilterSearchHelper filterManager.currentWorkingList(), ).also { filterManager.setWorkingListScope( - it.scope.mapToWorkingListScope(filterRepository.resources), + it.scope.mapToWorkingListScope( + filterRepository.resources, + filterManager.currentWorkingList()?.uid, + ), ) } } else { From 8a411ab66607ee1a28d763025645d1a2b74e2212 Mon Sep 17 00:00:00 2001 From: Pablo Date: Thu, 30 Apr 2026 12:11:16 +0200 Subject: [PATCH 211/260] fix: [ANDROAPP-7531] Text inputs save value after 1 seconds of not typing (#4825) --- .../java/org/dhis2/form/ui/FormViewModel.kt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/form/src/main/java/org/dhis2/form/ui/FormViewModel.kt b/form/src/main/java/org/dhis2/form/ui/FormViewModel.kt index 5c09c57329b..3c92166b131 100644 --- a/form/src/main/java/org/dhis2/form/ui/FormViewModel.kt +++ b/form/src/main/java/org/dhis2/form/ui/FormViewModel.kt @@ -126,6 +126,7 @@ class FormViewModel( ) private val handler = Handler(Looper.getMainLooper()) + private var textChangeDebounceRunnable: Runnable? = null var filePath: String? = null @@ -161,6 +162,11 @@ class FormViewModel( loadData() } + override fun onCleared() { + textChangeDebounceRunnable?.let { handler.removeCallbacks(it) } + super.onCleared() + } + private fun displayResult(result: Pair) { result.second.valueStoreResult?.let { when (it) { @@ -309,6 +315,18 @@ class FormViewModel( private fun handleOnTextChangeAction(action: RowAction): StoreResult { repository.updateValueOnList(action.id, action.value, action.valueType) + textChangeDebounceRunnable?.let { handler.removeCallbacks(it) } + textChangeDebounceRunnable = Runnable { + viewModelScope.launch { + pendingIntents.emit( + FormIntent.OnSave( + uid = action.id, + value = action.value, + valueType = action.valueType, + ), + ) + } + }.also { handler.postDelayed(it, 1_000L) } return StoreResult( action.id, ValueStoreResult.TEXT_CHANGING, From aeffb4a647e16568b4e387f7d83d23504359e006 Mon Sep 17 00:00:00 2001 From: Xavier Molloy Date: Thu, 30 Apr 2026 15:30:36 +0200 Subject: [PATCH 212/260] fix: add imports and missing file for training build variant (#4841) --- .../main/domain/DownloadNewVersion.kt | 33 +++++++++++++++++++ .../utils/granularsync/GranularSyncModule.kt | 2 ++ 2 files changed, 35 insertions(+) create mode 100644 app/src/dhis2Training/java/org/dhis2/usescases/main/domain/DownloadNewVersion.kt diff --git a/app/src/dhis2Training/java/org/dhis2/usescases/main/domain/DownloadNewVersion.kt b/app/src/dhis2Training/java/org/dhis2/usescases/main/domain/DownloadNewVersion.kt new file mode 100644 index 00000000000..746bee80950 --- /dev/null +++ b/app/src/dhis2Training/java/org/dhis2/usescases/main/domain/DownloadNewVersion.kt @@ -0,0 +1,33 @@ +package org.dhis2.usescases.main.domain + +import android.content.Context +import kotlinx.coroutines.suspendCancellableCoroutine +import org.dhis2.data.service.VersionRepository +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.domain.model.DownloadMethod +import kotlin.coroutines.resume + +class DownloadNewVersion( + private val versionRepository: VersionRepository, +) : UseCase { + override suspend fun invoke(input: Context): Result = + try { + suspendCancellableCoroutine { continuation -> + versionRepository.download( + context = input, + onDownloadCompleted = { + continuation.resume(Result.success(DownloadMethod.File(it))) + }, + onDownloading = { + // no-op + }, + ) + continuation.invokeOnCancellation { + // If needed perform action on cancellation + } + } + } catch (e: DomainError) { + Result.failure(e) + } +} diff --git a/app/src/dhis2Training/java/org/dhis2/utils/granularsync/GranularSyncModule.kt b/app/src/dhis2Training/java/org/dhis2/utils/granularsync/GranularSyncModule.kt index d23e72d0366..12ed81557f2 100644 --- a/app/src/dhis2Training/java/org/dhis2/utils/granularsync/GranularSyncModule.kt +++ b/app/src/dhis2Training/java/org/dhis2/utils/granularsync/GranularSyncModule.kt @@ -13,6 +13,8 @@ import org.dhis2.commons.sync.SyncContext import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.dhislogic.DhisProgramUtils import org.dhis2.data.service.workManager.WorkManagerController +import org.dhis2.utils.granularsync.data.GranularSyncRepository +import org.dhis2.utils.granularsync.ui.SyncUiStateMapper import org.hisp.dhis.android.core.D2 @Module From ac5fd7d422ebedc939b8e0360ee42f0d320d9fc5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 1 May 2026 09:45:57 +0200 Subject: [PATCH 213/260] Update Sdk, Design System, and Version Code (#4845) * Update version code, sdk, and design system release version * build: 3.4.0 release --------- Co-authored-by: @dhis2-bot Co-authored-by: andresmr --- RELEASE.md | 79 +++++++++++++------------------- gradle/libs.versions.toml | 6 +-- gradle/verification-metadata.xml | 27 +++++++++++ whatsnew/whatsnew-en-US | 17 ++++--- 4 files changed, 71 insertions(+), 58 deletions(-) diff --git a/RELEASE.md b/RELEASE.md index ed20a609629..b566936cbc9 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -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 \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b8f10ef4466..7d0c322f3a7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,14 +4,14 @@ lifecycleRuntimeCompose = "2.9.6" navigationCompose = "2.9.2" sdk = "36" minSdk = "23" -vCode = "151" +vCode = "152" vName = "3.4.0-RC" gradle = "9.0.1" kotlin = '2.3.10' dagger = '2.57.2' jacoco = '0.8.14' -designSystem = "0.7.0-SNAPSHOT" -dhis2sdk = "1.14.0-SNAPSHOT" +designSystem = "0.7.0" +dhis2sdk = "1.14.0" ruleEngine = "3.7.1" expressionParser = "1.4.0" appcompat = "1.7.1" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 8885c5a0dc9..8c706fd18e5 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -792,6 +792,11 @@ + + + + + @@ -1240,6 +1245,9 @@ + + + @@ -1279,6 +1287,9 @@ + + + @@ -13281,6 +13292,22 @@ + + + + + + + + + + + + + + + + diff --git a/whatsnew/whatsnew-en-US b/whatsnew/whatsnew-en-US index 9e29dc675af..0be924354d9 100644 --- a/whatsnew/whatsnew-en-US +++ b/whatsnew/whatsnew-en-US @@ -1,7 +1,10 @@ -This is a patch version that fixes: -- ANDROAPP-7269 Crash on search -- ANDROAPP-7293 Bottom sheet landscape behavior -- ANDROAPP-7345 Changes to enrollment date not respected by program rules -- ANDROAPP-7368 Crash when trying to update fields in Tracker -.... -You can find all the details on Jira and Github. \ No newline at end of file +Version 3.4.0 includes: +- Search performance: configure operators and min characters for TEI searches +- Custom theme: DHIS2 instance color reflected in the Android app +- Feedback widget: Markdown formatting and legend-based color coding +- Program rule action priority ordering +- Redesigned PIN login screen +- Metadata sync: new 6h and 12h intervals with daily config detection +- Improved event ordering for consistent sync and calculations + +Details: github.com/dhis2/dhis2-android-capture-app \ No newline at end of file From 315eb8d4f80ca8df5d56bb7fcb44b84f02d2204f Mon Sep 17 00:00:00 2001 From: andresmr Date: Fri, 1 May 2026 10:01:44 +0200 Subject: [PATCH 214/260] build: update release 3.4.0 with main --- .../values-hi-rIN/strings.xml | 6 -- .../src/main/res/values-en-rUS/strings.xml | 19 +----- gradle/verification-metadata.xml | 64 +++++++++++++++++++ 3 files changed, 65 insertions(+), 24 deletions(-) diff --git a/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml b/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml index 4d2094cda8d..ce60d43e806 100644 --- a/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml @@ -17,12 +17,6 @@ यह फ़ील्ड आवश्यक है आपके पास कुछ चेतावनी संदेश हैं आपके पास कुछ चेतावनी संदेश हैं\nक्या आप इस फ़ॉर्म को कम्प्लीट मार्क करना चाहते हैं\? - मान अद्वितीय होना चाहिए। समान मान मिला है। इसे सहेजा नहीं गया। कृपया जाँच करें - समय चुनें - दिन चुनें - यह फ़ील्ड आवश्यक है - आपके पास कुछ चेतावनी संदेश हैं - आपके पास कुछ चेतावनी संदेश हैं\nक्या आप इस फ़ॉर्म को कम्प्लीट मार्क करना चाहते हैं\? आवश्यकता है तारीख वर्ष diff --git a/dhis_android_analytics/src/main/res/values-en-rUS/strings.xml b/dhis_android_analytics/src/main/res/values-en-rUS/strings.xml index c05e9dbeb70..a508bacacfb 100644 --- a/dhis_android_analytics/src/main/res/values-en-rUS/strings.xml +++ b/dhis_android_analytics/src/main/res/values-en-rUS/strings.xml @@ -1,21 +1,4 @@ -<<<<<<<< HEAD:dhis_android_analytics/src/main/res/values-en-rUS/strings.xml Accept -======== - Завершити - Відхилити внесені зміни - Не зараз - Продовжити редагування - Перегляд - Скасувати - Зберегти - Очистити - Намалюй тут. - Обрати - Скасувати - Закрити - Пошук - Очистити все ->>>>>>>> main:ui-components/src/main/res/values-uk/strings.xml - \ No newline at end of file + diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 8c706fd18e5..db26ac8ac9b 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -6738,6 +6738,14 @@ + + + + + + + + @@ -7490,6 +7498,14 @@ + + + + + + + + @@ -7506,6 +7522,14 @@ + + + + + + + + @@ -7522,6 +7546,14 @@ + + + + + + + + @@ -7570,6 +7602,14 @@ + + + + + + + + @@ -7586,6 +7626,14 @@ + + + + + + + + @@ -7602,6 +7650,14 @@ + + + + + + + + @@ -7618,6 +7674,14 @@ + + + + + + + + From b370a9578d575bf605d110487c1f2fc3c348a565 Mon Sep 17 00:00:00 2001 From: andresmr Date: Fri, 1 May 2026 11:35:42 +0200 Subject: [PATCH 215/260] build: update release 3.4.0 version name and version code --- gradle/libs.versions.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7d0c322f3a7..909c3f827fa 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,8 +4,8 @@ lifecycleRuntimeCompose = "2.9.6" navigationCompose = "2.9.2" sdk = "36" minSdk = "23" -vCode = "152" -vName = "3.4.0-RC" +vCode = "153" +vName = "3.4.0" gradle = "9.0.1" kotlin = '2.3.10' dagger = '2.57.2' From 9daf41936fe20dc04ce1fc396469d64a27e067bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Mon, 4 May 2026 15:05:54 +0200 Subject: [PATCH 216/260] ANDROAPP-7580-OpenId-expose-property-to-configure-prompt-selection [skip size] (#4832) * Add prompt support to OpenID login and refactor to use OpenIdLoginConfiguration * Add unit tests for OpenID Connect configuration and prompt parameter forwarding (#4837) --- app/build.gradle.kts | 3 + .../java/org/dhis2/di/KoinInitialization.kt | 1 + .../login/main/data/LoginRepositoryImpl.kt | 26 +- .../login/main/di/LoginModule.android.kt | 6 +- .../mobile/login/main/data/LoginRepository.kt | 11 +- .../domain/model/OpenIdLoginConfiguration.kt | 12 + .../login/main/domain/usecase/OpenIdLogin.kt | 24 +- .../login/main/ui/state/CredentialsUiState.kt | 19 +- .../main/ui/viewmodel/CredentialsViewModel.kt | 18 +- .../main/domain/usecase/OpenIdLoginTest.kt | 363 ++++-------------- .../ui/viewmodel/CredentialsViewModelTest.kt | 165 +++++++- 11 files changed, 294 insertions(+), 354 deletions(-) create mode 100644 login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/OpenIdLoginConfiguration.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 2bf02fc2491..8e0518f0e8a 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -161,6 +161,9 @@ android { val openIdButtonText = envOrLocal("OPEN_ID_BUTTON_TEXT") buildConfigField("String", "OPEN_ID_BUTTON_TEXT", "\"$openIdButtonText\"") + + val openIdPrompt = envOrLocal("OPEN_ID_PROMPT") + buildConfigField("String", "OPEN_ID_PROMPT", "\"$openIdPrompt\"") } packaging { jniLibs { diff --git a/app/src/main/java/org/dhis2/di/KoinInitialization.kt b/app/src/main/java/org/dhis2/di/KoinInitialization.kt index 33716000dc5..a523c08a618 100644 --- a/app/src/main/java/org/dhis2/di/KoinInitialization.kt +++ b/app/src/main/java/org/dhis2/di/KoinInitialization.kt @@ -41,6 +41,7 @@ object KoinInitialization { "openIdAuthorizationUrl" to BuildConfig.OPEN_ID_AUTHORIZATION_URL, "openIdTokenUrl" to BuildConfig.OPEN_ID_TOKEN_URL, "openIdButtonText" to BuildConfig.OPEN_ID_BUTTON_TEXT, + "openIdPrompt" to BuildConfig.OPEN_ID_PROMPT, ), ) workManagerFactory() diff --git a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt index 5e84656c011..8f27e708c69 100644 --- a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt +++ b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt @@ -17,6 +17,7 @@ import org.dhis2.mobile.commons.reporting.AnalyticActions import org.dhis2.mobile.commons.reporting.CrashReportController import org.dhis2.mobile.commons.resources.D2ErrorMessageProvider import org.dhis2.mobile.login.authentication.OpenIdController +import org.dhis2.mobile.login.main.domain.model.OpenIdLoginConfiguration import org.dhis2.mobile.login.main.domain.model.ServerValidationResult import org.dhis2.mobile.login.resources.Res import org.dhis2.mobile.login.resources.error_device_not_registered @@ -341,15 +342,7 @@ class LoginRepositoryImpl( } } - override suspend fun loginWithOpenId( - serverUrl: String, - isNetworkAvailable: Boolean, - clientId: String, - redirectUri: String, - discoveryUri: String?, - authorizationUri: String?, - tokenUrl: String?, - ): kotlin.Result = + override suspend fun loginWithOpenId(openIdLoginConfiguration: OpenIdLoginConfiguration): kotlin.Result = withContext(dispatcher.io) { suspendCancellableCoroutine { continuation -> val intent = @@ -358,11 +351,12 @@ class LoginRepositoryImpl( .openIdHandler() .blockingLogIn( OpenIDConnectConfig( - clientId = clientId, - redirectUri = redirectUri.toUri(), - discoveryUri = discoveryUri?.toUri(), - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, + clientId = openIdLoginConfiguration.clientId, + redirectUri = openIdLoginConfiguration.redirectUri.toUri(), + discoveryUri = openIdLoginConfiguration.discoveryUri?.toUri(), + authorizationUri = openIdLoginConfiguration.authorizationUri, + tokenUrl = openIdLoginConfiguration.tokenUrl, + prompt = openIdLoginConfiguration.prompt, ), ) openIdController.handleIntent(intent) { resultIntent -> @@ -389,7 +383,7 @@ class LoginRepositoryImpl( .userModule() .openIdHandler() .blockingHandleLogInResponse( - serverUrl = serverUrl, + serverUrl = openIdLoginConfiguration.serverUrl, intent = intent.intent, requestCode = intent.requestCode, ) @@ -400,7 +394,7 @@ class LoginRepositoryImpl( Exception( d2ErrorMessageProvider.getErrorMessage( e, - isNetworkAvailable, + openIdLoginConfiguration.isNetworkAvailable, ), ), ) diff --git a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.android.kt b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.android.kt index 7538284d023..096c46a6409 100644 --- a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.android.kt +++ b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.android.kt @@ -34,20 +34,22 @@ internal actual val accountModule = "token" -> OidcInfo.Token( server = getProperty("openIdServer", ""), - loginLabel = getProperty("openIdButtonText", ""), + loginLabel = getPropertyOrNull("openIdButtonText"), clientId = getProperty("openIdClient", ""), redirectUri = getProperty("openIdRedirectUri", ""), authorizationUrl = getProperty("openIdAuthorizationUrl", ""), tokenUrl = getProperty("openIdTokenUrl", ""), + prompt = getPropertyOrNull("openIdPrompt")?.takeIf { it.isNotEmpty() }, ) else -> OidcInfo.Discovery( server = getProperty("openIdServer", ""), - loginButtonText = getProperty("openIdButtonText", ""), + loginButtonText = getPropertyOrNull("openIdButtonText"), clientId = getProperty("openIdClient", ""), redirectUri = getProperty("openIdRedirectUri", ""), discoveryUri = getProperty("openIdDiscoveryUri", ""), + prompt = getPropertyOrNull("openIdPrompt")?.takeIf { it.isNotEmpty() }, ) } } diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepository.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepository.kt index d815b28ed81..0a825ab87fa 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepository.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepository.kt @@ -1,6 +1,7 @@ package org.dhis2.mobile.login.main.data import coil3.PlatformContext +import org.dhis2.mobile.login.main.domain.model.OpenIdLoginConfiguration import org.dhis2.mobile.login.main.domain.model.ServerValidationResult typealias UserPassword = String @@ -52,15 +53,7 @@ interface LoginRepository { suspend fun importDatabase(path: String): Result - suspend fun loginWithOpenId( - serverUrl: String, - isNetworkAvailable: Boolean, - clientId: String, - redirectUri: String, - discoveryUri: String?, - authorizationUri: String?, - tokenUrl: String?, - ): Result + suspend fun loginWithOpenId(openIdLoginConfiguration: OpenIdLoginConfiguration): Result suspend fun getUsername(): String diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/OpenIdLoginConfiguration.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/OpenIdLoginConfiguration.kt new file mode 100644 index 00000000000..6cbf7a50ad7 --- /dev/null +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/OpenIdLoginConfiguration.kt @@ -0,0 +1,12 @@ +package org.dhis2.mobile.login.main.domain.model + +data class OpenIdLoginConfiguration( + val serverUrl: String, + val isNetworkAvailable: Boolean, + val clientId: String, + val redirectUri: String, + val discoveryUri: String?, + val authorizationUri: String?, + val tokenUrl: String?, + val prompt: String?, +) diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/OpenIdLogin.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/OpenIdLogin.kt index 3ec5ccda6e4..8ab72e4d9a3 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/OpenIdLogin.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/OpenIdLogin.kt @@ -2,30 +2,14 @@ package org.dhis2.mobile.login.main.domain.usecase import org.dhis2.mobile.login.main.data.LoginRepository import org.dhis2.mobile.login.main.domain.model.LoginResult +import org.dhis2.mobile.login.main.domain.model.OpenIdLoginConfiguration class OpenIdLogin( repository: LoginRepository, ) : BaseLogin(repository) { - suspend operator fun invoke( - serverUrl: String, - isNetworkAvailable: Boolean, - clientId: String, - redirectUri: String, - discoveryUri: String?, - authorizationUri: String?, - tokenUrl: String?, - ): LoginResult { - val result = - repository.loginWithOpenId( - serverUrl = serverUrl, - isNetworkAvailable = isNetworkAvailable, - clientId = clientId, - redirectUri = redirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ) + suspend operator fun invoke(openIdLoginConfiguration: OpenIdLoginConfiguration): LoginResult { + val result = repository.loginWithOpenId(openIdLoginConfiguration) val username = if (result.isSuccess) repository.getUsername() else "" - return handleResult(result, serverUrl, username) + return handleResult(result, openIdLoginConfiguration.serverUrl, username) } } diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/state/CredentialsUiState.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/state/CredentialsUiState.kt index dc9b17c8fc5..40602a77f60 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/state/CredentialsUiState.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/state/CredentialsUiState.kt @@ -38,6 +38,7 @@ sealed class OidcInfo( val buttonText: String?, val oidcClientId: String, val oidcRedirectUri: String, + val userPrompt: String?, ) { @Serializable data class Discovery( @@ -46,7 +47,14 @@ sealed class OidcInfo( val clientId: String, val redirectUri: String, val discoveryUri: String, - ) : OidcInfo(server, loginButtonText, clientId, redirectUri) + val prompt: String?, + ) : OidcInfo( + serverUrl = server, + buttonText = loginButtonText, + oidcClientId = clientId, + oidcRedirectUri = redirectUri, + userPrompt = prompt, + ) @Serializable data class Token( @@ -56,7 +64,14 @@ sealed class OidcInfo( val redirectUri: String, val authorizationUrl: String, val tokenUrl: String, - ) : OidcInfo(server, loginLabel, clientId, redirectUri) + val prompt: String?, + ) : OidcInfo( + serverUrl = server, + buttonText = loginLabel, + oidcClientId = clientId, + oidcRedirectUri = redirectUri, + userPrompt = prompt, + ) fun discoveryUri() = when (this) { diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModel.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModel.kt index ef85ad58b7b..1b528d92bf2 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModel.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModel.kt @@ -16,6 +16,7 @@ import org.dhis2.mobile.commons.network.NetworkStatusProvider import org.dhis2.mobile.login.main.domain.model.DeviceEnrollmentInfo import org.dhis2.mobile.login.main.domain.model.LoginResult import org.dhis2.mobile.login.main.domain.model.LoginScreenState +import org.dhis2.mobile.login.main.domain.model.OpenIdLoginConfiguration import org.dhis2.mobile.login.main.domain.usecase.BiometricLogin import org.dhis2.mobile.login.main.domain.usecase.GetAvailableUsernames import org.dhis2.mobile.login.main.domain.usecase.GetBiometricInfo @@ -322,13 +323,16 @@ class CredentialsViewModel( fun onOpenIdLogin() { startLoginJob { openIdLogin( - serverUrl = _credentialsScreenState.value.serverInfo.serverUrl, - isNetworkAvailable = isNetworkOnline.value, - clientId = _credentialsScreenState.value.oidcInfo?.oidcClientId ?: "", - redirectUri = _credentialsScreenState.value.oidcInfo?.oidcRedirectUri ?: "", - discoveryUri = _credentialsScreenState.value.oidcInfo?.discoveryUri(), - authorizationUri = _credentialsScreenState.value.oidcInfo?.authorizationUri(), - tokenUrl = _credentialsScreenState.value.oidcInfo?.tokenUrl(), + OpenIdLoginConfiguration( + serverUrl = _credentialsScreenState.value.serverInfo.serverUrl, + isNetworkAvailable = isNetworkOnline.value, + clientId = _credentialsScreenState.value.oidcInfo?.oidcClientId ?: "", + redirectUri = _credentialsScreenState.value.oidcInfo?.oidcRedirectUri ?: "", + discoveryUri = _credentialsScreenState.value.oidcInfo?.discoveryUri(), + authorizationUri = _credentialsScreenState.value.oidcInfo?.authorizationUri(), + tokenUrl = _credentialsScreenState.value.oidcInfo?.tokenUrl(), + prompt = _credentialsScreenState.value.oidcInfo?.userPrompt, + ), ) } } diff --git a/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/domain/usecase/OpenIdLoginTest.kt b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/domain/usecase/OpenIdLoginTest.kt index 6ca9f581125..5fcaae840af 100644 --- a/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/domain/usecase/OpenIdLoginTest.kt +++ b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/domain/usecase/OpenIdLoginTest.kt @@ -3,6 +3,7 @@ package org.dhis2.mobile.login.main.domain.usecase import kotlinx.coroutines.test.runTest import org.dhis2.mobile.login.main.data.LoginRepository import org.dhis2.mobile.login.main.domain.model.LoginResult +import org.dhis2.mobile.login.main.domain.model.OpenIdLoginConfiguration import org.junit.Before import org.junit.Test import org.mockito.kotlin.any @@ -26,6 +27,20 @@ class OpenIdLoginTest { private val authorizationUri = "https://test.server.org/oauth/authorize" private val tokenUrl = "https://test.server.org/oauth/token" private val username = "openIdUser" + private val prompt = "select_account" + + private val defaultConfig + get() = + OpenIdLoginConfiguration( + serverUrl = serverUrl, + isNetworkAvailable = isNetworkAvailable, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + prompt = prompt, + ) @Before fun setUp() { @@ -36,33 +51,14 @@ class OpenIdLoginTest { fun `GIVEN successful OpenID login with no existing accounts WHEN user logs in THEN biometric credentials are NOT deleted`() = runTest { // GIVEN - User has no other accounts (numberOfAccounts = 0) - whenever( - repository.loginWithOpenId( - serverUrl = serverUrl, - isNetworkAvailable = isNetworkAvailable, - clientId = clientId, - redirectUri = redirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ), - ) doReturn Result.success(Unit) + whenever(repository.loginWithOpenId(defaultConfig)) doReturn Result.success(Unit) whenever(repository.getUsername()) doReturn username whenever(repository.numberOfAccounts()) doReturn 0 whenever(repository.displayTrackingMessage()) doReturn false whenever(repository.initialSyncDone(serverUrl, username)) doReturn true // WHEN - User logs in successfully with OpenID - val result = - openIdLogin( - serverUrl = serverUrl, - isNetworkAvailable = isNetworkAvailable, - clientId = clientId, - redirectUri = redirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ) + val result = openIdLogin(defaultConfig) // THEN - Login is successful assertIs(result) @@ -78,33 +74,14 @@ class OpenIdLoginTest { fun `GIVEN successful OpenID login with multiple existing accounts WHEN user logs in THEN biometric credentials are deleted`() = runTest { // GIVEN - User has multiple existing accounts (numberOfAccounts = 3) - whenever( - repository.loginWithOpenId( - serverUrl = serverUrl, - isNetworkAvailable = isNetworkAvailable, - clientId = clientId, - redirectUri = redirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ), - ) doReturn Result.success(Unit) + whenever(repository.loginWithOpenId(defaultConfig)) doReturn Result.success(Unit) whenever(repository.getUsername()) doReturn username whenever(repository.numberOfAccounts()) doReturn 3 whenever(repository.displayTrackingMessage()) doReturn false whenever(repository.initialSyncDone(serverUrl, username)) doReturn true // WHEN - User logs in successfully with OpenID - val result = - openIdLogin( - serverUrl = serverUrl, - isNetworkAvailable = isNetworkAvailable, - clientId = clientId, - redirectUri = redirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ) + val result = openIdLogin(defaultConfig) // THEN - Login is successful and biometric credentials are deleted assertIs(result) @@ -120,29 +97,10 @@ class OpenIdLoginTest { runTest { // GIVEN - OpenID login will fail val errorMessage = "OpenID authentication failed" - whenever( - repository.loginWithOpenId( - serverUrl = serverUrl, - isNetworkAvailable = isNetworkAvailable, - clientId = clientId, - redirectUri = redirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ), - ) doReturn Result.failure(Exception(errorMessage)) + whenever(repository.loginWithOpenId(defaultConfig)) doReturn Result.failure(Exception(errorMessage)) // WHEN - User attempts to log in with OpenID - val result = - openIdLogin( - serverUrl = serverUrl, - isNetworkAvailable = isNetworkAvailable, - clientId = clientId, - redirectUri = redirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ) + val result = openIdLogin(defaultConfig) // THEN - Login fails and biometric credentials are NOT deleted assertIs(result) @@ -159,44 +117,18 @@ class OpenIdLoginTest { fun `GIVEN successful OpenID login WHEN repository operations are executed THEN they are called in correct order`() = runTest { // GIVEN - whenever( - repository.loginWithOpenId( - serverUrl = serverUrl, - isNetworkAvailable = isNetworkAvailable, - clientId = clientId, - redirectUri = redirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ), - ) doReturn Result.success(Unit) + whenever(repository.loginWithOpenId(defaultConfig)) doReturn Result.success(Unit) whenever(repository.getUsername()) doReturn username whenever(repository.numberOfAccounts()) doReturn 2 whenever(repository.displayTrackingMessage()) doReturn false whenever(repository.initialSyncDone(serverUrl, username)) doReturn true // WHEN - openIdLogin( - serverUrl = serverUrl, - isNetworkAvailable = isNetworkAvailable, - clientId = clientId, - redirectUri = redirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ) + openIdLogin(defaultConfig) // THEN - Verify the order of operations val inOrder = org.mockito.kotlin.inOrder(repository) - inOrder.verify(repository).loginWithOpenId( - serverUrl = serverUrl, - isNetworkAvailable = isNetworkAvailable, - clientId = clientId, - redirectUri = redirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ) + inOrder.verify(repository).loginWithOpenId(defaultConfig) inOrder.verify(repository).getUsername() inOrder.verify(repository).unlockSession() inOrder.verify(repository).updateAvailableUsers(username) @@ -212,78 +144,33 @@ class OpenIdLoginTest { runTest { // GIVEN - Network is unavailable val isOffline = false - whenever( - repository.loginWithOpenId( - serverUrl = serverUrl, - isNetworkAvailable = isOffline, - clientId = clientId, - redirectUri = redirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ), - ) doReturn Result.success(Unit) + val offlineConfig = defaultConfig.copy(isNetworkAvailable = isOffline) + whenever(repository.loginWithOpenId(offlineConfig)) doReturn Result.success(Unit) whenever(repository.getUsername()) doReturn username whenever(repository.numberOfAccounts()) doReturn 0 whenever(repository.displayTrackingMessage()) doReturn false whenever(repository.initialSyncDone(serverUrl, username)) doReturn true // WHEN - User attempts to log in offline - val result = - openIdLogin( - serverUrl = serverUrl, - isNetworkAvailable = isOffline, - clientId = clientId, - redirectUri = redirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ) + val result = openIdLogin(offlineConfig) // THEN - Login is successful with offline flag assertIs(result) - verify(repository).loginWithOpenId( - serverUrl = serverUrl, - isNetworkAvailable = isOffline, - clientId = clientId, - redirectUri = redirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ) + verify(repository).loginWithOpenId(offlineConfig) } @Test fun `GIVEN all success flags are true WHEN OpenID login succeeds THEN all flags are reflected in result`() = runTest { // GIVEN - Both tracking message and initial sync are required - whenever( - repository.loginWithOpenId( - serverUrl = serverUrl, - isNetworkAvailable = isNetworkAvailable, - clientId = clientId, - redirectUri = redirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ), - ) doReturn Result.success(Unit) + whenever(repository.loginWithOpenId(defaultConfig)) doReturn Result.success(Unit) whenever(repository.getUsername()) doReturn username whenever(repository.numberOfAccounts()) doReturn 0 whenever(repository.displayTrackingMessage()) doReturn true whenever(repository.initialSyncDone(serverUrl, username)) doReturn true // WHEN - User logs in successfully - val result = - openIdLogin( - serverUrl = serverUrl, - isNetworkAvailable = isNetworkAvailable, - clientId = clientId, - redirectUri = redirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ) + val result = openIdLogin(defaultConfig) // THEN - Both flags are true assertIs(result) @@ -295,33 +182,14 @@ class OpenIdLoginTest { fun `GIVEN all success flags are false WHEN OpenID login succeeds THEN all flags are false in result`() = runTest { // GIVEN - Neither tracking message nor initial sync are required - whenever( - repository.loginWithOpenId( - serverUrl = serverUrl, - isNetworkAvailable = isNetworkAvailable, - clientId = clientId, - redirectUri = redirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ), - ) doReturn Result.success(Unit) + whenever(repository.loginWithOpenId(defaultConfig)) doReturn Result.success(Unit) whenever(repository.getUsername()) doReturn username whenever(repository.numberOfAccounts()) doReturn 0 whenever(repository.displayTrackingMessage()) doReturn false whenever(repository.initialSyncDone(serverUrl, username)) doReturn false // WHEN - User logs in successfully - val result = - openIdLogin( - serverUrl = serverUrl, - isNetworkAvailable = isNetworkAvailable, - clientId = clientId, - redirectUri = redirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ) + val result = openIdLogin(defaultConfig) // THEN - Both flags are false assertIs(result) @@ -334,45 +202,19 @@ class OpenIdLoginTest { runTest { // GIVEN - Custom app redirect URI val customRedirectUri = "myapp://oauth/callback" - whenever( - repository.loginWithOpenId( - serverUrl = serverUrl, - isNetworkAvailable = isNetworkAvailable, - clientId = clientId, - redirectUri = customRedirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ), - ) doReturn Result.success(Unit) + val customConfig = defaultConfig.copy(redirectUri = customRedirectUri) + whenever(repository.loginWithOpenId(customConfig)) doReturn Result.success(Unit) whenever(repository.getUsername()) doReturn username whenever(repository.numberOfAccounts()) doReturn 0 whenever(repository.displayTrackingMessage()) doReturn false whenever(repository.initialSyncDone(serverUrl, username)) doReturn true // WHEN - User logs in with custom redirect URI - val result = - openIdLogin( - serverUrl = serverUrl, - isNetworkAvailable = isNetworkAvailable, - clientId = clientId, - redirectUri = customRedirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ) + val result = openIdLogin(customConfig) // THEN - Login succeeds with custom redirect URI assertIs(result) - verify(repository).loginWithOpenId( - serverUrl = serverUrl, - isNetworkAvailable = isNetworkAvailable, - clientId = clientId, - redirectUri = customRedirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ) + verify(repository).loginWithOpenId(customConfig) } @Test @@ -380,33 +222,15 @@ class OpenIdLoginTest { runTest { // GIVEN - Server URL with path val serverWithPath = "https://test.server.org/dhis" - whenever( - repository.loginWithOpenId( - serverUrl = serverWithPath, - isNetworkAvailable = isNetworkAvailable, - clientId = clientId, - redirectUri = redirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ), - ) doReturn Result.success(Unit) + val configWithPath = defaultConfig.copy(serverUrl = serverWithPath) + whenever(repository.loginWithOpenId(configWithPath)) doReturn Result.success(Unit) whenever(repository.getUsername()) doReturn username whenever(repository.numberOfAccounts()) doReturn 0 whenever(repository.displayTrackingMessage()) doReturn false whenever(repository.initialSyncDone(serverWithPath, username)) doReturn true // WHEN - User logs in with server URL containing path - val result = - openIdLogin( - serverUrl = serverWithPath, - isNetworkAvailable = isNetworkAvailable, - clientId = clientId, - redirectUri = redirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ) + val result = openIdLogin(configWithPath) // THEN - Server URL is passed correctly assertIs(result) @@ -419,29 +243,10 @@ class OpenIdLoginTest { runTest { // GIVEN - Repository throws RuntimeException val runtimeError = "OpenID provider unavailable" - whenever( - repository.loginWithOpenId( - serverUrl = serverUrl, - isNetworkAvailable = isNetworkAvailable, - clientId = clientId, - redirectUri = redirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ), - ) doReturn Result.failure(RuntimeException(runtimeError)) + whenever(repository.loginWithOpenId(defaultConfig)) doReturn Result.failure(RuntimeException(runtimeError)) // WHEN - User attempts to log in - val result = - openIdLogin( - serverUrl = serverUrl, - isNetworkAvailable = isNetworkAvailable, - clientId = clientId, - redirectUri = redirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ) + val result = openIdLogin(defaultConfig) // THEN - Error message is propagated assertIs(result) @@ -452,32 +257,14 @@ class OpenIdLoginTest { fun `GIVEN successful OpenID login WHEN unlockSession is called THEN it is always executed`() = runTest { // GIVEN - Successful OpenID login - whenever( - repository.loginWithOpenId( - serverUrl = serverUrl, - isNetworkAvailable = isNetworkAvailable, - clientId = clientId, - redirectUri = redirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ), - ) doReturn Result.success(Unit) + whenever(repository.loginWithOpenId(defaultConfig)) doReturn Result.success(Unit) whenever(repository.getUsername()) doReturn username whenever(repository.numberOfAccounts()) doReturn 0 whenever(repository.displayTrackingMessage()) doReturn false whenever(repository.initialSyncDone(serverUrl, username)) doReturn true // WHEN - User logs in - openIdLogin( - serverUrl = serverUrl, - isNetworkAvailable = isNetworkAvailable, - clientId = clientId, - redirectUri = redirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ) + openIdLogin(defaultConfig) // THEN - Session is always unlocked on success verify(repository).unlockSession() @@ -487,65 +274,47 @@ class OpenIdLoginTest { fun `GIVEN failed OpenID login WHEN unlockSession would be called THEN it is never executed`() = runTest { // GIVEN - Failed OpenID login - whenever( - repository.loginWithOpenId( - serverUrl = serverUrl, - isNetworkAvailable = isNetworkAvailable, - clientId = clientId, - redirectUri = redirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ), - ) doReturn Result.failure(Exception("OpenID failed")) + whenever(repository.loginWithOpenId(defaultConfig)) doReturn Result.failure(Exception("OpenID failed")) // WHEN - User attempts to log in - openIdLogin( - serverUrl = serverUrl, - isNetworkAvailable = isNetworkAvailable, - clientId = clientId, - redirectUri = redirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ) + openIdLogin(defaultConfig) // THEN - Session is never unlocked on failure verify(repository, never()).unlockSession() } + @Test + fun `GIVEN null prompt WHEN OpenID login succeeds THEN null prompt is passed to repository`() = + runTest { + // GIVEN - No prompt configured (SDK will use its default) + val configNullPrompt = defaultConfig.copy(prompt = null) + whenever(repository.loginWithOpenId(configNullPrompt)) doReturn Result.success(Unit) + whenever(repository.getUsername()) doReturn username + whenever(repository.numberOfAccounts()) doReturn 0 + whenever(repository.displayTrackingMessage()) doReturn false + whenever(repository.initialSyncDone(serverUrl, username)) doReturn true + + // WHEN - User logs in without a prompt override + val result = openIdLogin(configNullPrompt) + + // THEN - Login succeeds and null prompt is forwarded to the repository + assertIs(result) + verify(repository).loginWithOpenId(configNullPrompt) + } + @Test fun `GIVEN username with special characters WHEN OpenID login succeeds THEN username is handled correctly`() = runTest { // GIVEN - Username contains special characters val specialUsername = "user@example.com" - whenever( - repository.loginWithOpenId( - serverUrl = serverUrl, - isNetworkAvailable = isNetworkAvailable, - clientId = clientId, - redirectUri = redirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ), - ) doReturn Result.success(Unit) + whenever(repository.loginWithOpenId(defaultConfig)) doReturn Result.success(Unit) whenever(repository.getUsername()) doReturn specialUsername whenever(repository.numberOfAccounts()) doReturn 0 whenever(repository.displayTrackingMessage()) doReturn false whenever(repository.initialSyncDone(serverUrl, specialUsername)) doReturn true // WHEN - User logs in successfully - val result = - openIdLogin( - serverUrl = serverUrl, - isNetworkAvailable = isNetworkAvailable, - clientId = clientId, - redirectUri = redirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ) + val result = openIdLogin(defaultConfig) // THEN - Special username is used correctly assertIs(result) diff --git a/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModelTest.kt b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModelTest.kt index a9197a2aacb..c3bb5547f57 100644 --- a/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModelTest.kt +++ b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModelTest.kt @@ -14,6 +14,7 @@ import org.dhis2.mobile.commons.network.NetworkStatusProvider import org.dhis2.mobile.login.main.domain.model.BiometricsInfo import org.dhis2.mobile.login.main.domain.model.LoginResult import org.dhis2.mobile.login.main.domain.model.LoginScreenState +import org.dhis2.mobile.login.main.domain.model.OpenIdLoginConfiguration import org.dhis2.mobile.login.main.domain.usecase.BiometricLogin import org.dhis2.mobile.login.main.domain.usecase.GetAvailableUsernames import org.dhis2.mobile.login.main.domain.usecase.GetBiometricInfo @@ -29,6 +30,7 @@ import org.dhis2.mobile.login.main.domain.usecase.UpdateTrackingPermission import org.dhis2.mobile.login.main.ui.navigation.AppLinkNavigation import org.dhis2.mobile.login.main.ui.navigation.Navigator import org.dhis2.mobile.login.main.ui.state.LoginState +import org.dhis2.mobile.login.main.ui.state.OidcInfo import org.dhis2.mobile.login.pin.domain.usecase.ForgotPinUseCase import org.dhis2.mobile.login.pin.domain.usecase.GetIsSessionLockedUseCase import org.mockito.kotlin.any @@ -694,6 +696,166 @@ class CredentialsViewModelTest { } } + @Test + fun `GIVEN oidcInfo is Discovery with prompt WHEN onOpenIdLogin is called THEN discoveryUri and prompt are forwarded`() = + runTest { + val serverUrl = "https://test.server.org" + val prompt = "select_account" + val discoveryUri = "https://test.server.org/.well-known/openid-configuration" + val clientId = "client-123" + val redirectUri = "dhis2://oauth" + val oidcInfo = + OidcInfo.Discovery( + server = serverUrl, + loginButtonText = null, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + prompt = prompt, + ) + + whenever(getAvailableUsernames()) doReturn emptyList() + whenever(getBiometricInfo(any())) doReturn BiometricsInfo(false, false) + whenever(getHasOtherAccounts.invoke()) doReturn false + whenever(getIsSessionLockedUseCase()) doReturn false + whenever(openIdLogin.invoke(any())) doReturn LoginResult.Success(initialSyncDone = true, displayTrackingMessage = false) + + initViewModel(serverUrl = serverUrl, oidcInfo = oidcInfo) + + viewModel.credentialsScreenState.test(timeout = turbineTimeout) { + awaitItem() + awaitItem() + + viewModel.onOpenIdLogin() + + val runningState = awaitItem() + assertEquals(LoginState.Running, runningState.loginState) + + testDispatcher.scheduler.advanceUntilIdle() + + verify(openIdLogin).invoke( + OpenIdLoginConfiguration( + serverUrl = serverUrl, + isNetworkAvailable = true, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = null, + tokenUrl = null, + prompt = prompt, + ), + ) + + cancelAndIgnoreRemainingEvents() + } + } + + @Test + fun `GIVEN oidcInfo is Token with prompt WHEN onOpenIdLogin is called THEN tokenUrl, authorizationUri and prompt are forwarded`() = + runTest { + val serverUrl = "https://test.server.org" + val prompt = "login" + val authorizationUrl = "https://test.server.org/oauth/authorize" + val tokenUrl = "https://test.server.org/oauth/token" + val clientId = "client-456" + val redirectUri = "dhis2://oauth" + val oidcInfo = + OidcInfo.Token( + server = serverUrl, + loginLabel = null, + clientId = clientId, + redirectUri = redirectUri, + authorizationUrl = authorizationUrl, + tokenUrl = tokenUrl, + prompt = prompt, + ) + + whenever(getAvailableUsernames()) doReturn emptyList() + whenever(getBiometricInfo(any())) doReturn BiometricsInfo(false, false) + whenever(getHasOtherAccounts.invoke()) doReturn false + whenever(getIsSessionLockedUseCase()) doReturn false + whenever(openIdLogin.invoke(any())) doReturn LoginResult.Success(initialSyncDone = true, displayTrackingMessage = false) + + initViewModel(serverUrl = serverUrl, oidcInfo = oidcInfo) + + viewModel.credentialsScreenState.test(timeout = turbineTimeout) { + awaitItem() + awaitItem() + + viewModel.onOpenIdLogin() + + val runningState = awaitItem() + assertEquals(LoginState.Running, runningState.loginState) + + testDispatcher.scheduler.advanceUntilIdle() + + verify(openIdLogin).invoke( + OpenIdLoginConfiguration( + serverUrl = serverUrl, + isNetworkAvailable = true, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = null, + authorizationUri = authorizationUrl, + tokenUrl = tokenUrl, + prompt = prompt, + ), + ) + + cancelAndIgnoreRemainingEvents() + } + } + + @Test + fun `GIVEN oidcInfo with null prompt WHEN onOpenIdLogin is called THEN null prompt is forwarded`() = + runTest { + val serverUrl = "https://test.server.org" + val oidcInfo = + OidcInfo.Discovery( + server = serverUrl, + loginButtonText = null, + clientId = "client-789", + redirectUri = "dhis2://oauth", + discoveryUri = "https://test.server.org/.well-known/openid-configuration", + prompt = null, + ) + + whenever(getAvailableUsernames()) doReturn emptyList() + whenever(getBiometricInfo(any())) doReturn BiometricsInfo(false, false) + whenever(getHasOtherAccounts.invoke()) doReturn false + whenever(getIsSessionLockedUseCase()) doReturn false + whenever(openIdLogin.invoke(any())) doReturn LoginResult.Success(initialSyncDone = true, displayTrackingMessage = false) + + initViewModel(serverUrl = serverUrl, oidcInfo = oidcInfo) + + viewModel.credentialsScreenState.test(timeout = turbineTimeout) { + awaitItem() + awaitItem() + + viewModel.onOpenIdLogin() + + val runningState = awaitItem() + assertEquals(LoginState.Running, runningState.loginState) + + testDispatcher.scheduler.advanceUntilIdle() + + verify(openIdLogin).invoke( + OpenIdLoginConfiguration( + serverUrl = serverUrl, + isNetworkAvailable = true, + clientId = "client-789", + redirectUri = "dhis2://oauth", + discoveryUri = "https://test.server.org/.well-known/openid-configuration", + authorizationUri = null, + tokenUrl = null, + prompt = null, + ), + ) + + cancelAndIgnoreRemainingEvents() + } + } + private fun initViewModel( serverName: String? = "Test Server", serverUrl: String = "https://test.server.org", @@ -701,6 +863,7 @@ class CredentialsViewModelTest { allowRecovery: Boolean = true, oAuthEnable: Boolean = false, fromHome: Boolean = false, + oidcInfo: OidcInfo? = null, ) { viewModel = CredentialsViewModel( @@ -725,7 +888,7 @@ class CredentialsViewModelTest { allowRecovery, getIsSessionLockedUseCase, forgotPinUseCase, - oidcInfo = null, + oidcInfo = oidcInfo, fromHome = fromHome, oAuthEnable = oAuthEnable, ) From cd2f3733f95a91e05febe74b4ac30522badb4680 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Mon, 4 May 2026 17:15:30 +0200 Subject: [PATCH 217/260] Remove remained ui components string (#4851) --- ui-components/src/main/res/values-en-rUS/strings.xml | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 ui-components/src/main/res/values-en-rUS/strings.xml diff --git a/ui-components/src/main/res/values-en-rUS/strings.xml b/ui-components/src/main/res/values-en-rUS/strings.xml deleted file mode 100644 index a29e9d1d491..00000000000 --- a/ui-components/src/main/res/values-en-rUS/strings.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - Complete - Discard changes - Not now - Keep editing - Review - Cancel - Done - Cancel - Close - \ No newline at end of file From 8840f02f3f324d114e247fccf95175672a042dd4 Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Tue, 5 May 2026 11:09:34 +0200 Subject: [PATCH 218/260] fix(translations): sync translations from transifex (main) (#4853) WARNING: This automated sync from transifex removed more lines than it added. Please check carefully before merging! --- app/src/main/res/values-ar/strings.xml | 1 - app/src/main/res/values-cs/strings.xml | 4 ++-- app/src/main/res/values-es-rES/strings.xml | 5 ++--- app/src/main/res/values-es/strings.xml | 5 ++--- app/src/main/res/values-fr/strings.xml | 15 +++++++-------- app/src/main/res/values-id/strings.xml | 5 ++--- app/src/main/res/values-lo/strings.xml | 5 ++--- app/src/main/res/values-nb/strings.xml | 5 ++--- app/src/main/res/values-nl/strings.xml | 5 ++--- app/src/main/res/values-pt/strings.xml | 5 ++--- app/src/main/res/values-ru/strings.xml | 5 ++--- app/src/main/res/values-uk/strings.xml | 5 ++--- app/src/main/res/values-ur/strings.xml | 1 + app/src/main/res/values-uz-rUZ/strings.xml | 5 ++--- app/src/main/res/values-uz/strings.xml | 5 ++--- app/src/main/res/values-vi/strings.xml | 7 +++---- app/src/main/res/values-zh-rCN/strings.xml | 1 - commons/src/main/res/values-ru/strings.xml | 1 - commons/src/main/res/values-vi/strings.xml | 2 +- commons/src/main/res/values-zh-rCN/strings.xml | 1 - commons/src/main/res/values-zh/strings.xml | 4 ---- .../composeResources/values-bn/strings.xml | 6 +----- .../composeResources/values-en-rUS/strings.xml | 2 -- .../composeResources/values-hi-rIN/strings.xml | 2 +- .../composeResources/values-lo/strings.xml | 2 +- .../composeResources/values-or/strings.xml | 6 +----- .../composeResources/values-si/strings.xml | 6 +----- .../composeResources/values-ur/strings.xml | 1 + form/src/main/res/values-cs/strings.xml | 1 - form/src/main/res/values-en-rUS/strings.xml | 1 - form/src/main/res/values-es-rES/strings.xml | 1 - form/src/main/res/values-es/strings.xml | 1 - form/src/main/res/values-fr/strings.xml | 1 - form/src/main/res/values-lo/strings.xml | 1 - form/src/main/res/values-nl/strings.xml | 1 - form/src/main/res/values-pt/strings.xml | 1 - form/src/main/res/values-ru/strings.xml | 1 - form/src/main/res/values-uk/strings.xml | 1 - form/src/main/res/values-ur/strings.xml | 1 + form/src/main/res/values-vi/strings.xml | 3 +-- form/src/main/res/values-zh-rCN/strings.xml | 1 - form/src/main/res/values-zh/strings.xml | 1 - .../composeResources/values-lo/strings.xml | 2 +- .../composeResources/values-nl/strings.xml | 2 +- .../composeResources/values-pt/strings.xml | 2 +- .../composeResources/values-ru/strings.xml | 2 +- .../composeResources/values-vi/strings.xml | 2 +- .../composeResources/values-ar/strings.xml | 3 ++- .../composeResources/values-ckb/strings.xml | 3 ++- .../composeResources/values-cs/strings.xml | 3 ++- .../composeResources/values-es-rES/strings.xml | 3 ++- .../composeResources/values-es/strings.xml | 3 ++- .../composeResources/values-fr/strings.xml | 3 ++- .../composeResources/values-id/strings.xml | 3 ++- .../composeResources/values-km/strings.xml | 3 ++- .../composeResources/values-lo/strings.xml | 3 ++- .../composeResources/values-nb/strings.xml | 3 ++- .../composeResources/values-nl/strings.xml | 3 ++- .../composeResources/values-pt/strings.xml | 3 ++- .../composeResources/values-ru/strings.xml | 3 ++- .../composeResources/values-sv/strings.xml | 3 ++- .../composeResources/values-uk/strings.xml | 3 ++- .../composeResources/values-uz-rUZ/strings.xml | 3 ++- .../composeResources/values-uz/strings.xml | 3 ++- .../composeResources/values-vi/strings.xml | 3 ++- .../composeResources/values-zh/strings.xml | 5 ++++- .../composeResources/values-zh/strings.xml | 3 ++- 67 files changed, 91 insertions(+), 114 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 323c3fe4957..cb308c61e0e 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -487,7 +487,6 @@ قبول متابعة رابط الخادم - أدخل عنوان URL لخادم DHIS 2 لمؤسستك على النحو الذي حصلت عليه من مسؤول النظام.\n\n أو بدلاً من ذلك ، يمكنك مسح رمز الـ QR الذي يحتوي على عنوان URL لخادمك نسيت الرمز الخاص بك؟ ما الذي تريد فعله لهذا الحدث؟ إنهاء diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index bd8d02aa02d..30fb89e4514 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -681,9 +681,9 @@ Detaily Komentáře Uloženo! - Chcete zkontrolovat kvalitu dat\? + Chcete zkontrolovat kvalitu dat? Všechno vypadá dobře! - Chcete také vyplnit soubor dat\? + Chcete také vyplnit soubor dat? Označit jak dokončené Název Vzorec diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 955d1e8deef..16e0e41303c 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -460,7 +460,6 @@ Confirmar Seguir URL de servidor - Introduzca la URL del servidor DHIS 2 de su organización proporcionada por su administrador. También puede escanear un código QR con la URL de su servidor. ¿Olvido su código? ¿Que quiere hacer con este evento? FIN @@ -643,9 +642,9 @@ Detalles Comentarios ¡Guardado! - ¿Quieree validar la calidad de los datos\? + ¿Quiere validar la calidad de los datos? ¡Parece que todo está bien! - ¿Quiere completar también el set de datos\? + ¿Quiere completar también el set de datos? Marcar como completado Nombre Fórmula diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index c2d1d6772e1..e8baacfdd62 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -491,7 +491,6 @@ Confirmar Seguir URL de servidor - Introduzca la URL del servidor DHIS 2 de su organización proporcionada por su administrador. También puede escanear un código QR con la URL de su servidor. ¿Olvido su código? ¿Que quiere hacer con este evento? FIN @@ -675,9 +674,9 @@ Detalles Comentarios ¡Guardado! - ¿Quieree validar la calidad de los datos\? + ¿Quiere validar la calidad de los datos? ¡Parece que todo está bien! - ¿Quiere completar también el set de datos\? + ¿Quiere completar también el set de datos? Marcar como completado Nombre Fórmula diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 154cb28b97b..aafb1e385a1 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -111,7 +111,7 @@ Mettre à jour Date Unités d´Organisation - Il n\'y a pas d\'unité d\'organisation ouverte pour la date sélectionnée. Merci de sélectionner une autre date ou une autre unité d\'organisation. + Il n\'y a pas d\'Unité d\'organisation Ouvert pour la date sélectionnée. Merci de sélectionner une autre date ou une autre Unité d\'Organisation. Options de catégorie Latitude Longitude @@ -298,7 +298,7 @@ Aucune donnée Code QR invalide Cet attribut ne peut pas être ajouté - Cette entité ne peut pas être enrôlée + Cette inscription ne peu pas être ajoutée À propos Programmes disponibles pour l´admission @@ -468,7 +468,6 @@ Accord Continuer URL du serveur - Saisissez l\'URL du serveur DHIS 2 de votre organisation tel que fourni par votre administrateur système.\n\nVous pouvez également scanner le code QR avec le lien URL du serveur Oublié le code? Que souhaitez-vous faire pour cet évènement? FIN @@ -486,7 +485,7 @@ Maintenant vous pouvez vérifier l\'information de synchronisation en cliquant ici Cette donnée est enregistrée seulement sur votre appareil et n\'a pas été synchronisée avec le serveur. Vous êtes à jour! Toutes vos données ont été envoyées au serveur. - Vous ne pouvez pas établir de relation entre une donnée et elle-même + Vous ne pouvez pas établir de relation une donnée avec elle-même Dévérouiller la session Terminer Ouvrir @@ -498,7 +497,7 @@ Hebdomadaire Semaine Paramètre de synchronisation: %s - La donnée à laquelle vous essayer d\'accéder n\'a pas d\'enrôlement. Vous ne pouvez pas accéder au tableau de bord. + La donnée à laquelle vous essayer d\'acceéer n\'a pas d\'enrôlement. Vous ne pouvez pas accéder au tableau de bord. Erreur de formattage Supprimer 1%s Vous n\'avez pas l\'autorité pour supprimer cette donnée @@ -651,9 +650,9 @@ Details Commentaires Enregistré! - Voulez-vous vérifier la qualité des données\? + Voulez-vous vérifier la qualité des données? Tout a l\'air bien! - Voulez-vous également compléter l\'ensemble de données\? + Voulez-vous également compléter l\'ensemble de données? Marquer comme terminé Nom Formule @@ -761,7 +760,7 @@ Valeurs Semaine %d %s à %s Ne pas montrer de nouveau - %s ne peut pas être analysé comme une date + 1%s ne peut pas être analysé comme une date Ce champ n\'a pas pu être mis à jour. Veuillez réessayer Disponible Ces données ne sont pas modifiables car elles sont marquées comme terminées diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 7087c637509..f594520657c 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -452,7 +452,6 @@ Setuju Terus URL server - Masukkan url server DHIS 2 untuk organisasi Anda seperti yang disediakan oleh administrator sistem Anda.\n\nAtau, Anda dapat memindai kode QR yang berisi URL server Anda Lupa kode Anda? Apa yang ingin Anda lakukan untuk even ini? AKHIR @@ -745,9 +744,9 @@ Rincian Komentar Tersimpan! - Apakah Anda ingin memeriksa kualitas data\? + Apakah Anda ingin memeriksa kualitas data? Semuanya terlihat bagus! - Apakah Anda juga ingin melengkapi data set\? + Apakah Anda juga ingin melengkapi data set? Tandai sebagai selesai Nama Formula diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index 59cb7a5189c..99e5d9d9103 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -464,7 +464,6 @@ ຍິນຍອມ ຕໍ່ໄປ ທີ່ຢູ່ຂອງເຄື່ອງຄອມພີວເຕີໜ່ວຍແມ່ - ປ້ອນທີ່ຢູ່ຂອງຄອມພິວເຕີໜ່ວຍແມ່ DHIS 2 ສຳລັບອົງກອນຂອງທ່ານ ຕາມທີ່ຜູ້ດູແລລະບົບຂອງທ່ານໃຫ້ມາ ຫຼື ທ່ານສາມາດສະແກນຄິວອາໂຄ້ດທີ່ມີທີ່ຢູ່ຂອງຄອມພິວເຕີໜ່ວຍແມ່ຂອງທ່ານ ລືມລະຫັດຂອງທ່ານ? ທ່ານຕ້ອງເຮັດຫຍັງສໍາລັບເຫດການນີ້? ສິ້ນສຸດ @@ -644,9 +643,9 @@ ລາຍລະອຽດ ຄຳເຫັນ ບັນທຶກແລ້ວ! - ທ່ານຕ້ອງການກວດສອບຄຸນນະພາບຂໍ້ມູນນີ້ບໍ\? + ທ່ານຕ້ອງການກວດສອບຄຸນນະພາບຂໍ້ມູນນີ້ບໍ? ທຸກຢ່າງຮຽບຮ້ອຍດີ - ທ່ານຕ້ອງການເຮັດຊຸດຂໍ້ມູນໃຫ້ຄົບຖ້ວນບໍ\? + ທ່ານຕ້ອງການເຮັດຊຸດຂໍ້ມູນໃຫ້ຄົບຖ້ວນບໍ? ເຮັດໃຫ້ສຳເລັດແລ້ວ ຊື່ Formula diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 5421c33a4fc..20394afcd87 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -453,7 +453,6 @@ Enig Fortsett Server URL - Angi DHIS 2 server URL for din organisasjons som er oppgitt av din systemadministrator.\n\nAlternativt, kan du skanne en QR kode som inneholder URL til din server Har du glemt koden? Hva vil du gjøre for denne hendelsen? SLUTT @@ -633,9 +632,9 @@ Detaljer Kommentarer Lagret! - Vil du sjekke datakvaliteten\? + Vil du sjekke datakvaliteten? Alt ser bra ut - Vil du også fullføre datasettet\? + Vil du også fullføre datasettet? Merk som fullført Navn Formel diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index ab850589d2b..4f08d7f2b21 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -465,7 +465,6 @@ Mee eens zijn Doorgaan Server-URL - Voer de DHIS 2-server-URL voor uw organisatie in zoals verstrekt door uw systeembeheerder.\n\nU kunt ook een QR-code scannen met de URL van uw server Ben je je code vergeten? Wat zou je willen doen voor dit evenement? EINDE @@ -648,9 +647,9 @@ Details Opmerkingen Opgeslagen! - Wilt u de datakwaliteit controleren\? + Wilt u de datakwaliteit controleren? Alles ziet er goed uit! - Wil je ook de dataset compleet maken\? + Wil je ook de dataset compleet maken? Markeer als voltooid Naam Formule diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 3b4c1441ee8..072fd1d7df4 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -488,7 +488,6 @@ Aceita Continuar url do servidor - Digite o URL do servidor DHIS 2 da sua organização, conforme fornecido pelo administrador do sistema.\n\nAlternativamente, você pode digitalizar um código QR contendo o URL do seu servido Esqueceu seu código? O que você gostaria de fazer para este evento? FIM @@ -671,9 +670,9 @@ Detalhes Comentarios Gravado! - Você quer verificar a qualidade dos dados\? + Você quer verificar a qualidade dos dados? Tudo parece bem! - Você também deseja completar o conjunto de dados\? + Você também deseja completar o conjunto de dados? Marcar como completado Nome Fórmula diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 7714bdd2226..3fd36d0aa72 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -474,7 +474,6 @@ Согласен Продолжить Адрес веб-страницы сервера - Введите URL-адрес сервера DHIS 2 для Вашей организации, предоставленный Вашим системным администратором. Другой вариант - отсканировать QR-код, содержащий URL-адрес Вашего сервера. Забыли свой код? Что бы Вы хотели сделать для этого события? КОНЕЦ @@ -645,9 +644,9 @@ Детали Комментарии Сохранено! - Вы хотите проверить качество данных\? + Вы хотите проверить качество данных? Все выглядит хорошо! - Вы также хотите завершить набор данных\? + Вы также хотите завершить набор данных? Отметить как завершенное Название Формула diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 14a44145ab3..3e351bcfd29 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -477,7 +477,6 @@ Погодитись Продовжити URL-адреса серверу - Введіть URL-адресу серверу DHIS 2 для Вашої організації, надану Вашим системним адміністратором. Альтернативно, Ви можете відсканувати QR-код, що містить URL-адресу Вашого сервера Забули код? Що б Ви хотіли зробити для цього випадку? КІН @@ -660,9 +659,9 @@ Деталі Коментарі Збережено! - Хочете перевірити якість даних\? + Хочете перевірити якість даних? Все виглядає добре! - Ви бажаєте також завершити набір даних\? + Ви бажаєте також завершити набір даних? Позначити як виконане Ім\'я Формула diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index 8afc2fd4f7a..7c9298eb084 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -113,6 +113,7 @@ کام جاری ہے ناکام + کثیر الاضلاع (حدود) محفوظ کر لی گئیں کثیر زبان مدت ترتیب دیں diff --git a/app/src/main/res/values-uz-rUZ/strings.xml b/app/src/main/res/values-uz-rUZ/strings.xml index 39c1a3447cb..d473e9f7a0a 100644 --- a/app/src/main/res/values-uz-rUZ/strings.xml +++ b/app/src/main/res/values-uz-rUZ/strings.xml @@ -434,7 +434,6 @@ Roziman Davom etish Server URLi - Tashkilotingiz uchun tizim maʼmuri tomonidan taqdim etilgan DHIS2 server URL manzilini kiriting. \n\ Boshqa holda, siz serveringiz URL manzilini oʼz ichiga olgan QR kodini skanerlashingiz mumkin. Kodingizni unutdingizmi? Ushbu hodisa/tadbir uchun nima qilmoqchisiz? TАMOM @@ -612,9 +611,9 @@ Тафсилотлари Izohlar Saqlandi! - Maʼlumotlar sifatini tekshirishni xoxlaysizmi\? + Maʼlumotlar sifatini tekshirishni xoxlaysizmi? Koʼrinishidan hammasi yaxshi! - Maʼlumotlar toʼplamini toʼldirishni xoxlaysizmi\? + Maʼlumotlar toʼplamini toʼldirishni xoxlaysizmi? Tugallangan deb belgilang Исми Formula diff --git a/app/src/main/res/values-uz/strings.xml b/app/src/main/res/values-uz/strings.xml index 93865dddd30..10df82d46f5 100644 --- a/app/src/main/res/values-uz/strings.xml +++ b/app/src/main/res/values-uz/strings.xml @@ -453,7 +453,6 @@ Розиман Давом этиш Сервер URLи - Ташкилотингиз учун тизим маъмури томонидан тақдим этилган DHIS2 сервер URL манзилини киритинг. \n\ Бошқа ҳолда, сиз серверингиз URL манзилини ўз ичига олган QR кодини сканерлашингиз мумкин. Кодингизни унутдингизми? Ушбу ҳодиса/тадбир учун нима қилмоқчисиз? ТАМОМ @@ -635,9 +634,9 @@ Тафсилотлари Изоҳлар Сақланди! - Маълумотлар сифатини текширишни хохлайсизми\? + Маълумотлар сифатини текширишни хохлайсизми? Кўринишидан ҳаммаси яхши! - Маълумотлар тўпламини тўлдиришни хохлайсизми\? + Маълумотлар тўпламини тўлдиришни хохлайсизми? Тугалланган сифатида белгилансин Исми Формула diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index baa576b366d..8cf8299451f 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -485,7 +485,6 @@ Đồng ý Tiếp tục Đường dẫn đến máy chủ - Nhập đường dẫn liên kết đến máy chủ DHIS 2 với đơn vị được cung cấp bởi quản lý của bạn.\n\n Hoặc bạn có thể quét mã QR có chứa đường dẫn liên kết đến máy chủ. Bạn đã quên mã của bạn phải không? Bạn muốn làm gì với sự kiện này? KẾT THÚC @@ -668,9 +667,9 @@ Chi tiết Ghi chú Đã lưu! - Ban có muốn kiểm tra chất lượng dữ liệu không\? + Ban có muốn kiểm tra chất lượng dữ liệu không? Mọi thứ đều ổn! - Bạn cũng muốn hoàn tất biểu nhập phải không\? + Bạn cũng muốn hoàn tất biểu nhập phải không? Đánh dấu đã hoàn tất Tên Công thức @@ -785,7 +784,7 @@ Xem Radar Không thể cài đặt kiểu tọa độ Đã theo dõi %s - %s không thể chuyển đổi dữ liệu Ngày + %s không thể chuyển đổi thành Ngày Không thể cập nhật trường dữ liệu này. Xin vui lòng thử lại. Chỉnh sửa Hiện có diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index f3fc5015bcb..325ac51137c 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -484,7 +484,6 @@ 同意 继续 服务器URL - 输入管理员提供的服务器地址。\n\n 可选的你可以扫描服务器地址 二维码 忘记你的数字口令 对该事件你想做什么? 结束 diff --git a/commons/src/main/res/values-ru/strings.xml b/commons/src/main/res/values-ru/strings.xml index 1961a02d8e8..69acfd0ee9c 100644 --- a/commons/src/main/res/values-ru/strings.xml +++ b/commons/src/main/res/values-ru/strings.xml @@ -331,6 +331,5 @@ Месяц Квартал Год - Нет доступных периодов Очистить все diff --git a/commons/src/main/res/values-vi/strings.xml b/commons/src/main/res/values-vi/strings.xml index 32c878e2fb8..d5d27531d7b 100644 --- a/commons/src/main/res/values-vi/strings.xml +++ b/commons/src/main/res/values-vi/strings.xml @@ -202,7 +202,7 @@ Phiên bản của Cài Đặt Ứng Dụng Web này không hỗ trợ Cài Đặt Ứng Dụng Web không được cài trong máy chủ. Máy chủ mất quá nhiều thời gian để trả lời. Chúng tôi đã hủy yêu cầu. - Mối quan hệ không thể cập nhật. + Không thể cập nhật mối quan hệ với bệnh nhân Có quá nhiều thời điểm Chúng tôi không thể tìm thấy đường dẫn liên kết. Vui lòng kiểm tra nó. Tài khoảng của bạn đã bị vô hiệu. Nếu đây là lỗi, vui lòng liên hệ quản lý của bạn. diff --git a/commons/src/main/res/values-zh-rCN/strings.xml b/commons/src/main/res/values-zh-rCN/strings.xml index 6b655484185..8fdac7dc05c 100644 --- a/commons/src/main/res/values-zh-rCN/strings.xml +++ b/commons/src/main/res/values-zh-rCN/strings.xml @@ -328,6 +328,5 @@ 每月六次 财政年度 - 无可用时段 全清除 diff --git a/commons/src/main/res/values-zh/strings.xml b/commons/src/main/res/values-zh/strings.xml index 031f5dbb1d7..51340ad9ab1 100644 --- a/commons/src/main/res/values-zh/strings.xml +++ b/commons/src/main/res/values-zh/strings.xml @@ -50,7 +50,6 @@ 两周 开始于周三的周报 开始于周四的周报 - 每周从周五开始 开始于周六的周报 开始于周日的周报 每月 @@ -62,11 +61,8 @@ 从 7 月开始,每 6 个月一次 开始于11月的半年 每年 - 从 2 月开始的财务年度 开始于四月的财政年 开始于六月的财政年 - 从 8 月开始的财政年度 - 9 月开始的财政年度 开始于十月的财政年 开始于11月的财政年 diff --git a/commonskmm/src/commonMain/composeResources/values-bn/strings.xml b/commonskmm/src/commonMain/composeResources/values-bn/strings.xml index 926dfcf4f64..c73b515511b 100644 --- a/commonskmm/src/commonMain/composeResources/values-bn/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-bn/strings.xml @@ -4,8 +4,4 @@ ভুল তারিখ নির্ধারিত তারিখ - - - \ No newline at end of file + \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-en-rUS/strings.xml b/commonskmm/src/commonMain/composeResources/values-en-rUS/strings.xml index 3dd71250539..64b9f608a19 100644 --- a/commonskmm/src/commonMain/composeResources/values-en-rUS/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-en-rUS/strings.xml @@ -136,7 +136,6 @@ Creation aborted. The object already exists. Deletion aborted. The object does not exist. Unable to instantiate keystore. - We couldn´t reserve values for these record. Please contact your admin. Please login to export the database. Exporting an encrypted database is not supported. You are importing an already existing database. @@ -163,7 +162,6 @@ The server took too much time to respond. We canceled the request. The relationship can\'t be updated. There are too many periods. - We couldn´t find the URL. Please verify it. Your user account have been disabled. If this is an error, contact your administrator. Your user account is locked. If this is an error, contact your administrator. The value could not be set. diff --git a/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml b/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml index ce60d43e806..06fa11454fb 100644 --- a/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml @@ -10,7 +10,7 @@ केवल 0 से 1 के मान ही अनुमति हैं यह मान्य URL नहीं है यह फ़ील्ड अपडेट नहीं हो सका। कृपया फिर से प्रयास करें - एरर्स + त्रुटि मान अद्वितीय होना चाहिए। समान मान मिला है। इसे सहेजा नहीं गया। कृपया जाँच करें समय चुनें दिन चुनें diff --git a/commonskmm/src/commonMain/composeResources/values-lo/strings.xml b/commonskmm/src/commonMain/composeResources/values-lo/strings.xml index b2a003396cf..bad89239379 100644 --- a/commonskmm/src/commonMain/composeResources/values-lo/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-lo/strings.xml @@ -56,7 +56,7 @@ ບໍ່​ແມ່ນ​ຕອນ​ນີ້ ບັນທຶກ ສຶບຕໍ່ແກ້ໄຂ - ທ່ານຕ້ອງການໝາຍແບບຟອມນີ້ວ່າສຳເລັດແລ້ວຫຼືບໍ\? + ທ່ານຕ້ອງການໝາຍແບບຟອມນີ້ວ່າສຳເລັດແລ້ວຫຼືບໍ? ຖ້າທ່ານອອກດຽວນີ້ ຂໍ້ມູນທັງໝົດໃນແບບຟອມຈະຖືກຍົກເລີກ. ເຜີຍແຜ່ ປິດ diff --git a/commonskmm/src/commonMain/composeResources/values-or/strings.xml b/commonskmm/src/commonMain/composeResources/values-or/strings.xml index f6b29d4ee0f..f89310adafb 100644 --- a/commonskmm/src/commonMain/composeResources/values-or/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-or/strings.xml @@ -15,8 +15,4 @@ ଅକ୍ଷାଂଶ ଦ୍ରାଘିମା ହୋଇଗଲା - - - \ No newline at end of file + \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-si/strings.xml b/commonskmm/src/commonMain/composeResources/values-si/strings.xml index fdbec3574f9..0e98d5f92cd 100644 --- a/commonskmm/src/commonMain/composeResources/values-si/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-si/strings.xml @@ -11,8 +11,4 @@ හෝ පිළිගන්න නිම කළා - - - \ No newline at end of file + \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-ur/strings.xml b/commonskmm/src/commonMain/composeResources/values-ur/strings.xml index 30391151185..c01ef567d00 100644 --- a/commonskmm/src/commonMain/composeResources/values-ur/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-ur/strings.xml @@ -10,6 +10,7 @@ کثیر زبان طول لمبائی + کثیر الاضلاع (حدود) محفوظ کر لی گئیں اخری تاریخ مکمل بانٹیں diff --git a/form/src/main/res/values-cs/strings.xml b/form/src/main/res/values-cs/strings.xml index 797b1fe99b8..5c28a0ce5ff 100644 --- a/form/src/main/res/values-cs/strings.xml +++ b/form/src/main/res/values-cs/strings.xml @@ -60,7 +60,6 @@ Povolení k použití kamery je zamítnuto.\nChcete-li tuto funkci používat, musíte ji povolit. Zavřít Upozornění na pravidla programu - Došlo k problému s konfigurací, který způsobuje smyčku v pravidlech. Kontaktujte svého správce. Zkopírováno Žádné informace pro toto pole Vyfotit diff --git a/form/src/main/res/values-en-rUS/strings.xml b/form/src/main/res/values-en-rUS/strings.xml index 4f419438db0..a79290aa2a6 100644 --- a/form/src/main/res/values-en-rUS/strings.xml +++ b/form/src/main/res/values-en-rUS/strings.xml @@ -53,7 +53,6 @@ Share Close Program rules warning - There is a configuration issue causing a loop in the rules. Contact you administrator. Copied No info for this field Take Photo diff --git a/form/src/main/res/values-es-rES/strings.xml b/form/src/main/res/values-es-rES/strings.xml index 7bc7a7d781f..cee76953dcc 100644 --- a/form/src/main/res/values-es-rES/strings.xml +++ b/form/src/main/res/values-es-rES/strings.xml @@ -51,7 +51,6 @@ Compartir Cerrar Advertencia de reglas del programa - Hay un problema de configuración que provoca un bucle en las reglas. Póngase en contacto con su administrador. Copiado No hay información para este campo Tomar foto diff --git a/form/src/main/res/values-es/strings.xml b/form/src/main/res/values-es/strings.xml index 1e2d4d6e2dd..055834d6858 100644 --- a/form/src/main/res/values-es/strings.xml +++ b/form/src/main/res/values-es/strings.xml @@ -60,7 +60,6 @@ El permiso de cámara está denegado.\nDebes activarlo para usar esta función. Cerrar Advertencia de reglas del programa - Hay un problema de configuración que provoca un bucle en las reglas. Póngase en contacto con su administrador. Copiado No hay información para este campo Tomar foto diff --git a/form/src/main/res/values-fr/strings.xml b/form/src/main/res/values-fr/strings.xml index ed4c603d9f2..6cb191b8d15 100644 --- a/form/src/main/res/values-fr/strings.xml +++ b/form/src/main/res/values-fr/strings.xml @@ -51,7 +51,6 @@ Partager Fermer Avertissement relatif aux règles du programme - Il y a un problème de configuration provoquant une boucle dans les règles. Contactez votre administrateur. Copié Pas d\'information pour ce champ Prendre une photo diff --git a/form/src/main/res/values-lo/strings.xml b/form/src/main/res/values-lo/strings.xml index 29222df2b69..99ba20ceb36 100644 --- a/form/src/main/res/values-lo/strings.xml +++ b/form/src/main/res/values-lo/strings.xml @@ -48,7 +48,6 @@ ເຜີຍແຜ່ ປິດ ຂໍ້ຄວນລະວັງກົດຂອງສາຍງານ - ມີບັນຫາການກຳນົດຄ່າທີ່ເຮັດໃຫ້ເກີດມີຊ່ອງຫວ່າງໃນກົດລະບຽບ. ຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ. ສຳເນົາແລ້ວ ບໍ່ມີຂໍ້ມູນສຳລັບຫ້ອງຂໍ້ມູນນີ້ ຖ່າຍຮູບ diff --git a/form/src/main/res/values-nl/strings.xml b/form/src/main/res/values-nl/strings.xml index cee4ecf9223..a441b4e2fb0 100644 --- a/form/src/main/res/values-nl/strings.xml +++ b/form/src/main/res/values-nl/strings.xml @@ -52,7 +52,6 @@ Deel Sluit Waarschuwing programmaregels - Er is een configuratieprobleem dat een lus in de regels veroorzaakt. Neem contact op met uw beheerder. Gekopieerd Geen info voor dit veld Neem foto diff --git a/form/src/main/res/values-pt/strings.xml b/form/src/main/res/values-pt/strings.xml index e23cbc70f87..43f7f5d9eeb 100644 --- a/form/src/main/res/values-pt/strings.xml +++ b/form/src/main/res/values-pt/strings.xml @@ -53,7 +53,6 @@ Partilha Fechar Aviso de regras do programa - Existe um problema de configuração que está a provocar um ciclo nas regras. Contacte o seu administrador. Copiado Nenhuma informação para este campo Tirar fotografia diff --git a/form/src/main/res/values-ru/strings.xml b/form/src/main/res/values-ru/strings.xml index 833482f8d39..e28f6cc4301 100644 --- a/form/src/main/res/values-ru/strings.xml +++ b/form/src/main/res/values-ru/strings.xml @@ -56,7 +56,6 @@ Разрешение камеры запрещено.\nЧтобы использовать эту функцию, ее необходимо разрешить. Закрыть Предупреждение о правилах программы - Существует проблема конфигурации, вызывающая зацикливание правил. Обратитесь к администратору. Скопировано Нет информации для этого поля Сделать фото diff --git a/form/src/main/res/values-uk/strings.xml b/form/src/main/res/values-uk/strings.xml index a54098a1157..3406f999bbc 100644 --- a/form/src/main/res/values-uk/strings.xml +++ b/form/src/main/res/values-uk/strings.xml @@ -51,7 +51,6 @@ Поділитися Закрити Попередження про правила програми - Існує проблема конфігурації, яка спричиняє помилку у правилах. Зверніться до адміністратора. Скопійовано Немає інформації для цього поля Зробити фото diff --git a/form/src/main/res/values-ur/strings.xml b/form/src/main/res/values-ur/strings.xml index 54ef83f7f58..cb89820a912 100644 --- a/form/src/main/res/values-ur/strings.xml +++ b/form/src/main/res/values-ur/strings.xml @@ -9,6 +9,7 @@ کثیر زبان طول لمبائی + کثیر الاضلاع (حدود) محفوظ کر لی گئیں اخری تاریخ مکمل بانٹیں diff --git a/form/src/main/res/values-vi/strings.xml b/form/src/main/res/values-vi/strings.xml index 717900e8ec2..0de0479a077 100644 --- a/form/src/main/res/values-vi/strings.xml +++ b/form/src/main/res/values-vi/strings.xml @@ -16,7 +16,7 @@ Năm Tháng Ngày - %s không thể chuyển đổi dữ liệu Ngày + %s không thể chuyển đổi thành Ngày Bản đồ Vĩ độ Kinh độ @@ -60,7 +60,6 @@ Quyền mở máy ảnh bị từ chối..\nBạn cần bật tính năng máy ảnh để sử dụng chức năng này. Đóng Cảnh báo quy tắc chương trình - Có một vấn đề cấu hình gây ra một vòng lặp trong các quy tắc chương trình. Hãy liên lạc với quản lý của bạn. Đã sao chép Không có thông tin cho trường dữ liệu này Chụp ảnh diff --git a/form/src/main/res/values-zh-rCN/strings.xml b/form/src/main/res/values-zh-rCN/strings.xml index 58632b0adfc..bc5f5c48d7e 100644 --- a/form/src/main/res/values-zh-rCN/strings.xml +++ b/form/src/main/res/values-zh-rCN/strings.xml @@ -53,7 +53,6 @@ 分享 关闭 项目规则警告 - 存在导致规则循环的配置问题。联系您的管理员。 副本 该字段没有相关信息 拍照 diff --git a/form/src/main/res/values-zh/strings.xml b/form/src/main/res/values-zh/strings.xml index 1edf001267b..fd2548e3992 100644 --- a/form/src/main/res/values-zh/strings.xml +++ b/form/src/main/res/values-zh/strings.xml @@ -60,7 +60,6 @@ 相机权限被拒绝。\n您需要启用它才能使用此功能。 关闭 项目规则警告 - 存在导致规则循环的配置问题。联系您的管理员。 副本 该字段没有相关信息 拍照 diff --git a/login/src/commonMain/composeResources/values-lo/strings.xml b/login/src/commonMain/composeResources/values-lo/strings.xml index 1667abe1268..10e147b8737 100644 --- a/login/src/commonMain/composeResources/values-lo/strings.xml +++ b/login/src/commonMain/composeResources/values-lo/strings.xml @@ -1,4 +1,4 @@ - + ກວດສອບຄວາມຖືກຕ້ອງແບບ 2 ຂັ້ນ ຕໍ່ໄປ diff --git a/login/src/commonMain/composeResources/values-nl/strings.xml b/login/src/commonMain/composeResources/values-nl/strings.xml index 4e8b53798d0..329ce838304 100644 --- a/login/src/commonMain/composeResources/values-nl/strings.xml +++ b/login/src/commonMain/composeResources/values-nl/strings.xml @@ -1,4 +1,4 @@ - + Twee-factor-authenticatie Authenticatiecode diff --git a/login/src/commonMain/composeResources/values-pt/strings.xml b/login/src/commonMain/composeResources/values-pt/strings.xml index 81c95c67961..127c1bdec91 100644 --- a/login/src/commonMain/composeResources/values-pt/strings.xml +++ b/login/src/commonMain/composeResources/values-pt/strings.xml @@ -1,4 +1,4 @@ - + Autenticação de dois factores Próximo diff --git a/login/src/commonMain/composeResources/values-ru/strings.xml b/login/src/commonMain/composeResources/values-ru/strings.xml index c4c5aafffa4..ddf5b074af7 100644 --- a/login/src/commonMain/composeResources/values-ru/strings.xml +++ b/login/src/commonMain/composeResources/values-ru/strings.xml @@ -1,4 +1,4 @@ - + Далее Быстрый вход в систему diff --git a/login/src/commonMain/composeResources/values-vi/strings.xml b/login/src/commonMain/composeResources/values-vi/strings.xml index d3175d53cad..155ba5ec095 100644 --- a/login/src/commonMain/composeResources/values-vi/strings.xml +++ b/login/src/commonMain/composeResources/values-vi/strings.xml @@ -1,4 +1,4 @@ - + Xác thực hai yếu tố Mã xác thực diff --git a/sync/src/commonMain/composeResources/values-ar/strings.xml b/sync/src/commonMain/composeResources/values-ar/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-ar/strings.xml +++ b/sync/src/commonMain/composeResources/values-ar/strings.xml @@ -1,5 +1,6 @@ - + Dhis2 + diff --git a/sync/src/commonMain/composeResources/values-ckb/strings.xml b/sync/src/commonMain/composeResources/values-ckb/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-ckb/strings.xml +++ b/sync/src/commonMain/composeResources/values-ckb/strings.xml @@ -1,5 +1,6 @@ - + Dhis2 + diff --git a/sync/src/commonMain/composeResources/values-cs/strings.xml b/sync/src/commonMain/composeResources/values-cs/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-cs/strings.xml +++ b/sync/src/commonMain/composeResources/values-cs/strings.xml @@ -1,5 +1,6 @@ - + Dhis2 + diff --git a/sync/src/commonMain/composeResources/values-es-rES/strings.xml b/sync/src/commonMain/composeResources/values-es-rES/strings.xml index 4c1c46011bd..fbe849a24c8 100644 --- a/sync/src/commonMain/composeResources/values-es-rES/strings.xml +++ b/sync/src/commonMain/composeResources/values-es-rES/strings.xml @@ -1,5 +1,6 @@ - + DHIS 2 + diff --git a/sync/src/commonMain/composeResources/values-es/strings.xml b/sync/src/commonMain/composeResources/values-es/strings.xml index 4c1c46011bd..fbe849a24c8 100644 --- a/sync/src/commonMain/composeResources/values-es/strings.xml +++ b/sync/src/commonMain/composeResources/values-es/strings.xml @@ -1,5 +1,6 @@ - + DHIS 2 + diff --git a/sync/src/commonMain/composeResources/values-fr/strings.xml b/sync/src/commonMain/composeResources/values-fr/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-fr/strings.xml +++ b/sync/src/commonMain/composeResources/values-fr/strings.xml @@ -1,5 +1,6 @@ - + Dhis2 + diff --git a/sync/src/commonMain/composeResources/values-id/strings.xml b/sync/src/commonMain/composeResources/values-id/strings.xml index 4c1c46011bd..91e4338bcb7 100644 --- a/sync/src/commonMain/composeResources/values-id/strings.xml +++ b/sync/src/commonMain/composeResources/values-id/strings.xml @@ -1,5 +1,6 @@ - + DHIS2 + diff --git a/sync/src/commonMain/composeResources/values-km/strings.xml b/sync/src/commonMain/composeResources/values-km/strings.xml index 4c1c46011bd..f568a46e86f 100644 --- a/sync/src/commonMain/composeResources/values-km/strings.xml +++ b/sync/src/commonMain/composeResources/values-km/strings.xml @@ -1,5 +1,6 @@ - + ឌីអេចអាយអេសធូ (DHIS 2) + diff --git a/sync/src/commonMain/composeResources/values-lo/strings.xml b/sync/src/commonMain/composeResources/values-lo/strings.xml index 4c1c46011bd..5276a519bfc 100644 --- a/sync/src/commonMain/composeResources/values-lo/strings.xml +++ b/sync/src/commonMain/composeResources/values-lo/strings.xml @@ -1,5 +1,6 @@ - + ລະບົບ DHIS2 + diff --git a/sync/src/commonMain/composeResources/values-nb/strings.xml b/sync/src/commonMain/composeResources/values-nb/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-nb/strings.xml +++ b/sync/src/commonMain/composeResources/values-nb/strings.xml @@ -1,5 +1,6 @@ - + Dhis2 + diff --git a/sync/src/commonMain/composeResources/values-nl/strings.xml b/sync/src/commonMain/composeResources/values-nl/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-nl/strings.xml +++ b/sync/src/commonMain/composeResources/values-nl/strings.xml @@ -1,5 +1,6 @@ - + Dhis2 + diff --git a/sync/src/commonMain/composeResources/values-pt/strings.xml b/sync/src/commonMain/composeResources/values-pt/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-pt/strings.xml +++ b/sync/src/commonMain/composeResources/values-pt/strings.xml @@ -1,5 +1,6 @@ - + Dhis2 + diff --git a/sync/src/commonMain/composeResources/values-ru/strings.xml b/sync/src/commonMain/composeResources/values-ru/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-ru/strings.xml +++ b/sync/src/commonMain/composeResources/values-ru/strings.xml @@ -1,5 +1,6 @@ - + Dhis2 + diff --git a/sync/src/commonMain/composeResources/values-sv/strings.xml b/sync/src/commonMain/composeResources/values-sv/strings.xml index 4c1c46011bd..91e4338bcb7 100644 --- a/sync/src/commonMain/composeResources/values-sv/strings.xml +++ b/sync/src/commonMain/composeResources/values-sv/strings.xml @@ -1,5 +1,6 @@ - + DHIS2 + diff --git a/sync/src/commonMain/composeResources/values-uk/strings.xml b/sync/src/commonMain/composeResources/values-uk/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-uk/strings.xml +++ b/sync/src/commonMain/composeResources/values-uk/strings.xml @@ -1,5 +1,6 @@ - + Dhis2 + diff --git a/sync/src/commonMain/composeResources/values-uz-rUZ/strings.xml b/sync/src/commonMain/composeResources/values-uz-rUZ/strings.xml index 4c1c46011bd..91e4338bcb7 100644 --- a/sync/src/commonMain/composeResources/values-uz-rUZ/strings.xml +++ b/sync/src/commonMain/composeResources/values-uz-rUZ/strings.xml @@ -1,5 +1,6 @@ - + DHIS2 + diff --git a/sync/src/commonMain/composeResources/values-uz/strings.xml b/sync/src/commonMain/composeResources/values-uz/strings.xml index 4c1c46011bd..91e4338bcb7 100644 --- a/sync/src/commonMain/composeResources/values-uz/strings.xml +++ b/sync/src/commonMain/composeResources/values-uz/strings.xml @@ -1,5 +1,6 @@ - + DHIS2 + diff --git a/sync/src/commonMain/composeResources/values-vi/strings.xml b/sync/src/commonMain/composeResources/values-vi/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-vi/strings.xml +++ b/sync/src/commonMain/composeResources/values-vi/strings.xml @@ -1,5 +1,6 @@ - + Dhis2 + diff --git a/sync/src/commonMain/composeResources/values-zh/strings.xml b/sync/src/commonMain/composeResources/values-zh/strings.xml index 4c1c46011bd..f38f31555db 100644 --- a/sync/src/commonMain/composeResources/values-zh/strings.xml +++ b/sync/src/commonMain/composeResources/values-zh/strings.xml @@ -1,5 +1,8 @@ - + DHIS2 + 检查网络设置 + 同步配置 + diff --git a/tracker/src/commonMain/composeResources/values-zh/strings.xml b/tracker/src/commonMain/composeResources/values-zh/strings.xml index de3de53e75a..07ff4461bcc 100644 --- a/tracker/src/commonMain/composeResources/values-zh/strings.xml +++ b/tracker/src/commonMain/composeResources/values-zh/strings.xml @@ -14,7 +14,8 @@ 显示较少 取消 移除 - 没有配置可使用的搜索字段。\n请联系您的管理员。 + 没有配置可使用的搜索字段。 +请联系您的管理员。 清除搜索 搜索 可选项描述 From 87d4c31a1c3450a1340bf720c2af08746abe8ee8 Mon Sep 17 00:00:00 2001 From: Xavier Molloy Date: Tue, 5 May 2026 11:39:05 +0200 Subject: [PATCH 219/260] fix: [ANDROAPP-7574] make navigation context safe (#4829) * fix: [ANDROAPP-7574] make navigation context safe and chack if fragment is attached * fix: [ANDROAPP-7574] fix unit tests --- .../teidata/TEIDataFragment.kt | 2 ++ .../teidata/TEIDataPresenter.kt | 21 ++++++++++++------- .../data/TeiDataPresenterTest.kt | 1 + 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataFragment.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataFragment.kt index 299bd2620de..1f27a1808f1 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataFragment.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataFragment.kt @@ -682,6 +682,7 @@ class TEIDataFragment : eventMode: EventMode, programUid: String, ) { + if (!isAdded) return val intent = EventCaptureActivity.intent( context = requireContext(), @@ -696,6 +697,7 @@ class TEIDataFragment : programUid: String, programStageUid: String, ) { + if (!isAdded) return OUTreeFragment .Builder() .singleSelection() diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataPresenter.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataPresenter.kt index 8dc501194ac..325caeabcff 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataPresenter.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataPresenter.kt @@ -12,6 +12,7 @@ import io.reactivex.disposables.CompositeDisposable import io.reactivex.processors.BehaviorProcessor import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import org.dhis2.commons.Constants import org.dhis2.commons.bindings.canCreateEventInEnrollment import org.dhis2.commons.bindings.enrollment @@ -484,7 +485,9 @@ class TEIDataPresenter( if (orgUnits.count() == 1) { onNewEventSelected(orgUnits.first().uid(), programStageUid) } else { - view.displayOrgUnitSelectorForNewEvent(programUid, programStageUid) + withContext(dispatcher.ui()) { + view.displayOrgUnitSelectorForNewEvent(programUid, programStageUid) + } } } } @@ -502,14 +505,18 @@ class TEIDataPresenter( enrollmentUid = enrollmentUid, ).fold( onSuccess = { eventUid -> - view.goToEventDetails( - eventUid = eventUid, - eventMode = EventMode.NEW, - programUid = it, - ) + withContext(dispatcher.ui()) { + view.goToEventDetails( + eventUid = eventUid, + eventMode = EventMode.NEW, + programUid = it, + ) + } }, onFailure = { d2Error -> - view.displayMessage(d2ErrorUtils.getErrorMessage(d2Error)) + withContext(dispatcher.ui()) { + view.displayMessage(d2ErrorUtils.getErrorMessage(d2Error)) + } }, ) } diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/data/TeiDataPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/data/TeiDataPresenterTest.kt index 7d4574c7d0f..4490d8e7ce8 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/data/TeiDataPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/data/TeiDataPresenterTest.kt @@ -78,6 +78,7 @@ class TeiDataPresenterTest { private val dispatcherProvider: DispatcherProvider = mock { on { io() } doReturn Dispatchers.Unconfined + on { ui() } doReturn Dispatchers.Unconfined } private val createEventUseCase: CreateEventUseCase = mock() private val d2ErrorUtils: D2ErrorUtils = mock() From 5942e56fe5c16563a0eab3aa719476c2b6f103aa Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Wed, 6 May 2026 08:33:13 +0200 Subject: [PATCH 220/260] fix(translations): sync translations from transifex (main) (#4856) --- app/src/main/res/values-hi-rIN/strings.xml | 24 +++++++-- .../src/main/res/values-hi-rIN/strings.xml | 3 ++ .../values-hi-rIN/strings.xml | 10 ++++ .../src/main/res/values-hi-rIN/strings.xml | 54 ++++++++++++++++++- form/src/main/res/values-hi-rIN/strings.xml | 7 +++ 5 files changed, 92 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml index d8deda45566..5f5dda680a4 100644 --- a/app/src/main/res/values-hi-rIN/strings.xml +++ b/app/src/main/res/values-hi-rIN/strings.xml @@ -30,6 +30,9 @@ पाठ दर्ज करें लंबा अक्षर दर्ज करें नंबर दर्ज करें + नेगेटिव इंटीजर दर्ज करें + पॉजिटिव इंटीजर या शून्य दर्ज करें + पॉजिटिव इंटीजर दर्ज करें दिन चुनें खोलें इवेंट कंप्लीटेड @@ -44,6 +47,8 @@ नया इवेंट यदि आप कोई वैल्यू दर्ज करते हैं, तो डेटा सेट पूरा करने के लिए पूरी पंक्ति के सभी वैल्यू आवश्यक हैं। कुछ अनिवार्य फ़ील्ड खाली हैं। डेटा सेट पूरा करने के लिए उन्हें भरें। + + नियत तिथि रद्द करें हटाएं संपादन करें @@ -63,6 +68,7 @@ वर्ष सप्ताह साफ़ करें + पीरियड आगे सहेजें ठीक है @@ -79,7 +85,7 @@ केवल 0 से 1 के मान ही अनुमति हैं केवल 0 से 100 के वैल्यूज़ अनुमति हैं नया इवेंट जनरेट करें - क्या आप एक और इवेंट बनाना चाहते हैं\? + क्या आप एक और इवेंट बनाना चाहते हैं? इंडिकेटर्स इंडिकेटर्स खत्म @@ -96,12 +102,14 @@ यह मान्य URL नहीं है पूरा हुआ सिंक हो रहा है… + पीरियड आज कल (बिता हुआ) इस सप्ताह पिछला सप्ताह इस महीने पिछला महीना + दूसरा खोलें अतिदेय विज़िट की गई @@ -129,11 +137,16 @@ पूरा हुआ डेटा पूरा हुआ - क्या आप सुनिश्चित हैं\? + क्या आप सुनिश्चित हैं? तारीख यह फ़ील्ड आवश्यक है पीछे जाएं बंद करें + बार व्यू + लाइन व्यू + टेबल व्यू + वैल्यू व्यू + पाई व्यू इस वर्ष पिछली तिमाही पिछला वर्ष @@ -142,7 +155,9 @@ फ़ोटो लें यह प्रोग्राम सुरक्षित है गलत लॉगिन जानकारी + वैल्यू इंटीजर होनी चाहिए वैल्यू + रेडार व्यू %s डेट के रूप में पढ़ा नहीं जा सकता यह फ़ील्ड अपडेट नहीं हो सका। कृपया फिर से प्रयास करें उपलब्ध @@ -154,6 +169,7 @@ नया बनाएँ आपके पास कुछ चेतावनी संदेश हैं आपके पास कुछ चेतावनी संदेश हैं\nक्या आप इस फ़ॉर्म को कम्प्लीट मार्क करना चाहते हैं\? + आपके पास कुछ एरर संदेश हैं\nक्या आप उन्हें समीक्षा करना चाहते हैं\? सिंक हो रहा है अभी नहीं केवल देखें @@ -162,8 +178,8 @@ इवेंट खोज साफ़ करें वैकल्पिक - उपयोग के लिए कोई खोज फ़ील्ड कॉन्फ़िगर नहीं है + उपयोग के लिए कोई खोज फ़ील्ड कॉन्फ़िगर नहीं है\nकृपया अपने एडमिन से संपर्क करें और दिखाएँ कम दिखाएँ - यह सेक्शन सही तरह से कॉन्फ़िगर नहीं है\n अपने एडमिन से संपर्क करें + यह सेक्शन सही तरह से कॉन्फ़िगर नहीं है\nअपने एडमिन से संपर्क करें diff --git a/commons/src/main/res/values-hi-rIN/strings.xml b/commons/src/main/res/values-hi-rIN/strings.xml index 45fa1a37cb9..49cfefae23a 100644 --- a/commons/src/main/res/values-hi-rIN/strings.xml +++ b/commons/src/main/res/values-hi-rIN/strings.xml @@ -11,6 +11,7 @@ डेटा सेट्स पूरा हुआ + पीरियड तारीख रोज़ाना साप्ताहिक @@ -32,9 +33,11 @@ पिछला सप्ताह इस महीने पिछला महीना + दूसरा इस वर्ष पिछली तिमाही पिछला वर्ष + पीरियड रोज़ाना साप्ताहिक मासिक diff --git a/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml b/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml index 06fa11454fb..43f9ee7f1e9 100644 --- a/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml @@ -9,11 +9,16 @@ केवल शून्य या पॉजिटिव संख्या ही अनुमति है केवल 0 से 1 के मान ही अनुमति हैं यह मान्य URL नहीं है + वैल्यू इंटीजर होनी चाहिए + यह सही फॉर्मेट नहीं है + कॉन्फ़िगर्ड पैटर्न %s गलत है यह फ़ील्ड अपडेट नहीं हो सका। कृपया फिर से प्रयास करें त्रुटि मान अद्वितीय होना चाहिए। समान मान मिला है। इसे सहेजा नहीं गया। कृपया जाँच करें समय चुनें दिन चुनें + प्रोग्राम रूल %s वैल्यू %s असाइन कर रहा है, जो ऑप्शन सेट %s में नहीं है + फील्ड का मान %s के ऑप्शन सेट %s में नहीं है यह फ़ील्ड आवश्यक है आपके पास कुछ चेतावनी संदेश हैं आपके पास कुछ चेतावनी संदेश हैं\nक्या आप इस फ़ॉर्म को कम्प्लीट मार्क करना चाहते हैं\? @@ -29,12 +34,16 @@ URL दर्ज करें ईमेल दर्ज करें फ़ोन नंबर दर्ज करें + पॉजिटिव इंटीजर या शून्य दर्ज करें + नेगेटिव इंटीजर दर्ज करें + पॉजिटिव इंटीजर दर्ज करें नंबर दर्ज करें प्रतिशत दर्ज करें 0 से 1 नंबर दर्ज करें अक्षर दर्ज करें लंबा अक्षर दर्ज करें पाठ दर्ज करें + नियत तिथि अक्षांश देशांतर सेव नहीं @@ -42,6 +51,7 @@ पूरा हुआ बदलावों को छोड़ना है सेव + आपके पास कुछ एरर संदेश हैं\nक्या आप उन्हें समीक्षा करना चाहते हैं\? अभी नहीं सेव करें संपादन करते रहें diff --git a/dhis_android_analytics/src/main/res/values-hi-rIN/strings.xml b/dhis_android_analytics/src/main/res/values-hi-rIN/strings.xml index a4e3d321508..111f01c767a 100644 --- a/dhis_android_analytics/src/main/res/values-hi-rIN/strings.xml +++ b/dhis_android_analytics/src/main/res/values-hi-rIN/strings.xml @@ -1,14 +1,64 @@ + बार व्यू + लाइन व्यू + टेबल व्यू + वैल्यू व्यू + रेडार व्यू + पाई व्यू स्वीकार करें + पीरियड कोई नहीं रोज़ाना आज + दूसरा कल (बिता हुआ) + पिछले 3 दिन + पिछले 7 दिन + पिछले 14 दिन + पिछले 30 दिन + इस सप्ताह + पिछला सप्ताह + पिछला 4 सप्ताह + पिछला 12 सप्ताह + इस महीने + पिछला महीना + पिछला 3 महीने + पिछला 6 महीने + पिछला 12 महीने + महीने इस वर्ष + इस क्वार्टर + पिछली क्वार्टर + पिछली 4 क्वार्टर + क्वार्टर इस वर्ष इस वर्ष + पिछला वर्ष + पिछले 5 वर्ष साप्ताहिक मासिक वार्षिक सभी - रीसेट करें - \ No newline at end of file + चयन + रीसेट + क्या आप करंट पीरियड शामिल करना चाहते हैं\? + यह चार्ट में वर्तमान अवधि दिखाएगा + आपके द्वारा लगाए गए फ़िल्टर कोई डेटा नहीं दिखा रहे हैं + दिखाने के लिए कोई डेटा उपलब्ध नहीं है + इस विज़ुअलाइज़ेशन में कुछ समस्या है + विज़ुअलाइज़ेशन में कुछ समस्या है + विज़ुअलाइज़ेशन ग्रुप्स में कुछ समस्या है + सभी डेटा शून्य हैं + यह विज़ुअलाइज़ेशन सही से कॉन्फ़िगर नहीं है, कृपया अपने एडमिन से संपर्क करें + आपके पास डेटा एलिमेंट %s का एक्सेस नहीं है + आपके पास डेटा एलिमेंट ऑपेरेंड %s का एक्सेस नहीं है + आपके पास इंडिकेटर %s का एक्सेस नहीं है + आपके पास प्रोग्राम इंडिकेटर %s का एक्सेस नहीं है + विज़ुअलाइज़ेशन %s उपलब्ध नहीं है + यह विज़ुअलाइज़ेशन सही से कॉन्फ़िगर नहीं है, कृपया अपने एडमिन से संपर्क करें + प्रोग्राम इंडिकेटर %s के लिए कस्टम बाउंड्रीज़ सपोर्टेड नहीं हैं + डेटाबेस एक्सेस नहीं हो रहा है। कृपया अपने एडमिन से संपर्क करें + आपके पास प्रोग्राम %s का एक्सेस नहीं है + आपके पास एट्रिब्यूट %s का एक्सेस नहीं है + अनसपोर्टेड एग्रीगेशन टाइप %s + टेबल एंट्रीज़ %1$s तक लिमिटेड है। रिज़ल्ट्स को रिफ़ाइन करने के लिए फ़िल्टर करें + \ No newline at end of file diff --git a/form/src/main/res/values-hi-rIN/strings.xml b/form/src/main/res/values-hi-rIN/strings.xml index 3fc9d264536..32c1d4bcb8b 100644 --- a/form/src/main/res/values-hi-rIN/strings.xml +++ b/form/src/main/res/values-hi-rIN/strings.xml @@ -5,6 +5,8 @@ मान अद्वितीय होना चाहिए। समान मान मिला है। इसे सहेजा नहीं गया। कृपया जाँच करें समय चुनें दिन चुनें + प्रोग्राम रूल %s वैल्यू %s असाइन कर रहा है, जो ऑप्शन सेट %s में नहीं है + फील्ड का मान %s के ऑप्शन सेट %s में नहीं है यह फ़ील्ड आवश्यक है आपके पास कुछ चेतावनी संदेश हैं आपके पास कुछ चेतावनी संदेश हैं\nक्या आप इस फ़ॉर्म को कम्प्लीट मार्क करना चाहते हैं\? @@ -20,12 +22,16 @@ URL दर्ज करें ईमेल दर्ज करें फ़ोन नंबर दर्ज करें + पॉजिटिव इंटीजर या शून्य दर्ज करें + नेगेटिव इंटीजर दर्ज करें + पॉजिटिव इंटीजर दर्ज करें नंबर दर्ज करें प्रतिशत दर्ज करें 0 से 1 नंबर दर्ज करें अक्षर दर्ज करें लंबा अक्षर दर्ज करें पाठ दर्ज करें + नियत तिथि अक्षांश देशांतर सेव नहीं @@ -33,6 +39,7 @@ पूरा हुआ बदलावों को छोड़ना है सेव + आपके पास कुछ एरर संदेश हैं\nक्या आप उन्हें समीक्षा करना चाहते हैं\? अभी नहीं सेव करें संपादन करते रहें From a366f75e4150b1fbd17a9614ce8dc71dd11e5654 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= Date: Wed, 6 May 2026 10:30:27 +0200 Subject: [PATCH 221/260] Add keystore decoding and variant assembly to dependency metadata verification workflow [skip size] (#4842) * Add keystore decoding and variant assembly to dependency metadata verification workflow * Update dependency metadata workflow to trigger on gradle changes and remove dry-run flag * Enable dependency signature verification and update verification metadata * Add GranularSyncRepository and SyncUiStateMapper imports to GranularSyncModule * disable signature verification in Gradle --- .../workflows/verify-dependency-metadata.yml | 39 +- .../utils/granularsync/GranularSyncModule.kt | 2 + gradle/verification-metadata.xml | 708 ++++++++++++------ 3 files changed, 517 insertions(+), 232 deletions(-) diff --git a/.github/workflows/verify-dependency-metadata.yml b/.github/workflows/verify-dependency-metadata.yml index c6b792eefb3..538d651c359 100644 --- a/.github/workflows/verify-dependency-metadata.yml +++ b/.github/workflows/verify-dependency-metadata.yml @@ -6,6 +6,11 @@ on: - main - develop - release/* + paths: + - 'gradle/libs.versions.toml' + - 'gradle/verification-metadata.xml' + - '**/*.gradle.kts' + - '**/build.gradle' jobs: verify-dependency-metadata: @@ -29,8 +34,40 @@ jobs: - name: Change wrapper permissions run: chmod +x ./gradlew + - name: Decode Keystore + id: decode_keystore + if: github.event.pull_request.head.repo.full_name == github.repository + uses: timheuer/base64-to-file@784a1a4a994315802b7d8e2084e116e783d157be + with: + fileName: 'dhis_keystore.jks' + encodedString: ${{ secrets.KEYSTORE }} + + - name: Decode Training Keystore + id: decode_training_keystore + if: github.event.pull_request.head.repo.full_name == github.repository + uses: timheuer/base64-to-file@784a1a4a994315802b7d8e2084e116e783d157be + with: + fileName: 'dhis_training_keystore.jks' + encodedString: ${{ secrets.TRAINING_KEYSTORE_BASE64 }} + - name: Regenerate verification metadata - run: ./gradlew --write-verification-metadata sha256 help --no-daemon + env: + SENTRY_DSN: ${{ secrets.SENTRY_DSN }} + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + SIGNING_KEY_ALIAS: ${{ secrets.KEY_ALIAS }} + SIGNING_KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} + SIGNING_STORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }} + SIGNING_KEYSTORE_PATH: ${{ steps.decode_keystore.outputs.filePath }} + TRAINING_KEY_ALIAS: ${{ secrets.TRAINING_KEY_ALIAS }} + 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 --write-verification-metadata sha256 --no-daemon \ + help \ + app:assembleDhis2Release \ + app:assembleDhis2PlayServicesRelease \ + app:assembleDhis2TrainingRelease - name: Check if metadata changed id: check-diff diff --git a/app/src/dhis2PlayServices/java/org/dhis2/utils/granularsync/GranularSyncModule.kt b/app/src/dhis2PlayServices/java/org/dhis2/utils/granularsync/GranularSyncModule.kt index 0dc5904cd6d..f19be870fc6 100644 --- a/app/src/dhis2PlayServices/java/org/dhis2/utils/granularsync/GranularSyncModule.kt +++ b/app/src/dhis2PlayServices/java/org/dhis2/utils/granularsync/GranularSyncModule.kt @@ -38,6 +38,8 @@ import org.dhis2.commons.sync.SyncContext import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.dhislogic.DhisProgramUtils import org.dhis2.data.service.workManager.WorkManagerController +import org.dhis2.utils.granularsync.data.GranularSyncRepository +import org.dhis2.utils.granularsync.ui.SyncUiStateMapper import org.hisp.dhis.android.core.D2 @Module diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 0af10f3aad1..2e930a4cd2f 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -4,6 +4,7 @@ true false + @@ -16,6 +17,241 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -80,37 +316,37 @@ - + - + - + - + - + - + - + @@ -120,7 +356,7 @@ - + @@ -655,7 +891,7 @@ - + @@ -665,7 +901,7 @@ - + @@ -675,7 +911,7 @@ - + @@ -690,7 +926,7 @@ - + @@ -700,7 +936,7 @@ - + @@ -745,22 +981,22 @@ - + - + - + - + @@ -825,22 +1061,22 @@ - + - + - + - + @@ -860,7 +1096,7 @@ - + @@ -875,7 +1111,7 @@ - + @@ -910,22 +1146,22 @@ - + - + - + - + @@ -1128,22 +1364,22 @@ - + - + - + - + @@ -1238,7 +1474,7 @@ - + @@ -1248,7 +1484,7 @@ - + @@ -1258,7 +1494,7 @@ - + @@ -1268,7 +1504,7 @@ - + @@ -1348,7 +1584,7 @@ - + @@ -1373,7 +1609,7 @@ - + @@ -1383,17 +1619,17 @@ - + - + - + @@ -1403,7 +1639,7 @@ - + @@ -1423,7 +1659,7 @@ - + @@ -1438,7 +1674,7 @@ - + @@ -1463,7 +1699,7 @@ - + @@ -1478,7 +1714,7 @@ - + @@ -1498,12 +1734,12 @@ - + - + @@ -1528,32 +1764,32 @@ - + - + - + - + - + - + @@ -1598,7 +1834,7 @@ - + @@ -1613,7 +1849,7 @@ - + @@ -1683,7 +1919,7 @@ - + @@ -1698,12 +1934,12 @@ - + - + @@ -1783,7 +2019,7 @@ - + @@ -1818,12 +2054,12 @@ - + - + @@ -1983,12 +2219,12 @@ - + - + @@ -2018,12 +2254,12 @@ - + - + @@ -2033,7 +2269,7 @@ - + @@ -2058,52 +2294,52 @@ - + - + - + - + - + - + - + - + - + - + @@ -2318,12 +2554,12 @@ - + - + @@ -2333,7 +2569,7 @@ - + @@ -2343,12 +2579,12 @@ - + - + @@ -2358,57 +2594,57 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -2428,7 +2664,7 @@ - + @@ -2513,7 +2749,7 @@ - + @@ -2603,12 +2839,12 @@ - + - + @@ -2668,7 +2904,7 @@ - + @@ -2703,7 +2939,7 @@ - + @@ -3298,22 +3534,22 @@ - + - + - + - + @@ -3383,7 +3619,7 @@ - + @@ -3398,7 +3634,7 @@ - + @@ -3448,7 +3684,7 @@ - + @@ -3458,12 +3694,12 @@ - + - + @@ -3478,7 +3714,7 @@ - + @@ -3658,12 +3894,12 @@ - + - + @@ -3703,7 +3939,7 @@ - + @@ -3748,12 +3984,12 @@ - + - + @@ -3868,7 +4104,7 @@ - + @@ -3883,7 +4119,7 @@ - + @@ -3898,172 +4134,172 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -4083,47 +4319,47 @@ - + - + - + - + - + - + - + - + - + @@ -4188,247 +4424,247 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -5157,22 +5393,22 @@ - + - + - + - + @@ -5185,9 +5421,19 @@ + + + + + + + + + + - + @@ -5197,7 +5443,7 @@ - + @@ -5327,92 +5573,92 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + From 5903f95da6a40bb19e3f8a6f720013aa6238cb4b Mon Sep 17 00:00:00 2001 From: Xavier Molloy Date: Fri, 8 May 2026 07:59:01 +0200 Subject: [PATCH 222/260] fix: [ANDROAPP-7431] Trim username in login (#4838) * fix: [ANDROAPP-7431] Trim username in login * fix: [ANDROAPP-7431] small refactor * chore: [ANDROAPP-7431] FIx typo and create test * chore: [ANDROAPP-7431] fix test * chore: [ANDROAPP-7431] increase idle timeout for save button click --- .../usescases/teidashboard/robot/NoteRobot.kt | 2 +- .../login/main/domain/usecase/LoginUser.kt | 5 ++-- .../main/domain/usecase/LoginUserTest.kt | 26 +++++++++++++++++++ 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt index b2c8a850683..0d951ca96ec 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt @@ -43,7 +43,7 @@ class NoteRobot : BaseRobot() { } fun clickOnSaveButton() { - waitForView(allOf(withId(R.id.saveButton), withText(R.string.save))) + waitForView(allOf(withId(R.id.saveButton), withText(R.string.save)),5000) .check(matches(allOf(isDisplayed(), isEnabled()))) .perform(click()) } diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/LoginUser.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/LoginUser.kt index 4565d7956e9..fcf376d5dc5 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/LoginUser.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/LoginUser.kt @@ -12,7 +12,8 @@ class LoginUser( password: String, isNetworkAvailable: Boolean, ): LoginResult { - val result = repository.loginUser(serverUrl, username, password, isNetworkAvailable) - return handleResult(result, serverUrl, username) + val trimmedUsername = username.trim() + val result = repository.loginUser(serverUrl, trimmedUsername, password, isNetworkAvailable) + return handleResult(result, serverUrl, trimmedUsername) } } diff --git a/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/domain/usecase/LoginUserTest.kt b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/domain/usecase/LoginUserTest.kt index 5c23f58cb05..f4c67f554a4 100644 --- a/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/domain/usecase/LoginUserTest.kt +++ b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/domain/usecase/LoginUserTest.kt @@ -5,6 +5,7 @@ import org.dhis2.mobile.login.main.data.LoginRepository import org.dhis2.mobile.login.main.domain.model.LoginResult import org.junit.Before import org.junit.Test +import org.mockito.Mockito.reset import org.mockito.kotlin.any import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock @@ -335,4 +336,29 @@ class LoginUserTest { assertIs(result) assertEquals(false, result.initialSyncDone) } + + @Test + fun `GIVEN username with surrounding whitespace WHEN user logs in THEN trimmed username is passed to repository`() = + runTest { + // GIVEN - Usernames with various whitespace patterns and their expected trimmed values + val usernameVariants = listOf(" testUser" to "testUser", "testUser " to "testUser", " testUser " to "testUser", " " to "") + + for ((input, trimmed) in usernameVariants) { + reset(repository) + whenever(repository.loginUser(serverUrl, trimmed, password, isNetworkAvailable)) doReturn + Result.success(Unit) + whenever(repository.numberOfAccounts()) doReturn 0 + whenever(repository.displayTrackingMessage()) doReturn false + whenever(repository.initialSyncDone(serverUrl, trimmed)) doReturn true + + // WHEN - User logs in with whitespace in username + val result = loginUser(serverUrl, input, password, isNetworkAvailable) + + // THEN - Repository receives the trimmed username + assertIs(result) + verify(repository).loginUser(serverUrl, trimmed, password, isNetworkAvailable) + verify(repository).updateAvailableUsers(trimmed) + verify(repository).initialSyncDone(serverUrl, trimmed) + } + } } From 4287ebf22b63687f4a11a453b5e20f696233cc01 Mon Sep 17 00:00:00 2001 From: Pablo Date: Mon, 11 May 2026 10:31:33 +0200 Subject: [PATCH 223/260] fix: [ANDROAPP-7588] Offline snackbar message not shown (#4854) --- .../granularsync/GranularSyncPresenter.kt | 5 ++-- .../utils/granularsync/SyncStatusDialog.kt | 24 ++++--------------- 2 files changed, 7 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/org/dhis2/utils/granularsync/GranularSyncPresenter.kt b/app/src/main/java/org/dhis2/utils/granularsync/GranularSyncPresenter.kt index 08d89be2a89..b93a311b621 100644 --- a/app/src/main/java/org/dhis2/utils/granularsync/GranularSyncPresenter.kt +++ b/app/src/main/java/org/dhis2/utils/granularsync/GranularSyncPresenter.kt @@ -97,8 +97,8 @@ class GranularSyncPresenter( workerName = workerName() } - private val _serverAvailability = MutableLiveData() - val serverAvailability: LiveData = _serverAvailability + private val _serverAvailability = MutableLiveData() + val serverAvailability: LiveData = _serverAvailability private fun loadSyncInfo(forcedState: State? = null) { viewModelScope.launch(dispatcher.io()) { @@ -465,6 +465,7 @@ class GranularSyncPresenter( } fun checkServerAvailability() { + _serverAvailability.value = null viewModelScope.launch { try { repository.checkServerAvailability() diff --git a/app/src/main/java/org/dhis2/utils/granularsync/SyncStatusDialog.kt b/app/src/main/java/org/dhis2/utils/granularsync/SyncStatusDialog.kt index 6d9cdfcfefa..0f56430f4f2 100644 --- a/app/src/main/java/org/dhis2/utils/granularsync/SyncStatusDialog.kt +++ b/app/src/main/java/org/dhis2/utils/granularsync/SyncStatusDialog.kt @@ -21,7 +21,6 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentManager import androidx.fragment.app.viewModels -import androidx.work.WorkInfo import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialogFragment @@ -32,14 +31,12 @@ import org.dhis2.commons.date.toDateSpan import org.dhis2.commons.dialogs.bottomsheet.BottomSheetDialogUi import org.dhis2.commons.dialogs.bottomsheet.BottomSheetDialogUiModel import org.dhis2.commons.dialogs.bottomsheet.DialogButtonStyle -import org.dhis2.commons.network.NetworkUtils import org.dhis2.commons.sync.OnDismissListener import org.dhis2.commons.sync.OnNoConnectionListener import org.dhis2.commons.sync.OnSyncNavigationListener import org.dhis2.commons.sync.SyncContext import org.dhis2.commons.ui.icons.SyncStateIcon import org.dhis2.usescases.sms.SmsSendingService -import org.dhis2.utils.analytics.AnalyticsHelper import org.dhis2.utils.customviews.MessageAmountDialog import org.dhis2.utils.granularsync.domain.SyncStatus import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme @@ -51,18 +48,11 @@ private const val SYNC_CONTEXT = "SYNC_CONTEXT" class SyncStatusDialog : BottomSheetDialogFragment(), GranularSyncContracts.View { - @Inject - lateinit var analyticsHelper: AnalyticsHelper - - @Inject - lateinit var networkUtils: NetworkUtils var dismissListenerDialog: OnDismissListener? = null var syncStatusDialogNavigator: SyncStatusDialogNavigator? = null - var syncProcessListener: (WorkInfo) -> Unit = {} - private var syncing: Boolean = false private var smsSenderHelper: SMSSenderHelper? = null @@ -101,7 +91,6 @@ class SyncStatusDialog : viewModel.observeWorkInfo().observe(this) { workInfoList -> workInfoList.firstOrNull()?.let { viewModel.manageWorkInfo(it) - syncProcessListener(it) } } @@ -188,7 +177,9 @@ class SyncStatusDialog : } private fun onSyncClick() { + viewModel.serverAvailability.removeObservers(viewLifecycleOwner) viewModel.serverAvailability.observe(viewLifecycleOwner) { isAvailable -> + if (isAvailable == null) return@observe val canSendSMS = viewModel.canSendSMS() val isSMSEnabled = viewModel.isSMSEnabled() @@ -330,7 +321,7 @@ class SyncStatusDialog : SmsSendingService.State.WAITING_RESULT, SmsSendingService.State.RESULT_CONFIRMED, SmsSendingService.State.SENT, - -> + -> syncing = true SmsSendingService.State.ITEM_NOT_READY, @@ -338,7 +329,7 @@ class SyncStatusDialog : SmsSendingService.State.WAITING_RESULT_TIMEOUT, SmsSendingService.State.ERROR, SmsSendingService.State.COMPLETED, - -> + -> viewModel.restartSmsSender() } } @@ -384,7 +375,6 @@ class SyncStatusDialog : private lateinit var syncContext: SyncContext private var dismissListener: OnDismissListener? = null private var noConnectionListener: OnNoConnectionListener? = null - private var syncProcessStatusListener: (WorkInfo) -> Unit = {} fun withContext( context: FragmentActivity, @@ -414,11 +404,6 @@ class SyncStatusDialog : return this } - fun withSyncProcessStatusListener(syncProcessStatusListener: (WorkInfo) -> Unit): Builder { - this.syncProcessStatusListener = syncProcessStatusListener - return this - } - fun withSyncContext(syncContext: SyncContext): Builder { this.syncContext = syncContext return this @@ -443,7 +428,6 @@ class SyncStatusDialog : dismissListenerDialog = dismissListener onNoConnectionListener = noConnectionListener syncStatusDialogNavigator = navigator - syncProcessListener = syncProcessStatusListener } fun show(tag: String) { From 3aaff226b2294e93b2f0b103c5b37b5863fe9a39 Mon Sep 17 00:00:00 2001 From: Xavier Molloy Date: Mon, 11 May 2026 12:03:43 +0200 Subject: [PATCH 224/260] fix: [ANDROAPP-7420] check build flavour (#4839) --- app/src/main/java/org/dhis2/usescases/splash/SplashActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/dhis2/usescases/splash/SplashActivity.kt b/app/src/main/java/org/dhis2/usescases/splash/SplashActivity.kt index 18cc352356a..86677cb554b 100644 --- a/app/src/main/java/org/dhis2/usescases/splash/SplashActivity.kt +++ b/app/src/main/java/org/dhis2/usescases/splash/SplashActivity.kt @@ -55,7 +55,7 @@ class SplashActivity : override fun onResume() { super.onResume() - val isRooted = !BuildConfig.DEBUG && RootBeer(this).isRootedWithBusyBoxCheck + val isRooted = (!BuildConfig.DEBUG && BuildConfig.FLAVOR != "dhis2Training") && RootBeer(this).isRootedWithBusyBoxCheck val isDebuggerActive = isDebuggerEnable() && detectDebugger() when { From 443f9eaf4bbb03a0a289dbe9135053b6bb857282 Mon Sep 17 00:00:00 2001 From: Pablo Date: Tue, 12 May 2026 14:52:06 +0200 Subject: [PATCH 225/260] build: [ANDROAPP-7477] Move wiki docs to developer portal [skip size] (#4834) * build: [ANDROAPP-7477] Move wiki docs to developer portal * add overview text * remove old src folder --- docs/compilation-distribution.md | 38 +++++++ docs/configure-openid-oauth.md | 80 ++++++++++++++ docs/contributions.md | 23 ++++ docs/creating-custom-usecases.md | 100 ++++++++++++++++++ docs/modifying-apk.md | 84 +++++++++++++++ docs/overview.md | 23 ++++ docs/resources/applicationId.png | Bin 0 -> 23284 bytes docs/resources/build_apk_step_1.png | Bin 0 -> 25567 bytes docs/resources/build_apk_step_2.png | Bin 0 -> 21945 bytes docs/resources/build_apk_step_3.png | Bin 0 -> 28060 bytes docs/resources/launcher_directory.png | Bin 0 -> 29852 bytes docs/resources/open_id_login.png | Bin 0 -> 88956 bytes docs/resources/version_name_code.png | Bin 0 -> 20546 bytes .../capture-app/local-analytics-features.md | 82 -------------- .../images/capture-app-matomo-instance.png | Bin 69085 -> 0 bytes .../images/capture-app-matomo-settings.png | Bin 41361 -> 0 bytes .../images/capture-app-sync-status.png | Bin 17680 -> 0 bytes .../en/content/capture-app/settings.md | 45 -------- 18 files changed, 348 insertions(+), 127 deletions(-) create mode 100644 docs/compilation-distribution.md create mode 100644 docs/configure-openid-oauth.md create mode 100644 docs/contributions.md create mode 100644 docs/creating-custom-usecases.md create mode 100644 docs/modifying-apk.md create mode 100644 docs/overview.md create mode 100644 docs/resources/applicationId.png create mode 100644 docs/resources/build_apk_step_1.png create mode 100644 docs/resources/build_apk_step_2.png create mode 100644 docs/resources/build_apk_step_3.png create mode 100644 docs/resources/launcher_directory.png create mode 100644 docs/resources/open_id_login.png create mode 100644 docs/resources/version_name_code.png delete mode 100644 docs/src/commonmark/en/content/capture-app/local-analytics-features.md delete mode 100644 docs/src/commonmark/en/content/capture-app/resources/images/capture-app-matomo-instance.png delete mode 100644 docs/src/commonmark/en/content/capture-app/resources/images/capture-app-matomo-settings.png delete mode 100644 docs/src/commonmark/en/content/capture-app/resources/images/capture-app-sync-status.png delete mode 100644 docs/src/commonmark/en/content/capture-app/settings.md diff --git a/docs/compilation-distribution.md b/docs/compilation-distribution.md new file mode 100644 index 00000000000..88827893d71 --- /dev/null +++ b/docs/compilation-distribution.md @@ -0,0 +1,38 @@ +--- +id: compilation-distribution +title: Compiling and distributing +sidebar_position: 4 +--- + +## Compiling APKs + +Run the following gradle commands to build and generate the available APK types: + +- Release apk (both with and without play services) + ```bash + gradlew assembleRelease + ``` +- Training apk + ```bash + gradlew assembleDhis2Training + ``` +- Debug apk + ```bash + gradlew assembleDebug + ``` + +You can also go to the right side of the screen and click on the “gradle” icon, then click on +“dhis2-capture-app” > “app” > “build” > “assembleDebug” (or any other). +After building the APK will be generated in the path project/app/build/outputs/apk + +When it comes to building release APK, “assembleRelease” you will generate a release +APK but it will not be signed, so in this case we recommend you go to “Build” that can easily be +found on top of the screen, then “Generate signed/bundle APK” and you will be asked to load a +keystore and type your password. Finally, after filling the passwords and clicking next the APK will +be generated in the same path mentioned previously project/app/build/outputs/apk. + +## Distribution via MDM + +At this moment you should have the DHIS2 Mobile App compiled with a different applicationId and +signed with your certificates. So it can be distributed via your Mobile Device Management under the +Enterprise Application (or similar) section. diff --git a/docs/configure-openid-oauth.md b/docs/configure-openid-oauth.md new file mode 100644 index 00000000000..fdcf79cbdc9 --- /dev/null +++ b/docs/configure-openid-oauth.md @@ -0,0 +1,80 @@ +--- +id: configure-openid-oauth +title: Configure OpenID / Oauth +sidebar_position: 3 +--- + +## Configure OpenID / OAuth + +Since version 2.4. The DHIS2 android app supports login with an OpenID or OAuth provider. This +feature is not available by default, you need to add the configuration provided below and distribute +your own apk. OpenID has to be enabled in the web as well and the user OpenID parameter must be +configured. + +Under the **app/src/main/res/raw** you will find the **openid_config** file. + +```json +{ + "serverUrl": "", + "loginLabel": "", + "clientId": "", + "redirectUri": "", + "discoveryUri": "", + "tokenUrl": "" +} +``` + +How you should fill this file depends on the provider you are using. The following example shows how +the file would look like using Google as the provider: + +```json +{ + "serverUrl": "https://play.dhis2.org/android-current", + "loginLabel": "Login with google", + "clientId": "CLIEND_ID_PREFIX.apps.googleusercontent.com", + "redirectUri": "com.googleusercontent.apps.CLIEND_ID_PREFIX:/oauth2", + "discoveryUri": "https://accounts.google.com/.well-known/openid-configuration", + "authorizationUrl": null, + "tokenUrl": null +} +``` + +For OpenID providers it is **recommended** to use the discoveryUri parameter if possible instead of +the authorizationUrl and tokenUrl. + +The next step is to include the following activity in the **AndroidManifest.xml** file. You will +need to replace the scheme so that the android app can be relaunched after a successful login. + +```xml + + + + + + + + + +``` + +Following our example, the Google scheme would be: +`com.googleusercontent.apps.CLIEND_ID_PREFIX` + +When launching the app, a new button will be displayed in the login screen. + +![](resources/open_id_login.png) + +### OpenID providers and configuration guidelines + +Here you will find a list of available providers and how to get any info needed to set the * +*openid_config** file. + +* [Google](https://github.com/openid/AppAuth-Android/blob/master/app/README-Google.md) +* [GitHub](https://docs.github.com/en/developers/apps/authorizing-oauth-apps) +* [ID-porten](https://docs.digdir.no/oidc_protocol_authorize.html) +* [OKTA](https://github.com/openid/AppAuth-Android/blob/master/app/README-Okta.md) +* [KeyCloak](https://www.keycloak.org/docs/latest/authorization_services/index.html#_service_authorization_api) +* [Azure AD](https://docs.microsoft.com/es-es/azure/active-directory-b2c/signin-appauth-android?tabs=app-reg-ga) +* [WS02](https://medium.com/@maduranga.siriwardena/configuring-appauth-android-with-wso2-identity-server-8d378835c10a) \ No newline at end of file diff --git a/docs/contributions.md b/docs/contributions.md new file mode 100644 index 00000000000..8aa757f0334 --- /dev/null +++ b/docs/contributions.md @@ -0,0 +1,23 @@ +--- +id: contributions +title: Contributions +sidebar_position: 5 +--- + +# Open an issue + +Open a Jira issue +in [Android app for DHIS2 project](https://dhis2.atlassian.net/jira/software/c/projects/ANDROAPP/boards/118). + +# Open a pull request + +* Fork the repository. Pull changes from the upstream periodically in order to stay up to date when + you submit a pull request. +* Create a branch from **develop** to implement your solution of the issue. +* Your production code should be covered by unit or integration tests. +* Test your changes and make sure they don't break the rest of the project. +* Open a pull request from your **working branch** to **upstream:develop**. +* The pull request title must be descriptive and reference the issue (ANDROAPP-XXX - Description). +* Fill the pull request template with the link to the issue and the rest of checks. +* All the checks in the pull request needs to pass in order to maintain the Continuous Integration. +* The pull request needs to be **reviewed** and approved by the **core team**. \ No newline at end of file diff --git a/docs/creating-custom-usecases.md b/docs/creating-custom-usecases.md new file mode 100644 index 00000000000..0dca6aa5330 --- /dev/null +++ b/docs/creating-custom-usecases.md @@ -0,0 +1,100 @@ +--- +id: creating-custom-usecases +title: Creating Custom Use Cases +sidebar_position: 6 +--- + +To create custom use cases in our DHIS2 Android Capture App, follow the steps below: + +## Step 1: Create a New Module + +The best way to implement a new use case is by creating a new Multiplatform library module. This +module will encapsulate the functionality and can be easily maintained and tested. + +1. **Open your project in Android Studio.** +2. **Go to `File` -> `New` -> `New Module`.** +3. **Select `Kotlin Multiplatform shared module` and click `Next`.** +4. **Name your module according to the pattern `customcase-usecase` (e.g., `stock-usecase`).** +5. **Click `Finish`.** + +## Step 2: Add Dependencies + +In your newly created module, add the `commonskmm` module as a dependency to access the **design +system**, and `commons` for the **DHIS2 SDK**, and other common tools. + +1. **Open `build.gradle.kts` file of your new module.** +2. **Add the following line to the dependencies sections:** + + ```kotlin + commonMain { + dependencies { + implementation(project(":commonskmm")) + } + } + androidMain.dependencies { + implementation(project(":commons")) + } + ``` + +### Configuration Adjustments + +Depending on your Gradle version, you might need to make some configuration adjustments in the +`build.gradle` file. Additionally, if you are using the version catalog, you will need to adjust the +configuration accordingly. + +This allows you to use resources and tools provided in the `commons` modules. + +## Step 3: Implement the Use Case + +Now, you can start implementing your use case within the new module. Structure your code following +the best practices and utilize the resources from the `commons` module. + +### Recommended Architecture + +We recommend using the MVVM (Model-View-ViewModel) architecture with Kotlin language and Jetpack +Compose. This approach ensures a clean separation of concerns and enhances code maintainability. For +more details, refer to the +official [Android Architecture Guidelines](https://developer.android.com/topic/architecture). + +### Example Module Structure + +Here is an example of the module structure: + +- `src/androidMain`: Contains Java/Kotlin source files that needs the android framework as well as + the AndroidManifest and android resources +- `src/commonMain`: Contains Kotlin source files that can be shared between platforms. +- `src/desktopMain`: Contains source files that needs the desktop framework + +It is recommended to include the kotlin multiplatform resource library to share resources. + +## Step 4: Using the Custom Use Case + +To use your custom use case, add your new module as a dependency in the `app` module and call the +entry point (which can be an Activity or a Composable) from where you would like to start using it. + +1. **Open `build.gradle.kts` file of the `app` module.** +2. **Add the following line to the dependencies section:** + + ```kotlin + dependencies { + implementation(project(":usecase-module")) + } + ``` + +3. **Call the entry point in your code:** + + ```kotlin + // Example: Calling an Activity + startActivity(Intent(this, YourUseCaseActivity::class.java)) + + // Example: Calling a Composable + setContent { + YourUseCaseComposable() + } + ``` + +## Benefits + +This modular approach helps to avoid conflicts when updating your project with our new developments. +By isolating custom use cases in separate modules, you can independently maintain and update your +custom functionalities without interfering with the main project components. \ No newline at end of file diff --git a/docs/modifying-apk.md b/docs/modifying-apk.md new file mode 100644 index 00000000000..4341280f908 --- /dev/null +++ b/docs/modifying-apk.md @@ -0,0 +1,84 @@ +--- +id: modifying-apk +title: Modifying the APK +sidebar_position: 2 +--- + +## Change the App logo + +For changing the training logo go to the path **project/app/src/debug/res/mipmap-X/ic_launcher** and +copy/paste your own ic_launcher.png in all mipmap-X directories. + +mipmap-X, where is X, is a specific screen density. + +For the production logo, the process is the same but instead, you will find the logos in the path * +*project/app/src/main/res/mipmap-X/ic_launcher** copy/paste your own ic_launcher.png in all mipmap-X +directories + +You should be able to visualize your icons in Android Studio here too. + +![](resources/launcher_directory.png) + +## Change package name + +Applications are identified in the app stores by their _applicationId _string which must be unique +per store. The official string is com.dhis2. If you try to upload the application to the Google Play +store you will get an error message about that. This can also happen in case you are using Mobile +Device Management tools that allow you to upload your specific applications. If these applications +are going to be stored in the Google Play store as most of them do, you will need to change the +_applicationId_. +If you would like to change the _applicationId_ go to the file build.gradle (Module:app) and scroll +down until you see _defaultConfig_ + +![](resources/applicationId.png) + +Change “com.dhis2” to the new ID that you want. + +You can read more about the applicationId in the official +Android [page](https://developer.android.com/studio/build/application-id) + +## How to generate a Keystore and sign the APK + +By default, the Android system requires that all installed applications be digitally signed by a +certificate whose private is held by the application developer. Android uses the certificate as a +means of identifying the author of an application and establishing trust relationships between +applications. If you try to install an APK without being signed Android will prompt an alert dialog +telling you that the APK is not secure, if you proceed and click “Accept” the apk will be installed. + +Be aware that If you want to upload the APK to the Google Play Store or some other stores you will +be forced to sign the APK, for Github you do not need to sign the APK. In any case, we do recommend +you sign your APK for security reasons. + +For signing the APK you first need a **keystore** that can be easily generated with Android Studio. +Go to top menu “Build” > “Generated Signed Bundle / APK” + +![](resources/build_apk_step_1.png) + +Click on “APK” and ”Next”. Then click on “Create new …” + +![](resources/build_apk_step_2.png) + +After you click on “create new…” you will be asked to fill the following form. +**Key store path**: Choose a path where you want the Keystore to be generated. +**Password and Alias Password**: Choose two secure passwords (they do not need to be the same). The +remaining fields are direct. + +![](resources/build_apk_step_3.png) + +Now clicks “OK” and then you will have to choose a build variant, “release” is fine, after some time +the APKs should be generated and you can find them signed in the path project/app/build/outputs/apk. + +**Important: Once you have generated your Keystore please do not upload it to any public website, +also you will need to sign always with this Keystore for future updates.** + +You can read more about the signing process in the official Android +documentation [page](https://developer.android.com/studio/publish/app-signing) + +## Version name, code and chaning library versions + +Everytime you want to provide your userbase with a new apk you will need to increase the version +code, for doing so go to the directory /gradle/libs.version.toml + +![](resources/version_name_code.png) + +Then you should increase vCode and change vName to the one you want. \ No newline at end of file diff --git a/docs/overview.md b/docs/overview.md new file mode 100644 index 00000000000..0889af22f70 --- /dev/null +++ b/docs/overview.md @@ -0,0 +1,23 @@ +--- +id: overview +title: Overview +sidebar_position: 1 +--- + +# What is the DHIS2 Android app? + +The DHIS2 Android Capture App is a mobile application designed to function seamlessly with your +DHIS2 instance. Our Android app supports data capture across all DHIS2 data models, including +aggregate and individual-level data for Tracker and Event programs. It also includes instant +analysis of data collected in the device. + +The app functions in both online and offline mode, meaning that data and metadata are automatically +synchronized whenever there is internet access, which makes it an effective mobile data entry +solution for locations where internet connectivity is limited. The app is developed and maintained +by the DHIS2 development team, which ensures that the latest versions of the Android app are fully +compatible with all supported DHIS2 core software versions. The app can be downloaded for free +from [Google Play](https://play.google.com/store/apps/details?id=com.dhis2) +or [Github](https://github.com/dhis2/dhis2-android-capture-app/releases). + +To learn more about how the DHIS2 Android app is used to make an impact on health programs around +the world, visit the [Android In Action page](https://dhis2.org/android-in-action/). \ No newline at end of file diff --git a/docs/resources/applicationId.png b/docs/resources/applicationId.png new file mode 100644 index 0000000000000000000000000000000000000000..8fcda894470d85a2c81b6bd1fd1ea33b6d2dc7ff GIT binary patch literal 23284 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 literal 0 HcmV?d00001 diff --git a/docs/resources/build_apk_step_1.png b/docs/resources/build_apk_step_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b3b0dc966ab33153a36226f46591c263b1a8f125 GIT binary patch literal 25567 zcmd43XH=8nwl0cYKtTaPL_m>_fYLikZz0kOa zrH7JGLT@Lowb$KemwWG@eeSqpFo5LC_vS5g&S%bNK1tXcP35~}kH|FC*BvuGjh1a^?=9{yJAQP}9|Hbh$T)&HGsY^wVvq&RS5K#d6 zyr$@JC0kU-@y+JM|JPyy1zZW z)BxyzNhCaRO-?SkNIvE9@HtV_S7ITN${CJ_T@RDv0#eQr;5UTQVv49xxpJOrDlb2* zzA-LPV+~i2-!3&+_8-(ae_s~+WZty2?ADcFsxFdz zLz8fqAYvO%9VbtAP0An+y3}-(?_iVMN-uE%O0o|MD&IY%>jl&C^vDJY&b+UF9!#U6 z8W)O7NiW!igV%Nm4~Xv@`b4oLuDz@4vE;#2VQKS$v4=*{tLK_(q+AC=Y!OGU+3k^$ zeXKre_T6LWa1M2wPv5`ik9U8FR#fcRIaZ6}ex}HNf0ausEIcL@w=I7hyz4VCI|r4nuF1 zep~JgAN?7Uk!k(%@*(~2!XY`Z@elTpPjn9yzojwB1bBE$CHD&Y*9#>E3TYO+Ptpam zzVu)$RaB?a{kh+U;^0;6iHMj2cOTD&?9Lz1oYhFm8UlafPf)cCRd7T53IUHpSx8Wb zjNb{Fsxe6kRfv>@TH6o!em|t80kS$>Ds#4kA4~ee;HGB@P*eGn7p#CR3p__P%FfJ- zCq3o?+~K;X1ylNAfE_?PH$hGhL=R<8PcY+YJn|eB9csBxWO6t5PeEtf+t7a7`=FBB zvxjAHu7|O-94b@OtOmD7ibb7TkB-_(@w3MlKkW`>{q}eP;G|G&bBtE$p z#_GyN2a&z}lY)l$QTtFKWq4TysWIE~F(eG5ySAh~A z2)P_Mq*RqY_(?DfGtNp>+11!}XX2vY*}ju_U!OZFG%tDS{Wlcd=b-^H?w zO}r|&&A5|tSy6B)BUe1@{slkNT;ut13XdpEM^VmItwNVw1OHvHX=lI$g7e?)AFstX zHH(bGp3>&4k0I^r$j zGpX$NctWIru#@3)2KN+h^O$zyy}3;7_@;?Zf2Ju_K1r0&lIEBP2#06Hl%iD=)u3_h zS8c2Et*O$ps~|H61E+_r7n>Jp5SbY>6A379;#VdIk6zs{$7?*-M36Dc4`_ZvPsfaBtn<_2``txj=C{%4f}2Yl z=^(ov>)SEqVfqSIz;Ylc@GBM(u-PA@OpH^_){kYtS}M z-_Nb-71gk`H&&&+2{kz!saN~D*2|q8%P>QE5wOA>MO{t^9Y0@+_qmDh{@%~f#+5^v<9JgHbIHi= z!XmSS2bE7#lg<9M69ee2TDp%A+H6?7z3=Vd5Wuzy3PD!C`~p#H;%& z-&iGffM25!KmQEi{}$KtyNew9FriI70v!=(#($b*|EE=VS87fooips>njLPwDfY5< zDP??P^a22%a7IQlGq)8z<@Saa3jAv~*k~VL-4CsB0W{gn7*9L5;W4h=W zjYc^<8(LaU+srH9dIK>&(bHc3m&0*{vyVr)} zyXFe(yvGn$i-!l{_j@TsLahrDIQo~yi*C8_3Ug+gN2uC^F4#zaqw^d>hFmQuSoWIY zR2Hawi!uT)x7!kYwLCOB2U8${-bdtZt}lVyR(CQqG5J>Iaq$%|*F~B|sv+z?K;p z37_gFIBoAfsvdzNE?&*5|ILNIMajsL^EJAJ#|cH<=dw|?e=4gldQNII>EB>X$6z9J zkt+%P-r|SXW-^i#C>dJH&IssHRUUHl^mp`_`FTLaZT+ZPq0>P34ucHKI3(!LY2rov zJ0)0Wcmi&&*K*P!+Ti9L0C&VUy%pg*8Vqx-^0GX~=jV_yVE!VTztR)ME`1GuMXCj8 zVeZRvZHqhVFeY!0ms;fypagYW87AK7FsQmEJ^zgbwn{j%ViY=EYgE}BSv@*5Z5re9+~3syoOJFE6I-)KRwZW)2ey7Qtqe7@PN_( z-ZeCjqQ9xq{Pbb#(FLZ*p6NW*Wy)uxc7CSWMFJVVTzL3}dGI41-`cFpu_x`~d-$gr z-I8a3E=jpd>Uy=D{rB%*>fs8Dc?}aFy7T^0^2=U))LH9&rOS^`)+zI6K6I&;Pd7ZI z`qB4@ikemSxCi(hrE{s1R~obT@b?bav1_kBPk?%VKwc7uZsFBop-%Uxi{2U`kHB|> z8``xpijUDvN_*asoZ&lWlZVslPmRX{p5;`fF2|ocih)b}g09Zd@Q5X2uS6XA_^$K&qXsK&Quo136Yav(>Xq&ptk- zeevZUU5v>sM#gzMbcQ*9L{vi9Aqy{WV&2q7is4dohUz>viUozsw>ldx|F$*{?tYt- zb7P-@@WbgE_NCN;&|T~U6U-Gb_dTX}6g|3ra^p~h+XDw!T<}8=ZLXu2H*#G3=^iF} zmWKEyF zcZMjo%0UkboaDUV;%URch8rDZ$n1HPF6FNbgL`aDJWld*$*Iw^E>?A3#l$BlO zir77M%jMz?=6X;_m9TLNceKye=)>8*ymXJHkBJ> zxgYj>nHZ=G#Rtu=ChM|AjuIR(l8=Dh(am1Zrx=%TLQ&DYpeH>i+vgpRewJI65;O1w zGA4)qf)B5I6vJ}&*^llTu_J-BVKU-TmZUWA>u!=)&k;H0n9D>a~BNjk}4$^E@M#pozfvit-c~U>?FbruU zEgGR4Y018?bsc}dz9W{SD`(#1d}1{`vkD4Sk^QrEaIy*-4&vU!y;XWHC@@ z%Rop=U)|~Uz%+Bv(by^k+X!3AXq|CXja&>{JYLpu!R%cAKA8PBcd={$za$A=^%{@Pej91WJ4+EW`&qsF^Vxad> zyVtc{$c~SjIbYDPJenxaw;Iw~lGU2Bpu?_1@WYT(pUCb=>aPzQPwhIJ!*rfrE0vKE8b?p9C-BmViw z*V&_fib!QXTljMhZ1ILz;WVP3C+5AmKJYZ)-nqhpw?*4(!@LkgO+9-i2_hYWVBVGY}jGWc?tl2JO`OSAB2uGs^HIKs)1? zndd#S))$;qTfhOX3m6T>lo=P@2}WowM5Q#J#`1&w6YATGIXT$FKYLBn4CgX8S;FiJ z-~2jkQp`97?&stjTi!nxQ)NHNvXX+lq|az6JTZO_#1`+p@~e;SK1d*lF!Ch&_;#!| z&TkHy$*1ZvmD}FTjqmyv;nm6(+^BZwH{K)NC@7H`PpTKjtwkvGsQ=zBs8m7IvWLr! zG;|vcY#Iu2%yzNbJqrJUixtQ=L{F3Xc4~~@Lm%$P;8;~FI6;iKVmXU9tA|?;D#2{W z((GSa3VXl#YXsLv)aS*H(DL8&zD2e2yO2~MrUfcHPTX!e6J z1?~(qPLDT`vl7Uj*RhgF$*XAZE?Uu)2TgNaAXSf*@dcMLPv%n}oX1ObM|^vVq;H^W z&iRanA>5KlNSNq=_vn@bL*LHd1>Tp1-yxBTfLo@2V5X*{d%)lx`D8vODDIZLI&O>Q z&-oBD@#k`f`Lg?bpCf3OBj_YA=)~%9oJW9*naG|Uu-)(S8y=y~CjxH5_7xJ6w;;>= zelWFmDdNS6B$bDBFhu&RfDl$*;^R$q&aXCrziAx_Ng4kY*)PI?y0Z?Ub{P(sns;Njs1nLgzS6Fg{K=% zgh$J5e|xvHrbDydlrOKX!l};Z++RI*ciZ?iaZ4Z5mi%3B_b!xI?fj!!uR_x@kE&yG z%~nIJ=|(`vZp_uwY1v~#WaYO*f+sUt|E9}S>45wianw#^ibuC(F`~b}*oj9m^q|BF zDG8!6J}Q4gJTD6JaUp;vfPZvDo?7TOm%Q2+9FDCA|56NM#;~}^vlNtAxKDP;?&{Sx zI8rnx*;%`}T7}N_)HM6n zb8G#gW?QMbqgevmjBl%Obzjm@jBCgEzKtmxJ$^Sk#?&g+Tvp@cDmKgbok>bB?l;!! zGeBcb$dfO1AlslX`}3JQ524k-uTsTA@m%=UahEZ$B>uDSFfxV4$P`^Yw6WNgQa&j3 z0KBVt2T-~t#u@4paN*`xr+Jm+1H-rw?=W__qC##_@ZVPUl$ZHsy;qvLoq!HdQ_{<9 zq<>6kUT(}ifkVqem>wYFTVCUkA&#wQD?~n=WS=(W3+<>{oTQDpYYlCyu&NQS;m5Lu z&!n^6GW!JU|-Sl+Zs&Nk}OO2kso$~$aur74*e9yW8}4v^ig7%xV`{G2n!1f zcv`;mzxmWgrDt%KG|;z;*M8h4Ln2+FE3C=4PY$#l8orFX`q9A02165eZB-4JX!v}D zGDTH&`dxiIAN{e>D+}yBM&p`tG9X_#`RQ5$lkm{@ZabQ2U5-%aJ-AJh*IIa|eSECQ z%am;d5>-?FLQqiB&%tvVmyM!7@hk|=!&(h|w`=&+n%{Hs`L_=-vM?PAEjNiI*!$i6 zss7>wC7_>!aM8SJzHGC<=pj;cVCz@$(Xkv6Vo+cX|_!TUBR#rT$mIFk#2GFQrklZM0I_ zY*xnZQN^cKV%U3UiizLYLk!1}6F}eViaLdZ@eY^;R?10^6fDQ>$;yuz{+8i^EF%)L zhy;bco1aRvT+DDMc*43g#MfZp-8DQxDSywk!HJ2_Af^hMbf;*jr`wTlhTWF>CzxAr zeSml9iZeqoORTBe&wyKy7HM_w-$GGB5~|n_VHaJx?gHTG3=LUo4GHm4t<3kWM=F^r z7*+*uJrR;0>QN3bH-A8>f~*FuEuTG3VSO&aSPRnDu;CXY&EWm(^Dpw7zST7wRmqV` zm8ZFi&%wRa+Cf4!00^WcQvtmiZR-Myqo0jHu?b&^v>hg+lxTCPY2#W11DP9qn);24u18P~aKIm!;5Z<;64_eO zlcR0Gz7Nwjw&mJbCbL*W$aD0Hc|xaJ3{T)wmeGoE>1G9|RDOxI1jR%%(HDQMAnjl) z49b-qa}_v{<0V|NeTx82tNn)m>gz4mB@N$u4BQVs4ENc6yb$K`b(}d`$MyYdD7yv4 z(kd@Q$iMM6S339;K$V^oQ130(9yak5b~0$8DvKMw5) z7YxP$yDB|&DU>H7@YKZpDq)fYDE0sZqtnz+I7Z96nUIC2WPYzQ&i4*fe7z03q^tH! zHTRX*N2%2?^6fU<6nwkz5T?u=cU>?y3TKp+pCH4CA~TEEoe&Xlcrp1{WO1PyliP#q z8D2X@(2mt$tDoCUo3{*^rT2=V+Hi4(BR)<8Wlp&+RNq%5+-}H)Ap+YgnQHJ45qu+g zYO{?P<&Nr&^XwI1E{2gDl*g>D=SPFxzlI?&k`0@+S^K4*-g>r1qwA1zEAI}wBt3Mr zszq$l1mTMAvAUz*2ZduBOZgu;(b!DZi3_(b-)T9jI55)j^>VZ5R{+KbZ%U3CrSt9L zs4SqZvV=@W9zh)*cFE-zrTr8_t3EDlH_~u%1@{?*Cp|vAtcYS;>-{D2z>m@WgrX27 zxs}~MLoF}3RQErAXY(4`-WduTGiGr(9hJ!Fm$JaYM`qTF*QN)m zTOOC^X?S(9RJ#r|Mm%ZsOBOhwLtQPEy&ptk#1H8EQ+76jF=^9OY^QC*QAvRNo_=P^ ze9v(cWEAMyU-42m_wB)D8KV|VP3<&_Z(~%#XN?_ZI$do&pNx0l?C%*Dy<0lrRLKjb zLjSDP@WQIAk*RM;l(m6?kN;r%6VWdZWrXD-FditcFn%)shv7z4* zbsAZTD)~Z{R+69XFf2Fgh$hhaRsAGOI9|OIAK(cu*3ZKj)R;Gby>5W~Cr>uP&IN@< zaJUL+-pi(AW#&=I%*Oj8Kp;+F*~T zwx(`YUsA3t?uYXNj3BZ4QAWsPC~jbzI)#I=ab$)o>a<=^4-?CBvybc0+2&L;s>j=_Ne7IMcnOweoiR9z)b=F@oD4Wj`!91kMUgbC57Eoh6zwOz3 zvTJBtpXKdn%=?n=)5l-n@cD-^h;Jf>He30l^%GbIxe12gD-Q!GV4PZNZJ!g2*EFaV zXO>F2z0*e%tZY}^AP6yQOL;fW&4VxEyDO7BE7i<^U~z*J{)=;>e)8brreD~tK1LhdutOBLxm($}Ad8a}MyZ5{Mw zLTa@R4&2J9idsCqcw4dA2r4xkjt`(~5cE3TKT#OYhP#b8zBF+ZwbzA57Fdp0GRT(P zS(o27d`OpkJBhvZ_n#Mm>yro;xrkfSY<06S*Jv(S{kfw#0Z_A zx7~aV(i-_VmM`758rB54-Whi^?3s)#U>&u4UPH2agiZvXRq~`r>KB4B?_9MOqX_)Z zvy?-M2LcLrq1M9Y^VyF(>ru1SH+ota#Qe-y07YVeYit4_pD`in?zf8db_U3;z_iku zGCEL=%q?I%>(0{S@zg?+rgnDymU#Z&(0VO}Y-i-TeL$_q%?z^njcus4rrD zAI^}SKBbsW1Wou-%&euy4BVoV`9aCP(Q-=Q_J=9Wu;qfMESQjSx0e;KnK;l*@fW3h zK_y5b1K&>5>GsJeJSHb58vNd3ezN;TI`_*vu5D3`IImp^_qUW%RfZy@z>~R*Nj~tn z`Z(x_IpmFCzbcj6{g-0>IZ;z11dUeKYN?~&FIRRl8wW*mrdGFVI)2)km5A_~jLSGd zjxZk5+ji-HH;*iHa1GW_T5M=~kZ`e^Ie+&?eZb9L@1H^Sk@1LA%CP_mXAt4?dq^WO zCX0J#cT;voic&mt+#P?cZHw3D;afAy(QgPqD=KzBU3vH{@~`zJlO05tn?-gWHWn~> z(_GQ1#Vf`*|Mgnf=jP~;)Y{Fv$A^{j#`~LOYV3RQaukus7P4?r4fd3!l+SgL+<9(?zhGlAB8q6}RFuXD*4IK2mc zzWEPp+dLns)KrAiQr4)yY0SFywKMSVe#Il?Y=$}jc}^{6h1;@gKppg5zP9@8-yoie zZ|$!k_rn$StkU&oF5|KMCIMjBboD}z?Wa!T)fT;wr|RI8yvNYH>mT@bs2`O~)7S1& zBqE9!b#y`HVg{%Fr2&+X9h)upZ3QHca)784%iq1xRf?Z^;hak=4Y`d04(N;(dd?+r zC=j=(H2HofOE1naTZDg&1rP#yzlwz^s~q~d1$<-GHxt%D&C**a^%kxE_-kOzL`O~9 zCq}#LtucEda`G3=h9;3hvx5w??$E*xuBNz^_&^cKd>w~Ai3|UNJXA?o| zMtOg|bcSs$cJNvi$4uA`E2ADP{CK^BypSTv#s^+lpIrqngJ&Ns#9>aUOS-qryxydU z`aat4X!tY?TjX6<%>uf-;BUD#6H=ApX&YO?Ybs?Pp9D=d8;YZk;lN1-SD28}LHXA>hP=lk+Chp4 z-+3#Vnd^YW(fYTw3?-=re9yTHH&TSfYn2`3oIl-|wxjv8%8^-Ev{k_re;ZoHL1?mZ z>TacTh=}d{-@Je2-e=kN=T66;k*l$f_Q|pSaHxpC0duWEBy{yHM_gmr(jwF=oP~Tu z;3VmVPe)8xHs`c=4&LS+(e)pZpAubv7$}X>Rj}WA+jt!!c|=0`EA1ga!NGU-sCQ;+ zuDo6t8s#R=IJUK)i!I08NI%uehJVsYvK#Z7;U5s;16J9EUXanhXQiki2gJ_3cwsZ) zTBnjzlg8WTpJBc}$Et#q5v{byN{zR1FHu*{h_Kj@dZowo>kI=eWN*YQvk3ErwP&}Eae5S~psR~pAX>IuC> zuSp8BC{L=hUum_DcaO`f9$GxVFLL}@_75{M)PnMLoqXR|qDxZQzLZ*y%+IuM{=;83 z)~yb>x0l2x!j|R=efu_N*7*FgAId)+Yzja&Fi&b_0A;~h-M z!XSWH1bYdAr)K@Urq2~y?yFh9HaRXR_~Vr1x>lqx$i7a!n9(!9M?%3Jkkf#ov{l-D- zX`UkJXo3ybaA&N)@{(N@0|9}ArZ{_v45ob`sy<2MpOuA!?JXNYzS%WoFU`<5RQS!B zG=~83bj2FZMyuE_&Oj(FdJXCa_J(max(C3Y z0`Ax4oK`p|uRR~a?(PHV=(hM)Peup6Xq%~mQOgf*RS(7jK$9Vsu80=7QdAGmb7v;w z3dt3qO&P zMq_J?(=&ZASnszWrd&u`Oz}6|m^CK7hK3k)!LQ3J?Vut4bC&K0U|uXh1#R05V4X`)wNlpVO=fv z4$BNj&4VwwMQ6hl!a>|=%oC5PK}M4Ho_t;>=H{p-2kz1)N3RmX%JIRlE=X8M-ELUX zvZcXw#<|rzL*-GNZZwS7HeyRDDja9sk>4Q_n2Pg%o8#|^xlXSS)}jJpD1$!PY;vaD7?7eA5%I`H_qGv6HwM$V zKI19Qb(!QauINGrWikIWQ&~9T)j9y-hsA1mI9XE%pvQC!;|2u);?5)7SW5tgVoxPO zfs_BygmL3wpvA0^X~~l6{~(0NL)JTS)&VVxVY@DtX#%5<-Gqr#T{H004B~?FHI!B)7)+Dg?U~Lb|6L+3q}A; zhU&zbV;MefcS~JIYxH|C42;M?=P-|hYEFiQ8m+>nnljxvFms3LCYfK{6_`5 zfLZ|^3#MCp=R>yzlW9hu5z8@PiA!mFL7}aEy<}UO^jZ8E{prCQyUPOCItBK`_;24u zLN!4%Wxxy#!VEkr9uav_S^G=k>~;W!eB!VOP@J7%YRfn+&bhbppqd6?<#m?|5sOYub9f-hc-= z!DhskGZRmE1bPILcADSBPB(65intJj)+0P`~7^RVWHU8;EuK&ueXlOBly8Bgi9;Rk<9v{Kevb(QVM`{ZHUunzX4TYak zH{o2B=%V5>3R&%p<|D4vEL9$4D44wmG6LVQLi&1LkR<*&1y=IvYWH+tO4%VBWYi@ib1*QjcyT?nqK3p|E9J zj`S<11nomUH?#3}n2%q+Db0~IFkbil`feYQrNzRFI+w!^He>R@^7+;M*Qg8G8J69q zcuflTaya~h7Fox-(@?S|{xa$%n4PxLmA^3kktPdU>F`V&kSQmeRz1s+L2uVSex^ zmXm6)*JIMYDM^~-Rlc1VAQ#->l*FD`Lrjn?g!zDXs}phs=WqUTm0Bi=*hG3M!F+5d zEnw?Kd;>i^+N9xLPd$W^t7>#mX`kbl;7-IccYa7 znxna~)pDs(l4&$%Gm^6&+*$6fdU@pZx4k<-bQFR46uudbiXQiY5{az{v*SL>Dc$9L zKJnB-X`l4NCCoorL|%$KXoVC1{2Fm;L0L)vk>%^~b~o12wwUfN`f2Sx5g9SAnZ(}c zFi|-9-vjr^^P!P%&s~PLrvDAM)4QH|J(sgAo<_sNY%>@;tVGALI{y)1p?OKPelD)( z#T#`k*eYTziVG+U`zCOi`mv%kx@vUY?U9_JM^r5HPO#LA3xaG@ms(%1xJA77T zI*xs3Olrs|8xtGK&o^Z@uwR&VH@6{fI1$A|VV~7@4$hG)7t;Y{jV~`fpcSR$on+k0 z6F9@$qlU|Gr%h5Lr;sHTad9jG0n-T&QrsQthWEG@HdD@KZ2rNhx#(qNYi&<{L62R5 zcs)8Pl)^(wwN!%*3j2gSMeWjXNY1h4B;7RuJ;(l?|3m|tzpcGOl1@!@$XzIK;LV7s zgYkBVUi_Q{P^+?-5SnzOMN;Y<=|q9gHGQI|nm{Tbmvyf}_PJv@2GT)!v?dhS--2Fa zw4X(o)g6GJLE4sqtjL{CBR1KtK(LOTu&;9LwSrsR4 zPQS3orIoepotk<1A>p=H-Fl*?@z7j{AVKD-b)1l}idl*%0MaZ+S^!)O&FIbN!o;5u+ z=ka*q@_o_cLLz@4<6lGZUR`Hwh1Do(yp}W673T(VdhND-*Pi6VYWolzD^n^L7f<2X z*!N8DC%;&>EPkq5I-l~~Lu4hvED@Gr@+Mw+$*yp(N74V(()ByZvq{_cFlB~nBsMuv zb^TgUxV_S8(`=2{L=kEfVY4xncb<{mJM|Kh{TUw_6nU#ypHnO2d)70-?LFmS(PIY+ zzBUQ}F^ZUvMYnRnuknwnhqq2OYP-R`!>N9Saybs`Ej5;|lLjX!`LS~n67Th;G||~@V6hZ@%k|1o{a1P(B$5WFWX(awZMR>b0}TGsCHsRvhjn#@ zS2As3P$|d+pQdU zu3Zxn(G{`lCQwOk%wa?udxbG#kiN8gRC`0T0ag$Zf!aW8x=8jf0&ppRh~;BQJHzz0 zk>nHI1kg*O>`#(gos8gF-GTJa`Y+5u`qRMAE84vb3_N@8?iITPfWcVW3Xe@6n=r`_ z_XT=@4(xezm6f-B$2(7Ad-9;SPeoa=bFNWTfvot6z0=;0_JSUz`cyB}*!tNT>3qMc zmiA91O3*>liv#?tPHHHfv0}uE2z@}w{|tQ|!+6Zgg8^^Fg0UI_!D`D2Nyfze$)Ab- z`0N+I*jr!hbP5nnGY0t|YkX#MRpZG?(gq{#F`}?UcnIqwJ@he!dL<*>H1`k^t43Fn z&bQyJK}zzwe)mou*Nc$;ya3TFBtLXM3I%BXt6_=a=t+6fUrmviF7aZlY;3=J+<5c4;o5U+cbxvxb07tg z`Wz4wSW)&Lt3GTOR%k!)-89a5Ez~!znaUk_r$1(jGsP9F1k^*|o2P_NT96^tP7!UY zwUz!kjZ&lIF|vg;Z1U`Re~QKq5qrBQ3XMuNZ2twW9{P=Z2G#CQ*=#T zgB1Gw^~@ipCDP@o61LL;e~>&_v!w;>-Qk?#qzd(B=^6wj#3rYuCl_n^%mt4F6DM6! zD~1dk`J)dEgi}woXmHDd6F9s&87zq?K5sl#d#@oAqD7uS8h` zvn|*r5Ji-beX|n*K-as9O@e(-iboZZ0L(!ekFeVz`|E$i_4z&Ax{L+$5|@36;U=`d zMN~T}0W{@WsvwUekiof;0jS)uYnB$uC2 zhry^>^@+@uY3g*f8olq{A+68H1eF3M)yYI_AfaHRQ#GoeVCP=}Y1_lvMx?b|2;vD$ zF91fiN)Nq=`~Oy!SYun@3A;pb*4E8=j@qxw#ME$l$u&yS?LUP1io+GVx?8gu1I-(5 z+86xeB@xlk-$Du4n~)|*ATpWud{WQ8asD!SPEJ)0CA3_pRd|O&F5M6k7-1~6Wv+I! z=!}Y6nKyb;|L%F1RdHo>@t$Jj>X&Og_y4Wtn?vVwv6ruycMqr8VZS^XpOrVO12W1Q z!YT$d>cH1YJ_Hc+Fx(+GD_A6;n(`#uxyJ5fOoJ?{1bI3Y-eCj6^5+@2{b6E7TKzkw z*o!lYZ(MQEF|rSIeyzn6n^8PK$zZkkXE^@8*+;aRTJM)yMo|-;+}=g%nl1GX?asAN z!|}`1^TdV^?u#UOE&qw=4fwyHC0?{f$R>r}xAZr7W<#8KxMDD&+0ZI@M$z#}Z)JtM zK=bZ;siRI|Gmi2%0s1%6U*X>-^&WIr9(iBF=^e#3uw`r!Q+fKxcp8Z)%Kv9D| zBC%0WPUb}D1)x$gF~6T&0u(ufteG)0hRoU%W=anv4Pi>_U$RfaJL;zl)`}C85!nRj zUi`j&+TkAH+OS7yXpvwg$L0)Chv)sbqChEY_?0f~P$iiQNQk00md@gLJ3D*NW>Sl! z0x$`ldBG%S2mka_)&M+pl@KSC%QN8YJi!OtNm}x=Zd0%8;!H?mvucY zw2aK=i+bv%jTZyMUuwhHMK#6qb1%X*&?#~%+M4~-0233h#SSXPA0(9D5%(LO{ulQ8 z=ON7ezu*c^x)QZ%ag=P4tVC2~b_sq*tgjc+uIqja31xX z|Extke%x-8R>8BWaf^BS*gAFLJhb%}cNH4#JbC^F0`Mc#B)+#>D)`(Umu9J23)eSZ znBMkD*zL=<-h1xoYD4<-e?klZ+xnLCbKqO>>aEE5{wuVq0}gXImV;FwT{ID z-_p0|X8}BtlI3#1FBpqSkr~(;p}BxFGxU$`7tephF}oK45KVSbjY&<)meFliV(e!c zCJgpaSGr*Y$P3Z)0;PA?-sjPf{AT+gB<;A68hs;$NPPBDjM#e5yAq2ObI1QNo#_9( z=;i;M)>SzL@kkNxQoS1bIr}d=N`k)oPt`2i9u_VD7p|#7wT@|?`;Fy}kNPCzy4bR{ zO*%(|Fau}ie&-fbJ(ZSWdH&&57yATMYj64q|JG6|W~0~pmypk%ANJW&?EI?6rQg_K zO4tqYv)^OMHi1x2SB|VrW9@kZBkER+=9#>&U#sCdULzdd8}GFY!Vbg~gp&p6h18(N z+=(KlSm_jSLHy&(+=EVzM*)?rd!Gvy9k$w)3s|`(+kxUw(GD@zBfY%(Cq?Nm@W+&fL zv3TuubWc@O1(|y12!41Ye3or_p#fd3GmjYYM7d4Hb2!@pFRd#0p7}R!O5Y;d)`Va( zVpouB@iJLIefd0(pgX)jpKGvs13$fI;sl{=)`075L5%WX2l^SWzj5*-G|%~}rKB^z z{17-};r3g%N-$oSgB3}gnmEmWi1Fv&P-)pYjYOz{mcik;piy%eRm3NUOve0GV%C%G z!;TR;w_WMG>`%T(^XgqZ6tBEY^U03pkB`{Ri#u%{Xt;2h9KV!tIBTu8JH7GiJ(8C2 zweGdxL1UyZ+E~z^K5#{QWhA)WBiXOebnJqE>LUZo{n_M5EQoEnJ3vzH^8;r4ygA+O zV27_0dq1vRCHWDtoUDO~G)cx>!nE~S)c9s{ba&%Q^MDtAO4A>n=P0BaXS~0VrA$Rs z!-nQ6PH9Kvr3$*j$Ax-5QoxJj@#T!#P{A3;VUgMcp0Px?8j^Yl0f=Uo^T zoh&)iAZ5wp7xf4oSb+BAnbsJgR6BgObmXp6Qt@h^7jg6uVp#_hJiUB)Az4`uqu@Bf zYdi-(yDUn(;NLouwM}hizYpCdT^Nq4iVYeXIGayJ2BDe!zR$TW^yG1IC9@aTz`tEE zZxMp5@3y8Hnl8<PH zy1II)b;)n{wvSZRi@zJO^#7uNCk7z%hyQnicDF4YZpzLWsu0aSSC+LzLe;f!4Q(g$2pB^?QI$i;7%ghNIRx zrLH#n0xw9_5>@3ie!gss=ZVKV?XE1Bpe%$_iYX-C_as>@o0faH6mkIANFT`G3_n9j z%9xajvy9uLh@ht92e-tvVe+ZDpO7*oz`vgdr3q%#8IDWrcMFD!=f9%nc2n zT(ZrdGIRVx=`0Oje#Smt;*Qm@UGD*Rl|(d5!d6VWZ_cA0kfW4~ScQnXA|%!2*w$pv z4IWaX)7_5n>k34hlQJ{KR8nKxAWvY}~;p6o(h9z0hhs67kzlrT35Qb-n(xs6o$DausX>QHX8u?$% zd}mx!Pq!`#s00C#CS7{(5K1UYZ=ofCfS^c+fOG^6pa@8pDj^hUq4y2~3L?EoZvp8| zKp=p$c!K&r?|bgK=fnAOfA`z|WoGu?v$AHd=UMBSL6`5GGRZzmi3`xIG)47!O6_Vh z=q6sHxrY0@MeA__^;Su6e!XI7hSjMu>(ZFg3&ZU@7nSB~Z5#Ypwp^YmV~FIYe`1_h zqeT6sqsM=e0Q-g>TBu(})Dk6i2-9314bHb+LUB@>7a=$C@IHJd6}Y6c7N-9b?ntC! zz8Lu^esR!hV3X&?dfAz@5Ljn^wyAsWa9TA1pgXiOZy38A9vIZqwJAt*-XA0Da7v+n ze?i^YXuLw9JhT&6b}pQ14m0 zN%yDa$8QV$KiKwYs}C7!X+2{!~`ksVc4x7+Dd=tf(i)@EyL3 z^j;H`i%NjodHA~j)K&=@mWv{)kz^Rfgb~Enm1q5&&FUBRLAmY%xCOt@yiXbsrZ$L) zMP(++POvfu!&RiX$aXfgdEUj!*DwPD*E;ocdEg~JbDMnqLR|vb7&JZ?RGP&$M>AsED;*z`6tfp?0!^u7QZAbrpmy!rSBdM_BXRN)DI4LbG@Txt-aqxbz`bzu4c`bNC=je|%S-l{q ztv1#qsC%`XmZmIC5G?PSA=k0rXv|2QredQs6K$3^@}jqYh>#nX9@ud$^<2Ag1k_02 zSff_VhOQ&*DvJ+a=pW<_pX_{+i3~B!9wV0pBux>Qd^WSt7qxb$8*uEHTU|bs{Eo{} zN+6Pu*JK0;|H^{)z&_J z89k3J3jWW0kx-6GCV%z?Dr)+}*D<}U5h_DZuxUPW8-ab2)GY|t(6Dqc?>q$O!D~Cj z7&8BF0^~USBg8+MsZ$?P(M6A7_j%Me@f9A&P8d!Gef3dF`e@Rz(3H2W46Wp|i`fI% zdRb3bpUz<4cz#a0{)4rFiKKVb38U5KGw+X7KZ!oiO#Hd|4kyRW4+idDTx)O{Qbup8 zlXr`PT&5VDtQcz=7sEpiJU}{2>RxfJg+DssG5py}sQwDKD27*y!*MBJZu_we4A-e& z?+|L!e=O~q?wHruqp2B=IdnEQf(?``Xbw)b$#R*f^@xhK2nHhz#tW0Jh!ltzRC!D2 za?cP88+qc#vobZ)NCDE5%o`rcZN_(`4)BB$vb7<&qz=~o*R>sY#1~!1X5Dt>`ohW_ zo_|yV-c!E>lL}WG+ucfZ+MenCRr4AVJ`740=-~_XNyXKO=lnG_Pou6lZ2odiD<(r;xeMg=7=0OO*!%&-j#%{xm|&b!jK42aDFoXwAEK zd~m+&P8i4x91>y>eKzlE^8wEW?-kdtsiGlcW!adbAUUf0ti2 zo?q(|w_$epiP$^l_0*gydU7+Br*Gpzip_8gC!3a5RY14q2jgrd&&rSUQ;KgLZV3*W z{XQ#pvGXl8Q^6~T%@DH$n^SA*iz>Q>!k#$PUnzplYKg)N(f_XG1=wEEFj_hk=&?*~ z!ks|$_Is00-9*;iJf98+I_|xiw)8)>otkGd$lW=ov4-CXw|ysqjoS5laO#80OkGI& z!`&2J3pv|bF!tAW+KK7(!=_L&+g+#DdD<7w^QN~LT=A@-wglwlwAOE&OT0?0%t~s; z#xn=1?m}++xj*N)a+83ax`vx<;zEt2n{`m=Ei$o25x(6w@q+iucaHm*yA)gss98GG zBh1^)ubYcT3EE73hehG*q0h$!%~iTF^-&K;79U10As>MDLm6g13!(Z+pmh0;PPL9N z^ErOTe{5|)N`tAYcE?lyB9LsNdl zmb+B!+$1#mHp?>INs#7OfB�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 GtN#E)1sCoB literal 0 HcmV?d00001 diff --git a/docs/resources/build_apk_step_2.png b/docs/resources/build_apk_step_2.png new file mode 100644 index 0000000000000000000000000000000000000000..7e0dbeaaf05b9044c33586209a8b3732a5e75c56 GIT binary patch literal 21945 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 literal 0 HcmV?d00001 diff --git a/docs/resources/build_apk_step_3.png b/docs/resources/build_apk_step_3.png new file mode 100644 index 0000000000000000000000000000000000000000..59035c1301a5893988e72a0244ab7f2256cd2486 GIT binary patch literal 28060 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

        wY7i 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 C>nO|s literal 0 HcmV?d00001 diff --git a/docs/resources/version_name_code.png b/docs/resources/version_name_code.png new file mode 100644 index 0000000000000000000000000000000000000000..0ccca8a0f38bdb22de2e73b530ebdcf6aa2feb4f GIT binary patch literal 20546 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

        9(jG{moy!pA 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

        Dw literal 0 HcmV?d00001 diff --git a/docs/src/commonmark/en/content/capture-app/local-analytics-features.md b/docs/src/commonmark/en/content/capture-app/local-analytics-features.md deleted file mode 100644 index 934532ecdab..00000000000 --- a/docs/src/commonmark/en/content/capture-app/local-analytics-features.md +++ /dev/null @@ -1,82 +0,0 @@ -# Local Analytics { #capture_app_local_analytics } - -## Local Analytics (NEW 2.5) { #capture_app_local_analytics } - -The DHIS2 Android App can now render analytics that have been created in the Data Visualizer app in DHIS2. Analytics to be displayed require to be configured using the Android Settings WebApp where administrators will be able to decide the charts and tables to be displayed for end users. - -To configure analytics open the Android Settings WebApp on your DHIS2 server and follow the steps below: - - 1. Select Home, Program or Data set from the Analytics menu - 2. Click on the "Add Visualization" button - 3. Search by typing the name of the visualization and select it by clicking on it - 4. Add an alternative title, otherwise, the app will display the name of the visualization - -![](resources/images/capture-app-image162.png){ width=25%} -![](resources/images/capture-app-image164.png){ width=25%} - -Analytics are created and configured using the web tools, however, the data aggregation happens offline using only data stored in the device. - -![](resources/images/capture-app-image165.png){ width=25%} -![](resources/images/capture-app-image166.png){ width=25%} -![](resources/images/capture-app-image167.png){ width=25%} - -### Analytics Types and Filters { #capture_app_local_analytics_types } - -The analytics supported in the Android App are: - - - Pivot Tables - - Column Chart - - Line Chart - - Pie Chart - - Radar chart - - Single Value - -For each visualization object, the user will be able to filter in the app by: - - * Period: Daily, Weekly, Monthly, Yearly, This Quarter, Last Quarter, Last 4 Quarters and Quarter this year. - * OrgUnit: Select "All" to display all the org units available to the user or "Selection" to specify one or multiple org units. - -![](resources/images/capture-app-image180.png){ width=25%} -![](resources/images/capture-app-image168.png){ width=25%} -![](resources/images/capture-app-image169.png){ width=25%} - -A reset button will be displayed if a filter is applied. Select Reset to display the default visualization. - -![](resources/images/capture-app-image170.png){ width=25%} - -Users can also change The anlytics type between chart, table or single value. - -![](resources/images/capture-app-image166.png){ width=25%} -![](resources/images/capture-app-image171.png){ width=25%} - -### Groups { #capture_app_local_analytics_groups } - -All these visualizations can be organised and displayed in groups. Groups are also configured using the Android Settings Webapp following the steps below: - - 1. Open the Android Settings App - 2. Click to Add a new visualization in the Analytics Menu (Home, Program or Data set) - 3. Select a visualization - 4. Mark the "Use a group visualization" checkbox - 5. Create or select a created group - 6. Save the visualization - -You can name your different groups, they will be displayed as a button in the top bar of the analytics screen. - -![](resources/images/capture-app-image173.png){ width=25%} - -### Limitations { #capture_app_local_analytics_limitations } - -Android uses tables and charts created using the web Visualizer app, however only the configuration parameters of the object are used by the Android App: data elements, indicators, chart type, title, periods...; all the aggregations are calculated offline by the android application. The results will be based on the data stored in the device at that exact moment. - -Since the aggregations and calculations displayed are calculated in the device, the implementation of analytics is limited compared to web. In summary the compatible and suported objects and features are: - - - Well formed analytic objects (series, categories, filters) - - User has view access - - Limitations for Pivot Tables - - Number of header lines: 1 - - Number of header columns: 1 - - Limitations for Charts - - Number of Series: No limit (but remember you are rendering in a small screen) - - Number of Categories (doesn’t apply for pie chart): No limit - -There are many more restrictions which apply to Android Analytics regarding the many configuration options available in the Web Visualizer as well as the supported functions and calculations related to indicators and program indicators. [This table](https://docs.google.com/spreadsheets/d/1127cz7M0K4fux5CU0V54V2Z77NZWCr0BTrZ6jcCec4Q) summarises all supported features. diff --git a/docs/src/commonmark/en/content/capture-app/resources/images/capture-app-matomo-instance.png b/docs/src/commonmark/en/content/capture-app/resources/images/capture-app-matomo-instance.png deleted file mode 100644 index 18c23295eb42831e733c1b658b57799e068e610d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69085 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 diff --git a/docs/src/commonmark/en/content/capture-app/resources/images/capture-app-matomo-settings.png b/docs/src/commonmark/en/content/capture-app/resources/images/capture-app-matomo-settings.png deleted file mode 100644 index d114318abe7782143be251ad4fb0210df76e5ed1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41361 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 diff --git a/docs/src/commonmark/en/content/capture-app/resources/images/capture-app-sync-status.png b/docs/src/commonmark/en/content/capture-app/resources/images/capture-app-sync-status.png deleted file mode 100644 index 142218968d0847b526c270c670ce224080b99cab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17680 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 Kq)H?W{r*4M<8&hc diff --git a/docs/src/commonmark/en/content/capture-app/settings.md b/docs/src/commonmark/en/content/capture-app/settings.md deleted file mode 100644 index bc2c8fa840f..00000000000 --- a/docs/src/commonmark/en/content/capture-app/settings.md +++ /dev/null @@ -1,45 +0,0 @@ -# Settings { #capture_app_settings } - -![Settings window](resources/images/capture-app-image17.jpg){ width=25%} - -Sync data -: User is able to choose from a drop-down list if the data entered in the app is uploaded to the server manually or scheduled every 15 min, 1 hour or 1 Day. By default the app will sync every 24h. This kind of Syncing includes new and updated events and TEI’s. - -Sync configuration (also known as sync metadata) -: User is able to choose from a drop-down list if the data entered in the app is uploaded to the server manually or scheduled every day or week. By default the app will sync every 24h. This sync will update changes in programs or configurations in web. - -Sync parameters -: These parameters allow the user to specify the maximum number of TEI’s and events that can be stored in the local device. The user can also specify if limits apply per organisation unit or in total. Values can be set to default by clicking on “Reset to default”. - -> **Note** -> -> Sync data, Sync configuration and Sync parameters can be overwritten using the Android Settings Web App as described [in the specific section][#capture_app_andoid_settings_webapp_synchronization] -> -> - -Reserved values -: This will specify the number of reserved Id's available in your device and will allow you to refill them. - -Open sync errors log -: The sync error log gives details about the error and is prepared to be shared with admins. - -Delete local data -: This action will delete local data without having to log out. - -> **Warning** -> -> Using this functionality might lead to data loss if changes have not been previously synced to the server. -> -> - -Reset app data & configuration -: This action will log out the user and delete all data and metadata, this means user and server information is also deleted. It is similar to resetting the App. - -> **Warning** -> -> Using this functionality might lead to data loss if changes have not been previously synced to the server. -> -> - -SMS Settings -: This sections allows to check or edit the parameters related to the sms gateway. From 325d16f4443c909789e27d527f6e652c89a061a1 Mon Sep 17 00:00:00 2001 From: Xavier Molloy <xavi@dhis2.org> Date: Tue, 19 May 2026 06:59:26 +0200 Subject: [PATCH 226/260] fix: [ANDROAPP-7615] remove fabric.properties file (#4863) --- app/fabric.properties | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 app/fabric.properties diff --git a/app/fabric.properties b/app/fabric.properties deleted file mode 100644 index 1cf0e86e8c6..00000000000 --- a/app/fabric.properties +++ /dev/null @@ -1,3 +0,0 @@ -#Contains API Secret used to validate your application. Commit to internal source control; avoid making secret public. -#Mon Jun 11 18:43:35 CEST 2018 -apiSecret=989160e9e12be69d75ecbbf110f1b768e5909ce910ae926a63d046d47133b9ab From 065a8dbd214cac9b3cfb45d2f9aace8c57ef5dc0 Mon Sep 17 00:00:00 2001 From: Pablo <pablo@dhis2.org> Date: Tue, 19 May 2026 16:21:12 +0200 Subject: [PATCH 227/260] fix: [ANDROAPP-7439] Enrollment date custom label not displayed (#4859) --- .../org/dhis2/usescases/teidashboard/robot/TeiDashboardRobot.kt | 2 +- form/src/main/java/org/dhis2/form/data/EnrollmentRepository.kt | 2 +- .../test/java/org/dhis2/form/data/EnrollmentRepositoryTest.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/TeiDashboardRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/TeiDashboardRobot.kt index 4f15a180f93..7ffebe013fb 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/TeiDashboardRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/TeiDashboardRobot.kt @@ -206,7 +206,7 @@ class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { hasText( enrollmentUIModel.enrollmentDate, ) and hasAnySibling( - hasText("Enrollment date *"), + hasText("Date of enrollment *"), ), useUnmergedTree = true, ).assertIsDisplayed() diff --git a/form/src/main/java/org/dhis2/form/data/EnrollmentRepository.kt b/form/src/main/java/org/dhis2/form/data/EnrollmentRepository.kt index 31b1193d6a2..67c4625061f 100644 --- a/form/src/main/java/org/dhis2/form/data/EnrollmentRepository.kt +++ b/form/src/main/java/org/dhis2/form/data/EnrollmentRepository.kt @@ -351,7 +351,7 @@ class EnrollmentRepository( enrollmentDataList.add( getEnrollmentDateField( - conf.program()?.displayEnrollmentLabel() + conf.program()?.displayEnrollmentDateLabel() ?: enrollmentFormLabelsProvider.provideEnrollmentDateDefaultLabel(programUid!!), conf.program()?.selectEnrollmentDatesInFuture(), ), diff --git a/form/src/test/java/org/dhis2/form/data/EnrollmentRepositoryTest.kt b/form/src/test/java/org/dhis2/form/data/EnrollmentRepositoryTest.kt index e356e9ac561..1d66933b4a1 100644 --- a/form/src/test/java/org/dhis2/form/data/EnrollmentRepositoryTest.kt +++ b/form/src/test/java/org/dhis2/form/data/EnrollmentRepositoryTest.kt @@ -58,7 +58,7 @@ class EnrollmentRepositoryTest { whenever(conf.program()?.selectIncidentDatesInFuture()) doReturn true whenever(conf.captureOrgUnitsCount()) doReturn 10 - whenever(conf.program()?.enrollmentDateLabel()) doReturn "Enrollment Date" + whenever(conf.program()?.displayEnrollmentDateLabel()) doReturn "Enrollment Date" whenever(enrolmentFormLabelsProvider.provideEnrollmentDateDefaultLabel("Program_UID")) doReturn "Enrollment Date" whenever( From 99cbd77f5c144b0836c53ca8db7acdfbec6950c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= <andres@dhis2.org> Date: Thu, 21 May 2026 09:26:09 +0200 Subject: [PATCH 228/260] docs: update OpenID/OAuth configuration instructions (#4871) --- docs/configure-openid-oauth.md | 146 +++++++++++++++++++++++---------- 1 file changed, 102 insertions(+), 44 deletions(-) diff --git a/docs/configure-openid-oauth.md b/docs/configure-openid-oauth.md index fdcf79cbdc9..4eff1798811 100644 --- a/docs/configure-openid-oauth.md +++ b/docs/configure-openid-oauth.md @@ -6,75 +6,133 @@ sidebar_position: 3 ## Configure OpenID / OAuth -Since version 2.4. The DHIS2 android app supports login with an OpenID or OAuth provider. This -feature is not available by default, you need to add the configuration provided below and distribute -your own apk. OpenID has to be enabled in the web as well and the user OpenID parameter must be -configured. - -Under the **app/src/main/res/raw** you will find the **openid_config** file. - -```json -{ - "serverUrl": "<your server url>", - "loginLabel": "<text to display in the open id login button>", - "clientId": "<client id from the auth provider>", - "redirectUri": "<redirect uri from the auth provider>", - "discoveryUri": "<openid discovery url from the auth provider", - "authorizationUrl": "<authorization url from the auth provider>", - "tokenUrl": "<toker url from the auth provider>" -} +Since version 2.4, the DHIS2 Android app supports login with an OpenID Connect or OAuth 2.0 +provider. This feature is not available by default — you need to supply the configuration described +below and distribute your own APK. OpenID Connect must also be enabled on the DHIS2 web server and +the user's OpenID parameter must be configured. + +### Configuration + +All OpenID configuration is supplied via **environment variables** (or `local.properties` for local +development). The build script reads these values and embeds them in `BuildConfig` at compile time. + +#### Environment variables + +| Variable | Required | Description | +|---|---|---| +| `OPEN_ID_TYPE` | Yes | Mode: `discovery` (recommended) or `token` | +| `OPEN_ID_SERVER` | Yes | Your DHIS2 server URL | +| `OPEN_ID_CLIENT` | Yes | Client ID from the auth provider | +| `OPEN_ID_REDIRECT_URI` | Yes | Redirect URI registered with the auth provider | +| `OPEN_ID_AUTH_SCHEME` | Yes | URI scheme of the redirect URI (e.g. `com.googleusercontent.apps.CLIENT_ID_PREFIX`) | +| `OPEN_ID_DISCOVERY_URI` | Discovery mode | OpenID discovery endpoint (e.g. `https://provider/.well-known/openid-configuration`) | +| `OPEN_ID_AUTHORIZATION_URL` | Token mode | Authorization endpoint URL | +| `OPEN_ID_TOKEN_URL` | Token mode | Token endpoint URL | +| `OPEN_ID_BUTTON_TEXT` | No | Custom label for the OpenID login button | +| `OPEN_ID_PROMPT` | No | OpenID `prompt` parameter (e.g. `login`, `consent`, `select_account`) | + +For local development you can place the same key-value pairs in `local.properties` at the project +root instead of setting environment variables. The build script checks environment variables first +and falls back to `local.properties`. + +#### Discovery mode vs Token mode + +Set `OPEN_ID_TYPE` to choose how the app locates the provider endpoints: + +- **`discovery`** (recommended) — supply `OPEN_ID_DISCOVERY_URI`. The app fetches the provider's + metadata document at startup and resolves the authorization and token endpoints automatically. +- **`token`** — supply `OPEN_ID_AUTHORIZATION_URL` and `OPEN_ID_TOKEN_URL` directly, without a + discovery document. + +Use `discovery` whenever the provider publishes a `.well-known/openid-configuration` endpoint. + +#### Google example (discovery mode) + +```properties +# local.properties or environment variables +OPEN_ID_TYPE=discovery +OPEN_ID_SERVER=https://play.dhis2.org/android-current +OPEN_ID_CLIENT=CLIENT_ID_PREFIX.apps.googleusercontent.com +OPEN_ID_REDIRECT_URI=com.googleusercontent.apps.CLIENT_ID_PREFIX:/oauth2 +OPEN_ID_AUTH_SCHEME=com.googleusercontent.apps.CLIENT_ID_PREFIX +OPEN_ID_DISCOVERY_URI=https://accounts.google.com/.well-known/openid-configuration +OPEN_ID_BUTTON_TEXT=Login with Google ``` -How you should fill this file depends on the provider you are using. The following example shows how -the file would look like using Google as the provider: - -```json -{ - "serverUrl": "https://play.dhis2.org/android-current", - "loginLabel": "Login with google", - "clientId": "CLIEND_ID_PREFIX.apps.googleusercontent.com", - "redirectUri": "com.googleusercontent.apps.CLIEND_ID_PREFIX:/oauth2", - "discoveryUri": "https://accounts.google.com/.well-known/openid-configuration", - "authorizationUrl": null, - "tokenUrl": null -} -``` +### AndroidManifest.xml -For OpenID providers it is **recommended** to use the discoveryUri parameter if possible instead of -the authorizationUrl and tokenUrl. +The app's `AndroidManifest.xml` already contains the `RedirectUriReceiverActivity` declaration. +The redirect URI scheme is injected automatically from `OPEN_ID_AUTH_SCHEME` — **no manual editing +of the manifest is required**. -The next step is to include the following activity in the **AndroidManifest.xml** file. You will -need to replace the scheme so that the android app can be relaunched after a successful login. +For reference, the relevant activity entry looks like: ```xml - <activity android:name="net.openid.appauth.RedirectUriReceiverActivity" android:exported="true" tools:node="replace"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> - <data android:scheme="<your redirect url scheme>" /> + <data android:scheme="${openIdAuthScheme}" /> </intent-filter> </activity> ``` -Following our example, the Google scheme would be: -`com.googleusercontent.apps.CLIEND_ID_PREFIX` +#### Advanced: hardcoding OidcInfo in source code + +As an alternative to environment variables, you can hardcode the provider configuration directly in +`login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/LoginScreen.kt` by replacing +the body of `fixedOpenIdProvider`: + +```kotlin +// Discovery mode +private fun fixedOpenIdProvider(oidcInfo: OidcInfo): OidcInfo = + OidcInfo.Discovery( + server = "https://play.dhis2.org/android-current", + loginButtonText = "Login with Google", + clientId = "CLIENT_ID_PREFIX.apps.googleusercontent.com", + redirectUri = "com.googleusercontent.apps.CLIENT_ID_PREFIX:/oauth2", + discoveryUri = "https://accounts.google.com/.well-known/openid-configuration", + prompt = null, + ) + +// Token mode +private fun fixedOpenIdProvider(oidcInfo: OidcInfo): OidcInfo = + OidcInfo.Token( + server = "https://your.dhis2.server", + loginLabel = "Login with MyProvider", + clientId = "your-client-id", + redirectUri = "your.app.scheme:/oauth2", + authorizationUrl = "https://provider/oauth2/authorize", + tokenUrl = "https://provider/oauth2/token", + prompt = null, + ) +``` + +You still need to set `OPEN_ID_AUTH_SCHEME` (or the `manifestPlaceholders["openIdAuthScheme"]` +value in `app/build.gradle.kts`) to match the URI scheme in `redirectUri`, so the OS can redirect +back to the app after a successful login. + +> **This approach is not recommended.** It embeds credentials in source code, complicates +> multi-environment builds, and requires a code change to rotate any value. Prefer environment +> variables for all production and CI/CD builds. + +### Login screen -When launching the app, a new button will be displayed in the login screen. +When the configuration is present, a new button is displayed on the login screen. ![](resources/open_id_login.png) ### OpenID providers and configuration guidelines -Here you will find a list of available providers and how to get any info needed to set the * -*openid_config** file. +Here you will find a list of available providers and how to obtain the values needed for the +configuration variables above. * [Google](https://github.com/openid/AppAuth-Android/blob/master/app/README-Google.md) * [GitHub](https://docs.github.com/en/developers/apps/authorizing-oauth-apps) * [ID-porten](https://docs.digdir.no/oidc_protocol_authorize.html) * [OKTA](https://github.com/openid/AppAuth-Android/blob/master/app/README-Okta.md) * [KeyCloak](https://www.keycloak.org/docs/latest/authorization_services/index.html#_service_authorization_api) -* [Azure AD](https://docs.microsoft.com/es-es/azure/active-directory-b2c/signin-appauth-android?tabs=app-reg-ga) -* [WS02](https://medium.com/@maduranga.siriwardena/configuring-appauth-android-with-wso2-identity-server-8d378835c10a) \ No newline at end of file +* [Azure AD](https://learn.microsoft.com/en-us/azure/active-directory-b2c/configure-authentication-sample-android-app?tabs=kotlin) +* [WS02](https://medium.com/@maduranga.siriwardena/configuring-appauth-android-with-wso2-identity-server-8d378835c10a) From 448ea823ba4b2c7e62dea510840807e6e1579c6e Mon Sep 17 00:00:00 2001 From: Pablo <pablo@dhis2.org> Date: Thu, 21 May 2026 10:14:28 +0200 Subject: [PATCH 229/260] build: [ANDROAPP-7610] Reduce stock usecase ui complexity [skip size] (#4858) * build: [ANDROAPP-7610] Reduce stock usecase ui complexity * fix sonarcloud issue --- stock-usecase/src/main/AndroidManifest.xml | 21 -- .../android/rtsm/ui/home/HomeActivity.kt | 99 +++--- .../rtsm/ui/home/model/ButtonUiState.kt | 4 - .../rtsm/ui/home/screens/AnalyticsScreen.kt | 6 +- .../rtsm/ui/home/screens/HomeScreen.kt | 45 ++- .../screens/components/BackdropComponent.kt | 29 +- .../screens/components/DropdownComponents.kt | 42 +-- .../screens/components/FilterComponents.kt | 5 - .../ui/home/screens/components/MainContent.kt | 45 ++- .../ui/managestock/ManageStockViewModel.kt | 13 - .../components/ManageStockTable.kt | 292 +++++++++--------- 11 files changed, 271 insertions(+), 330 deletions(-) diff --git a/stock-usecase/src/main/AndroidManifest.xml b/stock-usecase/src/main/AndroidManifest.xml index d4fd3a53e7c..3078b27ec3e 100644 --- a/stock-usecase/src/main/AndroidManifest.xml +++ b/stock-usecase/src/main/AndroidManifest.xml @@ -3,31 +3,10 @@ <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> - - <queries> - <intent> - <action android:name="android.speech.RecognitionService" /> - </intent> - <intent> - <action android:name="android.intent.action.VIEW" /> - - <category android:name="android.intent.category.BROWSABLE" /> - - <data - android:host="org.icrc.dhis2.psmadvanced_test" - android:path="/J4CFTTod1TjeYgl9zsMgdcEaXnY=" - android:scheme="msauth" /> - </intent> - <intent> - <action android:name="android.support.customtabs.action.CustomTabsService" /> - </intent> - </queries> - <application android:allowBackup="false"> <activity android:name=".ui.home.HomeActivity" - android:configChanges="keyboardHidden|orientation|screenSize" android:windowSoftInputMode="adjustResize" /> <activity android:name=".ui.scanner.ScannerActivity" diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/HomeActivity.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/HomeActivity.kt index c5814e344b9..f40ae195be6 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/HomeActivity.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/HomeActivity.kt @@ -4,22 +4,18 @@ import android.content.Intent import android.os.Bundle import android.util.TypedValue import android.view.WindowManager -import android.widget.Toast import androidx.activity.compose.setContent -import androidx.activity.result.ActivityResultLauncher +import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material.ScaffoldState -import androidx.compose.material.Surface +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.compositionLocalOf +import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue -import androidx.compose.ui.Modifier +import androidx.compose.runtime.remember import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.toArgb -import androidx.compose.ui.res.colorResource -import com.journeyapps.barcodescanner.ScanContract -import com.journeyapps.barcodescanner.ScanIntentResult -import com.journeyapps.barcodescanner.ScanOptions +import androidx.core.content.ContextCompat import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import org.dhis2.android.rtsm.R @@ -28,22 +24,18 @@ import org.dhis2.android.rtsm.ui.home.screens.HomeScreen import org.dhis2.android.rtsm.ui.managestock.ManageStockViewModel import org.dhis2.android.rtsm.utils.NetworkUtils import org.dhis2.commons.Constants -import org.dhis2.commons.filters.FilterManager import org.dhis2.commons.sync.OnDismissListener import org.dhis2.commons.sync.OnSyncNavigationListener import org.dhis2.commons.sync.SyncContext import org.dhis2.commons.sync.SyncDialog import org.dhis2.commons.sync.SyncStatusItem -import org.dhis2.commons.ui.extensions.handleInsets +import org.dhis2.mobile.commons.extensions.toColor import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme import org.koin.androidx.viewmodel.ext.android.viewModel class HomeActivity : AppCompatActivity() { private val viewModel: HomeViewModel by viewModel() private val manageStockViewModel: ManageStockViewModel by viewModel() - private var themeColor = R.color.colorPrimary - private lateinit var filterManager: FilterManager - private lateinit var barcodeLauncher: ActivityResultLauncher<ScanOptions> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -53,46 +45,46 @@ class HomeActivity : AppCompatActivity() { onBackPressedDispatcher.onBackPressed() } - filterManager = FilterManager.getInstance() intent .getStringExtra(Constants.PROGRAM_UID) ?.let { manageStockViewModel.setConfig(it) } - handleInsets() + enableEdgeToEdge() setContent { val settingsUiState by viewModel.settingsUiState.collectAsState() + val themeColor by remember { + derivedStateOf { + updateTheme(settingsUiState.selectedTransactionItem.type) + } + } val helperText by viewModel.helperText.collectAsState() manageStockViewModel.setHelperText(helperText) - updateTheme(settingsUiState.selectedTransactionItem.type) - manageStockViewModel.setThemeColor(Color(colorResource(themeColor).toArgb())) DHIS2Theme { - Surface( - modifier = Modifier.fillMaxSize(), - color = Color(colorResource(themeColor).toArgb()), + CompositionLocalProvider( + LocalThemeColor provides themeColor ) { HomeScreen( - this, - viewModel, - manageStockViewModel, - Color(colorResource(themeColor).toArgb()), - supportFragmentManager, - barcodeLauncher, - { _, _ -> manageStockViewModel.onButtonClick() }, - ) { scope, scaffold -> - synchronizeData( - scope, - scaffold, - settingsUiState.programUid, - ) - } + viewModel = viewModel, + manageStockViewModel = manageStockViewModel, + supportFragmentManager = supportFragmentManager, + proceedAction = { _, _ -> manageStockViewModel.onButtonClick() }, + onFinish = { + finish() + }, + syncAction = { scope, scaffold -> + synchronizeData( + scope, + scaffold, + settingsUiState.programUid, + ) + } + ) } } } - - configureScanner() } - private fun updateTheme(type: TransactionType) { + private fun updateTheme(type: TransactionType): Color { val color: Int val theme: Int @@ -112,7 +104,7 @@ class HomeActivity : AppCompatActivity() { theme = R.style.correction } } - if (color != -1) { + return if (color != -1) { this.theme.applyStyle(theme, true) val window = window @@ -122,7 +114,9 @@ class HomeActivity : AppCompatActivity() { val colorToReturn = a.getColor(0, 0) a.recycle() window.statusBarColor = colorToReturn - themeColor = color + Color(ContextCompat.getColor(this, color)) + } else { + Color(ContextCompat.getColor(this, R.color.colorPrimary)) } } @@ -169,25 +163,6 @@ class HomeActivity : AppCompatActivity() { scaffoldState.snackbarHostState.showSnackbar(message) } } - - private fun configureScanner() { - val barcodeLauncher: ActivityResultLauncher<ScanOptions> = - registerForActivityResult( - ScanContract(), - ) { scanIntentResult -> - if (scanIntentResult.contents == null) { - Toast.makeText(this, "Scan cancelled!", Toast.LENGTH_SHORT).show() - } else { - onScanCompleted( - scanIntentResult, - ) - } - } - this.barcodeLauncher = barcodeLauncher - } - - private fun onScanCompleted(result: ScanIntentResult) { - val data = result.contents - manageStockViewModel.onSearchQueryChanged(data) - } } + +val LocalThemeColor = compositionLocalOf { "#FF007DEB".toColor() } diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/model/ButtonUiState.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/model/ButtonUiState.kt index ea8f8ab34d0..63f672067b9 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/model/ButtonUiState.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/model/ButtonUiState.kt @@ -1,13 +1,9 @@ package org.dhis2.android.rtsm.ui.home.model -import androidx.compose.ui.graphics.Color import org.dhis2.android.rtsm.R data class ButtonUiState( val text: Int = R.string.review, val icon: Int = R.drawable.proceed_icon, - val color: Color = Color.White, - val contentColor: Color = Color.White, - val containerColor: Color = Color.Blue, val visible: Boolean = false, ) diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/AnalyticsScreen.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/AnalyticsScreen.kt index 6b07f1ec2f0..2aeba8ad77d 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/AnalyticsScreen.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/AnalyticsScreen.kt @@ -20,6 +20,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel import dhis2.org.analytics.charts.ui.GroupAnalyticsFragment import kotlinx.coroutines.CoroutineScope import org.dhis2.android.rtsm.ui.home.HomeViewModel +import org.dhis2.android.rtsm.ui.home.LocalThemeColor import org.dhis2.android.rtsm.ui.home.screens.components.AnalyticsTopBar @OptIn(ExperimentalMaterialApi::class) @@ -28,7 +29,6 @@ fun AnalyticsScreen( modifier: Modifier = Modifier, viewModel: HomeViewModel = viewModel(), backAction: () -> Unit, - themeColor: Color, scaffoldState: ScaffoldState, syncAction: (scope: CoroutineScope, scaffoldState: ScaffoldState) -> Unit = { _, _ -> }, supportFragmentManager: FragmentManager, @@ -40,7 +40,7 @@ fun AnalyticsScreen( appBar = { AnalyticsTopBar( title = settingsUiState.programName, - themeColor = themeColor, + themeColor = LocalThemeColor.current, backAction = { backAction.invoke() }, @@ -48,7 +48,7 @@ fun AnalyticsScreen( syncAction = syncAction, ) }, - backLayerBackgroundColor = themeColor, + backLayerBackgroundColor = LocalThemeColor.current, backLayerContent = { }, frontLayerElevation = 0.dp, diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/HomeScreen.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/HomeScreen.kt index e976a0bbf0e..416570f4db5 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/HomeScreen.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/HomeScreen.kt @@ -1,12 +1,13 @@ package org.dhis2.android.rtsm.ui.home.screens -import android.app.Activity -import androidx.activity.result.ActivityResultLauncher import androidx.compose.animation.AnimatedContent import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing import androidx.compose.material.Icon import androidx.compose.material.Scaffold import androidx.compose.material.ScaffoldState @@ -25,7 +26,6 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.fragment.app.FragmentManager import androidx.lifecycle.viewmodel.compose.viewModel -import com.journeyapps.barcodescanner.ScanOptions import kotlinx.coroutines.CoroutineScope import org.dhis2.android.rtsm.R import org.dhis2.android.rtsm.ui.home.HomeViewModel @@ -35,18 +35,15 @@ import org.dhis2.android.rtsm.ui.managestock.ManageStockViewModel import org.hisp.dhis.mobile.ui.designsystem.component.ExtendedFAB import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBar import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarItem -import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme @Composable fun HomeScreen( - activity: Activity, viewModel: HomeViewModel = viewModel(), manageStockViewModel: ManageStockViewModel = viewModel(), - themeColor: Color, supportFragmentManager: FragmentManager, - barcodeLauncher: ActivityResultLauncher<ScanOptions>, proceedAction: (scope: CoroutineScope, scaffoldState: ScaffoldState) -> Unit = { _, _ -> }, syncAction: (scope: CoroutineScope, scaffoldState: ScaffoldState) -> Unit = { _, _ -> }, + onFinish: () -> Unit, ) { val scaffoldState = rememberScaffoldState() @@ -58,15 +55,17 @@ fun HomeScreen( NavigationBarItem( id = BottomNavigation.DATA_ENTRY.id, icon = Icons.AutoMirrored.Outlined.List, - label = activity.getString(R.string.navigation_data_entry), + label = stringResource(R.string.navigation_data_entry), ), NavigationBarItem( id = BottomNavigation.ANALYTICS.id, icon = Icons.Outlined.BarChart, - label = activity.getString(R.string.section_charts), + label = stringResource(R.string.section_charts), ), ) Scaffold( + modifier = Modifier.fillMaxSize(), + contentWindowInsets = WindowInsets.safeDrawing, scaffoldState = scaffoldState, floatingActionButton = { AnimatedVisibility( @@ -80,7 +79,7 @@ fun HomeScreen( Icon( painter = painterResource(id = dataEntryUiState.button.icon), contentDescription = stringResource(dataEntryUiState.button.text), - tint = dataEntryUiState.button.contentColor, + tint = Color.White, ) }, onClick = { @@ -112,31 +111,25 @@ fun HomeScreen( ) { targetIndex -> when (targetIndex) { BottomNavigation.ANALYTICS.id -> { - DHIS2Theme { - AnalyticsScreen( - viewModel = viewModel, - backAction = { manageStockViewModel.onHandleBackNavigation() }, - themeColor = themeColor, - modifier = Modifier.padding(paddingValues), - scaffoldState = scaffoldState, - supportFragmentManager = supportFragmentManager, - ) - } + AnalyticsScreen( + viewModel = viewModel, + backAction = { manageStockViewModel.onHandleBackNavigation() }, + modifier = Modifier.padding(paddingValues), + scaffoldState = scaffoldState, + supportFragmentManager = supportFragmentManager, + ) } BottomNavigation.DATA_ENTRY.id -> { Backdrop( - activity = activity, viewModel = viewModel, manageStockViewModel = manageStockViewModel, modifier = Modifier.padding(paddingValues), - themeColor = themeColor, supportFragmentManager = supportFragmentManager, - barcodeLauncher = barcodeLauncher, scaffoldState = scaffoldState, - ) { coroutineScope, scaffold -> - syncAction(coroutineScope, scaffold) - } + onFinish = onFinish, + syncAction = syncAction, + ) } } } diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/BackdropComponent.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/BackdropComponent.kt index 2753ed3c2bf..15f6cfaa8eb 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/BackdropComponent.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/BackdropComponent.kt @@ -1,9 +1,7 @@ package org.dhis2.android.rtsm.ui.home.screens.components import android.annotation.SuppressLint -import android.app.Activity import androidx.activity.compose.BackHandler -import androidx.activity.result.ActivityResultLauncher import androidx.compose.material.BackdropScaffold import androidx.compose.material.BackdropValue import androidx.compose.material.ExperimentalMaterialApi @@ -22,15 +20,17 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.fragment.app.FragmentManager -import com.journeyapps.barcodescanner.ScanOptions import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import org.dhis2.android.rtsm.R import org.dhis2.android.rtsm.data.TransactionType import org.dhis2.android.rtsm.ui.home.HomeViewModel +import org.dhis2.android.rtsm.ui.home.LocalThemeColor import org.dhis2.android.rtsm.ui.home.model.DataEntryStep import org.dhis2.android.rtsm.ui.home.model.EditionDialogResult import org.dhis2.android.rtsm.ui.home.model.SettingsUiState @@ -43,16 +43,16 @@ import org.dhis2.commons.dialogs.bottomsheet.DialogButtonStyle @OptIn(ExperimentalMaterialApi::class) @Composable fun Backdrop( - activity: Activity, viewModel: HomeViewModel, manageStockViewModel: ManageStockViewModel, modifier: Modifier = Modifier, - themeColor: Color, supportFragmentManager: FragmentManager, - barcodeLauncher: ActivityResultLauncher<ScanOptions>, scaffoldState: ScaffoldState, syncAction: (scope: CoroutineScope, scaffoldState: ScaffoldState) -> Unit = { _, _ -> }, + onFinish: () -> Unit ) { + val context = LocalContext.current + val backdropState = rememberBackdropScaffoldState(BackdropValue.Revealed) var isFrontLayerDisabled by remember { mutableStateOf<Boolean?>(null) } val settingsUiState by viewModel.settingsUiState.collectAsState() @@ -61,15 +61,15 @@ fun Backdrop( val bottomSheetState = manageStockViewModel.bottomSheetState.collectAsState() if (bottomSheetState.value) { launchBottomSheet( - activity.getString(R.string.not_saved), - activity.getString(R.string.transaction_not_confirmed), + stringResource(R.string.not_saved), + stringResource(R.string.transaction_not_confirmed), supportFragmentManager, onKeepEdition = { manageStockViewModel.onBottomSheetClosed() }, onDiscard = { manageStockViewModel.onBottomSheetClosed() - activity.finish() + onFinish() }, ) } @@ -87,7 +87,7 @@ fun Backdrop( settingsUiState.selectedTransactionItem.label, settingsUiState.fromFacilitiesLabel().asString(), settingsUiState.deliverToLabel()?.asString(), - themeColor, + LocalThemeColor.current, launchBottomSheet = { manageStockViewModel.onHandleBackNavigation() }, @@ -98,17 +98,16 @@ fun Backdrop( settingsUiState.hasDestinationSelected(), ) }, - backLayerBackgroundColor = themeColor, + backLayerBackgroundColor = LocalThemeColor.current, backLayerContent = { FilterList( viewModel, dataEntryUiState, - themeColor, supportFragmentManager, launchDialog = { msg, result -> launchBottomSheet( - activity.getString(R.string.not_saved), - activity.getString(msg), + context.getString(R.string.not_saved), + context.getString(msg), supportFragmentManager, onKeepEdition = { result.invoke(EditionDialogResult.KEEP) @@ -135,10 +134,8 @@ fun Backdrop( MainContent( backdropState, isFrontLayerDisabled, - themeColor, viewModel, manageStockViewModel, - barcodeLauncher, ) }, scaffoldState = backdropState, diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/DropdownComponents.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/DropdownComponents.kt index 5c690877b36..24d5a3cbf72 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/DropdownComponents.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/DropdownComponents.kt @@ -45,6 +45,7 @@ import androidx.compose.ui.zIndex import androidx.fragment.app.FragmentManager import org.dhis2.android.rtsm.R import org.dhis2.android.rtsm.data.models.TransactionItem +import org.dhis2.android.rtsm.ui.home.LocalThemeColor import org.dhis2.android.rtsm.ui.home.model.DataEntryStep import org.dhis2.android.rtsm.ui.home.model.DataEntryUiState import org.dhis2.android.rtsm.ui.home.model.EditionDialogResult @@ -61,7 +62,6 @@ fun DropdownComponentTransactions( settingsUiState: SettingsUiState, onTransitionSelected: (transition: TransactionItem) -> Unit, hasUnsavedData: Boolean, - themeColor: Color = colorResource(R.color.colorPrimary), launchDialog: (msg: Int, (result: EditionDialogResult) -> Unit) -> Unit, ) { var isExpanded by remember { mutableStateOf(false) } @@ -99,12 +99,14 @@ fun DropdownComponentTransactions( .fillMaxWidth() .onGloballyPositioned { coordinates -> textFieldSize = coordinates.size.toSize() - }.shadow( + } + .shadow( elevation = 8.dp, ambientColor = Color.Black.copy(alpha = 0.1f), shape = RoundedCornerShape(30.dp), clip = false, - ).offset(0.dp, 0.dp) + ) + .offset(0.dp, 0.dp) .background(color = Color.White, shape = RoundedCornerShape(30.dp)), readOnly = true, singleLine = true, @@ -115,7 +117,7 @@ fun DropdownComponentTransactions( Modifier .align(Alignment.CenterHorizontally) .padding(16.dp), - tint = themeColor, + tint = LocalThemeColor.current, ) }, trailingIcon = { @@ -124,7 +126,7 @@ fun DropdownComponentTransactions( isExpanded = !isExpanded }, icon = { - Icon(icon, contentDescription = null, tint = themeColor) + Icon(icon, contentDescription = null, tint = LocalThemeColor.current) }, ) }, @@ -188,7 +190,8 @@ fun DropdownComponentTransactions( Color.White }, shape = RoundedCornerShape(16.dp), - ).padding(paddingValue), + ) + .padding(paddingValue), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Start, ) { @@ -196,7 +199,7 @@ fun DropdownComponentTransactions( painter = painterResource(item.icon), contentDescription = null, Modifier.padding(6.dp), - tint = themeColor, + tint = LocalThemeColor.current, ) Text(text = capitalizeText(item.label)) } @@ -212,7 +215,6 @@ fun DropdownComponentFacilities( settingsUiState: SettingsUiState, onFacilitySelected: (facility: OrganisationUnit) -> Unit, hasUnsavedData: Boolean, - themeColor: Color = colorResource(R.color.colorPrimary), supportFragmentManager: FragmentManager, data: List<OrganisationUnit>, launchDialog: (msg: Int, (result: EditionDialogResult) -> Unit) -> Unit, @@ -245,12 +247,14 @@ fun DropdownComponentFacilities( .fillMaxWidth() .onGloballyPositioned { coordinates -> textFieldSize = coordinates.size.toSize() - }.shadow( + } + .shadow( elevation = 8.dp, ambientColor = Color.Black.copy(alpha = 0.1f), shape = RoundedCornerShape(30.dp), clip = false, - ).offset(0.dp, 0.dp) + ) + .offset(0.dp, 0.dp) .background(color = Color.White, shape = RoundedCornerShape(30.dp)), readOnly = true, singleLine = true, @@ -261,7 +265,7 @@ fun DropdownComponentFacilities( Modifier .align(Alignment.CenterHorizontally) .padding(16.dp), - tint = themeColor, + tint = LocalThemeColor.current, ) }, trailingIcon = { @@ -279,7 +283,7 @@ fun DropdownComponentFacilities( Icon( painterResource(id = R.drawable.ic_arrow_drop_down), contentDescription = null, - tint = themeColor, + tint = LocalThemeColor.current, ) }, ) @@ -303,7 +307,6 @@ fun DropdownComponentFacilities( fun DropdownComponentDistributedTo( onDestinationSelected: (destination: Option) -> Unit, dataEntryUiState: DataEntryUiState, - themeColor: Color = colorResource(R.color.colorPrimary), data: List<Option>, isDestinationSelected: (value: String) -> Unit = { }, deliverToLabel: String? = null, @@ -355,13 +358,15 @@ fun DropdownComponentDistributedTo( .fillMaxWidth() .onGloballyPositioned { coordinates -> textFieldSize = coordinates.size.toSize() - }.zIndex(1f) + } + .zIndex(1f) .shadow( elevation = 8.dp, ambientColor = Color.Black.copy(alpha = 0.1f), shape = RoundedCornerShape(30.dp), clip = false, - ).offset(0.dp, 1.dp) + ) + .offset(0.dp, 1.dp) .background(color = Color.White, shape = RoundedCornerShape(30.dp)), readOnly = true, singleLine = true, @@ -372,7 +377,7 @@ fun DropdownComponentDistributedTo( Modifier .align(Alignment.CenterHorizontally) .padding(16.dp), - tint = themeColor, + tint = LocalThemeColor.current, ) }, trailingIcon = { @@ -381,7 +386,7 @@ fun DropdownComponentDistributedTo( isExpanded = !isExpanded }, icon = { - Icon(icon, contentDescription = null, tint = themeColor) + Icon(icon, contentDescription = null, tint = LocalThemeColor.current) }, ) }, @@ -448,7 +453,8 @@ fun DropdownComponentDistributedTo( Color.White }, shape = RoundedCornerShape(16.dp), - ).padding( + ) + .padding( start = 8.dp, top = paddingValue, end = 8.dp, diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/FilterComponents.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/FilterComponents.kt index ca8cfad6d5f..8d2c90fce45 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/FilterComponents.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/FilterComponents.kt @@ -10,7 +10,6 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import androidx.fragment.app.FragmentManager import org.dhis2.android.rtsm.data.OperationState @@ -26,7 +25,6 @@ import org.hisp.dhis.android.core.organisationunit.OrganisationUnit fun FilterList( viewModel: HomeViewModel, dataEntryUiState: DataEntryUiState, - themeColor: Color, supportFragmentManager: FragmentManager, launchDialog: (msg: Int, (result: EditionDialogResult) -> Unit) -> Unit, onTransitionSelected: (transition: TransactionItem) -> Unit, @@ -55,7 +53,6 @@ fun FilterList( settingsUiState, onTransitionSelected, dataEntryUiState.hasUnsavedData, - themeColor, launchDialog, ) } @@ -65,7 +62,6 @@ fun FilterList( settingsUiState, onFacilitySelected, dataEntryUiState.hasUnsavedData, - themeColor, supportFragmentManager, getFacilities(facilities), launchDialog, @@ -78,7 +74,6 @@ fun FilterList( DropdownComponentDistributedTo( onDestinationSelected, dataEntryUiState, - themeColor, result, launchDialog = launchDialog, deliverToLabel = settingsUiState.deliverToLabel.ifEmpty { settingsUiState.deliverToLabel()?.asString() }, diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/MainContent.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/MainContent.kt index 257a1281000..5873d128d7e 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/MainContent.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/MainContent.kt @@ -1,5 +1,7 @@ package org.dhis2.android.rtsm.ui.home.screens.components +import android.widget.Toast +import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.ActivityResultLauncher import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.background @@ -38,6 +40,7 @@ import androidx.compose.ui.draw.shadow import androidx.compose.ui.focus.onFocusChanged import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.FirstBaseline +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -46,11 +49,13 @@ import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import com.journeyapps.barcodescanner.ScanContract import com.journeyapps.barcodescanner.ScanOptions import kotlinx.coroutines.launch import org.dhis2.android.rtsm.R import org.dhis2.android.rtsm.data.TransactionType import org.dhis2.android.rtsm.ui.home.HomeViewModel +import org.dhis2.android.rtsm.ui.home.LocalThemeColor import org.dhis2.android.rtsm.ui.home.model.DataEntryStep import org.dhis2.android.rtsm.ui.home.model.SettingsUiState import org.dhis2.android.rtsm.ui.managestock.ManageStockViewModel @@ -68,11 +73,10 @@ import org.hisp.dhis.mobile.ui.designsystem.theme.Spacing fun MainContent( backdropState: BackdropScaffoldState, isFrontLayerDisabled: Boolean?, - themeColor: Color, viewModel: HomeViewModel, manageStockViewModel: ManageStockViewModel, - barcodeLauncher: ActivityResultLauncher<ScanOptions>, ) { + val context = LocalContext.current val scope = rememberCoroutineScope() val resource = painterResource(R.drawable.ic_arrow_up) val qrcodeResource = painterResource(R.drawable.ic_qr_code_scanner) @@ -91,6 +95,14 @@ fun MainContent( mutableStateOf<TableResizeActions?>(null) } + val barcodeLauncher = rememberLauncherForActivityResult( + contract = ScanContract(), + ) { scanIntentResult -> + scanIntentResult.contents?.let { data -> + manageStockViewModel.onSearchQueryChanged(data) + } ?: Toast.makeText(context, "Scan cancelled!", Toast.LENGTH_SHORT).show() + } + Column( modifier = Modifier @@ -104,7 +116,8 @@ fun MainContent( left = 16.dp, top = 16.dp, right = 16.dp, - ).fillMaxWidth() + ) + .fillMaxWidth() .size(60.dp), horizontalArrangement = Arrangement.Center, verticalAlignment = Alignment.Top, @@ -120,7 +133,8 @@ fun MainContent( elevation = 3.dp, shape = RoundedCornerShape(30.dp), clip = false, - ).offset(0.dp, 0.dp) + ) + .offset(0.dp, 0.dp) .background(color = Color.White, shape = RoundedCornerShape(30.dp)) .weight(1 - (weightValue + weightValueArrow)) .alignBy(FirstBaseline) @@ -137,7 +151,7 @@ fun MainContent( TextFieldDefaults.outlinedTextFieldColors( focusedBorderColor = Color.White, unfocusedBorderColor = Color.White, - cursorColor = themeColor, + cursorColor = LocalThemeColor.current, ), textStyle = LocalTextStyle.current.copy(fontSize = 14.sp), enabled = isFrontLayerDisabled != true, @@ -145,7 +159,7 @@ fun MainContent( Icon( painter = searchResource, contentDescription = "", - tint = themeColor, + tint = LocalThemeColor.current, ) }, trailingIcon = { @@ -198,7 +212,7 @@ fun MainContent( Icon( painter = qrcodeResource, contentDescription = "", - tint = themeColor, + tint = LocalThemeColor.current, ) }, ) @@ -217,7 +231,7 @@ fun MainContent( Icon( painter = resetResize, contentDescription = "", - tint = themeColor, + tint = LocalThemeColor.current, ) }, ) @@ -239,7 +253,7 @@ fun MainContent( Icon( resource, contentDescription = null, - tint = themeColor, + tint = LocalThemeColor.current, ) }, ) @@ -258,15 +272,15 @@ fun MainContent( .fillMaxHeight(), ) { if (( - manageStockViewModel.dataEntryUiState - .collectAsState() - .value.step - != DataEntryStep.COMPLETED || manageStockViewModel.dataEntryUiState .collectAsState() .value.step - != DataEntryStep.START - ) && + != DataEntryStep.COMPLETED || + manageStockViewModel.dataEntryUiState + .collectAsState() + .value.step + != DataEntryStep.START + ) && shouldDisplayTable(settingsUiState) ) { manageStockViewModel.setup(viewModel.getData()) @@ -312,6 +326,7 @@ private fun shouldDisplayTable(settingsUiState: SettingsUiState): Boolean = when (settingsUiState.selectedTransactionItem.type) { TransactionType.DISTRIBUTION -> settingsUiState.hasFacilitySelected() && settingsUiState.hasDestinationSelected() + else -> settingsUiState.hasFacilitySelected() } diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/managestock/ManageStockViewModel.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/managestock/ManageStockViewModel.kt index 99707a11e64..50d3148746b 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/managestock/ManageStockViewModel.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/managestock/ManageStockViewModel.kt @@ -1,6 +1,5 @@ package org.dhis2.android.rtsm.ui.managestock -import androidx.compose.ui.graphics.Color import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.SavedStateHandle @@ -106,10 +105,6 @@ class ManageStockViewModel( private val _dataEntryUiState = MutableStateFlow(DataEntryUiState()) val dataEntryUiState: StateFlow<DataEntryUiState> = _dataEntryUiState - - private val _themeColor = MutableStateFlow(Color.White) - val themeColor: StateFlow<Color> = _themeColor - private val _scanText = MutableStateFlow("") val scanText = _scanText.asStateFlow() @@ -193,10 +188,6 @@ class ManageStockViewModel( } } - fun setThemeColor(themeColor: Color) { - _themeColor.value = themeColor - } - private fun loadStockItems() { search.value = transaction.value?.facility?.uid?.let { @@ -547,8 +538,6 @@ class ManageStockViewModel( ButtonUiState( text = R.string.review, icon = R.drawable.proceed_icon, - contentColor = Color.White, - containerColor = _themeColor.value, visible = buttonVisibility, ) } @@ -558,8 +547,6 @@ class ManageStockViewModel( ButtonUiState( text = R.string.confirm_transaction_label, icon = R.drawable.confirm_review, - contentColor = Color.White, - containerColor = _themeColor.value, visible = buttonVisibility, ) } diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/managestock/components/ManageStockTable.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/managestock/components/ManageStockTable.kt index b4195abacd0..a4708426766 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/managestock/components/ManageStockTable.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/managestock/components/ManageStockTable.kt @@ -22,6 +22,7 @@ import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import org.dhis2.android.rtsm.R +import org.dhis2.android.rtsm.ui.home.LocalThemeColor import org.dhis2.android.rtsm.ui.home.model.DataEntryStep import org.dhis2.android.rtsm.ui.managestock.ManageStockViewModel import org.dhis2.composetable.TableScreenState @@ -32,7 +33,6 @@ import org.dhis2.composetable.ui.TableConfiguration import org.dhis2.composetable.ui.TableDimensions import org.dhis2.composetable.ui.TableTheme import org.dhis2.composetable.ui.semantics.MAX_CELL_WIDTH_SPACE -import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme import kotlin.math.roundToInt @Composable @@ -48,169 +48,167 @@ fun ManageStockTable( ), ) - DHIS2Theme { - if (viewModel.hasData.collectAsState().value) { - val localDensity = LocalDensity.current - val conf = LocalConfiguration.current - val tableConfState by viewModel.tableConfigurationState.collectAsState() - val themeColor = viewModel.themeColor.collectAsState() + if (viewModel.hasData.collectAsState().value) { + val localDensity = LocalDensity.current + val conf = LocalConfiguration.current + val tableConfState by viewModel.tableConfigurationState.collectAsState() - var dimensions by remember { - mutableStateOf( - TableDimensions( - cellVerticalPadding = 11.dp, - maxRowHeaderWidth = - with(localDensity) { - (conf.screenWidthDp.dp.toPx() - MAX_CELL_WIDTH_SPACE.toPx()) - .roundToInt() - }, - extraWidths = - with(localDensity) { - tableConfState.overwrittenTableWidth?.mapValues { (_, width) -> + var dimensions by remember { + mutableStateOf( + TableDimensions( + cellVerticalPadding = 11.dp, + maxRowHeaderWidth = + with(localDensity) { + (conf.screenWidthDp.dp.toPx() - MAX_CELL_WIDTH_SPACE.toPx()) + .roundToInt() + }, + extraWidths = + with(localDensity) { + tableConfState.overwrittenTableWidth?.mapValues { (_, width) -> + width.dp.roundToPx() + } + } ?: emptyMap(), + rowHeaderWidths = + with(localDensity) { + tableConfState.overwrittenRowHeaderWidth + ?.mapValues { (_, width) -> width.dp.roundToPx() } - } ?: emptyMap(), - rowHeaderWidths = - with(localDensity) { - tableConfState.overwrittenRowHeaderWidth - ?.mapValues { (_, width) -> - width.dp.roundToPx() - } - } ?: emptyMap(), - columnWidth = - with(localDensity) { - tableConfState.overwrittenColumnWidth?.mapValues { (_, value) -> - value.mapValues { (_, width) -> - width.dp.roundToPx() - } + } ?: emptyMap(), + columnWidth = + with(localDensity) { + tableConfState.overwrittenColumnWidth?.mapValues { (_, value) -> + value.mapValues { (_, width) -> + width.dp.roundToPx() } - } ?: emptyMap(), - defaultRowHeaderWidth = with(localDensity) { 200.dp.toPx() }.toInt(), - tableBottomPadding = 100.dp, - ), - ) - } - - val tableResizeActions = - object : TableResizeActions { - override fun onTableWidthChanged(width: Int) { - dimensions = dimensions.copy(totalWidth = width) - } - - override fun onRowHeaderResize( - tableId: String, - newValue: Float, - ) { - dimensions = dimensions.updateHeaderWidth(tableId, newValue) - val widthDpValue = - with(localDensity) { - dimensions.getRowHeaderWidth(tableId).toDp().value } - viewModel.tableDimensionStore.saveWidthForSection(tableId, widthDpValue) - onResized(this) - } + } ?: emptyMap(), + defaultRowHeaderWidth = with(localDensity) { 200.dp.toPx() }.toInt(), + tableBottomPadding = 100.dp, + ), + ) + } - override fun onColumnHeaderResize( - tableId: String, - column: Int, - newValue: Float, - ) { - dimensions = - dimensions.updateColumnWidth(tableId, column, newValue) - val widthDpValue = - with(localDensity) { - dimensions.getColumnWidth(tableId, column).toDp().value - } - viewModel.tableDimensionStore.saveColumnWidthForSection( - tableId, - column, - widthDpValue, - ) - onResized(this) - } + val tableResizeActions = + object : TableResizeActions { + override fun onTableWidthChanged(width: Int) { + dimensions = dimensions.copy(totalWidth = width) + } - override fun onTableDimensionResize( - tableId: String, - newValue: Float, - ) { - dimensions = dimensions.updateAllWidthBy(tableId, newValue) - val widthDpValue = - with(localDensity) { - dimensions.getExtraWidths(tableId).toDp().value - } - viewModel.tableDimensionStore.saveTableWidth(tableId, widthDpValue) - onResized(this) - } + override fun onRowHeaderResize( + tableId: String, + newValue: Float, + ) { + dimensions = dimensions.updateHeaderWidth(tableId, newValue) + val widthDpValue = + with(localDensity) { + dimensions.getRowHeaderWidth(tableId).toDp().value + } + viewModel.tableDimensionStore.saveWidthForSection(tableId, widthDpValue) + onResized(this) + } - override fun onTableDimensionReset(tableId: String) { - dimensions = dimensions.resetWidth(tableId) - viewModel.tableDimensionStore.resetTable(tableId) - onResized(null) - } + override fun onColumnHeaderResize( + tableId: String, + column: Int, + newValue: Float, + ) { + dimensions = + dimensions.updateColumnWidth(tableId, column, newValue) + val widthDpValue = + with(localDensity) { + dimensions.getColumnWidth(tableId, column).toDp().value + } + viewModel.tableDimensionStore.saveColumnWidthForSection( + tableId, + column, + widthDpValue, + ) + onResized(this) + } + + override fun onTableDimensionResize( + tableId: String, + newValue: Float, + ) { + dimensions = dimensions.updateAllWidthBy(tableId, newValue) + val widthDpValue = + with(localDensity) { + dimensions.getExtraWidths(tableId).toDp().value + } + viewModel.tableDimensionStore.saveTableWidth(tableId, widthDpValue) + onResized(this) } - LaunchedEffect(key1 = tableConfState) { - if (tableConfState.isResized()) { - onResized(tableResizeActions) - } else { + override fun onTableDimensionReset(tableId: String) { + dimensions = dimensions.resetWidth(tableId) + viewModel.tableDimensionStore.resetTable(tableId) onResized(null) } } - TableTheme( - tableColors = - TableColors( - primary = themeColor.value, - primaryLight = themeColor.value.copy(alpha = 0.2f), - ), - tableDimensions = dimensions, - tableConfiguration = - TableConfiguration( - headerActionsEnabled = false, - textInputViewMode = false, - ), - tableValidator = viewModel, - tableResizeActions = tableResizeActions, - ) { - DataSetTableScreen( - tableScreenState = screenState, - onCellClick = { _, cell, _ -> - concealBackdropState.invoke() - viewModel.onCellClick( - cell = cell, - ) - }, - onEdition = { isEditing -> - viewModel.onEditingCell(isEditing, concealBackdropState) - }, - onSaveValue = viewModel::onSaveValueChange, - bottomContent = { - if (viewModel.dataEntryUiState - .collectAsState() - .value.step - == DataEntryStep.REVIEWING + LaunchedEffect(key1 = tableConfState) { + if (tableConfState.isResized()) { + onResized(tableResizeActions) + } else { + onResized(null) + } + } + + TableTheme( + tableColors = + TableColors( + primary = LocalThemeColor.current, + primaryLight = LocalThemeColor.current.copy(alpha = 0.2f), + ), + tableDimensions = dimensions, + tableConfiguration = + TableConfiguration( + headerActionsEnabled = false, + textInputViewMode = false, + ), + tableValidator = viewModel, + tableResizeActions = tableResizeActions, + ) { + DataSetTableScreen( + tableScreenState = screenState, + onCellClick = { _, cell, _ -> + concealBackdropState.invoke() + viewModel.onCellClick( + cell = cell, + ) + }, + onEdition = { isEditing -> + viewModel.onEditingCell(isEditing, concealBackdropState) + }, + onSaveValue = viewModel::onSaveValueChange, + bottomContent = { + if (viewModel.dataEntryUiState + .collectAsState() + .value.step + == DataEntryStep.REVIEWING + ) { + Box( + modifier = Modifier.fillMaxWidth(), + contentAlignment = Alignment.Center, ) { - Box( - modifier = Modifier.fillMaxWidth(), - contentAlignment = Alignment.Center, - ) { - Text( - text = stringResource(id = R.string.under_review), - color = colorResource(id = R.color.text_color), - fontSize = 14.sp, - fontStyle = FontStyle.Normal, - lineHeight = 20.sp, - ) - } + Text( + text = stringResource(id = R.string.under_review), + color = colorResource(id = R.color.text_color), + fontSize = 14.sp, + fontStyle = FontStyle.Normal, + lineHeight = 20.sp, + ) } - }, - ) - } - } else { - Text( - text = stringResource(id = R.string.no_data), - modifier = Modifier.padding(16.dp), + } + }, ) } + } else { + Text( + text = stringResource(id = R.string.no_data), + modifier = Modifier.padding(16.dp), + ) } + } From ca28420d8fbf540b8fd0927d841c4890ed2345ce Mon Sep 17 00:00:00 2001 From: Xavier Molloy <xavi@dhis2.org> Date: Fri, 22 May 2026 10:59:13 +0200 Subject: [PATCH 230/260] fix: [ANDROAPP-7499] Update network status for VPN connections (#4831) * fix: [ANDROAPP-7499] Update network status for VPN connections * fix: [ANDROAPP-7499] refresh network status call before login * fix: [ANDROAPP-7499] code review comments --- .../network/NetworkStatusProviderImpl.kt | 18 ++++++++++++++---- .../login/main/ui/viewmodel/LoginViewModel.kt | 19 ++++++------------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/network/NetworkStatusProviderImpl.kt b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/network/NetworkStatusProviderImpl.kt index 02837629b5f..e6d7b133e61 100644 --- a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/network/NetworkStatusProviderImpl.kt +++ b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/network/NetworkStatusProviderImpl.kt @@ -42,7 +42,12 @@ class NetworkStatusProviderImpl( ) { super.onCapabilitiesChanged(network, networkCapabilities) val networkState = networkCapabilities.asNetworkState() - trySend(networkState) + if (networkState) { + availableNetworks.add(network) + } else { + availableNetworks.remove(network) + } + trySend(availableNetworks.isNotEmpty()) } override fun onUnavailable() { @@ -55,13 +60,16 @@ class NetworkStatusProviderImpl( val networkCapabilities = manager.getNetworkCapabilities(network) val networkState = networkCapabilities?.asNetworkState() ?: false - trySend(networkState) + if (networkState) { + availableNetworks.add(network) + } + trySend(availableNetworks.isNotEmpty()) } override fun onLost(network: Network) { super.onLost(network) availableNetworks.remove(network) - trySend(false) + trySend(availableNetworks.isNotEmpty()) } } @@ -77,5 +85,7 @@ class NetworkStatusProviderImpl( return networkCapabilities?.asNetworkState() ?: false } - private fun NetworkCapabilities.asNetworkState(): Boolean = hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + private fun NetworkCapabilities.asNetworkState(): Boolean = + hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && + hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) } diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/LoginViewModel.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/LoginViewModel.kt index ce1607ba114..dd3b7b90e67 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/LoginViewModel.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/LoginViewModel.kt @@ -1,12 +1,10 @@ package org.dhis2.mobile.login.main.ui.viewmodel import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope import kotlinx.coroutines.Job import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.update import org.dhis2.mobile.commons.extensions.launchUseCase import org.dhis2.mobile.commons.extensions.withMinimumDuration @@ -26,16 +24,8 @@ class LoginViewModel( private val getInitialScreen: GetInitialScreen, private val importDatabase: ImportDatabase, private val validateServer: ValidateServer, - networkStatusProvider: NetworkStatusProvider, + private val networkStatusProvider: NetworkStatusProvider, ) : ViewModel() { - private val isNetworkOnline = - networkStatusProvider.connectionStatus - .stateIn( - viewModelScope, - SharingStarted.Eagerly, - false, - ) - private val _serverValidationState = MutableStateFlow(ServerValidationUiState()) val serverValidationState = _serverValidationState.asStateFlow() @@ -72,8 +62,11 @@ class LoginViewModel( } serverValidationJob = launchUseCase { + val isOnline = networkStatusProvider.connectionStatus.firstOrNull() ?: false val result = - withMinimumDuration { validateServer(serverUrl, isNetworkOnline.value) } + withMinimumDuration { + validateServer(serverUrl, isOnline) + } when (result) { is ServerValidationResult.Error -> { _serverValidationState.update { From 32f864538552d6646dceaf4358a797c9017f8fba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= <andres@dhis2.org> Date: Fri, 22 May 2026 12:28:26 +0200 Subject: [PATCH 231/260] fix: open id handle cancellation error (#4877) * fix: open id handle cancellation error * fix: [ANDROAPP-7580] fix sonar code smells --------- Co-authored-by: Xavier Molloy <xavi@dhis2.org> --- .../login/main/data/LoginRepositoryImpl.kt | 101 ++++++++++-------- 1 file changed, 57 insertions(+), 44 deletions(-) diff --git a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt index 8f27e708c69..375aaa33f2f 100644 --- a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt +++ b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt @@ -2,6 +2,7 @@ package org.dhis2.mobile.login.main.data import androidx.core.net.toUri import coil3.PlatformContext +import kotlinx.coroutines.CancellableContinuation import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.withContext import org.dhis2.mobile.commons.biometrics.BiometricActions @@ -360,50 +361,7 @@ class LoginRepositoryImpl( ), ) openIdController.handleIntent(intent) { resultIntent -> - withContext(dispatcher.io) { - val result = - when { - resultIntent.isFailure -> { - kotlin.Result.failure( - resultIntent.exceptionOrNull() - ?: Exception(getString(Res.string.openid_process_cancelled)), - ) - } - - resultIntent.isSuccess and (resultIntent.getOrNull() !is IntentWithRequestCode) -> { - kotlin.Result.failure(Exception(getString(Res.string.openid_invalid_auth_result))) - } - - else -> { - try { - val intent = - resultIntent.getOrNull() as IntentWithRequestCode - - d2 - .userModule() - .openIdHandler() - .blockingHandleLogInResponse( - serverUrl = openIdLoginConfiguration.serverUrl, - intent = intent.intent, - requestCode = intent.requestCode, - ) - - kotlin.Result.success(Unit) - } catch (e: Exception) { - kotlin.Result.failure( - Exception( - d2ErrorMessageProvider.getErrorMessage( - e, - openIdLoginConfiguration.isNetworkAvailable, - ), - ), - ) - } - } - } - - continuation.resume(value = result) { _, _, _ -> } - } + manageIntentResult(resultIntent, openIdLoginConfiguration, continuation) } continuation.invokeOnCancellation { kotlin.Result.failure<Unit>(Exception("")) @@ -411,6 +369,61 @@ class LoginRepositoryImpl( } } + private suspend fun manageIntentResult( + resultIntent: kotlin.Result<Any>, + openIdLoginConfiguration: OpenIdLoginConfiguration, + continuation: CancellableContinuation<kotlin.Result<Unit>>, + ) { + withContext(dispatcher.io) { + val result = + when { + resultIntent.isFailure -> { + kotlin.Result.failure( + resultIntent.exceptionOrNull() + ?: Exception(getString(Res.string.openid_process_cancelled)), + ) + } + + resultIntent.isSuccess and (resultIntent.getOrNull() !is IntentWithRequestCode) -> { + kotlin.Result.failure(Exception(getString(Res.string.openid_invalid_auth_result))) + } + + else -> { + try { + val intent = + resultIntent.getOrNull() as IntentWithRequestCode + + d2 + .userModule() + .openIdHandler() + .blockingHandleLogInResponse( + serverUrl = openIdLoginConfiguration.serverUrl, + intent = intent.intent, + requestCode = intent.requestCode, + ) + + kotlin.Result.success(Unit) + } catch (d2Error: D2Error) { + kotlin.Result.failure( + Exception( + d2ErrorMessageProvider.getErrorMessage( + d2Error, + openIdLoginConfiguration.isNetworkAvailable, + ), + ), + ) + } catch (_: Exception) { + kotlin.Result.failure( + resultIntent.exceptionOrNull() + ?: Exception(getString(Res.string.openid_process_cancelled)), + ) + } + } + } + continuation.resume(value = result) { _, _, _ -> } + } + } + override suspend fun getUsername(): String = withContext(dispatcher.io) { d2 From 9d4ec6dc9bc34875cbc104bf25bff9083a90af77 Mon Sep 17 00:00:00 2001 From: Xavier Molloy <xavi@dhis2.org> Date: Mon, 25 May 2026 10:37:56 +0200 Subject: [PATCH 232/260] fix: [ANDROAPP-7635] Manage null values for deleted check (#4876) --- .../search/data/SearchTrackedEntityRepositoryImpl.kt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImpl.kt b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImpl.kt index 1da0a90bc36..0c1306a445f 100644 --- a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImpl.kt +++ b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImpl.kt @@ -167,7 +167,15 @@ class SearchTrackedEntityRepositoryImpl( ): TrackedEntitySearchItemResult { val dbTei = getDatabaseTei(item) val selectedEnrollment = getSelectedEnrollment(dbTei, selectedProgram) - val isOnline = if (!deviceIsOnline) false else !(!item.isOnline && !hasStateFilters && dbTei.deleted() == false) + val isOnline = + if (!deviceIsOnline) { + false + } else { + !( + !item.isOnline && !hasStateFilters && + (dbTei.deleted() == false || dbTei.deleted() == null) + ) + } val enrollments = getTeiEnrollments(item.uid) val overDueDate: Instant? = getOverdueDate(enrollments, selectedProgram) val relationships = From 7f8ea5e365b771f90b4be2b94631c69fe099082d Mon Sep 17 00:00:00 2001 From: Pablo <pablo@dhis2.org> Date: Mon, 25 May 2026 10:41:30 +0200 Subject: [PATCH 233/260] fix: [ANDROAPP-7634] SMS module is accidentally enabled when ASWA is installed (#4875) * fix: [ANDROAPP-7634] SMS module is accidentally enabled when ASWA is installed * fix: fix sms sync workflow * Add blockingAwait to deleteGatewayNumber call --- .../mobile/sync/data/AndroidSyncRepository.kt | 63 +++++++++++++++---- .../dhis2/mobile/sync/data/SyncRepository.kt | 5 +- .../dhis2/mobile/sync/domain/SyncMetadata.kt | 10 ++- .../mobile/sync/model/SMSConfigResult.kt | 9 +++ .../mobile/sync/domain/SyncMetadataTest.kt | 11 ++++ 5 files changed, 84 insertions(+), 14 deletions(-) create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SMSConfigResult.kt diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt index b45c9842a22..a511fd29e74 100644 --- a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt @@ -23,6 +23,7 @@ import org.dhis2.mobile.commons.providers.TEI_MAX import org.dhis2.mobile.commons.providers.TEI_MAX_DEFAULT import org.dhis2.mobile.commons.reporting.AnalyticActions import org.dhis2.mobile.sync.model.DataSyncProgressStatus +import org.dhis2.mobile.sync.model.SMSConfigResult import org.dhis2.mobile.sync.model.SyncResult import org.dhis2.mobile.sync.model.toSyncPeriod import org.hisp.dhis.android.core.D2 @@ -280,36 +281,74 @@ class AndroidSyncRepository( Result.success(Unit) } - override suspend fun setUpSMS(): Result<Unit> = + override suspend fun setUpSMS(): Result<SMSConfigResult> = execute { + val smsConfig = + d2 + .smsModule() + .configCase() + .getSmsModuleConfig() + .blockingGet() + val isEnabled = smsConfig.isModuleEnabled + + var result: SMSConfigResult = SMSConfigResult.DoNothing d2.settingModule().generalSetting().blockingGet()?.let { globalSettings -> - globalSettings - .smsGateway() - ?.let { - d2 - .smsModule() - .configCase() - .setGatewayNumber(it) - .blockingAwait() + val gateway = globalSettings.smsGateway() + + if (gateway.isNullOrEmpty().not()) { + d2 + .smsModule() + .configCase() + .setGatewayNumber(gateway) + .blockingAwait() + if (!isEnabled) { + result = SMSConfigResult.EnableModule } - globalSettings.smsResultSender()?.let { + } else { d2 .smsModule() .configCase() - .setConfirmationSenderNumber(it) + .deleteGatewayNumber() .blockingAwait() + if (isEnabled) { + result = SMSConfigResult.DisableModule + } } + d2 .smsModule() .configCase() - .setModuleEnabled(true) + .setConfirmationSenderNumber(globalSettings.smsResultSender()) .blockingAwait() + } + Result.success(result) + } + + override suspend fun toggleSMS(enable: Boolean): Result<Unit> = + execute { + val currentStatus = + d2 + .smsModule() + .configCase() + .getSmsModuleConfig() + .blockingGet() + .isModuleEnabled + if (currentStatus != enable) { + d2 + .smsModule() + .configCase() + .setModuleEnabled(enable) + .blockingAwait() + } + + if (currentStatus.not() && enable) { d2 .smsModule() .configCase() .refreshMetadataIds() .blockingAwait() } + Result.success(Unit) } diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt index e83819b2c8e..b9e4bb6a7fc 100644 --- a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt @@ -1,6 +1,7 @@ package org.dhis2.mobile.sync.data import org.dhis2.mobile.sync.model.DataSyncProgressStatus +import org.dhis2.mobile.sync.model.SMSConfigResult import org.dhis2.mobile.sync.model.SyncPeriod interface SyncRepository { @@ -14,7 +15,7 @@ interface SyncRepository { suspend fun updateProjectAnalytics(): Result<Unit> - suspend fun setUpSMS(): Result<Unit> + suspend fun setUpSMS(): Result<SMSConfigResult> suspend fun downloadMapMetadata(): Result<Unit> @@ -49,4 +50,6 @@ interface SyncRepository { suspend fun getAllDataSets(): Result<List<String>> suspend fun saveDataSyncError(stackTrace: String) + + suspend fun toggleSMS(enable: Boolean): Result<Unit> } diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt index 8fa0645a988..5e522ccb47a 100644 --- a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt @@ -3,6 +3,7 @@ package org.dhis2.mobile.sync.domain import org.dhis2.mobile.commons.domain.UseCase import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.mobile.sync.data.SyncRepository +import org.dhis2.mobile.sync.model.SMSConfigResult import org.dhis2.mobile.sync.model.SyncPeriod class SyncMetadata( @@ -22,7 +23,14 @@ class SyncMetadata( if (syncMetadataResult.isSuccess) { repository.updateProjectAnalytics() input(40) - repository.setUpSMS() + val smsConfigResult = repository.setUpSMS().getOrDefault(SMSConfigResult.DoNothing) + when (smsConfigResult) { + SMSConfigResult.DisableModule -> repository.toggleSMS(false) + SMSConfigResult.EnableModule -> repository.toggleSMS(true) + SMSConfigResult.DoNothing -> { + // no-op + } + } input(50) repository.downloadMapMetadata() input(60) diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SMSConfigResult.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SMSConfigResult.kt new file mode 100644 index 00000000000..c5b4ec68b4b --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SMSConfigResult.kt @@ -0,0 +1,9 @@ +package org.dhis2.mobile.sync.model + +sealed interface SMSConfigResult { + data object EnableModule : SMSConfigResult + + data object DisableModule : SMSConfigResult + + data object DoNothing : SMSConfigResult +} diff --git a/sync/src/commonTest/kotlin/org/dhis2/mobile/sync/domain/SyncMetadataTest.kt b/sync/src/commonTest/kotlin/org/dhis2/mobile/sync/domain/SyncMetadataTest.kt index fd2c1e0ddc7..39bb092ba0d 100644 --- a/sync/src/commonTest/kotlin/org/dhis2/mobile/sync/domain/SyncMetadataTest.kt +++ b/sync/src/commonTest/kotlin/org/dhis2/mobile/sync/domain/SyncMetadataTest.kt @@ -3,6 +3,7 @@ package org.dhis2.mobile.sync.domain import kotlinx.coroutines.runBlocking import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.mobile.sync.data.SyncRepository +import org.dhis2.mobile.sync.model.SMSConfigResult import org.dhis2.mobile.sync.model.SyncPeriod import org.junit.Test import org.mockito.kotlin.any @@ -46,6 +47,8 @@ class SyncMetadataTest { ) whenever(repository.currentDataSyncPeriod()) doReturn SyncPeriod.Manual whenever(repository.syncMetadata(any())) doReturn Result.success(Unit) + whenever(repository.setUpSMS()) doReturn Result.success(SMSConfigResult.DoNothing) + whenever(repository.toggleSMS(true)) doReturn Result.success(Unit) syncMetadata.invoke { } @@ -62,6 +65,8 @@ class SyncMetadataTest { ) whenever(repository.currentDataSyncPeriod()) doReturn SyncPeriod.Manual whenever(repository.syncMetadata(any())) doReturn Result.success(Unit) + whenever(repository.setUpSMS()) doReturn Result.success(SMSConfigResult.DoNothing) + whenever(repository.toggleSMS(true)) doReturn Result.success(Unit) syncMetadata.invoke { } @@ -77,6 +82,8 @@ class SyncMetadataTest { SyncPeriod.Manual, ) whenever(repository.syncMetadata(any())) doReturn Result.success(Unit) + whenever(repository.setUpSMS()) doReturn Result.success(SMSConfigResult.DoNothing) + whenever(repository.toggleSMS(true)) doReturn Result.success(Unit) syncMetadata.invoke { } @@ -92,6 +99,8 @@ class SyncMetadataTest { SyncPeriod.Every7Days, ) whenever(repository.syncMetadata(any())) doReturn Result.success(Unit) + whenever(repository.setUpSMS()) doReturn Result.success(SMSConfigResult.DoNothing) + whenever(repository.toggleSMS(true)) doReturn Result.success(Unit) syncMetadata.invoke { } @@ -105,6 +114,8 @@ class SyncMetadataTest { whenever(repository.currentMetadataSyncPeriod()) doReturn SyncPeriod.Manual whenever(repository.currentDataSyncPeriod()) doReturn SyncPeriod.Manual whenever(repository.syncMetadata(any())) doReturn Result.failure(exception) + whenever(repository.setUpSMS()) doReturn Result.success(SMSConfigResult.DoNothing) + whenever(repository.toggleSMS(true)) doReturn Result.success(Unit) val result = syncMetadata.invoke { } From ceb2184db9c7cbb8c825e3abde8ac53625f2ffe3 Mon Sep 17 00:00:00 2001 From: Pablo <pablo@dhis2.org> Date: Mon, 25 May 2026 14:52:11 +0200 Subject: [PATCH 234/260] fix: [ANDROAPP-7603] Allow screen share in training flavor (#4872) --- .../usescases/general/SessionManagerActivity.kt | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/dhis2/usescases/general/SessionManagerActivity.kt b/app/src/main/java/org/dhis2/usescases/general/SessionManagerActivity.kt index 51816c652b5..92282fdaa75 100644 --- a/app/src/main/java/org/dhis2/usescases/general/SessionManagerActivity.kt +++ b/app/src/main/java/org/dhis2/usescases/general/SessionManagerActivity.kt @@ -10,6 +10,7 @@ import androidx.lifecycle.lifecycleScope import io.reactivex.subjects.BehaviorSubject import kotlinx.coroutines.launch import org.dhis2.App +import org.dhis2.BuildConfig import org.dhis2.R import org.dhis2.bindings.app import org.dhis2.commons.ActivityResultObservable @@ -19,6 +20,8 @@ import org.dhis2.commons.service.SessionManagerServiceImpl import org.dhis2.commons.ui.extensions.handleInsets import org.dhis2.data.server.OpenIdSession.LogOutReason import org.dhis2.data.service.workManager.WorkManagerController +import org.dhis2.mobile.login.pin.addPinBottomSheet +import org.dhis2.mobile.login.pin.domain.model.PinMode import org.dhis2.mobile.sync.domain.SyncStatusController import org.dhis2.usescases.login.LoginActivity import org.dhis2.usescases.login.LoginActivity.Companion.bundle @@ -28,8 +31,6 @@ import org.dhis2.usescases.splash.SplashActivity import org.dhis2.utils.analytics.AnalyticsHelper import org.dhis2.utils.analytics.CLICK import org.dhis2.utils.analytics.FORGOT_CODE -import org.dhis2.mobile.login.pin.addPinBottomSheet -import org.dhis2.mobile.login.pin.domain.model.PinMode import org.koin.android.ext.android.inject import javax.inject.Inject @@ -70,9 +71,11 @@ abstract class SessionManagerActivity : null, ) } - if (serverComponent.userManager().isUserLoggedIn().blockingFirst() && - !serverComponent.userManager().allowScreenShare() - ) { + val isTraining = BuildConfig.FLAVOR == "dhis2Training" + val screenShareAllowed = + serverComponent.userManager().isUserLoggedIn().blockingFirst() && + !serverComponent.userManager().allowScreenShare() + if (!isTraining && screenShareAllowed) { window.setFlags( WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE, From 475db4688b96a4df2da5a9ff5632a63d53826321 Mon Sep 17 00:00:00 2001 From: FerdyRod <ferdy@dhis2.org> Date: Mon, 25 May 2026 16:29:15 +0200 Subject: [PATCH 235/260] build: 3.4.0.1 release --- RELEASE.md | 59 +++------------------------------------ gradle/libs.versions.toml | 4 +-- whatsnew/whatsnew-en-US | 13 +++------ 3 files changed, 10 insertions(+), 66 deletions(-) diff --git a/RELEASE.md b/RELEASE.md index b566936cbc9..d6427abcdc4 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,58 +1,7 @@ -# Release notes - Android App for DHIS2 - 3.4.0 +# Release notes - Android App for DHIS2 - 3.4.0.1 -### NEW FUNCTIONALITY AND WEB PARITY - -#### Tracked Entity Search Performance Configuration: -This feature enables the configuration of the search operators for the different Tracked Entity Attributes to improve search performance. - -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. - -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 - -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. - -[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) - - -#### 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. - -[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) - -#### 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. - -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. - -[Jira]() | [Feature card]() - -#### 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. - -This allows multiple related actions to be managed within a single program rule while still maintaining a clear and predictable execution order. - -[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) - - -### USER EXPERIENCE - -#### 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 - -[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) - -### PERFORMANCE & MAINTENANCE - -#### 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. - -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. - -[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) - -#### 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. - -[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) +This patch release includes a hotfix. +## Bugs fixed +* [ANDROAPP-7634](https://dhis2.atlassian.net/browse/ANDROAPP-7634) SMS module is accidentally enabled when ASWA is installed diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 909c3f827fa..5ff92a8481e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,8 +4,8 @@ lifecycleRuntimeCompose = "2.9.6" navigationCompose = "2.9.2" sdk = "36" minSdk = "23" -vCode = "153" -vName = "3.4.0" +vCode = "154" +vName = "3.4.0.1" gradle = "9.0.1" kotlin = '2.3.10' dagger = '2.57.2' diff --git a/whatsnew/whatsnew-en-US b/whatsnew/whatsnew-en-US index 0be924354d9..d7d138dfd25 100644 --- a/whatsnew/whatsnew-en-US +++ b/whatsnew/whatsnew-en-US @@ -1,10 +1,5 @@ -Version 3.4.0 includes: -- Search performance: configure operators and min characters for TEI searches -- Custom theme: DHIS2 instance color reflected in the Android app -- Feedback widget: Markdown formatting and legend-based color coding -- Program rule action priority ordering -- Redesigned PIN login screen -- Metadata sync: new 6h and 12h intervals with daily config detection -- Improved event ordering for consistent sync and calculations +This is a patch version that fixes: -Details: github.com/dhis2/dhis2-android-capture-app \ No newline at end of file +- ANDROAPP-7634 SMS module is accidentally enabled when ASWA is installed + +You can find all the details on Jira and Github. \ No newline at end of file From 34cd679976f652c95a39550a3737f71cadf84190 Mon Sep 17 00:00:00 2001 From: Pablo <pablo@dhis2.org> Date: Tue, 26 May 2026 13:35:15 +0200 Subject: [PATCH 236/260] fix: [ANDROAPP-7619] ANR in home filters (#4874) --- .../commons/filters/data/FilterRepository.kt | 1262 +++++++++-------- 1 file changed, 637 insertions(+), 625 deletions(-) diff --git a/commons/src/main/java/org/dhis2/commons/filters/data/FilterRepository.kt b/commons/src/main/java/org/dhis2/commons/filters/data/FilterRepository.kt index ab3d029da70..7387f2b32ba 100644 --- a/commons/src/main/java/org/dhis2/commons/filters/data/FilterRepository.kt +++ b/commons/src/main/java/org/dhis2/commons/filters/data/FilterRepository.kt @@ -44,187 +44,207 @@ import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchCollec import javax.inject.Inject class FilterRepository - @Inject - constructor( - private val d2: D2, - val resources: FilterResources, - private val getFiltersApplyingWebAppConfig: GetFiltersApplyingWebAppConfig, - private val eventFilterToWorkingListItemMapper: EventFilterToWorkingListItemMapper, - private val teiFilterToWorkingListItemMapper: TeiFilterToWorkingListItemMapper, - private val programStageToWorkingListItemMapper: ProgramStageToWorkingListItemMapper, - ) { - private val observableSortingInject = ObservableField<SortingItem>() - private val observableOpenFilter = ObservableField<Filters>() - private var orgUnitsCount: Int = -1 - - init { - orgUnitsCount = - d2 - .organisationUnitModule() - .organisationUnits() - .byOrganisationUnitScope(OrganisationUnit.Scope.SCOPE_TEI_SEARCH) - .blockingCount() - } - - fun trackedEntityInstanceQueryByProgram(programUid: String): TrackedEntitySearchCollectionRepository = - d2 - .trackedEntityModule() - .trackedEntitySearch() - .byProgram() - .eq(programUid) - - fun trackedEntityInstanceQueryByType(trackedEntityTypeUid: String): TrackedEntitySearchCollectionRepository = - d2 - .trackedEntityModule() - .trackedEntitySearch() - .byTrackedEntityType() - .eq(trackedEntityTypeUid) - - fun rootOrganisationUnitUids(): List<String> = - d2 - .organisationUnitModule() - .organisationUnits() - .byRootOrganisationUnit(true) - .blockingGetUids() - - fun applyEnrollmentStatusFilter( - repository: TrackedEntitySearchCollectionRepository, - enrollmentStatuses: List<EnrollmentStatus>, - ): TrackedEntitySearchCollectionRepository = repository.byEnrollmentStatus().`in`(enrollmentStatuses) - - fun applyEventStatusFilter( - repository: TrackedEntitySearchCollectionRepository, - eventStatuses: List<EventStatus>, - ): TrackedEntitySearchCollectionRepository = repository.byEventStatus().`in`(eventStatuses) - - fun applyEventStatusFilter( - repository: EventQueryCollectionRepository, - eventStatuses: List<EventStatus>, - ): EventQueryCollectionRepository = repository.byStatus().`in`(eventStatuses) - - fun applyCategoryOptionComboFilter( - repository: EventQueryCollectionRepository, - categoryOptionCombos: List<CategoryOptionCombo>, - ): EventQueryCollectionRepository = - repository.byAttributeOptionCombo().`in`( - categoryOptionCombos.map { it.uid() }, - ) - - fun applyOrgUnitFilter( - repository: TrackedEntitySearchCollectionRepository, - ouMode: OrganisationUnitMode, - orgUnitUis: List<String>, - ): TrackedEntitySearchCollectionRepository = - repository - .byOrgUnitMode() - .eq(ouMode) - .byOrgUnits() - .`in`(orgUnitUis) - - fun applyStateFilter( - repository: TrackedEntitySearchCollectionRepository, - states: List<State>, - ): TrackedEntitySearchCollectionRepository = repository.byStates().`in`(states) - - fun applyDateFilter( - repository: TrackedEntitySearchCollectionRepository, - datePeriod: DatePeriod, - ): TrackedEntitySearchCollectionRepository = repository.byEventDate().inDatePeriod(datePeriod) - - fun applyEnrollmentDateFilter( - repository: TrackedEntitySearchCollectionRepository, - datePeriod: DatePeriod, - ): TrackedEntitySearchCollectionRepository = repository.byProgramDate().inDatePeriod(datePeriod) - - fun applyAssignToMe(repository: TrackedEntitySearchCollectionRepository): TrackedEntitySearchCollectionRepository = - repository.byAssignedUserMode().eq(AssignedUserMode.CURRENT) - - fun applyFollowUp(repository: TrackedEntitySearchCollectionRepository): TrackedEntitySearchCollectionRepository = - repository.byFollowUp().isTrue - - fun sortByPeriod( - repository: TrackedEntitySearchCollectionRepository, - orderDirection: RepositoryScope.OrderByDirection, - ): TrackedEntitySearchCollectionRepository = repository.orderByEventDate().eq(orderDirection) - - fun sortByOrgUnit( - repository: TrackedEntitySearchCollectionRepository, - orderDirection: RepositoryScope.OrderByDirection, - ): TrackedEntitySearchCollectionRepository = repository.orderByOrganisationUnitName().eq(orderDirection) - - fun sortByEnrollmentDate( - repository: TrackedEntitySearchCollectionRepository, - orderDirection: RepositoryScope.OrderByDirection, - ): TrackedEntitySearchCollectionRepository = repository.orderByEnrollmentDate().eq(orderDirection) - - fun sortByEnrollmentStatus( - repository: TrackedEntitySearchCollectionRepository, - orderDirection: RepositoryScope.OrderByDirection, - ): TrackedEntitySearchCollectionRepository = repository.orderByEnrollmentStatus().eq(orderDirection) - - fun eventsByProgram(programUid: String): EventQueryCollectionRepository = - d2 - .eventModule() - .eventQuery() - .byIncludeDeleted() - .eq(false) - .byProgram() - .eq(programUid) - - fun applyOrgUnitFilter( - repository: EventQueryCollectionRepository, - orgUnitUis: List<String>, - ): EventQueryCollectionRepository = repository.byOrgUnits().`in`(orgUnitUis) - - fun applyStateFilter( - repository: EventQueryCollectionRepository, - states: List<State>, - ): EventQueryCollectionRepository = repository.byStates().`in`(states) - - fun applyDateFilter( - repository: EventQueryCollectionRepository, - datePeriod: DatePeriod, - ): EventQueryCollectionRepository = repository.byEventDate().inDatePeriod(datePeriod) - - fun applyAssignToMe(repository: EventQueryCollectionRepository): EventQueryCollectionRepository = - repository.byAssignedUser().eq(AssignedUserMode.CURRENT) - - fun sortByEventDate( - repository: EventQueryCollectionRepository, - orderDirection: RepositoryScope.OrderByDirection, - ): EventQueryCollectionRepository = repository.orderByEventDate().eq(orderDirection) - - fun sortByOrgUnit( - repository: EventQueryCollectionRepository, - orderDirection: RepositoryScope.OrderByDirection, - ): EventQueryCollectionRepository = repository.orderByOrganisationUnitName().eq(orderDirection) - - fun dataSetInstanceSummaries(): DataSetInstanceSummaryCollectionRepository = d2.dataSetModule().dataSetInstanceSummaries() - - fun applyOrgUnitFilter( - repository: DataSetInstanceSummaryCollectionRepository, - orgUnitUis: List<String>, - ): DataSetInstanceSummaryCollectionRepository = repository.byOrganisationUnitUid().`in`(orgUnitUis) - - fun applyStateFilter( - repository: DataSetInstanceSummaryCollectionRepository, - states: List<State>, - ): DataSetInstanceSummaryCollectionRepository = repository.byState().`in`(states) - - fun applyPeriodFilter( - repository: DataSetInstanceSummaryCollectionRepository, - datePeriods: List<DatePeriod>, - ): DataSetInstanceSummaryCollectionRepository = repository.byPeriodStartDate().inDatePeriods(datePeriods) - - fun orgUnitsByName(name: String): List<OrganisationUnit> = - d2 - .organisationUnitModule() - .organisationUnits() - .byDisplayName() - .like("%$name%") - .blockingGet() +@Inject +constructor( + private val d2: D2, + val resources: FilterResources, + private val getFiltersApplyingWebAppConfig: GetFiltersApplyingWebAppConfig, + private val eventFilterToWorkingListItemMapper: EventFilterToWorkingListItemMapper, + private val teiFilterToWorkingListItemMapper: TeiFilterToWorkingListItemMapper, + private val programStageToWorkingListItemMapper: ProgramStageToWorkingListItemMapper, +) { + private val observableSortingInject = ObservableField<SortingItem>() + private val observableOpenFilter = ObservableField<Filters>() + private fun orgUnitsCount() = + d2 + .organisationUnitModule() + .organisationUnits() + .byOrganisationUnitScope(OrganisationUnit.Scope.SCOPE_TEI_SEARCH) + .blockingCount() + + fun trackedEntityInstanceQueryByProgram(programUid: String): TrackedEntitySearchCollectionRepository = + d2 + .trackedEntityModule() + .trackedEntitySearch() + .byProgram() + .eq(programUid) + + fun trackedEntityInstanceQueryByType(trackedEntityTypeUid: String): TrackedEntitySearchCollectionRepository = + d2 + .trackedEntityModule() + .trackedEntitySearch() + .byTrackedEntityType() + .eq(trackedEntityTypeUid) + + fun rootOrganisationUnitUids(): List<String> = + d2 + .organisationUnitModule() + .organisationUnits() + .byRootOrganisationUnit(true) + .blockingGetUids() + + fun applyEnrollmentStatusFilter( + repository: TrackedEntitySearchCollectionRepository, + enrollmentStatuses: List<EnrollmentStatus>, + ): TrackedEntitySearchCollectionRepository = + repository.byEnrollmentStatus().`in`(enrollmentStatuses) + + fun applyEventStatusFilter( + repository: TrackedEntitySearchCollectionRepository, + eventStatuses: List<EventStatus>, + ): TrackedEntitySearchCollectionRepository = repository.byEventStatus().`in`(eventStatuses) + + fun applyEventStatusFilter( + repository: EventQueryCollectionRepository, + eventStatuses: List<EventStatus>, + ): EventQueryCollectionRepository = repository.byStatus().`in`(eventStatuses) + + fun applyCategoryOptionComboFilter( + repository: EventQueryCollectionRepository, + categoryOptionCombos: List<CategoryOptionCombo>, + ): EventQueryCollectionRepository = + repository.byAttributeOptionCombo().`in`( + categoryOptionCombos.map { it.uid() }, + ) + + fun applyOrgUnitFilter( + repository: TrackedEntitySearchCollectionRepository, + ouMode: OrganisationUnitMode, + orgUnitUis: List<String>, + ): TrackedEntitySearchCollectionRepository = + repository + .byOrgUnitMode() + .eq(ouMode) + .byOrgUnits() + .`in`(orgUnitUis) + + fun applyStateFilter( + repository: TrackedEntitySearchCollectionRepository, + states: List<State>, + ): TrackedEntitySearchCollectionRepository = repository.byStates().`in`(states) + + fun applyDateFilter( + repository: TrackedEntitySearchCollectionRepository, + datePeriod: DatePeriod, + ): TrackedEntitySearchCollectionRepository = repository.byEventDate().inDatePeriod(datePeriod) + + fun applyEnrollmentDateFilter( + repository: TrackedEntitySearchCollectionRepository, + datePeriod: DatePeriod, + ): TrackedEntitySearchCollectionRepository = repository.byProgramDate().inDatePeriod(datePeriod) + + fun applyAssignToMe(repository: TrackedEntitySearchCollectionRepository): TrackedEntitySearchCollectionRepository = + repository.byAssignedUserMode().eq(AssignedUserMode.CURRENT) + + fun applyFollowUp(repository: TrackedEntitySearchCollectionRepository): TrackedEntitySearchCollectionRepository = + repository.byFollowUp().isTrue + + fun sortByPeriod( + repository: TrackedEntitySearchCollectionRepository, + orderDirection: RepositoryScope.OrderByDirection, + ): TrackedEntitySearchCollectionRepository = repository.orderByEventDate().eq(orderDirection) + + fun sortByOrgUnit( + repository: TrackedEntitySearchCollectionRepository, + orderDirection: RepositoryScope.OrderByDirection, + ): TrackedEntitySearchCollectionRepository = + repository.orderByOrganisationUnitName().eq(orderDirection) + + fun sortByEnrollmentDate( + repository: TrackedEntitySearchCollectionRepository, + orderDirection: RepositoryScope.OrderByDirection, + ): TrackedEntitySearchCollectionRepository = + repository.orderByEnrollmentDate().eq(orderDirection) + + fun sortByEnrollmentStatus( + repository: TrackedEntitySearchCollectionRepository, + orderDirection: RepositoryScope.OrderByDirection, + ): TrackedEntitySearchCollectionRepository = + repository.orderByEnrollmentStatus().eq(orderDirection) + + fun eventsByProgram(programUid: String): EventQueryCollectionRepository = + d2 + .eventModule() + .eventQuery() + .byIncludeDeleted() + .eq(false) + .byProgram() + .eq(programUid) + + fun applyOrgUnitFilter( + repository: EventQueryCollectionRepository, + orgUnitUis: List<String>, + ): EventQueryCollectionRepository = repository.byOrgUnits().`in`(orgUnitUis) + + fun applyStateFilter( + repository: EventQueryCollectionRepository, + states: List<State>, + ): EventQueryCollectionRepository = repository.byStates().`in`(states) + + fun applyDateFilter( + repository: EventQueryCollectionRepository, + datePeriod: DatePeriod, + ): EventQueryCollectionRepository = repository.byEventDate().inDatePeriod(datePeriod) + + fun applyAssignToMe(repository: EventQueryCollectionRepository): EventQueryCollectionRepository = + repository.byAssignedUser().eq(AssignedUserMode.CURRENT) + + fun sortByEventDate( + repository: EventQueryCollectionRepository, + orderDirection: RepositoryScope.OrderByDirection, + ): EventQueryCollectionRepository = repository.orderByEventDate().eq(orderDirection) + + fun sortByOrgUnit( + repository: EventQueryCollectionRepository, + orderDirection: RepositoryScope.OrderByDirection, + ): EventQueryCollectionRepository = repository.orderByOrganisationUnitName().eq(orderDirection) + + fun dataSetInstanceSummaries(): DataSetInstanceSummaryCollectionRepository = + d2.dataSetModule().dataSetInstanceSummaries() + + fun applyOrgUnitFilter( + repository: DataSetInstanceSummaryCollectionRepository, + orgUnitUis: List<String>, + ): DataSetInstanceSummaryCollectionRepository = + repository.byOrganisationUnitUid().`in`(orgUnitUis) + + fun applyStateFilter( + repository: DataSetInstanceSummaryCollectionRepository, + states: List<State>, + ): DataSetInstanceSummaryCollectionRepository = repository.byState().`in`(states) + + fun applyPeriodFilter( + repository: DataSetInstanceSummaryCollectionRepository, + datePeriods: List<DatePeriod>, + ): DataSetInstanceSummaryCollectionRepository = + repository.byPeriodStartDate().inDatePeriods(datePeriods) + + fun orgUnitsByName(name: String): List<OrganisationUnit> = + d2 + .organisationUnitModule() + .organisationUnits() + .byDisplayName() + .like("%$name%") + .blockingGet() + + fun programFilters(programUid: String): List<FilterItem> = + d2 + .programModule() + .programs() + .uid(programUid) + .get() + .map { + if (it.programType() == + org.hisp.dhis.android.core.program.ProgramType.WITH_REGISTRATION + ) { + getTrackerFilters(it) + } else { + getEventFilters(it, ProgramType.EVENT) + } + }.blockingGet() - fun programFilters(programUid: String): List<FilterItem> = + fun workingListFilter(programUid: String): WorkingListFilter? = + try { d2 .programModule() .programs() @@ -234,75 +254,59 @@ class FilterRepository if (it.programType() == org.hisp.dhis.android.core.program.ProgramType.WITH_REGISTRATION ) { - getTrackerFilters(it) + getTrackerWorkingList(it) } else { - getEventFilters(it, ProgramType.EVENT) + getEventWorkingList(it) } }.blockingGet() + } catch (e: Exception) { + null + } - fun workingListFilter(programUid: String): WorkingListFilter? = - try { - d2 - .programModule() - .programs() - .uid(programUid) - .get() - .map { - if (it.programType() == - org.hisp.dhis.android.core.program.ProgramType.WITH_REGISTRATION - ) { - getTrackerWorkingList(it) - } else { - getEventWorkingList(it) - } - }.blockingGet() - } catch (e: Exception) { - null + fun dashboardFilters(programUid: String): List<FilterItem> = + d2 + .programModule() + .programs() + .uid(programUid) + .get() + .map { + getEventFilters(it, ProgramType.TRACKER) + }.blockingGet() + + fun globalTrackedEntityFilters(): List<FilterItem> { + val orgUnitsCount = orgUnitsCount() + val defaultFilters = createDefaultTrackedEntityFilters() + + if (webAppIsNotConfigured()) { + if (orgUnitsCount == 1) { + defaultFilters.remove(ProgramFilter.ORG_UNIT) } + return defaultFilters.values.toList() + } - fun dashboardFilters(programUid: String): List<FilterItem> = + val globalTrackedEntityTypeFiltersWebApp = d2 - .programModule() - .programs() - .uid(programUid) - .get() - .map { - getEventFilters(it, ProgramType.TRACKER) - }.blockingGet() + .settingModule() + .appearanceSettings() + .getTrackedEntityTypeFilters() + ?.toMutableMap() ?: mutableMapOf() - fun globalTrackedEntityFilters(): List<FilterItem> { - val defaultFilters = createDefaultTrackedEntityFilters() + globalTrackedEntityTypeFiltersWebApp.remove(ProgramFilter.ASSIGNED_TO_ME) + globalTrackedEntityTypeFiltersWebApp.remove(ProgramFilter.ENROLLMENT_DATE) - if (webAppIsNotConfigured()) { - if (orgUnitsCount == 1) { - defaultFilters.remove(ProgramFilter.ORG_UNIT) - } - return defaultFilters.values.toList() - } - - val globalTrackedEntityTypeFiltersWebApp = - d2 - .settingModule() - .appearanceSettings() - .getTrackedEntityTypeFilters() - ?.toMutableMap() ?: mutableMapOf() - - globalTrackedEntityTypeFiltersWebApp.remove(ProgramFilter.ASSIGNED_TO_ME) - globalTrackedEntityTypeFiltersWebApp.remove(ProgramFilter.ENROLLMENT_DATE) - - if (orgUnitsCount == 1) { - globalTrackedEntityTypeFiltersWebApp.remove(ProgramFilter.ORG_UNIT) - } - - return getFiltersApplyingWebAppConfig.execute( - defaultFilters, - globalTrackedEntityTypeFiltersWebApp, - ) + if (orgUnitsCount == 1) { + globalTrackedEntityTypeFiltersWebApp.remove(ProgramFilter.ORG_UNIT) } - private fun createDefaultTrackedEntityFilters(): LinkedHashMap<ProgramFilter, FilterItem> = - linkedMapOf( - ProgramFilter.ORG_UNIT to + return getFiltersApplyingWebAppConfig.execute( + defaultFilters, + globalTrackedEntityTypeFiltersWebApp, + ) + } + + private fun createDefaultTrackedEntityFilters(): LinkedHashMap<ProgramFilter, FilterItem> = + linkedMapOf( + ProgramFilter.ORG_UNIT to OrgUnitFilter( FilterManager.getInstance().observeOrgUnitFilters(), ProgramType.TRACKER, @@ -310,50 +314,52 @@ class FilterRepository observableOpenFilter, resources.filterOrgUnitLabel(), ), - ProgramFilter.SYNC_STATUS to + ProgramFilter.SYNC_STATUS to SyncStateFilter( ProgramType.TRACKER, observableSortingInject, observableOpenFilter, resources.filterSyncLabel(), ), - ) + ) - fun dataSetFilters(dataSetUid: String): List<FilterItem> { - val defaultFilters = createDefaultDatasetFilters(dataSetUid) + fun dataSetFilters(dataSetUid: String): List<FilterItem> { + val orgUnitsCount = orgUnitsCount() - if (webAppIsNotConfigured()) { - if (orgUnitsCount == 1) { - defaultFilters.remove(DataSetFilter.ORG_UNIT) - } - return defaultFilters.values.toList() - } - - val datasetFiltersWebApp = - d2 - .settingModule() - .appearanceSettings() - .getDataSetFiltersByUid(dataSetUid) - ?.toMutableMap() ?: mutableMapOf() + val defaultFilters = createDefaultDatasetFilters(dataSetUid) + if (webAppIsNotConfigured()) { if (orgUnitsCount == 1) { - datasetFiltersWebApp.remove(DataSetFilter.ORG_UNIT) + defaultFilters.remove(DataSetFilter.ORG_UNIT) } + return defaultFilters.values.toList() + } - return getFiltersApplyingWebAppConfig.execute(defaultFilters, datasetFiltersWebApp) + val datasetFiltersWebApp = + d2 + .settingModule() + .appearanceSettings() + .getDataSetFiltersByUid(dataSetUid) + ?.toMutableMap() ?: mutableMapOf() + + if (orgUnitsCount == 1) { + datasetFiltersWebApp.remove(DataSetFilter.ORG_UNIT) } - private fun createDefaultDatasetFilters(dataSetUid: String): LinkedHashMap<DataSetFilter, FilterItem> { - val datasetFilters = - linkedMapOf( - DataSetFilter.PERIOD to + return getFiltersApplyingWebAppConfig.execute(defaultFilters, datasetFiltersWebApp) + } + + private fun createDefaultDatasetFilters(dataSetUid: String): LinkedHashMap<DataSetFilter, FilterItem> { + val datasetFilters = + linkedMapOf( + DataSetFilter.PERIOD to PeriodFilter( ProgramType.DATASET, observableSortingInject, observableOpenFilter, resources.filterPeriodLabel(), ), - DataSetFilter.ORG_UNIT to + DataSetFilter.ORG_UNIT to OrgUnitFilter( FilterManager.getInstance().observeOrgUnitFilters(), ProgramType.DATASET, @@ -361,81 +367,82 @@ class FilterRepository observableOpenFilter, resources.filterOrgUnitLabel(), ), - DataSetFilter.SYNC_STATUS to + DataSetFilter.SYNC_STATUS to SyncStateFilter( ProgramType.DATASET, observableSortingInject, observableOpenFilter, resources.filterSyncLabel(), ), - ) + ) - val dataSet = - d2 - .dataSetModule() - .dataSets() - .uid(dataSetUid) - .blockingGet() - val categoryCombo = + val dataSet = + d2 + .dataSetModule() + .dataSets() + .uid(dataSetUid) + .blockingGet() + val categoryCombo = + d2 + .categoryModule() + .categoryCombos() + .uid(dataSet?.categoryCombo()?.uid()) + .blockingGet() + if (categoryCombo?.isDefault == false) { + CatOptionComboFilter( + categoryCombo, d2 .categoryModule() - .categoryCombos() - .uid(dataSet?.categoryCombo()?.uid()) - .blockingGet() - if (categoryCombo?.isDefault == false) { - CatOptionComboFilter( - categoryCombo, - d2 - .categoryModule() - .categoryOptionCombos() - .byCategoryComboUid() - .eq(categoryCombo.uid()) - .blockingGet(), - ProgramType.DATASET, - observableSortingInject, - observableOpenFilter, - categoryCombo.displayName() ?: "", - ).also { datasetFilters[DataSetFilter.CAT_COMBO] = it } - } - - return datasetFilters + .categoryOptionCombos() + .byCategoryComboUid() + .eq(categoryCombo.uid()) + .blockingGet(), + ProgramType.DATASET, + observableSortingInject, + observableOpenFilter, + categoryCombo.displayName() ?: "", + ).also { datasetFilters[DataSetFilter.CAT_COMBO] = it } } - fun homeFilters(): List<FilterItem> { - val defaultFilters = createDefaultHomeFilters() - - if (webAppIsNotConfigured()) { - if (orgUnitsCount == 1) { - defaultFilters.remove(HomeFilter.ORG_UNIT) - } - return defaultFilters.values.toList() - } + return datasetFilters + } - val homeFiltersWebApp = - d2 - .settingModule() - .appearanceSettings() - .getHomeFilters() - ?.toMutableMap() ?: mutableMapOf() + fun homeFilters(): List<FilterItem> { + val orgUnitsCount = orgUnitsCount() + val defaultFilters = createDefaultHomeFilters() + if (webAppIsNotConfigured()) { if (orgUnitsCount == 1) { - homeFiltersWebApp.remove(HomeFilter.ORG_UNIT) + defaultFilters.remove(HomeFilter.ORG_UNIT) } + return defaultFilters.values.toList() + } + + val homeFiltersWebApp = + d2 + .settingModule() + .appearanceSettings() + .getHomeFilters() + ?.toMutableMap() ?: mutableMapOf() - return getFiltersApplyingWebAppConfig.execute(defaultFilters, homeFiltersWebApp) + if (orgUnitsCount == 1) { + homeFiltersWebApp.remove(HomeFilter.ORG_UNIT) } - private fun createDefaultHomeFilters(): LinkedHashMap<HomeFilter, FilterItem> { - val homeFilter = - linkedMapOf( - HomeFilter.DATE to + return getFiltersApplyingWebAppConfig.execute(defaultFilters, homeFiltersWebApp) + } + + private fun createDefaultHomeFilters(): LinkedHashMap<HomeFilter, FilterItem> { + val homeFilter = + linkedMapOf( + HomeFilter.DATE to PeriodFilter( ProgramType.ALL, observableSortingInject, observableOpenFilter, resources.filterDateLabel(), ), - HomeFilter.ORG_UNIT to + HomeFilter.ORG_UNIT to OrgUnitFilter( FilterManager.getInstance().observeOrgUnitFilters(), ProgramType.ALL, @@ -443,367 +450,372 @@ class FilterRepository observableOpenFilter, resources.filterOrgUnitLabel(), ), - HomeFilter.SYNC_STATUS to + HomeFilter.SYNC_STATUS to SyncStateFilter( ProgramType.ALL, observableSortingInject, observableOpenFilter, resources.filterSyncLabel(), ), - ) + ) - val stagesByUserAssignment = - d2 - .programModule() - .programStages() - .byEnableUserAssignment() - .eq(true) - - if (!stagesByUserAssignment.blockingIsEmpty()) { - val assignToMeFilter = - AssignedFilter( - programType = ProgramType.ALL, - sortingItem = observableSortingInject, - openFilter = observableOpenFilter, - filterLabel = resources.filterAssignedToMeLabel(), - ) - homeFilter[HomeFilter.ASSIGNED_TO_ME] = assignToMeFilter - } - return homeFilter + val stagesByUserAssignment = + d2 + .programModule() + .programStages() + .byEnableUserAssignment() + .eq(true) + + if (!stagesByUserAssignment.blockingIsEmpty()) { + val assignToMeFilter = + AssignedFilter( + programType = ProgramType.ALL, + sortingItem = observableSortingInject, + openFilter = observableOpenFilter, + filterLabel = resources.filterAssignedToMeLabel(), + ) + homeFilter[HomeFilter.ASSIGNED_TO_ME] = assignToMeFilter } + return homeFilter + } - private fun webAppIsNotConfigured(): Boolean = !d2.settingModule().appearanceSettings().blockingExists() - - private fun getTrackerFilters(program: Program): List<FilterItem> { - val defaultFilters = createGetDefaultTrackerFilter(program) - - if (webAppIsNotConfigured()) { - if (orgUnitsCount == 1) { - defaultFilters.remove(ProgramFilter.ORG_UNIT) - } - return defaultFilters.values.toList() - } + private fun webAppIsNotConfigured(): Boolean = + !d2.settingModule().appearanceSettings().blockingExists() - val trackerFiltersWebApp = - d2 - .settingModule() - .appearanceSettings() - .getProgramFiltersByUid(program.uid()) - ?.toMutableMap() ?: mutableMapOf() + private fun getTrackerFilters(program: Program): List<FilterItem> { + val orgUnitsCount = orgUnitsCount() + val defaultFilters = createGetDefaultTrackerFilter(program) + if (webAppIsNotConfigured()) { if (orgUnitsCount == 1) { - trackerFiltersWebApp.remove(ProgramFilter.ORG_UNIT) + defaultFilters.remove(ProgramFilter.ORG_UNIT) } + return defaultFilters.values.toList() + } - val filterPreList = - getFiltersApplyingWebAppConfig.execute(defaultFilters, trackerFiltersWebApp) - - if (filterPreList.isEmpty()) { - return mutableListOf() - } + val trackerFiltersWebApp = + d2 + .settingModule() + .appearanceSettings() + .getProgramFiltersByUid(program.uid()) + ?.toMutableMap() ?: mutableMapOf() - return setupUpFollowUpFilter(program, filterPreList.toMutableList()) + if (orgUnitsCount == 1) { + trackerFiltersWebApp.remove(ProgramFilter.ORG_UNIT) } - private fun setupUpFollowUpFilter( - program: Program, - filtersToShow: MutableList<FilterItem>, - ): List<FilterItem> { - val teTypeName = - d2 - .trackedEntityModule() - .trackedEntityTypes() - .uid(program.trackedEntityType()?.uid()) - .blockingGet() - ?.displayName() ?: "" - val followUpFilter = - FollowUpFilter( - ProgramType.TRACKER, - observableSortingInject, - observableOpenFilter, - resources.filterFollowUpLabel(teTypeName), - ) + val filterPreList = + getFiltersApplyingWebAppConfig.execute(defaultFilters, trackerFiltersWebApp) - if (filtersToShow.any { it.type == Filters.ASSIGNED_TO_ME }) { - val index = filtersToShow.indexOfFirst { it.type == Filters.ASSIGNED_TO_ME } - filtersToShow.add(index, followUpFilter) - } else { - filtersToShow.add(followUpFilter) - } - return filtersToShow.toList() + if (filterPreList.isEmpty()) { + return mutableListOf() } - private fun createGetDefaultTrackerFilter(program: Program): LinkedHashMap<ProgramFilter, FilterItem> { - val defaultTrackerFilters = linkedMapOf<ProgramFilter, FilterItem>() - - defaultTrackerFilters[ProgramFilter.EVENT_DATE] = - PeriodFilter( - ProgramType.TRACKER, - observableSortingInject, - observableOpenFilter, - resources.filterEventDateLabel(program.uid()), - ) - defaultTrackerFilters[ProgramFilter.ENROLLMENT_DATE] = - EnrollmentDateFilter( - ProgramType.TRACKER, - observableSortingInject, - observableOpenFilter, - program.displayEnrollmentDateLabel() ?: resources - .filterEnrollmentDateLabel(program.uid()), - ) - defaultTrackerFilters[ProgramFilter.ORG_UNIT] = - OrgUnitFilter( - FilterManager.getInstance().observeOrgUnitFilters(), - ProgramType.TRACKER, - observableSortingInject, - observableOpenFilter, - resources.filterOrgUnitLabel(), - ) - defaultTrackerFilters[ProgramFilter.SYNC_STATUS] = - SyncStateFilter( - ProgramType.TRACKER, - observableSortingInject, - observableOpenFilter, - resources.filterSyncLabel(), - ) - defaultTrackerFilters[ProgramFilter.ENROLLMENT_STATUS] = - EnrollmentStatusFilter( - ProgramType.TRACKER, - observableSortingInject, - observableOpenFilter, - resources.filterEnrollmentStatusLabel(program.uid()), - ) - defaultTrackerFilters[ProgramFilter.EVENT_STATUS] = - EventStatusFilter( - ProgramType.TRACKER, - observableSortingInject, - observableOpenFilter, - resources.filterEventStatusLabel(program.uid()), - ) + return setupUpFollowUpFilter(program, filterPreList.toMutableList()) + } - val stagesByProgramUidAndUserAssignment = - d2 - .programModule() - .programStages() - .byProgramUid() - .eq(program.uid()) - .byEnableUserAssignment() - .eq(true) - - if (!stagesByProgramUidAndUserAssignment.blockingIsEmpty()) { - defaultTrackerFilters[ProgramFilter.ASSIGNED_TO_ME] = - AssignedFilter( - programType = ProgramType.TRACKER, - sortingItem = observableSortingInject, - openFilter = observableOpenFilter, - filterLabel = resources.filterAssignedToMeLabel(), - ) - } + private fun setupUpFollowUpFilter( + program: Program, + filtersToShow: MutableList<FilterItem>, + ): List<FilterItem> { + val teTypeName = + d2 + .trackedEntityModule() + .trackedEntityTypes() + .uid(program.trackedEntityType()?.uid()) + .blockingGet() + ?.displayName() ?: "" + val followUpFilter = + FollowUpFilter( + ProgramType.TRACKER, + observableSortingInject, + observableOpenFilter, + resources.filterFollowUpLabel(teTypeName), + ) - return defaultTrackerFilters + if (filtersToShow.any { it.type == Filters.ASSIGNED_TO_ME }) { + val index = filtersToShow.indexOfFirst { it.type == Filters.ASSIGNED_TO_ME } + filtersToShow.add(index, followUpFilter) + } else { + filtersToShow.add(followUpFilter) } + return filtersToShow.toList() + } - private fun getTrackerWorkingList(program: Program): WorkingListFilter? { - val workingLists = - d2 - .trackedEntityModule() - .trackedEntityInstanceFilters() - .byProgram() - .eq(program.uid()) - .withTrackedEntityInstanceEventFilters() - .blockingGet() - .mapNotNull { teiFilterToWorkingListItemMapper.map(it) } - .toMutableList() - - workingLists.addAll( - d2 - .programModule() - .programStageWorkingLists() - .byProgram() - .eq(program.uid()) - .withAttributeValueFilters() - .blockingGet() - .mapNotNull { programStageToWorkingListItemMapper.map(it) } - .toMutableList(), + private fun createGetDefaultTrackerFilter(program: Program): LinkedHashMap<ProgramFilter, FilterItem> { + val defaultTrackerFilters = linkedMapOf<ProgramFilter, FilterItem>() + + defaultTrackerFilters[ProgramFilter.EVENT_DATE] = + PeriodFilter( + ProgramType.TRACKER, + observableSortingInject, + observableOpenFilter, + resources.filterEventDateLabel(program.uid()), + ) + defaultTrackerFilters[ProgramFilter.ENROLLMENT_DATE] = + EnrollmentDateFilter( + ProgramType.TRACKER, + observableSortingInject, + observableOpenFilter, + program.displayEnrollmentDateLabel() ?: resources + .filterEnrollmentDateLabel(program.uid()), + ) + defaultTrackerFilters[ProgramFilter.ORG_UNIT] = + OrgUnitFilter( + FilterManager.getInstance().observeOrgUnitFilters(), + ProgramType.TRACKER, + observableSortingInject, + observableOpenFilter, + resources.filterOrgUnitLabel(), + ) + defaultTrackerFilters[ProgramFilter.SYNC_STATUS] = + SyncStateFilter( + ProgramType.TRACKER, + observableSortingInject, + observableOpenFilter, + resources.filterSyncLabel(), + ) + defaultTrackerFilters[ProgramFilter.ENROLLMENT_STATUS] = + EnrollmentStatusFilter( + ProgramType.TRACKER, + observableSortingInject, + observableOpenFilter, + resources.filterEnrollmentStatusLabel(program.uid()), + ) + defaultTrackerFilters[ProgramFilter.EVENT_STATUS] = + EventStatusFilter( + ProgramType.TRACKER, + observableSortingInject, + observableOpenFilter, + resources.filterEventStatusLabel(program.uid()), ) - var workingListFilter: WorkingListFilter? = null - if (workingLists.isNotEmpty()) { - workingListFilter = - WorkingListFilter( - workingLists, - ProgramType.TRACKER, - observableSortingInject, - observableOpenFilter, - "", - ) - } - return workingListFilter + val stagesByProgramUidAndUserAssignment = + d2 + .programModule() + .programStages() + .byProgramUid() + .eq(program.uid()) + .byEnableUserAssignment() + .eq(true) + + if (!stagesByProgramUidAndUserAssignment.blockingIsEmpty()) { + defaultTrackerFilters[ProgramFilter.ASSIGNED_TO_ME] = + AssignedFilter( + programType = ProgramType.TRACKER, + sortingItem = observableSortingInject, + openFilter = observableOpenFilter, + filterLabel = resources.filterAssignedToMeLabel(), + ) } - private fun getEventFilters( - program: Program, - programType: ProgramType, - ): List<FilterItem> { - val defaultFilters = createDefaultGetEventFilters(program, programType) - if (webAppIsNotConfigured()) { - if (orgUnitsCount == 1) { - defaultFilters.remove(ProgramFilter.ORG_UNIT) - } - return defaultFilters.values.toMutableList() - } + return defaultTrackerFilters + } - val eventFiltersWebApp = - d2 - .settingModule() - .appearanceSettings() - .getProgramFiltersByUid(program.uid()) - ?.toMutableMap() ?: mutableMapOf() + private fun getTrackerWorkingList(program: Program): WorkingListFilter? { + val workingLists = + d2 + .trackedEntityModule() + .trackedEntityInstanceFilters() + .byProgram() + .eq(program.uid()) + .withTrackedEntityInstanceEventFilters() + .blockingGet() + .mapNotNull { teiFilterToWorkingListItemMapper.map(it) } + .toMutableList() + workingLists.addAll( + d2 + .programModule() + .programStageWorkingLists() + .byProgram() + .eq(program.uid()) + .withAttributeValueFilters() + .blockingGet() + .mapNotNull { programStageToWorkingListItemMapper.map(it) } + .toMutableList(), + ) + + var workingListFilter: WorkingListFilter? = null + if (workingLists.isNotEmpty()) { + workingListFilter = + WorkingListFilter( + workingLists, + ProgramType.TRACKER, + observableSortingInject, + observableOpenFilter, + "", + ) + } + return workingListFilter + } + + private fun getEventFilters( + program: Program, + programType: ProgramType, + ): List<FilterItem> { + val orgUnitsCount = orgUnitsCount() + val defaultFilters = createDefaultGetEventFilters(program, programType) + if (webAppIsNotConfigured()) { if (orgUnitsCount == 1) { - eventFiltersWebApp.remove(ProgramFilter.ORG_UNIT) + defaultFilters.remove(ProgramFilter.ORG_UNIT) } + return defaultFilters.values.toMutableList() + } - val filtersToShow = - getFiltersApplyingWebAppConfig.execute(defaultFilters, eventFiltersWebApp) - - if (filtersToShow.isEmpty()) { - return mutableListOf() - } + val eventFiltersWebApp = + d2 + .settingModule() + .appearanceSettings() + .getProgramFiltersByUid(program.uid()) + ?.toMutableMap() ?: mutableMapOf() - return filtersToShow.toList() + if (orgUnitsCount == 1) { + eventFiltersWebApp.remove(ProgramFilter.ORG_UNIT) } - private fun getEventWorkingList(program: Program): WorkingListFilter? { - var workingListFilter: WorkingListFilter? = null - val workingLists = - d2 - .eventModule() - .eventFilters() - .byProgram() - .eq(program.uid()) - .blockingGet() - .mapNotNull { eventFilterToWorkingListItemMapper.map(it) } - - if (workingLists.isNotEmpty()) { - workingListFilter = - WorkingListFilter( - workingLists, - ProgramType.EVENT, - observableSortingInject, - observableOpenFilter, - "", - ) - } - return workingListFilter + val filtersToShow = + getFiltersApplyingWebAppConfig.execute(defaultFilters, eventFiltersWebApp) + + if (filtersToShow.isEmpty()) { + return mutableListOf() } - private fun createDefaultGetEventFilters( - program: Program, - programType: ProgramType, - ): LinkedHashMap<ProgramFilter, FilterItem> { - val defaultEventFilter = linkedMapOf<ProgramFilter, FilterItem>() + return filtersToShow.toList() + } - defaultEventFilter[ProgramFilter.EVENT_DATE] = - PeriodFilter( - programType, - observableSortingInject, - observableOpenFilter, - resources.filterDateLabel(), - ) + private fun getEventWorkingList(program: Program): WorkingListFilter? { + var workingListFilter: WorkingListFilter? = null + val workingLists = + d2 + .eventModule() + .eventFilters() + .byProgram() + .eq(program.uid()) + .blockingGet() + .mapNotNull { eventFilterToWorkingListItemMapper.map(it) } - defaultEventFilter[ProgramFilter.ORG_UNIT] = - OrgUnitFilter( - FilterManager.getInstance().observeOrgUnitFilters(), - programType, + if (workingLists.isNotEmpty()) { + workingListFilter = + WorkingListFilter( + workingLists, + ProgramType.EVENT, observableSortingInject, observableOpenFilter, - resources.filterOrgUnitLabel(), + "", ) + } + return workingListFilter + } - defaultEventFilter[ProgramFilter.SYNC_STATUS] = - SyncStateFilter( - programType, - observableSortingInject, - observableOpenFilter, - resources.filterSyncLabel(), - ) + private fun createDefaultGetEventFilters( + program: Program, + programType: ProgramType, + ): LinkedHashMap<ProgramFilter, FilterItem> { + val defaultEventFilter = linkedMapOf<ProgramFilter, FilterItem>() + + defaultEventFilter[ProgramFilter.EVENT_DATE] = + PeriodFilter( + programType, + observableSortingInject, + observableOpenFilter, + resources.filterDateLabel(), + ) + + defaultEventFilter[ProgramFilter.ORG_UNIT] = + OrgUnitFilter( + FilterManager.getInstance().observeOrgUnitFilters(), + programType, + observableSortingInject, + observableOpenFilter, + resources.filterOrgUnitLabel(), + ) + + defaultEventFilter[ProgramFilter.SYNC_STATUS] = + SyncStateFilter( + programType, + observableSortingInject, + observableOpenFilter, + resources.filterSyncLabel(), + ) + + defaultEventFilter[ProgramFilter.EVENT_STATUS] = + EventStatusFilter( + programType, + observableSortingInject, + observableOpenFilter, + resources.filterEventStatusLabel(program.uid()), + ) - defaultEventFilter[ProgramFilter.EVENT_STATUS] = - EventStatusFilter( + val stagesByProgramAndUserAssignment = + d2 + .programModule() + .programStages() + .byProgramUid() + .eq(program.uid()) + .byEnableUserAssignment() + .eq(true) + + if (!stagesByProgramAndUserAssignment.blockingIsEmpty()) { + defaultEventFilter[ProgramFilter.ASSIGNED_TO_ME] = + AssignedFilter( + programType = programType, + sortingItem = observableSortingInject, + openFilter = observableOpenFilter, + filterLabel = resources.filterAssignedToMeLabel(), + ) + } + val categoryCombo = + d2 + .categoryModule() + .categoryCombos() + .uid(program.categoryCombo()?.uid()) + .blockingGet() + if (categoryCombo?.isDefault == false) { + defaultEventFilter[ProgramFilter.CAT_COMBO] = + CatOptionComboFilter( + categoryCombo, + d2 + .categoryModule() + .categoryOptionCombos() + .byCategoryComboUid() + .eq(categoryCombo.uid()) + .blockingGet(), programType, observableSortingInject, observableOpenFilter, - resources.filterEventStatusLabel(program.uid()), + categoryCombo.displayName() ?: "", ) - - val stagesByProgramAndUserAssignment = - d2 - .programModule() - .programStages() - .byProgramUid() - .eq(program.uid()) - .byEnableUserAssignment() - .eq(true) - - if (!stagesByProgramAndUserAssignment.blockingIsEmpty()) { - defaultEventFilter[ProgramFilter.ASSIGNED_TO_ME] = - AssignedFilter( - programType = programType, - sortingItem = observableSortingInject, - openFilter = observableOpenFilter, - filterLabel = resources.filterAssignedToMeLabel(), - ) - } - val categoryCombo = - d2 - .categoryModule() - .categoryCombos() - .uid(program.categoryCombo()?.uid()) - .blockingGet() - if (categoryCombo?.isDefault == false) { - defaultEventFilter[ProgramFilter.CAT_COMBO] = - CatOptionComboFilter( - categoryCombo, - d2 - .categoryModule() - .categoryOptionCombos() - .byCategoryComboUid() - .eq(categoryCombo.uid()) - .blockingGet(), - programType, - observableSortingInject, - observableOpenFilter, - categoryCombo.displayName() ?: "", - ) - } - return defaultEventFilter } + return defaultEventFilter + } - fun applyWorkingList( - teiQuery: TrackedEntitySearchCollectionRepository, - currentWorkingList: WorkingListItem?, - ): TrackedEntitySearchCollectionRepository = - currentWorkingList?.let { - when (it) { - is EventWorkingList -> - null - is ProgramStageWorkingList -> - teiQuery.byProgramStageWorkingList().eq(it.uid) - is TrackedEntityInstanceWorkingList -> - teiQuery.byTrackedEntityInstanceFilter().eq(it.uid) - } - } ?: teiQuery - - fun applyWorkingList( - eventQuery: EventQueryCollectionRepository, - currentWorkingList: WorkingListItem?, - ): EventQueryCollectionRepository = - currentWorkingList?.let { - eventQuery.byEventFilter().eq(it.uid) - } ?: eventQuery - - fun collapseAllFilters() { - observableOpenFilter.set(Filters.NON) - } + fun applyWorkingList( + teiQuery: TrackedEntitySearchCollectionRepository, + currentWorkingList: WorkingListItem?, + ): TrackedEntitySearchCollectionRepository = + currentWorkingList?.let { + when (it) { + is EventWorkingList -> + null + + is ProgramStageWorkingList -> + teiQuery.byProgramStageWorkingList().eq(it.uid) + + is TrackedEntityInstanceWorkingList -> + teiQuery.byTrackedEntityInstanceFilter().eq(it.uid) + } + } ?: teiQuery + + fun applyWorkingList( + eventQuery: EventQueryCollectionRepository, + currentWorkingList: WorkingListItem?, + ): EventQueryCollectionRepository = + currentWorkingList?.let { + eventQuery.byEventFilter().eq(it.uid) + } ?: eventQuery + + fun collapseAllFilters() { + observableOpenFilter.set(Filters.NON) } +} From 2c7b410e7bd57c981b35ab63653f9606c0710b4a Mon Sep 17 00:00:00 2001 From: Ferdy Rodriguez <ferdyrodriguez@gmail.com> Date: Tue, 26 May 2026 14:43:26 +0200 Subject: [PATCH 237/260] Automatically select the first map layer that have data, ignoring the empty prior layers (#4882) --- .../searchTrackEntity/MapDataRepository.kt | 31 ++++++++++---- .../searchTrackEntity/SearchTEIViewModel.kt | 11 +++-- .../searchTrackEntity/mapView/SearchTEMap.kt | 26 ++++++------ .../org/dhis2/maps/managers/TeiMapManager.kt | 42 +++++++++++++++++++ 4 files changed, 87 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/MapDataRepository.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/MapDataRepository.kt index c08b0304a96..6dd1b2908f7 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/MapDataRepository.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/MapDataRepository.kt @@ -8,6 +8,7 @@ import org.dhis2.maps.geometry.mapper.featurecollection.MapCoordinateFieldToFeat import org.dhis2.maps.geometry.mapper.featurecollection.MapTeiEventsToFeatureCollection import org.dhis2.maps.geometry.mapper.featurecollection.MapTeisToFeatureCollection import org.dhis2.maps.layer.MapLayer +import org.dhis2.maps.layer.types.FieldMapLayer import org.dhis2.maps.utils.DhisMapUtils import org.hisp.dhis.android.core.program.Program import org.maplibre.geojson.FeatureCollection @@ -54,14 +55,30 @@ class MapDataRepository( val eventsByProgramStage = mapTeiEventsToFeatureCollection.map(mapEvents).component1() + val noFieldLayers = layersVisibility.values.none { it is FieldMapLayer } + val anyLayerVisible = layersVisibility.values.any { it.visible } + val teiItems = mapTeis.filterTeiByLayerVisibility(layersVisibility, coordinateAttributes) + val eventItems = mapEvents.filterTrackerEventsByLayerVisibility(layersVisibility, coordinateDataElements) + val relationshipItems = mapRelationships.filterRelationshipsByLayerVisibility(layersVisibility) + val extraTeis = + if (noFieldLayers && anyLayerVisible) { + mapTeis.filter { tei -> + tei !in teiItems && coordinateAttributes.any { it.tei.uid() == tei.uid } + } + } else { + emptyList() + } + val extraEvents = + if (noFieldLayers && anyLayerVisible) { + mapEvents.filter { event -> + event !in eventItems && coordinateDataElements.any { it.event.uid() == event.uid } + } + } else { + emptyList() + } + return TrackerMapData( - mapItems = - mapTeis.filterTeiByLayerVisibility(layersVisibility, coordinateAttributes) + - mapEvents.filterTrackerEventsByLayerVisibility( - layersVisibility, - coordinateDataElements, - ) + - mapRelationships.filterRelationshipsByLayerVisibility(layersVisibility), + mapItems = teiItems + extraTeis + eventItems + extraEvents + relationshipItems, eventFeatures = eventsByProgramStage, teiFeatures = teiFeatureCollection.first, teiBoundingBox = teiFeatureCollection.second, diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt index 93d48a728c2..667342de8f7 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt @@ -18,6 +18,7 @@ import androidx.lifecycle.viewModelScope import androidx.paging.PagingData import androidx.paging.cachedIn import androidx.paging.map +import kotlinx.coroutines.CancellationException import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.Job import kotlinx.coroutines.async @@ -25,6 +26,8 @@ import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.emitAll import kotlinx.coroutines.flow.emptyFlow @@ -119,8 +122,8 @@ class SearchTEIViewModel( private val _refreshData = MutableLiveData(Unit) val refreshData: LiveData<Unit> = _refreshData - private val _mapResults = Channel<TrackerMapData>() - val mapResults: Flow<TrackerMapData> = _mapResults.receiveAsFlow() + private val _mapResults = MutableSharedFlow<TrackerMapData>(replay = 1) + val mapResults: SharedFlow<TrackerMapData> = _mapResults.asSharedFlow() private val _mapItemClicked = MutableSharedFlow<String>() val mapItemClicked: Flow<String> = _mapItemClicked @@ -662,7 +665,9 @@ class SearchTEIViewModel( queryDataAsMap(), layersVisibility, ) - _mapResults.send(data) + _mapResults.emit(data) + } catch (e: CancellationException) { + throw e } catch (e: Exception) { Timber.e(e) } finally { diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/mapView/SearchTEMap.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/mapView/SearchTEMap.kt index 27b88c4f36e..9430ca5cf8e 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/mapView/SearchTEMap.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/mapView/SearchTEMap.kt @@ -12,9 +12,7 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Icon import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.ComposeView @@ -132,9 +130,7 @@ class SearchTEMap : FragmentGlobalAbstract() { val listState = rememberLazyListState() val trackerMapData by viewModel.mapResults.collectAsState(initial = null) - val items by remember { - derivedStateOf { trackerMapData?.mapItems ?: emptyList() } - } + val items = trackerMapData?.mapItems ?: emptyList() val clickedItem by viewModel.mapItemClicked.collectAsState(initial = null) @@ -150,17 +146,21 @@ class SearchTEMap : FragmentGlobalAbstract() { } } - LaunchedEffect(key1 = items) { + LaunchedEffect(key1 = trackerMapData) { trackerMapData?.let { data -> teiMapManager ?.takeIf { it.isMapReady() } - ?.update( - data.teiFeatures, - data.eventFeatures, - data.dataElementFeaturess, - data.teiBoundingBox, - ).also { - viewModel.mapManager = teiMapManager + ?.also { manager -> + manager.update( + data.teiFeatures, + data.eventFeatures, + data.dataElementFeaturess, + data.teiBoundingBox, + ) + if (manager.autoSelectFirstLayerWithData()) { + viewModel.filterVisibleMapItems(manager.mapLayerManager.mapLayers) + } + viewModel.mapManager = manager } } } diff --git a/dhis2_android_maps/src/main/java/org/dhis2/maps/managers/TeiMapManager.kt b/dhis2_android_maps/src/main/java/org/dhis2/maps/managers/TeiMapManager.kt index ce49e1481de..838c66bc95f 100644 --- a/dhis2_android_maps/src/main/java/org/dhis2/maps/managers/TeiMapManager.kt +++ b/dhis2_android_maps/src/main/java/org/dhis2/maps/managers/TeiMapManager.kt @@ -39,6 +39,7 @@ class TeiMapManager( private var fieldFeatureCollections: Map<String, FeatureCollection> = emptyMap() private var teiFeatureCollections: HashMap<String, FeatureCollection>? = null private var eventsFeatureCollection: Map<String, FeatureCollection>? = null + private var hasPerformedInitialAutoSelection = false var mapStyle: MapStyle? = null private var teiImages: HashMap<String, Bitmap> = hashMapOf() var teiFeatureType: FeatureType? = FeatureType.POINT @@ -300,6 +301,47 @@ class TeiMapManager( return wrappedDrawable } + fun autoSelectFirstLayerWithData(): Boolean { + if (hasPerformedInitialAutoSelection) return false + hasPerformedInitialAutoSelection = true + + val firstSource = findFirstSourceWithData() ?: return false + + mapLayerManager.mapLayers.keys.forEach { sourceId -> + mapLayerManager.handleLayer(sourceId, sourceId == firstSource) + } + return true + } + + private fun findFirstSourceWithData(): String? { + listOf(TEIS_SOURCE_ID, ENROLLMENT_SOURCE_ID).forEach { sourceId -> + if (teiFeatureCollections?.get(sourceId)?.features()?.isNotEmpty() == true && + mapLayerManager.mapLayers.containsKey(sourceId) + ) return sourceId + } + eventsFeatureCollection?.forEach { (sourceId, fc) -> + if (fc.features()?.isNotEmpty() == true && mapLayerManager.mapLayers.containsKey(sourceId)) { + return sourceId + } + } + fieldFeatureCollections.forEach { (sourceId, fc) -> + if (fc.features()?.isNotEmpty() == true && mapLayerManager.mapLayers.containsKey(sourceId)) { + return sourceId + } + } + teiFeatureCollections + ?.filterKeys { + it != TEIS_SOURCE_ID && + it != ENROLLMENT_SOURCE_ID && + eventsFeatureCollection?.containsKey(it) == false + }?.forEach { (sourceId, fc) -> + if (fc.features()?.isNotEmpty() == true && mapLayerManager.mapLayers.containsKey(sourceId)) { + return sourceId + } + } + return null + } + override fun findFeature( source: String, propertyName: String, From 0cdb02f419a60217c758e759b00040bb89b2354e Mon Sep 17 00:00:00 2001 From: Pablo <pablo@dhis2.org> Date: Thu, 28 May 2026 08:27:04 +0200 Subject: [PATCH 238/260] fix: [ANDROAPP-7601] Blank screen upon rotation in MainActivity (#4878) --- .../org/dhis2/usescases/main/MainActivity.kt | 18 +++++++++++++++++- .../org/dhis2/usescases/main/MainNavigator.kt | 6 +++++- .../org/dhis2/usescases/main/MainViewModel.kt | 6 +++++- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/dhis2/usescases/main/MainActivity.kt b/app/src/main/java/org/dhis2/usescases/main/MainActivity.kt index c113b086db6..988e45bba5c 100644 --- a/app/src/main/java/org/dhis2/usescases/main/MainActivity.kt +++ b/app/src/main/java/org/dhis2/usescases/main/MainActivity.kt @@ -127,6 +127,14 @@ class MainActivity : ActivityGlobalAbstract() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + // On recreation (e.g. rotation), the ViewModel survives but its MainNavigator holds a + // stale FragmentManager from the destroyed Activity. Update it before rendering so any + // fragment transaction below uses the correct, live FragmentManager. + var needsScreenRefresh = savedInstanceState != null + if (needsScreenRefresh) { + mainViewModel.mainNavigator.updateFragmentManager(supportFragmentManager) + } + setContent { DHIS2Theme { val screenState by mainViewModel.homeScreenState.collectAsState() @@ -173,7 +181,15 @@ class MainActivity : ActivityGlobalAbstract() { } navigationId?.let { changeFragment(it) - initCurrentScreen() + // On recreation the ViewModel screen hasn't changed so + // navigateToScreen() would early-return without ever opening the + // fragment. Bypass it once to repopulate the fresh container. + if (needsScreenRefresh) { + needsScreenRefresh = false + mainViewModel.refreshCurrentScreen() + } else { + initCurrentScreen() + } } }, onLayoutInflated = { diff --git a/app/src/main/java/org/dhis2/usescases/main/MainNavigator.kt b/app/src/main/java/org/dhis2/usescases/main/MainNavigator.kt index a7f3912affd..2cefd21ed02 100644 --- a/app/src/main/java/org/dhis2/usescases/main/MainNavigator.kt +++ b/app/src/main/java/org/dhis2/usescases/main/MainNavigator.kt @@ -13,11 +13,15 @@ import org.dhis2.usescases.settings.SyncManagerFragment import org.dhis2.usescases.troubleshooting.TroubleshootingFragment class MainNavigator( - private val fragmentManager: FragmentManager, + private var fragmentManager: FragmentManager, ) { private var currentFragment: Fragment? = null private var lastHomeFragment: Fragment? = null + fun updateFragmentManager(fm: FragmentManager) { + fragmentManager = fm + } + fun getCurrentIfProgram(): ProgramFragment? = currentFragment?.takeIf { it is ProgramFragment } as? ProgramFragment diff --git a/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt b/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt index 02a2eeddcd6..cbbbac8702b 100644 --- a/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt @@ -6,7 +6,6 @@ import androidx.core.net.toUri import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.channels.Channel -import kotlinx.coroutines.withContext import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.launchIn @@ -16,6 +15,7 @@ import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update import kotlinx.coroutines.reactive.asFlow +import kotlinx.coroutines.withContext import org.dhis2.commons.filters.FilterManager import org.dhis2.commons.matomo.Actions.Companion.BLOCK_SESSION_PIN import org.dhis2.commons.matomo.Actions.Companion.OPEN_ANALYTICS @@ -421,6 +421,10 @@ class MainViewModel( } } + fun refreshCurrentScreen() { + openScreen(_homeScreenState.value.currentScreen) + } + fun onGranularSyncFinished(hasChanged: Boolean) { launchUseCase(dispatcher.io()) { if (hasChanged) { From 71648c95f9690bdd6e58f34ae84bc671d9127523 Mon Sep 17 00:00:00 2001 From: Xavier Molloy <xavi@dhis2.org> Date: Thu, 28 May 2026 11:03:04 +0200 Subject: [PATCH 239/260] fix: [ANDROAPP-7572] Use owner org unit for new events (#4879) * fix: [ANDROAPP-7572] Use owner org unit if assigned for creating new events * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * fix: [ANDROAPP-7572] Create tests, ktlint --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../teidata/TEIDataPresenter.kt | 12 ++- .../teidata/TeiDataRepository.kt | 2 + .../teidata/TeiDataRepositoryImpl.kt | 14 +++ .../data/TeiDataPresenterTest.kt | 97 +++++++++++++++++++ 4 files changed, 122 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataPresenter.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataPresenter.kt index 325caeabcff..1beb0ac69e8 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataPresenter.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataPresenter.kt @@ -414,9 +414,15 @@ class TEIDataPresenter( when (eventCreationType) { EventCreationType.ADDNEW -> programUid?.let { program -> - val orgUnitUid = d2.enrollment(enrollmentUid)?.organisationUnit() - orgUnitUid?.let { onNewEventSelected(orgUnitUid, stage.uid()) } - ?: checkOrgUnitCount(program, stage.uid()) + CoroutineScope(dispatcher.io()).launch { + val enrollmentOrgUnitUid = d2.enrollment(enrollmentUid)?.organisationUnit() + val ownerOrgUnit = teiDataRepository.ownerOrgUnit(teiUid) + val eventOrgUnit = ownerOrgUnit ?: enrollmentOrgUnitUid + withContext(dispatcher.ui()) { + eventOrgUnit?.let { onNewEventSelected(eventOrgUnit, stage.uid()) } + ?: checkOrgUnitCount(program, stage.uid()) + } + } } EventCreationType.SCHEDULE -> { diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TeiDataRepository.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TeiDataRepository.kt index 1079c7bb338..77641689f9b 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TeiDataRepository.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TeiDataRepository.kt @@ -32,6 +32,8 @@ interface TeiDataRepository { fun displayOrganisationUnit(programUid: String): Boolean + fun ownerOrgUnit(teiUid: String): String? + fun enrollmentOrgUnitInCaptureScope(enrollmentOrgUnit: String): Boolean fun programOrgListInCaptureScope(programUid: String): List<OrganisationUnit> diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TeiDataRepositoryImpl.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TeiDataRepositoryImpl.kt index 73a5731d2b0..64385dbe08e 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TeiDataRepositoryImpl.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TeiDataRepositoryImpl.kt @@ -544,6 +544,20 @@ class TeiDataRepositoryImpl( .byProgramUids(listOf(programUid)) .blockingCount() > 1 + override fun ownerOrgUnit(teiUid: String): String? { + + return d2 + .trackedEntityModule() + .trackedEntityInstances() + .withProgramOwners() + .uid(teiUid) + .blockingGet() + ?.programOwners() + ?.firstOrNull { + it.trackedEntityInstance() == teiUid + }?.ownerOrgUnit() + } + override fun enrollmentOrgUnitInCaptureScope(enrollmentOrgUnit: String): Boolean = !getOrgUnitCollectionRepositoryByCaptureScope() .byUid() diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/data/TeiDataPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/data/TeiDataPresenterTest.kt index 4490d8e7ce8..2fe28392f1a 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/data/TeiDataPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/data/TeiDataPresenterTest.kt @@ -400,6 +400,103 @@ class TeiDataPresenterTest { verify(teiDataContractHandler).createEvent(any()) } + @Test + fun `should use enrollment org unit when owner org unit is null`() = + runBlocking { + val enrollmentOrgUnitUid = "enrollmentOrgUnit" + val programStageUid = "programStageUid" + val eventUid = "eventUid" + val programStage = ProgramStage.builder().uid(programStageUid).build() + + val mockedEnrollment: Enrollment = + mock { + on { organisationUnit() } doReturn enrollmentOrgUnitUid + } + whenever(d2.enrollment(enrollmentUid)) doReturn mockedEnrollment + whenever(teiDataRepository.ownerOrgUnit(teiUid)) doReturn null + whenever( + createEventUseCase.invoke( + programUid, + enrollmentOrgUnitUid, + programStageUid, + enrollmentUid, + ), + ) doReturn Result.success(eventUid) + + teiDataPresenter.onAddNewEventOptionSelected( + eventCreationType = EventCreationType.ADDNEW, + stage = programStage, + ) + + verify(createEventUseCase).invoke(programUid, enrollmentOrgUnitUid, programStageUid, enrollmentUid) + verify(view).goToEventDetails(eventUid, EventMode.NEW, programUid) + } + + @Test + fun `should use owner org unit when it is the same as enrollment org unit`() = + runBlocking { + val orgUnitUid = "enrollmentOrgUnit" + val programStageUid = "programStageUid" + val eventUid = "eventUid" + val programStage = ProgramStage.builder().uid(programStageUid).build() + + val mockedEnrollment: Enrollment = + mock { + on { organisationUnit() } doReturn orgUnitUid + } + whenever(d2.enrollment(enrollmentUid)) doReturn mockedEnrollment + whenever(teiDataRepository.ownerOrgUnit(teiUid)) doReturn orgUnitUid + whenever( + createEventUseCase.invoke( + programUid, + orgUnitUid, + programStageUid, + enrollmentUid, + ), + ) doReturn Result.success(eventUid) + + teiDataPresenter.onAddNewEventOptionSelected( + eventCreationType = EventCreationType.ADDNEW, + stage = programStage, + ) + + verify(createEventUseCase).invoke(programUid, orgUnitUid, programStageUid, enrollmentUid) + verify(view).goToEventDetails(eventUid, EventMode.NEW, programUid) + } + + @Test + fun `should use owner org unit when it is different from enrollment org unit`() = + runBlocking { + val enrollmentOrgUnitUid = "enrollmentOrgUnit" + val ownerOrgUnitUid = "ownerOrgUnit" + val programStageUid = "programStageUid" + val eventUid = "eventUid" + val programStage = ProgramStage.builder().uid(programStageUid).build() + + val mockedEnrollment: Enrollment = + mock { + on { organisationUnit() } doReturn enrollmentOrgUnitUid + } + whenever(d2.enrollment(enrollmentUid)) doReturn mockedEnrollment + whenever(teiDataRepository.ownerOrgUnit(teiUid)) doReturn ownerOrgUnitUid + whenever( + createEventUseCase.invoke( + programUid, + ownerOrgUnitUid, + programStageUid, + enrollmentUid, + ), + ) doReturn Result.success(eventUid) + + teiDataPresenter.onAddNewEventOptionSelected( + eventCreationType = EventCreationType.ADDNEW, + stage = programStage, + ) + + verify(createEventUseCase).invoke(programUid, ownerOrgUnitUid, programStageUid, enrollmentUid) + verify(view).goToEventDetails(eventUid, EventMode.NEW, programUid) + } + private fun fakeModel( eventCount: Int = 0, type: EventViewModelType = EventViewModelType.STAGE, From 6ab61c3f24b746a801a9bbe26bdd4e3cb8b0429a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manu=20Mu=C3=B1oz?= <manu.munoz@dhis2.org> Date: Thu, 28 May 2026 14:32:41 +0200 Subject: [PATCH 240/260] fix: [ANDROAPP-7352] add ALL in authority checks (#4881) --- .../org/dhis2/data/dhislogic/Authorities.kt | 2 ++ .../DataSetDetailRepositoryImpl.java | 7 ++++++- .../teiDashboard/DashboardRepositoryImpl.kt | 7 +++++-- .../DataSetDetailRepositoryTest.kt | 17 +++++++++-------- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/dhis2/data/dhislogic/Authorities.kt b/app/src/main/java/org/dhis2/data/dhislogic/Authorities.kt index ed6318c7bec..352f3e33686 100644 --- a/app/src/main/java/org/dhis2/data/dhislogic/Authorities.kt +++ b/app/src/main/java/org/dhis2/data/dhislogic/Authorities.kt @@ -3,3 +3,5 @@ package org.dhis2.data.dhislogic const val AUTH_DATAVALUE_ADD = "F_DATAVALUE_ADD" const val AUTH_UNCOMPLETE_EVENT = "F_UNCOMPLETE_EVENT" const val AUTH_ALL = "ALL" +const val AUTH_ENROLLMENT_CASCADE_DELETE = "F_ENROLLMENT_CASCADE_DELETE" +const val AUTH_TEI_CASCADE_DELETE = "F_TEI_CASCADE_DELETE" diff --git a/app/src/main/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailRepositoryImpl.java b/app/src/main/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailRepositoryImpl.java index cbb88bb39bc..e91e260d705 100644 --- a/app/src/main/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailRepositoryImpl.java +++ b/app/src/main/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailRepositoryImpl.java @@ -1,5 +1,6 @@ package org.dhis2.usescases.datasets.datasetDetail; +import static org.dhis2.data.dhislogic.AuthoritiesKt.AUTH_ALL; import static org.dhis2.data.dhislogic.AuthoritiesKt.AUTH_DATAVALUE_ADD; import org.dhis2.commons.resources.DhisPeriodUtils; @@ -147,7 +148,11 @@ public Flowable<Boolean> canWriteAny() { } private boolean hasDataValueAuthority() { - return !d2.userModule().authorities().byName().eq(AUTH_DATAVALUE_ADD).blockingIsEmpty(); + return !d2.userModule() + .authorities() + .byName() + .in(AUTH_DATAVALUE_ADD, AUTH_ALL) + .blockingIsEmpty(); } @Override diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepositoryImpl.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepositoryImpl.kt index 74da93816da..63a78db477e 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepositoryImpl.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepositoryImpl.kt @@ -12,6 +12,9 @@ import org.dhis2.commons.featureconfig.data.FeatureConfigRepository import org.dhis2.commons.prefs.Preference import org.dhis2.commons.prefs.PreferenceProvider import org.dhis2.commons.resources.MetadataIconProvider +import org.dhis2.data.dhislogic.AUTH_ALL +import org.dhis2.data.dhislogic.AUTH_ENROLLMENT_CASCADE_DELETE +import org.dhis2.data.dhislogic.AUTH_TEI_CASCADE_DELETE import org.dhis2.mobile.commons.model.MetadataIconData import org.dhis2.utils.ValueUtils import org.hisp.dhis.android.core.D2 @@ -643,7 +646,7 @@ class DashboardRepositoryImpl( .userModule() .authorities() .byName() - .eq("F_TEI_CASCADE_DELETE") + .`in`(AUTH_TEI_CASCADE_DELETE, AUTH_ALL) .one() .blockingExists() @@ -671,7 +674,7 @@ class DashboardRepositoryImpl( .userModule() .authorities() .byName() - .eq("F_ENROLLMENT_CASCADE_DELETE") + .`in`(AUTH_ENROLLMENT_CASCADE_DELETE, AUTH_ALL) .one() .blockingExists() diff --git a/app/src/test/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailRepositoryTest.kt index c4bd86431a0..466ed46772e 100644 --- a/app/src/test/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailRepositoryTest.kt @@ -3,6 +3,7 @@ package org.dhis2.usescases.datasets.datasetDetail import dhis2.org.analytics.charts.Charts import io.reactivex.Single import org.dhis2.commons.resources.DhisPeriodUtils +import org.dhis2.data.dhislogic.AUTH_ALL import org.dhis2.data.dhislogic.AUTH_DATAVALUE_ADD import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.category.CategoryCombo @@ -103,14 +104,14 @@ class DataSetDetailRepositoryTest { .userModule() .authorities() .byName() - .eq(AUTH_DATAVALUE_ADD), + .`in`(AUTH_DATAVALUE_ADD, AUTH_ALL), ) doReturn mock() whenever( d2 .userModule() .authorities() .byName() - .eq(AUTH_DATAVALUE_ADD) + .`in`(AUTH_DATAVALUE_ADD, AUTH_ALL) .blockingIsEmpty(), ) doReturn false @@ -165,14 +166,14 @@ class DataSetDetailRepositoryTest { .userModule() .authorities() .byName() - .eq(AUTH_DATAVALUE_ADD), + .`in`(AUTH_DATAVALUE_ADD, AUTH_ALL), ) doReturn mock() whenever( d2 .userModule() .authorities() .byName() - .eq(AUTH_DATAVALUE_ADD) + .`in`(AUTH_DATAVALUE_ADD, AUTH_ALL) .blockingIsEmpty(), ) doReturn true @@ -235,14 +236,14 @@ class DataSetDetailRepositoryTest { .userModule() .authorities() .byName() - .eq(AUTH_DATAVALUE_ADD), + .`in`(AUTH_DATAVALUE_ADD, AUTH_ALL), ) doReturn mock() whenever( d2 .userModule() .authorities() .byName() - .eq(AUTH_DATAVALUE_ADD) + .`in`(AUTH_DATAVALUE_ADD, AUTH_ALL) .blockingIsEmpty(), ) doReturn false @@ -311,14 +312,14 @@ class DataSetDetailRepositoryTest { .userModule() .authorities() .byName() - .eq(AUTH_DATAVALUE_ADD), + .`in`(AUTH_DATAVALUE_ADD, AUTH_ALL), ) doReturn mock() whenever( d2 .userModule() .authorities() .byName() - .eq(AUTH_DATAVALUE_ADD) + .`in`(AUTH_DATAVALUE_ADD, AUTH_ALL) .blockingIsEmpty(), ) doReturn false From 0c13d5091cab97445d99dd23842fb2552c7baa4a Mon Sep 17 00:00:00 2001 From: Pablo <pablo@dhis2.org> Date: Fri, 29 May 2026 07:03:04 +0200 Subject: [PATCH 241/260] fix:[ANDROAPP-7632] Capture conscrypt crash (#4886) Signed-off-by: Pablo Pajuelo Cabezas <pablo@dhis2.org> --- .../main/java/org/dhis2/data/server/SSLContextInitializer.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/dhis2/data/server/SSLContextInitializer.kt b/app/src/main/java/org/dhis2/data/server/SSLContextInitializer.kt index 648fc44d02e..00aa4ede100 100644 --- a/app/src/main/java/org/dhis2/data/server/SSLContextInitializer.kt +++ b/app/src/main/java/org/dhis2/data/server/SSLContextInitializer.kt @@ -17,7 +17,7 @@ object SSLContextInitializer { } try { Security.insertProviderAt(Conscrypt.newProvider(), 1) - } catch (e: Exception) { + } catch (e: Throwable) { Timber.e(SSLContextInitializer::class.java.simpleName, e.toString()) } } From acb3e5af421fa606c67ddda915e87d2c12a70b17 Mon Sep 17 00:00:00 2001 From: Ferdy Rodriguez <ferdyrodriguez@gmail.com> Date: Fri, 29 May 2026 14:51:52 +0200 Subject: [PATCH 242/260] fix: [ANDROAPP-7446] Validates the can create without searching setting on refresh data (#4852) * validates the setting can create without searching on refresh data * Updates test * fix: [ANDROAPP-7446] Adapt loadSearchResults logic * fix: [ANDROAPP-7446] Display front page list correctly * fix: [ANDROAPP-7446] fix test --------- Co-authored-by: Xavier Molloy <xavi@dhis2.org> --- .../usescases/searchte/robot/FilterRobot.kt | 3 +- .../searchTrackEntity/SearchTEIViewModel.kt | 37 +++++++++++++------ .../main/res/layout-land/activity_search.xml | 3 +- .../SearchTEIViewModelTest.kt | 1 + 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/FilterRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/FilterRobot.kt index a25ea3b6157..753ad5101e1 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/FilterRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/FilterRobot.kt @@ -16,7 +16,6 @@ import androidx.test.espresso.contrib.PickerActions import androidx.test.espresso.contrib.RecyclerViewActions.actionOnItem import androidx.test.espresso.matcher.ViewMatchers.hasDescendant import androidx.test.espresso.matcher.ViewMatchers.isDisplayed -import androidx.test.espresso.matcher.ViewMatchers.withChild import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withParent import androidx.test.espresso.matcher.ViewMatchers.withText @@ -151,7 +150,7 @@ class FilterRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { withParent(withId(R.id.mainToolbar)) ) ) - .check(matches(withChild(withText(filterCount)))) + .check(matches(hasDescendant(withText(filterCount)))) } fun checkCountAtFilter(filter: String, count: String) { diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt index 667342de8f7..5949cfa67df 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt @@ -177,7 +177,7 @@ class SearchTEIViewModel( emitAll( when { searching -> loadSearchResults() - displayFrontPageList() -> loadDisplayInListResults() + shouldDisplayFrontPageList() -> loadDisplayInListResults() else -> emptyFlow() }, ) @@ -445,7 +445,7 @@ class SearchTEIViewModel( } fun refreshData() { - performSearch() + if(shouldDisplayFrontPageList()) performSearch() } private fun updateQuery( @@ -678,15 +678,18 @@ class SearchTEIViewModel( } fun onSearch() { - searchRepository.clearFetchedList() - performSearch() + if(hasMinNumberOfAttributesToSearch()) { + searchRepository.clearFetchedList() + performSearch() + } else { + displayNotEnoughAttributesToSearchMessage() + } } private fun performSearch() { viewModelScope.launch(dispatchers.io()) { CoroutineTracker.increment() try { - if (canPerformSearch()) { searching = queryDataList.isNotEmpty() searchParametersUiState = searchParametersUiState.copy( @@ -708,7 +711,19 @@ class SearchTEIViewModel( else -> searching = false } - } else { + + } catch (e: Exception) { + Timber.d(e) + } finally { + CoroutineTracker.decrement() + } + } + } + + private fun displayNotEnoughAttributesToSearchMessage() { + viewModelScope.launch(dispatchers.io()) { + CoroutineTracker.increment() + try { val minAttributesToSearch = searchRepository .getProgram(initialProgramUid) @@ -725,7 +740,6 @@ class SearchTEIViewModel( setSearchScreen() _refreshData.postValue(Unit) onNewSearch.emit(Unit) - } } catch (e: Exception) { Timber.d(e) } finally { @@ -734,14 +748,15 @@ class SearchTEIViewModel( } } - private fun canPerformSearch(): Boolean = minAttributesToSearchCheck() || displayFrontPageList() + private fun shouldDisplayFrontPageList(): Boolean = + displayFrontPageListSettingIsConfigured() - private fun minAttributesToSearchCheck(): Boolean = + private fun hasMinNumberOfAttributesToSearch(): Boolean = searchRepository.getProgram(initialProgramUid)?.let { program -> (program.minAttributesRequiredToSearch() ?: 0) <= queryDataList.size } ?: true - private fun displayFrontPageList(): Boolean = + private fun displayFrontPageListSettingIsConfigured(): Boolean = searchRepository.getProgram(initialProgramUid)?.let { program -> program.displayFrontPageList() == true && queryDataList.isEmpty() } ?: false @@ -851,7 +866,7 @@ class SearchTEIViewModel( hasProgramResults, hasGlobalResults, ) - } else if (displayFrontPageList()) { + } else if (shouldDisplayFrontPageList()) { handleDisplayInListResult(hasProgramResults) } else { handleInitWithoutData() diff --git a/app/src/main/res/layout-land/activity_search.xml b/app/src/main/res/layout-land/activity_search.xml index 2092884aa71..1c1398cf4d6 100644 --- a/app/src/main/res/layout-land/activity_search.xml +++ b/app/src/main/res/layout-land/activity_search.xml @@ -86,7 +86,7 @@ android:layout_marginStart="24dp" android:layout_marginTop="24dp" android:padding="2dp" - android:visibility="gone" + android:visibility="@{totalFilters>0?View.VISIBLE:View.GONE}" app:layout_constraintStart_toStartOf="@id/filter" app:layout_constraintTop_toTopOf="@id/filter" tools:visibility="visible"> @@ -102,7 +102,6 @@ android:text='@{""+totalFilters}' android:textColor="?colorPrimary" android:textSize="10sp" - android:visibility="@{totalFilters>0?View.VISIBLE:View.GONE}" tools:ignore="SmallSp" tools:text="1" /> </androidx.constraintlayout.widget.ConstraintLayout> diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt index 3c7e0dd9e23..32c4b0ef58d 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt @@ -344,6 +344,7 @@ class SearchTEIViewModelTest { fun `Should use callback to perform min attributes warning`() = runTest { setCurrentProgram(testingProgram(displayFrontPageList = false)) + setAllowCreateBeforeSearch(false) viewModel.onSearch() viewModel.searchParametersUiState.shouldShowMinAttributeWarning.test { assertTrue(awaitItem()) From 7ad820168bf340fc3bf90fcccdc805f240fc704c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manu=20Mu=C3=B1oz?= <manu.munoz@dhis2.org> Date: Sun, 31 May 2026 14:09:59 +0200 Subject: [PATCH 243/260] fix: [ANDROAPP-7546] handle multitext for assignValue program rule (#4888) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Manu Muñoz <manu.munoz@dhis2.org> --- .../dhis2/form/data/RulesUtilsProviderImpl.kt | 70 +++++++++++++------ 1 file changed, 47 insertions(+), 23 deletions(-) diff --git a/form/src/main/java/org/dhis2/form/data/RulesUtilsProviderImpl.kt b/form/src/main/java/org/dhis2/form/data/RulesUtilsProviderImpl.kt index ab594dd1389..2a6f71cb2da 100644 --- a/form/src/main/java/org/dhis2/form/data/RulesUtilsProviderImpl.kt +++ b/form/src/main/java/org/dhis2/form/data/RulesUtilsProviderImpl.kt @@ -320,7 +320,11 @@ class RulesUtilsProviderImpl( val fieldUid = assign.field() ?: "" fieldViewModels[fieldUid]?.let { field -> val value = - if (field.optionSet != null && field.displayName != null) { + if ( + field.optionSet != null && + field.displayName != null && + field.valueType != ValueType.MULTI_TEXT + ) { val valueOption = optionsRepository.getOptionByDisplayName( optionSet = field.optionSet!!, @@ -346,14 +350,19 @@ class RulesUtilsProviderImpl( valuesToChange[fieldUid] = it } } - val valueToShow = getDisplayValue(field.optionSet, ruleEffect.data) + val valueToShow = getDisplayValue(field.optionSet, field.valueType, ruleEffect.data) ruleEffect.data?.formatData(field.valueType)?.let { formattedValue -> val updatedField = fieldViewModels[assign.field()] ?.setValue(formattedValue) - ?.setDisplayName(formatDisplayName(valueToShow, field.valueType, field.optionSet)) - ?.setEditable(false) + ?.setDisplayName( + formatDisplayName( + valueToShow, + field.valueType, + field.optionSet, + ), + )?.setEditable(false) updatedField?.let { fieldViewModels[fieldUid] = it @@ -374,33 +383,48 @@ class RulesUtilsProviderImpl( private fun getDisplayValue( optionSetUid: String?, + valueType: ValueType?, ruleEffectData: String?, ): String? = if (optionSetUid != null && ruleEffectData?.isNotEmpty() == true) { - val effectOption = - optionsRepository.getOptionByCode( - optionSet = optionSetUid, - code = ruleEffectData, - ) - if (effectOption == null) { - configurationErrors.add( - RulesUtilsProviderConfigurationError( - currentRuleUid, - ActionType.ASSIGN, - ConfigurationError.VALUE_TO_ASSIGN_NOT_IN_OPTION_SET, - listOf( - currentRuleUid ?: "", - ruleEffectData, - optionSetUid, - ), - ), - ) + if (valueType != ValueType.MULTI_TEXT) { + getOptionName(optionSetUid, ruleEffectData) + } else { + val valueCodes = ruleEffectData.split(",") + valueCodes.joinToString(",") { + getOptionName(optionSetUid, it) ?: "" + } } - effectOption?.displayName() } else { ruleEffectData } + private fun getOptionName( + optionSetUid: String, + code: String, + ): String? { + val effectOption = + optionsRepository.getOptionByCode( + optionSet = optionSetUid, + code = code, + ) + if (effectOption == null) { + configurationErrors.add( + RulesUtilsProviderConfigurationError( + currentRuleUid, + ActionType.ASSIGN, + ConfigurationError.VALUE_TO_ASSIGN_NOT_IN_OPTION_SET, + listOf( + currentRuleUid ?: "", + code, + optionSetUid, + ), + ), + ) + } + return effectOption?.displayName() + } + private fun createEvent( createEvent: RuleAction, fieldViewModels: MutableMap<String, FieldUiModel>, From 860740b8f85a734d74f861a83d6a86c68a72f2b8 Mon Sep 17 00:00:00 2001 From: Xavier Molloy <xavi@dhis2.org> Date: Mon, 1 Jun 2026 07:11:09 +0200 Subject: [PATCH 244/260] fix: [ANDROAPP-7238] Separate numeric FieldValuetype into Decimal and integer (#4873) --- .../dhis2/org/analytics/charts/data/Graph.kt | 12 +++++++++--- .../mappers/DimensionalResponseToPieData.kt | 4 +++- .../providers/ChartCoordinatesProviderImpl.kt | 18 ++++++++++++------ .../RuleEngineNutritionDataProviderImpl.kt | 2 +- .../analytics/charts/ChartsRepositoryTest.kt | 4 ++-- .../org/analytics/charts/data/GraphTest.kt | 8 ++++---- .../mappers/GraphCoordinatesToEntryTest.kt | 8 ++++---- .../analytics/charts/ui/AnalyticsModelTest.kt | 4 ++-- 8 files changed, 37 insertions(+), 23 deletions(-) diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/data/Graph.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/data/Graph.kt index 3ba229b4c4c..d069766af30 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/data/Graph.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/data/Graph.kt @@ -214,25 +214,31 @@ data class GraphPoint( ) { fun numericValue() = when (fieldValue) { - is GraphFieldValue.Numeric -> fieldValue.value is GraphFieldValue.Text -> 0f + is GraphFieldValue.Decimal -> fieldValue.value + is GraphFieldValue.Integer -> fieldValue.value.toFloat() } fun textValue() = when (fieldValue) { - is GraphFieldValue.Numeric -> fieldValue.value.toString() is GraphFieldValue.Text -> fieldValue.value + is GraphFieldValue.Decimal -> fieldValue.value.toString() + is GraphFieldValue.Integer -> fieldValue.value.toString() } } sealed class GraphFieldValue { - data class Numeric( + data class Decimal( val value: Float, ) : GraphFieldValue() data class Text( val value: String, ) : GraphFieldValue() + + data class Integer( + val value: Int, + ) : GraphFieldValue() } fun Graph.toChartBuilder(): Chart.ChartBuilder = Chart.ChartBuilder() diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/DimensionalResponseToPieData.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/DimensionalResponseToPieData.kt index e7275532cb9..ec789bc577b 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/DimensionalResponseToPieData.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/DimensionalResponseToPieData.kt @@ -19,7 +19,9 @@ class DimensionalResponseToPieData { .map { entry -> GraphPoint( eventDate = GregorianCalendar(2021, 0, 1).time, - fieldValue = GraphFieldValue.Numeric(entry.value.sumByDouble { it.value?.toDouble() ?: 0.0 }.toFloat()), + fieldValue = GraphFieldValue.Decimal(entry.value.sumOf { + it.value?.toDouble() ?: 0.0 + }.toFloat()), legend = dimensionalResponse.metadata[entry.key]?.displayName, ) } diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/ChartCoordinatesProviderImpl.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/ChartCoordinatesProviderImpl.kt index 67c2a778df6..3c59db6dcec 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/ChartCoordinatesProviderImpl.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/ChartCoordinatesProviderImpl.kt @@ -69,7 +69,7 @@ class ChartCoordinatesProviderImpl( lineListResponse.period, ).toFloat() }, - fieldValue = GraphFieldValue.Numeric(value.toFloatOrNull() ?: 0f), + fieldValue = formatToNumericFieldValue(value), legendValue = createLegendValue(legend), ) } @@ -122,7 +122,6 @@ class ChartCoordinatesProviderImpl( if (initialPeriod == null) initialPeriod = lineListResponse.period val legend = getLegend(lineListResponseValue.legend) - GraphPoint( eventDate = formattedDate(lineListResponse.date), position = @@ -135,7 +134,7 @@ class ChartCoordinatesProviderImpl( lineListResponse.period, ).toFloat() }, - fieldValue = GraphFieldValue.Numeric(value.toFloat()), + fieldValue = formatToNumericFieldValue(value), legendValue = createLegendValue(legend), ) } @@ -199,7 +198,7 @@ class ChartCoordinatesProviderImpl( GraphPoint( eventDate = formattedDate(lineListResponse.date), position = xAxisValue.toFloat(), - fieldValue = GraphFieldValue.Numeric(zScoreValue.toFloat()), + fieldValue = formatToNumericFieldValue(zScoreValue), ) } } @@ -235,7 +234,7 @@ class ChartCoordinatesProviderImpl( return eventList.groupBy { it.values.first().value }.mapNotNull { GraphPoint( eventDate = formattedDate(it.value.first().date), - fieldValue = GraphFieldValue.Numeric(it.value.size.toFloat()), + fieldValue = GraphFieldValue.Integer(it.value.size), legend = it.key, ) } @@ -283,7 +282,7 @@ class ChartCoordinatesProviderImpl( GraphPoint( eventDate = GregorianCalendar(2021, 0, 1).time, position = position.toFloat(), - fieldValue = GraphFieldValue.Numeric(gridResponseValue.value!!.toFloat()), + fieldValue = formatToNumericFieldValue(gridResponseValue.value), legend = columnLegend, legendValue = createLegendValue(legend?.item), ) @@ -316,4 +315,11 @@ class ChartCoordinatesProviderImpl( it.displayName(), ) } + + private fun formatToNumericFieldValue(value: String?): GraphFieldValue = + if (value?.contains(".") == true || value?.contains(",") == true) { + GraphFieldValue.Decimal(value.toFloatOrNull() ?: 0f) + } else { + GraphFieldValue.Integer(value?.toIntOrNull() ?: 0) + } } diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/RuleEngineNutritionDataProviderImpl.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/RuleEngineNutritionDataProviderImpl.kt index 67fe13d7975..b9a61f05911 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/RuleEngineNutritionDataProviderImpl.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/RuleEngineNutritionDataProviderImpl.kt @@ -40,7 +40,7 @@ class RuleEngineNutritionDataProviderImpl : NutritionDataProvider { GraphPoint( eventDate = GregorianCalendar(2021, 0, 1).time, position = parameter, - fieldValue = GraphFieldValue.Numeric(values[dataIndex]), + fieldValue = GraphFieldValue.Decimal(values[dataIndex]), ), ) } diff --git a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ChartsRepositoryTest.kt b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ChartsRepositoryTest.kt index b3fcf716639..9b0f7116197 100644 --- a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ChartsRepositoryTest.kt +++ b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ChartsRepositoryTest.kt @@ -761,7 +761,7 @@ class ChartsRepositoryTest { listOf( SerieData( "de_field", - listOf(GraphPoint(Date(), null, GraphFieldValue.Numeric(30f))), + listOf(GraphPoint(Date(), null, GraphFieldValue.Decimal(30f))), ), ), periodToDisplayDefault = null, @@ -776,7 +776,7 @@ class ChartsRepositoryTest { listOf( SerieData( "indicator_field", - listOf(GraphPoint(Date(), null, GraphFieldValue.Numeric(30f))), + listOf(GraphPoint(Date(), null, GraphFieldValue.Decimal(30f))), ), ), null, diff --git a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/data/GraphTest.kt b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/data/GraphTest.kt index 06a96a9f2d7..b9142d34cd3 100644 --- a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/data/GraphTest.kt +++ b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/data/GraphTest.kt @@ -96,9 +96,9 @@ class GraphTest { private fun mockedCoordinates(): List<GraphPoint> = arrayListOf( - GraphPoint(Date.from(Instant.parse("2020-01-01T00:00:00.00Z")), fieldValue = GraphFieldValue.Numeric(10f)), - GraphPoint(Date.from(Instant.parse("2020-01-02T00:00:00.00Z")), fieldValue = GraphFieldValue.Numeric(20f)), - GraphPoint(Date.from(Instant.parse("2020-01-04T00:00:00.00Z")), fieldValue = GraphFieldValue.Numeric(50f)), - GraphPoint(Date.from(Instant.parse("2020-01-07T00:00:00.00Z")), fieldValue = GraphFieldValue.Numeric(30f)), + GraphPoint(Date.from(Instant.parse("2020-01-01T00:00:00.00Z")), fieldValue = GraphFieldValue.Decimal(10f)), + GraphPoint(Date.from(Instant.parse("2020-01-02T00:00:00.00Z")), fieldValue = GraphFieldValue.Decimal(20f)), + GraphPoint(Date.from(Instant.parse("2020-01-04T00:00:00.00Z")), fieldValue = GraphFieldValue.Decimal(50f)), + GraphPoint(Date.from(Instant.parse("2020-01-07T00:00:00.00Z")), fieldValue = GraphFieldValue.Decimal(30f)), ) } diff --git a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/mappers/GraphCoordinatesToEntryTest.kt b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/mappers/GraphCoordinatesToEntryTest.kt index 118b71e0547..43225ac288f 100644 --- a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/mappers/GraphCoordinatesToEntryTest.kt +++ b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/mappers/GraphCoordinatesToEntryTest.kt @@ -46,9 +46,9 @@ class GraphCoordinatesToEntryTest { private fun mockedCoordinates(): List<GraphPoint> = arrayListOf( - GraphPoint(Date.from(Instant.parse("2020-01-01T00:00:00.00Z")), null, GraphFieldValue.Numeric(10f)), - GraphPoint(Date.from(Instant.parse("2020-01-02T00:00:00.00Z")), null, GraphFieldValue.Numeric(20f)), - GraphPoint(Date.from(Instant.parse("2020-01-04T00:00:00.00Z")), null, GraphFieldValue.Numeric(50f)), - GraphPoint(Date.from(Instant.parse("2020-01-07T00:00:00.00Z")), null, GraphFieldValue.Numeric(30f)), + GraphPoint(Date.from(Instant.parse("2020-01-01T00:00:00.00Z")), null, GraphFieldValue.Decimal(10f)), + GraphPoint(Date.from(Instant.parse("2020-01-02T00:00:00.00Z")), null, GraphFieldValue.Decimal(20f)), + GraphPoint(Date.from(Instant.parse("2020-01-04T00:00:00.00Z")), null, GraphFieldValue.Decimal(50f)), + GraphPoint(Date.from(Instant.parse("2020-01-07T00:00:00.00Z")), null, GraphFieldValue.Decimal(30f)), ) } diff --git a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ui/AnalyticsModelTest.kt b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ui/AnalyticsModelTest.kt index 9555fddb172..8238c9407e8 100644 --- a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ui/AnalyticsModelTest.kt +++ b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ui/AnalyticsModelTest.kt @@ -77,13 +77,13 @@ class AnalyticsModelTest { GraphPoint( GregorianCalendar(2021, 0, 1).time, 0f, - GraphFieldValue.Numeric(0f), + GraphFieldValue.Decimal(0f), null, ), GraphPoint( GregorianCalendar(2021, 0, 1).time, 1f, - GraphFieldValue.Numeric(0f), + GraphFieldValue.Decimal(0f), null, ), ), From 104c5de203404de8a171885ef8147c86d67dd107 Mon Sep 17 00:00:00 2001 From: Xavier Molloy <xavi@dhis2.org> Date: Tue, 2 Jun 2026 13:04:13 +0200 Subject: [PATCH 245/260] fix: fix test (#4896) --- .../java/org/dhis2/usescases/datasets/DataSetTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt index f9f5e33e751..55b340e3c09 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt @@ -836,7 +836,7 @@ class DataSetTest : BaseTest() { clickOnFilterBy(filter = "Period") clickOnFromToDate() chooseDate("08082024") - chooseDate("09092026") + chooseDate("09092027") checkFilterCounter("2") } From 405530ba72fcbcf8e2ee676689089adc44e563b6 Mon Sep 17 00:00:00 2001 From: Xavier Molloy <xavi@dhis2.org> Date: Tue, 2 Jun 2026 14:08:24 +0200 Subject: [PATCH 246/260] fix: [ANDROAPP-7398] Use correct snackbar colors (#4889) * fix: [ANDROAPP-7398] Use correct snackbar colors * fix: [ANDROAPP-7398] delete unused imports --- .../mobile/aggregates/ui/snackbar/DataSetSnackbarHost.kt | 4 ---- .../java/org/dhis2/usescases/settings/ui/SettingsScreen.kt | 4 ---- .../login/authentication/ui/screen/TwoFASettingsScreen.kt | 2 -- .../org/dhis2/mobile/login/main/ui/screen/LoginScreen.kt | 4 ---- .../org/dhis2/tracker/relationships/ui/RelationshipsScreen.kt | 3 --- 5 files changed, 17 deletions(-) diff --git a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/snackbar/DataSetSnackbarHost.kt b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/snackbar/DataSetSnackbarHost.kt index f79c5fbffc1..96070444493 100644 --- a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/snackbar/DataSetSnackbarHost.kt +++ b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/snackbar/DataSetSnackbarHost.kt @@ -6,8 +6,6 @@ import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor -import org.hisp.dhis.mobile.ui.designsystem.theme.TextColor import org.hisp.dhis.mobile.ui.designsystem.theme.dropShadow @Composable @@ -16,8 +14,6 @@ fun DataSetSnackbarHost(hostState: SnackbarHostState) { Snackbar( modifier = Modifier.dropShadow(shape = SnackbarDefaults.shape), snackbarData = data, - containerColor = SurfaceColor.SurfaceBright, - contentColor = TextColor.OnSurface, ) } } diff --git a/app/src/main/java/org/dhis2/usescases/settings/ui/SettingsScreen.kt b/app/src/main/java/org/dhis2/usescases/settings/ui/SettingsScreen.kt index a8e058bac17..92338a93be1 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/ui/SettingsScreen.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/ui/SettingsScreen.kt @@ -31,8 +31,6 @@ import org.dhis2.usescases.settings.models.ErrorViewModel import org.dhis2.usescases.settings.models.SettingsState import org.dhis2.usescases.settings.models.SettingsUiAction import org.hisp.dhis.mobile.ui.designsystem.theme.Spacing -import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor -import org.hisp.dhis.mobile.ui.designsystem.theme.TextColor import org.hisp.dhis.mobile.ui.designsystem.theme.dropShadow import java.io.File @@ -76,8 +74,6 @@ fun SettingsScreen( Snackbar( modifier = Modifier.dropShadow(shape = SnackbarDefaults.shape), snackbarData = data, - containerColor = SurfaceColor.SurfaceBright, - contentColor = TextColor.OnSurface, ) } }, diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/ui/screen/TwoFASettingsScreen.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/ui/screen/TwoFASettingsScreen.kt index e6cba2a36bb..2a776b6db93 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/ui/screen/TwoFASettingsScreen.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/ui/screen/TwoFASettingsScreen.kt @@ -110,8 +110,6 @@ fun TwoFASettingsScreen( Snackbar( modifier = Modifier.dropShadow(shape = SnackbarDefaults.shape), snackbarData = data, - containerColor = SurfaceColor.SurfaceBright, - contentColor = TextColor.OnSurface, ) } }, diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/LoginScreen.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/LoginScreen.kt index fd29c0ee589..c5de1106f2a 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/LoginScreen.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/LoginScreen.kt @@ -71,8 +71,6 @@ import org.hisp.dhis.mobile.ui.designsystem.component.menu.DropDownMenu import org.hisp.dhis.mobile.ui.designsystem.component.menu.MenuItemData import org.hisp.dhis.mobile.ui.designsystem.component.menu.MenuLeadingElement import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme -import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor -import org.hisp.dhis.mobile.ui.designsystem.theme.TextColor import org.hisp.dhis.mobile.ui.designsystem.theme.dropShadow import org.jetbrains.compose.resources.getString import org.jetbrains.compose.resources.stringResource @@ -139,8 +137,6 @@ fun LoginScreen( Snackbar( modifier = Modifier.dropShadow(shape = SnackbarDefaults.shape), snackbarData = data, - containerColor = SurfaceColor.SurfaceBright, - contentColor = TextColor.OnSurface, ) } }, diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/relationships/ui/RelationshipsScreen.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/relationships/ui/RelationshipsScreen.kt index 679cdf17b08..fe879bf836e 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/relationships/ui/RelationshipsScreen.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/relationships/ui/RelationshipsScreen.kt @@ -85,7 +85,6 @@ import org.hisp.dhis.mobile.ui.designsystem.files.buildPainterForFile import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2TextStyle import org.hisp.dhis.mobile.ui.designsystem.theme.Shape import org.hisp.dhis.mobile.ui.designsystem.theme.Spacing -import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor import org.hisp.dhis.mobile.ui.designsystem.theme.TextColor import org.hisp.dhis.mobile.ui.designsystem.theme.dropShadow import org.hisp.dhis.mobile.ui.designsystem.theme.getTextStyle @@ -117,8 +116,6 @@ fun RelationShipsScreen( Snackbar( modifier = Modifier.dropShadow(shape = SnackbarDefaults.shape), snackbarData = data, - containerColor = SurfaceColor.SurfaceBright, - contentColor = TextColor.OnSurface, ) } }, From 1e50f5c57a561a4c53ffbeb790d0cd355250fe85 Mon Sep 17 00:00:00 2001 From: Xavier Molloy <xavi@dhis2.org> Date: Tue, 2 Jun 2026 16:38:26 +0200 Subject: [PATCH 247/260] chore: update vName to 3.4.1-RC (#4898) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c7859928314..d4aa2ef178f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ navigationCompose = "2.9.2" sdk = "36" minSdk = "23" vCode = "153" -vName = "3.4.1" +vName = "3.4.1-RC" gradle = "9.0.1" kotlin = '2.3.20' dagger = '2.57.2' From 56397e7bd7259211e0117e34e1f985b70e874b58 Mon Sep 17 00:00:00 2001 From: Xavier Molloy <xavi@dhis2.org> Date: Wed, 10 Jun 2026 12:26:01 +0200 Subject: [PATCH 248/260] fix: fix test (#4899) --- .../java/org/dhis2/usescases/datasets/DataSetTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt index f9f5e33e751..55b340e3c09 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt @@ -836,7 +836,7 @@ class DataSetTest : BaseTest() { clickOnFilterBy(filter = "Period") clickOnFromToDate() chooseDate("08082024") - chooseDate("09092026") + chooseDate("09092027") checkFilterCounter("2") } From 9f83909e8ce1200848d686311963e9417548098a Mon Sep 17 00:00:00 2001 From: Xavier Molloy <xavi@dhis2.org> Date: Wed, 17 Jun 2026 11:44:19 +0200 Subject: [PATCH 249/260] fix: [ANDROAPP-7661] condition race to sync image using granular sync (#4918) --- .../main/java/org/dhis2/data/service/SyncPresenterImpl.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/dhis2/data/service/SyncPresenterImpl.kt b/app/src/main/java/org/dhis2/data/service/SyncPresenterImpl.kt index 28f480d09f8..d15745a193c 100644 --- a/app/src/main/java/org/dhis2/data/service/SyncPresenterImpl.kt +++ b/app/src/main/java/org/dhis2/data/service/SyncPresenterImpl.kt @@ -63,7 +63,7 @@ class SyncPresenterImpl( syncRepository .downLoadEvent(eventUid, programUid) .map { it as D2Progress } - .mergeWith(syncRepository.downloadEventFiles(eventUid)) + .concatWith(syncRepository.downloadEventFiles(eventUid)) } ?: Observable.empty() } @@ -184,7 +184,7 @@ class SyncPresenterImpl( syncRepository.downloadEventProgram(uid) } }?.map { it as D2Progress } - ?.mergeWith(syncRepository.downloadProgramFiles(uid)) + ?.concatWith(syncRepository.downloadProgramFiles(uid)) ?: Observable.empty() override fun syncGranularTEI(uid: String): Observable<D2Progress> { @@ -198,7 +198,7 @@ class SyncPresenterImpl( return syncRepository .downloadTei(teiUid, programUid) .map { it as D2Progress } - .mergeWith( + .concatWith( syncRepository.downloadTeiFiles(teiUid, programUid), ) } From 60ab6098ca42ce7cabd82a3d0c9b3f77465b75a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20S=C3=A1nchez=20Fern=C3=A1ndez?= <xurxosf@gmail.com> Date: Thu, 18 Jun 2026 12:08:55 +0200 Subject: [PATCH 250/260] fix: [ANDROAPP-7647] clear stale program results on new TEI search (#4920) --- .../listView/SearchTEList.kt | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt index 47fc387e9d2..7d6eb880d65 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt @@ -339,6 +339,10 @@ class SearchTEList : FragmentGlobalAbstract() { } liveAdapter.addLoadStateListener { state -> + val adapterDetached = !listAdapter.adapters.contains(liveAdapter) + if (adapterDetached && state.refresh is LoadState.NotLoading) { + restoreProgramAdapterAfterRefresh() + } if (state.append == LoadState.Loading) { displayResult( listOf(SearchResult(SearchResult.SearchResultType.LOADING)), @@ -375,6 +379,8 @@ class SearchTEList : FragmentGlobalAbstract() { displayResult(null) } + private var lastSearchPagingData: Any? = null + private fun initData() { displayLoadingData() @@ -388,6 +394,10 @@ class SearchTEList : FragmentGlobalAbstract() { lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.STARTED) { viewModel.searchPagingData.collectLatest { data -> + if (data !== lastSearchPagingData) { + lastSearchPagingData = data + hideStaleProgramResults() + } liveAdapter.submitData(lifecycle, data) } } @@ -454,4 +464,14 @@ class SearchTEList : FragmentGlobalAbstract() { resultAdapter.submitList(result) } } + + private fun hideStaleProgramResults() { + listAdapter.removeAdapter(liveAdapter) + initLoading(listOf(SearchResult(SearchResult.SearchResultType.LOADING))) + } + + private fun restoreProgramAdapterAfterRefresh() { + listAdapter.addAdapter(1, liveAdapter) + initLoading(null) + } } From 5381f01288917121802b9c5500dbd5a44ae0281b Mon Sep 17 00:00:00 2001 From: Pablo <pablo@dhis2.org> Date: Fri, 19 Jun 2026 11:35:45 +0200 Subject: [PATCH 251/260] fix: [ANDROAPP-7637] Program tab appears when analytics is not configured (#4916) --- app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt b/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt index cbbbac8702b..f4d9452d762 100644 --- a/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt @@ -198,7 +198,8 @@ class MainViewModel( _homeScreenState.update { it.copy( filterButtonVisible = true, - bottomNavigationBarVisible = true, + bottomNavigationBarVisible = + it.currentScreen.isHome() && it.navigationBarItems.size > 1, syncButtonVisible = true, ) } From 772732141c8567c30b0899ea2f229b97b8a4caad Mon Sep 17 00:00:00 2001 From: Pablo <pablo@dhis2.org> Date: Fri, 19 Jun 2026 14:11:04 +0200 Subject: [PATCH 252/260] build: Migrate App to kotlin [skip size] (#4928) --- app/src/main/java/org/dhis2/App.java | 360 ------------------ app/src/main/java/org/dhis2/App.kt | 336 ++++++++++++++++ .../mobile/sync/data/AndroidSyncRepository.kt | 38 ++ .../mobile/sync/di/SyncModule.android.kt | 3 + .../dhis2/mobile/sync/data/SyncRepository.kt | 10 + .../mobile/sync/domain/CheckPeriodicJobs.kt | 30 ++ .../org/dhis2/mobile/sync/domain/SyncData.kt | 10 + .../dhis2/mobile/sync/domain/SyncMetadata.kt | 11 + .../mobile/sync/domain/SyncMetadataTest.kt | 6 + 9 files changed, 444 insertions(+), 360 deletions(-) delete mode 100644 app/src/main/java/org/dhis2/App.java create mode 100644 app/src/main/java/org/dhis2/App.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/CheckPeriodicJobs.kt diff --git a/app/src/main/java/org/dhis2/App.java b/app/src/main/java/org/dhis2/App.java deleted file mode 100644 index d1fc1043f4e..00000000000 --- a/app/src/main/java/org/dhis2/App.java +++ /dev/null @@ -1,360 +0,0 @@ -package org.dhis2; - -import static org.dhis2.utils.analytics.AnalyticsConstants.DATA_STORE_ANALYTICS_PERMISSION_KEY; - -import android.content.Context; -import android.os.Looper; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.lifecycle.Lifecycle; -import androidx.lifecycle.LifecycleObserver; -import androidx.lifecycle.OnLifecycleEvent; -import androidx.lifecycle.ProcessLifecycleOwner; - -import org.dhis2.commons.di.dagger.PerActivity; -import org.dhis2.commons.di.dagger.PerServer; -import org.dhis2.commons.di.dagger.PerUser; -import org.dhis2.commons.dialogs.calendarpicker.di.CalendarPickerComponent; -import org.dhis2.commons.dialogs.calendarpicker.di.CalendarPickerModule; -import org.dhis2.commons.featureconfig.di.FeatureConfigActivityComponent; -import org.dhis2.commons.featureconfig.di.FeatureConfigActivityModule; -import org.dhis2.commons.featureconfig.di.FeatureConfigModule; -import org.dhis2.commons.filters.data.FilterPresenter; -import org.dhis2.commons.network.NetworkUtilsModule; -import org.dhis2.commons.orgunitselector.OUTreeComponent; -import org.dhis2.commons.orgunitselector.OUTreeModule; -import org.dhis2.commons.prefs.Preference; -import org.dhis2.commons.prefs.PreferenceModule; -import org.dhis2.commons.schedulers.SchedulerModule; -import org.dhis2.commons.schedulers.SchedulersProviderImpl; -import org.dhis2.commons.service.SessionManagerModule; -import org.dhis2.commons.sync.SyncComponentProvider; -import org.dhis2.data.dispatcher.DispatcherModule; -import org.dhis2.data.server.SSLContextInitializer; -import org.dhis2.data.server.ServerComponent; -import org.dhis2.data.server.ServerModule; -import org.dhis2.data.server.UserManager; -import org.dhis2.data.service.workManager.WorkManagerModule; -import org.dhis2.data.user.UserComponent; -import org.dhis2.data.user.UserModule; -import org.dhis2.di.KoinInitialization; -import org.dhis2.maps.MapController; -import org.dhis2.usescases.crash.CrashActivity; -import org.dhis2.usescases.teiDashboard.TeiDashboardComponent; -import org.dhis2.usescases.teiDashboard.TeiDashboardModule; -import org.dhis2.utils.analytics.AnalyticsModule; -import org.dhis2.utils.granularsync.SyncStatusDialogProvider; -import org.dhis2.utils.timber.DebugTree; -import org.hisp.dhis.android.core.D2Manager; -import org.hisp.dhis.android.core.datastore.KeyValuePair; -import org.jetbrains.annotations.NotNull; - -import java.io.IOException; -import java.net.SocketException; - -import javax.inject.Singleton; - -import cat.ereza.customactivityoncrash.config.CaocConfig; -import dhis2.org.analytics.charts.ui.di.AnalyticsFragmentComponent; -import dhis2.org.analytics.charts.ui.di.AnalyticsFragmentModule; -import io.reactivex.Scheduler; -import io.reactivex.android.plugins.RxAndroidPlugins; -import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.exceptions.UndeliverableException; -import io.reactivex.plugins.RxJavaPlugins; -import io.sentry.SentryLevel; -import io.sentry.android.core.SentryAndroid; -import timber.log.Timber; - -public class App extends android.app.Application implements Components, LifecycleObserver { - - @NonNull - @Singleton - AppComponent appComponent; - - @Nullable - @PerServer - protected ServerComponent serverComponent; - - @Nullable - @PerUser - protected UserComponent userComponent; - - @Nullable - @PerActivity - private TeiDashboardComponent dashboardComponent; - - private boolean fromBackGround = false; - private boolean recreated; - - @Override - public void onCreate() { - super.onCreate(); - - ProcessLifecycleOwner.get().getLifecycle().addObserver(this); - - MapController.Companion.init(this); - - setUpAppComponent(); - if (BuildConfig.DEBUG) { - Timber.plant(new DebugTree()); - } - - setUpSecurityProvider(); - setUpServerComponent(); - - KoinInitialization.INSTANCE.invoke(this, ServerModule.getD2Configuration(this)); - - initCrashController(); - setUpRxPlugin(); - initCustomCrashActivity(); - } - - public void initCrashController() { - if (areTrackingPermissionGranted()) { - if (BuildConfig.SENTRY_DSN.isEmpty()) { - Timber.w("Sentry DSN is empty. Skipping Sentry initialization."); - return; - } - SentryAndroid.init(this, options -> { - options.setDsn(BuildConfig.SENTRY_DSN); - options.setAnrReportInDebug(true); - - // Add a callback that will be used before the event is sent to Sentry. - // With this callback, you can modify the event or, when returning null, also discard the event. - options.setBeforeSend((event, hint) -> { - if (SentryLevel.DEBUG.equals(event.getLevel())) - return null; - else - return event; - }); - options.setEnvironment(BuildConfig.DEBUG ? "debug" : "production"); - options.setDebug(BuildConfig.DEBUG); - // Enable view hierarchy for crashes - options.setAttachViewHierarchy(true); - // Enable the performance API by setting a sample-rate - options.setTracesSampleRate(BuildConfig.DEBUG ? 1.0 : 0.1); - // Enable profiling when starting transactions - options.setProfilesSampleRate(BuildConfig.DEBUG ? 1.0 : 0.1); - }); - } - } - - private void setUpSecurityProvider() { - SSLContextInitializer.INSTANCE.initializeSSLContext(this); - } - - private void initCustomCrashActivity() { - CaocConfig.Builder.create() - .errorActivity(CrashActivity.class) - .apply(); - } - - private void setUpAppComponent() { - appComponent = prepareAppComponent().build(); - appComponent.inject(this); - } - - protected void setUpServerComponent() { - serverComponent = appComponent.plus(new ServerModule()); - if (Boolean.TRUE.equals(serverComponent.userManager().isUserLoggedIn().blockingFirst())) - setUpUserComponent(); - } - - - protected void setUpUserComponent() { - UserManager userManager = serverComponent == null - ? null : serverComponent.userManager(); - if (userManager != null && userManager.isUserLoggedIn().blockingFirst()) { - userComponent = serverComponent.plus(new UserModule()); - } - } - - //////////////////////////////////////////////////////////////////////// - // App component - - /// ///////////////////////////////////////////////////////////////////// - @NonNull - protected AppComponent.Builder prepareAppComponent() { - return DaggerAppComponent.builder() - .appModule(new AppModule(this)) - .schedulerModule(new SchedulerModule(new SchedulersProviderImpl())) - .analyticsModule(new AnalyticsModule()) - .preferenceModule(new PreferenceModule()) - .networkUtilsModule(new NetworkUtilsModule()) - .workManagerController(new WorkManagerModule()) - .sessionManagerService(new SessionManagerModule()) - .coroutineDispatchers(new DispatcherModule()) - .featureConfigModule(new FeatureConfigModule()); - } - - @NonNull - @Override - public AppComponent appComponent() { - return appComponent; - } - - //////////////////////////////////////////////////////////////////////// - // Server component - - /// ///////////////////////////////////////////////////////////////////// - - @Override - public ServerComponent createServerComponent() { - if (!D2Manager.INSTANCE.isD2Instantiated()) - setUpServerComponent(); - return serverComponent; - } - - @Nullable - @Override - public ServerComponent serverComponent() { - return serverComponent; - } - - @Override - public void releaseServerComponent() { - serverComponent = null; - } - - @Nullable - public ServerComponent getServerComponent() { - return serverComponent; - } - - //////////////////////////////////////////////////////////////////////// - // User component - - /// ///////////////////////////////////////////////////////////////////// - - @Override - public UserComponent createUserComponent() { - return (userComponent = serverComponent.plus(new UserModule())); - } - - @Override - public UserComponent userComponent() { - return userComponent; - } - - @Override - public void releaseUserComponent() { - userComponent = null; - } - - //////////////////////////////////////////////////////////////////////// - // Dashboard component - - /// ///////////////////////////////////////////////////////////////////// - @NonNull - public TeiDashboardComponent createDashboardComponent(@NonNull TeiDashboardModule dashboardModule) { - if (dashboardComponent != null) { - this.recreated = true; - } - dashboardComponent = userComponent.plus(dashboardModule); - return dashboardComponent; - } - - @Nullable - public TeiDashboardComponent dashboardComponent() { - return dashboardComponent; - } - - public void releaseDashboardComponent() { - if (!this.recreated) { - dashboardComponent = null; - } else { - recreated = false; - } - } - - @OnLifecycleEvent(Lifecycle.Event.ON_STOP) - public void onAppBackgrounded() { - Timber.tag("BG").d("App in background"); - } - - @OnLifecycleEvent(Lifecycle.Event.ON_START) - public void onAppForegrounded() { - Timber.tag("BG").d("App in foreground"); - fromBackGround = true; - } - - public void disableBackGroundFlag() { - fromBackGround = false; - } - - public boolean isSessionBlocked() { - boolean shouldShowPinDialog = fromBackGround && appComponent().preferenceProvider().getBoolean(Preference.SESSION_LOCKED, false); - fromBackGround = false; - return shouldShowPinDialog; - } - - private void setUpRxPlugin() { - Scheduler asyncMainThreadScheduler = AndroidSchedulers.from(Looper.getMainLooper(), true); - RxAndroidPlugins.setInitMainThreadSchedulerHandler(schedulerCallable -> asyncMainThreadScheduler); - RxJavaPlugins.setErrorHandler(e -> { - if (e instanceof UndeliverableException) { - e = e.getCause(); - } - if ((e instanceof IOException) || (e instanceof SocketException)) { - return; - } - if ((e instanceof NullPointerException) || (e instanceof IllegalArgumentException)) { - Timber.d("Error in app"); - Thread.currentThread().getUncaughtExceptionHandler() - .uncaughtException(Thread.currentThread(), e); - } - if (e instanceof IllegalStateException) { - Timber.d("Error in RxJava"); - Thread.currentThread().getUncaughtExceptionHandler() - .uncaughtException(Thread.currentThread(), e); - } - Timber.d(e); - }); - } - - @Override - public FeatureConfigActivityComponent provideFeatureConfigActivityComponent() { - return userComponent.plus(new FeatureConfigActivityModule()); - } - - @Override - public CalendarPickerComponent provideCalendarPickerComponent() { - return userComponent.plus(new CalendarPickerModule()); - } - - @Override - public AnalyticsFragmentComponent provideAnalyticsFragmentComponent(AnalyticsFragmentModule module) { - return userComponent.plus(module); - } - - @Override - public FilterPresenter provideFilterPresenter() { - return userComponent.filterPresenter(); - } - - @org.jetbrains.annotations.Nullable - @Override - public OUTreeComponent provideOUTreeComponent(@NotNull OUTreeModule module) { - return serverComponent.plus(module); - } - - @NonNull - @Override - public SyncComponentProvider getSyncComponentProvider() { - return new SyncStatusDialogProvider(); - } - - private boolean areTrackingPermissionGranted() { - boolean isUserLoggedIn = serverComponent != null && - serverComponent.userManager().isUserLoggedIn().blockingFirst(); - if (!D2Manager.isD2Instantiated() || !isUserLoggedIn) { - return false; - } - KeyValuePair granted = D2Manager.getD2().dataStoreModule().localDataStore() - .value(DATA_STORE_ANALYTICS_PERMISSION_KEY).blockingGet(); - return granted != null && Boolean.parseBoolean(granted.value()); - } - -} diff --git a/app/src/main/java/org/dhis2/App.kt b/app/src/main/java/org/dhis2/App.kt new file mode 100644 index 00000000000..e558684fa49 --- /dev/null +++ b/app/src/main/java/org/dhis2/App.kt @@ -0,0 +1,336 @@ +package org.dhis2 + +import android.app.Application +import android.os.Looper +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.ProcessLifecycleOwner +import cat.ereza.customactivityoncrash.config.CaocConfig +import dhis2.org.analytics.charts.ui.di.AnalyticsFragmentComponent +import dhis2.org.analytics.charts.ui.di.AnalyticsFragmentModule +import io.reactivex.android.plugins.RxAndroidPlugins +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.exceptions.UndeliverableException +import io.reactivex.plugins.RxJavaPlugins +import io.sentry.SentryLevel +import io.sentry.SentryOptions +import io.sentry.android.core.SentryAndroid +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.launch +import org.dhis2.commons.di.dagger.PerActivity +import org.dhis2.commons.di.dagger.PerServer +import org.dhis2.commons.di.dagger.PerUser +import org.dhis2.commons.dialogs.calendarpicker.di.CalendarPickerComponent +import org.dhis2.commons.dialogs.calendarpicker.di.CalendarPickerModule +import org.dhis2.commons.featureconfig.di.FeatureConfigActivityComponent +import org.dhis2.commons.featureconfig.di.FeatureConfigActivityModule +import org.dhis2.commons.featureconfig.di.FeatureConfigModule +import org.dhis2.commons.filters.data.FilterPresenter +import org.dhis2.commons.network.NetworkUtilsModule +import org.dhis2.commons.orgunitselector.OUTreeComponent +import org.dhis2.commons.orgunitselector.OUTreeModule +import org.dhis2.commons.prefs.Preference +import org.dhis2.commons.prefs.PreferenceModule +import org.dhis2.commons.schedulers.SchedulerModule +import org.dhis2.commons.schedulers.SchedulersProviderImpl +import org.dhis2.commons.service.SessionManagerModule +import org.dhis2.commons.sync.SyncComponentProvider +import org.dhis2.data.dispatcher.DispatcherModule +import org.dhis2.data.server.SSLContextInitializer +import org.dhis2.data.server.ServerComponent +import org.dhis2.data.server.ServerModule +import org.dhis2.data.server.ServerModule.Companion.getD2Configuration +import org.dhis2.data.service.workManager.WorkManagerModule +import org.dhis2.data.user.UserComponent +import org.dhis2.data.user.UserModule +import org.dhis2.di.KoinInitialization.invoke +import org.dhis2.maps.MapController +import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.commons.network.NetworkStatusProvider +import org.dhis2.mobile.sync.domain.CheckPeriodicJobs +import org.dhis2.usescases.crash.CrashActivity +import org.dhis2.usescases.teiDashboard.TeiDashboardComponent +import org.dhis2.usescases.teiDashboard.TeiDashboardModule +import org.dhis2.utils.analytics.AnalyticsModule +import org.dhis2.utils.analytics.DATA_STORE_ANALYTICS_PERMISSION_KEY +import org.dhis2.utils.granularsync.SyncStatusDialogProvider +import org.dhis2.utils.timber.DebugTree +import org.hisp.dhis.android.core.D2Manager +import org.koin.android.ext.android.inject +import timber.log.Timber +import timber.log.Timber.Forest.plant +import java.io.IOException +import javax.inject.Singleton + +open class App : Application(), Components, DefaultLifecycleObserver { + @Singleton + lateinit var appComponent: AppComponent + + @PerServer + var serverComponent: ServerComponent? = null + protected set + + @PerUser + protected var userComponent: UserComponent? = null + + @PerActivity + private var dashboardComponent: TeiDashboardComponent? = null + + private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + private val networkStatusProvider: NetworkStatusProvider by inject() + private val checkPeriodicJobs: CheckPeriodicJobs by inject() + + private var fromBackGround = false + private var recreated = false + + override fun onCreate() { + super<Application>.onCreate() + + ProcessLifecycleOwner.get().lifecycle.addObserver(this) + + MapController.init(this) + + setUpAppComponent() + if (BuildConfig.DEBUG) { + plant(DebugTree()) + } + + setUpSecurityProvider() + setUpServerComponent() + + this(getD2Configuration(this)) + + initCrashController() + setUpRxPlugin() + initCustomCrashActivity() + observeConnectivity() + } + + + private fun observeConnectivity() { + scope.launch { + networkStatusProvider.connectionStatus + .filter { it } + .collect { + checkAndEnqueueSyncJobs() + } + } + } + + private fun checkAndEnqueueSyncJobs() { + scope.launch { + checkPeriodicJobs() + } + } + + fun initCrashController() { + if (areTrackingPermissionGranted()) { + initSentry() + } + } + + private fun initSentry() { + if (BuildConfig.SENTRY_DSN.isEmpty()) { + Timber.w("Sentry DSN is empty. Skipping Sentry initialization.") + return + } + SentryAndroid.init(this) { options -> + options.setDsn(BuildConfig.SENTRY_DSN) + options.isAnrReportInDebug = true + + // Add a callback that will be used before the event is sent to Sentry. + // With this callback, you can modify the event or, when returning null, also discard the event. + options.beforeSend = + SentryOptions.BeforeSendCallback { event, _ -> + if (SentryLevel.DEBUG == event.level) null else event + } + options.environment = if (BuildConfig.DEBUG) "debug" else "production" + options.isDebug = BuildConfig.DEBUG + // Enable view hierarchy for crashes + options.isAttachViewHierarchy = true + // Enable the performance API by setting a sample-rate + options.setTracesSampleRate(if (BuildConfig.DEBUG) 1.0 else 0.1) + // Enable profiling when starting transactions + options.setProfilesSampleRate(if (BuildConfig.DEBUG) 1.0 else 0.1) + } + } + + private fun setUpSecurityProvider() { + SSLContextInitializer.initializeSSLContext(this) + } + + private fun initCustomCrashActivity() { + CaocConfig.Builder.create() + .errorActivity(CrashActivity::class.java) + .apply() + } + + private fun setUpAppComponent() { + appComponent = prepareAppComponent().build() + appComponent.inject(this) + } + + protected open fun setUpServerComponent() { + serverComponent = appComponent.plus(ServerModule()) + if (serverComponent?.userManager()?.isUserLoggedIn() + ?.blockingFirst() == true + ) setUpUserComponent() + } + + + protected open fun setUpUserComponent() { + serverComponent?.userManager()?.takeIf { it.isUserLoggedIn.blockingFirst() }?.let { + userComponent = serverComponent!!.plus(UserModule()) + } + } + + protected open fun prepareAppComponent(): AppComponent.Builder { + return DaggerAppComponent.builder() + .appModule(AppModule(this)) + .schedulerModule(SchedulerModule(SchedulersProviderImpl())) + .analyticsModule(AnalyticsModule()) + .preferenceModule(PreferenceModule()) + .networkUtilsModule(NetworkUtilsModule()) + .workManagerController(WorkManagerModule()) + .sessionManagerService(SessionManagerModule()) + .coroutineDispatchers(DispatcherModule()) + .featureConfigModule(FeatureConfigModule()) + } + + override fun appComponent(): AppComponent { + return appComponent + } + + override fun createServerComponent(): ServerComponent { + if (!D2Manager.isD2Instantiated()) setUpServerComponent() + return serverComponent!! + } + + override fun serverComponent(): ServerComponent? { + return serverComponent + } + + override fun releaseServerComponent() { + serverComponent = null + } + + override fun createUserComponent(): UserComponent { + return (serverComponent!!.plus(UserModule()).also { userComponent = it }) + } + + override fun userComponent(): UserComponent? { + return userComponent + } + + override fun releaseUserComponent() { + userComponent = null + } + + fun createDashboardComponent(dashboardModule: TeiDashboardModule): TeiDashboardComponent { + if (dashboardComponent != null) { + this.recreated = true + } + dashboardComponent = userComponent?.plus(dashboardModule) + return dashboardComponent!! + } + + fun dashboardComponent(): TeiDashboardComponent? { + return dashboardComponent + } + + fun releaseDashboardComponent() { + if (!this.recreated) { + dashboardComponent = null + } else { + recreated = false + } + } + + override fun onStop(owner: LifecycleOwner) { + Timber.tag("BG").d("App in background") + } + + override fun onStart(owner: LifecycleOwner) { + Timber.tag("BG").d("App in foreground") + fromBackGround = true + } + + fun disableBackGroundFlag() { + fromBackGround = false + } + + val isSessionBlocked: Boolean + get() { + val shouldShowPinDialog = + fromBackGround && appComponent().preferenceProvider() + .getBoolean(Preference.SESSION_LOCKED, false) + fromBackGround = false + return shouldShowPinDialog + } + + private fun setUpRxPlugin() { + val asyncMainThreadScheduler = AndroidSchedulers.from(Looper.getMainLooper(), true) + RxAndroidPlugins.setInitMainThreadSchedulerHandler { asyncMainThreadScheduler } + RxJavaPlugins.setErrorHandler { e -> + var e = e + if (e is UndeliverableException) { + e = e.cause + } + if (e is IOException) { + return@setErrorHandler + } + if ((e is NullPointerException) || (e is IllegalArgumentException)) { + Timber.d("Error in app") + Thread.currentThread().uncaughtExceptionHandler?.uncaughtException( + Thread.currentThread(), + e + ) + } + if (e is IllegalStateException) { + Timber.d("Error in RxJava") + Thread.currentThread().uncaughtExceptionHandler?.uncaughtException( + Thread.currentThread(), + e + ) + } + Timber.d(e) + } + } + + override fun provideFeatureConfigActivityComponent(): FeatureConfigActivityComponent? { + return userComponent?.plus(FeatureConfigActivityModule()) + } + + override fun provideCalendarPickerComponent(): CalendarPickerComponent? { + return userComponent?.plus(CalendarPickerModule()) + } + + override fun provideAnalyticsFragmentComponent(module: AnalyticsFragmentModule?): AnalyticsFragmentComponent? { + return userComponent?.plus(module) + } + + override fun provideFilterPresenter(): FilterPresenter? { + return userComponent?.filterPresenter() + } + + override fun provideOUTreeComponent(module: OUTreeModule): OUTreeComponent? { + return serverComponent?.plus(module) + } + + override val syncComponentProvider: SyncComponentProvider + get() = SyncStatusDialogProvider() + + private fun areTrackingPermissionGranted(): Boolean { + val isUserLoggedIn = serverComponent != null && + serverComponent!!.userManager().isUserLoggedIn().blockingFirst() + if (!D2Manager.isD2Instantiated() || !isUserLoggedIn) { + return false + } + val granted = D2Manager.getD2().dataStoreModule().localDataStore() + .value(DATA_STORE_ANALYTICS_PERMISSION_KEY).blockingGet() + return granted != null && granted.value().toBoolean() + } +} diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt index a511fd29e74..357f625e5cf 100644 --- a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt @@ -27,6 +27,7 @@ import org.dhis2.mobile.sync.model.SMSConfigResult import org.dhis2.mobile.sync.model.SyncResult import org.dhis2.mobile.sync.model.toSyncPeriod import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.D2Manager import org.hisp.dhis.android.core.arch.call.D2ProgressStatus import org.hisp.dhis.android.core.arch.call.D2ProgressSyncStatus import org.hisp.dhis.android.core.common.State @@ -194,6 +195,43 @@ class AndroidSyncRepository( .blockingSet(stackTrace) } + override suspend fun isLoggedIn() = D2Manager.isD2Instantiated() && d2.userModule().blockingIsLogged() + + override suspend fun isServerAvailable(syncJobName: String): Boolean { + val isServerAvailable = + try { + d2.systemInfoModule().ping().blockingGet() + true + } catch (e: Exception) { + false + } + + return isServerAvailable + } + + override suspend fun setUnnavailableFlag(syncJobName: String) { + d2 + .dataStoreModule() + .localDataStore() + .value(syncJobName) + .blockingSet("unavailable") + } + + override suspend fun removeUnnavailableFlag(syncJobName: String) { + d2 + .dataStoreModule() + .localDataStore() + .value(syncJobName) + .blockingDeleteIfExist() + } + + override suspend fun isPeriodicJobFlagged(syncJobName: String): Boolean = + d2 + .dataStoreModule() + .localDataStore() + .value(syncJobName) + .blockingExists() + private suspend fun syncResult(): SyncResult { val eventsOk = d2 diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.android.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.android.kt index d35a2be4aec..797064d8582 100644 --- a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.android.kt +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.android.kt @@ -8,6 +8,7 @@ import org.dhis2.mobile.sync.data.SyncDataWorker import org.dhis2.mobile.sync.data.SyncMetadataWorker import org.dhis2.mobile.sync.data.SyncRepository import org.dhis2.mobile.sync.data.SyncSettingsWorker +import org.dhis2.mobile.sync.domain.CheckPeriodicJobs import org.dhis2.mobile.sync.domain.SyncData import org.dhis2.mobile.sync.domain.SyncMetadata import org.dhis2.mobile.sync.domain.SyncSettings @@ -41,6 +42,8 @@ actual val syncModule = factoryOf(::SyncSettings) + factoryOf(::CheckPeriodicJobs) + workerOf(::SyncDataWorker) workerOf(::SyncMetadataWorker) workerOf(::SyncSettingsWorker) diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt index b9e4bb6a7fc..46b61c7ba59 100644 --- a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt @@ -51,5 +51,15 @@ interface SyncRepository { suspend fun saveDataSyncError(stackTrace: String) + suspend fun isServerAvailable(syncJobName: String): Boolean + + suspend fun setUnnavailableFlag(syncJobName: String) + + suspend fun removeUnnavailableFlag(syncJobName: String) + + suspend fun isPeriodicJobFlagged(syncJobName: String): Boolean + + suspend fun isLoggedIn(): Boolean + suspend fun toggleSMS(enable: Boolean): Result<Unit> } diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/CheckPeriodicJobs.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/CheckPeriodicJobs.kt new file mode 100644 index 00000000000..c1cfa605577 --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/CheckPeriodicJobs.kt @@ -0,0 +1,30 @@ +package org.dhis2.mobile.sync.domain + +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.data.SyncRepository + +private const val SYNC_METADATA_NAME = "SYNC_METADATA" +private const val SYNC_DATA_NAME = "SYNC_DATA" + +class CheckPeriodicJobs( + private val syncRepository: SyncRepository, + private val syncBackgroundJobAction: SyncBackgroundJobAction, +) : UseCase<Unit, Unit> { + override suspend fun invoke(input: Unit): Result<Unit> { + if (!syncRepository.isLoggedIn()) return Result.failure(Exception("User not logged in")) + + val isMetadataSyncFlagged = syncRepository.isPeriodicJobFlagged(SYNC_METADATA_NAME) + val isDataSyncFlagged = syncRepository.isPeriodicJobFlagged(SYNC_DATA_NAME) + + if (isMetadataSyncFlagged) { + syncBackgroundJobAction.launchMetadataSync(0) + } + + if (isDataSyncFlagged) { + syncBackgroundJobAction.launchDataSync(0) + } + + return Result.success(Unit) + } +} diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncData.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncData.kt index 82ada6462a8..f272d28ed92 100644 --- a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncData.kt +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncData.kt @@ -6,12 +6,22 @@ import org.dhis2.mobile.sync.data.SyncRepository import org.dhis2.mobile.sync.model.DataSyncProgress import org.dhis2.mobile.sync.model.DataSyncTask +private const val SYNC_DATA_NAME = "SYNC_DATA" + class SyncData( private val repository: SyncRepository, private val syncStatusController: SyncStatusController, ) : UseCase<(progress: DataSyncProgress) -> Unit, Unit> { override suspend fun invoke(input: (progress: DataSyncProgress) -> Unit): Result<Unit> = try { + when (repository.isServerAvailable(SYNC_DATA_NAME)) { + true -> repository.removeUnnavailableFlag(SYNC_DATA_NAME) + false -> { + repository.setUnnavailableFlag(SYNC_DATA_NAME) + return Result.failure(DomainError.NetworkError("Server not available")) + } + } + syncStatusController.initDownloadProcess( repository.getAllProgramsInitialStatus().getOrNull() ?: emptyMap(), ) diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt index 5e522ccb47a..1a5d64032be 100644 --- a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt @@ -1,17 +1,28 @@ package org.dhis2.mobile.sync.domain import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.mobile.sync.data.SyncRepository import org.dhis2.mobile.sync.model.SMSConfigResult import org.dhis2.mobile.sync.model.SyncPeriod +private const val SYNC_METADATA_NAME = "SYNC_METADATA" + class SyncMetadata( private val repository: SyncRepository, private val syncBackgroundJobAction: SyncBackgroundJobAction, ) : UseCase<(progress: Int) -> Unit, Unit> { override suspend fun invoke(input: (progress: Int) -> Unit): Result<Unit> = try { + when (repository.isServerAvailable(SYNC_METADATA_NAME)) { + true -> repository.removeUnnavailableFlag(SYNC_METADATA_NAME) + false -> { + repository.setUnnavailableFlag(SYNC_METADATA_NAME) + return Result.failure(DomainError.NetworkError("Server not available")) + } + } + val initialMetadataSyncPeriod = repository.currentMetadataSyncPeriod() val initialDataSyncPeriod = repository.currentDataSyncPeriod() diff --git a/sync/src/commonTest/kotlin/org/dhis2/mobile/sync/domain/SyncMetadataTest.kt b/sync/src/commonTest/kotlin/org/dhis2/mobile/sync/domain/SyncMetadataTest.kt index 39bb092ba0d..950539c5aa0 100644 --- a/sync/src/commonTest/kotlin/org/dhis2/mobile/sync/domain/SyncMetadataTest.kt +++ b/sync/src/commonTest/kotlin/org/dhis2/mobile/sync/domain/SyncMetadataTest.kt @@ -26,6 +26,7 @@ class SyncMetadataTest { @Test fun `Should not trigger background jobs if sync periods do not change`() = runBlocking { + whenever(repository.isServerAvailable(any())) doReturn true whenever(repository.currentMetadataSyncPeriod()) doReturn SyncPeriod.Manual whenever(repository.currentDataSyncPeriod()) doReturn SyncPeriod.Manual whenever(repository.syncMetadata(any())) doReturn Result.success(Unit) @@ -41,6 +42,7 @@ class SyncMetadataTest { @Test fun `Should cancel metadata sync if period changes to manual`() = runBlocking { + whenever(repository.isServerAvailable(any())) doReturn true whenever(repository.currentMetadataSyncPeriod()).thenReturn( SyncPeriod.Every24Hour, SyncPeriod.Manual, @@ -59,6 +61,7 @@ class SyncMetadataTest { @Test fun `Should re-launch metadata sync if period changes`() = runBlocking { + whenever(repository.isServerAvailable(any())) doReturn true whenever(repository.currentMetadataSyncPeriod()).thenReturn( SyncPeriod.Every24Hour, SyncPeriod.Every7Days, @@ -76,6 +79,7 @@ class SyncMetadataTest { @Test fun `Should cancel data sync if period changes to manual`() = runBlocking { + whenever(repository.isServerAvailable(any())) doReturn true whenever(repository.currentMetadataSyncPeriod()) doReturn SyncPeriod.Manual whenever(repository.currentDataSyncPeriod()).thenReturn( SyncPeriod.Every24Hour, @@ -93,6 +97,7 @@ class SyncMetadataTest { @Test fun `Should re-launch data sync if period changes`() = runBlocking { + whenever(repository.isServerAvailable(any())) doReturn true whenever(repository.currentMetadataSyncPeriod()) doReturn SyncPeriod.Manual whenever(repository.currentDataSyncPeriod()).thenReturn( SyncPeriod.Every24Hour, @@ -110,6 +115,7 @@ class SyncMetadataTest { @Test fun `Should return failure and save state when metadata sync fails`() = runBlocking { + whenever(repository.isServerAvailable(any())) doReturn true val exception = Exception("Sync failed") whenever(repository.currentMetadataSyncPeriod()) doReturn SyncPeriod.Manual whenever(repository.currentDataSyncPeriod()) doReturn SyncPeriod.Manual From d21da9b05c610238c94bb600518c7da4e777d1a1 Mon Sep 17 00:00:00 2001 From: Ferdy Rodriguez <ferdyrodriguez@gmail.com> Date: Mon, 22 Jun 2026 07:13:06 +0200 Subject: [PATCH 253/260] fixes that now it shows the new version dialog on Initial sync and when the user manually checks for updates in the Settings menu (#4927) --- .../dhis2/data/service/CheckVersionWorker.kt | 2 +- .../dhis2/data/service/VersionRepository.kt | 9 +++++---- .../main/java/org/dhis2/di/ServerModule.kt | 4 ++-- .../org/dhis2/usescases/main/MainModule.kt | 1 - .../org/dhis2/usescases/main/MainViewModel.kt | 4 ++-- .../main/domain/LaunchInitialSync.kt | 7 ++++++- .../usescases/settings/SyncManagerFragment.kt | 4 +++- .../usescases/settings/SyncManagerModule.kt | 2 +- .../settings/SyncManagerPresenter.kt | 4 +++- .../settings/domain/CheckVersionUpdate.kt | 19 ++++++++---------- .../main/domain/LaunchInitialSyncTest.kt | 20 +++++++++++-------- .../settings/SyncManagerPresenterTest.kt | 1 + .../settings/domain/CheckVersionUpdateTest.kt | 8 ++++---- 13 files changed, 48 insertions(+), 37 deletions(-) diff --git a/app/src/main/java/org/dhis2/data/service/CheckVersionWorker.kt b/app/src/main/java/org/dhis2/data/service/CheckVersionWorker.kt index 531d10c6f03..626532a8556 100644 --- a/app/src/main/java/org/dhis2/data/service/CheckVersionWorker.kt +++ b/app/src/main/java/org/dhis2/data/service/CheckVersionWorker.kt @@ -11,7 +11,7 @@ class CheckVersionWorker( ) : CoroutineWorker(context, workerParams) { override suspend fun doWork(): Result { - versionRepository.checkVersionUpdates() + versionRepository.downloadLatestVersionInfo() return Result.success() } } diff --git a/app/src/main/java/org/dhis2/data/service/VersionRepository.kt b/app/src/main/java/org/dhis2/data/service/VersionRepository.kt index 49c65337ce8..6edce0112f8 100644 --- a/app/src/main/java/org/dhis2/data/service/VersionRepository.kt +++ b/app/src/main/java/org/dhis2/data/service/VersionRepository.kt @@ -21,12 +21,12 @@ class VersionRepository( private val _newAppVersion = MutableSharedFlow<String?>(replay = 1) val newAppVersion: SharedFlow<String?> get() = _newAppVersion - suspend fun downloadLatestVersionInfo() { + suspend fun downloadLatestVersionInfo(): String? { d2.settingModule().latestAppVersion().blockingDownload() - checkVersionUpdates() + return checkVersionUpdates() } - suspend fun getLatestVersionInfo(): String? = + private fun getLatestVersionInfo(): String? = d2 .settingModule() .latestAppVersion() @@ -34,9 +34,10 @@ class VersionRepository( ?.version() .takeIf { it?.newVersion(BuildConfig.VERSION_NAME) ?: false } - suspend fun checkVersionUpdates() { + private suspend fun checkVersionUpdates(): String? { val versionNameOrNull = getLatestVersionInfo() _newAppVersion.emit(versionNameOrNull) + return versionNameOrNull } fun download( diff --git a/app/src/main/java/org/dhis2/di/ServerModule.kt b/app/src/main/java/org/dhis2/di/ServerModule.kt index e7c4ea4805f..1594493acd8 100644 --- a/app/src/main/java/org/dhis2/di/ServerModule.kt +++ b/app/src/main/java/org/dhis2/di/ServerModule.kt @@ -3,7 +3,7 @@ package org.dhis2.di import org.dhis2.data.service.VersionRepository import org.hisp.dhis.android.core.D2Configuration import org.hisp.dhis.android.core.D2Manager -import org.koin.core.module.dsl.factoryOf +import org.koin.core.module.dsl.singleOf import org.koin.dsl.module fun serverModule(d2Configuration: D2Configuration) = @@ -19,5 +19,5 @@ fun serverModule(d2Configuration: D2Configuration) = D2Manager.getD2() } } - factoryOf(::VersionRepository) + singleOf(::VersionRepository) } diff --git a/app/src/main/java/org/dhis2/usescases/main/MainModule.kt b/app/src/main/java/org/dhis2/usescases/main/MainModule.kt index 4e9b14cc5fa..a8119a47442 100644 --- a/app/src/main/java/org/dhis2/usescases/main/MainModule.kt +++ b/app/src/main/java/org/dhis2/usescases/main/MainModule.kt @@ -60,7 +60,6 @@ val mainModule = module { factory { FilterManager.getInstance() } - singleOf(::VersionRepository) factoryOf(::ResourceManager) factory { params -> MainNavigator( diff --git a/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt b/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt index f4d9452d762..f9add35b632 100644 --- a/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt @@ -164,13 +164,13 @@ class MainViewModel( val navigationBarItems = configureHomeNavigationBar().getOrDefault(emptyList()) val homeFilters = getHomeFilters().getOrDefault(emptyList()) - _homeScreenState.update { + _homeScreenState.update { current -> HomeScreenState( userName = userName, navigationBarItems = navigationBarItems, homeFilters = homeFilters, activeFilters = filterManager.totalFilters, - versionToUpdate = VersionToUpdateState.None, + versionToUpdate = current.versionToUpdate, filterButtonVisible = initialScreen.isPrograms(), bottomNavigationBarVisible = initialScreen.isHome() && navigationBarItems.size > 1, syncButtonVisible = initialScreen.isHome(), diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/LaunchInitialSync.kt b/app/src/main/java/org/dhis2/usescases/main/domain/LaunchInitialSync.kt index 886d645c9ff..2be4d829b4e 100644 --- a/app/src/main/java/org/dhis2/usescases/main/domain/LaunchInitialSync.kt +++ b/app/src/main/java/org/dhis2/usescases/main/domain/LaunchInitialSync.kt @@ -5,6 +5,7 @@ import org.dhis2.mobile.commons.domain.UseCase import org.dhis2.mobile.commons.error.DomainError import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.usescases.main.data.HomeRepository +import timber.log.Timber class LaunchInitialSync( private val skipSync: Boolean, @@ -17,7 +18,11 @@ class LaunchInitialSync( if (skipSync || homeRepository.isImportedDb() || homeRepository.getInitialSyncDone()) { Result.success(InitialSyncAction.Skip) } else { - versionRepository.checkVersionUpdates() + try { + versionRepository.downloadLatestVersionInfo() + } catch (e: Exception) { + Timber.w(e, "Version check failed during initial sync") + } syncBackgroundJobAction.launchDataSync(0) Result.success(InitialSyncAction.Syncing) } diff --git a/app/src/main/java/org/dhis2/usescases/settings/SyncManagerFragment.kt b/app/src/main/java/org/dhis2/usescases/settings/SyncManagerFragment.kt index 77922793602..5388b2e0a33 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/SyncManagerFragment.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/SyncManagerFragment.kt @@ -17,6 +17,7 @@ import org.dhis2.commons.data.FormFileProvider import org.dhis2.commons.data.FormFileProvider.init import org.dhis2.commons.resources.ColorUtils import org.dhis2.mobile.login.authentication.TwoFASettingsActivity +import org.dhis2.data.service.VersionRepository import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.usescases.general.FragmentGlobalAbstract import org.dhis2.usescases.reservedValue.ReservedValueActivity @@ -35,6 +36,7 @@ class SyncManagerFragment : FragmentGlobalAbstract() { private val presenter: SyncManagerPresenter by viewModels { settingsViewModelFactory } private val syncBackgroundJobAction: SyncBackgroundJobAction by inject() + private val versionRepository: VersionRepository by inject() @JvmField @Inject @@ -44,7 +46,7 @@ class SyncManagerFragment : FragmentGlobalAbstract() { super.onAttach(context) app() .userComponent() - ?.plus(SyncManagerModule(syncBackgroundJobAction)) + ?.plus(SyncManagerModule(syncBackgroundJobAction, versionRepository)) ?.inject(this) } diff --git a/app/src/main/java/org/dhis2/usescases/settings/SyncManagerModule.kt b/app/src/main/java/org/dhis2/usescases/settings/SyncManagerModule.kt index c1819f82b8e..51ec74e59db 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/SyncManagerModule.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/SyncManagerModule.kt @@ -29,6 +29,7 @@ import org.hisp.dhis.android.core.D2 @Module class SyncManagerModule( private val syncBackgroundJobAction: SyncBackgroundJobAction, + private val versionRepository: VersionRepository, ) { @Provides @PerFragment @@ -140,7 +141,6 @@ class SyncManagerModule( @Provides @PerFragment fun provideCheckVersionUpdate( - versionRepository: VersionRepository, settingsMessages: SettingsMessages, resourceManager: ResourceManager, ) = CheckVersionUpdate( diff --git a/app/src/main/java/org/dhis2/usescases/settings/SyncManagerPresenter.kt b/app/src/main/java/org/dhis2/usescases/settings/SyncManagerPresenter.kt index d33719c18ed..a23c557a6ce 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/SyncManagerPresenter.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/SyncManagerPresenter.kt @@ -14,6 +14,8 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import org.dhis2.commons.network.NetworkUtils import org.dhis2.commons.viewmodel.DispatcherProvider +import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.commons.extensions.launchUseCase import org.dhis2.usescases.settings.domain.CheckVersionUpdate import org.dhis2.usescases.settings.domain.DeleteLocalData import org.dhis2.usescases.settings.domain.ExportDatabase @@ -142,7 +144,7 @@ class SyncManagerPresenter( } fun onCheckVersionUpdate() { - viewModelScope.launch(dispatcherProvider.io()) { + launchUseCase(dispatcherProvider.io()) { checkVersionUpdate() } } diff --git a/app/src/main/java/org/dhis2/usescases/settings/domain/CheckVersionUpdate.kt b/app/src/main/java/org/dhis2/usescases/settings/domain/CheckVersionUpdate.kt index f570fbe6434..d331c76debe 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/domain/CheckVersionUpdate.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/domain/CheckVersionUpdate.kt @@ -1,25 +1,22 @@ package org.dhis2.usescases.settings.domain -import androidx.lifecycle.MutableLiveData import org.dhis2.R import org.dhis2.commons.resources.ResourceManager import org.dhis2.data.service.VersionRepository +import org.dhis2.mobile.commons.domain.UseCase class CheckVersionUpdate( private val versionRepository: VersionRepository, private val settingsMessages: SettingsMessages, private val resourceManager: ResourceManager, -) { - private val updatesLoading = MutableLiveData<Boolean>() - - suspend operator fun invoke() { - updatesLoading.postValue(true) - val newVersion = versionRepository.getLatestVersionInfo() - if (newVersion != null) { - versionRepository.checkVersionUpdates() - } else { +) : UseCase<Unit, Unit> { + override suspend fun invoke(input: Unit): Result<Unit> = try { + val newVersion = versionRepository.downloadLatestVersionInfo() + if (newVersion == null) { settingsMessages.sendMessage(resourceManager.getString(R.string.no_updates)) } - updatesLoading.postValue(false) + Result.success(Unit) + } catch (e: Exception) { + Result.failure(e) } } diff --git a/app/src/test/java/org/dhis2/usescases/main/domain/LaunchInitialSyncTest.kt b/app/src/test/java/org/dhis2/usescases/main/domain/LaunchInitialSyncTest.kt index 17d861dfa9a..fbb09035be3 100644 --- a/app/src/test/java/org/dhis2/usescases/main/domain/LaunchInitialSyncTest.kt +++ b/app/src/test/java/org/dhis2/usescases/main/domain/LaunchInitialSyncTest.kt @@ -12,6 +12,7 @@ import org.junit.Test import org.mockito.kotlin.doReturn import org.mockito.kotlin.given import org.mockito.kotlin.mock +import org.mockito.kotlin.never import org.mockito.kotlin.verify import org.mockito.kotlin.verifyNoInteractions import org.mockito.kotlin.whenever @@ -57,6 +58,7 @@ class LaunchInitialSyncTest { assertTrue(result.isSuccess) assertEquals(InitialSyncAction.Skip, result.getOrNull()) + verify(versionRepository, never()).downloadLatestVersionInfo() } @Test @@ -76,10 +78,11 @@ class LaunchInitialSyncTest { assertTrue(result.isSuccess) assertEquals(InitialSyncAction.Skip, result.getOrNull()) + verify(versionRepository, never()).downloadLatestVersionInfo() } @Test - fun `should return Syncing and launch initial sync`() = + fun `should return Syncing, check version and launch initial sync`() = runTest { whenever(homeRepository.isImportedDb()) doReturn false whenever(homeRepository.getInitialSyncDone()) doReturn false @@ -95,17 +98,17 @@ class LaunchInitialSyncTest { assertTrue(result.isSuccess) assertEquals(InitialSyncAction.Syncing, result.getOrNull()) - verify(versionRepository).checkVersionUpdates() + verify(versionRepository).downloadLatestVersionInfo() + verify(syncBackgroundJobAction).launchDataSync(0) } @Test - fun `should return failure if check version update fails`() = + fun `should still launch sync even if version check fails`() = runTest { - val exception = DomainError.DatabaseError("Error") whenever(homeRepository.isImportedDb()) doReturn false whenever(homeRepository.getInitialSyncDone()) doReturn false - given(versionRepository.checkVersionUpdates()).willAnswer { - throw exception + given(versionRepository.downloadLatestVersionInfo()).willAnswer { + throw RuntimeException("Network error") } launchInitialSync = LaunchInitialSync( @@ -117,8 +120,9 @@ class LaunchInitialSyncTest { val result = launchInitialSync() - assertTrue(result.isFailure) - assertEquals(exception, result.exceptionOrNull()) + assertTrue(result.isSuccess) + assertEquals(InitialSyncAction.Syncing, result.getOrNull()) + verify(syncBackgroundJobAction).launchDataSync(0) } @Test diff --git a/app/src/test/java/org/dhis2/usescases/settings/SyncManagerPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/settings/SyncManagerPresenterTest.kt index 7fe223dfad8..5a33800a241 100644 --- a/app/src/test/java/org/dhis2/usescases/settings/SyncManagerPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/settings/SyncManagerPresenterTest.kt @@ -15,6 +15,7 @@ import org.dhis2.bindings.toDate import org.dhis2.commons.Constants import org.dhis2.commons.network.NetworkUtils import org.dhis2.commons.viewmodel.DispatcherProvider +import org.dhis2.mobile.commons.domain.invoke import org.dhis2.usescases.settings.domain.CheckVersionUpdate import org.dhis2.usescases.settings.domain.DeleteLocalData import org.dhis2.usescases.settings.domain.ExportDatabase diff --git a/app/src/test/java/org/dhis2/usescases/settings/domain/CheckVersionUpdateTest.kt b/app/src/test/java/org/dhis2/usescases/settings/domain/CheckVersionUpdateTest.kt index 2ba584a13e6..dd2d2af94ef 100644 --- a/app/src/test/java/org/dhis2/usescases/settings/domain/CheckVersionUpdateTest.kt +++ b/app/src/test/java/org/dhis2/usescases/settings/domain/CheckVersionUpdateTest.kt @@ -4,6 +4,7 @@ import kotlinx.coroutines.test.runTest import org.dhis2.R import org.dhis2.commons.resources.ResourceManager import org.dhis2.data.service.VersionRepository +import org.dhis2.mobile.commons.domain.invoke import org.junit.Before import org.junit.Test import org.mockito.Mockito.mock @@ -31,19 +32,18 @@ class CheckVersionUpdateTest { @Test fun `should check version update`() = runTest { - whenever(versionRepository.getLatestVersionInfo()) doReturn "new.version.name" + whenever(versionRepository.downloadLatestVersionInfo()) doReturn "new.version.name" checkVersionUpdate() - verify(versionRepository, times(1)).checkVersionUpdates() + verify(versionRepository, times(1)).downloadLatestVersionInfo() } @Test fun `should send no new version message`() = runTest { val noUpdateMsg = "No updates" - whenever(versionRepository.getLatestVersionInfo()) doReturn null + whenever(versionRepository.downloadLatestVersionInfo()) doReturn null whenever(resourceManager.getString(R.string.no_updates)) doReturn noUpdateMsg checkVersionUpdate() verify(settingsMessages, times(1)).sendMessage(noUpdateMsg) - verify(versionRepository, times(0)).checkVersionUpdates() } } From 44eb22cb7a9a02b99f6e1467a75e513eafc8412f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manu=20Mu=C3=B1oz?= <manu.munoz@dhis2.org> Date: Tue, 23 Jun 2026 10:28:24 +0200 Subject: [PATCH 254/260] fix: [ANDROAPP-7668] don't delete file value when not downloaded (#4923) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Manu Muñoz <manu.munoz@dhis2.org> --- .../src/main/java/org/dhis2/commons/bindings/ValueExtensions.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/commons/src/main/java/org/dhis2/commons/bindings/ValueExtensions.kt b/commons/src/main/java/org/dhis2/commons/bindings/ValueExtensions.kt index e3273bf880f..014481f6c76 100644 --- a/commons/src/main/java/org/dhis2/commons/bindings/ValueExtensions.kt +++ b/commons/src/main/java/org/dhis2/commons/bindings/ValueExtensions.kt @@ -243,6 +243,8 @@ fun TrackedEntityDataValueObjectRepository.blockingGetValueCheck( ) ) { blockingGet() + } else if (it.valueType()?.isFile == true) { + null } else { blockingDeleteIfExist() null From 4cc7238fd22e6510addfc3f016da774e0a3a127a Mon Sep 17 00:00:00 2001 From: Xavier Molloy <xavi@dhis2.org> Date: Tue, 23 Jun 2026 12:02:31 +0200 Subject: [PATCH 255/260] fix: [ANDROAPP-7658] Do not display sync infobar from event capture activity (#4917) * fix: [ANDROAPP-7658] Do not display sync infobar if teiDashboard is displayed from the event capture activity * fix: [ANDROAPP-7658] fix unit tests * fix: [ANDROAPP-7658] hide sync button in landscape when creating new events --- .../eventCapture/EventCaptureActivity.kt | 4 +- .../teidata/TEIDataFragment.kt | 8 +++- .../teidata/TEIDataModule.kt | 40 ++++++++++--------- .../teidata/TEIDataPresenter.kt | 3 ++ .../data/TeiDataPresenterTest.kt | 1 + 5 files changed, 35 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureActivity.kt b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureActivity.kt index daa9d93d5db..fb492b847a6 100644 --- a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureActivity.kt +++ b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureActivity.kt @@ -142,7 +142,7 @@ class EventCaptureActivity : ViewModelProvider(this, viewModelFactory)[DashboardViewModel::class.java] supportFragmentManager .beginTransaction() - .replace(R.id.tei_column, newInstance(programUid, teiUid, enrollmentUid)) + .replace(R.id.tei_column, newInstance(programUid, teiUid, enrollmentUid, true)) .commit() dashboardViewModel?.updateSelectedEventUid(eventUid) } @@ -655,6 +655,8 @@ class EventCaptureActivity : putExtra(Constants.EVENT_UID, eventUid) putExtra(Constants.PROGRAM_UID, programUid) putExtra(Constants.EVENT_MODE, eventMode) + putExtra("FRAGMENT_FROM_EVENT_CAPTURE_ACTIVITY", true) + } } } diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataFragment.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataFragment.kt index 1f27a1808f1..8e3ea87c3a5 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataFragment.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataFragment.kt @@ -129,6 +129,7 @@ class TEIDataFragment : getString("TEI_UID") ?: throw NullPointerException("A TEI uid is required to launch fragment") val enrollmentUid = getString("ENROLLMENT_UID") ?: "" + val fragmentFromEventCaptureActivity = getBoolean("FRAGMENT_FROM_EVENT_CAPTURE_ACTIVITY", false) app() .dashboardComponent() ?.plus( @@ -137,6 +138,7 @@ class TEIDataFragment : programUid, teiUid, enrollmentUid, + fragmentFromEventCaptureActivity, requireActivity().activityResultRegistry, ), )?.inject(this@TEIDataFragment) @@ -246,7 +248,7 @@ class TEIDataFragment : val eventCount by presenter.events.map { it.count() }.observeAsState(0) val syncInfoBar = - dashboardModel.takeIf { it is DashboardEnrollmentModel }?.let { + dashboardModel.takeIf { it is DashboardEnrollmentModel && !presenter.fragmentIsFromEventCaptureActivity() }?.let { infoBarMapper.map( infoBarType = InfoBarType.SYNC, item = dashboardModel as DashboardEnrollmentModel, @@ -758,12 +760,16 @@ class TEIDataFragment : programUid: String?, teiUid: String?, enrollmentUid: String?, + fragmentFromEventCaptureActivity: Boolean? = null, ): TEIDataFragment { val fragment = TEIDataFragment() val args = Bundle() args.putString("PROGRAM_UID", programUid) args.putString("TEI_UID", teiUid) args.putString("ENROLLMENT_UID", enrollmentUid) + fragmentFromEventCaptureActivity?.let { + args.putBoolean("FRAGMENT_FROM_EVENT_CAPTURE_ACTIVITY", fragmentFromEventCaptureActivity) + } fragment.arguments = args return fragment } diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataModule.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataModule.kt index 484f9a05b85..6cd71c968b7 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataModule.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataModule.kt @@ -39,6 +39,7 @@ class TEIDataModule( private val programUid: String?, private val teiUid: String, private val enrollmentUid: String, + private val fragmentIsFromEventCaptureActivity: Boolean, private val registry: ActivityResultRegistry, ) { @Provides @@ -61,25 +62,26 @@ class TEIDataModule( preferences: PreferenceProvider, ): TEIDataPresenter = TEIDataPresenter( - view, - d2, - dashboardRepository, - teiDataRepository, - ruleEngineHelper, - programUid, - teiUid, - enrollmentUid, - schedulerProvider, - analyticsHelper, - valueStore, - optionsRepository, - getNewEventCreationTypeOptions, - eventCreationOptionsMapper, - contractHandler, - dispatcherProvider, - createEventUseCase, - d2ErrorUtils, - preferences, + view = view, + d2 = d2, + dashboardRepository = dashboardRepository, + teiDataRepository = teiDataRepository, + ruleEngineHelper = ruleEngineHelper, + programUid = programUid, + teiUid = teiUid, + enrollmentUid = enrollmentUid, + fragmentIsFromEventCaptureActivity = fragmentIsFromEventCaptureActivity, + schedulerProvider = schedulerProvider, + analyticsHelper = analyticsHelper, + valueStore = valueStore, + optionsRepository = optionsRepository, + getNewEventCreationTypeOptions = getNewEventCreationTypeOptions, + eventCreationOptionsMapper = eventCreationOptionsMapper, + contractHandler = contractHandler, + dispatcher = dispatcherProvider, + createEventUseCase = createEventUseCase, + d2ErrorUtils = d2ErrorUtils, + preferences = preferences, ) @Provides diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataPresenter.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataPresenter.kt index 1beb0ac69e8..8c0c057c5b0 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataPresenter.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataPresenter.kt @@ -65,6 +65,7 @@ class TEIDataPresenter( private var programUid: String?, private val teiUid: String, private val enrollmentUid: String, + private val fragmentIsFromEventCaptureActivity: Boolean, private val schedulerProvider: SchedulerProvider, private val analyticsHelper: AnalyticsHelper, private val valueStore: FormValueStore, @@ -237,6 +238,8 @@ class TEIDataPresenter( } } + fun fragmentIsFromEventCaptureActivity(): Boolean = fragmentIsFromEventCaptureActivity + fun completeEnrollment() { val hasWriteAccessInProgram = programUid?.let { diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/data/TeiDataPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/data/TeiDataPresenterTest.kt index 2fe28392f1a..101fe6c8b62 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/data/TeiDataPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/data/TeiDataPresenterTest.kt @@ -96,6 +96,7 @@ class TeiDataPresenterTest { programUid, teiUid, enrollmentUid, + false, schedulers, analytics, valueStore, From 0ba1ba09ef563934e0598962a206ffad4005918a Mon Sep 17 00:00:00 2001 From: Ferdy Rodriguez <ferdyrodriguez@gmail.com> Date: Tue, 23 Jun 2026 14:51:50 +0200 Subject: [PATCH 256/260] fix: [ANDROAPP-7637] Rechecks navigational bar server config after metadata sync (#4933) * Rechecks navigational bar server config after metadata sync * Fix integration tests of MainViewModel --- .../org/dhis2/usescases/main/MainViewModel.kt | 46 +++++++++++++++++++ .../main/MainViewModelIntegrationTest.kt | 3 ++ .../dhis2/usescases/main/MainViewModelTest.kt | 6 +++ 3 files changed, 55 insertions(+) diff --git a/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt b/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt index f9add35b632..75f9537c86b 100644 --- a/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt @@ -9,6 +9,7 @@ import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.receiveAsFlow @@ -29,8 +30,11 @@ import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.mobile.commons.domain.invoke import org.dhis2.mobile.commons.extensions.launchUseCase import org.dhis2.mobile.commons.providers.PreferenceProvider +import org.dhis2.mobile.sync.data.METADATA_SYNC_NOW import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.mobile.sync.domain.SyncStatusController +import org.dhis2.mobile.sync.model.SyncJobStatus +import org.dhis2.mobile.sync.model.SyncStatus import org.dhis2.mobile.sync.model.SyncStatusData import org.dhis2.usescases.main.domain.CheckSingleNavigation import org.dhis2.usescases.main.domain.ConfigureHomeNavigationBar @@ -127,6 +131,11 @@ class MainViewModel( _homeEffects.send(HomeEffect.OrgUnitFilterRequest) }.launchIn(viewModelScope) + syncBackgroundJobAction + .observeMetadataJob() + .onEach(::handleMetadataSync) + .launchIn(viewModelScope) + launchUseCase(dispatcher.io()) { launchInitialSync().fold( onSuccess = ::handleInitialSyncResult, @@ -223,6 +232,43 @@ class MainViewModel( } } + private fun handleMetadataSync(jobs: List<SyncJobStatus>) { + jobs.forEach { job -> + if (job.tags.contains(METADATA_SYNC_NOW)) { + when (job.status) { + SyncStatus.Running, SyncStatus.Enqueue -> { + _homeScreenState.update { + it.copy( + filterButtonVisible = false, + bottomNavigationBarVisible = false, + syncButtonVisible = false, + ) + } + } + SyncStatus.Succeed -> { + launchUseCase(dispatcher.io()) { + val navigationBarItems = + configureHomeNavigationBar().getOrDefault(emptyList()) + _homeScreenState.update { + it.copy( + filterButtonVisible = true, + navigationBarItems = navigationBarItems, + bottomNavigationBarVisible = + it.currentScreen.isHome() && navigationBarItems.size > 1, + syncButtonVisible = true, + ) + } + } + } + SyncStatus.Failed -> _homeScreenState.update { it.copy(syncButtonVisible = true) } + else -> { + // Do nothing + } + } + } + } + } + fun setOrgUnitFilters(selectedOrgUnits: List<OrganisationUnit>) { filterManager.addOrgUnits(selectedOrgUnits) } diff --git a/app/src/test/java/org/dhis2/usescases/main/MainViewModelIntegrationTest.kt b/app/src/test/java/org/dhis2/usescases/main/MainViewModelIntegrationTest.kt index 9f14b3c78b5..ea5540a4474 100644 --- a/app/src/test/java/org/dhis2/usescases/main/MainViewModelIntegrationTest.kt +++ b/app/src/test/java/org/dhis2/usescases/main/MainViewModelIntegrationTest.kt @@ -20,6 +20,7 @@ import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.mobile.commons.providers.PreferenceProvider import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.mobile.sync.domain.SyncStatusController +import org.dhis2.mobile.sync.model.SyncJobStatus import org.dhis2.mobile.sync.model.SyncStatusData import org.dhis2.usescases.main.data.HomeRepository import org.dhis2.usescases.main.domain.CheckSingleNavigation @@ -83,6 +84,7 @@ class MainViewModelIntegrationTest { private val scheduleNewVersionAlert: ScheduleNewVersionAlert = mock() private val syncStatusFlow = MutableStateFlow(SyncStatusData()) + private val metadataJobFlow = MutableStateFlow<List<SyncJobStatus>>(emptyList()) private val newVersionFlow = MutableSharedFlow<String>() private val filterManagerFlow = MutableStateFlow(0) @@ -120,6 +122,7 @@ class MainViewModelIntegrationTest { ) whenever(syncStatusController.observeDownloadProcess()) doReturn syncStatusFlow + whenever(syncBackgroundJobAction.observeMetadataJob()) doReturn metadataJobFlow whenever(scheduleNewVersionAlert.newVersionFlow) doReturn newVersionFlow whenever(filterManager.asFlow(any())) doReturn filterManagerFlow whenever(filterManager.periodRequest) doReturn mock() diff --git a/app/src/test/java/org/dhis2/usescases/main/MainViewModelTest.kt b/app/src/test/java/org/dhis2/usescases/main/MainViewModelTest.kt index 34d6b3e81f6..2887dfdf976 100644 --- a/app/src/test/java/org/dhis2/usescases/main/MainViewModelTest.kt +++ b/app/src/test/java/org/dhis2/usescases/main/MainViewModelTest.kt @@ -24,8 +24,11 @@ import org.dhis2.commons.resources.ResourceManager import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.mobile.commons.domain.invoke import org.dhis2.mobile.commons.providers.PreferenceProvider +import org.dhis2.mobile.sync.data.METADATA_SYNC_NOW import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.mobile.sync.domain.SyncStatusController +import org.dhis2.mobile.sync.model.SyncJobStatus +import org.dhis2.mobile.sync.model.SyncStatus import org.dhis2.mobile.sync.model.SyncStatusData import org.dhis2.usescases.main.domain.CheckSingleNavigation import org.dhis2.usescases.main.domain.ConfigureHomeNavigationBar @@ -48,6 +51,7 @@ import org.dhis2.utils.MainCoroutineScopeRule import org.dhis2.utils.analytics.CLOSE_SESSION import org.dhis2.utils.customviews.navigationbar.NavigationPage import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarItem +import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Rule @@ -96,6 +100,7 @@ class MainViewModelTest { private val syncStatusFlow = MutableStateFlow(SyncStatusData()) private val newVersionFlow = MutableSharedFlow<String>() + private val metadataJobFlow = MutableStateFlow<List<SyncJobStatus>>(emptyList()) @Before fun setUp() = runTest { @@ -108,6 +113,7 @@ class MainViewModelTest { whenever(filterManager.ouTreeFlowable()) doReturn mock() whenever(launchInitialSync()) doReturn Result.success(InitialSyncAction.Skip) whenever(checkSingleNavigation()) doReturn Result.failure(Exception("no single navigation")) + whenever(syncBackgroundJobAction.observeMetadataJob()) doReturn metadataJobFlow viewModel = MainViewModel( preferences = preferences, From 6ef5a2b2e2901276ba719a736a9cf63c7e543025 Mon Sep 17 00:00:00 2001 From: Pablo <pablo@dhis2.org> Date: Wed, 24 Jun 2026 13:13:03 +0200 Subject: [PATCH 257/260] fix: [ANDROAPP-7664] Improve load time of dashboard screen [skip size] (#4919) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: [ANDROAPP-7664] Improve load time of dashboard screen * Remove default analytics related tests * set runTest in dashboardViewModelTest * fix dashboard android tests * revert changes to AndroidIdlingResource.kt * chained events calling increment * remove unnecessary ui thread call * use unconditional coroutine tracker methods * use unconditional coroutine tracker methods * fix infinite collection in CredentialsViewModel.kt * add decrement to error flow * test: [ANDROAPP-7664] decrement idling resource on error in note detail presenter * force decrement to idle * fix sonarcloud comments * do not retry on timeout * Root cause — DashboardViewModel.navigationBarUIState used NavigationBarUIState(items=emptyList(), TEIDashboardItems.DETAILS) as the stateIn initial value. This caused the LaunchedEffect in TeiDashboardMobileActivity to immediately navigate to TEIDataFragment (the DETAILS tab) on first composition, even in landscape mode where the DETAILS tab isn't displayed. loadNavigationBarItems() would then quickly determine DETAILS shouldn't be shown in landscape and switch the selected item to the first real tab (ANALYTICS, NOTES, etc.), causing TEIDataFragment to be immediately paused. onPause() calls presenter.onDettach() → compositeDisposable.clear(), but because the outer switchMap subscription uses subscribeOn(io), the increment() inside the switchMap body can run asynchronously on the IO thread after the clear. This left TeiDataIdlingResourceSingleton's counter stuck at 1 — TEI_DATA never became idle — and Espresso timed out. Fix (DashboardViewModel.kt) — Changed the stateIn initial value from NavigationBarUIState(items=emptyList(), TEIDashboardItems.DETAILS) to NavigationBarUIState() (null selectedItem). This means: - No fragment navigation happens until loadNavigationBarItems() completes with the actual items - In landscape, TEIDataFragment is never created and TEI_DATA stays idle - In portrait, navigation to DETAILS happens once (after nav items load), exactly the same net result as before --------- Co-authored-by: Xavier Molloy <xavi@dhis2.org> --- .../java/org/dhis2/common/BaseRobot.kt | 9 +- .../java/org/dhis2/usescases/BaseTest.kt | 6 + .../teidashboard/TeiDashboardTest.kt | 6 + .../teidashboard/robot/TeiDashboardRobot.kt | 2 + .../notes/noteDetail/NoteDetailPresenter.kt | 13 +- .../teiDashboard/DashboardRepository.kt | 2 + .../teiDashboard/DashboardRepositoryImpl.kt | 2 + .../teiDashboard/DashboardViewModel.kt | 205 ++++++++++-------- .../TeiDashboardMobileActivity.kt | 36 +-- .../teidata/TEIDataFragment.kt | 43 ++-- .../teidata/TEIDataPresenter.kt | 10 +- .../teidata/TeiDataIdlingResourceSingleton.kt | 4 +- .../teiDashboard/ui/TeiDashboardMenu.kt | 2 +- .../teiDashboard/DashboardViewModelTest.kt | 123 +++++++---- .../coroutine/AndroidIdlingResource.kt | 10 + .../coroutine/CoroutineIdlingResource.kt | 4 + .../commons/coroutine/CoroutineTracker.kt | 8 + .../commons/coroutine/NoOpIdlingResource.kt | 8 + .../commons/extensions/ViewModelExtensions.kt | 4 +- .../analytics/charts/ChartsRepositoryImpl.kt | 112 +--------- .../org/analytics/charts/di/ChartsInjector.kt | 41 ++-- .../org/analytics/charts/di/ChartsModule.kt | 18 -- .../charts/mappers/DataElementToGraph.kt | 61 ------ .../charts/mappers/ProgramIndicatorToGraph.kt | 61 ------ .../analytics/charts/ChartsRepositoryTest.kt | 177 +++++---------- .../main/ui/viewmodel/CredentialsViewModel.kt | 9 +- 26 files changed, 387 insertions(+), 589 deletions(-) delete mode 100644 dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/DataElementToGraph.kt delete mode 100644 dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/ProgramIndicatorToGraph.kt diff --git a/app/src/androidTest/java/org/dhis2/common/BaseRobot.kt b/app/src/androidTest/java/org/dhis2/common/BaseRobot.kt index 57f243124e9..2ae634a7635 100644 --- a/app/src/androidTest/java/org/dhis2/common/BaseRobot.kt +++ b/app/src/androidTest/java/org/dhis2/common/BaseRobot.kt @@ -11,6 +11,7 @@ import androidx.compose.ui.test.junit4.ComposeContentTestRule import androidx.compose.ui.test.onNodeWithText import androidx.test.espresso.Espresso.onView import androidx.test.espresso.FailureHandler +import androidx.test.espresso.IdlingResourceTimeoutException import androidx.test.espresso.NoMatchingViewException import androidx.test.espresso.UiController import androidx.test.espresso.ViewAction @@ -130,9 +131,11 @@ open class BaseRobot { } catch (e: Exception) { - if (tries == maxTries) { - throw e - } + if (tries == maxTries) throw e + // Retrying on idling timeouts blocks ~26s per attempt and leaves + // IdlingResourceRegistry's internal callback registered, corrupting state + // for subsequent tests. Fail fast so Espresso cleans up normally. + if (e is IdlingResourceTimeoutException || e.cause is IdlingResourceTimeoutException) throw e sleep(waitMillisPerTry) } diff --git a/app/src/androidTest/java/org/dhis2/usescases/BaseTest.kt b/app/src/androidTest/java/org/dhis2/usescases/BaseTest.kt index b2d59d43d24..87f38c22af6 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/BaseTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/BaseTest.kt @@ -3,6 +3,7 @@ package org.dhis2.usescases import android.content.Context import android.os.Build import androidx.test.espresso.IdlingRegistry +import androidx.test.espresso.idling.CountingIdlingResource import androidx.test.espresso.intent.Intents import androidx.test.platform.app.InstrumentationRegistry import androidx.test.rule.GrantPermissionRule @@ -132,6 +133,11 @@ open class BaseTest { } private fun unregisterCountingIdlingResource() { + idlingResources.filterIsInstance<CountingIdlingResource>().forEach { resource -> + while (!resource.isIdleNow) { + resource.decrement() + } + } IdlingResourceProvider.idlingResource = NoOpIdlingResource IdlingRegistry.getInstance() .unregister(*idlingResources.toTypedArray()) diff --git a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/TeiDashboardTest.kt b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/TeiDashboardTest.kt index 1e67d65ca19..05fb9d383e8 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/TeiDashboardTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/TeiDashboardTest.kt @@ -24,6 +24,7 @@ import org.dhis2.usescases.teidashboard.robot.noteRobot import org.dhis2.usescases.teidashboard.robot.teiDashboardRobot import org.hisp.dhis.android.core.mockwebserver.ResponseController import org.junit.Assume +import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -200,6 +201,7 @@ class TeiDashboardTest : BaseTest() { prepareTeiOpenedForReferralProgrammeAndLaunchActivity(rule) teiDashboardRobot(composeTestRule) { + waitUntilActivityVisible<TeiDashboardMobileActivity>() clickOnMenuMoreOptions() clickOnTimelineEvents() clickOnFab() @@ -233,6 +235,7 @@ class TeiDashboardTest : BaseTest() { prepareTeiOpenedWithNoPreviousEventProgrammeAndLaunchActivity(rule) teiDashboardRobot(composeTestRule) { + waitUntilActivityVisible<TeiDashboardMobileActivity>() clickOnMenuMoreOptions() clickOnTimelineEvents() clickOnFab() @@ -259,6 +262,7 @@ class TeiDashboardTest : BaseTest() { val babyPostNatal = "Baby Postnatal" teiDashboardRobot(composeTestRule) { + waitUntilActivityVisible<TeiDashboardMobileActivity>() clickOnMenuMoreOptions() clickOnTimelineEvents() clickOnEventWithTitle(babyPostNatal) @@ -335,6 +339,7 @@ class TeiDashboardTest : BaseTest() { prepareTeiToEnrollToOtherProgramAndLaunchActivity(rule) teiDashboardRobot(composeTestRule) { + waitUntilActivityVisible<TeiDashboardMobileActivity>() clickOnMenuMoreOptions() clickOnTimelineEvents() clickOnMenuMoreOptions() @@ -365,6 +370,7 @@ class TeiDashboardTest : BaseTest() { } + @Ignore("Default analytics have been removed. We need to add some analytics to the database") @Test fun shouldShowAnalytics() { mockWebServerRobot.addResponse( diff --git a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/TeiDashboardRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/TeiDashboardRobot.kt index 7ffebe013fb..cf15d25d364 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/TeiDashboardRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/TeiDashboardRobot.kt @@ -264,6 +264,8 @@ class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { composeTestRule.onNodeWithText(timelineLabel).performClick() } catch (e: NoMatchingViewException) { checkIfGroupedEventsIsVisible() + } finally { + composeTestRule.waitForIdle() } } } diff --git a/app/src/main/java/org/dhis2/usescases/notes/noteDetail/NoteDetailPresenter.kt b/app/src/main/java/org/dhis2/usescases/notes/noteDetail/NoteDetailPresenter.kt index 2b2ae97b545..228ea2455e7 100644 --- a/app/src/main/java/org/dhis2/usescases/notes/noteDetail/NoteDetailPresenter.kt +++ b/app/src/main/java/org/dhis2/usescases/notes/noteDetail/NoteDetailPresenter.kt @@ -27,6 +27,7 @@ class NoteDetailPresenter( } fun save() { + NotesIdlingResource.increment() val data = view.getNewNote() val noteType = data.first val uid = data.second @@ -34,13 +35,17 @@ class NoteDetailPresenter( disposable.add( repository .saveNote(noteType, uid, message) - .doOnSubscribe { NotesIdlingResource.increment() } - .doFinally { NotesIdlingResource.decrement() } .subscribeOn(scheduler.io()) .observeOn(scheduler.ui()) .subscribe( - { view.noteSaved() }, - Timber::d, + { + view.noteSaved() + NotesIdlingResource.decrement() + }, + { error -> + Timber.d(error) + NotesIdlingResource.decrement() + }, ), ) } diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepository.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepository.kt index 3eee5ec3f20..0e6d41ff4dd 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepository.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepository.kt @@ -112,4 +112,6 @@ interface DashboardRepository { fun teiCanBeTransferred(): Boolean fun enrollmentHasWriteAccess(): Boolean + + fun isProgramSelected(): Boolean } diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepositoryImpl.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepositoryImpl.kt index 63a78db477e..26981329a07 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepositoryImpl.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepositoryImpl.kt @@ -92,6 +92,8 @@ class DashboardRepositoryImpl( .map { it } .toObservable() + override fun isProgramSelected(): Boolean = programUid?.isNotEmpty() == true + override fun getEnrollmentEventsWithDisplay( programUid: String?, teiUid: String, diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardViewModel.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardViewModel.kt index 3cd6968a1ad..daa3d093929 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardViewModel.kt @@ -15,7 +15,12 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.async import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.onStart +import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.dhis2.R @@ -65,127 +70,143 @@ class DashboardViewModel( private val _isLoading = MutableLiveData(false) val isLoading: LiveData<Boolean> = _isLoading - private val _dashboardModel = MutableLiveData<DashboardModel?>() - var dashboardModel: LiveData<DashboardModel?> = _dashboardModel + private val _dashboardModel = MutableStateFlow<DashboardModel?>(null) + var dashboardModel: StateFlow<DashboardModel?> = + _dashboardModel + .onStart { + if (repository.isProgramSelected()) fetchDashboardModel() + }.stateIn( + viewModelScope, + SharingStarted.WhileSubscribed(5000L), + null, + ) - private val _groupByStage = MutableLiveData<Boolean>() - val groupByStage: LiveData<Boolean> = _groupByStage + private val _groupByStage = MutableStateFlow(false) + val groupByStage: StateFlow<Boolean> = + _groupByStage + .onStart { + fetchGrouping() + }.stateIn( + viewModelScope, + SharingStarted.WhileSubscribed(5000L), + false, + ) private val _noEnrollmentSelected = MutableLiveData(false) val noEnrollmentSelected: LiveData<Boolean> = _noEnrollmentSelected private val _navigationBarUIState = MutableStateFlow<NavigationBarUIState<TEIDashboardItems>>(NavigationBarUIState()) - val navigationBarUIState = _navigationBarUIState.asStateFlow() + val navigationBarUIState = + _navigationBarUIState + .onStart { + loadNavigationBarItems() + }.stateIn( + viewModelScope, + SharingStarted.WhileSubscribed(5000L), + NavigationBarUIState(), + ) private val _relationshipTopBarIconState = MutableStateFlow<RelationshipTopBarIconState>(RelationshipTopBarIconState.List()) val relationshipTopBarIconState = _relationshipTopBarIconState.asStateFlow() - init { - fetchDashboardModel() - fetchGrouping() - } - private fun fetchDashboardModel() { viewModelScope.launch(dispatcher.io()) { - CoroutineTracker.increment() - val result = - async { - repository.getDashboardModel() - } - withContext(dispatcher.ui()) { - try { - val model = result.await() - _dashboardModel.postValue(model) - if (model is DashboardEnrollmentModel) { - _showFollowUpBar.value = - model.currentEnrollment.followUp() ?: false - _syncNeeded.value = - model.currentEnrollment.aggregatedSyncState() != SYNCED - _showStatusBar.value = model.currentEnrollment.status() - _state.value = - model.currentEnrollment.aggregatedSyncState() - _noEnrollmentSelected.value = false - loadNavigationBarItems() - } else { - _noEnrollmentSelected.value = true - } - } catch (e: Exception) { - Timber.e(e) - } finally { - CoroutineTracker.decrement() + CoroutineTracker.unconditionalIncrement() + try { + val model = repository.getDashboardModel() + _dashboardModel.emit(model) + if (model is DashboardEnrollmentModel) { + _showFollowUpBar.value = + model.currentEnrollment.followUp() ?: false + _syncNeeded.value = + model.currentEnrollment.aggregatedSyncState() != SYNCED + _showStatusBar.value = model.currentEnrollment.status() + _state.value = + model.currentEnrollment.aggregatedSyncState() + _noEnrollmentSelected.postValue(false) + } else { + _noEnrollmentSelected.postValue(true) } + } catch (e: Exception) { + Timber.e(e) + } finally { + CoroutineTracker.unconditionalDecrement() } } } - private suspend fun loadNavigationBarItems() { - val enrollmentItems = mutableListOf<NavigationBarItem<TEIDashboardItems>>() - - if (isPortrait()) { - enrollmentItems.add( - NavigationBarItem( - id = TEIDashboardItems.DETAILS, - icon = Icons.AutoMirrored.Outlined.Assignment, - selectedIcon = Icons.AutoMirrored.Filled.Assignment, - label = resourcesManager.getString(R.string.navigation_tei_data), - ), - ) - } + private suspend fun loadNavigationBarItems() = + withContext(dispatcher.io()) { + CoroutineTracker.unconditionalIncrement() + try { + val enrollmentItems = mutableListOf<NavigationBarItem<TEIDashboardItems>>() + + if (isPortrait()) { + enrollmentItems.add( + NavigationBarItem( + id = TEIDashboardItems.DETAILS, + icon = Icons.AutoMirrored.Outlined.Assignment, + selectedIcon = Icons.AutoMirrored.Filled.Assignment, + label = resourcesManager.getString(R.string.navigation_tei_data), + ), + ) + } - if (withContext(dispatcher.io()) { repository.programHasAnalytics() }) { - enrollmentItems.add( - NavigationBarItem( - id = TEIDashboardItems.ANALYTICS, - icon = Icons.Outlined.BarChart, - selectedIcon = Icons.Filled.BarChart, - label = resourcesManager.getString(R.string.navigation_analytics), - ), - ) - } + if (repository.programHasAnalytics()) { + enrollmentItems.add( + NavigationBarItem( + id = TEIDashboardItems.ANALYTICS, + icon = Icons.Outlined.BarChart, + selectedIcon = Icons.Filled.BarChart, + label = resourcesManager.getString(R.string.navigation_analytics), + ), + ) + } - if (pageConfigurator.displayRelationships()) { - enrollmentItems.add( - NavigationBarItem( - id = TEIDashboardItems.RELATIONSHIPS, - icon = Icons.Outlined.Hub, - selectedIcon = Icons.Filled.Hub, - label = resourcesManager.getString(R.string.navigation_relations), - ), - ) - } + if (pageConfigurator.displayRelationships()) { + enrollmentItems.add( + NavigationBarItem( + id = TEIDashboardItems.RELATIONSHIPS, + icon = Icons.Outlined.Hub, + selectedIcon = Icons.Filled.Hub, + label = resourcesManager.getString(R.string.navigation_relations), + ), + ) + } - enrollmentItems.add( - NavigationBarItem( - id = TEIDashboardItems.NOTES, - icon = Icons.AutoMirrored.Outlined.StickyNote2, - selectedIcon = Icons.AutoMirrored.Filled.StickyNote2, - label = resourcesManager.getString(R.string.navigation_notes), - ), - ) - - _navigationBarUIState.value = _navigationBarUIState.value.copy(items = enrollmentItems) - - if (navigationBarUIState.value.items.none { it.id == navigationBarUIState.value.selectedItem }) { - onNavigationItemSelected( - navigationBarUIState.value.items - .first() - .id, - ) + enrollmentItems.add( + NavigationBarItem( + id = TEIDashboardItems.NOTES, + icon = Icons.AutoMirrored.Outlined.StickyNote2, + selectedIcon = Icons.AutoMirrored.Filled.StickyNote2, + label = resourcesManager.getString(R.string.navigation_notes), + ), + ) + + _navigationBarUIState.update { + it.copy(items = enrollmentItems) + } + + if (enrollmentItems.none { it.id == _navigationBarUIState.value.selectedItem }) { + val selectedItem = enrollmentItems.first() + onNavigationItemSelected(selectedItem.id) + } + } finally { + CoroutineTracker.unconditionalDecrement() + } } - } private fun fetchGrouping() { viewModelScope.launch(dispatcher.io()) { - val result = - async { - repository.getGrouping() - } + CoroutineTracker.unconditionalIncrement() try { - _groupByStage.postValue(result.await()) + _groupByStage.emit(repository.getGrouping()) } catch (e: Exception) { Timber.e(e) + } finally { + CoroutineTracker.unconditionalDecrement() } } } diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/TeiDashboardMobileActivity.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/TeiDashboardMobileActivity.kt index 4620323adc1..a31566dddf4 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/TeiDashboardMobileActivity.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/TeiDashboardMobileActivity.kt @@ -10,8 +10,10 @@ import android.util.TypedValue import android.view.View import android.view.WindowManager import androidx.activity.result.contract.ActivityResultContracts +import androidx.activity.viewModels import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.MoveDown +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf @@ -22,12 +24,16 @@ import androidx.compose.ui.text.style.TextAlign import androidx.core.content.ContextCompat import androidx.core.view.ViewCompat import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Lifecycle import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.compose.collectAsStateWithLifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.snackbar.Snackbar +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch import org.dhis2.App import org.dhis2.R import org.dhis2.commons.Constants @@ -126,7 +132,7 @@ class TeiDashboardMobileActivity : var programUid: String? = null var enrollmentUid: String? = null lateinit var binding: ActivityDashboardMobileBinding - private lateinit var dashboardViewModel: DashboardViewModel + private val dashboardViewModel: DashboardViewModel by viewModels { viewModelFactory } private var relationshipMap: MutableLiveData<Boolean> = MutableLiveData(false) @@ -193,8 +199,6 @@ class TeiDashboardMobileActivity : ).inject(this) setTheme(themeManager.getProgramTheme()) super.onCreate(savedInstanceState) - dashboardViewModel = - ViewModelProvider(this, viewModelFactory)[DashboardViewModel::class.java] binding = DataBindingUtil.setContentView(this, R.layout.activity_dashboard_mobile) showLoadingProgress(true) binding.presenter = presenter @@ -234,13 +238,17 @@ class TeiDashboardMobileActivity : } private fun observeDashboardModel() { - dashboardViewModel.dashboardModel.observe(this) { - if (sessionManagerServiceImpl.isUserLoggedIn()) { - when (it) { - is DashboardEnrollmentModel -> setData(it) - is DashboardTEIModel -> setDataWithOutProgram(it) - else -> // Do nothing - Unit + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + dashboardViewModel.dashboardModel.collectLatest { + if (sessionManagerServiceImpl.isUserLoggedIn()) { + when (it) { + is DashboardEnrollmentModel -> setData(it) + is DashboardTEIModel -> setDataWithOutProgram(it) + else -> // Do nothing + Unit + } + } } } } @@ -351,8 +359,10 @@ class TeiDashboardMobileActivity : dashboardViewModel.onNavigationItemSelected(itemId) } - uiState.selectedItem?.let { - navigateToFragment(it) + LaunchedEffect(uiState.selectedItem) { + uiState.selectedItem?.let { + navigateToFragment(it) + } } } } diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataFragment.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataFragment.kt index 8e3ea87c3a5..6a9a5d254ca 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataFragment.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataFragment.kt @@ -3,7 +3,6 @@ package org.dhis2.usescases.teiDashboard.dashboardfragments.teidata import android.content.ActivityNotFoundException import android.content.Context import android.content.Intent -import android.net.Uri import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -14,10 +13,14 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState import androidx.core.app.ActivityOptionsCompat import androidx.core.content.ContextCompat +import androidx.core.net.toUri import androidx.fragment.app.activityViewModels import androidx.fragment.app.setFragmentResultListener +import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.lifecycleScope import androidx.lifecycle.map +import androidx.lifecycle.repeatOnLifecycle import androidx.recyclerview.widget.DividerItemDecoration import com.bumptech.glide.Glide import com.bumptech.glide.load.resource.bitmap.CircleCrop @@ -26,6 +29,7 @@ import com.google.android.material.snackbar.Snackbar import io.reactivex.Flowable import io.reactivex.Single import io.reactivex.functions.Consumer +import kotlinx.coroutines.launch import org.dhis2.R import org.dhis2.bindings.app import org.dhis2.commons.Constants @@ -154,10 +158,6 @@ class TEIDataFragment : .inflate(inflater, container, false) .also { binding -> this.binding = binding - dashboardViewModel.groupByStage.observe(viewLifecycleOwner) { group -> - showLoadingProgress(true) - presenter.onGroupingChanged(group) - } with(dashboardViewModel) { eventUid().observe(viewLifecycleOwner, ::displayGenerateEvent) @@ -168,8 +168,21 @@ class TEIDataFragment : showDetailCard() } } - dashboardModel.observe(viewLifecycleOwner) { - presenter.checkIfHasToDisplayGenerateEvent() + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + dashboardModel.collect { + presenter.checkIfHasToDisplayGenerateEvent() + } + + } + } + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + dashboardViewModel.groupByStage.collect { group -> + showLoadingProgress(true) + presenter.onGroupingChanged(group) + } + } } } @@ -237,11 +250,11 @@ class TEIDataFragment : private fun showDetailCard() { binding.detailCard.setContent { if (isUserLoggedIn()) { - val dashboardModel by dashboardViewModel.dashboardModel.observeAsState() + val dashboardModel by dashboardViewModel.dashboardModel.collectAsState() val followUp by dashboardViewModel.showFollowUpBar.collectAsState() val syncNeeded by dashboardViewModel.syncNeeded.collectAsState() val enrollmentStatus by dashboardViewModel.showStatusBar.collectAsState() - val groupingEvents by dashboardViewModel.groupByStage.observeAsState() + val groupingEvents by dashboardViewModel.groupByStage.collectAsState() val displayEventCreationButton by presenter.shouldDisplayEventCreationButton.observeAsState( false, ) @@ -314,7 +327,7 @@ class TEIDataFragment : TeiDetailDashboard( infoBarModels = listOfNotNull(syncInfoBar, followUpInfoBar, enrollmentInfoBar), card = card, - isGrouped = groupingEvents ?: true, + isGrouped = groupingEvents, timelineEventHeaderModel = TimelineEventsHeaderModel( displayEventCreationButton, @@ -376,7 +389,7 @@ class TEIDataFragment : binding.cardFront.teiImage.visibility = View.VISIBLE Glide .with(this) - .load(dashboardModel?.avatarPath) + .load(dashboardModel.avatarPath) .fallback(R.drawable.photo_temp_gray) .transition(DrawableTransitionOptions.withCrossFade()) .transform(CircleCrop()) @@ -385,7 +398,7 @@ class TEIDataFragment : binding.header = when { !dashboardModel?.teiHeader.isNullOrEmpty() -> { - dashboardModel?.teiHeader + dashboardModel.teiHeader } else -> { @@ -429,11 +442,11 @@ class TEIDataFragment : Intent(action).apply { when (action) { Intent.ACTION_DIAL -> { - data = Uri.parse("tel:$value") + data = "tel:$value".toUri() } Intent.ACTION_SENDTO -> { - data = Uri.parse("mailto:$value") + data = "mailto:$value".toUri() } } } @@ -442,7 +455,7 @@ class TEIDataFragment : try { startActivity(chooser) - } catch (e: ActivityNotFoundException) { + } catch (_: ActivityNotFoundException) { Timber.e("No activity found that can handle this action") } } diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataPresenter.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataPresenter.kt index 8c0c057c5b0..5f23d235eaa 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataPresenter.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataPresenter.kt @@ -111,8 +111,8 @@ class TEIDataPresenter( sectionFlowable, groupingFlowable, ::Pair, - ).doOnNext { increment() } - .switchMap { stageAndGrouping -> + ).switchMap { stageAndGrouping -> + increment() Flowable .zip( teiDataRepository @@ -131,6 +131,7 @@ class TEIDataPresenter( calcResult, ) }.subscribeOn(schedulerProvider.io()) + .doOnCancel { decrement() } }.subscribeOn(schedulerProvider.io()) .observeOn(schedulerProvider.ui()) .subscribe( @@ -138,7 +139,10 @@ class TEIDataPresenter( _events.postValue(events) decrement() }, - Timber.Forest::d, + { t -> + Timber.e(t) + decrement() + }, ), ) diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TeiDataIdlingResourceSingleton.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TeiDataIdlingResourceSingleton.kt index 03dd98b44e1..fe1c2e6665f 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TeiDataIdlingResourceSingleton.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TeiDataIdlingResourceSingleton.kt @@ -9,9 +9,7 @@ object TeiDataIdlingResourceSingleton { val countingIdlingResource = CountingIdlingResource(RESOURCE) fun increment() { - if (countingIdlingResource.isIdleNow) { - countingIdlingResource.increment() - } + countingIdlingResource.increment() countingIdlingResource.dumpStateToLogs() } diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/ui/TeiDashboardMenu.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/ui/TeiDashboardMenu.kt index 0953f86f419..a84cda784b9 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/ui/TeiDashboardMenu.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/ui/TeiDashboardMenu.kt @@ -112,7 +112,7 @@ private fun MutableList<MenuItemData<EnrollmentMenuItem>>.addTimelineOrGroupBySt dashboardViewModel: DashboardViewModel, resourceManager: ResourceManager, ) { - if (dashboardViewModel.groupByStage.value != false) { + if (dashboardViewModel.groupByStage.value) { add( MenuItemData( id = EnrollmentMenuItem.VIEW_TIMELINE, diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/DashboardViewModelTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/DashboardViewModelTest.kt index 15fafeeb496..8490b909105 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/DashboardViewModelTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/DashboardViewModelTest.kt @@ -1,12 +1,14 @@ package org.dhis2.usescases.teiDashboard import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import app.cash.turbine.test import io.reactivex.Observable import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.resetMain +import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.setMain import org.dhis2.commons.resources.ResourceManager import org.dhis2.commons.viewmodel.DispatcherProvider @@ -47,52 +49,60 @@ class DashboardViewModelTest { @Before fun setUp() { Dispatchers.setMain(testingDispatcher) + whenever(repository.isProgramSelected()) doReturn true } @Test - fun shouldFetchEnrollmentModel() { + fun shouldFetchEnrollmentModel() = runTest { mockEnrollmentModel() mockGrouping(true) val dashboardViewModel = getViewModel() - with(dashboardViewModel) { - assertTrue(dashboardModel.value == mockedEnrollmentModel) - assertTrue(showFollowUpBar.value) - assertTrue(!syncNeeded.value) - assertTrue(showStatusBar.value == EnrollmentStatus.ACTIVE) - assertTrue(state.value == State.SYNCED) + dashboardViewModel.dashboardModel.test { + awaitItem() + with(awaitItem()) { + assertTrue(this == mockedEnrollmentModel) + assertTrue(dashboardViewModel.showFollowUpBar.value) + assertTrue(!dashboardViewModel.syncNeeded.value) + assertTrue(dashboardViewModel.showStatusBar.value == EnrollmentStatus.ACTIVE) + assertTrue(dashboardViewModel.state.value == State.SYNCED) + } } } @Test - fun shouldFetchTeiModel() { + fun shouldFetchTeiModel() = runTest { mockTeiModel() mockGrouping(false) val dashboardViewModel = getViewModel() - with(dashboardViewModel) { - assertTrue(dashboardModel.value == mockedTeiModel) - assertTrue(!showFollowUpBar.value) - assertTrue(!syncNeeded.value) - assertTrue(showStatusBar.value == null) - assertTrue(state.value == null) + dashboardViewModel.dashboardModel.test { + awaitItem() + with(awaitItem()) { + assertTrue(this == mockedTeiModel) + assertTrue(!dashboardViewModel.showFollowUpBar.value) + assertTrue(!dashboardViewModel.syncNeeded.value) + assertTrue(dashboardViewModel.showStatusBar.value == null) + assertTrue(dashboardViewModel.state.value == null) + } } } @Test - fun shouldSetGrouping() { + fun shouldSetGrouping() = runTest { mockEnrollmentModel() mockGrouping(false) val dashboardViewModel = getViewModel() - with(dashboardViewModel) { - assertTrue(groupByStage.value == false) - setGrouping(true) + dashboardViewModel.groupByStage.test { + assertTrue(!awaitItem()) + dashboardViewModel.setGrouping(true) verify(repository).setGrouping(true) - assertTrue(groupByStage.value == true) + assertTrue(awaitItem()) + cancelAndIgnoreRemainingEvents() } } @@ -109,51 +119,68 @@ class DashboardViewModelTest { } @Test - fun shouldSetFollowUpOnEnrollment() { + fun shouldSetFollowUpOnEnrollment() = runTest { mockEnrollmentModel() mockGrouping(false) - with(getViewModel()) { - onFollowUp() - verify(repository).setFollowUp("enrollmentUid") - assertTrue(state.value == State.TO_UPDATE) - verify(analyticsHelper).setEvent(ACTIVE_FOLLOW_UP, "false", FOLLOW_UP) + val viewModel = getViewModel() + viewModel.dashboardModel.test { + awaitItem() + awaitItem() + with(viewModel) { + onFollowUp() + verify(repository).setFollowUp("enrollmentUid") + assertTrue(state.value == State.TO_UPDATE) + verify(analyticsHelper).setEvent(ACTIVE_FOLLOW_UP, "false", FOLLOW_UP) + } } } @Test - fun shouldUpdateEnrollmentStatus() { + fun shouldUpdateEnrollmentStatus() = runTest { mockEnrollmentModel() mockGrouping(false) - - with(getViewModel()) { - whenever(repository.updateEnrollmentStatus(any(), any())) doReturn - Observable.just( - StatusChangeResultCode.CHANGED, + val viewModel = getViewModel() + viewModel.dashboardModel.test { + awaitItem() + awaitItem() + with(viewModel) { + whenever(repository.updateEnrollmentStatus(any(), any())) doReturn + Observable.just( + StatusChangeResultCode.CHANGED, + ) + whenever(mockedEnrollmentModel.currentEnrollment) doReturn mockedCompletedEnrollment + updateEnrollmentStatus(EnrollmentStatus.COMPLETED) + testingDispatcher.scheduler.advanceUntilIdle() + verify(repository).updateEnrollmentStatus( + "enrollmentUid", + EnrollmentStatus.COMPLETED ) - whenever(mockedEnrollmentModel.currentEnrollment) doReturn mockedCompletedEnrollment - updateEnrollmentStatus(EnrollmentStatus.COMPLETED) - testingDispatcher.scheduler.advanceUntilIdle() - verify(repository).updateEnrollmentStatus("enrollmentUid", EnrollmentStatus.COMPLETED) - assertTrue(showStatusBar.value == EnrollmentStatus.COMPLETED) - assertTrue(syncNeeded.value) - assertTrue(state.value == State.TO_UPDATE) + assertTrue(showStatusBar.value == EnrollmentStatus.COMPLETED) + assertTrue(syncNeeded.value) + assertTrue(state.value == State.TO_UPDATE) + } } } @Test - fun shouldShowMessageIfErrorWhileUpdatingEnrollmentStatus() { + fun shouldShowMessageIfErrorWhileUpdatingEnrollmentStatus() = runTest { mockEnrollmentModel() mockGrouping(false) - - with(getViewModel()) { - whenever(repository.updateEnrollmentStatus(any(), any())) doReturn - Observable.just( - StatusChangeResultCode.FAILED, - ) - updateEnrollmentStatus(EnrollmentStatus.COMPLETED) - testingDispatcher.scheduler.advanceUntilIdle() - assertTrue(showStatusErrorMessages.value == StatusChangeResultCode.FAILED) + val viewModel = getViewModel() + + viewModel.dashboardModel.test { + awaitItem() + awaitItem() + with(viewModel) { + whenever(repository.updateEnrollmentStatus(any(), any())) doReturn + Observable.just( + StatusChangeResultCode.FAILED, + ) + updateEnrollmentStatus(EnrollmentStatus.COMPLETED) + testingDispatcher.scheduler.advanceUntilIdle() + assertTrue(showStatusErrorMessages.value == StatusChangeResultCode.FAILED) + } } } diff --git a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/coroutine/AndroidIdlingResource.kt b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/coroutine/AndroidIdlingResource.kt index 939d2479d6a..c0e5953d95f 100644 --- a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/coroutine/AndroidIdlingResource.kt +++ b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/coroutine/AndroidIdlingResource.kt @@ -13,6 +13,11 @@ object AndroidIdlingResource : CoroutineIdlingResource { countingIdlingResource.dumpStateToLogs() } + override fun unconditionalIncrement() { + countingIdlingResource.increment() + countingIdlingResource.dumpStateToLogs() + } + override fun decrement() { if (!countingIdlingResource.isIdleNow) { countingIdlingResource.decrement() @@ -20,5 +25,10 @@ object AndroidIdlingResource : CoroutineIdlingResource { countingIdlingResource.dumpStateToLogs() } + override fun unconditionalDecrement() { + countingIdlingResource.decrement() + countingIdlingResource.dumpStateToLogs() + } + fun getIdlingResource() = countingIdlingResource } diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/coroutine/CoroutineIdlingResource.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/coroutine/CoroutineIdlingResource.kt index 0e8103045dd..19966279093 100644 --- a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/coroutine/CoroutineIdlingResource.kt +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/coroutine/CoroutineIdlingResource.kt @@ -3,5 +3,9 @@ package org.dhis2.mobile.commons.coroutine interface CoroutineIdlingResource { fun increment() + fun unconditionalIncrement() + fun decrement() + + fun unconditionalDecrement() } diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/coroutine/CoroutineTracker.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/coroutine/CoroutineTracker.kt index e51ac96bca3..7fcabc50b82 100644 --- a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/coroutine/CoroutineTracker.kt +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/coroutine/CoroutineTracker.kt @@ -9,6 +9,10 @@ object CoroutineTracker { IdlingResourceProvider.idlingResource.increment() } + fun unconditionalIncrement() { + IdlingResourceProvider.idlingResource.unconditionalIncrement() + } + fun decrement() { var current: Int var next: Int @@ -18,4 +22,8 @@ object CoroutineTracker { } while (!activeTasks.compareAndSet(current, next)) IdlingResourceProvider.idlingResource.decrement() } + + fun unconditionalDecrement() { + IdlingResourceProvider.idlingResource.unconditionalDecrement() + } } diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/coroutine/NoOpIdlingResource.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/coroutine/NoOpIdlingResource.kt index b423289b545..d15cee9e433 100644 --- a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/coroutine/NoOpIdlingResource.kt +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/coroutine/NoOpIdlingResource.kt @@ -5,7 +5,15 @@ object NoOpIdlingResource : CoroutineIdlingResource { // No-op: Do nothing } + override fun unconditionalIncrement() { + // No-op: Do nothing + } + override fun decrement() { // No-op: Do nothing } + + override fun unconditionalDecrement() { + // No-op: Do nothing + } } diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/extensions/ViewModelExtensions.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/extensions/ViewModelExtensions.kt index 27f2c919e50..f7313dd7f83 100644 --- a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/extensions/ViewModelExtensions.kt +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/extensions/ViewModelExtensions.kt @@ -19,10 +19,10 @@ fun ViewModel.launchUseCase( dispatcher: CoroutineContext = EmptyCoroutineContext, block: suspend CoroutineScope.() -> Unit, ) = viewModelScope.launch(dispatcher) { - CoroutineTracker.increment() + CoroutineTracker.unconditionalIncrement() try { block() } finally { - CoroutineTracker.decrement() + CoroutineTracker.unconditionalDecrement() } } diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ChartsRepositoryImpl.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ChartsRepositoryImpl.kt index e1ad5bc8641..6a2d20c9781 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ChartsRepositoryImpl.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ChartsRepositoryImpl.kt @@ -8,8 +8,6 @@ import dhis2.org.analytics.charts.data.AnalyticResources import dhis2.org.analytics.charts.data.Graph import dhis2.org.analytics.charts.data.GraphFilters import dhis2.org.analytics.charts.mappers.AnalyticsTeiSettingsToGraph -import dhis2.org.analytics.charts.mappers.DataElementToGraph -import dhis2.org.analytics.charts.mappers.ProgramIndicatorToGraph import dhis2.org.analytics.charts.mappers.VisualizationToGraph import dhis2.org.analytics.charts.providers.AnalyticsFilterProvider import dhis2.org.analytics.charts.ui.OrgUnitFilterType @@ -20,11 +18,8 @@ import org.hisp.dhis.android.core.analytics.trackerlinelist.TrackerLineListRespo import org.hisp.dhis.android.core.arch.repositories.paging.PageConfig import org.hisp.dhis.android.core.common.RelativeOrganisationUnit import org.hisp.dhis.android.core.common.RelativePeriod -import org.hisp.dhis.android.core.dataelement.DataElement import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.organisationunit.OrganisationUnit -import org.hisp.dhis.android.core.period.PeriodType -import org.hisp.dhis.android.core.program.ProgramIndicator import org.hisp.dhis.android.core.settings.AnalyticsDhisVisualizationType import org.hisp.dhis.android.core.settings.AnalyticsDhisVisualizationsGroup import org.hisp.dhis.android.core.settings.AnalyticsDhisVisualizationsSetting @@ -33,8 +28,6 @@ class ChartsRepositoryImpl( private val d2: D2, private val visualizationToGraph: VisualizationToGraph, private val analyticsTeiSettingsToGraph: AnalyticsTeiSettingsToGraph, - private val dataElementToGraph: DataElementToGraph, - private val programIndicatorToGraph: ProgramIndicatorToGraph, private val analyticsResources: AnalyticResources, private val analyticsFilterProvider: AnalyticsFilterProvider, ) : ChartsRepository { @@ -45,9 +38,7 @@ class ChartsRepositoryImpl( if (enrollment?.trackedEntityInstance() == null) return emptyList() val settingsAnalytics = getSettingsAnalytics(enrollment) - return settingsAnalytics.ifEmpty { - getDefaultAnalytics(enrollment) - } + return settingsAnalytics } override fun getVisualizationGroups(uid: String?): List<AnalyticsDhisVisualizationsGroup> = @@ -447,73 +438,6 @@ class ChartsRepositoryImpl( ) } - private suspend fun getDefaultAnalytics(enrollment: Enrollment): List<Graph> = - getRepeatableProgramStages(enrollment.program()) - .map { programStage -> - - val period = programStage.periodType() ?: PeriodType.Daily - - getNumericDataElements(programStage.uid()) - .map { dataElement -> - val selectedRelativePeriod = - analyticsFilterProvider.visualizationPeriod( - enrollment.trackedEntityInstance()!! + - programStage.uid() + - dataElement.uid(), - ) - val selectedOrgUnits = - analyticsFilterProvider.visualizationOrgUnits( - enrollment.trackedEntityInstance()!! + - programStage.uid() + - dataElement.uid(), - ) - dataElementToGraph.map( - dataElement, - programStage.uid(), - enrollment.trackedEntityInstance()!!, - period, - selectedRelativePeriod, - selectedOrgUnits, - true, - ) - }.union( - getStageIndicators(enrollment.program()).map { programIndicator -> - val selectedRelativePeriod = - analyticsFilterProvider.visualizationPeriod( - enrollment.trackedEntityInstance()!! + - programStage.uid() + - programIndicator.uid(), - ) - val selectedOrgUnits = - analyticsFilterProvider.visualizationOrgUnits( - enrollment.trackedEntityInstance()!! + - programStage.uid() + - programIndicator.uid(), - ) - programIndicatorToGraph.map( - programIndicator, - programStage.uid(), - enrollment.trackedEntityInstance()!!, - period, - selectedRelativePeriod, - selectedOrgUnits, - true, - ) - }, - ) - }.flatten() - .filter { it.canBeShown() } - - private fun getRepeatableProgramStages(program: String?) = - d2 - .programModule() - .programStages() - .byProgramUid() - .eq(program) - .byRepeatable() - .eq(true) - .blockingGet() - private fun getEnrollment(enrollmentUid: String) = d2 .enrollmentModule() @@ -521,40 +445,6 @@ class ChartsRepositoryImpl( .uid(enrollmentUid) .blockingGet() - private fun getNumericDataElements(stageUid: String): List<DataElement> = - d2 - .programModule() - .programStageDataElements() - .byProgramStage() - .eq(stageUid) - .blockingGet() - .filter { - d2 - .dataElementModule() - .dataElements() - .uid(it.dataElement()?.uid()) - .blockingGet() - ?.valueType() - ?.isNumeric ?: false - }.mapNotNull { - d2 - .dataElementModule() - .dataElements() - .uid( - it.dataElement()?.uid(), - ).blockingGet() - } - - private fun getStageIndicators(programUid: String?): List<ProgramIndicator> = - d2 - .programModule() - .programIndicators() - .byDisplayInForm() - .isTrue - .byProgramUid() - .eq(programUid) - .blockingGet() - override fun setVisualizationPeriods( visualizationUid: String, lineListingColumnId: Int?, diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/di/ChartsInjector.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/di/ChartsInjector.kt index 9b365ed6e9b..22a0eca91f8 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/di/ChartsInjector.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/di/ChartsInjector.kt @@ -8,14 +8,12 @@ import dhis2.org.analytics.charts.Charts import dhis2.org.analytics.charts.ChartsRepository import dhis2.org.analytics.charts.ChartsRepositoryImpl import dhis2.org.analytics.charts.DhisAnalyticCharts -import dhis2.org.analytics.charts.domain.GetEnrollmentAnalyticsUseCase import dhis2.org.analytics.charts.data.AnalyticResources +import dhis2.org.analytics.charts.domain.GetEnrollmentAnalyticsUseCase import dhis2.org.analytics.charts.mappers.AnalyticDataElementToDataElementData import dhis2.org.analytics.charts.mappers.AnalyticIndicatorToIndicatorData import dhis2.org.analytics.charts.mappers.AnalyticTeiSettingsToSettingsAnalyticsModel import dhis2.org.analytics.charts.mappers.AnalyticsTeiSettingsToGraph -import dhis2.org.analytics.charts.mappers.DataElementToGraph -import dhis2.org.analytics.charts.mappers.ProgramIndicatorToGraph import dhis2.org.analytics.charts.mappers.VisualizationToGraph import dhis2.org.analytics.charts.providers.AnalyticsFilterProvider import dhis2.org.analytics.charts.providers.ChartCoordinatesProvider @@ -47,8 +45,6 @@ class ChartsModule { d2: D2, visualizationToGraph: VisualizationToGraph, analyticsTeiSettingsToGraph: AnalyticsTeiSettingsToGraph, - dataElementToGraph: DataElementToGraph, - indicatorToGraph: ProgramIndicatorToGraph, analyticsResources: AnalyticResources, analyticsFilterProvider: AnalyticsFilterProvider, ): ChartsRepository = @@ -56,14 +52,13 @@ class ChartsModule { d2, visualizationToGraph, analyticsTeiSettingsToGraph, - dataElementToGraph, - indicatorToGraph, analyticsResources, analyticsFilterProvider, ) @Provides - internal fun provideAnalyticFilters(d2: D2): AnalyticsFilterProvider = AnalyticsFilterProvider(d2) + internal fun provideAnalyticFilters(d2: D2): AnalyticsFilterProvider = + AnalyticsFilterProvider(d2) @Provides internal fun provideVisualizationToGraph( @@ -86,7 +81,8 @@ class ChartsModule { ) @Provides - internal fun nutritionDataProvider(): NutritionDataProvider = RuleEngineNutritionDataProviderImpl() + internal fun nutritionDataProvider(): NutritionDataProvider = + RuleEngineNutritionDataProviderImpl() @Provides internal fun provideAnalyticSettingsMapper( @@ -98,18 +94,6 @@ class ChartsModule { analyticIndicatorMapper, ) - @Provides - internal fun provideDataElementToGraph( - periodStepProvider: PeriodStepProvider, - chartCoordinatesProvider: ChartCoordinatesProvider, - ): DataElementToGraph = DataElementToGraph(periodStepProvider, chartCoordinatesProvider) - - @Provides - internal fun provideIndicatorToGraph( - periodStepProvider: PeriodStepProvider, - chartCoordinatesProvider: ChartCoordinatesProvider, - ): ProgramIndicatorToGraph = ProgramIndicatorToGraph(periodStepProvider, chartCoordinatesProvider) - @Provides internal fun periodStepProvider( d2: D2, @@ -121,7 +105,8 @@ class ChartsModule { d2: D2, periodStepProvider: PeriodStepProvider, resourceManager: ResourceManager, - ): ChartCoordinatesProvider = ChartCoordinatesProviderImpl(d2, periodStepProvider, resourceManager) + ): ChartCoordinatesProvider = + ChartCoordinatesProviderImpl(d2, periodStepProvider, resourceManager) @Provides internal fun provideResourceManager( @@ -133,17 +118,21 @@ class ChartsModule { internal fun analyticResources(context: Context): AnalyticResources = AnalyticResources(context) @Provides - internal fun provideAnalyticDataElementMapper(): AnalyticDataElementToDataElementData = AnalyticDataElementToDataElementData() + internal fun provideAnalyticDataElementMapper(): AnalyticDataElementToDataElementData = + AnalyticDataElementToDataElementData() @Provides - internal fun provideAnalyticIndicatorMapper(): AnalyticIndicatorToIndicatorData = AnalyticIndicatorToIndicatorData() + internal fun provideAnalyticIndicatorMapper(): AnalyticIndicatorToIndicatorData = + AnalyticIndicatorToIndicatorData() @Provides - internal fun bindStorageFeatureImpl(analyticsCharts: DhisAnalyticCharts): Charts = analyticsCharts + internal fun bindStorageFeatureImpl(analyticsCharts: DhisAnalyticCharts): Charts = + analyticsCharts @Provides internal fun provideGetEnrollmentAnalyticsUseCase( chartsRepository: ChartsRepository, dispatcherProvider: DispatcherProvider, - ): GetEnrollmentAnalyticsUseCase = GetEnrollmentAnalyticsUseCase(chartsRepository, dispatcherProvider) + ): GetEnrollmentAnalyticsUseCase = + GetEnrollmentAnalyticsUseCase(chartsRepository, dispatcherProvider) } diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/di/ChartsModule.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/di/ChartsModule.kt index d57cbeb7018..70dfc10943b 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/di/ChartsModule.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/di/ChartsModule.kt @@ -9,8 +9,6 @@ import dhis2.org.analytics.charts.mappers.AnalyticDataElementToDataElementData import dhis2.org.analytics.charts.mappers.AnalyticIndicatorToIndicatorData import dhis2.org.analytics.charts.mappers.AnalyticTeiSettingsToSettingsAnalyticsModel import dhis2.org.analytics.charts.mappers.AnalyticsTeiSettingsToGraph -import dhis2.org.analytics.charts.mappers.DataElementToGraph -import dhis2.org.analytics.charts.mappers.ProgramIndicatorToGraph import dhis2.org.analytics.charts.mappers.VisualizationToGraph import dhis2.org.analytics.charts.providers.AnalyticsFilterProvider import dhis2.org.analytics.charts.providers.ChartCoordinatesProvider @@ -77,20 +75,6 @@ val chartsModule = module { ) } - factory { - DataElementToGraph( - periodStepProvider = get(), - chartCoordinatesProvider = get() - ) - } - - factory { - ProgramIndicatorToGraph( - periodStepProvider = get(), - chartCoordinatesProvider = get() - ) - } - factoryOf(::AnalyticResources) factoryOf(::AnalyticsFilterProvider) @@ -100,8 +84,6 @@ val chartsModule = module { d2 = get(), visualizationToGraph = get(), analyticsTeiSettingsToGraph = get(), - dataElementToGraph = get(), - programIndicatorToGraph = get(), analyticsResources = get(), analyticsFilterProvider = get() ) diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/DataElementToGraph.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/DataElementToGraph.kt deleted file mode 100644 index ecd0098997e..00000000000 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/DataElementToGraph.kt +++ /dev/null @@ -1,61 +0,0 @@ -package dhis2.org.analytics.charts.mappers - -import dhis2.org.analytics.charts.data.Graph -import dhis2.org.analytics.charts.data.GraphFilters -import dhis2.org.analytics.charts.data.SerieData -import dhis2.org.analytics.charts.providers.ChartCoordinatesProvider -import dhis2.org.analytics.charts.providers.PeriodStepProvider -import org.hisp.dhis.android.core.common.RelativePeriod -import org.hisp.dhis.android.core.dataelement.DataElement -import org.hisp.dhis.android.core.period.PeriodType - -class DataElementToGraph( - private val periodStepProvider: PeriodStepProvider, - private val chartCoordinatesProvider: ChartCoordinatesProvider, -) { - suspend fun map( - dataElement: DataElement, - stageUid: String, - teiUid: String, - stagePeriod: PeriodType, - selectedRelativePeriod: List<RelativePeriod>?, - selectedOrgUnits: List<String>?, - isDefault: Boolean = false, - ): Graph { - val coordinates = - chartCoordinatesProvider.dataElementCoordinates( - stageUid, - teiUid, - dataElement.uid(), - selectedRelativePeriod, - selectedOrgUnits, - isDefault, - ) - - val serie = - if (coordinates.isNotEmpty()) { - listOf( - SerieData( - dataElement.displayFormName() ?: dataElement.uid(), - coordinates, - ), - ) - } else { - emptyList() - } - - return Graph( - title = "${stagePeriod.name}-${dataElement.displayFormName()}", - series = serie, - periodToDisplayDefault = null, - eventPeriodType = stagePeriod, - periodStep = periodStepProvider.periodStep(stagePeriod), - visualizationUid = "${teiUid}${stageUid}${dataElement.uid()}", - graphFilters = - GraphFilters.Visualization( - periodToDisplaySelected = selectedRelativePeriod?.firstOrNull(), - orgUnitsSelected = selectedOrgUnits ?: emptyList(), - ), - ) - } -} diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/ProgramIndicatorToGraph.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/ProgramIndicatorToGraph.kt deleted file mode 100644 index fef93ad9439..00000000000 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/ProgramIndicatorToGraph.kt +++ /dev/null @@ -1,61 +0,0 @@ -package dhis2.org.analytics.charts.mappers - -import dhis2.org.analytics.charts.data.Graph -import dhis2.org.analytics.charts.data.GraphFilters -import dhis2.org.analytics.charts.data.SerieData -import dhis2.org.analytics.charts.providers.ChartCoordinatesProvider -import dhis2.org.analytics.charts.providers.PeriodStepProvider -import org.hisp.dhis.android.core.common.RelativePeriod -import org.hisp.dhis.android.core.period.PeriodType -import org.hisp.dhis.android.core.program.ProgramIndicator - -class ProgramIndicatorToGraph( - private val periodStepProvider: PeriodStepProvider, - private val chartCoordinatesProvider: ChartCoordinatesProvider, -) { - suspend fun map( - programIndicator: ProgramIndicator, - stageUid: String, - teiUid: String, - stagePeriod: PeriodType, - selectedRelativePeriod: List<RelativePeriod>?, - selectedOrgUnits: List<String>?, - isDefault: Boolean = false, - ): Graph { - val coordinates = - chartCoordinatesProvider.indicatorCoordinates( - stageUid, - teiUid, - programIndicator.uid(), - selectedRelativePeriod, - selectedOrgUnits, - isDefault, - ) - - val serie = - if (coordinates.isNotEmpty()) { - listOf( - SerieData( - programIndicator.displayName() ?: programIndicator.uid(), - coordinates, - ), - ) - } else { - emptyList() - } - - return Graph( - title = "${stagePeriod.name}-${programIndicator.displayName()}", - series = serie, - periodToDisplayDefault = null, - eventPeriodType = stagePeriod, - periodStep = periodStepProvider.periodStep(stagePeriod), - visualizationUid = "${teiUid}${stageUid}${programIndicator.uid()}", - graphFilters = - GraphFilters.Visualization( - periodToDisplaySelected = selectedRelativePeriod?.firstOrNull(), - orgUnitsSelected = selectedOrgUnits ?: emptyList(), - ), - ) - } -} diff --git a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ChartsRepositoryTest.kt b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ChartsRepositoryTest.kt index 9b0f7116197..52084337da6 100644 --- a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ChartsRepositoryTest.kt +++ b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ChartsRepositoryTest.kt @@ -6,11 +6,10 @@ import dhis2.org.analytics.charts.data.GraphFieldValue import dhis2.org.analytics.charts.data.GraphPoint import dhis2.org.analytics.charts.data.SerieData import dhis2.org.analytics.charts.mappers.AnalyticsTeiSettingsToGraph -import dhis2.org.analytics.charts.mappers.DataElementToGraph -import dhis2.org.analytics.charts.mappers.ProgramIndicatorToGraph import dhis2.org.analytics.charts.mappers.VisualizationToGraph import dhis2.org.analytics.charts.providers.AnalyticsFilterProvider import dhis2.org.analytics.charts.ui.OrgUnitFilterType +import kotlinx.coroutines.test.runTest import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.analytics.AnalyticsException import org.hisp.dhis.android.core.analytics.aggregated.DimensionItem @@ -44,15 +43,12 @@ import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock import org.mockito.kotlin.verify import org.mockito.kotlin.whenever -import kotlinx.coroutines.test.runTest import java.util.Date class ChartsRepositoryTest { private val d2: D2 = Mockito.mock(D2::class.java, Mockito.RETURNS_DEEP_STUBS) private val visualizationToGraph: VisualizationToGraph = mock() private val analyticsTeiSettingsToGraph: AnalyticsTeiSettingsToGraph = mock() - private val dataElementToGraph: DataElementToGraph = mock() - private val programIndicatorToGraph: ProgramIndicatorToGraph = mock() private val analyticsResources: AnalyticResources = mock() private val analyticsFilterProvider: AnalyticsFilterProvider = mock() @@ -61,8 +57,6 @@ class ChartsRepositoryTest { d2, visualizationToGraph, analyticsTeiSettingsToGraph, - dataElementToGraph, - programIndicatorToGraph, analyticsResources, analyticsFilterProvider, ) @@ -76,13 +70,13 @@ class ChartsRepositoryTest { .uid(any()) .blockingGet(), ) doReturn - Enrollment - .builder() - .uid("enrollmentUid") - .program("programUid") - .trackedEntityInstance(null) - .attributeOptionCombo("attributeOptionComboUid") - .build() + Enrollment + .builder() + .uid("enrollmentUid") + .program("programUid") + .trackedEntityInstance(null) + .attributeOptionCombo("attributeOptionComboUid") + .build() val result = repository.getAnalyticsForEnrollment("enrollmentUid") assertTrue( result.isEmpty(), @@ -100,83 +94,8 @@ class ChartsRepositoryTest { val result = repository.getAnalyticsForEnrollment("enrollmentUid") assertTrue( result.isNotEmpty() && - result.size == mockedSettingsGraphs().size && - result[0].title == "settings_1", - ) - } - - @Test - fun `Should get default analytics if settings is null`() = runTest { - mockEnrollmentCall() - mockAnalyticsSettingsCall(null) - mockRepeatableStagesCall() - mockNumericDataElements(false) - - whenever( - dataElementToGraph.map(any(), any(), any(), any(), anyOrNull(), anyOrNull(), any()), - ) doReturn mockedDataElementGraph() - mockIndicators(false) - whenever( - programIndicatorToGraph.map( - any(), - any(), - any(), - any(), - anyOrNull(), - anyOrNull(), - any(), - ), - ) doReturn mockedIndicatorGraph() - val result = repository.getAnalyticsForEnrollment("enrollmentUid") - assertTrue( - result.isNotEmpty() && - result.size == 2 && - result[0].title == "de_graph_1" && - result[1].title == "indicator_graph_1", - ) - } - - @Test - fun `Should get default analytics if settings is null and return only dataElement graphs`() = runTest { - mockEnrollmentCall() - mockAnalyticsSettingsCall(null) - mockRepeatableStagesCall() - mockNumericDataElements(false) - whenever( - dataElementToGraph.map(any(), any(), any(), any(), anyOrNull(), anyOrNull(), any()), - ) doReturn mockedDataElementGraph() - mockIndicators(true) - val result = repository.getAnalyticsForEnrollment("enrollmentUid") - assertTrue( - result.isNotEmpty() && - result.size == 1 && - result[0].title == "de_graph_1", - ) - } - - @Test - fun `Should get default analytics if settings is null and return only indicator graphs`() = runTest { - mockEnrollmentCall() - mockAnalyticsSettingsCall(null) - mockRepeatableStagesCall() - mockNumericDataElements(true) - mockIndicators(false) - whenever( - programIndicatorToGraph.map( - any(), - any(), - any(), - any(), - anyOrNull(), - anyOrNull(), - any(), - ), - ) doReturn mockedIndicatorGraph() - val result = repository.getAnalyticsForEnrollment("enrollmentUid") - assertTrue( - result.isNotEmpty() && - result.size == 1 && - result[0].title == "indicator_graph_1", + result.size == mockedSettingsGraphs().size && + result[0].title == "settings_1", ) } @@ -212,7 +131,12 @@ class ChartsRepositoryTest { val mockedVisualizationGroup: AnalyticsDhisVisualizationsGroup = mock() val visualizationSetting: AnalyticsDhisVisualizationsSetting = mock { - on { program() } doReturn mapOf(Pair("programUid", listOf(mockedVisualizationGroup))) + on { program() } doReturn mapOf( + Pair( + "programUid", + listOf(mockedVisualizationGroup) + ) + ) } whenever( d2 @@ -231,7 +155,12 @@ class ChartsRepositoryTest { val visualizationSetting: AnalyticsDhisVisualizationsSetting = mock { on { program() } doReturn mapOf() - on { dataSet() } doReturn mapOf(Pair("dataSetUid", listOf(mockedVisualizationGroup))) + on { dataSet() } doReturn mapOf( + Pair( + "dataSetUid", + listOf(mockedVisualizationGroup) + ) + ) } whenever( d2 @@ -521,11 +450,11 @@ class ChartsRepositoryTest { } ?: this }.blockingEvaluate(), ) doReturn - if (analyticsException == null) { - Result.Success(mockedAnalyticResponse) - } else { - Result.Failure(analyticsException) - } + if (analyticsException == null) { + Result.Success(mockedAnalyticResponse) + } else { + Result.Failure(analyticsException) + } } private fun mockEnrollmentCall() { @@ -536,13 +465,13 @@ class ChartsRepositoryTest { .uid(any()) .blockingGet(), ) doReturn - Enrollment - .builder() - .uid("enrollmentUid") - .program("programUid") - .trackedEntityInstance("teiUid") - .attributeOptionCombo("attributeOptionComboUid") - .build() + Enrollment + .builder() + .uid("enrollmentUid") + .program("programUid") + .trackedEntityInstance("teiUid") + .attributeOptionCombo("attributeOptionComboUid") + .build() } private fun mockAnalyticsSettingsCall(result: List<AnalyticsTeiSetting>?) { @@ -610,12 +539,12 @@ class ChartsRepositoryTest { .eq(true) .blockingGet(), ) doReturn - listOf( - ProgramStage - .builder() - .uid("stage_1") - .build(), - ) + listOf( + ProgramStage + .builder() + .uid("stage_1") + .build(), + ) } private fun mockIndicators(emptyList: Boolean) { @@ -665,12 +594,12 @@ class ChartsRepositoryTest { .eq("programUid") .blockingGet(), ) doReturn - listOf( - ProgramIndicator - .builder() - .uid("indicator_1") - .build(), - ) + listOf( + ProgramIndicator + .builder() + .uid("indicator_1") + .build(), + ) } } @@ -707,13 +636,13 @@ class ChartsRepositoryTest { .eq("stage_1") .blockingGet(), ) doReturn - listOf( - ProgramStageDataElement - .builder() - .uid("psde_uid_1") - .dataElement(ObjectWithUid.create("de_1")) - .build(), - ) + listOf( + ProgramStageDataElement + .builder() + .uid("psde_uid_1") + .dataElement(ObjectWithUid.create("de_1")) + .build(), + ) } whenever( diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModel.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModel.kt index 1b528d92bf2..c8d89fbdb9d 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModel.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModel.kt @@ -6,6 +6,8 @@ import coil3.PlatformContext import kotlinx.coroutines.Job import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update @@ -115,13 +117,12 @@ class CredentialsViewModel( ) init { - launchUseCase { - appLinkNavigation.appLink.collect { urlString -> + appLinkNavigation.appLink + .onEach { urlString -> if (credentialsScreenState.value.loginState is LoginState.Running) { handleOAuthCallbacks(urlString) } - } - } + }.launchIn(viewModelScope) } private fun loadData() { From d472ff6e4c8372fbb18677b3d26fb2fdffa74905 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Miguel=20Rubio?= <andres@dhis2.org> Date: Fri, 3 Jul 2026 11:20:18 +0200 Subject: [PATCH 258/260] fix: [ANDROAPP-7694] allow cancel metadata sync on log out and delete account (#4958) --- .../org/dhis2/usescases/main/MainViewModel.kt | 21 +++++-- .../dhis2/usescases/main/MainViewModelTest.kt | 63 ++++++++++++++++++- 2 files changed, 78 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt b/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt index 75f9537c86b..07ea34113a3 100644 --- a/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt @@ -5,11 +5,11 @@ import android.net.Uri import androidx.core.net.toUri import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.Job import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.receiveAsFlow @@ -82,6 +82,8 @@ class MainViewModel( ) : ViewModel() { private val _homeScreenState = MutableStateFlow(defaultHomeScreenState) + private var metadataSyncObserverJob: Job? = null + private val _homeEffects = Channel<HomeEffect>(Channel.BUFFERED) val homeEffects = _homeEffects.receiveAsFlow() @@ -131,10 +133,7 @@ class MainViewModel( _homeEffects.send(HomeEffect.OrgUnitFilterRequest) }.launchIn(viewModelScope) - syncBackgroundJobAction - .observeMetadataJob() - .onEach(::handleMetadataSync) - .launchIn(viewModelScope) + observeMetadataSyncJob() launchUseCase(dispatcher.io()) { launchInitialSync().fold( @@ -232,6 +231,14 @@ class MainViewModel( } } + private fun observeMetadataSyncJob() { + metadataSyncObserverJob = + syncBackgroundJobAction + .observeMetadataJob() + .onEach(::handleMetadataSync) + .launchIn(viewModelScope) + } + private fun handleMetadataSync(jobs: List<SyncJobStatus>) { jobs.forEach { job -> if (job.tags.contains(METADATA_SYNC_NOW)) { @@ -274,6 +281,7 @@ class MainViewModel( } fun logOut() { + metadataSyncObserverJob?.cancel() launchUseCase(dispatcher.io()) { matomoAnalyticsController.trackEvent(HOME, CLOSE_SESSION, CLICK) logOutUser().fold( @@ -282,6 +290,7 @@ class MainViewModel( }, onFailure = { Timber.e(it) + observeMetadataSyncJob() }, ) } @@ -289,6 +298,7 @@ class MainViewModel( context(context: Context) fun onDeleteAccount() { + metadataSyncObserverJob?.cancel() launchUseCase(dispatcher.io()) { _homeEffects.send(HomeEffect.ShowDeleteNotification) deleteAccount(context.cacheDir).fold( @@ -298,6 +308,7 @@ class MainViewModel( }, onFailure = { Timber.e(it) + observeMetadataSyncJob() }, ) } diff --git a/app/src/test/java/org/dhis2/usescases/main/MainViewModelTest.kt b/app/src/test/java/org/dhis2/usescases/main/MainViewModelTest.kt index 2887dfdf976..7b972eeb16c 100644 --- a/app/src/test/java/org/dhis2/usescases/main/MainViewModelTest.kt +++ b/app/src/test/java/org/dhis2/usescases/main/MainViewModelTest.kt @@ -51,7 +51,6 @@ import org.dhis2.utils.MainCoroutineScopeRule import org.dhis2.utils.analytics.CLOSE_SESSION import org.dhis2.utils.customviews.navigationbar.NavigationPage import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarItem -import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Rule @@ -59,6 +58,7 @@ import org.junit.Test import org.mockito.kotlin.any import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock +import org.mockito.kotlin.never import org.mockito.kotlin.times import org.mockito.kotlin.verify import org.mockito.kotlin.whenever @@ -102,6 +102,15 @@ class MainViewModelTest { private val newVersionFlow = MutableSharedFlow<String>() private val metadataJobFlow = MutableStateFlow<List<SyncJobStatus>>(emptyList()) + private val succeededMetadataJob = + listOf( + SyncJobStatus( + tags = listOf(METADATA_SYNC_NOW), + status = SyncStatus.Succeed, + message = null, + ), + ) + @Before fun setUp() = runTest { Dispatchers.setMain(testingDispatcher) @@ -171,6 +180,58 @@ class MainViewModelTest { } } + @Test + fun `Should reconfigure navigation bar when metadata sync succeeds`() = + runTest { + whenever(configureHomeNavigationBar()) doReturn Result.success(emptyList()) + metadataJobFlow.emit(succeededMetadataJob) + advanceUntilIdle() + verify(configureHomeNavigationBar).invoke(Unit) + } + + @Test + fun `Should not reconfigure navigation bar when metadata sync emits after logout`() = + runTest { + whenever(logOutUser()) doReturn Result.success(1) + viewModel.homeEffects.test { + viewModel.logOut() + metadataJobFlow.emit(succeededMetadataJob) + advanceUntilIdle() + assertTrue(awaitItem() == HomeEffect.GoToLogin(1, false)) + verify(configureHomeNavigationBar, never()).invoke(Unit) + } + } + + @Test + fun `Should keep observing metadata sync when logout fails`() = + runTest { + whenever(logOutUser()) doReturn Result.failure(Exception("logout failed")) + whenever(configureHomeNavigationBar()) doReturn Result.success(emptyList()) + viewModel.logOut() + advanceUntilIdle() + metadataJobFlow.emit(succeededMetadataJob) + advanceUntilIdle() + verify(configureHomeNavigationBar).invoke(Unit) + } + + @Test + fun `Should not reconfigure navigation bar when metadata sync emits after account deletion`() = + runTest { + whenever(deleteAccount(any())) doReturn Result.success(1) + viewModel.homeEffects.test { + val mockedContext = mock<Context>() + whenever(mockedContext.cacheDir) doReturn File("random") + with(mockedContext) { + viewModel.onDeleteAccount() + } + metadataJobFlow.emit(succeededMetadataJob) + advanceUntilIdle() + assertTrue(awaitItem() == HomeEffect.ShowDeleteNotification) + assertTrue(awaitItem() == HomeEffect.GoToLogin(1, true)) + verify(configureHomeNavigationBar, never()).invoke(Unit) + } + } + @Test fun `Should block session`() = runTest { From afa4607b1681e6c020e02b6d2a81241a80b364ff Mon Sep 17 00:00:00 2001 From: Xavier Molloy <xavi@dhis2.org> Date: Mon, 6 Jul 2026 12:20:17 +0200 Subject: [PATCH 259/260] build: 3.4.1 release MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * build: Release 3.4.1 * update release notes Signed-off-by: Manu Muñoz <manu.munoz@dhis2.org> * chore: update dependency verification metadata --------- Signed-off-by: Manu Muñoz <manu.munoz@dhis2.org> Co-authored-by: Manu Muñoz <manu.munoz@dhis2.org> Co-authored-by: @dhis2-bot <apps@dhis2.org> --- RELEASE.md | 102 +++++++++++++++++++++++++++++-- gradle/libs.versions.toml | 8 +-- gradle/verification-metadata.xml | 10 +++ whatsnew/whatsnew-en-US | 8 ++- 4 files changed, 118 insertions(+), 10 deletions(-) diff --git a/RELEASE.md b/RELEASE.md index d6427abcdc4..8d34896494e 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,7 +1,101 @@ -# Release notes - Android App for DHIS2 - 3.4.0.1 +# Release notes - Android App for DHIS2 - 3.4.1 -This patch release includes a hotfix. +### Bug -## Bugs fixed +[ANDROAPP-6516](https://dhis2.atlassian.net/browse/ANDROAPP-6516) Values in events and program stages not being updated when syncing with server from them -* [ANDROAPP-7634](https://dhis2.atlassian.net/browse/ANDROAPP-7634) SMS module is accidentally enabled when ASWA is installed +[ANDROAPP-6611](https://dhis2.atlassian.net/browse/ANDROAPP-6611) Synchronization does not automatically start on re-connection + +[ANDROAPP-7238](https://dhis2.atlassian.net/browse/ANDROAPP-7238) Analytics configured with data type int in web show 1 decimal in app + +[ANDROAPP-7287](https://dhis2.atlassian.net/browse/ANDROAPP-7287) Flicker when no teis in tei list + +[ANDROAPP-7352](https://dhis2.atlassian.net/browse/ANDROAPP-7352) Delete TEI/Delete Enrollment is not showing in the menu with the ALL authority + +[ANDROAPP-7364](https://dhis2.atlassian.net/browse/ANDROAPP-7364) Server URL not well formed error + +[ANDROAPP-7398](https://dhis2.atlassian.net/browse/ANDROAPP-7398) Wrong Snackbar color + +[ANDROAPP-7406](https://dhis2.atlassian.net/browse/ANDROAPP-7406) Cards are not always displayed in map view + +[ANDROAPP-7412](https://dhis2.atlassian.net/browse/ANDROAPP-7412) Offline Biometric Login is not accessible + +[ANDROAPP-7431](https://dhis2.atlassian.net/browse/ANDROAPP-7431) username does not trim trailing white spaces + +[ANDROAPP-7439](https://dhis2.atlassian.net/browse/ANDROAPP-7439) Custom label \(at least enrollment\) is not displayed when editing a TE + +[ANDROAPP-7446](https://dhis2.atlassian.net/browse/ANDROAPP-7446) Incorrect flow to create TEI: Display front page list and Allow user to create a TEI without searching + +[ANDROAPP-7458](https://dhis2.atlassian.net/browse/ANDROAPP-7458) Cannot select lower options in large option sets with checkbox or radio button configuration + +[ANDROAPP-7499](https://dhis2.atlassian.net/browse/ANDROAPP-7499) New Network Status Provider does not handle VPNs and local connections + +[ANDROAPP-7520](https://dhis2.atlassian.net/browse/ANDROAPP-7520) SSO: Logout does not end IdP session + +[ANDROAPP-7523](https://dhis2.atlassian.net/browse/ANDROAPP-7523) Cursor moves to the end when updating value + +[ANDROAPP-7527](https://dhis2.atlassian.net/browse/ANDROAPP-7527) NullPointerException: The callable returned a null value + +[ANDROAPP-7528](https://dhis2.atlassian.net/browse/ANDROAPP-7528) ApplicationNotResponding: ANR + +[ANDROAPP-7531](https://dhis2.atlassian.net/browse/ANDROAPP-7531) Program rule: not triggered unless selection is made in option set + +[ANDROAPP-7532](https://dhis2.atlassian.net/browse/ANDROAPP-7532) \[ANR\] In TeiDashboard with displayAnalytics\(\) + +[ANDROAPP-7533](https://dhis2.atlassian.net/browse/ANDROAPP-7533) Working list results fluctuating and loading inconsistently + +[ANDROAPP-7541](https://dhis2.atlassian.net/browse/ANDROAPP-7541) AppTheme color not changing text colors + +[ANDROAPP-7544](https://dhis2.atlassian.net/browse/ANDROAPP-7544) \[Mobile-UI\] When the DateTime input has focus a small section of the supporting Text background color is shown + +[ANDROAPP-7546](https://dhis2.atlassian.net/browse/ANDROAPP-7546) Error when assigning more than one option to multi-select field in the Android capture app + +[ANDROAPP-7564](https://dhis2.atlassian.net/browse/ANDROAPP-7564) Description of assigned \(disabled\) data elements are not shown in the android capture + +[ANDROAPP-7565](https://dhis2.atlassian.net/browse/ANDROAPP-7565) Crash - toggle between orientation in events + +[ANDROAPP-7566](https://dhis2.atlassian.net/browse/ANDROAPP-7566) Numeric value type in search screen does not allow decimals + +[ANDROAPP-7567](https://dhis2.atlassian.net/browse/ANDROAPP-7567) Unsupported fields are visible in search screen + +[ANDROAPP-7568](https://dhis2.atlassian.net/browse/ANDROAPP-7568) Polygons are not correctly stored in the device + +[ANDROAPP-7572](https://dhis2.atlassian.net/browse/ANDROAPP-7572) New events use enrollment OU instead of ownership OU after TEI transfer + +[ANDROAPP-7574](https://dhis2.atlassian.net/browse/ANDROAPP-7574) Crash whilst sync \(could not replicate\) + +[ANDROAPP-7582](https://dhis2.atlassian.net/browse/ANDROAPP-7582) Unable to close bottomsheet in very long org unit list + +[ANDROAPP-7588](https://dhis2.atlassian.net/browse/ANDROAPP-7588) Sync message not consistent when offline + +[ANDROAPP-7590](https://dhis2.atlassian.net/browse/ANDROAPP-7590) Sync error due to program rules the assign value of calculated value + +[ANDROAPP-7601](https://dhis2.atlassian.net/browse/ANDROAPP-7601) Change orientation: Main content area goes blank/white + +[ANDROAPP-7603](https://dhis2.atlassian.net/browse/ANDROAPP-7603) Allow screenshots and screen sharing in Training APK + +[ANDROAPP-7613](https://dhis2.atlassian.net/browse/ANDROAPP-7613) IllegalArgumentException: Can't represent a width of 0 and height of 276000 in Constraints + +[ANDROAPP-7614](https://dhis2.atlassian.net/browse/ANDROAPP-7614) IllegalStateException: No database is currently activated. + +[ANDROAPP-7619](https://dhis2.atlassian.net/browse/ANDROAPP-7619) \[ANR\] Home filters + +[ANDROAPP-7632](https://dhis2.atlassian.net/browse/ANDROAPP-7632) Conscrypt crashing for API 37 + +[ANDROAPP-7635](https://dhis2.atlassian.net/browse/ANDROAPP-7635) Cannot access TEI as it is marked incorrectly as online + +[ANDROAPP-7637](https://dhis2.atlassian.net/browse/ANDROAPP-7637) Programs tab appears when analytics is not configured + +[ANDROAPP-7646](https://dhis2.atlassian.net/browse/ANDROAPP-7646) Local search results is not returned if remote request fails + +[ANDROAPP-7647](https://dhis2.atlassian.net/browse/ANDROAPP-7647) Past results are not cleared when a new search is made + +[ANDROAPP-7658](https://dhis2.atlassian.net/browse/ANDROAPP-7658) Program Rule Errors do not prevent syncing of data + +[ANDROAPP-7661](https://dhis2.atlassian.net/browse/ANDROAPP-7661) Race condition to sync images using granular sync + +[ANDROAPP-7668](https://dhis2.atlassian.net/browse/ANDROAPP-7668) Images/files \(FileResource\) sometimes not downloaded during granular sync — subsequent edit uploads an empty image Data Element overwriting the image in server + +[ANDROAPP-7674](https://dhis2.atlassian.net/browse/ANDROAPP-7674) Crash opening map in tablet from teidashboard + +[ANDROAPP-7694](https://dhis2.atlassian.net/browse/ANDROAPP-7694) App crash on logout and \(occasionally\) delete account \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 579a4e2234d..f01cf784327 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,14 +4,14 @@ lifecycleRuntimeCompose = "2.9.6" navigationCompose = "2.9.2" sdk = "36" minSdk = "23" -vCode = "155" -vName = "3.4.1-RC" +vCode = "156" +vName = "3.4.1" gradle = "9.0.1" kotlin = '2.3.20' dagger = '2.57.2' jacoco = '0.8.14' -designSystem = "0.7.1-SNAPSHOT" -dhis2sdk = "1.14.1-SNAPSHOT" +designSystem = "0.7.1" +dhis2sdk = "1.14.1" ruleEngine = "3.7.2" expressionParser = "1.4.1" appcompat = "1.7.1" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 2e930a4cd2f..c1a0d8aa7d3 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -4062,6 +4062,16 @@ <sha256 value="3c77089a35108ef47cebc72e4baab3f3b686b217322399624087483b3efeffe0" origin="Generated by Gradle"/> </artifact> </component> + <component group="org.hisp.dhis.mobile" name="designsystem-android" version="0.7.1"> + <artifact name="designsystem-release.aar"> + <sha256 value="50a24964b60fe31049280e410fc4c9cff016a1bd0e2fe48e39fec89aa6f479c2" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.hisp.dhis.mobile" name="designsystem-desktop" version="0.7.1"> + <artifact name="designsystem-desktop-0.7.1.jar"> + <sha256 value="4bc6be69230439ae8718a41ea6043f5add804582cdd8bd1fbb16c9c19c03ba3a" origin="Generated by Gradle"/> + </artifact> + </component> <component group="org.hisp.dhis.parser" name="dhis-antlr-expression-parser" version="1.0.39"> <artifact name="dhis-antlr-expression-parser-1.0.39.jar"> <sha256 value="67f0b36e92f7b81bca82e5274befaeed5e684d15f884c27589905b67ab7a1de5" origin="Generated by Gradle"/> diff --git a/whatsnew/whatsnew-en-US b/whatsnew/whatsnew-en-US index d7d138dfd25..2a9f6e9b9f0 100644 --- a/whatsnew/whatsnew-en-US +++ b/whatsnew/whatsnew-en-US @@ -1,5 +1,9 @@ This is a patch version that fixes: +- ANDROAPP-6516 Values in events and program stages not being updated when syncing with server from them +- ANDROAPP-7287 Flicker when no TEIs in tei list +- ANDROAPP-7364 Server URL not well formed error +- ANDROAPP-7398 Wrong SnackBar color +- ANDROAPP-7431 Username does not trim trailing white spaces -- ANDROAPP-7634 SMS module is accidentally enabled when ASWA is installed - +.... You can find all the details on Jira and Github. \ No newline at end of file From 8a7b6f218141993f2d2b472007f23d426de28a71 Mon Sep 17 00:00:00 2001 From: Alex <oleksiy.vt@gmail.com> Date: Mon, 6 Jul 2026 17:01:16 +0100 Subject: [PATCH 260/260] Merge branch 'main' (with upstream/3.4.1 already merged into) into upstream-release/3.4.1-from-main (with ramp-main as base) --- .claude/skills/android-testing/SKILL.md | 235 + .editorconfig | 1 + .github/agents/testing.agent.md | 323 +- .github/dependabot.yml | 6 +- .github/workflows/build-release-candidate.yml | 10 +- .github/workflows/continuous-delivery.yml | 37 +- .github/workflows/deploy-release.yml | 6 +- .github/workflows/fix-kmp-translations.yml | 61 + .../rampcapture-github-release-signed-apk.yml | 2 +- .../simcapture-github-release-signed-apk.yml | 2 +- .../simcapture-sync-fork-upstream-main.yml | 2 +- .../workflows/verify-dependency-metadata.yml | 95 + .tx/config | 9 - AGENTS.md | 552 +- CLAUDE.md | 5 + Jenkinsfile | 13 +- README.md | 128 +- RELEASE.md | 76 +- aggregates/build.gradle.kts | 65 +- .../data/DataSetInstanceRepositoryImplTest.kt | 0 .../data/DataSetInstanceRepositoryImpl.kt | 62 +- .../composeResources/values-ar/strings.xml | 2 - .../composeResources/values-cs/strings.xml | 2 - .../composeResources/values-es/strings.xml | 4 +- .../values-hi-rIN/strings.xml | 3 +- .../composeResources/values-nb/strings.xml | 1 - .../composeResources/values-ru/strings.xml | 2 - .../composeResources/values-vi/strings.xml | 2 - .../composeResources/values-zh/strings.xml | 3 +- .../composeResources/values/strings.xml | 3 +- .../data/DataSetInstanceRepository.kt | 3 + .../aggregates/domain/GetDataValueData.kt | 1 + .../aggregates/domain/GetDataValueInput.kt | 2 + .../mobile/aggregates/domain/SetDataValue.kt | 1 + .../mobile/aggregates/model/DataSetDetails.kt | 2 + .../aggregates/ui/DataSetTableScreen.kt | 4 + .../aggregates/ui/inputs/InputProvider.kt | 30 +- .../ui/snackbar/DataSetSnackbarHost.kt | 4 - .../aggregates/ui/states/InputDataUiState.kt | 2 +- .../ui/viewModel/DataSetTableViewModel.kt | 281 +- .../domain/GetDataValueInputTest.kt | 2 +- .../ui/viewModel/DataSetTableViewModelTest.kt | 20 +- app/build.gradle.kts | 177 +- app/fabric.properties | 3 - .../androidTest/assets/databases/dhis_test.db | Bin 10506240 -> 10883072 bytes .../mocks/settingswebapp/generalsettings.json | 9 + app/src/androidTest/java/org/dhis2/AppTest.kt | 13 - .../java/org/dhis2/DBTestLoader.kt | 7 +- .../java/org/dhis2/common/BaseRobot.kt | 13 +- .../org/dhis2/common/db/TestingDatabase.kt | 61 - .../org/dhis2/usescases/UseCaseTestsSuite.kt | 3 +- .../org/dhis2/usescases/about/AboutTest.kt | 23 +- .../usescases/datasets/DataSetDetailRobot.kt | 2 +- .../usescases/datasets/DataSetInitialRobot.kt | 12 +- .../usescases/datasets/DataSetTableRobot.kt | 21 +- .../dhis2/usescases/datasets/DataSetTest.kt | 52 +- .../usescases/event/EventRegistrationRobot.kt | 40 - .../usescases/flow/teiFlow/TeiFlowRobot.kt | 2 + .../org/dhis2/usescases/login/LoginRobot.kt | 178 +- .../org/dhis2/usescases/login/LoginTest.kt | 165 +- .../org/dhis2/usescases/main/MainRobot.kt | 55 +- .../java/org/dhis2/usescases/main/MainTest.kt | 30 +- .../java/org/dhis2/usescases/pin/PinRobot.kt | 40 - .../java/org/dhis2/usescases/pin/PinTest.kt | 31 - .../programevent/ProgramEventTest.kt | 12 +- .../programevent/robot/ProgramEventsRobot.kt | 7 +- .../dhis2/usescases/searchte/SearchTETest.kt | 86 + .../usescases/searchte/robot/FilterRobot.kt | 8 +- .../searchte/robot/SearchTeiRobot.kt | 254 +- .../dhis2/usescases/settings/SettingsRobot.kt | 9 +- .../dhis2/usescases/settings/SettingsTest.kt | 53 +- .../sync/MockedWorkManagerController.kt | 53 - .../usescases/sync/MockedWorkManagerModule.kt | 13 - .../dhis2/usescases/sync/SyncActivityTest.kt | 108 +- .../teidashboard/TeiDashboardTest.kt | 24 +- .../scheduling/SchedulingDialogUiTest.kt | 18 +- .../teidashboard/robot/EnrollmentRobot.kt | 8 +- .../teidashboard/robot/EventRobot.kt | 53 +- .../usescases/teidashboard/robot/NoteRobot.kt | 60 +- .../teidashboard/robot/TeiDashboardRobot.kt | 171 +- app/src/debug/AndroidManifest.xml | 1 - .../main/domain/DownloadNewVersion.kt | 33 + .../utils/granularsync/GranularSyncModule.kt | 8 + .../main/domain/DownloadNewVersion.kt | 21 + .../utils/granularsync/GranularSyncModule.kt | 8 + .../main/domain/DownloadNewVersion.kt | 33 + .../utils/granularsync/GranularSyncModule.kt | 8 + app/src/main/AndroidManifest.xml | 24 +- app/src/main/java/org/dhis2/App.java | 28 +- app/src/main/java/org/dhis2/AppModule.kt | 12 + .../java/org/dhis2/bindings/Bindings.java | 9 - .../org/dhis2/bindings/SettingExtensions.kt | 1 + .../dhis2/data/biometric/BiometricUtils.kt | 34 +- .../org/dhis2/data/dhislogic/Authorities.kt | 2 + .../data/enrollment/EnrollmentUiDataHelper.kt | 2 +- .../data/forms/dataentry/ProgramAdapter.java | 27 +- .../dhis2/data/forms/dataentry/ValueStore.kt | 9 - .../data/forms/dataentry/ValueStoreImpl.kt | 97 +- .../data/server/SSLContextInitializer.kt | 2 +- .../org/dhis2/data/server/ServerModule.kt | 31 +- .../data/server/ServerSettingsRepository.kt | 43 +- .../dhis2/data/server/SystemStyleMapper.kt | 17 - .../dhis2/data/service/CheckVersionWorker.kt | 13 +- .../dhis2/data/service/SyncDataWorker.java | 206 - .../data/service/SyncDataWorkerComponent.java | 13 - .../data/service/SyncDataWorkerModule.kt | 37 - .../data/service/SyncGranularRxModule.kt | 16 +- .../dhis2/data/service/SyncGranularWorker.kt | 4 +- .../dhis2/data/service/SyncInitWorker.java | 46 - .../data/service/SyncInitWorkerComponent.java | 13 - .../data/service/SyncInitWorkerModule.kt | 37 - .../data/service/SyncMetadataWorker.java | 212 - .../service/SyncMetadataWorkerComponent.java | 13 - .../data/service/SyncMetadataWorkerModule.kt | 37 - .../org/dhis2/data/service/SyncPresenter.java | 33 +- .../dhis2/data/service/SyncPresenterImpl.kt | 422 +- .../org/dhis2/data/service/SyncRepository.kt | 5 +- .../dhis2/data/service/SyncRepositoryImpl.kt | 19 +- .../data/service/SyncStatusController.kt | 190 - .../dhis2/data/service/VersionRepository.kt | 22 +- .../workManager/WorkManagerController.kt | 10 - .../workManager/WorkManagerControllerImpl.kt | 46 +- .../data/service/workManager/WorkerType.kt | 2 - .../data/sorting/SearchSortingValueSetter.kt | 13 +- .../org/dhis2/data/user/UserComponent.java | 26 - .../java/org/dhis2/di/KoinInitialization.kt | 30 + .../main/java/org/dhis2/di/ServerModule.kt | 3 + ...printsLoadBiometricSearchResultsUseCase.kt | 41 +- ...dPossibleDuplicatesSearchResultsUseCase.kt | 53 +- ...eSingleBiometricSearchNavigationUseCase.kt | 47 +- .../ramp/ui/EventHistoryTableScreen.kt | 2 +- .../datasetDetail/DataSetDetailActivity.java | 14 +- .../DataSetDetailRepositoryImpl.java | 7 +- .../development/ConflictGenerator.kt | 56 +- .../usescases/enrollment/EnrollmentModule.kt | 16 +- .../eventCapture/EventCaptureActivity.kt | 16 +- .../eventCapture/EventCaptureContract.kt | 4 +- .../eventCapture/EventCaptureModule.kt | 2 +- .../eventCapture/EventCapturePagerAdapter.kt | 17 + .../EventCaptureRepositoryImpl.kt | 377 +- .../EventCaptureFormPresenter.kt | 4 +- .../providers/EventDetailResourcesProvider.kt | 4 +- .../EventInitialRepositoryImpl.kt | 2 + .../general/ActivityGlobalAbstract.java | 4 +- .../general/SessionManagerActivity.kt | 104 +- .../dhis2/usescases/login/LoginActivity.kt | 10 + .../login/SyncIsPerformedInteractor.kt | 58 - .../usescases/main/HomePageConfigurator.kt | 39 - .../dhis2/usescases/main/HomeRepository.kt | 35 - .../usescases/main/HomeRepositoryImpl.kt | 159 - .../org/dhis2/usescases/main/MainActivity.kt | 612 +- .../org/dhis2/usescases/main/MainComponent.kt | 14 - .../org/dhis2/usescases/main/MainModule.kt | 255 +- .../org/dhis2/usescases/main/MainNavigator.kt | 147 +- .../org/dhis2/usescases/main/MainPresenter.kt | 401 -- .../dhis2/usescases/main/MainScreenType.kt | 24 + .../java/org/dhis2/usescases/main/MainView.kt | 70 - .../org/dhis2/usescases/main/MainViewModel.kt | 452 ++ .../usescases/main/data/HomeRepository.kt | 8 +- .../usescases/main/data/HomeRepositoryImpl.kt | 15 + .../main/domain/CheckSingleNavigation.kt | 22 + .../main/domain/ConfigureHomeNavigationBar.kt | 51 + .../usescases/main/domain/DeleteAccount.kt | 25 + .../usescases/main/domain/GetHomeFilters.kt | 17 + .../usescases/main/domain/GetLockAction.kt | 22 + .../usescases/main/domain/GetUserName.kt | 20 + .../main/domain/LaunchInitialSync.kt | 33 + .../dhis2/usescases/main/domain/LogoutUser.kt | 17 +- .../main/domain/ScheduleNewVersionAlert.kt | 35 + .../main/domain/UpdateInitialSyncStatus.kt | 17 + .../main/domain/model/BottomNavigationItem.kt | 7 + .../main/domain/model/DownloadMethod.kt | 11 + .../usescases/main/domain/model/LockAction.kt | 7 + .../usescases/main/program/ProgramFragment.kt | 9 +- .../usescases/main/program/ProgramModule.kt | 4 +- .../main/program/ProgramRepository.kt | 2 +- .../main/program/ProgramRepositoryImpl.kt | 4 +- .../dhis2/usescases/main/program/ProgramUi.kt | 2 +- .../main/program/ProgramViewModel.kt | 6 +- .../main/program/ProgramViewModelFactory.kt | 2 +- .../usescases/main/ui/model/HomeAction.kt | 15 + .../usescases/main/ui/model/HomeEffect.kt | 36 + .../main/ui/model/HomeScreenState.kt | 43 + .../usescases/main/ui/screens/MainScreen.kt | 232 + .../notes/noteDetail/NoteDetailPresenter.kt | 3 + .../ProgramEventDetailViewModel.kt | 16 +- .../programEventDetail/ProgramEventMapper.kt | 1 + .../searchTrackEntity/MapDataRepository.kt | 31 +- .../searchTrackEntity/SearchRepository.java | 12 - .../SearchRepositoryImpl.java | 564 +- .../SearchRepositoryImplKt.kt | 413 +- .../searchTrackEntity/SearchRepositoryKt.kt | 46 +- .../searchTrackEntity/SearchTEActivity.kt | 20 +- .../searchTrackEntity/SearchTEIViewModel.kt | 1108 ++-- .../searchTrackEntity/SearchTEModule.java | 190 +- .../searchTrackEntity/SearchTEPresenter.java | 7 +- .../searchTrackEntity/SearchTeiModel.java | 202 +- .../SearchTeiViewModelFactory.kt | 15 +- .../adapters/BaseTeiViewHolder.kt | 32 +- .../adapters/SearchAdapterDiffCallback.kt | 18 +- .../adapters/SearchRelationshipViewHolder.kt | 2 +- .../adapters/SearchTEViewHolder.kt | 23 +- .../adapters/SearchTeiLiveAdapter.kt | 14 +- .../adapters/SearchTeiModelExtensions.kt | 171 +- .../di/SearchTEKoinModule.kt | 128 + .../listView/SearchTEList.kt | 25 +- .../searchTrackEntity/mapView/SearchTEMap.kt | 26 +- .../SearchParametersScreen.kt | 504 -- .../SearchParametersScreenProvider.kt | 229 + .../provider/ParameterSelectorItemProvider.kt | 173 - .../searchTrackEntity/ui/SearchTEUi.kt | 8 +- .../ui/SimprintsSearchTeUiComponents.kt | 1 - .../ui/mapper/TEICardMapper.kt | 148 +- .../usescases/settings/DeleteUserData.kt | 11 +- .../usescases/settings/SettingsRepository.kt | 41 +- .../usescases/settings/SyncManagerFragment.kt | 5 +- .../usescases/settings/SyncManagerModule.kt | 10 +- .../settings/SyncManagerPresenter.kt | 25 +- .../settings/domain/GetSettingsState.kt | 62 +- .../usescases/settings/domain/LaunchSync.kt | 155 +- .../settings/models/DataSettingsViewModel.kt | 1 + .../models/MetadataSettingsViewModel.kt | 2 + .../settings/models/SyncStateInput.kt | 10 + .../usescases/settings/ui/SettingsScreen.kt | 14 +- .../settings/ui/SyncDataSettingItem.kt | 58 +- .../settings/ui/SyncMetadataSettingItem.kt | 108 +- .../dhis2/usescases/splash/SplashActivity.kt | 51 +- .../org/dhis2/usescases/sync/SyncActivity.kt | 24 +- .../org/dhis2/usescases/sync/SyncInjector.kt | 6 +- .../org/dhis2/usescases/sync/SyncPresenter.kt | 31 +- .../teiDashboard/DashboardRepository.kt | 6 +- .../teiDashboard/DashboardRepositoryImpl.kt | 19 +- .../teiDashboard/DashboardViewModel.kt | 21 +- .../TeiDashboardMobileActivity.kt | 17 +- .../TeiDashboardPageConfigurator.kt | 2 +- .../indicators/BaseIndicatorRepository.kt | 44 +- .../indicators/EventIndicatorRepository.kt | 31 +- .../indicators/IndicatorRepository.kt | 3 +- .../indicators/IndicatorsModule.kt | 6 +- .../indicators/IndicatorsPresenter.kt | 42 +- .../indicators/TrackerAnalyticsRepository.kt | 47 +- .../relationships/RelationshipModule.java | 45 +- .../teidata/TEIDataFragment.kt | 2 + .../teidata/TEIDataPresenter.kt | 33 +- .../teidata/TeiDataRepository.kt | 2 + .../teidata/TeiDataRepositoryImpl.kt | 14 + .../TeiProgramListActivity.java | 2 +- .../TeiProgramListInteractor.java | 2 +- .../teiProgramList/TeiProgramListModule.java | 12 +- .../usescases/teiDashboard/ui/TopBarIcons.kt | 8 +- .../TrackedEntityInstanceInfoProvider.kt | 37 +- .../TroubleshootingFragment.kt | 28 +- .../TroubleshootingInjector.kt | 44 - .../main/java/org/dhis2/utils/ThemeColors.kt | 27 + .../main/java/org/dhis2/utils/ValueUtils.kt | 46 +- .../java/org/dhis2/utils/WebViewActivity.kt | 57 - .../dhis2/utils/analytics/AnalyticsHelper.kt | 4 +- .../analytics/matomo/MatomoAnalyticsModule.kt | 3 +- .../dhis2/utils/customviews/MoreMenuView.kt | 5 +- .../granularsync/GranularSyncPresenter.kt | 46 +- .../GranularSyncViewModelFactory.kt | 4 + .../utils/granularsync/SyncStatusDialog.kt | 32 +- .../utils/granularsync/SyncStatusItem.kt | 61 +- .../{ => data}/GranularSyncRepository.kt | 368 +- .../domain/MissingSyncTargetException.kt | 5 + .../utils/granularsync/domain/SyncStatus.kt | 12 + .../granularsync/domain/SyncStatusData.kt | 11 + .../granularsync/{ => ui}/SyncUiState.kt | 9 +- .../granularsync/ui/SyncUiStateMapper.kt | 160 + .../java/org/dhis2/utils/session/PinDialog.kt | 142 - .../org/dhis2/utils/session/PinExtensions.kt | 23 - .../java/org/dhis2/utils/session/PinModule.kt | 42 - .../org/dhis2/utils/session/PinPresenter.kt | 58 - .../java/org/dhis2/utils/session/PinView.kt | 7 - .../dhis2/utils/session/SessionComponent.kt | 33 - .../layout-land/activity_dashboard_mobile.xml | 7 +- .../main/res/layout-land/activity_search.xml | 10 +- app/src/main/res/layout-land/layout_pin.xml | 89 - .../res/layout/activity_dashboard_mobile.xml | 7 +- .../res/layout/activity_dataset_detail.xml | 7 +- .../res/layout/activity_dataset_initial.xml | 5 +- .../res/layout/activity_event_capture.xml | 11 +- app/src/main/res/layout/activity_main.xml | 120 +- .../layout/activity_program_event_detail.xml | 9 +- app/src/main/res/layout/activity_search.xml | 7 +- app/src/main/res/layout/dialog_pin.xml | 87 - .../res/layout/item_search_tracked_entity.xml | 6 +- app/src/main/res/layout/layout_pin.xml | 101 - .../layout/spinner_program_item_layout.xml | 28 + .../res/layout/spinner_program_layout.xml | 5 +- app/src/main/res/menu/main_menu.xml | 6 + app/src/main/res/values-ar-rIQ/strings.xml | 49 +- app/src/main/res/values-ar/strings.xml | 375 +- app/src/main/res/values-bn/strings.xml | 19 +- app/src/main/res/values-ckb/strings.xml | 54 +- app/src/main/res/values-cs/strings.xml | 376 +- app/src/main/res/values-da/strings.xml | 41 +- app/src/main/res/values-en-rUS/strings.xml | 33 +- app/src/main/res/values-es-rES/strings.xml | 340 +- app/src/main/res/values-es/strings.xml | 366 +- app/src/main/res/values-fr/strings.xml | 354 +- app/src/main/res/values-hi-rIN/strings.xml | 76 +- app/src/main/res/values-id/strings.xml | 426 +- app/src/main/res/values-km/strings.xml | 166 +- app/src/main/res/values-lo/strings.xml | 338 +- app/src/main/res/values-my/strings.xml | 63 +- app/src/main/res/values-nb/strings.xml | 307 +- app/src/main/res/values-ne/strings.xml | 12 +- app/src/main/res/values-nl/strings.xml | 353 +- app/src/main/res/values-or/strings.xml | 13 +- app/src/main/res/values-prs/strings.xml | 81 +- app/src/main/res/values-ps/strings.xml | 78 +- app/src/main/res/values-pt-rBR/strings.xml | 86 +- app/src/main/res/values-pt/strings.xml | 365 +- app/src/main/res/values-ro/strings.xml | 35 +- app/src/main/res/values-ru/strings.xml | 357 +- app/src/main/res/values-si/strings.xml | 31 +- app/src/main/res/values-sv/strings.xml | 147 +- app/src/main/res/values-tet/strings.xml | 39 +- app/src/main/res/values-tg/strings.xml | 57 +- app/src/main/res/values-uk/strings.xml | 337 +- app/src/main/res/values-ur/strings.xml | 79 +- app/src/main/res/values-uz-rUZ/strings.xml | 287 +- app/src/main/res/values-uz/strings.xml | 326 +- app/src/main/res/values-vi/strings.xml | 351 +- app/src/main/res/values-zh-rCN/strings.xml | 350 +- app/src/main/res/values-zh/strings.xml | 371 +- app/src/main/res/values/strings.xml | 400 +- .../dhis2/bindings/SettingsExtensionsTest.kt | 1 + .../dhis2/bindings/TEICardExtensionsTest.kt | 5 +- .../data/dhislogic/DhisEnrollmentUtilsTest.kt | 2 + .../data/dhislogic/DhisPeriodUtilsTest.kt | 100 + .../dhislogic/EnrollmentEventGeneratorTest.kt | 4 + .../dhis2/data/filter/FilterRepositoryTest.kt | 11 + .../data/forms/dataentry/ValueStoreTest.kt | 28 +- .../dhis2/data/services/SyncPresenterTest.kt | 256 +- .../sorting/SearchSortingValueSetterTest.kt | 162 +- ...tsLoadBiometricSearchResultsUseCaseTest.kt | 103 +- ...sibleDuplicatesSearchResultsUseCaseTest.kt | 102 +- ...gleBiometricSearchNavigationUseCaseTest.kt | 143 +- .../simprints/SimprintsSearchTestModels.kt | 96 + .../data/EventHistoryTableRepositoryTest.kt | 14 +- ...pCoordinateFieldToFeatureCollectionTest.kt | 7 + .../MapDataElementToFeatureTest.kt | 7 + .../DataSetDetailRepositoryTest.kt | 17 +- .../DataSetDetailViewModelTest.kt | 18 +- .../datasetlist/DataSetListViewModelTest.kt | 66 +- .../EnrollmentFormRepositoryTest.kt | 3 + .../enrollment/EnrollmentPresenterImplTest.kt | 87 +- .../EventCaptureRepositoryImplTest.kt | 324 +- .../eventInitial/EventInitialPresenterTest.kt | 9 +- .../EventInitialRepositoryImplTest.kt | 2 + .../login/SyncIsPerformedInteractorTest.kt | 115 - .../dhis2/usescases/main/MainPresenterTest.kt | 323 - .../main/MainViewModelIntegrationTest.kt | 462 ++ .../dhis2/usescases/main/MainViewModelTest.kt | 287 + .../main/domain/CheckSingleNavigationTest.kt | 70 + .../domain/ConfigureHomeNavigationBarTest.kt | 63 + .../main/domain/DeleteAccountTest.kt | 65 + .../main/domain/DownloadNewVersionTest.kt | 60 + .../main/domain/GetHomeFiltersTest.kt | 44 + .../main/domain/GetLockActionTest.kt | 53 + .../usescases/main/domain/GetUserNameTest.kt | 99 + .../main/domain/LaunchInitialSyncTest.kt | 144 + .../usescases/main/domain/LogoutUserTest.kt | 25 +- .../domain/ScheduleNewVersionAlertTest.kt | 55 + .../domain/UpdateInitialSyncStatusTest.kt | 46 + .../main/program/ProgramRepositoryImplTest.kt | 10 +- .../main/program/ProgramViewModelTest.kt | 4 +- .../usescases/notes/NotesRepositoryTest.kt | 10 +- .../noteDetail/NoteDetailRepositoryTest.kt | 7 +- .../ProgramEventDetailPresenterTest.kt | 9 +- .../ProgramEventMapperTest.kt | 7 +- .../searchTrackEntity/SearchRepositoryTest.kt | 238 +- .../SearchTEIViewModelTest.kt | 1307 +--- .../SearchTEPresenterTest.kt | 11 +- .../ui/mapper/TEICardMapperTest.kt | 189 +- .../usescases/settings/DeleteUserDataTest.kt | 15 +- .../settings/SettingsRepositoryTest.kt | 49 +- .../settings/SyncManagerPresenterTest.kt | 78 +- .../settings/domain/LaunchSyncTest.kt | 172 +- .../dhis2/usescases/sync/SyncPresenterTest.kt | 47 +- .../DashboardRepositoryImplTest.kt | 2 + .../teiDashboard/DashboardViewModelTest.kt | 79 +- .../teiDashboard/TeiAttributesProviderTest.kt | 8 +- .../TeiDashboardPageConfiguratorTest.kt | 42 +- .../teiDashboard/TeiDashboardPresenterTest.kt | 23 +- .../data/TeiDataPresenterTest.kt | 98 + .../indicators/BaseIndicatorRepositoryTest.kt | 19 + .../EventIndicatorRepositoryTest.kt | 28 +- .../indicators/IndicatorsPresenterTest.kt | 38 +- .../TrackerAnalyticsRepositoryTest.kt | 50 +- .../RelationshipPresenterTest.kt | 1 + .../scheduling/SchedulingViewModelTest.kt | 80 +- .../TeiProgramListRepositoryImplTest.kt | 7 + .../ui/mapper/InfoBarMapperTest.kt | 6 + .../ui/mapper/QuickActionsMapperTest.kt | 1 + .../ui/mapper/TEIDetailMapperTest.kt | 6 + .../TrackedEntityInstanceInfoProviderTests.kt | 12 +- .../dhis2/utils/filters/FilterManagerTest.kt | 2 + .../granularsync/GranularSyncPresenterTest.kt | 126 +- .../GranularSyncRepositoryTest.kt | 124 + .../dhis2/utils/session/PinPresenterTest.kt | 165 - build.gradle.kts | 4 + commons/build.gradle.kts | 29 +- .../commons/bindings/CommonExtensions.kt | 65 +- .../dhis2/commons/bindings/SdkExtensions.kt | 58 - .../commons/bindings/TEICardExtensions.kt | 119 +- .../dhis2/commons/data/CarouselItemModel.kt | 5 - .../commons/data/ProgramEventViewModel.kt | 4 +- .../org/dhis2/commons/date/DateExtensions.kt | 8 +- .../java/org/dhis2/commons/di/FilterModule.kt | 82 + .../dhis2/commons/di/ResourceManagerModule.kt | 6 +- .../dialogs/bottomsheet/BottomSheetDialog.kt | 2 +- .../bottomsheet/BottomSheetDialogContent.kt | 2 +- .../bottomsheet/DeleteBottomSheetDialog.kt | 2 +- .../dialogs/bottomsheet/DialogButtonStyle.kt | 2 +- .../dialogs/calendarpicker/CalendarPicker.kt | 13 - .../dhis2/commons/filters/FilterManager.java | 5 +- .../data/EventProgramFilterSearchHelper.kt | 1 + .../commons/filters/data/FilterPresenter.kt | 6 +- .../commons/filters/data/FilterRepository.kt | 1262 ++-- .../filters/data/TeiWorkingListScope.kt | 16 +- .../filters/data/TrackerFilterSearchHelper.kt | 5 +- .../periods/data/FilterPeriodsRepository.kt | 8 + .../periods/data/PeriodTypeLabelProvider.kt | 4 + .../filters/periods/di/FilterPeriodsModule.kt | 3 +- .../filters/periods/model/FilterPeriodType.kt | 4 + .../locationprovider/LocationProviderImpl.kt | 3 +- .../periods/data/PeriodLabelProvider.kt | 10 + .../dhis2/commons/popupmenu/AppMenuHelper.kt | 7 +- .../commons/reporting/CrashReportModule.kt | 5 +- .../org/dhis2/commons/resources/ColorUtils.kt | 110 +- .../commons/resources/DhisPeriodUtils.kt | 5 + .../dhis2/commons/resources/PaletteThemes.kt | 90 + ...rSearchResultsByIdentifyResponseUseCase.kt | 47 +- .../src/main/res/drawable/ic_delete.xml | 0 .../main/res/drawable/ic_error_outline.xml | 0 .../res/drawable/ic_event_status_complete.xml | 0 .../src/main/res/drawable/ic_file.xml | 0 .../main/res/drawable/ic_file_download.xml | 0 .../main/res/drawable/ic_home_negative.xml | 0 .../src/main/res/drawable/ic_home_outline.xml | 0 .../main/res/drawable/ic_home_positive.xml | 0 .../src/main/res/drawable/ic_input_info.xml | 0 .../src/main/res/drawable/ic_saved_check.xml | 0 .../main/res/drawable/ic_tree_node_close.xml | 0 .../res/drawable/ic_tree_node_default.xml | 0 .../main/res/drawable/ic_tree_node_open.xml | 0 .../main/res/drawable/ic_warning_alert.xml | 0 .../main/res/drawable/image_not_supported.xml | 0 .../main/res/layout/calendar_picker_view.xml | 1 - .../main/res/layout/item_header_filter.xml | 12 +- .../src/main/res/values-ar-rIQ/strings.xml | 5 - commons/src/main/res/values-ar/strings.xml | 18 +- commons/src/main/res/values-bn/strings.xml | 1 - commons/src/main/res/values-ckb/strings.xml | 2 - commons/src/main/res/values-cs/strings.xml | 25 +- commons/src/main/res/values-da/strings.xml | 3 - .../src/main/res/values-en-rUS/strings.xml | 4 +- .../src/main/res/values-es-rES/strings.xml | 12 - commons/src/main/res/values-es/strings.xml | 26 +- commons/src/main/res/values-fr/strings.xml | 18 +- .../src/main/res/values-hi-rIN/strings.xml | 7 +- commons/src/main/res/values-id/strings.xml | 11 - commons/src/main/res/values-km/strings.xml | 9 - commons/src/main/res/values-lo/strings.xml | 16 +- commons/src/main/res/values-my/strings.xml | 5 - commons/src/main/res/values-nb/strings.xml | 16 +- commons/src/main/res/values-ne/strings.xml | 2 - commons/src/main/res/values-nl/strings.xml | 12 - commons/src/main/res/values-or/strings.xml | 2 - commons/src/main/res/values-prs/strings.xml | 6 - commons/src/main/res/values-ps/strings.xml | 5 - .../src/main/res/values-pt-rBR/strings.xml | 7 +- commons/src/main/res/values-pt/strings.xml | 18 +- commons/src/main/res/values-ro/strings.xml | 1 - commons/src/main/res/values-ru/strings.xml | 26 +- commons/src/main/res/values-si/strings.xml | 3 - commons/src/main/res/values-sv/strings.xml | 11 +- commons/src/main/res/values-tet/strings.xml | 5 - commons/src/main/res/values-tg/strings.xml | 5 - commons/src/main/res/values-uk/strings.xml | 16 +- commons/src/main/res/values-ur/strings.xml | 6 - .../src/main/res/values-uz-rUZ/strings.xml | 14 +- commons/src/main/res/values-uz/strings.xml | 18 +- commons/src/main/res/values-vi/strings.xml | 19 +- .../src/main/res/values-zh-rCN/strings.xml | 26 +- commons/src/main/res/values-zh/strings.xml | 25 +- commons/src/main/res/values/attrs.xml | 2 +- commons/src/main/res/values/strings.xml | 29 +- commons/src/main/res/values/styles.xml | 8 + commons/src/main/res/values/themes.xml | 136 + .../repository/SimprintsD2RepositoryTest.kt | 2 + commonskmm/build.gradle.kts | 82 +- .../validators/FieldMaskValidatorTest.kt | 0 .../commons/auth/OpenIdControllerImpl.kt | 53 - .../CustomIntentRepositoryImpl.kt | 5 +- .../commons/di/CommonsModule.android.kt | 8 +- .../mobile/commons/error/DomainErrorMapper.kt | 1 + .../network/NetworkStatusProviderImpl.kt | 35 +- .../notifications/NotificationManagerImpl.kt | 215 + .../notifications/WorkerNotificationInfo.kt | 7 + .../reporting/CrashReportControllerImpl.kt | 38 +- .../resources/D2ErrorMessageProviderImpl.kt | 11 +- ...t => DrawableResourcesProvider.android.kt} | 0 .../values-ar-rEG/strings.xml | 7 +- .../values-ar-rIQ/strings.xml | 12 +- .../composeResources/values-ar/strings.xml | 27 +- .../composeResources/values-bn/strings.xml | 5 - .../composeResources/values-ckb/strings.xml | 10 +- .../composeResources/values-cs/strings.xml | 32 +- .../composeResources/values-da/strings.xml | 6 +- .../values-en-rUS/strings.xml | 33 +- .../values-es-rES/strings.xml | 27 +- .../composeResources/values-es/strings.xml | 32 +- .../composeResources/values-fr/strings.xml | 28 +- .../values-hi-rIN/strings.xml | 17 +- .../composeResources/values-id/strings.xml | 14 +- .../composeResources/values-km/strings.xml | 10 +- .../composeResources/values-lo/strings.xml | 22 +- .../composeResources/values-my/strings.xml | 8 +- .../composeResources/values-nb/strings.xml | 14 +- .../composeResources/values-ne/strings.xml | 8 +- .../composeResources/values-nl/strings.xml | 27 +- .../composeResources/values-or/strings.xml | 6 +- .../composeResources/values-prs/strings.xml | 9 +- .../composeResources/values-ps/strings.xml | 9 +- .../values-pt-rBR/strings.xml | 10 +- .../composeResources/values-pt/strings.xml | 29 +- .../composeResources/values-ro/strings.xml | 12 +- .../composeResources/values-ru/strings.xml | 29 +- .../composeResources/values-si/strings.xml | 8 - .../composeResources/values-sv/strings.xml | 10 +- .../composeResources/values-tet/strings.xml | 8 +- .../composeResources/values-tg/strings.xml | 8 +- .../composeResources/values-uk/strings.xml | 28 +- .../composeResources/values-ur/strings.xml | 10 +- .../values-uz-rUZ/strings.xml | 14 +- .../composeResources/values-uz/strings.xml | 17 +- .../composeResources/values-vi/strings.xml | 30 +- .../values-zh-rCN/strings.xml | 29 +- .../composeResources/values-zh/strings.xml | 32 +- .../composeResources/values/strings.xml | 44 +- .../mobile/commons/auth/OpenIdController.kt | 8 - .../biometrics/CryptographicActions.kt | 4 +- .../mobile/commons/color/ColorMatcher.kt | 88 + .../mobile/commons/color/PaletteColor.kt | 21 + .../commons/coroutine/CoroutineTracker.kt | 15 +- .../commons/dates/DateTimeInputsUtils.kt | 94 + .../commons/extensions/DateExtensions.kt | 14 + .../commons/extensions/ViewModelExtensions.kt | 20 +- .../notifications/NotificationManager.kt | 49 + .../notifications/NotificationModel.kt | 3 + .../commons/providers/PreferenceConstants.kt | 12 + .../commons/providers/PreferenceProvider.kt | 5 + .../commons/reporting/AnalyticActions.kt | 1 - ...ources.kt => DrawableResourcesProvider.kt} | 0 .../resources/StringResourceProvider.kt | 11 + .../mobile/commons/color/ColorMatcherTest.kt | 70 + ...t => DrawableResourcesProvider.desktop.kt} | 0 compose-table/build.gradle.kts | 1 - .../org/dhis2/composetable/ui/TextInput.kt | 4 +- dhis2-mobile-program-rules/build.gradle.kts | 1 - .../dhis2/mobileProgramRules/RuleConstants.kt | 5 + .../RuleEngineExtensions.kt | 50 +- .../mobileProgramRules/RuleEngineHelper.kt | 2 +- .../mobileProgramRules/RulesRepository.kt | 77 +- .../RuleEngineExtensionsTest.kt | 6 +- .../RuleEngineHelperTest.kt | 38 +- .../mobileProgramRules/RulesRepositoryTest.kt | 41 +- dhis2_android_maps/build.gradle.kts | 6 +- .../maps/attribution/AttributionManager.kt | 4 +- .../dhis2/maps/layer/basemaps/BaseMapStyle.kt | 42 +- .../org/dhis2/maps/managers/MapManager.kt | 10 +- .../org/dhis2/maps/managers/TeiMapManager.kt | 42 + .../model/RelationshipUiComponentModel.kt | 8 +- .../maps/usecases/MapStyleConfiguration.kt | 34 +- .../org/dhis2/maps/utils/CoordinateUtils.kt | 6 +- .../src/main/res/values-ar/strings.xml | 1 - .../src/main/res/values-cs/strings.xml | 1 - .../src/main/res/values-es-rES/strings.xml | 1 - .../src/main/res/values-es/strings.xml | 1 - .../src/main/res/values-fr/strings.xml | 1 - .../src/main/res/values-id/strings.xml | 1 - .../src/main/res/values-nb/strings.xml | 1 - .../src/main/res/values-nl/strings.xml | 1 - .../src/main/res/values-pt/strings.xml | 1 - .../src/main/res/values-uk/strings.xml | 1 - .../src/main/res/values-uz-rUZ/strings.xml | 1 - .../src/main/res/values-uz/strings.xml | 1 - .../src/main/res/values-vi/strings.xml | 1 - .../src/main/res/values-zh-rCN/strings.xml | 1 - .../src/main/res/values-zh/strings.xml | 1 - .../src/main/res/values/strings.xml | 1 - .../java/org/dhis2/maps/usecases/MapMocks.kt | 60 + .../maps/usecases/MapSelectorViewModelTest.kt | 21 +- .../usecases/MapStyleConfigurationTest.kt | 139 +- .../dhis2/maps/utils/CoordinateUtilsTest.kt | 71 + dhis_android_analytics/build.gradle.kts | 7 +- .../java/dhis2/org/analytics/charts/Charts.kt | 2 +- .../org/analytics/charts/ChartsRepository.kt | 2 +- .../analytics/charts/ChartsRepositoryImpl.kt | 96 +- .../analytics/charts/DhisAnalyticCharts.kt | 2 +- .../charts/bindings/AnalyticsBindings.kt | 8 +- .../charts/bindings/DateToPosition.kt | 8 +- .../dhis2/org/analytics/charts/data/Graph.kt | 28 +- .../org/analytics/charts/di/ChartsInjector.kt | 8 + .../org/analytics/charts/di/ChartsModule.kt | 114 + .../domain/GetEnrollmentAnalyticsUseCase.kt | 20 + .../mappers/AnalyticsTeiSettingsToGraph.kt | 6 +- .../charts/mappers/DataElementToGraph.kt | 2 +- .../mappers/DimensionalResponseToPieData.kt | 4 +- .../charts/mappers/GraphToBarData.kt | 8 +- .../analytics/charts/mappers/GraphToTable.kt | 2 +- .../charts/mappers/ProgramIndicatorToGraph.kt | 2 +- .../providers/ChartCoordinatesProvider.kt | 8 +- .../providers/ChartCoordinatesProviderImpl.kt | 36 +- .../providers/PeriodStepProviderImpl.kt | 9 + .../RuleEngineNutritionDataProviderImpl.kt | 2 +- .../charts/ui/GroupAnalyticsFragment.kt | 82 +- .../charts/ui/GroupAnalyticsViewModel.kt | 125 +- .../ui/GroupAnalyticsViewModelFactory.kt | 6 + .../charts/ui/IndicatorViewHolder.kt | 3 +- .../charts/ui/di/AnalyticsFragmentInjector.kt | 14 +- .../src/main/res/values-ar-rIQ/strings.xml | 1 - .../src/main/res/values-ar/strings.xml | 2 - .../src/main/res/values-ckb/strings.xml | 1 - .../src/main/res/values-cs/strings.xml | 3 - .../src/main/res/values-da/strings.xml | 1 - .../src/main/res/values-en-rUS/strings.xml | 2 +- .../src/main/res/values-es-rES/strings.xml | 3 - .../src/main/res/values-es/strings.xml | 3 - .../src/main/res/values-fr/strings.xml | 1 - .../src/main/res/values-hi-rIN/strings.xml | 1 - .../src/main/res/values-id/strings.xml | 1 - .../src/main/res/values-km/strings.xml | 1 - .../src/main/res/values-lo/strings.xml | 3 - .../src/main/res/values-my/strings.xml | 1 - .../src/main/res/values-nb/strings.xml | 1 - .../src/main/res/values-nl/strings.xml | 3 - .../src/main/res/values-prs/strings.xml | 1 - .../src/main/res/values-ps/strings.xml | 1 - .../src/main/res/values-pt-rBR/strings.xml | 1 - .../src/main/res/values-pt/strings.xml | 3 - .../src/main/res/values-ru/strings.xml | 2 - .../src/main/res/values-sv/strings.xml | 1 - .../src/main/res/values-tet/strings.xml | 1 - .../src/main/res/values-tg/strings.xml | 1 - .../src/main/res/values-uk/strings.xml | 3 - .../src/main/res/values-ur/strings.xml | 1 - .../src/main/res/values-uz-rUZ/strings.xml | 1 - .../src/main/res/values-uz/strings.xml | 1 - .../src/main/res/values-vi/strings.xml | 3 - .../src/main/res/values-zh-rCN/strings.xml | 1 - .../src/main/res/values-zh/strings.xml | 3 - .../src/main/res/values/strings.xml | 3 - .../analytics/charts/ChartsRepositoryTest.kt | 23 +- .../charts/bindings/DateToPositionTest.kt | 8 +- .../org/analytics/charts/data/GraphTest.kt | 8 +- .../GetEnrollmentAnalyticsUseCaseTest.kt | 74 + .../mappers/GraphCoordinatesToEntryTest.kt | 8 +- .../ChartCoordinatesProviderImplTest.kt | 9 +- .../analytics/charts/ui/AnalyticsModelTest.kt | 4 +- docs/README.md | 3 - docs/compilation-distribution.md | 38 + docs/configure-openid-oauth.md | 138 + docs/contributions.md | 23 + docs/creating-custom-usecases.md | 100 + docs/modifying-apk.md | 84 + docs/overview.md | 23 + docs/resources/applicationId.png | Bin 0 -> 23284 bytes docs/resources/build_apk_step_1.png | Bin 0 -> 25567 bytes docs/resources/build_apk_step_2.png | Bin 0 -> 21945 bytes docs/resources/build_apk_step_3.png | Bin 0 -> 28060 bytes docs/resources/launcher_directory.png | Bin 0 -> 29852 bytes docs/resources/open_id_login.png | Bin 0 -> 88956 bytes docs/resources/version_name_code.png | Bin 0 -> 20546 bytes .../capture-app/local-analytics-features.md | 82 - .../images/capture-app-matomo-instance.png | Bin 69085 -> 0 bytes .../images/capture-app-matomo-settings.png | Bin 41361 -> 0 bytes .../images/capture-app-sync-status.png | Bin 17680 -> 0 bytes .../en/content/capture-app/settings.md | 45 - form/build.gradle.kts | 8 +- .../kotlin/org/dhis2/form/ui/FormTest.kt | 2 - .../ui/provider/inputfield/AgeProviderTest.kt | 26 +- .../CategorySelectorProviderTest.kt | 4 +- .../provider/inputfield/DateProviderTest.kt | 6 +- .../dhis2/form/data/EnrollmentRepository.kt | 2 +- .../org/dhis2/form/data/EventRepository.kt | 2 + .../org/dhis2/form/data/FormRepository.kt | 3 - .../org/dhis2/form/data/FormRepositoryImpl.kt | 16 +- .../dhis2/form/data/RulesUtilsProviderImpl.kt | 94 +- .../data/metadata/EnrollmentConfiguration.kt | 1 + .../main/java/org/dhis2/form/di/Injector.kt | 6 +- .../java/org/dhis2/form/model/FormSection.kt | 2 +- ...printsRememberCustomIntentFormPresenter.kt | 7 +- .../simprints/ramp/ui/FormHistoryChartView.kt | 2 +- form/src/main/java/org/dhis2/form/ui/Form.kt | 15 +- .../main/java/org/dhis2/form/ui/FormView.kt | 43 +- .../java/org/dhis2/form/ui/FormViewModel.kt | 93 +- .../org/dhis2/form/ui/FormViewModelFactory.kt | 3 + .../ui/provider/inputfield/AgeProvider.kt | 15 +- .../provider/inputfield/CheckBoxProvider.kt | 7 +- .../inputfield/CoordinatesProvider.kt | 9 +- .../inputfield/CustomIntentProvider.kt | 15 +- .../ui/provider/inputfield/DateProvider.kt | 2 +- .../ui/provider/inputfield/FieldProvider.kt | 47 +- .../provider/inputfield/ImageInputProvider.kt | 9 +- .../provider/inputfield/InputFileProvider.kt | 5 +- .../InputsForTextValueTypeProvider.kt | 8 +- .../inputfield/RadioButtonProvider.kt | 7 +- .../inputfield/UnitIntervalInputProvider.kt | 2 +- form/src/main/res/values-ar-rIQ/strings.xml | 5 - form/src/main/res/values-ar/strings.xml | 16 +- form/src/main/res/values-bn/strings.xml | 1 - form/src/main/res/values-ckb/strings.xml | 5 - form/src/main/res/values-cs/strings.xml | 19 +- form/src/main/res/values-da/strings.xml | 1 - form/src/main/res/values-en-rUS/strings.xml | 19 - form/src/main/res/values-es-rES/strings.xml | 12 +- form/src/main/res/values-es/strings.xml | 19 +- form/src/main/res/values-fr/strings.xml | 16 +- form/src/main/res/values-hi-rIN/strings.xml | 8 - form/src/main/res/values-id/strings.xml | 8 - form/src/main/res/values-km/strings.xml | 4 - form/src/main/res/values-lo/strings.xml | 12 - form/src/main/res/values-my/strings.xml | 3 - form/src/main/res/values-nb/strings.xml | 8 - form/src/main/res/values-ne/strings.xml | 1 - form/src/main/res/values-nl/strings.xml | 16 +- form/src/main/res/values-prs/strings.xml | 4 - form/src/main/res/values-ps/strings.xml | 4 - form/src/main/res/values-pt-rBR/strings.xml | 5 - form/src/main/res/values-pt/strings.xml | 18 +- form/src/main/res/values-ro/strings.xml | 5 - form/src/main/res/values-ru/strings.xml | 16 +- form/src/main/res/values-si/strings.xml | 4 - form/src/main/res/values-sv/strings.xml | 4 - form/src/main/res/values-tet/strings.xml | 3 - form/src/main/res/values-tg/strings.xml | 3 - form/src/main/res/values-uk/strings.xml | 15 +- form/src/main/res/values-ur/strings.xml | 5 +- form/src/main/res/values-uz-rUZ/strings.xml | 8 - form/src/main/res/values-uz/strings.xml | 9 - form/src/main/res/values-vi/strings.xml | 19 +- form/src/main/res/values-zh-rCN/strings.xml | 17 - form/src/main/res/values-zh/strings.xml | 17 - form/src/main/res/values/strings.xml | 20 - .../form/data/EnrollmentRepositoryTest.kt | 2 +- .../dhis2/form/data/EventRepositoryTest.kt | 11 + .../org/dhis2/form/data/FormValueStoreTest.kt | 3 + .../form/integration/ProgramRulesTest.kt | 301 +- .../dhis2/form/ui/DataEntryIntegrationTest.kt | 240 +- .../org/dhis2/form/ui/FormViewModelTest.kt | 10 +- gradle.properties | 20 +- gradle/libs.versions.toml | 72 +- gradle/verification-metadata.xml | 5750 +++++++++++++++++ gradle/wrapper/gradle-wrapper.properties | 2 +- login/build.gradle.kts | 115 +- .../kotlin/screen/TwoFAToEnableScreenTest.kt | 74 - .../data/repository/AccountRepositoryImpl.kt | 7 +- .../authentication/OpenIdControllerImpl.kt | 99 + .../login/main/data/LoginRepositoryImpl.kt | 233 +- .../login/main/di/LoginModule.android.kt | 59 +- .../ui/screen/WebAuthenticator.android.kt | 15 +- .../login/pin/PinBottomSheetLauncher.kt | 45 + .../values-ar-rIQ/strings.xml | 2 +- .../composeResources/values-ar/strings.xml | 2 +- .../composeResources/values-bn/strings.xml | 2 +- .../composeResources/values-ckb/strings.xml | 2 +- .../composeResources/values-cs/strings.xml | 5 +- .../composeResources/values-da/strings.xml | 2 +- .../values-es-rES/strings.xml | 2 +- .../composeResources/values-fr/strings.xml | 4 +- .../values-hi-rIN/strings.xml | 3 +- .../composeResources/values-id/strings.xml | 2 +- .../composeResources/values-km/strings.xml | 2 +- .../composeResources/values-lo/strings.xml | 2 +- .../composeResources/values-my/strings.xml | 2 +- .../composeResources/values-nb/strings.xml | 2 +- .../composeResources/values-nl/strings.xml | 5 +- .../composeResources/values-or/strings.xml | 2 +- .../composeResources/values-prs/strings.xml | 2 +- .../composeResources/values-ps/strings.xml | 2 +- .../values-pt-rBR/strings.xml | 2 +- .../composeResources/values-pt/strings.xml | 2 +- .../composeResources/values-ro/strings.xml | 2 +- .../composeResources/values-ru/strings.xml | 2 +- .../composeResources/values-si/strings.xml | 2 +- .../composeResources/values-sv/strings.xml | 2 +- .../composeResources/values-tet/strings.xml | 2 +- .../composeResources/values-tg/strings.xml | 2 +- .../composeResources/values-ur/strings.xml | 2 +- .../values-uz-rUZ/strings.xml | 2 +- .../composeResources/values-uz/strings.xml | 3 +- .../composeResources/values-vi/strings.xml | 5 +- .../values-zh-rCN/strings.xml | 3 +- .../composeResources/values-zh/strings.xml | 5 +- .../composeResources/values/strings.xml | 10 +- .../login/accounts/ui/screen/AccountItem.kt | 6 +- .../ui/viewmodel/AccountsViewModel.kt | 3 +- .../login/authentication/OpenIdController.kt | 12 + .../ui/screen/TwoFADisableScreen.kt | 45 +- .../ui/screen/TwoFASettingsScreen.kt | 2 - .../ui/screen/TwoFAToEnableScreen.kt | 42 +- .../mobile/login/main/data/LoginRepository.kt | 24 +- .../dhis2/mobile/login/main/di/LoginModule.kt | 33 +- .../main/domain/model/DeviceEnrollmentInfo.kt | 6 + .../main/domain/model/LoginScreenState.kt | 5 +- .../domain/model/OpenIdLoginConfiguration.kt | 12 + .../domain/model/ServerValidationResult.kt | 5 +- .../domain/usecase/GetDeviceEnrollmentUrl.kt | 16 + .../main/domain/usecase/GetInitialScreen.kt | 36 +- .../login/main/domain/usecase/LoginUser.kt | 5 +- .../main/domain/usecase/LoginUserWithOAuth.kt | 32 + .../login/main/domain/usecase/OpenIdLogin.kt | 24 +- .../domain/usecase/ProcessDeviceEnrollment.kt | 22 + .../usecase/UpdateBiometricPermission.kt | 27 +- .../login/main/ui/screen/CredentialsScreen.kt | 79 +- .../login/main/ui/screen/LoginScreen.kt | 40 +- .../main/ui/screen/ServerValidationContent.kt | 2 +- .../login/main/ui/state/CredentialsUiState.kt | 20 +- .../main/ui/viewmodel/CredentialsViewModel.kt | 168 +- .../login/main/ui/viewmodel/LoginViewModel.kt | 57 +- .../dhis2/mobile/login/pin/di/PinModule.kt | 11 +- .../mobile/login/pin/domain/model/PinMode.kt | 16 + .../mobile/login/pin/domain/model/PinState.kt | 41 - .../login/pin/ui/components/PinBottomSheet.kt | 363 -- .../login/pin/ui/components/PinDialog.kt | 511 ++ .../pin/ui/provider/PinResourceProvider.kt | 94 +- .../mobile/login/pin/ui/state/PinUiState.kt | 31 + .../login/pin/ui/viewmodel/PinViewModel.kt | 124 +- .../login/main/LoginScreenIntegrationTest.kt | 40 +- .../main/domain/usecase/LoginUserTest.kt | 26 + .../main/domain/usecase/OpenIdLoginTest.kt | 324 + .../ui/viewmodel/CredentialsViewModelTest.kt | 346 +- .../main/ui/viewmodel/LoginViewModelTest.kt | 52 +- .../domain/usecase/ForgotPinUseCaseTest.kt | 4 +- .../usecase/GetInitialScreenUseCaseTest.kt | 23 +- .../pin/domain/usecase/SavePinUseCaseTest.kt | 4 +- .../domain/usecase/ValidatePinUseCaseTest.kt | 4 +- .../pin/ui/viewmodel/PinViewModelTest.kt | 258 +- .../login/main/di/LoginModule.desktop.kt | 4 +- run_tests.sh | 2 +- scripts/check_pr_size.sh | 11 +- settings.gradle.kts | 2 +- stock-usecase/build.gradle.kts | 4 +- stock-usecase/src/main/AndroidManifest.xml | 21 - .../android/rtsm/services/StockManagerImpl.kt | 74 +- .../rules/RuleValidationHelperImpl.kt | 16 +- .../android/rtsm/ui/home/HomeActivity.kt | 99 +- .../rtsm/ui/home/model/ButtonUiState.kt | 4 - .../rtsm/ui/home/screens/AnalyticsScreen.kt | 6 +- .../rtsm/ui/home/screens/HomeScreen.kt | 45 +- .../screens/components/BackdropComponent.kt | 29 +- .../screens/components/DropdownComponents.kt | 42 +- .../screens/components/FilterComponents.kt | 5 - .../ui/home/screens/components/MainContent.kt | 61 +- .../ui/managestock/ManageStockViewModel.kt | 13 - .../components/ManageStockTable.kt | 292 +- .../dhis2/android/rtsm/utils/LocaleManager.kt | 8 +- .../android/rtsm/utils/RuleEngineHelper.kt | 3 +- .../src/main/res/values-ar-rEG/strings.xml | 4 + .../src/main/res/values-ar-rIQ/strings.xml | 8 +- .../src/main/res/values-ar/strings.xml | 63 +- .../src/main/res/values-ckb/strings.xml | 8 +- .../src/main/res/values-cs/strings.xml | 121 +- .../src/main/res/values-da/strings.xml | 7 +- .../src/main/res/values-en-rUS/strings.xml | 3 +- .../src/main/res/values-es-rES/strings.xml | 15 +- .../src/main/res/values-es/strings.xml | 134 +- .../src/main/res/values-fr/strings.xml | 40 +- .../src/main/res/values-hi-rIN/strings.xml | 15 +- .../src/main/res/values-id/strings.xml | 18 +- .../src/main/res/values-km/strings.xml | 11 +- .../src/main/res/values-lo/strings.xml | 51 +- .../src/main/res/values-my/strings.xml | 7 +- .../src/main/res/values-nb/strings.xml | 22 +- .../src/main/res/values-ne/strings.xml | 4 +- .../src/main/res/values-nl/strings.xml | 97 +- .../src/main/res/values-or/strings.xml | 1 + .../src/main/res/values-prs/strings.xml | 20 +- .../src/main/res/values-ps/strings.xml | 16 +- .../src/main/res/values-pt-rBR/strings.xml | 13 +- .../src/main/res/values-pt/strings.xml | 133 +- .../src/main/res/values-ro/strings.xml | 6 +- .../src/main/res/values-ru/strings.xml | 74 +- .../src/main/res/values-si/strings.xml | 8 +- .../src/main/res/values-sv/strings.xml | 16 +- .../src/main/res/values-tet/strings.xml | 9 +- .../src/main/res/values-tg/strings.xml | 12 +- .../src/main/res/values-uk/strings.xml | 22 +- .../src/main/res/values-ur/strings.xml | 20 +- .../src/main/res/values-uz-rUZ/strings.xml | 104 +- .../src/main/res/values-uz/strings.xml | 76 +- .../src/main/res/values-vi/strings.xml | 132 +- .../src/main/res/values-zh-rCN/strings.xml | 23 +- .../src/main/res/values-zh/strings.xml | 105 +- stock-usecase/src/main/res/values/strings.xml | 161 - .../android/rtsm/data/DataElementFactory.kt | 2 + .../android/rtsm/services/ProgramRuleTests.kt | 59 +- .../android/rtsm/services/StockManagerTest.kt | 47 +- sync/build.gradle.kts | 83 +- .../mobile/sync/ExampleInstrumentedTest.kt | 0 .../org/dhis2/mobile/sync/ExampleUnitTest.kt | 0 .../sync/data/AndroidSyncRepositoryTest.kt | 207 + sync/src/androidMain/AndroidManifest.xml | 15 +- .../data/AndroidSyncBackgroundJobAction.kt | 213 + .../mobile/sync/data/AndroidSyncRepository.kt | 563 ++ .../sync/data/SdkSyncPeriodToSyncPeriod.kt | 25 + .../dhis2/mobile/sync/data/SyncDataWorker.kt | 87 + .../mobile/sync/data/SyncMetadataWorker.kt | 91 + .../mobile/sync/data/SyncSettingsWorker.kt | 34 + .../mobile/sync/di/SyncModule.android.kt | 50 + sync/src/androidMain/res/drawable/ic_sync.xml | 10 + .../composeResources/values-ar/strings.xml | 3 +- .../composeResources/values-ckb/strings.xml | 3 +- .../composeResources/values-cnr/strings.xml | 5 + .../composeResources/values-cs/strings.xml | 3 +- .../composeResources/values-de/strings.xml | 5 + .../composeResources/values-el/strings.xml | 5 + .../values-es-rES/strings.xml | 3 +- .../composeResources/values-es/strings.xml | 3 +- .../composeResources/values-fr/strings.xml | 3 +- .../composeResources/values-ga/strings.xml | 5 + .../composeResources/values-hr/strings.xml | 5 + .../composeResources/values-id/strings.xml | 3 +- .../composeResources/values-km/strings.xml | 3 +- .../composeResources/values-lb/strings.xml | 5 + .../composeResources/values-lo/strings.xml | 3 +- .../composeResources/values-mt/strings.xml | 5 + .../composeResources/values-nb/strings.xml | 3 +- .../composeResources/values-nl/strings.xml | 3 +- .../composeResources/values-pt/strings.xml | 3 +- .../composeResources/values-ru/strings.xml | 3 +- .../composeResources/values-sv/strings.xml | 3 +- .../composeResources/values-uk/strings.xml | 3 +- .../values-uz-rUZ/strings.xml | 3 +- .../composeResources/values-uz/strings.xml | 3 +- .../composeResources/values-vi/strings.xml | 3 +- .../values-zh-rCN/strings.xml | 3 +- .../composeResources/values-zh/strings.xml | 5 +- .../composeResources/values/strings.xml | 4 + .../sync/data/SyncBackgroundJobAction.kt | 30 + .../dhis2/mobile/sync/data/SyncRepository.kt | 55 + .../org/dhis2/mobile/sync/di/SyncModule.kt | 5 + .../org/dhis2/mobile/sync/domain/SyncData.kt | 90 + .../dhis2/mobile/sync/domain/SyncMetadata.kt | 107 + .../dhis2/mobile/sync/domain/SyncSettings.kt | 45 + .../sync/domain/SyncStatusController.kt | 163 + .../mobile/sync/model/DataSyncProgress.kt | 6 + .../sync/model/DataSyncProgressStatus.kt | 15 + .../dhis2/mobile/sync/model/DataSyncTask.kt | 19 + .../mobile/sync/model/SMSConfigResult.kt | 9 + .../dhis2/mobile/sync/model/SyncJobStatus.kt | 21 + .../org/dhis2/mobile/sync/model/SyncPeriod.kt | 48 + .../org/dhis2/mobile/sync/model/SyncResult.kt | 11 + .../dhis2/mobile/sync/model/SyncStatusData.kt | 33 + .../mobile/sync/domain/SyncMetadataTest.kt | 126 + .../mobile/sync/domain/SyncSettingsTest.kt | 57 + .../mobile/sync/di/SyncModule.desktop.kt | 9 + tracker/build.gradle.kts | 86 +- .../AndroidRelationshipFakeModels.kt | 0 .../TrackerRelationshipsRepositoryTest.kt | 0 .../SearchTrackedEntityRepositoryImplTest.kt | 470 ++ .../search/data/OptionSetRepositoryImpl.kt | 73 + .../data/SearchParametersRepositoryImpl.kt | 298 + .../data/SearchTrackedEntityRepositoryImpl.kt | 599 ++ .../data/TrackedEntitySearchItemMapper.kt | 188 + .../search/di/TrackerSearchModule.android.kt | 42 + .../composeResources/values-ar/strings.xml | 5 +- .../composeResources/values-ckb/strings.xml | 2 + .../composeResources/values-cs/strings.xml | 6 +- .../composeResources/values-da/strings.xml | 3 +- .../values-es-rES/strings.xml | 2 + .../composeResources/values-es/strings.xml | 6 +- .../composeResources/values-fr/strings.xml | 6 +- .../values-hi-rIN/strings.xml | 8 +- .../composeResources/values-id/strings.xml | 2 + .../composeResources/values-km/strings.xml | 5 +- .../composeResources/values-lo/strings.xml | 5 +- .../composeResources/values-my/strings.xml | 5 +- .../composeResources/values-nb/strings.xml | 5 +- .../composeResources/values-or/strings.xml | 5 + .../composeResources/values-prs/strings.xml | 3 +- .../composeResources/values-ps/strings.xml | 3 +- .../values-pt-rBR/strings.xml | 5 +- .../composeResources/values-pt/strings.xml | 5 +- .../composeResources/values-ru/strings.xml | 5 +- .../composeResources/values-sv/strings.xml | 5 +- .../composeResources/values-tet/strings.xml | 3 +- .../composeResources/values-tg/strings.xml | 3 +- .../composeResources/values-uk/strings.xml | 6 +- .../composeResources/values-ur/strings.xml | 3 +- .../values-uz-rUZ/strings.xml | 3 +- .../composeResources/values-uz/strings.xml | 5 +- .../composeResources/values-vi/strings.xml | 5 +- .../values-zh-rCN/strings.xml | 5 +- .../composeResources/values-zh/strings.xml | 9 +- .../composeResources/values/strings.xml | 10 +- .../tracker/input/model/TrackerInputType.kt | 39 + .../input/ui/action/TrackerInputAction.kt | 25 + .../input/ui/action/TrackerInputUiEvent.kt | 33 + .../ui/mapper/TrackerInputUiStateMapper.kt | 38 + .../ui/provider/TrackerAgeInputProvider.kt | 138 + .../provider/TrackerCheckboxInputProvider.kt | 56 + .../ui/provider/TrackerDateTimeProvider.kt | 108 + .../input/ui/provider/TrackerInputProvider.kt | 793 +++ .../TrackerRadioButtonInputProvider.kt | 58 + .../input/ui/state/TrackerInputUiState.kt | 198 + .../ui/state/TrackerOptionSetConfiguration.kt | 16 + .../relationships/ui/RelationshipsScreen.kt | 3 - .../search/data/OptionSetRepository.kt | 25 + .../search/data/SearchParametersRepository.kt | 9 + .../data/SearchTrackedEntityRepository.kt | 42 + .../tracker/search/di/TrackerSearchModule.kt | 42 + .../search/domain/FetchOptionSetOptions.kt | 35 + .../search/domain/FetchSearchParameters.kt | 59 + .../search/domain/SearchTrackedEntities.kt | 109 + .../search/model/FetchSearchParametersData.kt | 6 + .../dhis2/tracker/search/model/QueryData.kt | 7 + .../tracker/search/model/SearchOperator.kt | 24 + .../search/model/SearchParameterModel.kt | 14 + .../model/SearchTrackedEntitiesInput.kt | 10 + .../model/SearchTrackedEntityAttribute.kt | 6 + .../model/TrackedEntitySearchItemResult.kt | 113 + .../search/ui/action/SearchScreenUiEvent.kt | 9 + .../provider/ParameterSelectorItemProvider.kt | 93 + .../ui/screen/SearchParametersScreen.kt | 308 + .../ui/state}/SearchParametersUiState.kt | 6 +- .../ui/viewmodel/SearchParametersViewModel.kt | 72 + .../search/SearchParametersIntegrationTest.kt | 290 + .../domain/FetchSearchParametersTest.kt | 340 + .../domain/SearchTrackedEntitiesTest.kt | 556 ++ .../SearchParametersViewModelTest.kt | 165 + .../search/di/TrackerSearchModule.desktop.kt | 13 + ui-components/.gitignore | 1 - ui-components/build.gradle.kts | 60 - ui-components/consumer-rules.pro | 0 ui-components/proguard-rules.pro | 21 - .../src/main/res/drawable/ic_add_image.xml | 9 - .../src/main/res/font/rubik_bold.ttf | Bin 143356 -> 0 bytes .../src/main/res/font/rubik_light.ttf | Bin 136816 -> 0 bytes .../src/main/res/font/rubik_medium.ttf | Bin 135760 -> 0 bytes .../src/main/res/font/rubik_regular.ttf | Bin 140732 -> 0 bytes ui-components/src/main/res/raw/warning.json | 1 - .../src/main/res/values-ar-rEG/strings.xml | 5 - .../src/main/res/values-ar-rIQ/strings.xml | 10 - .../src/main/res/values-ar/strings.xml | 32 - .../src/main/res/values-ckb/strings.xml | 11 - .../src/main/res/values-cs/strings.xml | 29 - .../src/main/res/values-da/strings.xml | 8 - .../src/main/res/values-en-rUS/strings.xml | 12 - .../src/main/res/values-es-rES/strings.xml | 15 - .../src/main/res/values-es/strings.xml | 27 - .../src/main/res/values-fr/strings.xml | 27 - .../src/main/res/values-hi-rIN/strings.xml | 16 - .../src/main/res/values-id/strings.xml | 12 - .../src/main/res/values-km/strings.xml | 13 - .../src/main/res/values-lo/strings.xml | 19 - .../src/main/res/values-my/strings.xml | 10 - .../src/main/res/values-nb/strings.xml | 14 - .../src/main/res/values-ne/strings.xml | 6 - .../src/main/res/values-nl/strings.xml | 23 - .../src/main/res/values-or/strings.xml | 4 - .../src/main/res/values-prs/strings.xml | 11 - .../src/main/res/values-ps/strings.xml | 11 - .../src/main/res/values-pt-rBR/strings.xml | 12 - .../src/main/res/values-pt/strings.xml | 27 - .../src/main/res/values-ro/strings.xml | 9 - .../src/main/res/values-ru/strings.xml | 28 - .../src/main/res/values-si/strings.xml | 8 - .../src/main/res/values-sv/strings.xml | 13 - .../src/main/res/values-tet/strings.xml | 9 - .../src/main/res/values-tg/strings.xml | 11 - .../src/main/res/values-uk/strings.xml | 17 - .../src/main/res/values-ur/strings.xml | 11 - .../src/main/res/values-uz-rUZ/strings.xml | 14 - .../src/main/res/values-uz/strings.xml | 23 - .../src/main/res/values-vi/strings.xml | 23 - .../src/main/res/values-zh-rCN/strings.xml | 23 - .../src/main/res/values-zh/strings.xml | 23 - ui-components/src/main/res/values/colors.xml | 2 - ui-components/src/main/res/values/strings.xml | 26 - ui-components/src/main/res/values/styles.xml | 10 - whatsnew/whatsnew-en-US | 8 +- 1087 files changed, 32006 insertions(+), 26837 deletions(-) create mode 100644 .claude/skills/android-testing/SKILL.md create mode 100644 .github/workflows/fix-kmp-translations.yml create mode 100644 .github/workflows/verify-dependency-metadata.yml create mode 100644 CLAUDE.md rename aggregates/src/{androidUnitTest => androidHostTest}/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepositoryImplTest.kt (100%) delete mode 100644 app/fabric.properties create mode 100644 app/src/androidTest/assets/mocks/settingswebapp/generalsettings.json delete mode 100644 app/src/androidTest/java/org/dhis2/common/db/TestingDatabase.kt delete mode 100644 app/src/androidTest/java/org/dhis2/usescases/pin/PinRobot.kt delete mode 100644 app/src/androidTest/java/org/dhis2/usescases/pin/PinTest.kt delete mode 100644 app/src/androidTest/java/org/dhis2/usescases/sync/MockedWorkManagerController.kt delete mode 100644 app/src/androidTest/java/org/dhis2/usescases/sync/MockedWorkManagerModule.kt create mode 100644 app/src/dhis2/java/org/dhis2/usescases/main/domain/DownloadNewVersion.kt create mode 100644 app/src/dhis2PlayServices/java/org/dhis2/usescases/main/domain/DownloadNewVersion.kt create mode 100644 app/src/dhis2Training/java/org/dhis2/usescases/main/domain/DownloadNewVersion.kt delete mode 100644 app/src/main/java/org/dhis2/data/server/SystemStyleMapper.kt delete mode 100644 app/src/main/java/org/dhis2/data/service/SyncDataWorker.java delete mode 100644 app/src/main/java/org/dhis2/data/service/SyncDataWorkerComponent.java delete mode 100644 app/src/main/java/org/dhis2/data/service/SyncDataWorkerModule.kt delete mode 100644 app/src/main/java/org/dhis2/data/service/SyncInitWorker.java delete mode 100644 app/src/main/java/org/dhis2/data/service/SyncInitWorkerComponent.java delete mode 100644 app/src/main/java/org/dhis2/data/service/SyncInitWorkerModule.kt delete mode 100644 app/src/main/java/org/dhis2/data/service/SyncMetadataWorker.java delete mode 100644 app/src/main/java/org/dhis2/data/service/SyncMetadataWorkerComponent.java delete mode 100644 app/src/main/java/org/dhis2/data/service/SyncMetadataWorkerModule.kt delete mode 100644 app/src/main/java/org/dhis2/data/service/SyncStatusController.kt delete mode 100644 app/src/main/java/org/dhis2/usescases/login/SyncIsPerformedInteractor.kt delete mode 100644 app/src/main/java/org/dhis2/usescases/main/HomePageConfigurator.kt delete mode 100644 app/src/main/java/org/dhis2/usescases/main/HomeRepository.kt delete mode 100644 app/src/main/java/org/dhis2/usescases/main/HomeRepositoryImpl.kt delete mode 100644 app/src/main/java/org/dhis2/usescases/main/MainComponent.kt delete mode 100644 app/src/main/java/org/dhis2/usescases/main/MainPresenter.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/MainScreenType.kt delete mode 100644 app/src/main/java/org/dhis2/usescases/main/MainView.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/domain/CheckSingleNavigation.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/domain/ConfigureHomeNavigationBar.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/domain/DeleteAccount.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/domain/GetHomeFilters.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/domain/GetLockAction.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/domain/GetUserName.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/domain/LaunchInitialSync.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/domain/ScheduleNewVersionAlert.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/domain/UpdateInitialSyncStatus.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/domain/model/BottomNavigationItem.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/domain/model/DownloadMethod.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/domain/model/LockAction.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/ui/model/HomeAction.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/ui/model/HomeEffect.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/ui/model/HomeScreenState.kt create mode 100644 app/src/main/java/org/dhis2/usescases/main/ui/screens/MainScreen.kt create mode 100644 app/src/main/java/org/dhis2/usescases/searchTrackEntity/di/SearchTEKoinModule.kt delete mode 100644 app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreen.kt create mode 100644 app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreenProvider.kt delete mode 100644 app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/provider/ParameterSelectorItemProvider.kt create mode 100644 app/src/main/java/org/dhis2/usescases/settings/models/SyncStateInput.kt delete mode 100644 app/src/main/java/org/dhis2/usescases/troubleshooting/TroubleshootingInjector.kt create mode 100644 app/src/main/java/org/dhis2/utils/ThemeColors.kt delete mode 100644 app/src/main/java/org/dhis2/utils/WebViewActivity.kt rename app/src/main/java/org/dhis2/utils/granularsync/{ => data}/GranularSyncRepository.kt (79%) create mode 100644 app/src/main/java/org/dhis2/utils/granularsync/domain/MissingSyncTargetException.kt create mode 100644 app/src/main/java/org/dhis2/utils/granularsync/domain/SyncStatus.kt create mode 100644 app/src/main/java/org/dhis2/utils/granularsync/domain/SyncStatusData.kt rename app/src/main/java/org/dhis2/utils/granularsync/{ => ui}/SyncUiState.kt (64%) create mode 100644 app/src/main/java/org/dhis2/utils/granularsync/ui/SyncUiStateMapper.kt delete mode 100644 app/src/main/java/org/dhis2/utils/session/PinDialog.kt delete mode 100644 app/src/main/java/org/dhis2/utils/session/PinExtensions.kt delete mode 100644 app/src/main/java/org/dhis2/utils/session/PinModule.kt delete mode 100644 app/src/main/java/org/dhis2/utils/session/PinPresenter.kt delete mode 100644 app/src/main/java/org/dhis2/utils/session/PinView.kt delete mode 100644 app/src/main/java/org/dhis2/utils/session/SessionComponent.kt delete mode 100644 app/src/main/res/layout-land/layout_pin.xml delete mode 100644 app/src/main/res/layout/dialog_pin.xml delete mode 100644 app/src/main/res/layout/layout_pin.xml create mode 100644 app/src/main/res/layout/spinner_program_item_layout.xml create mode 100644 app/src/test/java/org/dhis2/simprints/SimprintsSearchTestModels.kt delete mode 100644 app/src/test/java/org/dhis2/usescases/login/SyncIsPerformedInteractorTest.kt delete mode 100644 app/src/test/java/org/dhis2/usescases/main/MainPresenterTest.kt create mode 100644 app/src/test/java/org/dhis2/usescases/main/MainViewModelIntegrationTest.kt create mode 100644 app/src/test/java/org/dhis2/usescases/main/MainViewModelTest.kt create mode 100644 app/src/test/java/org/dhis2/usescases/main/domain/CheckSingleNavigationTest.kt create mode 100644 app/src/test/java/org/dhis2/usescases/main/domain/ConfigureHomeNavigationBarTest.kt create mode 100644 app/src/test/java/org/dhis2/usescases/main/domain/DeleteAccountTest.kt create mode 100644 app/src/test/java/org/dhis2/usescases/main/domain/DownloadNewVersionTest.kt create mode 100644 app/src/test/java/org/dhis2/usescases/main/domain/GetHomeFiltersTest.kt create mode 100644 app/src/test/java/org/dhis2/usescases/main/domain/GetLockActionTest.kt create mode 100644 app/src/test/java/org/dhis2/usescases/main/domain/GetUserNameTest.kt create mode 100644 app/src/test/java/org/dhis2/usescases/main/domain/LaunchInitialSyncTest.kt create mode 100644 app/src/test/java/org/dhis2/usescases/main/domain/ScheduleNewVersionAlertTest.kt create mode 100644 app/src/test/java/org/dhis2/usescases/main/domain/UpdateInitialSyncStatusTest.kt create mode 100644 app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/BaseIndicatorRepositoryTest.kt create mode 100644 app/src/test/java/org/dhis2/utils/granularsync/GranularSyncRepositoryTest.kt delete mode 100644 app/src/test/java/org/dhis2/utils/session/PinPresenterTest.kt delete mode 100644 commons/src/main/java/org/dhis2/commons/data/CarouselItemModel.kt create mode 100644 commons/src/main/java/org/dhis2/commons/di/FilterModule.kt create mode 100644 commons/src/main/java/org/dhis2/commons/resources/PaletteThemes.kt rename {ui-components => commons}/src/main/res/drawable/ic_delete.xml (100%) rename {ui-components => commons}/src/main/res/drawable/ic_error_outline.xml (100%) rename {ui-components => commons}/src/main/res/drawable/ic_event_status_complete.xml (100%) rename {ui-components => commons}/src/main/res/drawable/ic_file.xml (100%) rename {ui-components => commons}/src/main/res/drawable/ic_file_download.xml (100%) rename {ui-components => commons}/src/main/res/drawable/ic_home_negative.xml (100%) rename {ui-components => commons}/src/main/res/drawable/ic_home_outline.xml (100%) rename {ui-components => commons}/src/main/res/drawable/ic_home_positive.xml (100%) rename {ui-components => commons}/src/main/res/drawable/ic_input_info.xml (100%) rename {ui-components => commons}/src/main/res/drawable/ic_saved_check.xml (100%) rename {ui-components => commons}/src/main/res/drawable/ic_tree_node_close.xml (100%) rename {ui-components => commons}/src/main/res/drawable/ic_tree_node_default.xml (100%) rename {ui-components => commons}/src/main/res/drawable/ic_tree_node_open.xml (100%) rename {ui-components => commons}/src/main/res/drawable/ic_warning_alert.xml (100%) rename {ui-components => commons}/src/main/res/drawable/image_not_supported.xml (100%) rename commonskmm/src/{androidUnitTest => androidHostTest}/kotlin/org/dhis2/commons/validation/validators/FieldMaskValidatorTest.kt (100%) delete mode 100644 commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/auth/OpenIdControllerImpl.kt create mode 100644 commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationManagerImpl.kt create mode 100644 commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/notifications/WorkerNotificationInfo.kt rename commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/resources/{Resources.android.kt => DrawableResourcesProvider.android.kt} (100%) delete mode 100644 commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/auth/OpenIdController.kt create mode 100644 commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/color/ColorMatcher.kt create mode 100644 commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/color/PaletteColor.kt create mode 100644 commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/dates/DateTimeInputsUtils.kt create mode 100644 commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/extensions/DateExtensions.kt create mode 100644 commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationManager.kt create mode 100644 commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationModel.kt rename commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/resources/{Resources.kt => DrawableResourcesProvider.kt} (100%) create mode 100644 commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/resources/StringResourceProvider.kt create mode 100644 commonskmm/src/commonTest/kotlin/org/dhis2/mobile/commons/color/ColorMatcherTest.kt rename commonskmm/src/desktopMain/java/org/dhis2/mobile/commons/resources/{Resources.desktop.kt => DrawableResourcesProvider.desktop.kt} (100%) create mode 100644 dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RuleConstants.kt create mode 100644 dhis2_android_maps/src/test/java/org/dhis2/maps/usecases/MapMocks.kt create mode 100644 dhis2_android_maps/src/test/java/org/dhis2/maps/utils/CoordinateUtilsTest.kt create mode 100644 dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/di/ChartsModule.kt create mode 100644 dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/domain/GetEnrollmentAnalyticsUseCase.kt create mode 100644 dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/domain/GetEnrollmentAnalyticsUseCaseTest.kt delete mode 100644 docs/README.md create mode 100644 docs/compilation-distribution.md create mode 100644 docs/configure-openid-oauth.md create mode 100644 docs/contributions.md create mode 100644 docs/creating-custom-usecases.md create mode 100644 docs/modifying-apk.md create mode 100644 docs/overview.md create mode 100644 docs/resources/applicationId.png create mode 100644 docs/resources/build_apk_step_1.png create mode 100644 docs/resources/build_apk_step_2.png create mode 100644 docs/resources/build_apk_step_3.png create mode 100644 docs/resources/launcher_directory.png create mode 100644 docs/resources/open_id_login.png create mode 100644 docs/resources/version_name_code.png delete mode 100644 docs/src/commonmark/en/content/capture-app/local-analytics-features.md delete mode 100644 docs/src/commonmark/en/content/capture-app/resources/images/capture-app-matomo-instance.png delete mode 100644 docs/src/commonmark/en/content/capture-app/resources/images/capture-app-matomo-settings.png delete mode 100644 docs/src/commonmark/en/content/capture-app/resources/images/capture-app-sync-status.png delete mode 100644 docs/src/commonmark/en/content/capture-app/settings.md create mode 100644 gradle/verification-metadata.xml delete mode 100644 login/src/androidInstrumentedTest/kotlin/screen/TwoFAToEnableScreenTest.kt create mode 100644 login/src/androidMain/kotlin/org/dhis2/mobile/login/authentication/OpenIdControllerImpl.kt create mode 100644 login/src/androidMain/kotlin/org/dhis2/mobile/login/pin/PinBottomSheetLauncher.kt create mode 100644 login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/OpenIdController.kt create mode 100644 login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/DeviceEnrollmentInfo.kt create mode 100644 login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/OpenIdLoginConfiguration.kt create mode 100644 login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/GetDeviceEnrollmentUrl.kt create mode 100644 login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/LoginUserWithOAuth.kt create mode 100644 login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/ProcessDeviceEnrollment.kt create mode 100644 login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/domain/model/PinMode.kt delete mode 100644 login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/domain/model/PinState.kt delete mode 100644 login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/components/PinBottomSheet.kt create mode 100644 login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/components/PinDialog.kt create mode 100644 login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/state/PinUiState.kt create mode 100644 login/src/commonTest/kotlin/org/dhis2/mobile/login/main/domain/usecase/OpenIdLoginTest.kt create mode 100644 stock-usecase/src/main/res/values-ar-rEG/strings.xml delete mode 100644 sync/src/androidDeviceTest/kotlin/org/dhis2/mobile/sync/ExampleInstrumentedTest.kt delete mode 100644 sync/src/androidHostTest/kotlin/org/dhis2/mobile/sync/ExampleUnitTest.kt create mode 100644 sync/src/androidHostTest/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepositoryTest.kt create mode 100644 sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncBackgroundJobAction.kt create mode 100644 sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt create mode 100644 sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SdkSyncPeriodToSyncPeriod.kt create mode 100644 sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncDataWorker.kt create mode 100644 sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncMetadataWorker.kt create mode 100644 sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncSettingsWorker.kt create mode 100644 sync/src/androidMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.android.kt create mode 100644 sync/src/androidMain/res/drawable/ic_sync.xml create mode 100644 sync/src/commonMain/composeResources/values-cnr/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-de/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-el/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-ga/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-hr/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-lb/strings.xml create mode 100644 sync/src/commonMain/composeResources/values-mt/strings.xml create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncBackgroundJobAction.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncData.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncSettings.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncStatusController.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/DataSyncProgress.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/DataSyncProgressStatus.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/DataSyncTask.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SMSConfigResult.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncJobStatus.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncPeriod.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncResult.kt create mode 100644 sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncStatusData.kt create mode 100644 sync/src/commonTest/kotlin/org/dhis2/mobile/sync/domain/SyncMetadataTest.kt create mode 100644 sync/src/commonTest/kotlin/org/dhis2/mobile/sync/domain/SyncSettingsTest.kt create mode 100644 sync/src/desktopMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.desktop.kt rename tracker/src/{androidUnitTest => androidHostTest}/kotlin/org/dhis2/tracker/relationships/AndroidRelationshipFakeModels.kt (100%) rename tracker/src/{androidUnitTest => androidHostTest}/kotlin/org/dhis2/tracker/relationships/data/TrackerRelationshipsRepositoryTest.kt (100%) create mode 100644 tracker/src/androidHostTest/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImplTest.kt create mode 100644 tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepositoryImpl.kt create mode 100644 tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchParametersRepositoryImpl.kt create mode 100644 tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImpl.kt create mode 100644 tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/TrackedEntitySearchItemMapper.kt create mode 100644 tracker/src/androidMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.android.kt create mode 100644 tracker/src/commonMain/composeResources/values-or/strings.xml create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/input/model/TrackerInputType.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/action/TrackerInputAction.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/action/TrackerInputUiEvent.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/mapper/TrackerInputUiStateMapper.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerAgeInputProvider.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerCheckboxInputProvider.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerDateTimeProvider.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerRadioButtonInputProvider.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerInputUiState.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerOptionSetConfiguration.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepository.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/SearchParametersRepository.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepository.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/FetchOptionSetOptions.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/FetchSearchParameters.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntities.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/FetchSearchParametersData.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/QueryData.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchOperator.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchParameterModel.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchTrackedEntitiesInput.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchTrackedEntityAttribute.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/TrackedEntitySearchItemResult.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/action/SearchScreenUiEvent.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/provider/ParameterSelectorItemProvider.kt create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/screen/SearchParametersScreen.kt rename {app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/model => tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/state}/SearchParametersUiState.kt (86%) create mode 100644 tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/viewmodel/SearchParametersViewModel.kt create mode 100644 tracker/src/commonTest/kotlin/org/dhis2/tracker/search/SearchParametersIntegrationTest.kt create mode 100644 tracker/src/commonTest/kotlin/org/dhis2/tracker/search/domain/FetchSearchParametersTest.kt create mode 100644 tracker/src/commonTest/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntitiesTest.kt create mode 100644 tracker/src/commonTest/kotlin/org/dhis2/tracker/search/ui/viewmodel/SearchParametersViewModelTest.kt create mode 100644 tracker/src/desktopMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.desktop.kt delete mode 100644 ui-components/.gitignore delete mode 100644 ui-components/build.gradle.kts delete mode 100644 ui-components/consumer-rules.pro delete mode 100644 ui-components/proguard-rules.pro delete mode 100644 ui-components/src/main/res/drawable/ic_add_image.xml delete mode 100644 ui-components/src/main/res/font/rubik_bold.ttf delete mode 100644 ui-components/src/main/res/font/rubik_light.ttf delete mode 100644 ui-components/src/main/res/font/rubik_medium.ttf delete mode 100644 ui-components/src/main/res/font/rubik_regular.ttf delete mode 100644 ui-components/src/main/res/raw/warning.json delete mode 100644 ui-components/src/main/res/values-ar-rEG/strings.xml delete mode 100644 ui-components/src/main/res/values-ar-rIQ/strings.xml delete mode 100644 ui-components/src/main/res/values-ar/strings.xml delete mode 100644 ui-components/src/main/res/values-ckb/strings.xml delete mode 100644 ui-components/src/main/res/values-cs/strings.xml delete mode 100644 ui-components/src/main/res/values-da/strings.xml delete mode 100644 ui-components/src/main/res/values-en-rUS/strings.xml delete mode 100644 ui-components/src/main/res/values-es-rES/strings.xml delete mode 100644 ui-components/src/main/res/values-es/strings.xml delete mode 100644 ui-components/src/main/res/values-fr/strings.xml delete mode 100644 ui-components/src/main/res/values-hi-rIN/strings.xml delete mode 100644 ui-components/src/main/res/values-id/strings.xml delete mode 100644 ui-components/src/main/res/values-km/strings.xml delete mode 100644 ui-components/src/main/res/values-lo/strings.xml delete mode 100644 ui-components/src/main/res/values-my/strings.xml delete mode 100644 ui-components/src/main/res/values-nb/strings.xml delete mode 100644 ui-components/src/main/res/values-ne/strings.xml delete mode 100644 ui-components/src/main/res/values-nl/strings.xml delete mode 100644 ui-components/src/main/res/values-or/strings.xml delete mode 100644 ui-components/src/main/res/values-prs/strings.xml delete mode 100644 ui-components/src/main/res/values-ps/strings.xml delete mode 100644 ui-components/src/main/res/values-pt-rBR/strings.xml delete mode 100644 ui-components/src/main/res/values-pt/strings.xml delete mode 100644 ui-components/src/main/res/values-ro/strings.xml delete mode 100644 ui-components/src/main/res/values-ru/strings.xml delete mode 100644 ui-components/src/main/res/values-si/strings.xml delete mode 100644 ui-components/src/main/res/values-sv/strings.xml delete mode 100644 ui-components/src/main/res/values-tet/strings.xml delete mode 100644 ui-components/src/main/res/values-tg/strings.xml delete mode 100644 ui-components/src/main/res/values-uk/strings.xml delete mode 100644 ui-components/src/main/res/values-ur/strings.xml delete mode 100644 ui-components/src/main/res/values-uz-rUZ/strings.xml delete mode 100644 ui-components/src/main/res/values-uz/strings.xml delete mode 100644 ui-components/src/main/res/values-vi/strings.xml delete mode 100644 ui-components/src/main/res/values-zh-rCN/strings.xml delete mode 100644 ui-components/src/main/res/values-zh/strings.xml delete mode 100644 ui-components/src/main/res/values/colors.xml delete mode 100644 ui-components/src/main/res/values/strings.xml delete mode 100644 ui-components/src/main/res/values/styles.xml diff --git a/.claude/skills/android-testing/SKILL.md b/.claude/skills/android-testing/SKILL.md new file mode 100644 index 00000000000..cef45a987f1 --- /dev/null +++ b/.claude/skills/android-testing/SKILL.md @@ -0,0 +1,235 @@ +--- +name: android-testing +description: > + Guidelines for writing unit tests (mockito-kotlin, Turbine, runTest) and + UI instrumented tests (Robot pattern, CoroutineTracker, Compose test tags) + for the DHIS2 Android KMP project. Load this when creating, fixing, or + reviewing any test in the codebase. +--- + +# DHIS2 Android Testing Guidelines + +## Testing Stack + +- **Unit Tests**: `mockito-kotlin` (`mock()`, `whenever()`, `verify()`), JUnit / `kotlin.test` +- **Flow tests**: Turbine (`app.cash.turbine`) + `kotlinx-coroutines-test` +- **UI Tests**: Compose Testing + Espresso with Robot pattern +- **Test locations**: + - `commonTest/` — platform-agnostic unit tests (`kotlin.test` annotations: `@Test`, `@BeforeTest`) + - `androidUnitTest/` — Android-specific unit tests (JUnit `@Test`) + - `androidInstrumentedTest/` / `androidTest/` — UI/instrumented tests + +## Run Commands + +```bash +# Shortcut: lint + all unit tests (mirrors CI) +./run_tests.sh + +# All unit tests (legacy + KMP host + KMP debug) +./gradlew testDebugUnitTest testDhis2DebugUnitTest testAndroidHostTest + +# Desktop targets in KMP modules +./gradlew desktopTest + +# Single KMP module test class (commonTest + androidUnitTest source sets) +./gradlew :login:testAndroidHostTest --tests "org.dhis2.mobile.login.main.ui.viewmodel.LoginViewModelTest" + +# Single KMP module test class (androidUnitTest source set only) +./gradlew :login:testAndroidDebugUnitTest --tests "org.dhis2.mobile.login.main.ui.viewmodel.LoginViewModelTest" + +# Single legacy Android module test class +./gradlew :form:testDebugUnitTest --tests "org.dhis2.form.ui.FormViewModelTest" + +# Single test method (commonTest + androidUnitTest source sets) +./gradlew :login:testAndroidHostTest --tests "org.dhis2.mobile.login.main.ui.viewmodel.LoginViewModelTest.initial screen is set correctly when starting" +``` + +## Critical Rule: No Hard-Coded Delays + +ViewModels use `launchUseCase { }` which wraps `CoroutineTracker`. Espresso's +`IdlingResource` automatically waits for tracked coroutines. `Thread.sleep()` and +hard-coded timeouts are **forbidden**. + +```kotlin +// ✅ CORRECT — IdlingResource waits automatically +@Test +fun shouldLoadData() { + exampleRobot(composeTestRule) { + clickLoadButton() + verifyDataDisplayed() // no delay needed + } +} + +// ❌ WRONG +@Test +fun shouldLoadData() { + clickLoadButton() + Thread.sleep(2000) // FORBIDDEN + verifyDataDisplayed() +} +``` + +## Mocking: mockito-kotlin only + +Use `mock()`, `whenever()`, `verify()` from `org.mockito.kotlin`. Do **not** use MockK. + +```kotlin +import org.mockito.kotlin.mock +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever +``` + +## Unit Test Patterns + +### Use Case test +```kotlin +class SavePinUseCaseTest { + private val repository: SessionRepository = mock() + private val useCase = SavePinUseCase(repository) + + @Test + fun `should return success when pin is saved`() = runTest { + whenever(repository.savePin("1234")).thenReturn(Unit) + + val result = useCase("1234") + + assertTrue(result.isSuccess) + verify(repository).savePin("1234") + } +} +``` + +### ViewModel test +```kotlin +class ExampleViewModelTest { + private val useCase: GetDataUseCase = mock() + private val testDispatcher = UnconfinedTestDispatcher() + private lateinit var viewModel: ExampleViewModel + + @BeforeTest + fun setUp() { + Dispatchers.setMain(testDispatcher) + } + + @AfterTest + fun tearDown() { + Dispatchers.resetMain() + } + + @Test + fun `should emit success state when use case succeeds`() = runTest { + whenever(useCase()).thenReturn(Result.success(flowOf(listOf(item)))) + + viewModel = ExampleViewModel(useCase) + + viewModel.uiState.test { + assertEquals(UiState.Success(listOf(item)), awaitItem()) + } + } +} +``` + +### Repository test +```kotlin +class ExampleRepositoryTest { + // D2 chains calls across multiple intermediate objects — RETURNS_DEEP_STUBS is required + // so that d2.someModule().someRepository().blockingGet() doesn't NPE on the intermediates. + private val d2: D2 = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) + private val domainErrorMapper: DomainErrorMapper = mock() + private val repository = ExampleRepositoryImpl(d2, domainErrorMapper) + + @Test + fun `should map D2Error to domain error`() = runTest { + val d2Error = D2Error.builder().errorCode(D2ErrorCode.API_RESPONSE_PROCESS_ERROR).build() + whenever(d2.exampleModule().examples().blockingGet()).thenThrow(d2Error) + whenever(domainErrorMapper.mapToDomainError(d2Error)).thenReturn(DomainException("error")) + + val result = runCatching { repository.getData() } + + assertTrue(result.isFailure) + verify(domainErrorMapper).mapToDomainError(d2Error) + } +} +``` + +## UI Tests: Robot Pattern + +All UI tests go in `androidInstrumentedTest/`. Always use the Robot pattern. Tests extend +`BaseTest`, which provides `mockWebServerRobot` — a helper that stubs HTTP responses from the +DHIS2 server so tests run fully offline against a local `MockWebServer`. Register stubs +**before** launching the robot body. + +```kotlin +fun exampleRobot(rule: ComposeTestRule, body: ExampleRobot.() -> Unit) = + ExampleRobot(rule).apply { body() } + +class ExampleRobot(val rule: ComposeTestRule) : BaseRobot() { + fun typeUsername(username: String) { + rule.waitUntilExactlyOneExists(hasTestTag(USERNAME_TAG), TIMEOUT) + rule.onNodeWithTag(USERNAME_TAG).performClick() + rule.onAllNodesWithTag("INPUT_TEXT_FIELD")[0].performTextInput(username) + } + + fun clickSubmitButton() { + rule.waitUntilExactlyOneExists(hasTestTag(SUBMIT_TAG), TIMEOUT) + rule.onNodeWithTag(SUBMIT_TAG).performClick() + } +} + +class ExampleTest : BaseTest() { + @get:Rule val rule = createComposeRule() + + @Test + fun shouldPerformSuccessfulAction() { + // Stub the network response before any UI interaction + mockWebServerRobot.addResponse(GET, "/api/endpoint", MOCK_RESPONSE, 200) + exampleRobot(rule) { + typeUsername("user") + clickSubmitButton() + verifySuccessMessageDisplayed() + } + // Call cleanDatabase() after any test that writes to the local DB — + // it clears all DHIS2 SDK tables so state doesn't leak into the next test. + cleanDatabase() + } +} +``` + +## Test Tags + +Export constants from the screen file. Format: `{SCREEN}_{COMPONENT}_TAG`. + +```kotlin +const val LOGIN_BUTTON_TAG = "LOGIN_BUTTON_TAG" +const val USERNAME_INPUT_TAG = "USERNAME_INPUT_TAG" + +@Composable +fun LoginScreen() { + InputField(modifier = Modifier.testTag(USERNAME_INPUT_TAG)) + Button(modifier = Modifier.testTag(LOGIN_BUTTON_TAG)) { ... } +} +``` + +## DHIS2 Design System Inputs + +DHIS2 input components are composite. Click the wrapper to focus, then target the +inner `"INPUT_TEXT_FIELD"` node. Use `performTextInput()`, never `performTextReplacement()`. + +```kotlin +// ✅ CORRECT +rule.onNodeWithTag(USERNAME_TAG).performClick() +rule.onAllNodesWithTag("INPUT_TEXT_FIELD")[0].performTextInput(username) + +// ❌ WRONG +rule.onNodeWithTag(USERNAME_TAG).performTextReplacement(username) +``` + +## Common Mistakes to Avoid + +- Using `Thread.sleep()` or any hard-coded delays +- Using MockK (`mockk()`, `every {}`, `coEvery {}`) — use mockito-kotlin instead +- Using `performTextReplacement()` on DHIS2 design system components +- Not exporting test tag constants from screen files +- Not extending `BaseRobot` for robot classes +- Not cleaning up after tests (`cleanDatabase()`, clear preferences) +- Testing implementation details instead of user flows diff --git a/.editorconfig b/.editorconfig index 9778c7012d1..f706f5dee15 100644 --- a/.editorconfig +++ b/.editorconfig @@ -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 diff --git a/.github/agents/testing.agent.md b/.github/agents/testing.agent.md index c2825f82740..df73f8d9888 100644 --- a/.github/agents/testing.agent.md +++ b/.github/agents/testing.agent.md @@ -5,26 +5,19 @@ # For format details, see: https://gh.io/customagents/config name: Testing expert -description: > - Expert Kotlin/Android testing engineer for the DHIS2 Android Capture App. - Generates, reviews, and fixes unit tests (Mockito Kotlin/JUnit), UI instrumented tests - (Compose Testing + Espresso Robot pattern), and enforces async best practices - using CoroutineTracker. Targets KMP modules with commonTest, androidHostTest, - and androidDeviceTest source sets. -tools: - - githubread - - lexical-code-search - - semantic-code-search - - github-coding-agent-immersive +description: Agent expert on Android testing --- # DHIS2 Android Testing Expert Agent -You are an expert testing engineer specializing in the DHIS2 Android Capture App. Your role is to create, maintain, and improve tests following the project's strict testing guidelines and architecture patterns. +You are an expert testing engineer specializing in the DHIS2 Android Capture App. +Your role is to create, maintain, and improve tests following the project's strict +testing guidelines and architecture patterns. ## Project Context -This is a Kotlin Multiplatform (KMP) project migrating to Compose Multiplatform, targeting Android, iOS, and Desktop platforms. The app uses: +This is a Kotlin Multiplatform (KMP) project migrating to Compose Multiplatform, +targeting Android, iOS, and Desktop platforms. The app uses: - DHIS2 Android SDK (`org.hisp.dhis.android.core.*`) for all data operations - DHIS2 Mobile UI (`org.hisp.dhis.mobile.ui.designsystem.*`) design system @@ -34,84 +27,76 @@ This is a Kotlin Multiplatform (KMP) project migrating to Compose Multiplatform, ## Testing Stack -- Unit Tests: Mockito (`org.mockito.kotlin`) for mocking, JUnit -- UI Tests: Compose Testing, Espresso with Robot pattern -- Test Locations: - - `commonTest/` — Platform-agnostic tests - - `androidHostTest/` — Android unit tests (runs on the JVM) - - `androidDeviceTest/` — UI/instrumented tests (runs on device/emulator) +- **Unit Tests**: `mockito-kotlin` for mocking (`mock()`, `whenever()`, `verify()`), JUnit / `kotlin.test` +- **Flow tests**: Turbine (`app.cash.turbine`) + `kotlinx-coroutines-test` +- **UI Tests**: Compose Testing + Espresso with Robot pattern +- **Test locations**: + - `commonTest/` — platform-agnostic unit tests (use `kotlin.test` annotations) + - `androidUnitTest/` — Android-specific unit tests (use `@Test` from JUnit) + - `androidInstrumentedTest/` / `androidTest/` — UI/instrumented tests -## Choosing the Right Source Set +## Run Commands -| Source set | When to use | -|---|---| -| `commonTest/` | Pure Kotlin logic with no Android APIs: use cases, domain models, pure mappers | -| `androidHostTest/` | Android-specific unit tests running on the JVM: repository impls with D2, ViewModels | -| `androidDeviceTest/` | UI flows that require a real or emulated Android device | +```bash +# All unit tests +./gradlew testDebugUnitTest testDhis2DebugUnitTest testAndroidHostTest -> **AGP 9.x / `com.android.kotlin.multiplatform.library` plugin:** KMP modules use -> `androidHostTest` for JVM-based unit tests and `androidDeviceTest` for instrumented device tests. -> These source sets are created on demand via `withHostTest {}` / `withDeviceTest {}` in the -> `androidLibrary {}` DSL block. The old names `androidUnitTest` and `androidInstrumentedTest` -> belong to the legacy `com.android.library` + `kotlin("multiplatform")` setup and must **not** be -> used in modules that have adopted the new plugin. +# Single KMP module test class +./gradlew :login:testAndroidDebugUnitTest --tests "org.dhis2.mobile.login.main.ui.viewmodel.LoginViewModelTest" -## Critical Testing Rules +# Single legacy Android module test class +./gradlew :form:testDebugUnitTest --tests "org.dhis2.form.ui.FormViewModelTest" -### Async Handling — NEVER USE HARD-CODED DELAYS +# Single test method +./gradlew :login:testAndroidDebugUnitTest --tests "org.dhis2.mobile.login.main.ui.viewmodel.LoginViewModelTest.initial screen is set correctly when starting" +``` -**CRITICAL**: Use `CoroutineTracker` with `launchUseCase` for all async operations in tests: +## Critical Testing Rules -- ViewModels use `launchUseCase { }` extension which increments/decrements `CoroutineTracker` -- Espresso's `IdlingResource` automatically waits for tracked operations -- This enables fast, reliable tests without `Thread.sleep()` or manual waits -- **NEVER** write `Thread.sleep()`, `delay()`, or hard-coded timeouts in tests +### Async Handling — NEVER use hard-coded delays + +ViewModels use `launchUseCase { }` which wraps `CoroutineTracker`. Espresso's +`IdlingResource` automatically waits for tracked coroutines to complete. This makes +`Thread.sleep()` and hard-coded timeouts unnecessary and forbidden. ```kotlin -// ✅ CORRECT - ViewModel uses launchUseCase +// ✅ CORRECT — ViewModel uses launchUseCase class ExampleViewModel(private val useCase: GetDataUseCase) : ViewModel() { fun loadData() { - launchUseCase { // Automatically tracked + launchUseCase { // increments/decrements CoroutineTracker automatically val result = useCase() // ... handle result } } } -// ✅ CORRECT - Test waits automatically via IdlingResource +// ✅ CORRECT — Test waits automatically via IdlingResource @Test -fun `should load data`() { +fun shouldLoadData() { exampleRobot(composeTestRule) { clickLoadButton() - // IdlingResource waits for launchUseCase to complete - verifyDataDisplayed() // No delay needed! + verifyDataDisplayed() // no delay needed } } -// ❌ WRONG - Never do this +// ❌ WRONG — never do this @Test -fun `should load data`() { +fun shouldLoadData() { clickLoadButton() - Thread.sleep(2000) // NEVER DO THIS + Thread.sleep(2000) // FORBIDDEN verifyDataDisplayed() } ``` ## UI Testing Guidelines — Robot Pattern -### Location - -All UI tests go in `androidDeviceTest/`. - -### Pattern - -Use the Robot pattern for all UI interactions: +All UI tests go in `androidInstrumentedTest/`. Always use the Robot pattern. ```kotlin // Robot function wrapper fun exampleRobot( composeTestRule: ComposeTestRule, - robotBody: ExampleRobot.() -> Unit + robotBody: ExampleRobot.() -> Unit, ) { ExampleRobot(composeTestRule).apply { robotBody() } } @@ -133,149 +118,114 @@ class ExampleRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { composeTestRule.waitUntilExactlyOneExists(hasTestTag(SUCCESS_TAG), TIMEOUT) } } -``` - -### Test Structure -```kotlin +// Test class class ExampleTest : BaseTest() { @get:Rule val composeTestRule = createComposeRule() @Test - fun `should perform successful action`() { - // Setup mocks + fun shouldPerformSuccessfulAction() { mockWebServerRobot.addResponse(GET, "/api/endpoint", MOCK_RESPONSE, 200) - // Execute test using robot exampleRobot(composeTestRule) { typeUsername("user") clickSubmitButton() verifySuccessMessageDisplayed() } - // Cleanup cleanDatabase() } } ``` -## Test Tags for Compose UI +### Test Tags for Compose UI -**ALWAYS** add test tags to interactive components: +Always add test tags to interactive components. Export constants from the screen file. ```kotlin -// ✅ In the Screen composable - export tag constants +// In the screen composable file const val LOGIN_BUTTON_TAG = "LOGIN_BUTTON_TAG" const val USERNAME_INPUT_TAG = "USERNAME_INPUT_TAG" @Composable fun LoginScreen() { - InputField( - modifier = Modifier.testTag(USERNAME_INPUT_TAG) - ) - Button( - modifier = Modifier.testTag(LOGIN_BUTTON_TAG) - ) + InputField(modifier = Modifier.testTag(USERNAME_INPUT_TAG)) + Button(modifier = Modifier.testTag(LOGIN_BUTTON_TAG)) { ... } } ``` Format: `{SCREEN}_{COMPONENT}_TAG` (e.g., `LOGIN_BUTTON_TAG`, `HOME_MENU_TAG`) -## DHIS2 Design System Components +### DHIS2 Design System Components -DHIS2 components are composite. Special handling required: +DHIS2 components are composite. Click the wrapper tag to focus, then target the +inner `"INPUT_TEXT_FIELD"` node. Always use `performTextInput()`, not +`performTextReplacement()`. ```kotlin -// ✅ CORRECT - For InputField and similar components +// ✅ CORRECT fun typeUsername(username: String) { - // 1. Click wrapper to focus composeTestRule.onNodeWithTag(USERNAME_TAG).performClick() - - // 2. Find inner INPUT_TEXT_FIELD - composeTestRule.onAllNodesWithTag("INPUT_TEXT_FIELD")[0] - .performTextInput(username) // Use performTextInput, NOT performTextReplacement + composeTestRule.onAllNodesWithTag("INPUT_TEXT_FIELD")[0].performTextInput(username) } // ❌ WRONG fun typeUsername(username: String) { - composeTestRule.onNodeWithTag(USERNAME_TAG) - .performTextReplacement(username) // Won't work with composite components + composeTestRule.onNodeWithTag(USERNAME_TAG).performTextReplacement(username) } ``` -## Mock Server Usage - -Use `MockWebServerRobot` for API mocking: +### Mock Server ```kotlin -@Test -fun `should handle api response`() { - // Setup mock response - mockWebServerRobot.addResponse( - method = GET, - path = "/api/dataElements", - response = MOCK_DATA_ELEMENTS_JSON, - responseCode = 200 - ) - - // Run test - exampleRobot(composeTestRule) { - clickSyncButton() - verifyDataSynced() - } -} +mockWebServerRobot.addResponse( + method = GET, + path = "/api/dataElements", + response = MOCK_DATA_ELEMENTS_JSON, + responseCode = 200, +) ``` -## Best Practices Checklist +## Unit Testing Guidelines -- ✅ Use `waitUntilExactlyOneExists()` before interacting with elements -- ✅ Robot methods have descriptive names (`clickLoginButton()`, not `click()`) -- ✅ Keep robots focused on actions, separate assertion methods -- ✅ Test user flows, not isolated components -- ✅ Mock all external dependencies (network, SDK, databases) -- ✅ Clean up after tests (call `cleanDatabase()`, clear preferences) -- ❌ NEVER use `Thread.sleep()` or hard-coded delays -- ✅ Use `performTextInput()` for DHIS2 design system inputs -- ✅ Export test tag constants from screen files +### Mocking library: mockito-kotlin -## Unit Testing Guidelines +Use `mock()`, `whenever()`, `verify()` from `org.mockito.kotlin`. Do **not** use MockK. -### Repository Tests +```kotlin +import org.mockito.kotlin.mock +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever +``` -Mock DHIS2 SDK components and `DomainErrorMapper`: +### Repository Tests ```kotlin class ExampleRepositoryTest { - private val d2: D2 = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) + private val d2: D2 = mock() private val domainErrorMapper: DomainErrorMapper = mock() private val repository = ExampleRepositoryImpl(d2, domainErrorMapper) @Test fun `should map SDK data to domain models`() = runTest { - // Given - val sdkData: List<Example> = mock() - whenever(d2.exampleModule().examples().get()) doReturn sdkData + val sdkData = listOf<Example>() + whenever(d2.exampleModule().examples().blockingGet()).thenReturn(sdkData) - // When val result = repository.getData() - // Then - verify(d2.exampleModule().examples()).get() - // Assert domain mapping + verify(d2.exampleModule().examples()).blockingGet() } @Test fun `should map D2Error to domain error`() = runTest { - // Given val d2Error = D2Error.builder().errorCode(D2ErrorCode.API_RESPONSE_PROCESS_ERROR).build() - whenever(d2.exampleModule().examples().get()).thenThrow(d2Error) - whenever(domainErrorMapper.mapToDomainError(d2Error)) doReturn DomainException("Mapped error") + whenever(d2.exampleModule().examples().blockingGet()).thenThrow(d2Error) + whenever(domainErrorMapper.mapToDomainError(d2Error)).thenReturn(DomainException("Mapped error")) - // When/Then - assertThrows<DomainException> { - repository.getData() - } + val result = runCatching { repository.getData() } + + assertTrue(result.isFailure) verify(domainErrorMapper).mapToDomainError(d2Error) } } @@ -283,35 +233,24 @@ class ExampleRepositoryTest { ### ViewModel Tests -Test state transitions and use case coordination. Always configure `Dispatchers.setMain` to avoid coroutine dispatcher issues in unit tests. `UnconfinedTestDispatcher` is preferred here because it runs coroutines eagerly without suspending, so ViewModel `init` blocks and `launchUseCase` calls complete synchronously during test setup: - ```kotlin class ExampleViewModelTest { private val getDataUseCase: GetDataUseCase = mock() + private val testDispatcher = UnconfinedTestDispatcher() private lateinit var viewModel: ExampleViewModel - @Before + @BeforeTest fun setUp() { - // UnconfinedTestDispatcher runs coroutines eagerly, enabling - // synchronous execution of ViewModel init and launchUseCase blocks - Dispatchers.setMain(UnconfinedTestDispatcher()) - } - - @After - fun tearDown() { - Dispatchers.resetMain() + Dispatchers.setMain(testDispatcher) } @Test fun `should emit success state when use case succeeds`() = runTest { - // Given val data = listOf(ExampleData("test")) - whenever(getDataUseCase()) doReturn Result.success(flowOf(data)) + whenever(getDataUseCase()).thenReturn(Result.success(flowOf(data))) - // When viewModel = ExampleViewModel(getDataUseCase) - // Then assertEquals(UiState.Success(data), viewModel.uiState.value) } } @@ -319,8 +258,6 @@ class ExampleViewModelTest { ### Use Case Tests -Test business logic and error handling: - ```kotlin class GetDataUseCaseTest { private val repository: ExampleRepository = mock() @@ -328,82 +265,66 @@ class GetDataUseCaseTest { @Test fun `should filter invalid data`() = runTest { - // Given - val allData = listOf( - ExampleData(isValid = true), - ExampleData(isValid = false) - ) - whenever(repository.getData()) doReturn flowOf(allData) - - // When + val allData = listOf(ExampleData(isValid = true), ExampleData(isValid = false)) + whenever(repository.getData()).thenReturn(flowOf(allData)) + val result = useCase(Unit) - // Then result.onSuccess { flow -> - flow.collect { data -> + flow.test { + val data = awaitItem() assertTrue(data.all { it.isValid }) + awaitComplete() } } } } ``` -## Test Naming Convention - -- Use backtick-style descriptive names for all tests -- Format: `` `should [expected behavior] when [condition]` `` — the `when [condition]` clause is optional; omit it when the condition is obvious from the expected behavior alone -- Examples: - - `` `should emit error state when use case fails` `` - - `` `should display success message when login succeeds` `` - - `` `should map D2Error to domain error when SDK throws` `` - - `` `should filter invalid data` `` (condition is implicit) - ## Test Organization ``` -modulekmm/ -├── src/ -│ ├── commonTest/kotlin/ # Shared unit tests -│ │ ├── domain/ # Use case tests -│ │ ├── data/ # Repository interface tests -│ ├── androidHostTest/kotlin/ # Android-specific unit tests -│ │ ├── data/ # Repository implementation tests -│ │ ├── ui/ # ViewModel tests -│ ├── androidDeviceTest/ # UI tests with Robot pattern -│ │ ├── robots/ # Robot classes -│ │ ├── tests/ # Test classes +modulekmm/src/ +├── commonTest/kotlin/ # Shared unit tests (kotlin.test + mockito-kotlin + turbine) +│ ├── domain/ # Use case tests +│ └── data/ # Repository interface tests +├── androidUnitTest/kotlin/ # Android-specific unit tests +│ ├── data/ # Repository implementation tests +│ └── ui/ # ViewModel tests +└── androidInstrumentedTest/ # UI tests with Robot pattern + ├── robots/ # Robot classes + └── tests/ # Test classes ``` -## When Writing Tests +## Best Practices Checklist -- Identify test type: Unit (repository, use case, ViewModel) or UI (instrumented) -- For UI tests: Always use Robot pattern, export test tags, use `CoroutineTracker` -- For unit tests: Mock dependencies with Mockito Kotlin, test business logic and mappings -- Mock external dependencies: SDK, network, database -- Clean up: Database, preferences, mock servers -- Never delay: Trust `CoroutineTracker` and `IdlingResource` +- Use `waitUntilExactlyOneExists()` before interacting with elements +- Robot methods use descriptive names (`clickLoginButton()`, not `click()`) +- Keep robots focused on actions; use separate methods for assertions +- Test user flows, not isolated components +- Mock all external dependencies (network, SDK, databases) +- Clean up after tests (`cleanDatabase()`, clear preferences) +- Use `performTextInput()` for DHIS2 design system inputs +- Export test tag constants from screen files ## Common Mistakes to Avoid -- ❌ Using `Thread.sleep()` or hard-coded delays -- ❌ Using `performTextReplacement()` on DHIS2 design system components -- ❌ Forgetting to export test tag constants -- ❌ Not extending `BaseRobot` for robot classes -- ❌ Not cleaning up after tests -- ❌ Testing implementation details instead of user flows -- ❌ Forgetting to mock external dependencies -- ❌ Using old source set names `androidUnitTest` or `androidInstrumentedTest` in KMP modules that have adopted the `com.android.kotlin.multiplatform.library` plugin — the correct names are `androidHostTest` (JVM unit tests) and `androidDeviceTest` (device/instrumented tests) +- Using `Thread.sleep()` or any hard-coded delays +- Using `performTextReplacement()` on DHIS2 design system components +- Using MockK (`mockk()`, `every {}`, `coEvery {}`) — use mockito-kotlin instead +- Forgetting to export test tag constants from screen files +- Not extending `BaseRobot` for robot classes +- Not cleaning up after tests +- Testing implementation details instead of user flows +- Forgetting to mock external dependencies before the test runs ## Your Responsibilities When asked to create or fix tests: -- Analyze the component/feature being tested -- Determine test type (unit vs UI) -- Create/update test following all guidelines above -- Ensure proper mocking, async handling, and cleanup -- Verify test follows Robot pattern (for UI) or proper structure (for unit) -- Add test tags to components if missing -- Run tests to verify they pass - -You are the testing expert. Write clean, maintainable, reliable tests that follow DHIS2 project standards. +1. Identify test type: unit (use case / repository / ViewModel) or UI (instrumented) +2. Place tests in the correct source set (`commonTest`, `androidUnitTest`, or `androidInstrumentedTest`) +3. Use `mockito-kotlin` for all mocking — never MockK +4. For UI tests: apply the Robot pattern, export test tags, rely on `CoroutineTracker` +5. Ensure proper cleanup (database, preferences, mock server) +6. Run the relevant Gradle task to verify the test passes before finishing diff --git a/.github/dependabot.yml b/.github/dependabot.yml index b75843dd40d..e72b95fcd40 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -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 diff --git a/.github/workflows/build-release-candidate.yml b/.github/workflows/build-release-candidate.yml index 17dd450f794..6134ac3ef22 100644 --- a/.github/workflows/build-release-candidate.yml +++ b/.github/workflows/build-release-candidate.yml @@ -45,7 +45,7 @@ jobs: encodedString: ${{ secrets.KEYSTORE }} - name: Build Release APKs - run: ./gradlew app:assembleDhis2Release app:assembleDhis2PlayServicesRelease + run: ./gradlew --dependency-verification strict app:assembleDhis2Release app:assembleDhis2PlayServicesRelease env: SENTRY_DSN: ${{ secrets.SENTRY_DSN }} SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} @@ -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 strict app:assembleDhis2TrainingRelease - name: Read version name from file working-directory: ./gradle @@ -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 \ No newline at end of file diff --git a/.github/workflows/continuous-delivery.yml b/.github/workflows/continuous-delivery.yml index e156128ed9e..a9eccc75424 100644 --- a/.github/workflows/continuous-delivery.yml +++ b/.github/workflows/continuous-delivery.yml @@ -42,20 +42,43 @@ 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 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 }} + OPEN_ID_AUTH_SCHEME: ${{ secrets.OPEN_ID_AUTH_SCHEME }} + OPEN_ID_TYPE: ${{ secrets.OPEN_ID_TYPE }} + OPEN_ID_SERVER: ${{ secrets.OPEN_ID_SERVER }} + OPEN_ID_CLIENT: ${{ secrets.OPEN_ID_CLIENT }} + OPEN_ID_REDIRECT_URI: ${{ secrets.OPEN_ID_REDIRECT_URI }} + OPEN_ID_DISCOVERY_URI: ${{ secrets.OPEN_ID_DISCOVERY_URI }} + OPEN_ID_AUTHORIZATION_URL: ${{ secrets.OPEN_ID_AUTHORIZATION_URL }} + OPEN_ID_TOKEN_URL: ${{ secrets.OPEN_ID_TOKEN_URL }} + OPEN_ID_BUTTON_TEXT: ${{ secrets.OPEN_ID_BUTTON_TEXT }} + + - 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 }} diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml index fbd6b94d124..da2d40b7f33 100644 --- a/.github/workflows/deploy-release.yml +++ b/.github/workflows/deploy-release.yml @@ -49,7 +49,7 @@ jobs: encodedString: ${{ secrets.KEYSTORE }} - name: Build Release APKs - run: ./gradlew app:assembleDhis2Release app:assembleDhis2PlayServicesRelease + run: ./gradlew --dependency-verification strict app:assembleDhis2Release app:assembleDhis2PlayServicesRelease env: SENTRY_DSN: ${{ secrets.SENTRY_DSN }} SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} @@ -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 strict app:assembleDhis2TrainingRelease - name: Read version name from file working-directory: ./gradle @@ -94,7 +94,7 @@ jobs: - name: Upload to Github if: ${{ inputs.github_release }} - uses: ncipollo/release-action@b7eabc95ff50cbeeedec83973935c8f306dfcd0b + uses: ncipollo/release-action@339a81892b84b4eeb0f6e744e4574d79d0d9b8dd with: allowUpdates: true draft: true diff --git a/.github/workflows/fix-kmp-translations.yml b/.github/workflows/fix-kmp-translations.yml new file mode 100644 index 00000000000..56d67418046 --- /dev/null +++ b/.github/workflows/fix-kmp-translations.yml @@ -0,0 +1,61 @@ +name: Fix KMP Translations + +on: + pull_request: + types: [opened, synchronize] + +jobs: + fix-kmp-translations: + if: startsWith(github.head_ref, 'develop-transifex-') + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + + steps: + - uses: actions/checkout@v6 + with: + ref: ${{ github.head_ref }} + fetch-depth: 0 + + - name: Remove escaped question marks from KMP compose resources + run: | + for dir in \ + "tracker/src/commonMain/composeResources" \ + "aggregates/src/commonMain/composeResources" \ + "commonskmm/src/commonMain/composeResources" \ + "login/src/commonMain/composeResources" \ + "sync/src/commonMain/composeResources"; do + if [ -d "$dir" ]; then + find "$dir" -name "*.xml" -exec sed -i 's/\\?/?/g' {} \; + fi + done + git add -A + + - name: Check if meaningful changes remain vs base branch + id: check + run: | + if git diff --cached --quiet origin/${{ github.base_ref }}; then + echo "has_changes=false" >> "$GITHUB_OUTPUT" + else + echo "has_changes=true" >> "$GITHUB_OUTPUT" + fi + + - name: Commit and push fix + if: steps.check.outputs.has_changes == 'true' + run: | + if ! git diff --cached --quiet; then + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git commit -m "fix(translations): remove KMP-incompatible escaped question marks [skip ci]" + git push + fi + + - name: Close PR — no meaningful changes remain + if: steps.check.outputs.has_changes == 'false' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh pr comment ${{ github.event.pull_request.number }} \ + --body "Closing automatically: after removing Android-style escaped \`\?\` characters (incompatible with KMP Compose resources), no translation changes remain." + gh pr close ${{ github.event.pull_request.number }} --delete-branch diff --git a/.github/workflows/rampcapture-github-release-signed-apk.yml b/.github/workflows/rampcapture-github-release-signed-apk.yml index 09f3054595d..669830b8e03 100644 --- a/.github/workflows/rampcapture-github-release-signed-apk.yml +++ b/.github/workflows/rampcapture-github-release-signed-apk.yml @@ -115,7 +115,7 @@ jobs: release_notes=$(cat <<EOF RAMPcapture signed APK release. - + Fork version: ${{ steps.release-info.outputs.forkNumber }}. Based on upstream DHIS2 version: v${{ steps.read-version.outputs.vName }}. diff --git a/.github/workflows/simcapture-github-release-signed-apk.yml b/.github/workflows/simcapture-github-release-signed-apk.yml index 2fda9ea3943..3ed4ac7e437 100644 --- a/.github/workflows/simcapture-github-release-signed-apk.yml +++ b/.github/workflows/simcapture-github-release-signed-apk.yml @@ -114,7 +114,7 @@ jobs: release_notes=$(cat <<EOF SimCapture signed APK release. - + Fork version: ${{ steps.release-info.outputs.forkNumber }}. Based on upstream DHIS2 version: v${{ steps.read-version.outputs.vName }}. diff --git a/.github/workflows/simcapture-sync-fork-upstream-main.yml b/.github/workflows/simcapture-sync-fork-upstream-main.yml index 7cf534a4ad2..f4288024041 100644 --- a/.github/workflows/simcapture-sync-fork-upstream-main.yml +++ b/.github/workflows/simcapture-sync-fork-upstream-main.yml @@ -32,7 +32,7 @@ jobs: destination_head_sha=$( gh api "repos/$CURRENT_FORK_REPOSITORY/branches/$DESTINATION_BRANCH" --jq '.commit.sha' ) - + echo "Source $SOURCE_UPSTREAM_REPOSITORY:$SOURCE_BRANCH branch head before sync: $source_head_sha." echo "Destination $CURRENT_FORK_REPOSITORY:$DESTINATION_BRANCH branch head before sync: $destination_head_sha." diff --git a/.github/workflows/verify-dependency-metadata.yml b/.github/workflows/verify-dependency-metadata.yml new file mode 100644 index 00000000000..538d651c359 --- /dev/null +++ b/.github/workflows/verify-dependency-metadata.yml @@ -0,0 +1,95 @@ +name: Verify Dependency Metadata + +on: + pull_request: + branches: + - main + - develop + - release/* + paths: + - 'gradle/libs.versions.toml' + - 'gradle/verification-metadata.xml' + - '**/*.gradle.kts' + - '**/build.gradle' + +jobs: + verify-dependency-metadata: + runs-on: ubuntu-latest + + steps: + - name: Checkout PR branch + uses: actions/checkout@v6 + with: + ref: ${{ github.head_ref }} + fetch-depth: 0 + token: ${{ secrets.DHIS2_BOT_GITHUB_TOKEN }} + + - name: Set Up JDK + uses: actions/setup-java@v5 + with: + distribution: 'zulu' + java-version: '17' + cache: 'gradle' + + - name: Change wrapper permissions + run: chmod +x ./gradlew + + - name: Decode Keystore + id: decode_keystore + if: github.event.pull_request.head.repo.full_name == github.repository + uses: timheuer/base64-to-file@784a1a4a994315802b7d8e2084e116e783d157be + with: + fileName: 'dhis_keystore.jks' + encodedString: ${{ secrets.KEYSTORE }} + + - name: Decode Training Keystore + id: decode_training_keystore + if: github.event.pull_request.head.repo.full_name == github.repository + uses: timheuer/base64-to-file@784a1a4a994315802b7d8e2084e116e783d157be + with: + fileName: 'dhis_training_keystore.jks' + encodedString: ${{ secrets.TRAINING_KEYSTORE_BASE64 }} + + - name: Regenerate verification metadata + env: + SENTRY_DSN: ${{ secrets.SENTRY_DSN }} + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + SIGNING_KEY_ALIAS: ${{ secrets.KEY_ALIAS }} + SIGNING_KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} + SIGNING_STORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }} + SIGNING_KEYSTORE_PATH: ${{ steps.decode_keystore.outputs.filePath }} + TRAINING_KEY_ALIAS: ${{ secrets.TRAINING_KEY_ALIAS }} + 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 --write-verification-metadata sha256 --no-daemon \ + help \ + app:assembleDhis2Release \ + app:assembleDhis2PlayServicesRelease \ + app:assembleDhis2TrainingRelease + + - name: Check if metadata changed + id: check-diff + run: | + if git diff --quiet gradle/verification-metadata.xml; then + echo "changed=false" >> $GITHUB_OUTPUT + echo "✅ verification-metadata.xml is up to date." + else + echo "changed=true" >> $GITHUB_OUTPUT + fi + + - name: Fail for fork PRs with outdated metadata + if: steps.check-diff.outputs.changed == 'true' && github.event.pull_request.head.repo.full_name != github.repository + run: | + echo "⚠️ Fork PR: verification-metadata.xml is out of date but cannot be auto-committed." + echo "Please run './gradlew --write-verification-metadata sha256 help' locally and commit the result." + exit 1 + + - name: Commit updated metadata + if: steps.check-diff.outputs.changed == 'true' && github.event.pull_request.head.repo.full_name == github.repository + uses: flex-development/gh-commit@177be4b5bca1b102400ca7220932d9ff7980fddb + with: + message: 'chore: update dependency verification metadata' + ref: ${{ github.head_ref }} + token: ${{ secrets.DHIS2_BOT_GITHUB_TOKEN }} diff --git a/.tx/config b/.tx/config index af74d17517a..dbefa2b2d9d 100644 --- a/.tx/config +++ b/.tx/config @@ -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 @@ -105,4 +97,3 @@ source_lang = en type = ANDROID minimum_perc = 0 resource_name = Sync - diff --git a/AGENTS.md b/AGENTS.md index e92e6e44c05..104fec32f4c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,470 +1,192 @@ -# DHIS2 Android Capture App - Development Guidelines +# DHIS2 Android Capture App - Agent Guidelines -This document serves as a comprehensive guide for developers working on the DHIS2 Android Capture -App, outlining best practices, architecture patterns, and implementation examples. It is designed to -be useful for both human developers and AI assistants like Copilot. +This is a **Kotlin Multiplatform (KMP)** Android project migrating to Compose Multiplatform, +targeting Android, Desktop, and iOS. The app uses MVVM + Repository + Use Case architecture. -## Project Overview +--- -This project is a DHIS2 Android application that is migrating from a traditional Android app to a * -*Kotlin Multiplatform (KMP)** project. The migration is ongoing with the goal of eventually becoming -a full Compose Multiplatform application supporting Android, iOS, and Desktop platforms. +## Build & Lint Commands -## Technology Stack +```bash +# Full lint check (ktlint 1.7.1, ktlint_official style) +./gradlew ktlintCheck -### Core Technologies +# Auto-format all sources +./gradlew ktlintFormat -- **Kotlin**: Primary programming language -- **Kotlin Multiplatform (KMP)**: Target platform for cross-platform development -- **Compose Multiplatform**: UI framework for all platforms -- **Gradle**: Build system with Kotlin DSL +# Run all unit tests (debug + KMP host tests) +./gradlew testDebugUnitTest testDhis2DebugUnitTest testAndroidHostTest -### UI Framework +# Shortcut: lint + all unit tests (mirrors CI) +./run_tests.sh -- **Primary UI**: Use `@dhis2/dhis2-mobile-ui` design system (based on Compose Multiplatform) - - Use latest stable version (check `gradle/libs.versions.toml` for current version) - - Import: `org.hisp.dhis.mobile.ui.designsystem.*` - - Always prefer DHIS2 design system components over Material components when available +# Run a single test class (KMP commonTest) +./gradlew :login:testAndroidHostTest --tests "org.dhis2.mobile.login.main.ui.viewmodel.LoginViewModelTest" -### Data Layer +# Run a single test method (KMP commonTest) +./gradlew :login:testAndroidHostTest --tests "org.dhis2.mobile.login.main.ui.viewmodel.LoginViewModelTest.initial screen is set correctly when starting" -- **DHIS2 Android SDK**: Use `@dhis2/dhis2-android-sdk` for all data operations - - Use latest stable version (check `gradle/libs.versions.toml` for current version) - - Import: `org.hisp.dhis.android.core.*` - - Handles persistence, offline/online synchronization, and DHIS2 API communication - - Never create direct network calls or database operations - use the SDK +# Build debug APK +./gradlew assembleDhis2Debug -## Architecture and Patterns - -This section describes the core architecture patterns used in the project, along with implementation -examples and best practices. - -### MVVM Architecture - -The Model-View-ViewModel (MVVM) pattern is used to separate concerns between the UI (View), business -logic (ViewModel), and data (Model). +# Build all modules +./gradlew assemble +``` -- **ViewModels**: Manage UI state and business logic - - Use `androidx.lifecycle.ViewModel` or platform-specific equivalents - - Expose state via `StateFlow` and `Flow` - - Handle UI events and coordinate with repositories/use cases +**Gradle task naming by module type:** +- Legacy Android modules (`form`, `commons`, `tracker`, etc.): `testDebugUnitTest` +- KMP modules (`login`, `commonskmm`, `sync`, `aggregates`), `commonTest` source set: `testAndroidHostTest` +- KMP modules, `androidUnitTest` source set: `testAndroidDebugUnitTest` +- Desktop targets in KMP modules: `desktopTest` -- **Views/Composables**: UI layer that observes ViewModel state - - Use `@Composable` functions for UI components - - Collect state using `collectAsState()` - - Keep composables pure and stateless when possible - - Use Compose multiplatform previews (`@Preview`) to validate UI components +--- -#### ViewModel Implementation Example +## Project Structure -```kotlin -class ExampleViewModel( - private val getDataUseCase: GetDataUseCase -) : ViewModel() { - private val _uiState = MutableStateFlow<UiState>(UiState.Loading) - val uiState: StateFlow<UiState> = _uiState.asStateFlow() - - init { - loadData() - } - - private fun loadData() { - // Use the `launchUseCase` ViewModel extension which wraps coroutine tracking and uses - // a background dispatcher by default (it increments/decrements CoroutineTracker). - launchUseCase { - // `getDataUseCase()` is an extension for `UseCase<Unit, T>` that calls the use case with Unit - val result = getDataUseCase() - result.fold( - onSuccess = { flow -> - flow - .catch { _uiState.value = UiState.Error(it.message ?: "Unknown error") } - .collect { _uiState.value = UiState.Success(it) } - }, - onFailure = { throwable -> - _uiState.value = UiState.Error(throwable.message ?: "Unknown error") - } - ) - } - } -} ``` - -#### Composable Implementation Example - -```kotlin -@Composable -fun ExampleScreen( - viewModel: ExampleViewModel = koinViewModel() -) { - val uiState by viewModel.uiState.collectAsState() - - DHIS2Theme { - when (uiState) { - is UiState.Loading -> LoadingIndicator() - is UiState.Success -> ExampleContent(uiState.data) - is UiState.Error -> ErrorMessage(uiState.message) - } - } -} +root/ +├── app/ # Main Android application +├── commonskmm/ # KMP shared utilities, base classes, DI helpers +├── login/ # KMP login feature (Android + Desktop) +├── sync/ # KMP sync feature +├── aggregates/ # KMP aggregate data feature +├── tracker/ # Android tracker feature +├── form/ # Android form module +├── commons/ # Android shared utilities (legacy) +├── compose-table/ # Compose table component +├── dhis2-mobile-program-rules/ # KMP program rules engine +└── gradle/libs.versions.toml # Central dependency catalog ``` -### Repository Pattern - -Repositories provide an abstraction layer over data sources, handling data access and mapping -between SDK models and domain models. - -- **Repositories**: Abstract data access layer - - Define interfaces in `commonMain` - - Implement platform-specific versions in `androidMain`, `desktopMain`, etc. - - Use DHIS2 SDK for data operations - - Handle data mapping between SDK models and domain models - - Map SDK exceptions to domain errors: repository implementations should translate platform/SDK - exceptions into domain-level errors using the project's `DomainErrorMapper` (or equivalent). - This keeps the domain layer SDK-agnostic and makes error handling consistent across the app. - - Imports you will commonly need in Android implementations: - ``` - import org.dhis2.mobile.commons.error.DomainErrorMapper - import org.hisp.dhis.android.core.maintenance.D2Error - ``` - - Recommendations: - - Keep repository method signatures `suspend` and let them throw domain-level exceptions - rather than returning raw SDK exceptions. - - Catch/translate only SDK-specific exceptions; allow unexpected exceptions to bubble up - or wrap them in a generic domain error if appropriate. - - Write unit tests that mock `DomainErrorMapper` to assert error mapping behavior. - -#### Repository Implementation Example - -```kotlin -class ExampleRepositoryImpl( - private val d2: D2, - private val domainErrorMapper: DomainErrorMapper -) : ExampleRepository { - override suspend fun getData(): Flow<List<ExampleData>> { - return try { - d2.exampleModule().examples() - .get() - .asFlow() - .map { it.map { example -> example.toDomainModel() } } - } catch (d2Error: D2Error) { - throw domainErrorMapper.mapToDomainError(d2Error) - } - } -} +**KMP module source sets:** ``` - -### Use Cases - -Use cases encapsulate complex business logic, providing a clear interface for ViewModels to interact -with the domain layer. - -- **Use Cases**: Encapsulate complex business logic - - Single responsibility principle - - Implement the shared `UseCase` interface: `UseCase<in R, out T>` (see - `commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/domain/UseCase.kt`). Use cases must - implement/extend this interface so they return a `Result<T>` from their `invoke` method. - - For parameterless use cases use `UseCase<Unit, T>` and the provided extension - `suspend operator fun <T> UseCase<Unit, T>.invoke() = this(Unit)` to call them without passing - `Unit` explicitly. - - Return `Result<T>` (often wrapping a `Flow<T>` when the use case emits a stream). Handle - exceptions inside the use case and wrap success/failure using `Result.success` / - `Result.failure`. - - Coordinate between multiple repositories if needed - - Return `Flow` or `suspend` functions for async operations - - Place in domain layer - -#### Use Case Implementation Example - -```kotlin -class GetDataUseCase( - private val repository: ExampleRepository -) : UseCase<Unit, Flow<List<ExampleData>>> { - override suspend operator fun invoke(input: Unit): Result<Flow<List<ExampleData>>> { - return try { - val flow = repository.getData() - .map { data -> data.filter { it.isValid } } - Result.success(flow) - } catch (e: Exception) { - Result.failure(e) - } - } -} +modulekmm/src/ +├── commonMain/kotlin/ # Shared business logic, interfaces, use cases +├── commonTest/kotlin/ # Shared unit tests (kotlin-test + mockito-kotlin + turbine) +├── androidMain/kotlin/ # Android implementations, SDK access +├── androidUnitTest/kotlin/ # Android-specific unit tests +├── desktopMain/kotlin/ # Desktop implementations +└── composeResources/ # Shared Compose resources (strings, images) ``` -### State Management +--- -Use sealed classes to represent different UI states in a type-safe manner. +## Code Style (enforced by ktlint 1.7.1) -- **Sealed Classes**: Use for representing different states - ```kotlin - sealed class UiState { - object Loading : UiState() - data class Success(val data: T) : UiState() - data class Error(val message: String) : UiState() - } - ``` - -### Reactive Programming - -Leverage Kotlin's Flow and Coroutines for reactive and asynchronous programming. - -- **Flow**: For reactive data streams - - Use `StateFlow` for state that can be observed - - Use `Flow` for data streams - - Combine flows using operators like `combine`, `flatMapLatest` - -- **Coroutines**: For asynchronous programming - - Use `viewModelScope` in ViewModels - - Handle errors with try-catch blocks - - Use `Dispatchers.IO` for I/O operations - -### Dependency Injection +Config in `.editorconfig`: +- **Style**: `ktlint_official` +- **No wildcard imports** (`ktlint_standard_no-wildcard-imports = enabled`) +- **No unused imports** (`ktlint_standard_no-unused-imports = enabled`) +- **Trailing commas required** on both call and declaration sites +- **Ordered imports** (`ktlint_standard_import-ordering = enabled`) +- **Function naming**: standard rule disabled — composables may use PascalCase per Compose conventions -Koin is used for dependency injection, supporting multiplatform development. - -- **Koin**: Dependency injection framework - - Use latest stable version (check `gradle/libs.versions.toml` for current version) - - Define modules in `commonMain` when possible - - Use `expect`/`actual` pattern for platform-specific dependencies - - Module structure: `val commonModule: Module = module { ... }` - -#### Koin Module Definition Example - -```kotlin -val exampleModule = module { - single<ExampleRepository> { ExampleRepositoryImpl(get()) } - single<GetDataUseCase> { GetDataUseCase(get()) } - viewModel { ExampleViewModel(get()) } -} -``` +**General Kotlin conventions:** +- JVM target: Java 17 (`sourceCompatibility = JavaVersion.VERSION_17`) +- Prefer `data class` over plain class for models +- Use `sealed class` / `sealed interface` for UI state +- Use `object` for singletons, companion objects for constants +- Prefer expression bodies for single-expression functions +- Document public APIs with KDoc -## Project Structure +--- -### Multiplatform Module Organization +## Architecture Patterns +### Layer structure (per feature module) ``` -modulekmm/ -├── src/ -│ ├── commonMain/kotlin/ # Shared code -│ ├── commonTest/kotlin/ # Shared tests -│ ├── androidMain/kotlin/ # Android-specific code -│ ├── androidUnitTest/kotlin/# Android unit tests -│ ├── desktopMain/kotlin/ # Desktop-specific code -│ └── iosMain/kotlin/ # iOS-specific code (when applicable) +domain/ + model/ # Pure data classes / sealed states + usecase/ # Business logic, implements UseCase<R, T> + repository/ # Repository interfaces +data/ + repository/ # Repository implementations (androidMain) +ui/ + state/ # UiState sealed classes + viewmodel/ # ViewModels (expose StateFlow<UiState>) + screen/ # @Composable screens + component/ # Reusable composables +di/ # Koin module definitions ``` -### Code Organization - -- **Domain Layer**: Models, use cases, repository interfaces -- **Data Layer**: Repository implementations, data sources -- **UI Layer**: Composables, ViewModels, navigation -- **DI Layer**: Dependency injection modules - -### Platform-Specific Code - -- Use `expect`/`actual` pattern for platform differences -- Keep platform-specific code minimal -- Prefer shared implementations in `commonMain` - -## Development Guidelines - -### Compose Multiplatform - -- **Components**: Always check DHIS2 design system first - - Use components from `org.hisp.dhis.mobile.ui.designsystem.component.*` - - Use theme from `org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme` -- **Navigation**: Use Compose Navigation for multiplatform -- **Resources**: Place in `commonMain/composeResources/` -- **Theming**: Use DHIS2Theme wrapper - -### Data Operations - -- **Never bypass the SDK**: Always use DHIS2 Android SDK for all data operations - - Use components from `org.hisp.dhis.android.core.*` -- **Offline-first**: Design with offline capabilities in mind -- **Sync handling**: Let the SDK handle synchronization -- **Error handling**: Handle SDK exceptions appropriately - -### Testing - -- **Unit Tests**: Place in appropriate test directories -- **Shared Tests**: Use `commonTest` for platform-agnostic tests -- **Mocking**: Use Mockito (`org.mockito.kotlin`) for mocking — `mock()`, `whenever()`, `doReturn`, `verify()` -- **Repository Tests**: Mock DHIS2 SDK components -- **Integration Tests**: Test full flows from ViewModel through use cases to a mocked repository (see `TwoFAScreenConfigurationIntegrationTest` for a reference) -- **UI Tests**: Follow the Robot pattern for instrumented tests (see detailed section below) - -### UI Testing Guidelines - -- **Location**: Place UI tests in `androidInstrumentedTest` -- **Pattern**: Use Robot pattern for test actions and assertions -- **Async handling**: Use `CoroutineTracker` with `launchUseCase` - never use hard-coded delays - - Espresso's `IdlingResource` automatically waits for tracked operations to complete - - This enables faster, more reliable tests without manual wait mechanisms -- **Test tags**: Add `Modifier.testTag()` to interactive UI components - - Format: `{SCREEN}_{COMPONENT}_TAG` (e.g., `LOGIN_BUTTON_TAG`) - - Export constants from screen files for test imports -- **DHIS2 design system components**: These are composite components - - Click the wrapper with your test tag to focus it - - Use `"INPUT_TEXT_FIELD"` tag to find inner fields - - Use `performTextInput()` (not `performTextReplacement()`) -- **Mock server**: Use `MockWebServerRobot` for API mocking -- **Best practices**: - 1. Use `waitUntilExactlyOneExists()` for element visibility - 2. Use descriptive robot method names (e.g., `clickLoginButton()`) - 3. Keep robots focused on actions, not assertions - 4. Test user flows, not isolated components - 5. Mock all external dependencies (network, SDK responses) - 6. Clean up after tests (databases, preferences) - -#### Example: Robot Class +### UseCase interface (commonskmm) +All use cases must implement `UseCase<in R, out T>` from +`commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/domain/UseCase.kt`: ```kotlin -fun exampleRobot( - composeTestRule: ComposeTestRule, - robotBody: ExampleRobot.() -> Unit -) { - ExampleRobot(composeTestRule).apply { robotBody() } -} - -class ExampleRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { - fun typeUsername(username: String) { - composeTestRule.waitUntilExactlyOneExists(hasTestTag(USERNAME_TAG), TIMEOUT) - composeTestRule.onNodeWithTag(USERNAME_TAG).performClick() - composeTestRule.onAllNodesWithTag("INPUT_TEXT_FIELD")[0].performTextInput(username) - } - - fun clickSubmitButton() { - composeTestRule.waitUntilExactlyOneExists(hasTestTag(SUBMIT_TAG), TIMEOUT) - composeTestRule.onNodeWithTag(SUBMIT_TAG).performClick() - } +// Interface definition +fun interface UseCase<in R, out T> { + suspend operator fun invoke(input: R): Result<T> } +// Parameterless convenience extension +suspend operator fun <T> UseCase<Unit, T>.invoke() = this(Unit) ``` -#### Example: Test Structure - +Implementation pattern: ```kotlin -class ExampleTest : BaseTest() { - @get:Rule - val composeTestRule = createComposeRule() - - @Test - fun shouldPerformSuccessfulAction() { - mockWebServerRobot.addResponse(GET, "/api/endpoint", MOCK_RESPONSE, 200) - - exampleRobot(composeTestRule) { - typeUsername("user") - clickSubmitButton() - // IdlingResource handles async automatically - checkSuccessMessageDisplayed() +class SavePinUseCase(private val repo: SessionRepository) : UseCase<String, Unit> { + override suspend fun invoke(input: String): Result<Unit> = + try { + repo.savePin(input) + Result.success(Unit) + } catch (e: Exception) { + Result.failure(e) } - - cleanDatabase() - } } ``` -### Integration Testing Guidelines - -Integration tests wire together the ViewModel, use cases, and a mocked repository to verify -complete feature flows end-to-end without touching the network or a real database. +### ViewModel pattern +- Use `launchUseCase { }` (not `viewModelScope.launch`) — it wraps `CoroutineTracker` + which integrates with Espresso's `IdlingResource` for reliable UI tests +- Expose state via `StateFlow`; collect in composables with `collectAsState()` -- **Location**: Place in `commonTest` (shared across platforms) when the ViewModel and use cases live in `commonMain` -- **Pattern**: Instantiate real use cases with a mocked repository; inject a `StandardTestDispatcher`; observe the ViewModel's `StateFlow` via [Turbine](https://github.com/cashapp/turbine) (`flow.test { … }`) -- **Mocking**: Use Mockito (`org.mockito.kotlin`) — `mock()`, `whenever()`, `doReturn`, `doReturnConsecutively` -- **Async handling**: Use `StandardTestDispatcher` + `Dispatchers.setMain(testDispatcher)` / `Dispatchers.resetMain()` and `runTest { … }` -- **Best practices**: - 1. Use `@BeforeTest` / `@AfterTest` (from `kotlin.test`) to set up and tear down the dispatcher - 2. Follow the Given / When / Then comment structure - 3. Assert every intermediate state (loading, success, error) not just the final result - 4. Use `cancelAndIgnoreRemainingEvents()` to cleanly finish a Turbine block - -#### Example: Integration Test Structure +### Repository pattern (Android implementations) +- Translate `D2Error` → domain errors via `DomainErrorMapper` +- Required imports for Android impls: + ```kotlin + import org.dhis2.mobile.commons.error.DomainErrorMapper + import org.hisp.dhis.android.core.maintenance.D2Error + ``` +### Dependency Injection (Koin 4.x) ```kotlin -@OptIn(ExperimentalCoroutinesApi::class) -class ExampleIntegrationTest { - private val testDispatcher = StandardTestDispatcher() - private lateinit var repository: ExampleRepository - private lateinit var viewModel: ExampleViewModel - private val dispatchers = Dispatcher(testDispatcher, testDispatcher, testDispatcher) - - @BeforeTest - fun setup() { - Dispatchers.setMain(testDispatcher) - repository = mock() - } - - @AfterTest - fun tearDown() { - Dispatchers.resetMain() - } - - @Test - fun `Given repository returns data, When ViewModel loads, Then success state is shown`() = - runTest { - // Given - whenever(repository.getData()) doReturn Result.success(listOf("item")) - - // When - viewModel = ExampleViewModel(GetDataUseCase(repository), dispatchers) - - // Then - viewModel.uiState.test { - assertEquals(UiState.Loading, awaitItem()) - assertTrue(awaitItem() is UiState.Success) - cancelAndIgnoreRemainingEvents() - } - } +val featureModule = module { + single<MyRepository> { MyRepositoryImpl(get(), get()) } + factory { MyUseCase(get()) } + viewModel { MyViewModel(get()) } } ``` +- Define modules in `commonMain` where possible; use `expect`/`actual` for platform DI +- Inject ViewModels in composables with `koinViewModel()` -### Code Style - -- **Kotlin conventions**: Follow official Kotlin coding conventions -- **ktlint**: Project uses ktlint for formatting -- **Imports**: Organize imports, prefer explicit imports -- **Documentation**: Document public APIs with KDoc - -## Best Practices & Migration Guidelines +--- -### Core Development Practices +## UI Guidelines -1. **Always use DHIS2 design system components** before falling back to Material components -2. **Never create direct database or network operations** - use DHIS2 SDK exclusively -3. **Keep business logic in ViewModels or Use Cases**, not in Composables -4. **Use sealed classes for state representation** -5. **Prefer composition over inheritance** -6. **Write tests for business logic and repositories** -7. **Handle loading and error states appropriately** -8. **Follow offline-first design principles** -9. **Keep platform-specific code minimal** - use `expect`/`actual` pattern -10. **Use meaningful commit messages and follow Git flow** +- **Always prefer** DHIS2 design system components (`org.hisp.dhis.mobile.ui.designsystem.*`) + over Material components +- Wrap screens in `DHIS2Theme { }` from `org.hisp.dhis.mobile.ui.designsystem.theme` +- Place shared Compose resources in `commonMain/composeResources/` +- Use multiplatform Compose Navigation (`org.jetbrains.androidx.navigation:navigation-compose`) +- Add `@Preview` annotations to validate composables in isolation -### Important Warnings +--- -- **Coroutine cancellation**: Remember to handle coroutine cancellation properly -- **SDK exception handling**: DHIS2 SDK operations might throw exceptions - always handle them -- **Component availability**: Some DHIS2 design system components might not be available yet - check documentation -- **RxJava migration**: When migrating from RxJava to Coroutines/Flow, ensure proper error handling -- **Platform-specific resources**: Handle resources differently in multiplatform (not all platforms support identical APIs) +## Testing -### Migrating from Android to KMP +- **Unit tests**: `mockito-kotlin` + `kotlin.test` in `commonTest`; `mockito-kotlin` + JUnit in `androidUnitTest` and legacy modules +- **Flow assertions**: Turbine (`app.cash.turbine`) + `kotlinx-coroutines-test` +- **UI tests**: Compose Testing + Espresso, Robot pattern, located in `androidInstrumentedTest/` +- **ViewModel coroutines**: always use `launchUseCase { }` — it wraps `CoroutineTracker` which integrates with Espresso's `IdlingResource`; never use `Thread.sleep()` -- **Code organization**: Move shared logic to `commonMain`; extract platform-specific code to `androidMain`, `desktopMain`, etc. -- **UI conversion**: Convert View-based UI to Compose Multiplatform -- **Dependency injection**: Update to use Koin multiplatform -- **Libraries**: Prefer multiplatform libraries over platform-specific ones -- **Compatibility**: Check compatibility with Compose Multiplatform before selecting dependencies -- **Documentation**: Document public APIs with KDoc +For patterns, examples, and common mistakes load the **android-testing** skill. +--- -## Resources +## Key Constraints -- [DHIS2 Mobile UI Documentation](https://ui.dhis2.nu/components) -- [DHIS2 Android SDK Documentation](https://docs.dhis2.org/en/develop/using-the-api/dhis-core-version-master/android-sdk.html) -- [Compose Multiplatform Documentation](https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-multiplatform-getting-started.html) -- [Koin Multiplatform Documentation](https://insert-koin.io/docs/reference/koin-mp/kmp) -- [Android Architecture Guidelines](https://developer.android.com/topic/architecture) -- [Compose Testing Documentation](https://developer.android.com/jetpack/compose/testing) -- [Espresso Idling Resources](https://developer.android.com/training/testing/espresso/idling-resource) +1. **Never create direct network or database calls** — use the DHIS2 Android SDK (`org.hisp.dhis.android.core.*`) +2. **Offline-first**: design features to work without connectivity; let the SDK handle sync +3. **KMP first**: put business logic in `commonMain`; keep `androidMain` to SDK/platform specifics +4. **No RxJava in new code**: migrate to Coroutines/Flow; wrap existing RxJava at boundaries +5. **ktlint must pass** before committing — run `./gradlew ktlintFormat` then `ktlintCheck` diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000000..9aa330bf2e0 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,5 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +@AGENTS.md \ No newline at end of file diff --git a/Jenkinsfile b/Jenkinsfile index de22090ec9f..0cf65b9502b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -66,13 +66,18 @@ 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 testDebugUnitTest testDhis2DebugUnitTest testAndroidHostTest --stacktrace --no-daemon' } } } @@ -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]")) +} diff --git a/README.md b/README.md index 2e3769bb7bf..f3830b8fddd 100644 --- a/README.md +++ b/README.md @@ -14,33 +14,33 @@ upstream [dhis2/dhis2-android-capture-app](https://github.com/dhis2/dhis2-androi | Infra: fork sync from upstream | [simcapture-sync-fork-upstream-main.yml](.github/workflows/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](.github/workflows/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](.github/workflows/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#L85](app/build.gradle.kts#L85) | Code change | App's Package ID set to `com.simprints.simcapture` | +| Infra: signed APK releases | [app/build.gradle.kts#L121](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](.github/workflows/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-L125](README.md#L1-L125) | Code change | This section in README | -| Enrolment+ Possible Duplicates | [CustomIntentActivityResultContract.kt#L68](form/src/main/java/org/dhis2/form/ui/customintent/CustomIntentActivityResultContract.kt#L68) | Code addition | Treats non-identify Simprints callouts that return identification matches as `PossibleDuplicates` results | -| Enrolment+ Possible Duplicates | [FormView.kt#L654](form/src/main/java/org/dhis2/form/ui/FormView.kt#L654) | Code addition | Stores the returned SID session and hands the enrolment form off to the possible duplicates search flow | -| Enrolment+ Possible Duplicates | [EnrollmentActivity.kt#L281](app/src/main/java/org/dhis2/usescases/enrollment/EnrollmentActivity.kt#L281) | Code addition | Launches possible duplicates search from the enrolment form, carrying the biometric field and returned GUID matches | +| Enrolment+ Possible Duplicates | [CustomIntentActivityResultContract.kt#L95](form/src/main/java/org/dhis2/form/ui/customintent/CustomIntentActivityResultContract.kt#L95) | Code addition | Treats non-identify Simprints callouts that return identification matches as `PossibleDuplicates` results | +| Enrolment+ Possible Duplicates | [FormView.kt#L627](form/src/main/java/org/dhis2/form/ui/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](app/src/main/java/org/dhis2/usescases/enrollment/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](app/src/main/java/org/dhis2/simprints/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#L572](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt#L572) | 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#L307](app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt#L307) | Code addition | Replaces the default "+ New" action button with `None of the above` while reviewing possible duplicates | -| Enrolment+ Enrol Last | [SearchTEIViewModel.kt#L521](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt#L521) | Code addition | Marks `None of the above` as a pending enrolment action and closes the possible duplicates search | -| Enrolment+ Enrol Last | [SearchTEActivity.kt#L655](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.kt#L655) | 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#L145](app/src/main/java/org/dhis2/usescases/enrollment/EnrollmentActivity.kt#L145) | Code addition | Receives the possible duplicates return flow and launches save-time Enrol Last before enrolment finishes | +| Enrolment+ Possible Duplicates | [SearchTEIViewModel.kt#L731](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt#L731) | 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#L317](app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt#L317) | Code addition | Replaces the default "+ New" action button with `None of the above` while reviewing possible duplicates | +| Enrolment+ Enrol Last | [SearchTEIViewModel.kt#L663](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt#L663) | Code addition | Marks `None of the above` as a pending enrolment action and closes the possible duplicates search | +| Enrolment+ Enrol Last | [SearchTEActivity.kt#L674](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.kt#L674) | 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](app/src/main/java/org/dhis2/usescases/enrollment/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](app/src/main/java/org/dhis2/simprints/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#L29](commons/src/main/java/org/dhis2/commons/simprints/repository/SimprintsSessionRepository.kt#L29) | Code addition | Keeps separate pending Enrol Last source state for possible-duplicates returns | +| Enrolment+ Enrol Last | [SimprintsSessionRepository.kt#L30](commons/src/main/java/org/dhis2/commons/simprints/repository/SimprintsSessionRepository.kt#L30) | Code addition | Keeps separate pending Enrol Last source state for possible-duplicates returns | | Enrolment+ Enrol Last | [SimprintsRememberCustomIntentFormPresenter.kt#L32](form/src/main/java/org/dhis2/form/simprints/SimprintsRememberCustomIntentFormPresenter.kt#L32) | Code change | Shows `(Using last biometrics)` when Enrol Last is resumed after returning from possible duplicates | -| Identification+ Enrol Last | [EnrollmentActivity.kt#L83](app/src/main/java/org/dhis2/usescases/enrollment/EnrollmentActivity.kt#L83) | Code addition | Launches Enrol Last before completing a valid enrollment save and resumes finish after SID returns | +| Identification+ Enrol Last | [EnrollmentActivity.kt#L326](app/src/main/java/org/dhis2/usescases/enrollment/EnrollmentActivity.kt#L326) | Code addition | Launches Enrol Last before completing a valid enrollment save and resumes finish after SID returns | | Identification+ Enrol Last | [EnrollmentPresenterImpl.kt#L163](app/src/main/java/org/dhis2/usescases/enrollment/EnrollmentPresenterImpl.kt#L163) | Code addition | Delegates save-time Enrol Last resolution and result handling | -| Identification+ Enrol Last | [EnrollmentModule.kt#L182](app/src/main/java/org/dhis2/usescases/enrollment/EnrollmentModule.kt#L182) | Code addition | DI for separate Simprints-specific components for Identification+ Enrol Last | +| Identification+ Enrol Last | [EnrollmentModule.kt#L181](app/src/main/java/org/dhis2/usescases/enrollment/EnrollmentModule.kt#L181) | Code addition | DI for separate Simprints-specific components for Identification+ Enrol Last | | Identification+ Enrol Last | [SimprintsEnrollmentViewModelFactory.kt](app/src/main/java/org/dhis2/simprints/di/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](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.kt#L571) | Code change | Carries biometric search context into create/enroll actions via prepared enrollment query data | -| Identification+ Enrol Last | [SimprintsSearchViewModel.kt#L96](app/src/main/java/org/dhis2/simprints/SimprintsSearchViewModel.kt#L96) | Code addition | Prepares Simprints enrollment query data and tracks whether the create action should use last biometrics | -| Identification+ Enrol Last | [SearchTEIViewModel.kt#L1359](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt#L1359) | Code change | Preserves existing search parameter values when fields reload so pending Enrol Last state survives configuration changes | -| Identification+ Enrol Last | [SearchTEList.kt#L289](app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt#L289) | 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#L688](app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt#L688) | 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#L61](form/src/main/java/org/dhis2/form/data/FormRepositoryImpl.kt#L61) | Code change | Counts pending Enrol Last values as present for form completion, sections, and mandatory validation | -| Identification+ Enrol Last | [Injector.kt#L279](form/src/main/java/org/dhis2/form/di/Injector.kt#L279) | Code addition | DI for separate Simprints-specific components for Identification+ Enrol Last | -| Identification+ Enrol Last | [CustomIntentProvider.kt#L75](form/src/main/java/org/dhis2/form/ui/provider/inputfield/CustomIntentProvider.kt#L75) | Code addition | Shows pending biometric placeholder state, clears it on user clear, and routes Simprints enrollment results | +| Identification+ Enrol Last | [SearchTEActivity.kt#L596](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.kt#L596) | Code change | Carries biometric search context into create/enroll actions via prepared enrollment query data | +| Identification+ Enrol Last | [SimprintsSearchViewModel.kt#L103](app/src/main/java/org/dhis2/simprints/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#L1604](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt#L1604) | Code change | Preserves existing search parameter values when fields reload so pending Enrol Last state survives configuration changes | +| Identification+ Enrol Last | [SearchTEList.kt#L299](app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt#L299) | 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#L707](app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt#L707) | 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](form/src/main/java/org/dhis2/form/data/FormRepositoryImpl.kt#L58) | Code change | Counts pending Enrol Last values as present for form completion, sections, and mandatory validation | +| Identification+ Enrol Last | [Injector.kt#L281](form/src/main/java/org/dhis2/form/di/Injector.kt#L281) | Code addition | DI for separate Simprints-specific components for Identification+ Enrol Last | +| Identification+ Enrol Last | [CustomIntentProvider.kt#L74](form/src/main/java/org/dhis2/form/ui/provider/inputfield/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](app/src/main/java/org/dhis2/simprints/SimprintsCustomIntentResultMapper.kt) | New file | Maps SID result intents through the existing custom-intent response contract | | Identification+ Enrol Last | [SimprintsEnrollmentViewModel.kt](app/src/main/java/org/dhis2/simprints/SimprintsEnrollmentViewModel.kt) | New file | Coordinates pending Enrol Last launch, save-time result persistence, and session clearing | | Identification+ Enrol Last | [SimprintsD2Repository.kt](commons/src/main/java/org/dhis2/commons/simprints/repository/SimprintsD2Repository.kt) | New file | Provides D2 access for enrollment context and TEA value reads/writes used by Simprints flows | @@ -51,61 +51,61 @@ upstream [dhis2/dhis2-android-capture-app](https://github.com/dhis2/dhis2-androi | Identification+ Enrol Last | [SimprintsCustomIntentFormPresenter.kt](form/src/main/java/org/dhis2/form/simprints/SimprintsCustomIntentFormPresenter.kt) | New file | Handles Simprints form callout launch, session capture, placeholder display, and pending-state clearing | | Identification+ Enrol Last | [SimprintsRememberCustomIntentFormPresenter.kt](form/src/main/java/org/dhis2/form/simprints/SimprintsRememberCustomIntentFormPresenter.kt) | New file | Builds the Simprints form presenter from Compose field state and placeholder resources | | Identification Confirm Identity | [SearchTEActivity.kt#L128](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.kt#L128) | Code addition | Registers the confirm-identity SID launcher and waits for Simprints navigation before opening dashboards | -| Identification Confirm Identity | [SearchTEIViewModel.kt#L847](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt#L847) | Code addition | Intercepts TEI openings from biometric search to launch Confirm Identity when required | -| Identification Confirm Identity | [SearchTEModule.java#L374](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java#L374) | Code addition | DI for separate Simprints-specific components for Identification Confirm Identity | -| Identification Confirm Identity | [SearchTeiViewModelFactory.kt#L48](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTeiViewModelFactory.kt#L48) | Code addition | Passes Simprints search state into `SearchTEIViewModel` | +| Identification Confirm Identity | [SearchTEIViewModel.kt#L1020](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt#L1020) | Code addition | Intercepts TEI openings from biometric search to launch Confirm Identity when required | +| Identification Confirm Identity | [SearchTEModule.java#L371](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java#L371) | Code addition | DI for separate Simprints-specific components for Identification Confirm Identity | +| Identification Confirm Identity | [SearchTeiViewModelFactory.kt#L55](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTeiViewModelFactory.kt#L55) | Code addition | Passes Simprints search state into `SearchTEIViewModel` | | Identification Confirm Identity | [SimprintsSearchViewModelFactory.kt](app/src/main/java/org/dhis2/simprints/di/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](app/src/main/java/org/dhis2/simprints/SimprintsSearchViewModel.kt) | New file | Coordinates biometric search handoff for Enrol Last labels and Confirm Identity navigation | | Identification Confirm Identity | [SimprintsResolveConfirmIdentityCalloutUseCase.kt](commons/src/main/java/org/dhis2/commons/simprints/usecases/SimprintsResolveConfirmIdentityCalloutUseCase.kt) | New file | Resolves the selected TEI's biometric GUID and prepares the `CONFIRM_IDENTITY` callout | | ModuleID in Identification | [CustomIntentRepositoryImpl.kt#L105](commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/customintents/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#L715](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt#L715) | 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#L366](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java#L366) | Code change | DI for separate Simprints-specific components for Identification result ordering by score | -| Identification result ordering by score | [SearchTeiViewModelFactory.kt#L49](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTeiViewModelFactory.kt#L49) | Code addition | Passes the ordered-result use case into `SearchTEIViewModel` | +| Identification result ordering by score | [SearchTEIViewModel.kt#L756](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt#L756) | 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#L379](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java#L379) | Code change | DI for separate Simprints-specific components for Identification result ordering by score | +| Identification result ordering by score | [SearchTeiViewModelFactory.kt#L56](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTeiViewModelFactory.kt#L56) | Code addition | Passes the ordered-result use case into `SearchTEIViewModel` | | Identification result ordering by score | [SimprintsOrderSearchResultsByIdentifyResponseUseCase.kt](commons/src/main/java/org/dhis2/commons/simprints/usecases/SimprintsOrderSearchResultsByIdentifyResponseUseCase.kt) | New file | Orders matching TEIs to follow the SID identification response order | -| Identification with less buttons | [ParameterSelectorItemProvider.kt#L92](app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/provider/ParameterSelectorItemProvider.kt#L92) | Code addition | Starts Simprints identification callout immediately on biometric search field click instead of expanding the field | -| Identification with less buttons | [SearchTEUi.kt#L211](app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt#L211) | Code change | Keeps the Biometric search label read-only | -| Identification with less buttons | [SearchParametersScreen.kt#L120](app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreen.kt#L120) | 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#L1324](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt#L1324) | Code addition | Rehydrates carried query values and performs the search immediately when biometric query data is present | -| Identification with less buttons | [SearchTEActivity.kt#L620](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.kt#L620) | Code addition | Skips the transient search editor and jumps straight to the biometric result list without backdrop animation | -| MFID Auto-Open Record | [SimprintsMapBiometricSearchResultUseCase.kt#L48](app/src/main/java/org/dhis2/simprints/SimprintsMapBiometricSearchResultUseCase.kt#L48) | Code addition | Detects credential-linked identification results that qualify for the MFID direct-open shortcut | -| MFID Auto-Open Record | [SimprintsSearchViewModel.kt#L187](app/src/main/java/org/dhis2/simprints/SimprintsSearchViewModel.kt#L187) | Code addition | Consumes an eligible single MFID identification to open the matched record directly instead of showing the result list | +| Identification with less buttons | [SearchTEIViewModel.kt#L514](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt#L514) | Code addition | Starts Simprints identification callout immediately on biometric search field click instead of expanding the field | +| Identification with less buttons | [SearchTEUi.kt#L214](app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt#L214) | Code change | Keeps the Biometric search label read-only | +| Identification with less buttons | [SearchParametersScreenProvider.kt#L70](app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreenProvider.kt#L70) | 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#L1551](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt#L1551) | Code addition | Rehydrates carried query values and performs the search immediately when biometric query data is present | +| Identification with less buttons | [SearchTEActivity.kt#L636](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.kt#L636) | Code addition | Skips the transient search editor and jumps straight to the biometric result list without backdrop animation | +| MFID Auto-Open Record | [SimprintsMapBiometricSearchResultUseCase.kt#L46](app/src/main/java/org/dhis2/simprints/SimprintsMapBiometricSearchResultUseCase.kt#L46) | Code addition | Detects credential-linked identification results that qualify for the MFID direct-open shortcut | +| MFID Auto-Open Record | [SimprintsSearchViewModel.kt#L185](app/src/main/java/org/dhis2/simprints/SimprintsSearchViewModel.kt#L185) | 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](app/src/main/java/org/dhis2/simprints/SimprintsResolveSingleBiometricSearchNavigationUseCase.kt) | New file | Resolves the biometric search to exactly one TEI before auto-opening the record | | RAMP Infra: signed APK releases | [rampcapture-github-release-signed-apk.yml](.github/workflows/rampcapture-github-release-signed-apk.yml) | New file | GitHub Action to create a RAMPcapture GitHub Release on a merge to `ramp-main` | | RAMP Infra: version info | [rampcapture-github-release-signed-apk.yml#L90](.github/workflows/rampcapture-github-release-signed-apk.yml#L90) | Code addition | Passes the computed RAMPcapture fork number into the signed release APK build as `RAMP_CAPTURE_VERSION` | -| RAMP Infra: version info | [app/build.gradle.kts#L96](app/build.gradle.kts#L96) | Code addition | Reads `RAMP_CAPTURE_VERSION`, falls back to `local build`, and exposes it as `BuildConfig.RAMP_CAPTURE_VERSION` | +| RAMP Infra: version info | [app/build.gradle.kts#L130](app/build.gradle.kts#L130) | Code addition | Reads `RAMP_CAPTURE_VERSION`, falls back to `local build`, and exposes it as `BuildConfig.RAMP_CAPTURE_VERSION` | | RAMP Infra: version info | [ContextExtensions.kt#L17](app/src/main/java/org/dhis2/bindings/ContextExtensions.kt#L17) | Code addition | Formats the RAMPcapture build version for About, including commit SHA if a non-release build | | RAMP Infra: version info | [fragment_about.xml#L31](app/src/main/res/layout/fragment_about.xml#L31) | Code addition | Adds a RAMPcapture version row above the upstream DHIS2 app and SDK version labels on the About screen | | RAMP Infra: version info | [AboutFragment.kt#L45](app/src/main/java/org/dhis2/usescases/about/AboutFragment.kt#L45) | Code addition | Binds the RAMPcapture version text while keeping the DHIS2 app and SDK version | -| RAMP Infra: version info | [strings.xml#L363](app/src/main/res/values/strings.xml#L363) | Code addition | Adds the `RAMPcapture Version: %s` label for the new About screen row | +| RAMP Infra: version info | [strings.xml#L222](app/src/main/res/values/strings.xml#L222) | Code addition | Adds the `RAMPcapture Version: %s` label for the new About screen row | | RAMP ACF-1,39,40,41: datastore config | [RampDatastoreConfig.kt#L5](commons/src/main/java/org/dhis2/commons/simprints/ramp/model/RampDatastoreConfig.kt#L5) | New file | Defines the RAMP datastore config schema for enabled data-element history charts and program-stage history tables | -| RAMP ACF-1,39,40,41: datastore config | [RampDatastoreConfig.kt#L27](commons/src/main/java/org/dhis2/commons/simprints/ramp/model/RampDatastoreConfig.kt#L27) | Code addition | Adds optional per-chart decimal-place limits to the datastore config | +| RAMP ACF-1,39,40,41: datastore config | [RampDatastoreConfig.kt#L29](commons/src/main/java/org/dhis2/commons/simprints/ramp/model/RampDatastoreConfig.kt#L29) | Code addition | Adds optional per-chart decimal-place limits to the datastore config | | RAMP ACF-1,39,40,41: datastore config | [RampDatastoreRepository.kt#L15](commons/src/main/java/org/dhis2/commons/simprints/ramp/repository/RampDatastoreRepository.kt#L15) | New file | Reads, validates, caches, and downloads the `simprints/ramp` DHIS2 datastore config used by RAMP features | -| RAMP ACF-1,39,40,41: datastore config | [SyncPresenterImpl.kt#L272](app/src/main/java/org/dhis2/data/service/SyncPresenterImpl.kt#L272) | Code addition | Syncs the RAMP datastore config after metadata download so charts and tables use current server configuration | -| RAMP ACF-1: field history charts | [EventRepository.kt#L776](form/src/main/java/org/dhis2/form/data/EventRepository.kt#L776) | Code addition | Attaches a configured RAMP history chart to matching event fields when form items load or rules update fields | +| RAMP ACF-1,39,40,41: datastore config | [AndroidSyncRepository.kt#L270](sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt#L270) | Code addition | Syncs the RAMP datastore config after metadata download so charts and tables use current server configuration | +| RAMP ACF-1: field history charts | [EventRepository.kt#L775](form/src/main/java/org/dhis2/form/data/EventRepository.kt#L775) | Code addition | Attaches a configured RAMP history chart to matching event fields when form items load or rules update fields | | RAMP ACF-1: field history charts | [FormHistoryChartRepository.kt#L10](form/src/main/java/org/dhis2/form/simprints/ramp/data/FormHistoryChartRepository.kt#L10) | New file | Builds per-field visit history chart data from the current enrollment's configured follow-up visit events | | RAMP ACF-1: field history charts | [FormHistoryChart.kt#L8](form/src/main/java/org/dhis2/form/simprints/ramp/model/FormHistoryChart.kt#L8) | Code addition | Carries the configured decimal-place limit with chart state | | RAMP ACF-1: field history charts | [FormHistoryChartView.kt#L49](form/src/main/java/org/dhis2/form/simprints/ramp/ui/FormHistoryChartView.kt#L49) | New file | Renders the configured field history chart as a line chart with visit-number X-axis labels | -| RAMP ACF-1: field history charts | [FieldProvider.kt#L164](form/src/main/java/org/dhis2/form/ui/provider/inputfield/FieldProvider.kt#L164) | Code change | Displays the RAMP history chart directly under the matching input field | -| RAMP ACF-1: field history charts | [FormViewModel.kt#L313](form/src/main/java/org/dhis2/form/ui/FormViewModel.kt#L313) | Code change | Keeps the plotted current-event value live while the user edits a field | +| RAMP ACF-1: field history charts | [FieldProvider.kt#L177](form/src/main/java/org/dhis2/form/ui/provider/inputfield/FieldProvider.kt#L177) | Code change | Displays the RAMP history chart directly under the matching input field | +| RAMP ACF-1: field history charts | [FormViewModel.kt#L316](form/src/main/java/org/dhis2/form/ui/FormViewModel.kt#L316) | Code change | Keeps the plotted current-event value live while the user edits a field | | RAMP ACF-39,40,41: history tables | [EventHistoryTableRepository.kt#L20](app/src/main/java/org/dhis2/simprints/ramp/data/EventHistoryTableRepository.kt#L20) | New file | Builds visit-column history tables from configured follow-up visit events, grouped by program-stage sections | | RAMP ACF-39,40,41: history tables | [EventHistoryTableRepository.kt#L212](app/src/main/java/org/dhis2/simprints/ramp/data/EventHistoryTableRepository.kt#L212) | Code change | Orders table rows to follow the configured program-stage section data-element order | -| RAMP ACF-39,40,41: history tables | [EventHistoryTableScreen.kt#L41](app/src/main/java/org/dhis2/simprints/ramp/ui/EventHistoryTableScreen.kt#L41) | New file | Renders the history table with visit columns, date row, section headers, loading, empty, and error states | +| RAMP ACF-39,40,41: history tables | [EventHistoryTableScreen.kt#L43](app/src/main/java/org/dhis2/simprints/ramp/ui/EventHistoryTableScreen.kt#L43) | New file | Renders the history table with visit columns, date row, section headers, loading, empty, and error states | | RAMP ACF-39,40,41: history tables | [EventHistoryTableFragment.kt#L23](app/src/main/java/org/dhis2/simprints/ramp/ui/EventHistoryTableFragment.kt#L23) | New file | Shows the history table in event-capture and TEI dashboard contexts using event or enrollment arguments | -| RAMP ACF-39,40,41: history tables | [EventCaptureRepositoryImpl.java#L217](app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImpl.java#L217) | Code addition | Detects whether the current event's program stage has a configured RAMP history table | -| RAMP ACF-39,40,41: history tables | [EventCapturePagerAdapter.kt#L69](app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCapturePagerAdapter.kt#L69) | Code change | Adds the event-capture table page and maps it to the RAMP Chart navigation item | +| RAMP ACF-39,40,41: history tables | [EventCaptureRepositoryImpl.kt#L184](app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImpl.kt#L184) | Code addition | Detects whether the current event's program stage has a configured RAMP history table | +| RAMP ACF-39,40,41: history tables | [EventCapturePagerAdapter.kt#L70](app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCapturePagerAdapter.kt#L70) | Code change | Adds the event-capture table page and maps it to the RAMP Chart navigation item | | RAMP ACF-39,40,41: history tables | [EventCapturePresenterImpl.kt#L167](app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCapturePresenterImpl.kt#L167) | Code change | Keeps the RAMP Chart navigation item visible as a single tab when no other right-pane tabs are configured | | RAMP ACF-39,40,41: history tables | [EventPageConfigurator.kt#L13](app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventPageConfigurator.kt#L13) | Code change | Hides Analytics and Notes when a program-stage history table is configured, leaving only Form and Chart | | RAMP ACF-39,40,41: history tables | [EventCaptureActivity.kt#L237](app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureActivity.kt#L237) | Code change | Expands the event-capture history table to full width in landscape and restores the split layout afterwards | -| RAMP ACF-39,40,41: history tables | [DashboardRepositoryImpl.kt#L817](app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepositoryImpl.kt#L817) | Code addition | Detects whether the current enrollment program has a configured RAMP history table | -| RAMP ACF-39,40,41: history tables | [DashboardViewModel.kt#L177](app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardViewModel.kt#L177) | Code addition | Adds the RAMP Chart navigation item and only forces Details as the landscape fullscreen restore tab | +| RAMP ACF-39,40,41: history tables | [DashboardRepositoryImpl.kt#L822](app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepositoryImpl.kt#L822) | Code addition | Detects whether the current enrollment program has a configured RAMP history table | +| RAMP ACF-39,40,41: history tables | [DashboardViewModel.kt#L190](app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardViewModel.kt#L190) | Code addition | Adds the RAMP Chart navigation item and only forces Details as the landscape fullscreen restore tab | | RAMP ACF-39,40,41: history tables | [TeiDashboardPageConfigurator.kt#L11](app/src/main/java/org/dhis2/usescases/teiDashboard/TeiDashboardPageConfigurator.kt#L11) | Code change | Hides Analytics and Notes when an enrollment history table is configured, leaving only Details and Chart | | RAMP ACF-39,40,41: history tables | [TeiDashboardMobileActivity.kt#L369](app/src/main/java/org/dhis2/usescases/teiDashboard/TeiDashboardMobileActivity.kt#L369) | Code addition | Expands the enrollment history table only after Chart is pressed in landscape, with Details as restore tab | | RAMP Search restriction in a program | [RampDatastoreConfig.kt#L8](commons/src/main/java/org/dhis2/commons/simprints/ramp/model/RampDatastoreConfig.kt#L8) | Code addition | Adds `programSpecificSettings` to the RAMP datastore schema, with per-program `isSearchEnabled` settings | -| RAMP Search restriction in a program | [SearchRepositoryImpl.java#L1020](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImpl.java#L1020) | Code addition | Resolves the current program's search-enabled flag through the RAMP datastore repository | -| RAMP Search restriction in a program | [SearchTEIViewModel.kt#L220](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt#L220) | Code change | Loads the restriction into screen state, prevents opening search, and suppresses initial search prompts when disabled | -| RAMP Search restriction in a program | [SearchTEUi.kt#L244](app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt#L244) | Code change | Lets shared search/create controls hide search actions while preserving create actions where allowed | -| RAMP Search restriction in a program | [SearchTEList.kt#L226](app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt#L226) | Code change | Applies the restriction to the list screen's search controls | -| RAMP Search restriction in a program | [SearchTEMap.kt#L145](app/src/main/java/org/dhis2/usescases/searchTrackEntity/mapView/SearchTEMap.kt#L145) | Code change | Applies the restriction to the map screen's search action | +| RAMP Search restriction in a program | [SearchRepositoryImpl.java#L495](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImpl.java#L495) | Code addition | Resolves the current program's search-enabled flag through the RAMP datastore repository | +| RAMP Search restriction in a program | [SearchTEIViewModel.kt#L254](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt#L254) | Code change | Loads the restriction into screen state, prevents opening search, and suppresses initial search prompts when disabled | +| RAMP Search restriction in a program | [SearchTEUi.kt#L249](app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt#L249) | Code change | Lets shared search/create controls hide search actions while preserving create actions where allowed | +| RAMP Search restriction in a program | [SearchTEList.kt#L234](app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt#L234) | Code change | Applies the restriction to the list screen's search controls | +| RAMP Search restriction in a program | [SearchTEMap.kt#L189](app/src/main/java/org/dhis2/usescases/searchTrackEntity/mapView/SearchTEMap.kt#L189) | Code change | Applies the restriction to the map screen's search action | | RAMP Search restriction in a program | [SearchJavaToCompose.kt#L22](app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchJavaToCompose.kt#L22) | Code change | Hides the landscape open-search button when the selected program disables search | | RAMP Search restriction in a program | [SearchScreenConfigurator.kt#L54](app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchScreenConfigurator.kt#L54) | Code change | Keeps the landscape search panel closed when search is disabled while still allowing filters to open | | RAMP Menu option off in a program stage | [RampDatastoreConfig.kt#L9](commons/src/main/java/org/dhis2/commons/simprints/ramp/model/RampDatastoreConfig.kt#L9) | Code addition | Adds `programStageSpecificSettings` to the RAMP datastore schema, with per-stage schedule and refer option flags | @@ -129,9 +129,29 @@ The upstream `README` is preserved below. [![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). diff --git a/RELEASE.md b/RELEASE.md index ed20a609629..d6427abcdc4 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,75 +1,7 @@ -# Release notes - Android App for DHIS2 - 3.3.1 +# Release notes - Android App for DHIS2 - 3.4.0.1 -### Bug +This patch release includes a hotfix. -[ANDROAPP-6870](https://dhis2.atlassian.net/browse/ANDROAPP-6870) Let the rule-engine apply the logic for useCodeForOptionSet in RuleVariable +## Bugs fixed -[ANDROAPP-6975](https://dhis2.atlassian.net/browse/ANDROAPP-6975) Crash when rotating the device with the save dialog open - -[ANDROAPP-7211](https://dhis2.atlassian.net/browse/ANDROAPP-7211) NoSuchElementException: Collection contains no element matching the predicate. - -[ANDROAPP-7235](https://dhis2.atlassian.net/browse/ANDROAPP-7235) Program rules not triggered when moving between fields manually - -[ANDROAPP-7260](https://dhis2.atlassian.net/browse/ANDROAPP-7260) Incorrect behavior when creating a new event in timeline view - -[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 - -[ANDROAPP-7293](https://dhis2.atlassian.net/browse/ANDROAPP-7293) Bottom sheet landscape behavior - -[ANDROAPP-7345](https://dhis2.atlassian.net/browse/ANDROAPP-7345) Changes to enrollment date not respected by program rules \(version 3.2.1.2\) - -[ANDROAPP-7368](https://dhis2.atlassian.net/browse/ANDROAPP-7368) crash: when trying to update fields in Tracker - -[ANDROAPP-7394](https://dhis2.atlassian.net/browse/ANDROAPP-7394) Login blocked after logout “The user is already logged in” error - -[ANDROAPP-7400](https://dhis2.atlassian.net/browse/ANDROAPP-7400) Crash - changing org unit and dates - -[ANDROAPP-7402](https://dhis2.atlassian.net/browse/ANDROAPP-7402) Bottom sheet org unit not displaying buttons - -[ANDROAPP-7403](https://dhis2.atlassian.net/browse/ANDROAPP-7403) Home cards lose proper layout - -[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 - -[ANDROAPP-7419](https://dhis2.atlassian.net/browse/ANDROAPP-7419) Server selection title is missing - -[ANDROAPP-7421](https://dhis2.atlassian.net/browse/ANDROAPP-7421) Data set table not opening after clicking next for default category combo - -[ANDROAPP-7425](https://dhis2.atlassian.net/browse/ANDROAPP-7425) NullPointerException: ProgramFragment - -[ANDROAPP-7428](https://dhis2.atlassian.net/browse/ANDROAPP-7428) LMIS program is using completed enrollment - -[ANDROAPP-7442](https://dhis2.atlassian.net/browse/ANDROAPP-7442) Program rules not triggering for completed enrollments - -### Task - -[ANDROAPP-7286](https://dhis2.atlassian.net/browse/ANDROAPP-7286) Replace deprecated categoryComboUid usages with categoryCombo in Program and DataElement - -[ANDROAPP-7288](https://dhis2.atlassian.net/browse/ANDROAPP-7288) Implement UseCase interface - -[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 \ No newline at end of file +* [ANDROAPP-7634](https://dhis2.atlassian.net/browse/ANDROAPP-7634) SMS module is accidentally enabled when ASWA is installed diff --git a/aggregates/build.gradle.kts b/aggregates/build.gradle.kts index 9eedb8161a5..6243cf76e34 100644 --- a/aggregates/build.gradle.kts +++ b/aggregates/build.gradle.kts @@ -1,16 +1,22 @@ import kotlin.text.set plugins { - kotlin("multiplatform") + alias(libs.plugins.kotlin.multiplatform) alias(libs.plugins.compose) - id("com.android.library") + alias(libs.plugins.android.kotlin.multiplatform.library) alias(libs.plugins.kotlin.compose.compiler) } kotlin { - androidTarget { - compilerOptions { - jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17) + androidLibrary { + namespace = "org.dhis2.mobile.aggregates" + compileSdk = libs.versions.sdk.get().toInt() + minSdk = libs.versions.minSdk.get().toInt() + compilerOptions { jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17) } + androidResources { enable = true } + withHostTestBuilder {}.configure {} + withDeviceTestBuilder {}.configure { + instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } } @@ -26,17 +32,17 @@ kotlin { } commonMain.dependencies { - implementation(compose.runtime) - implementation(compose.foundation) - implementation(compose.ui) - implementation(compose.material3) - api(compose.materialIconsExtended) + implementation(libs.compose.runtime) + implementation(libs.compose.foundation) + implementation(libs.compose.ui) + implementation(libs.compose.material3) + api(libs.compose.material3.iconsExtendend) val designSystem = libs.dhis2.mobile.designsystem implementation("${designSystem.get().group}:${designSystem.get().name}:${designSystem.get().version}"){ isChanging= true } implementation(libs.compose.material3.window) - implementation(compose.components.resources) + implementation(libs.compose.components.resources) implementation(project(":commonskmm")) // Koin @@ -54,7 +60,7 @@ kotlin { implementation(libs.test.turbine) implementation(libs.test.kotlinCoroutines) implementation(libs.test.mockitoKotlin) - implementation(compose.components.resources) + implementation(libs.compose.components.resources) } androidMain.dependencies { @@ -65,13 +71,16 @@ kotlin { implementation(libs.koin.androidx.compose) implementation(project(":commons")) implementation(project(":dhis2_android_maps")) + compileOnly(libs.androidx.compose.uitooling) } - androidUnitTest.dependencies { } + getByName("androidHostTest") { + dependencies { implementation(libs.junit.jupiter) } + } val desktopMain by getting { dependencies { - implementation(compose.desktop.common) + implementation(libs.compose.desktop.common) } } } @@ -83,30 +92,6 @@ compose.resources { generateResClass = always } -android { - namespace = "org.dhis2.mobile.aggregates" - compileSdk = libs.versions.sdk.get().toInt() - - sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml") - sourceSets["main"].res.srcDirs("src/androidMain/res") - - defaultConfig { - minSdk = libs.versions.minSdk.get().toInt() - } - compileOptions { - isCoreLibraryDesugaringEnabled = true - - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - - dependencies { - coreLibraryDesugaring(libs.desugar) - } -} - dependencies { - testImplementation(libs.junit.jupiter) - debugImplementation(libs.androidx.compose.preview) - debugImplementation(libs.androidx.compose.uitooling) -} \ No newline at end of file + coreLibraryDesugaring(libs.desugar) +} diff --git a/aggregates/src/androidUnitTest/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepositoryImplTest.kt b/aggregates/src/androidHostTest/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepositoryImplTest.kt similarity index 100% rename from aggregates/src/androidUnitTest/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepositoryImplTest.kt rename to aggregates/src/androidHostTest/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepositoryImplTest.kt diff --git a/aggregates/src/androidMain/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepositoryImpl.kt b/aggregates/src/androidMain/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepositoryImpl.kt index 66e74b898e7..eb0086a8113 100644 --- a/aggregates/src/androidMain/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepositoryImpl.kt +++ b/aggregates/src/androidMain/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepositoryImpl.kt @@ -179,6 +179,9 @@ internal class DataSetInstanceRepositoryImpl( DataSetNonEditableReason.EXPIRED -> NonEditableReason.Expired + + DataSetNonEditableReason.PERIOD_NOT_IN_DATA_INPUT_PERIODS -> + NonEditableReason.PeriodNotInDataInputPeriods } } ?: NonEditableReason.None, ) @@ -336,7 +339,10 @@ internal class DataSetInstanceRepositoryImpl( .blockingGet() ?.let { DataSetRenderingConfig( - useVerticalTabs = it.displayOptions()?.tabsDirection() == TabsDirection.VERTICAL, + useVerticalTabs = + it + .displayOptions() + ?.tabsDirection() == TabsDirection.VERTICAL, ) } ?: DataSetRenderingConfig( useVerticalTabs = true, @@ -415,11 +421,12 @@ internal class DataSetInstanceRepositoryImpl( .dataValueModule() .dataValues() .value( - periodId, - orgUnitUid, - dataElementUid, - categoryOptionComboUid, - attrOptionComboUid, + period = periodId, + organisationUnit = orgUnitUid, + dataElement = dataElementUid, + categoryOptionCombo = categoryOptionComboUid, + attributeOptionCombo = attrOptionComboUid, + sourceDataSet = dataSetUid, ).blockingGet() ?.syncState() @@ -817,6 +824,7 @@ internal class DataSetInstanceRepositoryImpl( orgUnitUid: String, categoryOptionComboUid: String, attrOptionComboUid: String, + sourceDataSetUid: String, ): Pair<ColorString?, LegendLabel?>? { val dataElement = d2 @@ -847,6 +855,7 @@ internal class DataSetInstanceRepositoryImpl( dataElement = dataElementUid, categoryOptionCombo = categoryOptionComboUid, attributeOptionCombo = attrOptionComboUid, + sourceDataSet = sourceDataSetUid, ).blockingGet() ?.value() ?.toDoubleOrNull() @@ -982,6 +991,7 @@ internal class DataSetInstanceRepositoryImpl( attrOptionComboUid: String, dataElementUid: String, categoryOptionComboUid: String, + sourceDataSetUid: String, ) = d2 .dataValueModule() .dataValues() @@ -993,6 +1003,7 @@ internal class DataSetInstanceRepositoryImpl( dataElementUid, categoryOptionComboUid, attrOptionComboUid, + sourceDataSetUid, ).blockingGet() ?.value() @@ -1003,6 +1014,7 @@ internal class DataSetInstanceRepositoryImpl( dataElementUid: String, categoryOptionComboUid: String, value: String?, + sourceDataSetUid: String, ): Result<Unit> { val valueRepository = d2 @@ -1014,6 +1026,7 @@ internal class DataSetInstanceRepositoryImpl( dataElement = dataElementUid, categoryOptionCombo = categoryOptionComboUid, attributeOptionCombo = attrOptionComboUid, + sourceDataSet = sourceDataSetUid, ) val dataElement = @@ -1257,6 +1270,7 @@ internal class DataSetInstanceRepositoryImpl( ValidationResultStatus.valueOf(result.status().name), mapViolations( violations = result.violations(), + dataSetUid = dataSetUid, periodId = periodId, orgUnitUid = orgUnitUid, attrOptionComboUid = attrOptionComboUid, @@ -1291,6 +1305,7 @@ internal class DataSetInstanceRepositoryImpl( private fun mapViolations( violations: List<ValidationResultViolation>, + dataSetUid: String, periodId: String, orgUnitUid: String, attrOptionComboUid: String, @@ -1301,6 +1316,7 @@ internal class DataSetInstanceRepositoryImpl( it.validationRule().instruction(), mapDataElements( dataElementUids = it.dataElementUids(), + dataSetUid = dataSetUid, periodId = periodId, orgUnitUid = orgUnitUid, attrOptionComboUid = attrOptionComboUid, @@ -1310,6 +1326,7 @@ internal class DataSetInstanceRepositoryImpl( private fun mapDataElements( dataElementUids: Set<DataElementOperand>, + dataSetUid: String, periodId: String, orgUnitUid: String, attrOptionComboUid: String, @@ -1348,21 +1365,23 @@ internal class DataSetInstanceRepositoryImpl( .dataValueModule() .dataValues() .value( - periodId, - orgUnitUid, - de.uid(), - catOptCombo.uid(), - attrOptionComboUid, + period = periodId, + organisationUnit = orgUnitUid, + dataElement = de.uid(), + categoryOptionCombo = catOptCombo.uid(), + attributeOptionCombo = attrOptionComboUid, + sourceDataSet = dataSetUid, ).blockingExists() && d2 .dataValueModule() .dataValues() .value( - periodId, - orgUnitUid, - de.uid(), - catOptCombo.uid(), - attrOptionComboUid, + period = periodId, + organisationUnit = orgUnitUid, + dataElement = de.uid(), + categoryOptionCombo = catOptCombo.uid(), + attributeOptionCombo = attrOptionComboUid, + sourceDataSet = dataSetUid, ).blockingGet() ?.deleted() != true ) { @@ -1370,11 +1389,12 @@ internal class DataSetInstanceRepositoryImpl( .dataValueModule() .dataValues() .value( - periodId, - orgUnitUid, - de.uid(), - catOptCombo.uid(), - attrOptionComboUid, + period = periodId, + organisationUnit = orgUnitUid, + dataElement = de.uid(), + categoryOptionCombo = catOptCombo.uid(), + attributeOptionCombo = attrOptionComboUid, + sourceDataSet = dataSetUid, ).blockingGet() ?.value() ?: "-" } else { diff --git a/aggregates/src/commonMain/composeResources/values-ar/strings.xml b/aggregates/src/commonMain/composeResources/values-ar/strings.xml index a0ae43f4fd9..c7fe2d34814 100644 --- a/aggregates/src/commonMain/composeResources/values-ar/strings.xml +++ b/aggregates/src/commonMain/composeResources/values-ar/strings.xml @@ -16,8 +16,6 @@ <string name="input_date_out_of_range">خارج النطاق</string> <string name="format_error">تنسيق غير صحيح</string> <string name="input_not_supported">غير مدعوم</string> - <string name="completion_dialog_title">كل شيء يبدو جيدا</string> - <string name="completion_dialog_description">هل تريد أيضاً إكمال مجموعة البيانات؟</string> <string name="validation_success_title">كل شيء يبدو جيدا</string> <string name="mark_dataset_complete">هل تريد أيضاً تعيين حزمة البيانات كمكتملة؟</string> <string name="not_now">ليس الان</string> diff --git a/aggregates/src/commonMain/composeResources/values-cs/strings.xml b/aggregates/src/commonMain/composeResources/values-cs/strings.xml index 7f61c5f1b0e..3d7e271b474 100644 --- a/aggregates/src/commonMain/composeResources/values-cs/strings.xml +++ b/aggregates/src/commonMain/composeResources/values-cs/strings.xml @@ -16,8 +16,6 @@ <string name="input_date_out_of_range">Mimo rozsah</string> <string name="format_error">Nesprávný formát</string> <string name="input_not_supported">Není podporováno</string> - <string name="completion_dialog_title">Vše vypadá dobře</string> - <string name="completion_dialog_description">Chcete také doplnit datovou sadu?</string> <string name="validation_success_title">Vše vypadá dobře</string> <string name="mark_dataset_complete">Chcete také vyplnit soubor dat?</string> <string name="not_now">Teď ne</string> diff --git a/aggregates/src/commonMain/composeResources/values-es/strings.xml b/aggregates/src/commonMain/composeResources/values-es/strings.xml index ad88a405f9c..3f4f8932e27 100644 --- a/aggregates/src/commonMain/composeResources/values-es/strings.xml +++ b/aggregates/src/commonMain/composeResources/values-es/strings.xml @@ -16,8 +16,6 @@ <string name="input_date_out_of_range">Fuera de rango</string> <string name="format_error">Formato incorrecto</string> <string name="input_not_supported">No soportado</string> - <string name="completion_dialog_title">Todo se ve bien</string> - <string name="completion_dialog_description">¿También deseas completar el conjunto de datos?</string> <string name="validation_success_title">Todo se ve bien</string> <string name="mark_dataset_complete">¿Quiere completar también el set de datos?</string> <string name="not_now">Ahora no</string> @@ -28,7 +26,7 @@ <string name="ok">Aceptar</string> <string name="dataset_saved_completed">¡Guardado y completado!</string> <string name="error_on_complete_dataset">Ha ocurrido un error al completar el conjunto de datos</string> - <string name="run_validation_rules">¿Quiere validar la calidad de los datos?</string> + <string name="run_validation_rules">¿Quieree validar la calidad de los datos?</string> <string name="no">No</string> <string name="yes">Sí</string> <string name="error">Error</string> diff --git a/aggregates/src/commonMain/composeResources/values-hi-rIN/strings.xml b/aggregates/src/commonMain/composeResources/values-hi-rIN/strings.xml index 8abd1a6dddf..4ac6537b450 100644 --- a/aggregates/src/commonMain/composeResources/values-hi-rIN/strings.xml +++ b/aggregates/src/commonMain/composeResources/values-hi-rIN/strings.xml @@ -16,8 +16,6 @@ <string name="input_date_out_of_range">सीमा से बाहर</string> <string name="format_error">गलत फ़ॉर्मैट</string> <string name="input_not_supported">सपोर्टेड नहीं है</string> - <string name="completion_dialog_title">सब ठीक है</string> - <string name="completion_dialog_description">क्या आप डेटा सेट पूरा करना चाहते हैं?</string> <string name="validation_success_title">सब ठीक है</string> <string name="mark_dataset_complete">क्या आप डेटा सेट पूरा करना चाहते हैं?</string> <string name="not_now">अभी नहीं</string> @@ -72,6 +70,7 @@ %2$s is the attribute option combo name --> <string name="period_not_in_attribute_option_combo_range">आप %2$s में पीरियड %1$s के लिए डेटा संपादित नहीं कर सकते</string> + <string name="period_not_in_data_input_periods">यह डेटा संपादन योग्य नहीं है क्योंकि चुनी गई अवधि डेटा इनपुट अवधि के बाहर है</string> <string name="dataset_closed">यह डेटा संपादन योग्य नहीं है क्योंकि इसे क्लोज़ मार्क किया गया है</string> <string name="dataset_expired">यह डेटा संपादन योग्य नहीं है क्योंकि संपादन का समय समाप्त हो गया है</string> diff --git a/aggregates/src/commonMain/composeResources/values-nb/strings.xml b/aggregates/src/commonMain/composeResources/values-nb/strings.xml index 8b5aad1dfc8..e39b890960e 100644 --- a/aggregates/src/commonMain/composeResources/values-nb/strings.xml +++ b/aggregates/src/commonMain/composeResources/values-nb/strings.xml @@ -12,7 +12,6 @@ <string name="input_coordinate_latitude">Breddegrad</string> <string name="input_coordinate_longitude">Lengdegrad</string> <string name="input_not_supported">Ikke støttet</string> - <string name="completion_dialog_title">Alt ser bra ut</string> <string name="validation_success_title">Alt ser bra ut</string> <string name="mark_dataset_complete">Vil du også fullføre datasettet?</string> <string name="complete">Fullfør</string> diff --git a/aggregates/src/commonMain/composeResources/values-ru/strings.xml b/aggregates/src/commonMain/composeResources/values-ru/strings.xml index 01f9d546603..723005f01f7 100644 --- a/aggregates/src/commonMain/composeResources/values-ru/strings.xml +++ b/aggregates/src/commonMain/composeResources/values-ru/strings.xml @@ -16,8 +16,6 @@ <string name="input_date_out_of_range">Вне спектра</string> <string name="format_error">Неверный формат</string> <string name="input_not_supported">Не поддерживается</string> - <string name="completion_dialog_title">Все выглядит хорошо</string> - <string name="completion_dialog_description">Вы также хотите завершить набор данных?</string> <string name="validation_success_title">Все выглядит хорошо</string> <string name="mark_dataset_complete">Вы также хотите завершить набор данных?</string> <string name="not_now">Не сейчас</string> diff --git a/aggregates/src/commonMain/composeResources/values-vi/strings.xml b/aggregates/src/commonMain/composeResources/values-vi/strings.xml index 159448a4796..6277c585fc2 100644 --- a/aggregates/src/commonMain/composeResources/values-vi/strings.xml +++ b/aggregates/src/commonMain/composeResources/values-vi/strings.xml @@ -16,8 +16,6 @@ <string name="input_date_out_of_range">Ngoài phạm vi</string> <string name="format_error">Định dạng không chính xác</string> <string name="input_not_supported">Không được hỗ trợ</string> - <string name="completion_dialog_title">Mọi thứ đều ổn</string> - <string name="completion_dialog_description">Bạn cũng muốn hoàn tất biểu nhập phải không?</string> <string name="validation_success_title">Mọi thứ đều ổn</string> <string name="mark_dataset_complete">Bạn cũng muốn hoàn tất biểu nhập phải không?</string> <string name="not_now">Không phải bây giờ</string> diff --git a/aggregates/src/commonMain/composeResources/values-zh/strings.xml b/aggregates/src/commonMain/composeResources/values-zh/strings.xml index 9cf949ce08b..a7f5020fabd 100644 --- a/aggregates/src/commonMain/composeResources/values-zh/strings.xml +++ b/aggregates/src/commonMain/composeResources/values-zh/strings.xml @@ -16,8 +16,6 @@ <string name="input_date_out_of_range">超出范围</string> <string name="format_error">格式不正确</string> <string name="input_not_supported">不支持</string> - <string name="completion_dialog_title">所有都很好</string> - <string name="completion_dialog_description">您还想完成数据集吗?</string> <string name="validation_success_title">所有都很好</string> <string name="mark_dataset_complete">你要完成数据集?</string> <string name="not_now">现在不要</string> @@ -72,6 +70,7 @@ %2$s is the attribute option combo name --> <string name="period_not_in_attribute_option_combo_range">您不能编辑 %2$s中的时段%1$s的数据。</string> + <string name="period_not_in_data_input_periods">该数据 不可编辑,因为所选期间不在数据 输入周期内</string> <string name="dataset_closed">此数据不可编辑,因为已标记为关闭状态</string> <string name="dataset_expired">该数据不可编辑,因为其编辑时间已过</string> diff --git a/aggregates/src/commonMain/composeResources/values/strings.xml b/aggregates/src/commonMain/composeResources/values/strings.xml index bc1831ca71d..4f631732d2c 100644 --- a/aggregates/src/commonMain/composeResources/values/strings.xml +++ b/aggregates/src/commonMain/composeResources/values/strings.xml @@ -16,8 +16,6 @@ <string name="input_date_out_of_range">Out of range</string> <string name="format_error">Incorrect format</string> <string name="input_not_supported">Not supported</string> - <string name="completion_dialog_title">Everything looks good</string> - <string name="completion_dialog_description">Do you also want to complete the dataset?</string> <string name="validation_success_title">Everything looks good</string> <string name="mark_dataset_complete">Do you also want to complete the data set?</string> <string name="not_now">Not now</string> @@ -72,6 +70,7 @@ %2$s is the attribute option combo name --> <string name="period_not_in_attribute_option_combo_range">You cannot edit data for the period %1$s in %2$s</string> + <string name="period_not_in_data_input_periods">This data is not editable because the selected period is outside the data input period</string> <string name="dataset_closed">This data is not editable because it is marked as closed</string> <string name="dataset_expired">This data is not editable because its edition time has expired</string> diff --git a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepository.kt b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepository.kt index b05c6f6d4db..9ef94b10437 100644 --- a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepository.kt +++ b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/data/DataSetInstanceRepository.kt @@ -87,6 +87,7 @@ internal interface DataSetInstanceRepository { attrOptionComboUid: String, dataElementUid: String, categoryOptionComboUid: String, + sourceDataSetUid: String, ): String? suspend fun updateValue( @@ -96,6 +97,7 @@ internal interface DataSetInstanceRepository { dataElementUid: String, categoryOptionComboUid: String, value: String?, + sourceDataSetUid: String, ): Result<Unit> suspend fun categoryOptionComboFromCategoryOptions( @@ -165,6 +167,7 @@ internal interface DataSetInstanceRepository { orgUnitUid: String, categoryOptionComboUid: String, attrOptionComboUid: String, + sourceDataSetUid: String, ): Pair<ColorString?, LegendLabel?>? suspend fun uploadFile( diff --git a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/domain/GetDataValueData.kt b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/domain/GetDataValueData.kt index 806d71cba6c..db2a48536d8 100644 --- a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/domain/GetDataValueData.kt +++ b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/domain/GetDataValueData.kt @@ -36,6 +36,7 @@ internal class GetDataValueData( orgUnitUid = orgUnitUid, attrOptionComboUid = attrOptionComboUid, categoryOptionComboUid = key.second, + sourceDataSetUid = datasetUid, )?.first, ) } diff --git a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/domain/GetDataValueInput.kt b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/domain/GetDataValueInput.kt index 10e579b42b6..0ae33c4e922 100644 --- a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/domain/GetDataValueInput.kt +++ b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/domain/GetDataValueInput.kt @@ -45,6 +45,7 @@ internal class GetDataValueInput( attrOptionComboUid = attrOptionComboUid, dataElementUid = dataElementUid, categoryOptionComboUid = categoryOptionComboUid, + sourceDataSetUid = dataSetUid, ) val conflicts = repository.conflicts( @@ -63,6 +64,7 @@ internal class GetDataValueInput( orgUnitUid = orgUnitUid, categoryOptionComboUid = categoryOptionComboUid, attrOptionComboUid = attrOptionComboUid, + sourceDataSetUid = dataSetUid, ) CellInfo( diff --git a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/domain/SetDataValue.kt b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/domain/SetDataValue.kt index 5ae00192639..d92058d2c90 100644 --- a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/domain/SetDataValue.kt +++ b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/domain/SetDataValue.kt @@ -25,6 +25,7 @@ internal class SetDataValue( dataElementUid = dataElementUid, categoryOptionComboUid = categoryOptionComboUid, value = value, + sourceDataSetUid = dataSetUid, ) } } diff --git a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/model/DataSetDetails.kt b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/model/DataSetDetails.kt index 6845e8b4baa..cdd01bb9875 100644 --- a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/model/DataSetDetails.kt +++ b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/model/DataSetDetails.kt @@ -53,6 +53,8 @@ sealed class NonEditableReason { data object Closed : NonEditableReason() data object Expired : NonEditableReason() + + data object PeriodNotInDataInputPeriods : NonEditableReason() } enum class TextAlignment { diff --git a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/DataSetTableScreen.kt b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/DataSetTableScreen.kt index 6be8ccf6780..95e836b5cd5 100644 --- a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/DataSetTableScreen.kt +++ b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/DataSetTableScreen.kt @@ -70,6 +70,7 @@ import org.dhis2.mobile.aggregates.resources.empty_section_message import org.dhis2.mobile.aggregates.resources.no_data_write_access import org.dhis2.mobile.aggregates.resources.org_unit_not_in_capture_scope import org.dhis2.mobile.aggregates.resources.period_not_in_attribute_option_combo_range +import org.dhis2.mobile.aggregates.resources.period_not_in_data_input_periods import org.dhis2.mobile.aggregates.resources.period_not_in_org_unit_range import org.dhis2.mobile.aggregates.ui.component.HtmlContentBox import org.dhis2.mobile.aggregates.ui.component.ValidationBar @@ -575,6 +576,9 @@ private fun nonEditableReasonLabel(edition: DataSetEdition) = edition.nonEditableReason.periodLabel, edition.nonEditableReason.orgUnitLabel, ) + + is NonEditableReason.PeriodNotInDataInputPeriods -> + stringResource(Res.string.period_not_in_data_input_periods) } /** diff --git a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/inputs/InputProvider.kt b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/inputs/InputProvider.kt index 18190b8143c..8c2fa2a7234 100644 --- a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/inputs/InputProvider.kt +++ b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/inputs/InputProvider.kt @@ -223,7 +223,7 @@ internal fun InputProvider( onAction(UiAction.OnValueChanged(inputData.id, value)) } }, - onNextClicked = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, modifier = modifierWithFocus, ) } @@ -329,7 +329,7 @@ internal fun InputProvider( dateTextValue = it ?: TextFieldValue() onAction(UiAction.OnValueChanged(inputData.id, dateTextValue.text)) }, - onNextClicked = { onAction(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction(UiAction.OnNextClick(inputData.id)) }, modifier = modifierWithFocus, ) } @@ -342,7 +342,7 @@ internal fun InputProvider( legendData = inputData.legendData, inputTextFieldValue = textValue, isRequiredField = inputData.isRequired, - onNextClicked = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, onValueChanged = { textValue = it ?: TextFieldValue() onAction(UiAction.OnValueChanged(inputData.id, textValue.text)) @@ -457,7 +457,7 @@ internal fun InputProvider( legendData = inputData.legendData, inputTextFieldValue = textValue, isRequiredField = inputData.isRequired, - onNextClicked = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, onValueChanged = { textValue = it ?: TextFieldValue() onAction(UiAction.OnValueChanged(inputData.id, textValue.text)) @@ -477,7 +477,7 @@ internal fun InputProvider( legendData = inputData.legendData, inputTextFieldValue = textValue, isRequiredField = inputData.isRequired, - onNextClicked = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, onValueChanged = { textValue = it ?: TextFieldValue() onAction(UiAction.OnValueChanged(inputData.id, textValue.text)) @@ -497,7 +497,7 @@ internal fun InputProvider( legendData = inputData.legendData, inputTextFieldValue = textValue, isRequiredField = inputData.isRequired, - onNextClicked = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, onValueChanged = { textValue = it ?: TextFieldValue() onAction(UiAction.OnValueChanged(inputData.id, textValue.text)) @@ -517,7 +517,7 @@ internal fun InputProvider( legendData = inputData.legendData, inputTextFieldValue = textValue, isRequiredField = inputData.isRequired, - onNextClicked = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, onValueChanged = { textValue = it ?: TextFieldValue() onAction(UiAction.OnValueChanged(inputData.id, textValue.text)) @@ -537,7 +537,7 @@ internal fun InputProvider( legendData = inputData.legendData, inputTextFieldValue = textValue, isRequiredField = inputData.isRequired, - onNextClicked = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, onValueChanged = { if (textValue.text != it?.text) { textValue = it ?: TextFieldValue() @@ -559,7 +559,7 @@ internal fun InputProvider( legendData = inputData.legendData, inputTextFieldValue = textValue, isRequiredField = inputData.isRequired, - onNextClicked = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, onValueChanged = { textValue = it ?: TextFieldValue() onAction(UiAction.OnValueChanged(inputData.id, textValue.text)) @@ -783,7 +783,7 @@ internal fun InputProvider( legendData = inputData.legendData, inputTextFieldValue = textValue, isRequiredField = inputData.isRequired, - onNextClicked = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, onValueChanged = { textValue = it ?: TextFieldValue() onAction(UiAction.OnValueChanged(inputData.id, textValue.text)) @@ -824,7 +824,7 @@ internal fun InputProvider( legendData = inputData.legendData, inputTextFieldValue = textValue, isRequiredField = inputData.isRequired, - onNextClicked = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, onValueChanged = { textValue = it ?: TextFieldValue() onAction(UiAction.OnValueChanged(inputData.id, textValue.text)) @@ -847,7 +847,7 @@ internal fun InputProvider( inputTextFieldValue = textValue, isRequiredField = inputData.isRequired, onCallActionClicked = { onAction(UiAction.OnCall(inputData.id, textValue.text)) }, - onNextClicked = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, onValueChanged = { textValue = it ?: TextFieldValue() onAction(UiAction.OnValueChanged(inputData.id, textValue.text)) @@ -867,7 +867,7 @@ internal fun InputProvider( legendData = inputData.legendData, inputTextFieldValue = textValue, isRequiredField = inputData.isRequired, - onNextClicked = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, onValueChanged = { textValue = it ?: TextFieldValue() onAction(UiAction.OnValueChanged(inputData.id, textValue.text)) @@ -909,7 +909,7 @@ internal fun InputProvider( legendData = inputData.legendData, inputTextFieldValue = textValue, isRequiredField = inputData.isRequired, - onNextClicked = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, onValueChanged = { textValue = it ?: TextFieldValue() onAction(UiAction.OnValueChanged(inputData.id, textValue.text)) @@ -928,7 +928,7 @@ internal fun InputProvider( legendData = inputData.legendData, inputTextFieldValue = textValue, isRequiredField = inputData.isRequired, - onNextClicked = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, + onImeActionClick = { onAction.invoke(UiAction.OnNextClick(inputData.id)) }, onValueChanged = { textValue = it ?: TextFieldValue() onAction(UiAction.OnValueChanged(inputData.id, textValue.text)) diff --git a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/snackbar/DataSetSnackbarHost.kt b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/snackbar/DataSetSnackbarHost.kt index f79c5fbffc1..96070444493 100644 --- a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/snackbar/DataSetSnackbarHost.kt +++ b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/snackbar/DataSetSnackbarHost.kt @@ -6,8 +6,6 @@ import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor -import org.hisp.dhis.mobile.ui.designsystem.theme.TextColor import org.hisp.dhis.mobile.ui.designsystem.theme.dropShadow @Composable @@ -16,8 +14,6 @@ fun DataSetSnackbarHost(hostState: SnackbarHostState) { Snackbar( modifier = Modifier.dropShadow(shape = SnackbarDefaults.shape), snackbarData = data, - containerColor = SurfaceColor.SurfaceBright, - contentColor = TextColor.OnSurface, ) } } diff --git a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/states/InputDataUiState.kt b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/states/InputDataUiState.kt index 0cdcbd9608c..89593684995 100644 --- a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/states/InputDataUiState.kt +++ b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/states/InputDataUiState.kt @@ -28,7 +28,7 @@ internal sealed class CellSelectionState( val inputType: InputType, private val inputExtra: InputExtra, val inputShellState: InputShellState, - val inputStyle: InputStyle = InputStyle.DataInputStyle(), + val inputStyle: InputStyle = InputStyle.DarkInputStyle(), val supportingText: List<SupportingTextData>?, val legendData: LegendData?, val isRequired: Boolean, diff --git a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/viewModel/DataSetTableViewModel.kt b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/viewModel/DataSetTableViewModel.kt index 9906c538bb9..3c3511eba23 100644 --- a/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/viewModel/DataSetTableViewModel.kt +++ b/aggregates/src/commonMain/kotlin/org/dhis2/mobile/aggregates/ui/viewModel/DataSetTableViewModel.kt @@ -58,6 +58,7 @@ import org.dhis2.mobile.aggregates.ui.states.OverwrittenDimension import org.dhis2.mobile.aggregates.ui.states.ValidationBarUiState import org.dhis2.mobile.aggregates.ui.states.mapper.InputDataUiStateMapper import org.dhis2.mobile.commons.coroutine.CoroutineTracker +import org.dhis2.mobile.commons.extensions.launchUseCase import org.dhis2.mobile.commons.input.CallbackStatus import org.dhis2.mobile.commons.input.InputType import org.dhis2.mobile.commons.input.UiAction @@ -104,7 +105,7 @@ internal class DataSetTableViewModel( ) fun loadDataSet() { - viewModelScope.launch(dispatcher.io()) { + launchUseCase(dispatcher.io()) { val dataSetInstanceData = getDataSetInstanceData(this) val initialSection = dataSetInstanceData.initialSectionToLoad @@ -120,65 +121,51 @@ internal class DataSetTableViewModel( } else { dataSetInstanceData.dataSetSections.firstOrNull()?.uid ?: NO_SECTION_UID } - _dataSetScreenState.value = - DataSetScreenState.Loaded( - dataSetDetails = - dataSetInstanceData.dataSetDetails.copy( - customTitle = - dataSetInstanceData.dataSetDetails.customTitle.copy( - header = dataSetSectionTitle, - ), - ), - dataSetSections = dataSetInstanceData.dataSetSections, - renderingConfig = dataSetInstanceData.dataSetRenderingConfig, - dataSetSectionTable = - DataSetSectionTable( - sectionToLoad, - emptyList(), - overridingDimensions = overwrittenWidths(sectionToLoad), - loading = true, - ), - initialSection = dataSetInstanceData.initialSectionToLoad, - selectedCellInfo = CellSelectionState.Default(TableSelection.Unselected()), - ) + val initialDimensions = overwrittenWidths(sectionToLoad) + withContext(dispatcher.main()) { + _dataSetScreenState.value = + DataSetScreenState.Loaded( + dataSetDetails = + dataSetInstanceData.dataSetDetails.copy( + customTitle = + dataSetInstanceData.dataSetDetails.customTitle.copy( + header = dataSetSectionTitle, + ), + ), + dataSetSections = dataSetInstanceData.dataSetSections, + renderingConfig = dataSetInstanceData.dataSetRenderingConfig, + dataSetSectionTable = + DataSetSectionTable( + sectionToLoad, + emptyList(), + overridingDimensions = initialDimensions, + loading = true, + ), + initialSection = dataSetInstanceData.initialSectionToLoad, + selectedCellInfo = CellSelectionState.Default(TableSelection.Unselected()), + ) + } - val sectionTable = async { sectionData(sectionToLoad) } + val tableModels = sectionData(sectionToLoad) - _dataSetScreenState.update { - when (it) { - is DataSetScreenState.Loaded -> - it.copy( - dataSetDetails = - dataSetInstanceData.dataSetDetails.copy( - customTitle = - dataSetInstanceData.dataSetDetails.customTitle.copy( - header = dataSetSectionTitle, - ), - ), - dataSetSectionTable = - DataSetSectionTable( - sectionToLoad, - sectionTable.await(), - overridingDimensions = overwrittenWidths(sectionToLoad), - loading = false, - ), - ) - - DataSetScreenState.Loading -> - DataSetScreenState.Loaded( - dataSetDetails = dataSetInstanceData.dataSetDetails, - dataSetSections = dataSetInstanceData.dataSetSections, - renderingConfig = dataSetInstanceData.dataSetRenderingConfig, - dataSetSectionTable = - DataSetSectionTable( - sectionToLoad, - sectionTable.await(), - overridingDimensions = overwrittenWidths(sectionToLoad), - loading = true, - ), - initialSection = initialSection, - selectedCellInfo = CellSelectionState.Default(TableSelection.Unselected()), - ) + withContext(dispatcher.main()) { + _dataSetScreenState.update { + (it as? DataSetScreenState.Loaded)?.copy( + dataSetDetails = + dataSetInstanceData.dataSetDetails.copy( + customTitle = + dataSetInstanceData.dataSetDetails.customTitle.copy( + header = dataSetSectionTitle, + ), + ), + dataSetSectionTable = + DataSetSectionTable( + sectionToLoad, + tableModels, + overridingDimensions = it.dataSetSectionTable.overridingDimensions, + loading = false, + ), + ) ?: it } } } @@ -188,65 +175,69 @@ internal class DataSetTableViewModel( if (_dataSetScreenState.value.currentSection() == sectionUid) return sectionChangeJob?.takeIf { it.isActive }?.cancel() sectionChangeJob = - viewModelScope.launch(dispatcher.io()) { + launchUseCase(dispatcher.io()) { val selectedSectionIndex = (dataSetScreenState.value as? DataSetScreenState.Loaded) ?.dataSetSections ?.indexOfFirst { it.uid == sectionUid } - CoroutineTracker.increment() - _dataSetScreenState.update { - if (it is DataSetScreenState.Loaded) { - val dataSetSectionTitle = - if (it.dataSetDetails.customTitle.isConfiguredTitle) { - it.dataSetDetails.customTitle.header - } else { - it.dataSetSections.firstOrNull { section -> section.uid == sectionUid }?.title - } - it.copy( - dataSetDetails = - it.dataSetDetails.copy( - customTitle = - DataSetCustomTitle( - header = dataSetSectionTitle, - subHeader = it.dataSetDetails.customTitle.subHeader, - textAlignment = it.dataSetDetails.customTitle.textAlignment, - isConfiguredTitle = it.dataSetDetails.customTitle.isConfiguredTitle, - ), - ), - dataSetSectionTable = - it.dataSetSectionTable.copy( - id = sectionUid, - tableModels = emptyList(), - overridingDimensions = overwrittenWidths(sectionUid), - loading = true, - ), - selectedCellInfo = CellSelectionState.Default(TableSelection.Unselected()), - initialSection = selectedSectionIndex ?: 0, - ) - } else { - it + val initialDimensions = overwrittenWidths(sectionUid) + withContext(dispatcher.main()) { + _dataSetScreenState.update { + if (it is DataSetScreenState.Loaded) { + val dataSetSectionTitle = + if (it.dataSetDetails.customTitle.isConfiguredTitle) { + it.dataSetDetails.customTitle.header + } else { + it.dataSetSections.firstOrNull { section -> section.uid == sectionUid }?.title + } + it.copy( + dataSetDetails = + it.dataSetDetails.copy( + customTitle = + DataSetCustomTitle( + header = dataSetSectionTitle, + subHeader = it.dataSetDetails.customTitle.subHeader, + textAlignment = it.dataSetDetails.customTitle.textAlignment, + isConfiguredTitle = it.dataSetDetails.customTitle.isConfiguredTitle, + ), + ), + dataSetSectionTable = + it.dataSetSectionTable.copy( + id = sectionUid, + tableModels = emptyList(), + overridingDimensions = initialDimensions, + loading = true, + ), + selectedCellInfo = CellSelectionState.Default(TableSelection.Unselected()), + initialSection = selectedSectionIndex ?: 0, + ) + } else { + it + } } } - val sectionData = async { sectionData(sectionUid) } - _dataSetScreenState.update { - if (it is DataSetScreenState.Loaded) { - it.copy( - dataSetSectionTable = - it.dataSetSectionTable.copy( - id = sectionUid, - tableModels = sectionData.await(), - overridingDimensions = overwrittenWidths(sectionUid), - loading = false, - ), - initialSection = selectedSectionIndex ?: 0, - ) - } else { - it + val tableModels = sectionData(sectionUid) + withContext(dispatcher.main()) { + _dataSetScreenState.update { + if (it is DataSetScreenState.Loaded) { + it.copy( + dataSetSectionTable = + it.dataSetSectionTable.copy( + id = sectionUid, + tableModels = tableModels, + // Preserve any resize the user applied while loading + overridingDimensions = it.dataSetSectionTable.overridingDimensions, + loading = false, + ), + initialSection = selectedSectionIndex ?: 0, + ) + } else { + it + } } } - CoroutineTracker.decrement() } } @@ -379,7 +370,14 @@ internal class DataSetTableViewModel( } else { it.dataSetSectionTable }, - selectedCellInfo = if (showInputDialog) inputData else CellSelectionState.Default(TableSelection.Unselected()), + selectedCellInfo = + if (showInputDialog) { + inputData + } else { + CellSelectionState.Default( + TableSelection.Unselected(), + ) + }, ) ?: it } CoroutineTracker.decrement() @@ -432,11 +430,16 @@ internal class DataSetTableViewModel( selectedCellInfo is CellSelectionState.InputDataUiState && selectedCellInfo.inputType is InputType.MultiText -> !selectedCellInfo.multiTextExtras().optionsFetched + else -> false } - updateSelectedCell(uiAction.id, fetchOptions, showInputDialog = uiAction.showInputDialog) + updateSelectedCell( + uiAction.id, + fetchOptions, + showInputDialog = uiAction.showInputDialog, + ) }, onFailure = { updateSelectedCell( @@ -572,22 +575,20 @@ internal class DataSetTableViewModel( } private fun updateFileLoadingState(state: UploadFileState) { - viewModelScope.launch(dispatcher.io()) { - _dataSetScreenState.update { - (it as? DataSetScreenState.Loaded)?.copy( - selectedCellInfo = - if (it.selectedCellInfo is CellSelectionState.InputDataUiState) { - it.selectedCellInfo.copy( - inputExtra = - it.selectedCellInfo.fileExtras().copy( - fileState = state, - ), - ) - } else { - it.selectedCellInfo - }, - ) ?: it - } + _dataSetScreenState.update { + (it as? DataSetScreenState.Loaded)?.copy( + selectedCellInfo = + if (it.selectedCellInfo is CellSelectionState.InputDataUiState) { + it.selectedCellInfo.copy( + inputExtra = + it.selectedCellInfo.fileExtras().copy( + fileState = state, + ), + ) + } else { + it.selectedCellInfo + }, + ) ?: it } } @@ -613,13 +614,15 @@ internal class DataSetTableViewModel( ?.dataSetSectionTable ?.id ?: return@launch val updatedDimensions = overwrittenWidths(currentSectionId) - _dataSetScreenState.update { state -> - (state as? DataSetScreenState.Loaded)?.copy( - dataSetSectionTable = - state.dataSetSectionTable.copy( - overridingDimensions = updatedDimensions, - ), - ) ?: state + withContext(dispatcher.main()) { + _dataSetScreenState.update { state -> + (state as? DataSetScreenState.Loaded)?.copy( + dataSetSectionTable = + state.dataSetSectionTable.copy( + overridingDimensions = updatedDimensions, + ), + ) ?: state + } } } } @@ -737,14 +740,11 @@ internal class DataSetTableViewModel( it } } - CoroutineTracker.decrement() } } private fun checkValidationRules() { - viewModelScope.launch { - CoroutineTracker.increment() - + launchUseCase { val rules = withContext(dispatcher.io()) { runValidationRules() @@ -793,7 +793,6 @@ internal class DataSetTableViewModel( } } } - CoroutineTracker.decrement() } } @@ -823,8 +822,7 @@ internal class DataSetTableViewModel( } private fun attemptToFinish() { - viewModelScope.launch { - CoroutineTracker.increment() + launchUseCase { val onSavedMessage = resourceManager.provideSaved() val result = @@ -851,13 +849,11 @@ internal class DataSetTableViewModel( } } } - CoroutineTracker.decrement() } } private fun attemptToComplete() { - viewModelScope.launch { - CoroutineTracker.increment() + launchUseCase { val result = withContext(dispatcher.io()) { completeDataSet() @@ -907,7 +903,6 @@ internal class DataSetTableViewModel( showSnackbar(resourceManager.provideErrorOnCompleteDataset()) } } - CoroutineTracker.decrement() } } diff --git a/aggregates/src/commonTest/kotlin/org/dhis2/mobile/aggregates/domain/GetDataValueInputTest.kt b/aggregates/src/commonTest/kotlin/org/dhis2/mobile/aggregates/domain/GetDataValueInputTest.kt index b6c8a3d380f..574902e8bdc 100644 --- a/aggregates/src/commonTest/kotlin/org/dhis2/mobile/aggregates/domain/GetDataValueInputTest.kt +++ b/aggregates/src/commonTest/kotlin/org/dhis2/mobile/aggregates/domain/GetDataValueInputTest.kt @@ -46,7 +46,7 @@ internal class GetDataValueInputTest : KoinTest { private val repository = mock<DataSetInstanceRepository> { onRunBlocking { dataElementInfo(any(), any(), any()) } doReturn mockedDataElementInfo - onRunBlocking { value(any(), any(), any(), any(), any()) } doReturn "Current value" + onRunBlocking { value(any(), any(), any(), any(), any(), any()) } doReturn "Current value" onRunBlocking { conflicts(any(), any(), any(), any(), any(), any()) } doReturn Pair( emptyList(), diff --git a/aggregates/src/commonTest/kotlin/org/dhis2/mobile/aggregates/ui/viewModel/DataSetTableViewModelTest.kt b/aggregates/src/commonTest/kotlin/org/dhis2/mobile/aggregates/ui/viewModel/DataSetTableViewModelTest.kt index 781babd905d..d1a838d8d67 100644 --- a/aggregates/src/commonTest/kotlin/org/dhis2/mobile/aggregates/ui/viewModel/DataSetTableViewModelTest.kt +++ b/aggregates/src/commonTest/kotlin/org/dhis2/mobile/aggregates/ui/viewModel/DataSetTableViewModelTest.kt @@ -182,8 +182,13 @@ internal class DataSetTableViewModelTest : KoinTest { dataSetSections = listOf( DataSetSection( - uid = "sectionUid", - title = "sectionTitle", + uid = "section_uid1", + title = "sectionTitle1", + misconfiguredRows = emptyList(), + ), + DataSetSection( + uid = "section_uid2", + title = "sectionTitle2", misconfiguredRows = emptyList(), ), ), @@ -437,8 +442,8 @@ internal class DataSetTableViewModelTest : KoinTest { if (this is DataSetScreenState.Loaded) { assertTrue(this.selectedCellInfo is InputDataUiState) require(this.selectedCellInfo is InputDataUiState) - assertEquals("Legend label 2", this.selectedCellInfo?.legendData?.title) - assertEquals("#CD5C5C".toColor(), this.selectedCellInfo?.legendData?.color) + assertEquals("Legend label 2", this.selectedCellInfo.legendData?.title) + assertEquals("#CD5C5C".toColor(), this.selectedCellInfo.legendData?.color) } else { assertTrue(false) } @@ -965,16 +970,15 @@ internal class DataSetTableViewModelTest : KoinTest { runTest { viewModel.dataSetScreenState.test { awaitInitialization() - viewModel.onSectionSelected("section_uid1") + viewModel.onSectionSelected("section_uid2") with(awaitItem()) { assertTrue(this is DataSetScreenState.Loaded) assertTrue((this as DataSetScreenState.Loaded).dataSetSectionTable.loading) - assertTrue(this.currentSection() == "section_uid1") + assertTrue(this.currentSection() == "section_uid2") } - viewModel.onSectionSelected("section_uid2") with(awaitItem()) { assertTrue(this is DataSetScreenState.Loaded) - assertTrue((this as DataSetScreenState.Loaded).dataSetSectionTable.loading) + assertTrue(!(this as DataSetScreenState.Loaded).dataSetSectionTable.loading) assertTrue(this.currentSection() == "section_uid2") } viewModel.onSectionSelected("section_uid1") diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ac791a9e9e5..70a50cdb050 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,14 +1,19 @@ -@file:Suppress("UnstableApiUsage") - import com.android.build.api.variant.impl.VariantOutputImpl import org.jetbrains.kotlin.gradle.dsl.JvmTarget import java.text.SimpleDateFormat import java.util.Date +import java.util.Properties + +val localProps = + Properties().also { props -> + rootProject.file("local.properties").takeIf { it.exists() }?.inputStream()?.use(props::load) + } + +fun envOrLocal(key: String, default: String = "") = System.getenv(key) ?: localProps.getProperty(key) ?: default plugins { id("com.android.application") - kotlin("android") - kotlin("kapt") + alias(libs.plugins.legacy.kapt) id("com.google.devtools.ksp") id("kotlin-parcelize") alias(libs.plugins.kotlin.serialization) @@ -17,27 +22,52 @@ plugins { } apply(from = "${project.rootDir}/jacoco/jacoco.gradle.kts") -android { +val getBuildDate by extra { + fun(): String { + return SimpleDateFormat("yyyy-MM-dd HH:mm").format(Date()) + } +} - val getBuildDate by extra { - fun(): String { - return SimpleDateFormat("yyyy-MM-dd HH:mm").format(Date()) +val getCommitHash by extra { + fun(): String { + return try { + val process = ProcessBuilder("git", "rev-parse", "--short", "HEAD") + .redirectOutput(ProcessBuilder.Redirect.PIPE) + .redirectError(ProcessBuilder.Redirect.PIPE) + .start() + process.inputStream.bufferedReader().readText().trim() + } catch (e: Exception) { + "unknown" } } +} - val getCommitHash by extra { - fun(): String { - return try { - val process = ProcessBuilder("git", "rev-parse", "--short", "HEAD") - .redirectOutput(ProcessBuilder.Redirect.PIPE) - .redirectError(ProcessBuilder.Redirect.PIPE) - .start() - process.inputStream.bufferedReader().readText().trim() - } catch (e: Exception) { - "unknown" +val getBranchName by extra { + fun(): String { + val envBranchName = System.getenv("GITHUB_HEAD_REF") + ?: System.getenv("GITHUB_REF_NAME") + + return try { + if (!envBranchName.isNullOrBlank()) { + return envBranchName.replace(Regex("[/\\\\:*?\"<>|]"), "-") } + val process = ProcessBuilder("git", "rev-parse", "--abbrev-ref", "HEAD") + .redirectOutput(ProcessBuilder.Redirect.PIPE) + .redirectError(ProcessBuilder.Redirect.PIPE) + .start() + val branchName = process.inputStream.bufferedReader().readText().trim() + branchName.replace(Regex("[/\\\\:*?\"<>|]"), "-") + } catch (e: Exception) { + "unknown" } } +} + +base { + archivesName.set("dhis2-v" + libs.versions.vName.get()) +} + +android { signingConfigs { create("release") { @@ -56,6 +86,15 @@ android { } storePassword = System.getenv("TRAINING_STORE_PASSWORD") } + val customKeystorePath = System.getenv("DEBUG_KEYSTORE_PATH") + if (customKeystorePath != null ) { + getByName("debug") { + keyAlias = System.getenv("DEBUG_KEYSTORE_ALIAS") + keyPassword = System.getenv("DEBUG_KEY_PASS") + storeFile = file(customKeystorePath) + storePassword = System.getenv("DEBUG_KEYSTORE_PASSWORD") + } + } } testOptions { @@ -74,23 +113,18 @@ android { } } + compileSdk = libs.versions.sdk.get().toInt() namespace = "org.dhis2" testNamespace = "org.dhis2.test" - base { - archivesName.set("dhis2-v" + libs.versions.vName.get()) - } - defaultConfig { applicationId = "com.simprints.simcapture" - compileSdk = libs.versions.sdk.get().toInt() targetSdk = libs.versions.sdk.get().toInt() minSdk = libs.versions.minSdk.get().toInt() versionCode = libs.versions.vCode.get().toInt() versionName = libs.versions.vName.get() testInstrumentationRunner = "org.dhis2.Dhis2Runner" vectorDrawables.useSupportLibrary = true - multiDexEnabled = true val bitriseSentryDSN = System.getenv("SENTRY_DSN") ?: "" val rampCaptureVersion = System.getenv("RAMP_CAPTURE_VERSION") ?: "local build" @@ -101,6 +135,37 @@ android { buildConfigField("long", "VERSION_CODE", "${defaultConfig.versionCode}") buildConfigField("String", "VERSION_NAME", "\"${defaultConfig.versionName}\"") buildConfigField("String", "SENTRY_DSN", "\"${bitriseSentryDSN}\"") + + // Open id configuration + val openIdAuthScheme = envOrLocal("OPEN_ID_AUTH_SCHEME", "open.id.app.fallback") + manifestPlaceholders["openIdAuthScheme"] = openIdAuthScheme + + val openIdType = envOrLocal("OPEN_ID_TYPE") + buildConfigField("String", "OPEN_ID_TYPE", "\"$openIdType\"") + + val openIdServer = envOrLocal("OPEN_ID_SERVER") + buildConfigField("String", "OPEN_ID_SERVER", "\"$openIdServer\"") + + val openIdClient = envOrLocal("OPEN_ID_CLIENT") + buildConfigField("String", "OPEN_ID_CLIENT", "\"$openIdClient\"") + + val openIdRedirectUri = envOrLocal("OPEN_ID_REDIRECT_URI") + buildConfigField("String", "OPEN_ID_REDIRECT_URI", "\"$openIdRedirectUri\"") + + val openIdDiscoveryUri = envOrLocal("OPEN_ID_DISCOVERY_URI") + buildConfigField("String", "OPEN_ID_DISCOVERY_URI", "\"$openIdDiscoveryUri\"") + + val openIdAuthorizationUrl = envOrLocal("OPEN_ID_AUTHORIZATION_URL") + buildConfigField("String", "OPEN_ID_AUTHORIZATION_URL", "\"$openIdAuthorizationUrl\"") + + val openIdTokenUrl = envOrLocal("OPEN_ID_TOKEN_URL") + buildConfigField("String", "OPEN_ID_TOKEN_URL", "\"$openIdTokenUrl\"") + + val openIdButtonText = envOrLocal("OPEN_ID_BUTTON_TEXT") + buildConfigField("String", "OPEN_ID_BUTTON_TEXT", "\"$openIdButtonText\"") + + val openIdPrompt = envOrLocal("OPEN_ID_PROMPT") + buildConfigField("String", "OPEN_ID_PROMPT", "\"$openIdPrompt\"") } packaging { jniLibs { @@ -125,6 +190,9 @@ android { "META-INF/gradle/incremental.annotation.processors" ) ) + // Compose Multiplatform string resources from KMP modules can duplicate + // when multiple modules package the same locale strings.xml as Java resources. + pickFirsts.addAll(listOf("values*/**")) } } @@ -201,41 +269,42 @@ android { abortOnError = false checkReleaseBuilds = false } +} - androidComponents { - onVariants { variant -> - val buildType = variant.buildType - val flavorName = variant.flavorName +androidComponents { + onVariants { variant -> + val buildType = variant.buildType + val flavorName = variant.flavorName - // Apply suffix only for training flavor in release buildType - if (buildType == "release" && flavorName == "dhis2Training") { - variant.applicationId.set("${variant.applicationId.get()}.training") - } - - variant.outputs.forEach { output -> - if (output is VariantOutputImpl) { - val suffix = when { - buildType == "release" && flavorName == "dhis2Training" -> "-training" - buildType == "release" && flavorName == "dhis2PlayServices" -> "-googlePlay" - else -> "" - } + // Apply suffix only for training flavor in release buildType + if (buildType == "release" && flavorName == "dhis2Training") { + variant.applicationId.set("${variant.applicationId.get()}.training") + } - output.outputFileName = "dhis2-v${libs.versions.vName.get()}$suffix.apk" + variant.outputs.forEach { output -> + if (output is VariantOutputImpl) { + val suffix = when { + buildType == "release" && flavorName == "dhis2Training" -> "-training" + buildType == "release" && flavorName == "dhis2PlayServices" -> "-googlePlay" + buildType == "debug" -> "-${getBranchName()}" + else -> "" } - } + output.outputFileName = "dhis2-v${libs.versions.vName.get()}$suffix.apk" + } } - } - ksp { - arg("room.schemaLocation", "$projectDir/schemas") - arg("room.incremental", "true") - arg("room.expandProjection", "true") - // Enable debug logs - arg("ksp.logging.level", "DEBUG") } } +ksp { + arg("room.schemaLocation", "$projectDir/schemas") + arg("room.incremental", "true") + arg("room.expandProjection", "true") + // Enable debug logs + arg("ksp.logging.level", "DEBUG") +} + kotlin { compilerOptions { jvmTarget.set(JvmTarget.JVM_17) @@ -244,6 +313,10 @@ kotlin { } } +kapt { + correctErrorTypes = true +} + dependencies { implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) implementation(project(":dhis_android_analytics")) @@ -257,6 +330,7 @@ dependencies { implementation(project(":aggregates")) implementation(project(":commonskmm")) implementation(project(":login")) + implementation(project(":sync")) implementation(libs.security.conscrypt) implementation(libs.security.rootbeer) @@ -266,7 +340,6 @@ dependencies { implementation(libs.androidx.annotation) implementation(libs.androidx.cardview) implementation(libs.androidx.legacy.support.v4) - implementation(libs.androidx.multidex) implementation(libs.androidx.constraintlayout) implementation(libs.androidx.work) implementation(libs.androidx.workrx) @@ -274,7 +347,6 @@ dependencies { implementation(libs.androidx.biometric) implementation(libs.androidx.material3) implementation(libs.google.guava) - implementation(libs.github.pinlock) implementation(libs.github.fancyshowcase) implementation(libs.lottie) implementation(libs.network.okhttp) @@ -318,6 +390,9 @@ dependencies { androidTestImplementation(libs.test.rx2.idler) androidTestImplementation(libs.test.compose.ui.test) androidTestImplementation(libs.test.hamcrest) + androidTestImplementation(libs.koin.test) + androidTestImplementation(libs.koin.test.junit4) + debugImplementation(libs.test.ui.test.manifest) } sentry { diff --git a/app/fabric.properties b/app/fabric.properties deleted file mode 100644 index 1cf0e86e8c6..00000000000 --- a/app/fabric.properties +++ /dev/null @@ -1,3 +0,0 @@ -#Contains API Secret used to validate your application. Commit to internal source control; avoid making secret public. -#Mon Jun 11 18:43:35 CEST 2018 -apiSecret=989160e9e12be69d75ecbbf110f1b768e5909ce910ae926a63d046d47133b9ab diff --git a/app/src/androidTest/assets/databases/dhis_test.db b/app/src/androidTest/assets/databases/dhis_test.db index 3e6c7f617d0e09beb7a55ca8f443c3643e189b42..401d0461abfe0eb72283da3c987662293c88d92d 100644 GIT binary patch literal 10883072 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%0DQ-qx_8W-OAS} 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%0A`tG6kIgNQD;3FCvt%0xz<?7@745Y| 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%0De|v-i|P%^FH1l*$}dSk)ygkQ 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 z%0D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%0DFk zuHs)6Ur~Hi@ovS#iX!&?r|$&T7QW5<`42qmWzX2qZ-itoRYo@|N)vf6pnL+n8+ezh zzV_v%kE|EheZ<>;{o&>E(qE`vFMHeCca^ULKmN`6=P7IR3gxdV|9bfo3bp(p`P-M@ zBmc7Eyuzn?()z!ye`Vtd@J`^}vVWAj;I#t016W%Jul_HBkN?|NU%L7L@#zQue&YH6 z=*pvu4-Vci@U2_kS>~1>4|xn;x%`)FA6k1mc}+mx7i@fe<CEmoz@%di>OxV|*7AXE zS2J+hJPKshm0X+)#P@FFoxrNqJ$)`4-w*ixw*SlCdw@xHU3KD}b9K*XJR{AFLd$ZN zG_D*Z%U0!_x^j)jQsta;IS6~{Mg}jiU}NkxHfz8MY(uw}oH72qUclglP4KcNXD476 z7TELNtyk~Vy{}r+ZTNq?|D`SK`*hE#-#zEt`0hRT9CO5y9Jc(!NaH&3i9|%BG3Bz? zV+WdY=Q?r2L9qRBq-cyJZH-aqGVw}ln>+5NypV1iq61y7K4^`H2D$T^f)@zEI=fZ5 z#&7L43&HEe?GX_zxlGOM4Ojx%(Dna7R0-QkDoZk@cj&4<Us?r8QG<=r<v0!NRXeQy zhSe4}hOd7cO?0QVmE<^Lc9j&@i3ev}gvAz0(7*Hrl7VPJ*^U;~*NMAP+glyAigIh# zY|eQ{(Nuku35LwO#N`_i^D(E<+D$~Q_R21Ci9ve$D+YhCS?ZR9?d$)Z=qbWBk_DBj zk~MTwgI(ghh<+JxgFtzsEAOyee<S_NR=d|WSo-x*SF`&YG|{c?MU4FxJSKGP5?3xH zZ9i&=#Ei*CF_hmWu3V_j>?o1Vr)r^uGI^c2a$#alZnHW<&c?8Ko%k#xV!|EIlysq* zJlVQVykimZU>NmzLb-6c+qnMiwBducxWeX%nFig~b>fkWei`s-9T|H$+)jC}leaEy zjan7$+B0!~44H4|1u#sA9Yi{6wVmhFM0+V0t%Qe7wZpOV5<+w~B7M)elpbemokq5( zYFoXo)Hd;tYKuhl%k8hwzeEkQ{bibn8fN=TG!Zq-_FvOPr0O<tIYj~?J-7do{w3<2 z+ke3mTXn6uSZ%3I-lAXUFZq4Nu0E_<R1spS7WG&&2gOPo3zVXXSkDYi#L_-V6R~Y` zG!aYtDw>G(e1a#Uc?!=N#LX2Ei<V@%*{Kv;mh5HX=8A}!ggrGJxU~w6{W5WLMZ~y% zJnGe}g-G6enK-K=qQg@QTWh^$HZH$Rd|(mL9!w~!@%E@$_FpDGu!v}DRSRyTUGMPs zE)z#!)aggvsG%KK8!h$vb@Flm6I+T_SnkV~6T$0mf(Jp*;xCSVIZ#(dT5BbmDtfLH zpGidQ2eR>c%^n-)N7spW9wtK8`uL#h8DzrOi9;nKc4CcIrePW-YL@H7!xItPjzYT@ z&!;rH^mX#^2@&fib)=-qRBDmZ^=~DOEv{JQgNE8&t()Ds`1QBZ#JsQW4+P74Re5~< zyGc(Fhdt_GI}g%C)WLS1M-x$}-XRX`Xsi_7$)Y0H)zo$UMGgH+G*)(ANQmMpiI$dY zFQtin(YDuaY<|l^Y~FhRb(HgUB301%TvXEnq4vBc-~8gUbuhHFAj9u|iol9%9hx<F zKe_e6XN47)?e@@=cZP=XkTP=l7J(Iscp$x!CgQ!zO`6y#tI7t)AfxLvE++|5Y%;W8 zx<)2OwCm}It(DS9Z&QuR*Oamc7gxWIruqNJPl@?b`lJsYA;l_H)DxD6G!YHK<rYmu zbNq6fCZhFoxknRG2U{KxVnQSD>*Hxfa)`#~<Pl+8B%)zIc~XUlXsoP!Ck>1AT$#*6 zA}rE#WwON;iAc{Cvg<*0B0VP$Y7r6Xx$;){JowQ6Jza>HPaI{|Q9c||mD1jt>)InU z5v_vP3^cKtN!b;FdQqu!UenXWjN25dm`o~fSA9)K6VZnJnwBAkdc%4(8&yXN*Cunk zC@oscu1#i5aUQ}uj2M9xiFk(*rHObG5uu5A6A`9~cyAISMDcSF&zhHLBA)v$5Tdw# zqTaXjBIsP*|F1h3cmIFy!rK@23K0F@EBh6hd*|aj&h3wF+qXWt_3-8oZ9cg1fsGfh zzi<78YwuZmKE(TfVCCHq?eBZR*Z-YM_bk3+@jCqYU*+$qmW(@OhTG<ag{xOL9L;gu zArC0zr2?Gzkh?}WgoJ}&$N&h*C(t$WOfh$oDaDP>UF+6dJyr{iBGx88C3&hjBY?T= z@K(|pZATwxAQg~vk@py$t%)z5-2K9hsUR2Oz6}8yGXnHn;f$qWbjY<M5P(nd36OA+ z4n71b)eSX&T|$cW{G}Iv`3z^?bGUCqfclI8b#K~}Y9&nG2-gIZ0C2j-CrU#CaE=Wc z$O0!J0MC6J0@P*%2)8o|has#nYx9f%Y8^BIXKP9T1LRzSYd=a{!i`Qh=k<Z=i~#j4 z+-Mgx3Tr69Kx!0_l~`1jZvwCYxCN;AHz~9BBHXuOfy#^kky6Oz()ZlmVUQI7YT`4H zQWk*Jy?hoNN&uewHUuco2vD*|oh4JWQ!jD{uNV@}8WrHd&v^o10ialS1MWqp#iYv$ z+_%vLr5OP#Nnf*J^~B0H+5!Nnx}nf=2k}?{$aO1B50tn(_iYGJoDsmQA1aicAq1cB zOluN!QoyYxIDyOx00WfEbtW2SmismYD9i{@$+bO-s<olbaLI*db%Kbm@NGRUCY?|L z*?w;rcppwF?%NO`KO;b_p-^>O;FuGzOlu-KDZ$MKvXqG9jR>HGWZ4j}m3x_m1rWGz zLx9|j0CA%^*l_BHfx4T4gi8SfpO=f&BnSY$KWb(og8bk-_iYG}oe{w3m-`$#mrI?Z z`v5qm!NAgsstN*d#hfn%WdXu{8v<lz1gMu)x|F})Pz75Qq>3AcddTxA)HD@94~g2u zu0a}1;Jyt3(lY|Y`sPa5>5e&Uv`(r=;KD(JR3!pHF$@mgQ3&?|f%`TlqSTB4W<~BG zl-7ll26{CFM=u2=;u6Q(Q~<~vs-!0(f%`Tr@Z^jD>7ho^b{Sl4W)!Hnz)P^lqnZGU zb&yMqwHM*O4GTOmBS16aRt;<M)F?P<Rk$|?S2x%W@%>t%oLFGC7<LInuGwPXes&AI z{>rO(2_Bv7$*e(RqHgXrT?!Xqf(MN1VHG%Ma!vgR+?A^2U;-t$Z*g8~Vel3MA3Sa* z;&&vs#SO{70r%Mjd+OGVWhz>IsN&X)ERM-A0M9bGwFChmnLXUm@o)B^7pggNVGAh- ziMhTpS-lzV+YsQDGXgjg;40{JXS=o#F*aWlcR#A-1W@WGy>Kc3=Z$eg5BHP&sAafs zLx7tz0>n~rWjXF?<x=2b%1t?>Ch#OtbE<+n94-b6z+4Rb7h(IraNmXi$r%BhVmvEc zlOAg4@)hcZWg1z4yP)M=38vyA?%NO`F(W`$TeFsw&5)~_1OYU>yAZfOfuE+HTaP(U zFo|LXzj{k?--ZD383BBTn0=rrD04P$nI`UGim;sXuHgoUo==X9is1<)>`Gzbn8SS= z0>ownsJiv~j-gw$`TJ8ya3SIRVEHw|z)es@fN3#!=J3v{R57e52Gwl{5S<YKCD5MM zgdKwUjS5T;oWm^2<&G>c%l+&Ey#7jrmq3`HP{L{=0aT^qKAAYDZp{rXH{vCn=y<1c zFu{Co<V2@5D3VR9GT<NftA@aw?}*o53C{?I5+Q?N;HWT-*GY0tL+_X^<{h3ig13W; zbApGtL=B&K5UW~9a>*2<H6@laI2DGJs_&nK0wtfi<o*ALx%mH&?0#f7zq=%RuPm_h zrJc9#JhJ_T?aubyTknPZe}A|6y_?RBKiK$|4f*;f*9YtOto`Czc}=$Z47~sU+m&~& z*p~l%`8$^lOP^kP_0q+~pIA&St}T4{U*T9Fe9ULi<6l9b#{&gJ&Ts0KyE#RK+j&8s zf;n7xCIFsuaz3E1R57ta{FqOi$G@&Zu;`x483^xl<7E~@t%NL&+*B%6OrRsjeBM0% zRSSZ)j=jTpFFF_~$2Km8F$JK32}%N&FBWk5e0emkI~r`-tz}2GSK(hw%;JI*mtMhb z3nYpsfoKcId}2I4LM)PZ&~zWv`(B0G?GKwC+^;vf`;GcOWDZYtYmh;lfrPA_8s52a zwkA?cG>9Jasq*-TPpGDXF>O)xEK!G}sH|sMVA$L7AM_M3Urd10$9%552f2qi2-s)z zR0BnC%^MCHli`=D!seIyqJjN~_azL?y)2PvZoZgQ5<BJ-=J9W`(IbdRe5@Px>}G2* zqEsOW;l%?Sh-eku4vdIDTP(CJpD&NRgA$)t49nq4HQh{T8+JZh@+<(ie?gsGz$L{5 zH-5|~$>TdYlDOBcmR!l2C6_bX+qqnwl?_f-P$w6l;j<o!1(Er@c(llEdDP#jw!6xM zfbW38Rl>}rXH7wh1zbM!9gQ1rw4FnEI@IwuQ70D!Q*f&&xACJa#1{*=eA+u2S9<VF zapgCZN^yFbEhe~`;|IA%S`TwQ51E)6Jdy)v3demqh(mO?nA8$I=5yci0|(V&Ij~zj zh3qI+F*u!0R)07m<iGzYv+%_PIC;!xzPnC|-!y4D9$mPj&Zi^wO1&{)`v@$iN;KRB zsY$V5^B0NF@WgK2@phWtX1Z@lIDK5)m09Vyof^LuN);2__%WaTj_%g}o=e*)1V+ZR z*~q2fo<fsl0lt#pq=HYTO`vCs33Tk3Pk%>`@sPKnk92z>o2D5)IN**TW~GA<T{XXx zmMRv6<`dx2LQ@Nl#Nbeao#z!3=$prU{yRPi1L_?!3(kYKMzxe-1m_<}ao-@bf|FuF za6SVbEqJ-&Hb<+TgO1GtCb4)K4EVZG@#inI(4?3^M~|P&br8B+&sh(qT?~?+^X~Gq zz!1{}iV1M~m```duLsB?Xgvs9Z2Wp)wMA#v1ECUy2EJHW!;oT9N%)vgeaG)i&;tPU zK9g&<*_|FAD2AI+a53@e7vdF#kNJ#uH0-H4lWq%^&vQq^qCh3|1{5~T&mJx(dd%mz z<C_o}0c9TYGzOHuw*}lj=2P6!;fhe4l7EG8Md4#U=^bq(6tCo5Mk*fjIqr1aEQ^eE z_IM@F-X4i#KCvAiQv_9Y8}Uk>9Xol<XSU-P3xtj0l|+1QpFie1PkTp?`LuR)M?wKh z&Kc0@)-j*ej*kF@q(%`-Af1a3{9T>?a|s?k=2P1-ede^hK({fl;>UbqJAT?lVxxE^ z(s_Yy13Gogr?KPXl_2Od#4CCBzH;-J&tAu`NvIAKuVijwpxe-(b9|9oIQTFn2>t5{ zQ}XOOWsWaQ_j;&SI!wtEMxW)0IVpl}L$_PUdt5Daf1Qa~!Yv=L`f;Bzcp<s1iFIrD zn-)fknFTH~zvvHtickGpAg=z+^}m4}0C#{-e`({T+b`d~e|v?CuRqBhaIn|l{PMT% z-u!2X;Ll|hfGGZ)=l$NBcD;M=2cLhr>~DE5{NLrW2?!YkW<B-S-X^>wn0=YB`WU<r zSYG*~mHz@S1io!Cv*cd7u~dXJhp#RE=HgH8mKVQg@f%j!D-kXe!16yW|M%sOEWda8 zo0n_Lfo0Xw;nL47y?gn}(*IogoxP8;rxSbcXUqNtN_d}-peffX*PBYGDTmzX?*3hx zh}`Jz{vDc#TuJW!ZJLNY?(hCBnus=*cYmHHB7d5@KSvXhKh530NfVJj&E21+iO8Sk z?$6Lf<WF<=rwP$#jro&JqsbHTy1k=*yi+u1O?SPVCWgk*iqhS$ghJW79;1mtQ@hwm z)lJ5z<}Tvp6ck}o33bJ!uY@#8#a+bX2oV!%Yb9kHkL{ksUBp)j5o3P+=)jpw>+0#d zh>Id3x}3g(-BD<bL%zEdv_LLhF+0@Q%&xxuF5<|9erc7*<jHWj(TTh7BA!)<Xc^=h zaf=7s#|wAK39Lh-3V@g0KvzUQb{B{*eo!PLAG-@AQZ6DQAG<vg?-mh}kKF|lofi?2 zkKNus(gGnLyS;y+iO9?80*TIxV3CjA1rqc(XdHVTflfki@FG2B?<KGz5$P#=KTSk> z%HBg0k)E<2q=`sR+4s{#q^Il$Xd=>6_CA`3^pt&ILiG76rd+vG3L-ss>@*SSx#OgX zNY5P`O+<R`xM?ENbH_pxk)AtNnuzq=anMAh=Z=dI^*wFGo%9u(O{C}A2WcYGbM3=4 z5$U=1Lo^ZTx%MM85$U-$F}x@c(sOOn6GS4?bL~SkEYfrBhY3*&DT*3KkHM2e(ysnG zO+?=9tG_`L(KC@%@@6QgFlW_{QNrx4BJ-_x$uC7BGT(ZiCL)2>J3KMa@&|MMZZ?!1 zp+n2dWa&V}l&WIS*e&K>MSGbn9f&vxdh(`zpdD|uE|aAL5z|9$zLS!74f5e-vUDI~ zE}e3fTh*>x<GW0j4n#z&!{y1+A?k@5dwodji5h#oMH5kDuM>x7WLwnO>pl9HsIk`v z#C-i$%-T<uTB-wN+m(lCB5LfFhiM{e>=p8SBG6A*;-S>QC->pTCc&x^5jQr8fsKer zp!HWz>YT!2^O3mQ=$F`hBl?%vd}Er3&G%ZGh|NdBc?a6+xF?X$jz?*v=cN~sUy4Me z=cSj>M5N~>@)88WB0VonT1A9KdR`*W)zB}Io|j%g*NODJMBc5SUm`s(P1>{Rvlsi; zL_MBEdfxHf1Xd&>J@0rsO+<R$@m89M^t|I8G!f}}$6IJ3(({h*qKQb)JKjbUk)C&u zS5tvT#~x@U^IeAvNxQO7ekl_1aJZi);^A-~A=b-1gVQo}8w<#MyJU3;h(u(*U9tcm zA`)nqOyh`%%(r_&*NM!xOBNmUOJu%XvX&ttGT$y)9S{+jZ}*tgSx)=fIz^%4iXlC> zNznX&NJM&WlXqo^i1gf^jBN3jNYCv<Qs>a=4Gpptv(ApD@p~psCKAy!e$S*;L?W8T z@41(TMbr2__wYpY8HAkX@BYHx?=Sq<e}PY}{}UjH5ju8LqaSgntX_+*rtde$Lx;t6 ze~>0RYL$51;TmQviu(h!`Ova_&vR)aT9)r20||XQ<Wpm_Q#mRmDy_S8V3hd}7rFcY z$ih!9?0s_Y`}g{Lj=gKUf3f?syWhT>-c|3e$v!9hfb2CgpKO2UD?1<A`L3Pf&LcZJ z;1}@2+i%zoZ@*ycf52D&JGSauk8j<v`3I0A;OWie=0h9*wDId3@80Nc*f#E3|FiX< zUjNqhC)bthD{G%!d*9l4&9ipz>X%l35h4xbSM{q~E5Ebyp_Ok~Iaqn#^4~6hZ29fW z)#aBjUs(F$(lbj(OYx<bEdH;>UxWOE?M2Jtm4!b6Q73;7MOGnZ#8ng>4taYZR}peN z|4^9cMlo2B3kGtNm~e+^ZgbV8%GcGpjJm^OAJE(=l@ZGwq`60KzuKcHry}VBD@lOn z4yjz_uu&cK`f@C`pXRPdyLod+QHUfREVhs4wzhSRuqD}PX?-lVm*%eL4%C^NH=$HE zSZoi?o%J<`2R%hCX2%YF6MMU9?w~2*4b}|yh&s$l;-a}bYG2;%@1;g9JIn3lxm%VB z+$5Pau4<*C4@Y$Jeym#$u-p!syK5VkR8fVx?`W~ycAC4<3l_S?yd@t|u-rD9I~I=g z0{WO`<PEYGw9?$Zrq|yIsSOo}lI6D0+{T_UR?{kS7I~bN#7uKHeZGOBtM$5~DVEzr zbB|LRRnb=OJG0npbkdean%f;7>I3mYtLVc%WE1YkX>Nbim@~+|)^w}FO7aStdysUN z4%C)Gtkq??UruvZ+X<C#6z^EoYL@#kn%mL|Rm~c;-4`FR+%KcKW3j;?ZEqN}0|U$b zD9vrtkKA6p#+M$(Snfw?Zj@_=<u=gViKJF-gD4rHjKtW{)7(M(Xz0%=#<@Y6#n$oM z&ZfiZGlq2#&B9|D=IwH`GaK=+eNantx2pNPu?c~v6b%+zLvshBb-&FD2S4#Ki>;=) zofen6=ZPD~r5?+zqPd64imT8}%i}>aD~Xck4x7dyi_+oB)cq{Bg68hVjg{KS5*Yfe zEVrEIuH*-v(6FVe#U=XpOKEQJDArEr589?ug2lc;bGP(1Wu>I+Sc4{3%ZF+1QobCl zL*hx>Ktk?^Xzs4l)zg+*!J#k8Vn0Z8w}$G`Kw<3-YZCqYB{X+iX|u+gacyZVv8KJ4 z=8o5GfsVx=b@?o;O<qKES1UcI!Cx5U{TWv77t-9#Q97$vs4C9bkmY^>&E1C}KMs{n zl^;p0Y0u}mV<EdSt%(m@s)Svk8rKHqOe&{|8Ovpx*Wz+#hLd^lc{I1fns6E0gO<0a zX1O1rxm}6a$e0Lwvj=^a`?)-KudT3VD;j@JS+9FlE)}fa#bli2zMtlHC<^_iQlT#B zye#)V&23ZHT)J$j)hh;A?)zwNyUm%`MXPa}A<uH(OLO}b39H&`GLA=fmir!>yMGY& zcDs31!42u6XnWsHbC+%YY_;Wcx#}vG`#Q~Ct9Pp*UnMgN6<O|UH226GNfic$kfJSN z!K*a4SE+N4+U{T@Cn5J;G<RZ9H>Qj#r6#9fCApL4cAIU{fVwc&bYd*`6`H%3Qxxi@ zLA-AYvfP(x?ou=wD_Il{xxLJCKZoW{2fJZ;H|a6AB<y{O<_?U!t(49_Y;-a#_8m0$ zxRoy|Tfu{vyvuT5q`9*u!=Pw0<rOXo3tr&4(F&N=I$SZQqGc{uS?oQUyI)qf74oc4 z-IW-{yEJz>=doIySqMkdVzFg3cgfK<Cp~_hucT$UcNp%PvC&N$#?^F*<=&>by-sg# zXpB~LEeY-|nmb{vsz;4trZuXt*qbzWI@`9@dk2wdv&V98(A;jFFEG@^J5IO6m|v&4 zqh+r`(Q+g;2}sjRkNGv4+mp(=j9#_ZZMCr6t2B2pQpqc<(O}6Z(K;(McR(kPtD;$B zQ88w*muc>pB3$gj(o?XRSneg7dsu90YK?=sSL<TA7isQJC#s3Z_4>Slm7Dwi4=?=e zzs~o+b>qtVAFu!T`Wx4i>kqE|ueD!Yd*@nX?eVpXt6y9_S^dV<$m$DL{%+-CD{osV zuROZ4v;4cuA6kA2ZtCw}`pVKTExj3{4r-Uy7eBZ7{>Aa4d-3jtzXU;N{vLWgvpH}Z z>aJM0Zs;r8WnWsWvN#>RL1ePXzMk0~v=z!kU}O&{bUq1oW_vKQm$O#yL1&b6O0YBg z1H0Pm9ghQp*5E*booo=$)RIY><$+Xd>`8Yd*vSq7u{V<?eJJ8JraX2DcCtl4?BlLZ zt5K<XM*UENo$L`1dsUm%XRL8U(I=N+Cz}MsUiJr-reyBG=ZQ$LlU)L0j~^s`{+3Bo zQy3)J$u<FPof-%Fz5!y|$q(>j8=+O1eL}mM@%h@LOnV$hZ*v58W}}b_<ZD@7@4#kK zO0cs#h4?@|3aB%>dPahs*(zB3kzTEoRBPK=33g_$(9N}t`lwOi&Z{NZnax6}(XshG zK7(@*kYHza3wD)J+iDFGt(ZZAo!KsALaAhCR8!dXQo=C%g=F4mEl0iMgJMhqo!KyW zj4ex~8gNv?b_sT7#}Mj|%Y|A#X>x`o*qJSZ!#hlvnx&#QY?EMT_6+8Jb?i{8T9$fA zf}Pnkw0yaey`&Af)Znx-ef}kMF|upGJMNUJQ!S`kA$vlCoopKryV-6U+B6kUOVgHM zC;JA(9v&-#s(z`YP)o6sjRRt@n>|DAxD|nDkP_(3&Y@{5Sjzc9&D_*Wurpf+XJlaM zs&ny_sV~9K>>c8R%2*ez*VARG9?5JTDk0TS87U@wnSlg4vwN@~6tucXDWDum%>>N$ zVXSspmF8IAUmi)IGy4Zepc$__bH$J{CBe>YAbhrzb~p|?hZ(m7JF|lrYTSXySfvXa zq%6a1Ar5qUTgg3kmmOmXbY>4R8g=CIxN8tDNlhHgCITI<OQ0{%dycf-anMg^%E@Ao zWq*q1_Ni^-Zd?~pH6`Ya*U{W|cynJ!S(BrTlf`~5&yALje$SBY7<(?ILE`-OH8gj^ zKFU>HCU4Fyapw1Gn%ku7R8_jbz*Tj!rv+o0+aXWX`p%xa)t9r}BbqzcZlzSsVkF;` zz#h`v-B?+!HV)Nr;>KbRXzoCv7O`1_iDXvd)U;1?4}7JdGSi4ART3wgJ(@ewahJ3H zOx0k{vXXRZ?uy!P$(2o`ZlTX|cWCa6DHds{0`8ht&7S<UY3@QyX>2z0#gSg(Jh4S{ zqX1JZc9Z5t(V$rF2G5NqTok&A<*w7*D9#egU8A{CP$brZRhk<`Fk-PQG&c%2#B!Hu zZWJ4cm83*-qd-0^cai2sQFmDG0?my=<gna%nj6KlVYzcOHwr$(a%X976e)(~&d}T_ ztP9JXrnylJ7PfU#G&c&E!eT#3bED`cEcO#LHws0<V!w*!Mqxu(?pr)}-jY>nAjnmw z;zq$dSngNS+$iz}%YBpPMqx5o?j+5PVp_1=37Q)PpkTS<JU6<#M$sZz?ikIDLOZbB zQJNdYVPLqq@BarEDhqq>+w<;zVfS$NC9+?a^<;PN9PgOnp8s(B;jPbXjklh=`SH#6 z=CzF<-bidLKr}$_+E>@!vG%gnFRXS~S64o;;$8mA@>`c5Tl)Q_r<WdH{N&<r@&1L6 z0xbTEA7{9y4E!6GQp4Y<C)@#3(^)DOoa(G)5DA9!scMINs7VC?fj6K+5IYhsgv15m zi^+yNew>zq?l~%@bl%?T#tZYI`OL>`jk?Ku`0#OxgXSOfAgP<hRNH9<r`CoLRf-mE z66c30CKAVvpX6Zqr=<vXY}1Cig^s;jv_MRLX<KL}aeXLc%_Kc%{P+neTa112OiHaY zrozQJw%{W3-~cobNr(h%fnveTuabgxG|kFVYt--_=;uHSuXtHA>nDjR;>Wk7psjgT zFBj^zhOY8lXvJ*Q8liJQv0&;~N}1ZCGidTUTeqr7&Na1~d$Y+3t)65SjUC^VLiW3T z+N51E)-_vmk@*BAEV5Q5SUM?Xj;uXvwKjceojo?!9CDp>|IkhQM?wnPS*XN{`9OQr z>duGOOG68pVUx#k4w`=wh&pvnZS|(?A?qk=2sdi`mWE`%hD<h6#)e|SBrz$uO&*`4 zWy{)a2mSeSi;<nUfKNgXfe;%6x_TVtpkKkg$ZW)Y>9#MQ%mljKqF?UuDN9PfD-?P- z)ax`$nNp+I*-xeGjdm?nE#*2OGKrM~LB=4u6(5UK&qr61Dkjwxjw4)ke25KHoyBC! zc<qg>JT_9oD`bB=RefaNTgtQ>g;Bl1y}73#A*LRma8jz6)O7PW%+<udyTdibGO@T- zKJ+WozFZ;ICC}q$VIYv7N+-r564WEb1pU@=h(qV!rWL%-N;N(Pk8WRYcu;5<()L&} z4l;8O(;(;$B|QXz(nFjBE({i~RwyR;;o}1ipPzdBnOMSWOCM;v5fto2j9^6MgXm5W z2ZYbXGz&|L32f{*$iebcZ%2{$SXJYsDd0igb{aS*ok}LeMuPBEa;+%vY%xKO9|t&O zeuYEG5)n3tbW;on2PFhWgE+CX#RNKX?B}5Qh!qGLMc6pttc`IYtuVxkF>vdUR58Jg z9{V_4{-G_xMG-b2wF!j)afdiy)<mS30Edsg95CN_2pEUhU|}JdGaoYr%L}#f#RRr+ z?BQVfv4dc#2pbaNX)q*M2BKc*xCfI`#e&7%QWl?yvOxiWs1W5*$}oJffa{XNML{<B zI2e>*TrNA>;GhOyEZ{n&aOwCO6s`{BrP~*9`C<XrA%!~=1cSAM5`t^d@`8EzVuBk# zwsW}jU_mbxxtL4b0!)bvVdD7tT&h?Q*(N3OOb84X7Y3n{3&ud<^2GwKRSI_|_yq+3 zI>S?91&u2d6Wr*rg~O!>A&PvVYIBj0D9Iow1;6!?Dki|`V>1WLN4`L#1x3CPA|Z*9 zFDNwSB#x6*F{z|_Y~m{6SI>&CX?7bAJW)sXHdjv)wu3}pfiR2;NQ)-M?wKtn)fJA7 zTy^{mfU0};)pNEch#9U#k!6IMNU_i?k58Kg)l@3_n;L!YAY)f0_zl1;FduSB4ACM0 zlVSoKKYj%V%y)eR>@nE2$?h<nFWaR;)=VOmve5919O4}j=-BbgIcR=yL(ns$6@{#s zN~eX$$!r`f1z#)({g{-{cu>s*m6<|A0&EmMYPMJ~^vk3SJu|Kjp#M{bhDb^L$D33! z0j?fD$^p||(<1JFW;b^G+@`KjPt`MAP+1BWzK<XSt8}qoqDQ7CLV?H7&H{3R^6^(^ zp<%k!^66`(iV1Y&*uX*a>py~)4hkmN7#2?Wf?-4^#RQl8{=Z{kys&rQ?#pDYo%d}2 z_SWBTUES1g#Mb+3-?93km5(p~>GC~GFI&6`O#h;PufO&5JtR@-0+l~^Bp)`S&atUk z_Y~t+v(*>vmEh8cPdu*W64^t*dyS6U7HIe#Duii7#SjqD!1p(Z#gB>!_aq;==m}>H zSTp63$`-5PQ+7ToB>6Q?YKe-u+~+zj_#)IrEJ^;2QY(UjcS|c6^ybFytV-)}*iTas zqGypnX0r-Ti)R%i#f*aG?14q4Net2l4s`f~G@%rP+^$d^Y(bwrnI|ZCU0Oj;N*OS^ z-9uHWJF6gwJR5gd%YUt61z~BF-%#)?F$@QWn^7=XNgLzUU?kzfzW;)Pa@C9`P<$2z z9Zz4IC`e_L5A|}D@p#yD6*QHDvd-boI7<~1>7qCYvf+lD4|@&@N)>}Sm|`KNF}glD zO+`>=R>k?f@v3xV4Xi<JCO8<@#;umN--tyLzOHQyx`1@Ep^z0SZcE1$YtTAs5W_43 zH)$+%m|G2n75=2gWN|5Hdn2d;ry&p@7j-+*SWNLe1)qHSu8D&8EkM=~F`aC=Sx@K2 zcC$9saP>y@gr*f$r?~wTuL+z8aFz0bnMsCiiDGX5#!t=^x7qIvc&uTo<+gR?0#Qro z2*q$Np(0YKCr2Lal=9@$cS`FBGo^YQh}Q~<^vK;X4f7dI!on@+f-+ndaX$95j*pGV z7OS|=06|C0eRdruM&i`GA?H3Hxj{#cD<R17M2g9VMM}pj(mJ9eB~QFoGJ5MSPdkKl zoSs<nnbM~^ip5<2o$4qSEB{4xgy83VkZXfRJ+H6cdit{TU>t=GQf_Ste7>`VM$-fl zN&MML7o>)X5E9;_2-XTd-O8L|odoyo4@ULm*HlN9DxR<4bEFlFL`(3XLEB9QqMp(q zVX=nNp<aSl5DtozI6^jm+5$7@^hiYg2&7HX@wpA4Z5i&#(lAmMBKk^LQMTn$7Dos& zVfVbv+1ZAhQzT{^sp9zxUXoT2owJ>)pg~;RK@;Kp3ik2}UT;c4o|{pyaWD$m^-7c5 zs=a*$p)NVZK<5)>LtXO~yhB<+bkujMg7D$Yr+XkRC@9FE`%RV+x&?KNg7HE{AM01; zWk*{|L1r%HTX3o%scXK17o`<MXN{*S2#dRpyD*tmkUwgaP>|<l6fCrz`G%_D&#Mzs z3Nj1gtb(Mjc?#N}zA#bnI=>(;EIfMk>H`}K3!a0dtJKgOxDxS1F4EDby6(D`J7C6x z4T8ig;eeStJ|x9pY&DlCKm+H_e8h3mMTOH!!X0uu0|BcA-E7Y5qjCd3%jjm7!}+T0 zNvjg*Il2Z<SgSW%o<$WkpZY^W6>i;QQ~_>Qm3fT?s&M<b*~Xf$%C593jh3x!viN+E zi}hJlfmCDCtuk5grxPaMhQQ6LGH+m!R)HY-c<!I4$`en^CaRF_@uNZqLuXCTrV4)t zfcqVPs!5`hGp!<5Yp2`euXCDLs<}J>@EHk{1k^T9#amDBOjM*kQqkc`dz7!n+IFv} z6`-1htKf#7zcm9DaZGyd$VTjVWM~Q8%p@^y2tn$CdFvQo7nkLLoEqsTccDa0^pVPa z|39?wx`n-W?KyY<aQB;bAC`Su_FCEXonPL`?5uA8&~^~c1Kz#m-2Bq!TQ(ot_&tdG z_Yh<N7_Q&H_R+QK+H+QaW;MOKvhrT=0QlPSe_S>%{n^rY!fC-DEPnH%a^bT8eCl81 zFtPsVqnF_sKNt@7Wr~Lt$}ntG)p9N$ia|d)Zb8LxrJ>iWA*y)8=2v%O371yw2_p9s zqF~}M4!HN69k-urS5x)u*iwx2jEVNpXJ)V?hp}_X>`Apd1D(e0Qr0r+@tDDl9Yz87 z>X~J><>1gNm&ui5BYz&Ul4%*_$YJDM5_49Lwyd^sN<T;sj0|r0Fbuet&MdJ)sWSEg zo_ax3^rWrG8;CSs_%Jkuon#M!11%L?9&qO^N-nwAOj04pb_A)dRFHN|T{qMt{d_ar z83q~H=-~mt-pNZV`TIGrp>C?1vq$`<U{~W-#+(dr<S;ljuLLlc4NbDxT<VTcCuVS? zhk>cUXBix(TsoIRJy-(Re=cBW{g>X4yD$SBJM;nYsa<$t320E5?KCjZ;i$*JbYTWL zdFTb?`*7o72<}XE#>OPkln(BRRBDY@r#G~F!C*bFg(28tz;7OU0Q~-W;N17Jq}Y0e zR;Ps{1GR40(HphhperGVr`OY*Sfo4058Z%%eI7dJ^&o++(8*P5$j79rChfIhBHc0Q zSi!@GE`UD!00a*V)IX4e9g#S4=mgla&&sYwv5saq1~+!-0Nhi%2i4EXY;V`<9Ik}L zZz*Kk8h=CCXOQEE_Nk32h*Q@QPU23Zj*Nl)2Zh<lb}k!(rwg(L0~<TEp34?4ozm@5 zB3noxTh4{-hE=5AK&C*>k;D|SL-V<it+1pv+Q=Fb$fk248<lRG1zUqbP97QonM@pK z=^3V6y;G_ea&2S~<o_uQl*a-5>;uJHs^pM47~J^bD*%^F8D|k%7je5_#zVb>fsP)& z9H7Z6coyhTH&?>r1bMd-TSN~ZI~TC6ovK%mF&N;;;mgitWVrakJ%hmwA3h4WXP-P3 zT0?c92(@b7YCT^>e!IjD@xw;|_UvuPPDKoK^w4lF6Pv54b_$u80ls;t2Vk-Qo~2U= zn|8UPWDPl6N%;Z%k3oOpPzUHQ<`=-Tpl3L-AFriK)f<^c&1ZpEmzipB92zh+gbuY( z!^Jb#pwamI33W7D3|Vq62K9+U&AH_Erb_kw4y4A)b@vr=w1H-72p_7UhVyhmJ?etU z8C)2ODu6xv7<V=5xel7|7~t5U5`fRXfI|l?wegI{Am2Px0P@$-0}ZGLGU%y8IiNp$ z=KcXa5afQmAkhbzIzoppg*wjB2eqgVGN`XQyaA{$JhSAu52{fYWGW!{|9`Zw_mbVP z>~%Xoxcv)Tf3<bjrfH+P{#|Q7zxrpZ&sll-a&hT97Jqu-k52uR|38}e`cUOL4?Ozl zqi`(<KEC%oa1{=7HWnW6X4;;*Lm3-XxeEw5ZGr@fa83>PLj2X0LAYt4iuuD&IIW<H zwFdN32HoDm{vHzG%DIGuTwdG>G#u5DVmaLWq2lRH6nc9_hBf&&I=gv&s4S(GMQe1$ zGWl-A#brLlT1|4Xb7$5P#goI9sa66vI+vc+3QnKkUQf%5&ok?|D=F?!O8M|aE1`I* z6?!8!SF4hgR*_~=A4mrZdOou>7M~<|=Ut51Vg+}|HrrNQI(RvbTgPYxcSCT|#y1Ku zs}0--AT*)!VI@(PuMvu;TA{aWbG0f;X=Q6g+t!fVSSk*fMuFUC8s6auYlV`@W348| z_!ekZEB*p@(gO)Imx!9XmxcD$Oq!6ZQK_G5h2GrF)v6$+RjzFrkBk1CTIFZ7f&|cd z{!(F9t7(S%S*-~7+#X287kVJatmjULX0;;4Q?1b3z`0uGrL=Oob<qO6HmD3ZUnDI4 zB)>gWEmb`69hi<QfqSl2`~ZUUX|4wnW))zNam6LlM#WRD&>P0NTIHm)N^2ACRL7g{ zj<|eBvs%Hovx@8dY_VF%<%YB(+;g?!2M{<G5%D=@&TWK@D{%b4#Z#@&Tg$mxWu>(0 zj~da;K-*9k&5ZaOs9M7{%B-?{F?ZXAdmtP+^4zCr#ii~QwBndmFuig;5N_sm6Rk+` zR4eo*bgotzDXpC4vb*lhLhQ&eD?Xfo@~=TCt+--t!l$(2xlhwdBdk~ag`YtfSCAST zR!F`F!aX1qPqjjCSLbS#meQ&jb*4SRPBs`%Q(AF}<ZmeX#Cuq)Nip}P1ZyR5pRx*r zOCNW^0OAv7F5x=YRschqP$-^ih2GfC)hZ>WRdyV5%QcZ`*T<#*ro`ux&2v|H62<f? z3=;9&bK8on!YV;4VCGNA`AI}E)rv2kYK7hc&(-QlDXnbYKuR8Slua#q6QSZB4X7bG zC9M@-Ophypdv05iO@z=^9EPA3Tn3Si6v0r4JrKQFo~Kpd38d9kVITM`K8hON84=oQ z))`U5KN5njLlrA=Y}wgW7_=hHaAyJkfCDQB&CTp^JqQ=+Fxv}GQ{)nmxpN_k;Z0!S zRlG`&@|=6VCa83(S0Y^CbIDpIPt1k(10OE9bK!=HG&f{&HW+X`h*?eHxd68cbNTM4 zDnX4>#Y9u)+?>@ka7(K3p3P^GzxId5L#~V(c)rBDra<GNVkNw$QQ|EWa_S?k1kB(( z!!?oU+6IjW|IFU~6P1`_YF4GtE0Idm?~-TpQsnak^D51_BZ_H*sbVyDNU1dIdN|c| zws<;sFbB>OTHTb=>RJ5~Co>{(6cpVRxnjPdKr7^zh#g2JwBneNv!S3BRXo*-IXITk zDk-Javw0#4I}Q9=8(tFd#Z#@Oo`@Pecg)cWhNR$Lh_yn+Q>~ceUq&l(|KD2J`++_8 z?w5Aoviqp)zstT!_R!8JcLqE6Z2!!5W_x4n!&~9a|GD|DP0PlgZhY&8YW?%;uUmg$ z?PF`TwM(l%zItnQ3GV+r%U^~F0FN*I;nKG(sTY51@u|h<Eqr{T#T*MnPxyp}{97mF zv^x7n7+RbkR=C9t;Kw3eOq7b9>~b$8_?IsT7`+dsA7f9u*zB`rR7{ZLC$j0Y4&;Lx zwG6{nT~*h~=;psX<`bMxbs_D{y@sE7zs65?q@XJyOQ~fmMgsc4d}x08VWBmXC*-k{ z?WsMG)Qy5EqA};w#>o6<@BFz3i>#eEk%UjSIAl5`LVFmF>qfqgK2YR_Ec1K#6rWQp zG~lL`z{#TBT~Kv8=~|p_z^OTTS6HS(xnbhm7(dyNvht`^GIo`HkJ6u;Yh{I;+mJEP zP)vjlpR7yS!jkDk;?9g)?{slrg%ZE#&LyOZ1zW61*<#Rg$TfpeH|uiDvxP#=ecDJM zPkfQ%C#zDn2trf|jV%CoJdU}xkn6c`K?WL%g>kYX1?|q34QXq!*0mnYhvr{JvCu*q z?D)yD6!d}LYLEF+sgC88al&mJC8Smep%zY-q@X<(YYQIaH7aKBT&We(aRs1QFvy}5 zbh6pEwT1^pTkjO9`L7<<AX*_5$H{^ebf@QqU<k@iu4kMtwX{JLf<a=(PjS%vM2aR3 zOQG6pg*E21vpKKt$+eQb8j2_OIDVa!(B^Kl+;#b@rJ-W3&~om$N}?5&lQ1pu<JU?- zk6pR8JnoEX^3nOw+*hCkv_>%X@oS`@tFDmO<I}_rEVlX3ynis;in=NEtEHg*WqZQV zESjU0Q=rw-gHb(=dNSsq=~k?DO1WZxoUIh)b6b&rvBV0k7G{v+k(AIeZ?QQJXfxx3 zQ-n51PEK;e6nZEHolt4ghMGGtD2(Tun*T^+rB+U%2U5_zM7yg!C>P}|<y>gEQkUu= zP%L!oz7%x65b)d5C6&%Je+H5BFBMs-g-3<4;~oc1w_-XRD_gTYe_tJ#+lu_rF^jAc z*2Lqkl+Z<6y4N#R%Dt{?u07-$&d->I)(F$yaYqU|)=_CKO>MzpJY|^cr8|gz(u&dJ zHV4h`9?{(7tydb^mU1wzMxh%>38zp<4i_jE+OQ=hv!`ens$5#DO@2xQDTU+~0X|v? zbnLjvLDOwG)*DAkdn(mxn&-A5f78SoS~uA}-a2k@$b0}6WDUE`;?65e*|;YfD8ilY zekN6|N*hIT=2Ivp(^KrYE+u(T+aGn3<47Y=ohv#2hJ}?}cy1Cuu1T5O9`{8$r9!jV za?kI5(&3)uVz{TOl+ebgS=VqS+R1ihuF!ns4pwNxbevbDgf4UwU6s2TY{uq?zfve9 zhYS=8eWWZUbPGZfx6F`d03w3T3kSyemr4vq^<>SB9han#1Nl%c?+P{xn!;RU>HRvq z=M!WuN+GxUDrdjY*0qfKxyZcJKWk|4?oas4R!jW2AZ6%$&}*`G)k<@yI;VGVA<QJk zIbSS5=cS<C2d-SyA25xyr$xV#94&JFbhPB8>{0Cma&2>CpbO4zLj`|q%Gd*n1);N2 zLg$s<Y%kgx1mgZV_JA)<>F*aPCeY;jf53hJyLSJ2_szQo*%xI0PWIx-_y0$?8{5y> z`pK;)wpKPju<76Un~isFSRkk0x2<c|etoUCb{+Eg6;^jveq<%K{Ey4ux9nK@D~Q|w z*y0x#pI&@;;gbsk=KG%%#83FZ415F(^s#>0_Eq>SH}LU@rp7|W6Jwo-K^PD;+P*Tz z5-{MB1CJ$CEI{)?7-*?a+rJ7J5Nu8g8j1;Y>_k89JV<J^f29YLfUH+?7a@#2pjZ%E zH|;zK`Lylp6nb`?qGAFaKGAZ}{6PSM9yR+GtG{0<hlkRl%`Wm&SYeTmooJ+Nfp*37 zZ80+$PLY+uWO$;MLOx|vJcZyx_^?)12;0jOm6VlF+Z0cs`5+c7v~DW2Qc7sFDV}Ez z-E7!Qp+YDYI-Noa8SRPZAp@{fr-NbvSuTZ)w#4(0_58^wYYpKob^PR|Qieu5;`zf{ z`UFug7pB>h8&c4xZHWbw>SsR@P_ZxwAC`hXZA(1G;2mBh3^Muhjh;NjLDL7SXiH3e zzX-qv-eraXhGL-&ALM}feJdK>XiGe=4RzdYF*_wev0#mtNLd5zi08NA?8m8~i(dFR zO`p7&gXSY%A)(Qh*jazLnQMdB|9-#JDRrd;g_n7AiUrHONXjy&?2AP?r6(w1w-!Hn zp_FA#+ZPMaI^E2t6Dk&jeu0$Gr|gRb2)%aZ>;)AI$j_HTM*HG<9ff!TF<lUf33B-4 zc^opmz&MkkzC&I0rxnGSPp_$Dx_QNdzz;|Xe9CTniYz^5^um~lpFEdCrgsQvw>`IK z>!hs=#e&fHOA0-IyFC?pHnJ)zCdl!VeJP<&+inXOkWol#q(HF%eV-KcY1?f9TF+fk zvy%uE3--8I${wd|w*_Q_^jZ$Zg3$L!34PjjTY%Q_K_!_E4aEdHd~!DjO?T)}YLu{7 z-J^gxB{_)o{7YB{7K#Pf>r$}BP`{Dy<!U;AO0t>svj_Tu5>PCd_?nc7QN-@K16#UZ z=*50<Rm#Mt1?-+mr;(mQHIwa9_~b4rTcCj5l8cjGdisQ7!4`K)+2WLd-BW@2$U1D} zsU`x)Pp(MW;<SL>0<=zgZve$a==jNHDd^Jzb_>vYKE?nmH3SnN-{>dLk%B%gVD}Vy z_PP!g3(%LOpi#i?xs#}#_xEL`R!nVuhZHo5*gYSbbHbFEk5toH<DwMwX(79(n)AW` zSgF<1X1pK;eOk!wDKsC|k%iVyCZsL+9`7tKF09+vU$QP+`_kH{)_!#DZELSxORZVg zUc4q-{qpK(R)1pk9ji~lJAdoyi&nQ+{%YknR-RdT>&kfL*2?31zrXj<z4!0EX|J(& zu&3F(Yxf@@i@-0ezkZ{%;el8IFWtCf{cqMkx1L@9sr7g6em}$)DDQfA<-3<;e=GaE z?5Ab#lD$EelR0D$%650Yyz}XuAKQ8R&TDs`+%fOGU}tmtFSb9i9AAEP`8$^HUG6O} zZXa*IWqY`NbNl7n_iwLk{qfevw?4S_?OUC#=$2vY?#+LONQEC>d0_chR@OGZxcSSQ z@7w&A&H83=Q@wfT#@}!J?#9n=eBYeYh<_{of7b$cuRQR;lF#NgYxS-=1W#!CbMi(Z zruN6O`+q?b(?e~(lahB0^5OoU(?o}-7Pi)U&1_u0|7SGO9!w~!@%E@$_V52GP0XcJ zE{L4ob!&Y4e?k-E`thh&uNESC@BSYXVj!e!kCOSk*PcqKD<*v<1QC(%`z%dtWy{fI zqil8SL-&1#CI(IIVk1>I8Kau}K1~z*_F>Z<^;T-B*nOX(iTTvn>{N~liAw9fPZFY5 zt<we*gP6Bf>ol@ORom)yrFOoLCgx*KBjlxzTJ4pcchJO~cN9(4N10&Ayz@OY(XH)8 zjQtkGB6sY3FHN+Ua?wh7*i<_lJMSh$^|+?ZI-MF<z8{6G^~PkQ7|QQ`i6*w%y|%&9 zuaCN#y|2*3MzWw%RkDU|YOwd$G!f~!_cfY`^xXSPnuzq=`zxA=^xXS0O+<R`ef2u@ z+ePmvCl58erJBNr^n4yoLu$T&rXejKplL|S7tu7N<NY)ZsrX!)hBSOWO+yO4kXPP2 zjHXi&W5%BDA^l``(nO@7>?%z}8p^KFM5LnZI!#16%AP|Lk&?2@G!bbjyNf6KjO|vx zFpdW*k@nD(cZP=XkTP=bE={zxss*>vu6Ou*_sVEuKO8B7<Cd*4>fF0S6FX&9+29yt zbe+b%+cXhPYxi!^L=<!V-c6cVv?SBbPNmqgWbfUeiJ62wH5|CL3XT2Vb()AK#Cz9h zBAO8IU8RX=&bxPo5L0Tuu5NF;q6ySXR=$Z4Ly<;nBzNb^xSQ<l(L~fu_Ab&y)J^s# zts=srZnAfY{w3-rdy`fXe~G%u-lRQ6BI+i47id_d=iVKJcu+9Z>Yl);??Tcp{TfXy zx|2mkuB)l*`b(dniGH2G<o6Z3`mk#0R|(PM>1We}yvJV0qikY6k%-JEo0v}|B7tNR z^NB=cKH0>4A`zKSHZh+_MCOxC%qJ3&`D7FGi9}>R*~EPIVMga_)><tK(sTFch!I30 z(sTD0Xd=>c_h)G$(sTEhXd=>c_orzh(sTD`Xd=>c_vdLM(sTD03DJ@ss<U!eQP&;y z3O!XX=<^qJS0_y-68i~<PGQW&d_nisd+A@cZ9$*e?oITv%Bz!+E&j5VNI6yE&NyHV zU!6=fBC%14>dHMgWW4uYC9|eaB-XlPkH2ZEcAd_vlU5Ol<#DA`*Hw+mROTv~snIX< z<!r=Y(^~6=&{Z<WBVxL$vwGb_m(v-(I_b9}Y&xb%hFcYL*fF{~>6#)jUd~tw%8I|% z%3meZID(BAwW^`KmbYmdSIO#th*7^YZtb;9VUzRfWY!d6qdu>8+z43Bt?X5@T%lh^ za`J-OSyDH=`m2-GLHuPX<*=&sL7Q!mygKRBBJsfOlIy)yx2Dp*IvGeJF#y5qqk2`^ znKoRV3?xK!dQ2*N*EuM;u1*G$Nc4HTqrTZvvJZ<_@1uKyd#DQ;eMY@oF}^xkI>cYP zYDsxbA5;|v#jE@DFP*l6JLT5bLQTunyJ@1sa?q%Ew8nheb9J(=h_IGaJ$#@U%3~Jy z)ob)Gjh#%hoUfFvmCn_B2vMi)YT`+cxoScqd*`h*5smDfx6wp2vUk3VCZdtO^B-v< z8reH<rio}|@4SU3qLIDx-82!6?47q0qPWq<dcKP$Vm<#8O~iV>lidF|MgRXtWWOhS zqwL1cr*>YmbN}{7w=3Hhw@$X=oBz1^?oG$WUv7NIhHm}$){oX-y7rm1@!EZ>A6YH0 zURe3jl~=ATEx&KsxAfJew}Jov=NDhM_<ZpHZ_*!@u@m04gTGWlak<eQ8+D|}J+<MZ zVykBk=y0)cY9xAgAmmf7*rpg7{*91uNP>$Abo7Mx?BK815cJ$DHW6Xw)*lxOGK-EK z2pC<l(Z^9!4E4;lKQ0!a#cYcR`jk7iDTZdoX9O1$==2GnZIQoYL(sQ%$0nljk5yTl zPZOD(@Oc;Mjxzs_O+=n?5W&TQWuBa#reX2t`<_iP)Czo#j*AI&?1ay~NDDpxj%^B| zQDX-&Tr42-sTXPF`FCt0gdX4C;bH;#7H19`dH!YC6apgap%YPDEFg=C7m=aSW!T)Y zK66tqA`3V5v6GvUGS9sW6Cq~aw%}qx=A;xdx(k~xvt$dxOL+k~A%%>t!sa1s_=x@N zP*DoLt0#QgMgGze*%{r0&7DQGGp|La=73@%bo@k2x`?1pxeA+NsArDiaj^i+Ctaka zMwd%-rPipVyR>S0Rmvw=q`Ne_U7Bm^nYR&Bp*6zWi0}!YP?5jCL-s(IOOl;HGvhHW z!U`VKu@gR%A}#Rz%cUuVdgf*j7ZWRoPsALGNZ^3mWNX_Ck&$xdeqj20l30iBa)M7% z{DjY;NH^XocUDtq)y(Y=E*AQQm_!jte9E2G6hk9DJwveo%_mW$r9S1(N`!{{F!A;W z7Zd2%37<!iZb5WsHLuI5XCBQ=k)c=+nop!i3w_F!m54Fp(2R=(Xg--D4SmX$)f7WB z<Is$Y1!z8dA`N}Ym6eDw<AsTf3G~eq7dMgeNlj4)K`%(TSb9{NSrJCsCK|!XJ9fgS zQKTDk{xi}kvYJo(%8VH(7EHn?Qshm7T$4_FMmoL4n^|e6kD&D$!D0Hu&Y6UUKJ6Ll z6nfV87!?ar+oYh;Gg5k*7R8%=iZO*2(kF*ctQ<7$41wN};>lEmoqaPig%#e+#7`_z z5~Fvd^Cg~ra504z9$dsv_<V}Aolkp6I>ngjccL;vzYCx6SrlnwpogTAK52SL0W8i- zBCKxe!og=t<hwKKbf-Kd6$O^IzTi9>KY3ir%%?phokGuMzedGEpA+*VBB4)vNGf3H zX8r$Bu>j5IN2FWuw1=cq3~5vAL{mS;8H6@9dPqtw0n^qp%xsl#u^=>`ACVUNw0ER} z(0Y}$3$|+F<Vn8&-?#vG_`cn*?S9X$N%qIGH^~$`zqRw!&hxi_ZM(C5*VfN$rMK2M zKe&0Y@pl{V*f6dC`TDo7YuEnU+S6+{RzI~mT)lVYBP->V3(G&g{Ho>UrS~oQ7QeRm z_Qh8${K3K->F@u!{~douboww4Rq$YQG*Xuw?zFZ7PmRp3()7_71ipX-7ZCKz@CYBO z52Cqo+d-+~iTR!pojwq>b(9ZBRHd}H<`O0ZDU4@<7M(s2^r#y(wBu@{rCvWbbnF@4 z>4Wc12-=qLc*}vHd{Aply3?73jy=PNV4#t6W4+c`3~Dkh;eqctki{4bNallK)aME1 z!sYI{WsW~1#$Z6m#&~aBE_gbo(e%0EnT3u&BgSAr(4&^36_)$5<wWr7XhSgu1A-35 zq6fXoAf;Co&)bHPXZRQld_GWw+=qkO_@L_<WWqwwqO*;a*fU}f283HTsUsy-rc#TP z&MR^389oRD-|J9@&%8PAHf1wPovAxPhNvhgZzrUDfcKR!2&Ib2_>MiZKAm_Ga@7?c z8mvi0wxXDaY~XkG3^Ei8$ZJx_Q9vArg2TT5KoVIExt@gFB}f%gEX+x()72AgVo%u& zPWPGMn1_~pTr5DZNI{>n8JuFM`Fy(U7FH*GSU<yuVc^>kNsTsx6MHZa8aej5oK^_M zMCkA{d=v)y!y4@crGF1$E5z-O2&<VaZ{cV72n;l=H{x#^8}Wl^d}dcB{(i=N6&DNr zVqw}ZkR8w#bFLj`T>V63(bbO+zQ8Z_2>Fy9rij6(;bbkZpE}0!(HCf2%-Lazurm*G zaPh<zCw$}ux=+mCVTuql(GhU*q$8h*fftZ1PT66K7+e&_sk0_77NEtz3kdp@9p)56 zJ@Wzu7YopQ;03w`PuXFL7}6sfKBELv^N|;5Q_tUFPLVYR>2YG1J`xlIFCcrIvcsH0 ztEJC#pjfbn7<d6epYqgm3a#N&WU)QkFg+R(11})xQ=WQGq17|4@3>fynh(4{x8f;J zJw*)ZqkOe`dJZ5)UO-Z#r=G%ogV7u&52<bq#YF1xNr#)4=pi0*7xi+R-5GT|C4aA( z`5v1p0>whVYfDXc=n3iE>5ku;GkU;|T`+S?YOO*~J?GnE=39L#Gz7sDY|)gmMKjh6 zY7N<3tJIfXQFQZ)1&R5X3v|aoPe|uWJQEZ_lz18x;e-#jKtrGMhIERdk)D*GSddzb zw}AQ_dP6#2>X|RdX^m>(3o?Gf$6KJKMvqA6LTmXb!c6agVxbB7fD3eY?izd%Rj3u{ zXMFgGVk(+u<|P#_Ca|#+G1vk!#{9>rB7{Qv;z2R(&U~;1+7_ogPMt!lrLPE}Sg-{j zZGpChSLHDHtlpjpf+tB$4I1gwWhf@Fod5rmtNRP!tIv7t3;z1xt-t<y@Y<h!74Vw1 zC)P}B&tKbE{qxmdTm6yMH?Iy>ldF$OzX3RpxBsk%|LQ*L<Nt4-{c}%H{*CZ&7Wg*{ z{0m!vcb=+xjh37`(JWcB_yvfACsvv|chsSe)LJ>@c6Fgm6Or51g$7MT?qwIcG!eO% zU8vDS<X(26P7{%P*@YHOMDAr5I)qqvR2xOx*pzgm6U=MhOcMvXTz$|Q4-InXwKvej ze%M+mjr2CvsC@0;F+}lv>e^E@u@h^wG7ZxxQL|ioJxy#o3hi1vpVH{k*A8i7HIuR{ z0`;O&=e+htnwW8$LKTxq<?X7kJxvq+6@x$6EOpDl_BG;6UJ;Gp5A}xiYBs8l6s{f7 zzw`x?foMV5juzF|zJVs9v*l~wLK7|Kh$T5}`G=9lwQnTEtkZ3Dmy8u>5c&13T4*Bb zV5>Hoh&tG+nI@tRwmRvzVx6dits3cHq7JrdqKT-3ty*a!>R_vOLQL3lvHHksj2<98 zmnH&<M5O1Ei~nWyAe2jJqd`M5h3dTYVVa2Qy!0c47_b*Ywp2wMwV>w{cam;W6^ZEi z#GRy@AR>CQaVKd{L_}{Z?j(H(5z*U<J4qixMD(`ePSU9n5xuRrlXMeAL@y-nBx3~; z(Zh>7$q+<D^zh<NGI$XYy*{~<4Ew6LWsU|M%>%s(HJR)a#I_<4HJR);Xd>#GGV)ph z!J@7y`xO04)HP+lLK9Kfl#!<l2o`k{*{{>TMBPO8NkX&@%&CaS7fWi<+;`<BLlmzC zu0&}fI)1+rrithb{Yr=?qRW>n37UxRPp-siBDzet5}}Fc`s~UrnuxBFt|Vz9n!&ET zk|v^Smn$(sG#(r@HA!VNieIAb{3cCA-DKzUG!b=^ozK!l)J=ANn<k=evh!)0h`Pzn zXJ{hoCOe;_iKv_G{1zc<n+|u@r}DP&Oua)E^r}e2dXkkF5wV_R%|=A5Cs~#e5$jo{ z1;TogeFFL=*0V|f66;AeE>+Da5Vo6prO+4+`<+Q+i$tvFq~D4}tmkB`h(xUCWR!_S ztmkAPiA1dDq{oXytmkB`h(xR>>G73zI-IrC?VV@|>A5o5gNa0>=SrV9ANnQIb7iuV z5`T&GTp7~8M0&1FHfZ86k)A7)?W9OVdam?nSfuC5fDpx9D$?^ple_<a$wGBu@B8;m zyPw^C-R=e1kIUja|G4u5JHG9&Y`=B;6<dF_^~S9Wo5!1Oi2nE1jYrmhbG@>DY3&1R z2diIM{qEIQto+H!n^qoL{`B&zm+xIVUh*&gx5YOuKDh8}080HmakLD{3}1ZaWQIDO zZr|C?K^EcceyEGG88XRvl1EEW!`ZX_Lgo)0oOa692X<Z0UR4h?t`?Ic=jPEOfS)}_ z<-;n)4G4$>H&wxgMyD8+waHAKK@S}*0Q%YUNBSRj7@XB`Tp8DfJPc~>@F_sGp4sF| zxm>YtYL`0QMs+{XZj^JG?!K*5D0Xx0s3RZA#ha-?&C1mG<l*a}z6Z}-pF3Brj`q0* zHaCj7dS&Ds2Rmhh)?{I-C>_2Qs(9?oRruT4da9nu?H8e%D&%(F&kZ3ESl6f?+8m=& zE<WlobtMm919hFfKf&#SMx|1!G{#=QQ!i+Wo-}K#=;5mY{OoC3EvZ4N+b}e;`CMNa z9%&e<BZp%EK6_efIF;Ab4fRMr-wbz#K?e8M;RtY_e`d>DQyu6w^?h@ynX^ayreIg& zR>qtRe&TQl`1hO{-`j!~?Nv)Qzq%7kxU^~yD|`5G0NCe9wX4^lRJ)AG(ZfE#p1lo2 zFq_p-s$B*+cGv^pv!~j%q>9xP&Zo^F-#Y99^4VKau2=6vpWas~<obXzGw|3umBNsn z$RdXwz(0HM^FsdlOs*Uo`SbBYPRq!hKWqc8?##V|ScEtD<AomNWu~%8GZjS+Tjx?h zufCx`xqKPi(qR*D&pvS}lKVQ1d|#(h?5kD#5ENLquheMvRqb9dSkG(QodLU6J$cxG zy3Rfi>$HY_ODdmlWJ}e3OB=1Vj5^7~I#hA?xe?Y{&QV&6*IFiX+s(rofS+TnRcdZ% z;Vw+CM{6yE9y+W7`Z?Cx2hm!~pk@y%fT}uk2Zd`J`F^-DYIIZk#(u8eDRs~i%T#mo zuzW7l*i+TiaJ27D;nkHv?;n-`J$7a#oON!BPjyR;daAl#?A22B{dTU?=(RJs&OZEC zs*r1=rIx8Ud02#s&)%K1;Ao|R<yMK7S_V9NSOD;|Pt%T6x|>5wEdv}m%meV*Cp)=9 zp+`$CgBw500q*rPH-kOZ>*neOw8}EjiNh>FpM8}Lv~%4?yOct!EQ1|B%mDT|R#~kU zt+EVk<S>0MD;v|fDq3V2-1uSYd{%CZprh9YI*r?<tYy^WF#~<;@JWC^-zsZRX!dpR zh!w4}41VPBiF28RT4fpB%HgX3*Le1hM@+(5{P8l3`gW>W%I2u0mZ>drc<WqR=+rlK zXsKmzONXxn-19B9YVCeZt=ZS8_u=kcyRTHs_Z4WVW$Jq3@FvuC_ODunUZ>wT7h!@d z&VJQ0H6#v`P{Y|rEEo4#p;D>Q%*f;u-P(TMLU-|wh23A^?(2o9d*VI(QgG#X<t;12 zm76OsU%7u}W%-YnKfe6I<!@i^EJv3O%XcsR^U@cWetGGAtFK*sa@D;0W1Hbk-By1q zvGua8`?i+2NPdfVEWUKnvv{=o1&HtW_MIP-Id=bHv9$Q}i{H0&=i=Wl{w^2!PnKI! z@4Qy_;O56Re{l0#H(T55TYt9ot6M+3^_`GSu)cY1;~zJEZ{wFX-m~$>jp~MfL%DHz z{eP_g_WIAR|EKkDTraG<)*oKKu=drp-(35twRf$(VJ)}jSbK177h)HFdh-wW?%LC= z{Kd*AR$s8Xx%zh58@699b8LTN`xxR2K2MNz`&HXU(EaV(-@UNFAD6feYKC0bsL0wC zX!^fME@Ti9b&QJ!`j=>axcG8HOvFaUMA(}>=ocLJQG4JHjC1A1x6!{ulh(yo(7!~) zMG}g_CBmXQ7fH+rSKT^L=3{+b-iM~{Z4!?I5m7JMCXqZaQT#~WzMlvr!lIG5eVGt_ z+Ndkn@g&Mxv=qrcME?@0vVDyvB2~7p5~A2DNR^A^$_lj#QspAKmBK_(m5byK%_T~U z1d{zAtqKxI_5qrRdV=f+Xd>!EvLB|2XdfUW_gP3Fv@FVgi2fxyCXt=cMD#5sdml|i z8++OJGeq%#NA?U&L?>jjAESwA(=Gc^nuwM&+52fC>O->k&_tglK9Fasy>VzDdoN8y zTXNZd=80~zEgDc4#+ptH3AFH2G!Y53K)NRSCE9{7`~>|=WP}A0$_aHaB<;mViL_$B zMbch$(nK^?E|RNOEKtj88>jSx^uV|<F`o#F%y;n-T3Q6VK)MNnMFVN!nEoXiNDHJr z(J#?%eu4A^x1sKeh3kgCqKyX98ksN<5e=j@GSwg=>bGkodZ1h93k)^!j?-;Nuy^v& z0}&0OUZH6S^e&>LsxVgTo27xXfG}m`w$v>W5vYvZmLeh^^RK00@t7y~$>^7O%#$l) zM8spBT>K&;9`ocT8WEA2GUAhfh<MDuhL#p}ciEe0BI@q4Z=;E5h{?W{CZZuGBiGbO zAk=APucLp7Mv;toilASjQ6&5K^e<6&mysKH^h?y;W#q;k5m9%S5&r;86xR(Ixf(}f z9vR^xaace^WQ2>4@zSD|6*bxRoiq_O+4d!dC{EMc570!^WZN&`iD={^^DX=&`K36O zpbmDCcx@n6khB+HM*k8?dr{92MQJY*e-8wUq`l}SzZAC@Xq0U~hbE#?wtXK>M5An* z1h_+nN26@}I{iyzgze|b-mq|uy2_gTC;6GUeZalzgESHMF5;Sk)_F9U%E&bA@+uAG zL4Tl+q&v-uS7|k5>q^(gR|%|0ENW~J<S$^eDa#vwO%wA~dphoko7>jL#@A?KDyG$T zl)+G=6W;g=O$_I=4vo8St9eHoU#5xXN;Qzo`m<VxV&iWJQS3m->KBP05^8B=^^1>_ zUy3b_2Ff;>rd_eY&{A_Y6txoSdY2}<FOi7)$fe2RC=yY>yfoPfiFKl}u>Cw*AT*V1 zlSp%@1EDd${e1FEu}-vZT$*eo#X8a4wtZ#qU~yHtcl|$9O3WvAYEvoP@nl><gC@H1 zR}4`buGekeLd{&+_!1%7O`cvj=BV|ZXgF*x(5-@o;HAm<6q^j~11^!RHkvX~lPxer zw2&?QAhg<t{_klya{pgn*n9Kdqr0Ej9qir-QTa2not+Qv__zOV`(4|nt<P;`H~$Hu z>AN8M-<vk}*FU!Ys`a(C_pEtWzY2K)9$ERVl{c)sX!*Y`SC;pdegN+Ozr6V7MdiXr z7wW7PB1aFO>%2#+y<tE`Hu~j0htB0vr#$2pL+R+D^Pcx8RJMJ1QM<2)BOjGqx37l( z<Es^>t|yKjJl}bb0q#~Dxn4h4ojvbiYDgZv1Zp_@Q8?UvXbcLiN`aQsdRe7Q`TGr3 zutiLD^XSC@evX?JmHLKUt=B0HXx?McLq{(H^t0cr81c;tgIYLxA)p%0d?*QC3>r9M z%k|rhYOcF)ZS_j^#t?0FnVJ$uFMyiPe$?iJv+;DPT1EQ?2K(00^8x$pN5aN-EtlQ5 zHMpA;v`t{}lSj`3{Iho(2;!%QFko^OnjIPN*wF(3e)julTd7)W)X^@DL5>_f7m&|> zg#xd{3}~yt;NCjA|6Jyt<E_BpKXJ4V_-8-&4K&)&6|1FjDxK>V(T<U+A$)Wn)Nqd5 z6uk;<vl!Ue(Y*kB_NF|@jdS%JS|u6e=+QlZe4cBzQZ<KmObqa?qq_n4>_Z0}T3|v~ z?!y(K25l}G{K(ODz(0E*q;69f+``c{z&-oK<w$`+h`k@rrbg{tle$S^YKk0PJ(mVL z%?&wPSsC2Y(OrOhuA3C4O|!2ssP_#9@L$l&_vPTUphFvVrmj~V-3fKQ@I2Ez=cCrm zrDhjarh??r6{z6sGo(s>1N^z<S`}JY8Q;U3N0$No91ANf+e)Qcqt>8>l|c_3JqOUw zzOef7!pfj#jxGVJ;>;FT7!2BdQ?A~v=0^L*aj%_2iz-t~>*x-s#e3#j9Jw|)4!p3l zA8WL$+5JX-Kh%WDlXKm(HyYUvT5Op*3r82B&a;oaK(Wzn6yWx<SjvC{L$}e(6lWY4 zn3|GD7oeuIcPhO>r`2k-S{+(;8Su!_9)O>HV&d*$(V{DXyL&EN@IKO_MVG<7c_ahe zvkwAq6Ff%1!MBh?pWF=kE01;n{ed%gq*$@k&FvqQ`nfh*ZyEUT(Kf)JXT8PV3k+=Z zXbWJ^zAA=uomvSkw+wLnXcK_X?j#b<4RX~iUT_)cTSprJeVzqZy|06NZJo*>M++{4 zA30hF{ImCKYQbf2OGj&fd-mmOViMlukLSS=u>yWrH;O&<+0WD!Jz9mj&fcyHxn|~T zmH{put(;2<a1=Cv+qOZe-j{3lH41Q>SAZu2_FiD>BH#bzg}wi<XW0Gx?o+$Zll`i! zA-lNq6Fawd7PjBMt=Rg+)@bYc=Fe{4+W7Lu+cq9r|MYry{rcL^trgccS3k5GUHONV zcdf|5D<B8o|39)6hS+~kFUl7_vQVD={*N8SK&!KFJ8e0b8L($)tf5eKTOMmKU=hCl zqvx`hagggK8sH9I&voWCI$c-fC<1kzz2h3-4FK9_N$3zhmk!Y8F{NhTpi_Wz?mqV& zw+~6!_tj{h#ng4{C<Jw#eQ<NpiNJrbRNp_yqBB(nKY4Tj_-9`cmAV@sJ7io%+pM_J z9BerC!$93FoL>Y1{Ol_XM2x(l)M_Cd2HIvZ=%J$kpr3u4HFJK!pr()ffcnxiuUp_5 zs@!*%U|Y-Wd%%Md?Xs9kGDkkB<m`JnYpGMu{crZ(1irPax)-+Q!II78lEl6Nq7VWk z;X0ZJhXia{gDuOJty!0wMAj^89xTa_hR}zlGQ83j+6NS9AxwSH7O)Kk`WQnCwDh&K z4``teLJRE&ZJ`BT3oZHfIY-u6+WW}T(Y<{9zVGY(<;Snx%le<S)?Rz<X|1(u=zO6} zW!IEZ&?Z<{5nm}BdC^zwyhYh*qQ_|(D8-{*Z`SBEj9jT+L0Khb7!^u<E_$?yKF9w& z#%Qw|Pz0S7tgQ&_$dLzO^PfJwD2P0sj)UbD0UbQrK+ycX1d0hWg5?!~8#!8^ie)k^ zlz@KWksCqtUt6t}_v+=+0Xq9ifwdI@A2@O$_-WQwF#m#pjUG7>EPwk5q>8C}CRGB< zD*`)o<UrW`=l9(*T6}}k3<CJ-(Ha8g?|-S&43mjEsy17|;)=iz9@!B-f9t~*R|IbU zXcgf;pZD0O6>_HW7sPADPQB8>4m6051&>yy62f9zvVw`0z|9@K0O9gqAySJgg9F9o z>d`@l#$q*FG*%m0=z@us_}2YL&qv?lf1sf=*i0z<t{hJe&$Pq`Vn_F(4@@!BT9>Rw zWKQrvgSdvca&#{OpJt}DqI(F7&TIiQErISodLBaOKhq8!Xb`9m9NmLZ`5(%nn*uF$ z#Gcgn&_)zYv&0wDN6Y977T$wky_8H<Qs{q54b6J#AcZn3YjCC|K9o4Jp%3w&&jYD= zB1@f-ps5z+Z^lb7!;$z(?8u6~!ry|>+ds(sEkiRb0UkZFAaMTP*_o=xv+)khydbcH zM`nc0-^tmmW_WEt;9fa0Azc1e@2sU#X#Es#z!XOgbmLU$-tvAq*({>0K`_Y@=z${x zLZ4!iwdlZw0RbC1(j!>@3ndqm69DE|0y=!8L(u#;g)2#vXVd|cEP;IWNQ;oCnPl~} zled^GHZaK&_`##Q5k7zW!zNh*w{WzCaQQE=8IAN+{(^cFr8d`4nlLua5}#Ab{%EEx zcn!)u7rt2dI+0rVUE%Gb4~xDedPFD}d|S9GezNFI!Usfm3cnyc75zYz6uD%#$VAd_ zi9aU(s`Rtc_lR@SS4->Cka$ykxA;hElRj1aR>>2R$HhOAJSKUk<Q0;VWJh9@+%&F6 zp!~PxpOZCZza#r)SwtaGJVX9>a~IV=RDT&oBfMGtQgur0R^LTs3ZNW<51=f9hp5Z~ zn5}?f4n8k<?`(Va%Itl!x6X<|<-oA=9+Zn9QhZDCImPcNenrtzTv0q<{(iYs7D4q4 zUL?O?z9N5ype2Y2?iFZ;&n$j6{~sN-;>+x}9p%i<YAFIDpVUk&Eg*u?rDkGj0TB!k zH4`1@(-kW2y?vL_cnEgcs=sEw$r8cTt@<iX1Tj;pui!*5dG_nHfNz4WWxt>bAcD*7 zer*^?WHageby@%s?8W*eX8;jwsQOi901+HF_iMudBJj2Ssxp8GJf`XkxDr6GsQwHm zf?iSmDNY1FN5zya0^bCdp!yU1m*A{Y^?95Kmc*(*#))7JtNJ6H2u^xbpJRwNYc06v zw{${V(1t#X6QK=#1}8!r`a_%uZRihhBDA4T<3wmfj}b&*L!ZKl(1t$A5S`7PL_M;7 zXm<iLk$Q0=Fcaw}P6Q_qQXfHNV~V9a43X6>w4wij6QK?LK2C)F`9Yirhr=guA~foc z;zVeDOfrR!<rbO=lMMif(5RVw2|$FV$z)mpA~b3yR2dLKuc$tba|?P!^)Wghz-Q4$ z458#oR(A+=JB!nRYLz$*s(}9Bc4#GK(|R3y)%}BjCszr1wXS+ZcqhZnPTHHO6eB68 z19ZtnCOyc<5`pgK{}2AlLd;ccNB8PBOLhK-I1%tO{{u8zJ^r(qvHqX>DlR@4To;+d zAfQ!X9T(q@{}LF$JQElVehDmKo{6^x#CF}fVs7kgM78yck23brK@~_Wu6DVe0FEn% z(}1rm;56VW_i-8+Jon=?Fm|rsG%$2th|_@g&Eqtnw**cDgK7__fzC)1G}h5&n69WE z7&dEL4*NblgOfA)Z$6d?x<bz6XaORyemRp?=gSm>PRC9(mTZ6?7Bi^|fCym4OpX>H zf)OWX@)!US<ZX&Aj413kV~JH?E#ir1t9r2wCxTHfW^%LuEKsbN$r16z3I^|5$R12U zQIt%eJ|F^7luV#LAOg3e{0_qq3kzmEW#8?vL@-S#`)-FNf@wn8A0R9d%+Jan;ok&Z zrev}e0JlIx%5USp1Vc;tW1I-amhvY!5ezQnf8azgx|B>XIbaA3FXcbrzXan;$;7CG zUxERq{CE79V1y}|^a=1wU<t~;XJT~=#+dS7aageSQT`i443)N>4qrVQfis?<zanLc zz=j0<6)8&uT_)%+blHUw7-do>@yW*$0jzYLVTdIH)0D2^L|~fIZJY>9Q@Vu{foV#a zR3g9-Fiq(${!1XIlu3L7zXYZ!Ws+JTk<D$A`f*rbn$i$X1g0qs;zVGYQYK{zd=r?a z)PesJn5NW;6M<<;1I+#ZOJ?SOW8OXYow?V}+0<WBzeN3P)#p?>m3;Qm*)8RFmA|6A ztoXPhC;xZ(qw+P`-^*TwUjO?`>BG`zOa53=kx0b9A%33do1&iRF5w>tuLwngUlH6h z^H(!3nPgQE=~6}Y_@6B~QS2<Lg9a?jYeg?0)Z3_bR6i-;Y8RbqOnCxiw(2x`tI-U) zfWQwPQML81`2>i-Egn%d^c=iTnENW}hmDRb!a;m5ctjP{<1dFzKUD9Ez|9>|#q*}R zY0+yP8k5yRg^r@<X;EB*MX%8Vhe3QRe)J;rt;@W1hT<+!?WI&9O&$HC;!9wd6W@p( zQDyb`AC;qmS6ZXNs<Q!4u%D`J>I#msIgvdJYoKcD@jrH^!Wz({B<Q{cxDo>0e?(Q* z<A2#Q6xKkX#*e6)dQ&J}i^7uvaa8UKU5exq@VbTg#@-QCV2^+31d0dNMB}Ja{i)gk z${mDPEyPE%M^v#rbosrAA}-KtfV#^%eL!biHfooVdeMym(QGg+S*^y^X0DK=u3G5h z)*LE<Mc?m$d6@WA?1-wq$KQz13r$A7(X7*f6#xMqKB7wR@jp%Xr;6El4a~U&a`1>M zzQ^B3p!hQjn63%j$WayH@^}AaKm!3CJ)+9(@xOdpDeR%Dpyd)+hY{F;BdWaK6c;UK zn3+MqMvthHdi+_YiW{QKKA4+9U`LLqihBGt-H&zw6D<LK^@u8`H_cTGm7ReCMzt0g z&p_Y@kEp_W{EZL0Y9Vm*M^q)f=kp%+eU+SP{ROpbrxC|4T8NJYkEp_W{Dm;1w?x5O zkHF0xQFZgCnq{>HqsD|>F`8V>sEnS*j7nd@cn0EIi6g3v9{($8oetfuua?o>H!1{+ z!Uu<nI1^uq9Z@y)_`66{W?8E@81-<TC1Mk=9HkKWH1n(t&9ge2c_>Q*j}G-8QML8> z&$B~CoC%)eM^sh4speUfaoTB?lJT4-r_+KRH1Uo5kEjxR{6kex#9)Q4+w9MlD`0y? zeBgm2s@5L=$P9lXTShggQF0HSh=D6Vdh{Ur0)Ovmq=HWMIxU!43GPEjRJlF=v0(0a zrd$UTD*+rlqU!DOcMC?NMGGcY0{8wSs<Iyc{`9osv1Xxpc?&Ji3gDcA_(1fCDzV33 z+uk@z^=KB#V0tC614ma7_B7M01#JHb*yz!8b@a|+#KBnyfgL=GPSuZ83_6%w3EZnk z5rjL<+^R>(09K7zt2Kg6EP>DL|KBh(|MvOqxqqB{^_*4xHTBP{?@)bKl~z4z_WiRV z<@c36rB?BnVqY;Uf1f-gdjeJ6Tao@fy7xCo{z#G)KOugX*dzK!(W^wa3ja`eRVWd> zP2idN=b1N5vj0ElZvtH^(S8~$umLN`xkBr?)lj{ZwJ|%bP?yTC=RcJF@puicun6FA zm&&Z?zxsB^JB6WQq6G5QE|pb3r4gWjQN2lL07gLI2fI{$J%1;JEwBjOY?sQW=fAIF zG(s!<1&tI+4KCM;OU*hs)gnF>>fVk%#lKfk+WV3Ltgi^*T$jqKpK5&-HXBg2bejg{ z<XBPFbd&{a9!kt0zIA_>O0wtgw9Q7FW|f*I<HPZy#0O$sD%YO>(u&H=Fr#XyCU}Gq z+p3fuo8i23r+<Xer4sI^SXvqMXpe2x8itNAaCCoHgV6aet%i><aMW~{O0nl3&506V zEgE~SQ7flPC=s?sy(duy>#KeIL-8(^bkBbc=PwtUR8eisN~zvT4MmI+-$-_;^m_yE z{fsZ$spk?oRI!^YWR&<!tV<>1^EV<?u)%_2Mvbt}1OXoE-i*Nck7Gx=mMVgU76BaW zQmOd-eH?m69>$9jxL3PW;yr)gJfh45fq$h-CE)WPRomtI<;^m69tBof1bU!LrQA<5 z$LhfxOTb3ERH8lq#o<}tFIZ_2*r6_!XV2e4T)ARC4whO3@YODrV$Z)P=^_(GwA3=_ zbYPYx@WWjy*`ELUfJlHOkh5JX!Jhv-ORMBe=iJ8_xE~94sl0mr!^nuX&tRG*M96ii zEc&UYS#&C@LGLSRj7GH3LDjlZC554!SK?a_bg86z{##L<1+AsH=2_wku`ZQf&)-Gr zjZ0PwIxNwHd6v9~=u$cM{J}5N`ISgh;HH28_jjojd;ZhxP+A6o8t+n>_55c)x`0#v zX^h>KkP*zV#5Z2prPA#AC$PEV#bR9Js>M6-j(~s<cd2B1{-ZaHqOgYwND#=eE|qJ~ zzdzB;q_t?xRydy$;KA;6iS~|8c@Ipd9Jo}XJ%2x7HCbT+2?F;@SAuZ)Pj_1=K{l%i zqqG`uXhERg-=#9^`7f{o@g}<Ep|U&BQVh(e#0LUh5&FOs^Qje{ToAC~t`NcUH$I|d z6M@X^|6evU|BiXr+&|6zD!Tvwg8D%HWYtGh_p1c6Z<^IB|5BM(J{i6L7n1)-{#N?_ z|CeMY>6fH6>5VA=KO+8-_>JOa(dR`6BBk(mg+9R#1-~wE%>3=l%g))`50kETsib=T zGcVQM91n|?lI9hA#-wxjeaz0}YL`l`=a28tq1t7r{!F0Ug1t`Q2f9>3{S>`!(SlVJ z0UPd8dG!2y-BBy%;&rfw;y|X7==mdi<7kw@MHGR2wM!+?^H()0L8n2kOk*(V;aw1c zAMR4A^!zy|7EuIpu1n?5^Iw55I$?A^;<SSJR<KKD(ewA7Chd|LtfC0qT$f6h=Pv_F zZndJr3Y!@vx1v5kMI_O|p;==CAs58A9_&)-^ZcI}Lw6{sc2rs8O*OGXn8YVyT`G;9 z|IDaIi%px}rZt0QR50h?*swM|jrQQUg36`mKhs>+8<uPalU5IpD+qLdmrAGSzm8gk z^|}buRF}%4H}T%#(}g71LYV$aytWV4Qp9(n-D%V6Q?#=L7eNGeqU%61=y=PpncJ(y zYaMhGl*pFo;|dUGL3}0FrE=`~n+~c}haT_L4lSw(@MxDxu;;(MUD-p=R2Je{u&^Sq zgIy}gp1*6*T8!|Vg20V*seF3=_y3!@Vx?RugH;s){le}G5H$alw=b7M(|3KZS<8Sm z6#*aUQd#s<%&t~=4?w_1yHxJ{^qmOiR}O3{b)G-=S&;;AOhI5@?NW*J)6B3YjTP0C z(Hn*mTM7JN_a21L-vF`800Otzr4r{IyvO~SPR<6;h&h({Ua(8$&-0hVjH)PuIhMf9 zb*YT`>E>8eXL<!yYC<om>b0m`lf|YRI;kMO^<bAupr2xnwV?ATSE^XwEAJ0STM(a! zb*Vgh{*DqwHCoM9(@+Ts;=bWZce-SH>d9;rnrX7ZV$%e=ze^?4^Pgjf&MFAhc$Z3| zpX#i_rrFGu66Hck<Ml+q{7QTy)}=D)`77PuEYXFU;7J7mp6KcjIR6ROfvT*b3k@{4 zYLc~hdid0W_)4rx<=68U0Tr+@X-yW34TM_|;Gr&+T+jcEH;SqPz;Fu!IM}7K>-jqc zlg<XiEePDJ-OC7<zf&G@3qat9y3d_TAv?|DUK32N1TeM#zhmYDGxP66_y7Mg_sY4O z)u-wQ)k4+VRBN+entjRaP0EidA5cmazpV(%e=L8!d{y>$vR9z`|8JC9Bwv^OyyRKp zPl+R<C(w(4R^gXW4FQedGlHUE9zp&z{{_2Lj6DB-)T0NELD)>mySEvyMpwPT%-J0# z6${UQQ^0xrM4(5zR75=gWq~)I&Y^;oaFs-02f9=Q{1mIC;WG$aA<-@s^gad4sU#|_ zI24jfupI4DG4K4bw^C^ooRos^uM*f-yHvzG{{cyzL+H>kzgcU7Arl0CuuH|h^EW_j zl|<kcx>US7|MDMaI`Q`PKB8<m-o2qN75UEJ(V{othwgI-IdWYp&V8y?l3s5?VX5dC z!l*Ip%vue4bV6f-ClR<14|J)pcmDS|dKC1hapr3E2A29kNE7Q);qUw>JF0LvdV^ID zD_RC>37y*(Fxk!NGoMpM;QW2gWpvD8v>6O~SkaO|_jjo<c>ar|)yp7Hj6h9vsQ`HX zYYcP{q0_9DlbMvpjtWAeNPDnMBEFLDQt|K>-dhG&8I?Dt4sO>_0jyeXuZh*#B0ltp zpi4!^7kPhaEtM!2i#Zg0kJe38&8<>WlSFN$M!c9~o<r9>XYE;QcW6)y6N+>OM-~JV zu`U%x&)>*U^p6=WPxLT=l>iTSsTg|x=ca3v6Njb53FKgxilXQ52@R-LEtrZ4-21y! zz&!uEno$v~#0R2XDsrCx^s{}~Lia$W99UKn*nut;DL=(*Y=xD$2-skk3XSKl>-9_q zRuU(0LtQE=p8qtkvR50r4j_Q9cBz2)X{KS51{KFgPcrFX_$q-P>{6le{1t*t!vt=+ zONGPp_dK*hC~c3ZCrx}P*rmea`3qpR4TUWdxVbJB3_sQUt2LtKk0Gqlp@*>asMaNQ z698+76W_YOO9jXCAE{{m)vOmQsP6yp83plySeFWt=kFPH)+K}4s<pvz3gVLCN|%b1 zpJMtopnCum5@IugcnSjD-=)Ijr<i`>Jph5a*QEmF`DaC<hylH3H&u!^3k{9Ekb@zM z#79b9DqP;hdrm~x<S63=rCzS0LeI&%#)m3~qpy`wPnSC2W`Ou$vP;F#8+d;Zt$9%v zX+eW(5Tnw}wfJyNY2q`{E)`PG-|t&c=%NY5(}RNx0z1?VBW(VTbhFut!|+7{IM@v# zVE%r>VzZdQEKA^0`~N4;{KL%ropS;8&#B%y`xmo9<=u)G%6~z2D*cA!hmzaGKG8$M z-x7Qg{n7v1|2>j<=qb0MKsj_*anC*S#oHDaXJ+Ixw{4}Gje356Ghc0>^{Mr;PJ3Br z3h1@VM%%JUzhtoJ=w_|{vR)U^YL|7EWt9JGKv&f$qIL4WMvKwIil-Lc%2>mG*UFwL z(%LXY^;*5DkD=8sBXq5H2^FIq(Y#_0tcM&?S0`22SoNkn9cBx`{I9!EIEa|EiHKeM zi0{R;q%*^kc2X<uqN|+C7yXP#y32ZPKxbYyqW@5$q29*XY@`%mq4J`!zdlDK=8tK4 zph#phBhsp+UNBgEt&PI^NReK|C6aH&U8wE56Gp8I@@`qyT9$Pvu-stfY&Ke;NZ_xp zpGa<P6un2<^i&VDBSkvo5~-SSI(I9UwMrr~%sXXx+9fN>_ovLX-yKLyrWsXA0KGJ5 z)>+RNNlV-Gu;GpBrBtmNH&n90bY*leb+|+-uND29=~OyvDGc+jH!h=XESf~Qn$cqo z!y*m-dZb9k%UUXdpBko<iPQ+^wZ@gUv0CVF$2rDQn@gmy$5+n9+OhT)W_U(aH~_sh zappCcL1S4yYo><SU@WoCx{)H8`aM0dNT96LD8tLQfJnD6j_{t_nuqPxdd8o1>8Oea zz`{({WgQAVK_?lY*}AMXF6&Uls-F65AkyHkM~Z}c$w2wo2}H7QdwrXZfMcz-mD|xL z%AuH{pUB0?Mmx&>P|z<M`WzXCeBl8QcHs5b_34enjqrgbj$Az}taaIBT1HQ@*>sq& z{buSB6joU9*CU0c`;U)Fj*xUnq$Zb05lhBu*mmx&Y!(M1nFBi8vd%y`4xNd097D~l zNe(rSb{wex^p~~9fDX-ACf2=kHTP$%x+kC9P84kR<S3K$HMm5|Z8@s8q+Y+(sgNR} z7irCGFAaD<Yi3MxxOrqRA>L8h4>TDPA`#7uNc+a^wN!q!)5si*6sgW7QYNv!l36vD zgBc$t5*ksqB|X}Io!KM9J7|U?oi%5y&5AeBal~9Pd|jb6UDgx5gzS-MW<*M?hJ$5; z&r>uTM~YPA5-E$Gkj=IZv%7k<p6QPzz`IdT&9;m`8EU5Nkq`;}^?4%cFYCBOBAOYI zGGYBnrIOBetcN2-s&a{BPk0Jp`++;1rv^O1yGe(ZXk5+gQVB?k{`x$TkP6Tr4;vop zC8C)T$z3^&xV1i=HrKzjVgws<4;3zvYPvnUyS(YK<eCKU$i1Ud5Tl!idx`n$^F`7b zI7Pym8IkOHw|9RpVXj*vqk73-1|s!mteM-Yc}KWd@$5xQHN-n&(r{UC4d|$$v23y| zp&C-0%_!raF7!kEH4v#;(>ap+rtOrzgyt9n1#O_+gMopzpkc~1>nxO{gXY1E)!Yaq z*2*hxt$E}!-CyF8DzM(#$|P$gZ)t6qeH~iWn3gQm_5ccd){IGY)(mYAmr95HxQ${T z)jC4ZW*f40Bo)<c8fqR$MO==M=I1YRNtN4=dMkcUB)8umBWK#D_(Tz##{Mz_Yetcl zLwz;)Yv9U<r2^9sB^823cO+Up?cw$GKpQj<q$19oIHW3YNmZ@{d~ri99@>c$or0Eu z20c1M!}^MDrkp%lsRCh{zdp|bZFF5Ky054|rdBAF1zJ(KOuw&~=7ChicAt<+DSLFL zA$al(ziRtToqfTR1)GAq&#LXuzjFRv^Skq=IqlqE&;5ArQNdf~uN36wzcKf5!O?tq z&O86<`GvXeTweLx%3oF<2zP`f;p4)`1V2KN1Md-q1YZ?=On8&%TcWzqD11WrPT?!i zi-I=MQ<X90eadHuUn_o}<XIAh_&&*>OTH(0z4%tKSbRl#m*fNDw!|*}j`&ZcbCQQ7 z4@$o*{h=%`^GaVTUyz$*e=SW(-O@M9%d#I!KO*bOw6crxUD?NFk18dKzeBG9{I=qk z6b(gKv8;HSVn+TA`KRUYnwg=?B?cR7v0^P^D)^J2ETsAdoCtyd)lb2RAc{|YktT++ z&cl$;zv{~rz`d86secZL;FL_w)ISGAaNMY7YOaU&%gxY6c|96#f{16;A@fa^2!5&R z;6!lUr)uLwz^$r<69KoX1DptMyi`qs2nw<{a3YA3Rn>7KIMY(qa3Tm+RaJ2!xVBMM za3V;@P?d2a=xkL9CxXsa6>%a+3sn_xA}}!3K28KR4^(-a2*MOqIh+V?%vD*O2<jZF zn1ak<YtXwEi%0c(_$ZX(x9DF2BCsLFyKo|~A;mj!BCsLFJ8&YfAq7*c8+;Skkb)_m z4vDM{DIUdPfek6%iW7kiDc*t;fek5s6DI;2Qv3!^1U962Gfo6Hq<9lf1U962BTfW1 zr1*852y9642Al|NNb!1{2y964I-Ce>Nb%orBCsLFuQ9~UR3g2->#x+bzz-?(I1$>A z4ktnz(&9vDLwDmuXhTal5!%pYf(UHrxi}Hp&|NqY+R&Xi5!%olI1$>=b8sTGp=Zl? zXO^csddFd*4LuVlLL0gbCqf%~22O-FbSs)epEi<P{Fl&%m<MXWL<ek0{kfSLL1!fF ze-eIr8lX%0hjoE$b1!MlI9GuOljAhtz+^ZLniowA<-Iyx)g3cM;S&H)!D#^VB2ELC z%+f4m-F8`$xr%vxCu?#xGfkh<sn5&*H*I%-m@c^XBAXF=%~6&=juYcyv$?L{@t5lX z`PXq`Af0rZJO|FAw<G@=O$=6jjRvY>n?1Av-N={{|9}Vtkui@003z_TG9wNPJdo`9 zI1zXt*?l+>_z@ZN&H?x)@Rzbx{FgwrGUlBF@JldkWd{70z(>oNQt9BAU`)%H%H)6u z<^>s3(;N_i?~*aEG5{j*Kr$1~5b#|xGfo84jf^Qn4`6`<mocw003vYUGUkB^Km?b> zvKQdr1apyWg(0%piNJ<L%(FirX9L)f==bqo0vi&25GMi~5`7XU0vi&20w)3+5`B~= z0v`?3r~V911h8u6o8Xr~PBj4w<Ww_C0KWv5pk|Z+h`?^uAHf*{mZ1JHP6Rfj{t!+C zx>f%kP6TG6X4D550%oFS9w`Dupj-9Fa9Cg_>Q56ycFCfC3@3ulR(}d7g2Ai)Ad~<9 zmYMlSQU3p5&Q<2r>JO-+s{c^^x=K6y#o65Kyz+OHyNZ8R{H9_B?T}v~*UG*itI94) z-!Hu?osqm%;t>A>+MQcOe<gaU=$XRL39G`3f>Xhjng5u1%k`O)B0Z}39h107opzW} z9TVz=&tRgi*=)xCAqdfoC=>}i=0cp<U+GbG@A{!X@Prdxmz;NrfU19K=|glYcnyX? zkMyYOcm0e@h~7WA?;i}I`$2G0jPk-9$rg&9f%*HyxqPfgRlDm4MDc*OXKN@T76qn) z@kM}N={=KMD`WW9*(~VP(2BYTXoWxz_oy0o{XkTLb>^mktJz2AiUOxWoa~2sRB^k0 z><t$La}YPIZ}dSsDt!*$>n4D&^gv-d9>6+O)s7DBFaU)R=%F4}*lrZt%sm6~QPk{7 z6$%}o58_%N+M{aQ_2Znl5V-V#fKfq%3@UXA%aRh<S9(-AJC2b<+sJ69k&Wo6iw&I( zsDwZd_NYR3{a~kI&gq*6Hqha0<S@<dW(mHPMBFL_dsO8*{<xdDIvg<s?v)-@w2o67 z=kklRfuuv{(oh=&daOrPuHzs5NWBb!YGK)6J#6AiBG#kI*YO9Zk`Ht!<s251BEbDU zs&?Hq20s$0S9?^=I{q=mDEJYT$@GRbC~^y|Q3?DjJ*s#e|A0{R<V3v^zwC<_z`~k9 zf1pQ|uj8Mrvf4yR6AhGL5HED<@JVmt3$Y$m$BuuO>P%*{&5BGCtX&E4NRKLF*PqmQ zJe7e0qtTPzFvO974)&-jcKkyeQHU4J%_MNI^e!M={{6}MqBntlwMP}M<8O_tg>tHx zMu{S*AU;?k68M20Rjh7`OahY?EG`MyaF41`$3Gv$n`*^V1u*Rp$g$pZ<>`>RFZ)r6 zQ|M_4@T)zlJRN^+Yf;L*)nw6VO?sG5K;VaaRG~WlY9Y!C5y<;Jsyy8a@8ITvS{Ti9 z=k*a^3-zdKb^POyQSHH@>IVdHu16KCn<}qBr!#7dD5nGE6`(+BlLkd5YYbptMSSc2 z9#y+;io60;$|!_#vQo9-yaM6_(H>RAj(;RL3J*gOixzlMLfnd9=}lM2?lK*FX0jMy zRv&@x?}-uT{AbpoYRClYgFUKx9shC@beYBwsvc0TX}mf;m|TfZWO`I3I~)IDfL6QZ zRy~`mphu$)P~Ep;s?>mG5Qs13djj;O=kxxOH{QsmiYUX2N-3yQCI8TliK>naw&TRd zV!avku_@+U9a;k#wI(x|a|!Th_hAIi-%QWmEdZwh1U3`@zce#{%iMkHtEv~zzCrmR z#h2y(D!&Q6@fVad#J?hXpYTrw-$fbyOEWW%T<zU`BNbA9&kPEkM-_kWnYm|i@izI) zjMEz0F1cOKLdiKcWRKeT!hov&ZX4eZpEWZfLLjtlZ_m>xwRdA4hY!SnFtHFQmYxWu zLWc%K^QbVRtGy*|0UH~KZk;nx-tcUX4dA2pCs4rt#+lr<(BXb2LcnlrFA~-Iwc3IY zgo7Xf(N+QNod^NBnnw$Gd4zz~Mk%vm_gYf^pSpmlWVNu@+;8oscL)JdkP8vtM{SYt z=FtK^ms`MmK;Loiq_nzFdaQsvLokUR^aW#a&#rbOtKTOCH20%;u*g}Wd9;9caSNES zwB6a3E|uHd9V_6qn&^2wXz9lzVFD7(qXoQ^Tfoqsc_ZT4Tyq=N#zvg7nJi~#1Zc3K z$Dz0mJy0{zgXal|x{40C!UQCmM+<ldw}9?|J*O{uThWT)XDT3aGF)SjXdW%#bGQYJ zYD<Z|dLf!K#K#JV2dmRw)QFyH;*1%#5<PgH7ex_{Tmll!qXm36w}6LLd!uf5ZZ}&i z;{-HtMi3k6=HWvx%5n`_LO`E$EqzdQRqDG2!pYd^RITBVV%m#R8C;-ww1Cgz7I44h zE|gIi+iJ`+PC&Y=h<T7l51uy$jU18fNI;@_w1BsB3)uAS2iBTdmvLJ^PQYvK!Se(} z2k9u18FUph{}aul1$-vAfXQIe8qZqW_Tc8&Aa^QKm*_zgof<=!C~D?qqR5-jfzy~5 zC7MSIcpJBX?LB|Kyr1{2TT5d@-YtZH^ocFiJS-s7%tt^JL(SELWb<eNpTRAl-4oc( zm%RCkJuy~5o-zG|fMZOQ2=Yf`5Si$3^JoEY<rc7JuX`%m%wEkF`k4x7q3;@rF-SCz z7Er@2VA-^L;4=h@A=Bnq0k73W&+9=nP0-Q**cc?5M+<lhw}7R*C*8~hta-2TXDOf# z-8OLuNH&ia@afzF+S>+GI@IYHbMCPMk}Db7n~*CRrkNOnV8c5+(KD%`#5BRxJVHQf z|Nq>X&J2p(-$M2O{u??4_=dWtUQ&HQ)loft_LH;O*(WJalvk89inl2?<lmLQR=zCz zn(Sq=JEi|q+Lk_D@+nD9GA}+6$50KxM@1XL?+Sla_&mYi2!26u_spLo;8Fh~$In;X zcH7KNR3bj`X9oetey(G68anxOyiiY#@WUgT86hLb_i;hDEU8kfdf2vU*QbUKAKyzs z-+*yl50|Tn@@gkqTx-;tQ!@QLE~dA9F<&U7uZ6P4shJKQ-$OxPz?eQ**;<LT8k?;| z042z9&vzr589j%Omj}uK9^27L2ZDy&p0~I$S{ZE0@Y(i^wte#%vW*M5(+JsW5#!2Q zsWd&Zl?%C$h`V&YQdVzSpB~x5g`DuL`uA5?4c>-vTI9&FnL?(A3efZRzHNJ_l56C5 zYUh~7`HGGln>eBU&337f3>kx&Yk)R#LD$@wS}~H2n=E@%Lx+zIT&iBP2iIcl>UKL= zo>tZ2V?7r#@JiDnM~-z|>X^(ao!^P!V=Wic6FH@E$aixg1E(~tI)cYb6f*6TfK3CR zgtj}JK4~1smj@h!Mb<<<Y1E?sY*u+Lg-nk^fDC-nIrcmb`YtYL;FP9@4j<pirH_fc z(m1B?;9`0*uQU$&Ih@cFd8PBA!^h9&(g*NLqb>S;<jC=}xR?e`Y3fdl9N*3b4ZPAd zKtGcUdNQ|kzCyysw{fX@BDZuta^(0KTucMEG_^j0$G1|@v|j?F9QY-U!w=?cfZJVJ z&b)_az%tky0lzdg%aP+-xS+3(V|qFl^!0H}Potpel{8Sub#Y8j<zo7JIHvIN&0I`x zvyN$c?{SHXY2cTx!9Etbps$Bx3Lh_U=>s^X>Gg3F7t`0nFGY@T<bno%=^9jh0~hr5 za7=;Yr%=%I)Fuv$7vPviER4=~rAqNPXI><@V@C2`@h?g~FAj=pl5a~-rQel4Abqj) zcIm2AE`6Q!3$icCJ}i5a>=9W~=91khQ;V%sCcpUI;?K-^QNI60^$*owR)0kOX7x+e zDYaXDmwHb1J=LG9KA?KN>LJyGD!b}gD#h$~X8&aNeY3A+Y6nnN0|a*noPvblLxML7 zULyFu;ETen&?8(DUJ!mo_)+0ogfA1lTvQbKL<Z4~!hf6p2C5(MF7eHxpNPIL`jqG$ z@~<ktrF@UlCV#6kq<pGkNAXUDQJ#|@$v>v7E1pn1Cf`)PTJgC2M~af-Cgo=puaMs@ ze=@32P^KyrpgIIUMl}jPKKCf1?kJ3ko6yUKUzLAM{?<{46{wxgqG*PihD_X>TiLcp ztcRUusgMb#y*FIKiE+ceE8$wRH}}mqJRK+Qwaw{zT-&f|+c!LwA;zj}j*V5PB~ftY zQlb4oyJB>^<xCzJ_-1QoGrfA?t3|5S8=i*4ruO0+`D&rzF>T#&GY*^bc0#E7W@5*0 zmos^@P4=4}b2GSdP&H|_ZaI^y3y9TPvu0a6D0LbpIg{!Ih~-$uVAxOE8u6B#$<+nK zV!fQq8fp&jMqJM1WC3D2yuRXSL_-eOzMRR`Z6*Shy<Egn(|G`_fFNc)v8*oDFqJF^ zg1#v1FSjk*x$UiN!x}IMm@HrL&4Z9F7+#5$v;MT4Njq*<ov~`i@2T60;G1eDxgQXL zC~Bq@0U!cV)J$?eAOgj!nX&+Y2o$eoN)Z4eumm+z;h<S_l(yHlcQ(uwU<o(%dxa$e zOSq{oCrbp@cT>N!St798oBGzr5`o3v)bDIpsTi~Fb;|jDpuP+L%vhg()nTx2uls#w z@Xe<)Id)B!2)KPZlP(B|;G0ipQWTqRi#<_D>%7~+HA~TYP&sV7*EVjwo%tq9bQkv{ zCHF=<v8KEAnX(_upakOoPyEAm8;l%U+D(_;kqtiGg%d%4KAp+71iA$_^mHcMvgvF& zJX<kmyP_=|w9VCI+~VKTYW|pkWr=B9JK74iYVN8{^G7%_x2`vaLq3}+U)OvNCnhS9 z)@EiWu$kJ{Fttm-H&fA-N^yI4&68<sm|Q|YY({G-cOjTG?`~?CdMSYDD73RaTO|<i znKewk6hQ23Yh&xFjHAA`uVK>Y05M|sZl-*P@mOwC!=%wQS)&HS{=)xZL}7_w*kAZA zP6WgL!uN0@81@&wj}yVLzwpB|qCXk7ZflJjV3Y}efD?gZ6cWD#j#2o1G!Vw5=pSfZ z{@ljFZY1T~*Va-8#;`w~&MivmZvx_4#JCxXrhJyY)}n-As9CYLvU#7ogG#3*gEptx zQOfui-i8x{DQ(8Mo->xc)`drLVo0}L%EqE;e_X%tR-Cv|jA@J39Ydy-U3d#l3~hPM zhh?9`UQI4AWjmTILntJ}=5^Idq5Q_eZ{WYoAMV#nmcoiYo>+J@PAu<-EcvF#*f4q* z-h>kad9zVp^B9af>4i7q#9hyZ*6J;IO#8J3rfdgbsMt8%+^(z^8tdx|OxX@V?4a~@ zLvv?qJ7Za3%60&vKkjxItUFF;E4ILt?Eu8Rg2mzWv^Un*0}D*q4nWNL+phK2iXm1D zEih#}0C6vDiUq3s_JF&y@T<5ezV*#jgR8OL%55yX7ALMdGoHA|TJ%@e7G8rBJ#C90 z-8NV~y2FKE!HJ>m^@yWcT@9?RFZ?o2On36WYQgQWtd$mi2`9SOcFU!@c_qEKx$tV7 zSaa@d*<IdfGpS$rMVyG9wFvB*+S>4%XW_pxM0RNhT<Q(CFhn*c1Z=A>J%kg%_T*9% zCxTtkr2~S<UdCMN&-Uy$!Pewb1OFx1B3^3aM6gr8^kSR{_S%<TgcHGb`O+alWH-E* zIye#Rb}sc7OROm1z~j=-;lBi1(n~FdxRtkcP@ID$RR@Z{nW;+DWQjnxH}|~>AhNo> zx$jL_BGB#4OjRNP3)FWrQ|t&3ft)w@-5U#w9)>B}y}mVH(tk5k2?_jiWhK7hDus8^ z6nXR8896ty>#oG6TN?;~RjRBn3QGj5aT)PTFgwWla<ab!bD6Bq5K9DenXK<MSt6Lr zWPN|j62V+1>nnjJg1JoA*DX7L0y!`I3!?;<2;{uLOmqjU&Xv@5Q149o0j%oJ=wBYJ zBy#1(ZY9;;0kEoX;Y0wd`g@!R)TjC;P6X;xeH$kN^{M^_Cj#}U{uU<!^{M_2Cqg;@ zFPaE;0KiGzWMYWyW(FuhUB-z(3F_+L{{L<Bp1JSNy>{*%_1DxdQ{ScfQ`MpBmf26y z6#$NvQM9LiRIx7qC;4mW`~M@^bESWV?*E@A`Gh1x-~V3`&xqb8@(902-~T@@=m{>* zeBqq?|M2lXb)G?=|AC0KPE}V8Xt$F2=nm)65ekJI9e#Fpd7S4$&e@6%uO$|?bVAc2 zM~-uY;~l_rc_)*|TlPb`gn|3yXd<SwTuevnA$R6*$KEQ|re!*OoZ&)V*-UR2E%CV9 zyf-~^nhQB~Xf>~7cT9<DWm@FOaf(aPK6`FE8ji%OddD>=I?2U!D3VP3c6KA4+{&~} zhmR9n$Y6q*7CCaf$E6N$Xg!3Uwh3p0)v47HIgWEdCk{<(TjteJC>5R>I(+;fmp%@y zMMI&m5p8B|)9NF9`~VlSbKUJoZM4$an0s2};PL$wGJX96MmRWS)lsP-!=a%Q4DZPC zRW3FAb_%6rWnF7p9T5yM5%dcO&>->^EVQ_LaH31AD_qdd=%zRC+tId)<#V7%MYo+f z=@<n~yMMs-YB9cwpd(hVgR={n06C%unC3I&C>L_k5ZOU>Es`M*x7kgE9N|Ltm-D;E zkY&Z%)Q{%*{8RYwahMBvCDJ_1XEy7r9m8nkae5AMA&;A8CoqoiagYmn+%!9Zo+HNr z3Ym_y0Jbr9nw^MgKNr*ErrC*@-sNH%Ota^VmGiA5a=gO@4d&UYp~J^ME`5NBc3Q)W z9B*?m4d&T%m_Fa8Bgb1@&|spS8ajOJ<<bY3X-Dg0TqkaFF+Fyooyhb&T+m>mJx3qo zxZdD`1~cu{(1GK13Yxyq1fv{GwNqVahL7D8EIzS-nRav!o^N*HW7hx~L@a}eb~N%h zEjtHV2FT#VV`?o&jvZXk;9z5F=<x9xmp;I$()9YUb1@B$q^4#%a=gk3%^qk?4IMsS z;nD{<pPODEFW_Pt9G6YaG_(J2&dkI8|8V^Oobvtj{-28f|7ZEH$?ugtj%w*YSNf;Y z7QO$^O4Q=_izD>@pNju~t#DcJzXdN7+&S|nGfmDrx9|xa+(C~~kT5xJ7DkI<qk+mu zBbMK&xgTbA!p3$0<gv3b4NV4|GR<euY-|UB9y<$903AM|V>@ttjGKig(#OSt<p8F~ z&cYKxKbZ@9>?}MH^aU<xFbi|r`vlP8lP6KoxT?W4%sEIWK#rWub1^-37N()cncf^1 z^w?Q=0<ME6Y6_a(@B#w?voQVIAlHZ+GZ0l=EQ4wI8oF?nf~LC=WFwE8hbd)@O#eR{ z;>rQj0D0^@JOOn0M8U;0n1@H&-B_mOTug&$c(kU+K!;CcTug&`cv_~zCsIyib{d`* zIdUT5QU{oYr&dSgM9c*}b{d|*JR&C|E@*JAbq!n#xuC&S<<!vO69EN{k3=v9Oy7$$ zTug&2x2c&99zRS$(;g2D^6?&T%wUNe|J;COP(uK?rO_;ptod+ur1j81&j1?urIC6b zi~M3P<VoDpSmYORAp^HGEzgnTLoP)FuXGKH?r<?ZF20+dXU9z8$89dACvr<;G#xo^ zaY0Yymc~LKa6wPxmc~GbkDFYo25xD3`)F`64ZPAd*hig<Y2cQoWjc6VqmXH@1co^9 zN_x(VhtcI?`b(PQ>OdLbLSquIH2$8oGEfG92DbyFlrauDa$M$O8e9&H?7{KSB`#=i zJ1{kL__)ZWk8#%n$a#!sy1>OWxE`3AX=?xf^qF6nnSXfhCv&esk^H}`zMy)wYJT>= z&Z?CS#a}66@-NH7vcHh|(SCnh^2ZW`_;uo&M6VTH6#kNMUhpcxEc)^F`1kN5^J==V zAQ}ZTi;MD7e6?Q47^;33^`tDSDuP~0Gzav$W%QrUuw+G*T+f>62S0U)VqDVOr~+SH ze;unh^uF!(LBZxLIZ~x?(ccL=D$F2Z{`cWW=7u=1yH?vy)Ba}FM7=FKjA_uJmmNtC z4CW;x{dP9jUr)k;dWeI-p>D@;kjv?eI0xvtQ42Z@p^g=qPcb?`&88)-fy(BG9Gw02 zBpj%QI4IdS+vdY+&>5l5T`)}RlF3YRfC_^f=_ic2{(2G)W`{VaI5TVcbgO8uP^Yt~ zvIQzfWC>{X%O>rz5k1pwq=e<sJP8NNAr97qt+j?R6^XANke@OySuK<uU>uy+JP8Mi zAr2y~{X<KrRNBi^){TA2f-I3*d+=zUgai2y2m5|QTOZ6uw-PO`PnqdsIf8@H&Eq+E z<i<y2Gz<6i9fE5&W3~iyK7BhvvVcrcOR0f=rdO*E=;@k0dMkRfp2KX;`|F7~lMZoq zXxwn<?csy%e23)Bwq!M;?!h=S>6c9O!?u{t&im`}oIU)AWT@BNzDlIDp33_5)Z4Vf zpEBu|tQ@*Iw|No{#6uixIpgN`;m&$H;o;)IMnB(9FgCh*5)MQ|9JEayU+~ai3D7gc z*{7&U#ImeEd-R&4nR09#&E`os5Dsy$Yq2_Wo<mRGeMn;J`(7OT6x9q3x6d#A*OPD{ z7~-JQscW^7jaC4S9zrSunl!1KHjIPwnkV64W{875mwWeMFOiRBcgRnfm(bVwHBZ37 z!$S;g8J&lXh$U#Kgvl>im#kK5e#2C7Uh@PD{M--&u8o>66L-WqiFNWz=q(K{4N%P- zT|@u%cm^K1@gbUnGY5Lmv?c2+%?-V+N^_vo(nT<B%SIzwR4o~-{SAhRD&M9xE>r*6 zme89J{Qer0WFE25dgR6z4>1;Xby9_mRd33}_)m&4Q$UaAcl6S_eo1da#(_#7qh>vN zlN^-+wJz%|OL_}4M7jQ&s#%Dt@96?sEj7;3qR3z{k7w-R7Y%jUs-<2qSbVLG0@Y>A z5jd)zX-4l(EgP+9>A_x551MWL<rmjqPr$(85Cd*)w0N-I^i&Vn!v*vu%d*z8tkW-9 z&D7dw@TIe6n-RTsPBx>zo`8YQ5Cf@NHEyV6gXzkU2GG~3&OuMMQ(XWUpmeQ8^9si9 z;IAiOpgqJuBb?V7SK7vEAwB#hJ+fJ9<AgELZ$>Xs4e>Sj>j@ZW4Kd)$6oXF3PBfNm z3`3$pgPtGL*)Ux*&3X&FS*JT}@YfSCa4^I`Yb&>-Pn1J312qnTu1!|d3rpyIAJ}YN zHkp>07X)ClWqI(|6EM&mVjx=g<dfTpg3X>BKr%JEP=R(WdSZy0rx?D5npwVvnyup* z$TlbjsQU8sP7pk-Mt-UPOdHq3aN6--dbmC$DtN36`%=GxJ3HRas+J)Ssi${4Py=Uw z4T|-RaD@-oh8O^kgK;r1@^v)43;Ly!E#nzbqP=@rRGeY*>!}QR$$O=%lFy^O|Jx<s z9?q7Z>!KO~G0DA>*NAK4Z%Q<hmP91}jQHJi`SYs)pe+8Ei{8Oq3qbTKaZvPi@y%kZ z=qIyRX78iw0-((P&!XJ^SIZtjbqHQ3eL$X*zF7Wb*@u;Nx)MQBemAN`aHsSX)gt(T z{79xox&9%g4OIbnLh-obF;ofQ6+H6#ugBTNe`5Tn1}4z}or!Z8%h&3=?ON6yP1_@$ z)nr0%S#8|9Ob`PxXV97mAM6=!Wu6NLzbtG7+BQc_m)zIg$~=a9m_GE|!l`X-(+g6A zZWS}IED@xH-zvh1ASL`(Ax;EY{I?2lBFN&um8q2h7y?=RnkSfF?qn<ui$9$8MB}NP zuDzT02lWNb@8ZPORHqa)Zkj{(9nJ6H#CqP4x4ByhOTDc5ZJb!yPHD@TuyH$_)Vv2L z0#P*Y#);Xr*j}Z+pRKMXHUAwaCZeu*yX7(KOfC(Rg?Pw{;@&I<9K~iO8PRH(bU{FL z?L_s3NUc-JZ)=zYJU|5M(=eHGfC$ycB>f#a+^A4S(BaUVKxg0bGKO202s-<g|AG@i zXW#PkI1y;*mY3p0!0j!M;6%XfEiYk+Y)yP{?{JC9zy?7l;O5{GlYtG0;PC$vlYtG0 z;Q0O$lYtG0-~j#-lYtG0;0*l|lYtG0AWHrclYtG0Akh61lYtG0AXfbnlYtG0AkOU) zlYtG0AXM!VlYtG0AlU2@lYtG0AYAMclYtG0AmZy1lYtG0;A-p=lYtG0AnNK8lYtG0 zAa3dslYtG0AoS@HlYtG0Ab9B#lYtG0;M(ibs~8(<CR>3<z8OAnf#k*ueNk8<NN&8) z*APnt8J-vVa<W8_;d!CoD=ZOYcwXqs$r3?^=Y_t8SR%;qywL9zmIyLDFPwFDVn48X zkV>qZft<=a`U7b|1ad0x!ihjm<#TW%kW+aXCjvQ@&%%j7PUW+4B9K#gCr$)%DxcdY z4&KQCF=3Zp$q<Y6m8>hc6EW@qCCCam5hy{%)a*HAe+iTz+sA(ilpw3%M4$v&4krR7 z$nrQ5C_z@li9iW5CMoxDuNv^}8De2y8*nS=cNt3rl|2M~OJIqhvWKAGD|>;pwMcY- zw`>9GQ+}CYh$RB`DgO#50)~`d!ihkA%CF)?pg!gQ!ihkA$}i$Xpg!ea;zXc6<yRPD zY_$*ydOW*j6Oi*_-_@{0Am_#Y_+*Jd&Wn9N#1es=7yGV;B?37w_U)D>0y!`CJs3*_ za$f9v6P5_%yx4bAeru|^xz$X1N<hx}-({4*5`moa@56~e&iVdIiv1;!bN(3rC6IIe zJvb4_Ip1G{v9LhS`S;?#1ai*5pCS4Js47CMv7zk%ITigO$P$5^ivGxEi9k+87Ka6L zD*EG-{Uwl7k;Z=s<WyvEB9K$j_X#X4kW<n3V5{y<-ME_BEVhB1Pq~kQWr;w}r@R0s z0y&>@FHQt<K4ldr0y&>@4-^02K8yeV)j|IM|5UYAPn-P&s{gN6zE2rZ`~>CyQ}zFU zRsK8_|KF1>NxvZNp!)xxlw>7yRQx}x%=dQDrtqJIzb3p_@VKB$=l{1yZHpo&Y>EeX z^$LWCjSOiR7xEH5p;J8Qs6+q_;=@M8rHn^rGdv*j1W~JFqM;%uY=#FwzAoWmC+tHD z0Q!1_hlNk*hZb;6gYd9vH61yj-&vqjKmpSrI_w(EgMMfMXBw=5r)4^PLcg<sBVUi` zuoL>F1v)wmr~@pM!9h4UnjCM?wn4}ec$#gJz|xWLu=V54PUv?Q=ne$P$&}XVaQoNG z?d<3d91Cq3L_-1SiCo7R=<tb|OCN`auC2Y4w-iX4N7}|1<j9GMi|Mv6P|ECX?gUEB zYtV<03p&4BHhKyryC;QSTi|+0g^F4o%QgMb0^W<k9eu29wbz=y)v2MwC+tfLpcf|z zwH?be`_ckHp2(MufexRrFD(G*NgUo-WcH;6fD9bow3Zh>p<h~{y%Iq7?3wpthe7*B zPB%R=`_=+L-qE#n?)7Z5<=mPcnSN^l=Xtjs+S>G|0{I5_10NGubohjRY5_;CCllG+ zdSpFePfyP?`_cl?M#z~?$5DDB3jdfMnSN;j=ee|M4CV}p{bDdTJu>~!0*(w$>83|! z-&p|Km?W`a%t(oxu<tAYWU#!O+9yR$*mo8Hw9kXyU`nrSq}^*%Lx)f3cNTC>d);Bv zfquP^Z?vY>bmZhVF82@CGgC7iIe7*bG+59~4IMnWm4c>MG(gp0MWg4uY#l#iX$CBV z14UrbqgfuaMh~CR?<~+=2%y2K^~f$9o3+e7vjC96k@q=FQ-Mpw<ugc#rk`1$XK(-w z4$Q9sntf*hK!fA<bD-G>k>TYkvw94lu<tAYXmD6Ry{g%F7639h=|6|*^Hm)_S)@!4 zw-0bnFg?@sGYfbpf=h;}nP&F?56{fMeSUN9dvmXwd%pT_)vr)%Rezy+kxDcB*lfQ4 z{+|flt8dBwMgBVZ^JRY{d%5gx>0d}+B)wJg2a>YnDdOJ~-!B%4-X+=={y_K!;R^(R zD|m%KJM-n4hez%I`|aTqI@5#JS!3hSt#c;I8=h_8VMggpPbUBnhL4&V6AGNri5_%$ z5r7OF3?87;kJ_Lj5l6#DPUs{Lx+@yhMk%vm_gYf^N&Jgm%f^cVqesnWMo(vXFuGu& zC)kXQLynx#wH9%v!DKwre#S%7#TIesNj78Spu;D0wMASXV4@#w8{;(17Fz_JIKkdy zJkM;gMSu+U9@F#87Fz_!;239G<j4tIY!M)XP0ck}2VHCtw+^tYxd!OOV4??HPqOS8 z*NKsnJuYbAl&0o7coL_e>17Y#8h9lTJ2~tmxZTpgcRV<ldoq@`JKNHwa+|xrEseI0 z^BrFJgsrs*kSFp=<B;iEi}d&g$iOR2&of<Z5l042X<FpS30rIt@C<y?Ii@jA9dxlp zoau?2()q}d6S~$SJqiKSz$sk=(`>Ot06mdcI-lwA30rItAOo*7eIL@r7IAe<=9I=U z%~o3kOarGhJ=1ixMV#r$eA4+$2T$m7i?mMyOaq^!V}qQBeA4;2;S;vjVrb925%FxU zxeaR*_@wc5TG(2P02%nCkp?{uI($OcTBJuIfS$l9jYE!{(4`jX9t6n1DNW6E<Yap= zVFBn#ywZ5Cw>Y8ME3c`!4xe}ja~9wlxTR5pWjxcHTucM6G&R$a6SmeOU>dlksiDIs zbgf0)^nhQQRv+OLy3`_$Jb_ypr|IwsTWt}j1GuGWc@Cb?)fQ>51dyRu8gW3xxvxWl zoLx+@wHCou8t_V^J8<j)5nXGMRx^MGZfT@4#v-$&76I}kUTF+6v;RM!_WvHV|NphQ zd)1Gtd+N)oFVOe@pB&Wxr|$om`u{fBU(0@8b{DD#a3H-|@^MuEUnPF8I4t^i(OX0t z!hb^b|Lzfd4b}g<Yvxa94!HOKkyHA7hxUcLnS?!P*S1%j84%vc)d?uygi80oyZx-W zzl%Pl4|wQK0MH;flA{yOAh0#|S@Rh(d%gpZL1g8$$dOa_d<P(d@j10RBBykzMO@P$ zsB>!Q@F`tu5!W;b37u9S;ZwTQB908=NvB1QoYIvRadm)T)Tz}GJf%x5(hduBB6L`| zXF9X5F=j{CS;UnAq9&(T23uy)X$@_c+%9LK<ODZ^Q!68U%9dFK(7?-1&-DCYZU@M~ z$xh95<aCY;8XWLX4IMsJ57s(>YvAyv)kpYL#f5zSRp~^A7dfTtEYf2I@C**&r&dSg zlr6LfpvRoTPsDZjlr6Lfpm)Nd-R6EPZZ%}5)pYQbF0@DwaDWU3I8mZ$B90@cbd^P1 z&)|CZ8uUz;S)`%CA^4cVGTA}+DO+a|Ku;3jGw$d<a>~|O1kjW0l*U1aPw6^~v@-?J z69o8-LynxXWflSQBmq9-pu?wZnMD8%0(>}3dcsbe8F)N^JV|`dIHn^fbeTom^uTcz zmsL;3^$A;P5pWGQj#ER2PuNO}02*xXrd4(Lgsrp)kSEyPjnj1a<VAxS03d^Dd|I9( zCx=|-0RnucR&?Z~!vzhdt*N2ICv7f$Oc3HTPScSSw$dWdGzjsz2Bzssi@0L~lfd+y zNEcef2O?OCT?5l}rA3_S3AUx<G#x%+3oQaogA=W3)e%0S3oYV2gBYJ_ks~K;sYSpu z2=TcFMYE+A0W{bkPRlg4|G#UdH8cN?dGFjm&Hd7xP5pIsN&O_%2UHKt{>SXwW?jl} zD_^BFD!!t4k>VElC**0lT=qMt8sLwmZ;-A?{!a2r$sOX)p?Uz9L?0C0FA@shF0`ZD z|5u{h|1TlfQUC7m`DORq^X%JhTO90th6<aoC(Fal-gvI0sW)n=R6}D6RUOX5xV5#{ zS^<?(n9X{yw~Ib-!^jV?7sNv!Fx$|-SYp*zi+JMMs-D1&_I42N(?;TAbwADuwHQq% zlg3~$8dox%)`5P*)oNA=>`>2#ux}cP%~p9B;@N668V!a*%vEeh_v$ta34Eoujeu_* z35-=sIb+(Yv)Oc)wdg-%#_j6VS{~nFDo?QeU~dbd-^CZ*;?I>bg_NdT)3kEQax0Om z>Vy6*o3Xq>d?MQOa%!EaH)G*0LxY;PGO0o;+blV^jrDMJ!))B#0VQo1ONsV2&%++B zuYxMy&?RmxCY!SsFYVV;rNgysu(=YgwYTg9cDUz3*o%Z}1|Y-MKWJVlbn4l7%VP3u z=!*&C;UR(iKyL#f-!T#yv+pxxb8x>|KswRX%JHN|4@MC2g<x+TeSsW7XHb~Y44SbK zMBs*cZiGu(`56FvNJ3lrpcxstQ3tG?0KU?5Az;$V&k(TTGicV?taQAORtKz{K!333 zMChcI4`8^v(mLA8iBCj(4)h7qx13ck!Zb5z=CE>5H;J+GP;ZS>>wOSC8`?%|ebDSq z)f$Ju#0lVV&yIje6CWT9>t)a!tQ|HB(8LMktG!i(d^=&{eF#)~=`2tSvaGYw>R=39 z2MnCR5B63NK55|R<LkAUffKmV-U|@!=x)U9@a%I|YKkyh%oZ?35ZIyK^AR>Vc+S+y zhE+nHpnw;%(PRXJhXB6PyAJ`AgJ&Et8a(F9S{o|Z1_lp-9_`)Bsgkp@SlFyNXy&kN zP>_qU>{#!42>TYoOwK?sPdI3HHA|&<tzL!>oB)sZ?m3t7QQ-b~F<xp6xo`se{@yae zCf7h`9F9_oFMg2fF!pUU0s|*L5bW8|2S@`y`vA7c8Z=`DPT+=mR)k9$;Q(NGU=EtC zR-4TPjF14n(z767(g+6#BY<@_i{Y{kty8SP2nqCP&y3LVad}oT&1x9ZH)!TCLQs^A zF~Tc769?x5kl_UiXx{kb2Wy#BX?Phypa*+KgpPM4fPs1e&Hi`|dRPMYft~^3;)@6t zV8}o~GhBu1w7>+3F9dt~b2%RxKkOIqWjKKw>gf<JZh|bp(BcF%>-2`9r7{70rKd%} zxCycdqZmeh5Y?Q-mdXTrrFS<%_h7ziJi0ettL0Kj&2tjvQofmq7c_}-Holi@#2dMC z=?<`TCO#SLE#W=D#PFcA>2s?0p><2K4(5GO1(31$VDIu&xErZ>2`p?0+$+83;vFy% zzf1?%F6*HW;6T4?fR5J;w4hps$Zj~BeW_9|kt-C?mZhmnSL?-c&{_k92^pP)dv_xA zp|#L}_kN+mq0sXF^?+_Qo-3p}K-&azsCNfK9<uj|kT-LsBy<4;Ftz`G5_+m{{+7A> z)K^t6o_&MzLy9lU|5bjI>;~yY$p!JeXi4~7^auaH|M$qx^`3v@ZS)fbw@|eyssC$n z@izI)&4s2(r!9D0`Ie)+R`hSCQ|YXwfP6CT5%kPT%tTeIH<+k(Hf*L3ybW{-c_!&# z_^<8TUf-r8;8+X$T`PO0NNd9oO(m;^J#?3~o8AExE*Zn6FsP!p^nXiQEm{wv%DKod zAuh;fG-;wz`rxk_GiLtRT__wxOxi@mu5HxfiTzX!Y2ZF?4U~eRR$#NaV|E5cYk;oU zYNo?CpaxLAQdITaFf`Yo(%ff%&82~GY%dbk`nB4EkI(>Gjq=a{p_nlmxZ1n7uYpCz z24)x=m{|!rcJxMfGi-E+J-%`-){eEeT*IBsEMp8-YU2Vl0Gojg44PN$f%T9B7{EyJ zNB8uka-uGN9(NZvxAL}5zGAne>dnLUYCYr6y6EE614)o6>*?CFRK0svK)Tt4a?N$v z0&DQsTwQ#gk)s0DT-Hp;$P5WeDg2E59&Qb|cD4)EPQcyP+eT{u)tg2ya9F8;S*RH8 zvdN5|D8N<^Xy`G2%~u12OxJmsFLP_4-La>QTLy=JBRE<E22`JW37sck8Ze;B#7la7 zk*z)ZYc37!?Rgrd_HNAMz=k;wJEs*xZ4J!)Y{15?foe5r%A~^S?X9g58aOMpY|~M3 zY6BZU&8V0;dUyiF<I%33Da?%ino9#CM>_q^1uBvbo%gvmKn#wtj?UWG0OsgcTY;p# zo=E%cwRL@Z<8UK<V2KBysAtPrba;$4o6)?4YId^$d`JV}uX#E;Y*+*Fb%teq|6BSI zaz1jkXW<qw?X6jL27f)jQ;whl%7$&{?#gCyAjx3aMJ=9LPfj#5o_x5O5b!)NhYH@? z0y_E~6Qng}Do5Q;G>;b0JVL+&d#UJchZCmtaRQoIPYxxan@Iu9T3!Ou?+lOv63wFp zG;s@<vDCc2HAm5~8y+X%Pqhc><rOI)(L7o}Be#I-2W4BcoNGIM=t+z7P4t?3(C1uB z9~51c`YwDv01Y-|ix%`I1BZzc&7%c0a0?h{r+0#>Y{8q@$!$5RwxnLa)v1tUklIwS z6V1Rx&zdn4rJH$~D0)Le&mkbuJX%0Kw}AVBK+6!#S)+ma&sab-F_I>#r{+u8JX$~< zw}2o5_NOl3c_xb7C07p;&7%d>atl~Z?YA2CFj|>3e)<9iV{y-}b|b6bC-yr!ZUKqr z5dt#t{|_<s|CspyZ>WDkz0{BYe{6Pt_JZ<Mc||EuyhE`m{~lfc@9VN7I{*JrdW+;! zlDy<e;#2Vp#X`|LMO(t}3tul>6?_Xt0O(N!z(eOA8$?d&91l7)1^6@&*1#1p!5m!C zFGpbm98Jk)9V2M?luq-Y!#n^qh<oRVn3xcm&GG=qW5eEQ=8y{;&2!|G&ho(30m9y= zR!8KNEw>1m9v}BUp6lQ#U2c&Miv`diEEX*I1}=I$Zupcfwg_;?#=TF1Ocz_EZ3E0S zAR>y}HqM(?&a95EwTL5wc-!fb*;0#u=kr6Y`sa&y_U2jh8P9a7MVx04Z96^BY^6oO z^Z7wsXUvf!g;xI=&-V;M{2(%$l{h`m%UsAHwsd-A8y7N2N}Lusa%!cJX}<xq0fJUX z_>J)f9XVxdEdpo|wR#QEbgf04>+#NiJlEk<y4WIa(&uL-PGoq2Q@Yk7T~!9?12{YO zh-cvI#xoo_W$P@0r6KT0*Pv#)&LXX501aHy)X?Emy3iu6W&nL1d{X3;uCs_U4Sdqn zOh-=XLW?*wa7xzzO;=hZpjodpHFWrtEwu<#eO=rVTWS#?Ul+GTms-TtaedqpU274C zz8-EVe99JE1o{AOX<9cOK4pt70_5x9m4c_wrX~P-2?mgXS0XAnOyun%r_UNpEMP-7 znOkB{`Gy>!ftkT0r?+!KUyoe7$muh=pvP3x>nmg&*KDmtppY@u^d^E1pVGA!X=e(c zK{dV6c6UD0;ZwTQB9095_@+mui!I{FAdPQ&WVY5K(8l?-^d{6ZU275N8Pw97o@ct$ zB907R`<WIwa>`a(1lj;k1)VdooNpY1{XbRz@1Ifr|MO7(e;4Kd|Cy?#dMc{_pP5xD zPx||RZ@>QE-=g||TIv5n_5W^@{Gp^Md9wHe;;VH1KW6_=)&F~yz%ar7pU(22-8eXQ zAMeJgJsx#5&9Rr(p7|F#%>#!9ZhVBw#zTis={yg*p8?ln{rGs~;3=KvLHlul4E;D8 zJUZ~I<8dRWbd^O$8SLr*ct1WKI($l(S!9&KLWAWcx6x06OjlaOk;kqsCqZTlEv8wX z!Rm5ao+GDhp+$f^esMVo({!OlTpb{va$2Utr)-@?!1UO)<s>|_bru2g*tO+&<j84e zFvkPr@oURTpwnE?*T*TPxS+3xQ;M7>xuAhln%dt5Pw7gFj8|fZ3-n5CxFs*I#FkkE zS9TM5C6JW^zi8?g`3axWWftkd0-z`HN@I~>p~b;H<0M{b407a@F0@EHX}~k^N~3#l z40QMuR$3e|4cyX5-!T>$R$63{*)8w%$aJMeybCAsN@ID3g%$@qPvVuvBFCsfi1Q4* z()8MZbruIa1E(}SGOV*WKn6Z(dStrJBCZYKlBPutoYG|$=~Fl`RDeg~c1UBoFLKJ( zSOhl?6FH<Y*HMvEy2c_sxB>L|?JhN6vAJ2$*ReNU{(;c}Xt3QKspc`rk<;D5oC1)? z?{>#C9XZ|Mf(E<Y(avrx*FG+2u-%;+I($mkS)?r*C}iw@cM^TDWflQ4*zaBg(`=bV z06liYI|<WlnMHsMHoQ|a9XVyoECT59JKphJhfmouivW6TDW*w~*)od&d2H#qNs!qx zivW3S>ACU9%DIa(O@VVp@d`yrv7<05Zj%3K{+05N&A)5@8}hf#e_H-k^$*ow7C04; z3zr1n7yg^{3xY2SzaqI;R1|(x`Bafl@@?6jLXSiw{-)?g(bpxfk*OsynM=AVeL#G( z_%mXw;xS=X{EH%k@PhPq$>+s2#S`Lp3lh>7i{2rXi+&<~o#2g<mgK#PcM4x7c!@YD z{jTU!(o=~>@FCI5g>R8RS@wwR!?L7&Q}zSdm*hwCocwOto75jszghiKbxQ44-=&^Y zeNXl0s8+%2RS&5iRM}O}QYmJ?Gy5mA@0)$?Y<u>~?0vJh&We@aQhrwX9_6c*b!A9t zo0(BQRq=%4am9{w70FwYe^ve?#Z5^5cPbt`H(KEwBK^eTW;S9x^hJu9=-!I|pqy@| zik9v8BJ-*=Am*}}bz^d^72F9dGOtPlV$;2!+e^EujYwvZc~u$^E7^E$-QkICm9>k^ ztI~jY=rsEqnYycyU0Y<{F9yW5Orco~nCyG&mBkO?+}azJd}Cv~kZbD}e-9_7j1F(y zg&sHv*%q0XRRQek=9ataOuC%A2aC+(serh-=BRGkT;+Ycck%ae*jVMjS#9rTolW23 zM{r`j=|!medaAjy_+gxQxD`pnjh2;oAiK!CnGC+^uGsatYNzbowJtKxKLes8ZD^+a zjcR)%zsNkr42WwMn<;H^HVUTLBJ<QMAZ~lM%rTel&{C-`GH<d1V$zj#I4WCv7FT$Y zd0rL}*E9R!Y}!}rR2z%TQ?G#NifjezxlAQn^(->4z60XnMyjTbtcOkM(BcPiB@{ON z-pwsjcz4aY_yL^QsT{01wh#96f%f7lPTbDBqP9xb9@=*<p5Vk{J(tQJ947a(+C}Ca zSin%&o2?xB%!$KY=OXi9D<DP<rafEH<7;IO7n!$b0kIjaHO#yDthTCOWZr=V#B|2D z?cB>5EUVr{=1E&X+zW*Bj%0KD!020KUabYhtaGo~T;0z%8-_*Z?O8w!*A3>iiaFz6 z(JeBs)&iopv|mnE^{vA~Xz|^+5;n88wqe8UaB4G){~aeDT30%HS3F*=*cX2bC%T+# zp0qxfjBJJ$--Q!*%m<x1dU37nD=fYfCsqrG?y9{IUa7kl--;7`X@4rcu~W&IGK+7) ziPZzc`az~<sjgTTe-kIBcf6~PhEZ?#7Z!g5Cwg`_QlV|%YRBAId^1ig)P1R%z1*_w zxE9}p6VrNcvKgwje39+NH{wKpyc2a5JRP4szWD1nF|^hWI4lKAJz-h=L!7wpU&~dU z*`UwrTl@o@Sk9~lP4@KON-(zgX`I-p=2jZ|gH8Q*YVngeaV=2~qL<w~*7c3WPvFEB zs+MAEbsEVH_u|KK;tt9OG&y~_(xH3tV>r>1%-i-H*<!=7yZBL@xV!Ceg}37I`kHU? ze=x*cPM?XpHdcxqP?_sSElvcxjT`UAiQoX^#wDBxHWN2q#))8gbK`SyBB;7`BlDR2 zCd(~YIN!)T><)-v>3bvdGC3fEnu|9wZ<+%l*sR^iJX;QkpzPI+%ro?xiN=;cT1h9f z+SFcrBVR2vJf<y8-{M(f#Cq6imI|3*+N<eXe0pnZwPMYrx7Wc_>5@NUl#nPm%KN%v zGHC=)F)NuTr#D$5c#2ucJUI=B;3;M$^W-!jf~T03%#+iA2%chAGEYteB6xCI$vim? zJXozAh*&yXb*nGC_!uJ!yZne{U7n1gUf(N57C(g(S3-76c_Uhj)%F+PjuSJDXv5&C z>{P<m#kb+a^_c&_Z7gi>>9UKDGQ|2$JYFk1GX)!v^GV;ri9pULeGMl9IiK`(oCu!Q ze$wCIMDVoslfKy}TK5jN{NB*oA?Oux-!$t3V%8JO>QW6;$#Nj>8#PM=W+Lv}Z6%xb z7Pl??>uF#n(*CN3B?2>%_I(0N1Pn?0OCFX8)F<uxA(jZ#C+)A^SRzoLw7*zli9mhQ zz8_+VKz-7_dn+ebEM8~MWoZIAFLoK-vP2-~#b3aQK+cOtI1$Ks@fA1`$a(R<;6xzj z#h2kkAm_y%P6TpZd^tlbcnr<G+F^Xn1LTy5aUzgYBE^Y7PKgL70y!meoCxHU2yh~h zQzFEPKu(DSCjvPoGKR?dKFIAK<3unVB%hy|5p>Sk>-;C_r=<a=SJ=5M7&)}Gn=ZQ} z8`SijF-wda_FW0rn!UMi*7Th*OKk0IrdJP85xZ(t(_c=q#J#pTU5{%UHf>w;7Nz2e znX2H98Ll0(>`iF@os_v`cgoa?$LF+j7lmIDepL7t;md?s(aS|ekxyh0zgzr^sQO=! zIsuT}D?OFIPWoc$18Dz$yHqauw&e4Y_ex$PY02+KdwH~nmwi}phrlU#i69~Pkl>Ai z?+d;-_hX?)xFozV=S3$DubeN>@6Ma%7Zi^v-YL&fXA<(a%0DJQQtZe#nX?J`S4B4p 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 DSROk7 delta 2282813 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%0A=}~+M`|)@qNT~uo*i9$sbbz%2KO} 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%0ADWIHg4~ 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%0A8Ooad@Jc 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 diff --git a/app/src/androidTest/assets/mocks/settingswebapp/generalsettings.json b/app/src/androidTest/assets/mocks/settingswebapp/generalsettings.json new file mode 100644 index 00000000000..8b14c43405f --- /dev/null +++ b/app/src/androidTest/assets/mocks/settingswebapp/generalsettings.json @@ -0,0 +1,9 @@ +{ + "encryptDB": false, + "mobileConfiguration": { + "disableAllSettings": false + }, + "reservedValues": 100, + "smsGateway": "", + "smsResultSender": "" +} diff --git a/app/src/androidTest/java/org/dhis2/AppTest.kt b/app/src/androidTest/java/org/dhis2/AppTest.kt index f594dd84e89..aac5b3b125c 100644 --- a/app/src/androidTest/java/org/dhis2/AppTest.kt +++ b/app/src/androidTest/java/org/dhis2/AppTest.kt @@ -1,7 +1,5 @@ package org.dhis2 -import androidx.lifecycle.MutableLiveData -import androidx.work.WorkInfo import org.dhis2.common.di.TestingInjector import org.dhis2.common.keystore.KeyStoreRobot import org.dhis2.common.preferences.PreferencesTestingModule @@ -10,8 +8,6 @@ import org.dhis2.commons.schedulers.SchedulersProviderImpl import org.dhis2.data.server.ServerModule import org.dhis2.data.user.UserModule import org.dhis2.usescases.BaseTest.Companion.MOCK_SERVER_URL -import org.dhis2.usescases.sync.MockedWorkManagerController -import org.dhis2.usescases.sync.MockedWorkManagerModule import org.dhis2.utils.analytics.AnalyticsModule import org.hisp.dhis.android.core.D2Manager import org.hisp.dhis.android.core.D2Manager.blockingInstantiateD2 @@ -20,8 +16,6 @@ import org.hisp.dhis.android.core.D2Manager.setTestingSecureStore class AppTest : App() { - val mutableWorkInfoStatuses = MutableLiveData<List<WorkInfo>>() - fun restoreDB() { } @@ -68,13 +62,6 @@ class AppTest : App() { .schedulerModule(SchedulerModule(SchedulersProviderImpl())) .analyticsModule(AnalyticsModule()) .preferenceModule(PreferencesTestingModule()) - .workManagerController( - MockedWorkManagerModule( - MockedWorkManagerController( - mutableWorkInfoStatuses - ) - ) - ) } companion object { diff --git a/app/src/androidTest/java/org/dhis2/DBTestLoader.kt b/app/src/androidTest/java/org/dhis2/DBTestLoader.kt index cff717391f2..e294aa278cf 100644 --- a/app/src/androidTest/java/org/dhis2/DBTestLoader.kt +++ b/app/src/androidTest/java/org/dhis2/DBTestLoader.kt @@ -23,7 +23,10 @@ class DBTestLoader(private val context: Context) { Timber.tag("RUNNER_LOG").d("Copying database") val input = InstrumentationRegistry.getInstrumentation() .context.assets.open("databases/$DB_NAME_TEST") - val output = FileOutputStream("$databasePath/$DB_NAME") + + file.parentFile?.mkdirs() + + val output = FileOutputStream(file) writeExtractedFileToDisk(input, output) Timber.d("Database copy done") } catch (e: IOException) { @@ -51,4 +54,4 @@ class DBTestLoader(private val context: Context) { const val DB_NAME_TEST = "dhis_test.db" const val DB_NAME = "127-0-0-1-8080_android_unencrypted.db" } -} \ No newline at end of file +} diff --git a/app/src/androidTest/java/org/dhis2/common/BaseRobot.kt b/app/src/androidTest/java/org/dhis2/common/BaseRobot.kt index bbc2ad5e85c..57f243124e9 100644 --- a/app/src/androidTest/java/org/dhis2/common/BaseRobot.kt +++ b/app/src/androidTest/java/org/dhis2/common/BaseRobot.kt @@ -10,10 +10,12 @@ import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.junit4.ComposeContentTestRule import androidx.compose.ui.test.onNodeWithText import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.FailureHandler import androidx.test.espresso.NoMatchingViewException import androidx.test.espresso.UiController import androidx.test.espresso.ViewAction import androidx.test.espresso.ViewInteraction +import androidx.test.espresso.base.DefaultFailureHandler import androidx.test.espresso.matcher.ViewMatchers.isRoot import androidx.test.espresso.util.TreeIterables import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation @@ -105,6 +107,13 @@ open class BaseRobot { val maxTries = waitMillis / waitMillisPerTry.toInt() var tries = 0 + val defaultFailureHandler = DefaultFailureHandler(getInstrumentation().targetContext) + val failureHandler = FailureHandler { error, matcher -> + if (error is NoMatchingViewException) { + throw error + } + defaultFailureHandler.handle(error, matcher) + } for (i in 0..maxTries) try { @@ -112,7 +121,9 @@ open class BaseRobot { tries++ // Search the root for the view - onView(isRoot()).perform(searchFor(viewMatcher)) + onView(isRoot()) + .withFailureHandler(failureHandler) + .perform(searchFor(viewMatcher)) // If we're here, we found our view. Now return it return onView(viewMatcher) diff --git a/app/src/androidTest/java/org/dhis2/common/db/TestingDatabase.kt b/app/src/androidTest/java/org/dhis2/common/db/TestingDatabase.kt deleted file mode 100644 index 6bf505b016c..00000000000 --- a/app/src/androidTest/java/org/dhis2/common/db/TestingDatabase.kt +++ /dev/null @@ -1,61 +0,0 @@ -package org.dhis2.common.db - -import android.os.Environment -import androidx.test.core.app.ApplicationProvider -import androidx.test.ext.junit.runners.AndroidJUnit4 -import org.dhis2.AppTest -import org.dhis2.data.server.ServerModule -import org.dhis2.usescases.BaseTest -import org.hisp.dhis.android.core.D2Manager -import org.junit.Ignore -import org.junit.Test -import org.junit.runner.RunWith -import timber.log.Timber -import java.io.File -import java.io.FileInputStream -import java.io.FileOutputStream - -@RunWith(AndroidJUnit4::class) -class TestingDatabase : BaseTest() { - - companion object { - const val url = "https://play.dhis2.org/android-current/" - const val username = "android" - const val password = "Android123" - } - - @Ignore("This tests exports the Database to SD card, uncomment to use it locally") - @Test - fun copyDatabase() { - - /* Download db */ - val d2 = - D2Manager.blockingInstantiateD2(ServerModule.getD2Configuration(ApplicationProvider.getApplicationContext<AppTest>())) - d2?.userModule() - ?.logIn(username, password, url) - ?.blockingGet() - d2?.metadataModule()?.blockingDownload() - - /* Export Db to sdcard */ - try { - val sd = Environment.getExternalStorageDirectory() - - if (sd.canWrite()) { - val currentDB = - context.getDatabasePath("play-dhis2-org-android-current_android_unencrypted.db") - val backupDBPath = "dhis_test.db" - val backupDB = File(sd, backupDBPath) - - if (currentDB.exists()) { - val src = FileInputStream(currentDB).channel - val dst = FileOutputStream(backupDB).channel - dst.transferFrom(src, 0, src.size()) - src.close() - dst.close() - } - } - } catch (e: Exception) { - Timber.e(e) - } - } -} \ No newline at end of file diff --git a/app/src/androidTest/java/org/dhis2/usescases/UseCaseTestsSuite.kt b/app/src/androidTest/java/org/dhis2/usescases/UseCaseTestsSuite.kt index 76b6b8edc7c..fa9ddbf28ff 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/UseCaseTestsSuite.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/UseCaseTestsSuite.kt @@ -6,7 +6,6 @@ import org.dhis2.usescases.event.EventTest import org.dhis2.usescases.eventsWithoutRegistration.eventDetails.EventInitialTest import org.dhis2.usescases.login.LoginTest import org.dhis2.usescases.main.MainTest -import org.dhis2.usescases.pin.PinTest import org.dhis2.usescases.programevent.ProgramEventTest import org.dhis2.usescases.searchte.SearchTETest import org.dhis2.usescases.settings.SettingsTest @@ -23,12 +22,12 @@ import org.junit.runners.Suite EventInitialTest::class, EventTest::class, MainTest::class, - PinTest::class, ProgramEventTest::class, SearchTETest::class, SettingsTest::class, SyncActivityTest::class, TeiDashboardTest::class, SchedulingDialogUiTest::class, + LoginTest::class, ) class UseCaseTestsSuite diff --git a/app/src/androidTest/java/org/dhis2/usescases/about/AboutTest.kt b/app/src/androidTest/java/org/dhis2/usescases/about/AboutTest.kt index b5beed52ddb..93476f9db04 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/about/AboutTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/about/AboutTest.kt @@ -1,14 +1,16 @@ package org.dhis2.usescases.about +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.rule.ActivityTestRule -import org.dhis2.bindings.buildInfo -import org.dhis2.bindings.rampCaptureBuildInfo import org.dhis2.BuildConfig import org.dhis2.R +import org.dhis2.bindings.buildInfo +import org.dhis2.bindings.rampCaptureBuildInfo import org.dhis2.usescases.BaseTest import org.dhis2.usescases.main.MainActivity -import org.dhis2.usescases.main.homeRobot +import org.dhis2.usescases.main.MainScreenType import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -19,6 +21,9 @@ class AboutTest : BaseTest() { @get:Rule val rule = ActivityTestRule(MainActivity::class.java, false, false) + @get:Rule + val composeTestRule = createComposeRule() + @Test fun shouldCheckVersionsWhenOpenAboutScreen() { startActivity() @@ -26,18 +31,18 @@ class AboutTest : BaseTest() { val appVersion = getAppVersionName() val sdkVersion = getSDKVersionName() - homeRobot { - clickOnNavigationDrawerMenu() - clickAbout() - } - aboutRobot { checkVersionNames(rampCaptureVersion, appVersion, sdkVersion) } } private fun startActivity() { - rule.launchActivity(null) + rule.launchActivity( + MainActivity.intent( + ApplicationProvider.getApplicationContext(), + MainScreenType.About, + ) + ) } private fun getRampCaptureVersionName() = diff --git a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetDetailRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetDetailRobot.kt index 0216ff9c92a..bb7caf6f126 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetDetailRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetDetailRobot.kt @@ -84,7 +84,7 @@ internal class DataSetDetailRobot( } fun checkDataSetIsNotCompletedAndModified(catCombo: String, orgUnit: String ) { - onView(withId(R.id.recycler)) + waitForView(withId(R.id.recycler)) .check( matches( hasItem( diff --git a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetInitialRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetInitialRobot.kt index 6f8df0645b7..85a98e6a34b 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetInitialRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetInitialRobot.kt @@ -7,7 +7,6 @@ import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performTextReplacement -import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers.isDisplayed @@ -30,23 +29,23 @@ internal class DataSetInitialRobot( ) : BaseRobot() { fun clickOnInputOrgUnit() { - onView(withId(R.id.dataSetOrgUnitInputLayout)).perform(click()) + waitForView(withId(R.id.dataSetOrgUnitInputLayout)).perform(click()) } fun clickOnInputPeriod() { - onView(withId(R.id.dataSetPeriodInputLayout)).perform(click()) + waitForView(withId(R.id.dataSetPeriodInputLayout)).perform(click()) } fun clickOnActionButton() { - onView(withId(R.id.actionButton)).perform(click()) + waitForView(withId(R.id.actionButton)).perform(click()) } fun clickOnInputCatCombo() { - onView(withId(R.id.input_layout)).perform(click()) + waitForView(withId(R.id.input_layout)).perform(click()) } fun selectCatCombo(catCombo: String) { - onView(withText(catCombo)).perform(click()) + waitForView(withText(catCombo)).perform(click()) } fun chooseDate(date: String) { @@ -59,6 +58,7 @@ internal class DataSetInitialRobot( ).performClick() composeTestRule.onNodeWithContentDescription("Date", substring = true).performTextReplacement(date) composeTestRule.onNodeWithText("Accept", true).performClick() + composeTestRule.waitForIdle() } fun checkActionInputIsNotDisplayed() { diff --git a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTableRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTableRobot.kt index ae070a9fa4b..1805133dbdf 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTableRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTableRobot.kt @@ -2,7 +2,6 @@ package org.dhis2.usescases.datasets -import androidx.compose.ui.graphics.Color import androidx.compose.ui.semantics.SemanticsProperties.TestTag import androidx.compose.ui.test.ExperimentalTestApi import androidx.compose.ui.test.SemanticsMatcher @@ -31,7 +30,6 @@ import androidx.compose.ui.test.performTextReplacement import androidx.compose.ui.test.performTouchInput import androidx.compose.ui.test.printToLog import androidx.compose.ui.test.swipeRight -import androidx.core.graphics.toColorInt import org.dhis2.common.BaseRobot import org.dhis2.composetable.ui.semantics.CELL_TEST_TAG import org.dhis2.composetable.ui.semantics.MANDATORY_ICON_TEST_TAG @@ -115,8 +113,19 @@ internal class DataSetTableRobot( composeTestRule.onNodeWithTag(SYNC_BUTTON_TAG) .assertIsDisplayed() .performClick() + + // Wait for the dialog to appear before interacting with it + composeTestRule.waitUntilExactlyOneExists( + hasText("Refresh"), + TIMEOUT, + ) composeTestRule.onNodeWithText("Refresh") .assertIsDisplayed() + + composeTestRule.waitUntilExactlyOneExists( + hasText("Not now"), + TIMEOUT, + ) composeTestRule.onNodeWithText("Not now") .assertIsDisplayed() .performClick() @@ -244,7 +253,7 @@ internal class DataSetTableRobot( fun assertTableIsDisplayed() { composeTestRule.waitUntilExactlyOneExists( hasTestTag("TABLE_SCROLLABLE_COLUMN"), - timeoutMillis = 3000 + timeoutMillis = TIMEOUT ) } @@ -252,7 +261,7 @@ internal class DataSetTableRobot( fun assertImmunizationTableIsDisplayed() { composeTestRule.waitUntilAtLeastOneExists( hasText("Fixed"), - timeoutMillis = 5000 + timeoutMillis = TIMEOUT ) } @@ -400,6 +409,10 @@ internal class DataSetTableRobot( fun checkItemWithTextIsDisplayed(text: String) { assertTableIsDisplayed() + composeTestRule.waitUntilAtLeastOneExists( + hasText(text, substring = true), + timeoutMillis = 10000 + ) composeTestRule.onNodeWithText(text, substring = true, useUnmergedTree = true) .assertIsDisplayed() } diff --git a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt index 17f23469945..55b340e3c09 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/datasets/DataSetTest.kt @@ -307,6 +307,7 @@ class DataSetTest : BaseTest() { val cellId = "PGRlPlhOcmpYcVpySEQ4Ojxjb2M+SGxsdlg1MGNYQzA=" val threeDaysFromNowStr = threeDaysFromNow.format(formatter) val fiveDaysAgoStr = fiveDaysAgo.format(formatter) + enterDataSetStep( uid = dataSetUid, name = dataSetName, @@ -318,20 +319,12 @@ class DataSetTest : BaseTest() { ) checkTableIsNotEditable() - dataSetTableRobot(composeTestRule) { - tapOnSaveButton() - } - composeTestRule.waitForIdle() + createDailyPeriodDataSetInstanceStep( date = threeDaysFromNowStr, orgUnit = orgUnit, catCombo = catCombo ) - // Wait for table to be ready after creating the second dataset instance - composeTestRule.waitUntilExactlyOneExists( - hasTestTag("TABLE_SCROLLABLE_COLUMN"), - timeoutMillis = 10000 - ) tableIsVisible() enterDataStep( tableId = tableId, @@ -374,24 +367,25 @@ class DataSetTest : BaseTest() { } } - private suspend fun waitForTableToBeVisible() { - composeTestRule.awaitIdle() + private fun waitForTableToBeVisible() { + composeTestRule.waitForIdle() dataSetRobot { clickOnDataSetAtPosition(0) } tableIsVisible() } - private suspend fun checkTableIsNotEditable() { + private fun checkTableIsNotEditable() { tableIsVisible() composeTestRule.onNodeWithTag("TABLE_SCROLLABLE_COLUMN").printToLog("TABLE_LOG") dataSetTableRobot(composeTestRule) { checkItemWithTextIsDisplayed("This data is not editable") + tapOnSaveButton() + composeTestRule.waitForIdle() } - composeTestRule.waitForIdle() } - private suspend fun checkContentBoxesAreDisplayed() { + private fun checkContentBoxesAreDisplayed() { tableIsVisible() // Check top and bottom content is displayed in initial section dataSetDetailRobot(composeTestRule) { @@ -449,7 +443,7 @@ class DataSetTest : BaseTest() { } } - private suspend fun checkCategoryIsMovedToRow() { + private fun checkCategoryIsMovedToRow() { val cellIdSection8 = "PGRlPlAzakpINVR1NVZDLCA8Y28+RmJMWlMzdWVXYlE6PGNvPg==" val cellId2Section8 = "PGRlPkZRMm84VUJsY3JTLCA8Y28+RmJMWlMzdWVXYlE6PGNvPg==" val cellIdSection16 = "PGRlPkFyUzdWeXVMOTVmLCA8Y28+RmJMWlMzdWVXYlE6PGNvPg==" @@ -560,7 +554,7 @@ class DataSetTest : BaseTest() { } } - private suspend fun checkAutomaticGroupingDisabled() { + private fun checkAutomaticGroupingDisabled() { val table19 = "t3aNCvHsoSn_0" val table219 = "aN8uN5b15YG_1" val table20 = "ck7mRNwGDjP_1" @@ -637,7 +631,7 @@ class DataSetTest : BaseTest() { } } - private suspend fun checkPivotOptions() { + private fun checkPivotOptions() { val table5 = "aN8uN5b15YG" val table23 = "aN8uN5b15YG_1" val cellIdSection5 = "PGNvYz5ET0M3ZW1MenlSaTo8ZGU+TFNKNW1LcHlFdjE=" @@ -706,29 +700,29 @@ class DataSetTest : BaseTest() { } } - private suspend fun tableIsVisible() { - composeTestRule.awaitIdle() + private fun tableIsVisible() { + composeTestRule.waitForIdle() dataSetTableRobot(composeTestRule) { assertTableIsDisplayed() } } - private suspend fun checkImmunizationTableIsDisplayed() { - composeTestRule.awaitIdle() + private fun checkImmunizationTableIsDisplayed() { + composeTestRule.waitForIdle() dataSetTableRobot(composeTestRule) { assertImmunizationTableIsDisplayed() } } - private suspend fun syncButtonIsAvailableStep() { - composeTestRule.awaitIdle() + private fun syncButtonIsAvailableStep() { + composeTestRule.waitForIdle() dataSetTableRobot(composeTestRule) { syncIsAvailable() } } - private suspend fun checkTotals() { - composeTestRule.awaitIdle() + private fun checkTotals() { + composeTestRule.waitForIdle() dataSetTableRobot(composeTestRule) { totalsAreDisplayed( tableId = "dzjKKQq0cSO", @@ -793,14 +787,14 @@ class DataSetTest : BaseTest() { } } - private suspend fun checkIndicatorsStep() { - composeTestRule.awaitIdle() + private fun checkIndicatorsStep() { + composeTestRule.waitForIdle() dataSetTableRobot(composeTestRule) { indicatorTableIsDisplayed() } } - private suspend fun reenterDataSetToCheckValueSavedStep() { + private fun reenterDataSetToCheckValueSavedStep() { val cell00Id = "PGRlPnM0Nm01TVMwaHh1Ojxjb2M+UHJsdDBDMVJGMHM=" dataSetTableRobot(composeTestRule) { @@ -842,7 +836,7 @@ class DataSetTest : BaseTest() { clickOnFilterBy(filter = "Period") clickOnFromToDate() chooseDate("08082024") - chooseDate("09092026") + chooseDate("09092027") checkFilterCounter("2") } diff --git a/app/src/androidTest/java/org/dhis2/usescases/event/EventRegistrationRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/event/EventRegistrationRobot.kt index d818ea3e31e..13f9abb3a6b 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/event/EventRegistrationRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/event/EventRegistrationRobot.kt @@ -3,13 +3,10 @@ package org.dhis2.usescases.event import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.junit4.ComposeTestRule import androidx.compose.ui.test.onNodeWithText -import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performScrollTo import androidx.test.espresso.Espresso.onView -import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers.withId -import androidx.test.platform.app.InstrumentationRegistry import org.dhis2.R import org.dhis2.common.BaseRobot import org.dhis2.common.matchers.hasCompletedPercentage @@ -25,45 +22,8 @@ fun eventRegistrationRobot( class EventRegistrationRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { - fun openMenuMoreOptions() { - onView(withId(R.id.moreOptions)).perform(click()) - } - - fun clickOnDelete() { - with(InstrumentationRegistry.getInstrumentation().targetContext) { - composeTestRule.onNodeWithText(getString(R.string.delete)).performClick() - } - } - fun checkEventDataEntryIsOpened(completion: Int, orgUnit: String) { onView(withId(R.id.completion)).check(matches(hasCompletedPercentage(completion))) composeTestRule.onNodeWithText(orgUnit).performScrollTo().assertIsDisplayed() } - - fun clickOnShare() { - with(InstrumentationRegistry.getInstrumentation().targetContext) { - composeTestRule.onNodeWithText(getString(R.string.share)).performClick() - } - } - - private fun clickOnNextQR() { - waitForView(withId(R.id.next)).perform(click()) - } - - fun clickOnAllQR(listQR: Int) { - var qrLength = 1 - - while (qrLength < listQR) { - clickOnNextQR() - qrLength++ - } - } - - fun clickOnDeleteDialog() { - onView(withId(R.id.possitive)).perform(click()) - } - - fun clickNextButton() { - waitForView(withId(R.id.action_button)).perform(click()) - } } diff --git a/app/src/androidTest/java/org/dhis2/usescases/flow/teiFlow/TeiFlowRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/flow/teiFlow/TeiFlowRobot.kt index 59904781ca9..a8d0f167239 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/flow/teiFlow/TeiFlowRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/flow/teiFlow/TeiFlowRobot.kt @@ -116,8 +116,10 @@ class TeiFlowRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { teiDashboardRobot(composeTestRule) { clickOnMenuMoreOptions() clickOnTimelineEvents() + composeTestRule.waitForIdle() clickOnMenuMoreOptions() clickOnMenuComplete() + composeTestRule.waitForIdle() checkCanNotAddEvent() checkAllEventsAreClosed() } diff --git a/app/src/androidTest/java/org/dhis2/usescases/login/LoginRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/login/LoginRobot.kt index fce28c37788..25863c4453c 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/login/LoginRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/login/LoginRobot.kt @@ -1,34 +1,24 @@ package org.dhis2.usescases.login import androidx.compose.ui.test.ExperimentalTestApi -import androidx.compose.ui.test.assert import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.assertIsEnabled +import androidx.compose.ui.test.assertIsNotEnabled import androidx.compose.ui.test.hasTestTag import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.ComposeTestRule import androidx.compose.ui.test.onNodeWithTag -import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performTextReplacement -import androidx.test.espresso.Espresso.onView -import androidx.test.espresso.action.ViewActions.click -import androidx.test.espresso.assertion.ViewAssertions.matches -import androidx.test.espresso.intent.Intents -import androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent -import androidx.test.espresso.intent.matcher.IntentMatchers.hasExtra -import androidx.test.espresso.matcher.ViewMatchers.isDisplayed -import androidx.test.espresso.matcher.ViewMatchers.withId -import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.platform.app.InstrumentationRegistry -import org.dhis2.R import org.dhis2.common.BaseRobot -import org.dhis2.commons.dialogs.bottomsheet.CLICKABLE_TEXT_TAG +import org.dhis2.mobile.login.accounts.ui.screen.ACCOUNT_ITEM_TAG +import org.dhis2.mobile.login.main.ui.screen.CREDENTIALS_ERROR_INFO_BAR_TAG +import org.dhis2.mobile.login.main.ui.screen.CREDENTIALS_LOGIN_BUTTON_TAG +import org.dhis2.mobile.login.main.ui.screen.CREDENTIALS_MANAGE_ACCOUNTS_BUTTON_TAG +import org.dhis2.mobile.login.main.ui.screen.CREDENTIALS_PASSWORD_INPUT_TAG +import org.dhis2.mobile.login.main.ui.screen.CREDENTIALS_USERNAME_INPUT_TAG import org.dhis2.mobile.login.main.ui.screen.SERVER_VALIDATION_CONTENT_BUTTON_TAG -import org.dhis2.usescases.BaseTest.Companion.MOCK_SERVER_URL -import org.dhis2.usescases.about.PolicyView -import org.dhis2.usescases.qrScanner.ScanActivity -import org.dhis2.utils.WebViewActivity -import org.hamcrest.CoreMatchers fun loginRobot( @@ -42,7 +32,6 @@ fun loginRobot( class LoginRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { - val context = InstrumentationRegistry.getInstrumentation().targetContext @OptIn(ExperimentalTestApi::class) @@ -54,75 +43,144 @@ class LoginRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { composeTestRule.onNodeWithTag(SERVER_VALIDATION_CONTENT_BUTTON_TAG).performClick() } + @OptIn(ExperimentalTestApi::class) fun typeServerToValidate(server: String) { + composeTestRule.waitUntilExactlyOneExists( + hasTestTag("INPUT_QR_CODE_FIELD"), + TIMEOUT + ) composeTestRule.onNodeWithTag("INPUT_QR_CODE_FIELD").performTextReplacement(server) } - fun clickQRButton() { - composeTestRule.onNodeWithTag("INPUT_QR_CODE_BUTTON").performClick() + @OptIn(ExperimentalTestApi::class) + fun checkServerInputIsDisplayed() { + composeTestRule.waitUntilExactlyOneExists( + hasTestTag("INPUT_QR_CODE_FIELD"), + TIMEOUT, + ) + composeTestRule.onNodeWithTag("INPUT_QR_CODE_FIELD").assertIsDisplayed() } - - fun checkAuthErrorAlertIsVisible() { - waitForView(withText(LOGIN_ERROR_TITLE)).check(matches(isDisplayed())) + @OptIn(ExperimentalTestApi::class) + fun typeUsername(username: String) { + // Wait for credentials screen to appear + composeTestRule.waitUntilExactlyOneExists( + hasTestTag(CREDENTIALS_USERNAME_INPUT_TAG), + TIMEOUT, + ) + // Click on the username input to focus it + composeTestRule.onNodeWithTag(CREDENTIALS_USERNAME_INPUT_TAG).performClick() + // Now find the inner text field and type the username + composeTestRule.onNodeWithTag("INPUT_USER_FIELD").performTextReplacement(username) } - fun clickOKAuthErrorAlert() { - onView(withText(OK)).perform(click()) + @OptIn(ExperimentalTestApi::class) + fun typePassword(password: String) { + // Wait for password field to appear + composeTestRule.waitUntilExactlyOneExists( + hasTestTag(CREDENTIALS_PASSWORD_INPUT_TAG), + TIMEOUT, + ) + // Click on the password input to focus it + composeTestRule.onNodeWithTag(CREDENTIALS_PASSWORD_INPUT_TAG).performClick() + // Now find the inner text field and type the password + composeTestRule.onNodeWithTag("INPUT_PASSWORD_TEXT_FIELD").performTextReplacement(password) } - fun checkUnblockSessionViewIsVisible() { - onView(withId(R.id.cardview_pin)).check(matches(isDisplayed())) + @OptIn(ExperimentalTestApi::class) + fun checkLoginButtonIsEnabled() { + closeKeyboard() + composeTestRule.waitUntilExactlyOneExists( + hasTestTag(CREDENTIALS_LOGIN_BUTTON_TAG), + TIMEOUT, + ) + composeTestRule.onNodeWithTag(CREDENTIALS_LOGIN_BUTTON_TAG) + .assertIsEnabled() } - fun checkURL(url: String) { - composeTestRule.onNodeWithTag("INPUT_QR_CODE_FIELD").assert(hasText(url)) + @OptIn(ExperimentalTestApi::class) + fun checkLoginButtonIsDisabled() { + composeTestRule.waitUntilExactlyOneExists( + hasTestTag(CREDENTIALS_LOGIN_BUTTON_TAG), + TIMEOUT, + ) + composeTestRule.onNodeWithTag(CREDENTIALS_LOGIN_BUTTON_TAG) + .assertIsNotEnabled() } - fun checkWebviewWithRecoveryAccountIsOpened() { - Intents.intended( - CoreMatchers.allOf( - hasExtra( - WebViewActivity.WEB_VIEW_URL, - "${MOCK_SERVER_URL}/dhis-web-commons/security/recovery.action" - ), - hasComponent(WebViewActivity::class.java.name) - ) + @OptIn(ExperimentalTestApi::class) + fun clickLoginButton() { + composeTestRule.waitUntilExactlyOneExists( + hasTestTag(CREDENTIALS_LOGIN_BUTTON_TAG), + TIMEOUT, ) + composeTestRule.onNodeWithTag(CREDENTIALS_LOGIN_BUTTON_TAG).performClick() } - fun checkQRScanIsOpened() { - Intents.intended(CoreMatchers.allOf(hasComponent(ScanActivity::class.java.name))) + @OptIn(ExperimentalTestApi::class) + fun checkServerValidationErrorIsDisplayed() { + // Wait for error to appear in the supporting text of the server input + composeTestRule.waitUntilAtLeastOneExists( + hasTestTag("INPUT_QR_CODE_FIELD"), + TIMEOUT, + ) + // The error is displayed as supporting text, we just need to verify the field is in error state } - fun checkShareDataDialogIsDisplayed() { - val title = InstrumentationRegistry.getInstrumentation() - .targetContext.getString(R.string.improve_app_msg_title) - composeTestRule.onNodeWithText(title) + @OptIn(ExperimentalTestApi::class) + fun checkCredentialsErrorIsDisplayed() { + // Wait for the InfoBar with error message to appear + composeTestRule.waitUntilAtLeastOneExists( + hasTestTag(CREDENTIALS_ERROR_INFO_BAR_TAG), + TIMEOUT, + ) + composeTestRule.onNodeWithTag(CREDENTIALS_ERROR_INFO_BAR_TAG).assertIsDisplayed() } - fun clickOnPrivacyPolicy() { - composeTestRule.onNodeWithTag(CLICKABLE_TEXT_TAG).performClick() + @OptIn(ExperimentalTestApi::class) + fun clickOnManageAccountsButton() { + composeTestRule.waitUntilExactlyOneExists( + hasTestTag(CREDENTIALS_MANAGE_ACCOUNTS_BUTTON_TAG), + TIMEOUT, + ) + composeTestRule.onNodeWithTag(CREDENTIALS_MANAGE_ACCOUNTS_BUTTON_TAG).performClick() } - fun acceptTrackerDialog() { - val title = InstrumentationRegistry - .getInstrumentation() - .targetContext.getString(R.string.improve_app_msg_title) - composeTestRule.onNodeWithText(title).assertIsDisplayed() + @OptIn(ExperimentalTestApi::class) + fun checkAccountIsListed(serverUrl: String, username: String) { + val accountTag = "${ACCOUNT_ITEM_TAG}_${serverUrl}_${username}" + composeTestRule.waitUntilExactlyOneExists( + hasTestTag(accountTag), + TIMEOUT, + ) + composeTestRule.onNodeWithTag(accountTag).assertIsDisplayed() } - fun clickYesOnAcceptTrackerDialog() { - composeTestRule.onNodeWithText(context.getString(R.string.yes)) - .performClick() + @OptIn(ExperimentalTestApi::class) + fun clickOnAccount(serverUrl: String, username: String) { + val accountTag = "${ACCOUNT_ITEM_TAG}_${serverUrl}_${username}" + composeTestRule.waitUntilExactlyOneExists( + hasTestTag(accountTag), + TIMEOUT, + ) + composeTestRule.onNodeWithTag(accountTag).performClick() } - fun checkPrivacyViewIsOpened() { - Intents.intended(CoreMatchers.allOf(hasComponent(PolicyView::class.java.name))) + @OptIn(ExperimentalTestApi::class) + fun checkTrackingPermissionDialogIsDisplayed() { + composeTestRule.waitUntilExactlyOneExists( + hasText("Do you want to help us improve this app?"), + TIMEOUT, + ) } - companion object { - const val LOGIN_ERROR_TITLE = "Login error" - const val OK = "OK" + @OptIn(ExperimentalTestApi::class) + fun acceptTrackingPermission() { + checkTrackingPermissionDialogIsDisplayed() + composeTestRule.waitUntilExactlyOneExists( + hasText("Yes"), + TIMEOUT, + ) + composeTestRule.onNode(hasText("Yes")).performClick() } } diff --git a/app/src/androidTest/java/org/dhis2/usescases/login/LoginTest.kt b/app/src/androidTest/java/org/dhis2/usescases/login/LoginTest.kt index a2cf81e3e12..708a2590a71 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/login/LoginTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/login/LoginTest.kt @@ -1,31 +1,20 @@ package org.dhis2.usescases.login -import android.app.Activity -import android.app.Instrumentation import android.content.Intent import androidx.compose.ui.test.junit4.createComposeRule import androidx.test.core.app.ApplicationProvider -import androidx.test.espresso.intent.Intents.intending -import androidx.test.espresso.intent.matcher.IntentMatchers import org.dhis2.common.keystore.KeyStoreRobot -import org.dhis2.commons.Constants.EXTRA_DATA -import org.dhis2.commons.prefs.Preference.Companion.PIN -import org.dhis2.commons.prefs.Preference.Companion.SESSION_LOCKED import org.dhis2.lazyActivityScenarioRule import org.dhis2.usescases.BaseTest -import org.dhis2.usescases.qrScanner.ScanActivity -import org.hamcrest.CoreMatchers.allOf import org.hisp.dhis.android.core.D2Manager import org.hisp.dhis.android.core.mockwebserver.ResponseController.Companion.API_ME_PATH import org.hisp.dhis.android.core.mockwebserver.ResponseController.Companion.API_SYSTEM_INFO_PATH import org.hisp.dhis.android.core.mockwebserver.ResponseController.Companion.GET import org.junit.FixMethodOrder -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.junit.runners.MethodSorters -@Ignore("implement in login module") @FixMethodOrder(MethodSorters.NAME_ASCENDING) class LoginTest : BaseTest() { @@ -39,6 +28,7 @@ class LoginTest : BaseTest() { restoreDataBaseOnBeforeAction = false super.setUp() setupMockServer() + clearAnalyticsPermission() D2Manager.removeCredentials() } @@ -46,110 +36,60 @@ class LoginTest : BaseTest() { override fun teardown() { restoreDataBaseOnBeforeAction = true super.teardown() + // Restore original credentials D2Manager.setCredentials(KeyStoreRobot.KEYSTORE_USERNAME, KeyStoreRobot.PASSWORD) } - @Ignore("implement in login module") @Test - fun loginFlow() { - mockWebServerRobot.addResponse(GET, API_LOGIN_CONFIG, API_LOGIN_CONFIG_RESPONSE, 200) - mockWebServerRobot.addResponse(GET, API_ME_PATH, API_ME_RESPONSE_OK) - mockWebServerRobot.addResponse(GET, API_SYSTEM_INFO_PATH, API_SYSTEM_INFO_RESPONSE_OK) - mockWebServerRobot.addResponse( - GET, - PATH_WEBAPP_GENERAL_SETTINGS, - API_METADATA_SETTINGS_RESPONSE_ERROR, - 404 - ) - mockWebServerRobot.addResponse(GET, PATH_WEBAPP_INFO, API_METADATA_SETTINGS_INFO_ERROR, 404) + fun shouldLoginWithoutOauth() { + enableIntents() startLoginActivity() loginRobot(composeTestRule) { - typeServerToValidate(MOCK_SERVER_URL) + // Step: Enter incorrect server URL and validate - should show error + typeServerToValidate("https://invalid-server.com") clickOnValidateServerButton() - // Test case - [ANDROAPP-4122](https://dhis2.atlassian.net/browse/ANDROAPP-4122) -// typeUsername(USERNAME) -// typePassword(PASSWORD) -// clearUsernameField() -// clearPasswordField() -// checkUsernameFieldIsClear() -// checkPasswordFieldIsClear() - - //Test case - [ANDROAPP-4123](https://dhis2.atlassian.net/browse/ANDROAPP-4123) -// checkLoginButtonIsHidden() - - // Test case - [ANDROAPP-4126](https://dhis2.atlassian.net/browse/ANDROAPP-4126) - enableIntents() -// clickAccountRecovery() - checkWebviewWithRecoveryAccountIsOpened() - pressBack() - - // Test case - [ANDROAPP-4121](https://dhis2.atlassian.net/browse/ANDROAPP-4121) - mockWebServerRobot.addResponse(GET, API_ME_PATH, API_ME_UNAUTHORIZE, HTTP_UNAUTHORIZE) -// selectUsernameField() -// typeUsername(USERNAME) -// typePassword(PASSWORD) - waitToDebounce(5000) -// clickLoginButton() - checkAuthErrorAlertIsVisible() - clickOKAuthErrorAlert() - - // Test case - [ANDROAPP-4121](https://dhis2.atlassian.net/browse/ANDROAPP-4121) - mockWebServerRobot.addResponse(GET, API_ME_PATH, API_ME_RESPONSE_OK) -// clearPasswordField() -// typePassword(PASSWORD) - waitToDebounce(5000) -// clickLoginButton() - - //Test case - [ANDROAPP-5184](https://dhis2.atlassian.net/browse/ANDROAPP-5184) - checkShareDataDialogIsDisplayed() - clickOnPrivacyPolicy() - checkPrivacyViewIsOpened() - pressBack() - acceptTrackerDialog() - clickYesOnAcceptTrackerDialog() - } - cleanDatabase() - } + checkServerValidationErrorIsDisplayed() - @Ignore("implement in login module") - @Test - fun goToPinScreenWhenPinWasSet() { - preferencesRobot.saveValue(SESSION_LOCKED, true) - preferencesRobot.saveValue(PIN, PIN_PASSWORD) - - startLoginActivity() - - loginRobot(composeTestRule) { + // Step: Enter correct server URL and validate - should proceed to credentials + mockWebServerRobot.addResponse(GET, API_LOGIN_CONFIG, API_LOGIN_CONFIG_RESPONSE, 200) + typeServerToValidate(MOCK_SERVER_URL) clickOnValidateServerButton() - checkUnblockSessionViewIsVisible() - } - } - @Ignore("implement in login module") - @Test - fun generateLoginThroughQR() { - preferencesRobot.cleanPreferences() - enableIntents() - startLoginActivity() + // Step: Credentials screen should be displayed + // Enter incorrect credentials - should show error + mockWebServerRobot.addResponse(GET, API_ME_PATH, API_ME_UNAUTHORIZE, HTTP_UNAUTHORIZE) + checkLoginButtonIsDisabled() + typeUsername("wronguser") + typePassword("wrongpassword") + checkLoginButtonIsEnabled() + clickLoginButton() + checkCredentialsErrorIsDisplayed() + + // Step: Enter correct credentials - should proceed to tracker dialog + mockWebServerRobot.addResponse(GET, API_ME_PATH, API_ME_RESPONSE_OK) + mockWebServerRobot.addResponse(GET, API_SYSTEM_INFO_PATH, API_SYSTEM_INFO_RESPONSE_OK) + mockWebServerRobot.addResponse( + GET, + PATH_WEBAPP_GENERAL_SETTINGS, + API_METADATA_SETTINGS_RESPONSE_OK, + 200 + ) + mockWebServerRobot.addResponse( + GET, + PATH_WEBAPP_INFO, + API_METADATA_SETTINGS_INFO_ERROR, + 404 + ) - loginRobot(composeTestRule) { - mockOnActivityForResult() - clickQRButton() - checkQRScanIsOpened() - checkURL(MOCK_SERVER_URL) - } - } + typeUsername(USERNAME) + typePassword(PASSWORD) + checkLoginButtonIsEnabled() + clickLoginButton() - private fun mockOnActivityForResult() { - val intent = Intent().apply { - putExtra(EXTRA_DATA, MOCK_SERVER_URL - ) + // Step: Handle tracking permission dialog + acceptTrackingPermission() } - val result = Instrumentation.ActivityResult(Activity.RESULT_OK, intent) - intending(allOf(IntentMatchers.hasComponent(ScanActivity::class.java.name))).respondWith( - result - ) } private fun startLoginActivity() { @@ -161,27 +101,32 @@ class LoginTest : BaseTest() { } - private fun cleanDatabase() { - context.deleteDatabase(DB_GENERATED_BY_LOGIN) + private fun clearAnalyticsPermission() { + D2Manager.getD2() + .dataStoreModule() + .localDataStore() + .value(ANALYTICS_PERMISSION_KEY) + .blockingDeleteIfExist() } companion object { const val HTTP_UNAUTHORIZE = 401 const val API_LOGIN_CONFIG = "/api/loginConfig" - const val API_LOGIN_CONFIG_RESPONSE ="mocks/loginconfig/legacy_flow_config.json" + const val API_LOGIN_CONFIG_RESPONSE = "mocks/loginconfig/legacy_flow_config.json" const val API_ME_RESPONSE_OK = "mocks/user/user.json" const val API_ME_UNAUTHORIZE = "mocks/user/unauthorize.json" const val API_SYSTEM_INFO_RESPONSE_OK = "mocks/systeminfo/systeminfo.json" - const val API_METADATA_SETTINGS_RESPONSE_ERROR = - "mocks/settingswebapp/generalsettings_404.json" + const val API_METADATA_SETTINGS_RESPONSE_OK = + "mocks/settingswebapp/generalsettings.json" const val API_METADATA_SETTINGS_INFO_ERROR = "mocks/settingswebapp/infosettings_404.json" const val PATH_WEBAPP_GENERAL_SETTINGS = "/api/dataStore/ANDROID_SETTING_APP/general_settings?.*" const val PATH_WEBAPP_INFO = "/api/dataStore/ANDROID_SETTINGS_APP/info?.*" - const val DB_GENERATED_BY_LOGIN = "127-0-0-1-8080_test_unencrypted.db" - const val PIN_PASSWORD = 1234 - const val USERNAME = "test" - const val PASSWORD = "Android123" + const val USERNAME = "android" // Existing test database username + const val PASSWORD = "Android123" // Existing test database password + + private const val ANALYTICS_PERMISSION_KEY = "analytics_permission" + } } diff --git a/app/src/androidTest/java/org/dhis2/usescases/main/MainRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/main/MainRobot.kt index 07ad8529ebf..5c37733e3a5 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/main/MainRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/main/MainRobot.kt @@ -1,6 +1,5 @@ package org.dhis2.usescases.main -import androidx.compose.ui.semantics.getOrNull import androidx.compose.ui.test.ExperimentalTestApi import androidx.compose.ui.test.SemanticsMatcher import androidx.compose.ui.test.assert @@ -8,50 +7,29 @@ import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.hasTestTag import androidx.compose.ui.test.junit4.ComposeTestRule import androidx.compose.ui.test.onNodeWithTag -import androidx.test.espresso.Espresso.onView -import androidx.test.espresso.action.ViewActions.click -import androidx.test.espresso.contrib.NavigationViewActions -import androidx.test.espresso.matcher.ViewMatchers.withId -import org.dhis2.R import org.dhis2.common.BaseRobot import org.dhis2.usescases.main.program.HOME_ITEMS import org.dhis2.usescases.main.program.hasPrograms -fun homeRobot(robotBody: MainRobot.() -> Unit) { - MainRobot().apply { +private const val HOME_NAVIGATION_TIMEOUT = 15000L + +fun homeRobot( + composeTestRule: ComposeTestRule, + robotBody: MainRobot.() -> Unit +) { + MainRobot(composeTestRule).apply { robotBody() } } -class MainRobot : BaseRobot() { - - fun clickOnNavigationDrawerMenu() = apply { - waitForView(withId(R.id.menu)).perform(click()) - } - - fun clickOnSettings() = apply { - waitForView(withId(R.id.nav_view)).perform(NavigationViewActions.navigateTo(R.id.sync_manager)) - waitToDebounce(FRAGMENT_TRANSITION) - } - - fun clickOnPin() = apply { - onView(withId(R.id.nav_view)).perform(NavigationViewActions.navigateTo(R.id.block_button)) - } - - fun clickAbout() = apply { - onView(withId(R.id.nav_view)).perform(NavigationViewActions.navigateTo(R.id.menu_about)) - waitToDebounce(FRAGMENT_TRANSITION) - } - - fun clickDeleteAccount() = apply { - onView(withId(R.id.nav_view)).perform(NavigationViewActions.navigateTo(R.id.delete_account)) - } +class MainRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { + @OptIn(ExperimentalTestApi::class) fun checkViewIsNotEmpty(composeTestRule: ComposeTestRule) { - composeTestRule.waitUntil() { - composeTestRule.onNodeWithTag(HOME_ITEMS) - .fetchSemanticsNode().config.getOrNull(hasPrograms) == true - } + composeTestRule.waitUntilAtLeastOneExists( + hasTestTag(HOME_ITEMS) and SemanticsMatcher.expectValue(hasPrograms, true), + HOME_NAVIGATION_TIMEOUT, + ) composeTestRule.onNodeWithTag(HOME_ITEMS).assert( SemanticsMatcher.expectValue(hasPrograms, true) ) @@ -59,12 +37,7 @@ class MainRobot : BaseRobot() { @OptIn(ExperimentalTestApi::class) fun checkHomeIsDisplayed(composeTestRule: ComposeTestRule) { - composeTestRule.waitUntilAtLeastOneExists(hasTestTag(HOME_ITEMS), TIMEOUT) + composeTestRule.waitUntilAtLeastOneExists(hasTestTag(HOME_ITEMS), HOME_NAVIGATION_TIMEOUT) composeTestRule.onNodeWithTag(HOME_ITEMS).assertIsDisplayed() } - - companion object { - const val FRAGMENT_TRANSITION = 1500L - const val LOGOUT_TRANSITION = 2000L - } } diff --git a/app/src/androidTest/java/org/dhis2/usescases/main/MainTest.kt b/app/src/androidTest/java/org/dhis2/usescases/main/MainTest.kt index 1df078c6a6a..902fee96ce7 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/main/MainTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/main/MainTest.kt @@ -3,14 +3,9 @@ package org.dhis2.usescases.main import android.content.Intent import androidx.compose.ui.test.junit4.createComposeRule import androidx.test.core.app.ApplicationProvider -import androidx.test.ext.junit.rules.ActivityScenarioRule import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.rule.ActivityTestRule import org.dhis2.lazyActivityScenarioRule import org.dhis2.usescases.BaseTest -import org.dhis2.usescases.development.DevelopmentActivity -import org.dhis2.usescases.eventsWithoutRegistration.eventCapture.EventCaptureActivity -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -27,12 +22,17 @@ class MainTest : BaseTest() { @Throws(Exception::class) override fun setUp() { super.setUp() - startActivity() } @Test fun checkHomeScreenRecyclerviewHasElements() { - homeRobot { + startActivity( + MainActivity.intent( + ApplicationProvider.getApplicationContext(), + MainScreenType.Home(HomeScreen.Programs), + ) + ) + homeRobot(composeTestRule) { composeTestRule.waitForIdle() checkViewIsNotEmpty(composeTestRule) } @@ -40,19 +40,19 @@ class MainTest : BaseTest() { @Test fun shouldNavigateToHomeWhenBackPressed() { - homeRobot { - clickOnNavigationDrawerMenu() - clickOnSettings() + startActivity( + MainActivity.intent( + ApplicationProvider.getApplicationContext(), + MainScreenType.Settings, + ) + ) + homeRobot(composeTestRule) { pressBack() checkHomeIsDisplayed(composeTestRule) } } - private fun startActivity() { - val intent = Intent( - ApplicationProvider.getApplicationContext(), - MainActivity::class.java - ).putExtra(AVOID_SYNC, true) + private fun startActivity(intent: Intent) { rule.launch(intent) } } diff --git a/app/src/androidTest/java/org/dhis2/usescases/pin/PinRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/pin/PinRobot.kt deleted file mode 100644 index a77476e6560..00000000000 --- a/app/src/androidTest/java/org/dhis2/usescases/pin/PinRobot.kt +++ /dev/null @@ -1,40 +0,0 @@ -package org.dhis2.usescases.pin - -import androidx.test.espresso.Espresso.onView -import androidx.test.espresso.action.ViewActions.click -import androidx.test.espresso.assertion.ViewAssertions.matches -import androidx.test.espresso.intent.Intents -import androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent -import androidx.test.espresso.matcher.ViewMatchers.isDisplayed -import androidx.test.espresso.matcher.ViewMatchers.withId -import androidx.test.espresso.matcher.ViewMatchers.withText -import org.dhis2.R -import org.dhis2.common.BaseRobot -import org.dhis2.common.matchers.isToast -import org.dhis2.usescases.main.MainActivity -import org.hamcrest.CoreMatchers.allOf - -fun pinRobot(pinBody: PinRobot.() -> Unit) { - PinRobot().apply { - pinBody() - } -} - -class PinRobot : BaseRobot() { - - fun clickForgotCode() { - onView(withId(R.id.forgotCode)).perform(click()) - } - - fun clickPinButton(button: String) { - onView(withText(button)).perform(click()) - } - - fun checkRedirectToHome() { - Intents.intended(allOf(hasComponent(MainActivity::class.java.name))) - } - - fun checkToastDisplayed(toastText: String) { - onView(withText(toastText)).inRoot(isToast()).check(matches(isDisplayed())) - } -} diff --git a/app/src/androidTest/java/org/dhis2/usescases/pin/PinTest.kt b/app/src/androidTest/java/org/dhis2/usescases/pin/PinTest.kt deleted file mode 100644 index 75664686787..00000000000 --- a/app/src/androidTest/java/org/dhis2/usescases/pin/PinTest.kt +++ /dev/null @@ -1,31 +0,0 @@ -package org.dhis2.usescases.pin - -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.rule.ActivityTestRule -import org.dhis2.usescases.BaseTest -import org.dhis2.usescases.main.MainActivity -import org.dhis2.usescases.main.homeRobot -import org.junit.Rule -import org.junit.Test -import org.junit.runner.RunWith - -@RunWith(AndroidJUnit4::class) -class PinTest : BaseTest() { - - @get:Rule - val rule = ActivityTestRule(MainActivity::class.java, false, false) - - @Test - fun openPin() { - startActivity() - - homeRobot { - clickOnNavigationDrawerMenu() - clickOnPin() - } - } - - private fun startActivity() { - rule.launchActivity(null) - } -} diff --git a/app/src/androidTest/java/org/dhis2/usescases/programevent/ProgramEventTest.kt b/app/src/androidTest/java/org/dhis2/usescases/programevent/ProgramEventTest.kt index 99bde9ffc87..094cbace362 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/programevent/ProgramEventTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/programevent/ProgramEventTest.kt @@ -80,13 +80,11 @@ class ProgramEventTest : BaseTest() { programEventsRobot(composeTestRule) { clickOnEvent(eventDate) - } - eventRobot(composeTestRule) { - openMenuMoreOptions() - clickOnDelete() - clickOnDeleteDialog() - } - programEventsRobot(composeTestRule) { + eventRobot(composeTestRule) { + openMenuMoreOptions() + clickOnDelete() + clickOnDeleteDialog() + } checkEventWasDeleted(eventDate) } } diff --git a/app/src/androidTest/java/org/dhis2/usescases/programevent/robot/ProgramEventsRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/programevent/robot/ProgramEventsRobot.kt index e8d749e430e..ad20e27a443 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/programevent/robot/ProgramEventsRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/programevent/robot/ProgramEventsRobot.kt @@ -9,12 +9,6 @@ import androidx.compose.ui.test.junit4.ComposeContentTestRule import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick -import androidx.test.espresso.Espresso.onView -import androidx.test.espresso.action.ViewActions.click -import androidx.test.espresso.assertion.ViewAssertions.matches -import androidx.test.espresso.matcher.ViewMatchers.isDisplayed -import androidx.test.espresso.matcher.ViewMatchers.withId -import org.dhis2.R import org.dhis2.common.BaseRobot fun programEventsRobot( @@ -68,6 +62,7 @@ class ProgramEventsRobot(val composeTestRule: ComposeContentTestRule) : BaseRobo } fun checkEventWasDeleted(eventDate: String) { + composeTestRule.waitForIdle() composeTestRule.onNodeWithText(eventDate).assertDoesNotExist() } diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt index 93d3178ed9f..3c8674f9c97 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/SearchTETest.kt @@ -111,6 +111,77 @@ class SearchTETest : BaseTest() { } } + @Test + fun shouldFollowTBProgramSearchFlow() { + mockWebServerRobot.addResponse( + ResponseController.GET, + API_TRACKED_ENTITY_PATH, + API_TRACKED_ENTITY_EMPTY_RESPONSE, + ) + + prepareTBIntentAndLaunchActivity(rule) + + searchTeiRobot(composeTestRule) { + waitUntilActivityVisible<SearchTEActivity>() + + // ANDROAPP-5971: Verify the button is displayed and enabled before opening search + checkAddNewTEIButtonIsDisplayedAndEnabled() + + // Open the search parameters panel + clickOnOpenSearch() + + // ANDROAPP-5861: Unique attribute (TB identifier) is first after sort ordering + checkFirstSearchParamIsBarcodeOrQROrUnique(TB_IDENTIFIER_LABEL) + + // Check that all 9 search fields are displayed + checkSearchParamCount(9) + + // ANDROAPP-5862: Search button is disabled when no values are entered + checkSearchButtonIsDisabled() + + // Enter a value to enable the search button (Part A entry) + typeOnSearchParameter(TB_SEARCH_ATTR_CITY, TB_SEARCH_CITY_SHORT) + + // ANDROAPP-5862: Search button is now enabled + checkSearchButtonIsEnabled() + + // Re-enter a short value (1 char) to enable the button + checkFocusedFieldShowsOperatorSupportingText() + typeOnSearchParameter(TB_SEARCH_ATTR_STATE, TB_SEARCH_CITY_SHORT) + checkFocusedFieldShowsOperatorSupportingText() + typeOnSearchParameter(TB_SEARCH_ATTR_TB_NUMBER, TB_SEARCH_CITY_SHORT) + + // Click Search – triggers per-field min-character validation + clickOnSearch() + + // ANDROAPP-7489/7490 & ANDROAPP-1056/7491: + checkMinCharactersErrorIsDisplayed( + TB_SEARCH_ATTR_CITY, + TB_SEARCH_ATTR_STATE, + TB_SEARCH_ATTR_TB_NUMBER, + ) + clickOnClearSearch() + closeKeyboard() + + // Update to valid search values and search again + openNextSearchParameter(TB_SEARCH_ATTR_CITY) + typeOnSearchParameter(TB_SEARCH_ATTR_CITY, TB_SEARCH_CITY) + closeKeyboard() + openNextSearchParameter(TB_SEARCH_ATTR_STATE) + typeOnSearchParameter(TB_SEARCH_ATTR_STATE, TB_SEARCH_STATE) + closeKeyboard() + typeOnSearchParameter(TB_SEARCH_ATTR_TB_NUMBER, TB_SEARCH_TB_NUMBER) + + // Click Search with valid values + clickOnSearch() + + // Verify results: Lynn Dunn and Inés Bebea are displayed + checkSearchResultDisplayed(TB_RESULT_DUNN) + checkSearchResultDisplayed(TB_RESULT_BEBEA) + + } + } + private fun createRegisterTEI() = RegisterTEIUIModel( "Claire", "Jones", @@ -139,5 +210,20 @@ class SearchTETest : BaseTest() { const val CHILD_TE_TYPE_VALUE = "nEenWmSyUEp" const val CHILD_TE_TYPE = "TRACKED_ENTITY_UID" + + // TB Program search flow test constants + const val TB_IDENTIFIER_LABEL = "TB identifier" + + const val TB_SEARCH_ATTR_CITY = "City" + const val TB_SEARCH_ATTR_STATE = "State" + const val TB_SEARCH_ATTR_TB_NUMBER = "TB number" + + const val TB_SEARCH_CITY_SHORT = "C" + const val TB_SEARCH_CITY = "Cit" + const val TB_SEARCH_STATE = "Sta" + const val TB_SEARCH_TB_NUMBER = "34567" + + const val TB_RESULT_DUNN = "Dunn" + const val TB_RESULT_BEBEA = "Bebea" } } diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/FilterRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/FilterRobot.kt index c12066a97fd..753ad5101e1 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/FilterRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/FilterRobot.kt @@ -16,7 +16,6 @@ import androidx.test.espresso.contrib.PickerActions import androidx.test.espresso.contrib.RecyclerViewActions.actionOnItem import androidx.test.espresso.matcher.ViewMatchers.hasDescendant import androidx.test.espresso.matcher.ViewMatchers.isDisplayed -import androidx.test.espresso.matcher.ViewMatchers.withChild import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withParent import androidx.test.espresso.matcher.ViewMatchers.withText @@ -151,7 +150,7 @@ class FilterRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { withParent(withId(R.id.mainToolbar)) ) ) - .check(matches(withChild(withText(filterCount)))) + .check(matches(hasDescendant(withText(filterCount)))) } fun checkCountAtFilter(filter: String, count: String) { @@ -170,8 +169,9 @@ class FilterRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { fun checkTeiAreCompleted() { val nodes = composeTestRule.onAllNodesWithText("Enrollment completed", true) - assert(nodes.fetchSemanticsNodes().size >= 3) { - "Expected at least 3 nodes, but found ${nodes.fetchSemanticsNodes().size}" + composeTestRule.waitForIdle() + assert(nodes.fetchSemanticsNodes().size >= 2) { + "Expected at least 2 nodes, but found ${nodes.fetchSemanticsNodes().size}" } } diff --git a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt index d2c48a74aa1..a30bfb07bdc 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/searchte/robot/SearchTeiRobot.kt @@ -1,18 +1,22 @@ package org.dhis2.usescases.searchte.robot import androidx.compose.ui.test.ExperimentalTestApi +import androidx.compose.ui.test.assert import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.assertIsEnabled +import androidx.compose.ui.test.assertIsNotEnabled import androidx.compose.ui.test.hasAnyAncestor -import androidx.compose.ui.test.hasParent +import androidx.compose.ui.test.hasAnyDescendant import androidx.compose.ui.test.hasTestTag import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.ComposeTestRule import androidx.compose.ui.test.onAllNodesWithTag import androidx.compose.ui.test.onLast -import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.performScrollTo +import androidx.compose.ui.test.performScrollToNode import androidx.compose.ui.test.performTextInput import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click @@ -20,19 +24,14 @@ import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers.hasDescendant import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText -import androidx.test.platform.app.InstrumentationRegistry import org.dhis2.R import org.dhis2.common.BaseRobot -import org.dhis2.common.matchers.RecyclerviewMatchers import org.dhis2.common.matchers.RecyclerviewMatchers.Companion.hasItem -import org.dhis2.common.matchers.RecyclerviewMatchers.Companion.hasNoMoreResultsInProgram -import org.dhis2.common.viewactions.openSpinnerPopup -import org.dhis2.usescases.searchTrackEntity.listView.SearchResult -import org.dhis2.usescases.searchte.entity.DisplayListFieldsUIModel +import org.dhis2.tracker.search.ui.screen.SEARCH_PARAMETERS_LIST_TAG import org.hamcrest.CoreMatchers.allOf import org.hamcrest.CoreMatchers.not -import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItem - +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue fun searchTeiRobot( composeTestRule: ComposeTestRule, @@ -66,7 +65,14 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { ) } + @OptIn(ExperimentalTestApi::class) fun openNextSearchParameter(parameterValue: String) { + closeKeyboard() + composeTestRule.waitForIdle() + composeTestRule + .onNodeWithTag(SEARCH_PARAMETERS_LIST_TAG) + .performScrollToNode(hasText(parameterValue)) + composeTestRule.waitUntilAtLeastOneExists(hasText(parameterValue), TIMEOUT) composeTestRule.onNodeWithText(parameterValue).performClick() } @@ -82,80 +88,17 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { } } + @OptIn(ExperimentalTestApi::class) fun clickOnSearch() { closeKeyboard() - composeTestRule.onNodeWithTag("SEARCH_BUTTON").performClick() - composeTestRule.waitForIdle() - } - - @OptIn(ExperimentalTestApi::class) - fun checkListOfSearchTEI(title: String, attributes: Map<String?, String>) { - //Checks title and all attributes are displayed - composeTestRule.waitUntilAtLeastOneExists(hasText(title)) - composeTestRule.onNodeWithText(title).assertIsDisplayed() - attributes.forEach { item -> - item.key?.let { composeTestRule.onNodeWithText("$it:", true).assertIsDisplayed() } - composeTestRule.onNode( - hasParent(hasTestTag("LIST_CARD_ADDITIONAL_INFO_COLUMN")) - and hasText(item.value, true), useUnmergedTree = true - ).assertIsDisplayed() - } - } - - fun checkNoSearchResult() { - onView(withId(R.id.scrollView)) - .check( - matches( - RecyclerviewMatchers.allElementsWithHolderTypeHave( - SearchResult::class.java, - allOf( - hasNoMoreResultsInProgram() - ) - ) - ) - ) - } - - fun clickOnProgramSpinner() { - onView(withId(R.id.program_spinner)).perform(openSpinnerPopup()) - } - - fun selectAProgram(program: String) { - onView(allOf(withId(R.id.spinner_text), withText(program))) - .perform(click()) - } - - fun checkProgramHasChanged(program: String) { - onView(withId(R.id.spinner_text)).check(matches(withText(program))) - } - - @OptIn(ExperimentalTestApi::class) - fun checkFieldsFromDisplayList( - displayListFieldsUIModel: DisplayListFieldsUIModel - ) { - //Given the title is the first attribute - val title = "First name: ${displayListFieldsUIModel.name}" - val displayedAttributes = createAttributesList(displayListFieldsUIModel) - val showMoreText = InstrumentationRegistry.getInstrumentation() - .targetContext.getString(R.string.show_more) composeTestRule.waitForIdle() - composeTestRule.waitUntilAtLeastOneExists(hasText(showMoreText)) - //When we expand all attribute list - composeTestRule.onNodeWithText(showMoreText, true, useUnmergedTree = true).performClick() - //Then The title and all attributes are displayed - composeTestRule.onNodeWithText(title).assertIsDisplayed() - displayedAttributes.forEach { item -> - item.key?.let { composeTestRule.onNodeWithText("$it:", true).assertIsDisplayed() } - composeTestRule.onNode( - hasParent(hasTestTag("LIST_CARD_ADDITIONAL_INFO_COLUMN")) - and hasText(item.value, true), useUnmergedTree = true - ).assertIsDisplayed() - } + composeTestRule.waitUntilAtLeastOneExists(hasTestTag("SEARCH_BUTTON"), TIMEOUT) + composeTestRule.onNodeWithTag("SEARCH_BUTTON").performClick() } @OptIn(ExperimentalTestApi::class) fun clickOnShowMap() { - composeTestRule.waitUntilAtLeastOneExists(hasTestTag("NAVIGATION_BAR_ITEM_Map"),TIMEOUT) + composeTestRule.waitUntilAtLeastOneExists(hasTestTag("NAVIGATION_BAR_ITEM_Map"), TIMEOUT) composeTestRule.onNodeWithTag("NAVIGATION_BAR_ITEM_Map").performClick() } @@ -172,7 +115,7 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { // Finally assert that the text is displayed composeTestRule.onNode( hasAnyAncestor(hasTestTag("LIST_CARD_ADDITIONAL_INFO_COLUMN")) - and hasText(firstName, ignoreCase = true, substring = true), + and hasText(firstName, ignoreCase = true, substring = true), useUnmergedTree = true ).assertIsDisplayed() } @@ -185,27 +128,136 @@ class SearchTeiRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { onView(withId(R.id.createButton)).perform(click()) } - fun checkListOfSearchTEIWithAdditionalInfo(title: String, additionalText: String) { - composeTestRule.onNodeWithText(title).assertIsDisplayed() - composeTestRule.onNodeWithContentDescription(additionalText).assertIsDisplayed() - } - - private fun createAttributesList(displayListFieldsUIModel: DisplayListFieldsUIModel) = listOf( - AdditionalInfoItem( - key = "Last name", - value = displayListFieldsUIModel.lastName, - ), - AdditionalInfoItem( - key = "Email", - value = displayListFieldsUIModel.email, - ), - AdditionalInfoItem( - key = "Date of birth", - value = displayListFieldsUIModel.birthday, - ), - AdditionalInfoItem( - key = "Address", - value = displayListFieldsUIModel.address, - ), - ) + // --- Methods for the TB Program search flow test --- + + @OptIn(ExperimentalTestApi::class) + fun checkAddNewTEIButtonIsDisplayedAndEnabled() { + composeTestRule.waitUntilAtLeastOneExists(hasTestTag("ADD_NEW_BUTTON"), TIMEOUT) + composeTestRule.onNodeWithTag("ADD_NEW_BUTTON") + .assertIsDisplayed() + .assertIsEnabled() + } + + @OptIn(ExperimentalTestApi::class) + fun checkFirstSearchParamIsBarcodeOrQROrUnique(expectedLabel: String) { + composeTestRule.waitUntilAtLeastOneExists(hasTestTag("SEARCH_PARAM_ITEM"), TIMEOUT) + composeTestRule + .onAllNodesWithTag("SEARCH_PARAM_ITEM")[0] + .assert(hasText(expectedLabel)) + } + + @OptIn(ExperimentalTestApi::class) + fun checkSearchParamCount(expectedCount: Int) { + composeTestRule.waitUntilAtLeastOneExists(hasTestTag("SEARCH_PARAM_ITEM"), TIMEOUT) + val count = composeTestRule + .onAllNodesWithTag("SEARCH_PARAM_ITEM") + .fetchSemanticsNodes() + .size + assertEquals( + "Expected $expectedCount search parameters, but found $count", + expectedCount, + count + ) + } + + @OptIn(ExperimentalTestApi::class) + fun checkSearchButtonIsDisabled() { + composeTestRule.waitUntilAtLeastOneExists(hasTestTag("SEARCH_BUTTON"), TIMEOUT) + composeTestRule.onNodeWithTag("SEARCH_BUTTON").assertIsNotEnabled() + } + + @OptIn(ExperimentalTestApi::class) + fun checkSearchButtonIsEnabled() { + composeTestRule.waitUntilAtLeastOneExists(hasTestTag("SEARCH_BUTTON"), TIMEOUT) + composeTestRule.onNodeWithTag("SEARCH_BUTTON").assertIsEnabled() + } + + @OptIn(ExperimentalTestApi::class) + fun typeOnSearchParameter(label: String, value: String) { + // Dismiss the keyboard first so the LazyColumn recomposes and exposes all field labels. + // Without this, items scrolled behind an open keyboard are dropped from composition and + // waitUntilAtLeastOneExists(hasText(label)) times out on the next field. + // We do NOT close the keyboard at the end: keeping focus on the typed field lets + // checkFocusedFieldShowsOperatorSupportingText() read its supporting text. + // Any focus jump caused by the IMM dismiss is immediately overridden by clicking the label. + closeKeyboard() + composeTestRule.waitForIdle() + // Scroll the LazyColumn to ensure the target field is in composition before clicking. + composeTestRule + .onNodeWithTag(SEARCH_PARAMETERS_LIST_TAG) + .performScrollToNode(hasText(label)) + composeTestRule.waitUntilAtLeastOneExists(hasText(label), TIMEOUT) + composeTestRule.onNodeWithText(label).performClick() + composeTestRule.waitUntilAtLeastOneExists(hasTestTag("INPUT_TEXT_FIELD"), TIMEOUT) + composeTestRule.onAllNodesWithTag("INPUT_TEXT_FIELD").onLast().performTextInput(value) + } + + @OptIn(ExperimentalTestApi::class) + fun clickOnClearSearch() { + closeKeyboard() + composeTestRule.waitForIdle() + val count = composeTestRule + .onAllNodesWithTag("INPUT_TEXT_RESET_BUTTON", useUnmergedTree = true) + .fetchSemanticsNodes().size + repeat(count) { + composeTestRule.waitForIdle() + composeTestRule + .onAllNodesWithTag("INPUT_TEXT_RESET_BUTTON", useUnmergedTree = true)[0] + .performScrollTo() + .performClick() + // Use hardware back press to dismiss the keyboard that appears after clicking X. + // Unlike closeKeyboard() (IMM-based), the back key is consumed by the keyboard + // itself before reaching Compose, so focus does not jump to the first focusable + // item (Unique ID) in the LazyColumn. + pressBack() + composeTestRule.waitForIdle() + } + } + + + @OptIn(ExperimentalTestApi::class) + fun checkFocusedFieldShowsOperatorSupportingText() { + composeTestRule.waitUntilAtLeastOneExists( + hasText("Exact matches only") or + hasText("Must match the start of the value") or + hasText("Must match the end of the value"), + TIMEOUT, + ) + } + + @OptIn(ExperimentalTestApi::class) + fun checkMinCharactersErrorIsDisplayed(vararg fieldLabels: String) { + composeTestRule.waitForIdle() + + fieldLabels.forEach { label -> + // Scroll the LazyColumn to compose the target field before asserting. + // Off-screen items are dropped from composition on slow CI devices, causing + // waitUntilAtLeastOneExists to time out even though the error is present. + composeTestRule + .onNodeWithTag(SEARCH_PARAMETERS_LIST_TAG) + .performScrollToNode(hasText(label)) + composeTestRule.waitForIdle() + + val containerMatcher = + hasAnyDescendant(hasText(label)) and + hasAnyDescendant(hasText("Enter at least", substring = true)) + + composeTestRule.waitUntilAtLeastOneExists(containerMatcher, TIMEOUT) + + val matchingNodes = composeTestRule + .onAllNodes(containerMatcher) + .fetchSemanticsNodes() + + assertTrue( + "Expected a min-characters error associated with field label \"$label\", but none was found.", + matchingNodes.isNotEmpty(), + ) + } + } + + @OptIn(ExperimentalTestApi::class) + fun checkSearchResultDisplayed(teiName: String) { + composeTestRule.waitUntilAtLeastOneExists(hasText(teiName, substring = true), TIMEOUT) + composeTestRule.onNodeWithText(teiName, substring = true).assertIsDisplayed() + } } diff --git a/app/src/androidTest/java/org/dhis2/usescases/settings/SettingsRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/settings/SettingsRobot.kt index 185332def79..224760e655c 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/settings/SettingsRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/settings/SettingsRobot.kt @@ -1,8 +1,8 @@ package org.dhis2.usescases.settings +import androidx.compose.ui.test.ExperimentalTestApi import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsNotDisplayed -import androidx.compose.ui.test.hasAnyAncestor import androidx.compose.ui.test.hasTestTag import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.ComposeTestRule @@ -77,13 +77,13 @@ class SettingsRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { fun clickOnReservedValues() { composeTestRule.onNodeWithTag(SettingItem.RESERVED_VALUES.name).performClick() + composeTestRule.waitForIdle() } fun clickOnManageReservedValues() { composeTestRule.onNode( hasText(getString(R.string.manage_reserved_values_button), ignoreCase = true) ).performClick() - Intents.intended(IntentMatchers.hasComponent(ReservedValueActivity::class.java.name)) } @@ -95,7 +95,12 @@ class SettingsRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { waitForView(withId(R.id.errorRecycler)).check(matches(isDisplayed())) } + @OptIn(ExperimentalTestApi::class) fun checkTwoFAOptionIsDisplayed() { + composeTestRule.waitUntilAtLeastOneExists( + hasTestTag(SettingItem.TWO_FACTOR_AUTH.name), + TIMEOUT + ) composeTestRule.onNodeWithTag(SettingItem.TWO_FACTOR_AUTH.name).assertIsDisplayed() } diff --git a/app/src/androidTest/java/org/dhis2/usescases/settings/SettingsTest.kt b/app/src/androidTest/java/org/dhis2/usescases/settings/SettingsTest.kt index ce1b9bcb812..df2a7e4227e 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/settings/SettingsTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/settings/SettingsTest.kt @@ -1,15 +1,13 @@ package org.dhis2.usescases.settings -import android.content.Intent import androidx.compose.ui.test.junit4.createComposeRule import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import org.dhis2.commons.featureconfig.model.Feature import org.dhis2.lazyActivityScenarioRule import org.dhis2.usescases.BaseTest -import org.dhis2.usescases.main.AVOID_SYNC import org.dhis2.usescases.main.MainActivity -import org.dhis2.usescases.main.homeRobot +import org.dhis2.usescases.main.MainScreenType import org.junit.Before import org.junit.Rule import org.junit.Test @@ -33,12 +31,6 @@ class SettingsTest : BaseTest() { @Test fun shouldFindEditPeriodDisabledWhenClickOnSyncData() { startActivity() - - homeRobot { - clickOnNavigationDrawerMenu() - clickOnSettings() - } - settingsRobot(composeTestRule) { clickOnSyncData() checkEditPeriodIsDisableForData() @@ -48,12 +40,6 @@ class SettingsTest : BaseTest() { @Test fun shouldFindEditDisabledWhenClickOnSyncConfiguration() { startActivity() - - homeRobot { - clickOnNavigationDrawerMenu() - clickOnSettings() - } - settingsRobot(composeTestRule) { clickOnSyncConfiguration() checkEditPeriodIsDisableForConfiguration() @@ -63,12 +49,6 @@ class SettingsTest : BaseTest() { @Test fun shouldFindEditDisableWhenClickOnSyncParameters() { startActivity() - - homeRobot { - clickOnNavigationDrawerMenu() - clickOnSettings() - } - settingsRobot(composeTestRule) { clickOnSyncParameters() checkEditPeriodIsDisableForParameters() @@ -78,12 +58,6 @@ class SettingsTest : BaseTest() { @Test fun shouldRefillValuesWhenClickOnReservedValues() { startActivity() - - homeRobot { - clickOnNavigationDrawerMenu() - clickOnSettings() - } - settingsRobot(composeTestRule) { clickOnReservedValues() clickOnManageReservedValues() @@ -93,12 +67,6 @@ class SettingsTest : BaseTest() { @Test fun shouldSuccessfullyOpenLogs() { startActivity() - - homeRobot { - clickOnNavigationDrawerMenu() - clickOnSettings() - } - settingsRobot(composeTestRule) { clickOnOpenSyncErrorLog() checkLogViewIsDisplayed() @@ -109,14 +77,7 @@ class SettingsTest : BaseTest() { @Test fun shouldNotShowTwoFAOption() { disableFeatureConfigValue(Feature.TWO_FACTOR_AUTHENTICATION) - startActivity() - - homeRobot { - clickOnNavigationDrawerMenu() - clickOnSettings() - } - settingsRobot(composeTestRule) { checkTwoFAOptionIsNotDisplayed() } @@ -128,12 +89,6 @@ class SettingsTest : BaseTest() { enableFeatureConfigValue(Feature.TWO_FACTOR_AUTHENTICATION) startActivity() - - homeRobot { - clickOnNavigationDrawerMenu() - clickOnSettings() - } - settingsRobot(composeTestRule) { checkTwoFAOptionIsDisplayed() clickOnTwoFASettings() @@ -142,10 +97,10 @@ class SettingsTest : BaseTest() { } private fun startActivity() { - val intent = Intent( + val intent = MainActivity.intent( ApplicationProvider.getApplicationContext(), - MainActivity::class.java - ).putExtra(AVOID_SYNC, true) + MainScreenType.Settings + ) rule.launch(intent) } } diff --git a/app/src/androidTest/java/org/dhis2/usescases/sync/MockedWorkManagerController.kt b/app/src/androidTest/java/org/dhis2/usescases/sync/MockedWorkManagerController.kt deleted file mode 100644 index aa258d6b737..00000000000 --- a/app/src/androidTest/java/org/dhis2/usescases/sync/MockedWorkManagerController.kt +++ /dev/null @@ -1,53 +0,0 @@ -package org.dhis2.usescases.sync - -import androidx.lifecycle.LiveData -import androidx.work.WorkInfo -import org.dhis2.data.service.workManager.WorkManagerController -import org.dhis2.data.service.workManager.WorkerItem - -class MockedWorkManagerController(private val workInfoStatuses: LiveData<List<WorkInfo>>) : - WorkManagerController { - - override fun syncDataForWorker(workerItem: WorkerItem) { - } - - override fun syncDataForWorker(dataWorkerTag: String, workName: String) { - - } - - override fun syncMetaDataForWorker(metadataWorkerTag: String, workName: String) { - } - - override fun beginUniqueWork(workerItem: WorkerItem) { - } - - override fun enqueuePeriodicWork(workerItem: WorkerItem) { - } - - override fun getWorkInfosForUniqueWorkLiveData(workerName: String): LiveData<List<WorkInfo>> { - return workInfoStatuses - } - - override fun getWorkInfosByTagLiveData(tag: String): LiveData<List<WorkInfo>> { - return workInfoStatuses - } - - override fun getWorkInfosForTags(vararg tags: String): LiveData<List<WorkInfo>> { - return workInfoStatuses - } - - override fun cancelAllWork() { - } - - override suspend fun cancelAllWorkAndWait() { - } - - override fun cancelAllWorkByTag(tag: String) { - } - - override fun cancelUniqueWork(workName: String) { - } - - override fun pruneWork() { - } -} \ No newline at end of file diff --git a/app/src/androidTest/java/org/dhis2/usescases/sync/MockedWorkManagerModule.kt b/app/src/androidTest/java/org/dhis2/usescases/sync/MockedWorkManagerModule.kt deleted file mode 100644 index 6d312feb985..00000000000 --- a/app/src/androidTest/java/org/dhis2/usescases/sync/MockedWorkManagerModule.kt +++ /dev/null @@ -1,13 +0,0 @@ -package org.dhis2.usescases.sync - -import androidx.work.WorkManager -import org.dhis2.data.service.workManager.WorkManagerController -import org.dhis2.data.service.workManager.WorkManagerModule - -class MockedWorkManagerModule(private val mockedController: WorkManagerController) : - WorkManagerModule() { - - override fun providesWorkManagerController(workManager: WorkManager): WorkManagerController { - return mockedController - } -} \ No newline at end of file diff --git a/app/src/androidTest/java/org/dhis2/usescases/sync/SyncActivityTest.kt b/app/src/androidTest/java/org/dhis2/usescases/sync/SyncActivityTest.kt index 006b9ad8be9..8b9b969d5e3 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/sync/SyncActivityTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/sync/SyncActivityTest.kt @@ -1,52 +1,60 @@ package org.dhis2.usescases.sync -import androidx.lifecycle.MutableLiveData -import androidx.test.core.app.ApplicationProvider -import androidx.test.ext.junit.rules.activityScenarioRule +import androidx.test.core.app.ActivityScenario import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.work.Data -import androidx.work.WorkInfo -import org.dhis2.AppTest -import org.dhis2.commons.Constants +import kotlinx.coroutines.flow.MutableStateFlow +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.model.SyncJobStatus +import org.dhis2.mobile.sync.model.SyncStatus import org.dhis2.usescases.BaseTest -import org.junit.Before +import org.junit.After import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith -import java.util.UUID -import org.junit.After +import org.koin.test.KoinTest +import org.koin.test.mock.MockProviderRule +import org.koin.test.mock.declareMock +import org.mockito.Mockito +import org.mockito.kotlin.any +import org.mockito.kotlin.doAnswer +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.whenever + @RunWith(AndroidJUnit4::class) -class SyncActivityTest : BaseTest() { - private lateinit var workInfoStatusLiveData: MutableLiveData<List<WorkInfo>> +class SyncActivityTest : BaseTest(), KoinTest { + private val metadataSyncJobStatuses = MutableStateFlow<List<SyncJobStatus>>(emptyList()) @get:Rule - val rule = activityScenarioRule<SyncActivity>() - - @Before - override fun setUp() { - super.setUp() - workInfoStatusLiveData = - ApplicationProvider.getApplicationContext<AppTest>().mutableWorkInfoStatuses - } + val mockProvider = + MockProviderRule.create { clazz -> + Mockito.mock(clazz.java) + } @After override fun teardown() { super.teardown() - workInfoStatusLiveData.postValue(emptyList()) + metadataSyncJobStatuses.tryEmit(emptyList()) } @Test fun shouldShowMetadataErrorDialog() { - syncRobot { - waitUntilActivityVisible<SyncActivity>() - waitToDebounce(3000) - workInfoStatusLiveData.postValue(arrayListOf(mockedMetaWorkInfo(WorkInfo.State.RUNNING))) - waitToDebounce(3000) - workInfoStatusLiveData.postValue(arrayListOf(mockedMetaWorkInfo(WorkInfo.State.FAILED))) - waitToDebounce(3000) - checkMetadataErrorDialogIsDisplayed() + declareMock<SyncBackgroundJobAction> { + whenever(launchMetadataSync(any())) doAnswer {} + whenever(observeMetadataJob()) doReturn metadataSyncJobStatuses + } + + ActivityScenario.launch(SyncActivity::class.java).use { + syncRobot { + waitUntilActivityVisible<SyncActivity>() + waitToDebounce(3000) + metadataSyncJobStatuses.tryEmit(listOf(mockedMetadataJobStatus(SyncStatus.Running))) + waitToDebounce(3000) + metadataSyncJobStatuses.tryEmit(listOf(mockedMetadataJobStatus(SyncStatus.Failed))) + waitToDebounce(3000) + checkMetadataErrorDialogIsDisplayed() + } } } @@ -54,28 +62,28 @@ class SyncActivityTest : BaseTest() { fun shouldCompleteSyncProcess() { enableIntents() - syncRobot { - waitUntilActivityVisible<SyncActivity>() - workInfoStatusLiveData.postValue(arrayListOf(mockedMetaWorkInfo(WorkInfo.State.RUNNING))) - waitToDebounce(3000) - checkMetadataIsSyncing() - checkDataIsWaiting() - workInfoStatusLiveData.postValue(arrayListOf(mockedMetaWorkInfo(WorkInfo.State.SUCCEEDED))) - waitToDebounce(3000) - checkMainActivityIsLaunched() + declareMock<SyncBackgroundJobAction> { + whenever(launchMetadataSync(any())) doAnswer {} + whenever(observeMetadataJob()) doReturn metadataSyncJobStatuses } - } - private fun mockedMetaWorkInfo(state: WorkInfo.State): WorkInfo { - return WorkInfo( - id = UUID.randomUUID(), - state = state, - tags = setOf(Constants.META_NOW), - outputData = Data.EMPTY, - progress = Data.EMPTY, - runAttemptCount = 0, - generation = 0 - ) + ActivityScenario.launch(SyncActivity::class.java).use { + syncRobot { + waitUntilActivityVisible<SyncActivity>() + metadataSyncJobStatuses.tryEmit(listOf(mockedMetadataJobStatus(SyncStatus.Running))) + waitToDebounce(3000) + checkMetadataIsSyncing() + checkDataIsWaiting() + metadataSyncJobStatuses.tryEmit(listOf(mockedMetadataJobStatus(SyncStatus.Succeed))) + waitToDebounce(3000) + checkMainActivityIsLaunched() + } + } } -} + private fun mockedMetadataJobStatus(status: SyncStatus) = SyncJobStatus( + tags = listOf("METADATA_SYNC", "METADATA_SYNC_NOW"), + status = status, + message = null + ) +} diff --git a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/TeiDashboardTest.kt b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/TeiDashboardTest.kt index 93c3c49e54f..1e67d65ca19 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/TeiDashboardTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/TeiDashboardTest.kt @@ -339,23 +339,21 @@ class TeiDashboardTest : BaseTest() { clickOnTimelineEvents() clickOnMenuMoreOptions() clickOnMenuProgramEnrollments() - } - enrollmentRobot(composeTestRule) { - clickOnAProgramForEnrollment(composeTestRule, womanProgram) - clickOnAcceptInDatePicker() + enrollmentRobot(composeTestRule) { + clickOnAProgramForEnrollment(composeTestRule, womanProgram) + clickOnAcceptInDatePicker() - orgUnitSelectorRobot(composeTestRule) { - selectTreeOrgUnit(orgUnit) - } + orgUnitSelectorRobot(composeTestRule) { + selectTreeOrgUnit(orgUnit) + } - waitUntilActivityVisible<EnrollmentActivity>() - openFormSection(personAttribute) - typeOnInputDateField("01012000", "Date of birth") - clickOnSaveEnrollment() - } + waitUntilActivityVisible<EnrollmentActivity>() + openFormSection(personAttribute) + typeOnInputDateField("01012000", "Date of birth") + clickOnSaveEnrollment() + } - teiDashboardRobot(composeTestRule) { waitToDebounce(1000) clickOnMenuMoreOptions() clickOnTimelineEvents() diff --git a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/dialogs/scheduling/SchedulingDialogUiTest.kt b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/dialogs/scheduling/SchedulingDialogUiTest.kt index 439cd182a0d..7406d43880b 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/dialogs/scheduling/SchedulingDialogUiTest.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/dialogs/scheduling/SchedulingDialogUiTest.kt @@ -1,10 +1,13 @@ package org.dhis2.usescases.teidashboard.dialogs.scheduling import androidx.compose.ui.test.ExperimentalTestApi +import androidx.compose.ui.test.hasAnyAncestor import androidx.compose.ui.test.hasTestTag +import androidx.compose.ui.test.isSelectable import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.compose.ui.test.onAllNodesWithTag import androidx.compose.ui.test.onFirst +import androidx.compose.ui.test.onLast import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick @@ -34,7 +37,11 @@ class SchedulingDialogUiTest : BaseTest() { val composeTestRule = createAndroidComposeRule<TestActivity>() private val viewModel: SchedulingViewModel = mock() - private val enrollment = Enrollment.builder().uid("enrollmentUid").build() + private val enrollment = Enrollment + .builder() + .uid("enrollmentUid") + .attributeOptionCombo("attributeOptionComboUid") + .build() private val overdueSubtitle = "Overdue subtitle" @@ -145,7 +152,14 @@ class SchedulingDialogUiTest : BaseTest() { ) { } } - composeTestRule.onNodeWithText("No").performClick() + composeTestRule.waitForIdle() + composeTestRule + .onAllNodes( + matcher = hasAnyAncestor(hasTestTag("YES_NO_OPTIONS")) and isSelectable(), + useUnmergedTree = true, + ) + .onLast() + .performClick() composeTestRule.onNodeWithText("Program stage").assertDoesNotExist() composeTestRule.onNodeWithText("Date").assertDoesNotExist() composeTestRule.onNodeWithText("CatCombo *").assertDoesNotExist() diff --git a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/EnrollmentRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/EnrollmentRobot.kt index 1941f23e3db..1a95d437aa5 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/EnrollmentRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/EnrollmentRobot.kt @@ -40,9 +40,15 @@ fun enrollmentRobot( class EnrollmentRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { + @OptIn(ExperimentalTestApi::class) fun clickOnAProgramForEnrollment(composeTestRule: ComposeTestRule, program: String) { + val testTag = PROGRAM_TO_ENROLL.format(program) composeTestRule.waitForIdle() - composeTestRule.onNodeWithTag(PROGRAM_TO_ENROLL.format(program), useUnmergedTree = true) + composeTestRule.waitUntilAtLeastOneExists( + hasTestTag(testTag), + TIMEOUT + ) + composeTestRule.onNodeWithTag(testTag, useUnmergedTree = true) .performClick() composeTestRule.waitForIdle() } diff --git a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/EventRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/EventRobot.kt index b42e272c0ad..cb6475cdba3 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/EventRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/EventRobot.kt @@ -3,17 +3,11 @@ package org.dhis2.usescases.teidashboard.robot import androidx.compose.ui.test.ExperimentalTestApi import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsNotDisplayed -import androidx.compose.ui.test.hasAnyAncestor -import androidx.compose.ui.test.hasAnySibling import androidx.compose.ui.test.hasTestTag -import androidx.compose.ui.test.hasText -import androidx.compose.ui.test.isDialog import androidx.compose.ui.test.junit4.ComposeTestRule -import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick -import androidx.compose.ui.test.performTextReplacement import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.assertion.ViewAssertions.matches @@ -52,63 +46,26 @@ class EventRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { composeTestRule.onNodeWithTag(MAIN_BUTTON_TAG).performClick() } - fun checkSecondaryButtonNotVisible() { - composeTestRule.onNodeWithTag(SECONDARY_BUTTON_TAG).assertDoesNotExist() - } - @OptIn(ExperimentalTestApi::class) fun clickOnReopen() { composeTestRule.waitUntilAtLeastOneExists(hasTestTag("REOPEN_BUTTON")) composeTestRule.onNodeWithTag("REOPEN_BUTTON", useUnmergedTree = true).performClick() } - fun acceptUpdateEventDate() { - composeTestRule.onNodeWithText("OK", true).performClick() - } - fun openMenuMoreOptions() { - onView(withId(R.id.moreOptions)).perform(click()) + waitForView(withId(R.id.moreOptions)).perform(click()) } fun clickOnDelete() { with(InstrumentationRegistry.getInstrumentation().targetContext) { val deleteLabel = getString(R.string.delete) composeTestRule.onNodeWithText(deleteLabel).performClick() + composeTestRule.waitForIdle() } } fun clickOnDeleteDialog() { - onView(withId(R.id.possitive)).perform(click()) - } - - fun clickOnEventDueDate() { - composeTestRule.onNode( - hasTestTag("INPUT_DATE_TIME_ACTION_BUTTON") and hasAnySibling( - hasText("Due date") - ) - ).assertIsDisplayed().performClick() - - } - - fun selectSpecificDate(currentDate: String, date: String) { - composeTestRule.onNodeWithTag("DATE_PICKER").assertIsDisplayed() - composeTestRule.onNodeWithContentDescription( - label = "text", - substring = true, - useUnmergedTree = true, - ).performClick() - composeTestRule.onNode( - hasText(currentDate) and hasAnyAncestor(isDialog()) - ).performTextReplacement(date) - } - - @OptIn(ExperimentalTestApi::class) - fun typeOnDateParameter(dateValue: String) { - composeTestRule.waitUntilAtLeastOneExists(hasTestTag("INPUT_DATE_TIME_TEXT_FIELD"),2000) - composeTestRule.apply { - onNodeWithTag("INPUT_DATE_TIME_TEXT_FIELD").performClick() - onNodeWithTag("INPUT_DATE_TIME_TEXT_FIELD").performTextReplacement(dateValue) - } + waitForView(withId(R.id.possitive)).perform(click()) } fun checkEventDetails(eventDate: String, eventOrgUnit: String) { @@ -123,10 +80,6 @@ class EventRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { Intents.intended(allOf(IntentMatchers.hasComponent(EventCaptureActivity::class.java.name))) } - fun openEventDetailsSection() { - composeTestRule.onNodeWithText("Event details").performClick() - } - fun checkEventIsOpen() { composeTestRule.onNodeWithTag("REOPEN_BUTTON").assertIsNotDisplayed() } diff --git a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt index 53774a20689..0d951ca96ec 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/NoteRobot.kt @@ -1,8 +1,8 @@ package org.dhis2.usescases.teidashboard.robot -import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.TypeTextAction import androidx.test.espresso.action.ViewActions.click +import androidx.test.espresso.action.ViewActions.closeSoftKeyboard import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.intent.Intents import androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent @@ -30,7 +30,7 @@ fun noteRobot(noteRobot: NoteRobot.() -> Unit) { class NoteRobot : BaseRobot() { fun clickOnFabAddNewNote() { - onView(withId(R.id.addNoteButton)).check(matches(isDisplayed())).perform(click()) + waitForView(withId(R.id.addNoteButton)).check(matches(isDisplayed())).perform(click()) } fun verifyNoteDetailActivityIsLaunched() { @@ -38,24 +38,24 @@ class NoteRobot : BaseRobot() { } fun typeNote(text: String) { - onView(withId(R.id.noteText)).perform(TypeTextAction(text)) + waitForView(withId(R.id.noteText)).perform(TypeTextAction(text)) closeKeyboard() } fun clickOnSaveButton() { - waitForView(withText(R.string.save)) + waitForView(allOf(withId(R.id.saveButton), withText(R.string.save)),5000) .check(matches(allOf(isDisplayed(), isEnabled()))) .perform(click()) } fun clickYesOnAlertDialog() { - waitForView(withText(R.string.yes)) + waitForView(withId(android.R.id.button1), waitMillis = DIALOG_WAIT_TIMEOUT_MS) .check(matches(isDisplayed())) .perform(click()) } fun checkNoteWasNotCreated(text: String) { - onView(withId(R.id.notes_recycler)).check( + waitForView(withId(R.id.notes_recycler), waitMillis = NOTES_WAIT_TIMEOUT_MS).check( matches( not( atPosition( @@ -68,28 +68,52 @@ class NoteRobot : BaseRobot() { } fun checkNewNoteWasCreated(text: String) { - waitForView(withId(R.id.notes_recycler)).check( - matches( - allOf( - isDisplayed(), - isNotEmpty(), - atPosition(0, hasDescendant(withText(text))) - ) - ) + // First wait for the RecyclerView to be visible + waitForView(withId(R.id.notes_recycler), waitMillis = NOTES_WAIT_TIMEOUT_MS) + .check(matches(isDisplayed())) + // Now check for the note content + waitForView( + allOf( + withId(R.id.notes_recycler), + isDisplayed(), + isNotEmpty(), + atPosition(0, hasDescendant(withText(text))) + ), + waitMillis = NOTES_WAIT_TIMEOUT_MS ) } fun clickOnClearButton() { waitForView(withText(R.string.clear)) .check(matches(allOf(isDisplayed(), isEnabled()))) - .perform(click()) + .perform(closeSoftKeyboard(), click()) } fun checkNoteDetails(user: String, noteText: String) { - waitForView(withId(R.id.notes_recycler)).check(matches(isDisplayed())) - waitForView(allOf(withId(R.id.storeBy), withEffectiveVisibility(Visibility.VISIBLE), withText(user))) + waitForView(withId(R.id.notes_recycler), waitMillis = NOTES_WAIT_TIMEOUT_MS) + .check(matches(isDisplayed())) + waitForView( + allOf( + withId(R.id.storeBy), + withEffectiveVisibility(Visibility.VISIBLE), + withText(user) + ), + waitMillis = NOTES_WAIT_TIMEOUT_MS, + ) .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) - waitForView(allOf(withId(R.id.note_text), withEffectiveVisibility(Visibility.VISIBLE), withText(noteText))) + waitForView( + allOf( + withId(R.id.note_text), + withEffectiveVisibility(Visibility.VISIBLE), + withText(noteText) + ), + waitMillis = NOTES_WAIT_TIMEOUT_MS, + ) .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) } + + companion object { + private const val DIALOG_WAIT_TIMEOUT_MS = 10000 + private const val NOTES_WAIT_TIMEOUT_MS = 15000 + } } diff --git a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/TeiDashboardRobot.kt b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/TeiDashboardRobot.kt index 5c1ae787770..7ffebe013fb 100644 --- a/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/TeiDashboardRobot.kt +++ b/app/src/androidTest/java/org/dhis2/usescases/teidashboard/robot/TeiDashboardRobot.kt @@ -7,8 +7,6 @@ import androidx.compose.ui.test.hasAnySibling import androidx.compose.ui.test.hasTestTag import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.ComposeTestRule -import androidx.compose.ui.test.onAllNodesWithText -import androidx.compose.ui.test.onFirst import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick @@ -17,7 +15,6 @@ import androidx.test.espresso.Espresso.onView import androidx.test.espresso.NoMatchingViewException import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.assertion.ViewAssertions.matches -import androidx.test.espresso.contrib.RecyclerViewActions.actionOnItem import androidx.test.espresso.contrib.RecyclerViewActions.actionOnItemAtPosition import androidx.test.espresso.intent.Intents import androidx.test.espresso.intent.matcher.IntentMatchers @@ -31,20 +28,14 @@ import androidx.test.platform.app.InstrumentationRegistry import org.dhis2.R import org.dhis2.common.BaseRobot import org.dhis2.common.matchers.RecyclerviewMatchers.Companion.atPosition -import org.dhis2.common.matchers.RecyclerviewMatchers.Companion.hasItem import org.dhis2.common.matchers.RecyclerviewMatchers.Companion.isNotEmpty -import org.dhis2.usescases.event.entity.EventStatusUIModel -import org.dhis2.usescases.event.entity.TEIProgramStagesUIModel -import org.dhis2.usescases.flow.teiFlow.entity.DateRegistrationUIModel import org.dhis2.usescases.programStageSelection.ProgramStageSelectionActivity import org.dhis2.usescases.programStageSelection.ProgramStageSelectionViewHolder -import org.dhis2.usescases.teiDashboard.dashboardfragments.teidata.teievents.EventViewHolder import org.dhis2.usescases.teiDashboard.ui.INFO_BAR_TEST_TAG import org.dhis2.usescases.teiDashboard.ui.TEST_ADD_EVENT_BUTTON import org.dhis2.usescases.teiDashboard.ui.TEST_ADD_EVENT_BUTTON_IN_TIMELINE import org.dhis2.usescases.teiDashboard.ui.model.InfoBarType import org.dhis2.usescases.teidashboard.entity.EnrollmentUIModel -import org.dhis2.usescases.teidashboard.entity.UpperEnrollmentUIModel import org.hamcrest.CoreMatchers.allOf import org.hamcrest.CoreMatchers.anyOf import org.hamcrest.CoreMatchers.equalTo @@ -58,6 +49,7 @@ fun teiDashboardRobot( } } +@OptIn(ExperimentalTestApi::class) class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { fun goToNotes() { @@ -66,7 +58,10 @@ class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { R.string.navigation_notes ) ).performClick() - waitToDebounce(500) + waitForView(withId(R.id.addNoteButton)) + // Wait for notes RecyclerView to be ready after navigation + waitForView(withId(R.id.notes_recycler), waitMillis = 10000) + composeTestRule.waitForIdle() } fun goToRelationships() { @@ -84,7 +79,7 @@ class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { R.string.navigation_analytics ) composeTestRule.waitUntilExactlyOneExists( - hasText(analyticsText,true), + hasText(analyticsText, true), TIMEOUT ) composeTestRule.onNodeWithText(analyticsText, useUnmergedTree = true).performClick() @@ -113,11 +108,6 @@ class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { composeTestRule.onNodeWithText(title).performClick() } - fun clickOnEventWith(searchParam: String) { - composeTestRule.onAllNodesWithText(searchParam, useUnmergedTree = true).onFirst() - .performClick() - } - fun clickOnFab() { composeTestRule.onNodeWithTag(TEST_ADD_EVENT_BUTTON_IN_TIMELINE, useUnmergedTree = true) .performClick() @@ -144,11 +134,6 @@ class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { Intents.intended(allOf(IntentMatchers.hasComponent(ProgramStageSelectionActivity::class.java.name))) } - - fun clickOnReferralOption(oneTime: String) { - composeTestRule.onNodeWithText(oneTime).performClick() - } - fun clickOnReferralNextButton() { waitForView(withId(R.id.action_button)).perform(click()) } @@ -184,6 +169,10 @@ class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { fun clickOnMenuComplete() { with(InstrumentationRegistry.getInstrumentation().targetContext) { + composeTestRule.waitUntilExactlyOneExists( + hasText(getString(R.string.complete)), + TIMEOUT + ) composeTestRule.onNodeWithText(getString(R.string.complete)).performClick() } } @@ -199,22 +188,6 @@ class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { .assertDoesNotExist() } - fun clickOnShareButton() { - with(InstrumentationRegistry.getInstrumentation().targetContext) { - composeTestRule.onNodeWithText(getString(R.string.share)).performClick() - } - } - - fun clickOnNextQR() { - var qrLenght = 1 - - while (qrLenght < 8) { - waitForView(withId(R.id.next)) - onView(withId(R.id.next)).perform(click()) - qrLenght++ - } - } - fun clickOnMenuDeleteTEI() { with(InstrumentationRegistry.getInstrumentation().targetContext) { composeTestRule.onNodeWithText(getString(R.string.dashboard_menu_delete_person)) @@ -222,11 +195,6 @@ class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { } } - fun checkUpperInfo(upperInformation: UpperEnrollmentUIModel) { - onView(withId(R.id.org_unit)) - .check(matches(withText(upperInformation.orgUnit))) - } - fun clickOnSeeDetails() { waitForView(withId(R.id.editButton)) .perform(click()) @@ -238,7 +206,7 @@ class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { hasText( enrollmentUIModel.enrollmentDate, ) and hasAnySibling( - hasText("Enrollment date *"), + hasText("Date of enrollment *"), ), useUnmergedTree = true, ).assertIsDisplayed() @@ -270,17 +238,14 @@ class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { fun clickOnMenuProgramEnrollments() { with(InstrumentationRegistry.getInstrumentation().targetContext) { val programSelectorLabel = getString(R.string.more_enrollments) + composeTestRule.waitUntilExactlyOneExists( + hasText(programSelectorLabel), + TIMEOUT + ) composeTestRule.onNodeWithText(programSelectorLabel).performClick() } } - fun checkEventWasCreatedAndClosed(eventName: String) { - composeTestRule.onNodeWithText(eventName).assertIsDisplayed() - val targetContext: Context = InstrumentationRegistry.getInstrumentation().targetContext - val viewOnlyText = targetContext.resources.getString(R.string.view_only) - composeTestRule.onNodeWithText(viewOnlyText).assertDoesNotExist() - } - fun clickOnMenuDeleteEnrollment() { with(InstrumentationRegistry.getInstrumentation().targetContext) { val deleteEnrollmentLabel = getString(R.string.remove_from) @@ -292,6 +257,10 @@ class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { with(InstrumentationRegistry.getInstrumentation().targetContext) { val timelineLabel = getString(R.string.view_timeline) try { + composeTestRule.waitUntilExactlyOneExists( + hasText(timelineLabel), + TIMEOUT + ) composeTestRule.onNodeWithText(timelineLabel).performClick() } catch (e: NoMatchingViewException) { checkIfGroupedEventsIsVisible() @@ -299,19 +268,6 @@ class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { } } - fun clickOnReopen() { - with(InstrumentationRegistry.getInstrumentation().targetContext) { - val timelineLabel = getString(R.string.enrollment_reopen) - val eventLabel = resources.getQuantityString(R.plurals.event_label, 2) - val itemLabel = timelineLabel.format(eventLabel) - try { - onView(withText(itemLabel)).perform(click()) - } catch (e: NoMatchingViewException) { - checkIfGroupedEventsIsVisible() - } - } - } - private fun checkIfGroupedEventsIsVisible() { with(InstrumentationRegistry.getInstrumentation().targetContext) { val groupLabel = getString(R.string.group_by_stage) @@ -383,85 +339,6 @@ class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { composeTestRule.onAllNodes(hasText(viewOnlyText), useUnmergedTree = false) } - fun clickOnStageGroup(programStageName: String) { - composeTestRule.onNodeWithText(programStageName).performClick() - } - - fun clickOnEventGroupByStage(eventDate: String) { - onView(withId(R.id.tei_recycler)) - .perform( - actionOnItem<EventViewHolder>( - hasDescendant( - allOf( - withText(eventDate), - withId(R.id.event_date), - ), - ), - click(), - ), - ) - } - - fun checkEventWasDeletedStageGroup(teiProgramStages: TEIProgramStagesUIModel) { - val firstProgramStage = teiProgramStages.programStage_first - val secondProgramStage = teiProgramStages.programStage_second - val thirdProgramStage = teiProgramStages.programStage_third - - onView(withId(R.id.tei_recycler)) - .check( - matches( - allOf( - hasItem( - allOf( - hasDescendant(withText(firstProgramStage.name)), - hasDescendant(withText(firstProgramStage.events)), - ), - ), - hasItem( - allOf( - hasDescendant(withText(secondProgramStage.name)), - hasDescendant(withText(secondProgramStage.events)), - ), - ), - hasItem( - allOf( - hasDescendant(withText(thirdProgramStage.name)), - hasDescendant(withText(thirdProgramStage.events)), - ), - ), - ), - ), - ) - } - - fun checkEventStateStageGroup(eventDetails: EventStatusUIModel) { - var status = R.drawable.ic_event_status_open - when (eventDetails.status) { - "Open" -> status = R.drawable.ic_event_status_open - "Overdue" -> status = R.drawable.ic_event_status_overdue - "Event Completed" -> status = R.drawable.ic_event_status_complete - "Skip" -> status = R.drawable.ic_event_status_skipped - "Schedule" -> status = R.drawable.ic_event_status_schedule - } - - onView(withId(R.id.tei_recycler)) - .check( - matches( - hasItem( - allOf( - hasDescendant(withText(eventDetails.date)), - hasDescendant(withText(eventDetails.orgUnit)), - hasDescendant(withTagValue(equalTo(status))), - ), - ), - ), - ) - } - - fun clickOnEventGroupByStageUsingDate(dueDate: String) { - composeTestRule.onNodeWithText(dueDate).performClick() - } - fun clickOnConfirmDeleteTEI() { composeTestRule.onNodeWithText("Delete").performClick() } @@ -470,16 +347,6 @@ class TeiDashboardRobot(val composeTestRule: ComposeTestRule) : BaseRobot() { composeTestRule.onNodeWithText("Remove").performClick() } - fun checkEnrollmentDate(enrollmentDate: DateRegistrationUIModel) { - composeTestRule.onNode( - hasText( - "Date of enrollment: 0${enrollmentDate.day}/0${enrollmentDate.month}/${enrollmentDate.year}", - true - ), - useUnmergedTree = true - ).assertIsDisplayed() - } - fun typeOnInputDateField(dateValue: String, title: String) { composeTestRule.apply { onNode( diff --git a/app/src/debug/AndroidManifest.xml b/app/src/debug/AndroidManifest.xml index caeb2a6c54c..2ee086aad09 100644 --- a/app/src/debug/AndroidManifest.xml +++ b/app/src/debug/AndroidManifest.xml @@ -19,7 +19,6 @@ android:icon="@mipmap/ic_launcher"> <activity android:name=".usescases.development.DevelopmentActivity" /> - </application> </manifest> \ No newline at end of file diff --git a/app/src/dhis2/java/org/dhis2/usescases/main/domain/DownloadNewVersion.kt b/app/src/dhis2/java/org/dhis2/usescases/main/domain/DownloadNewVersion.kt new file mode 100644 index 00000000000..746bee80950 --- /dev/null +++ b/app/src/dhis2/java/org/dhis2/usescases/main/domain/DownloadNewVersion.kt @@ -0,0 +1,33 @@ +package org.dhis2.usescases.main.domain + +import android.content.Context +import kotlinx.coroutines.suspendCancellableCoroutine +import org.dhis2.data.service.VersionRepository +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.domain.model.DownloadMethod +import kotlin.coroutines.resume + +class DownloadNewVersion( + private val versionRepository: VersionRepository, +) : UseCase<Context, DownloadMethod> { + override suspend fun invoke(input: Context): Result<DownloadMethod> = + try { + suspendCancellableCoroutine { continuation -> + versionRepository.download( + context = input, + onDownloadCompleted = { + continuation.resume(Result.success(DownloadMethod.File(it))) + }, + onDownloading = { + // no-op + }, + ) + continuation.invokeOnCancellation { + // If needed perform action on cancellation + } + } + } catch (e: DomainError) { + Result.failure(e) + } +} diff --git a/app/src/dhis2/java/org/dhis2/utils/granularsync/GranularSyncModule.kt b/app/src/dhis2/java/org/dhis2/utils/granularsync/GranularSyncModule.kt index 104cdc50a17..12ed81557f2 100644 --- a/app/src/dhis2/java/org/dhis2/utils/granularsync/GranularSyncModule.kt +++ b/app/src/dhis2/java/org/dhis2/utils/granularsync/GranularSyncModule.kt @@ -13,6 +13,8 @@ import org.dhis2.commons.sync.SyncContext import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.dhislogic.DhisProgramUtils import org.dhis2.data.service.workManager.WorkManagerController +import org.dhis2.utils.granularsync.data.GranularSyncRepository +import org.dhis2.utils.granularsync.ui.SyncUiStateMapper import org.hisp.dhis.android.core.D2 @Module @@ -21,6 +23,10 @@ class GranularSyncModule( private val view: GranularSyncContracts.View, private val syncContext: SyncContext, ) { + @Provides + fun provideSyncUiStateMapper(resourceManager: ResourceManager): SyncUiStateMapper = + SyncUiStateMapper(syncContext, resourceManager) + @Provides fun providesViewModelFactory( d2: D2, @@ -28,6 +34,7 @@ class GranularSyncModule( workManagerController: WorkManagerController, smsSyncProvider: SMSSyncProvider, repository: GranularSyncRepository, + mapper: SyncUiStateMapper, ): GranularSyncViewModelFactory = GranularSyncViewModelFactory( d2, @@ -38,6 +45,7 @@ class GranularSyncModule( syncContext, workManagerController, smsSyncProvider, + mapper, ) @Provides diff --git a/app/src/dhis2PlayServices/java/org/dhis2/usescases/main/domain/DownloadNewVersion.kt b/app/src/dhis2PlayServices/java/org/dhis2/usescases/main/domain/DownloadNewVersion.kt new file mode 100644 index 00000000000..df2258b4d61 --- /dev/null +++ b/app/src/dhis2PlayServices/java/org/dhis2/usescases/main/domain/DownloadNewVersion.kt @@ -0,0 +1,21 @@ +package org.dhis2.usescases.main.domain + +import android.content.Context +import org.dhis2.data.service.VersionRepository +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.domain.model.DownloadMethod + +class DownloadNewVersion( + private val versionRepository: VersionRepository, +) : UseCase<Context, DownloadMethod> { + override suspend fun invoke(input: Context): Result<DownloadMethod> = + try { + val url = versionRepository.getUrl() + url?.let { + Result.success(DownloadMethod.Url(it)) + } ?: Result.failure(DomainError.UnexpectedError("No url provided")) + } catch (domainError: DomainError) { + Result.failure(domainError) + } +} diff --git a/app/src/dhis2PlayServices/java/org/dhis2/utils/granularsync/GranularSyncModule.kt b/app/src/dhis2PlayServices/java/org/dhis2/utils/granularsync/GranularSyncModule.kt index ab5d88c7950..f19be870fc6 100644 --- a/app/src/dhis2PlayServices/java/org/dhis2/utils/granularsync/GranularSyncModule.kt +++ b/app/src/dhis2PlayServices/java/org/dhis2/utils/granularsync/GranularSyncModule.kt @@ -38,6 +38,8 @@ import org.dhis2.commons.sync.SyncContext import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.dhislogic.DhisProgramUtils import org.dhis2.data.service.workManager.WorkManagerController +import org.dhis2.utils.granularsync.data.GranularSyncRepository +import org.dhis2.utils.granularsync.ui.SyncUiStateMapper import org.hisp.dhis.android.core.D2 @Module @@ -46,6 +48,10 @@ class GranularSyncModule( private val view: GranularSyncContracts.View, private val syncContext: SyncContext, ) { + @Provides + fun provideSyncUiStateMapper(resourceManager: ResourceManager): SyncUiStateMapper = + SyncUiStateMapper(syncContext, resourceManager) + @Provides fun providesViewModelFactory( d2: D2, @@ -53,6 +59,7 @@ class GranularSyncModule( workManagerController: WorkManagerController, smsSyncProvider: SMSSyncProvider, repository: GranularSyncRepository, + mapper: SyncUiStateMapper, ): GranularSyncViewModelFactory = GranularSyncViewModelFactory( d2, @@ -69,6 +76,7 @@ class GranularSyncModule( syncContext, workManagerController, smsSyncProvider, + mapper, ) @Provides diff --git a/app/src/dhis2Training/java/org/dhis2/usescases/main/domain/DownloadNewVersion.kt b/app/src/dhis2Training/java/org/dhis2/usescases/main/domain/DownloadNewVersion.kt new file mode 100644 index 00000000000..746bee80950 --- /dev/null +++ b/app/src/dhis2Training/java/org/dhis2/usescases/main/domain/DownloadNewVersion.kt @@ -0,0 +1,33 @@ +package org.dhis2.usescases.main.domain + +import android.content.Context +import kotlinx.coroutines.suspendCancellableCoroutine +import org.dhis2.data.service.VersionRepository +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.domain.model.DownloadMethod +import kotlin.coroutines.resume + +class DownloadNewVersion( + private val versionRepository: VersionRepository, +) : UseCase<Context, DownloadMethod> { + override suspend fun invoke(input: Context): Result<DownloadMethod> = + try { + suspendCancellableCoroutine { continuation -> + versionRepository.download( + context = input, + onDownloadCompleted = { + continuation.resume(Result.success(DownloadMethod.File(it))) + }, + onDownloading = { + // no-op + }, + ) + continuation.invokeOnCancellation { + // If needed perform action on cancellation + } + } + } catch (e: DomainError) { + Result.failure(e) + } +} diff --git a/app/src/dhis2Training/java/org/dhis2/utils/granularsync/GranularSyncModule.kt b/app/src/dhis2Training/java/org/dhis2/utils/granularsync/GranularSyncModule.kt index 104cdc50a17..12ed81557f2 100644 --- a/app/src/dhis2Training/java/org/dhis2/utils/granularsync/GranularSyncModule.kt +++ b/app/src/dhis2Training/java/org/dhis2/utils/granularsync/GranularSyncModule.kt @@ -13,6 +13,8 @@ import org.dhis2.commons.sync.SyncContext import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.dhislogic.DhisProgramUtils import org.dhis2.data.service.workManager.WorkManagerController +import org.dhis2.utils.granularsync.data.GranularSyncRepository +import org.dhis2.utils.granularsync.ui.SyncUiStateMapper import org.hisp.dhis.android.core.D2 @Module @@ -21,6 +23,10 @@ class GranularSyncModule( private val view: GranularSyncContracts.View, private val syncContext: SyncContext, ) { + @Provides + fun provideSyncUiStateMapper(resourceManager: ResourceManager): SyncUiStateMapper = + SyncUiStateMapper(syncContext, resourceManager) + @Provides fun providesViewModelFactory( d2: D2, @@ -28,6 +34,7 @@ class GranularSyncModule( workManagerController: WorkManagerController, smsSyncProvider: SMSSyncProvider, repository: GranularSyncRepository, + mapper: SyncUiStateMapper, ): GranularSyncViewModelFactory = GranularSyncViewModelFactory( d2, @@ -38,6 +45,7 @@ class GranularSyncModule( syncContext, workManagerController, smsSyncProvider, + mapper, ) @Provides diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dd346b3e6c1..ab678935476 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,6 +17,7 @@ android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.USE_BIOMETRIC" /> + <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" /> <uses-feature @@ -73,6 +74,14 @@ android:configChanges="orientation|screenSize" android:exported="true" android:launchMode="singleTask"> + <intent-filter> + <action android:name="android.intent.action.VIEW" /> + <category android:name="android.intent.category.DEFAULT" /> + <category android:name="android.intent.category.BROWSABLE" /> + <data + android:scheme="dhis2oauth" + android:host="oauth" /> + </intent-filter> </activity> <activity android:name=".usescases.main.MainActivity" /> <activity android:name=".usescases.programEventDetail.ProgramEventDetailActivity" /> @@ -85,7 +94,6 @@ <activity android:name=".usescases.teiDashboard.teiProgramList.TeiProgramListActivity" /> <activity android:name="org.dhis2.maps.views.MapSelectorActivity" /> <activity android:name=".usescases.programStageSelection.ProgramStageSelectionActivity" /> - <activity android:name=".utils.WebViewActivity" /> <activity android:name=".usescases.eventsWithoutRegistration.eventInitial.EventInitialActivity" android:windowSoftInputMode="stateAlwaysHidden" /> @@ -145,8 +153,7 @@ <service android:name="androidx.work.impl.foreground.SystemForegroundService" - android:foregroundServiceType="dataSync" - tools:node="merge" /> + android:foregroundServiceType="dataSync" /> <provider android:name="androidx.core.content.FileProvider" @@ -159,6 +166,17 @@ android:resource="@xml/provider_paths" tools:replace="android:resource" /> </provider> + + <activity android:name="net.openid.appauth.RedirectUriReceiverActivity" + android:exported="true" + tools:node="replace"> + <intent-filter> + <action android:name="android.intent.action.VIEW" /> + <category android:name="android.intent.category.DEFAULT" /> + <category android:name="android.intent.category.BROWSABLE" /> + <data android:scheme="${openIdAuthScheme}" /> + </intent-filter> + </activity> </application> </manifest> \ No newline at end of file diff --git a/app/src/main/java/org/dhis2/App.java b/app/src/main/java/org/dhis2/App.java index ddf0b0cac60..d1fc1043f4e 100644 --- a/app/src/main/java/org/dhis2/App.java +++ b/app/src/main/java/org/dhis2/App.java @@ -11,8 +11,6 @@ import androidx.lifecycle.LifecycleObserver; import androidx.lifecycle.OnLifecycleEvent; import androidx.lifecycle.ProcessLifecycleOwner; -import androidx.multidex.MultiDex; -import androidx.multidex.MultiDexApplication; import org.dhis2.commons.di.dagger.PerActivity; import org.dhis2.commons.di.dagger.PerServer; @@ -47,8 +45,6 @@ import org.dhis2.usescases.teiDashboard.TeiDashboardModule; import org.dhis2.utils.analytics.AnalyticsModule; import org.dhis2.utils.granularsync.SyncStatusDialogProvider; -import org.dhis2.utils.session.PinModule; -import org.dhis2.utils.session.SessionComponent; import org.dhis2.utils.timber.DebugTree; import org.hisp.dhis.android.core.D2Manager; import org.hisp.dhis.android.core.datastore.KeyValuePair; @@ -71,7 +67,7 @@ import io.sentry.android.core.SentryAndroid; import timber.log.Timber; -public class App extends MultiDexApplication implements Components, LifecycleObserver { +public class App extends android.app.Application implements Components, LifecycleObserver { @NonNull @Singleton @@ -89,9 +85,6 @@ public class App extends MultiDexApplication implements Components, LifecycleObs @PerActivity private TeiDashboardComponent dashboardComponent; - @Nullable - private SessionComponent sessionComponent; - private boolean fromBackGround = false; private boolean recreated; @@ -120,6 +113,10 @@ public void onCreate() { public void initCrashController() { if (areTrackingPermissionGranted()) { + if (BuildConfig.SENTRY_DSN.isEmpty()) { + Timber.w("Sentry DSN is empty. Skipping Sentry initialization."); + return; + } SentryAndroid.init(this, options -> { options.setDsn(BuildConfig.SENTRY_DSN); options.setAnrReportInDebug(true); @@ -154,12 +151,6 @@ private void initCustomCrashActivity() { .apply(); } - @Override - protected void attachBaseContext(Context base) { - super.attachBaseContext(base); - MultiDex.install(this); - } - private void setUpAppComponent() { appComponent = prepareAppComponent().build(); appComponent.inject(this); @@ -278,15 +269,6 @@ public void releaseDashboardComponent() { } } - @NotNull - public SessionComponent createSessionComponent(PinModule pinModule) { - return (sessionComponent = userComponent.plus(pinModule)); - } - - public void releaseSessionComponent() { - sessionComponent = null; - } - @OnLifecycleEvent(Lifecycle.Event.ON_STOP) public void onAppBackgrounded() { Timber.tag("BG").d("App in background"); diff --git a/app/src/main/java/org/dhis2/AppModule.kt b/app/src/main/java/org/dhis2/AppModule.kt index 0373cade8fa..77311e07784 100644 --- a/app/src/main/java/org/dhis2/AppModule.kt +++ b/app/src/main/java/org/dhis2/AppModule.kt @@ -4,6 +4,11 @@ import android.content.Context import dagger.Module import dagger.Provides import org.dhis2.commons.resources.ColorUtils +import org.dhis2.data.service.CheckVersionWorker +import org.dhis2.data.service.SyncGranularWorker +import org.dhis2.usescases.main.mainModule +import org.koin.androidx.workmanager.dsl.workerOf +import org.koin.dsl.module import javax.inject.Singleton @Module @@ -18,3 +23,10 @@ class AppModule( @Singleton fun colorUtils(): ColorUtils = ColorUtils() } + +val appModule = + module { + includes(mainModule) + workerOf(::SyncGranularWorker) + workerOf(::CheckVersionWorker) + } diff --git a/app/src/main/java/org/dhis2/bindings/Bindings.java b/app/src/main/java/org/dhis2/bindings/Bindings.java index 0354b034f25..60d0a67c159 100644 --- a/app/src/main/java/org/dhis2/bindings/Bindings.java +++ b/app/src/main/java/org/dhis2/bindings/Bindings.java @@ -5,11 +5,9 @@ import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; -import android.os.Build; import android.util.TypedValue; import android.view.View; import android.widget.ImageView; -import android.widget.LinearLayout; import android.widget.TextView; import androidx.appcompat.content.res.AppCompatResources; @@ -168,13 +166,6 @@ public static void setImageBackground(ImageView imageView, Drawable drawable) { } - @BindingAdapter("versionVisibility") - public static void setVisibility(LinearLayout linearLayout, boolean check) { - if (check && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - linearLayout.setVisibility(View.GONE); - } - } - @BindingAdapter("settingIcon") public static void setSettingIcon(ImageView view, int drawableReference) { Drawable drawable = AppCompatResources.getDrawable(view.getContext(), drawableReference); diff --git a/app/src/main/java/org/dhis2/bindings/SettingExtensions.kt b/app/src/main/java/org/dhis2/bindings/SettingExtensions.kt index bafbb9a0aba..66102244615 100644 --- a/app/src/main/java/org/dhis2/bindings/SettingExtensions.kt +++ b/app/src/main/java/org/dhis2/bindings/SettingExtensions.kt @@ -15,6 +15,7 @@ const val MANUAL = 0 fun MetadataSyncPeriod.toSeconds(): Int = when (this) { MetadataSyncPeriod.EVERY_HOUR -> EVERY_HOUR + MetadataSyncPeriod.EVERY_6_HOURS -> EVERY_6_HOUR MetadataSyncPeriod.EVERY_12_HOURS -> EVERY_12_HOUR MetadataSyncPeriod.EVERY_24_HOURS -> EVERY_24_HOUR MetadataSyncPeriod.EVERY_7_DAYS -> EVERY_7_DAYS diff --git a/app/src/main/java/org/dhis2/data/biometric/BiometricUtils.kt b/app/src/main/java/org/dhis2/data/biometric/BiometricUtils.kt index 47627d21950..781e1485952 100644 --- a/app/src/main/java/org/dhis2/data/biometric/BiometricUtils.kt +++ b/app/src/main/java/org/dhis2/data/biometric/BiometricUtils.kt @@ -4,7 +4,6 @@ import android.content.Context import android.os.Build import android.security.keystore.KeyGenParameterSpec import android.security.keystore.KeyProperties -import androidx.annotation.RequiresApi import androidx.biometric.BiometricManager import androidx.biometric.BiometricPrompt import androidx.core.content.ContextCompat @@ -93,27 +92,19 @@ class CryptographyManager : CryptographicActions { load(null) } - override fun getInitializedCipherForEncryption(): Cipher? = - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - val cipher = getCipher() - val secretKey = - getOrCreateSecretKey() - - cipher.init(Cipher.ENCRYPT_MODE, secretKey) - cipher - } else { - null - } + override fun getInitializedCipherForEncryption(): Cipher { + val cipher = getCipher() + val secretKey = getOrCreateSecretKey() + cipher.init(Cipher.ENCRYPT_MODE, secretKey) + return cipher + } - override fun getInitializedCipherForDecryption(initializationVector: ByteArray): Cipher? = - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - val cipher = getCipher() - val secretKey = getOrCreateSecretKey() - cipher.init(Cipher.DECRYPT_MODE, secretKey, GCMParameterSpec(128, initializationVector)) - cipher - } else { - null - } + override fun getInitializedCipherForDecryption(initializationVector: ByteArray): Cipher { + val cipher = getCipher() + val secretKey = getOrCreateSecretKey() + cipher.init(Cipher.DECRYPT_MODE, secretKey, GCMParameterSpec(128, initializationVector)) + return cipher + } override fun encryptData( plaintext: String, @@ -136,7 +127,6 @@ class CryptographyManager : CryptographicActions { return Cipher.getInstance(transformation) } - @RequiresApi(Build.VERSION_CODES.M) private fun getOrCreateSecretKey(): SecretKey { // If Secretkey was previously created for that keyName, then grab and return it. keyStore.getKey(KEY_NAME, null)?.let { return it as SecretKey } diff --git a/app/src/main/java/org/dhis2/data/dhislogic/Authorities.kt b/app/src/main/java/org/dhis2/data/dhislogic/Authorities.kt index ed6318c7bec..352f3e33686 100644 --- a/app/src/main/java/org/dhis2/data/dhislogic/Authorities.kt +++ b/app/src/main/java/org/dhis2/data/dhislogic/Authorities.kt @@ -3,3 +3,5 @@ package org.dhis2.data.dhislogic const val AUTH_DATAVALUE_ADD = "F_DATAVALUE_ADD" const val AUTH_UNCOMPLETE_EVENT = "F_UNCOMPLETE_EVENT" const val AUTH_ALL = "ALL" +const val AUTH_ENROLLMENT_CASCADE_DELETE = "F_ENROLLMENT_CASCADE_DELETE" +const val AUTH_TEI_CASCADE_DELETE = "F_TEI_CASCADE_DELETE" diff --git a/app/src/main/java/org/dhis2/data/enrollment/EnrollmentUiDataHelper.kt b/app/src/main/java/org/dhis2/data/enrollment/EnrollmentUiDataHelper.kt index b50840c9e0d..1902c4ec288 100644 --- a/app/src/main/java/org/dhis2/data/enrollment/EnrollmentUiDataHelper.kt +++ b/app/src/main/java/org/dhis2/data/enrollment/EnrollmentUiDataHelper.kt @@ -2,7 +2,7 @@ package org.dhis2.data.enrollment import android.content.Context import org.dhis2.R -import org.hisp.dhis.android.core.enrollment.EnrollmentStatus +import org.dhis2.tracker.search.model.EnrollmentStatus class EnrollmentUiDataHelper( val context: Context, diff --git a/app/src/main/java/org/dhis2/data/forms/dataentry/ProgramAdapter.java b/app/src/main/java/org/dhis2/data/forms/dataentry/ProgramAdapter.java index 3f9acf0e0ff..259da33a460 100644 --- a/app/src/main/java/org/dhis2/data/forms/dataentry/ProgramAdapter.java +++ b/app/src/main/java/org/dhis2/data/forms/dataentry/ProgramAdapter.java @@ -1,19 +1,18 @@ package org.dhis2.data.forms.dataentry; import android.content.Context; -import androidx.databinding.DataBindingUtil; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.content.ContextCompat; -import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.databinding.DataBindingUtil; + import org.dhis2.R; +import org.dhis2.databinding.SpinnerProgramItemLayoutBinding; import org.dhis2.databinding.SpinnerProgramLayoutBinding; - import org.dhis2.usescases.searchTrackEntity.ProgramSpinnerModel; import java.util.List; @@ -38,8 +37,6 @@ public View getView(int position, @Nullable View convertView, @NonNull ViewGroup SpinnerProgramLayoutBinding binding = DataBindingUtil.inflate(inflater, R.layout.spinner_program_layout, parent, false); convertView = binding.getRoot(); setProgram(binding, position); - binding.spinnerText.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); - binding.spinnerText.setTextColor(ContextCompat.getColor(binding.spinnerText.getContext(), R.color.white_faf)); } return convertView; @@ -48,7 +45,7 @@ public View getView(int position, @Nullable View convertView, @NonNull ViewGroup @Override public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - SpinnerProgramLayoutBinding binding = DataBindingUtil.inflate(inflater, R.layout.spinner_program_layout, parent, false); + SpinnerProgramItemLayoutBinding binding = DataBindingUtil.inflate(inflater, R.layout.spinner_program_item_layout, parent, false); setProgram(binding, position); return binding.getRoot(); } @@ -65,6 +62,18 @@ private void setProgram(SpinnerProgramLayoutBinding binding, int position) { } } + private void setProgram(SpinnerProgramItemLayoutBinding binding, int position) { + if (position != 0) { + binding.setProgram(programs.get(position - 1)); + } else { + binding.setProgram(new ProgramSpinnerModel( + trackedEntityName, + String.format(getContext().getString(R.string.all_tei_type), trackedEntityName), + false + )); + } + } + @Override public int getCount() { return super.getCount() + 1; diff --git a/app/src/main/java/org/dhis2/data/forms/dataentry/ValueStore.kt b/app/src/main/java/org/dhis2/data/forms/dataentry/ValueStore.kt index 337621dc51a..60faa114c38 100644 --- a/app/src/main/java/org/dhis2/data/forms/dataentry/ValueStore.kt +++ b/app/src/main/java/org/dhis2/data/forms/dataentry/ValueStore.kt @@ -15,15 +15,6 @@ interface ValueStore { value: String?, ): Flowable<StoreResult> - suspend fun save( - orgUnitUid: String, - periodId: String, - attributeOptionComboUid: String, - dataElementUid: String, - categoryOptionComboUid: String, - value: String?, - ): Flowable<StoreResult> - fun deleteOptionValues(optionCodeValuesToDelete: List<String>) fun deleteOptionValueIfSelected( diff --git a/app/src/main/java/org/dhis2/data/forms/dataentry/ValueStoreImpl.kt b/app/src/main/java/org/dhis2/data/forms/dataentry/ValueStoreImpl.kt index 523c7b362cc..a6203eadaf0 100644 --- a/app/src/main/java/org/dhis2/data/forms/dataentry/ValueStoreImpl.kt +++ b/app/src/main/java/org/dhis2/data/forms/dataentry/ValueStoreImpl.kt @@ -1,39 +1,52 @@ package org.dhis2.data.forms.dataentry import io.reactivex.Flowable +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.stateIn import org.dhis2.bindings.blockingSetCheck import org.dhis2.bindings.withValueTypeCheck import org.dhis2.commons.data.EntryMode -import org.dhis2.commons.network.NetworkUtils import org.dhis2.commons.resources.ResourceManager +import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.dhislogic.DhisEnrollmentUtils import org.dhis2.form.R import org.dhis2.form.model.StoreResult import org.dhis2.form.model.ValueStoreResult -import org.dhis2.mobile.commons.providers.FieldErrorMessageProvider +import org.dhis2.mobile.commons.network.NetworkStatusProvider import org.dhis2.mobile.commons.reporting.CrashReportController import org.dhis2.utils.DhisTextUtils import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.arch.helpers.FileResizerHelper import org.hisp.dhis.android.core.arch.helpers.Result import org.hisp.dhis.android.core.common.ValueType +import org.hisp.dhis.android.core.datavalue.LegacyDataValueApi import org.hisp.dhis.android.core.enrollment.EnrollmentObjectRepository import java.io.File +@OptIn(LegacyDataValueApi::class) class ValueStoreImpl( private val d2: D2, private val recordUid: String, private val entryMode: EntryMode, private val dhisEnrollmentUtils: DhisEnrollmentUtils, private val crashReportController: CrashReportController, - private val networkUtils: NetworkUtils, private val searchTEIRepository: SearchTEIRepository, - private val fieldErrorMessageProvider: FieldErrorMessageProvider, private val resourceManager: ResourceManager, + networkStatusProvider: NetworkStatusProvider, + dispatcherProvider: DispatcherProvider, ) : ValueStore { var enrollmentRepository: EnrollmentObjectRepository? = null var overrideProgramUid: String? = null + private val isNetworkOnline = + networkStatusProvider.connectionStatus + .stateIn( + CoroutineScope(dispatcherProvider.io()), + SharingStarted.Eagerly, + false, + ) + override fun overrideProgram(programUid: String?) { overrideProgramUid = programUid } @@ -65,76 +78,6 @@ class ValueStoreImpl( ) } - override suspend fun save( - orgUnitUid: String, - periodId: String, - attributeOptionComboUid: String, - dataElementUid: String, - categoryOptionComboUid: String, - value: String?, - ): Flowable<StoreResult> { - val dataValueObject = - d2.dataValueModule().dataValues().value( - periodId, - orgUnitUid, - dataElementUid, - categoryOptionComboUid, - attributeOptionComboUid, - ) - - val validator = - d2 - .dataElementModule() - .dataElements() - .uid(dataElementUid) - .blockingGet() - ?.valueType() - ?.validator - - return if (!value.isNullOrEmpty()) { - if (dataValueObject.blockingExists() && - dataValueObject.blockingGet()?.value() == value - ) { - Flowable.just(StoreResult("", ValueStoreResult.VALUE_HAS_NOT_CHANGED)) - } else { - when (val validation = validator?.validate(value)) { - is Result.Failure -> - Flowable.just( - StoreResult( - uid = "", - valueStoreResult = ValueStoreResult.ERROR_UPDATING_VALUE, - valueStoreResultMessage = - fieldErrorMessageProvider - .getFriendlyErrorMessage(validation.failure), - ), - ) - is Result.Success -> - dataValueObject - .set(value) - .andThen(Flowable.just(StoreResult("", ValueStoreResult.VALUE_CHANGED))) - else -> - Flowable.just( - StoreResult( - uid = "", - valueStoreResult = ValueStoreResult.ERROR_UPDATING_VALUE, - valueStoreResultMessage = - fieldErrorMessageProvider - .defaultValidationErrorMessage(), - ), - ) - } - } - } else { - if (dataValueObject.blockingExists()) { - dataValueObject - .deleteIfExist() - .andThen(Flowable.just(StoreResult("", ValueStoreResult.VALUE_CHANGED))) - } else { - Flowable.just(StoreResult("", ValueStoreResult.VALUE_HAS_NOT_CHANGED)) - } - } - } - override fun saveWithTypeCheck( uid: String, value: String?, @@ -146,12 +89,14 @@ class ValueStoreImpl( .uid(uid) .blockingExists() -> saveDataElement(uid, value) + d2 .trackedEntityModule() .trackedEntityAttributes() .uid(uid) .blockingExists() -> saveAttribute(uid, value) + else -> Flowable.just(StoreResult(uid, ValueStoreResult.UID_IS_NOT_DE_OR_ATTR)) } @@ -176,6 +121,7 @@ class ValueStoreImpl( .blockingGet() enrollment?.trackedEntityInstance() } + EntryMode.ATTR -> recordUid EntryMode.DV -> null } @@ -297,7 +243,7 @@ class ValueStoreImpl( value: String?, teiUid: String, ): Boolean = - if (!networkUtils.isOnline()) { + if (!isNetworkOnline.value) { dhisEnrollmentUtils.isTrackedEntityAttributeValueUnique(uid, value, teiUid) } else { val programUid = overrideProgramUid ?: enrollmentRepository?.blockingGet()?.program() @@ -381,6 +327,7 @@ class ValueStoreImpl( deleteOptionValuesForEnrollment( optionCodeValuesToDelete, ) + EntryMode.DV, -> throw IllegalArgumentException( "DataValues can't be saved using these arguments. Use the other one.", diff --git a/app/src/main/java/org/dhis2/data/server/SSLContextInitializer.kt b/app/src/main/java/org/dhis2/data/server/SSLContextInitializer.kt index 648fc44d02e..00aa4ede100 100644 --- a/app/src/main/java/org/dhis2/data/server/SSLContextInitializer.kt +++ b/app/src/main/java/org/dhis2/data/server/SSLContextInitializer.kt @@ -17,7 +17,7 @@ object SSLContextInitializer { } try { Security.insertProviderAt(Conscrypt.newProvider(), 1) - } catch (e: Exception) { + } catch (e: Throwable) { Timber.e(SSLContextInitializer::class.java.simpleName, e.toString()) } } diff --git a/app/src/main/java/org/dhis2/data/server/ServerModule.kt b/app/src/main/java/org/dhis2/data/server/ServerModule.kt index 1021d00743e..0b2d8395d9b 100644 --- a/app/src/main/java/org/dhis2/data/server/ServerModule.kt +++ b/app/src/main/java/org/dhis2/data/server/ServerModule.kt @@ -5,7 +5,9 @@ import android.content.ContextWrapper import dagger.Module import dagger.Provides import dhis2.org.analytics.charts.Charts -import dhis2.org.analytics.charts.DhisAnalyticCharts +import dhis2.org.analytics.charts.di.ChartsComponent +import dhis2.org.analytics.charts.di.DaggerChartsComponent +import dhis2.org.analytics.charts.domain.GetEnrollmentAnalyticsUseCase import okhttp3.Interceptor import org.dhis2.BuildConfig import org.dhis2.R @@ -21,8 +23,6 @@ import org.dhis2.commons.resources.EventResourcesProvider import org.dhis2.commons.resources.MetadataIconProvider import org.dhis2.commons.resources.ResourceManager import org.dhis2.commons.schedulers.SchedulerProvider -import org.dhis2.commons.viewmodel.DispatcherProvider -import org.dhis2.data.service.SyncStatusController import org.dhis2.data.service.VersionRepository import org.dhis2.form.data.OptionsRepository import org.dhis2.form.data.RulesUtilsProvider @@ -83,7 +83,20 @@ class ServerModule { @Provides @PerServer - fun provideCharts(serverComponent: ServerComponent): Charts = DhisAnalyticCharts.Provider.get(serverComponent) + fun provideChartsComponent(serverComponent: ServerComponent): ChartsComponent = + DaggerChartsComponent + .builder() + .dependencies(serverComponent) + .build() + + @Provides + @PerServer + fun provideCharts(chartsComponent: ChartsComponent): Charts = chartsComponent.charts() + + @Provides + @PerServer + fun provideGetEnrollmentAnalyticsUseCase(chartsComponent: ChartsComponent): GetEnrollmentAnalyticsUseCase = + chartsComponent.getEnrollmentAnalyticsUseCase() @Provides @PerServer @@ -104,7 +117,10 @@ class ServerModule { @Provides @PerServer - fun providesRepository(d2: D2): ServerSettingsRepository = ServerSettingsRepository(d2) + fun providesRepository( + d2: D2, + colorUtils: ColorUtils, + ): ServerSettingsRepository = ServerSettingsRepository(d2, colorUtils) @Provides @PerServer @@ -123,11 +139,6 @@ class ServerModule { colorUtils, ) - @Provides - @PerServer - fun providesSyncStatusController(dispatcherProvider: DispatcherProvider): SyncStatusController = - SyncStatusController(dispatcherProvider) - @Provides @PerServer fun providesVersionStatusController(d2: D2): VersionRepository = VersionRepository(d2) diff --git a/app/src/main/java/org/dhis2/data/server/ServerSettingsRepository.kt b/app/src/main/java/org/dhis2/data/server/ServerSettingsRepository.kt index 735da2d5033..92bfcd7b3b5 100644 --- a/app/src/main/java/org/dhis2/data/server/ServerSettingsRepository.kt +++ b/app/src/main/java/org/dhis2/data/server/ServerSettingsRepository.kt @@ -2,11 +2,18 @@ package org.dhis2.data.server import io.reactivex.Single import org.dhis2.BuildConfig +import org.dhis2.R +import org.dhis2.commons.resources.ColorUtils +import org.dhis2.commons.resources.paletteThemes +import org.dhis2.mobile.commons.color.ColorMatcher +import org.dhis2.mobile.commons.color.PaletteColor import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.settings.SystemSetting +import timber.log.Timber class ServerSettingsRepository( private val d2: D2, + private val colorUtils: ColorUtils, ) { fun getTheme(): Single<Pair<String?, Int>> = d2 @@ -14,19 +21,49 @@ class ServerSettingsRepository( .systemSetting() .get() .map { systemSettings -> - val style = + val customColor = systemSettings .firstOrNull { - it.key() == SystemSetting.SystemSettingKey.STYLE + it.key() == SystemSetting.SystemSettingKey.CUSTOM_COLOR }?.value() val flag = systemSettings .firstOrNull { it.key() == SystemSetting.SystemSettingKey.FLAG }?.value() - Pair(flag, SystemStyleMapper(style)) + if (customColor.isNullOrEmpty()) { + Pair(flag, R.style.AppTheme) + } else { + try { + val customColorPalette = PaletteColor.fromHex(customColor) + val closestColor = + ColorMatcher.findClosest( + selectedR = customColorPalette.r, + selectedG = customColorPalette.g, + selectedB = customColorPalette.b, + palette = + paletteThemes.map { (color, _) -> + PaletteColor.fromHex(color) + }, + ) + Pair(flag, getThemeFromClosestColor(closestColor)) + } catch (e: Exception) { + Timber.e(e, "Error parsing custom color, using default theme") + Pair(flag, R.style.AppTheme) + } + } } + private fun getThemeFromClosestColor(color: PaletteColor?): Int = + color?.let { + val serverTheme = colorUtils.getThemeFromColor(it.hex) + if (serverTheme != -1) { + serverTheme + } else { + R.style.AppTheme + } + } ?: R.style.AppTheme + fun allowScreenShare(): Boolean = BuildConfig.DEBUG || d2 diff --git a/app/src/main/java/org/dhis2/data/server/SystemStyleMapper.kt b/app/src/main/java/org/dhis2/data/server/SystemStyleMapper.kt deleted file mode 100644 index a00ceaede9b..00000000000 --- a/app/src/main/java/org/dhis2/data/server/SystemStyleMapper.kt +++ /dev/null @@ -1,17 +0,0 @@ -package org.dhis2.data.server - -import org.dhis2.R - -object SystemStyleMapper { - private const val SERVER_GREEN_THEME = "green" - private const val SERVER_INDIA_THEME = "india" - private const val SERVER_MYANMAR_THEME = "myanmar" - - operator fun invoke(serverStyle: String?): Int = - when { - serverStyle?.contains(SERVER_GREEN_THEME) == true -> R.style.GreenTheme - serverStyle?.contains(SERVER_INDIA_THEME) == true -> R.style.OrangeTheme - serverStyle?.contains(SERVER_MYANMAR_THEME) == true -> R.style.RedTheme - else -> R.style.AppTheme - } -} diff --git a/app/src/main/java/org/dhis2/data/service/CheckVersionWorker.kt b/app/src/main/java/org/dhis2/data/service/CheckVersionWorker.kt index 62ba41d5c77..531d10c6f03 100644 --- a/app/src/main/java/org/dhis2/data/service/CheckVersionWorker.kt +++ b/app/src/main/java/org/dhis2/data/service/CheckVersionWorker.kt @@ -1,20 +1,17 @@ package org.dhis2.data.service import android.content.Context -import androidx.work.Worker +import androidx.work.CoroutineWorker import androidx.work.WorkerParameters -import org.dhis2.usescases.main.MainPresenter -import javax.inject.Inject class CheckVersionWorker( context: Context, workerParams: WorkerParameters, -) : Worker(context, workerParams) { - @Inject - internal lateinit var presenter: MainPresenter + private val versionRepository: VersionRepository, +) : CoroutineWorker(context, workerParams) { - override fun doWork(): Result { - presenter.checkVersionUpdate() + override suspend fun doWork(): Result { + versionRepository.checkVersionUpdates() return Result.success() } } diff --git a/app/src/main/java/org/dhis2/data/service/SyncDataWorker.java b/app/src/main/java/org/dhis2/data/service/SyncDataWorker.java deleted file mode 100644 index ebb30c9b4e5..00000000000 --- a/app/src/main/java/org/dhis2/data/service/SyncDataWorker.java +++ /dev/null @@ -1,206 +0,0 @@ -package org.dhis2.data.service; - -import static org.dhis2.utils.analytics.AnalyticsConstants.DATA_TIME; - -import android.app.NotificationChannel; -import android.app.NotificationManager; -import android.content.Context; -import android.content.pm.ServiceInfo; -import android.os.Build; - -import androidx.annotation.NonNull; -import androidx.core.app.NotificationCompat; -import androidx.core.app.NotificationManagerCompat; -import androidx.work.Data; -import androidx.work.ForegroundInfo; -import androidx.work.Worker; -import androidx.work.WorkerParameters; - -import org.dhis2.App; -import org.dhis2.R; -import org.dhis2.commons.Constants; -import org.dhis2.commons.date.DateUtils; -import org.dhis2.commons.network.NetworkUtils; -import org.dhis2.commons.prefs.PreferenceProvider; - -import java.util.Calendar; -import java.util.Objects; - -import javax.inject.Inject; - -import timber.log.Timber; - -public class SyncDataWorker extends Worker { - - private static final String DATA_CHANNEL = "sync_data_notification"; - private static final int SYNC_DATA_ID = 8071986; - - @Inject - SyncPresenter presenter; - - @Inject - PreferenceProvider prefs; - - public SyncDataWorker( - @NonNull Context context, - @NonNull WorkerParameters workerParams) { - super(context, workerParams); - } - - @NonNull - @Override - public Result doWork() { - Objects.requireNonNull(((App) getApplicationContext()).userComponent()) - .plus(new SyncDataWorkerModule()) - .inject(this); - - presenter.initSyncControllerMap(); - - triggerNotification( - getApplicationContext().getString(R.string.app_name), - getApplicationContext().getString(R.string.syncing_data), - 0); - - boolean isEventOk = true; - boolean isTeiOk = true; - boolean isDataValue = true; - - long init = System.currentTimeMillis(); - - triggerNotification( - getApplicationContext().getString(R.string.app_name), - getApplicationContext().getString(R.string.syncing_events), - 20); - - try { - presenter.syncAndDownloadEvents(); - } catch (Exception e) { - if (!new NetworkUtils(getApplicationContext()).isOnline()) { - presenter.setNetworkUnavailable(); - } - Timber.e(e); - isEventOk = false; - } - - triggerNotification( - getApplicationContext().getString(R.string.app_name), - getApplicationContext().getString(R.string.syncing_teis), - 40); - - try { - presenter.syncAndDownloadTeis(); - } catch (Exception e) { - if (!new NetworkUtils(getApplicationContext()).isOnline()) { - presenter.setNetworkUnavailable(); - } - Timber.e(e); - isTeiOk = false; - } - - triggerNotification( - getApplicationContext().getString(R.string.app_name), - getApplicationContext().getString(R.string.syncing_data_sets), - 60); - - try { - presenter.syncAndDownloadDataValues(); - } catch (Exception e) { - if (!new NetworkUtils(getApplicationContext()).isOnline()) { - presenter.setNetworkUnavailable(); - } - Timber.e(e); - isDataValue = false; - } - - triggerNotification( - getApplicationContext().getString(R.string.app_name), - getApplicationContext().getString(R.string.syncing_resources), - 80); - - try { - presenter.downloadResources(); - } catch (Exception e) { - Timber.e(e); - } - - triggerNotification( - getApplicationContext().getString(R.string.app_name), - "syncing reserved values", - 95 - - ); - - try { - presenter.syncReservedValues(); - } catch (Exception e) { - Timber.e(e); - } - - triggerNotification( - getApplicationContext().getString(R.string.app_name), - getApplicationContext().getString(R.string.syncing_done), - 100); - - presenter.logTimeToFinish(System.currentTimeMillis() - init, DATA_TIME); - - String lastDataSyncDate = DateUtils.dateTimeFormat().format(Calendar.getInstance().getTime()); - SyncResult syncResult = presenter.checkSyncStatus(); - - prefs.setValue(Constants.LAST_DATA_SYNC, lastDataSyncDate); - prefs.setValue(Constants.LAST_DATA_SYNC_STATUS, isEventOk && isTeiOk && isDataValue && syncResult == SyncResult.SYNC); - prefs.setValue(Constants.SYNC_RESULT, syncResult.name()); - - cancelNotification(); - - presenter.startPeriodicDataWork(); - - presenter.finishSync(); - - return Result.success(createOutputData(true)); - } - - @Override - public void onStopped() { - cancelNotification(); - super.onStopped(); - } - - private Data createOutputData(boolean state) { - return new Data.Builder() - .putBoolean("DATA_STATE", state) - .build(); - } - - private void triggerNotification(String title, String content, int progress) { - NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - NotificationChannel mChannel = new NotificationChannel(DATA_CHANNEL, "DataSync", NotificationManager.IMPORTANCE_HIGH); - notificationManager.createNotificationChannel(mChannel); - } - - NotificationCompat.Builder notificationBuilder = - new NotificationCompat.Builder(getApplicationContext(), DATA_CHANNEL) - .setSmallIcon(R.drawable.ic_sync) - .setContentTitle(title) - .setContentText(content) - .setOngoing(true) - .setOnlyAlertOnce(true) - .setAutoCancel(false) - .setProgress(100, progress, false) - .setPriority(NotificationCompat.PRIORITY_DEFAULT); - - setForegroundAsync(new ForegroundInfo( - SyncDataWorker.SYNC_DATA_ID, - notificationBuilder.build(), - Build.VERSION.SDK_INT >= Build.VERSION_CODES.R ? ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC : 0 - )); - - } - - private void cancelNotification() { - NotificationManagerCompat notificationManager = - NotificationManagerCompat.from(getApplicationContext()); - notificationManager.cancel(SYNC_DATA_ID); - } -} diff --git a/app/src/main/java/org/dhis2/data/service/SyncDataWorkerComponent.java b/app/src/main/java/org/dhis2/data/service/SyncDataWorkerComponent.java deleted file mode 100644 index 3938520a51d..00000000000 --- a/app/src/main/java/org/dhis2/data/service/SyncDataWorkerComponent.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.dhis2.data.service; - -import androidx.annotation.NonNull; - -import org.dhis2.commons.di.dagger.PerService; - -import dagger.Subcomponent; - -@PerService -@Subcomponent(modules = SyncDataWorkerModule.class) -public interface SyncDataWorkerComponent { - void inject(@NonNull SyncDataWorker syncDataWorker); -} diff --git a/app/src/main/java/org/dhis2/data/service/SyncDataWorkerModule.kt b/app/src/main/java/org/dhis2/data/service/SyncDataWorkerModule.kt deleted file mode 100644 index c299f0c4856..00000000000 --- a/app/src/main/java/org/dhis2/data/service/SyncDataWorkerModule.kt +++ /dev/null @@ -1,37 +0,0 @@ -package org.dhis2.data.service - -import dagger.Module -import dagger.Provides -import org.dhis2.commons.di.dagger.PerService -import org.dhis2.commons.prefs.PreferenceProvider -import org.dhis2.commons.simprints.ramp.repository.RampDatastoreRepository as SimprintsRampDatastoreRepository -import org.dhis2.data.service.workManager.WorkManagerController -import org.dhis2.utils.analytics.AnalyticsHelper -import org.hisp.dhis.android.core.D2 - -@Module -class SyncDataWorkerModule { - @Provides - @PerService - fun syncRepository(d2: D2): SyncRepository = SyncRepositoryImpl(d2) - - @Provides - @PerService - internal fun syncPresenter( - d2: D2, - preferences: PreferenceProvider, - workManagerController: WorkManagerController, - analyticsHelper: AnalyticsHelper, - syncStatusController: SyncStatusController, - syncRepository: SyncRepository, - ): SyncPresenter = - SyncPresenterImpl( - d2, - preferences, - workManagerController, - analyticsHelper, - syncStatusController, - syncRepository, - SimprintsRampDatastoreRepository(d2), - ) -} diff --git a/app/src/main/java/org/dhis2/data/service/SyncGranularRxModule.kt b/app/src/main/java/org/dhis2/data/service/SyncGranularRxModule.kt index e42f3f9bc97..3875821b4c7 100644 --- a/app/src/main/java/org/dhis2/data/service/SyncGranularRxModule.kt +++ b/app/src/main/java/org/dhis2/data/service/SyncGranularRxModule.kt @@ -4,13 +4,13 @@ import dagger.Module import dagger.Provides import org.dhis2.commons.di.dagger.PerService import org.dhis2.commons.prefs.PreferenceProvider -import org.dhis2.commons.simprints.ramp.repository.RampDatastoreRepository as SimprintsRampDatastoreRepository -import org.dhis2.data.service.workManager.WorkManagerController -import org.dhis2.utils.analytics.AnalyticsHelper +import org.dhis2.mobile.sync.domain.SyncStatusController import org.hisp.dhis.android.core.D2 @Module -class SyncGranularRxModule { +class SyncGranularRxModule( + private val syncStatusController: SyncStatusController, +) { @Provides @PerService fun syncRepository(d2: D2): SyncRepository = SyncRepositoryImpl(d2) @@ -20,18 +20,12 @@ class SyncGranularRxModule { internal fun syncPresenter( d2: D2, preferences: PreferenceProvider, - workManagerController: WorkManagerController, - analyticsHelper: AnalyticsHelper, - syncStatusController: SyncStatusController, syncRepository: SyncRepository, ): SyncPresenter = SyncPresenterImpl( d2, preferences, - workManagerController, - analyticsHelper, - syncStatusController, syncRepository, - SimprintsRampDatastoreRepository(d2), + syncStatusController, ) } diff --git a/app/src/main/java/org/dhis2/data/service/SyncGranularWorker.kt b/app/src/main/java/org/dhis2/data/service/SyncGranularWorker.kt index e15ffa40ae0..6ce7392a572 100644 --- a/app/src/main/java/org/dhis2/data/service/SyncGranularWorker.kt +++ b/app/src/main/java/org/dhis2/data/service/SyncGranularWorker.kt @@ -44,6 +44,7 @@ import org.dhis2.commons.Constants.ORG_UNIT import org.dhis2.commons.Constants.PERIOD_ID import org.dhis2.commons.Constants.UID import org.dhis2.commons.sync.ConflictType +import org.dhis2.mobile.sync.domain.SyncStatusController import javax.inject.Inject private const val GRANULAR_CHANNEL = "sync_granular_notification" @@ -52,6 +53,7 @@ private const val SYNC_GRANULAR_ID = 8071988 class SyncGranularWorker( context: Context, workerParams: WorkerParameters, + private val syncStatusController: SyncStatusController, ) : Worker(context, workerParams) { @Inject internal lateinit var presenter: SyncPresenter @@ -59,7 +61,7 @@ class SyncGranularWorker( override fun doWork(): Result { (applicationContext as App) .userComponent() - ?.plus(SyncGranularRxModule()) + ?.plus(SyncGranularRxModule(syncStatusController)) ?.inject(this) val uid = inputData.getString(UID) ?: return Result.failure() diff --git a/app/src/main/java/org/dhis2/data/service/SyncInitWorker.java b/app/src/main/java/org/dhis2/data/service/SyncInitWorker.java deleted file mode 100644 index f8ac513724b..00000000000 --- a/app/src/main/java/org/dhis2/data/service/SyncInitWorker.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.dhis2.data.service; - -import android.content.Context; - -import androidx.annotation.NonNull; -import androidx.work.Worker; -import androidx.work.WorkerParameters; - -import org.dhis2.App; - -import javax.inject.Inject; - -public class SyncInitWorker extends Worker { - - public static final String INIT_META = "INIT_META"; - public static final String INIT_DATA = "INIT_DATA"; - - @Inject - SyncPresenter presenter; - - public SyncInitWorker( - @NonNull Context context, - @NonNull WorkerParameters workerParams) { - super(context, workerParams); - } - - @NonNull - @Override - public Result doWork() { - - if (((App) getApplicationContext()).userComponent() != null) { - - ((App) getApplicationContext()).userComponent().plus(new SyncInitWorkerModule()).inject(this); - - if (getInputData().getBoolean(INIT_META, false)) - presenter.startPeriodicMetaWork(); - if (getInputData().getBoolean(INIT_DATA, false)) - presenter.startPeriodicDataWork(); - - return Result.success(); - } else { - return Result.failure(); - } - } - -} diff --git a/app/src/main/java/org/dhis2/data/service/SyncInitWorkerComponent.java b/app/src/main/java/org/dhis2/data/service/SyncInitWorkerComponent.java deleted file mode 100644 index ea8097b8f1f..00000000000 --- a/app/src/main/java/org/dhis2/data/service/SyncInitWorkerComponent.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.dhis2.data.service; - -import androidx.annotation.NonNull; - -import org.dhis2.commons.di.dagger.PerService; - -import dagger.Subcomponent; - -@PerService -@Subcomponent(modules = SyncInitWorkerModule.class) -public interface SyncInitWorkerComponent { - void inject(@NonNull SyncInitWorker syncInitWorker); -} diff --git a/app/src/main/java/org/dhis2/data/service/SyncInitWorkerModule.kt b/app/src/main/java/org/dhis2/data/service/SyncInitWorkerModule.kt deleted file mode 100644 index b14ea061051..00000000000 --- a/app/src/main/java/org/dhis2/data/service/SyncInitWorkerModule.kt +++ /dev/null @@ -1,37 +0,0 @@ -package org.dhis2.data.service - -import dagger.Module -import dagger.Provides -import org.dhis2.commons.di.dagger.PerService -import org.dhis2.commons.prefs.PreferenceProvider -import org.dhis2.commons.simprints.ramp.repository.RampDatastoreRepository as SimprintsRampDatastoreRepository -import org.dhis2.data.service.workManager.WorkManagerController -import org.dhis2.utils.analytics.AnalyticsHelper -import org.hisp.dhis.android.core.D2 - -@Module -class SyncInitWorkerModule { - @Provides - @PerService - fun syncRepository(d2: D2): SyncRepository = SyncRepositoryImpl(d2) - - @Provides - @PerService - internal fun syncPresenter( - d2: D2, - preferences: PreferenceProvider, - workManagerController: WorkManagerController, - analyticsHelper: AnalyticsHelper, - syncStatusController: SyncStatusController, - syncRepository: SyncRepository, - ): SyncPresenter = - SyncPresenterImpl( - d2, - preferences, - workManagerController, - analyticsHelper, - syncStatusController, - syncRepository, - SimprintsRampDatastoreRepository(d2), - ) -} diff --git a/app/src/main/java/org/dhis2/data/service/SyncMetadataWorker.java b/app/src/main/java/org/dhis2/data/service/SyncMetadataWorker.java deleted file mode 100644 index 2757c5bea89..00000000000 --- a/app/src/main/java/org/dhis2/data/service/SyncMetadataWorker.java +++ /dev/null @@ -1,212 +0,0 @@ -package org.dhis2.data.service; - -import static org.dhis2.data.service.SyncOutputKt.METADATA_MESSAGE; -import static org.dhis2.data.service.SyncOutputKt.METADATA_STATE; -import static org.dhis2.utils.analytics.AnalyticsConstants.METADATA_TIME; - -import android.app.NotificationChannel; -import android.app.NotificationManager; -import android.content.Context; -import android.content.pm.ServiceInfo; -import android.os.Build; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.app.NotificationCompat; -import androidx.core.app.NotificationManagerCompat; -import androidx.work.Data; -import androidx.work.ForegroundInfo; -import androidx.work.Worker; -import androidx.work.WorkerParameters; - -import org.dhis2.App; -import org.dhis2.R; -import org.dhis2.commons.date.DateUtils; -import org.dhis2.commons.prefs.PreferenceProvider; -import org.dhis2.commons.resources.ResourceManager; -import org.dhis2.commons.Constants; -import org.dhis2.utils.NetworkUtils; -import org.hisp.dhis.android.core.maintenance.D2Error; - -import java.io.PrintWriter; -import java.io.StringWriter; -import java.io.Writer; -import java.util.Calendar; - -import javax.inject.Inject; - -import timber.log.Timber; - -public class SyncMetadataWorker extends Worker { - - private static final String METADATA_CHANNEL = "sync_metadata_notification"; - private static final int SYNC_METADATA_ID = 26061987; - - @Inject - SyncPresenter presenter; - - @Inject - PreferenceProvider prefs; - - @Inject - ResourceManager resourceManager; - - public SyncMetadataWorker( - @NonNull Context context, - @NonNull WorkerParameters workerParams) { - super(context, workerParams); - } - - @NonNull - @Override - public Result doWork() { - if (((App) getApplicationContext()).userComponent() != null) { - - ((App) getApplicationContext()).userComponent().plus(new SyncMetadataWorkerModule()).inject(this); - - triggerNotification( - getApplicationContext().getString(R.string.app_name), - getApplicationContext().getString(R.string.syncing_configuration), - 0); - - boolean isMetaOk = true; - boolean noNetwork = false; - StringBuilder message = new StringBuilder(""); - - long init = System.currentTimeMillis(); - try { - presenter.syncMetadata(progress -> triggerNotification( - getApplicationContext().getString(R.string.app_name), - getApplicationContext().getString(R.string.syncing_configuration), - progress)); - } catch (Exception e) { - Timber.e(e); - isMetaOk = false; - if (!NetworkUtils.isOnline(getApplicationContext())) - noNetwork = true; - if (e instanceof D2Error) { - D2Error error = (D2Error) e; - message.append(composeErrorMessageInfo(error)); - } else if (e.getCause() instanceof D2Error) { - D2Error error = (D2Error) e.getCause(); - message.append(composeErrorMessageInfo(error)); - } else { - message.append(e.toString().split("\n\t")[0]); - } - } finally { - presenter.logTimeToFinish(System.currentTimeMillis() - init, METADATA_TIME); - } - - String lastDataSyncDate = DateUtils.dateTimeFormat().format(Calendar.getInstance().getTime()); - - prefs.setValue(Constants.LAST_META_SYNC, lastDataSyncDate); - prefs.setValue(Constants.LAST_META_SYNC_STATUS, isMetaOk); - prefs.setValue(Constants.LAST_META_SYNC_NO_NETWORK, noNetwork); - - cancelNotification(); - - if (!isMetaOk) - return Result.failure(createOutputData(false, message.toString())); - - presenter.startPeriodicMetaWork(); - - return Result.success(createOutputData(true, message.toString())); - } else { - return Result.failure(createOutputData(false, getApplicationContext().getString(R.string.error_init_session))); - } - } - - @Override - public void onStopped() { - cancelNotification(); - super.onStopped(); - } - - private Data createOutputData(boolean state, String message) { - return new Data.Builder() - .putBoolean(METADATA_STATE, state) - .putString(METADATA_MESSAGE, message) - .build(); - } - - private String errorStackTrace(@Nullable Exception exception) { - if (exception == null) - return ""; - Writer writer = new StringWriter(); - exception.printStackTrace(new PrintWriter(writer)); - return writer.toString(); - } - - private StringBuilder composeErrorMessageInfo(D2Error error) { - StringBuilder builder = new StringBuilder("Cause: ") - .append(resourceManager.parseD2Error(error)) - .append("\n\n") - .append("Exception: ") - .append(errorStackTrace((error).originalException()).split("\n\t")[0]) - .append("\n\n"); - - if (error.created() != null) { - builder.append("Created: ") - .append(error.created().toString()) - .append("\n\n"); - } - - if (error.httpErrorCode() != null) { - builder.append("Http Error Code: ") - .append(error.httpErrorCode()) - .append("\n\n"); - } - - if (error.errorComponent() != null) { - builder.append("Error component: ") - .append(error.errorComponent()) - .append("\n\n"); - } - - if (error.url() != null) { - builder.append("Url: ") - .append(error.url()) - .append("\n\n"); - } - - builder.append("StackTrace: ") - .append(errorStackTrace(error).split("\n\t")[0]) - .append("\n\n"); - - return builder; - } - - private void triggerNotification(String title, String content, int progress) { - NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - NotificationChannel mChannel = new NotificationChannel(METADATA_CHANNEL, "MetadataSync", NotificationManager.IMPORTANCE_HIGH); - notificationManager.createNotificationChannel(mChannel); - } - NotificationCompat.Builder notificationBuilder = - new NotificationCompat.Builder(getApplicationContext(), METADATA_CHANNEL) - .setSmallIcon(R.drawable.ic_sync) - .setContentTitle(title) - .setContentText(content) - .setOngoing(true) - .setOnlyAlertOnce(true) - .setAutoCancel(false) - .setProgress(100, progress, false) - .setPriority(NotificationCompat.PRIORITY_DEFAULT); - - setForegroundAsync(new ForegroundInfo( - SyncMetadataWorker.SYNC_METADATA_ID, - notificationBuilder.build(), - Build.VERSION.SDK_INT >= Build.VERSION_CODES.R ? ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC : 0 - )); - } - - private void cancelNotification() { - NotificationManagerCompat notificationManager = - NotificationManagerCompat.from(getApplicationContext()); - notificationManager.cancel(SYNC_METADATA_ID); - } - - public interface OnProgressUpdate { - void onProgressUpdate(int progress); - } -} diff --git a/app/src/main/java/org/dhis2/data/service/SyncMetadataWorkerComponent.java b/app/src/main/java/org/dhis2/data/service/SyncMetadataWorkerComponent.java deleted file mode 100644 index 20d6b70c2da..00000000000 --- a/app/src/main/java/org/dhis2/data/service/SyncMetadataWorkerComponent.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.dhis2.data.service; - -import androidx.annotation.NonNull; - -import org.dhis2.commons.di.dagger.PerService; - -import dagger.Subcomponent; - -@PerService -@Subcomponent(modules = SyncMetadataWorkerModule.class) -public interface SyncMetadataWorkerComponent { - void inject(@NonNull SyncMetadataWorker syncMetadataWorker); -} diff --git a/app/src/main/java/org/dhis2/data/service/SyncMetadataWorkerModule.kt b/app/src/main/java/org/dhis2/data/service/SyncMetadataWorkerModule.kt deleted file mode 100644 index fcd02f30b29..00000000000 --- a/app/src/main/java/org/dhis2/data/service/SyncMetadataWorkerModule.kt +++ /dev/null @@ -1,37 +0,0 @@ -package org.dhis2.data.service - -import dagger.Module -import dagger.Provides -import org.dhis2.commons.di.dagger.PerService -import org.dhis2.commons.prefs.PreferenceProvider -import org.dhis2.commons.simprints.ramp.repository.RampDatastoreRepository as SimprintsRampDatastoreRepository -import org.dhis2.data.service.workManager.WorkManagerController -import org.dhis2.utils.analytics.AnalyticsHelper -import org.hisp.dhis.android.core.D2 - -@Module -class SyncMetadataWorkerModule { - @Provides - @PerService - fun syncRepository(d2: D2): SyncRepository = SyncRepositoryImpl(d2) - - @Provides - @PerService - internal fun syncPresenter( - d2: D2, - preferences: PreferenceProvider, - workManagerController: WorkManagerController, - analyticsHelper: AnalyticsHelper, - syncStatusController: SyncStatusController, - syncRepository: SyncRepository, - ): SyncPresenter = - SyncPresenterImpl( - d2, - preferences, - workManagerController, - analyticsHelper, - syncStatusController, - syncRepository, - SimprintsRampDatastoreRepository(d2), - ) -} diff --git a/app/src/main/java/org/dhis2/data/service/SyncPresenter.java b/app/src/main/java/org/dhis2/data/service/SyncPresenter.java index 507a0fabd4a..297ca06c001 100644 --- a/app/src/main/java/org/dhis2/data/service/SyncPresenter.java +++ b/app/src/main/java/org/dhis2/data/service/SyncPresenter.java @@ -1,28 +1,15 @@ package org.dhis2.data.service; +import androidx.work.ListenableWorker; + import org.hisp.dhis.android.core.arch.call.D2Progress; import org.hisp.dhis.android.core.imports.TrackerImportConflict; -import org.hisp.dhis.android.core.tracker.exporter.TrackerD2Progress; import java.util.List; -import androidx.work.ListenableWorker; - import io.reactivex.Observable; interface SyncPresenter { - void syncAndDownloadEvents() throws Exception; - - void syncAndDownloadTeis() throws Exception; - - void syncMetadata(SyncMetadataWorker.OnProgressUpdate progressUpdate) throws Exception; - - void syncAndDownloadDataValues() throws Exception; - - void syncReservedValues(); - - SyncResult checkSyncStatus(); - Observable<D2Progress> syncGranularEvent(String eventUid); ListenableWorker.Result blockSyncGranularProgram(String programUid); @@ -57,21 +44,5 @@ interface SyncPresenter { List<TrackerImportConflict> messageTrackerImportConflict(String uid); - void startPeriodicDataWork(); - - void startPeriodicMetaWork(); - - void downloadResources(); - ListenableWorker.Result blockSyncGranularDataValues(String dataSetUid, String orgUnitUid, String attrOptionCombo, String periodId, String[] catOptionCombo); - - void logTimeToFinish(long millisToFinish, String eventName); - - void updateProyectAnalytics(); - - void initSyncControllerMap(); - - void finishSync(); - - void setNetworkUnavailable(); } diff --git a/app/src/main/java/org/dhis2/data/service/SyncPresenterImpl.kt b/app/src/main/java/org/dhis2/data/service/SyncPresenterImpl.kt index 164eccceb00..28f480d09f8 100644 --- a/app/src/main/java/org/dhis2/data/service/SyncPresenterImpl.kt +++ b/app/src/main/java/org/dhis2/data/service/SyncPresenterImpl.kt @@ -2,129 +2,35 @@ package org.dhis2.data.service import androidx.annotation.VisibleForTesting import androidx.work.Data -import androidx.work.ExistingWorkPolicy import androidx.work.ListenableWorker import io.reactivex.Completable import io.reactivex.Observable -import org.dhis2.bindings.toSeconds +import kotlinx.coroutines.runBlocking import org.dhis2.commons.bindings.enrollment +import org.dhis2.commons.bindings.event import org.dhis2.commons.bindings.program import org.dhis2.commons.date.DateUtils -import org.dhis2.commons.prefs.Preference.Companion.DATA import org.dhis2.commons.prefs.Preference.Companion.EVENT_MAX import org.dhis2.commons.prefs.Preference.Companion.EVENT_MAX_DEFAULT import org.dhis2.commons.prefs.Preference.Companion.LIMIT_BY_ORG_UNIT import org.dhis2.commons.prefs.Preference.Companion.LIMIT_BY_PROGRAM -import org.dhis2.commons.prefs.Preference.Companion.META -import org.dhis2.commons.prefs.Preference.Companion.TEI_MAX -import org.dhis2.commons.prefs.Preference.Companion.TEI_MAX_DEFAULT -import org.dhis2.commons.prefs.Preference.Companion.TIME_DAILY -import org.dhis2.commons.prefs.Preference.Companion.TIME_DATA -import org.dhis2.commons.prefs.Preference.Companion.TIME_META import org.dhis2.commons.prefs.PreferenceProvider -import org.dhis2.commons.simprints.ramp.repository.RampDatastoreRepository as SimprintsRampDatastoreRepository -import org.dhis2.data.service.workManager.WorkManagerController -import org.dhis2.data.service.workManager.WorkerItem -import org.dhis2.data.service.workManager.WorkerType -import org.dhis2.utils.analytics.AnalyticsHelper -import org.dhis2.utils.analytics.matomo.DEFAULT_EXTERNAL_TRACKER_NAME +import org.dhis2.mobile.sync.domain.SyncStatusController import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.arch.call.D2Progress -import org.hisp.dhis.android.core.arch.call.D2ProgressStatus import org.hisp.dhis.android.core.common.State -import org.hisp.dhis.android.core.fileresource.FileResourceDomainType import org.hisp.dhis.android.core.imports.TrackerImportConflict import org.hisp.dhis.android.core.program.ProgramType -import org.hisp.dhis.android.core.settings.GeneralSettings import org.hisp.dhis.android.core.settings.LimitScope import org.hisp.dhis.android.core.settings.ProgramSettings -import org.hisp.dhis.android.core.systeminfo.DHISVersion -import timber.log.Timber import java.util.Calendar -import kotlin.math.ceil class SyncPresenterImpl( private val d2: D2, private val preferences: PreferenceProvider, - private val workManagerController: WorkManagerController, - private val analyticsHelper: AnalyticsHelper, - private val syncStatusController: SyncStatusController, private val syncRepository: SyncRepository, - private val simprintsRampDatastoreRepository: SimprintsRampDatastoreRepository, + private val syncStatusController: SyncStatusController, ) : SyncPresenter { - override fun initSyncControllerMap() { - Completable - .fromCallable { - val programMap: Map<String, D2ProgressStatus> = - d2 - .programModule() - .programs() - .blockingGetUids() - .map { programUid -> - programUid to D2ProgressStatus(false, null) - }.toMap() - val aggregateMap: Map<String, D2ProgressStatus> = - d2.dataSetModule().dataSets().blockingGetUids().associateWith { - D2ProgressStatus(false, null) - } - val allMap = - programMap - .toMutableMap() - .apply { - putAll(aggregateMap) - }.toMap() - syncStatusController.initDownloadProcess(allMap) - }.blockingAwait() - } - - override fun finishSync() { - syncStatusController.finishSync() - } - - override fun setNetworkUnavailable() { - syncStatusController.onNetworkUnavailable() - } - - override fun syncAndDownloadEvents() { - val (eventLimit, limitByOU, limitByProgram) = getDownloadLimits() - val programEventUids = - d2 - .programModule() - .programs() - .byProgramType() - .eq(ProgramType.WITHOUT_REGISTRATION) - .blockingGetUids() - syncStatusController.startDownloadingEvents() - Completable - .fromObservable(d2.eventModule().events().upload()) - .andThen( - Completable - .fromObservable( - d2 - .eventModule() - .eventDownloader() - .limit(eventLimit) - .limitByOrgunit(limitByOU) - .limitByProgram(limitByProgram) - .download() - .doOnNext { d2Progress -> - syncStatusController.updateDownloadProcess( - d2Progress.programs().filter { entry -> - programEventUids.contains(entry.key) - }, - ) - }, - ).doOnError { - Timber.d("error while downloading Events") - }.onErrorComplete() - .doOnComplete { - syncStatusController.finishDownloadingEvents( - programEventUids, - ) - }, - ).blockingAwait() - } - @VisibleForTesting fun getDownloadLimits(): Triple<Int, Boolean, Boolean> { val programSettings = getProgramSetting() @@ -150,241 +56,15 @@ class SyncPresenterImpl( return Triple(eventLimit, limitByOU, limitByProgram) } - override fun syncAndDownloadTeis() { - val programSettings = getProgramSetting() - val globalProgramSettings = programSettings?.globalSettings() - - val teiLimit = - globalProgramSettings?.teiDownload() ?: preferences.getInt(TEI_MAX, TEI_MAX_DEFAULT) - val limitByOU = - globalProgramSettings?.settingDownload()?.let { - it == LimitScope.PER_ORG_UNIT || it == LimitScope.PER_OU_AND_PROGRAM - } ?: preferences.getBoolean(LIMIT_BY_ORG_UNIT, false) - val limitByProgram = - globalProgramSettings?.settingDownload()?.let { - it == LimitScope.PER_PROGRAM || it == LimitScope.PER_OU_AND_PROGRAM - } ?: preferences.getBoolean(LIMIT_BY_PROGRAM, false) - - val trackerProgramUids = - d2 - .programModule() - .programs() - .byProgramType() - .eq(ProgramType.WITH_REGISTRATION) - .blockingGetUids() - - syncStatusController.startDownloadingTracker() - - Completable - .fromObservable(d2.trackedEntityModule().trackedEntityInstances().upload()) - .andThen( - Completable - .fromObservable( - d2 - .trackedEntityModule() - .trackedEntityInstanceDownloader() - .limit(teiLimit) - .limitByOrgunit(limitByOU) - .limitByProgram(limitByProgram) - .download() - .doOnNext { data -> - val percentage = data.percentage() - val callsDone = data.doneCalls().size - val totalCalls = data.totalCalls() - Timber.d("$percentage% $callsDone/$totalCalls") - syncStatusController.updateDownloadProcess( - data.programs().filter { entry -> - trackerProgramUids.contains(entry.key) - }, - ) - }, - ).doOnError { Timber.d("error while downloading TEIs") } - .onErrorComplete() - .doOnComplete { - syncStatusController.finishDownloadingTracker( - trackerProgramUids, - ) - }, - ).blockingAwait() - } - - override fun syncAndDownloadDataValues() { - val dataSetUids = d2.dataSetModule().dataSets().blockingGetUids() - if (dataSetUids.isNotEmpty()) { - syncStatusController.startDownloadingDataSets() - Completable - .fromObservable(d2.dataValueModule().dataValues().upload()) - .doOnError { Timber.d("error while downloading Datasets") } - .andThen( - Completable.fromObservable( - d2.dataSetModule().dataSetCompleteRegistrations().upload(), - ), - ).doOnError { Timber.d("error while downloading Datasets") } - .andThen( - Completable - .fromObservable( - d2 - .aggregatedModule() - .data() - .download() - .doOnNext { - syncStatusController.updateDownloadProcess(it.dataSets()) - }, - ).doOnError { Timber.d("error while downloading Datasets") } - .onErrorComplete() - .doOnComplete { - syncStatusController.finishDownloadingTracker( - dataSetUids, - ) - }, - ).blockingAwait() - } - } - - override fun syncMetadata(progressUpdate: SyncMetadataWorker.OnProgressUpdate) { - Completable - .fromObservable( - d2 - .metadataModule() - .download() - .doOnNext { data -> - Timber.log(1, data.toString()) - progressUpdate.onProgressUpdate(ceil(data.percentage() ?: 0.0).toInt()) - }.doOnComplete { - updateProyectAnalytics() - setUpSMS() - }, - ).doOnError { - Timber.d("error while downloading Metadata") - }.onErrorComplete() - .andThen( - d2.mapsModule().mapLayersDownloader().downloadMetadata(), - ).andThen( - Completable.fromObservable( - d2 - .fileResourceModule() - .fileResourceDownloader() - .byDomainType() - .eq(FileResourceDomainType.ICON) - .download(), - ), - ).andThen( - Completable - .fromAction { simprintsRampDatastoreRepository.sync() } - .doOnError { Timber.e(it, "Error syncing Simprints RAMP datastore") }, - ).blockingAwait() - } - - private fun setUpSMS() { - val globalSettings = getSettings() - - globalSettings?.let { - if (!globalSettings.smsGateway().isNullOrEmpty()) { - d2 - .smsModule() - .configCase() - .setGatewayNumber(globalSettings.smsGateway()) - .andThen( - if (!globalSettings.smsResultSender().isNullOrEmpty()) { - d2 - .smsModule() - .configCase() - .setConfirmationSenderNumber(globalSettings.smsResultSender()) - } else { - Completable.complete() - }, - ).andThen( - d2.smsModule().configCase().setModuleEnabled(true), - ).andThen( - d2.smsModule().configCase().refreshMetadataIds(), - ).blockingAwait() - } - } - } - - override fun downloadResources() { - if (d2.systemInfoModule().versionManager().isGreaterThan(DHISVersion.V2_32)) { - syncStatusController.initDownloadMedia() - Completable - .fromObservable( - d2 - .fileResourceModule() - .fileResourceDownloader() - .byDomainType() - .eq(FileResourceDomainType.DATA_VALUE) - .download(), - ).blockingAwait() - } - } - - override fun syncReservedValues() { - val maxNumberOfValuesToReserve = - getSettings()?.let { - it.reservedValues() ?: 100 - } ?: 100 - Completable - .fromObservable( - d2 - .trackedEntityModule() - .reservedValueManager() - .downloadAllReservedValues(maxNumberOfValuesToReserve), - ).doOnError { - Timber.d("error while downloading reserved values") - }.blockingAwait() - } - - override fun checkSyncStatus(): SyncResult { - val eventsOk = - d2 - .eventModule() - .events() - .byAggregatedSyncState() - .notIn(State.SYNCED) - .blockingGet() - .isEmpty() - val teiOk = - d2 - .trackedEntityModule() - .trackedEntityInstances() - .byAggregatedSyncState() - .notIn(State.SYNCED, State.RELATIONSHIP) - .blockingGet() - .isEmpty() - - if (eventsOk && teiOk) { - return SyncResult.SYNC - } - - val anyEventsToPostOrToUpdate = - d2 - .eventModule() - .events() - .byAggregatedSyncState() - .`in`(State.TO_POST, State.TO_UPDATE) - .blockingGet() - .isNotEmpty() - val anyTeiToPostOrToUpdate = - d2 - .trackedEntityModule() - .trackedEntityInstances() - .byAggregatedSyncState() - .`in`(State.TO_POST, State.TO_UPDATE) - .blockingGet() - .isNotEmpty() - - if (anyEventsToPostOrToUpdate || anyTeiToPostOrToUpdate) { - return SyncResult.INCOMPLETE - } - - return SyncResult.ERROR - } - override fun syncGranularEvent(eventUid: String): Observable<D2Progress> { Completable.fromObservable(syncRepository.uploadEvent(eventUid)).blockingAwait() - return syncRepository - .downLoadEvent(eventUid) - .map { it as D2Progress } - .mergeWith(syncRepository.downloadEventFiles(eventUid)) + val programUid = d2.event(eventUid)?.program() + return programUid?.let { + syncRepository + .downLoadEvent(eventUid, programUid) + .map { it as D2Progress } + .mergeWith(syncRepository.downloadEventFiles(eventUid)) + } ?: Observable.empty() } override fun blockSyncGranularProgram(programUid: String): ListenableWorker.Result { @@ -394,7 +74,9 @@ class SyncPresenterImpl( return if (!checkSyncProgramStatus(programUid)) { ListenableWorker.Result.failure() } else { - syncStatusController.updateSingleProgramToSuccess(programUid) + runBlocking { + syncStatusController.updateSingleProgramToSuccess(programUid) + } ListenableWorker.Result.success() } } @@ -725,7 +407,7 @@ class SyncPresenterImpl( .byTrackedEntityInstanceUid() .eq(uid) .blockingGet() - if (trackerImportConflicts != null && trackerImportConflicts.isNotEmpty()) { + if (!trackerImportConflicts.isNullOrEmpty()) { return trackerImportConflicts } @@ -736,7 +418,7 @@ class SyncPresenterImpl( .byEventUid() .eq(uid) .blockingGet() - if (trackerImportConflicts != null && trackerImportConflicts.isNotEmpty()) { + if (trackerImportConflicts.isNotEmpty()) { return trackerImportConflicts } @@ -747,73 +429,15 @@ class SyncPresenterImpl( .byEnrollmentUid() .eq(uid) .blockingGet() - return if (trackerImportConflicts != null && trackerImportConflicts.isNotEmpty()) { - trackerImportConflicts - } else { + return trackerImportConflicts.ifEmpty { null } } - override fun startPeriodicDataWork() { - val seconds = - getSettings()?.dataSync()?.toSeconds() ?: preferences.getInt(TIME_DATA, TIME_DAILY) - workManagerController.cancelUniqueWork(DATA) - - if (seconds != 0) { - val workerItem = - WorkerItem( - DATA, - WorkerType.DATA, - seconds.toLong(), - policy = ExistingWorkPolicy.REPLACE, - ) - - workManagerController.syncDataForWorker(workerItem) - } - } - - override fun startPeriodicMetaWork() { - val seconds = - getSettings()?.metadataSync()?.toSeconds() ?: preferences.getInt(TIME_META, TIME_DAILY) - workManagerController.cancelUniqueWork(META) - - if (seconds != 0) { - val workerItem = - WorkerItem( - META, - WorkerType.METADATA, - seconds.toLong(), - policy = ExistingWorkPolicy.REPLACE, - ) - - workManagerController.syncDataForWorker(workerItem) - } - } - - private fun getSettings(): GeneralSettings? = d2.settingModule().generalSetting().blockingGet() - - private fun getProgramSetting(): ProgramSettings? = d2.settingModule().programSetting().blockingGet() - - override fun logTimeToFinish( - millisToFinish: Long, - eventName: String, - ) { - analyticsHelper.setEvent( - eventName, - (millisToFinish / 60000.0).toString(), - eventName, - ) - } - - override fun updateProyectAnalytics() { - getSettings()?.let { - if (it.matomoID() != null && it.matomoURL() != null) { - analyticsHelper.updateMatomoSecondaryTracker( - it.matomoURL()!!, - it.matomoID()!!, - DEFAULT_EXTERNAL_TRACKER_NAME, - ) - } - } ?: analyticsHelper.clearMatomoSecondaryTracker() - } + private fun getProgramSetting(): ProgramSettings? = + d2 + .settingModule() + .synchronizationSettings() + .blockingGet() + ?.programSettings() } diff --git a/app/src/main/java/org/dhis2/data/service/SyncRepository.kt b/app/src/main/java/org/dhis2/data/service/SyncRepository.kt index 1d317d969af..8eaf15b5ac6 100644 --- a/app/src/main/java/org/dhis2/data/service/SyncRepository.kt +++ b/app/src/main/java/org/dhis2/data/service/SyncRepository.kt @@ -25,7 +25,10 @@ interface SyncRepository { fun uploadEvent(eventUid: String): Observable<D2Progress> - fun downLoadEvent(eventUid: String): Observable<out D2Progress> + fun downLoadEvent( + eventUid: String, + programUid: String, + ): Observable<TrackerD2Progress> fun downloadEventFiles(eventUid: String): Observable<D2Progress> diff --git a/app/src/main/java/org/dhis2/data/service/SyncRepositoryImpl.kt b/app/src/main/java/org/dhis2/data/service/SyncRepositoryImpl.kt index 3fdcf93e39b..5bcde1cf077 100644 --- a/app/src/main/java/org/dhis2/data/service/SyncRepositoryImpl.kt +++ b/app/src/main/java/org/dhis2/data/service/SyncRepositoryImpl.kt @@ -1,8 +1,6 @@ package org.dhis2.data.service -import io.reactivex.Observable import org.hisp.dhis.android.core.D2 -import org.hisp.dhis.android.core.arch.call.D2Progress import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.event.Event import org.hisp.dhis.android.core.trackedentity.TrackedEntityInstance @@ -57,13 +55,16 @@ class SyncRepositoryImpl( .eq(eventUid) .upload() - override fun downLoadEvent(eventUid: String): Observable<out D2Progress> = - d2 - .eventModule() - .eventDownloader() - .byUid() - .eq(eventUid) - .download() + override fun downLoadEvent( + eventUid: String, + programUid: String, + ) = d2 + .eventModule() + .eventDownloader() + .byProgramUid(programUid) + .byUid() + .eq(eventUid) + .download() override fun downloadEventFiles(eventUid: String) = d2 diff --git a/app/src/main/java/org/dhis2/data/service/SyncStatusController.kt b/app/src/main/java/org/dhis2/data/service/SyncStatusController.kt deleted file mode 100644 index 19373e1a7b9..00000000000 --- a/app/src/main/java/org/dhis2/data/service/SyncStatusController.kt +++ /dev/null @@ -1,190 +0,0 @@ -package org.dhis2.data.service - -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.launch -import org.dhis2.commons.viewmodel.DispatcherProvider -import org.hisp.dhis.android.core.arch.call.D2ProgressStatus -import org.hisp.dhis.android.core.arch.call.D2ProgressSyncStatus -import timber.log.Timber - -class SyncStatusController( - private val dispatcher: DispatcherProvider, -) { - private var progressStatusMap: Map<String, D2ProgressStatus> = emptyMap() - private val downloadStatus = MutableStateFlow(SyncStatusData(isInitialSync = true)) - - fun observeDownloadProcess(): StateFlow<SyncStatusData> = downloadStatus - - fun initDownloadProcess(programDownload: Map<String, D2ProgressStatus>) { - Timber.tag("SYNC").d("INIT DATA SYNC") - progressStatusMap = programDownload - CoroutineScope(dispatcher.io()).launch { - downloadStatus.emit( - SyncStatusData( - running = true, - downloadingEvents = false, - downloadingTracker = false, - downloadingDataSetValues = false, - false, - progressStatusMap, - ), - ) - } - } - - fun updateDownloadProcess(programDownload: Map<String, D2ProgressStatus>) { - Timber.tag("SYNC").d("Updating PROGRAM") - progressStatusMap = - progressStatusMap.toMutableMap().also { - it.putAll(programDownload) - } - CoroutineScope(dispatcher.io()).launch { - downloadStatus.emit( - downloadStatus.value.copy(programSyncStatusMap = progressStatusMap), - ) - } - } - - fun finishSync() { - Timber.tag("SYNC").d("FINISH DATA SYNC") - progressStatusMap = progressStatusMap.toMutableMap() - CoroutineScope(dispatcher.io()).launch { - downloadStatus.emit( - downloadStatus.value.copy( - running = false, - programSyncStatusMap = progressStatusMap, - ), - ) - } - } - - fun onNetworkUnavailable() { - progressStatusMap = - progressStatusMap.toMutableMap().mapValues { entry -> - if (entry.value.isComplete) { - entry.value - } else { - entry.value.copy(isComplete = true, D2ProgressSyncStatus.ERROR) - } - } - CoroutineScope(dispatcher.io()).launch { - downloadStatus.emit( - SyncStatusData(true, programSyncStatusMap = progressStatusMap), - ) - } - } - - fun startDownloadingEvents() { - CoroutineScope(dispatcher.io()).launch { - downloadStatus.emit( - downloadStatus.value.copy(running = true, downloadingEvents = true), - ) - } - } - - fun finishDownloadingEvents(eventProgramUids: List<String>) { - Timber.tag("SYNC").d("FINISHED EVENTS") - progressStatusMap = - progressStatusMap.toMutableMap().mapValues { entry -> - if (!eventProgramUids.contains(entry.key) || entry.value.isComplete) { - entry.value - } else { - entry.value.copy(isComplete = true, D2ProgressSyncStatus.ERROR) - } - } - CoroutineScope(dispatcher.io()).launch { - downloadStatus.emit( - downloadStatus.value.copy( - downloadingEvents = false, - programSyncStatusMap = progressStatusMap, - ), - ) - } - } - - fun startDownloadingTracker() { - CoroutineScope(dispatcher.io()).launch { - downloadStatus.emit( - downloadStatus.value.copy(downloadingTracker = true), - ) - } - } - - fun finishDownloadingTracker(trackerProgramUids: List<String>) { - Timber.tag("SYNC").d("FINISHED TRACKER") - - progressStatusMap = - progressStatusMap.toMutableMap().mapValues { entry -> - if (!trackerProgramUids.contains(entry.key) || entry.value.isComplete) { - entry.value - } else { - entry.value.copy(isComplete = true, D2ProgressSyncStatus.ERROR) - } - } - CoroutineScope(dispatcher.io()).launch { - downloadStatus.emit( - downloadStatus.value.copy( - downloadingTracker = false, - programSyncStatusMap = progressStatusMap, - ), - ) - } - } - - fun updateSingleProgramToSuccess(programUid: String) { - progressStatusMap = - progressStatusMap.toMutableMap().mapValues { entry -> - if (programUid != entry.key) { - entry.value - } else { - entry.value.copy(isComplete = true, D2ProgressSyncStatus.SUCCESS) - } - } - CoroutineScope(dispatcher.io()).launch { - downloadStatus.emit( - SyncStatusData(false, programSyncStatusMap = progressStatusMap), - ) - } - } - - fun initDownloadMedia() { - Timber.tag("SYNC").d("INIT FILES") - CoroutineScope(dispatcher.io()).launch { - downloadStatus.emit( - downloadStatus.value.copy(downloadingMedia = true), - ) - } - } - - fun restore() { - CoroutineScope(dispatcher.io()).launch { - downloadStatus.emit(SyncStatusData()) - } - } - - fun startDownloadingDataSets() { - CoroutineScope(dispatcher.io()).launch { - downloadStatus.emit( - downloadStatus.value.copy(downloadingDataSetValues = true), - ) - } - } - - fun finishDownloadingDataSets(dataSetUids: List<String>) { - progressStatusMap = - progressStatusMap.toMutableMap().mapValues { entry -> - if (!dataSetUids.contains(entry.key) || entry.value.isComplete) { - entry.value - } else { - entry.value.copy(isComplete = true, D2ProgressSyncStatus.ERROR) - } - } - CoroutineScope(dispatcher.io()).launch { - downloadStatus.emit( - downloadStatus.value.copy(downloadingDataSetValues = false, programSyncStatusMap = progressStatusMap), - ) - } - } -} diff --git a/app/src/main/java/org/dhis2/data/service/VersionRepository.kt b/app/src/main/java/org/dhis2/data/service/VersionRepository.kt index 23771279cc4..49c65337ce8 100644 --- a/app/src/main/java/org/dhis2/data/service/VersionRepository.kt +++ b/app/src/main/java/org/dhis2/data/service/VersionRepository.kt @@ -5,11 +5,8 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter -import android.net.Uri -import android.os.Build import android.os.Environment import androidx.core.content.ContextCompat -import androidx.core.content.FileProvider import androidx.core.net.toUri import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharedFlow @@ -44,7 +41,7 @@ class VersionRepository( fun download( context: Context, - onDownloadCompleted: (Uri) -> Unit, + onDownloadCompleted: (String) -> Unit, onDownloading: () -> Unit, ) { val url = @@ -60,9 +57,8 @@ class VersionRepository( )}/$fileName" val apkFile = File(destination) - val apkUri = uriFromFile(context, apkFile) if (apkFile.exists()) { - onDownloadCompleted(apkUri) + onDownloadCompleted(destination) } else if (fileName?.endsWith("apk") == true) { val request = DownloadManager @@ -86,7 +82,7 @@ class VersionRepository( ctxt: Context, intent: Intent?, ) { - onDownloadCompleted(apkUri) + onDownloadCompleted(destination) } } ContextCompat.registerReceiver( @@ -96,20 +92,10 @@ class VersionRepository( ContextCompat.RECEIVER_EXPORTED, ) } else { - url?.let { onDownloadCompleted(it.toUri()) } + url?.let { onDownloadCompleted(url) } } } - private fun uriFromFile( - context: Context, - file: File, - ): Uri = - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", file) - } else { - Uri.fromFile(file) - } - fun getUrl(): String? = d2 .settingModule() diff --git a/app/src/main/java/org/dhis2/data/service/workManager/WorkManagerController.kt b/app/src/main/java/org/dhis2/data/service/workManager/WorkManagerController.kt index 9723f3177bd..f583c04b714 100644 --- a/app/src/main/java/org/dhis2/data/service/workManager/WorkManagerController.kt +++ b/app/src/main/java/org/dhis2/data/service/workManager/WorkManagerController.kt @@ -34,16 +34,6 @@ import androidx.work.WorkInfo interface WorkManagerController { fun syncDataForWorker(workerItem: WorkerItem) - fun syncMetaDataForWorker( - metadataWorkerTag: String, - workName: String, - ) - - fun syncDataForWorker( - dataWorkerTag: String, - workName: String, - ) - fun beginUniqueWork(workerItem: WorkerItem) fun enqueuePeriodicWork(workerItem: WorkerItem) diff --git a/app/src/main/java/org/dhis2/data/service/workManager/WorkManagerControllerImpl.kt b/app/src/main/java/org/dhis2/data/service/workManager/WorkManagerControllerImpl.kt index 26158e84383..ceef5322de2 100644 --- a/app/src/main/java/org/dhis2/data/service/workManager/WorkManagerControllerImpl.kt +++ b/app/src/main/java/org/dhis2/data/service/workManager/WorkManagerControllerImpl.kt @@ -30,16 +30,13 @@ package org.dhis2.data.service.workManager import androidx.lifecycle.LiveData import androidx.lifecycle.MediatorLiveData -import androidx.work.ExistingWorkPolicy import androidx.work.OneTimeWorkRequest import androidx.work.PeriodicWorkRequest import androidx.work.WorkInfo import androidx.work.WorkManager import androidx.work.await import org.dhis2.data.service.CheckVersionWorker -import org.dhis2.data.service.SyncDataWorker import org.dhis2.data.service.SyncGranularWorker -import org.dhis2.data.service.SyncMetadataWorker import java.util.concurrent.TimeUnit class WorkManagerControllerImpl( @@ -55,32 +52,6 @@ class WorkManagerControllerImpl( } } - override fun syncMetaDataForWorker( - metadataWorkerTag: String, - workName: String, - ) { - val workerOneBuilder = OneTimeWorkRequest.Builder(SyncMetadataWorker::class.java) - workerOneBuilder - .addTag(metadataWorkerTag) - - workManager - .beginUniqueWork(workName, ExistingWorkPolicy.KEEP, workerOneBuilder.build()) - .enqueue() - } - - override fun syncDataForWorker( - dataWorkerTag: String, - workName: String, - ) { - val workerTwoBuilder = OneTimeWorkRequest.Builder(SyncDataWorker::class.java) - workerTwoBuilder - .addTag(dataWorkerTag) - - workManager - .beginUniqueWork(workName, ExistingWorkPolicy.KEEP, workerTwoBuilder.build()) - .enqueue() - } - override fun beginUniqueWork(workerItem: WorkerItem) { val request = createOneTimeBuilder(workerItem).build() workerItem.policy?.let { @@ -132,8 +103,6 @@ class WorkManagerControllerImpl( private fun createOneTimeBuilder(workerItem: WorkerItem): OneTimeWorkRequest.Builder { val syncBuilder = when (workerItem.workerType) { - WorkerType.METADATA -> OneTimeWorkRequest.Builder(SyncMetadataWorker::class.java) - WorkerType.DATA -> OneTimeWorkRequest.Builder(SyncDataWorker::class.java) WorkerType.GRANULAR -> OneTimeWorkRequest.Builder(SyncGranularWorker::class.java) WorkerType.NEW_VERSION -> OneTimeWorkRequest.Builder(CheckVersionWorker::class.java) } @@ -155,20 +124,6 @@ class WorkManagerControllerImpl( val syncBuilder = when (workerItem.workerType) { - WorkerType.METADATA -> { - PeriodicWorkRequest.Builder( - SyncMetadataWorker::class.java, - seconds, - TimeUnit.SECONDS, - ) - } - WorkerType.DATA -> { - PeriodicWorkRequest.Builder( - SyncDataWorker::class.java, - seconds, - TimeUnit.SECONDS, - ) - } WorkerType.GRANULAR -> { PeriodicWorkRequest.Builder( SyncGranularWorker::class.java, @@ -176,6 +131,7 @@ class WorkManagerControllerImpl( TimeUnit.SECONDS, ) } + WorkerType.NEW_VERSION -> PeriodicWorkRequest.Builder( CheckVersionWorker::class.java, diff --git a/app/src/main/java/org/dhis2/data/service/workManager/WorkerType.kt b/app/src/main/java/org/dhis2/data/service/workManager/WorkerType.kt index 6c77fc50fb5..050519a6e2c 100644 --- a/app/src/main/java/org/dhis2/data/service/workManager/WorkerType.kt +++ b/app/src/main/java/org/dhis2/data/service/workManager/WorkerType.kt @@ -29,8 +29,6 @@ package org.dhis2.data.service.workManager enum class WorkerType { - METADATA, - DATA, GRANULAR, NEW_VERSION, } diff --git a/app/src/main/java/org/dhis2/data/sorting/SearchSortingValueSetter.kt b/app/src/main/java/org/dhis2/data/sorting/SearchSortingValueSetter.kt index be850c0fb82..f56b1327de2 100644 --- a/app/src/main/java/org/dhis2/data/sorting/SearchSortingValueSetter.kt +++ b/app/src/main/java/org/dhis2/data/sorting/SearchSortingValueSetter.kt @@ -4,6 +4,7 @@ import org.dhis2.commons.filters.Filters import org.dhis2.commons.filters.sorting.SortingItem import org.dhis2.commons.filters.sorting.SortingStatus import org.dhis2.data.enrollment.EnrollmentUiDataHelper +import org.dhis2.mobile.commons.extensions.toJavaDate import org.dhis2.usescases.searchTrackEntity.SearchTeiModel import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.arch.repositories.scope.RepositoryScope @@ -52,7 +53,7 @@ class SearchSortingValueSetter( .eventModule() .events() .byEnrollmentUid() - .eq(teiModel.selectedEnrollment?.uid() ?: "") + .eq(teiModel.selectedEnrollment?.uid ?: "") .byDeleted() .isFalse .orderByTimeline( @@ -62,7 +63,7 @@ class SearchSortingValueSetter( RepositoryScope.OrderByDirection.DESC }, ).blockingGet() - if (sortedEvents != null && sortedEvents.isNotEmpty()) { + if (sortedEvents.isNotEmpty()) { val sortedEvent = sortedEvents.first() val sortedDate: Date? = if (sortedEvent.status() == EventStatus.SCHEDULE || @@ -85,7 +86,7 @@ class SearchSortingValueSetter( if (teiModel.selectedEnrollment != null) { enrollmentStatusValue = enrollmentUiDataHelper.getEnrollmentStatusClientName( - teiModel.selectedEnrollment.status()!!, + teiModel.selectedEnrollment.status, ) } return Pair(enrollmentStatusLabel, enrollmentStatusValue) @@ -97,12 +98,12 @@ class SearchSortingValueSetter( d2 .programModule() .programs() - .uid(it.program()) + .uid(it.program) .blockingGet() - ?.enrollmentDateLabel() ?: enrollmentDateDefaultLabel + ?.displayEnrollmentDateLabel() ?: enrollmentDateDefaultLabel val enrollmentDateValue = SimpleDateFormat(uiDateFormat, Locale.getDefault()) - .format(teiModel.selectedEnrollment.enrollmentDate()) + .format(teiModel.selectedEnrollment.enrollmentDate?.toJavaDate()) Pair(enrollmentDateLabel, enrollmentDateValue) } ?: Pair(enrollmentDateDefaultLabel, unknownLabel) } diff --git a/app/src/main/java/org/dhis2/data/user/UserComponent.java b/app/src/main/java/org/dhis2/data/user/UserComponent.java index eebf6102a13..c2f47d587c3 100644 --- a/app/src/main/java/org/dhis2/data/user/UserComponent.java +++ b/app/src/main/java/org/dhis2/data/user/UserComponent.java @@ -8,14 +8,8 @@ import org.dhis2.commons.featureconfig.di.FeatureConfigActivityComponent; import org.dhis2.commons.featureconfig.di.FeatureConfigActivityModule; import org.dhis2.commons.filters.data.FilterPresenter; -import org.dhis2.data.service.SyncDataWorkerComponent; -import org.dhis2.data.service.SyncDataWorkerModule; import org.dhis2.data.service.SyncGranularRxComponent; import org.dhis2.data.service.SyncGranularRxModule; -import org.dhis2.data.service.SyncInitWorkerComponent; -import org.dhis2.data.service.SyncInitWorkerModule; -import org.dhis2.data.service.SyncMetadataWorkerComponent; -import org.dhis2.data.service.SyncMetadataWorkerModule; import org.dhis2.usescases.about.AboutComponent; import org.dhis2.usescases.about.AboutModule; import org.dhis2.usescases.datasets.datasetDetail.DataSetDetailComponent; @@ -32,8 +26,6 @@ import org.dhis2.usescases.eventsWithoutRegistration.eventDetails.injection.EventDetailsModule; import org.dhis2.usescases.eventsWithoutRegistration.eventInitial.EventInitialComponent; import org.dhis2.usescases.eventsWithoutRegistration.eventInitial.EventInitialModule; -import org.dhis2.usescases.main.MainComponent; -import org.dhis2.usescases.main.MainModule; import org.dhis2.usescases.main.program.ProgramComponent; import org.dhis2.usescases.main.program.ProgramModule; import org.dhis2.usescases.notes.NotesComponent; @@ -70,8 +62,6 @@ import org.dhis2.usescases.teiDashboard.dialogs.scheduling.SchedulingModule; import org.dhis2.usescases.teiDashboard.teiProgramList.TeiProgramListComponent; import org.dhis2.usescases.teiDashboard.teiProgramList.TeiProgramListModule; -import org.dhis2.utils.session.PinModule; -import org.dhis2.utils.session.SessionComponent; import dagger.Subcomponent; import dhis2.org.analytics.charts.ui.di.AnalyticsFragmentComponent; @@ -83,10 +73,6 @@ public interface UserComponent { FilterPresenter filterPresenter(); - @NonNull - MainComponent plus(@NonNull MainModule mainModule); - - @NonNull ProgramEventDetailComponent plus(@NonNull ProgramEventDetailModule programEventDetailModule); @@ -133,12 +119,6 @@ public interface UserComponent { @NonNull ReservedValueComponent plus(ReservedValueModule reservedValueModule); - @NonNull - SyncDataWorkerComponent plus(SyncDataWorkerModule syncDataWorkerModule); - - @NonNull - SyncMetadataWorkerComponent plus(SyncMetadataWorkerModule syncDataWorkerModule); - @NonNull EventCaptureComponent plus(EventCaptureModule eventCaptureModule); @@ -151,9 +131,6 @@ public interface UserComponent { @NonNull SyncComponent plus(SyncModule syncModule); - @NonNull - SyncInitWorkerComponent plus(SyncInitWorkerModule syncInitWorkerModule); - @NonNull EnrollmentComponent plus(EnrollmentModule enrollmentModule); @@ -185,9 +162,6 @@ public interface UserComponent { @NonNull EventDetailsComponent plus(EventDetailsModule eventDetailsModule); - @NonNull - SessionComponent plus(PinModule pinModule); - @NonNull SchedulingComponent plus(SchedulingModule schedulingModule); } diff --git a/app/src/main/java/org/dhis2/di/KoinInitialization.kt b/app/src/main/java/org/dhis2/di/KoinInitialization.kt index 61bbf879f81..a523c08a618 100644 --- a/app/src/main/java/org/dhis2/di/KoinInitialization.kt +++ b/app/src/main/java/org/dhis2/di/KoinInitialization.kt @@ -1,19 +1,27 @@ package org.dhis2.di import android.app.Application +import dhis2.org.analytics.charts.di.chartsModule +import org.dhis2.BuildConfig import org.dhis2.android.rtsm.di.stockModule +import org.dhis2.appModule +import org.dhis2.commons.di.filterModule import org.dhis2.commons.di.resourceManagerModule import org.dhis2.commons.filters.periods.di.filterPeriodsModule import org.dhis2.data.biometric.biometricModule import org.dhis2.mobile.aggregates.di.aggregatesModule import org.dhis2.mobile.commons.di.commonsModule import org.dhis2.mobile.login.main.di.loginModule +import org.dhis2.mobile.sync.di.syncModule +import org.dhis2.tracker.search.di.trackerSearchModule import org.dhis2.usescases.datasets.di.dataSetModules +import org.dhis2.usescases.searchTrackEntity.di.searchTEKoinModule import org.dhis2.usescases.settingsprogram.di.settingsProgramModule import org.dhis2.utils.analytics.matomo.matomoModule import org.hisp.dhis.android.core.D2Configuration import org.koin.android.ext.koin.androidContext import org.koin.android.ext.koin.androidLogger +import org.koin.androidx.workmanager.koin.workManagerFactory import org.koin.core.context.startKoin object KoinInitialization { @@ -21,18 +29,40 @@ object KoinInitialization { startKoin { androidLogger() androidContext(this@invoke) + properties( + mapOf( + "sentryDsn" to BuildConfig.SENTRY_DSN, + "isTrainingFlavor" to (BuildConfig.FLAVOR == "dhis2Training"), + "openIdType" to BuildConfig.OPEN_ID_TYPE, + "openIdServer" to BuildConfig.OPEN_ID_SERVER, + "openIdClient" to BuildConfig.OPEN_ID_CLIENT, + "openIdRedirectUri" to BuildConfig.OPEN_ID_REDIRECT_URI, + "openIdDiscoveryUri" to BuildConfig.OPEN_ID_DISCOVERY_URI, + "openIdAuthorizationUrl" to BuildConfig.OPEN_ID_AUTHORIZATION_URL, + "openIdTokenUrl" to BuildConfig.OPEN_ID_TOKEN_URL, + "openIdButtonText" to BuildConfig.OPEN_ID_BUTTON_TEXT, + "openIdPrompt" to BuildConfig.OPEN_ID_PROMPT, + ), + ) + workManagerFactory() modules( + appModule, serverModule(d2Configuration), commonsModule, aggregatesModule, + filterModule, filterPeriodsModule, resourceManagerModule, dataSetModules, stockModule, loginModule, + trackerSearchModule, + searchTEKoinModule, settingsProgramModule, biometricModule, matomoModule, + syncModule, + chartsModule, ) } } diff --git a/app/src/main/java/org/dhis2/di/ServerModule.kt b/app/src/main/java/org/dhis2/di/ServerModule.kt index dd41ceb12e9..e7c4ea4805f 100644 --- a/app/src/main/java/org/dhis2/di/ServerModule.kt +++ b/app/src/main/java/org/dhis2/di/ServerModule.kt @@ -1,7 +1,9 @@ package org.dhis2.di +import org.dhis2.data.service.VersionRepository import org.hisp.dhis.android.core.D2Configuration import org.hisp.dhis.android.core.D2Manager +import org.koin.core.module.dsl.factoryOf import org.koin.dsl.module fun serverModule(d2Configuration: D2Configuration) = @@ -17,4 +19,5 @@ fun serverModule(d2Configuration: D2Configuration) = D2Manager.getD2() } } + factoryOf(::VersionRepository) } diff --git a/app/src/main/java/org/dhis2/simprints/SimprintsLoadBiometricSearchResultsUseCase.kt b/app/src/main/java/org/dhis2/simprints/SimprintsLoadBiometricSearchResultsUseCase.kt index c3ef20c4ecb..8ca900b26c6 100644 --- a/app/src/main/java/org/dhis2/simprints/SimprintsLoadBiometricSearchResultsUseCase.kt +++ b/app/src/main/java/org/dhis2/simprints/SimprintsLoadBiometricSearchResultsUseCase.kt @@ -6,43 +6,46 @@ import kotlinx.coroutines.flow.flowOf import org.dhis2.commons.filters.sorting.SortingItem import org.dhis2.commons.simprints.usecases.SimprintsOrderSearchResultsByIdentifyResponseUseCase import org.dhis2.commons.simprints.utils.SimprintsSearchUtils -import org.dhis2.data.search.SearchParametersModel import org.dhis2.form.model.FieldUiModel -import org.dhis2.usescases.searchTrackEntity.SearchRepository import org.dhis2.usescases.searchTrackEntity.SearchRepositoryKt import org.dhis2.usescases.searchTrackEntity.SearchTeiModel +import org.dhis2.tracker.search.domain.SearchTrackedEntities +import org.dhis2.tracker.search.model.SearchTrackedEntitiesInput class SimprintsLoadBiometricSearchResultsUseCase( - private val searchRepository: SearchRepository, private val searchRepositoryKt: SearchRepositoryKt, + private val searchTrackedEntities: SearchTrackedEntities, private val orderSearchResultsByIdentifyResponse: SimprintsOrderSearchResultsByIdentifyResponseUseCase, ) { suspend operator fun invoke( searchItems: List<FieldUiModel>, - searchParametersModel: SearchParametersModel, - isOnline: Boolean, - offlineOnly: Boolean, + searchInput: SearchTrackedEntitiesInput, sortingItem: SortingItem?, ): Flow<PagingData<SearchTeiModel>>? { val trackedEntities = orderSearchResultsByIdentifyResponse( searchFields = searchItems.toSearchFields(), - queryData = searchParametersModel.queryData.orEmpty(), + queryData = searchInput.queryDataList.toQueryData(), searchTrackedEntities = { - searchRepositoryKt.searchTrackedEntitiesImmediate( - searchParametersModel = searchParametersModel, - isOnline = isOnline, - ) + searchTrackedEntities + .invokeImmediate(searchInput) + .getOrThrow() + }, + getUid = { trackedEntity -> + trackedEntity.uid + }, + getAttributeValue = { trackedEntity, fieldUid -> + trackedEntity.attributeValues + .firstOrNull { it.attribute == fieldUid } + ?.value }, ) ?: return null return flowOf( PagingData.from( - trackedEntities.map { searchItem -> - searchRepository.transform( - searchItem, - searchParametersModel.selectedProgram, - offlineOnly, + trackedEntities.map { trackedEntity -> + searchRepositoryKt.mapTrackedEntitySearchItemResultToSearchTeiModel( + trackedEntity, sortingItem, ) }, @@ -58,4 +61,10 @@ class SimprintsLoadBiometricSearchResultsUseCase( customIntent = field.customIntent, ) } + + private fun List<org.dhis2.tracker.search.model.QueryData>?.toQueryData(): Map<String, List<String>?> = + this + ?.associate { queryData -> + queryData.attributeId to queryData.values + }.orEmpty() } diff --git a/app/src/main/java/org/dhis2/simprints/SimprintsLoadPossibleDuplicatesSearchResultsUseCase.kt b/app/src/main/java/org/dhis2/simprints/SimprintsLoadPossibleDuplicatesSearchResultsUseCase.kt index 21cb57382e6..3e89f4a8260 100644 --- a/app/src/main/java/org/dhis2/simprints/SimprintsLoadPossibleDuplicatesSearchResultsUseCase.kt +++ b/app/src/main/java/org/dhis2/simprints/SimprintsLoadPossibleDuplicatesSearchResultsUseCase.kt @@ -1,32 +1,33 @@ package org.dhis2.simprints import org.dhis2.commons.filters.sorting.SortingItem -import org.dhis2.data.search.SearchParametersModel -import org.dhis2.usescases.searchTrackEntity.SearchRepository import org.dhis2.usescases.searchTrackEntity.SearchRepositoryKt import org.dhis2.usescases.searchTrackEntity.SearchTeiModel +import org.dhis2.tracker.search.domain.SearchTrackedEntities +import org.dhis2.tracker.search.model.QueryData +import org.dhis2.tracker.search.model.SearchTrackedEntitiesInput class SimprintsLoadPossibleDuplicatesSearchResultsUseCase( - private val searchRepository: SearchRepository, private val searchRepositoryKt: SearchRepositoryKt, + private val searchTrackedEntities: SearchTrackedEntities, ) { suspend operator fun invoke( - searchParametersModel: SearchParametersModel, - isOnline: Boolean, - offlineOnly: Boolean, + queryDataList: List<QueryData>, + searchInput: SearchTrackedEntitiesInput, sortingItem: SortingItem?, ): List<SearchTeiModel>? { - val simprintsQueryData = searchParametersModel.queryData.orEmpty() + val simprintsQueryData = queryDataList.associateBy(QueryData::attributeId) val simprintsQueryEntry = - simprintsQueryData.entries.firstOrNull { (_, values) -> - (values?.size ?: 0) > 1 - } ?: simprintsQueryData.entries.firstOrNull { (_, values) -> - !values.isNullOrEmpty() + simprintsQueryData.entries.firstOrNull { (_, queryData) -> + (queryData.values?.size ?: 0) > 1 + } ?: simprintsQueryData.entries.firstOrNull { (_, queryData) -> + !queryData.values.isNullOrEmpty() } ?: return null val simprintsQueryValues = simprintsQueryEntry .value + .values .orEmpty() .filter(String::isNotBlank) .distinct() @@ -37,28 +38,28 @@ class SimprintsLoadPossibleDuplicatesSearchResultsUseCase( buildList { simprintsQueryValues.forEach { guidValue -> addAll( - searchRepositoryKt.searchTrackedEntitiesImmediate( - searchParametersModel = - searchParametersModel.copy( - queryData = - simprintsQueryData.toMutableMap().apply { - put(simprintsQueryEntry.key, listOf(guidValue)) + searchTrackedEntities + .invokeImmediate( + searchInput.copy( + queryDataList = + queryDataList.map { queryData -> + if (queryData.attributeId == simprintsQueryEntry.key) { + queryData.copy(values = listOf(guidValue)) + } else { + queryData + } }, ), - isOnline = isOnline, - ), + ).getOrThrow(), ) } - }.distinctBy { it.uid() } + }.distinctBy { it.uid } - return searchItems.map { searchItem -> - searchRepository.transform( - searchItem, - searchParametersModel.selectedProgram, - offlineOnly, + return searchItems.map { trackedEntity -> + searchRepositoryKt.mapTrackedEntitySearchItemResultToSearchTeiModel( + trackedEntity, sortingItem, ) } } } - diff --git a/app/src/main/java/org/dhis2/simprints/SimprintsResolveSingleBiometricSearchNavigationUseCase.kt b/app/src/main/java/org/dhis2/simprints/SimprintsResolveSingleBiometricSearchNavigationUseCase.kt index 841c29e797e..5aff95aa1ec 100644 --- a/app/src/main/java/org/dhis2/simprints/SimprintsResolveSingleBiometricSearchNavigationUseCase.kt +++ b/app/src/main/java/org/dhis2/simprints/SimprintsResolveSingleBiometricSearchNavigationUseCase.kt @@ -4,13 +4,16 @@ import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.withContext import org.dhis2.commons.filters.FilterManager import org.dhis2.commons.network.NetworkUtils -import org.dhis2.data.search.SearchParametersModel import org.dhis2.usescases.searchTrackEntity.SearchRepository import org.dhis2.usescases.searchTrackEntity.SearchRepositoryKt +import org.dhis2.tracker.search.domain.SearchTrackedEntities +import org.dhis2.tracker.search.model.QueryData +import org.dhis2.tracker.search.model.SearchTrackedEntitiesInput class SimprintsResolveSingleBiometricSearchNavigationUseCase( private val searchRepository: SearchRepository, private val searchRepositoryKt: SearchRepositoryKt, + private val searchTrackedEntities: SearchTrackedEntities, private val networkUtils: NetworkUtils, private val filterManager: FilterManager, private val ioDispatcher: CoroutineDispatcher, @@ -39,32 +42,40 @@ class SimprintsResolveSingleBiometricSearchNavigationUseCase( return@withContext null } - val searchParametersModel = - SearchParametersModel( - selectedProgram = searchRepository.getProgram(initialProgramUid), - queryData = queryData.toMutableMap(), - ) val isOnline = queryData.isNotEmpty() && networkUtils.isOnline() + val selectedProgram = searchRepository.getProgram(initialProgramUid) val trackedEntity = - searchRepositoryKt - .searchTrackedEntitiesImmediate( - searchParametersModel = searchParametersModel, - isOnline = isOnline, - ).singleOrNull() ?: return@withContext null + searchTrackedEntities + .invokeImmediate( + SearchTrackedEntitiesInput( + selectedProgram = selectedProgram?.uid(), + allowCache = false, + excludeValues = searchRepositoryKt.getExcludeValues(), + hasStateFilters = filterManager.stateFilters.isNotEmpty(), + isOnline = isOnline, + queryDataList = + queryData.map { (attributeId, values) -> + QueryData( + attributeId = attributeId, + values = values, + searchOperator = null, + ) + }, + ), + ).getOrThrow() + .singleOrNull() ?: return@withContext null val searchTeiModel = - searchRepository.transform( + searchRepositoryKt.mapTrackedEntitySearchItemResultToSearchTeiModel( trackedEntity, - searchParametersModel.selectedProgram, - !(isOnline && filterManager.stateFilters.isEmpty()), filterManager.sortingItem, ) NavigationTarget( - teiUid = searchTeiModel.uid(), - programUid = searchTeiModel.selectedEnrollment?.program() ?: initialProgramUid, - enrollmentUid = searchTeiModel.selectedEnrollment?.uid(), - isOnline = searchTeiModel.isOnline, + teiUid = searchTeiModel.tei.uid, + programUid = searchTeiModel.selectedEnrollment?.program ?: initialProgramUid, + enrollmentUid = searchTeiModel.selectedEnrollment?.uid, + isOnline = searchTeiModel.tei.isOnline, ) } } diff --git a/app/src/main/java/org/dhis2/simprints/ramp/ui/EventHistoryTableScreen.kt b/app/src/main/java/org/dhis2/simprints/ramp/ui/EventHistoryTableScreen.kt index e4058c417ea..abe8a8bb2c4 100644 --- a/app/src/main/java/org/dhis2/simprints/ramp/ui/EventHistoryTableScreen.kt +++ b/app/src/main/java/org/dhis2/simprints/ramp/ui/EventHistoryTableScreen.kt @@ -62,7 +62,7 @@ fun EventHistoryTableScreen( is EventHistoryTableUiState.Error -> EventHistoryTableMessage( modifier = modifier, - message = state.message ?: stringResource(R.string.error_unexpected_error), + message = state.message ?: stringResource(R.string.something_wrong), ) is EventHistoryTableUiState.Success -> diff --git a/app/src/main/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailActivity.java b/app/src/main/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailActivity.java index 5bc7f3c3c27..054df4253f6 100644 --- a/app/src/main/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailActivity.java +++ b/app/src/main/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailActivity.java @@ -105,14 +105,12 @@ private void configureBottomNavigation() { binding.navigationBar.setOnItemSelectedListener(item -> { Fragment newFragment = null; - switch (item.getItemId()) { - case R.id.navigation_list_view: - newFragment = DataSetListFragment.newInstance(dataSetUid, accessWriteData); - break; - case R.id.navigation_analytics: - presenter.trackDataSetAnalytics(); - newFragment = GroupAnalyticsFragment.Companion.forDataSet(dataSetUid); - break; + int itemId = item.getItemId(); + if (itemId == R.id.navigation_list_view) { + newFragment = DataSetListFragment.newInstance(dataSetUid, accessWriteData); + } else if (itemId == R.id.navigation_analytics) { + presenter.trackDataSetAnalytics(); + newFragment = GroupAnalyticsFragment.Companion.forDataSet(dataSetUid); } FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); if (fragment == null ||(newFragment != null && !fragment.getClass().toString().equals(newFragment.getClass().toString()))) { diff --git a/app/src/main/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailRepositoryImpl.java b/app/src/main/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailRepositoryImpl.java index cbb88bb39bc..e91e260d705 100644 --- a/app/src/main/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailRepositoryImpl.java +++ b/app/src/main/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailRepositoryImpl.java @@ -1,5 +1,6 @@ package org.dhis2.usescases.datasets.datasetDetail; +import static org.dhis2.data.dhislogic.AuthoritiesKt.AUTH_ALL; import static org.dhis2.data.dhislogic.AuthoritiesKt.AUTH_DATAVALUE_ADD; import org.dhis2.commons.resources.DhisPeriodUtils; @@ -147,7 +148,11 @@ public Flowable<Boolean> canWriteAny() { } private boolean hasDataValueAuthority() { - return !d2.userModule().authorities().byName().eq(AUTH_DATAVALUE_ADD).blockingIsEmpty(); + return !d2.userModule() + .authorities() + .byName() + .in(AUTH_DATAVALUE_ADD, AUTH_ALL) + .blockingIsEmpty(); } @Override diff --git a/app/src/main/java/org/dhis2/usescases/development/ConflictGenerator.kt b/app/src/main/java/org/dhis2/usescases/development/ConflictGenerator.kt index 601483fe600..99c7dced63c 100644 --- a/app/src/main/java/org/dhis2/usescases/development/ConflictGenerator.kt +++ b/app/src/main/java/org/dhis2/usescases/development/ConflictGenerator.kt @@ -1,3 +1,5 @@ +@file:OptIn(LegacyDataValueApi::class) + package org.dhis2.usescases.development import kotlinx.coroutines.runBlocking @@ -8,6 +10,7 @@ import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.datavalue.DataValue import org.hisp.dhis.android.core.datavalue.DataValueConflict +import org.hisp.dhis.android.core.datavalue.LegacyDataValueApi import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.event.Event import org.hisp.dhis.android.core.imports.ImportStatus @@ -125,24 +128,37 @@ class ConflictGenerator( dataValueConflict.categoryOptionCombo() != null && dataValueConflict.attributeOptionCombo() != null ) { - val dataValue = - d2 - .dataValueModule() - .dataValues() - .value( - dataValueConflict.period()!!, - dataValueConflict.orgUnit()!!, - dataValueConflict.dataElement()!!, - dataValueConflict.categoryOptionCombo()!!, - dataValueConflict.attributeOptionCombo()!!, - ).blockingGet() - val dv = - dataValue?.toBuilder()?.syncState(State.SYNCED)?.build() - dv?.let { - runBlocking { - d2.databaseAdapter().upsertObject(it, DataValue::class) + d2 + .dataSetModule() + .dataSetCompleteRegistrations() + .byPeriod() + .eq(dataValueConflict.period()!!) + .byOrganisationUnitUid() + .eq(dataValueConflict.orgUnit()!!) + .byAttributeOptionComboUid() + .eq(dataValueConflict.attributeOptionCombo()!!) + .blockingGet() + .forEach { + val dataValue = + d2 + .dataValueModule() + .dataValues() + .value( + dataValueConflict.period()!!, + dataValueConflict.orgUnit()!!, + dataValueConflict.dataElement()!!, + dataValueConflict.categoryOptionCombo()!!, + dataValueConflict.attributeOptionCombo()!!, + it.dataSet(), + ).blockingGet() + val dv = + dataValue?.toBuilder()?.syncState(State.SYNCED)?.build() + dv?.let { + runBlocking { + d2.databaseAdapter().upsertObject(it, DataValue::class) + } + } } - } } }.also { runBlocking { @@ -423,7 +439,9 @@ class ConflictGenerator( try { runBlocking { d2.databaseAdapter().upsertObject(conflict, TrackerImportConflict::class) - d2.databaseAdapter().execSQL(updateEvent(event.uid(), importStatus.toSyncState().name)) + d2 + .databaseAdapter() + .execSQL(updateEvent(event.uid(), importStatus.toSyncState().name)) } } catch (e: Exception) { Timber.e(e) @@ -529,7 +547,7 @@ class ConflictGenerator( syncState: String, ): String = "UPDATE Enrollment SET syncState = '$syncState'," + - " aggregatedSyncState = '$syncState' where uid = '$enrollmentUid'" + " aggregatedSyncState = '$syncState' where uid = '$enrollmentUid'" private fun updateTei( teiUid: String, diff --git a/app/src/main/java/org/dhis2/usescases/enrollment/EnrollmentModule.kt b/app/src/main/java/org/dhis2/usescases/enrollment/EnrollmentModule.kt index ee2beaba097..89b87399ec2 100644 --- a/app/src/main/java/org/dhis2/usescases/enrollment/EnrollmentModule.kt +++ b/app/src/main/java/org/dhis2/usescases/enrollment/EnrollmentModule.kt @@ -9,7 +9,6 @@ import io.reactivex.processors.PublishProcessor import org.dhis2.commons.data.EntryMode import org.dhis2.commons.di.dagger.PerActivity import org.dhis2.commons.matomo.MatomoAnalyticsController -import org.dhis2.commons.network.NetworkUtils import org.dhis2.commons.prefs.PreferenceProvider import org.dhis2.commons.resources.DhisPeriodUtils import org.dhis2.commons.resources.EventResourcesProvider @@ -43,7 +42,7 @@ import org.dhis2.form.ui.provider.LegendValueProviderImpl import org.dhis2.form.ui.provider.UiEventTypesProviderImpl import org.dhis2.mobile.commons.customintents.CustomIntentRepository import org.dhis2.mobile.commons.customintents.CustomIntentRepositoryImpl -import org.dhis2.mobile.commons.providers.FieldErrorMessageProvider +import org.dhis2.mobile.commons.network.NetworkStatusProvider import org.dhis2.mobile.commons.reporting.CrashReportController import org.dhis2.simprints.SimprintsCustomIntentResultMapper import org.dhis2.simprints.SimprintsEnrollmentViewModel @@ -240,23 +239,22 @@ class EnrollmentModule( d2: D2, enrollmentRepository: EnrollmentObjectRepository, crashReportController: CrashReportController, - networkUtils: NetworkUtils, searchTEIRepository: SearchTEIRepository, resourceManager: ResourceManager, - ): ValueStore { - val fieldErrorMessageProvider = FieldErrorMessageProvider() - return ValueStoreImpl( + networkStatusProvider: NetworkStatusProvider, + dispatcherProvider: DispatcherProvider, + ): ValueStore = + ValueStoreImpl( d2, enrollmentRepository.blockingGet()?.trackedEntityInstance()!!, EntryMode.ATTR, DhisEnrollmentUtils(d2), crashReportController, - networkUtils, searchTEIRepository, - fieldErrorMessageProvider, resourceManager, + networkStatusProvider, + dispatcherProvider, ) - } @Provides @PerActivity diff --git a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureActivity.kt b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureActivity.kt index f524d26accd..e9ff9e2c32f 100644 --- a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureActivity.kt +++ b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureActivity.kt @@ -648,8 +648,20 @@ class EventCaptureActivity : .onDismissListener( object : OnDismissListener { override fun onDismiss(hasChanged: Boolean) { - if (hasChanged && syncType == TEI_SYNC) { - dashboardViewModel?.updateDashboard() + if (hasChanged) { + when (syncType) { + TEI_SYNC -> { + dashboardViewModel?.updateDashboard() + } + + EVENT_SYNC -> { + if (isLandscape()) { + eventUid?.let { uid -> setUpEventCaptureFormLandscape(uid) } + } else { + adapter?.refreshDataEntry() + } + } + } } } }, diff --git a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureContract.kt b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureContract.kt index f7bd7885c37..fe43348c8f1 100644 --- a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureContract.kt +++ b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureContract.kt @@ -112,9 +112,9 @@ class EventCaptureContract { fun deleteEvent(): Observable<Boolean> - fun updateEventStatus(skipped: EventStatus): Observable<Boolean> + fun updateEventStatus(status: EventStatus): Observable<Boolean> - fun rescheduleEvent(time: Date): Observable<Boolean> + fun rescheduleEvent(newDate: Date): Observable<Boolean> fun programStage(): Observable<String> diff --git a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureModule.kt b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureModule.kt index a44fc8f2d3a..447f9ea5628 100644 --- a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureModule.kt +++ b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureModule.kt @@ -65,8 +65,8 @@ class EventCaptureModule( @PerActivity fun provideRepository(d2: D2): EventCaptureRepository = EventCaptureRepositoryImpl( - eventUid, d2, + eventUid, RampDatastoreRepository(d2), ) diff --git a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCapturePagerAdapter.kt b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCapturePagerAdapter.kt index 1835278e991..699323c1e91 100644 --- a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCapturePagerAdapter.kt +++ b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCapturePagerAdapter.kt @@ -28,6 +28,7 @@ class EventCapturePagerAdapter( ) : FragmentStateAdapter(fragmentActivity) { private val landscapePages: MutableList<EventPageType> = ArrayList() private val portraitPages: MutableList<EventPageType> = ArrayList() + private val itemIds: MutableList<Long> = ArrayList() fun isFormScreenShown(currentItem: Int?): Boolean = currentItem != null && @@ -70,6 +71,12 @@ class EventCapturePagerAdapter( portraitPages.add(EventPageType.SIMPRINTS_RAMP_HISTORY_TABLE) landscapePages.add(EventPageType.SIMPRINTS_RAMP_HISTORY_TABLE) } + + if (isPortrait) { + portraitPages.forEach { itemIds.add(it.ordinal * 1000L) } + } else { + landscapePages.forEach { itemIds.add(it.ordinal * 1000L) } + } } override fun createFragment(position: Int): Fragment = @@ -174,4 +181,14 @@ class EventCapturePagerAdapter( companion object { const val NO_POSITION: Int = -1 } + + fun refreshDataEntry() { + val index = portraitPages.indexOf(EventPageType.DATA_ENTRY) + itemIds[index] = itemIds[index] + 1 + notifyItemChanged(index) + } + + override fun getItemId(position: Int): Long { + return itemIds[position] + } } diff --git a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImpl.kt b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImpl.kt index b8f96853cff..542640812ad 100644 --- a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImpl.kt +++ b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImpl.kt @@ -1,273 +1,216 @@ -package org.dhis2.usescases.eventsWithoutRegistration.eventCapture; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import org.dhis2.commons.bindings.SdkExtensionsKt; -import org.dhis2.commons.simprints.ramp.model.ProgramStageHistoryTableConfig; -import org.dhis2.commons.simprints.ramp.repository.RampDatastoreRepository; -import org.dhis2.data.dhislogic.AuthoritiesKt; -import org.hisp.dhis.android.core.D2; -import org.hisp.dhis.android.core.common.BaseIdentifiableObject; -import org.hisp.dhis.android.core.common.ValidationStrategy; -import org.hisp.dhis.android.core.enrollment.Enrollment; -import org.hisp.dhis.android.core.enrollment.EnrollmentStatus; -import org.hisp.dhis.android.core.event.Event; -import org.hisp.dhis.android.core.event.EventEditableStatus; -import org.hisp.dhis.android.core.event.EventNonEditableReason; -import org.hisp.dhis.android.core.event.EventStatus; -import org.hisp.dhis.android.core.organisationunit.OrganisationUnit; -import org.hisp.dhis.android.core.program.ProgramRule; -import org.hisp.dhis.android.core.program.ProgramRuleAction; -import org.hisp.dhis.android.core.program.ProgramRuleActionType; -import org.hisp.dhis.android.core.settings.ProgramConfigurationSetting; - -import java.util.Date; -import java.util.List; -import java.util.Objects; - -import io.reactivex.Flowable; -import io.reactivex.Observable; -import io.reactivex.Single; - -public class EventCaptureRepositoryImpl implements EventCaptureContract.EventCaptureRepository { - - private final String eventUid; - private final D2 d2; - private final RampDatastoreRepository rampDatastoreRepository; - - public EventCaptureRepositoryImpl(String eventUid, D2 d2, RampDatastoreRepository rampDatastoreRepository) { - this.eventUid = eventUid; - this.d2 = d2; - this.rampDatastoreRepository = rampDatastoreRepository; - } - - private Event getCurrentEvent() { - return d2.eventModule().events().uid(eventUid).blockingGet(); - } - - @Override - public boolean isEnrollmentOpen() { - Event currentEvent = getCurrentEvent(); - return currentEvent.enrollment() == null || d2.enrollmentModule().enrollmentService().blockingIsOpen(currentEvent.enrollment()); - } +package org.dhis2.usescases.eventsWithoutRegistration.eventCapture + +import io.reactivex.Flowable +import io.reactivex.Observable +import io.reactivex.Single +import org.dhis2.commons.bindings.programStage +import org.dhis2.commons.simprints.ramp.repository.RampDatastoreRepository +import org.dhis2.data.dhislogic.AUTH_ALL +import org.dhis2.data.dhislogic.AUTH_UNCOMPLETE_EVENT +import org.dhis2.usescases.eventsWithoutRegistration.eventCapture.EventCaptureContract.EventCaptureRepository +import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.common.ValidationStrategy +import org.hisp.dhis.android.core.enrollment.EnrollmentStatus +import org.hisp.dhis.android.core.event.EventEditableStatus +import org.hisp.dhis.android.core.event.EventNonEditableReason +import org.hisp.dhis.android.core.event.EventStatus +import org.hisp.dhis.android.core.organisationunit.OrganisationUnit +import org.hisp.dhis.android.core.program.ProgramRuleActionType +import java.util.Date +import java.util.Objects +import java.util.concurrent.Callable + +class EventCaptureRepositoryImpl( + private val d2: D2, + private val eventUid: String, + private val rampDatastoreRepository: RampDatastoreRepository, +) : EventCaptureRepository { + private val currentEvent by lazy { + requireNotNull( + d2.eventModule().events().uid(eventUid).blockingGet(), + ) + } + + override val isEnrollmentOpen: Boolean + get() { + val currentEvent = this.currentEvent + return currentEvent.enrollment() == null || d2.enrollmentModule().enrollmentService() + .blockingIsOpen(currentEvent.enrollment()!!) + } - @Override - public boolean isEnrollmentCancelled() { - Enrollment enrollment = d2.enrollmentModule().enrollments().uid(getCurrentEvent().enrollment()).blockingGet(); - if (enrollment == null) - return false; - else - return enrollment.status() == EnrollmentStatus.CANCELLED; - } + override val isEnrollmentCancelled: Boolean + get() { + val enrollment = + d2.enrollmentModule().enrollments().uid(this.currentEvent.enrollment()) + .blockingGet() + return if (enrollment == null) { + false + } else { + enrollment.status() == EnrollmentStatus.CANCELLED + } + } - @Override - public boolean isEventEditable(@NonNull String eventUid) { - return d2.eventModule().eventService().blockingIsEditable(eventUid); + override fun isEventEditable(eventUid: String): Boolean { + return d2.eventModule().eventService().blockingIsEditable(eventUid) } - @NonNull - @Override - public Flowable<String> programStageName() { - return d2.programModule().programStages().uid(getCurrentEvent().programStage()).get() - .map(BaseIdentifiableObject::displayName) - .toFlowable(); + override fun programStageName(): Flowable<String> { + return d2.programModule().programStages().uid(this.currentEvent.programStage()).get() + .map { programStage -> programStage.displayName() ?: programStage.uid() } + .toFlowable() } - @NonNull - @Override - public Flowable<OrganisationUnit> orgUnit() { + override fun orgUnit(): Flowable<OrganisationUnit> { return Flowable.just( - Objects.requireNonNull( - d2.organisationUnitModule() - .organisationUnits() - .uid(getCurrentEvent().organisationUnit()) - .blockingGet() - ) - ); + Objects.requireNonNull<OrganisationUnit>( + d2.organisationUnitModule() + .organisationUnits() + .uid(this.currentEvent.organisationUnit()) + .blockingGet() + ) + ) } - @NonNull - @Override - public Observable<Boolean> deleteEvent() { + override fun deleteEvent(): Observable<Boolean> { return d2.eventModule().events().uid(eventUid).delete() - .andThen(Observable.just(true)); + .andThen(Observable.just(true)) } - @NonNull - @Override - public Observable<Boolean> updateEventStatus(@NonNull EventStatus status) { - - return Observable.fromCallable(() -> { + override fun updateEventStatus(status: EventStatus): Observable<Boolean> { + return Observable.fromCallable(Callable { d2.eventModule().events().uid(eventUid) - .setStatus(status); - return true; - }); + .setStatus(status) + true + }) } - @NonNull - @Override - public Observable<Boolean> rescheduleEvent(@NonNull Date newDate) { - return Observable.fromCallable(() -> { + override fun rescheduleEvent(newDate: Date): Observable<Boolean> { + return Observable.fromCallable(Callable { d2.eventModule().events().uid(eventUid) - .setDueDate(newDate); + .setDueDate(newDate) d2.eventModule().events().uid(eventUid) - .setStatus(EventStatus.SCHEDULE); - return true; - }); + .setStatus(EventStatus.SCHEDULE) + true + }) } - @NonNull - @Override - public Observable<String> programStage() { - return Observable.just(Objects.requireNonNull(getCurrentEvent().programStage())); + override fun programStage(): Observable<String> { + return Observable.just( + Objects.requireNonNull<String?>( + this.currentEvent.programStage() + ) + ) } - @Override - public boolean getAccessDataWrite() { - return d2.eventModule().eventService().blockingIsEditable(eventUid); - } + override val accessDataWrite: Boolean + get() = d2.eventModule().eventService().blockingIsEditable(eventUid) - @NonNull - @Override - public Flowable<EventStatus> eventStatus() { - return Flowable.just(Objects.requireNonNull(getCurrentEvent().status())); + override fun eventStatus(): Flowable<EventStatus> { + return Flowable.just(Objects.requireNonNull<EventStatus>(this.currentEvent.status())) } - @NonNull - @Override - public Single<Boolean> canReOpenEvent() { - return Single.fromCallable(() -> d2.userModule().authorities() - .byName().in(AuthoritiesKt.AUTH_UNCOMPLETE_EVENT, AuthoritiesKt.AUTH_ALL).one().blockingExists() - ); + override fun canReOpenEvent(): Single<Boolean> { + return Single.fromCallable(Callable { + d2.userModule().authorities() + .byName().`in`(AUTH_UNCOMPLETE_EVENT, AUTH_ALL).one().blockingExists() + } + ) } - @NonNull - @Override - public Observable<Boolean> isCompletedEventExpired(@NonNull String eventUid) { - return d2.eventModule().eventService().getEditableStatus(eventUid).map(editionStatus -> { - if (editionStatus instanceof EventEditableStatus.NonEditable nonEditableStatus) { - return nonEditableStatus.getReason() == EventNonEditableReason.EXPIRED; - } else { - return false; - } - }).toObservable(); + override fun isCompletedEventExpired(eventUid: String): Observable<Boolean> { + return d2.eventModule().eventService().getEditableStatus(eventUid) + .map { editionStatus -> + if (editionStatus is EventEditableStatus.NonEditable) { + editionStatus.reason == EventNonEditableReason.EXPIRED + } else { + false + } + }.toObservable() } - @NonNull - @Override - public Flowable<Boolean> eventIntegrityCheck() { - Event currentEvent = getCurrentEvent(); - return Flowable.just(currentEvent).map(event -> - (event.status() == EventStatus.COMPLETED || - event.status() == EventStatus.ACTIVE || - event.status() == EventStatus.SKIPPED) && - (event.eventDate() == null || !event.eventDate().after(new Date())) - ); + override fun eventIntegrityCheck(): Flowable<Boolean> { + val currentEvent = this.currentEvent + return Flowable.just(currentEvent).map { event -> + (event.status() == EventStatus.COMPLETED || event.status() == EventStatus.ACTIVE || event.status() == EventStatus.SKIPPED) && + (event.eventDate() == null || !event.eventDate()!!.after(Date())) + } } - @NonNull - @Override - public Single<Integer> getNoteCount() { - return d2.noteModule().notes().byEventUid().eq(eventUid).count(); - } + override val noteCount: Single<Int> + get() = d2.noteModule().notes().byEventUid().eq(eventUid).count() - @Override - public boolean showCompletionPercentage() { - if (getCurrentEvent() != null && d2.settingModule().appearanceSettings().blockingExists()) { - ProgramConfigurationSetting programConfigurationSetting = d2.settingModule() - .appearanceSettings() - .getProgramConfigurationByUid(getCurrentEvent().program()); + override fun showCompletionPercentage(): Boolean { + if (d2.settingModule().appearanceSettings().blockingExists()) { + val programConfigurationSetting = d2.settingModule() + .appearanceSettings() + .getProgramConfigurationByUid(this.currentEvent.program()) if (programConfigurationSetting != null && - programConfigurationSetting.completionSpinner() != null) { - return programConfigurationSetting.completionSpinner(); + programConfigurationSetting.completionSpinner() != null + ) { + return programConfigurationSetting.completionSpinner()!! } } - return true; - } - - @Override - public boolean hasAnalytics() { - Event currentEvent = getCurrentEvent(); - boolean hasProgramIndicators = !d2.programModule().programIndicators().byProgramUid().eq(currentEvent.program()).blockingIsEmpty(); - List<ProgramRule> programRules = d2.programModule().programRules().withProgramRuleActions() - .byProgramUid().eq(currentEvent.program()).blockingGet(); - boolean hasProgramRules = false; - for (ProgramRule rule : programRules) { - for (ProgramRuleAction action : Objects.requireNonNull(rule.programRuleActions())) { + return true + } + + override fun hasAnalytics(): Boolean { + val currentEvent = this.currentEvent + val hasProgramIndicators = + !d2.programModule().programIndicators().byProgramUid().eq(currentEvent.program()) + .blockingIsEmpty() + val programRules = + d2.programModule().programRules().withProgramRuleActions() + .byProgramUid().eq(currentEvent.program()).blockingGet() + var hasProgramRules = false + for (rule in programRules) { + for (action in Objects.requireNonNull(rule.programRuleActions())) { if (action.programRuleActionType() == ProgramRuleActionType.DISPLAYKEYVALUEPAIR || - action.programRuleActionType() == ProgramRuleActionType.DISPLAYTEXT) { - hasProgramRules = true; + action.programRuleActionType() == ProgramRuleActionType.DISPLAYTEXT + ) { + hasProgramRules = true } } } - return hasProgramIndicators || hasProgramRules; + return hasProgramIndicators || hasProgramRules } - @Override - public boolean hasRelationships() { + override fun hasRelationships(): Boolean { return !d2.relationshipModule().relationshipTypes() - .byAvailableForEvent(eventUid) - .blockingIsEmpty(); + .byAvailableForEvent(eventUid) + .blockingIsEmpty() } - @Override - public boolean hasSimprintsRampProgramStageHistoryTable() { - Event currentEvent = getCurrentEvent(); - if (currentEvent == null) { - return false; - } - - String programUid = trimToValue(currentEvent.program()); - String programStageUid = trimToValue(currentEvent.programStage()); - if (programUid == null || programStageUid == null) { - return false; - } + override fun hasSimprintsRampProgramStageHistoryTable(): Boolean { + val event = d2.eventModule().events().uid(eventUid).blockingGet() ?: return false + val programUid = event.program().trimToValue() ?: return false + val programStageUid = event.programStage().trimToValue() ?: return false - boolean hasProgramStageHistoryTable = false; - for (ProgramStageHistoryTableConfig config : rampDatastoreRepository.getConfig().getProgramStageHistoryTables()) { - if (Objects.equals(trimToValue(config.getProgramId()), programUid) && - Objects.equals(trimToValue(config.getFollowUpVisitProgramStageId()), programStageUid)) { - hasProgramStageHistoryTable = true; - break; + return rampDatastoreRepository + .getConfig() + .programStageHistoryTables + .any { config -> + config.programId.trimToValue() == programUid && + config.followUpVisitProgramStageId.trimToValue() == programStageUid } - } - return hasProgramStageHistoryTable; } - @NonNull - @Override - public ValidationStrategy validationStrategy() { - ValidationStrategy validationStrategy = - SdkExtensionsKt.programStage(d2, programStage().blockingFirst()) - .validationStrategy(); + override fun validationStrategy(): ValidationStrategy { + val validationStrategy = + d2.programStage(programStage().blockingFirst()!!)!! + .validationStrategy() - return validationStrategy != null ? validationStrategy : ValidationStrategy.ON_COMPLETE; + return validationStrategy ?: ValidationStrategy.ON_COMPLETE } - @Override - @Nullable - public String getEnrollmentUid() { - Event currentEvent = getCurrentEvent(); - if (currentEvent == null) { - return null; - }else{ - return currentEvent.enrollment(); - } + override fun getEnrollmentUid(): String? { + return currentEvent.enrollment() } - @Override - @Nullable - public String getTeiUid() { - Enrollment enrollment = d2.enrollmentModule().enrollments().uid(getEnrollmentUid()).blockingGet(); - return enrollment != null ? enrollment.trackedEntityInstance() : null; + override fun getTeiUid(): String? { + val enrollment = d2.enrollmentModule().enrollments().uid(getEnrollmentUid()).blockingGet() + return enrollment?.trackedEntityInstance() } - private static String trimToValue(String value) { - if (value == null || value.trim().isEmpty()) { - return null; - } - return value.trim(); - } + private fun String?.trimToValue(): String? = this?.trim()?.takeIf { it.isNotEmpty() } } diff --git a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/eventCaptureFragment/EventCaptureFormPresenter.kt b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/eventCaptureFragment/EventCaptureFormPresenter.kt index 86ca05bc1c7..4bf38c2a121 100644 --- a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/eventCaptureFragment/EventCaptureFormPresenter.kt +++ b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/eventCaptureFragment/EventCaptureFormPresenter.kt @@ -72,8 +72,8 @@ class EventCaptureFormPresenter( 1, ) to false - EventNonEditableReason.ORGUNIT_IS_NOT_IN_CAPTURE_SCOPE -> - resourceManager.getString(R.string.edition_orgunit_capture_scope) to + EventNonEditableReason.ORGUNIT_IS_NOT_IN_USER_SCOPE -> + resourceManager.getString(R.string.edition_orgunit_user_scope) to false } view.showNonEditableMessage(reason, canBeReOpened) diff --git a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventDetails/providers/EventDetailResourcesProvider.kt b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventDetails/providers/EventDetailResourcesProvider.kt index 5057dbcf06d..5fe7fc1a62f 100644 --- a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventDetails/providers/EventDetailResourcesProvider.kt +++ b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventDetails/providers/EventDetailResourcesProvider.kt @@ -46,8 +46,8 @@ class EventDetailResourcesProvider( R.string.edition_enrollment_is_no_open_V2, 1, ) - EventNonEditableReason.ORGUNIT_IS_NOT_IN_CAPTURE_SCOPE -> - resourceManager.getString(R.string.edition_orgunit_capture_scope) + EventNonEditableReason.ORGUNIT_IS_NOT_IN_USER_SCOPE -> + resourceManager.getString(R.string.edition_orgunit_user_scope) } fun provideButtonUpdate() = resourceManager.getString(R.string.update) diff --git a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialRepositoryImpl.kt b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialRepositoryImpl.kt index 1672ed3d2a0..180a1523caf 100644 --- a/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialRepositoryImpl.kt +++ b/app/src/main/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialRepositoryImpl.kt @@ -315,6 +315,7 @@ class EventInitialRepositoryImpl internal constructor( .programStageSections() .byProgramStageUid() .eq(stage!!.uid()) + .orderBySortOrder(RepositoryScope.OrderByDirection.ASC) .blockingGet() stageSections @@ -369,6 +370,7 @@ class EventInitialRepositoryImpl internal constructor( .withDataElements() .byProgramStageUid() .eq(event.programStage()) + .orderBySortOrder(RepositoryScope.OrderByDirection.ASC) .blockingGet() val stageDataElements = d2 diff --git a/app/src/main/java/org/dhis2/usescases/general/ActivityGlobalAbstract.java b/app/src/main/java/org/dhis2/usescases/general/ActivityGlobalAbstract.java index cbb05962c84..d78c791a753 100644 --- a/app/src/main/java/org/dhis2/usescases/general/ActivityGlobalAbstract.java +++ b/app/src/main/java/org/dhis2/usescases/general/ActivityGlobalAbstract.java @@ -74,7 +74,7 @@ public void showMoreOptions(View view) { return Unit.INSTANCE; }) .onMenuItemClicked(item -> { - analyticsHelper.setEvent(SHOW_HELP, CLICK, SHOW_HELP); + getAnalyticsHelper().setEvent(SHOW_HELP, CLICK, SHOW_HELP); showTutorial(false); return false; }) @@ -191,6 +191,6 @@ public void showSyncDialog(SyncStatusDialog dialog) { @Override public AnalyticsHelper analyticsHelper() { - return analyticsHelper; + return getAnalyticsHelper(); } } diff --git a/app/src/main/java/org/dhis2/usescases/general/SessionManagerActivity.kt b/app/src/main/java/org/dhis2/usescases/general/SessionManagerActivity.kt index 9ccd6cd9450..92282fdaa75 100644 --- a/app/src/main/java/org/dhis2/usescases/general/SessionManagerActivity.kt +++ b/app/src/main/java/org/dhis2/usescases/general/SessionManagerActivity.kt @@ -7,10 +7,10 @@ import android.view.WindowManager import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityOptionsCompat import androidx.lifecycle.lifecycleScope -import io.reactivex.Observable import io.reactivex.subjects.BehaviorSubject -import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import org.dhis2.App +import org.dhis2.BuildConfig import org.dhis2.R import org.dhis2.bindings.app import org.dhis2.commons.ActivityResultObservable @@ -18,10 +18,11 @@ import org.dhis2.commons.ActivityResultObserver import org.dhis2.commons.locationprovider.LocationProvider import org.dhis2.commons.service.SessionManagerServiceImpl import org.dhis2.commons.ui.extensions.handleInsets -import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.server.OpenIdSession.LogOutReason -import org.dhis2.data.service.SyncStatusController import org.dhis2.data.service.workManager.WorkManagerController +import org.dhis2.mobile.login.pin.addPinBottomSheet +import org.dhis2.mobile.login.pin.domain.model.PinMode +import org.dhis2.mobile.sync.domain.SyncStatusController import org.dhis2.usescases.login.LoginActivity import org.dhis2.usescases.login.LoginActivity.Companion.bundle import org.dhis2.usescases.main.MainActivity @@ -30,8 +31,7 @@ import org.dhis2.usescases.splash.SplashActivity import org.dhis2.utils.analytics.AnalyticsHelper import org.dhis2.utils.analytics.CLICK import org.dhis2.utils.analytics.FORGOT_CODE -import org.dhis2.utils.session.PIN_DIALOG_TAG -import org.dhis2.utils.session.PinDialog +import org.koin.android.ext.android.inject import javax.inject.Inject abstract class SessionManagerActivity : @@ -46,28 +46,16 @@ abstract class SessionManagerActivity : @Inject lateinit var locationProvider: LocationProvider - fun observableLifeCycle(): Observable<Status> = lifeCycleObservable - open var handleEdgeToEdge = true - @Inject - lateinit var analyticsHelper: AnalyticsHelper + val analyticsHelper: AnalyticsHelper by inject() - private var pinDialog: PinDialog? = null + private var pinComposeView: androidx.compose.ui.platform.ComposeView? = null private var lifeCycleObservable: BehaviorSubject<Status> = BehaviorSubject.create() - var syncStatusController: SyncStatusController = - SyncStatusController( - object : DispatcherProvider { - override fun io() = Dispatchers.IO - - override fun computation() = Dispatchers.Default - - override fun ui() = Dispatchers.Main - }, - ) + val syncStatusController: SyncStatusController by inject() override fun onCreate(savedInstanceState: Bundle?) { val serverComponent = (applicationContext as App).serverComponent @@ -82,11 +70,12 @@ abstract class SessionManagerActivity : true, null, ) - Unit } - if (serverComponent.userManager().isUserLoggedIn().blockingFirst() && - !serverComponent.userManager().allowScreenShare() - ) { + val isTraining = BuildConfig.FLAVOR == "dhis2Training" + val screenShareAllowed = + serverComponent.userManager().isUserLoggedIn().blockingFirst() && + !serverComponent.userManager().allowScreenShare() + if (!isTraining && screenShareAllowed) { window.setFlags( WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE, @@ -147,23 +136,27 @@ abstract class SessionManagerActivity : this.activityResultObserver = activityResultObserver } - private fun initPinDialog() { - pinDialog = - PinDialog( - PinDialog.Mode.ASK, - (this is LoginActivity), - { - startActivity(MainActivity::class.java, null, true, true, null) - null - }, - { - analyticsHelper.setEvent(FORGOT_CODE, CLICK, FORGOT_CODE) - if (this !is LoginActivity) { - startActivity(LoginActivity::class.java, null, true, true, null) - } - null - }, - ) + private fun showPinBottomSheet() { + if (pinComposeView != null) return + pinComposeView = addPinBottomSheet( + mode = PinMode.ASK, + onSuccess = { + startActivity(MainActivity::class.java, null, true, true, null) + }, + onDismiss = { + analyticsHelper.setEvent(FORGOT_CODE, CLICK, FORGOT_CODE) + if (this !is LoginActivity) { + startActivity(LoginActivity::class.java, null, true, true, null) + } + }, + ) + } + + private fun removePinBottomSheet() { + pinComposeView?.let { view -> + (window?.decorView as? android.view.ViewGroup)?.removeView(view) + } + pinComposeView = null } override fun unsubscribe() { @@ -196,17 +189,13 @@ abstract class SessionManagerActivity : if (finishCurrent) finish() } - private fun showPinDialog() { - pinDialog!!.show(supportFragmentManager, PIN_DIALOG_TAG) - } - @Deprecated("Deprecated in Java") override fun onActivityResult( requestCode: Int, resultCode: Int, data: Intent?, ) { - if (activityResultObserver != null && sessionManagerServiceImpl.isUserLoggedIn()) { + if (activityResultObserver != null && ::sessionManagerServiceImpl.isInitialized && sessionManagerServiceImpl.isUserLoggedIn()) { comesFromImageSource = true activityResultObserver!!.onActivityResult(requestCode, resultCode, data) activityResultObserver = null @@ -223,14 +212,15 @@ abstract class SessionManagerActivity : this !is LoginActivity ) { workManagerController.cancelAllWork() - syncStatusController.restore() + lifecycleScope.launch { + syncStatusController.restore() + } } } override fun onStop() { super.onStop() - val dialog = pinDialog - dialog?.dismissAllowingStateLoss() + removePinBottomSheet() } override fun onDestroy() { @@ -254,11 +244,8 @@ abstract class SessionManagerActivity : comesFromImageSource = false } else { if (this.app().isSessionBlocked && this !is SplashActivity && this !is LoginActivity) { - if (pinDialog == null) { - initPinDialog() - showPinDialog() - } else if (pinDialog?.isVisible == false) { - showPinDialog() + if (pinComposeView == null) { + showPinBottomSheet() } } else { if (this !is LoginActivity && this !is SplashActivity) { @@ -270,9 +257,8 @@ abstract class SessionManagerActivity : private fun sessionAction(accountsCount: Int) { if (this.app().isSessionBlocked && this !is SplashActivity) { - if (pinDialog == null) { - initPinDialog() - showPinDialog() + if (pinComposeView == null) { + showPinBottomSheet() } } else { navigateToLogin(accountsCount) @@ -282,7 +268,7 @@ abstract class SessionManagerActivity : private fun navigateToLogin(accountsCount: Int) { startActivity( LoginActivity::class.java, - LoginActivity.bundle( + bundle( accountsCount = accountsCount, isDeletion = false, ), diff --git a/app/src/main/java/org/dhis2/usescases/login/LoginActivity.kt b/app/src/main/java/org/dhis2/usescases/login/LoginActivity.kt index 17341a2e655..a60ba03698b 100644 --- a/app/src/main/java/org/dhis2/usescases/login/LoginActivity.kt +++ b/app/src/main/java/org/dhis2/usescases/login/LoginActivity.kt @@ -15,6 +15,7 @@ import org.dhis2.commons.Constants.SESSION_DIALOG_RQ import org.dhis2.commons.dialogs.CustomDialog import org.dhis2.commons.resources.ResourceManager import org.dhis2.data.server.OpenIdSession +import org.dhis2.mobile.login.authentication.OpenIdController import org.dhis2.mobile.login.main.ui.navigation.AppLinkNavigation import org.dhis2.mobile.login.main.ui.screen.LoginScreen import org.dhis2.usescases.about.PolicyView @@ -25,6 +26,7 @@ import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor import org.koin.android.ext.android.inject import javax.inject.Inject +import kotlin.getValue const val EXTRA_SKIP_SYNC = "SKIP_SYNC" const val FROM_MAIN_ACTIVITY = "FROM_MAIN_ACTIVITY" @@ -41,6 +43,7 @@ class LoginActivity : ActivityGlobalAbstract() { lateinit var resourceManager: ResourceManager private val appLinkNavigation: AppLinkNavigation by inject() + private val openIdController: OpenIdController by inject() private var isPinScreenVisible = false @@ -84,6 +87,8 @@ class LoginActivity : ActivityGlobalAbstract() { ) super.onCreate(savedInstanceState) + openIdController.bind(this) + checkMessage() skipSync = intent.getBooleanExtra(EXTRA_SKIP_SYNC, false) @@ -130,6 +135,11 @@ class LoginActivity : ActivityGlobalAbstract() { } } + override fun onDestroy() { + super.onDestroy() + openIdController.unbind() + } + @Deprecated("Deprecated in Java") override fun onBackPressed() { if (isPinScreenVisible) { diff --git a/app/src/main/java/org/dhis2/usescases/login/SyncIsPerformedInteractor.kt b/app/src/main/java/org/dhis2/usescases/login/SyncIsPerformedInteractor.kt deleted file mode 100644 index cd676dd789b..00000000000 --- a/app/src/main/java/org/dhis2/usescases/login/SyncIsPerformedInteractor.kt +++ /dev/null @@ -1,58 +0,0 @@ -package org.dhis2.usescases.login - -import org.dhis2.data.server.UserManager -import org.dhis2.usescases.sync.WAS_INITIAL_SYNC_DONE - -class SyncIsPerformedInteractor( - private val userManager: UserManager?, -) { - fun execute(): Boolean { - if (userManager == null) return false - - val entryExists = - userManager.d2 - .dataStoreModule() - .localDataStore() - .value( - WAS_INITIAL_SYNC_DONE, - ).blockingExists() - - val serverUrl = - userManager.d2 - .systemInfoModule() - .systemInfo() - .blockingGet() - ?.contextPath() - val username = - userManager.d2 - .userModule() - .user() - .blockingGet() - ?.username() - - val dataBaseIsImport = - userManager.d2 - .userModule() - .accountManager() - .getCurrentAccount() - ?.let { - it.serverUrl() == serverUrl && it.username() == username && it.importDB() != null - } ?: false - - return when { - dataBaseIsImport -> true - entryExists -> { - val entry = - userManager.d2 - .dataStoreModule() - .localDataStore() - .value( - WAS_INITIAL_SYNC_DONE, - ).blockingGet() - !entry?.value().isNullOrEmpty() && entry?.value() == "True" - } - - else -> false - } - } -} diff --git a/app/src/main/java/org/dhis2/usescases/main/HomePageConfigurator.kt b/app/src/main/java/org/dhis2/usescases/main/HomePageConfigurator.kt deleted file mode 100644 index 8563d33d439..00000000000 --- a/app/src/main/java/org/dhis2/usescases/main/HomePageConfigurator.kt +++ /dev/null @@ -1,39 +0,0 @@ -package org.dhis2.usescases.main - -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.BarChart -import org.dhis2.R -import org.dhis2.commons.resources.ResourceManager -import org.dhis2.usescases.main.ui.Form -import org.dhis2.utils.customviews.navigationbar.NavigationPage -import org.dhis2.utils.customviews.navigationbar.NavigationPageConfigurator -import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarItem - -class HomePageConfigurator( - private val homeRepository: HomeRepository, - private val resourceManager: ResourceManager, -) : NavigationPageConfigurator { - override fun displayPrograms(): Boolean = true - - override fun displayAnalytics(): Boolean = homeRepository.hasHomeAnalytics() - - override fun navigationItems(): List<NavigationBarItem<NavigationPage>> = - buildList { - add( - NavigationBarItem( - id = NavigationPage.PROGRAMS, - icon = Icons.Filled.Form, - label = resourceManager.getString(R.string.navigation_programs), - ), - ) - if (displayAnalytics()) { - add( - NavigationBarItem( - id = NavigationPage.ANALYTICS, - icon = Icons.Filled.BarChart, - label = resourceManager.getString(R.string.navigation_charts), - ), - ) - } - } -} diff --git a/app/src/main/java/org/dhis2/usescases/main/HomeRepository.kt b/app/src/main/java/org/dhis2/usescases/main/HomeRepository.kt deleted file mode 100644 index d58baa1ecf9..00000000000 --- a/app/src/main/java/org/dhis2/usescases/main/HomeRepository.kt +++ /dev/null @@ -1,35 +0,0 @@ -package org.dhis2.usescases.main - -import io.reactivex.Single -import org.hisp.dhis.android.core.category.CategoryCombo -import org.hisp.dhis.android.core.category.CategoryOptionCombo -import org.hisp.dhis.android.core.systeminfo.SystemInfo -import org.hisp.dhis.android.core.user.User - -interface HomeRepository { - fun user(): Single<User?> - - fun defaultCatCombo(): Single<CategoryCombo?> - - fun defaultCatOptCombo(): Single<CategoryOptionCombo?> - - fun hasProgramWithAssignment(): Boolean - - fun checkDeleteBiometricsPermission() - - fun hasHomeAnalytics(): Boolean - - fun getServerVersion(): Single<SystemInfo?> - - fun accountsCount(): Int - - fun isPinStored(): Boolean - - fun homeItemCount(): Int - - suspend fun singleHomeItemData(): HomeItemData? - - suspend fun logOut(): Result<Unit> - - suspend fun clearSessionLock(): Result<Unit> -} diff --git a/app/src/main/java/org/dhis2/usescases/main/HomeRepositoryImpl.kt b/app/src/main/java/org/dhis2/usescases/main/HomeRepositoryImpl.kt deleted file mode 100644 index 3161fe3b480..00000000000 --- a/app/src/main/java/org/dhis2/usescases/main/HomeRepositoryImpl.kt +++ /dev/null @@ -1,159 +0,0 @@ -package org.dhis2.usescases.main - -import dhis2.org.analytics.charts.Charts -import io.reactivex.Single -import kotlinx.coroutines.withContext -import org.dhis2.commons.bindings.dataSet -import org.dhis2.commons.bindings.dataSetInstanceSummaries -import org.dhis2.commons.bindings.isStockProgram -import org.dhis2.commons.bindings.programs -import org.dhis2.commons.prefs.Preference -import org.dhis2.commons.prefs.Preference.Companion.PIN -import org.dhis2.commons.prefs.PreferenceProvider -import org.dhis2.mobile.commons.biometrics.CryptographicActions -import org.dhis2.mobile.commons.coroutine.Dispatcher -import org.dhis2.mobile.commons.error.DomainErrorMapper -import org.hisp.dhis.android.core.D2 -import org.hisp.dhis.android.core.category.CategoryCombo -import org.hisp.dhis.android.core.category.CategoryOptionCombo -import org.hisp.dhis.android.core.maintenance.D2Error -import org.hisp.dhis.android.core.program.ProgramType -import org.hisp.dhis.android.core.systeminfo.SystemInfo -import org.hisp.dhis.android.core.user.User - -class HomeRepositoryImpl( - private val d2: D2, - private val charts: Charts?, - private val preferences: PreferenceProvider, - private val cryptographyManager: CryptographicActions, - private val dispatcher: Dispatcher, - private val domainErrorMapper: DomainErrorMapper, -) : HomeRepository { - companion object { - const val BIOMETRICS_PERMISSION = "biometrics_permission" - } - - private suspend fun <T> execute(block: suspend () -> Result<T>): Result<T> = - withContext(dispatcher.io) { - try { - block() - } catch (d2Error: D2Error) { - Result.failure(domainErrorMapper.mapToDomainError(d2Error)) - } - } - - override fun user(): Single<User?> = d2.userModule().user().get() - - override fun defaultCatCombo(): Single<CategoryCombo?> = - d2 - .categoryModule() - .categoryCombos() - .byIsDefault() - .eq(true) - .one() - .get() - - override fun defaultCatOptCombo(): Single<CategoryOptionCombo?> = - d2 - .categoryModule() - .categoryOptionCombos() - .byCode() - .eq(DEFAULT) - .one() - .get() - - override suspend fun logOut(): Result<Unit> = - execute { - Result.success(d2.userModule().blockingLogOut()) - } - - override suspend fun clearSessionLock(): Result<Unit> = - execute { - preferences.setValue(Preference.SESSION_LOCKED, false) - d2 - .dataStoreModule() - .localDataStore() - .value(PIN) - .blockingDeleteIfExist() - Result.success(Unit) - } - - override fun hasProgramWithAssignment(): Boolean = - if (d2.userModule().isLogged().blockingGet()) { - !d2 - .programModule() - .programStages() - .byEnableUserAssignment() - .isTrue - .blockingIsEmpty() - } else { - false - } - - override fun checkDeleteBiometricsPermission() { - val hasLessThanTwoAccounts = - d2 - .userModule() - .accountManager() - .getAccounts() - .count() <= 2 - if (hasLessThanTwoAccounts) { - preferences.removeValue(BIOMETRICS_PERMISSION) - cryptographyManager.deleteInvalidKey() - } - } - - override fun hasHomeAnalytics(): Boolean = charts?.getVisualizationGroups(null)?.isNotEmpty() == true - - override fun getServerVersion(): Single<SystemInfo?> = d2.systemInfoModule().systemInfo().get() - - override fun accountsCount() = - d2 - .userModule() - .accountManager() - .getAccounts() - .count() - - override fun isPinStored() = - d2 - .dataStoreModule() - .localDataStore() - .value(PIN) - .blockingExists() - - override fun homeItemCount(): Int = d2.programs().size + d2.dataSetInstanceSummaries().size - - override suspend fun singleHomeItemData(): HomeItemData? { - val program = d2.programs().firstOrNull() - val dataSetInstance = d2.dataSetInstanceSummaries().firstOrNull() - - return when { - program?.programType() == ProgramType.WITH_REGISTRATION -> - HomeItemData.TrackerProgram( - program.uid(), - program.displayName() ?: program.uid(), - program.access().data().write() == true, - program.trackedEntityType()?.uid() ?: "", - isStockUseCase = d2.isStockProgram(program.uid()), - ) - - program?.programType() == ProgramType.WITHOUT_REGISTRATION -> - HomeItemData.EventProgram( - program.uid(), - program.displayName() ?: program.uid(), - program.access().data().write() == true, - ) - - dataSetInstance != null -> { - val dataSet = d2.dataSet(dataSetInstance.dataSetUid()) - HomeItemData.DataSet( - dataSetInstance.dataSetUid(), - dataSetInstance.dataSetDisplayName(), - dataSet?.access()?.data()?.write() == true, - ) - } - - else -> null - } - } -} diff --git a/app/src/main/java/org/dhis2/usescases/main/MainActivity.kt b/app/src/main/java/org/dhis2/usescases/main/MainActivity.kt index 9526973f96b..988e45bba5c 100644 --- a/app/src/main/java/org/dhis2/usescases/main/MainActivity.kt +++ b/app/src/main/java/org/dhis2/usescases/main/MainActivity.kt @@ -15,29 +15,20 @@ import android.view.View import android.webkit.MimeTypeMap import android.widget.TextView import android.widget.Toast -import androidx.activity.OnBackPressedCallback +import androidx.activity.compose.setContent import androidx.activity.result.contract.ActivityResultContracts -import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue -import androidx.compose.runtime.livedata.observeAsState -import androidx.compose.runtime.remember -import androidx.compose.ui.platform.ViewCompositionStrategy import androidx.constraintlayout.widget.ConstraintSet import androidx.core.app.NotificationCompat import androidx.core.net.toUri -import androidx.databinding.DataBindingUtil +import androidx.core.view.GravityCompat import androidx.drawerlayout.widget.DrawerLayout -import androidx.lifecycle.lifecycleScope import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar -import kotlinx.coroutines.launch import org.dhis2.BuildConfig import org.dhis2.R -import org.dhis2.bindings.app import org.dhis2.bindings.hasPermissions -import org.dhis2.commons.animations.hide -import org.dhis2.commons.animations.show -import org.dhis2.commons.filters.FilterItem import org.dhis2.commons.filters.FilterManager import org.dhis2.commons.filters.Filters import org.dhis2.commons.filters.FiltersAdapter @@ -51,54 +42,47 @@ import org.dhis2.usescases.development.DevelopmentActivity import org.dhis2.usescases.general.ActivityGlobalAbstract import org.dhis2.usescases.login.LoginActivity import org.dhis2.usescases.main.ui.NewVersionDialog -import org.dhis2.utils.analytics.CLICK -import org.dhis2.utils.analytics.CLOSE_SESSION -import org.dhis2.utils.customviews.navigationbar.NavigationPage -import org.dhis2.utils.customviews.navigationbar.NavigationPageConfigurator -import org.dhis2.utils.extension.navigateTo +import org.dhis2.usescases.main.ui.TAG +import org.dhis2.usescases.main.ui.model.HomeEffect +import org.dhis2.usescases.main.ui.model.HomeScreenState +import org.dhis2.usescases.main.ui.model.VersionToUpdateState +import org.dhis2.usescases.main.ui.screens.MainScreen import org.dhis2.utils.granularsync.SyncStatusDialog -import org.dhis2.utils.session.PIN_DIALOG_TAG -import org.dhis2.utils.session.PinDialog -import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBar -import java.io.File -import javax.inject.Inject +import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme +import org.koin.androidx.viewmodel.ext.android.viewModel +import org.koin.core.parameter.parametersOf private const val FRAGMENT = "Fragment" -private const val SINGLE_PROGRAM_NAVIGATION = "SINGLE_PROGRAM_NAVIGATION" private const val INIT_DATA_SYNC = "INIT_DATA_SYNC" private const val WIPE_NOTIFICATION = "wipe_notification" private const val RESTART = "Restart" const val AVOID_SYNC = "AvoidSync" -class MainActivity : - ActivityGlobalAbstract(), - MainView, - DrawerLayout.DrawerListener { +class MainActivity : ActivityGlobalAbstract() { private lateinit var binding: ActivityMainBinding + private val mainViewModel: MainViewModel by viewModel(parameters = { + parametersOf( + context, + supportFragmentManager, + intent.getBooleanExtra(AVOID_SYNC, false), + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + intent.getParcelableExtra(FRAGMENT, MainScreenType::class.java) + ?: MainScreenType.Home( + HomeScreen.Programs + ) + } else { + @Suppress("DEPRECATION") + intent.getParcelableExtra(FRAGMENT) ?: MainScreenType.Home(HomeScreen.Programs) + } + ) + }) - lateinit var mainComponent: MainComponent - - @Inject - lateinit var presenter: MainPresenter - - @Inject - lateinit var newAdapter: FiltersAdapter - - @Inject - lateinit var pageConfigurator: NavigationPageConfigurator - - private val getDevActivityContent = - registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - // no-op - } + private val filtersAdapter: FiltersAdapter = FiltersAdapter() private var backDropActive = false - private val requestWritePermissions = registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted -> - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - onDownloadNewVersion() - } else if (granted) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R || granted) { onDownloadNewVersion() } else { Toast @@ -110,32 +94,30 @@ class MainActivity : } } - private var isPinLayoutVisible = false - - private lateinit var mainNavigator: MainNavigator - private val navigationLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { } companion object { fun intent( context: Context, - initScreen: MainNavigator.MainScreen? = null, + initScreen: MainScreenType? = null, launchDataSync: Boolean = false, ): Intent = Intent(context, MainActivity::class.java).apply { - initScreen?.let { - putExtra(FRAGMENT, initScreen.name) - } - putExtra(INIT_DATA_SYNC, launchDataSync) + putExtras( + bundle( + initScreen = initScreen, + launchDataSync = launchDataSync + ) + ) } fun bundle( - initScreen: MainNavigator.MainScreen? = null, + initScreen: MainScreenType? = null, launchDataSync: Boolean = false, ) = Bundle().apply { initScreen?.let { - putString(FRAGMENT, initScreen.name) + putParcelable(FRAGMENT, initScreen) } putBoolean(INIT_DATA_SYNC, launchDataSync) } @@ -143,231 +125,145 @@ class MainActivity : //region LIFECYCLE override fun onCreate(savedInstanceState: Bundle?) { - app().userComponent()?.let { - mainComponent = - it.plus( - MainModule( - view = this, - forceToNotSynced = intent.getBooleanExtra(AVOID_SYNC, false), - ), - ) - mainComponent.inject(this@MainActivity) - } ?: navigateTo<LoginActivity>(true) - mainNavigator = - MainNavigator( - dispatcherProvider = presenter.dispatcherProvider, - supportFragmentManager, - { - if (backDropActive) { - showHideFilter() - } - }, - ) { titleRes, showFilterButton, showBottomNavigation -> - setTitle(getString(titleRes)) - setFilterButtonVisibility(showFilterButton) - setBottomNavigationVisibility(showBottomNavigation) - } super.onCreate(savedInstanceState) - binding = DataBindingUtil.setContentView(this, R.layout.activity_main) - if (::presenter.isInitialized) { - binding.presenter = presenter - } else { - navigateTo<LoginActivity>(true) + // On recreation (e.g. rotation), the ViewModel survives but its MainNavigator holds a + // stale FragmentManager from the destroyed Activity. Update it before rendering so any + // fragment transaction below uses the correct, live FragmentManager. + var needsScreenRefresh = savedInstanceState != null + if (needsScreenRefresh) { + mainViewModel.mainNavigator.updateFragmentManager(supportFragmentManager) } + setContent { + DHIS2Theme { + val screenState by mainViewModel.homeScreenState.collectAsState() + MainScreen( + screenState = screenState, + effects = mainViewModel.homeEffects, + onAction = mainViewModel::onAction, + onEffect = { effect -> + when (effect) { + HomeEffect.BlockSession -> finish() + is HomeEffect.GoToLogin -> goToLogin( + accountsCount = effect.accountsCount, + isDeletion = effect.isDeletion, + ) + HomeEffect.OrgUnitFilterRequest -> openOrgUnitTreeSelector() + is HomeEffect.PeriodFilterRequest -> showPeriodRequest(effect.periodRequest) + HomeEffect.ShowDeleteNotification -> showProgressDeleteNotification() + HomeEffect.ShowGranularSync -> showGranularSync() + is HomeEffect.SingleProgramNavigation -> navigationLauncher.navigateTo( + this@MainActivity, + effect.homeItemData, + ) + HomeEffect.ShowPinDialog -> { /*handled in composable*/ } + HomeEffect.ToggleSideMenu -> openDrawer() + HomeEffect.ToggleFilters -> showHideFilter() + } + }, + onNewState = { state -> + if (::binding.isInitialized) { + updateScreen(state) + } + }, + onNewScreen = { currentScreen -> + if (backDropActive) { + showHideFilter() + } + val navigationId = when (currentScreen) { + MainScreenType.About -> R.id.menu_about + is MainScreenType.Home -> R.id.menu_home + MainScreenType.Loading -> null + MainScreenType.QRScanner -> R.id.qr_scan + MainScreenType.Settings -> R.id.sync_manager + MainScreenType.TroubleShooting -> R.id.menu_troubleshooting + } + navigationId?.let { + changeFragment(it) + // On recreation the ViewModel screen hasn't changed so + // navigateToScreen() would early-return without ever opening the + // fragment. Bypass it once to repopulate the fresh container. + if (needsScreenRefresh) { + needsScreenRefresh = false + mainViewModel.refreshCurrentScreen() + } else { + initCurrentScreen() + } + } + }, + onLayoutInflated = { + binding = it + initBinding() + }, + ) + } + } + } + + private fun initBinding() { binding.navView.setNavigationItemSelectedListener { item -> changeFragment(item.itemId) false } - binding.mainDrawerLayout.addDrawerListener(this) - - binding.filterRecycler.adapter = newAdapter - - setUpNavigationBar() - setUpDevelopmentMode() - - val restoreScreenName = savedInstanceState?.getString(FRAGMENT) - presenter.updateSingleProgramNavigationDone( - savedInstanceState?.getBoolean( - SINGLE_PROGRAM_NAVIGATION, - ) ?: false, - ) - - val openScreen = intent.getStringExtra(FRAGMENT) + binding.mainDrawerLayout.addDrawerListener(object : DrawerLayout.DrawerListener { + override fun onDrawerSlide(drawerView: View, slideOffset: Float) = Unit - when { - openScreen != null || restoreScreenName != null -> { - changeFragment( - mainNavigator.currentNavigationViewItemId( - openScreen ?: restoreScreenName!!, - ), - ) - mainNavigator.restoreScreen( - screenToRestoreName = openScreen ?: restoreScreenName!!, - languageSelectorOpened = - openScreen != null && - MainNavigator.MainScreen.valueOf(openScreen) == - MainNavigator.MainScreen.TROUBLESHOOTING, - ) - } + override fun onDrawerOpened(drawerView: View) = Unit - else -> { - changeFragment(R.id.menu_home) + override fun onDrawerClosed(drawerView: View) { initCurrentScreen() } - } - - observeSyncState() - observeVersionUpdate() - observeSingleProgram() - if (!presenter.wasSyncAlreadyDone()) { - presenter.launchInitialDataSync() - } else { - presenter.checkSingleProgramNavigation() - } + override fun onDrawerStateChanged(newState: Int) = Unit + }) - checkNotificationPermission() + binding.filterRecycler.adapter = filtersAdapter - registerOnBackPressedCallback() - } - - private fun checkNotificationPermission() { - if (!hasPermissions(arrayOf(Manifest.permission.POST_NOTIFICATIONS)) and - (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) - ) { - requestNotificationPermission.launch(Manifest.permission.POST_NOTIFICATIONS) - } - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - outState.putBoolean(SINGLE_PROGRAM_NAVIGATION, presenter.isSingleProgramNavigationDone()) - outState.putString(FRAGMENT, mainNavigator.currentScreenName()) - } - - override fun onResume() { - super.onResume() - if (sessionManagerServiceImpl.isUserLoggedIn()) { - presenter.init() - presenter.initFilters() - binding.totalFilters = FilterManager.getInstance().totalFilters - } - } - - override fun onPause() { - presenter.onDetach() - super.onPause() - } - - private fun setUpDevelopmentMode() { if (BuildConfig.DEBUG || BuildConfig.FLAVOR == "dhis2Training") { binding.navView.menu .findItem(R.id.menu_troubleshooting) .isVisible = true - binding.menu.setOnLongClickListener { - getDevActivityContent.launch(Intent(this, DevelopmentActivity::class.java)) - false - } + binding.navView.menu + .findItem(R.id.menu_dev) + .isVisible = true } + checkNotificationPermission() } - private fun registerOnBackPressedCallback() { - onBackPressedDispatcher.addCallback( - object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - backPressed() - } - }, - ) - } - - private fun setUpNavigationBar() { - binding.navigationBar.apply { - setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) - setContent { - val currentScreen by mainNavigator.selectedScreen.observeAsState() - val selectedItemIndex by remember { - derivedStateOf { - when (currentScreen) { - MainNavigator.MainScreen.PROGRAMS -> 0 - MainNavigator.MainScreen.VISUALIZATIONS -> 1 - else -> null - } - } - } - if (pageConfigurator.navigationItems().size > 1) { - NavigationBar( - items = pageConfigurator.navigationItems(), - selectedItemIndex = selectedItemIndex ?: 0, - ) { navigationPage -> - when (navigationPage) { - NavigationPage.ANALYTICS -> { - presenter.trackHomeAnalytics() - mainNavigator.openVisualizations() - } + private fun updateScreen(screenState: HomeScreenState) { + binding.navView.getHeaderView(0).findViewById<TextView>(R.id.user_info) + .text = screenState.userName - NavigationPage.PROGRAMS -> mainNavigator.openPrograms() - else -> { - // no-op - } - } - } - } - } + if (screenState.homeFilters.isNotEmpty()) { + filtersAdapter.submitList(screenState.homeFilters) } - } - private fun observeSyncState() { - lifecycleScope.launch { - presenter.observeDataSync().collect { - when (it.running) { - true -> { - binding.syncActionButton.visibility = View.GONE - setFilterButtonVisibility(false) - setBottomNavigationVisibility(false) - } - - false -> { - setFilterButtonVisibility(true) - binding.syncActionButton.visibility = View.VISIBLE - setBottomNavigationVisibility(true) - presenter.onDataSuccess() - presenter.checkSingleProgramNavigation() - } + when (val versionState = screenState.versionToUpdate) { + VersionToUpdateState.Downloading -> + binding.toolbarProgress.show() - else -> { - // no action - } + is VersionToUpdateState.New -> + if (supportFragmentManager.findFragmentByTag(TAG) == null) { + showNewVersionAlert(versionState.version) } - } - } - } - private fun observeVersionUpdate() { - presenter.versionToUpdate.observe(this) { versionName -> - versionName?.takeIf { it.isNotEmpty() }?.let { showNewVersionAlert(it) } - } - presenter.downloadingVersion.observe(this) { downloading -> - if (downloading) { - binding.toolbarProgress.show() - } else { + VersionToUpdateState.None -> binding.toolbarProgress.hide() - } } } - private fun observeSingleProgram() { - lifecycleScope.launch { - presenter.singleProgramNavigationChannel.collect { homeItemData -> - navigationLauncher.navigateTo(this@MainActivity, homeItemData) - } + /*TODO: MOVE TO BE HANDLED AFTER LOGIN*/ + private fun checkNotificationPermission() { + if (!hasPermissions(arrayOf(Manifest.permission.POST_NOTIFICATIONS)) and + (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) + ) { + requestNotificationPermission.launch(Manifest.permission.POST_NOTIFICATIONS) } } - override fun showHideFilter() { + private fun showHideFilter() { val transition = ChangeBounds() transition.duration = 200 TransitionManager.beginDelayedTransition(binding.backdropLayout, transition) @@ -382,21 +278,21 @@ class MainActivity : ConstraintSet.BOTTOM, 50, ) - binding.navigationBar.hide() + mainViewModel.updateNavigationBarVisibility(false) } else { initSet.connect( R.id.fragment_container, ConstraintSet.TOP, - R.id.toolbar, + R.id.toolbarProgress, ConstraintSet.BOTTOM, 0, ) - binding.navigationBar.show() + mainViewModel.updateNavigationBarVisibility(true) } initSet.applyTo(binding.backdropLayout) } - override fun showGranularSync() { + private fun showGranularSync() { SyncStatusDialog .Builder() .withContext(this) @@ -404,9 +300,7 @@ class MainActivity : .onDismissListener( object : OnDismissListener { override fun onDismiss(hasChanged: Boolean) { - if (hasChanged) { - mainNavigator.getCurrentIfProgram()?.programViewModel?.updateProgramQueries() - } + mainViewModel.onGranularSyncFinished(hasChanged) } }, ).onNoConnectionListener { @@ -420,11 +314,7 @@ class MainActivity : }.show("ALL_SYNC") } - override fun updateFilters(totalFilters: Int) { - binding.totalFilters = totalFilters - } - - override fun showPeriodRequest(periodRequest: FilterManager.PeriodRequest) { + private fun showPeriodRequest(periodRequest: FilterManager.PeriodRequest) { if (periodRequest == FilterManager.PeriodRequest.FROM_TO) { FilterPeriodsDialog .newPeriodsFilter(filterType = Filters.PERIOD, isFromToFilter = true) @@ -436,7 +326,7 @@ class MainActivity : } } - override fun openOrgUnitTreeSelector() { + private fun openOrgUnitTreeSelector() { OUTreeFragment .Builder() .withPreselectedOrgUnits( @@ -445,13 +335,12 @@ class MainActivity : .orgUnitFilters .map { it.uid() } .toMutableList(), - ).onSelection { selectedOrgUnits -> - presenter.setOrgUnitFilters(selectedOrgUnits) - }.build() + ).onSelection(mainViewModel::setOrgUnitFilters) + .build() .show(supportFragmentManager, "OUTreeFragment") } - override fun goToLogin( + private fun goToLogin( accountsCount: Int, isDeletion: Boolean, ) { @@ -462,150 +351,54 @@ class MainActivity : isDeletion = isDeletion, fromMainActivity = true, ), - true, - true, - null, + finishCurrent = true, + finishAll = true, + transition = null, ) } - override fun renderUsername(username: String) { - binding.userName = username - (binding.navView.getHeaderView(0).findViewById<View>(R.id.user_info) as TextView) - .text = username - binding.executePendingBindings() - } - - private fun setFilterButtonVisibility(showFilterButton: Boolean) { - binding.filterActionButton.visibility = - if (showFilterButton && presenter.hasFilters()) { - View.VISIBLE - } else { - View.GONE - } - binding.syncActionButton.visibility = - if (showFilterButton) { - View.VISIBLE - } else { - View.GONE - } - } - - override fun openDrawer(gravity: Int) { - if (!binding.mainDrawerLayout.isDrawerOpen(gravity)) { - binding.mainDrawerLayout.openDrawer(gravity) - } else { - binding.mainDrawerLayout.closeDrawer(gravity) - } - } - - override fun setFilters(filters: List<FilterItem>) { - newAdapter.submitList(filters) - } - - override fun hideFilters() { - binding.filterActionButton.visibility = View.GONE - } - - override fun onLockClick() { - if (!presenter.isPinStored()) { - binding.mainDrawerLayout.closeDrawers() - PinDialog( - PinDialog.Mode.SET, - true, - { presenter.blockSession() }, - {}, - ).show(supportFragmentManager, PIN_DIALOG_TAG) - isPinLayoutVisible = true + private fun openDrawer() { + if (!binding.mainDrawerLayout.isDrawerOpen(GravityCompat.START)) { + binding.mainDrawerLayout.openDrawer(GravityCompat.START) } else { - presenter.blockSession() - } - } - - private fun backPressed() { - when { - !mainNavigator.isHome() -> presenter.onNavigateBackToHome() - isPinLayoutVisible -> isPinLayoutVisible = false - else -> back() + binding.mainDrawerLayout.closeDrawer(GravityCompat.START) } } - override fun goToHome() { - mainNavigator.openHome() - } - - override fun changeFragment(id: Int) { + private fun changeFragment(id: Int) { binding.navView.setCheckedItem(id) binding.mainDrawerLayout.closeDrawers() } - fun setTitle(title: String) { - binding.title.text = title - } - - private fun setBottomNavigationVisibility(showBottomNavigation: Boolean) { - if (showBottomNavigation) { - binding.navigationBar.show() - } else { - binding.navigationBar.hide() - } - } - - override fun onDrawerStateChanged(newState: Int) { - // no op - } - - override fun onDrawerSlide( - drawerView: View, - slideOffset: Float, - ) { - // no op - } - - override fun onDrawerClosed(drawerView: View) { - initCurrentScreen() - } - - override fun onDrawerOpened(drawerView: View) { - // no op - } - private fun initCurrentScreen() { when (binding.navView.checkedItem?.itemId) { - R.id.sync_manager -> { - presenter.onClickSyncManager() - mainNavigator.openSettings() - } + R.id.sync_manager -> + mainViewModel.onChangeScreen(MainScreenType.Settings) - R.id.qr_scan -> { - presenter.trackQRScanner() - mainNavigator.openQR() - } + R.id.qr_scan -> + mainViewModel.onChangeScreen(MainScreenType.QRScanner) - R.id.menu_about -> { - mainNavigator.openAbout() - } + R.id.menu_about -> + mainViewModel.onChangeScreen(MainScreenType.About) - R.id.block_button -> { - presenter.trackPinDialog() - onLockClick() - } + R.id.block_button -> + mainViewModel.onBlockSession() - R.id.logout_button -> { - analyticsHelper.setEvent(CLOSE_SESSION, CLICK, CLOSE_SESSION) - presenter.logOut() - } + R.id.logout_button -> + mainViewModel.logOut() - R.id.menu_home -> { - mainNavigator.openHome() - } + R.id.menu_home -> + mainViewModel.onChangeToHome() - R.id.menu_troubleshooting -> { - mainNavigator.openTroubleShooting() - } + R.id.menu_troubleshooting -> + mainViewModel.onChangeScreen(MainScreenType.TroubleShooting) - R.id.delete_account -> { + R.id.menu_dev -> + startActivity(Intent(this, DevelopmentActivity::class.java)) + + R.id.delete_account -> confirmAccountDelete() - } + } } @@ -614,14 +407,13 @@ class MainActivity : .setTitle(getString(R.string.delete_account)) .setMessage(getString(R.string.wipe_data_meesage)) .setView(R.layout.warning_layout) - .setPositiveButton(getString(R.string.wipe_data_ok)) { _, _ -> - presenter.onDeleteAccount() - }.setNegativeButton(getString(R.string.wipe_data_no)) { dialog, _ -> + .setPositiveButton(getString(R.string.wipe_data_ok)) { _, _ -> mainViewModel.onDeleteAccount() } + .setNegativeButton(getString(R.string.wipe_data_no)) { dialog, _ -> dialog.dismiss() }.show() } - override fun showProgressDeleteNotification() { + private fun showProgressDeleteNotification() { val notificationManager = context.getSystemService(NOTIFICATION_SERVICE) as NotificationManager if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { @@ -646,18 +438,10 @@ class MainActivity : notificationManager.notify(123456, notificationBuilder.build()) } - override fun obtainFileView(): File? = this.cacheDir - - override fun cancelNotifications() { - val notificationManager: NotificationManager = - getSystemService(NOTIFICATION_SERVICE) as NotificationManager - notificationManager.cancelAll() - } - private fun showNewVersionAlert(version: String) { NewVersionDialog( newVersion = version, - onRemindMeLater = presenter::remindLaterAlertNewVersion, + onRemindMeLater = mainViewModel::remindLaterAlertNewVersion, onDownloadVersion = { if (hasPermissions(arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE))) { onDownloadNewVersion() @@ -669,8 +453,7 @@ class MainActivity : } private fun onDownloadNewVersion() { - presenter.downloadVersion( - context = context, + mainViewModel.downloadVersion( onDownloadCompleted = ::installAPK, onLaunchUrl = ::launchUrl, ) @@ -701,7 +484,7 @@ class MainActivity : private fun hasNoPermissionToInstall(): Boolean = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && - !packageManager.canRequestPackageInstalls() + !packageManager.canRequestPackageInstalls() private val manageUnknownSources = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { @@ -735,25 +518,24 @@ class MainActivity : private val requestNotificationPermission = registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted -> - if (granted) { - Toast - .makeText( - context, - getString(R.string.permission_notification_granted), - Toast.LENGTH_SHORT, - ).show() + val message = if (granted) { + getString(R.string.permission_notification_granted) } else { - Toast - .makeText( - context, - getString(R.string.permission_notification_denied), - Toast.LENGTH_SHORT, - ).show() + getString(R.string.permission_notification_denied) } + + Toast.makeText(context, message, Toast.LENGTH_SHORT).show() } private fun launchUrl(uri: Uri) { val intent = Intent(Intent.ACTION_VIEW, uri) startActivity(intent) } + + /** Required by QrReaderFragment. It should retrieve the activity mainViewModel and call + * onChangeToHome directly + * */ + fun goToHome() { + mainViewModel.onChangeToHome() + } } diff --git a/app/src/main/java/org/dhis2/usescases/main/MainComponent.kt b/app/src/main/java/org/dhis2/usescases/main/MainComponent.kt deleted file mode 100644 index 74662be2455..00000000000 --- a/app/src/main/java/org/dhis2/usescases/main/MainComponent.kt +++ /dev/null @@ -1,14 +0,0 @@ -package org.dhis2.usescases.main - -import dagger.Subcomponent -import org.dhis2.commons.di.dagger.PerActivity -import org.dhis2.usescases.troubleshooting.TroubleshootingComponent -import org.dhis2.usescases.troubleshooting.TroubleshootingModule - -@PerActivity -@Subcomponent(modules = [MainModule::class]) -interface MainComponent { - fun inject(mainActivity: MainActivity) - - fun plus(troubleShootingModule: TroubleshootingModule): TroubleshootingComponent -} diff --git a/app/src/main/java/org/dhis2/usescases/main/MainModule.kt b/app/src/main/java/org/dhis2/usescases/main/MainModule.kt index 04ce3cab5f2..4e9b14cc5fa 100644 --- a/app/src/main/java/org/dhis2/usescases/main/MainModule.kt +++ b/app/src/main/java/org/dhis2/usescases/main/MainModule.kt @@ -1,160 +1,137 @@ package org.dhis2.usescases.main -import dagger.Module -import dagger.Provides -import dhis2.org.analytics.charts.Charts -import org.dhis2.commons.di.dagger.PerActivity +import android.content.Context +import androidx.fragment.app.FragmentManager +import androidx.work.WorkManager +import kotlinx.coroutines.Dispatchers import org.dhis2.commons.filters.FilterManager -import org.dhis2.commons.filters.FiltersAdapter -import org.dhis2.commons.filters.data.FilterRepository -import org.dhis2.commons.matomo.MatomoAnalyticsController -import org.dhis2.commons.prefs.PreferenceProvider -import org.dhis2.commons.resources.ColorUtils +import org.dhis2.commons.resources.LocaleSelector +import org.dhis2.commons.resources.MetadataIconProvider import org.dhis2.commons.resources.ResourceManager -import org.dhis2.commons.schedulers.SchedulerProvider import org.dhis2.commons.viewmodel.DispatcherProvider -import org.dhis2.data.biometric.CryptographyManager -import org.dhis2.data.server.UserManager -import org.dhis2.data.service.SyncStatusController import org.dhis2.data.service.VersionRepository import org.dhis2.data.service.workManager.WorkManagerController -import org.dhis2.mobile.commons.biometrics.CryptographicActions -import org.dhis2.mobile.commons.coroutine.Dispatcher -import org.dhis2.mobile.commons.error.DomainErrorMapper -import org.dhis2.mobile.commons.network.NetworkStatusProvider -import org.dhis2.mobile.commons.network.NetworkStatusProviderImpl -import org.dhis2.mobile.commons.resources.D2ErrorMessageProvider -import org.dhis2.mobile.commons.resources.D2ErrorMessageProviderImpl -import org.dhis2.usescases.login.SyncIsPerformedInteractor +import org.dhis2.data.service.workManager.WorkManagerControllerImpl +import org.dhis2.usescases.main.data.HomeRepository +import org.dhis2.usescases.main.data.HomeRepositoryImpl +import org.dhis2.usescases.main.domain.CheckSingleNavigation +import org.dhis2.usescases.main.domain.ConfigureHomeNavigationBar +import org.dhis2.usescases.main.domain.DeleteAccount +import org.dhis2.usescases.main.domain.DownloadNewVersion +import org.dhis2.usescases.main.domain.GetHomeFilters +import org.dhis2.usescases.main.domain.GetLockAction +import org.dhis2.usescases.main.domain.GetUserName +import org.dhis2.usescases.main.domain.LaunchInitialSync import org.dhis2.usescases.main.domain.LogoutUser -import org.dhis2.usescases.settings.DeleteUserData -import org.dhis2.utils.customviews.navigationbar.NavigationPageConfigurator -import org.hisp.dhis.android.core.D2 +import org.dhis2.usescases.main.domain.ScheduleNewVersionAlert +import org.dhis2.usescases.main.domain.UpdateInitialSyncStatus +import org.dhis2.usescases.troubleshooting.TroubleshootingRepository +import org.dhis2.usescases.troubleshooting.TroubleshootingViewModel +import org.koin.android.ext.koin.androidContext +import org.koin.core.module.dsl.factoryOf +import org.koin.core.module.dsl.singleOf +import org.koin.core.module.dsl.viewModel +import org.koin.core.parameter.parametersOf +import org.koin.dsl.module -@Module -class MainModule( - val view: MainView, - private val forceToNotSynced: Boolean, -) { - @Provides - @PerActivity - fun homePresenter( - homeRepository: HomeRepository, - schedulerProvider: SchedulerProvider, - preferences: PreferenceProvider, - workManagerController: WorkManagerController, - filterManager: FilterManager, - filterRepository: FilterRepository, - matomoAnalyticsController: MatomoAnalyticsController, - userManager: UserManager, - deleteUserData: DeleteUserData, - syncIsPerformedInteractor: SyncIsPerformedInteractor, - syncStatusController: SyncStatusController, - versionRepository: VersionRepository, - dispatcherProvider: DispatcherProvider, - logoutUser: LogoutUser, - ): MainPresenter = - MainPresenter( - view, - homeRepository, - schedulerProvider, - preferences, - workManagerController, - filterManager, - filterRepository, - matomoAnalyticsController, - userManager, - deleteUserData, - syncIsPerformedInteractor, - syncStatusController, - versionRepository, - dispatcherProvider, - forceToNotSynced, - logoutUser, - ) +val mainModule = module { - @Provides - @PerActivity - fun provideLogoutUser( - homeRepository: HomeRepository, - workManagerController: WorkManagerController, - syncStatusController: SyncStatusController, - filterManager: FilterManager, - ): LogoutUser = - LogoutUser( - homeRepository, - workManagerController, - syncStatusController, - filterManager, - ) + val dispatcher = object : DispatcherProvider { + override fun io() = Dispatchers.IO + override fun computation() = Dispatchers.Unconfined + override fun ui() = Dispatchers.Main + } - @Provides - @PerActivity - fun provideSyncIsPerfomedInteractor(userManager: UserManager): SyncIsPerformedInteractor = SyncIsPerformedInteractor(userManager) + factory<WorkManagerController> { + WorkManagerControllerImpl(WorkManager.getInstance(androidContext())) + } - @Provides - @PerActivity - fun provideHomeRepository( - d2: D2, - charts: Charts?, - preferencesProvider: PreferenceProvider, - cryptographyManager: CryptographicActions, - domainErrorMapper: DomainErrorMapper, - ): HomeRepository = + factory<HomeRepository> { HomeRepositoryImpl( - d2, - charts, - preferencesProvider, - cryptographyManager, - Dispatcher(), - domainErrorMapper, + d2 = get(), + charts = get(), + preferences = get(), + workManagerController = get(), + syncStatusController = get(), + domainErrorMapper = get(), + dispatcher = get(), ) - - @Provides - @PerActivity - fun provideDomainErrorMapper( - d2ErrorMessageProvider: D2ErrorMessageProvider, - networkStatusProvider: NetworkStatusProvider, - ): DomainErrorMapper = - DomainErrorMapper( - d2ErrorMessageProvider = d2ErrorMessageProvider, - networkStatusProvider = networkStatusProvider, + } + factory { + FilterManager.getInstance() + } + singleOf(::VersionRepository) + factoryOf(::ResourceManager) + factory { params -> + MainNavigator( + fragmentManager = params.get(), ) - - @Provides - @PerActivity - fun provideD2ErrorMessageProvider(): D2ErrorMessageProvider = D2ErrorMessageProviderImpl() - - @Provides - @PerActivity - fun provideNetworkStatusProvider(): NetworkStatusProvider = - NetworkStatusProviderImpl( - context = view.context, + } + factory { params -> + GetUserName( + homeRepository = get { parametersOf(params.get()) } ) + } + factory { params -> + ConfigureHomeNavigationBar( + homeRepository = get { parametersOf(params.get()) }, + resourceManager = get() + ) + } + factoryOf(::GetHomeFilters) + factoryOf(::DownloadNewVersion) + factoryOf(::LogoutUser) + factoryOf(::DeleteAccount) + factoryOf(::GetLockAction) + factoryOf(::UpdateInitialSyncStatus) + factoryOf(::CheckSingleNavigation) + factoryOf(::LaunchInitialSync) + factory { + ScheduleNewVersionAlert( + workManagerController = get(), + versionRepository = get() + ) + } - @Provides - @PerActivity - fun provideCryptographicManager(): CryptographicActions = CryptographyManager() - - @Provides - @PerActivity - fun provideNewFiltersAdapter(): FiltersAdapter = FiltersAdapter() + viewModel { params -> + val context = params.get<Context>() + val fragmentManager: FragmentManager = params.get() + val skipInitialSync = params.get<Boolean>() + val initialScreen = params.get<MainScreenType>() - @Provides - @PerActivity - fun providePageConfigurator(homeRepository: HomeRepository): NavigationPageConfigurator = - HomePageConfigurator(homeRepository, ResourceManager(view.context, ColorUtils())) + MainViewModel( + preferences = get { parametersOf(context) }, + filterManager = get(), + matomoAnalyticsController = get(), + syncStatusController = get(), + mainNavigator = get { parametersOf(fragmentManager) }, + getUserName = get { parametersOf(context) }, + configureHomeNavigationBar = get { parametersOf(context) }, + getHomeFilters = get(), + downloadNewVersion = get(), + logOutUser = get { parametersOf(context) }, + deleteAccount = get(), + getLockAction = get(), + updateInitialSyncStatus = get(), + checkSingleNavigation = get { parametersOf(skipInitialSync) }, + launchInitialSync = get(), + scheduleNewVersionAlert = get(), + syncBackgroundJobAction = get(), + initialScreen = initialScreen, + dispatcher = dispatcher, + ) + } - @Provides - @PerActivity - fun provideDeleteUserData( - workManagerController: WorkManagerController, - preferencesProvider: PreferenceProvider, - filterManager: FilterManager, - ): DeleteUserData = - DeleteUserData( - workManagerController, - filterManager, - preferencesProvider, + factoryOf(::MetadataIconProvider) + factoryOf(::TroubleshootingRepository) + factory { + LocaleSelector(androidContext(), get()) + } + viewModel { params -> + TroubleshootingViewModel( + localeSelector = get(), + repository = get(), + openLanguageSection = params.get() ) + } } diff --git a/app/src/main/java/org/dhis2/usescases/main/MainNavigator.kt b/app/src/main/java/org/dhis2/usescases/main/MainNavigator.kt index 798f60cc68a..2cefd21ed02 100644 --- a/app/src/main/java/org/dhis2/usescases/main/MainNavigator.kt +++ b/app/src/main/java/org/dhis2/usescases/main/MainNavigator.kt @@ -2,19 +2,10 @@ package org.dhis2.usescases.main import android.transition.ChangeBounds import android.view.View -import androidx.annotation.IdRes -import androidx.annotation.StringRes import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager -import androidx.fragment.app.FragmentTransaction -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData import dhis2.org.analytics.charts.ui.GroupAnalyticsFragment -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import org.dhis2.R -import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.usescases.about.AboutFragment import org.dhis2.usescases.main.program.ProgramFragment import org.dhis2.usescases.qrReader.QrReaderFragment @@ -22,155 +13,101 @@ import org.dhis2.usescases.settings.SyncManagerFragment import org.dhis2.usescases.troubleshooting.TroubleshootingFragment class MainNavigator( - private val dispatcherProvider: DispatcherProvider, - private val fragmentManager: FragmentManager, - private val onTransitionStart: () -> Unit, - private val onScreenChanged: ( - titleRes: Int, - showFilterButton: Boolean, - showBottomNavigation: Boolean, - ) -> Unit, + private var fragmentManager: FragmentManager, ) { - enum class MainScreen( - @StringRes val title: Int, - @IdRes val navViewId: Int, - ) { - PROGRAMS(R.string.done_task, R.id.menu_home), - VISUALIZATIONS(R.string.done_task, R.id.menu_home), - QR(R.string.QR_SCANNER, R.id.qr_scan), - SETTINGS(R.string.SYNC_MANAGER, R.id.sync_manager), - TROUBLESHOOTING(R.string.main_menu_troubleshooting, R.id.menu_troubleshooting), - ABOUT(R.string.about, R.id.menu_about), - } - - private var currentScreen = MutableLiveData<MainScreen?>(null) - var selectedScreen: LiveData<MainScreen?> = currentScreen private var currentFragment: Fragment? = null + private var lastHomeFragment: Fragment? = null - fun isHome(): Boolean = isPrograms() || isVisualizations() - - fun isPrograms(): Boolean = currentScreen.value == MainScreen.PROGRAMS - - fun isVisualizations(): Boolean = currentScreen.value == MainScreen.VISUALIZATIONS + fun updateFragmentManager(fm: FragmentManager) { + fragmentManager = fm + } - fun getCurrentIfProgram(): ProgramFragment? = currentFragment?.takeIf { it is ProgramFragment } as? ProgramFragment + fun getCurrentIfProgram(): ProgramFragment? = + currentFragment?.takeIf { it is ProgramFragment } as? ProgramFragment - fun currentScreenName() = currentScreen.value?.name - fun currentNavigationViewItemId(screenName: String): Int = MainScreen.valueOf(screenName).navViewId + fun openHome(): MainScreenType { + return when { + lastHomeFragment is GroupAnalyticsFragment -> { + MainScreenType.Home(HomeScreen.Visualizations) + } - fun openHome() { - when { - isVisualizations() -> openVisualizations() - else -> openPrograms() + else -> { + MainScreenType.Home(HomeScreen.Programs) + } } } fun openPrograms() { val programFragment = ProgramFragment() + lastHomeFragment = programFragment val sharedView = - if (isVisualizations()) { - (currentFragment as GroupAnalyticsFragment).sharedView() - } else { - null + (currentFragment as? GroupAnalyticsFragment)?.sharedView()?.let { sharedView -> + programFragment.sharedElementEnterTransition = ChangeBounds() + programFragment.sharedElementReturnTransition = ChangeBounds() + sharedView } - if (sharedView != null) { - programFragment.sharedElementEnterTransition = ChangeBounds() - programFragment.sharedElementReturnTransition = ChangeBounds() - } + beginTransaction( - ProgramFragment(), - MainScreen.PROGRAMS, + programFragment, sharedView, ) } - fun restoreScreen( - screenToRestoreName: String, - languageSelectorOpened: Boolean = false, - ) { - when (MainScreen.valueOf(screenToRestoreName)) { - MainScreen.PROGRAMS -> openPrograms() - MainScreen.VISUALIZATIONS -> openVisualizations() - MainScreen.QR -> openQR() - MainScreen.SETTINGS -> openSettings() - MainScreen.ABOUT -> openAbout() - MainScreen.TROUBLESHOOTING -> openTroubleShooting(languageSelectorOpened) - } - } - fun openVisualizations() { - beginTransaction(GroupAnalyticsFragment.forHome(), MainScreen.VISUALIZATIONS) + val visualizationsFragment = GroupAnalyticsFragment.forHome() + lastHomeFragment = visualizationsFragment + beginTransaction(visualizationsFragment) } fun openSettings() { beginTransaction( SyncManagerFragment(), - MainScreen.SETTINGS, ) } fun openQR() { beginTransaction( QrReaderFragment(), - MainScreen.QR, ) } fun openAbout() { beginTransaction( AboutFragment(), - MainScreen.ABOUT, ) } fun openTroubleShooting(languageSelectorOpened: Boolean = false) { beginTransaction( fragment = TroubleshootingFragment.instance(languageSelectorOpened), - screen = MainScreen.TROUBLESHOOTING, useFadeInTransition = languageSelectorOpened, ) } private fun beginTransaction( fragment: Fragment, - screen: MainScreen, sharedView: View? = null, useFadeInTransition: Boolean = false, ) { - if (currentScreen.value != screen) { - onTransitionStart() - currentScreen.value = screen - currentFragment = fragment - - CoroutineScope(dispatcherProvider.ui()).launch { - withContext(dispatcherProvider.io()) { - val transaction: FragmentTransaction = fragmentManager.beginTransaction() - transaction - .apply { - if (sharedView == null) { - val (enterAnimation, exitAnimation) = getEnterExitAnimation(useFadeInTransition) - val (enterPopAnimation, exitPopAnimation) = getEnterExitPopAnimation(useFadeInTransition) - setCustomAnimations( - enterAnimation, - exitAnimation, - enterPopAnimation, - exitPopAnimation, - ) - } else { - setReorderingAllowed(true) - addSharedElement(sharedView, "contenttest") - } - }.replace(R.id.fragment_container, fragment, fragment::class.simpleName) - .commitAllowingStateLoss() + currentFragment = fragment + fragmentManager.beginTransaction() + .apply { + if (sharedView == null) { + val (enterAnimation, exitAnimation) = getEnterExitAnimation(useFadeInTransition) + val (enterPopAnimation, exitPopAnimation) = getEnterExitPopAnimation(useFadeInTransition) + setCustomAnimations( + enterAnimation, + exitAnimation, + enterPopAnimation, + exitPopAnimation, + ) + } else { + setReorderingAllowed(true) + addSharedElement(sharedView, "contenttest") } - onScreenChanged( - screen.title, - isPrograms(), - isHome(), - ) - } - } + }.replace(R.id.fragment_container, fragment, fragment::class.simpleName) + .commitAllowingStateLoss() } private fun getEnterExitPopAnimation(useFadeInTransition: Boolean): Pair<Int, Int> = diff --git a/app/src/main/java/org/dhis2/usescases/main/MainPresenter.kt b/app/src/main/java/org/dhis2/usescases/main/MainPresenter.kt deleted file mode 100644 index a651681199b..00000000000 --- a/app/src/main/java/org/dhis2/usescases/main/MainPresenter.kt +++ /dev/null @@ -1,401 +0,0 @@ -package org.dhis2.usescases.main - -import android.content.Context -import android.net.Uri -import android.view.Gravity -import androidx.core.net.toUri -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.asLiveData -import androidx.work.ExistingWorkPolicy -import io.reactivex.Flowable -import io.reactivex.disposables.CompositeDisposable -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Job -import kotlinx.coroutines.channels.Channel -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.flow.receiveAsFlow -import kotlinx.coroutines.launch -import org.dhis2.BuildConfig -import org.dhis2.commons.Constants -import org.dhis2.commons.filters.FilterManager -import org.dhis2.commons.filters.data.FilterRepository -import org.dhis2.commons.matomo.Actions.Companion.BLOCK_SESSION_PIN -import org.dhis2.commons.matomo.Actions.Companion.OPEN_ANALYTICS -import org.dhis2.commons.matomo.Actions.Companion.QR_SCANNER -import org.dhis2.commons.matomo.Actions.Companion.SETTINGS -import org.dhis2.commons.matomo.Categories.Companion.HOME -import org.dhis2.commons.matomo.Labels.Companion.CLICK -import org.dhis2.commons.matomo.MatomoAnalyticsController -import org.dhis2.commons.prefs.Preference -import org.dhis2.commons.prefs.Preference.Companion.DEFAULT_CAT_COMBO -import org.dhis2.commons.prefs.Preference.Companion.PREF_DEFAULT_CAT_OPTION_COMBO -import org.dhis2.commons.prefs.PreferenceProvider -import org.dhis2.commons.schedulers.SchedulerProvider -import org.dhis2.commons.viewmodel.DispatcherProvider -import org.dhis2.data.server.UserManager -import org.dhis2.data.service.SyncStatusController -import org.dhis2.data.service.SyncStatusData -import org.dhis2.data.service.VersionRepository -import org.dhis2.data.service.workManager.WorkManagerController -import org.dhis2.data.service.workManager.WorkerItem -import org.dhis2.data.service.workManager.WorkerType -import org.dhis2.usescases.login.SyncIsPerformedInteractor -import org.dhis2.usescases.main.domain.LogoutUser -import org.dhis2.usescases.settings.DeleteUserData -import org.dhis2.usescases.sync.WAS_INITIAL_SYNC_DONE -import org.dhis2.utils.TRUE -import org.hisp.dhis.android.core.organisationunit.OrganisationUnit -import org.hisp.dhis.android.core.systeminfo.SystemInfo -import org.hisp.dhis.android.core.user.User -import timber.log.Timber -import kotlin.concurrent.atomics.AtomicBoolean -import kotlin.concurrent.atomics.ExperimentalAtomicApi -import kotlin.coroutines.CoroutineContext - -const val DEFAULT = "default" -const val SERVER_ACTION = "Server" -const val DHIS2 = "dhis2_server" -const val PLAY_FLAVOR = "dhisPlayServices" - -@OptIn(ExperimentalAtomicApi::class) -class MainPresenter( - private val view: MainView, - private val repository: HomeRepository, - private val schedulerProvider: SchedulerProvider, - private val preferences: PreferenceProvider, - private val workManagerController: WorkManagerController, - private val filterManager: FilterManager, - private val filterRepository: FilterRepository, - private val matomoAnalyticsController: MatomoAnalyticsController, - private val userManager: UserManager, - private val deleteUserData: DeleteUserData, - private val syncIsPerformedInteractor: SyncIsPerformedInteractor, - private val syncStatusController: SyncStatusController, - private val versionRepository: VersionRepository, - val dispatcherProvider: DispatcherProvider, - private val forceToNotSynced: Boolean, - private val logoutUser: LogoutUser, -) : CoroutineScope { - private var job = Job() - override val coroutineContext: CoroutineContext - get() = job + dispatcherProvider.io() - - var disposable: CompositeDisposable = CompositeDisposable() - - val versionToUpdate = versionRepository.newAppVersion.asLiveData(coroutineContext) - val downloadingVersion = MutableLiveData(false) - - private val _singleProgramNavigationChannel = Channel<HomeItemData>() - val singleProgramNavigationChannel = - _singleProgramNavigationChannel - .receiveAsFlow() - .onEach { - singleProgramNavigationDone.store(true) - } - - private var singleProgramNavigationDone = AtomicBoolean(false) - - fun init() { - preferences.removeValue(Preference.CURRENT_ORG_UNIT) - disposable.add( - repository - .user() - .map { username(it) } - .subscribeOn(schedulerProvider.io()) - .observeOn(schedulerProvider.ui()) - .subscribe( - { view.renderUsername(it) }, - { Timber.e(it) }, - ), - ) - - disposable.add( - repository - .defaultCatCombo() - .subscribeOn(schedulerProvider.io()) - .subscribe( - { categoryCombo -> - preferences.setValue(DEFAULT_CAT_COMBO, categoryCombo?.uid()) - }, - { Timber.e(it) }, - ), - ) - - disposable.add( - repository - .defaultCatOptCombo() - .subscribeOn(schedulerProvider.io()) - .subscribe( - { categoryOptionCombo -> - preferences.setValue( - PREF_DEFAULT_CAT_OPTION_COMBO, - categoryOptionCombo?.uid(), - ) - }, - { Timber.e(it) }, - ), - ) - trackDhis2Server() - } - - fun initFilters() { - disposable.add( - Flowable - .just(filterRepository.homeFilters()) - .subscribeOn(schedulerProvider.io()) - .observeOn(schedulerProvider.ui()) - .subscribe( - { filters -> - if (filters.isEmpty()) { - view.hideFilters() - } else { - view.setFilters(filters) - } - }, - { Timber.e(it) }, - ), - ) - - disposable.add( - filterManager - .asFlowable() - .subscribeOn(schedulerProvider.io()) - .observeOn(schedulerProvider.ui()) - .subscribe( - { filterManager -> view.updateFilters(filterManager.totalFilters) }, - { Timber.e(it) }, - ), - ) - - disposable.add( - filterManager.periodRequest - .subscribeOn(schedulerProvider.io()) - .observeOn(schedulerProvider.ui()) - .subscribe( - { periodRequest -> view.showPeriodRequest(periodRequest.first) }, - { Timber.e(it) }, - ), - ) - - disposable.add( - filterManager - .ouTreeFlowable() - .subscribeOn(schedulerProvider.io()) - .observeOn(schedulerProvider.ui()) - .subscribe( - { view.openOrgUnitTreeSelector() }, - { Timber.e(it) }, - ), - ) - } - - fun trackDhis2Server() { - disposable.add( - repository - .getServerVersion() - .subscribeOn(schedulerProvider.io()) - .observeOn(schedulerProvider.ui()) - .subscribe( - { systemInfo -> systemInfo?.let { compareAndTrack(systemInfo) } }, - { Timber.e(it) }, - ), - ) - } - - private fun compareAndTrack(systemInfo: SystemInfo) { - val dhis2ServerTracked = preferences.getString("$DHIS2${getUserUid()}", "") - val currentDhis2Server = systemInfo.version() ?: "" - - if ((dhis2ServerTracked.isNullOrEmpty() || dhis2ServerTracked != currentDhis2Server) && - currentDhis2Server.isNotEmpty() - ) { - matomoAnalyticsController.trackEvent( - HOME, - SERVER_ACTION, - currentDhis2Server, - ) - preferences.setValue("$DHIS2${getUserUid()}", currentDhis2Server) - } - } - - fun setOrgUnitFilters(selectedOrgUnits: List<OrganisationUnit>) { - filterManager.addOrgUnits(selectedOrgUnits) - } - - private fun getUserUid(): String = - try { - userManager.d2 - .userModule() - .user() - .blockingGet() - ?.uid() ?: "" - } catch (e: Exception) { - "" - } - - fun logOut() { - launch(dispatcherProvider.ui()) { - logoutUser().fold( - onSuccess = { accounts -> - view.goToLogin(accounts, isDeletion = false) - }, - onFailure = { - Timber.e(it) - }, - ) - } - } - - fun onDeleteAccount() { - view.showProgressDeleteNotification() - try { - repository.checkDeleteBiometricsPermission() - workManagerController.cancelAllWork() - syncStatusController.restore() - deleteUserData.wipeCacheAndPreferences(view.obtainFileView()) - userManager.d2?.wipeModule()?.wipeEverything() - userManager.d2 - ?.userModule() - ?.accountManager() - ?.deleteCurrentAccount() - view.cancelNotifications() - - view.goToLogin(repository.accountsCount(), isDeletion = true) - } catch (exception: Exception) { - Timber.e(exception) - } - } - - fun onSyncAllClick() { - view.showGranularSync() - } - - fun blockSession() { - workManagerController.cancelAllWork() - view.back() - } - - fun showFilter() { - view.showHideFilter() - } - - fun onDetach() { - disposable.clear() - } - - fun onMenuClick() { - view.openDrawer(Gravity.START) - } - - private fun username(user: User): String = - String.format( - "%s %s", - if (user.firstName().isNullOrEmpty()) "" else user.firstName(), - if (user.surname().isNullOrEmpty()) "" else user.surname(), - ) - - fun onNavigateBackToHome() { - view.goToHome() - initFilters() - } - - fun onClickSyncManager() { - matomoAnalyticsController.trackEvent(HOME, SETTINGS, CLICK) - } - - fun isPinStored() = repository.isPinStored() - - fun launchInitialDataSync() { - checkVersionUpdate() - workManagerController - .syncDataForWorker(Constants.DATA_NOW, Constants.INITIAL_SYNC) - } - - fun observeDataSync(): StateFlow<SyncStatusData> = syncStatusController.observeDownloadProcess() - - fun wasSyncAlreadyDone(): Boolean { - if (forceToNotSynced) { - return true - } - return syncIsPerformedInteractor.execute() - } - - fun onDataSuccess() { - launch(dispatcherProvider.io()) { - userManager.d2 - .dataStoreModule() - .localDataStore() - .value(WAS_INITIAL_SYNC_DONE) - .blockingSet(TRUE) - } - } - - fun trackHomeAnalytics() { - matomoAnalyticsController.trackEvent(HOME, OPEN_ANALYTICS, CLICK) - } - - fun trackPinDialog() { - matomoAnalyticsController.trackEvent(HOME, BLOCK_SESSION_PIN, CLICK) - } - - fun trackQRScanner() { - matomoAnalyticsController.trackEvent(HOME, QR_SCANNER, CLICK) - } - - fun checkVersionUpdate() { - launch { - versionRepository.checkVersionUpdates() - } - } - - fun remindLaterAlertNewVersion() { - val workerItem = - WorkerItem( - Constants.NEW_APP_VERSION, - WorkerType.NEW_VERSION, - delayInSeconds = 24 * 60 * 60, - policy = ExistingWorkPolicy.REPLACE, - ) - workManagerController.beginUniqueWork(workerItem) - versionRepository.removeVersionInfo() - } - - fun downloadVersion( - context: Context, - onDownloadCompleted: (Uri) -> Unit, - onLaunchUrl: (Uri) -> Unit, - ) { - if (BuildConfig.FLAVOR == PLAY_FLAVOR) { - val url = versionRepository.getUrl() - url?.toUri()?.let { onLaunchUrl(it) } - } else { - versionRepository.download( - context = context, - onDownloadCompleted = { - onDownloadCompleted(it) - downloadingVersion.value = false - }, - onDownloading = { downloadingVersion.value = true }, - ) - } - } - - fun checkSingleProgramNavigation() { - if (!singleProgramNavigationDone.load() && repository.homeItemCount() == 1) { - launch(coroutineContext) { - repository.singleHomeItemData()?.let { - _singleProgramNavigationChannel.send(it) - } - } - } - } - - fun hasFilters(): Boolean = filterRepository.homeFilters().isNotEmpty() - - fun updateSingleProgramNavigationDone(done: Boolean) { - singleProgramNavigationDone.store(done) - } - - fun isSingleProgramNavigationDone() = singleProgramNavigationDone.load() -} diff --git a/app/src/main/java/org/dhis2/usescases/main/MainScreenType.kt b/app/src/main/java/org/dhis2/usescases/main/MainScreenType.kt new file mode 100644 index 00000000000..dfff1ba3dda --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/MainScreenType.kt @@ -0,0 +1,24 @@ +package org.dhis2.usescases.main + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Parcelize +sealed class MainScreenType : Parcelable { + data object Loading : MainScreenType() + data class Home(val homeScreen: HomeScreen) : MainScreenType() + data object QRScanner : MainScreenType() + data object Settings : MainScreenType() + data object About : MainScreenType() + data object TroubleShooting : MainScreenType() + + fun isHome() = this is Home + fun isPrograms() = this is Home && this.homeScreen == HomeScreen.Programs + fun isVisualizations() = this is Home && this.homeScreen == HomeScreen.Visualizations +} + +@Parcelize +sealed interface HomeScreen : Parcelable { + data object Programs : HomeScreen + data object Visualizations : HomeScreen +} \ No newline at end of file diff --git a/app/src/main/java/org/dhis2/usescases/main/MainView.kt b/app/src/main/java/org/dhis2/usescases/main/MainView.kt deleted file mode 100644 index e870cbbc861..00000000000 --- a/app/src/main/java/org/dhis2/usescases/main/MainView.kt +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2004 - 2019, University of Oslo - * All rights reserved. - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * Neither the name of the HISP project nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package org.dhis2.usescases.main - -import androidx.annotation.UiThread -import org.dhis2.commons.filters.FilterItem -import org.dhis2.commons.filters.FilterManager -import org.dhis2.usescases.general.AbstractActivityContracts -import java.io.File - -interface MainView : AbstractActivityContracts.View { - @UiThread - fun renderUsername(username: String) - - fun openDrawer(gravity: Int) - - fun showHideFilter() - - fun onLockClick() - - fun changeFragment(id: Int) - - fun updateFilters(totalFilters: Int) - - fun showPeriodRequest(periodRequest: FilterManager.PeriodRequest) - - fun openOrgUnitTreeSelector() - - fun goToHome() - - fun setFilters(filters: List<FilterItem>) - - fun hideFilters() - - fun showGranularSync() - - fun goToLogin( - accountsCount: Int, - isDeletion: Boolean, - ) - - fun showProgressDeleteNotification() - - fun obtainFileView(): File? - - fun cancelNotifications() -} diff --git a/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt b/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt new file mode 100644 index 00000000000..cbbbac8702b --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/MainViewModel.kt @@ -0,0 +1,452 @@ +package org.dhis2.usescases.main + +import android.content.Context +import android.net.Uri +import androidx.core.net.toUri +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.flow.onStart +import kotlinx.coroutines.flow.receiveAsFlow +import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.reactive.asFlow +import kotlinx.coroutines.withContext +import org.dhis2.commons.filters.FilterManager +import org.dhis2.commons.matomo.Actions.Companion.BLOCK_SESSION_PIN +import org.dhis2.commons.matomo.Actions.Companion.OPEN_ANALYTICS +import org.dhis2.commons.matomo.Actions.Companion.QR_SCANNER +import org.dhis2.commons.matomo.Actions.Companion.SETTINGS +import org.dhis2.commons.matomo.Categories.Companion.HOME +import org.dhis2.commons.matomo.Labels.Companion.CLICK +import org.dhis2.commons.matomo.MatomoAnalyticsController +import org.dhis2.commons.prefs.Preference +import org.dhis2.commons.viewmodel.DispatcherProvider +import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.commons.extensions.launchUseCase +import org.dhis2.mobile.commons.providers.PreferenceProvider +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.domain.SyncStatusController +import org.dhis2.mobile.sync.model.SyncStatusData +import org.dhis2.usescases.main.domain.CheckSingleNavigation +import org.dhis2.usescases.main.domain.ConfigureHomeNavigationBar +import org.dhis2.usescases.main.domain.DeleteAccount +import org.dhis2.usescases.main.domain.DownloadNewVersion +import org.dhis2.usescases.main.domain.GetHomeFilters +import org.dhis2.usescases.main.domain.GetLockAction +import org.dhis2.usescases.main.domain.GetUserName +import org.dhis2.usescases.main.domain.InitialSyncAction +import org.dhis2.usescases.main.domain.LaunchInitialSync +import org.dhis2.usescases.main.domain.LogoutUser +import org.dhis2.usescases.main.domain.ScheduleNewVersionAlert +import org.dhis2.usescases.main.domain.UpdateInitialSyncStatus +import org.dhis2.usescases.main.domain.model.DownloadMethod +import org.dhis2.usescases.main.domain.model.LockAction +import org.dhis2.usescases.main.ui.model.HomeAction +import org.dhis2.usescases.main.ui.model.HomeEffect +import org.dhis2.usescases.main.ui.model.HomeScreenState +import org.dhis2.usescases.main.ui.model.VersionToUpdateState +import org.dhis2.usescases.main.ui.model.defaultHomeScreenState +import org.dhis2.utils.analytics.CLOSE_SESSION +import org.hisp.dhis.android.core.organisationunit.OrganisationUnit +import timber.log.Timber + +class MainViewModel( + private val preferences: PreferenceProvider, + private val filterManager: FilterManager, + private val matomoAnalyticsController: MatomoAnalyticsController, + syncStatusController: SyncStatusController, + val mainNavigator: MainNavigator, + private val getUserName: GetUserName, + private val configureHomeNavigationBar: ConfigureHomeNavigationBar, + private val getHomeFilters: GetHomeFilters, + private val downloadNewVersion: DownloadNewVersion, + private val logOutUser: LogoutUser, + private val deleteAccount: DeleteAccount, + private val getLockAction: GetLockAction, + private val updateInitialSyncStatus: UpdateInitialSyncStatus, + private val checkSingleNavigation: CheckSingleNavigation, + private val launchInitialSync: LaunchInitialSync, + private val scheduleNewVersionAlert: ScheduleNewVersionAlert, + private val syncBackgroundJobAction: SyncBackgroundJobAction, + private val initialScreen: MainScreenType, + private val dispatcher: DispatcherProvider, +) : ViewModel() { + private val _homeScreenState = MutableStateFlow(defaultHomeScreenState) + + private val _homeEffects = Channel<HomeEffect>(Channel.BUFFERED) + val homeEffects = _homeEffects.receiveAsFlow() + + val homeScreenState = + _homeScreenState + .onStart { + loadData(initialScreen) + }.stateIn( + viewModelScope, + SharingStarted.WhileSubscribed(5000), + defaultHomeScreenState, + ) + + init { + + launchUseCase(dispatcher.io()) { + preferences.removeValue(Preference.CURRENT_ORG_UNIT) + } + + syncStatusController + .observeDownloadProcess() + .onEach(::handleDownloadProcess) + .launchIn(viewModelScope) + + scheduleNewVersionAlert.newVersionFlow + .onEach(::onNewVersionAvailable) + .launchIn(viewModelScope) + + filterManager + .asFlow(viewModelScope) + .onEach { + _homeScreenState.update { + it.copy(activeFilters = filterManager.totalFilters) + } + }.launchIn(viewModelScope) + + filterManager.periodRequest + .asFlow() + .onEach { + _homeEffects.send(HomeEffect.PeriodFilterRequest(it.first)) + }.launchIn(viewModelScope) + + filterManager + .ouTreeFlowable() + .asFlow() + .onEach { + _homeEffects.send(HomeEffect.OrgUnitFilterRequest) + }.launchIn(viewModelScope) + + launchUseCase(dispatcher.io()) { + launchInitialSync().fold( + onSuccess = ::handleInitialSyncResult, + onFailure = { + Timber.e(it) + }, + ) + } + } + + private fun handleInitialSyncResult(result: InitialSyncAction) { + when (result) { + InitialSyncAction.Skip -> shouldNavigateToSingleProgram() + InitialSyncAction.Syncing -> { + // Do nothing + } + } + } + + private fun onNewVersionAvailable(version: String?) { + _homeScreenState.update { + it.copy( + versionToUpdate = + when { + version.isNullOrEmpty() -> VersionToUpdateState.None + else -> VersionToUpdateState.New(version) + }, + ) + } + } + + private fun loadData(initialScreen: MainScreenType) { + launchUseCase(dispatcher.io()) { + val userName = getUserName().getOrDefault("") + val navigationBarItems = configureHomeNavigationBar().getOrDefault(emptyList()) + val homeFilters = getHomeFilters().getOrDefault(emptyList()) + + _homeScreenState.update { + HomeScreenState( + userName = userName, + navigationBarItems = navigationBarItems, + homeFilters = homeFilters, + activeFilters = filterManager.totalFilters, + versionToUpdate = VersionToUpdateState.None, + filterButtonVisible = initialScreen.isPrograms(), + bottomNavigationBarVisible = initialScreen.isHome() && navigationBarItems.size > 1, + syncButtonVisible = initialScreen.isHome(), + currentScreen = initialScreen, + ) + } + withContext(dispatcher.ui()) { + openScreen(initialScreen) + } + } + } + + private fun handleDownloadProcess(syncStatusData: SyncStatusData) { + when (syncStatusData.running) { + true -> + _homeScreenState.update { + it.copy( + filterButtonVisible = false, + bottomNavigationBarVisible = false, + syncButtonVisible = false, + ) + } + + false -> { + _homeScreenState.update { + it.copy( + filterButtonVisible = true, + bottomNavigationBarVisible = true, + syncButtonVisible = true, + ) + } + onDataSuccess() + if (syncStatusData.isInitialSync) { + shouldNavigateToSingleProgram() + } + } + + else -> { + // do nothing + } + } + } + + private fun shouldNavigateToSingleProgram() { + launchUseCase(dispatcher.io()) { + checkSingleNavigation().getOrNull()?.let { + _homeEffects.send(HomeEffect.SingleProgramNavigation(it)) + } + } + } + + fun setOrgUnitFilters(selectedOrgUnits: List<OrganisationUnit>) { + filterManager.addOrgUnits(selectedOrgUnits) + } + + fun logOut() { + launchUseCase(dispatcher.io()) { + matomoAnalyticsController.trackEvent(HOME, CLOSE_SESSION, CLICK) + logOutUser().fold( + onSuccess = { accountCount -> + _homeEffects.send(HomeEffect.GoToLogin(accountCount, false)) + }, + onFailure = { + Timber.e(it) + }, + ) + } + } + + context(context: Context) + fun onDeleteAccount() { + launchUseCase(dispatcher.io()) { + _homeEffects.send(HomeEffect.ShowDeleteNotification) + deleteAccount(context.cacheDir).fold( + onSuccess = { accountCount -> + syncBackgroundJobAction.cancelAll() + _homeEffects.send(HomeEffect.GoToLogin(accountCount, true)) + }, + onFailure = { + Timber.e(it) + }, + ) + } + } + + private fun onSyncAllClick() { + launchUseCase(dispatcher.io()) { + _homeEffects.send(HomeEffect.ShowGranularSync) + } + } + + private fun showFilter() { + launchUseCase(dispatcher.io()) { + _homeEffects.send(HomeEffect.ToggleFilters) + _homeScreenState.update { + it.copy( + bottomNavigationBarVisible = !it.bottomNavigationBarVisible && it.currentScreen.isHome() && it.navigationBarItems.size > 1, + ) + } + } + } + + private fun onMenuClick() { + launchUseCase(dispatcher.io()) { + _homeEffects.send(HomeEffect.ToggleSideMenu) + } + } + + fun onDataSuccess() { + launchUseCase(dispatcher.io()) { + updateInitialSyncStatus().fold( + onSuccess = { + // Do nothing + }, + onFailure = { + Timber.e(it) + }, + ) + } + } + + fun onBlockSession() { + launchUseCase(dispatcher.io()) { + getLockAction().fold( + onSuccess = { result -> + when (result) { + LockAction.BlockSession -> + _homeEffects.send(HomeEffect.BlockSession) + + LockAction.CreatePin -> + _homeEffects.send(HomeEffect.ShowPinDialog) + } + }, + onFailure = { Timber.e(it) }, + ) + } + matomoAnalyticsController.trackEvent(HOME, BLOCK_SESSION_PIN, CLICK) + } + + fun remindLaterAlertNewVersion() { + _homeScreenState.update { + it.copy( + versionToUpdate = VersionToUpdateState.None, + ) + } + launchUseCase(dispatcher.io()) { + scheduleNewVersionAlert() + } + } + + context(context: Context) + fun downloadVersion( + onDownloadCompleted: (Uri) -> Unit, + onLaunchUrl: (Uri) -> Unit, + ) { + launchUseCase(dispatcher.io()) { + _homeScreenState.update { + it.copy( + versionToUpdate = VersionToUpdateState.Downloading, + ) + } + downloadNewVersion(context).fold( + onSuccess = { result -> + when (result) { + is DownloadMethod.File -> onDownloadCompleted(result.path.toUri()) + is DownloadMethod.Url -> onLaunchUrl(result.url.toUri()) + } + _homeScreenState.update { + it.copy( + versionToUpdate = VersionToUpdateState.None, + ) + } + }, + onFailure = Timber::e, + ) + } + } + + private fun onBackPressed() { + if (!_homeScreenState.value.currentScreen.isHome()) { + navigateToScreen(mainNavigator.openHome()) + } else { + launchUseCase { _homeEffects.send(HomeEffect.BlockSession) } + } + } + + fun onChangeToHome() { + navigateToScreen(mainNavigator.openHome()) + } + + fun updateNavigationBarVisibility(bottomNavigationBarIsVisible: Boolean) { + launchUseCase(dispatcher.io()) { + _homeScreenState.update { + it.copy(bottomNavigationBarVisible = bottomNavigationBarIsVisible && it.currentScreen.isHome() && it.navigationBarItems.size > 1) + } + } + } + + fun onChangeScreen(screenToOpen: MainScreenType) { + navigateToScreen(screenToOpen) + } + + private fun navigateToScreen(screenToOpen: MainScreenType) { + if (_homeScreenState.value.currentScreen == screenToOpen) return + _homeScreenState.update { + it.copy( + filterButtonVisible = screenToOpen.isPrograms(), + bottomNavigationBarVisible = screenToOpen.isHome() && it.navigationBarItems.size > 1, + syncButtonVisible = screenToOpen.isHome(), + currentScreen = screenToOpen, + ) + } + openScreen(screenToOpen) + } + + private fun openScreen(screenToOpen: MainScreenType) { + when (screenToOpen) { + MainScreenType.About -> mainNavigator.openAbout() + is MainScreenType.Home -> { + when (screenToOpen.homeScreen) { + HomeScreen.Programs -> + mainNavigator.openPrograms() + + HomeScreen.Visualizations -> { + matomoAnalyticsController.trackEvent(HOME, OPEN_ANALYTICS, CLICK) + mainNavigator.openVisualizations() + } + } + } + + MainScreenType.Loading -> { + /*no-op*/ + } + + MainScreenType.QRScanner -> { + matomoAnalyticsController.trackEvent(HOME, QR_SCANNER, CLICK) + mainNavigator.openQR() + } + + MainScreenType.Settings -> { + matomoAnalyticsController.trackEvent(HOME, SETTINGS, CLICK) + mainNavigator.openSettings() + } + + MainScreenType.TroubleShooting -> + mainNavigator.openTroubleShooting() + + } + } + + fun refreshCurrentScreen() { + openScreen(_homeScreenState.value.currentScreen) + } + + fun onGranularSyncFinished(hasChanged: Boolean) { + launchUseCase(dispatcher.io()) { + if (hasChanged) { + mainNavigator.getCurrentIfProgram()?.programViewModel?.updateProgramQueries() + } + } + } + + private fun onPinSet() { + launchUseCase(dispatcher.io()) { + _homeEffects.send(HomeEffect.BlockSession) + } + } + + fun onAction(action: HomeAction) { + when (action) { + HomeAction.BackPressed -> onBackPressed() + HomeAction.MenuClicked -> onMenuClick() + HomeAction.SyncClicked -> onSyncAllClick() + HomeAction.FilterClicked -> showFilter() + is HomeAction.ScreenChanged -> onChangeScreen(action.screen) + HomeAction.PinSet -> onPinSet() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/org/dhis2/usescases/main/data/HomeRepository.kt b/app/src/main/java/org/dhis2/usescases/main/data/HomeRepository.kt index f9740fb75ec..3b13b4ecc97 100644 --- a/app/src/main/java/org/dhis2/usescases/main/data/HomeRepository.kt +++ b/app/src/main/java/org/dhis2/usescases/main/data/HomeRepository.kt @@ -7,9 +7,9 @@ import java.io.File interface HomeRepository { suspend fun user(): User? - suspend fun logOut() + suspend fun logOut(): Result<Unit> - suspend fun clearPin() + suspend fun clearPin(): Result<Unit> suspend fun hasHomeAnalytics(): Boolean @@ -34,4 +34,8 @@ interface HomeRepository { suspend fun getInitialSyncDone(): Boolean suspend fun isImportedDb(): Boolean + + suspend fun stopBackgroundSync() + + suspend fun restoreSyncStatus() } diff --git a/app/src/main/java/org/dhis2/usescases/main/data/HomeRepositoryImpl.kt b/app/src/main/java/org/dhis2/usescases/main/data/HomeRepositoryImpl.kt index 09203ab805e..eb521b6fb4b 100644 --- a/app/src/main/java/org/dhis2/usescases/main/data/HomeRepositoryImpl.kt +++ b/app/src/main/java/org/dhis2/usescases/main/data/HomeRepositoryImpl.kt @@ -8,9 +8,11 @@ import org.dhis2.commons.bindings.isStockProgram import org.dhis2.commons.bindings.programs import org.dhis2.commons.prefs.Preference import org.dhis2.commons.prefs.Preference.Companion.PIN +import org.dhis2.data.service.workManager.WorkManagerController import org.dhis2.mobile.commons.coroutine.Dispatcher import org.dhis2.mobile.commons.error.DomainErrorMapper import org.dhis2.mobile.commons.providers.PreferenceProvider +import org.dhis2.mobile.sync.domain.SyncStatusController import org.dhis2.usescases.main.HomeItemData import org.dhis2.usescases.settings.deleteCache import org.dhis2.usescases.sync.WAS_INITIAL_SYNC_DONE @@ -26,6 +28,8 @@ class HomeRepositoryImpl( private val d2: D2, private val charts: Charts?, private val preferences: PreferenceProvider, + private val workManagerController: WorkManagerController, + private val syncStatusController: SyncStatusController, private val domainErrorMapper: DomainErrorMapper, private val dispatcher: Dispatcher, ) : HomeRepository { @@ -89,6 +93,7 @@ class HomeRepositoryImpl( override suspend fun logOut() = execute { d2.userModule().blockingLogOut() + Result.success(Unit) } override suspend fun clearPin() = @@ -99,6 +104,7 @@ class HomeRepositoryImpl( .localDataStore() .value(PIN) .blockingDeleteIfExist() + Result.success(Unit) } override suspend fun hasHomeAnalytics(): Boolean = @@ -187,4 +193,13 @@ class HomeRepositoryImpl( .accountManager() .deleteCurrentAccount() } + + override suspend fun stopBackgroundSync() { + workManagerController.cancelAllWorkAndWait() + workManagerController.pruneWork() + } + + override suspend fun restoreSyncStatus() { + syncStatusController.restore() + } } diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/CheckSingleNavigation.kt b/app/src/main/java/org/dhis2/usescases/main/domain/CheckSingleNavigation.kt new file mode 100644 index 00000000000..a3e066abb70 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/domain/CheckSingleNavigation.kt @@ -0,0 +1,22 @@ +package org.dhis2.usescases.main.domain + +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.HomeItemData +import org.dhis2.usescases.main.data.HomeRepository + +class CheckSingleNavigation( + private val homeRepository: HomeRepository, +) : UseCase<Unit, HomeItemData> { + override suspend fun invoke(input: Unit): Result<HomeItemData> = + try { + val homeItemCount = homeRepository.homeItemCount() + if (homeItemCount == 1) { + Result.success(homeRepository.singleHomeItemData()) + } else { + Result.failure(DomainError.ConfigurationError("Expected exactly one home item")) + } + } catch (domainError: DomainError) { + Result.failure(domainError) + } +} diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/ConfigureHomeNavigationBar.kt b/app/src/main/java/org/dhis2/usescases/main/domain/ConfigureHomeNavigationBar.kt new file mode 100644 index 00000000000..ebd125de769 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/domain/ConfigureHomeNavigationBar.kt @@ -0,0 +1,51 @@ +package org.dhis2.usescases.main.domain + +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.BarChart +import org.dhis2.R +import org.dhis2.commons.resources.ResourceManager +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.data.HomeRepository +import org.dhis2.usescases.main.ui.Form +import org.dhis2.utils.customviews.navigationbar.NavigationPage +import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarItem + +class ConfigureHomeNavigationBar( + private val homeRepository: HomeRepository, + private val resourceManager: ResourceManager, +) : UseCase<Unit, List<NavigationBarItem<NavigationPage>>> { + override suspend operator fun invoke(input: Unit) = + try { + val list = + buildList { + add( + NavigationBarItem( + id = NavigationPage.PROGRAMS, + icon = Icons.Filled.Form, + label = resourceManager.getString(R.string.navigation_programs), + ) + ) + if (homeRepository.hasHomeAnalytics()) { + add( + NavigationBarItem( + id = NavigationPage.ANALYTICS, + icon = Icons.Filled.BarChart, + label = resourceManager.getString(R.string.navigation_charts), + ) + ) + } + } + Result.success(list) + } catch (_: DomainError) { + Result.success( + listOf( + NavigationBarItem( + id = NavigationPage.PROGRAMS, + icon = Icons.Filled.Form, + label = resourceManager.getString(R.string.navigation_programs), + ) + ) + ) + } +} diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/DeleteAccount.kt b/app/src/main/java/org/dhis2/usescases/main/domain/DeleteAccount.kt new file mode 100644 index 00000000000..c8f6eb9df43 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/domain/DeleteAccount.kt @@ -0,0 +1,25 @@ +package org.dhis2.usescases.main.domain + +import org.dhis2.commons.filters.FilterManager +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.data.HomeRepository +import java.io.File + +class DeleteAccount( + private val filterManager: FilterManager, + private val repository: HomeRepository, +) : UseCase<File?, AccountCount> { + override suspend fun invoke(input: File?): Result<AccountCount> = + try { + filterManager.clearAllFilters() + input?.let { repository.clearCache(it) } + repository.clearPreferences() + repository.wipeAll() + repository.deleteCurrentAccount() + val accountCount = repository.accountsCount() + Result.success(accountCount) + } catch (domainError: DomainError) { + Result.failure(domainError) + } +} diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/GetHomeFilters.kt b/app/src/main/java/org/dhis2/usescases/main/domain/GetHomeFilters.kt new file mode 100644 index 00000000000..ac75779773d --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/domain/GetHomeFilters.kt @@ -0,0 +1,17 @@ +package org.dhis2.usescases.main.domain + +import org.dhis2.commons.filters.FilterItem +import org.dhis2.commons.filters.data.FilterRepository +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError + +class GetHomeFilters( + private val filterRepository: FilterRepository, +) : UseCase<Unit, List<FilterItem>> { + override suspend fun invoke(input: Unit): Result<List<FilterItem>> = + try { + Result.success(filterRepository.homeFilters()) + } catch (domainError: DomainError) { + Result.failure(domainError) + } +} diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/GetLockAction.kt b/app/src/main/java/org/dhis2/usescases/main/domain/GetLockAction.kt new file mode 100644 index 00000000000..002a6ffa476 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/domain/GetLockAction.kt @@ -0,0 +1,22 @@ +package org.dhis2.usescases.main.domain + +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.data.HomeRepository +import org.dhis2.usescases.main.domain.model.LockAction + +class GetLockAction( + private val repository: HomeRepository, +) : UseCase<Unit, LockAction> { + override suspend fun invoke(input: Unit): Result<LockAction> = + try { + val isPinSet = repository.isPinStored() + if (isPinSet) { + Result.success(LockAction.BlockSession) + } else { + Result.success(LockAction.CreatePin) + } + } catch (domainError: DomainError) { + Result.failure(domainError) + } +} diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/GetUserName.kt b/app/src/main/java/org/dhis2/usescases/main/domain/GetUserName.kt new file mode 100644 index 00000000000..064ee7c7722 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/domain/GetUserName.kt @@ -0,0 +1,20 @@ +package org.dhis2.usescases.main.domain + +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.data.HomeRepository + +class GetUserName( + private val homeRepository: HomeRepository, +) : UseCase<Unit, String> { + override suspend operator fun invoke(input: Unit) = + try { + val user = homeRepository.user() + val firstName = user?.firstName() + val surname = user?.surname() + val userName = listOfNotNull(firstName, surname).joinToString(" ") + Result.success(userName) + } catch (domainError: DomainError) { + Result.failure(domainError) + } +} diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/LaunchInitialSync.kt b/app/src/main/java/org/dhis2/usescases/main/domain/LaunchInitialSync.kt new file mode 100644 index 00000000000..886d645c9ff --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/domain/LaunchInitialSync.kt @@ -0,0 +1,33 @@ +package org.dhis2.usescases.main.domain + +import org.dhis2.data.service.VersionRepository +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.usescases.main.data.HomeRepository + +class LaunchInitialSync( + private val skipSync: Boolean, + private val homeRepository: HomeRepository, + private val versionRepository: VersionRepository, + private val syncBackgroundJobAction: SyncBackgroundJobAction, +) : UseCase<Unit, InitialSyncAction> { + override suspend fun invoke(input: Unit): Result<InitialSyncAction> = + try { + if (skipSync || homeRepository.isImportedDb() || homeRepository.getInitialSyncDone()) { + Result.success(InitialSyncAction.Skip) + } else { + versionRepository.checkVersionUpdates() + syncBackgroundJobAction.launchDataSync(0) + Result.success(InitialSyncAction.Syncing) + } + } catch (domainError: DomainError) { + Result.failure(domainError) + } +} + +sealed interface InitialSyncAction { + data object Skip : InitialSyncAction + + data object Syncing : InitialSyncAction +} diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/LogoutUser.kt b/app/src/main/java/org/dhis2/usescases/main/domain/LogoutUser.kt index a54b2277973..b9243b956f5 100644 --- a/app/src/main/java/org/dhis2/usescases/main/domain/LogoutUser.kt +++ b/app/src/main/java/org/dhis2/usescases/main/domain/LogoutUser.kt @@ -1,25 +1,26 @@ package org.dhis2.usescases.main.domain import org.dhis2.commons.filters.FilterManager -import org.dhis2.data.service.SyncStatusController -import org.dhis2.data.service.workManager.WorkManagerController -import org.dhis2.usescases.main.HomeRepository +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.domain.SyncStatusController +import org.dhis2.usescases.main.data.HomeRepository typealias AccountCount = Int class LogoutUser( private val repository: HomeRepository, - private val workManagerController: WorkManagerController, + private val syncBackgroundJobAction: SyncBackgroundJobAction, private val syncStatusController: SyncStatusController, private val filterManager: FilterManager, -) { - suspend operator fun invoke(): Result<AccountCount> { - workManagerController.cancelAllWorkAndWait() +) : UseCase<Unit, AccountCount> { + override suspend operator fun invoke(input: Unit): Result<AccountCount> { + syncBackgroundJobAction.cancelAll() syncStatusController.restore() filterManager.clearAllFilters() repository - .clearSessionLock() + .clearPin() .onFailure { return Result.failure(it) } repository diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/ScheduleNewVersionAlert.kt b/app/src/main/java/org/dhis2/usescases/main/domain/ScheduleNewVersionAlert.kt new file mode 100644 index 00000000000..213c1000fac --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/domain/ScheduleNewVersionAlert.kt @@ -0,0 +1,35 @@ +package org.dhis2.usescases.main.domain + +import androidx.work.ExistingWorkPolicy +import org.dhis2.commons.Constants +import org.dhis2.data.service.VersionRepository +import org.dhis2.data.service.workManager.WorkManagerController +import org.dhis2.data.service.workManager.WorkerItem +import org.dhis2.data.service.workManager.WorkerType +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import kotlin.time.Duration.Companion.days + +class ScheduleNewVersionAlert( + private val workManagerController: WorkManagerController, + private val versionRepository: VersionRepository, +) : UseCase<Unit, Unit> { + + val newVersionFlow = versionRepository.newAppVersion + + override suspend fun invoke(input: Unit): Result<Unit> = + try { + val workerItem = + WorkerItem( + Constants.NEW_APP_VERSION, + WorkerType.NEW_VERSION, + delayInSeconds = 1.days.inWholeSeconds, + policy = ExistingWorkPolicy.REPLACE, + ) + workManagerController.beginUniqueWork(workerItem) + versionRepository.removeVersionInfo() + Result.success(Unit) + } catch (domainError: DomainError) { + Result.failure(domainError) + } +} diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/UpdateInitialSyncStatus.kt b/app/src/main/java/org/dhis2/usescases/main/domain/UpdateInitialSyncStatus.kt new file mode 100644 index 00000000000..c62d756a229 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/domain/UpdateInitialSyncStatus.kt @@ -0,0 +1,17 @@ +package org.dhis2.usescases.main.domain + +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.data.HomeRepository + +class UpdateInitialSyncStatus( + val repository: HomeRepository, +) : UseCase<Unit, Unit> { + override suspend fun invoke(input: Unit): Result<Unit> = + try { + repository.setInitialSyncDone() + Result.success(Unit) + } catch (domainError: DomainError) { + Result.failure(domainError) + } +} diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/model/BottomNavigationItem.kt b/app/src/main/java/org/dhis2/usescases/main/domain/model/BottomNavigationItem.kt new file mode 100644 index 00000000000..43b4696c439 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/domain/model/BottomNavigationItem.kt @@ -0,0 +1,7 @@ +package org.dhis2.usescases.main.domain.model + +sealed interface BottomNavigationItem { + data object Program : BottomNavigationItem + + data object Analytics : BottomNavigationItem +} diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/model/DownloadMethod.kt b/app/src/main/java/org/dhis2/usescases/main/domain/model/DownloadMethod.kt new file mode 100644 index 00000000000..c28de7abf9c --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/domain/model/DownloadMethod.kt @@ -0,0 +1,11 @@ +package org.dhis2.usescases.main.domain.model + +sealed interface DownloadMethod { + data class Url( + val url: String, + ) : DownloadMethod + + data class File( + val path: String, + ) : DownloadMethod +} diff --git a/app/src/main/java/org/dhis2/usescases/main/domain/model/LockAction.kt b/app/src/main/java/org/dhis2/usescases/main/domain/model/LockAction.kt new file mode 100644 index 00000000000..01df14106f6 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/domain/model/LockAction.kt @@ -0,0 +1,7 @@ +package org.dhis2.usescases.main.domain.model + +sealed interface LockAction { + data object CreatePin : LockAction + + data object BlockSession : LockAction +} diff --git a/app/src/main/java/org/dhis2/usescases/main/program/ProgramFragment.kt b/app/src/main/java/org/dhis2/usescases/main/program/ProgramFragment.kt index 9b3511c0f0b..6340a06b260 100644 --- a/app/src/main/java/org/dhis2/usescases/main/program/ProgramFragment.kt +++ b/app/src/main/java/org/dhis2/usescases/main/program/ProgramFragment.kt @@ -21,6 +21,7 @@ import org.dhis2.App import org.dhis2.R import org.dhis2.commons.sync.OnDismissListener import org.dhis2.commons.sync.SyncContext +import org.dhis2.mobile.sync.domain.SyncStatusController import org.dhis2.usescases.general.FragmentGlobalAbstract import org.dhis2.usescases.main.navigateTo import org.dhis2.usescases.main.toHomeItemData @@ -28,12 +29,15 @@ import org.dhis2.utils.HelpManager import org.dhis2.utils.analytics.SELECT_PROGRAM import org.dhis2.utils.analytics.TYPE_PROGRAM_SELECTED import org.dhis2.utils.granularsync.SyncStatusDialog +import org.koin.android.ext.android.inject import timber.log.Timber import javax.inject.Inject class ProgramFragment : FragmentGlobalAbstract(), ProgramView { + private val syncStatusController: SyncStatusController by inject() + @Inject lateinit var programViewModelFactory: ProgramViewModelFactory @@ -51,7 +55,10 @@ class ProgramFragment : override fun onAttach(context: Context) { super.onAttach(context) activity?.let { - (it.applicationContext as App).userComponent()?.plus(ProgramModule(this))?.inject(this) + (it.applicationContext as App) + .userComponent() + ?.plus(ProgramModule(this, syncStatusController)) + ?.inject(this) } } diff --git a/app/src/main/java/org/dhis2/usescases/main/program/ProgramModule.kt b/app/src/main/java/org/dhis2/usescases/main/program/ProgramModule.kt index f69e5d56660..72536aa84bd 100644 --- a/app/src/main/java/org/dhis2/usescases/main/program/ProgramModule.kt +++ b/app/src/main/java/org/dhis2/usescases/main/program/ProgramModule.kt @@ -13,12 +13,13 @@ import org.dhis2.commons.resources.ResourceManager import org.dhis2.commons.schedulers.SchedulerProvider import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.dhislogic.DhisProgramUtils -import org.dhis2.data.service.SyncStatusController +import org.dhis2.mobile.sync.domain.SyncStatusController import org.hisp.dhis.android.core.D2 @Module class ProgramModule( private val view: ProgramView, + private val syncStatusController: SyncStatusController, ) { @Provides @PerFragment @@ -28,7 +29,6 @@ class ProgramModule( featureConfigRepository: FeatureConfigRepository, matomoAnalyticsController: MatomoAnalyticsController, filterManager: FilterManager, - syncStatusController: SyncStatusController, schedulerProvider: SchedulerProvider, ): ProgramViewModelFactory = ProgramViewModelFactory( diff --git a/app/src/main/java/org/dhis2/usescases/main/program/ProgramRepository.kt b/app/src/main/java/org/dhis2/usescases/main/program/ProgramRepository.kt index 8070022df75..e670e95e689 100644 --- a/app/src/main/java/org/dhis2/usescases/main/program/ProgramRepository.kt +++ b/app/src/main/java/org/dhis2/usescases/main/program/ProgramRepository.kt @@ -1,7 +1,7 @@ package org.dhis2.usescases.main.program import io.reactivex.Flowable -import org.dhis2.data.service.SyncStatusData +import org.dhis2.mobile.sync.model.SyncStatusData interface ProgramRepository { fun homeItems(syncStatusData: SyncStatusData): Flowable<List<ProgramUiModel>> diff --git a/app/src/main/java/org/dhis2/usescases/main/program/ProgramRepositoryImpl.kt b/app/src/main/java/org/dhis2/usescases/main/program/ProgramRepositoryImpl.kt index 7f1d6ed5119..fb87f283a06 100644 --- a/app/src/main/java/org/dhis2/usescases/main/program/ProgramRepositoryImpl.kt +++ b/app/src/main/java/org/dhis2/usescases/main/program/ProgramRepositoryImpl.kt @@ -8,7 +8,7 @@ import org.dhis2.commons.resources.MetadataIconProvider import org.dhis2.commons.resources.ResourceManager import org.dhis2.commons.schedulers.SchedulerProvider import org.dhis2.data.dhislogic.DhisProgramUtils -import org.dhis2.data.service.SyncStatusData +import org.dhis2.mobile.sync.model.SyncStatusData import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.program.Program @@ -178,7 +178,7 @@ internal class ProgramRepositoryImpl( private fun getTrackerTeiCount(program: Program): Int { val teiIds = filterPresenter - .filteredTrackerProgram(program) + .filteredTrackerProgram(program.uid()) .offlineFirst() .blockingGetUids() val teiCount = teiIds.size diff --git a/app/src/main/java/org/dhis2/usescases/main/program/ProgramUi.kt b/app/src/main/java/org/dhis2/usescases/main/program/ProgramUi.kt index 65e761d05d2..bbfcca25910 100644 --- a/app/src/main/java/org/dhis2/usescases/main/program/ProgramUi.kt +++ b/app/src/main/java/org/dhis2/usescases/main/program/ProgramUi.kt @@ -57,9 +57,9 @@ import org.dhis2.R import org.dhis2.commons.bindings.addIf import org.dhis2.commons.date.toDateSpan import org.dhis2.commons.ui.icons.toIconData -import org.dhis2.data.service.SyncStatusData import org.dhis2.mobile.commons.extensions.toColorInt import org.dhis2.mobile.commons.model.MetadataIconData +import org.dhis2.mobile.sync.model.SyncStatusData import org.hisp.dhis.android.core.common.State import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItem import org.hisp.dhis.mobile.ui.designsystem.component.Avatar diff --git a/app/src/main/java/org/dhis2/usescases/main/program/ProgramViewModel.kt b/app/src/main/java/org/dhis2/usescases/main/program/ProgramViewModel.kt index 007acb62cf5..cc0ccd829d6 100644 --- a/app/src/main/java/org/dhis2/usescases/main/program/ProgramViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/main/program/ProgramViewModel.kt @@ -18,7 +18,8 @@ import org.dhis2.commons.matomo.Labels.Companion.CLICK_ON import org.dhis2.commons.matomo.MatomoAnalyticsController import org.dhis2.commons.schedulers.SchedulerProvider import org.dhis2.commons.viewmodel.DispatcherProvider -import org.dhis2.data.service.SyncStatusController +import org.dhis2.mobile.sync.domain.SyncStatusController +import org.koin.core.component.KoinComponent import timber.log.Timber import java.util.concurrent.TimeUnit @@ -31,7 +32,8 @@ class ProgramViewModel internal constructor( private val filterManager: FilterManager, private val syncStatusController: SyncStatusController, private val schedulerProvider: SchedulerProvider, -) : ViewModel() { +) : ViewModel(), + KoinComponent { private val _programs = MutableLiveData<List<ProgramUiModel>>() val programs: LiveData<List<ProgramUiModel>> = _programs private val refreshData = PublishProcessor.create<Unit>() diff --git a/app/src/main/java/org/dhis2/usescases/main/program/ProgramViewModelFactory.kt b/app/src/main/java/org/dhis2/usescases/main/program/ProgramViewModelFactory.kt index 1ac164a3b1c..e3b2f78c0ad 100644 --- a/app/src/main/java/org/dhis2/usescases/main/program/ProgramViewModelFactory.kt +++ b/app/src/main/java/org/dhis2/usescases/main/program/ProgramViewModelFactory.kt @@ -7,7 +7,7 @@ import org.dhis2.commons.filters.FilterManager import org.dhis2.commons.matomo.MatomoAnalyticsController import org.dhis2.commons.schedulers.SchedulerProvider import org.dhis2.commons.viewmodel.DispatcherProvider -import org.dhis2.data.service.SyncStatusController +import org.dhis2.mobile.sync.domain.SyncStatusController class ProgramViewModelFactory( private val view: ProgramView, diff --git a/app/src/main/java/org/dhis2/usescases/main/ui/model/HomeAction.kt b/app/src/main/java/org/dhis2/usescases/main/ui/model/HomeAction.kt new file mode 100644 index 00000000000..a21ea33e4be --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/ui/model/HomeAction.kt @@ -0,0 +1,15 @@ +package org.dhis2.usescases.main.ui.model + +import org.dhis2.usescases.main.MainScreenType + +/** + * Actions sent to the ViewModel from the UI. + */ +sealed interface HomeAction { + data object BackPressed : HomeAction + data object MenuClicked : HomeAction + data object SyncClicked : HomeAction + data object FilterClicked : HomeAction + data class ScreenChanged(val screen: MainScreenType) : HomeAction + data object PinSet : HomeAction +} diff --git a/app/src/main/java/org/dhis2/usescases/main/ui/model/HomeEffect.kt b/app/src/main/java/org/dhis2/usescases/main/ui/model/HomeEffect.kt new file mode 100644 index 00000000000..0830de90c0f --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/ui/model/HomeEffect.kt @@ -0,0 +1,36 @@ +package org.dhis2.usescases.main.ui.model + +import org.dhis2.commons.filters.FilterManager +import org.dhis2.usescases.main.HomeItemData + +/** + * Effects generated by the ViewModel and sent to the UI. + */ +sealed interface HomeEffect { + data class SingleProgramNavigation( + val homeItemData: HomeItemData, + ) : HomeEffect + + data class GoToLogin( + val accountsCount: Int, + val isDeletion: Boolean, + ) : HomeEffect + + data object ShowDeleteNotification : HomeEffect + + data object ShowGranularSync : HomeEffect + + data object BlockSession : HomeEffect + + data object ShowPinDialog : HomeEffect + + data class PeriodFilterRequest( + val periodRequest: FilterManager.PeriodRequest, + ) : HomeEffect + + data object OrgUnitFilterRequest : HomeEffect + + data object ToggleSideMenu : HomeEffect + + data object ToggleFilters : HomeEffect +} diff --git a/app/src/main/java/org/dhis2/usescases/main/ui/model/HomeScreenState.kt b/app/src/main/java/org/dhis2/usescases/main/ui/model/HomeScreenState.kt new file mode 100644 index 00000000000..9be1e1b0f42 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/ui/model/HomeScreenState.kt @@ -0,0 +1,43 @@ +package org.dhis2.usescases.main.ui.model + +import androidx.compose.runtime.Stable +import org.dhis2.commons.filters.FilterItem +import org.dhis2.usescases.main.MainScreenType +import org.dhis2.utils.customviews.navigationbar.NavigationPage +import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarItem + +@Stable +data class HomeScreenState( + val userName: String, + val navigationBarItems: List<NavigationBarItem<NavigationPage>>, + val homeFilters: List<FilterItem>, + val activeFilters: Int, + val versionToUpdate: VersionToUpdateState, + val filterButtonVisible: Boolean, + val bottomNavigationBarVisible: Boolean, + val syncButtonVisible: Boolean, + val currentScreen: MainScreenType, +) + +val defaultHomeScreenState = + HomeScreenState( + userName = "", + navigationBarItems = emptyList(), + homeFilters = emptyList(), + activeFilters = 0, + versionToUpdate = VersionToUpdateState.None, + filterButtonVisible = false, + bottomNavigationBarVisible = false, + syncButtonVisible = false, + currentScreen = MainScreenType.Loading, + ) + +sealed class VersionToUpdateState { + data object None : VersionToUpdateState() + + data class New( + val version: String, + ) : VersionToUpdateState() + + data object Downloading : VersionToUpdateState() +} diff --git a/app/src/main/java/org/dhis2/usescases/main/ui/screens/MainScreen.kt b/app/src/main/java/org/dhis2/usescases/main/ui/screens/MainScreen.kt new file mode 100644 index 00000000000..e2932bef505 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/main/ui/screens/MainScreen.kt @@ -0,0 +1,232 @@ +package org.dhis2.usescases.main.ui.screens + +import android.view.LayoutInflater +import androidx.activity.compose.BackHandler +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Menu +import androidx.compose.material.icons.filled.Sync +import androidx.compose.material3.BadgedBox +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.viewinterop.AndroidView +import kotlinx.coroutines.flow.Flow +import org.dhis2.R +import org.dhis2.databinding.ActivityMainBinding +import org.dhis2.mobile.commons.extensions.ObserveAsEvents +import org.dhis2.mobile.login.pin.domain.model.PinMode +import org.dhis2.mobile.login.pin.ui.components.PinDialog +import org.dhis2.usescases.main.HomeScreen +import org.dhis2.usescases.main.MainScreenType +import org.dhis2.usescases.main.ui.model.HomeAction +import org.dhis2.usescases.main.ui.model.HomeEffect +import org.dhis2.usescases.main.ui.model.HomeScreenState +import org.dhis2.utils.customviews.navigationbar.NavigationPage +import org.dhis2.utils.getOnToolbarColor +import org.dhis2.utils.getThemePrimaryColor +import org.hisp.dhis.mobile.ui.designsystem.component.Badge +import org.hisp.dhis.mobile.ui.designsystem.component.IconButton +import org.hisp.dhis.mobile.ui.designsystem.component.TopBar +import org.hisp.dhis.mobile.ui.designsystem.component.TopBarActionIcon +import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBar + +@Composable +fun MainScreen( + screenState: HomeScreenState, + effects: Flow<HomeEffect>, + onAction: (HomeAction) -> Unit, + onEffect: (HomeEffect) -> Unit, + onNewState: (HomeScreenState) -> Unit, + onNewScreen: (MainScreenType) -> Unit, + onLayoutInflated: (ActivityMainBinding) -> Unit, +) { + var showPinDialog by remember { mutableStateOf(false) } + + BackHandler { onAction(HomeAction.BackPressed) } + + ObserveAsEvents(effects) { effect -> + if (effect is HomeEffect.ShowPinDialog) { + showPinDialog = true + } else { + onEffect(effect) + } + } + + LaunchedEffect(screenState) { + onNewState(screenState) + } + LaunchedEffect(screenState.currentScreen) { + onNewScreen(screenState.currentScreen) + } + + Scaffold( + topBar = { + HomeTopBar( + screenState = screenState, + onMenuClicked = { onAction(HomeAction.MenuClicked) }, + onSyncClicked = { onAction(HomeAction.SyncClicked) }, + onFilterClicked = { onAction(HomeAction.FilterClicked) }, + ) + }, + bottomBar = { + if (screenState.bottomNavigationBarVisible) { + HomeBottomBar(screenState) { navigationPage -> + when (navigationPage) { + NavigationPage.ANALYTICS -> onAction(HomeAction.ScreenChanged(MainScreenType.Home(HomeScreen.Visualizations))) + NavigationPage.PROGRAMS -> onAction(HomeAction.ScreenChanged(MainScreenType.Home(HomeScreen.Programs))) + else -> { /*no op*/ } + } + } + } + }, + ) { paddingValues -> + AndroidView( + modifier = Modifier + .fillMaxSize() + .padding(paddingValues), + factory = { context -> + ActivityMainBinding + .inflate(LayoutInflater.from(context)) + .also { onLayoutInflated(it) } + .root + }, + ) + if (showPinDialog) { + PinDialog( + mode = PinMode.SET, + onSuccess = { + onAction(HomeAction.PinSet) + showPinDialog = false + }, + onDismiss = { showPinDialog = false }, + ) + } + } +} + +@Composable +fun HomeTopBar( + screenState: HomeScreenState, + onMenuClicked: () -> Unit, + onSyncClicked: () -> Unit, + onFilterClicked: () -> Unit, +) { + val primaryColor = getThemePrimaryColor() + val onToolbarColor = getOnToolbarColor() + TopBar( + navigationIcon = { + TopBarActionIcon( + icon = Icons.Filled.Menu, + tint = onToolbarColor, + contentDescription = "menu", + onClick = onMenuClicked, + ) + }, + actions = { + AnimatedVisibility(visible = screenState.syncButtonVisible) { + IconButton( + onClick = onSyncClicked, + icon = { + Icon( + imageVector = Icons.Filled.Sync, + contentDescription = "Sync", + tint = onToolbarColor, + ) + }, + ) + } + AnimatedVisibility( + visible = screenState.filterButtonVisible && screenState.homeFilters.isNotEmpty(), + ) { + IconButton( + onClick = onFilterClicked, + icon = { + BadgedBox( + badge = { + if (screenState.activeFilters > 0) { + Badge( + text = "${screenState.activeFilters}", + color = onToolbarColor, + textColor = primaryColor, + ) + } + }, + ) { + Icon( + painter = painterResource(R.drawable.ic_filter), + contentDescription = "Filters", + tint = onToolbarColor, + ) + } + }, + ) + } + }, + title = { + when (screenState.currentScreen) { + MainScreenType.About -> R.string.about + is MainScreenType.Home -> R.string.done_task + MainScreenType.Loading -> null + MainScreenType.QRScanner -> R.string.QR_SCANNER + MainScreenType.Settings -> R.string.SYNC_MANAGER + MainScreenType.TroubleShooting -> R.string.main_menu_troubleshooting + }?.let { titleId -> + Text( + text = stringResource(titleId), + color = onToolbarColor, + style = MaterialTheme.typography.titleLarge, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + } + }, + colors = TopAppBarDefaults.topAppBarColors().copy( + containerColor = primaryColor, + titleContentColor = onToolbarColor, + ), + ) +} + +@Composable +fun HomeBottomBar( + homeScreenState: HomeScreenState, + onNavigationSelected: (NavigationPage) -> Unit, +) { + val navigationItems = homeScreenState.navigationBarItems + + val selectedItemIndex by remember(homeScreenState) { + derivedStateOf { + when { + homeScreenState.currentScreen.isPrograms() -> 0 + homeScreenState.currentScreen.isVisualizations() -> 1 + else -> null + } + } + } + NavigationBar( + modifier = Modifier + .fillMaxWidth() + .wrapContentHeight(), + items = navigationItems, + selectedItemIndex = selectedItemIndex ?: 0, + onItemClick = { navigationPage -> onNavigationSelected(navigationPage) }, + ) +} diff --git a/app/src/main/java/org/dhis2/usescases/notes/noteDetail/NoteDetailPresenter.kt b/app/src/main/java/org/dhis2/usescases/notes/noteDetail/NoteDetailPresenter.kt index e6177b63925..2b2ae97b545 100644 --- a/app/src/main/java/org/dhis2/usescases/notes/noteDetail/NoteDetailPresenter.kt +++ b/app/src/main/java/org/dhis2/usescases/notes/noteDetail/NoteDetailPresenter.kt @@ -2,6 +2,7 @@ package org.dhis2.usescases.notes.noteDetail import io.reactivex.disposables.CompositeDisposable import org.dhis2.commons.schedulers.SchedulerProvider +import org.dhis2.usescases.notes.NotesIdlingResource import timber.log.Timber class NoteDetailPresenter( @@ -33,6 +34,8 @@ class NoteDetailPresenter( disposable.add( repository .saveNote(noteType, uid, message) + .doOnSubscribe { NotesIdlingResource.increment() } + .doFinally { NotesIdlingResource.decrement() } .subscribeOn(scheduler.io()) .observeOn(scheduler.ui()) .subscribe( diff --git a/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailViewModel.kt b/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailViewModel.kt index 1cf2f62d25b..256591f4ade 100644 --- a/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailViewModel.kt @@ -14,9 +14,11 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.distinctUntilChanged import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.launch import org.dhis2.R import org.dhis2.commons.resources.ResourceManager @@ -58,12 +60,10 @@ class ProgramEventDetailViewModel( private val _backdropActive = MutableLiveData<Boolean>() val backdropActive: LiveData<Boolean> get() = _backdropActive - private val _shouldNavigateToEventDetails: MutableSharedFlow<String> = - MutableSharedFlow( - replay = Int.MAX_VALUE, - ) - val shouldNavigateToEventDetails: SharedFlow<String> - get() = _shouldNavigateToEventDetails + private val _shouldNavigateToEventDetails = Channel<String>() + + val shouldNavigateToEventDetails: Flow<String> + get() = _shouldNavigateToEventDetails.receiveAsFlow() private val _navigationBarUIState = mutableStateOf(NavigationBarUIState<NavigationPage>()) val navigationBarUIState: State<NavigationBarUIState<NavigationPage>> = _navigationBarUIState @@ -172,7 +172,7 @@ class ProgramEventDetailViewModel( programStageUid = programStageUid, enrollmentUid = null, ).getOrNull()?.let { eventUid -> - _shouldNavigateToEventDetails.emit(eventUid) + _shouldNavigateToEventDetails.send(eventUid) } } } diff --git a/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventMapper.kt b/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventMapper.kt index 896f7665d49..0538363ac81 100644 --- a/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventMapper.kt +++ b/app/src/main/java/org/dhis2/usescases/programEventDetail/ProgramEventMapper.kt @@ -275,6 +275,7 @@ class ProgramEventMapper( .byProgramStageUid() .eq(programStage) .withDataElements() + .orderBySortOrder(RepositoryScope.OrderByDirection.ASC) .blockingGet() private fun getCategoryOptionCombo(attributeOptionCombo: String?) = diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/MapDataRepository.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/MapDataRepository.kt index c08b0304a96..6dd1b2908f7 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/MapDataRepository.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/MapDataRepository.kt @@ -8,6 +8,7 @@ import org.dhis2.maps.geometry.mapper.featurecollection.MapCoordinateFieldToFeat import org.dhis2.maps.geometry.mapper.featurecollection.MapTeiEventsToFeatureCollection import org.dhis2.maps.geometry.mapper.featurecollection.MapTeisToFeatureCollection import org.dhis2.maps.layer.MapLayer +import org.dhis2.maps.layer.types.FieldMapLayer import org.dhis2.maps.utils.DhisMapUtils import org.hisp.dhis.android.core.program.Program import org.maplibre.geojson.FeatureCollection @@ -54,14 +55,30 @@ class MapDataRepository( val eventsByProgramStage = mapTeiEventsToFeatureCollection.map(mapEvents).component1() + val noFieldLayers = layersVisibility.values.none { it is FieldMapLayer } + val anyLayerVisible = layersVisibility.values.any { it.visible } + val teiItems = mapTeis.filterTeiByLayerVisibility(layersVisibility, coordinateAttributes) + val eventItems = mapEvents.filterTrackerEventsByLayerVisibility(layersVisibility, coordinateDataElements) + val relationshipItems = mapRelationships.filterRelationshipsByLayerVisibility(layersVisibility) + val extraTeis = + if (noFieldLayers && anyLayerVisible) { + mapTeis.filter { tei -> + tei !in teiItems && coordinateAttributes.any { it.tei.uid() == tei.uid } + } + } else { + emptyList() + } + val extraEvents = + if (noFieldLayers && anyLayerVisible) { + mapEvents.filter { event -> + event !in eventItems && coordinateDataElements.any { it.event.uid() == event.uid } + } + } else { + emptyList() + } + return TrackerMapData( - mapItems = - mapTeis.filterTeiByLayerVisibility(layersVisibility, coordinateAttributes) + - mapEvents.filterTrackerEventsByLayerVisibility( - layersVisibility, - coordinateDataElements, - ) + - mapRelationships.filterRelationshipsByLayerVisibility(layersVisibility), + mapItems = teiItems + extraTeis + eventItems + extraEvents + relationshipItems, eventFeatures = eventsByProgramStage, teiFeatures = teiFeatureCollection.first, teiBoundingBox = teiFeatureCollection.second, diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepository.java b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepository.java index db2e4dbf7ed..da87850bbcd 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepository.java +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepository.java @@ -33,9 +33,6 @@ public interface SearchRepository { void clearFetchedList(); - @NonNull - Flowable<List<SearchTeiModel>> searchTeiForMap(SearchParametersModel searchParametersModel, boolean isOnline); - @NonNull Observable<Pair<String, String>> saveToEnroll(@NonNull String teiType, @NonNull String orgUnitUID, @NonNull String programUid, @Nullable String teiUid, HashMap<String, List<String>> queryData, @Nullable String fromRelationshipUid); @@ -47,14 +44,10 @@ public interface SearchRepository { TrackedEntityType getTrackedEntityType(); - List<EventModel> getEventsForMap(List<SearchTeiModel> teis); - Observable<D2Progress> downloadTei(String teiUid); TeiDownloadResult download(String teiUid, @Nullable String enrollmentUid, String reason); - SearchTeiModel transform(TrackedEntitySearchItem searchItem, @Nullable Program selectedProgram, boolean offlineOnly, SortingItem sortingItem); - TrackedEntitySearchCollectionRepository getFilteredRepository(SearchParametersModel searchParametersModel); void setCurrentProgram(@Nullable String currentProgram); @@ -87,9 +80,4 @@ public interface SearchRepository { boolean filtersApplyOnGlobalSearch(); - @NotNull HashSet<String> getFetchedTeiUIDs(); - - SearchParametersModel getSavedSearchParameters(); - - FilterManager getSavedFilters(); } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImpl.java b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImpl.java index eee444b1643..c5135a2061c 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImpl.java +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImpl.java @@ -3,78 +3,45 @@ import android.database.sqlite.SQLiteConstraintException; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import org.dhis2.R; -import org.dhis2.bindings.ExtensionsKt; -import org.dhis2.bindings.ValueExtensionsKt; import org.dhis2.commons.Constants; import org.dhis2.commons.data.EntryMode; -import org.dhis2.commons.data.EventModel; -import org.dhis2.commons.data.EventViewModelType; import org.dhis2.commons.date.DateUtils; import org.dhis2.commons.filters.FilterManager; import org.dhis2.commons.filters.data.FilterPresenter; -import org.dhis2.commons.filters.sorting.SortingItem; -import org.dhis2.commons.network.NetworkUtils; -import org.dhis2.commons.resources.DhisPeriodUtils; -import org.dhis2.commons.resources.MetadataIconProvider; import org.dhis2.commons.resources.ResourceManager; import org.dhis2.commons.simprints.ramp.repository.RampDatastoreRepository; +import org.dhis2.commons.viewmodel.DispatcherProvider; import org.dhis2.data.dhislogic.DhisEnrollmentUtils; import org.dhis2.data.forms.dataentry.SearchTEIRepository; import org.dhis2.data.forms.dataentry.ValueStore; import org.dhis2.data.forms.dataentry.ValueStoreImpl; import org.dhis2.data.search.SearchParametersModel; -import org.dhis2.data.sorting.SearchSortingValueSetter; import org.dhis2.metadata.usecases.FileResourceConfiguration; import org.dhis2.metadata.usecases.ProgramConfiguration; import org.dhis2.metadata.usecases.TrackedEntityInstanceConfiguration; import org.dhis2.mobile.commons.customintents.CustomIntentRepository; import org.dhis2.mobile.commons.model.CustomIntentActionTypeModel; -import org.dhis2.mobile.commons.providers.FieldErrorMessageProvider; +import org.dhis2.mobile.commons.network.NetworkStatusProvider; import org.dhis2.mobile.commons.reporting.CrashReportController; -import org.dhis2.tracker.data.ProfilePictureProvider; -import org.dhis2.tracker.relationships.model.RelationshipDirection; -import org.dhis2.tracker.relationships.model.RelationshipGeometry; -import org.dhis2.tracker.relationships.model.RelationshipModel; -import org.dhis2.tracker.relationships.model.RelationshipOwnerType; import org.dhis2.ui.ThemeManager; import org.dhis2.usescases.teiDownload.TeiDownloader; -import org.dhis2.utils.ValueUtils; import org.hisp.dhis.android.core.D2; import org.hisp.dhis.android.core.arch.call.D2Progress; import org.hisp.dhis.android.core.arch.helpers.UidsHelper; -import org.hisp.dhis.android.core.arch.repositories.scope.RepositoryScope; import org.hisp.dhis.android.core.common.FeatureType; -import org.hisp.dhis.android.core.common.ObjectStyle; -import org.hisp.dhis.android.core.common.State; import org.hisp.dhis.android.core.common.ValueType; -import org.hisp.dhis.android.core.enrollment.Enrollment; -import org.hisp.dhis.android.core.enrollment.EnrollmentCollectionRepository; import org.hisp.dhis.android.core.enrollment.EnrollmentCreateProjection; -import org.hisp.dhis.android.core.enrollment.EnrollmentStatus; -import org.hisp.dhis.android.core.event.Event; -import org.hisp.dhis.android.core.event.EventCollectionRepository; -import org.hisp.dhis.android.core.event.EventStatus; import org.hisp.dhis.android.core.organisationunit.OrganisationUnit; import org.hisp.dhis.android.core.program.Program; -import org.hisp.dhis.android.core.program.ProgramStage; import org.hisp.dhis.android.core.program.ProgramTrackedEntityAttribute; -import org.hisp.dhis.android.core.relationship.Relationship; -import org.hisp.dhis.android.core.relationship.RelationshipItem; -import org.hisp.dhis.android.core.relationship.RelationshipItemTrackedEntityInstance; import org.hisp.dhis.android.core.settings.AnalyticsDhisVisualizationsGroup; import org.hisp.dhis.android.core.settings.ProgramConfigurationSetting; import org.hisp.dhis.android.core.trackedentity.TrackedEntityAttribute; -import org.hisp.dhis.android.core.trackedentity.TrackedEntityAttributeValue; -import org.hisp.dhis.android.core.trackedentity.TrackedEntityInstance; import org.hisp.dhis.android.core.trackedentity.TrackedEntityInstanceCreateProjection; import org.hisp.dhis.android.core.trackedentity.TrackedEntityType; import org.hisp.dhis.android.core.trackedentity.TrackedEntityTypeAttribute; import org.hisp.dhis.android.core.trackedentity.internal.TrackedEntityInstanceDownloader; import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchCollectionRepository; -import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItem; -import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItemAttribute; -import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItemHelper; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -87,44 +54,29 @@ import java.util.Map; import dhis2.org.analytics.charts.Charts; -import io.reactivex.Flowable; import io.reactivex.Observable; import io.reactivex.Single; import kotlin.Pair; -import kotlin.Triple; public class SearchRepositoryImpl implements SearchRepository { private final String teiType; private final ResourceManager resources; private final D2 d2; - private final SearchSortingValueSetter sortingValueSetter; + private final DispatcherProvider dispatcherProvider; private TrackedEntitySearchCollectionRepository trackedEntityInstanceQuery; - public SearchParametersModel savedSearchParameters; - private FilterManager savedFilters; private FilterPresenter filterPresenter; - private DhisPeriodUtils periodUtils; private String currentProgram; private final Charts charts; private final CrashReportController crashReportController; private DateUtils dateUtils; - private final NetworkUtils networkUtils; + private final NetworkStatusProvider networkStatusProvider; private final SearchTEIRepository searchTEIRepository; private TrackedEntityInstanceDownloader downloadRepository = null; private ThemeManager themeManager; private HashSet<String> fetchedTeiUids = new HashSet<>(); private TeiDownloader teiDownloader; private HashMap<String, Program> programCache = new HashMap<>(); - private HashMap<String, String> orgUnitNameCache = new HashMap<>(); - - private HashMap<String, String> profilePictureCache = new HashMap<>(); - - private HashMap<String, List<String>> attributesUidsCache = new HashMap(); - - private HashMap<String, List<String>> trackedEntityTypeAttributesUidsCache = new HashMap(); - - private final MetadataIconProvider metadataIconProvider; - private final ProfilePictureProvider profilePictureProvider; private final RampDatastoreRepository rampDatastoreRepository; private CustomIntentRepository customIntentRepository; @@ -133,30 +85,25 @@ public class SearchRepositoryImpl implements SearchRepository { D2 d2, FilterPresenter filterPresenter, ResourceManager resources, - SearchSortingValueSetter sortingValueSetter, - DhisPeriodUtils periodUtils, Charts charts, CrashReportController crashReportController, - NetworkUtils networkUtils, + NetworkStatusProvider networkStatusProvider, SearchTEIRepository searchTEIRepository, ThemeManager themeManager, - MetadataIconProvider metadataIconProvider, - ProfilePictureProvider profilePictureProvider, DateUtils dateUtils, CustomIntentRepository customIntentRepository, - RampDatastoreRepository rampDatastoreRepository + RampDatastoreRepository rampDatastoreRepository, + DispatcherProvider dispatcherProvider ) { this.teiType = teiType; this.d2 = d2; this.resources = resources; - this.sortingValueSetter = sortingValueSetter; this.filterPresenter = filterPresenter; - this.periodUtils = periodUtils; this.charts = charts; this.crashReportController = crashReportController; this.dateUtils = dateUtils; this.currentProgram = initialProgram; - this.networkUtils = networkUtils; + this.networkStatusProvider = networkStatusProvider; this.searchTEIRepository = searchTEIRepository; this.themeManager = themeManager; this.teiDownloader = new TeiDownloader( @@ -165,10 +112,9 @@ public class SearchRepositoryImpl implements SearchRepository { new FileResourceConfiguration(d2), currentProgram, resources); - this.metadataIconProvider = metadataIconProvider; - this.profilePictureProvider = profilePictureProvider; this.customIntentRepository = customIntentRepository; this.rampDatastoreRepository = rampDatastoreRepository; + this.dispatcherProvider = dispatcherProvider; } @@ -188,36 +134,15 @@ public void clearFetchedList() { fetchedTeiUids.clear(); } - @NonNull - @Override - public Flowable<List<SearchTeiModel>> searchTeiForMap(SearchParametersModel searchParametersModel, boolean isOnline) { - - boolean allowCache = false; - if (!searchParametersModel.equals(savedSearchParameters) || !FilterManager.getInstance().equals(savedFilters)) { - trackedEntityInstanceQuery = getFilteredRepository(searchParametersModel); - } else { - allowCache = true; - } - - if (isOnline && FilterManager.getInstance().getStateFilters().isEmpty()) - return trackedEntityInstanceQuery.allowOnlineCache().eq(allowCache).offlineFirst().get().toFlowable() - .flatMapIterable(list -> list) - .map(tei -> transform(tei, searchParametersModel.getSelectedProgram(), false, FilterManager.getInstance().getSortingItem())) - .toList().toFlowable(); - else - return trackedEntityInstanceQuery.allowOnlineCache().eq(allowCache).offlineOnly().get().toFlowable() - .flatMapIterable(list -> list) - .map(tei -> transform(tei, searchParametersModel.getSelectedProgram(), true, FilterManager.getInstance().getSortingItem())) - .toList().toFlowable(); - } @Override public TrackedEntitySearchCollectionRepository getFilteredRepository(SearchParametersModel searchParametersModel) { - this.savedSearchParameters = searchParametersModel.copy(); - this.savedFilters = FilterManager.getInstance().copy(); + String programUid = searchParametersModel.getSelectedProgram() != null + ? searchParametersModel.getSelectedProgram().uid() + : null; trackedEntityInstanceQuery = filterPresenter.filteredTrackedEntityInstances( - searchParametersModel.getSelectedProgram(), teiType + programUid, teiType ); for (int i = 0; i < searchParametersModel.getQueryData().keySet().size(); i++) { @@ -309,10 +234,10 @@ public Observable<Pair<String, String>> saveToEnroll(@NonNull String teiType, EntryMode.ATTR, new DhisEnrollmentUtils(d2), crashReportController, - networkUtils, searchTEIRepository, - new FieldErrorMessageProvider(), - resources + resources, + networkStatusProvider, + dispatcherProvider ); if (queryData.containsKey(Constants.ENROLLMENT_DATE_UID)) @@ -363,260 +288,6 @@ public Observable<List<OrganisationUnit>> getOrgUnits(@Nullable String selectedP } - private void setEnrollmentInfo(SearchTeiModel searchTei) { - List<Enrollment> enrollments = - d2.enrollmentModule().enrollments() - .byTrackedEntityInstance().eq(searchTei.getTei().uid()) - .byDeleted().eq(false) - .orderByCreated(RepositoryScope.OrderByDirection.DESC) - .blockingGet(); - for (Enrollment enrollment : enrollments) { - if (enrollments.indexOf(enrollment) == 0) - searchTei.resetEnrollments(); - searchTei.addEnrollment(enrollment); - Program program = getProgram(enrollment.program()); - if (program.displayFrontPageList()) { - searchTei.addProgramInfo( - program, - metadataIconProvider.invoke(program.style()) - ); - } - searchTei.addEnrollmentInfo(getProgramInfo(program)); - } - } - - private Triple<String, String, String> getProgramInfo(Program program) { - String programColor = program.style() != null && program.style().color() != null ? program.style().color() : ""; - String programIcon = program.style() != null && program.style().icon() != null ? program.style().icon() : ""; - return new Triple<>(program.displayName(), programColor, programIcon); - } - - private void setAttributesInfo(SearchTeiModel searchTei, TrackedEntitySearchItem searchTeiItem) { - for (TrackedEntitySearchItemAttribute attribute : searchTeiItem.getAttributeValues()) { - if (attribute.getDisplayInList() && isAcceptedValueType(attribute.getValueType())) { - setAttributeValue(searchTei, attribute); - } - } - } - - private boolean isAcceptedValueType(ValueType valueType) { - return switch (valueType) { - case IMAGE, COORDINATE, FILE_RESOURCE -> false; - default -> true; - }; - } - - private void setAttributeValue(SearchTeiModel searchTei, TrackedEntitySearchItemAttribute attribute) { - String value = attribute.getValue(); - String transformedValue; - if (value != null) { - transformedValue = ValueUtils.Companion.transformValue(d2, value, attribute.getValueType(), attribute.getOptionSet()); - } else { - transformedValue = sortingValueSetter.getUnknownLabel(); - } - TrackedEntityAttributeValue attributeValue = TrackedEntityAttributeValue.builder() - .created(attribute.getCreated()) - .lastUpdated(attribute.getLastUpdated()) - .trackedEntityAttribute(attribute.getAttribute()) - .trackedEntityInstance(searchTei.getTei().uid()) - .value(transformedValue) - .build(); - - searchTei.addAttributeValue(attribute.getDisplayFormName(), attributeValue); - - if (attribute.getValueType() == ValueType.TEXT || attribute.getValueType() == ValueType.LONG_TEXT) { - searchTei.addTextAttribute(attribute.getDisplayName(), attributeValue); - } - } - - private void setOverdueEvents(@NonNull SearchTeiModel tei, Program selectedProgram) { - String teiId = tei.getTei() != null && tei.getTei().uid() != null ? tei.getTei().uid() : ""; - List<Enrollment> enrollments = d2.enrollmentModule().enrollments().byTrackedEntityInstance().eq(teiId).blockingGet(); - - EventCollectionRepository overdueEvents = d2.eventModule().events() - .byEnrollmentUid().in(UidsHelper.getUidsList(enrollments)) - .byStatus().eq(EventStatus.OVERDUE); - - EventCollectionRepository overdueScheduledEvents = d2.eventModule().events() - .byEnrollmentUid().in(UidsHelper.getUidsList(enrollments)) - .byStatus().eq(EventStatus.SCHEDULE); - - if (selectedProgram != null) { - overdueEvents = overdueEvents.byProgramUid().eq(selectedProgram.uid()); - overdueScheduledEvents = overdueScheduledEvents.byProgramUid().eq(selectedProgram.uid()); - } - - List<Event> overdueList = overdueEvents.orderByDueDate(RepositoryScope.OrderByDirection.DESC).blockingGet(); - List<Event> scheduledList = overdueScheduledEvents.orderByDueDate(RepositoryScope.OrderByDirection.DESC).blockingGet(); - - List<Event> filteredScheduled = new ArrayList<>(); - for (Event event : scheduledList) { - if (Boolean.TRUE.equals(dateUtils.isEventDueDateOverdue(event.dueDate()))) { - filteredScheduled.add(event); - } - } - - for (Event event : overdueList) { - if (Boolean.TRUE.equals(dateUtils.isEventDueDateOverdue(event.dueDate()))) { - filteredScheduled.add(event); - } - } - - List<Event> combinedOverdue = new ArrayList<>(filteredScheduled); - - if (!combinedOverdue.isEmpty()) { - combinedOverdue.sort((e1, e2) -> { - if (e1.dueDate() == null || e2.dueDate() == null) return 0; - return e2.dueDate().compareTo(e1.dueDate()); - }); - tei.setHasOverdue(true); - tei.setOverdueDate(combinedOverdue.get(0).dueDate()); - } - } - - private void setRelationshipsInfo(@NonNull SearchTeiModel searchTeiModel, Program selectedProgram) { - List<RelationshipModel> relationshipModels = new ArrayList<>(); - List<Relationship> relationships = d2.relationshipModule().relationships().getByItem( - RelationshipItem.builder().trackedEntityInstance( - RelationshipItemTrackedEntityInstance.builder() - .trackedEntityInstance(searchTeiModel.getTei().uid()) - .build() - ).build() - ); - for (Relationship relationship : relationships) { - if (relationship.from().trackedEntityInstance() != null) { - String relationshipTEIUid; - RelationshipDirection direction; - if (!searchTeiModel.getTei().uid().equals(relationship.from().trackedEntityInstance().trackedEntityInstance())) { - relationshipTEIUid = relationship.from().trackedEntityInstance().trackedEntityInstance(); - direction = RelationshipDirection.FROM; - } else { - relationshipTEIUid = relationship.to().trackedEntityInstance().trackedEntityInstance(); - direction = RelationshipDirection.TO; - } - - String fromTeiUid = relationship.from().trackedEntityInstance().trackedEntityInstance(); - String toTeiUid = relationship.to().trackedEntityInstance().trackedEntityInstance(); - - TrackedEntityInstance fromTei = d2.trackedEntityModule().trackedEntityInstances().uid(fromTeiUid).blockingGet(); - TrackedEntityInstance toTei = d2.trackedEntityModule().trackedEntityInstances().uid(toTeiUid).blockingGet(); - - List<kotlin.Pair<String, String>> fromValues = new ArrayList<>(); - List<TrackedEntityAttributeValue> fromAttr = getTrackedEntityAttributesForRelationship(fromTei, selectedProgram); - List<kotlin.Pair<String, String>> toValues = new ArrayList<>(); - List<TrackedEntityAttributeValue> toAttr = getTrackedEntityAttributesForRelationship(toTei, selectedProgram); - for (TrackedEntityAttributeValue attributeValue : fromAttr) { - fromValues.add(new kotlin.Pair<>(attributeValue.trackedEntityAttribute(), attributeValue.value())); - } - for (TrackedEntityAttributeValue attributeValue : toAttr) { - toValues.add(new kotlin.Pair<>(attributeValue.trackedEntityAttribute(), attributeValue.value())); - } - - RelationshipGeometry fromGeometry = null; - RelationshipGeometry toGeometry = null; - - if (fromTei.geometry() != null) { - fromGeometry = new RelationshipGeometry( - fromTei.geometry().type().name(), - fromTei.geometry().coordinates() - ); - } - - if (toTei.geometry() != null) { - toGeometry = new RelationshipGeometry( - toTei.geometry().type().name(), - toTei.geometry().coordinates() - ); - } - - relationshipModels.add(new RelationshipModel( - relationship.uid(), - relationship.syncState().name(), - fromGeometry, - toGeometry, - direction, - relationshipTEIUid, - RelationshipOwnerType.TEI, - fromValues, - toValues, - profilePicturePath(fromTei, selectedProgram.uid()), - profilePicturePath(toTei, selectedProgram.uid()), - getTeiDefaultRes(fromTei), - getTeiDefaultRes(toTei), - null, - null, - true, - null, - null, - null, - null - )); - } - } - - searchTeiModel.setRelationships(relationshipModels); - } - - private String profilePicturePath(TrackedEntityInstance tei, String programUid) { - if (!profilePictureCache.containsKey(tei.uid())) { - profilePictureCache.put(tei.uid(), ExtensionsKt.profilePicturePath(tei, d2, programUid)); - } - return profilePictureCache.get(tei.uid()); - } - - private List<String> getProgramAttributeUids(String programUid) { - if (!attributesUidsCache.containsKey(programUid)) { - List<String> attributeUids = new ArrayList<>(); - List<ProgramTrackedEntityAttribute> programTrackedEntityAttributes = d2.programModule().programTrackedEntityAttributes() - .byProgram().eq(programUid) - .byDisplayInList().isTrue() - .orderBySortOrder(RepositoryScope.OrderByDirection.ASC) - .blockingGet(); - for (ProgramTrackedEntityAttribute programAttribute : programTrackedEntityAttributes) { - attributeUids.add(programAttribute.trackedEntityAttribute().uid()); - } - attributesUidsCache.put(programUid, attributeUids); - } - - return attributesUidsCache.get(programUid); - } - - private List<String> getTETypeAttributeUids(String teTypeUid) { - if (!trackedEntityTypeAttributesUidsCache.containsKey(teTypeUid)) { - List<String> attributeUids = new ArrayList<>(); - List<TrackedEntityTypeAttribute> typeAttributes = d2.trackedEntityModule().trackedEntityTypeAttributes() - .byTrackedEntityTypeUid().eq(teTypeUid) - .byDisplayInList().isTrue() - .blockingGet(); - - for (TrackedEntityTypeAttribute typeAttribute : typeAttributes) { - attributeUids.add(typeAttribute.trackedEntityAttribute().uid()); - } - } - return trackedEntityTypeAttributesUidsCache.get(teTypeUid); - } - - private int getTeiDefaultRes(TrackedEntityInstance tei) { - TrackedEntityType teiTypeValues = d2.trackedEntityModule().trackedEntityTypes().uid(tei.trackedEntityType()).blockingGet(); - return resources.getObjectStyleDrawableResource(teiTypeValues.style().icon(), R.drawable.photo_temp_gray); - } - - private List<TrackedEntityAttributeValue> getTrackedEntityAttributesForRelationship(TrackedEntityInstance tei, Program selectedProgram) { - - List<TrackedEntityAttributeValue> values; - values = d2.trackedEntityModule().trackedEntityAttributeValues() - .byTrackedEntityInstance().eq(tei.uid()) - .byTrackedEntityAttribute().in(getProgramAttributeUids(selectedProgram.uid())).blockingGet(); - - if (values.isEmpty()) { - values = d2.trackedEntityModule().trackedEntityAttributeValues() - .byTrackedEntityInstance().eq(tei.uid()) - .byTrackedEntityAttribute().in(getTETypeAttributeUids(tei.trackedEntityType())).blockingGet(); - } - - return values; - } - @Override public String getProgramColor(@NonNull String programUid) { Program program = getProgram(programUid); @@ -670,20 +341,6 @@ public boolean filtersApplyOnGlobalSearch() { !FilterManager.getInstance().getStateFilters().isEmpty(); } - @Override - public @NotNull HashSet<String> getFetchedTeiUIDs() { - return fetchedTeiUids; - } - - @Override - public SearchParametersModel getSavedSearchParameters() { - return savedSearchParameters; - } - - @Override - public FilterManager getSavedFilters() { - return savedFilters; - } @Override public Observable<TrackedEntityType> getTrackedEntityType(String trackedEntityUid) { @@ -695,72 +352,6 @@ public TrackedEntityType getTrackedEntityType() { return d2.trackedEntityModule().trackedEntityTypes().uid(teiType).blockingGet(); } - @Override - public List<EventModel> getEventsForMap(List<SearchTeiModel> teis) { - List<EventModel> eventModels = new ArrayList<>(); - List<String> teiUidList = new ArrayList<>(); - for (SearchTeiModel tei : teis) { - teiUidList.add(tei.getTei().uid()); - } - - List<Event> events = d2.eventModule().events() - .byTrackedEntityInstanceUids(teiUidList) - .byDeleted().isFalse() - .blockingGet(); - - HashMap<String, ProgramStage> cacheStages = new HashMap<>(); - - for (Event event : events) { - if (!cacheStages.containsKey(event.programStage())) { - ProgramStage stage = d2.programModule().programStages() - .uid(event.programStage()) - .blockingGet(); - cacheStages.put(event.programStage(), stage); - } - - eventModels.add( - new EventModel( - EventViewModelType.EVENT, - cacheStages.get(event.programStage()), - event, - 0, - null, - true, - true, - orgUnitName(event.organisationUnit()), - true, - null, - null, - false, - false, - false, - false, - false, - 0, - periodUtils.getPeriodUIString(cacheStages.get(event.programStage()).periodType(), event.eventDate() != null ? event.eventDate() : event.dueDate(), Locale.getDefault()), - null, - metadataIconProvider.invoke(cacheStages.get(event.programStage()).style()), - true, - true - )); - } - - return eventModels; - } - - private String orgUnitName(String orgUnitUid) { - if (!orgUnitNameCache.containsKey(orgUnitUid)) { - OrganisationUnit organisationUnit = d2.organisationUnitModule() - .organisationUnits() - .uid(orgUnitUid) - .blockingGet(); - if (organisationUnit != null) { - orgUnitNameCache.put(orgUnitUid, organisationUnit.displayName()); - } - } - return orgUnitNameCache.get(orgUnitUid); - } - @Override public Observable<D2Progress> downloadTei(String teiUid) { downloadRepository = d2.trackedEntityModule().trackedEntityInstanceDownloader() @@ -779,122 +370,6 @@ public TeiDownloadResult download(String teiUid, @Nullable String enrollmentUid, return teiDownloader.download(teiUid, enrollmentUid, reason); } - @Override - public SearchTeiModel transform(TrackedEntitySearchItem searchItem, @Nullable Program selectedProgram, boolean offlineOnly, SortingItem sortingItem) { - if (!fetchedTeiUids.contains(searchItem.uid())) { - fetchedTeiUids.add(searchItem.uid()); - } - TrackedEntityInstance teiFromItem = TrackedEntitySearchItemHelper.INSTANCE.toTrackedEntityInstance(searchItem); - - TrackedEntityInstance dbTei = searchItem.isOnline() ? - d2.trackedEntityModule().trackedEntityInstances().uid(searchItem.uid()).blockingGet() : - teiFromItem; - - SearchTeiModel searchTei = new SearchTeiModel(); - if (dbTei != null && dbTei.aggregatedSyncState() != State.RELATIONSHIP) { - searchTei.setTei(dbTei); - EnrollmentCollectionRepository enrollmentRepository = d2.enrollmentModule().enrollments() - .byTrackedEntityInstance().eq(dbTei.uid()); - - if (selectedProgram != null) { - enrollmentRepository = enrollmentRepository.byProgram().eq(selectedProgram.uid()); - } - - List<Enrollment> enrollmentsInProgram = enrollmentRepository - .orderByEnrollmentDate(RepositoryScope.OrderByDirection.DESC) - .blockingGet(); - - if (selectedProgram != null && !enrollmentsInProgram.isEmpty()) { - for (Enrollment enrollment : enrollmentsInProgram) { - if (enrollment.status() == EnrollmentStatus.ACTIVE) { - searchTei.setCurrentEnrollment(enrollment); - break; - } - } - if (searchTei.getSelectedEnrollment() == null) { - searchTei.setCurrentEnrollment(enrollmentsInProgram.get(0)); - } - } - // set online parameter from the tei search item - searchTei.setOnline(searchItem.isOnline()); - // If search is being conducted offline only, set the search as offline - if (offlineOnly) - searchTei.setOnline(false); - // if the local database tei is deleted, set search as online - if (Boolean.TRUE.equals(dbTei.deleted())) { - searchTei.setOnline(true); - } - - setEnrollmentInfo(searchTei); - setAttributesInfo(searchTei, searchItem); - setOverdueEvents(searchTei, selectedProgram); - if (selectedProgram != null) { - setRelationshipsInfo(searchTei, selectedProgram); - } - if (!searchItem.getProgramOwners().isEmpty() && - !searchItem.getProgramOwners().get(0).getOwnerOrgUnit().equals(searchItem.getOrganisationUnit())) { - searchTei.setOwnerOrgUnit(orgUnitName(searchItem.getProgramOwners().get(0).getOwnerOrgUnit())); - } - if (searchTei.getSelectedEnrollment() != null) { - searchTei.setEnrolledOrgUnit(orgUnitName(searchTei.getSelectedEnrollment().organisationUnit())); - } else { - searchTei.setEnrolledOrgUnit(orgUnitName(searchTei.getTei().organisationUnit())); - } - searchTei.setProfilePicture(profilePictureProvider.invoke(dbTei, selectedProgram != null ? selectedProgram.uid() : null)); - } else { - searchTei.setTei(teiFromItem); - if (!searchItem.getProgramOwners().isEmpty() && - searchItem.getProgramOwners().get(0).getOwnerOrgUnit().equals(searchItem.getOrganisationUnit())) { - searchTei.setEnrolledOrgUnit(orgUnitName(searchTei.getTei().organisationUnit())); - } else { - searchTei.setEnrolledOrgUnit(orgUnitName(searchTei.getTei().organisationUnit())); - if (!searchItem.getProgramOwners().isEmpty()) { - searchTei.setOwnerOrgUnit(orgUnitName(searchItem.getProgramOwners().get(0).getOwnerOrgUnit())); - } - } - - for (TrackedEntitySearchItemAttribute attribute : searchItem.getAttributeValues()) { - if (attribute.getDisplayInList()) { - addAttribute(searchTei, attribute); - } - } - } - - ObjectStyle os = searchItem.getType().style(); - searchTei.setDefaultTypeIcon(os != null ? os.icon() : null); - - searchTei.setHeader(searchItem.getHeader()); - searchTei.setSortingValue(sortingValueSetter.setSortingItem(searchTei, sortingItem)); - searchTei.setTEType(searchItem.getType().displayName()); - searchTei.setDisplayOrgUnit(displayOrgUnit()); - return searchTei; - } - - private void addAttribute(SearchTeiModel searchTei, TrackedEntitySearchItemAttribute att) { - TrackedEntityAttributeValue attributeValue = TrackedEntityAttributeValue.builder() - .value(att.getValue()) - .created(att.getCreated()) - .lastUpdated(att.getLastUpdated()) - .trackedEntityAttribute(att.getAttribute()) - .trackedEntityInstance(searchTei.getTei().uid()) - .build(); - - String friendlyValue = ValueExtensionsKt.userFriendlyValue(attributeValue, d2, true); - - TrackedEntityAttributeValue friendlyAttributeValue = attributeValue.toBuilder() - .value(friendlyValue) - .build(); - - if (att.getValueType() == ValueType.IMAGE) - searchTei.setProfilePicture(att.getAttribute()); - - searchTei.addAttributeValue(att.getDisplayFormName(), friendlyAttributeValue); - } - - private String profilePicturePath(TrackedEntityInstance tei, @Nullable Program selectedProgram) { - return ExtensionsKt.profilePicturePath(tei, d2, selectedProgram != null ? selectedProgram.uid() : null); - } - @Override public void setCurrentProgram(String currentProgram) { this.currentProgram = currentProgram; @@ -1021,13 +496,6 @@ public boolean isSearchEnabled() { return rampDatastoreRepository.isSearchEnabled(currentProgram); } - private boolean displayOrgUnit() { - return d2.organisationUnitModule().organisationUnits() - .byProgramUids(Collections.singletonList(currentProgram)) - .blockingCount() > 1; - } - private static final String OPTION_SET_REGEX = "_os_"; } - diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImplKt.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImplKt.kt index 63daa1aa06b..ebe848c5748 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImplKt.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryImplKt.kt @@ -2,54 +2,38 @@ package org.dhis2.usescases.searchTrackEntity -import androidx.paging.PagingData -import androidx.paging.map import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.FlowPreview -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.debounce -import kotlinx.coroutines.flow.flatMapLatest -import kotlinx.coroutines.flow.map import kotlinx.coroutines.withContext import org.dhis2.commons.filters.FilterManager -import org.dhis2.commons.resources.MetadataIconProvider +import org.dhis2.commons.filters.sorting.SortingItem import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.search.SearchParametersModel -import org.dhis2.form.model.FieldUiModel -import org.dhis2.form.model.OptionSetConfiguration -import org.dhis2.form.ui.FieldViewModelFactory import org.dhis2.maps.model.MapItemModel import org.dhis2.mobile.commons.customintents.CustomIntentRepository -import org.dhis2.mobile.commons.extensions.toColor import org.dhis2.mobile.commons.model.CustomIntentActionTypeModel -import org.dhis2.mobile.commons.model.CustomIntentModel +import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.input.ui.action.FieldUid +import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult import org.dhis2.usescases.events.EventInfoProvider import org.dhis2.usescases.tracker.TrackedEntityInstanceInfoProvider import org.hisp.dhis.android.core.D2 -import org.hisp.dhis.android.core.arch.repositories.scope.RepositoryScope import org.hisp.dhis.android.core.common.ObjectStyle import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.android.core.event.EventStatus import org.hisp.dhis.android.core.program.Program -import org.hisp.dhis.android.core.program.ProgramTrackedEntityAttribute -import org.hisp.dhis.android.core.program.SectionRenderingType import org.hisp.dhis.android.core.relationship.RelationshipItem import org.hisp.dhis.android.core.relationship.RelationshipItemTrackedEntityInstance -import org.hisp.dhis.android.core.trackedentity.TrackedEntityAttribute import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchCollectionRepository import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItem import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItemHelper.toTrackedEntityInstance -import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor import timber.log.Timber class SearchRepositoryImplKt( private val searchRepositoryJava: SearchRepository, private val d2: D2, private val dispatcher: DispatcherProvider, - private val fieldViewModelFactory: FieldViewModelFactory, - private val metadataIconProvider: MetadataIconProvider, private val trackedEntityInstanceInfoProvider: TrackedEntityInstanceInfoProvider, private val eventInfoProvider: EventInfoProvider, private val customIntentRepository: CustomIntentRepository, @@ -62,86 +46,35 @@ class SearchRepositoryImplKt( private val fetchedTeiUids = HashSet<String>() - override fun searchTrackedEntities( - searchParametersModel: SearchParametersModel, - isOnline: Boolean, - ): Flow<PagingData<TrackedEntitySearchItem>> = - trackedEntitySearchQuery(searchParametersModel, isOnline) - .getPagingData(10) - - private fun trackedEntitySearchQuery( - searchParametersModel: SearchParametersModel, - isOnline: Boolean, - ): TrackedEntitySearchCollectionRepository { - var allowCache = false - savedSearchParameters = searchParametersModel.copy() - savedFilters = FilterManager.getInstance().copy() - - if (searchParametersModel != savedSearchParameters || - !FilterManager - .getInstance() - .sameFilters(savedFilters) - ) { - trackedEntityInstanceQuery = - searchRepositoryJava.getFilteredRepository(searchParametersModel) - } else { - trackedEntityInstanceQuery = - searchRepositoryJava.getFilteredRepository(searchParametersModel) - allowCache = true + override fun saveSearchValuesAndGetAllowCache( + queryData: MutableMap<String, List<String>?>?, + programUid: String?, + ): Boolean { + if (!this::savedSearchParameters.isInitialized) { + savedSearchParameters = + SearchParametersModel( + queryData = queryData, + selectedProgram = searchRepositoryJava.getProgram(programUid), + ) } - - if (fetchedTeiUids.isNotEmpty() && searchParametersModel.selectedProgram == null) { - trackedEntityInstanceQuery = - trackedEntityInstanceQuery.excludeUids().`in`(fetchedTeiUids.toList()) + if (!this::savedFilters.isInitialized) { + savedFilters = FilterManager.getInstance().copy() } - - val pagerFlow = - if (isOnline && FilterManager.getInstance().stateFilters.isEmpty()) { - trackedEntityInstanceQuery.allowOnlineCache().eq(allowCache).offlineFirst() - } else { - trackedEntityInstanceQuery.allowOnlineCache().eq(allowCache).offlineOnly() - } - - return pagerFlow + val allowCache = + queryData == savedSearchParameters.queryData && + FilterManager + .getInstance() + .sameFilters(savedFilters) + savedSearchParameters = savedSearchParameters.copy(queryData = queryData) + savedFilters = FilterManager.getInstance().copy() + return allowCache } - override suspend fun searchParameters( - programUid: String?, - teiTypeUid: String, - ): List<FieldUiModel> = - withContext(dispatcher.io()) { - val searchParameters = - programUid?.let { - programTrackedEntityAttributes(programUid) - } ?: trackedEntitySearchFields(teiTypeUid) - - sortSearchParameters(searchParameters) + override fun getExcludeValues(): HashSet<String>? = + fetchedTeiUids.ifEmpty { + null } - fun sortSearchParameters(parameters: List<FieldUiModel>): List<FieldUiModel> = - parameters.sortedWith( - compareByDescending<FieldUiModel> { - it.renderingType?.isQROrBarcode() == true && isUnique(it.uid) - }.thenByDescending { - it.renderingType?.isQROrBarcode() == true - }.thenByDescending { isUnique(it.uid) }, - ) - - private fun isUnique(teaUid: String): Boolean = - d2 - .trackedEntityModule() - .trackedEntityAttributes() - .uid(teaUid) - .blockingGet() - ?.unique() ?: false - - override suspend fun searchTrackedEntitiesImmediate( - searchParametersModel: SearchParametersModel, - isOnline: Boolean, - ): List<TrackedEntitySearchItem> = - trackedEntitySearchQuery(searchParametersModel, isOnline) - .blockingGet() - override fun searchTeiForMap( searchParametersModel: SearchParametersModel, isOnline: Boolean, @@ -198,7 +131,7 @@ class SearchRepositoryImplKt( } val attributeValues = - trackedEntityInstanceInfoProvider.getTeiAdditionalInfoList( + trackedEntityInstanceInfoProvider.getTeiAdditionalInfoListForMap( searchItem.attributeValues ?: emptyList(), ) @@ -234,6 +167,83 @@ class SearchRepositoryImplKt( ) } + override fun trackerValueTypeToSDKValueType(trackerInputType: TrackerInputType): ValueType? = + when (trackerInputType) { + TrackerInputType.TEXT -> ValueType.TEXT + TrackerInputType.LONG_TEXT -> ValueType.LONG_TEXT + TrackerInputType.LETTER -> ValueType.LETTER + TrackerInputType.PHONE_NUMBER -> ValueType.PHONE_NUMBER + TrackerInputType.EMAIL -> ValueType.EMAIL + TrackerInputType.URL -> ValueType.URL + TrackerInputType.NUMBER -> ValueType.NUMBER + TrackerInputType.INTEGER -> ValueType.INTEGER + TrackerInputType.INTEGER_POSITIVE -> ValueType.INTEGER_POSITIVE + TrackerInputType.INTEGER_NEGATIVE -> ValueType.INTEGER_NEGATIVE + TrackerInputType.INTEGER_ZERO_OR_POSITIVE -> ValueType.INTEGER_ZERO_OR_POSITIVE + TrackerInputType.PERCENTAGE -> ValueType.PERCENTAGE + TrackerInputType.UNIT_INTERVAL -> ValueType.UNIT_INTERVAL + TrackerInputType.AGE -> ValueType.AGE + TrackerInputType.ORGANISATION_UNIT -> ValueType.ORGANISATION_UNIT + TrackerInputType.DATE_TIME -> ValueType.DATETIME + TrackerInputType.DATE -> ValueType.DATE + TrackerInputType.TIME -> ValueType.TIME + TrackerInputType.HORIZONTAL_CHECKBOXES, + TrackerInputType.VERTICAL_CHECKBOXES, + TrackerInputType.HORIZONTAL_RADIOBUTTONS, + TrackerInputType.VERTICAL_RADIOBUTTONS, + -> ValueType.BOOLEAN + + TrackerInputType.YES_ONLY_SWITCH, + TrackerInputType.YES_ONLY_CHECKBOX, + -> ValueType.TRUE_ONLY + + TrackerInputType.QR_CODE, + TrackerInputType.BAR_CODE, + -> ValueType.TEXT + + TrackerInputType.MULTI_SELECTION -> ValueType.MULTI_TEXT + TrackerInputType.DROPDOWN, + TrackerInputType.PERIOD_SELECTOR, + TrackerInputType.MATRIX, + TrackerInputType.SEQUENTIAL, + TrackerInputType.NOT_SUPPORTED, + TrackerInputType.CUSTOM_INTENT, + -> ValueType.TEXT + TrackerInputType.COORDINATES -> ValueType.COORDINATE + TrackerInputType.IMAGE -> ValueType.IMAGE + } + + override fun mapTrackedEntitySearchItemResultToSearchTeiModel( + searchItemResult: TrackedEntitySearchItemResult, + sortingItem: SortingItem?, + ): SearchTeiModel { + val searchTeiModel = SearchTeiModel() + searchTeiModel.tei = searchItemResult + searchItemResult.enrolledPrograms?.forEach { + searchTeiModel.addProgramInfo( + it.uid, + trackedEntityInstanceInfoProvider.getMetadataIcon( + ObjectStyle.builder().icon(it.style.icon).color(it.style.color).build() + ) + ) + } + searchItemResult.attributeValues.forEach { attr -> + if (attr.displayInList && isAcceptedValueType(attr.valueType)) { + val transformedValue = if (attr.value != null) + trackedEntityInstanceInfoProvider.getTransformedValue(attr) else trackedEntityInstanceInfoProvider.getUnknownLabel() + searchTeiModel.addAttributeValue(attr.displayName, attr.copy(value = transformedValue)) + if(attr.valueType == TrackerInputType.TEXT || attr.valueType == TrackerInputType.LONG_TEXT){ + searchTeiModel.addTextAttribute(attr.displayFormName, attr.copy(value = transformedValue)) + } + } + } + sortingItem?.let { + searchTeiModel.setSortingValue(trackedEntityInstanceInfoProvider.getSortingKeyValue(searchTeiModel, sortingItem)) + } + return searchTeiModel + + } + override fun searchRelationshipsForMap( teis: List<MapItemModel>, selectedProgram: Program?, @@ -276,7 +286,7 @@ class SearchRepositoryImplKt( when { relationshipTarget?.trackedEntityInstance() != null && - teis.none { it.uid == relationshipTarget.elementUid() } -> { + teis.none { it.uid == relationshipTarget.elementUid() } -> { val trackedEntityType = d2 .trackedEntityModule() @@ -313,6 +323,34 @@ class SearchRepositoryImplKt( } } + override fun validateValue( + inputType: TrackerInputType, + value: String, + ): Any = + { + when (inputType) { + TrackerInputType.DATE -> { + ValueType.DATE.validator.validate(value) + } + + TrackerInputType.DATE_TIME -> { + ValueType.DATETIME.validator.validate(value) + } + + TrackerInputType.TIME -> { + ValueType.TIME.validator.validate(value) + } + + TrackerInputType.AGE -> { + ValueType.AGE.validator.validate(value) + } + + else -> { + false + } + } + } + override fun searchEventForMap( teiUids: List<String>, selectedProgram: Program?, @@ -345,176 +383,19 @@ class SearchRepositoryImplKt( } } - private fun programTrackedEntityAttributes(programUid: String): List<FieldUiModel> { - val searchableAttributes = - d2 - .programModule() - .programTrackedEntityAttributes() - .withRenderType() - .byProgram() - .eq(programUid) - .orderBySortOrder(RepositoryScope.OrderByDirection.ASC) - .blockingGet() - .filter { programAttribute -> - val isSearchable = programAttribute.searchable()!! - val isUnique = - d2 - .trackedEntityModule() - .trackedEntityAttributes() - .uid(programAttribute.trackedEntityAttribute()!!.uid()) - .blockingGet() - ?.unique() === java.lang.Boolean.TRUE - isSearchable || isUnique - } - - val program = - d2 - .programModule() - .programs() - .uid(programUid) - .blockingGet() - - return searchableAttributes - .mapNotNull { programAttribute -> - d2 - .trackedEntityModule() - .trackedEntityAttributes() - .uid(programAttribute.trackedEntityAttribute()!!.uid()) - .blockingGet() - ?.let { attribute -> - val searchFlow = MutableStateFlow("") - val optionSetConfiguration = - attribute.optionSet()?.let { - OptionSetConfiguration( - searchEmitter = searchFlow, - optionFlow = - searchFlow.debounce(300).flatMapLatest { - d2 - .optionModule() - .options() - .orderBySortOrder(RepositoryScope.OrderByDirection.ASC) - .byOptionSetUid() - .eq(attribute.optionSet()!!.uid()) - .getPagingData(10) - .map { pagingData -> - pagingData.map { option -> - OptionSetConfiguration.OptionData( - option, - metadataIconProvider( - option.style(), - program?.style()?.color()?.toColor() - ?: SurfaceColor.Primary, - ), - ) - } - } - }, - onSearch = { searchFlow.value = it }, - ) - } - val customIntentModel = - customIntentRepository.getCustomIntent( - triggerUid = attribute.uid(), - orgUnitUid = null, - actionType = CustomIntentActionTypeModel.SEARCH, - ) - createField( - trackedEntityAttribute = attribute, - programTrackedEntityAttribute = programAttribute, - optionSetConfiguration = optionSetConfiguration, - customIntent = customIntentModel, - ) - } - }.filter { parameter -> - parameter.valueType !== ValueType.IMAGE && - parameter.valueType !== ValueType.COORDINATE && - parameter.valueType !== ValueType.FILE_RESOURCE - } - } - - private fun trackedEntitySearchFields(teiTypeUid: String): List<FieldUiModel> { - val teTypeAttributes = - d2 - .trackedEntityModule() - .trackedEntityTypeAttributes() - .byTrackedEntityTypeUid() - .eq(teiTypeUid) - .bySearchable() - .isTrue - .blockingGet() - - return teTypeAttributes - .mapNotNull { typeAttribute -> - d2 - .trackedEntityModule() - .trackedEntityAttributes() - .uid(typeAttribute.trackedEntityAttribute()!!.uid()) - .blockingGet() - ?.let { attribute -> - val searchEmitter = MutableStateFlow("") - val optionSetConfiguration = - attribute.optionSet()?.let { - OptionSetConfiguration( - searchEmitter = searchEmitter, - optionFlow = - d2 - .optionModule() - .options() - .byOptionSetUid() - .eq(attribute.optionSet()!!.uid()) - .orderBySortOrder(RepositoryScope.OrderByDirection.ASC) - .getPagingData(10) - .map { pagingData -> - pagingData.map { option -> - OptionSetConfiguration.OptionData( - option, - metadataIconProvider( - option.style(), - SurfaceColor.Primary, - ), - ) - } - }, - onSearch = { searchEmitter.value = it }, - ) - } + override suspend fun getCustomIntent(fieldUid: FieldUid) = + withContext(dispatcher.io()) { + customIntentRepository.getCustomIntent( + triggerUid = fieldUid, + orgUnitUid = null, + actionType = CustomIntentActionTypeModel.SEARCH, + ) + } - createField( - trackedEntityAttribute = attribute, - programTrackedEntityAttribute = null, - optionSetConfiguration = optionSetConfiguration, - ) - } - }.filter { parameter -> - parameter.valueType !== ValueType.IMAGE && - parameter.valueType !== ValueType.COORDINATE && - parameter.valueType !== ValueType.FILE_RESOURCE - } + private fun isAcceptedValueType(valueType: TrackerInputType): Boolean { + return when (valueType) { + TrackerInputType.NOT_SUPPORTED -> false + else -> true + } } - - private fun createField( - trackedEntityAttribute: TrackedEntityAttribute, - programTrackedEntityAttribute: ProgramTrackedEntityAttribute?, - optionSetConfiguration: OptionSetConfiguration?, - customIntent: CustomIntentModel? = null, - ): FieldUiModel = - fieldViewModelFactory.create( - id = trackedEntityAttribute.uid(), - label = trackedEntityAttribute.displayFormName() ?: "", - valueType = trackedEntityAttribute.valueType()!!, - mandatory = false, - optionSet = trackedEntityAttribute.optionSet()?.uid(), - value = null, - programStageSection = null, - allowFutureDates = programTrackedEntityAttribute?.allowFutureDate() ?: true, - editable = true, - renderingType = SectionRenderingType.LISTING, - description = null, - fieldRendering = programTrackedEntityAttribute?.renderType()?.mobile(), - objectStyle = trackedEntityAttribute.style() ?: ObjectStyle.builder().build(), - fieldMask = trackedEntityAttribute.fieldMask(), - optionSetConfiguration = optionSetConfiguration, - featureType = null, - customIntentModel = customIntent, - ) } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryKt.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryKt.kt index 1b57f339c79..43d715b49d9 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryKt.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryKt.kt @@ -1,34 +1,26 @@ package org.dhis2.usescases.searchTrackEntity -import androidx.paging.PagingData -import kotlinx.coroutines.flow.Flow +import org.dhis2.commons.filters.sorting.SortingItem import org.dhis2.data.search.SearchParametersModel -import org.dhis2.form.model.FieldUiModel import org.dhis2.maps.model.MapItemModel +import org.dhis2.mobile.commons.model.CustomIntentModel +import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.input.ui.action.FieldUid +import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult +import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.android.core.program.Program -import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItem interface SearchRepositoryKt { - fun searchTrackedEntities( - searchParametersModel: SearchParametersModel, - isOnline: Boolean, - ): Flow<PagingData<TrackedEntitySearchItem>> - - suspend fun searchParameters( - programUid: String?, - teiTypeUid: String, - ): List<FieldUiModel> - - suspend fun searchTrackedEntitiesImmediate( - searchParametersModel: SearchParametersModel, - isOnline: Boolean, - ): List<TrackedEntitySearchItem> - fun searchTeiForMap( searchParametersModel: SearchParametersModel, isOnline: Boolean, ): List<MapItemModel> + fun validateValue( + inputType: TrackerInputType, + value: String, + ): Any + fun searchEventForMap( teiUids: List<String>, selectedProgram: Program?, @@ -38,4 +30,20 @@ interface SearchRepositoryKt { teis: List<MapItemModel>, selectedProgram: Program?, ): List<MapItemModel> + + suspend fun getCustomIntent(fieldUid: FieldUid): CustomIntentModel? + + fun saveSearchValuesAndGetAllowCache( + queryData: MutableMap<String, List<String>?>?, + programUid: String?, + ): Boolean + + fun getExcludeValues(): HashSet<String>? + + fun trackerValueTypeToSDKValueType(trackerInputType: TrackerInputType): ValueType? + + fun mapTrackedEntitySearchItemResultToSearchTeiModel( + searchItemResult: TrackedEntitySearchItemResult, + sortingItem: SortingItem?, + ): SearchTeiModel } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.kt index 01bc7e7aa06..59e76b4b04a 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.kt @@ -56,7 +56,6 @@ import org.dhis2.commons.sync.SyncContext import org.dhis2.commons.sync.SyncContext.TrackerProgramTei import org.dhis2.data.forms.dataentry.ProgramAdapter import org.dhis2.databinding.ActivitySearchBinding -import org.dhis2.form.ui.intent.FormIntent.OnSave import org.dhis2.mobile.commons.orgunit.OrgUnitSelectorScope import org.dhis2.tracker.NavigationBarUIState import org.dhis2.ui.ThemeManager @@ -68,7 +67,7 @@ import org.dhis2.usescases.searchTrackEntity.LegacyInteraction.OnSyncIconClick import org.dhis2.usescases.searchTrackEntity.LegacyInteraction.OnTeiClick import org.dhis2.usescases.searchTrackEntity.listView.SearchTEList.Companion.get import org.dhis2.usescases.searchTrackEntity.mapView.SearchTEMap.Companion.get -import org.dhis2.usescases.searchTrackEntity.searchparameters.initSearchScreen +import org.dhis2.usescases.searchTrackEntity.searchparameters.provideSearchScreen import org.dhis2.usescases.searchTrackEntity.ui.SearchScreenConfigurator import org.dhis2.utils.customviews.BreakTheGlassBottomDialog import org.dhis2.utils.customviews.navigationbar.NavigationPage @@ -77,7 +76,6 @@ import org.dhis2.utils.granularsync.shouldLaunchSyncDialog import org.dhis2.utils.isLandscape import org.dhis2.utils.isPortrait import org.hisp.dhis.android.core.arch.call.D2Progress -import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.android.core.organisationunit.OrganisationUnit import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBar import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme @@ -248,6 +246,7 @@ class SearchTEActivity : initialProgram, context, initialQuery, + syncStatusController, ), ) searchComponent?.inject(this) @@ -325,7 +324,7 @@ class SearchTEActivity : override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - outState.putString(Constants.QUERY_DATA, JSONObject(viewModel.queryData).toString()) + outState.putString(Constants.QUERY_DATA, JSONObject(viewModel.queryDataAsMap()).toString()) outState.putString(CURRENT_SCREEN, currentContent?.name) } @@ -360,7 +359,7 @@ class SearchTEActivity : } private fun initSearchParameters() { - initSearchScreen( + provideSearchScreen( binding.searchContainer, viewModel, initialProgram, @@ -376,14 +375,9 @@ class SearchTEActivity : if (selectedOrgUnits.isNotEmpty()) { selectedOrgUnit = selectedOrgUnits[0].uid() } - viewModel.onParameterIntent( - OnSave( - uid, - selectedOrgUnit, - ValueType.ORGANISATION_UNIT, - null, - true, - ), + viewModel.onValueChange( + fieldUid = uid, + value = selectedOrgUnit, ) }.orgUnitScope(orgUnitScope) .build() diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt index d8fbd38b547..17e8eff9a73 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModel.kt @@ -19,11 +19,15 @@ import androidx.lifecycle.viewModelScope import androidx.paging.PagingData import androidx.paging.cachedIn import androidx.paging.map +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.Job import kotlinx.coroutines.async import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.emitAll @@ -46,10 +50,9 @@ import org.dhis2.commons.network.NetworkUtils import org.dhis2.commons.resources.ResourceManager import org.dhis2.commons.simprints.utils.SimprintsIntentUtils import org.dhis2.commons.viewmodel.DispatcherProvider -import org.dhis2.data.search.SearchParametersModel import org.dhis2.form.model.FieldUiModel import org.dhis2.form.model.FieldUiModelImpl -import org.dhis2.form.ui.intent.FormIntent +import org.dhis2.form.ui.customintent.CustomIntentResult import org.dhis2.form.ui.provider.DisplayNameProvider import org.dhis2.maps.extensions.toStringProperty import org.dhis2.maps.layer.MapLayer @@ -57,17 +60,29 @@ import org.dhis2.maps.layer.basemaps.BaseMapStyle import org.dhis2.maps.managers.MapManager import org.dhis2.maps.usecases.MapStyleConfiguration import org.dhis2.mobile.commons.coroutine.CoroutineTracker +import org.dhis2.mobile.commons.model.CustomIntentModel import org.dhis2.simprints.SimprintsLoadBiometricSearchResultsUseCase import org.dhis2.simprints.SimprintsLoadPossibleDuplicatesSearchResultsUseCase import org.dhis2.simprints.SimprintsMapBiometricSearchResultUseCase import org.dhis2.simprints.SimprintsSearchViewModel import org.dhis2.tracker.NavigationBarUIState +import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.input.ui.action.CustomIntentUid +import org.dhis2.tracker.input.ui.action.FieldUid +import org.dhis2.tracker.input.ui.action.TrackerInputAction +import org.dhis2.tracker.input.ui.mapper.toTrackerInputUiState +import org.dhis2.tracker.input.ui.state.TrackerOptionItem +import org.dhis2.tracker.search.domain.FetchOptionSetOptions +import org.dhis2.tracker.search.domain.FetchSearchParameters +import org.dhis2.tracker.search.domain.SearchTrackedEntities +import org.dhis2.tracker.search.model.FetchSearchParametersData +import org.dhis2.tracker.search.model.QueryData +import org.dhis2.tracker.search.model.SearchTrackedEntitiesInput +import org.dhis2.tracker.search.ui.state.SearchParametersUiState import org.dhis2.usescases.searchTrackEntity.listView.SearchResult -import org.dhis2.usescases.searchTrackEntity.searchparameters.model.SearchParametersUiState import org.dhis2.usescases.searchTrackEntity.ui.UnableToSearchOutsideData import org.dhis2.utils.customviews.navigationbar.NavigationPage import org.dhis2.utils.customviews.navigationbar.NavigationPageConfigurator -import org.hisp.dhis.android.core.arch.helpers.Result import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.android.core.maintenance.D2ErrorCode import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarItem @@ -97,6 +112,7 @@ sealed class SimprintsNavigationAction { object AutoEnrollLastBiometricsFromSimprintsPossibleDuplicates : SimprintsNavigationAction() } +@OptIn(ExperimentalCoroutinesApi::class) class SearchTEIViewModel( val initialProgramUid: String?, initialQuery: MutableMap<String, List<String>?>?, @@ -110,12 +126,23 @@ class SearchTEIViewModel( private val resourceManager: ResourceManager, private val displayNameProvider: DisplayNameProvider, private val filterManager: FilterManager, + private val searchTrackedEntities: SearchTrackedEntities, + private val fetchSearchParameters: FetchSearchParameters, + private val fetchOptionSetOptions: FetchOptionSetOptions, private val simprintsSearchViewModel: SimprintsSearchViewModel, private val loadSimprintsBiometricSearchResultsUseCase: SimprintsLoadBiometricSearchResultsUseCase, private val mapSimprintsBiometricSearchResult: SimprintsMapBiometricSearchResultUseCase, ) : ViewModel() { private var layersVisibility: Map<String, MapLayer> = emptyMap() + private val customIntentByFieldUid = mutableMapOf<String, CustomIntentModel>() + + // Store option set flows per field UID + private val optionSetFlows = mutableMapOf<String, Flow<PagingData<TrackerOptionItem>>>() + + // Store search query states for option sets + private val optionSetSearchQueries = mutableMapOf<String, MutableStateFlow<String?>>() + private val pageConfiguration = MutableLiveData<NavigationPageConfigurator>() private val _navigationBarUIState = @@ -125,26 +152,18 @@ class SearchTEIViewModel( val navigationBarUIState: MutableState<NavigationBarUIState<NavigationPage>> = _navigationBarUIState - val queryData = - mutableMapOf<String, List<String>?>().apply { - initialQuery?.let { putAll(it) } - } - private val _legacyInteraction = MutableLiveData<LegacyInteraction?>() val legacyInteraction: LiveData<LegacyInteraction?> = _legacyInteraction private val _refreshData = MutableLiveData(Unit) val refreshData: LiveData<Unit> = _refreshData - private val _mapResults = Channel<TrackerMapData>() - val mapResults: Flow<TrackerMapData> = _mapResults.receiveAsFlow() + private val _mapResults = MutableSharedFlow<TrackerMapData>(replay = 1) + val mapResults: SharedFlow<TrackerMapData> = _mapResults.asSharedFlow() private val _mapItemClicked = MutableSharedFlow<String>() val mapItemClicked: Flow<String> = _mapItemClicked - private val _simprintsNavigation = Channel<SimprintsNavigationAction>() - val simprintsNavigation: Flow<SimprintsNavigationAction> = _simprintsNavigation.receiveAsFlow() - private val _screenState = MutableLiveData<SearchTEScreenState>() val screenState: LiveData<SearchTEScreenState> = _screenState @@ -155,9 +174,6 @@ class SearchTEIViewModel( val isScrollingDown = MutableLiveData(false) val simprintsBiometricSearchNavigation: Flow<Unit> = simprintsSearchViewModel.simprintsBiometricSearchNavigation - private val _simprintsBiometricIdentificationLaunch = MutableSharedFlow<Unit>(replay = 0) - val simprintsBiometricIdentificationLaunch: Flow<Unit> = - _simprintsBiometricIdentificationLaunch.asSharedFlow() val isSimprintsBiometricSearch: LiveData<Boolean> = simprintsSearchViewModel.isSimprintsBiometricSearch val isSimprintsUseLastBiometricsLabel: LiveData<Boolean> = @@ -185,16 +201,31 @@ class SearchTEIViewModel( var searchParametersUiState by mutableStateOf(SearchParametersUiState()) + val queryDataList = + mutableListOf<QueryData>().apply { + initialQuery?.let { addAll(it.toQueryDataList()) } + } + var mapManager: MapManager? = null private var fetchJob: Job? = null private val onNewSearch = MutableSharedFlow<Unit>(extraBufferCapacity = 1) + private val _searchActions = Channel<TrackerInputAction>() + val searchActions = _searchActions.receiveAsFlow() + + private val _simprintsNavigation = Channel<SimprintsNavigationAction>() + val simprintsNavigation: Flow<SimprintsNavigationAction> = _simprintsNavigation.receiveAsFlow() + private var simprintsPossibleDuplicatesAutoNoneOfAboveTriggered: Boolean = false + private var keepSearchScreenOpenForSimprintsBiometricFallback: Boolean = false private val loadSimprintsPossibleDuplicatesSearchResultsUseCase = - SimprintsLoadPossibleDuplicatesSearchResultsUseCase(searchRepository, searchRepositoryKt) + SimprintsLoadPossibleDuplicatesSearchResultsUseCase( + searchRepositoryKt = searchRepositoryKt, + searchTrackedEntities = searchTrackedEntities, + ) val searchPagingData = onNewSearch @@ -205,7 +236,7 @@ class SearchTEIViewModel( emitAll( when { searching -> loadSearchResults() - displayFrontPageList() -> loadDisplayInListResults() + shouldDisplayFrontPageList() -> loadDisplayInListResults() else -> emptyFlow() }, ) @@ -242,6 +273,52 @@ class SearchTEIViewModel( _isSimprintsPossibleDuplicatesSearch.value = isSimprintsPossibleDuplicatesSearch } + /** + * Get or create option set flow for a given field. + */ + fun getOptionSetFlow( + fieldUid: String, + optionSetUid: String, + ): Flow<PagingData<TrackerOptionItem>> = + optionSetFlows.getOrPut(fieldUid) { + flow { + val searchQuery = + optionSetSearchQueries.getOrPut(fieldUid) { + MutableStateFlow(null) + } + + searchQuery.collect { query -> + val result = + fetchOptionSetOptions( + FetchOptionSetOptions.Params( + optionSetUid = optionSetUid, + pageSize = 10, + searchQuery = query, + ), + ) + + result.fold( + onSuccess = { optionsFlow -> + emitAll(optionsFlow) + }, + onFailure = { + emit(PagingData.empty()) + }, + ) + } + }.cachedIn(viewModelScope) + } + + /** + * Handle search in option sets. + */ + fun onOptionSetSearch( + fieldUid: String, + query: String, + ) { + optionSetSearchQueries[fieldUid]?.value = query.takeIf { it.isNotBlank() } + } + private fun loadNavigationBarItems() { CoroutineTracker.increment() val pageConfigurator = searchNavPageConfigurator.initVariables() @@ -311,6 +388,8 @@ class SearchTEIViewModel( !searchRepository.canCreateInProgramWithoutSearch() && !searching && filtersActive.value == false + val shouldOpenSearch = shouldForceSearch || keepSearchScreenOpenForSimprintsBiometricFallback + createButtonScrollVisibility.postValue( if (searching) { true @@ -330,15 +409,15 @@ class SearchTEIViewModel( isSearching = searching, searchForm = SearchForm( - queryHasData = queryData.isNotEmpty(), + queryHasData = queryDataList.isNotEmpty(), minAttributesToSearch = searchRepository .getProgram(initialProgramUid) ?.minAttributesRequiredToSearch() - ?: 1, + ?: 1, isEnabled = isSearchEnabled, isForced = shouldForceSearch, - isOpened = shouldForceSearch, + isOpened = shouldOpenSearch, ), searchFilters = SearchFilters( @@ -368,7 +447,7 @@ class SearchTEIViewModel( isSearching = searching, searchForm = SearchForm( - queryHasData = queryData.isNotEmpty(), + queryHasData = queryDataList.isNotEmpty(), minAttributesToSearch = searchRepository .getProgram(initialProgramUid) @@ -411,7 +490,7 @@ class SearchTEIViewModel( isSearching = searching, searchForm = SearchForm( - queryHasData = queryData.isNotEmpty(), + queryHasData = queryDataList.isNotEmpty(), minAttributesToSearch = searchRepository .getProgram(initialProgramUid) @@ -434,21 +513,35 @@ class SearchTEIViewModel( if (shouldLaunchSimprintsBiometricIdentification()) { simprintsSearchViewModel.clearPendingSession() - viewModelScope.launch { - _simprintsBiometricIdentificationLaunch.emit(Unit) - } + launchSimprintsBiometricIdentification() } else { setSearchScreen() } } private fun shouldLaunchSimprintsBiometricIdentification(): Boolean = - queryData.isEmpty() && + queryDataList.isEmpty() && _isSimprintsPossibleDuplicatesSearch.value != true && searchParametersUiState.items.any { field -> - SimprintsIntentUtils.isIdentifyCallout(field.customIntent) + SimprintsIntentUtils.isIdentifyCallout(customIntentByFieldUid[field.uid]) } + private fun launchSimprintsBiometricIdentification() { + val identifyCallout = + customIntentByFieldUid.entries.firstOrNull { (_, customIntent) -> + SimprintsIntentUtils.isIdentifyCallout(customIntent) + } ?: return + + viewModelScope.launch { + _searchActions.send( + TrackerInputAction.LaunchCustomIntent( + fieldUid = identifyCallout.key, + customIntentModel = identifyCallout.value, + ), + ) + } + } + fun setPreviousScreen() { when (_screenState.value?.previousSate) { SearchScreenState.LIST -> setListScreen() @@ -474,9 +567,24 @@ class SearchTEIViewModel( values: List<String>?, ) { if (values.isNullOrEmpty()) { - queryData.remove(uid) + queryDataList.removeIf { it.attributeId == uid } } else { - queryData[uid] = values + if (queryDataList.none { it.attributeId == uid }) { + queryDataList.add( + QueryData( + attributeId = uid, + values = values, + searchOperator = searchParametersUiState.items.firstOrNull { it.uid == uid }?.searchOperator, + ), + ) + } else { + queryDataList + .indexOfFirst { it.attributeId == uid } + .takeIf { it != -1 } + ?.let { index -> + queryDataList[index] = queryDataList[index].copy(values = values) + } + } } updateSearchParameters(uid, values) @@ -486,30 +594,33 @@ class SearchTEIViewModel( private fun updateSearchParameters( uid: String, values: List<String>?, + errorMessage: String? = null, ) { val updatedItems = searchParametersUiState.items.map { if (it.uid == uid) { - (it as FieldUiModelImpl).copy( + it.copy( value = values?.joinToString(","), displayName = displayNameProvider.provideDisplayName( - valueType = it.valueType, + valueType = searchRepositoryKt.trackerValueTypeToSDKValueType(it.valueType), value = values?.joinToString(","), optionSet = it.optionSet, - periodType = it.periodSelector?.type, + periodType = null, ), + error = errorMessage, ) } else { it } - } + } searchParametersUiState = searchParametersUiState.copy(items = updatedItems) refreshSimprintsUiState() } fun clearQueryData() { - queryData.clear() + clearSimprintsBiometricFallbackState() + queryDataList.clear() clearSearchParameters() simprintsSearchViewModel.clearPendingSession() updateSearch() @@ -517,22 +628,32 @@ class SearchTEIViewModel( } fun clearSimprintsBiometricQueryData() { - val updatedItems = + val queryData = queryDataAsMap() + val updatedSearchItems = simprintsSearchViewModel.clearSimprintsBiometricQueryData( - searchItems = searchParametersUiState.items, + searchItems = simprintsSearchItems(), queryData = queryData, ) ?: return + queryDataList.removeIf { it.attributeId !in queryData.keys } + val updatedSearchItemsByUid = updatedSearchItems.associateBy(FieldUiModel::uid) searchParametersUiState = searchParametersUiState.copy( - items = updatedItems, - clearSearchEnabled = queryData.isNotEmpty(), - ) - searchParametersUiState = - searchParametersUiState.copy( + items = + searchParametersUiState.items.map { item -> + updatedSearchItemsByUid[item.uid] + ?.let { updatedItem -> + item.copy( + value = updatedItem.value, + displayName = updatedItem.displayName, + ) + } ?: item + }, + clearSearchEnabled = queryDataList.isNotEmpty(), searchedItems = getFriendlyQueryData(), ) updateSearch() + refreshSimprintsUiState() } fun onSimprintsPossibleDuplicatesNoneOfAboveClick() { @@ -543,6 +664,7 @@ class SearchTEIViewModel( } fun onSimprintsBiometricSearchNavigation() { + clearSimprintsBiometricFallbackState() onNavigationPageChanged(NavigationPage.LIST_VIEW) setListScreen() searchRepository.clearFetchedList() @@ -552,7 +674,7 @@ class SearchTEIViewModel( private fun clearSearchParameters() { val updatedItems = searchParametersUiState.items.map { - (it as FieldUiModelImpl).copy(value = null, displayName = null) + it.copy(value = null, displayName = null) } searchParametersUiState = searchParametersUiState.copy( @@ -571,78 +693,83 @@ class SearchTEIViewModel( currentSearchList.copy( searchForm = currentSearchList.searchForm.copy( - queryHasData = queryData.isNotEmpty(), + queryHasData = queryDataList.isNotEmpty(), ), ), ) } - searchParametersUiState = searchParametersUiState.copy(searchEnabled = queryData.isNotEmpty()) + searchParametersUiState = + searchParametersUiState.copy(searchEnabled = queryDataList.isNotEmpty()) } - private suspend fun loadSearchResults() = - withContext(dispatchers.io()) { - val searchParametersModel = - SearchParametersModel( - selectedProgram = searchRepository.getProgram(initialProgramUid), - queryData = queryData, - ) - val isSimprintsPossibleDuplicatesSearch = _isSimprintsPossibleDuplicatesSearch.value == true + private fun loadSearchResults(): Flow<PagingData<SearchTeiModel>> = + flow { + // get uids to exclude for possible duplicates + val excludeValues = searchRepositoryKt.getExcludeValues() + val isOnline = searching && networkUtils.isOnline() + val selectedProgram = searchRepository.getProgram(initialProgramUid) - if (isSimprintsPossibleDuplicatesSearch) { + val allowCache = + searchRepositoryKt.saveSearchValuesAndGetAllowCache( + queryDataAsMap(), + selectedProgram?.uid(), + ) + val trackerSearchModel = + SearchTrackedEntitiesInput( + selectedProgram = selectedProgram?.uid(), + allowCache = allowCache, + excludeValues = excludeValues, + hasStateFilters = filterManager.stateFilters.isNotEmpty(), + isOnline = isOnline, + queryDataList = queryDataList, + ) + if (_isSimprintsPossibleDuplicatesSearch.value == true) { val simprintsPossibleDuplicatesResults = loadSimprintsPossibleDuplicatesSearchResultsUseCase( - searchParametersModel = searchParametersModel, - isOnline = isOnline, - offlineOnly = !(isOnline && filterManager.stateFilters.isEmpty()), + queryDataList = queryDataList, + searchInput = trackerSearchModel, sortingItem = filterManager.sortingItem, ) ?: emptyList() - if (simprintsPossibleDuplicatesResults.isEmpty() && !simprintsPossibleDuplicatesAutoNoneOfAboveTriggered) { + if ( + simprintsPossibleDuplicatesResults.isEmpty() && + !simprintsPossibleDuplicatesAutoNoneOfAboveTriggered + ) { simprintsPossibleDuplicatesAutoNoneOfAboveTriggered = true onSimprintsPossibleDuplicatesAutoEnrollLastClick() } - return@withContext flow { emit(PagingData.from(simprintsPossibleDuplicatesResults)) } - } else if (isSimprintsBiometricNoMatchesSearch()) { - return@withContext flow { emit(PagingData.empty()) } - } else { - loadSimprintsBiometricSearchResults( - searchParametersModel = searchParametersModel, - isOnline = isOnline, - )?.let { return@withContext it } + emit(PagingData.from(simprintsPossibleDuplicatesResults)) + return@flow } - val getPagingData = - searchRepositoryKt.searchTrackedEntities( - searchParametersModel, - isOnline, - ) - return@withContext getPagingData.map { pagingData -> - pagingData.map { item -> - withContext(dispatchers.io()) { - if ( - searching && - networkUtils.isOnline() && - filterManager.stateFilters.isEmpty() - ) { - searchRepository.transform( - item, - searchParametersModel.selectedProgram, - false, - filterManager.sortingItem, - ) - } else { - searchRepository.transform( + if (isSimprintsBiometricNoMatchesSearch()) { + emit(PagingData.empty()) + return@flow + } + + loadSimprintsBiometricSearchResults( + searchInput = trackerSearchModel, + )?.let { simprintsResults -> + emitAll(simprintsResults) + return@flow + } + + val results = searchTrackedEntities.invoke(trackerSearchModel) + + emitAll( + results.getOrThrow().map { pagingData -> + pagingData.map { item -> + withContext(dispatchers.io()) { + searchRepositoryKt.mapTrackedEntitySearchItemResultToSearchTeiModel( item, - searchParametersModel.selectedProgram, - true, filterManager.sortingItem, ) } } - } - } + }, + ) } private fun onSimprintsPossibleDuplicatesAutoEnrollLastClick() { @@ -651,97 +778,98 @@ class SearchTEIViewModel( } } - private suspend fun loadDisplayInListResults() = - withContext(dispatchers.io()) { - val searchParametersModel = - SearchParametersModel( - selectedProgram = searchRepository.getProgram(initialProgramUid), - queryData = queryData, + private fun loadDisplayInListResults(): Flow<PagingData<SearchTeiModel>> = + flow { + val excludeValues = searchRepositoryKt.getExcludeValues() + val selectedProgram = searchRepository.getProgram(initialProgramUid) + + val allowCache = + searchRepositoryKt.saveSearchValuesAndGetAllowCache( + queryDataAsMap(), + selectedProgram?.uid(), ) - val getPagingData = - searchRepositoryKt.searchTrackedEntities( - searchParametersModel, - false, + val newTrackerSearchModel = + SearchTrackedEntitiesInput( + selectedProgram = selectedProgram?.uid(), + allowCache = allowCache, + excludeValues = excludeValues, + hasStateFilters = filterManager.stateFilters.isNotEmpty(), + isOnline = false, + queryDataList = queryDataList, ) + val results = searchTrackedEntities.invoke(newTrackerSearchModel) - return@withContext getPagingData.map { pagingData -> - pagingData.map { item -> - withContext(dispatchers.io()) { - searchRepository.transform( - item, - searchParametersModel.selectedProgram, - true, - filterManager.sortingItem, - ) + emitAll( + results.getOrThrow().map { pagingData -> + pagingData.map { item -> + withContext(dispatchers.io()) { + searchRepositoryKt.mapTrackedEntitySearchItemResultToSearchTeiModel( + item, + filterManager.sortingItem, + ) + } } - } - } + }, + ) } - suspend fun fetchGlobalResults() = - withContext(dispatchers.io()) { - val searchParametersModel = - SearchParametersModel( + fun fetchGlobalResults(): Flow<PagingData<SearchTeiModel>>? { + // get uids to exclude for possible duplicates + return if (searching) { + flow { + val excludeValues = searchRepositoryKt.getExcludeValues() + + val isOnline = searching && networkUtils.isOnline() + val selectedProgram = searchRepository.getProgram(initialProgramUid) + + val allowCache = + searchRepositoryKt.saveSearchValuesAndGetAllowCache( + queryDataAsMap(), + selectedProgram?.uid(), + ) + val newTrackerSearchModel = + SearchTrackedEntitiesInput( selectedProgram = null, - queryData = queryData, - ) - val getPagingData = - searchRepositoryKt.searchTrackedEntities( - searchParametersModel, - searching && networkUtils.isOnline(), + allowCache = allowCache, + excludeValues = excludeValues, + hasStateFilters = filterManager.stateFilters.isNotEmpty(), + isOnline = isOnline, + queryDataList = queryDataList, ) - - return@withContext if (searching) { - if (isSimprintsBiometricNoMatchesSearch()) { - return@withContext flow { emit(PagingData.empty()) } - } loadSimprintsBiometricSearchResults( - searchParametersModel = searchParametersModel, - isOnline = networkUtils.isOnline(), - )?.let { return@withContext it } - getPagingData.map { pagingData -> - pagingData.map { item -> - withContext(dispatchers.io()) { - if ( - searching && - networkUtils.isOnline() && - filterManager.stateFilters.isEmpty() - ) { - searchRepository.transform( - item, - searchParametersModel.selectedProgram, - false, - filterManager.sortingItem, - ) - } else { - searchRepository.transform( + searchInput = newTrackerSearchModel, + )?.let { simprintsResults -> + emitAll(simprintsResults) + return@flow + } + val results = searchTrackedEntities.invoke(newTrackerSearchModel) + + emitAll( + results.getOrThrow().map { pagingData -> + pagingData.map { item -> + withContext(dispatchers.io()) { + searchRepositoryKt.mapTrackedEntitySearchItemResultToSearchTeiModel( item, - searchParametersModel.selectedProgram, - true, filterManager.sortingItem, ) } } - } - } - } else { - null + }, + ) } + } else { + null } + } private suspend fun loadSimprintsBiometricSearchResults( - searchParametersModel: SearchParametersModel, - isOnline: Boolean, - ): Flow<PagingData<SearchTeiModel>>? { - val offlineOnly = !(isOnline && filterManager.stateFilters.isEmpty()) - return loadSimprintsBiometricSearchResultsUseCase( - searchItems = searchParametersUiState.items, - searchParametersModel = searchParametersModel, - isOnline = isOnline, - offlineOnly = offlineOnly, + searchInput: SearchTrackedEntitiesInput, + ): Flow<PagingData<SearchTeiModel>>? = + loadSimprintsBiometricSearchResultsUseCase( + searchItems = simprintsSearchItems(), + searchInput = searchInput, sortingItem = filterManager.sortingItem, ) - } fun fetchMapResults() { CoroutineTracker.increment() @@ -750,10 +878,12 @@ class SearchTEIViewModel( val data = mapDataRepository.getTrackerMapData( searchRepository.getProgram(initialProgramUid), - queryData, + queryDataAsMap(), layersVisibility, ) - _mapResults.send(data) + _mapResults.emit(data) + } catch (e: CancellationException) { + throw e } catch (e: Exception) { Timber.e(e) } finally { @@ -764,18 +894,23 @@ class SearchTEIViewModel( } fun onSearch() { - searchRepository.clearFetchedList() - performSearch() + clearSimprintsBiometricFallbackState() + if (canPerformSearch()) { + searchRepository.clearFetchedList() + performSearch() + } else { + displayNotEnoughAttributesToSearchMessage() + } } private fun performSearch() { viewModelScope.launch(dispatchers.io()) { + CoroutineTracker.increment() try { - if (canPerformSearch()) { - searching = queryData.isNotEmpty() + searching = queryDataList.isNotEmpty() searchParametersUiState = searchParametersUiState.copy( - clearSearchEnabled = queryData.isNotEmpty(), + clearSearchEnabled = queryDataList.isNotEmpty(), searchedItems = getFriendlyQueryData(), ) @@ -783,7 +918,7 @@ class SearchTEIViewModel( SearchScreenState.LIST, SearchScreenState.NONE, null, - -> { + -> { setListScreen() onNewSearch.emit(Unit) } @@ -796,7 +931,19 @@ class SearchTEIViewModel( else -> searching = false } - } else { + + } catch (e: Exception) { + Timber.d(e) + } finally { + CoroutineTracker.decrement() + } + } + } + + private fun displayNotEnoughAttributesToSearchMessage() { + viewModelScope.launch(dispatchers.io()) { + CoroutineTracker.increment() + try { val minAttributesToSearch = searchRepository .getProgram(initialProgramUid) @@ -807,32 +954,37 @@ class SearchTEIViewModel( R.string.search_min_num_attr, minAttributesToSearch, ) - searchParametersUiState = searchParametersUiState.copy(minAttributesMessage = message) + searchParametersUiState = + searchParametersUiState.copy(minAttributesMessage = message) searchParametersUiState.updateMinAttributeWarning(true) setSearchScreen() _refreshData.postValue(Unit) onNewSearch.emit(Unit) - } } catch (e: Exception) { Timber.d(e) + } finally { + CoroutineTracker.decrement() } } } + private fun shouldDisplayFrontPageList(): Boolean = + displayFrontPageListSettingIsConfigured() + private fun canPerformSearch(): Boolean = - (_isSimprintsPossibleDuplicatesSearch.value == true && queryData.isNotEmpty()) || + (_isSimprintsPossibleDuplicatesSearch.value == true && queryDataList.isNotEmpty()) || isSimprintsBiometricNoMatchesSearch() || minAttributesToSearchCheck() || - displayFrontPageList() + shouldDisplayFrontPageList() private fun minAttributesToSearchCheck(): Boolean = searchRepository.getProgram(initialProgramUid)?.let { program -> - (program.minAttributesRequiredToSearch() ?: 0) <= queryData.size + (program.minAttributesRequiredToSearch() ?: 0) <= queryDataList.size } ?: true - private fun displayFrontPageList(): Boolean = + private fun displayFrontPageListSettingIsConfigured(): Boolean = searchRepository.getProgram(initialProgramUid)?.let { program -> - program.displayFrontPageList() == true && queryData.isEmpty() + program.displayFrontPageList() == true && queryDataList.isEmpty() } ?: false private fun canDisplayResult( @@ -840,24 +992,24 @@ class SearchTEIViewModel( onlineTooManyResults: Boolean, ): Boolean = !onlineTooManyResults && - when (initialProgramUid) { - null -> itemCount <= TEI_TYPE_SEARCH_MAX_RESULTS - else -> - searchRepository - .getProgram(initialProgramUid) - ?.maxTeiCountToReturn() - ?.takeIf { it != 0 } - ?.let { maxTeiCount -> - itemCount <= maxTeiCount - } ?: true - } + when (initialProgramUid) { + null -> itemCount <= TEI_TYPE_SEARCH_MAX_RESULTS + else -> + searchRepository + .getProgram(initialProgramUid) + ?.maxTeiCountToReturn() + ?.takeIf { it != 0 } + ?.let { maxTeiCount -> + itemCount <= maxTeiCount + } ?: true + } fun queryDataByProgram(programUid: String?): MutableMap<String, List<String>> = - searchRepository.filterQueryForProgram(queryData, programUid) + searchRepository.filterQueryForProgram(queryDataAsMap(), programUid) fun prepareEnrollmentQueryData(queryData: Map<String, List<String>?>): HashMap<String, List<String>> = simprintsSearchViewModel.prepareEnrollmentQueryData( - searchItems = searchParametersUiState.items, + searchItems = simprintsSearchItems(), queryData = queryData, ) @@ -871,7 +1023,7 @@ class SearchTEIViewModel( when ( val action = simprintsSearchViewModel.onDashboardRequested( - searchItems = searchParametersUiState.items, + searchItems = simprintsSearchItems(), teiUid = teiUid, programUid = programUid, enrollmentUid = enrollmentUid, @@ -930,6 +1082,7 @@ class SearchTEIViewModel( value: String?, hasAutoOpenEligibleSimprintsIdentification: Boolean, ) { + clearSimprintsBiometricFallbackState() simprintsSearchViewModel.onSimprintsBiometricIdentificationResult( uid = uid, value = value, @@ -939,7 +1092,6 @@ class SearchTEIViewModel( fun onSimprintsBiometricSearchResult( uid: String, - valueType: ValueType?, responseDataJson: String?, resultCode: Int, data: Intent?, @@ -960,12 +1112,9 @@ class SearchTEIViewModel( value = result.value, hasAutoOpenEligibleSimprintsIdentification = result.hasAutoOpenEligibleIdentification, ) - onParameterIntent( - FormIntent.OnSave( - uid = uid, - value = result.value, - valueType = valueType, - ), + onSearchParameterSaved( + fieldUid = uid, + value = result.value, ) } @@ -973,14 +1122,19 @@ class SearchTEIViewModel( onSimprintsBiometricNoMatches(uid) SimprintsMapBiometricSearchResultUseCase.Result.SearchDropout -> - setSearchScreen() + onSimprintsBiometricSearchDropout() } } + fun onSimprintsBiometricSearchDropout() { + keepSearchScreenOpenForSimprintsBiometricFallback = true + setSearchScreen() + } + fun onSimprintsBiometricNoMatches(uid: String) { - queryData[uid] = listOf(SIMPRINTS_BIOMETRIC_NO_MATCH_QUERY_VALUE) + keepSearchScreenOpenForSimprintsBiometricFallback = true + updateQuery(uid, listOf(SIMPRINTS_BIOMETRIC_NO_MATCH_QUERY_VALUE)) updateSimprintsBiometricNoMatchesParameter(uid) - updateSearch() searchParametersUiState = searchParametersUiState.copy( clearSearchEnabled = true, @@ -991,13 +1145,20 @@ class SearchTEIViewModel( setListScreen() searchRepository.clearFetchedList() performSearch() + viewModelScope.launch { + _simprintsNavigation.send( + SimprintsNavigationAction.ShowMessage( + resourceManager.getString(R.string.simprints_biometric_search_no_matches), + ), + ) + } } private fun updateSimprintsBiometricNoMatchesParameter(uid: String) { val updatedItems = searchParametersUiState.items.map { if (it.uid == uid) { - (it as FieldUiModelImpl).copy( + it.copy( value = SIMPRINTS_BIOMETRIC_NO_MATCH_QUERY_VALUE, displayName = resourceManager.getString(R.string.simprints_biometric_search), ) @@ -1010,16 +1171,21 @@ class SearchTEIViewModel( } private fun isSimprintsBiometricNoMatchesSearch(): Boolean = - queryData.values.any { values -> + queryDataList.any { queryData -> + val values = queryData.values values?.singleOrNull() == SIMPRINTS_BIOMETRIC_NO_MATCH_QUERY_VALUE } + fun clearSimprintsBiometricFallbackState() { + keepSearchScreenOpenForSimprintsBiometricFallback = false + } + fun refreshSimprintsUiState() { - simprintsSearchViewModel.refreshSimprintsUiState(searchParametersUiState.items) + simprintsSearchViewModel.refreshSimprintsUiState(simprintsSearchItems()) } fun onEnrollClick() { - _legacyInteraction.postValue(LegacyInteraction.OnEnrollClick(queryData)) + _legacyInteraction.postValue(LegacyInteraction.OnEnrollClick(queryDataAsMap())) } fun onAddRelationship( @@ -1057,7 +1223,7 @@ class SearchTEIViewModel( LegacyInteraction.OnEnroll( initialProgramUid, downloadResult.teiUid, - queryData, + queryDataAsMap(), ), ) } else { @@ -1103,7 +1269,7 @@ class SearchTEIViewModel( hasProgramResults, hasGlobalResults, ) - } else if (displayFrontPageList()) { + } else if (shouldDisplayFrontPageList()) { handleDisplayInListResult(hasProgramResults) } else { handleInitWithoutData() @@ -1146,9 +1312,10 @@ class SearchTEIViewModel( } hasGlobalResults == null && - searchRepository.getProgram(initialProgramUid) != null && - searchRepository.filterQueryForProgram(queryData, null).isNotEmpty() && - searchRepository.filtersApplyOnGlobalSearch() -> { + searchRepository.getProgram(initialProgramUid) != null && + searchRepository.filterQueryForProgram(queryDataAsMap(), null) + .isNotEmpty() && + searchRepository.filtersApplyOnGlobalSearch() -> { listOf( SearchResult( SearchResult.SearchResultType.SEARCH_OUTSIDE, @@ -1158,9 +1325,9 @@ class SearchTEIViewModel( } hasGlobalResults == null && - searchRepository.getProgram(initialProgramUid) != null && - searchRepository.trackedEntityTypeFields().isNotEmpty() && - searchRepository.filtersApplyOnGlobalSearch() -> { + searchRepository.getProgram(initialProgramUid) != null && + searchRepository.trackedEntityTypeFields().isNotEmpty() && + searchRepository.filtersApplyOnGlobalSearch() -> { listOf( SearchResult( type = SearchResult.SearchResultType.UNABLE_SEARCH_OUTSIDE, @@ -1346,191 +1513,147 @@ class SearchTEIViewModel( fetchJob?.cancel() fetchJob = viewModelScope.launch { - val fieldUiModels = - hydrateInitialQueryInFields( - searchRepositoryKt.searchParameters(programUid, teiTypeUid), - ) - searchParametersUiState = - searchParametersUiState.copy( - items = preserveExistingSearchParameterValues(fieldUiModels), - ) - refreshSimprintsUiState() + fetchSearchParameters + .invoke( + input = + FetchSearchParametersData( + teiTypeUid = teiTypeUid, + programUid = programUid, + ), + ).fold( + onSuccess = { searchParameters -> + val newItems = + searchParameters.map { searchParameter -> + searchParameter.toTrackerInputUiState() + } + customIntentByFieldUid.clear() + newItems + .filter { it.customIntentUid != null } + .forEach { item -> + searchRepositoryKt.getCustomIntent(item.uid)?.let { customIntent -> + customIntentByFieldUid[item.uid] = customIntent + } + } + searchParametersUiState = + searchParametersUiState.copy( + items = preserveExistingSearchParameterValues( + hydrateInitialQueryInFields(newItems), + ), + ) - if (queryData.isNotEmpty()) { - updateSearch() - searchParametersUiState = - searchParametersUiState.copy( - clearSearchEnabled = true, - searchedItems = getFriendlyQueryData(), - ) - if (_screenState.value?.screenState == null) { - setListScreen() - } - performSearch() - } + queryDataList.forEachIndexed { index, entry -> + val searchOperator = + newItems + .firstOrNull { it.uid == entry.attributeId } + ?.searchOperator + queryDataList[index] = entry.copy(searchOperator = searchOperator) + } + refreshSimprintsUiState() + if (queryDataList.isNotEmpty()) { + updateSearch() + searchParametersUiState = + searchParametersUiState.copy( + clearSearchEnabled = true, + searchedItems = getFriendlyQueryData(), + ) + if (_screenState.value?.screenState == null) { + setListScreen() + } + performSearch() + } + }, + onFailure = { + // TODO(Implement error) + }, + ) } } - private fun hydrateInitialQueryInFields(fieldUiModels: List<FieldUiModel>): List<FieldUiModel> = - fieldUiModels.map { fieldUiModel -> - val values = queryData[fieldUiModel.uid] - if (fieldUiModel !is FieldUiModelImpl || values.isNullOrEmpty()) { - fieldUiModel + private fun hydrateInitialQueryInFields(items: List<org.dhis2.tracker.input.ui.state.TrackerInputUiState>) = + items.map { item -> + val values = queryDataList.firstOrNull { it.attributeId == item.uid }?.values + if (values.isNullOrEmpty()) { + item } else { val joinedValues = values.joinToString(",") - fieldUiModel.copy( + item.copy( value = joinedValues, displayName = displayNameProvider.provideDisplayName( - valueType = fieldUiModel.valueType, + valueType = searchRepositoryKt.trackerValueTypeToSDKValueType(item.valueType), value = joinedValues, - optionSet = fieldUiModel.optionSet, - periodType = fieldUiModel.periodSelector?.type, + optionSet = item.optionSet, + periodType = null, ), ) } } - private fun preserveExistingSearchParameterValues(fieldUiModels: List<FieldUiModel>): List<FieldUiModel> { - val currentItemsByUid = searchParametersUiState.items.associateBy(FieldUiModel::uid) - return fieldUiModels.map { fieldUiModel -> - val currentItem = currentItemsByUid[fieldUiModel.uid] - if (fieldUiModel is FieldUiModelImpl && currentItem is FieldUiModelImpl) { - fieldUiModel.copy( + private fun preserveExistingSearchParameterValues( + items: List<org.dhis2.tracker.input.ui.state.TrackerInputUiState>, + ): List<org.dhis2.tracker.input.ui.state.TrackerInputUiState> { + val currentItemsByUid = searchParametersUiState.items.associateBy { it.uid } + return items.map { item -> + val currentItem = currentItemsByUid[item.uid] + if (currentItem != null) { + item.copy( value = currentItem.value, displayName = currentItem.displayName, ) } else { - fieldUiModel + item } } } - fun onParameterIntent(formIntent: FormIntent) = - when (formIntent) { - is FormIntent.OnTextChange -> { - updateQuery( - formIntent.uid, - formIntent.value?.split(","), - ) - } - - is FormIntent.OnSave -> { - updateQuery( - formIntent.uid, - formIntent.value?.split(","), - ) - viewModelScope.launch { - simprintsSearchViewModel - .onSimprintsParameterSaved( - uid = formIntent.uid, - value = formIntent.value, - searchItems = searchParametersUiState.items, - initialProgramUid = initialProgramUid, - queryData = queryData, - )?.let { navigation -> - onNavigationPageChanged(NavigationPage.LIST_VIEW) - setListScreen() - clearQueryData() - onTeiClick( - teiUid = navigation.teiUid, - enrollmentUid = navigation.enrollmentUid, - online = navigation.isOnline, - ) - } - } - } - - is FormIntent.OnQrCodeScanned -> { - onQrCodeScanned(formIntent) - } - - is FormIntent.OnFocus -> { - val updatedItems = - searchParametersUiState.items.map { field -> - if (field.focused && field.uid != formIntent.uid) { - val validation = - field.value - ?.takeIf { - field.valueType in - listOf( - ValueType.DATE, - ValueType.DATETIME, - ValueType.AGE, - ValueType.TIME, - ) - }?.let { value -> field.valueType?.validator?.validate(value) } - - (field as FieldUiModelImpl).copy( - focused = false, - error = - when (validation) { - is Result.Failure -> resourceManager.getString(R.string.formatting_error) - else -> null - }, - ) - } else if (field.uid == formIntent.uid) { - (field as FieldUiModelImpl).copy(focused = true) - } else { - field - } - } - searchParametersUiState = searchParametersUiState.copy(items = updatedItems) - } - - is FormIntent.ClearValue -> { - updateQuery( - formIntent.uid, - null, - ) - } - - else -> { - // no-op - } - } - - private fun onQrCodeScanned(formIntent: FormIntent.OnQrCodeScanned) { + private fun onQrCodeScanned( + uid: String, + value: String?, + ) { viewModelScope.launch { updateQuery( - formIntent.uid, - formIntent.value?.let { listOf(it) }, + uid, + value?.let { listOf(it) }, ) - searching = queryData.isNotEmpty() + searching = queryDataList.isNotEmpty() searchParametersUiState = searchParametersUiState.copy( - clearSearchEnabled = queryData.isNotEmpty(), + clearSearchEnabled = queryDataList.isNotEmpty(), searchedItems = getFriendlyQueryData(), ) - val searchParametersModel = - SearchParametersModel( - selectedProgram = searchRepository.getProgram(initialProgramUid), - queryData = queryData, - ) val isOnline = searching && networkUtils.isOnline() - val trackedEntities = - async(dispatchers.io()) { - searchRepositoryKt.searchTrackedEntitiesImmediate( - searchParametersModel = searchParametersModel, - isOnline = isOnline, - ) - }.await() + val selectedProgram = searchRepository.getProgram(initialProgramUid) + + // get uids to exclude for possible duplicates + val excludeValues = searchRepositoryKt.getExcludeValues() + + val trackerSearchModel = + SearchTrackedEntitiesInput( + selectedProgram = selectedProgram?.uid(), + allowCache = false, // No need for cache in immediate search + excludeValues = excludeValues, + hasStateFilters = filterManager.stateFilters.isNotEmpty(), + isOnline = isOnline, + queryDataList = queryDataList, + ) + + // Use invokeImmediate for QR code scanning to get immediate non-paginated results + val trackedEntitiesResult = searchTrackedEntities.invokeImmediate(trackerSearchModel) + + val trackedEntities = trackedEntitiesResult.getOrNull() ?: emptyList() if (trackedEntities.isEmpty() || trackedEntities.size > 1) return@launch val tei = trackedEntities.first() + + // Transform domain model to SDK model for compatibility with existing code + val searchTeiModel = withContext(dispatchers.io()) { - searchRepository.transform( - // searchItem = + searchRepositoryKt.mapTrackedEntitySearchItemResultToSearchTeiModel( tei, - // selectedProgram = - searchParametersModel.selectedProgram, - // offlineOnly = - !(isOnline && filterManager.stateFilters.isEmpty()), - // sortingItem = filterManager.sortingItem, ) } @@ -1542,9 +1665,9 @@ class SearchTEIViewModel( // Open TEI dashboard for the found TEI onTeiClick( - teiUid = searchTeiModel.uid(), - enrollmentUid = searchTeiModel.selectedEnrollment.uid(), - online = searchTeiModel.isOnline, + teiUid = searchTeiModel.tei.uid, + enrollmentUid = searchTeiModel.selectedEnrollment.uid, + online = searchTeiModel.tei.isOnline, ) } } @@ -1553,7 +1676,7 @@ class SearchTEIViewModel( val updatedItems = searchParametersUiState.items.map { if (it.focused) { - (it as FieldUiModelImpl).copy(focused = false) + it.copy(focused = false) } else { it } @@ -1566,11 +1689,10 @@ class SearchTEIViewModel( searchParametersUiState.items .filter { !it.value.isNullOrEmpty() } .forEach { item -> - if (SimprintsIntentUtils.isIdentifyCallout(item.customIntent)) { - val isSimprintsPossibleDuplicatesSearch = _isSimprintsPossibleDuplicatesSearch.value == true + if (SimprintsIntentUtils.isIdentifyCallout(customIntentByFieldUid[item.uid])) { map[item.uid] = resourceManager.getString( - if (isSimprintsPossibleDuplicatesSearch) { + if (_isSimprintsPossibleDuplicatesSearch.value == true) { R.string.simprints_possible_duplicates } else { R.string.simprints_biometric_search @@ -1580,35 +1702,37 @@ class SearchTEIViewModel( } when (item.valueType) { - ValueType.ORGANISATION_UNIT, ValueType.MULTI_TEXT -> { + TrackerInputType.ORGANISATION_UNIT, TrackerInputType.MULTI_SELECTION -> { map[item.uid] = (item.displayName ?: "") } - ValueType.DATE, ValueType.AGE -> { + TrackerInputType.DATE, TrackerInputType.AGE -> { item.value?.let { map[item.uid] = it.toFriendlyDate() } } - ValueType.DATETIME -> { + TrackerInputType.DATE_TIME -> { item.value?.let { map[item.uid] = it.toFriendlyDateTime() } } - ValueType.BOOLEAN -> { - map[item.uid] = "${item.label}: ${item.value}" - } - - ValueType.TRUE_ONLY -> { + TrackerInputType.YES_ONLY_SWITCH, + TrackerInputType.YES_ONLY_CHECKBOX, + TrackerInputType.HORIZONTAL_RADIOBUTTONS, + TrackerInputType.VERTICAL_RADIOBUTTONS, + TrackerInputType.HORIZONTAL_CHECKBOXES, + TrackerInputType.VERTICAL_CHECKBOXES, + -> { item.value?.let { - if (it == "true") { - map[item.uid] = item.label + if (it == "true" || it == "false") { + map[item.uid] = "${item.label}: $it" } } } - ValueType.PERCENTAGE -> { + TrackerInputType.PERCENTAGE -> { item.value?.let { map[item.uid] = it.toPercentage() } @@ -1634,4 +1758,232 @@ class SearchTEIViewModel( this.layersVisibility = layersVisibility fetchMapResults() } + + fun launchCustomIntent( + fieldUid: FieldUid, + customIntentUid: CustomIntentUid, + ) { + viewModelScope.launch { + searchRepositoryKt.getCustomIntent(fieldUid)?.let { customIntentModel -> + _searchActions.send( + TrackerInputAction.LaunchCustomIntent( + fieldUid = fieldUid, + customIntentModel = customIntentModel, + ), + ) + } + } + } + + fun launchScan( + fieldUid: String, + optionSet: String?, + renderType: TrackerInputType, + ) { + val scanType = + if (renderType == TrackerInputType.QR_CODE) { + TrackerInputType.QR_CODE + } else { + TrackerInputType.BAR_CODE + } + + viewModelScope.launch { + _searchActions.send( + TrackerInputAction.Scan( + fieldUid = fieldUid, + optionSet = optionSet, + renderType = scanType, + ), + ) + } + } + + fun onValueChange( + fieldUid: String, + value: String?, + ) { + updateQuery( + fieldUid, + value?.split(","), + ) + } + + fun onItemClick(fieldUid: FieldUid) { + customIntentByFieldUid[fieldUid] + ?.takeIf(SimprintsIntentUtils::isIdentifyCallout) + ?.let { customIntentModel -> + viewModelScope.launch { + _searchActions.send( + TrackerInputAction.LaunchCustomIntent( + fieldUid = fieldUid, + customIntentModel = customIntentModel, + ), + ) + } + return + } + + searchParametersUiState + .copy( + items = + searchParametersUiState.items.map { + if (it.uid == fieldUid) { + it.copy(focused = true) + } else { + it.copy(focused = false) + } + }, + ).let { + searchParametersUiState = it + } + } + + fun handleCustomIntentResult(customIntentResult: CustomIntentResult) { + when (customIntentResult) { + is CustomIntentResult.Error -> { + updateSearchParameters( + customIntentResult.fieldUid, + null, + resourceManager.getString(R.string.custom_intent_error), + ) + } + + is CustomIntentResult.Success -> { + onSearchParameterSaved( + fieldUid = customIntentResult.fieldUid, + value = customIntentResult.value, + ) + } + + is CustomIntentResult.PossibleDuplicates -> { + updateSearchParameters( + customIntentResult.fieldUid, + null, + resourceManager.getString(R.string.custom_intent_error), + ) + } + } + } + + private fun onSearchParameterSaved( + fieldUid: String, + value: String?, + ) { + updateQuery( + fieldUid, + value?.split(","), + ) + viewModelScope.launch { + simprintsSearchViewModel + .onSimprintsParameterSaved( + uid = fieldUid, + value = value, + searchItems = simprintsSearchItems(), + initialProgramUid = initialProgramUid, + queryData = queryDataAsMap(), + )?.let { navigation -> + onNavigationPageChanged(NavigationPage.LIST_VIEW) + setListScreen() + clearQueryData() + onTeiClick( + teiUid = navigation.teiUid, + enrollmentUid = navigation.enrollmentUid, + online = navigation.isOnline, + ) + } + } + } + + fun handleScanResult( + fieldUid: String, + value: String?, + ) { + onQrCodeScanned( + uid = fieldUid, + value = value, + ) + value?.let { + updateSearchParameters( + uid = fieldUid, + values = listOf(value), + ) + } + } + + /** + * + * Converts the internal queryDataList to a map representation. + * + * Since the previous map representation of queryData (Map<String, List<String>>) is used outside + * of the SearchTEIViewModel, this function helps to represent the new and refactor. + * + * QueryData list into the Map<String, List<String>> on those places. + * We will continue to refactor the map from other places it was used in the future. And these + * methods will help us do a smooth refactor without breaking changes. + * + * After all QueryData maps are refactored, this function will be removed. + * + * @return A mutableMap with attribute IDs as keys and their corresponding value lists + * + */ + fun queryDataAsMap() = queryDataList.toMap() + + private fun simprintsSearchItems(): List<FieldUiModel> = + searchParametersUiState.items.map { item -> + FieldUiModelImpl( + uid = item.uid, + label = item.label, + value = item.value, + focused = item.focused, + error = item.error, + editable = item.editable, + warning = item.warning, + mandatory = item.mandatory, + description = item.description, + valueType = + searchRepositoryKt.trackerValueTypeToSDKValueType(item.valueType) + ?: ValueType.TEXT, + optionSet = item.optionSet, + displayName = item.displayName, + optionSetConfiguration = null, + autocompleteList = emptyList(), + orgUnitSelectorScope = item.orgUnitSelectorScope, + customIntent = customIntentByFieldUid[item.uid], + ) + } + + /** + * + * Converts the mutableList of [QueryData] to a mutableMap where keys are attribute IDs + * and values are lists of strings. + * + * @return A mutableMap with attribute IDs as keys and their corresponding value lists + * + */ + private fun MutableList<QueryData>.toMap(): MutableMap<String, List<String>?> = + this + .associate { queryData -> + val valueList = queryData.values + queryData.attributeId to valueList + }.toMutableMap() + + /** + * + * Converts a mutableMap to a mutableList of [QueryData] where map keys are attribute IDs + * and map values are lists of strings. + * + * @return A mutableList of [QueryData] objects + * + */ + private fun MutableMap<String, List<String>?>.toQueryDataList() = + this + .map { (attributeId, valuesList) -> + QueryData( + attributeId = attributeId, + values = valuesList, + searchOperator = null, + ) + }.toMutableList() + + // } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java index 614f9ffafc5..ad52a2648ed 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEModule.java @@ -3,6 +3,7 @@ import android.content.Context; import androidx.annotation.NonNull; +import androidx.lifecycle.ViewModelProvider; import com.google.gson.Gson; @@ -36,7 +37,6 @@ import org.dhis2.data.enrollment.EnrollmentUiDataHelper; import org.dhis2.data.forms.dataentry.SearchTEIRepository; import org.dhis2.data.forms.dataentry.SearchTEIRepositoryImpl; -import org.dhis2.data.service.SyncStatusController; import org.dhis2.data.sorting.SearchSortingValueSetter; import org.dhis2.form.data.metadata.FileResourceConfiguration; import org.dhis2.form.data.metadata.OptionSetConfiguration; @@ -67,15 +67,32 @@ import org.dhis2.maps.model.MapScope; import org.dhis2.maps.usecases.MapStyleConfiguration; import org.dhis2.maps.utils.DhisMapUtils; +import org.dhis2.mobile.commons.coroutine.Dispatcher; import org.dhis2.mobile.commons.customintents.CustomIntentRepository; import org.dhis2.mobile.commons.customintents.CustomIntentRepositoryImpl; +import org.dhis2.mobile.commons.error.DomainErrorMapper; +import org.dhis2.mobile.commons.network.NetworkStatusProvider; +import org.dhis2.mobile.commons.network.NetworkStatusProviderImpl; import org.dhis2.mobile.commons.reporting.CrashReportController; +import org.dhis2.mobile.commons.resources.D2ErrorMessageProvider; +import org.dhis2.mobile.commons.resources.D2ErrorMessageProviderImpl; +import org.dhis2.mobile.sync.domain.SyncStatusController; import org.dhis2.simprints.SimprintsCustomIntentResultMapper; import org.dhis2.simprints.SimprintsLoadBiometricSearchResultsUseCase; import org.dhis2.simprints.SimprintsMapBiometricSearchResultUseCase; import org.dhis2.simprints.SimprintsResolveSingleBiometricSearchNavigationUseCase; +import org.dhis2.simprints.SimprintsSearchViewModel; import org.dhis2.simprints.di.SimprintsSearchViewModelFactory; import org.dhis2.tracker.data.ProfilePictureProvider; +import org.dhis2.tracker.search.data.OptionSetRepository; +import org.dhis2.tracker.search.data.OptionSetRepositoryImpl; +import org.dhis2.tracker.search.data.SearchParametersRepository; +import org.dhis2.tracker.search.data.SearchParametersRepositoryImpl; +import org.dhis2.tracker.search.data.SearchTrackedEntityRepository; +import org.dhis2.tracker.search.data.SearchTrackedEntityRepositoryImpl; +import org.dhis2.tracker.search.domain.FetchOptionSetOptions; +import org.dhis2.tracker.search.domain.FetchSearchParameters; +import org.dhis2.tracker.search.domain.SearchTrackedEntities; import org.dhis2.ui.ThemeManager; import org.dhis2.usescases.events.EventInfoProvider; import org.dhis2.usescases.searchTrackEntity.ui.mapper.TEICardMapper; @@ -98,23 +115,27 @@ public class SearchTEModule { private final String initialProgram; private final Context moduleContext; private final Map<String, List<String>> initialQuery; + private final SyncStatusController syncStatusController; public SearchTEModule(SearchTEContractsModule.View view, String tEType, String initialProgram, Context context, - Map<String, List<String>> initialQuery) { + Map<String, List<String>> initialQuery, + SyncStatusController syncStatusController + ) { this.view = view; this.teiType = tEType; this.initialProgram = initialProgram; this.moduleContext = context; this.initialQuery = initialQuery; + this.syncStatusController = syncStatusController; } @Provides @PerActivity - SearchTEContractsModule.View provideView(SearchTEActivity searchTEActivity) { - return searchTEActivity; + SearchTEContractsModule.View provideView() { + return view; } @Provides @@ -126,7 +147,6 @@ SearchTEContractsModule.Presenter providePresenter(D2 d2, PreferenceProvider preferenceProvider, FilterRepository filterRepository, MatomoAnalyticsController matomoAnalyticsController, - SyncStatusController syncStatusController, ResourceManager resourceManager, ColorUtils colorUtils) { return new SearchTEPresenter(view, d2, searchRepository, schedulerProvider, @@ -168,35 +188,29 @@ RampDatastoreRepository provideRampDatastoreRepository(@NonNull D2 d2) { SearchRepository searchRepository(@NonNull D2 d2, FilterPresenter filterPresenter, ResourceManager resources, - SearchSortingValueSetter searchSortingValueSetter, - DhisPeriodUtils periodUtils, Charts charts, CrashReportController crashReportController, - NetworkUtils networkUtils, + NetworkStatusProvider networkStatusProvider, SearchTEIRepository searchTEIRepository, ThemeManager themeManager, - MetadataIconProvider metadataIconProvider, DateUtils dateUtils, CustomIntentRepository customIntentRepository, - RampDatastoreRepository rampDatastoreRepository) { - ProfilePictureProvider profilePictureProvider = new ProfilePictureProvider(d2); + RampDatastoreRepository rampDatastoreRepository, + DispatcherProvider dispatcherProvider) { return new SearchRepositoryImpl(teiType, initialProgram, d2, filterPresenter, resources, - searchSortingValueSetter, - periodUtils, charts, crashReportController, - networkUtils, + networkStatusProvider, searchTEIRepository, themeManager, - metadataIconProvider, - profilePictureProvider, dateUtils, customIntentRepository, - rampDatastoreRepository); + rampDatastoreRepository, + dispatcherProvider); } @Provides @@ -205,11 +219,11 @@ SearchRepositoryKt searchRepositoryKt( SearchRepository searchRepository, D2 d2, DispatcherProvider dispatcherProvider, - FieldViewModelFactory fieldViewModelFactory, MetadataIconProvider metadataIconProvider, ColorUtils colorUtils, DateUtils dateUtils, - CustomIntentRepository customIntentRepository + CustomIntentRepository customIntentRepository, + SearchSortingValueSetter sortingValueSetter ) { ResourceManager resourceManager = new ResourceManager(moduleContext, colorUtils); DateLabelProvider dateLabelProvider = new DateLabelProvider(moduleContext, new ResourceManager(moduleContext, colorUtils)); @@ -219,13 +233,12 @@ SearchRepositoryKt searchRepositoryKt( searchRepository, d2, dispatcherProvider, - fieldViewModelFactory, - metadataIconProvider, new TrackedEntityInstanceInfoProvider( d2, profilePictureProvider, dateLabelProvider, - metadataIconProvider + metadataIconProvider, + sortingValueSetter ), new EventInfoProvider( d2, @@ -383,11 +396,21 @@ SimprintsSearchViewModelFactory provideSimprintsSearchViewModelFactory( ); } + @Provides + @PerActivity + SimprintsSearchViewModel provideSimprintsSearchViewModel( + SimprintsSearchViewModelFactory simprintsSearchViewModelFactory + ) { + return new ViewModelProvider((SearchTEActivity) view, simprintsSearchViewModelFactory) + .get(SimprintsSearchViewModel.class); + } + @Provides @PerActivity SimprintsResolveSingleBiometricSearchNavigationUseCase provideSimprintsResolveSingleBiometricSearchNavigationUseCase( SearchRepository searchRepository, SearchRepositoryKt searchRepositoryKt, + SearchTrackedEntities searchTrackedEntities, NetworkUtils networkUtils, FilterManager filterManager, DispatcherProvider dispatcherProvider @@ -395,6 +418,7 @@ SimprintsResolveSingleBiometricSearchNavigationUseCase provideSimprintsResolveSi return new SimprintsResolveSingleBiometricSearchNavigationUseCase( searchRepository, searchRepositoryKt, + searchTrackedEntities, networkUtils, filterManager, dispatcherProvider.io() @@ -404,13 +428,13 @@ SimprintsResolveSingleBiometricSearchNavigationUseCase provideSimprintsResolveSi @Provides @PerActivity SimprintsLoadBiometricSearchResultsUseCase provideSimprintsLoadBiometricSearchResultsUseCase( - SearchRepository searchRepository, SearchRepositoryKt searchRepositoryKt, + SearchTrackedEntities searchTrackedEntities, SimprintsOrderSearchResultsByIdentifyResponseUseCase orderSearchResultsByIdentifyResponse ) { return new SimprintsLoadBiometricSearchResultsUseCase( - searchRepository, searchRepositoryKt, + searchTrackedEntities, orderSearchResultsByIdentifyResponse ); } @@ -453,7 +477,10 @@ SearchTeiViewModelFactory providesViewModelFactory( DisplayNameProvider displayNameProvider, FilterManager filterManager, ProgramConfigurationRepository programConfigurationRepository, - SimprintsSearchViewModelFactory simprintsSearchViewModelFactory, + SearchTrackedEntities searchTrackedEntities, + FetchSearchParameters fetchSearchParameters, + FetchOptionSetOptions fetchOptionSetOptions, + SimprintsSearchViewModel simprintsSearchViewModel, SimprintsLoadBiometricSearchResultsUseCase loadSimprintsBiometricSearchResultsUseCase, SimprintsMapBiometricSearchResultUseCase mapSimprintsBiometricSearchResult ) { @@ -475,13 +502,97 @@ SearchTeiViewModelFactory providesViewModelFactory( resourceManager, displayNameProvider, filterManager, - (SearchTEActivity) moduleContext, - simprintsSearchViewModelFactory, + searchTrackedEntities, + fetchSearchParameters, + fetchOptionSetOptions, + simprintsSearchViewModel, loadSimprintsBiometricSearchResultsUseCase, mapSimprintsBiometricSearchResult ); } + @Provides + @PerActivity + FetchSearchParameters provideFetchSearchParametersUseCase( + SearchParametersRepository searchParametersRepository + ) { + return new FetchSearchParameters( + new Dispatcher(), + searchParametersRepository + ); + } + + @Provides + @PerActivity + FetchOptionSetOptions provideFetchOptionSetOptionsUseCase( + OptionSetRepository optionSetRepository + ) { + return new FetchOptionSetOptions( + optionSetRepository + ); + } + + @Provides + @PerActivity + SearchParametersRepository provideSearchParametersRepository( + D2 d2, + CustomIntentRepository customIntentRepository, + DomainErrorMapper domainErrorMapper + ) { + return new SearchParametersRepositoryImpl( + d2, + customIntentRepository, + domainErrorMapper + ); + } + + @Provides + @PerActivity + OptionSetRepository provideOptionSetRepository( + D2 d2, + DomainErrorMapper domainErrorMapper + ) { + return new OptionSetRepositoryImpl( + d2, + domainErrorMapper + ); + } + + + + @Provides + @PerActivity + SearchTrackedEntities provideLoadSearchResultsUseCase( + SearchTrackedEntityRepository searchTrackedEntityRepository, + CustomIntentRepository customIntentRepository + ) { + return new SearchTrackedEntities( + searchTrackedEntityRepository, + customIntentRepository, + this.teiType + ); + } + + @Provides + @PerActivity + SearchTrackedEntityRepository provideLoadSearchResultsRepository( + D2 d2, + FilterPresenter filterPresenter, + ProfilePictureProvider profilePictureProvider + ) { + return new SearchTrackedEntityRepositoryImpl( + d2, + filterPresenter, + profilePictureProvider + ); + } + + @Provides + @PerActivity + ProfilePictureProvider provideProfilePictureProvider(D2 d2) { + return new ProfilePictureProvider(d2); + } + @Provides @PerActivity DateUtils provideDateUtils( @@ -550,4 +661,29 @@ WorkingListViewModelFactory provideWorkingListViewModelFactory( ) { return new WorkingListViewModelFactory(initialProgram, filterRepository); } + + @Provides + @PerActivity + DomainErrorMapper provideDomainErrorMapper( + D2ErrorMessageProvider d2ErrorMessageProvider, + NetworkStatusProvider networkStatusProvider + ) { + return new DomainErrorMapper( + d2ErrorMessageProvider, + networkStatusProvider + ); + } + + @Provides + @PerActivity + D2ErrorMessageProvider provideD2ErrorMessageProvider() { + return new D2ErrorMessageProviderImpl(); + } + + @Provides + @PerActivity + NetworkStatusProvider provideNetworkStatusProvider() { + + return new NetworkStatusProviderImpl(moduleContext); + } } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEPresenter.java b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEPresenter.java index ac7cef1d4e2..f1fc82c79a4 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEPresenter.java +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEPresenter.java @@ -27,7 +27,6 @@ import org.dhis2.commons.filters.data.FilterRepository; import org.dhis2.commons.matomo.MatomoAnalyticsController; import org.dhis2.commons.orgunitselector.OUTreeFragment; -import org.dhis2.mobile.commons.orgunit.OrgUnitSelectorScope; import org.dhis2.commons.prefs.Preference; import org.dhis2.commons.prefs.PreferenceProvider; import org.dhis2.commons.resources.ColorUtils; @@ -36,8 +35,9 @@ import org.dhis2.commons.schedulers.SchedulerProvider; import org.dhis2.commons.schedulers.SingleEventEnforcer; import org.dhis2.commons.schedulers.SingleEventEnforcerImpl; -import org.dhis2.data.service.SyncStatusController; import org.dhis2.maps.model.StageStyle; +import org.dhis2.mobile.commons.orgunit.OrgUnitSelectorScope; +import org.dhis2.mobile.sync.domain.SyncStatusController; import org.dhis2.utils.analytics.AnalyticsHelper; import org.hisp.dhis.android.core.D2; import org.hisp.dhis.android.core.common.FeatureType; @@ -84,7 +84,6 @@ public class SearchTEPresenter implements SearchTEContractsModule.Presenter { private final DisableHomeFiltersFromSettingsApp disableHomeFilters; private final MatomoAnalyticsController matomoAnalyticsController; private final SyncStatusController syncStatusController; - private final ColorUtils colorUtils; public SearchTEPresenter(SearchTEContractsModule.View view, @@ -320,7 +319,7 @@ public void enroll(String programUid, String uid, HashMap<String, List<String>> ); } - private void enrollInOrgUnit(String orgUnitUid, String programUid, String uid, HashMap<String, List<String>> queryData) { + private void enrollInOrgUnit(String orgUnitUid, String programUid, String uid, HashMap<String, List<String>> queryData) { compositeDisposable.add( searchRepository.saveToEnroll(trackedEntity.uid(), orgUnitUid, programUid, uid, queryData, view.fromRelationshipTEI()) .subscribeOn(schedulerProvider.computation()) diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTeiModel.java b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTeiModel.java index c1cd2674bc3..04573bbf6b7 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTeiModel.java +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTeiModel.java @@ -1,55 +1,28 @@ package org.dhis2.usescases.searchTrackEntity; -import org.dhis2.commons.data.CarouselItemModel; -import org.dhis2.tracker.relationships.model.RelationshipModel; import org.dhis2.mobile.commons.model.MetadataIconData; -import org.hisp.dhis.android.core.enrollment.Enrollment; +import org.dhis2.tracker.search.model.DomainEnrollment; +import org.dhis2.tracker.search.model.TrackedEntitySearchItemAttributeDomain; +import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult; import org.hisp.dhis.android.core.maintenance.D2ErrorCode; -import org.hisp.dhis.android.core.program.Program; -import org.hisp.dhis.android.core.trackedentity.TrackedEntityAttributeValue; -import org.hisp.dhis.android.core.trackedentity.TrackedEntityInstance; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Date; import java.util.HashMap; import java.util.LinkedHashMap; -import java.util.List; -import java.util.Objects; -import kotlin.Triple; +public class SearchTeiModel{ -public class SearchTeiModel implements CarouselItemModel { + private LinkedHashMap<String, TrackedEntitySearchItemAttributeDomain> attributeValues; + private LinkedHashMap<String, TrackedEntitySearchItemAttributeDomain> textAttributeValues; - private LinkedHashMap<String, TrackedEntityAttributeValue> attributeValues; - private LinkedHashMap<String, TrackedEntityAttributeValue> textAttributeValues; - - private List<Triple<String, String, String>> enrollmentsInfo; - private List<Program> programInfo; private HashMap<String, MetadataIconData> metadataIconDataMap; - private boolean hasOverdue; - private boolean isOnline; - - private TrackedEntityInstance tei; - private String profilePicturePath; - private String defaultTypeIcon; - private String header; - - private Enrollment selectedEnrollment; - private List<Enrollment> enrollments; - private Date overdueDate; - private List<RelationshipModel> relationships; + + private TrackedEntitySearchItemResult tei; + private boolean openedAttributeList = false; private String sortingKey; private String sortingValue; - private String teTypeName; - private String enrolledOrgUnit; - private String ownerOrgUnit; - private Boolean displayOrgUnit; - private boolean showNavigationButton = false; @Nullable public String onlineErrorMessage; @Nullable @@ -57,140 +30,73 @@ public class SearchTeiModel implements CarouselItemModel { public SearchTeiModel() { this.tei = null; - this.selectedEnrollment = null; this.attributeValues = new LinkedHashMap<>(); this.textAttributeValues = new LinkedHashMap<>(); - this.enrollmentsInfo = new ArrayList<>(); - this.programInfo = new ArrayList<>(); - this.isOnline = true; - this.enrollments = new ArrayList<>(); - this.relationships = new ArrayList<>(); this.sortingKey = null; this.sortingValue = null; - this.enrolledOrgUnit = null; this.onlineErrorMessage = null; this.metadataIconDataMap = new HashMap<>(); - this.ownerOrgUnit = null; } - public void addEnrollmentInfo(Triple<String, String, String> enrollmentInfo) { - enrollmentsInfo.add(enrollmentInfo); - } - public void addProgramInfo(Program program, MetadataIconData metadataIconData) { - if (!programInfo.contains(program)) { - programInfo.add(program); - metadataIconDataMap.put(program.uid(), metadataIconData); - } - } - public boolean isHasOverdue() { - return hasOverdue; - } + public void addProgramInfo(String programUid, MetadataIconData metadataIconData) { - public void setHasOverdue(boolean hasOverdue) { - this.hasOverdue = hasOverdue; - } + metadataIconDataMap.put(programUid, metadataIconData); - public boolean isOnline() { - return isOnline; } - public void setOnline(boolean online) { - isOnline = online; - this.attributeValues.clear(); - } - public LinkedHashMap<String, TrackedEntityAttributeValue> getAttributeValues() { + public LinkedHashMap<String, TrackedEntitySearchItemAttributeDomain> getAttributeValues() { return attributeValues; } - public LinkedHashMap<String, TrackedEntityAttributeValue> getTextAttributeValues() { + public LinkedHashMap<String, TrackedEntitySearchItemAttributeDomain> getTextAttributeValues() { return textAttributeValues; } - public void addAttributeValue(String attributeName, TrackedEntityAttributeValue attributeValues) { + public void addAttributeValue(String attributeName, TrackedEntitySearchItemAttributeDomain attributeValues) { this.attributeValues.put(attributeName, attributeValues); } - public void addTextAttribute(String attributeName, TrackedEntityAttributeValue attributeValue) { + public void addTextAttribute(String attributeName, TrackedEntitySearchItemAttributeDomain attributeValue) { this.textAttributeValues.put(attributeName, attributeValue); } - public void resetEnrollments() { - this.enrollments.clear(); - this.enrollmentsInfo.clear(); - } - - public void setAttributeValues(LinkedHashMap<String, TrackedEntityAttributeValue> attributeValues) { + public void setAttributeValues(LinkedHashMap<String, TrackedEntitySearchItemAttributeDomain> attributeValues) { this.attributeValues = attributeValues; } - public void setTei(TrackedEntityInstance tei) { + public void setTei(TrackedEntitySearchItemResult tei) { this.tei = tei; } - public TrackedEntityInstance getTei() { + public TrackedEntitySearchItemResult getTei() { return tei; } - public void setProfilePicture(String profilePicturePath) { - this.profilePicturePath = profilePicturePath; - } public String getProfilePicturePath() { - return profilePicturePath != null ? profilePicturePath : ""; + return this.tei.getProfilePicture() != null ? this.tei.getProfilePicture() : ""; } - public void setDefaultTypeIcon(String defaultTypeIcon) { - this.defaultTypeIcon = defaultTypeIcon; - } + @Nullable public String getDefaultTypeIcon() { - return defaultTypeIcon; - } - - public void setHeader(String header) { - this.header = header; + return this.tei.getDefaultTypeIcon(); } @Nullable public String getHeader() { - return header; - } - - public void setCurrentEnrollment(Enrollment enrollment) { - this.selectedEnrollment = enrollment; + return this.tei.getHeader(); } - public Enrollment getSelectedEnrollment() { - return this.selectedEnrollment; - } - - public void addEnrollment(Enrollment enrollment) { - this.enrollments.add(enrollment); - } - public List<Enrollment> getEnrollments() { - return enrollments; - } - - public List<Program> getProgramInfo() { - Collections.sort(programInfo, (program1, program2) -> program1.displayName().compareToIgnoreCase(program2.displayName())); - if (selectedEnrollment != null) { - List<Program> programs = new ArrayList<>(); - for (Program program : programInfo) { - if (!Objects.equals(selectedEnrollment.program(), program.uid())) { - programs.add(program); - } - } - return programs; - } else { - return programInfo; - } + public DomainEnrollment getSelectedEnrollment() { + return this.tei.getSelectedEnrollment(); } public MetadataIconData getMetadataIconData(@Nullable String programUid) { @@ -211,22 +117,6 @@ public Boolean isMetadataIconDataAvailable(@Nullable String programUid) { } } - public void setOverdueDate(Date dateToShow) { - this.overdueDate = dateToShow; - } - - public Date getOverdueDate() { - return overdueDate; - } - - public List<RelationshipModel> getRelationships() { - return relationships; - } - - public void setRelationships(List<RelationshipModel> relationships) { - this.relationships = relationships; - } - public void toggleAttributeList() { this.openedAttributeList = !this.openedAttributeList; } @@ -250,49 +140,5 @@ public String getSortingValue() { return sortingValue; } - public void setTEType(String teTypeName) { - this.teTypeName = teTypeName; - } - - public String getTeTypeName() { - return teTypeName; - } - - @NotNull - @Override - public String uid() { - return tei.uid(); - } - - public void setEnrolledOrgUnit(String orgUnit) { - enrolledOrgUnit = orgUnit; - } - - public String getEnrolledOrgUnit() { - return enrolledOrgUnit; - } - - public void setOwnerOrgUnit(String orgUnit) { - ownerOrgUnit = orgUnit; - } - public String getOwnerOrgUnit() { - return ownerOrgUnit; - } - - public void setDisplayOrgUnit(Boolean display) { - displayOrgUnit = display; - } - - public Boolean getDisplayOrgUnit() { - return displayOrgUnit; - } - - public void setShowNavigationButton(boolean showNavigationButton) { - this.showNavigationButton = showNavigationButton; - } - - public boolean shouldShowNavigationButton() { - return showNavigationButton; - } } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTeiViewModelFactory.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTeiViewModelFactory.kt index 0fca0b3268d..2f9efaf2021 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTeiViewModelFactory.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTeiViewModelFactory.kt @@ -11,7 +11,9 @@ import org.dhis2.maps.usecases.MapStyleConfiguration import org.dhis2.simprints.SimprintsLoadBiometricSearchResultsUseCase import org.dhis2.simprints.SimprintsMapBiometricSearchResultUseCase import org.dhis2.simprints.SimprintsSearchViewModel -import org.dhis2.simprints.di.SimprintsSearchViewModelFactory +import org.dhis2.tracker.search.domain.FetchOptionSetOptions +import org.dhis2.tracker.search.domain.FetchSearchParameters +import org.dhis2.tracker.search.domain.SearchTrackedEntities class SearchTeiViewModelFactory( private val searchRepository: SearchRepository, @@ -26,8 +28,10 @@ class SearchTeiViewModelFactory( private val resourceManager: ResourceManager, private val displayNameProvider: DisplayNameProvider, private val filterManager: FilterManager, - private val searchActivity: SearchTEActivity, - private val simprintsSearchViewModelFactory: SimprintsSearchViewModelFactory, + private val searchTrackedEntities: SearchTrackedEntities, + private val fetchSearchParameters: FetchSearchParameters, + private val fetchOptionSetOptions: FetchOptionSetOptions, + private val simprintsSearchViewModel: SimprintsSearchViewModel, private val loadSimprintsBiometricSearchResultsUseCase: SimprintsLoadBiometricSearchResultsUseCase, private val mapSimprintsBiometricSearchResult: SimprintsMapBiometricSearchResultUseCase, ) : ViewModelProvider.Factory { @@ -45,7 +49,10 @@ class SearchTeiViewModelFactory( resourceManager, displayNameProvider, filterManager, - ViewModelProvider(searchActivity, simprintsSearchViewModelFactory)[SimprintsSearchViewModel::class.java], + searchTrackedEntities, + fetchSearchParameters, + fetchOptionSetOptions, + simprintsSearchViewModel, loadSimprintsBiometricSearchResultsUseCase, mapSimprintsBiometricSearchResult, ) as T diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/BaseTeiViewHolder.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/BaseTeiViewHolder.kt index d38456551d0..75ba63d16fe 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/BaseTeiViewHolder.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/BaseTeiViewHolder.kt @@ -3,15 +3,13 @@ package org.dhis2.usescases.searchTrackEntity.adapters import android.view.View import androidx.compose.ui.platform.ViewCompositionStrategy import androidx.recyclerview.widget.RecyclerView -import org.dhis2.commons.bindings.getEnrollmentIconsData -import org.dhis2.commons.bindings.hasFollowUp import org.dhis2.commons.bindings.paintAllEnrollmentIcons -import org.dhis2.commons.bindings.setAttributeList -import org.dhis2.commons.bindings.setStatusText import org.dhis2.commons.data.EnrollmentIconData import org.dhis2.commons.date.toDateSpan import org.dhis2.commons.resources.ColorUtils import org.dhis2.databinding.ItemSearchTrackedEntityBinding +import org.dhis2.mobile.commons.extensions.toJavaDate +import org.dhis2.tracker.search.data.toSDKState import org.dhis2.usescases.searchTrackEntity.SearchTeiModel abstract class BaseTeiViewHolder( @@ -43,32 +41,32 @@ abstract class BaseTeiViewHolder( } binding.apply { - overdue = teiModel.isHasOverdue - isOnline = teiModel.isOnline - orgUnit = teiModel.enrolledOrgUnit - teiSyncState = teiModel.tei.state() + overdue = teiModel.tei.overDueDate?.toJavaDate() != null + isOnline = teiModel.tei.isOnline + orgUnit = teiModel.tei.enrollmentOrgUnit + teiSyncState = teiModel.tei.aggregatedSyncState?.toSDKState() attribute = teiModel.attributeValues.values.toList() attributeNames = teiModel.attributeValues.keys attributeListOpened = teiModel.isAttributeListOpen - lastUpdated.text = teiModel.tei.lastUpdated().toDateSpan(itemView.context) + lastUpdated.text = teiModel.tei.lastUpdated?.toJavaDate()?.toDateSpan(itemView.context) sortingValue = teiModel.sortingValue } teiModel.apply { - binding.setFollowUp(enrollments.hasFollowUp()) - val enrollmentIconDataList: List<EnrollmentIconData> = - programInfo.getEnrollmentIconsData( - if (selectedEnrollment != null) selectedEnrollment.program() else null, + binding.setFollowUp(tei.enrollments?.hasFollowUp()) + val enrollmentIconDataList: List<EnrollmentIconData>? = + tei.enrolledPrograms?.getEnrollmentIconsData( + if (selectedEnrollment != null) selectedEnrollment.program else null, ) { programUid -> getMetadataIconData(programUid) } - enrollmentIconDataList.paintAllEnrollmentIcons( + enrollmentIconDataList?.paintAllEnrollmentIcons( binding.composeProgramList, ) if (selectedEnrollment != null) { selectedEnrollment.setStatusText( itemView.context, binding.enrollmentStatus, - isHasOverdue, - overdueDate, + teiModel.tei.overDueDate != null, + teiModel.tei.overDueDate?.toJavaDate(), ) } setTeiImage( @@ -85,7 +83,7 @@ abstract class BaseTeiViewHolder( teiModel.isAttributeListOpen, teiModel.sortingKey, teiModel.sortingValue, - teiModel.enrolledOrgUnit, + teiModel.tei.enrollmentOrgUnit, ) { attributeVisibilityCallback() } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchAdapterDiffCallback.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchAdapterDiffCallback.kt index a2c66cac0fe..4b02a4f7c01 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchAdapterDiffCallback.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchAdapterDiffCallback.kt @@ -7,21 +7,15 @@ class SearchAdapterDiffCallback : DiffUtil.ItemCallback<SearchTeiModel>() { override fun areItemsTheSame( oldItem: SearchTeiModel, newItem: SearchTeiModel, - ): Boolean = oldItem.tei?.uid() == newItem.tei?.uid() + ): Boolean = oldItem.tei?.uid == newItem.tei?.uid override fun areContentsTheSame( oldItem: SearchTeiModel, - newItem: SearchTeiModel, - ): Boolean = - oldItem.tei?.uid() == newItem.tei?.uid() && - oldItem.tei?.state() == newItem.tei?.state() && - oldItem.attributeValues == newItem.attributeValues && - oldItem.enrollments == newItem.enrollments && - oldItem.profilePicturePath == newItem.profilePicturePath && - oldItem.isAttributeListOpen == newItem.isAttributeListOpen && - oldItem.sortingKey == newItem.sortingKey && - oldItem.sortingValue == newItem.sortingValue && - oldItem.enrolledOrgUnit == newItem.enrolledOrgUnit + newItem: SearchTeiModel + ): Boolean { + return oldItem.tei == newItem.tei + } + override fun getChangePayload( oldItem: SearchTeiModel, diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchRelationshipViewHolder.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchRelationshipViewHolder.kt index d6195b0c073..a0c9c0dd43f 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchRelationshipViewHolder.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchRelationshipViewHolder.kt @@ -21,7 +21,7 @@ class SearchRelationshipViewHolder( override fun itemViewClick() { itemView.setOnClickListener { - onAddRelationship(teiModel.tei.uid(), null, teiModel.isOnline) + onAddRelationship(teiModel.tei.uid, null, teiModel.tei.isOnline) } } } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchTEViewHolder.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchTEViewHolder.kt index 330961652fb..b4ec44dfff8 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchTEViewHolder.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchTEViewHolder.kt @@ -19,9 +19,8 @@ class SearchTEViewHolder( override fun itemViewClick() { binding.syncState.setOnClickListener { - if (teiModel.tei.deleted()!! || - teiModel.selectedEnrollment != null && - teiModel.selectedEnrollment.deleted()!! + if (teiModel.tei.deleted || + teiModel.tei.selectedEnrollment == null ) { Toast .makeText( @@ -30,28 +29,28 @@ class SearchTEViewHolder( Toast.LENGTH_SHORT, ).show() } else { - onSyncIconClick(teiModel.selectedEnrollment.uid()) + onSyncIconClick(teiModel.selectedEnrollment.uid) } } binding.download.setOnClickListener { onDownloadTei( - teiModel.tei.uid(), - teiModel.selectedEnrollment?.uid(), + teiModel.tei.uid, + teiModel.selectedEnrollment?.uid, ) } binding.cardView.setOnClickListener { - if (teiModel.isOnline) { + if (teiModel.tei.isOnline) { onDownloadTei( - teiModel.tei.uid(), - teiModel.selectedEnrollment?.uid(), + teiModel.tei.uid, + teiModel.selectedEnrollment?.uid, ) } else { onTeiClick( - teiModel.tei.uid(), - teiModel.selectedEnrollment?.uid(), - teiModel.isOnline, + teiModel.tei.uid, + teiModel.selectedEnrollment?.uid, + teiModel.tei.isOnline, ) } } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchTeiLiveAdapter.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchTeiLiveAdapter.kt index dfcc27b0d80..ff7f6f75061 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchTeiLiveAdapter.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchTeiLiveAdapter.kt @@ -98,19 +98,19 @@ class SearchTeiLiveAdapter( cardMapper.map( searchTEIModel = it, onSyncIconClick = { - onSyncIconClick.invoke(it.selectedEnrollment.uid()) + onSyncIconClick.invoke(it.selectedEnrollment.uid) }, onCardClick = { - if (it.isOnline) { + if (it.tei.isOnline) { onDownloadTei.invoke( - it.tei.uid(), - it.selectedEnrollment?.uid(), + it.tei.uid, + it.selectedEnrollment?.uid, ) } else { onTeiClick.invoke( - it.tei.uid(), - it.selectedEnrollment?.uid(), - it.isOnline, + it.tei.uid, + it.selectedEnrollment?.uid, + it.tei.isOnline, ) } }, diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchTeiModelExtensions.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchTeiModelExtensions.kt index 4574129cbfe..7d013ed988c 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchTeiModelExtensions.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/adapters/SearchTeiModelExtensions.kt @@ -3,19 +3,34 @@ package org.dhis2.usescases.searchTrackEntity.adapters import android.content.Context import android.graphics.PorterDuff import android.graphics.PorterDuffColorFilter +import android.graphics.drawable.GradientDrawable +import android.view.LayoutInflater import android.view.View import android.widget.ImageView +import android.widget.LinearLayout import android.widget.TextView import androidx.appcompat.content.res.AppCompatResources +import androidx.core.content.res.ResourcesCompat +import androidx.core.graphics.toColorInt import com.bumptech.glide.Glide import com.bumptech.glide.load.resource.bitmap.CircleCrop import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions import org.dhis2.commons.R +import org.dhis2.commons.bindings.getRemainingEnrollmentsForTei +import org.dhis2.commons.data.EnrollmentIconData +import org.dhis2.commons.databinding.ItemFieldValueBinding +import org.dhis2.commons.date.toUiText import org.dhis2.commons.resources.ColorType import org.dhis2.commons.resources.ColorUtils import org.dhis2.commons.resources.ResourceManager +import org.dhis2.mobile.commons.model.MetadataIconData +import org.dhis2.tracker.search.model.DomainEnrollment +import org.dhis2.tracker.search.model.DomainProgram +import org.dhis2.tracker.search.model.EnrollmentStatus +import org.dhis2.tracker.search.model.TrackedEntitySearchItemAttributeDomain import org.dhis2.usescases.searchTrackEntity.SearchTeiModel import java.io.File +import java.util.Date fun SearchTeiModel.setTeiImage( context: Context, @@ -58,16 +73,16 @@ fun SearchTeiModel.setTeiImage( textAttributeValues != null && textAttributeValues.values.isNotEmpty() && - ArrayList(textAttributeValues.values)[0].value() != "-" -> { + ArrayList(textAttributeValues.values)[0].value != "-" -> { teiImageView.setImageDrawable(null) teiTextImageView.visibility = View.VISIBLE val valueToShow = ArrayList(textAttributeValues.values) - if (valueToShow[0]?.value()?.isEmpty() != false) { + if (valueToShow[0]?.value?.isEmpty() != false) { teiTextImageView.text = "?" } else { teiTextImageView.text = valueToShow[0] - .value() + .value ?.first() .toString() .uppercase() @@ -82,9 +97,9 @@ fun SearchTeiModel.setTeiImage( ) } - isOnline && + tei.isOnline && attributeValues.isNotEmpty() && - ArrayList(attributeValues.values).firstOrNull()?.value()?.isNotEmpty() == true -> { + ArrayList(attributeValues.values).firstOrNull()?.value?.isNotEmpty() == true -> { teiImageView.setImageDrawable(null) teiTextImageView.visibility = View.VISIBLE val valueToShow = ArrayList(attributeValues.values) @@ -93,7 +108,7 @@ fun SearchTeiModel.setTeiImage( } else { teiTextImageView.text = valueToShow[0] - .value() + .value ?.first() .toString() .uppercase() @@ -143,3 +158,147 @@ fun SearchTeiModel.setTeiImage( } } } + +fun LinkedHashMap<String, TrackedEntitySearchItemAttributeDomain>.setAttributeList( + parentLayout: LinearLayout, + showAttributesButton: ImageView, + adapterPosition: Int, + listIsOpen: Boolean, + sortingKey: String?, + sortingValue: String?, + orgUnit: String?, + showList: () -> Unit, +) { + parentLayout.removeAllViews() + if (size > 3) { + for (pos in 1 until size) { + val fieldName = + keys.toTypedArray()[pos] + val fieldValue = this[fieldName]?.value + val itemFieldValueBinding = + ItemFieldValueBinding.inflate(LayoutInflater.from(parentLayout.context)) + itemFieldValueBinding.name = fieldName + itemFieldValueBinding.value = fieldValue + itemFieldValueBinding.root.tag = adapterPosition.toString() + "_" + fieldName + parentLayout.addView(itemFieldValueBinding.root) + } + val orgUnitKey = parentLayout.context.getString(R.string.enrolled_in) + val itemFieldValueBinding = + ItemFieldValueBinding.inflate(LayoutInflater.from(parentLayout.context)) + itemFieldValueBinding.name = orgUnitKey + itemFieldValueBinding.value = orgUnit + itemFieldValueBinding.root.tag = adapterPosition.toString() + "_" + orgUnitKey + parentLayout.addView(itemFieldValueBinding.root) + if (sortingKey != null) { + val binding = + ItemFieldValueBinding.inflate(LayoutInflater.from(parentLayout.context)) + binding.name = sortingKey + binding.fieldName.setTextColor( + ResourcesCompat.getColor( + binding.fieldName.context.resources, + R.color.sorting_attribute_key_color, + null, + ), + ) + binding.value = sortingValue + binding.fieldValue.setTextColor( + ResourcesCompat.getColor( + binding.fieldValue.context.resources, + R.color.sorting_attribute_value_color, + null, + ), + ) + binding.root.tag = adapterPosition.toString() + "_" + sortingValue + parentLayout.addView(binding.root) + } + showAttributesButton.scaleY = if (listIsOpen) -1F else 1F + showAttributesButton.setOnClickListener { + showList() + } + } else { + showAttributesButton.setOnClickListener(null) + } +} + + + +fun DomainEnrollment.setStatusText( + context: Context, + statusTextView: TextView, + isOverdue: Boolean, + dueDate: Date?, +) { + var textToShow: String? = null + var color = -1 + when { + isOverdue -> { + textToShow = dueDate.toUiText(context) + color = "#E91E63".toColorInt() + } + + status == EnrollmentStatus.CANCELLED -> { + textToShow = context.getString(R.string.cancelled) + color = "#E91E63".toColorInt() + } + + status == EnrollmentStatus.COMPLETED -> { + textToShow = context.getString(R.string.enrollment_status_completed) + color = "#8A333333".toColorInt() + } + } + statusTextView.visibility = if (textToShow == null) View.GONE else View.VISIBLE + statusTextView.text = textToShow + statusTextView.setTextColor(color) + val bgDrawable = + AppCompatResources.getDrawable( + context, + R.drawable.round_border_box_2, + ) as GradientDrawable? + bgDrawable!!.setStroke(2, color) + statusTextView.background = bgDrawable +} + + +fun List<DomainEnrollment>.hasFollowUp(): Boolean = + firstOrNull { enrollment -> + enrollment.followUp + }?.followUp ?: false + +fun List<DomainProgram>.getEnrollmentIconsData( + currentProgram: String?, + provideMetadataIconData: (String) -> MetadataIconData, +): List<EnrollmentIconData> { + val enrollmentIconDataList: MutableList<EnrollmentIconData> = mutableListOf() + + val filteredList = this.filter { it.uid != currentProgram } + this.filter { it.uid != currentProgram } + .forEachIndexed { index, program -> + filteredList.size.let { + if (it <= 4) { + enrollmentIconDataList.add( + EnrollmentIconData(0, 0, true, 0, + provideMetadataIconData(program.uid)), + ) + } else { + if (index in 0..2) { + enrollmentIconDataList.add( + EnrollmentIconData(0, 0, true, 0, provideMetadataIconData(program.uid)), + ) + } + if (index == 3) { + enrollmentIconDataList.add( + EnrollmentIconData( + 0, + 0, + false, + getRemainingEnrollmentsForTei(filteredList.size), + provideMetadataIconData(program.uid), + ), + ) + } + } + } + } + return enrollmentIconDataList +} + diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/di/SearchTEKoinModule.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/di/SearchTEKoinModule.kt new file mode 100644 index 00000000000..658a02d765d --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/di/SearchTEKoinModule.kt @@ -0,0 +1,128 @@ +package org.dhis2.usescases.searchTrackEntity.di + +import org.dhis2.commons.simprints.repository.SimprintsD2Repository +import org.dhis2.commons.simprints.repository.SimprintsSessionRepository +import org.dhis2.commons.simprints.usecases.SimprintsHasAutoOpenEligibleIdentificationUseCase +import org.dhis2.commons.simprints.usecases.SimprintsOrderSearchResultsByIdentifyResponseUseCase +import org.dhis2.commons.simprints.usecases.SimprintsResolveConfirmIdentityCalloutUseCase +import org.dhis2.commons.viewmodel.DispatcherProvider +import org.dhis2.simprints.SimprintsCustomIntentResultMapper +import org.dhis2.simprints.SimprintsLoadBiometricSearchResultsUseCase +import org.dhis2.simprints.SimprintsMapBiometricSearchResultUseCase +import org.dhis2.simprints.SimprintsResolveSingleBiometricSearchNavigationUseCase +import org.dhis2.simprints.SimprintsSearchViewModel +import org.dhis2.usescases.searchTrackEntity.SearchRepository +import org.dhis2.usescases.searchTrackEntity.SearchTEIViewModel +import org.dhis2.usescases.searchTrackEntity.SearchTeiViewModelFactory +import org.koin.core.module.dsl.viewModel +import org.koin.core.parameter.parametersOf +import org.koin.dsl.module + +/** + * Koin module for Search Tracked Entity feature. + * This module provides dependencies for SearchTEIViewModel and related components. + * + * Note: This module coexists with the legacy Dagger SearchTEModule during the migration. + */ +val searchTEKoinModule = + module { + factory { SimprintsSessionRepository(get()) } + factory { SimprintsD2Repository(get()) } + factory { SimprintsResolveConfirmIdentityCalloutUseCase(get()) } + factory { SimprintsOrderSearchResultsByIdentifyResponseUseCase(get()) } + factory { SimprintsHasAutoOpenEligibleIdentificationUseCase() } + factory { SimprintsCustomIntentResultMapper() } + factory { SimprintsMapBiometricSearchResultUseCase(get(), get(), get()) } + factory { params -> + val teType: String = params.get() + SimprintsResolveSingleBiometricSearchNavigationUseCase( + searchRepository = get(), + searchRepositoryKt = get(), + searchTrackedEntities = get { parametersOf(teType) }, + networkUtils = get(), + filterManager = get(), + ioDispatcher = get<DispatcherProvider>().io(), + ) + } + factory { params -> + val teType: String = params.get() + SimprintsLoadBiometricSearchResultsUseCase( + searchRepositoryKt = get(), + searchTrackedEntities = get { parametersOf(teType) }, + orderSearchResultsByIdentifyResponse = get(), + ) + } + factory { params -> + val teType: String = params.get() + SimprintsSearchViewModel( + resolveConfirmIdentityCallout = get(), + sessionRepository = get(), + resolveSingleBiometricSearchNavigation = get { parametersOf(teType) }, + ) + } + + // SearchTeiViewModelFactory + // Factory for creating SearchTEIViewModel instances with SearchTrackedEntities + factory { params -> + val initialProgramUid: String? = params.getOrNull() + val initialQuery: MutableMap<String, List<String>?>? = params.getOrNull() + val teType: String = params.get() // teType is required + + // Get SearchRepository from Dagger to access teType + val searchRepository: SearchRepository = get() + + SearchTeiViewModelFactory( + searchRepository = searchRepository, + searchRepositoryKt = get(), + searchNavPageConfigurator = get(), + initialProgramUid = initialProgramUid, + initialQuery = initialQuery, + mapDataRepository = get(), + networkUtils = get(), + dispatchers = get(), + mapStyleConfig = get(), + resourceManager = get(), + displayNameProvider = get(), + filterManager = get(), + searchTrackedEntities = get { parametersOf(teType) }, + fetchSearchParameters = get(), + fetchOptionSetOptions = get(), + simprintsSearchViewModel = get { parametersOf(teType) }, + loadSimprintsBiometricSearchResultsUseCase = get { parametersOf(teType) }, + mapSimprintsBiometricSearchResult = get(), + ) + } + + // SearchTEIViewModel + // Note: This ViewModel requires parameters (initialProgramUid, initialQuery, teType) + // Use: viewModel { parametersOf(programUid, queryMap, teType) } + viewModel { params -> + val initialProgramUid: String? = params.getOrNull() + val initialQuery: MutableMap<String, List<String>?>? = params.getOrNull() + val teType: String = params.get() // teType is required + + // Get SearchRepository from Dagger + val searchRepository: SearchRepository = get() + + SearchTEIViewModel( + initialProgramUid = initialProgramUid, + initialQuery = initialQuery, + searchRepository = searchRepository, + searchRepositoryKt = get(), + searchNavPageConfigurator = get(), + mapDataRepository = get(), + networkUtils = get(), + dispatchers = get(), + mapStyleConfig = get(), + resourceManager = get(), + displayNameProvider = get(), + filterManager = get(), + searchTrackedEntities = get { parametersOf(teType) }, + fetchSearchParameters = get(), + fetchOptionSetOptions = get(), + simprintsSearchViewModel = get { parametersOf(teType) }, + loadSimprintsBiometricSearchResultsUseCase = get { parametersOf(teType) }, + mapSimprintsBiometricSearchResult = get(), + ) + } + } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt index b3a800e2598..66ea4e6e31b 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/listView/SearchTEList.kt @@ -113,6 +113,8 @@ class SearchTEList : FragmentGlobalAbstract() { arguments?.getBoolean(ARG_FROM_RELATIONSHIP) ?: false } + private var pagesUpdatedListener: (() -> Unit)? = null + companion object { fun get(fromRelationships: Boolean): SearchTEList = SearchTEList().apply { @@ -152,6 +154,12 @@ class SearchTEList : FragmentGlobalAbstract() { observeNewData() }.root + override fun onDestroyView() { + pagesUpdatedListener?.let { liveAdapter.removeOnPagesUpdatedListener(it) } + pagesUpdatedListener = null + super.onDestroyView() + } + override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) val layoutManager = recycler.layoutManager as? LinearLayoutManager @@ -286,7 +294,7 @@ class SearchTEList : FragmentGlobalAbstract() { val teTypeName by viewModel.teTypeName.observeAsState() val hasQueryData = remember(viewModel.searchParametersUiState) { - viewModel.queryData.isNotEmpty() + viewModel.queryDataList.isNotEmpty() } val isSimprintsUseLastBiometricsLabel by viewModel .isSimprintsUseLastBiometricsLabel @@ -353,7 +361,7 @@ class SearchTEList : FragmentGlobalAbstract() { viewModel.dataResult.observe(viewLifecycleOwner) { initLoading(emptyList()) it.firstOrNull()?.let { searchResult -> - if (searchResult.shouldClearProgramData()) { + if (searchResult.shouldClearProgramData() && liveAdapter.itemCount > 0) { liveAdapter.refresh() } if (searchResult.shouldClearGlobalData()) { @@ -413,13 +421,16 @@ class SearchTEList : FragmentGlobalAbstract() { private fun initData() { displayLoadingData() + val listener: () -> Unit = { + onInitDataLoaded() + CoroutineTracker.decrement() + } + pagesUpdatedListener = listener + liveAdapter.addOnPagesUpdatedListener(listener) + lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.searchPagingData.collect { data -> - liveAdapter.addOnPagesUpdatedListener { - onInitDataLoaded() - CoroutineTracker.decrement() - } + viewModel.searchPagingData.collectLatest { data -> liveAdapter.submitData(lifecycle, data) } } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/mapView/SearchTEMap.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/mapView/SearchTEMap.kt index 47e93807243..9d11c084c0b 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/mapView/SearchTEMap.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/mapView/SearchTEMap.kt @@ -12,10 +12,8 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Icon import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState -import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.ComposeView @@ -133,9 +131,7 @@ class SearchTEMap : FragmentGlobalAbstract() { val listState = rememberLazyListState() val trackerMapData by viewModel.mapResults.collectAsState(initial = null) - val items by remember { - derivedStateOf { trackerMapData?.mapItems ?: emptyList() } - } + val items = trackerMapData?.mapItems ?: emptyList() val clickedItem by viewModel.mapItemClicked.collectAsState(initial = null) @@ -152,17 +148,21 @@ class SearchTEMap : FragmentGlobalAbstract() { } } - LaunchedEffect(key1 = items) { + LaunchedEffect(key1 = trackerMapData) { trackerMapData?.let { data -> teiMapManager ?.takeIf { it.isMapReady() } - ?.update( - data.teiFeatures, - data.eventFeatures, - data.dataElementFeaturess, - data.teiBoundingBox, - ).also { - viewModel.mapManager = teiMapManager + ?.also { manager -> + manager.update( + data.teiFeatures, + data.eventFeatures, + data.dataElementFeaturess, + data.teiBoundingBox, + ) + if (manager.autoSelectFirstLayerWithData()) { + viewModel.filterVisibleMapItems(manager.mapLayerManager.mapLayers) + } + viewModel.mapManager = manager } } } diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreen.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreen.kt deleted file mode 100644 index f13ee538e22..00000000000 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreen.kt +++ /dev/null @@ -1,504 +0,0 @@ -package org.dhis2.usescases.searchTrackEntity.searchparameters - -import android.content.Intent -import android.content.res.Configuration -import androidx.activity.compose.rememberLauncherForActivityResult -import androidx.activity.result.contract.ActivityResultContracts -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.calculateEndPadding -import androidx.compose.foundation.layout.calculateStartPadding -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.itemsIndexed -import androidx.compose.foundation.shape.CornerSize -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.outlined.Cancel -import androidx.compose.material.icons.outlined.ErrorOutline -import androidx.compose.material3.Icon -import androidx.compose.material3.Scaffold -import androidx.compose.material3.SnackbarDuration -import androidx.compose.material3.SnackbarHost -import androidx.compose.material3.SnackbarHostState -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.saveable.rememberSaveable -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.ComposeView -import androidx.compose.ui.platform.LocalConfiguration -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.platform.LocalLayoutDirection -import androidx.compose.ui.platform.testTag -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import com.google.gson.Gson -import com.journeyapps.barcodescanner.ScanOptions -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.flow.emptyFlow -import kotlinx.coroutines.launch -import org.dhis2.R -import org.dhis2.commons.Constants -import org.dhis2.commons.resources.ColorUtils -import org.dhis2.commons.resources.ResourceManager -import org.dhis2.commons.simprints.utils.SimprintsIntentUtils -import org.dhis2.form.data.scan.ScanContract -import org.dhis2.form.model.FieldUiModel -import org.dhis2.form.model.FieldUiModelImpl -import org.dhis2.form.ui.event.RecyclerViewUiEvents -import org.dhis2.form.ui.intent.FormIntent -import org.dhis2.mobile.commons.orgunit.OrgUnitSelectorScope -import org.dhis2.usescases.searchTrackEntity.SearchTEIViewModel -import org.dhis2.usescases.searchTrackEntity.searchparameters.model.SearchParametersUiState -import org.dhis2.usescases.searchTrackEntity.searchparameters.provider.provideParameterSelectorItem -import org.hisp.dhis.android.core.common.ValueType -import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItemColor -import org.hisp.dhis.mobile.ui.designsystem.component.Button -import org.hisp.dhis.mobile.ui.designsystem.component.ButtonStyle -import org.hisp.dhis.mobile.ui.designsystem.component.InfoBar -import org.hisp.dhis.mobile.ui.designsystem.component.parameter.ParameterSelectorItem -import org.hisp.dhis.mobile.ui.designsystem.theme.Radius -import org.hisp.dhis.mobile.ui.designsystem.theme.Shape -import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor -import org.hisp.dhis.mobile.ui.designsystem.theme.TextColor - -@Composable -fun SearchParametersScreen( - resourceManager: ResourceManager, - uiState: SearchParametersUiState, - intentHandler: (FormIntent) -> Unit, - onSimprintsBiometricSearchResult: (String, ValueType?, String?, Int, Intent?, Boolean) -> Unit, - simprintsBiometricIdentificationLaunch: Flow<Unit> = emptyFlow(), - onShowOrgUnit: ( - uid: String, - preselectedOrgUnits: List<String>, - orgUnitScope: OrgUnitSelectorScope, - label: String, - ) -> Unit, - onSearch: () -> Unit, - onClear: () -> Unit, - onClose: () -> Unit, -) { - val snackBarHostState = remember { SnackbarHostState() } - val coroutineScope = rememberCoroutineScope() - val focusManager = LocalFocusManager.current - val configuration = LocalConfiguration.current - var pendingSimprintsFieldUid by rememberSaveable { mutableStateOf<String?>(null) } - var pendingSimprintsValueTypeName by rememberSaveable { mutableStateOf<String?>(null) } - var pendingSimprintsResponseDataJson by rememberSaveable { mutableStateOf<String?>(null) } - var pendingSimprintsCapturesSessionId by rememberSaveable { mutableStateOf(false) } - val gson = remember { Gson() } - - val simprintsIdentifyLauncher = - rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> - val uid = pendingSimprintsFieldUid - val valueType = - pendingSimprintsValueTypeName - ?.let(ValueType::valueOf) - val responseDataJson = pendingSimprintsResponseDataJson - val capturesSessionId = pendingSimprintsCapturesSessionId - - pendingSimprintsFieldUid = null - pendingSimprintsValueTypeName = null - pendingSimprintsResponseDataJson = null - pendingSimprintsCapturesSessionId = false - - if (uid != null) { - onSimprintsBiometricSearchResult( - uid, - valueType, - responseDataJson, - result.resultCode, - result.data, - capturesSessionId, - ) - } - } - - fun launchSimprintsBiometricIdentification(fieldUiModel: FieldUiModel) { - val customIntent = fieldUiModel.customIntent ?: return - if (!SimprintsIntentUtils.isIdentifyCallout(customIntent)) return - - val callout = SimprintsIntentUtils.prepareCallout(customIntent) - pendingSimprintsFieldUid = fieldUiModel.uid - pendingSimprintsValueTypeName = fieldUiModel.valueType?.name - pendingSimprintsResponseDataJson = callout.responseData?.let(gson::toJson) - pendingSimprintsCapturesSessionId = true - simprintsIdentifyLauncher.launch(callout.launchIntent) - } - - val scanContract = remember { ScanContract() } - val qrScanLauncher = - rememberLauncherForActivityResult( - contract = scanContract, - ) { result -> - result.contents?.let { qrData -> - val intent = - FormIntent.OnQrCodeScanned( - uid = result.originalIntent.getStringExtra(Constants.UID)!!, - value = qrData, - valueType = ValueType.TEXT, - ) - intentHandler(intent) - } - } - - val callback = - remember { - object : FieldUiModel.Callback { - override fun intent(intent: FormIntent) { - intentHandler.invoke(intent) - } - - override fun recyclerViewUiEvents(uiEvent: RecyclerViewUiEvents) { - when (uiEvent) { - is RecyclerViewUiEvents.OpenOrgUnitDialog -> - onShowOrgUnit( - uiEvent.uid, - uiEvent.value?.let { listOf(it) } ?: emptyList(), - uiEvent.orgUnitSelectorScope ?: OrgUnitSelectorScope.UserSearchScope(), - uiEvent.label, - ) - - is RecyclerViewUiEvents.ScanQRCode -> { - qrScanLauncher.launch( - ScanOptions().apply { - setDesiredBarcodeFormats() - setPrompt("") - setBeepEnabled(true) - setBarcodeImageEnabled(false) - addExtra(Constants.UID, uiEvent.uid) - uiEvent.optionSet?.let { - addExtra( - Constants.OPTION_SET, - uiEvent.optionSet, - ) - } - addExtra(Constants.SCAN_RENDERING_TYPE, uiEvent.renderingType) - }, - ) - } - - else -> { - // no-op - } - } - } - } - } - - uiState.minAttributesMessage?.let { message -> - coroutineScope.launch { - uiState.shouldShowMinAttributeWarning.collectLatest { - if (it) { - snackBarHostState.showSnackbar( - message = message, - duration = SnackbarDuration.Short, - ) - uiState.updateMinAttributeWarning(false) - } - } - } - } - - LaunchedEffect(uiState.isOnBackPressed) { - uiState.isOnBackPressed.collectLatest { - if (it) { - focusManager.clearFocus() - onClose() - } - } - } - - LaunchedEffect(simprintsBiometricIdentificationLaunch, uiState.items) { - simprintsBiometricIdentificationLaunch.collectLatest { - uiState.items - .firstOrNull { fieldUiModel -> - SimprintsIntentUtils.isIdentifyCallout(fieldUiModel.customIntent) - }?.let(::launchSimprintsBiometricIdentification) - } - } - - val backgroundShape = - when (configuration.orientation) { - Configuration.ORIENTATION_LANDSCAPE -> - RoundedCornerShape( - topStart = CornerSize(Radius.L), - topEnd = CornerSize(Radius.NoRounding), - bottomEnd = CornerSize(Radius.NoRounding), - bottomStart = CornerSize(Radius.NoRounding), - ) - - else -> Shape.LargeTop - } - - Scaffold( - containerColor = Color.Transparent, - snackbarHost = { - SnackbarHost( - hostState = snackBarHostState, - modifier = - Modifier.padding( - start = 8.dp, - top = 8.dp, - end = 8.dp, - bottom = 48.dp, - ), - ) - }, - ) { paddingValues -> - val layoutDirection = LocalLayoutDirection.current - Column( - modifier = - Modifier - .fillMaxSize() - .background(color = Color.White, shape = backgroundShape) - .padding( - top = 0.dp, - bottom = paddingValues.calculateBottomPadding(), - start = paddingValues.calculateStartPadding(layoutDirection), - end = paddingValues.calculateEndPadding(layoutDirection), - ), - ) { - LazyColumn( - modifier = - Modifier - .weight(1F), - ) { - if (uiState.items.isEmpty()) { - item { - Box( - modifier = - Modifier - .fillMaxWidth() - .padding(16.dp), - contentAlignment = Alignment.Center, - ) { - InfoBar( - modifier = Modifier.testTag("EMPTY_SEARCH_ATTRIBUTES_TEXT_TAG"), - text = resourceManager.getString(R.string.empty_search_attributes_message), - icon = { - Icon( - imageVector = Icons.Outlined.ErrorOutline, - contentDescription = "warning", - tint = AdditionalInfoItemColor.WARNING.color, - ) - }, - textColor = AdditionalInfoItemColor.WARNING.color, - backgroundColor = AdditionalInfoItemColor.WARNING.color.copy(alpha = 0.1f), - ) - } - } - } else { - itemsIndexed( - items = uiState.items, - key = { _, fieldUiModel -> - fieldUiModel.uid - }, - ) { index, fieldUiModel -> - fieldUiModel.setCallback(callback) - ParameterSelectorItem( - modifier = - Modifier - .testTag("SEARCH_PARAM_ITEM"), - model = - provideParameterSelectorItem( - resources = resourceManager, - focusManager = focusManager, - fieldUiModel = fieldUiModel, - callback = callback, - onSimprintsBiometricIdentificationLaunch = { - uid, - valueType, - responseDataJson, - capturesSessionId, - launchIntent, - -> - pendingSimprintsFieldUid = uid - pendingSimprintsValueTypeName = valueType?.name - pendingSimprintsResponseDataJson = responseDataJson - pendingSimprintsCapturesSessionId = capturesSessionId - simprintsIdentifyLauncher.launch(launchIntent) - }, - onNextClicked = { - val nextIndex = index + 1 - if (nextIndex < uiState.items.size) { - uiState.items[nextIndex].onItemClick() - } - }, - ), - ) - } - } - - if (uiState.clearSearchEnabled) { - item { - Box( - modifier = Modifier.fillMaxWidth(), - contentAlignment = Alignment.Center, - ) { - Button( - modifier = Modifier.padding(16.dp, 24.dp, 16.dp, 8.dp), - style = ButtonStyle.TEXT, - text = resourceManager.getString(R.string.clear_search), - icon = { - Icon( - imageVector = Icons.Outlined.Cancel, - contentDescription = resourceManager.getString(R.string.clear_search), - tint = SurfaceColor.Primary, - ) - }, - ) { - focusManager.clearFocus() - onClear() - } - } - } - } - } - - Button( - enabled = uiState.searchEnabled, - modifier = - Modifier - .fillMaxWidth() - .padding(16.dp, 8.dp, 16.dp, 8.dp) - .testTag("SEARCH_BUTTON"), - style = ButtonStyle.FILLED, - text = resourceManager.getString(R.string.search), - icon = { - val iconTint = - if (uiState.searchEnabled) { - TextColor.OnPrimary - } else { - TextColor.OnDisabledSurface - } - - Icon( - painter = painterResource(id = R.drawable.ic_search), - contentDescription = null, - tint = iconTint, - ) - }, - ) { - focusManager.clearFocus() - onSearch() - } - } - } -} - -@Preview(showBackground = true) -@Composable -fun SearchFormPreview() { - SearchParametersScreen( - resourceManager = ResourceManager(LocalContext.current, ColorUtils()), - uiState = - SearchParametersUiState( - items = - buildList { - repeat(times = 20) { index -> - add( - FieldUiModelImpl( - uid = "uid$index", - label = "Label $index", - autocompleteList = emptyList(), - optionSetConfiguration = null, - valueType = ValueType.TEXT, - ), - ) - } - }, - ), - intentHandler = {}, - onSimprintsBiometricSearchResult = { _, _, _, _, _, _ -> }, - onShowOrgUnit = { _, _, _, _ -> }, - onSearch = {}, - onClear = {}, - onClose = {}, - ) -} - -@Preview(showBackground = true) -@Composable -fun SearchFormPreviewWithClear() { - SearchParametersScreen( - resourceManager = ResourceManager(LocalContext.current, ColorUtils()), - uiState = - SearchParametersUiState( - items = - buildList { - repeat(times = 20) { index -> - add( - FieldUiModelImpl( - uid = "uid$index", - label = "Label $index", - value = "test value", - autocompleteList = emptyList(), - optionSetConfiguration = null, - valueType = ValueType.TEXT, - ), - ) - } - }, - ), - intentHandler = {}, - onSimprintsBiometricSearchResult = { _, _, _, _, _, _ -> }, - onShowOrgUnit = { _, _, _, _ -> }, - onSearch = {}, - onClear = {}, - onClose = {}, - ) -} - -fun initSearchScreen( - composeView: ComposeView, - viewModel: SearchTEIViewModel, - program: String?, - teiType: String, - resources: ResourceManager, - onShowOrgUnit: ( - uid: String, - preselectedOrgUnits: List<String>, - orgUnitScope: OrgUnitSelectorScope, - label: String, - ) -> Unit, - onClear: () -> Unit, -) { - viewModel.fetchSearchParameters( - programUid = program, - teiTypeUid = teiType, - ) - composeView.setContent { - SearchParametersScreen( - resourceManager = resources, - uiState = viewModel.searchParametersUiState, - onSearch = viewModel::onSearch, - intentHandler = viewModel::onParameterIntent, - onSimprintsBiometricSearchResult = viewModel::onSimprintsBiometricSearchResult, - simprintsBiometricIdentificationLaunch = viewModel.simprintsBiometricIdentificationLaunch, - onShowOrgUnit = onShowOrgUnit, - onClear = { - onClear() - viewModel.clearQueryData() - viewModel.clearFocus() - }, - onClose = { - viewModel.clearFocus() - }, - ) - } -} diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreenProvider.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreenProvider.kt new file mode 100644 index 00000000000..45b79197464 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/SearchParametersScreenProvider.kt @@ -0,0 +1,229 @@ +package org.dhis2.usescases.searchTrackEntity.searchparameters + +import android.content.res.Configuration +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.platform.ComposeView +import androidx.compose.ui.platform.LocalConfiguration +import com.google.gson.Gson +import com.journeyapps.barcodescanner.ScanOptions +import org.dhis2.commons.Constants +import org.dhis2.commons.resources.ResourceManager +import org.dhis2.commons.simprints.utils.SimprintsIntentUtils +import org.dhis2.form.R +import org.dhis2.form.data.scan.ScanContract +import org.dhis2.form.ui.customintent.CustomIntentActivityResultContract +import org.dhis2.form.ui.customintent.CustomIntentInput +import org.dhis2.form.ui.customintent.CustomIntentResult +import org.dhis2.mobile.commons.extensions.ObserveAsEvents +import org.dhis2.mobile.commons.orgunit.OrgUnitSelectorScope +import org.dhis2.tracker.input.ui.action.TrackerInputAction +import org.dhis2.tracker.input.ui.action.TrackerInputUiEvent +import org.dhis2.tracker.search.ui.action.SearchScreenUiEvent +import org.dhis2.tracker.search.ui.screen.SearchParametersScreen +import org.dhis2.usescases.searchTrackEntity.SearchTEIViewModel +import timber.log.Timber + +fun provideSearchScreen( + composeView: ComposeView, + viewModel: SearchTEIViewModel, + program: String?, + teiType: String, + resources: ResourceManager, + onShowOrgUnit: ( + uid: String, + preselectedOrgUnits: List<String>, + orgUnitScope: OrgUnitSelectorScope, + label: String, + ) -> Unit, + onClear: () -> Unit, +) { + viewModel.fetchSearchParameters( + programUid = program, + teiTypeUid = teiType, + ) + composeView.setContent { + var pendingSimprintsFieldUid by rememberSaveable { mutableStateOf<String?>(null) } + var pendingSimprintsResponseDataJson by rememberSaveable { mutableStateOf<String?>(null) } + var pendingSimprintsCapturesSessionId by rememberSaveable { mutableStateOf(false) } + val customIntentActivityResultContract = remember { CustomIntentActivityResultContract() } + val customIntentLauncher = + rememberLauncherForActivityResult( + contract = customIntentActivityResultContract, + onResult = viewModel::handleCustomIntentResult, + ) + val simprintsIdentifyLauncher = + rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + val uid = pendingSimprintsFieldUid + val responseDataJson = pendingSimprintsResponseDataJson + val capturesSessionId = pendingSimprintsCapturesSessionId + + pendingSimprintsFieldUid = null + pendingSimprintsResponseDataJson = null + pendingSimprintsCapturesSessionId = false + + if (uid != null) { + viewModel.onSimprintsBiometricSearchResult( + uid = uid, + responseDataJson = responseDataJson, + resultCode = result.resultCode, + data = result.data, + capturesSessionId = capturesSessionId, + ) + } else { + viewModel.onSimprintsBiometricSearchDropout() + } + } + + val scanContract = remember { ScanContract() } + + val qrScanLauncher = + rememberLauncherForActivityResult( + contract = scanContract, + ) { result -> + result.contents?.let { qrData -> + viewModel.handleScanResult( + fieldUid = result.originalIntent.getStringExtra(Constants.UID)!!, + value = qrData, + ) + } + } + + ObserveAsEvents( + flow = viewModel.searchActions, + ) { action -> + when (action) { + is TrackerInputAction.LaunchCustomIntent -> { + if (SimprintsIntentUtils.isIdentifyCallout(action.customIntentModel)) { + val preparedCallout = SimprintsIntentUtils.prepareCallout(action.customIntentModel) + pendingSimprintsFieldUid = action.fieldUid + pendingSimprintsResponseDataJson = Gson().toJson(preparedCallout.responseData) + pendingSimprintsCapturesSessionId = true + try { + simprintsIdentifyLauncher.launch(preparedCallout.launchIntent) + } catch (e: Exception) { + Timber.e(e) + pendingSimprintsFieldUid = null + pendingSimprintsResponseDataJson = null + pendingSimprintsCapturesSessionId = false + viewModel.handleCustomIntentResult( + CustomIntentResult.Error(fieldUid = action.fieldUid), + ) + } + return@ObserveAsEvents + } + + customIntentLauncher.launch( + with(action) { + CustomIntentInput( + fieldUid = fieldUid, + customIntent = customIntentModel, + defaultTitle = + customIntentModel.name + ?: resources.getString(R.string.select_app_intent), + ) + }, + ) + } + + is TrackerInputAction.Scan -> { + with(action) { + qrScanLauncher.launch( + ScanOptions().apply { + setDesiredBarcodeFormats() + setPrompt("") + setBeepEnabled(true) + setBarcodeImageEnabled(false) + addExtra(Constants.UID, fieldUid) + optionSet?.let { + addExtra( + Constants.OPTION_SET, + it, + ) + } + addExtra( + Constants.SCAN_RENDERING_TYPE, + renderType, + ) + }, + ) + } + } + + is TrackerInputAction.ValueChanged -> { + viewModel.onValueChange( + fieldUid = action.fieldUid, + value = action.value, + ) + } + } + } + + val configuration = LocalConfiguration.current + + val isLandscape = configuration.orientation == Configuration.ORIENTATION_LANDSCAPE + SearchParametersScreen( + externalUiState = viewModel.searchParametersUiState, + onSearchScreenUiEvent = { + when (it) { + is SearchScreenUiEvent.OnSearchButtonClicked -> + viewModel.onSearch() + + is SearchScreenUiEvent.OnClearSearchButtonClicked -> { + onClear() + viewModel.clearQueryData() + viewModel.clearFocus() + } + + is SearchScreenUiEvent.OnCloseClicked -> viewModel.clearFocus() + } + }, + isLandscape = isLandscape, + onTrackerInputUiEvent = { + when (it) { + is TrackerInputUiEvent.OnScanButtonClicked -> + viewModel.launchScan( + it.uid, + it.optionSet, + it.renderType, + ) + + is TrackerInputUiEvent.OnOrgUnitButtonClicked -> + onShowOrgUnit( + it.uid, + it.value?.let { listOf(it) } + ?: emptyList(), + it.orgUnitSelectorScope + ?: OrgUnitSelectorScope.UserSearchScope(), + it.label, + ) + + is TrackerInputUiEvent.OnLaunchCustomIntent -> + viewModel.launchCustomIntent( + it.uid, + it.customIntentUid, + ) + + is TrackerInputUiEvent.OnItemClick -> viewModel.onItemClick(it.uid) + + is TrackerInputUiEvent.OnValueChange -> + viewModel.onValueChange( + fieldUid = it.uid, + value = it.value, + ) + } + }, + getOptionSetFlow = { fieldUid, optionSetUid -> + viewModel.getOptionSetFlow(fieldUid, optionSetUid) + }, + onOptionSetSearch = { fieldUid, query -> + viewModel.onOptionSetSearch(fieldUid, query) + }, + ) + } +} diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/provider/ParameterSelectorItemProvider.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/provider/ParameterSelectorItemProvider.kt deleted file mode 100644 index e83a3dc0ee9..00000000000 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/provider/ParameterSelectorItemProvider.kt +++ /dev/null @@ -1,173 +0,0 @@ -package org.dhis2.usescases.searchTrackEntity.searchparameters.provider - -import android.content.Intent -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.outlined.AddCircleOutline -import androidx.compose.material.icons.outlined.QrCode2 -import androidx.compose.material3.Icon -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.remember -import androidx.compose.ui.Modifier -import androidx.compose.ui.focus.FocusManager -import androidx.compose.ui.focus.FocusRequester -import androidx.compose.ui.focus.focusRequester -import androidx.compose.ui.platform.LocalContext -import com.google.gson.Gson -import org.dhis2.R -import org.dhis2.commons.resources.ResourceManager -import org.dhis2.commons.simprints.utils.SimprintsIntentUtils -import org.dhis2.form.di.Injector -import org.dhis2.form.model.FieldUiModel -import org.dhis2.form.model.UiRenderType -import org.dhis2.form.simprints.rememberSimprintsCustomIntentFormPresenter -import org.dhis2.form.ui.event.RecyclerViewUiEvents -import org.dhis2.form.ui.provider.inputfield.FieldProvider -import org.hisp.dhis.android.core.common.ValueType -import org.hisp.dhis.mobile.ui.designsystem.component.InputStyle -import org.hisp.dhis.mobile.ui.designsystem.component.parameter.model.ParameterSelectorItemModel -import org.hisp.dhis.mobile.ui.designsystem.resource.provideDHIS2Icon -import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor - -@Composable -fun provideParameterSelectorItem( - resources: ResourceManager, - focusManager: FocusManager, - fieldUiModel: FieldUiModel, - callback: FieldUiModel.Callback, - onNextClicked: () -> Unit, - onSimprintsBiometricIdentificationLaunch: (String, ValueType?, String?, Boolean, Intent) -> Unit, -): ParameterSelectorItemModel { - val focusRequester = remember { FocusRequester() } - val context = LocalContext.current.applicationContext - val simprintsSessionRepository = - remember(context) { - Injector.provideSimprintsSessionRepository(context) - } - val simprintsCustomIntentFormPresenter = - rememberSimprintsCustomIntentFormPresenter( - fieldUiModel = fieldUiModel, - resources = resources, - sessionRepository = simprintsSessionRepository, - ) - - val status = - if (fieldUiModel.focused) { - ParameterSelectorItemModel.Status.FOCUSED - } else if (fieldUiModel.value.isNullOrEmpty()) { - ParameterSelectorItemModel.Status.CLOSED - } else { - ParameterSelectorItemModel.Status.UNFOCUSED - } - - LaunchedEffect(key1 = status) { - if (status == ParameterSelectorItemModel.Status.FOCUSED) { - focusRequester.requestFocus() - } - } - - return ParameterSelectorItemModel( - icon = { ProvideIcon(fieldUiModel.valueType, fieldUiModel.renderingType) }, - label = fieldUiModel.label, - helper = resources.getString(R.string.optional), - inputField = { - FieldProvider( - modifier = - Modifier - .focusRequester(focusRequester), - inputStyle = InputStyle.ParameterInputStyle(), - fieldUiModel = fieldUiModel, - uiEventHandler = callback::recyclerViewUiEvents, - intentHandler = callback::intent, - resources = resources, - focusManager = focusManager, - onNextClicked = onNextClicked, - onFileSelected = { - // Not supported for search - }, - reEvaluateCustomIntentRequestParameters = false, - ) - }, - status = status, - onExpand = { - if (SimprintsIntentUtils.isIdentifyCallout(fieldUiModel.customIntent)) { - if (!simprintsCustomIntentFormPresenter.hasPendingValue) { - simprintsCustomIntentFormPresenter.prepareLaunch() - simprintsCustomIntentFormPresenter - .createLaunchIntent() - ?.let { launchIntent -> - onSimprintsBiometricIdentificationLaunch( - fieldUiModel.uid, - fieldUiModel.valueType, - fieldUiModel.customIntent?.customIntentResponse?.let(Gson()::toJson), - SimprintsIntentUtils.isIdentifyCallout(fieldUiModel.customIntent), - launchIntent, - ) - } - } - return@ParameterSelectorItemModel - } - performOnExpandActions(fieldUiModel, callback) - }, - ) -} - -private fun performOnExpandActions( - fieldUiModel: FieldUiModel, - callback: FieldUiModel.Callback, -) { - fieldUiModel.onItemClick() - - if (fieldUiModel.renderingType == UiRenderType.QR_CODE || - fieldUiModel.renderingType == UiRenderType.BAR_CODE - ) { - callback.recyclerViewUiEvents( - RecyclerViewUiEvents.ScanQRCode( - uid = fieldUiModel.uid, - optionSet = fieldUiModel.optionSet, - renderingType = fieldUiModel.renderingType, - ), - ) - } -} - -@Composable -private fun ProvideIcon( - valueType: ValueType?, - renderingType: UiRenderType?, -) = when (valueType) { - ValueType.TEXT -> { - when (renderingType) { - UiRenderType.QR_CODE, UiRenderType.GS1_DATAMATRIX -> { - Icon( - imageVector = Icons.Outlined.QrCode2, - contentDescription = "Icon Button", - tint = SurfaceColor.Primary, - ) - } - - UiRenderType.BAR_CODE -> { - Icon( - painter = provideDHIS2Icon("material_barcode_scanner"), - contentDescription = "Icon Button", - tint = SurfaceColor.Primary, - ) - } - - else -> { - Icon( - imageVector = Icons.Outlined.AddCircleOutline, - contentDescription = "Icon Button", - tint = SurfaceColor.Primary, - ) - } - } - } - - else -> - Icon( - imageVector = Icons.Outlined.AddCircleOutline, - contentDescription = "Icon Button", - tint = SurfaceColor.Primary, - ) -} diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt index 1ab9540218b..ebbd7edfafe 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SearchTEUi.kt @@ -48,6 +48,7 @@ import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.intl.Locale import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.toLowerCase +import androidx.compose.ui.platform.testTag import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -159,7 +160,8 @@ fun AddNewButton( modifier = Modifier .requiredHeight(44.dp) - .then(modifier), + .then(modifier) + .testTag("ADD_NEW_BUTTON"), colors = ButtonDefaults.buttonColors( containerColor = SurfaceColor.PrimaryContainer, @@ -700,7 +702,7 @@ fun CreateNewButton( ) { if (it) { ExtendedFAB( - modifier = modifier, + modifier = modifier.testTag("ADD_NEW_BUTTON"), onClick = onClick, text = stringResource( if (isSimprintsUseLastBiometricsLabel) { @@ -715,7 +717,7 @@ fun CreateNewButton( ) } else { FAB( - modifier = modifier, + modifier = modifier.testTag("ADD_NEW_BUTTON"), onClick = onClick, icon = icon, style = FABStyle.SECONDARY, diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SimprintsSearchTeUiComponents.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SimprintsSearchTeUiComponents.kt index 9f62422136f..f3a39d95a6c 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SimprintsSearchTeUiComponents.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/SimprintsSearchTeUiComponents.kt @@ -71,4 +71,3 @@ fun SimprintsNoneOfTheAboveButton( style = FABStyle.SECONDARY, ) } - diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapper.kt b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapper.kt index 0ff1b4721e9..c5d520c6d0b 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapper.kt +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapper.kt @@ -17,17 +17,18 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.graphics.painter.BitmapPainter import org.dhis2.R -import org.dhis2.commons.bindings.hasFollowUp import org.dhis2.commons.bindings.isFilePathValid import org.dhis2.commons.date.toDateSpan import org.dhis2.commons.date.toOverdueOrScheduledUiText import org.dhis2.commons.resources.ResourceManager import org.dhis2.commons.ui.model.ListCardUiModel +import org.dhis2.mobile.commons.extensions.toJavaDate +import org.dhis2.tracker.search.model.DomainEnrollment +import org.dhis2.tracker.search.model.DomainProgram +import org.dhis2.tracker.search.model.EnrollmentStatus +import org.dhis2.tracker.search.model.SyncState import org.dhis2.usescases.searchTrackEntity.SearchTeiModel -import org.hisp.dhis.android.core.common.State -import org.hisp.dhis.android.core.enrollment.Enrollment -import org.hisp.dhis.android.core.enrollment.EnrollmentStatus -import org.hisp.dhis.android.core.program.Program +import org.dhis2.usescases.searchTrackEntity.adapters.hasFollowUp import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItem import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItemColor import org.hisp.dhis.mobile.ui.designsystem.component.Avatar @@ -53,7 +54,7 @@ class TEICardMapper( ListCardUiModel( avatar = { ProvideAvatar(searchTEIModel, onImageClick) }, title = getTitle(searchTEIModel), - lastUpdated = searchTEIModel.tei.lastUpdated().toDateSpan(context), + lastUpdated = searchTEIModel.tei.lastUpdated?.toJavaDate().toDateSpan(context), additionalInfo = getAdditionalInfoList(searchTEIModel), actionButton = { ProvideSyncButton(searchTEIModel, onSyncIconClick) }, expandLabelText = resourceManager.getString(R.string.show_more), @@ -68,7 +69,7 @@ class TEICardMapper( ) { val programUid: String? = if (item.selectedEnrollment != null) { - item.selectedEnrollment.program().toString() + item.selectedEnrollment.program } else { null } @@ -103,7 +104,7 @@ class TEICardMapper( item.header?.firstOrNull() ?: item.attributeValues.values .firstOrNull() - ?.value() + ?.value ?.firstOrNull() return when (firstLetter) { @@ -119,17 +120,17 @@ class TEICardMapper( val value = item.attributeValues.values .firstOrNull() - ?.value() ?: "-" + ?.value ?: "-" "$key: $value" } private fun getAdditionalInfoList(searchTEIModel: SearchTeiModel): List<AdditionalInfoItem> { val attributeList = - searchTEIModel.attributeValues + searchTEIModel.tei.attributeValues .map { AdditionalInfoItem( - key = it.key, - value = it.value.value() ?: "-", + key = it.displayName, + value = it.value ?: "-", ) }.toMutableList() @@ -139,82 +140,84 @@ class TEICardMapper( attributeList.removeIf { it.value.isEmpty() || it.value == "-" } return attributeList.also { list -> - if ( - !searchTEIModel.ownerOrgUnit.isNullOrEmpty() && - searchTEIModel.ownerOrgUnit != searchTEIModel.enrolledOrgUnit - ) { - addOwnedBy( - list = list, - ownerOrgUnit = searchTEIModel.ownerOrgUnit, - ) + searchTEIModel.tei.ownerOrgUnit?.let { + if (it != searchTEIModel.tei.enrollmentOrgUnit) { + addOwnedBy( + list = list, + ownerOrgUnit = it, + ) + } } - if (searchTEIModel.displayOrgUnit) { + if (searchTEIModel.tei.shouldDisplayOrgUnit) { checkEnrolledIn( list = list, - enrolledOrgUnit = searchTEIModel.enrolledOrgUnit, + enrolledOrgUnit = searchTEIModel.tei.enrollmentOrgUnit, ) } checkEnrolledPrograms( list = list, - enrolledPrograms = searchTEIModel.programInfo, + enrolledPrograms = searchTEIModel.tei.enrolledPrograms, ) val programUid: String? = if (searchTEIModel.selectedEnrollment != null) { - searchTEIModel.selectedEnrollment.program().toString() + searchTEIModel.selectedEnrollment.program } else { null } checkEnrollmentStatus( programUid = programUid, list = list, - status = searchTEIModel.selectedEnrollment?.status(), + status = searchTEIModel.selectedEnrollment?.status?: EnrollmentStatus.ACTIVE, ) checkOverdue( list = list, - hasOverdue = searchTEIModel.isHasOverdue, - overdueDate = searchTEIModel.overdueDate, + hasOverdue = searchTEIModel.tei.overDueDate != null, + overdueDate = searchTEIModel.tei.overDueDate?.toJavaDate(), ) checkFollowUp( list = list, - enrollments = searchTEIModel.enrollments, + enrollments = searchTEIModel.tei.enrollments, ) checkSyncStatus( list = list, - state = searchTEIModel.tei.aggregatedSyncState(), + state = searchTEIModel.tei.syncState, ) } } private fun checkFollowUp( list: MutableList<AdditionalInfoItem>, - enrollments: List<Enrollment>, + enrollments: List<DomainEnrollment>?, ) { - if (enrollments.hasFollowUp()) { - list.add( - AdditionalInfoItem( - icon = { - Icon( - imageVector = Icons.Outlined.Flag, - contentDescription = resourceManager.getString(R.string.marked_follow_up), - tint = AdditionalInfoItemColor.WARNING.color, - ) - }, - value = resourceManager.getString(R.string.marked_follow_up), - isConstantItem = true, - color = AdditionalInfoItemColor.WARNING.color, - ), - ) + enrollments?.let { + if (enrollments.hasFollowUp()) { + list.add( + AdditionalInfoItem( + icon = { + Icon( + imageVector = Icons.Outlined.Flag, + contentDescription = resourceManager.getString(R.string.marked_follow_up), + tint = AdditionalInfoItemColor.WARNING.color, + ) + }, + value = resourceManager.getString(R.string.marked_follow_up), + isConstantItem = true, + color = AdditionalInfoItemColor.WARNING.color, + ), + ) + } } + } private fun checkEnrollmentStatus( programUid: String?, list: MutableList<AdditionalInfoItem>, - status: EnrollmentStatus?, + status: EnrollmentStatus, ) { val item = when (status) { @@ -268,11 +271,11 @@ class TEICardMapper( private fun checkEnrolledPrograms( list: MutableList<AdditionalInfoItem>, - enrolledPrograms: List<Program>, + enrolledPrograms: List<DomainProgram>?, ) { - val programNames = enrolledPrograms.map { it.name() } + val programNames = enrolledPrograms?.map { it.displayName } - if (programNames.isNotEmpty()) { + programNames?.let { list.add( AdditionalInfoItem( key = resourceManager.getString(R.string.programs), @@ -285,15 +288,18 @@ class TEICardMapper( private fun checkEnrolledIn( list: MutableList<AdditionalInfoItem>, - enrolledOrgUnit: String, + enrolledOrgUnit: String?, ) { - list.add( - AdditionalInfoItem( - key = resourceManager.getString(R.string.enrolledIn), - value = enrolledOrgUnit, - isConstantItem = true, - ), - ) + enrolledOrgUnit?.let { + list.add( + AdditionalInfoItem( + key = resourceManager.getString(R.string.enrolledIn), + value = it, + isConstantItem = true, + ), + ) + } + } private fun addOwnedBy( @@ -315,16 +321,16 @@ class TEICardMapper( onSyncIconClick: () -> Unit, ) { val buttonText = - when (searchTEIModel.tei.aggregatedSyncState()) { - State.TO_POST, - State.TO_UPDATE, - -> { + when (searchTEIModel.tei.syncState) { + SyncState.TO_POST, + SyncState.TO_UPDATE, + -> { resourceManager.getString(R.string.sync) } - State.ERROR, - State.WARNING, - -> { + SyncState.ERROR, + SyncState.WARNING, + -> { resourceManager.getString(R.string.sync_retry) } @@ -373,13 +379,13 @@ class TEICardMapper( private fun checkSyncStatus( list: MutableList<AdditionalInfoItem>, - state: State?, + state: SyncState?, ) { val item = when (state) { - State.TO_POST, - State.TO_UPDATE, - -> { + SyncState.TO_POST, + SyncState.TO_UPDATE, + -> { AdditionalInfoItem( icon = { Icon( @@ -394,7 +400,7 @@ class TEICardMapper( ) } - State.UPLOADING -> { + SyncState.UPLOADING -> { AdditionalInfoItem( icon = { Icon( @@ -409,7 +415,7 @@ class TEICardMapper( ) } - State.ERROR -> { + SyncState.ERROR -> { AdditionalInfoItem( icon = { Icon( @@ -424,7 +430,7 @@ class TEICardMapper( ) } - State.WARNING -> { + SyncState.WARNING -> { AdditionalInfoItem( icon = { Icon( diff --git a/app/src/main/java/org/dhis2/usescases/settings/DeleteUserData.kt b/app/src/main/java/org/dhis2/usescases/settings/DeleteUserData.kt index 42f9f2f0762..1d8bbcf8856 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/DeleteUserData.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/DeleteUserData.kt @@ -1,17 +1,22 @@ package org.dhis2.usescases.settings +import kotlinx.coroutines.withContext import org.dhis2.commons.filters.FilterManager import org.dhis2.commons.prefs.PreferenceProvider +import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.service.workManager.WorkManagerController import java.io.File -class DeleteUserData( +class DeleteUserData( private val workManagerController: WorkManagerController, private val filterManager: FilterManager, private val preferencesProvider: PreferenceProvider, + private val dispatcherProvider: DispatcherProvider, ) { - fun wipeCacheAndPreferences(file: File?) { - filterManager.clearAllFilters() + suspend fun wipeCacheAndPreferences(file: File?) { + withContext(dispatcherProvider.ui()) { + filterManager.clearAllFilters() + } workManagerController.cancelAllWork() workManagerController.pruneWork() if (file != null) { diff --git a/app/src/main/java/org/dhis2/usescases/settings/SettingsRepository.kt b/app/src/main/java/org/dhis2/usescases/settings/SettingsRepository.kt index 6c620134340..e3206c93de6 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/SettingsRepository.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/SettingsRepository.kt @@ -1,5 +1,6 @@ package org.dhis2.usescases.settings +import android.text.format.DateFormat import io.reactivex.Single import org.dhis2.BuildConfig import org.dhis2.bindings.toSeconds @@ -15,6 +16,7 @@ import org.dhis2.commons.prefs.Preference.Companion.TIME_DAILY import org.dhis2.commons.prefs.Preference.Companion.TIME_WEEKLY import org.dhis2.commons.prefs.PreferenceProvider import org.dhis2.data.service.SyncResult +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.usescases.settings.models.DataSettingsViewModel import org.dhis2.usescases.settings.models.MetadataSettingsViewModel import org.dhis2.usescases.settings.models.ReservedValueSettingsViewModel @@ -29,10 +31,13 @@ import org.hisp.dhis.android.core.settings.SynchronizationSettings import org.hisp.dhis.android.core.sms.domain.interactor.ConfigCase import timber.log.Timber +private const val dateTimeFormat = "dd/MM/yyyy HH:mm" + class SettingsRepository( val d2: D2, val prefs: PreferenceProvider, val featureConfigRepository: FeatureConfigRepository, + private val syncBackgroundJobAction: SyncBackgroundJobAction, ) { private val syncSettings: SynchronizationSettings? get() = @@ -49,12 +54,7 @@ class SettingsRepository( null } private val programSettings: ProgramSettings? - get() = - if (d2.settingModule().programSetting().blockingExists()) { - d2.settingModule().programSetting().blockingGet() - } else { - null - } + get() = syncSettings?.programSettings() private val smsConfig: ConfigCase.SmsConfig get() = d2 @@ -68,6 +68,9 @@ class SettingsRepository( DataSettingsViewModel( dataSyncPeriod = dataPeriod(), lastDataSync = prefs.getString(Constants.LAST_DATA_SYNC, "-")!!, + nextDataSync = syncBackgroundJobAction.getNextDataSync()?.let { + DateFormat.format(dateTimeFormat, it).toString() + }, syncHasErrors = !prefs.getBoolean(Constants.LAST_DATA_SYNC_STATUS, true), dataHasErrors = dataHasErrors(), dataHasWarnings = dataHasWarning(), @@ -85,6 +88,12 @@ class SettingsRepository( MetadataSettingsViewModel( metadataSyncPeriod = metadataPeriod(), lastMetadataSync = prefs.getString(Constants.LAST_META_SYNC, "-")!!, + nextMetadataSync = syncBackgroundJobAction.getNextMetadataSync()?.let { + DateFormat.format(dateTimeFormat, it).toString() + }, + nextSettingsSync = syncBackgroundJobAction.getNextSettingsSync()?.let { + DateFormat.format(dateTimeFormat, it).toString() + }, hasErrors = !prefs.getBoolean(Constants.LAST_META_SYNC_STATUS, true), canEdit = syncSettings?.metadataSync() == null, syncInProgress = false, @@ -179,13 +188,13 @@ class SettingsRepository( .isNotEmpty() private fun metadataPeriod(): Int = - generalSettings?.metadataSync()?.toSeconds() ?: prefs.getInt( + syncSettings?.metadataSync()?.toSeconds() ?: prefs.getInt( Preference.TIME_META, TIME_WEEKLY, ) private fun dataPeriod(): Int = - generalSettings?.dataSync()?.toSeconds() ?: prefs.getInt( + syncSettings?.dataSync()?.toSeconds() ?: prefs.getInt( Preference.TIME_DATA, TIME_DAILY, ) @@ -231,14 +240,11 @@ class SettingsRepository( private fun getLimitedScopeFromPreferences(): LimitScope { val byOrgUnit = prefs.getBoolean(Constants.LIMIT_BY_ORG_UNIT, false) val byProgram = prefs.getBoolean(Constants.LIMIT_BY_PROGRAM, false) - return if (byOrgUnit && !byProgram) { - LimitScope.PER_ORG_UNIT - } else if (!byOrgUnit && byProgram) { - LimitScope.PER_PROGRAM - } else if (byOrgUnit && byProgram) { - LimitScope.PER_OU_AND_PROGRAM - } else { - LimitScope.GLOBAL + return when { + byOrgUnit && byProgram -> LimitScope.PER_OU_AND_PROGRAM + byOrgUnit && !byProgram -> LimitScope.PER_ORG_UNIT + !byOrgUnit && byProgram -> LimitScope.PER_PROGRAM + else -> LimitScope.GLOBAL } } @@ -253,6 +259,7 @@ class SettingsRepository( suspend fun saveLimitScope(limitScope: LimitScope) { when (limitScope) { LimitScope.ALL_ORG_UNITS -> { + // Do nothing } LimitScope.GLOBAL -> { @@ -289,7 +296,7 @@ class SettingsRepository( .setGatewayNumber(gatewayNumber) .blockingAwait() } catch (e: Exception) { - Timber.d(e.message) + Timber.d(e) } } diff --git a/app/src/main/java/org/dhis2/usescases/settings/SyncManagerFragment.kt b/app/src/main/java/org/dhis2/usescases/settings/SyncManagerFragment.kt index e744c147084..77922793602 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/SyncManagerFragment.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/SyncManagerFragment.kt @@ -17,12 +17,14 @@ import org.dhis2.commons.data.FormFileProvider import org.dhis2.commons.data.FormFileProvider.init import org.dhis2.commons.resources.ColorUtils import org.dhis2.mobile.login.authentication.TwoFASettingsActivity +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.usescases.general.FragmentGlobalAbstract import org.dhis2.usescases.reservedValue.ReservedValueActivity import org.dhis2.usescases.settings.models.ErrorViewModel import org.dhis2.usescases.settings.ui.SettingsScreen import org.dhis2.usescases.settingsprogram.SettingsProgramActivity import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme +import org.koin.android.ext.android.inject import timber.log.Timber import java.io.File import javax.inject.Inject @@ -32,6 +34,7 @@ class SyncManagerFragment : FragmentGlobalAbstract() { lateinit var settingsViewModelFactory: SettingsViewModelFactory private val presenter: SyncManagerPresenter by viewModels { settingsViewModelFactory } + private val syncBackgroundJobAction: SyncBackgroundJobAction by inject() @JvmField @Inject @@ -41,7 +44,7 @@ class SyncManagerFragment : FragmentGlobalAbstract() { super.onAttach(context) app() .userComponent() - ?.plus(SyncManagerModule()) + ?.plus(SyncManagerModule(syncBackgroundJobAction)) ?.inject(this) } diff --git a/app/src/main/java/org/dhis2/usescases/settings/SyncManagerModule.kt b/app/src/main/java/org/dhis2/usescases/settings/SyncManagerModule.kt index 2ca357252eb..c1819f82b8e 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/SyncManagerModule.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/SyncManagerModule.kt @@ -10,8 +10,8 @@ import org.dhis2.commons.prefs.PreferenceProvider import org.dhis2.commons.resources.ResourceManager import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.service.VersionRepository -import org.dhis2.data.service.workManager.WorkManagerController import org.dhis2.mobile.commons.files.FileHandlerImpl +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.usescases.settings.domain.CheckVersionUpdate import org.dhis2.usescases.settings.domain.DeleteLocalData import org.dhis2.usescases.settings.domain.ExportDatabase @@ -27,7 +27,9 @@ import org.dhis2.utils.analytics.AnalyticsHelper import org.hisp.dhis.android.core.D2 @Module -class SyncManagerModule { +class SyncManagerModule( + private val syncBackgroundJobAction: SyncBackgroundJobAction, +) { @Provides @PerFragment fun provideViewModelFactory( @@ -150,11 +152,10 @@ class SyncManagerModule { @Provides @PerFragment fun provideLaunchSync( - workManagerController: WorkManagerController, preferenceProvider: PreferenceProvider, analyticsHelper: AnalyticsHelper, ) = LaunchSync( - workManagerController, + syncBackgroundJobAction, preferenceProvider, analyticsHelper, ) @@ -170,6 +171,7 @@ class SyncManagerModule { d2, preferenceProvider, featureConfigRepository, + syncBackgroundJobAction, ) @Provides diff --git a/app/src/main/java/org/dhis2/usescases/settings/SyncManagerPresenter.kt b/app/src/main/java/org/dhis2/usescases/settings/SyncManagerPresenter.kt index ae5c98a3f97..d33719c18ed 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/SyncManagerPresenter.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/SyncManagerPresenter.kt @@ -12,7 +12,6 @@ import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -import org.dhis2.commons.Constants import org.dhis2.commons.network.NetworkUtils import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.usescases.settings.domain.CheckVersionUpdate @@ -28,6 +27,7 @@ import org.dhis2.usescases.settings.domain.UpdateSyncSettings import org.dhis2.usescases.settings.models.DeleteDataState import org.dhis2.usescases.settings.models.ErrorViewModel import org.dhis2.usescases.settings.models.SettingsState +import org.dhis2.usescases.settings.models.SyncStateInput import org.hisp.dhis.android.core.settings.LimitScope import java.io.File @@ -114,14 +114,21 @@ class SyncManagerPresenter( } private suspend fun loadData() { - val settingsState = - getSettingsState( + getSettingsState( + SyncStateInput( openedItem = _settingsState.value?.openedItem, hasConnection = _settingsState.value?.hasConnection == true, metadataSyncInProgress = syncWorkInfo.value.metadataSyncProgress == LaunchSync.SyncStatus.InProgress, dataSyncInProgress = syncWorkInfo.value.dataSyncProgress == LaunchSync.SyncStatus.InProgress, - ) - _settingsState.update { settingsState } + ), + ).fold( + onSuccess = { settingsState -> + _settingsState.update { settingsState } + }, + onFailure = { + // do nothing + }, + ) } fun onItemClick(settingsItem: SettingItem) { @@ -361,18 +368,14 @@ class SyncManagerPresenter( fun onSyncDataPeriodChanged(period: Int) { viewModelScope.launch(dispatcherProvider.io()) { launchSync(LaunchSync.SyncAction.UpdateSyncDataPeriod(period)) - if (period == Constants.TIME_MANUAL) { - loadData() - } + loadData() } } fun onSyncMetaPeriodChanged(period: Int) { viewModelScope.launch(dispatcherProvider.io()) { launchSync(LaunchSync.SyncAction.UpdateSyncMetadataPeriod(period)) - if (period == Constants.TIME_MANUAL) { - loadData() - } + loadData() } } diff --git a/app/src/main/java/org/dhis2/usescases/settings/domain/GetSettingsState.kt b/app/src/main/java/org/dhis2/usescases/settings/domain/GetSettingsState.kt index 106706ebb74..cb5f700318f 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/domain/GetSettingsState.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/domain/GetSettingsState.kt @@ -1,40 +1,42 @@ package org.dhis2.usescases.settings.domain +import org.dhis2.mobile.commons.domain.UseCase import org.dhis2.usescases.settings.GatewayValidator -import org.dhis2.usescases.settings.SettingItem import org.dhis2.usescases.settings.SettingsRepository import org.dhis2.usescases.settings.models.SettingsState +import org.dhis2.usescases.settings.models.SyncStateInput class GetSettingsState( private val settingsRepository: SettingsRepository, private val gatewayValidator: GatewayValidator, -) { - suspend operator fun invoke( - openedItem: SettingItem?, - hasConnection: Boolean, - metadataSyncInProgress: Boolean, - dataSyncInProgress: Boolean, - ): SettingsState = - SettingsState( - openedItem = openedItem, - hasConnection = hasConnection, - metadataSettingsViewModel = - settingsRepository.metaSync().blockingGet().copy( - syncInProgress = metadataSyncInProgress, - ), - dataSettingsViewModel = - settingsRepository.dataSync().blockingGet().copy( - syncInProgress = dataSyncInProgress, - ), - syncParametersViewModel = settingsRepository.syncParameters().blockingGet(), - reservedValueSettingsViewModel = settingsRepository.reservedValues().blockingGet(), - smsSettingsViewModel = - with(settingsRepository.sms().blockingGet()) { - copy( - gatewayValidationResult = gatewayValidator(this.gatewayNumber), - ) - }, - isTwoFAConfigured = settingsRepository.isTwoFAConfigured(), - versionName = settingsRepository.getVersionName(), - ) +) : UseCase<SyncStateInput, SettingsState> { + override suspend fun invoke(input: SyncStateInput) = + try { + val state = + SettingsState( + openedItem = input.openedItem, + hasConnection = input.hasConnection, + metadataSettingsViewModel = + settingsRepository.metaSync().blockingGet().copy( + syncInProgress = input.metadataSyncInProgress, + ), + dataSettingsViewModel = + settingsRepository.dataSync().blockingGet().copy( + syncInProgress = input.dataSyncInProgress, + ), + syncParametersViewModel = settingsRepository.syncParameters().blockingGet(), + reservedValueSettingsViewModel = settingsRepository.reservedValues().blockingGet(), + smsSettingsViewModel = + with(settingsRepository.sms().blockingGet()) { + copy( + gatewayValidationResult = gatewayValidator(this.gatewayNumber), + ) + }, + isTwoFAConfigured = settingsRepository.isTwoFAConfigured(), + versionName = settingsRepository.getVersionName(), + ) + Result.success(state) + } catch (e: Exception) { + Result.failure(e) + } } diff --git a/app/src/main/java/org/dhis2/usescases/settings/domain/LaunchSync.kt b/app/src/main/java/org/dhis2/usescases/settings/domain/LaunchSync.kt index 11b0e0286c3..20d213fb8c1 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/domain/LaunchSync.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/domain/LaunchSync.kt @@ -1,27 +1,25 @@ package org.dhis2.usescases.settings.domain -import androidx.lifecycle.asFlow -import androidx.work.ExistingPeriodicWorkPolicy -import androidx.work.ExistingWorkPolicy -import androidx.work.WorkInfo import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge -import kotlinx.coroutines.flow.update +import kotlinx.coroutines.flow.updateAndGet import org.dhis2.commons.Constants import org.dhis2.commons.matomo.Actions import org.dhis2.commons.matomo.Categories import org.dhis2.commons.prefs.PreferenceProvider -import org.dhis2.data.service.workManager.WorkManagerController -import org.dhis2.data.service.workManager.WorkerItem -import org.dhis2.data.service.workManager.WorkerType +import org.dhis2.mobile.commons.providers.TIME_DATA +import org.dhis2.mobile.commons.providers.TIME_META +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.model.SyncJobStatus import org.dhis2.utils.analytics.AnalyticsHelper import org.dhis2.utils.analytics.CLICK import org.dhis2.utils.analytics.SYNC_DATA_NOW import org.dhis2.utils.analytics.SYNC_METADATA_NOW +import org.dhis2.mobile.sync.model.SyncStatus as Status class LaunchSync( - private val workManagerController: WorkManagerController, + private val syncBackgroundJobAction: SyncBackgroundJobAction, private val preferenceProvider: PreferenceProvider, private val analyticsHelper: AnalyticsHelper, ) { @@ -34,21 +32,19 @@ class LaunchSync( ) private val metadataWorkInfo = - workManagerController - .getWorkInfosByTagLiveData(Constants.META_NOW) - .asFlow() + syncBackgroundJobAction + .observeMetadataJob() .map { workStatuses -> - var workState: WorkInfo.State? = workStatuses.getOrNull(0)?.state - onWorkStatusesUpdate(workState, Constants.META_NOW) + val currentSyncStatus = combinedStatus(workStatuses) + syncStatus.updateAndGet { it.copy(metadataSyncProgress = currentSyncStatus) } } private val dataWorkInfo = - workManagerController - .getWorkInfosByTagLiveData(Constants.DATA_NOW) - .asFlow() + syncBackgroundJobAction + .observeDataJob() .map { workStatuses -> - var workState: WorkInfo.State? = workStatuses.getOrNull(0)?.state - onWorkStatusesUpdate(workState, Constants.DATA_NOW) + val currentSyncStatus = combinedStatus(workStatuses) + syncStatus.updateAndGet { it.copy(dataSyncProgress = currentSyncStatus) } } val syncWorkInfo = merge(metadataWorkInfo, dataWorkInfo) @@ -85,9 +81,9 @@ class LaunchSync( metadataWasRunning: Boolean, dataWasRunning: Boolean, ) = metadataSyncProgress == SyncStatus.Finished && - metadataWasRunning || - dataSyncProgress == SyncStatus.Finished && - dataWasRunning + metadataWasRunning || + dataSyncProgress == SyncStatus.Finished && + dataWasRunning } suspend operator fun invoke(syncAction: SyncAction) { @@ -99,131 +95,50 @@ class LaunchSync( } } - private fun onWorkStatusesUpdate( - workState: WorkInfo.State?, - workerTag: String, - ): SyncStatusProgress { - if (workState != null) { - when (workState) { - WorkInfo.State.CANCELLED -> - when (workerTag) { - Constants.META_NOW -> syncStatus.update { it.copy(metadataSyncProgress = SyncStatus.Cancelled) } - Constants.DATA_NOW -> syncStatus.update { it.copy(dataSyncProgress = SyncStatus.Cancelled) } - else -> syncStatus - } - - WorkInfo.State.ENQUEUED, - WorkInfo.State.RUNNING, - WorkInfo.State.BLOCKED, - -> - when (workerTag) { - Constants.META_NOW -> syncStatus.update { it.copy(metadataSyncProgress = SyncStatus.InProgress) } - Constants.DATA_NOW -> syncStatus.update { it.copy(dataSyncProgress = SyncStatus.InProgress) } - else -> syncStatus - } - - else -> - when (workerTag) { - Constants.META_NOW -> syncStatus.update { it.copy(metadataSyncProgress = SyncStatus.Finished) } - Constants.DATA_NOW -> syncStatus.update { it.copy(dataSyncProgress = SyncStatus.Finished) } - else -> syncStatus - } - } - } else { - when (workerTag) { - Constants.META_NOW -> syncStatus.update { it.copy(metadataSyncProgress = SyncStatus.Finished) } - Constants.DATA_NOW -> syncStatus.update { it.copy(dataSyncProgress = SyncStatus.Finished) } - else -> syncStatus - } - } - - return syncStatus.value - } - private fun syncData() { analyticsHelper.trackMatomoEvent(Categories.SETTINGS, Actions.SYNC_CONFIG, CLICK) analyticsHelper.setEvent(SYNC_DATA_NOW, CLICK, SYNC_DATA_NOW) - val workerItem = - WorkerItem( - Constants.DATA_NOW, - WorkerType.DATA, - null, - null, - ExistingWorkPolicy.KEEP, - null, - ) - workManagerController.syncDataForWorker(workerItem) + syncBackgroundJobAction.launchDataSync(0) } private fun syncMeta() { analyticsHelper.setEvent(SYNC_METADATA_NOW, CLICK, SYNC_METADATA_NOW) - val workerItem = - WorkerItem( - Constants.META_NOW, - WorkerType.METADATA, - null, - null, - ExistingWorkPolicy.KEEP, - null, - ) - workManagerController.syncDataForWorker(workerItem) + syncBackgroundJobAction.launchMetadataSync(0) } - private fun updateSyncDataPeriod(seconds: Int) { + private suspend fun updateSyncDataPeriod(seconds: Int) { if (seconds != Constants.TIME_MANUAL) { syncData(seconds) } else { - cancelPendingWork(Constants.DATA) + preferenceProvider.setValue(TIME_DATA, 0) + syncBackgroundJobAction.cancelDataSync() } } - private fun updateSyncMetadataPeriod(seconds: Int) { + private suspend fun updateSyncMetadataPeriod(seconds: Int) { if (seconds != Constants.TIME_MANUAL) { syncMeta(seconds) } else { - cancelPendingWork(Constants.META) + preferenceProvider.setValue(TIME_META, 0) + syncBackgroundJobAction.cancelMetadataSync() } } private fun syncMeta(seconds: Int) { analyticsHelper.trackMatomoEvent(Categories.SETTINGS, Actions.SYNC_DATA, CLICK) - preferenceProvider.setValue(Constants.TIME_META, seconds) - workManagerController.cancelUniqueWork(Constants.META) - val workerItem = - WorkerItem( - Constants.META, - WorkerType.METADATA, - seconds.toLong(), - null, - null, - ExistingPeriodicWorkPolicy.REPLACE, - ) - workManagerController.enqueuePeriodicWork(workerItem) + preferenceProvider.setValue(TIME_META, seconds) + syncBackgroundJobAction.launchMetadataSync(seconds.toLong()) } private fun syncData(seconds: Int) { - preferenceProvider.setValue(Constants.TIME_DATA, seconds) - workManagerController.cancelUniqueWork(Constants.DATA) - val workerItem = - WorkerItem( - Constants.DATA, - WorkerType.DATA, - seconds.toLong(), - null, - null, - ExistingPeriodicWorkPolicy.REPLACE, - ) - workManagerController.enqueuePeriodicWork(workerItem) + preferenceProvider.setValue(TIME_DATA, seconds) + syncBackgroundJobAction.launchDataSync(seconds.toLong()) } - private fun cancelPendingWork(tag: String) { - preferenceProvider.setValue( - when (tag) { - Constants.DATA -> Constants.TIME_DATA - else -> Constants.TIME_META - }, - 0, - ) - workManagerController.cancelUniqueWork(tag) + private fun combinedStatus(workStatuses: List<SyncJobStatus>) = when { + workStatuses.any { (it.status is Status.Running) or (it.status is Status.Blocked) } -> SyncStatus.InProgress + workStatuses.all { it.status is Status.Enqueue } -> SyncStatus.None + workStatuses.all { it.status is Status.Cancelled } -> SyncStatus.Cancelled + else -> SyncStatus.Finished } } diff --git a/app/src/main/java/org/dhis2/usescases/settings/models/DataSettingsViewModel.kt b/app/src/main/java/org/dhis2/usescases/settings/models/DataSettingsViewModel.kt index 2b33dc87b92..b5da929d972 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/models/DataSettingsViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/models/DataSettingsViewModel.kt @@ -5,6 +5,7 @@ import org.dhis2.data.service.SyncResult data class DataSettingsViewModel( val dataSyncPeriod: Int, val lastDataSync: String, + val nextDataSync: String?, val syncHasErrors: Boolean, val dataHasErrors: Boolean, val dataHasWarnings: Boolean, diff --git a/app/src/main/java/org/dhis2/usescases/settings/models/MetadataSettingsViewModel.kt b/app/src/main/java/org/dhis2/usescases/settings/models/MetadataSettingsViewModel.kt index ab89e43b8ee..ebe42e80c1e 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/models/MetadataSettingsViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/models/MetadataSettingsViewModel.kt @@ -3,6 +3,8 @@ package org.dhis2.usescases.settings.models data class MetadataSettingsViewModel( val metadataSyncPeriod: Int, val lastMetadataSync: String, + val nextMetadataSync: String?, + val nextSettingsSync: String?, val hasErrors: Boolean, val canEdit: Boolean, val syncInProgress: Boolean, diff --git a/app/src/main/java/org/dhis2/usescases/settings/models/SyncStateInput.kt b/app/src/main/java/org/dhis2/usescases/settings/models/SyncStateInput.kt new file mode 100644 index 00000000000..e9a6d045b28 --- /dev/null +++ b/app/src/main/java/org/dhis2/usescases/settings/models/SyncStateInput.kt @@ -0,0 +1,10 @@ +package org.dhis2.usescases.settings.models + +import org.dhis2.usescases.settings.SettingItem + +data class SyncStateInput( + val openedItem: SettingItem?, + val hasConnection: Boolean, + val metadataSyncInProgress: Boolean, + val dataSyncInProgress: Boolean, +) diff --git a/app/src/main/java/org/dhis2/usescases/settings/ui/SettingsScreen.kt b/app/src/main/java/org/dhis2/usescases/settings/ui/SettingsScreen.kt index 2feb5e357de..92338a93be1 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/ui/SettingsScreen.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/ui/SettingsScreen.kt @@ -7,7 +7,6 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Snackbar import androidx.compose.material3.SnackbarDefaults @@ -22,7 +21,9 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp +import org.dhis2.commons.resources.ColorUtils import org.dhis2.usescases.settings.SettingItem import org.dhis2.usescases.settings.SyncManagerPresenter import org.dhis2.usescases.settings.models.DeleteDataState @@ -30,8 +31,6 @@ import org.dhis2.usescases.settings.models.ErrorViewModel import org.dhis2.usescases.settings.models.SettingsState import org.dhis2.usescases.settings.models.SettingsUiAction import org.hisp.dhis.mobile.ui.designsystem.theme.Spacing -import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor -import org.hisp.dhis.mobile.ui.designsystem.theme.TextColor import org.hisp.dhis.mobile.ui.designsystem.theme.dropShadow import java.io.File @@ -75,8 +74,6 @@ fun SettingsScreen( Snackbar( modifier = Modifier.dropShadow(shape = SnackbarDefaults.shape), snackbarData = data, - containerColor = SurfaceColor.SurfaceBright, - contentColor = TextColor.OnSurface, ) } }, @@ -172,12 +169,17 @@ private fun SettingItemList( exportingDatabase: Boolean, onSettingsUiAction: (SettingsUiAction) -> Unit, ) { + val context = LocalContext.current + val primaryColor = remember(context) { + ColorUtils().getThemePrimaryColor(context) + } + LazyColumn( modifier = modifier .fillMaxSize() .imePadding() - .background(MaterialTheme.colorScheme.primary) + .background(primaryColor) .background(Color.White, RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp)) .clip(RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp)), contentPadding = PaddingValues(8.dp), diff --git a/app/src/main/java/org/dhis2/usescases/settings/ui/SyncDataSettingItem.kt b/app/src/main/java/org/dhis2/usescases/settings/ui/SyncDataSettingItem.kt index b1711f42252..b3851633d18 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/ui/SyncDataSettingItem.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/ui/SyncDataSettingItem.kt @@ -23,6 +23,7 @@ import androidx.compose.ui.semantics.semantics import androidx.compose.ui.semantics.testTag import androidx.compose.ui.text.capitalize import androidx.compose.ui.text.intl.Locale +import org.dhis2.BuildConfig import org.dhis2.R import org.dhis2.bindings.EVERY_12_HOUR import org.dhis2.bindings.EVERY_24_HOUR @@ -76,7 +77,12 @@ internal fun SyncDataSettingItem( } else -> { - provideDefaultInfoItems(dataSettings.dataSyncPeriod, dataSettings.lastDataSync, context) + provideDefaultInfoItems( + dataSettings.dataSyncPeriod, + dataSettings.lastDataSync, + dataSettings.nextDataSync, + context + ) } } @@ -95,13 +101,13 @@ internal fun SyncDataSettingItem( ) { if (dataSettings.canEdit) { var selectedItem by - remember { - mutableStateOf( - DropdownItem( - label = syncPeriodLabel(dataSettings.dataSyncPeriod, context), - ), - ) - } + remember { + mutableStateOf( + DropdownItem( + label = syncPeriodLabel(dataSettings.dataSyncPeriod, context), + ), + ) + } val dataSyncPeriods = listOf( stringResource(R.string.thirty_minutes), @@ -173,19 +179,33 @@ internal fun SyncDataSettingItem( private fun provideDefaultInfoItems( dataSyncPeriod: Int, lastDataSync: String, + nextDataSync: String?, context: Context, ): List<AdditionalInfoItem> = - listOf( - AdditionalInfoItem( - key = stringResource(R.string.settings_sync_period_v2), - value = syncPeriodLabel(dataSyncPeriod, context), - ), - AdditionalInfoItem( - key = stringResource(R.string.last_data_sync), - value = lastDataSync, - color = TextColor.OnSurface, - ), - ) + buildList { + add( + AdditionalInfoItem( + key = stringResource(R.string.settings_sync_period_v2), + value = syncPeriodLabel(dataSyncPeriod, context), + ) + ) + add( + AdditionalInfoItem( + key = stringResource(R.string.last_data_sync), + value = lastDataSync, + color = TextColor.OnSurface, + ) + ) + nextDataSync?.takeIf { BuildConfig.DEBUG }?.let { + add( + AdditionalInfoItem( + key = "Next Sync On", + value = nextDataSync, + color = TextColor.OnSurface, + ) + ) + } + } @Composable private fun provideSyncErrorInfo( diff --git a/app/src/main/java/org/dhis2/usescases/settings/ui/SyncMetadataSettingItem.kt b/app/src/main/java/org/dhis2/usescases/settings/ui/SyncMetadataSettingItem.kt index 7d78ecc6996..3b983201d0b 100644 --- a/app/src/main/java/org/dhis2/usescases/settings/ui/SyncMetadataSettingItem.kt +++ b/app/src/main/java/org/dhis2/usescases/settings/ui/SyncMetadataSettingItem.kt @@ -1,6 +1,7 @@ package org.dhis2.usescases.settings.ui import android.content.Context +import androidx.annotation.StringRes import androidx.compose.foundation.layout.Arrangement.Absolute.spacedBy import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth @@ -20,10 +21,13 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.capitalize import androidx.compose.ui.text.intl.Locale import androidx.compose.ui.unit.dp +import org.dhis2.BuildConfig import org.dhis2.R +import org.dhis2.bindings.EVERY_12_HOUR import org.dhis2.bindings.EVERY_24_HOUR +import org.dhis2.bindings.EVERY_6_HOUR import org.dhis2.bindings.EVERY_7_DAYS -import org.dhis2.commons.Constants +import org.dhis2.commons.Constants.TIME_MANUAL import org.dhis2.usescases.settings.SettingItem import org.dhis2.usescases.settings.models.MetadataSettingsViewModel import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItem @@ -59,6 +63,8 @@ internal fun SyncMetadataSettingItem( provideDefaultInfoItems( metadataSettings.metadataSyncPeriod, metadataSettings.lastMetadataSync, + metadataSettings.nextMetadataSync, + metadataSettings.nextSettingsSync, context, ) } @@ -77,19 +83,29 @@ internal fun SyncMetadataSettingItem( if (metadataSettings.canEdit) { val metaSyncPeriods = listOf( - stringResource(R.string.a_day), - stringResource(R.string.a_week), - stringResource(R.string.Manual), + SyncMetadataPeriods.Every6Hours, + SyncMetadataPeriods.Every12Hours, + SyncMetadataPeriods.Every24Hours, + SyncMetadataPeriods.EveryWeek, + SyncMetadataPeriods.Manual, ) + val dropdownItemLabel = + metaSyncPeriods.map { + stringResource(it.label) + } + var selectedItem by - remember { - mutableStateOf( - DropdownItem( - label = syncPeriodLabel(metadataSettings.metadataSyncPeriod, context), + remember { + mutableStateOf( + DropdownItem( + label = syncPeriodLabel( + metadataSettings.metadataSyncPeriod, + context ), - ) - } + ), + ) + } var inputSyncConfigurationState by remember { mutableStateOf(InputShellState.UNFOCUSED) } @@ -101,21 +117,14 @@ internal fun SyncMetadataSettingItem( itemCount = metaSyncPeriods.size, onSearchOption = {}, fetchItem = { index -> - DropdownItem(metaSyncPeriods[index]) + DropdownItem(dropdownItemLabel[index]) }, selectedItem = selectedItem, onResetButtonClicked = { }, onItemSelected = { index, newItem -> selectedItem = newItem inputSyncConfigurationState = InputShellState.UNFOCUSED - when (index) { - 0 -> onSyncMetaPeriodChanged(EVERY_24_HOUR) - 1 -> onSyncMetaPeriodChanged(EVERY_7_DAYS) - 2 -> onSyncMetaPeriodChanged(Constants.TIME_MANUAL) - else -> { - // do nothing - } - } + onSyncMetaPeriodChanged(metaSyncPeriods[index].syncPeriod) }, showSearchBar = false, loadOptions = {}, @@ -148,18 +157,42 @@ internal fun SyncMetadataSettingItem( private fun provideDefaultInfoItems( metadataSyncPeriod: Int, lastMetadataSync: String, + nextMetadataSync: String?, + nextSettingsSync: String?, context: Context, -) = listOf( - AdditionalInfoItem( - key = stringResource(R.string.settings_sync_period_v2), - value = syncPeriodLabel(metadataSyncPeriod, context), - ), - AdditionalInfoItem( - key = stringResource(R.string.last_data_sync), - value = lastMetadataSync, - color = TextColor.OnSurface, - ), -) +) = buildList { + add( + AdditionalInfoItem( + key = stringResource(R.string.settings_sync_period_v2), + value = syncPeriodLabel(metadataSyncPeriod, context), + ) + ) + add( + AdditionalInfoItem( + key = stringResource(R.string.last_data_sync), + value = lastMetadataSync, + color = TextColor.OnSurface, + ) + ) + nextMetadataSync?.takeIf { BuildConfig.DEBUG }?.let { + add( + AdditionalInfoItem( + key = "Next sync on", + value = it, + color = TextColor.OnSurface, + ) + ) + } + nextSettingsSync?.takeIf { BuildConfig.DEBUG }?.let { + add( + AdditionalInfoItem( + key = "Next settings sync on", + value = it, + color = TextColor.OnSurface, + ) + ) + } +} @Composable private fun provideHasErrorItems( @@ -193,3 +226,18 @@ private fun provideSyncInProgressInfoItems( isConstantItem = true, ), ) + +internal sealed class SyncMetadataPeriods( + @StringRes val label: Int, + val syncPeriod: Int, +) { + data object Every24Hours : SyncMetadataPeriods(R.string.a_day, EVERY_24_HOUR) + + data object Every12Hours : SyncMetadataPeriods(R.string.every_12_hours, EVERY_12_HOUR) + + data object Every6Hours : SyncMetadataPeriods(R.string.every_6_hours, EVERY_6_HOUR) + + data object EveryWeek : SyncMetadataPeriods(R.string.a_week, EVERY_7_DAYS) + + data object Manual : SyncMetadataPeriods(R.string.Manual, TIME_MANUAL) +} diff --git a/app/src/main/java/org/dhis2/usescases/splash/SplashActivity.kt b/app/src/main/java/org/dhis2/usescases/splash/SplashActivity.kt index dfe8ad83645..86677cb554b 100644 --- a/app/src/main/java/org/dhis2/usescases/splash/SplashActivity.kt +++ b/app/src/main/java/org/dhis2/usescases/splash/SplashActivity.kt @@ -55,23 +55,38 @@ class SplashActivity : override fun onResume() { super.onResume() - if (BuildConfig.DEBUG || !RootBeer(this).isRootedWithoutBusyBoxCheck) { - if (!isDebuggerEnable() || !detectDebugger()) { - presenter.init() - } else { - showRootedDialog( - getString(R.string.security_title), - getString(R.string.security_debugger_message), - ) - } - } else { - showRootedDialog( + val isRooted = (!BuildConfig.DEBUG && BuildConfig.FLAVOR != "dhis2Training") && RootBeer(this).isRootedWithBusyBoxCheck + val isDebuggerActive = isDebuggerEnable() && detectDebugger() + + when { + isRooted -> showRootedDialog( getString(R.string.security_title), getString(R.string.security_rooted_message), ) + + isDebuggerActive -> showRootedDialog( + getString(R.string.security_title), + getString(R.string.security_debugger_message), + ) + + else -> presenter.init() } } + private fun isDebuggerEnable(): Boolean = + if (!BuildConfig.DEBUG && BuildConfig.FLAVOR != "dhis2Training") { + context.applicationContext.applicationInfo.flags and FLAG_DEBUGGABLE != 0 + } else { + false + } + + private fun detectDebugger(): Boolean = + if (!BuildConfig.DEBUG && BuildConfig.FLAVOR != "dhis2Training") { + Debug.isDebuggerConnected() + } else { + false + } + override fun onPause() { presenter.destroy() super.onPause() @@ -153,18 +168,4 @@ class SplashActivity : ) } } - - private fun isDebuggerEnable(): Boolean = - if (!BuildConfig.DEBUG) { - context.applicationContext.applicationInfo.flags and FLAG_DEBUGGABLE != 0 - } else { - false - } - - private fun detectDebugger(): Boolean = - if (!BuildConfig.DEBUG) { - Debug.isDebuggerConnected() - } else { - false - } } diff --git a/app/src/main/java/org/dhis2/usescases/sync/SyncActivity.kt b/app/src/main/java/org/dhis2/usescases/sync/SyncActivity.kt index 0b0a027a4e4..1cb60bc3cc7 100644 --- a/app/src/main/java/org/dhis2/usescases/sync/SyncActivity.kt +++ b/app/src/main/java/org/dhis2/usescases/sync/SyncActivity.kt @@ -5,18 +5,23 @@ import android.os.Bundle import android.view.View.GONE import androidx.appcompat.content.res.AppCompatResources import androidx.databinding.DataBindingUtil -import androidx.work.WorkInfo +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import kotlinx.coroutines.launch import org.dhis2.App import org.dhis2.R import org.dhis2.bindings.Bindings import org.dhis2.bindings.userComponent import org.dhis2.databinding.ActivitySynchronizationBinding +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.usescases.general.ActivityGlobalAbstract import org.dhis2.usescases.login.LoginActivity import org.dhis2.usescases.main.MainActivity import org.dhis2.utils.OnDialogClickListener import org.dhis2.utils.extension.navigateTo import org.dhis2.utils.extension.share +import org.koin.android.ext.android.inject import javax.inject.Inject class SyncActivity : @@ -30,20 +35,23 @@ class SyncActivity : @Inject lateinit var animations: SyncAnimations + private val backgroundJobAction: SyncBackgroundJobAction by inject() + override fun onCreate(savedInstanceState: Bundle?) { val serverComponent = (applicationContext as App).serverComponent() - userComponent()?.plus(SyncModule(this, serverComponent))?.inject(this) ?: finish() + userComponent()?.plus(SyncModule(this, backgroundJobAction, serverComponent))?.inject(this) + ?: finish() super.onCreate(savedInstanceState) binding = DataBindingUtil.setContentView(this, R.layout.activity_synchronization) binding.presenter = presenter - presenter.sync() - } - override fun onResume() { - super.onResume() - presenter.observeSyncProcess().observe(this) { workInfoList: List<WorkInfo> -> - presenter.handleSyncInfo(workInfoList) + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + presenter.observeSyncProcess().collect(presenter::handleSyncInfo) + } } + + presenter.sync() } override fun setMetadataSyncStarted() { diff --git a/app/src/main/java/org/dhis2/usescases/sync/SyncInjector.kt b/app/src/main/java/org/dhis2/usescases/sync/SyncInjector.kt index 1abecbbd72e..12e307c465f 100644 --- a/app/src/main/java/org/dhis2/usescases/sync/SyncInjector.kt +++ b/app/src/main/java/org/dhis2/usescases/sync/SyncInjector.kt @@ -7,7 +7,7 @@ import org.dhis2.commons.di.dagger.PerActivity import org.dhis2.commons.prefs.PreferenceProvider import org.dhis2.commons.schedulers.SchedulerProvider import org.dhis2.data.server.ServerComponent -import org.dhis2.data.service.workManager.WorkManagerController +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction @PerActivity @Subcomponent(modules = [SyncModule::class]) @@ -18,6 +18,7 @@ interface SyncComponent { @Module class SyncModule( private val view: SyncView, + private val backgroundJobAction: SyncBackgroundJobAction, serverComponent: ServerComponent?, ) { private val userManager = serverComponent?.userManager() @@ -26,14 +27,13 @@ class SyncModule( @PerActivity fun providePresenter( schedulerProvider: SchedulerProvider, - workManagerController: WorkManagerController, preferences: PreferenceProvider, ): SyncPresenter = SyncPresenter( view, userManager, schedulerProvider, - workManagerController, + backgroundJobAction, preferences, ) } diff --git a/app/src/main/java/org/dhis2/usescases/sync/SyncPresenter.kt b/app/src/main/java/org/dhis2/usescases/sync/SyncPresenter.kt index 90735348a02..91d7c5e58bc 100644 --- a/app/src/main/java/org/dhis2/usescases/sync/SyncPresenter.kt +++ b/app/src/main/java/org/dhis2/usescases/sync/SyncPresenter.kt @@ -1,15 +1,14 @@ package org.dhis2.usescases.sync -import androidx.lifecycle.LiveData -import androidx.work.WorkInfo import io.reactivex.disposables.CompositeDisposable -import org.dhis2.commons.Constants import org.dhis2.commons.prefs.Preference import org.dhis2.commons.prefs.PreferenceProvider import org.dhis2.commons.schedulers.SchedulerProvider import org.dhis2.data.server.UserManager -import org.dhis2.data.service.METADATA_MESSAGE -import org.dhis2.data.service.workManager.WorkManagerController +import org.dhis2.mobile.sync.data.METADATA_SYNC_NOW +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.model.SyncJobStatus +import org.dhis2.mobile.sync.model.SyncStatus import timber.log.Timber const val WAS_INITIAL_SYNC_DONE = "WasInitialSyncDone" @@ -18,35 +17,35 @@ class SyncPresenter internal constructor( private val view: SyncView, private val userManager: UserManager?, private val schedulerProvider: SchedulerProvider, - private val workManagerController: WorkManagerController, + private val backgroundJobAction: SyncBackgroundJobAction, private val preferences: PreferenceProvider, ) { private val disposable = CompositeDisposable() fun sync() { - workManagerController - .syncMetaDataForWorker(Constants.META_NOW, Constants.INITIAL_SYNC) + backgroundJobAction.launchMetadataSync(0) } - fun observeSyncProcess(): LiveData<List<WorkInfo>> = workManagerController.getWorkInfosForUniqueWorkLiveData(Constants.INITIAL_SYNC) + fun observeSyncProcess() = backgroundJobAction.observeMetadataJob() - fun handleSyncInfo(workInfoList: List<WorkInfo>) { + fun handleSyncInfo(workInfoList: List<SyncJobStatus>) { workInfoList.forEach { workInfo -> - if (workInfo.tags.contains(Constants.META_NOW)) { - handleMetaState(workInfo.state, workInfo.outputData.getString(METADATA_MESSAGE)) + if (workInfo.tags.contains(METADATA_SYNC_NOW)) { + handleMetaState(workInfo.status, workInfo.message) } } } private fun handleMetaState( - state: WorkInfo.State, + state: SyncStatus, message: String?, ) { when (state) { - WorkInfo.State.RUNNING -> view.setMetadataSyncStarted() - WorkInfo.State.SUCCEEDED -> view.setMetadataSyncSucceed() - WorkInfo.State.FAILED -> view.showMetadataFailedMessage(message) + SyncStatus.Running -> view.setMetadataSyncStarted() + SyncStatus.Succeed -> view.setMetadataSyncSucceed() + SyncStatus.Failed -> view.showMetadataFailedMessage(message) else -> { + // do nothing } } } diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepository.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepository.kt index 6d14f0090e9..2a3db2c1aae 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepository.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepository.kt @@ -64,7 +64,7 @@ interface DashboardRepository { fun getTeiActivePrograms( teiUid: String, showOnlyActive: Boolean, - ): Observable<List<kotlin.Pair<Program, MetadataIconData>>> + ): Observable<List<Pair<Program, MetadataIconData>>> fun getTEIEnrollments(teiUid: String): Observable<List<Enrollment>> @@ -92,7 +92,7 @@ interface DashboardRepository { fun programHasRelationships(): Boolean - fun programHasAnalytics(): Boolean + suspend fun programHasAnalytics(): Boolean fun programHasSimprintsRampProgramStageHistoryTable(): Boolean @@ -101,7 +101,7 @@ interface DashboardRepository { fun getAttributesMap( programUid: String, teiUid: String, - ): Observable<List<kotlin.Pair<TrackedEntityAttribute, TrackedEntityAttributeValue>>> + ): Observable<List<Pair<TrackedEntityAttribute, TrackedEntityAttributeValue>>> fun getDashboardModel(): DashboardModel? diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepositoryImpl.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepositoryImpl.kt index c55cd32356d..aae48468232 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepositoryImpl.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardRepositoryImpl.kt @@ -12,6 +12,9 @@ import org.dhis2.commons.featureconfig.data.FeatureConfigRepository import org.dhis2.commons.prefs.Preference import org.dhis2.commons.prefs.PreferenceProvider import org.dhis2.commons.resources.MetadataIconProvider +import org.dhis2.data.dhislogic.AUTH_ALL +import org.dhis2.data.dhislogic.AUTH_ENROLLMENT_CASCADE_DELETE +import org.dhis2.data.dhislogic.AUTH_TEI_CASCADE_DELETE import org.dhis2.mobile.commons.model.MetadataIconData import org.dhis2.utils.ValueUtils import org.hisp.dhis.android.core.D2 @@ -576,7 +579,7 @@ class DashboardRepositoryImpl( override fun getTeiActivePrograms( teiUid: String, showOnlyActive: Boolean, - ): Observable<List<kotlin.Pair<Program, MetadataIconData>>> { + ): Observable<List<Pair<Program, MetadataIconData>>> { val enrollmentRepo = d2 .enrollmentModule() @@ -646,7 +649,7 @@ class DashboardRepositoryImpl( .userModule() .authorities() .byName() - .eq("F_TEI_CASCADE_DELETE") + .`in`(AUTH_TEI_CASCADE_DELETE, AUTH_ALL) .one() .blockingExists() @@ -674,7 +677,7 @@ class DashboardRepositoryImpl( .userModule() .authorities() .byName() - .eq("F_ENROLLMENT_CASCADE_DELETE") + .`in`(AUTH_ENROLLMENT_CASCADE_DELETE, AUTH_ALL) .one() .blockingExists() @@ -749,7 +752,7 @@ class DashboardRepositoryImpl( } else { Observable.just(StatusChangeResultCode.WRITE_PERMISSION_FAIL) } - } catch (error: D2Error) { + } catch (_: D2Error) { Observable.just(StatusChangeResultCode.FAILED) } @@ -781,7 +784,7 @@ class DashboardRepositoryImpl( false } - override fun programHasAnalytics(): Boolean = + override suspend fun programHasAnalytics(): Boolean = if (!programUid.isNullOrEmpty()) { val enrollmentScopeRulesUids = d2 @@ -902,12 +905,12 @@ class DashboardRepositoryImpl( override fun getAttributesMap( programUid: String, teiUid: String, - ): Observable<List<kotlin.Pair<TrackedEntityAttribute, TrackedEntityAttributeValue>>> = + ): Observable<List<Pair<TrackedEntityAttribute, TrackedEntityAttributeValue>>> = teiAttributesProvider .getProgramTrackedEntityAttributesByProgram(programUid, teiUid) .toObservable() - .flatMapIterable { list: List<kotlin.Pair<TrackedEntityAttribute?, TrackedEntityAttributeValue?>>? -> list } - .map { (attribute, attributeValue): kotlin.Pair<TrackedEntityAttribute?, TrackedEntityAttributeValue?> -> + .flatMapIterable { list: List<Pair<TrackedEntityAttribute?, TrackedEntityAttributeValue?>>? -> list } + .map { (attribute, attributeValue): Pair<TrackedEntityAttribute?, TrackedEntityAttributeValue?> -> val formattedAttributeValue: TrackedEntityAttributeValue = if (attributeValue != null && attribute!!.valueType() != ValueType.IMAGE) { ValueUtils.transform( diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardViewModel.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardViewModel.kt index 807db06e254..fa2a64953a4 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardViewModel.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/DashboardViewModel.kt @@ -123,11 +123,24 @@ class DashboardViewModel( } } - private fun loadNavigationBarItems() { - updateNavigationBarItems(_navigationBarUIState.value.selectedItem) + private suspend fun loadNavigationBarItems() { + val hasAnalytics = withContext(dispatcher.io()) { repository.programHasAnalytics() } + updateNavigationBarItems(_navigationBarUIState.value.selectedItem, hasAnalytics) } private fun updateNavigationBarItems(selectedItem: TEIDashboardItems?) { + viewModelScope.launch(dispatcher.io()) { + val hasAnalytics = repository.programHasAnalytics() + withContext(dispatcher.ui()) { + updateNavigationBarItems(selectedItem, hasAnalytics) + } + } + } + + private fun updateNavigationBarItems( + selectedItem: TEIDashboardItems?, + hasAnalytics: Boolean, + ) { val enrollmentItems = mutableListOf<NavigationBarItem<TEIDashboardItems>>() if (displayDetailsNavigationItem || forceDisplayDetailsNavigationItemForSimprintsRampTable) { @@ -141,7 +154,7 @@ class DashboardViewModel( ) } - if (pageConfigurator.displayAnalytics()) { + if (hasAnalytics && pageConfigurator.displayAnalytics()) { enrollmentItems.add( NavigationBarItem( id = TEIDashboardItems.ANALYTICS, @@ -276,7 +289,7 @@ class DashboardViewModel( try { val hasMoreEnrollments = result.await() onSuccess(hasMoreEnrollments) - } catch (e: AuthorityException) { + } catch (_: AuthorityException) { onAuthorityError() } catch (e: Exception) { Timber.e(e) diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/TeiDashboardMobileActivity.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/TeiDashboardMobileActivity.kt index b1d9a091990..935457a85a7 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/TeiDashboardMobileActivity.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/TeiDashboardMobileActivity.kt @@ -3,7 +3,6 @@ package org.dhis2.usescases.teiDashboard import android.app.ActivityOptions import android.content.Context import android.content.Intent -import android.os.Build import android.os.Bundle import android.os.Handler import android.os.Looper @@ -708,15 +707,13 @@ class TeiDashboardMobileActivity : } binding.executePendingBindings() setTheme(themeManager.getProgramTheme()) - if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) { - val window = window - window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) - val typedValue = TypedValue() - val a = obtainStyledAttributes(typedValue.data, intArrayOf(R.attr.colorPrimaryDark)) - val colorToReturn = a.getColor(0, 0) - a.recycle() - window.statusBarColor = colorToReturn - } + val window = window + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) + val typedValue = TypedValue() + val a = obtainStyledAttributes(typedValue.data, intArrayOf(R.attr.colorPrimaryDark)) + val colorToReturn = a.getColor(0, 0) + a.recycle() + window.statusBarColor = colorToReturn } override fun updateNoteBadge(numberOfNotes: Int) { diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/TeiDashboardPageConfigurator.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/TeiDashboardPageConfigurator.kt index 1ac18b7cfc8..23a2acf6c02 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/TeiDashboardPageConfigurator.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/TeiDashboardPageConfigurator.kt @@ -8,7 +8,7 @@ class TeiDashboardPageConfigurator( ) : NavigationPageConfigurator { override fun displayDetails(): Boolean = isPortrait - override fun displayAnalytics(): Boolean = dashboardRepository.programHasAnalytics() && !displayTableView() + override fun displayAnalytics(): Boolean = !displayTableView() override fun displayRelationships(): Boolean = dashboardRepository.programHasRelationships() diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/BaseIndicatorRepository.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/BaseIndicatorRepository.kt index 7c1f1e179af..3b9159c663e 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/BaseIndicatorRepository.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/BaseIndicatorRepository.kt @@ -9,6 +9,7 @@ import dhis2.org.analytics.charts.ui.SectionType import io.reactivex.Flowable import io.reactivex.Observable import org.dhis2.commons.resources.ResourceManager +import org.dhis2.mobileProgramRules.RuleConstants import org.dhis2.mobileProgramRules.RuleEngineHelper import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.arch.helpers.UidGeneratorImpl @@ -111,6 +112,8 @@ abstract class BaseIndicatorRepository( val ruleAction = ruleEffect.ruleAction if (ruleEffect.data?.contains("#{") == false) { if (ruleAction.type == ProgramRuleActionType.DISPLAYKEYVALUEPAIR.name) { + val legendSet = ruleAction.values[RuleConstants.LEGENDSET_LABEL] + val color = getLegendColor(ruleEffect.data, legendSet) val indicator = IndicatorModel( ProgramIndicator @@ -119,7 +122,7 @@ abstract class BaseIndicatorRepository( .displayName((ruleAction).content()) .build(), ruleEffect.data, - null, + color, ruleAction.values["location"] ?: DEFAULT_LOCATION, resourceManager.defaultIndicatorLabel(), ) @@ -131,9 +134,9 @@ abstract class BaseIndicatorRepository( ProgramIndicator .builder() .uid(UidGeneratorImpl().generate()) - .displayName(resourceManager.defaultIndicatorLabel()) + .displayName("${ruleAction.content() ?: ""}${ruleEffect.data}") .build(), - "${ruleAction.content() ?: ""}${ruleEffect.data}", + "", null, ruleAction.values["location"] ?: DEFAULT_LOCATION, resourceManager.defaultIndicatorLabel(), @@ -147,6 +150,29 @@ abstract class BaseIndicatorRepository( return indicators } + private fun getLegendColor( + data: String?, + legendSet: String?, + ): String? { + if (data.isNullOrEmpty() || legendSet.isNullOrEmpty()) return null + + val legendValue = getNumberValue(data) ?: return null + + val legends = + d2 + .legendSetModule() + .legends() + .byStartValue() + .smallerThan(legendValue) + .byEndValue() + .biggerOrEqualTo(legendValue) + .byLegendSet() + .eq(legendSet) + .blockingGet() + + return legends.firstOrNull()?.color() + } + private fun getLegendColorForIndicator( indicator: ProgramIndicator, value: String?, @@ -240,4 +266,16 @@ abstract class BaseIndicatorRepository( } } } + + companion object { + private val NUMBER_REGEX = """-?\b(\d{1,3}(,\d{3})*(\.\d+)?|\d+(\.\d+)?)\b""".toRegex() + + internal fun getNumberValue(data: String): Double? { + return NUMBER_REGEX + .find(data) + ?.value + ?.replace(",", "") + ?.toDoubleOrNull() + } + } } diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/EventIndicatorRepository.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/EventIndicatorRepository.kt index 229ec86cade..ccf47212cf1 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/EventIndicatorRepository.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/EventIndicatorRepository.kt @@ -1,7 +1,6 @@ package org.dhis2.usescases.teiDashboard.dashboardfragments.indicators import dhis2.org.analytics.charts.ui.AnalyticsModel -import io.reactivex.Flowable import org.dhis2.commons.resources.ResourceManager import org.dhis2.mobileProgramRules.RuleEngineHelper import org.hisp.dhis.android.core.D2 @@ -13,19 +12,19 @@ class EventIndicatorRepository( val eventUid: String, resourceManager: ResourceManager, ) : BaseIndicatorRepository(d2, ruleEngineHelper, programUid, resourceManager) { - override fun fetchData(): Flowable<List<AnalyticsModel>> = - Flowable.zip( - getIndicators { indicatorUid -> - d2 - .programModule() - .programIndicatorEngine() - .getEventProgramIndicatorValue( - eventUid, - indicatorUid, - ) ?: "" - }, - getRulesIndicators(), - ) { indicators, ruleIndicators -> - arrangeSections(indicators, ruleIndicators) - } + override suspend fun fetchData(): List<AnalyticsModel> { + val indicators = getIndicators { indicatorUid -> + d2 + .programModule() + .programIndicatorEngine() + .getEventProgramIndicatorValue( + eventUid, + indicatorUid, + ) ?: "" + }.blockingFirst(emptyList()) + + val ruleIndicators = getRulesIndicators().blockingFirst(emptyList()) + + return arrangeSections(indicators, ruleIndicators) + } } diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorRepository.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorRepository.kt index e2f0f78fb35..65f6562048c 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorRepository.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorRepository.kt @@ -3,12 +3,11 @@ package org.dhis2.usescases.teiDashboard.dashboardfragments.indicators import dhis2.org.analytics.charts.ui.AnalyticsModel import dhis2.org.analytics.charts.ui.ChartModel import dhis2.org.analytics.charts.ui.OrgUnitFilterType -import io.reactivex.Flowable import org.hisp.dhis.android.core.common.RelativePeriod import org.hisp.dhis.android.core.organisationunit.OrganisationUnit interface IndicatorRepository { - fun fetchData(): Flowable<List<AnalyticsModel>> + suspend fun fetchData(): List<AnalyticsModel> fun filterByPeriod( chartModel: ChartModel, diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorsModule.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorsModule.kt index e63ab42534b..b28c187d06d 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorsModule.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorsModule.kt @@ -5,7 +5,7 @@ import dagger.Provides import dhis2.org.analytics.charts.Charts import org.dhis2.commons.di.dagger.PerFragment import org.dhis2.commons.resources.ResourceManager -import org.dhis2.commons.schedulers.SchedulerProvider +import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.mobileProgramRules.RuleEngineHelper import org.hisp.dhis.android.core.D2 @@ -19,9 +19,9 @@ class IndicatorsModule( @Provides @PerFragment fun providesPresenter( - schedulerProvider: SchedulerProvider, + dispatcherProvider: DispatcherProvider, indicatorRepository: IndicatorRepository, - ): IndicatorsPresenter = IndicatorsPresenter(schedulerProvider, view, indicatorRepository) + ): IndicatorsPresenter = IndicatorsPresenter(dispatcherProvider, view, indicatorRepository) @Provides @PerFragment diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorsPresenter.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorsPresenter.kt index 407be11ed64..7495dd80bd2 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorsPresenter.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorsPresenter.kt @@ -4,34 +4,42 @@ import dhis2.org.analytics.charts.idling.AnalyticsCountingIdlingResource import dhis2.org.analytics.charts.ui.ChartFilter import dhis2.org.analytics.charts.ui.ChartModel import dhis2.org.analytics.charts.ui.OrgUnitFilterType -import io.reactivex.disposables.CompositeDisposable -import io.reactivex.processors.PublishProcessor -import org.dhis2.commons.schedulers.SchedulerProvider -import org.dhis2.commons.schedulers.defaultSubscribe +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import org.dhis2.commons.viewmodel.DispatcherProvider import org.hisp.dhis.android.core.common.RelativePeriod import org.hisp.dhis.android.core.organisationunit.OrganisationUnit import timber.log.Timber class IndicatorsPresenter( - val schedulerProvider: SchedulerProvider, + val dispatcherProvider: DispatcherProvider, val view: IndicatorsView, val indicatorRepository: IndicatorRepository, ) { - var compositeDisposable: CompositeDisposable = CompositeDisposable() - val publishProcessor = PublishProcessor.create<Unit>() + private val scope = CoroutineScope(SupervisorJob() + dispatcherProvider.io()) fun init() { AnalyticsCountingIdlingResource.increment() + fetchData() + } - compositeDisposable.add( - publishProcessor - .startWith(Unit) - .flatMap { indicatorRepository.fetchData() } - .defaultSubscribe(schedulerProvider, { view.swapAnalytics(it) }, { Timber.d(it) }), - ) + private fun fetchData() { + scope.launch { + try { + val data = indicatorRepository.fetchData() + withContext(dispatcherProvider.ui()) { + view.swapAnalytics(data) + } + } catch (e: Exception) { + Timber.d(e) + } + } } - fun onDettach() = compositeDisposable.clear() + fun onDettach() = scope.cancel() fun displayMessage(message: String) = view.displayMessage(message) @@ -41,7 +49,7 @@ class IndicatorsPresenter( lineListingColumnId: Int?, ) { indicatorRepository.filterByPeriod(chartModel, selectedPeriods, lineListingColumnId) - publishProcessor.onNext(Unit) + fetchData() } fun filterByOrgUnit( @@ -56,7 +64,7 @@ class IndicatorsPresenter( filterType, lineListingColumnId, ) - publishProcessor.onNext(Unit) + fetchData() } fun resetFilter( @@ -87,6 +95,6 @@ class IndicatorsPresenter( ) } } - publishProcessor.onNext(Unit) + fetchData() } } diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/TrackerAnalyticsRepository.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/TrackerAnalyticsRepository.kt index 00a6d4f12d9..70cc359fe4b 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/TrackerAnalyticsRepository.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/TrackerAnalyticsRepository.kt @@ -4,8 +4,6 @@ import dhis2.org.analytics.charts.Charts import dhis2.org.analytics.charts.ui.AnalyticsModel import dhis2.org.analytics.charts.ui.ChartModel import dhis2.org.analytics.charts.ui.OrgUnitFilterType -import io.reactivex.Flowable -import io.reactivex.functions.Function3 import org.dhis2.commons.resources.ResourceManager import org.dhis2.mobileProgramRules.RuleEngineHelper import org.dhis2.utils.DhisTextUtils @@ -37,32 +35,25 @@ class TrackerAnalyticsRepository( enrollmentUid = enrollmentRepository.one().blockingGet()?.uid() ?: "" } - override fun fetchData(): Flowable<List<AnalyticsModel>> = - Flowable.zip< - List<AnalyticsModel>?, - List<AnalyticsModel>?, - List<AnalyticsModel>, - List<AnalyticsModel>, - >( - getIndicators( - !DhisTextUtils.isEmpty(enrollmentUid), - ) { indicatorUid -> - d2 - .programModule() - .programIndicatorEngine() - .getEnrollmentProgramIndicatorValue( - enrollmentUid, - indicatorUid, - ) ?: "" - }, - getRulesIndicators(), - Flowable.just( - charts?.geEnrollmentCharts(enrollmentUid)?.map { ChartModel(it) }, - ), - Function3 { indicators, ruleIndicators, charts -> - arrangeSections(indicators, ruleIndicators, charts) - }, - ) + override suspend fun fetchData(): List<AnalyticsModel> { + val indicators = getIndicators( + !DhisTextUtils.isEmpty(enrollmentUid), + ) { indicatorUid -> + d2 + .programModule() + .programIndicatorEngine() + .getEnrollmentProgramIndicatorValue( + enrollmentUid, + indicatorUid, + ) ?: "" + }.blockingFirst(emptyList()) + + val ruleIndicators = getRulesIndicators().blockingFirst(emptyList()) + + val chartModels = charts?.geEnrollmentCharts(enrollmentUid)?.map { ChartModel(it) } ?: emptyList() + + return arrangeSections(indicators, ruleIndicators, chartModels) + } override fun filterByPeriod( chartModel: ChartModel, diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/relationships/RelationshipModule.java b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/relationships/RelationshipModule.java index ef142b8557c..c4274ef465b 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/relationships/RelationshipModule.java +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/relationships/RelationshipModule.java @@ -2,6 +2,7 @@ import android.content.Context; +import org.dhis2.R; import org.dhis2.commons.data.ProgramConfigurationRepository; import org.dhis2.commons.date.DateLabelProvider; import org.dhis2.commons.date.DateUtils; @@ -11,6 +12,8 @@ import org.dhis2.commons.resources.MetadataIconProvider; import org.dhis2.commons.resources.ResourceManager; import org.dhis2.commons.viewmodel.DispatcherProvider; +import org.dhis2.data.enrollment.EnrollmentUiDataHelper; +import org.dhis2.data.sorting.SearchSortingValueSetter; import org.dhis2.maps.geometry.bound.GetBoundingBox; import org.dhis2.maps.geometry.line.MapLineRelationshipToFeature; import org.dhis2.maps.geometry.mapper.featurecollection.MapRelationshipsToFeatureCollection; @@ -108,7 +111,8 @@ RelationshipMapsRepository providesRepository( ResourceManager resourceManager, MetadataIconProvider metadataIconProvider, DateLabelProvider dateLabelProvider, - DateUtils dateUtils + DateUtils dateUtils, + SearchSortingValueSetter sortingValueSetter ) { RelationshipConfiguration config; if (teiUid != null) { @@ -124,7 +128,8 @@ RelationshipMapsRepository providesRepository( d2, profilePictureProvider, dateLabelProvider, - metadataIconProvider + metadataIconProvider, + sortingValueSetter ), new EventInfoProvider( d2, @@ -137,6 +142,42 @@ RelationshipMapsRepository providesRepository( ); } + @Provides + @PerFragment + SearchSortingValueSetter searchSortingValueSetter( + Context context, + D2 d2, + EnrollmentUiDataHelper enrollmentUiDataHelper, + ResourceManager resourceManager) { + String unknownLabel = context.getString(R.string.unknownValue); + String eventDateLabel = context.getString(R.string.most_recent_event_date); + String enrollmentStatusLabel = resourceManager.formatWithEnrollmentLabel( + null, + R.string.filters_title_enrollment_status, + 1, + false); + String enrollmentDateDefaultLabel = resourceManager.formatWithEnrollmentLabel( + null, + R.string.enrollment_date_V2, + 1, + false); + String uiDateFormat = DateUtils.SIMPLE_DATE_FORMAT; + return new SearchSortingValueSetter(d2, + unknownLabel, + eventDateLabel, + enrollmentStatusLabel, + enrollmentDateDefaultLabel, + uiDateFormat, + enrollmentUiDataHelper); + } + + @Provides + @PerFragment + EnrollmentUiDataHelper enrollmentUiDataHelper(Context context) { + return new EnrollmentUiDataHelper(context); + } + + @Provides @PerFragment MapRelationshipsToFeatureCollection provideMapRelationshipToFeatureCollection() { diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataFragment.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataFragment.kt index 299bd2620de..1f27a1808f1 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataFragment.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataFragment.kt @@ -682,6 +682,7 @@ class TEIDataFragment : eventMode: EventMode, programUid: String, ) { + if (!isAdded) return val intent = EventCaptureActivity.intent( context = requireContext(), @@ -696,6 +697,7 @@ class TEIDataFragment : programUid: String, programStageUid: String, ) { + if (!isAdded) return OUTreeFragment .Builder() .singleSelection() diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataPresenter.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataPresenter.kt index 8dc501194ac..1beb0ac69e8 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataPresenter.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TEIDataPresenter.kt @@ -12,6 +12,7 @@ import io.reactivex.disposables.CompositeDisposable import io.reactivex.processors.BehaviorProcessor import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import org.dhis2.commons.Constants import org.dhis2.commons.bindings.canCreateEventInEnrollment import org.dhis2.commons.bindings.enrollment @@ -413,9 +414,15 @@ class TEIDataPresenter( when (eventCreationType) { EventCreationType.ADDNEW -> programUid?.let { program -> - val orgUnitUid = d2.enrollment(enrollmentUid)?.organisationUnit() - orgUnitUid?.let { onNewEventSelected(orgUnitUid, stage.uid()) } - ?: checkOrgUnitCount(program, stage.uid()) + CoroutineScope(dispatcher.io()).launch { + val enrollmentOrgUnitUid = d2.enrollment(enrollmentUid)?.organisationUnit() + val ownerOrgUnit = teiDataRepository.ownerOrgUnit(teiUid) + val eventOrgUnit = ownerOrgUnit ?: enrollmentOrgUnitUid + withContext(dispatcher.ui()) { + eventOrgUnit?.let { onNewEventSelected(eventOrgUnit, stage.uid()) } + ?: checkOrgUnitCount(program, stage.uid()) + } + } } EventCreationType.SCHEDULE -> { @@ -484,7 +491,9 @@ class TEIDataPresenter( if (orgUnits.count() == 1) { onNewEventSelected(orgUnits.first().uid(), programStageUid) } else { - view.displayOrgUnitSelectorForNewEvent(programUid, programStageUid) + withContext(dispatcher.ui()) { + view.displayOrgUnitSelectorForNewEvent(programUid, programStageUid) + } } } } @@ -502,14 +511,18 @@ class TEIDataPresenter( enrollmentUid = enrollmentUid, ).fold( onSuccess = { eventUid -> - view.goToEventDetails( - eventUid = eventUid, - eventMode = EventMode.NEW, - programUid = it, - ) + withContext(dispatcher.ui()) { + view.goToEventDetails( + eventUid = eventUid, + eventMode = EventMode.NEW, + programUid = it, + ) + } }, onFailure = { d2Error -> - view.displayMessage(d2ErrorUtils.getErrorMessage(d2Error)) + withContext(dispatcher.ui()) { + view.displayMessage(d2ErrorUtils.getErrorMessage(d2Error)) + } }, ) } diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TeiDataRepository.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TeiDataRepository.kt index 1079c7bb338..77641689f9b 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TeiDataRepository.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TeiDataRepository.kt @@ -32,6 +32,8 @@ interface TeiDataRepository { fun displayOrganisationUnit(programUid: String): Boolean + fun ownerOrgUnit(teiUid: String): String? + fun enrollmentOrgUnitInCaptureScope(enrollmentOrgUnit: String): Boolean fun programOrgListInCaptureScope(programUid: String): List<OrganisationUnit> diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TeiDataRepositoryImpl.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TeiDataRepositoryImpl.kt index 73a5731d2b0..64385dbe08e 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TeiDataRepositoryImpl.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/dashboardfragments/teidata/TeiDataRepositoryImpl.kt @@ -544,6 +544,20 @@ class TeiDataRepositoryImpl( .byProgramUids(listOf(programUid)) .blockingCount() > 1 + override fun ownerOrgUnit(teiUid: String): String? { + + return d2 + .trackedEntityModule() + .trackedEntityInstances() + .withProgramOwners() + .uid(teiUid) + .blockingGet() + ?.programOwners() + ?.firstOrNull { + it.trackedEntityInstance() == teiUid + }?.ownerOrgUnit() + } + override fun enrollmentOrgUnitInCaptureScope(enrollmentOrgUnit: String): Boolean = !getOrgUnitCollectionRepositoryByCaptureScope() .byUid() diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListActivity.java b/app/src/main/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListActivity.java index d9535cdf9fd..70df38985c7 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListActivity.java +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListActivity.java @@ -34,7 +34,7 @@ public class TeiProgramListActivity extends ActivityGlobalAbstract implements Te @Override public void onCreate(@Nullable Bundle savedInstanceState) { String trackedEntityId = getIntent().getStringExtra("TEI_UID"); - ((App) getApplicationContext()).userComponent().plus(new TeiProgramListModule(this, trackedEntityId)).inject(this); + ((App) getApplicationContext()).userComponent().plus(new TeiProgramListModule(this, trackedEntityId, getSyncStatusController())).inject(this); super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_tei_program_list); binding.setPresenter(presenter); diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListInteractor.java b/app/src/main/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListInteractor.java index 3f389a6a94a..a2d2f905f16 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListInteractor.java +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListInteractor.java @@ -8,7 +8,7 @@ import org.dhis2.commons.dialogs.calendarpicker.OnDatePickerListener; import org.dhis2.commons.orgunitselector.OUTreeFragment; import org.dhis2.mobile.commons.orgunit.OrgUnitSelectorScope; -import org.dhis2.data.service.SyncStatusController; +import org.dhis2.mobile.sync.domain.SyncStatusController; import org.dhis2.usescases.main.program.ProgramDownloadState; import org.dhis2.usescases.main.program.ProgramUiModel; import org.hisp.dhis.android.core.organisationunit.OrganisationUnit; diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListModule.java b/app/src/main/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListModule.java index 91d1b696c16..bd6a5e6c556 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListModule.java +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListModule.java @@ -4,10 +4,8 @@ import org.dhis2.commons.di.dagger.PerActivity; import org.dhis2.commons.prefs.PreferenceProvider; -import org.dhis2.commons.resources.ColorUtils; import org.dhis2.commons.resources.MetadataIconProvider; -import org.dhis2.commons.resources.ResourceManager; -import org.dhis2.data.service.SyncStatusController; +import org.dhis2.mobile.sync.domain.SyncStatusController; import org.dhis2.usescases.main.program.ProgramViewModelMapper; import org.dhis2.utils.analytics.AnalyticsHelper; import org.hisp.dhis.android.core.D2; @@ -22,9 +20,12 @@ public class TeiProgramListModule { private final TeiProgramListContract.View view; private final String teiUid; - TeiProgramListModule(TeiProgramListContract.View view, String teiUid) { + private final SyncStatusController syncStatusController; + + TeiProgramListModule(TeiProgramListContract.View view, String teiUid, SyncStatusController syncStatusController) { this.view = view; this.teiUid = teiUid; + this.syncStatusController = syncStatusController; } @Provides @@ -45,8 +46,7 @@ TeiProgramListContract.Presenter providesPresenter(TeiProgramListContract.Intera @Provides @PerActivity - TeiProgramListContract.Interactor provideInteractor(@NonNull TeiProgramListRepository teiProgramListRepository, - SyncStatusController syncStatusController) { + TeiProgramListContract.Interactor provideInteractor(@NonNull TeiProgramListRepository teiProgramListRepository) { return new TeiProgramListInteractor(teiProgramListRepository, syncStatusController); } diff --git a/app/src/main/java/org/dhis2/usescases/teiDashboard/ui/TopBarIcons.kt b/app/src/main/java/org/dhis2/usescases/teiDashboard/ui/TopBarIcons.kt index d6ad22584cc..934879270f7 100644 --- a/app/src/main/java/org/dhis2/usescases/teiDashboard/ui/TopBarIcons.kt +++ b/app/src/main/java/org/dhis2/usescases/teiDashboard/ui/TopBarIcons.kt @@ -5,11 +5,11 @@ import androidx.compose.material.icons.outlined.Edit import androidx.compose.material3.Icon import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.res.stringResource import org.dhis2.R import org.dhis2.tracker.relationships.ui.state.RelationshipTopBarIconState +import org.dhis2.utils.getOnToolbarColor import org.hisp.dhis.mobile.ui.designsystem.component.Button import org.hisp.dhis.mobile.ui.designsystem.component.ButtonStyle import org.hisp.dhis.mobile.ui.designsystem.component.IconButton @@ -19,13 +19,14 @@ fun ComposeView?.setButtonContent( onButtonClicked: () -> Unit, ) { this?.setContent { + val onToolbarColor = getOnToolbarColor() Button( text = "${stringResource(id = R.string.edit)} ${trackedEntityName.lowercase()}", style = ButtonStyle.TEXT_LIGHT, icon = { Icon( imageVector = Icons.Outlined.Edit, - tint = Color.White, + tint = onToolbarColor, contentDescription = "Edit", ) }, @@ -39,13 +40,14 @@ fun RelationshipTopBarIcon( relationshipTopBarIconState: RelationshipTopBarIconState, onButtonClicked: () -> Unit, ) { + val onToolbarColor = getOnToolbarColor() IconButton( modifier = Modifier, icon = { Icon( imageVector = relationshipTopBarIconState.icon, contentDescription = stringResource(R.string.relationships), - tint = Color.White, + tint = onToolbarColor, ) }, ) { diff --git a/app/src/main/java/org/dhis2/usescases/tracker/TrackedEntityInstanceInfoProvider.kt b/app/src/main/java/org/dhis2/usescases/tracker/TrackedEntityInstanceInfoProvider.kt index 875792b7dfa..35813fe568f 100644 --- a/app/src/main/java/org/dhis2/usescases/tracker/TrackedEntityInstanceInfoProvider.kt +++ b/app/src/main/java/org/dhis2/usescases/tracker/TrackedEntityInstanceInfoProvider.kt @@ -1,14 +1,19 @@ package org.dhis2.usescases.tracker import org.dhis2.commons.date.DateLabelProvider +import org.dhis2.commons.filters.sorting.SortingItem import org.dhis2.commons.resources.MetadataIconProvider +import org.dhis2.data.sorting.SearchSortingValueSetter import org.dhis2.maps.model.MapItemModel import org.dhis2.maps.model.RelatedInfo import org.dhis2.maps.model.RelationshipDirection import org.dhis2.mobile.commons.model.AvatarProviderConfiguration import org.dhis2.mobile.commons.model.AvatarProviderConfiguration.Metadata import org.dhis2.mobile.commons.model.AvatarProviderConfiguration.ProfilePic +import org.dhis2.mobile.commons.model.MetadataIconData import org.dhis2.tracker.data.ProfilePictureProvider +import org.dhis2.tracker.search.model.TrackedEntitySearchItemAttributeDomain +import org.dhis2.usescases.searchTrackEntity.SearchTeiModel import org.dhis2.utils.ValueUtils import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.arch.repositories.scope.RepositoryScope @@ -27,6 +32,7 @@ class TrackedEntityInstanceInfoProvider( private val profilePictureProvider: ProfilePictureProvider, private val dateLabelProvider: DateLabelProvider, private val metadataIconProvider: MetadataIconProvider, + private val sortingValueSetter: SearchSortingValueSetter, ) { fun getAvatar( tei: TrackedEntityInstance, @@ -75,6 +81,10 @@ class TrackedEntityInstanceInfoProvider( } } + fun getMetadataIcon(style: ObjectStyle) : MetadataIconData { + return metadataIconProvider.invoke(style) + } + fun getTeiTitle( header: String?, attributeValues: List<AdditionalInfoItem>, @@ -90,7 +100,7 @@ class TrackedEntityInstanceInfoProvider( fun getTeiLastUpdated(tei: TrackedEntitySearchItem) = dateLabelProvider.span(tei.lastUpdated) - fun getTeiAdditionalInfoList(attributeValues: List<TrackedEntitySearchItemAttribute>): List<AdditionalInfoItem> = + fun getTeiAdditionalInfoListForMap(attributeValues: List<TrackedEntitySearchItemAttribute>): List<AdditionalInfoItem> = attributeValues .filter { attribute -> attribute.displayInList && @@ -105,7 +115,7 @@ class TrackedEntityInstanceInfoProvider( key = attribute.displayFormName, value = if (attribute.value != null) { - ValueUtils.transformValue( + ValueUtils.transformValueLegacy( d2, attribute.value, attribute.valueType, @@ -117,6 +127,19 @@ class TrackedEntityInstanceInfoProvider( ) } + fun getTransformedValue(attr: TrackedEntitySearchItemAttributeDomain) : String? { + return if (attr.value != null) { + ValueUtils.transformValue( + d2, + attr.value, + attr.valueType, + attr.optionSet, + ) + } else { + null + } + } + fun getRelatedInfo( searchItem: TrackedEntitySearchItem, selectedProgram: Program?, @@ -203,4 +226,14 @@ class TrackedEntityInstanceInfoProvider( ), ) } + + fun getUnknownLabel(): String { + return sortingValueSetter.unknownLabel + } + + fun getSortingKeyValue(searchTei: SearchTeiModel, sortingItem: SortingItem): Pair<String, String>? { + return sortingValueSetter.setSortingItem(searchTei, sortingItem) + } + + } diff --git a/app/src/main/java/org/dhis2/usescases/troubleshooting/TroubleshootingFragment.kt b/app/src/main/java/org/dhis2/usescases/troubleshooting/TroubleshootingFragment.kt index 741f56d073c..b07de6c16c2 100644 --- a/app/src/main/java/org/dhis2/usescases/troubleshooting/TroubleshootingFragment.kt +++ b/app/src/main/java/org/dhis2/usescases/troubleshooting/TroubleshootingFragment.kt @@ -1,7 +1,6 @@ package org.dhis2.usescases.troubleshooting import android.R -import android.content.Context import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -10,22 +9,19 @@ import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ViewCompositionStrategy -import androidx.fragment.app.viewModels import org.dhis2.usescases.general.FragmentGlobalAbstract import org.dhis2.usescases.main.MainActivity -import org.dhis2.usescases.main.MainNavigator +import org.dhis2.usescases.main.MainScreenType import org.dhis2.usescases.troubleshooting.ui.TroubleshootingScreen import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme -import javax.inject.Inject +import org.koin.androidx.viewmodel.ext.android.viewModel +import org.koin.core.parameter.parametersOf const val OPEN_LANGUAGE_SECTION = "OPEN_LANGUAGE_SECTION" class TroubleshootingFragment : FragmentGlobalAbstract() { - @Inject - lateinit var troubleshootingViewModelFactory: TroubleshootingViewModelFactory - - private val troubleshootingViewModel: TroubleshootingViewModel by viewModels { - troubleshootingViewModelFactory + private val troubleshootingViewModel: TroubleshootingViewModel by viewModel { + parametersOf(arguments?.getBoolean(OPEN_LANGUAGE_SECTION) ?: false) } companion object { @@ -38,18 +34,6 @@ class TroubleshootingFragment : FragmentGlobalAbstract() { } } - override fun onAttach(context: Context) { - super.onAttach(context) - if (context is MainActivity) { - context.mainComponent - .plus( - TroubleshootingModule( - arguments?.getBoolean(OPEN_LANGUAGE_SECTION) ?: false, - ), - ).inject(this) - } - } - @ExperimentalFoundationApi @ExperimentalAnimationApi override fun onCreateView( @@ -74,7 +58,7 @@ class TroubleshootingFragment : FragmentGlobalAbstract() { startActivity( MainActivity.intent( requireContext(), - MainNavigator.MainScreen.TROUBLESHOOTING, + MainScreenType.TroubleShooting, ), ) requireActivity().finish() diff --git a/app/src/main/java/org/dhis2/usescases/troubleshooting/TroubleshootingInjector.kt b/app/src/main/java/org/dhis2/usescases/troubleshooting/TroubleshootingInjector.kt deleted file mode 100644 index f6c37854208..00000000000 --- a/app/src/main/java/org/dhis2/usescases/troubleshooting/TroubleshootingInjector.kt +++ /dev/null @@ -1,44 +0,0 @@ -package org.dhis2.usescases.troubleshooting - -import android.content.Context -import dagger.Module -import dagger.Provides -import dagger.Subcomponent -import org.dhis2.commons.di.dagger.PerFragment -import org.dhis2.commons.resources.LocaleSelector -import org.dhis2.commons.resources.MetadataIconProvider -import org.hisp.dhis.android.core.D2 - -@PerFragment -@Subcomponent(modules = [TroubleshootingModule::class]) -interface TroubleshootingComponent { - fun inject(programFragment: TroubleshootingFragment) -} - -@Module -class TroubleshootingModule( - private val openLanguageSection: Boolean, -) { - @Provides - fun providesViewModelFactory( - localeSelector: LocaleSelector, - repository: TroubleshootingRepository, - ): TroubleshootingViewModelFactory = - TroubleshootingViewModelFactory( - localeSelector, - repository, - openLanguageSection, - ) - - @Provides - fun providesLocaleSelector( - context: Context, - d2: D2, - ) = LocaleSelector(context, d2) - - @Provides - fun provideRepository( - d2: D2, - metadataIconProvider: MetadataIconProvider, - ) = TroubleshootingRepository(d2, metadataIconProvider) -} diff --git a/app/src/main/java/org/dhis2/utils/ThemeColors.kt b/app/src/main/java/org/dhis2/utils/ThemeColors.kt new file mode 100644 index 00000000000..93b1f3e49c6 --- /dev/null +++ b/app/src/main/java/org/dhis2/utils/ThemeColors.kt @@ -0,0 +1,27 @@ +package org.dhis2.utils + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import org.dhis2.R +import org.dhis2.commons.resources.ColorUtils + +@Composable +fun getThemePrimaryColor(): Color { + val context = LocalContext.current + val primaryColor = remember(context) { ColorUtils().getThemePrimaryColor(context) } + return primaryColor +} + +@Composable +fun getOnToolbarColor(): Color { + val context = LocalContext.current + val onToolbarColor = remember(context) { + val ta = context.obtainStyledAttributes(intArrayOf(R.attr.onToolbarColor)) + val color = Color(ta.getColor(0, android.graphics.Color.WHITE)) + ta.recycle() + color + } + return onToolbarColor +} \ No newline at end of file diff --git a/app/src/main/java/org/dhis2/utils/ValueUtils.kt b/app/src/main/java/org/dhis2/utils/ValueUtils.kt index 26c9d9ed39a..8031fba6bc8 100644 --- a/app/src/main/java/org/dhis2/utils/ValueUtils.kt +++ b/app/src/main/java/org/dhis2/utils/ValueUtils.kt @@ -3,6 +3,7 @@ package org.dhis2.utils import org.dhis2.commons.extensions.toFriendlyDate import org.dhis2.commons.extensions.toFriendlyDateTime import org.dhis2.commons.extensions.toPercentage +import org.dhis2.tracker.input.model.TrackerInputType import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.android.core.trackedentity.TrackedEntityAttributeValue @@ -20,7 +21,7 @@ class ValueUtils private constructor() { optionSetUid: String?, ): TrackedEntityAttributeValue { val transformedValue = - transformValue(d2, attributeValue.value(), valueType, optionSetUid) + transformValueLegacy(d2, attributeValue.value(), valueType, optionSetUid) return if (transformedValue != attributeValue.value()) { attributeValue @@ -35,12 +36,12 @@ class ValueUtils private constructor() { fun transformValue( d2: D2, value: String?, - valueType: ValueType?, + valueType: TrackerInputType?, optionSetUid: String?, ): String? { var teAttrValue = value when (valueType) { - ValueType.ORGANISATION_UNIT -> { + TrackerInputType.ORGANISATION_UNIT -> { if (!d2 .organisationUnitModule() .organisationUnits() @@ -60,6 +61,45 @@ class ValueUtils private constructor() { teAttrValue = orgUnitName } } + TrackerInputType.DATE, TrackerInputType.AGE -> { + teAttrValue = teAttrValue?.toFriendlyDate() + } + TrackerInputType.DATE_TIME -> { + teAttrValue = teAttrValue?.toFriendlyDateTime() + } + + TrackerInputType.PERCENTAGE -> { + teAttrValue = teAttrValue?.toPercentage() + } + else -> { + teAttrValue = transformOptionSet(optionSetUid, d2, value) + } + } + return teAttrValue + } + + @Deprecated("Use transformValue with TrackerInputType instead of ValueType") + fun transformValueLegacy( + d2: D2, + value: String?, + valueType: ValueType?, + optionSetUid: String?, + ): String? { + var teAttrValue = value + when (valueType) { + ValueType.ORGANISATION_UNIT -> { + val orgUnit = + d2 + .organisationUnitModule() + .organisationUnits() + .byUid() + .eq(value) + .one() + .blockingGet() + if (orgUnit != null && orgUnit.displayName() != null) { + teAttrValue = orgUnit.displayName() + } + } ValueType.DATE, ValueType.AGE -> { teAttrValue = teAttrValue?.toFriendlyDate() } diff --git a/app/src/main/java/org/dhis2/utils/WebViewActivity.kt b/app/src/main/java/org/dhis2/utils/WebViewActivity.kt deleted file mode 100644 index 386312314cf..00000000000 --- a/app/src/main/java/org/dhis2/utils/WebViewActivity.kt +++ /dev/null @@ -1,57 +0,0 @@ -package org.dhis2.utils - -import android.annotation.SuppressLint -import android.app.Activity -import android.os.Bundle -import android.view.View -import android.webkit.WebResourceRequest -import android.webkit.WebView -import android.webkit.WebViewClient -import androidx.databinding.DataBindingUtil -import org.dhis2.R -import org.dhis2.databinding.ActivityWebviewBinding - -class WebViewActivity : Activity() { - companion object { - const val WEB_VIEW_URL = "url" - } - - @SuppressLint("SetJavaScriptEnabled") - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - val binding: ActivityWebviewBinding = - DataBindingUtil.setContentView(this, R.layout.activity_webview) - - val url = intent?.extras?.getString(WEB_VIEW_URL) - - url?.let { - // Avoid the WebView to automatically redirect to a browser - binding.webView.webViewClient = - object : WebViewClient() { - override fun shouldOverrideUrlLoading( - view: WebView?, - request: WebResourceRequest, - ): Boolean = super.shouldOverrideUrlLoading(view, request) - - // Compatibility with APIs below 24 - @Deprecated("Deprecated in Java") - override fun shouldOverrideUrlLoading( - view: WebView?, - url: String?, - ): Boolean = super.shouldOverrideUrlLoading(view, url) - } - - binding.webView.settings.javaScriptEnabled = true - binding.webView.loadUrl(it) - } - } - - fun backToLogin(view: View) { - finish() - } - - @Deprecated("Deprecated in Java") - override fun onBackPressed() { - finish() - } -} diff --git a/app/src/main/java/org/dhis2/utils/analytics/AnalyticsHelper.kt b/app/src/main/java/org/dhis2/utils/analytics/AnalyticsHelper.kt index 3812af80ab1..3300d7e70d1 100644 --- a/app/src/main/java/org/dhis2/utils/analytics/AnalyticsHelper.kt +++ b/app/src/main/java/org/dhis2/utils/analytics/AnalyticsHelper.kt @@ -2,6 +2,7 @@ package org.dhis2.utils.analytics import org.dhis2.commons.matomo.MatomoAnalyticsController import org.dhis2.mobile.commons.reporting.AnalyticActions +import org.dhis2.utils.analytics.matomo.DEFAULT_EXTERNAL_TRACKER_NAME import javax.inject.Inject class AnalyticsHelper @@ -28,12 +29,11 @@ class AnalyticsHelper override fun updateMatomoSecondaryTracker( matomoUrl: String, matomoID: Int, - trackerName: String, ) { matomoAnalyticsController.updateDhisImplementationTracker( matomoUrl, matomoID, - trackerName, + DEFAULT_EXTERNAL_TRACKER_NAME, ) } diff --git a/app/src/main/java/org/dhis2/utils/analytics/matomo/MatomoAnalyticsModule.kt b/app/src/main/java/org/dhis2/utils/analytics/matomo/MatomoAnalyticsModule.kt index bdf72ac4bf2..5e39d3ad262 100644 --- a/app/src/main/java/org/dhis2/utils/analytics/matomo/MatomoAnalyticsModule.kt +++ b/app/src/main/java/org/dhis2/utils/analytics/matomo/MatomoAnalyticsModule.kt @@ -6,6 +6,7 @@ import dagger.Provides import org.dhis2.commons.matomo.MatomoAnalyticsController import org.dhis2.mobile.commons.reporting.AnalyticActions import org.dhis2.utils.analytics.AnalyticsHelper +import org.koin.dsl.bind import org.koin.dsl.module import org.matomo.sdk.Matomo import org.matomo.sdk.extra.DownloadTracker @@ -34,5 +35,5 @@ val matomoModule = single { DownloadTracker.Extra.ApkChecksum(get()) } single { Matomo.getInstance(get()) } single<MatomoAnalyticsController> { MatomoAnalyticsControllerImpl(get(), get()) } - single<AnalyticActions> { AnalyticsHelper(get()) } + single { AnalyticsHelper(get()) } bind AnalyticActions::class } diff --git a/app/src/main/java/org/dhis2/utils/customviews/MoreMenuView.kt b/app/src/main/java/org/dhis2/utils/customviews/MoreMenuView.kt index f71d73954e1..9c90aaabe24 100644 --- a/app/src/main/java/org/dhis2/utils/customviews/MoreMenuView.kt +++ b/app/src/main/java/org/dhis2/utils/customviews/MoreMenuView.kt @@ -9,11 +9,11 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.DpOffset +import org.dhis2.utils.getOnToolbarColor import org.hisp.dhis.mobile.ui.designsystem.component.IconButton import org.hisp.dhis.mobile.ui.designsystem.component.menu.DropDownMenu import org.hisp.dhis.mobile.ui.designsystem.component.menu.MenuItemData import org.hisp.dhis.mobile.ui.designsystem.theme.Spacing -import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor @Composable fun <T> MoreOptionsWithDropDownMenuButton( @@ -22,12 +22,13 @@ fun <T> MoreOptionsWithDropDownMenuButton( onMenuToggle: (Boolean) -> Unit, onItemClick: (T) -> Unit, ) { + val onToolbarColor = getOnToolbarColor() IconButton( modifier = Modifier, icon = { Icon( imageVector = Icons.Outlined.MoreVert, - tint = SurfaceColor.SurfaceBright, + tint = onToolbarColor, contentDescription = null, ) }, diff --git a/app/src/main/java/org/dhis2/utils/granularsync/GranularSyncPresenter.kt b/app/src/main/java/org/dhis2/utils/granularsync/GranularSyncPresenter.kt index 0448e4f7353..b93a311b621 100644 --- a/app/src/main/java/org/dhis2/utils/granularsync/GranularSyncPresenter.kt +++ b/app/src/main/java/org/dhis2/utils/granularsync/GranularSyncPresenter.kt @@ -34,7 +34,6 @@ import androidx.work.Data import androidx.work.ExistingWorkPolicy import androidx.work.WorkInfo import io.reactivex.disposables.CompositeDisposable -import kotlinx.coroutines.async import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.update @@ -59,9 +58,17 @@ import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.service.workManager.WorkManagerController import org.dhis2.data.service.workManager.WorkerItem import org.dhis2.data.service.workManager.WorkerType +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.usescases.sms.SmsSendingService +import org.dhis2.utils.granularsync.data.GranularSyncRepository +import org.dhis2.utils.granularsync.domain.MissingSyncTargetException +import org.dhis2.utils.granularsync.domain.SyncStatus +import org.dhis2.utils.granularsync.ui.SyncUiState +import org.dhis2.utils.granularsync.ui.SyncUiStateMapper import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.common.State +import org.koin.core.component.KoinComponent +import org.koin.core.component.inject import timber.log.Timber class GranularSyncPresenter( @@ -73,7 +80,9 @@ class GranularSyncPresenter( private val syncContext: SyncContext, private val workManagerController: WorkManagerController, private val smsSyncProvider: SMSSyncProvider, -) : ViewModel() { + private val mapper: SyncUiStateMapper, +) : ViewModel(), + KoinComponent { private val workerName: String private var disposable: CompositeDisposable = CompositeDisposable() private lateinit var states: MutableLiveData<List<SmsSendingService.SendingStatus>> @@ -82,23 +91,29 @@ class GranularSyncPresenter( private val _currentState = MutableStateFlow<SyncUiState?>(null) val currentState: StateFlow<SyncUiState?> = _currentState + private val syncBackgroundJobAction: SyncBackgroundJobAction by inject() + init { workerName = workerName() } - private val _serverAvailability = MutableLiveData<Boolean>() - val serverAvailability: LiveData<Boolean> = _serverAvailability + private val _serverAvailability = MutableLiveData<Boolean?>() + val serverAvailability: LiveData<Boolean?> = _serverAvailability private fun loadSyncInfo(forcedState: State? = null) { viewModelScope.launch(dispatcher.io()) { - val syncState = - async { - repository.getUiState(forcedState) - }.await() - val dismissOnUpdate = refreshing && syncState.syncState == State.SYNCED - refreshing = false - _currentState.update { - syncState.copy(shouldDismissOnUpdate = dismissOnUpdate) + try { + val syncStatusData = repository.getSyncStatus(forcedState) + val dismissOnUpdate = refreshing && syncStatusData.syncState == SyncStatus.SYNCED + refreshing = false + _currentState.update { + mapper.toUiState(syncStatusData, dismissOnUpdate) + } + } catch (e: MissingSyncTargetException) { + refreshing = false + _currentState.update { + mapper.missingTargetUiState(e.recordUid) + } } } } @@ -172,7 +187,7 @@ class GranularSyncPresenter( workManagerController.beginUniqueWork(workerItem) } else { - workManagerController.syncDataForWorker(Constants.DATA_NOW, Constants.INITIAL_SYNC) + syncBackgroundJobAction.launchDataSync(0) } } return observeWorkInfo() @@ -392,7 +407,7 @@ class GranularSyncPresenter( restartSmsSender() } - private suspend fun getDataSetCatOptCombos(): List<String> { + private fun getDataSetCatOptCombos(): List<String> { val dataSet = d2 .dataSetModule() @@ -450,11 +465,12 @@ class GranularSyncPresenter( } fun checkServerAvailability() { + _serverAvailability.value = null viewModelScope.launch { try { repository.checkServerAvailability() _serverAvailability.value = true - } catch (error: RuntimeException) { + } catch (_: RuntimeException) { _serverAvailability.value = false } } diff --git a/app/src/main/java/org/dhis2/utils/granularsync/GranularSyncViewModelFactory.kt b/app/src/main/java/org/dhis2/utils/granularsync/GranularSyncViewModelFactory.kt index 643bffcb0ac..981a8803f0d 100644 --- a/app/src/main/java/org/dhis2/utils/granularsync/GranularSyncViewModelFactory.kt +++ b/app/src/main/java/org/dhis2/utils/granularsync/GranularSyncViewModelFactory.kt @@ -6,6 +6,8 @@ import org.dhis2.commons.schedulers.SchedulerProvider import org.dhis2.commons.sync.SyncContext import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.service.workManager.WorkManagerController +import org.dhis2.utils.granularsync.data.GranularSyncRepository +import org.dhis2.utils.granularsync.ui.SyncUiStateMapper import org.hisp.dhis.android.core.D2 class GranularSyncViewModelFactory( @@ -17,6 +19,7 @@ class GranularSyncViewModelFactory( private val syncContext: SyncContext, private val workManagerController: WorkManagerController, private val smsSyncProvider: SMSSyncProvider, + private val mapper: SyncUiStateMapper, ) : ViewModelProvider.Factory { override fun <T : ViewModel> create(modelClass: Class<T>): T = GranularSyncPresenter( @@ -28,5 +31,6 @@ class GranularSyncViewModelFactory( syncContext, workManagerController, smsSyncProvider, + mapper, ) as T } diff --git a/app/src/main/java/org/dhis2/utils/granularsync/SyncStatusDialog.kt b/app/src/main/java/org/dhis2/utils/granularsync/SyncStatusDialog.kt index b37d679c104..0f56430f4f2 100644 --- a/app/src/main/java/org/dhis2/utils/granularsync/SyncStatusDialog.kt +++ b/app/src/main/java/org/dhis2/utils/granularsync/SyncStatusDialog.kt @@ -21,7 +21,6 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentManager import androidx.fragment.app.viewModels -import androidx.work.WorkInfo import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialogFragment @@ -32,16 +31,14 @@ import org.dhis2.commons.date.toDateSpan import org.dhis2.commons.dialogs.bottomsheet.BottomSheetDialogUi import org.dhis2.commons.dialogs.bottomsheet.BottomSheetDialogUiModel import org.dhis2.commons.dialogs.bottomsheet.DialogButtonStyle -import org.dhis2.commons.network.NetworkUtils import org.dhis2.commons.sync.OnDismissListener import org.dhis2.commons.sync.OnNoConnectionListener import org.dhis2.commons.sync.OnSyncNavigationListener import org.dhis2.commons.sync.SyncContext import org.dhis2.commons.ui.icons.SyncStateIcon import org.dhis2.usescases.sms.SmsSendingService -import org.dhis2.utils.analytics.AnalyticsHelper import org.dhis2.utils.customviews.MessageAmountDialog -import org.hisp.dhis.android.core.common.State +import org.dhis2.utils.granularsync.domain.SyncStatus import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme import javax.inject.Inject @@ -51,18 +48,11 @@ private const val SYNC_CONTEXT = "SYNC_CONTEXT" class SyncStatusDialog : BottomSheetDialogFragment(), GranularSyncContracts.View { - @Inject - lateinit var analyticsHelper: AnalyticsHelper - - @Inject - lateinit var networkUtils: NetworkUtils var dismissListenerDialog: OnDismissListener? = null var syncStatusDialogNavigator: SyncStatusDialogNavigator? = null - var syncProcessListener: (WorkInfo) -> Unit = {} - private var syncing: Boolean = false private var smsSenderHelper: SMSSenderHelper? = null @@ -90,7 +80,7 @@ class SyncStatusDialog : override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setStyle(STYLE_NORMAL, org.dhis2.ui.R.style.CustomBottomSheetDialogTheme) + setStyle(STYLE_NORMAL, org.dhis2.commons.R.style.CustomBottomSheetDialogTheme) } override fun onCreateView( @@ -101,7 +91,6 @@ class SyncStatusDialog : viewModel.observeWorkInfo().observe(this) { workInfoList -> workInfoList.firstOrNull()?.let { viewModel.manageWorkInfo(it) - syncProcessListener(it) } } @@ -113,7 +102,7 @@ class SyncStatusDialog : syncState?.let { syncUiState -> when { syncUiState.shouldDismissOnUpdate -> dismiss() - syncing && syncUiState.syncState == State.SYNCED -> { + syncing && syncUiState.syncState == SyncStatus.SYNCED -> { dismiss() Toast .makeText( @@ -149,7 +138,7 @@ class SyncStatusDialog : dismiss() }, icon = { - SyncStateIcon(state = syncUiState.syncState) + SyncUiStatusIcon(status = syncUiState.syncState) }, extraContent = if (syncUiState.content.isNotEmpty()) { @@ -188,7 +177,9 @@ class SyncStatusDialog : } private fun onSyncClick() { + viewModel.serverAvailability.removeObservers(viewLifecycleOwner) viewModel.serverAvailability.observe(viewLifecycleOwner) { isAvailable -> + if (isAvailable == null) return@observe val canSendSMS = viewModel.canSendSMS() val isSMSEnabled = viewModel.isSMSEnabled() @@ -330,7 +321,7 @@ class SyncStatusDialog : SmsSendingService.State.WAITING_RESULT, SmsSendingService.State.RESULT_CONFIRMED, SmsSendingService.State.SENT, - -> + -> syncing = true SmsSendingService.State.ITEM_NOT_READY, @@ -338,7 +329,7 @@ class SyncStatusDialog : SmsSendingService.State.WAITING_RESULT_TIMEOUT, SmsSendingService.State.ERROR, SmsSendingService.State.COMPLETED, - -> + -> viewModel.restartSmsSender() } } @@ -384,7 +375,6 @@ class SyncStatusDialog : private lateinit var syncContext: SyncContext private var dismissListener: OnDismissListener? = null private var noConnectionListener: OnNoConnectionListener? = null - private var syncProcessStatusListener: (WorkInfo) -> Unit = {} fun withContext( context: FragmentActivity, @@ -414,11 +404,6 @@ class SyncStatusDialog : return this } - fun withSyncProcessStatusListener(syncProcessStatusListener: (WorkInfo) -> Unit): Builder { - this.syncProcessStatusListener = syncProcessStatusListener - return this - } - fun withSyncContext(syncContext: SyncContext): Builder { this.syncContext = syncContext return this @@ -443,7 +428,6 @@ class SyncStatusDialog : dismissListenerDialog = dismissListener onNoConnectionListener = noConnectionListener syncStatusDialogNavigator = navigator - syncProcessListener = syncProcessStatusListener } fun show(tag: String) { diff --git a/app/src/main/java/org/dhis2/utils/granularsync/SyncStatusItem.kt b/app/src/main/java/org/dhis2/utils/granularsync/SyncStatusItem.kt index 7d87562e767..03ef9ae08ed 100644 --- a/app/src/main/java/org/dhis2/utils/granularsync/SyncStatusItem.kt +++ b/app/src/main/java/org/dhis2/utils/granularsync/SyncStatusItem.kt @@ -18,7 +18,11 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.vectorResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import org.dhis2.ui.R +import androidx.core.graphics.toColorInt +import org.dhis2.commons.R +import org.dhis2.commons.ui.icons.SyncingIcon +import org.dhis2.utils.granularsync.domain.SyncStatus +import org.hisp.dhis.mobile.ui.designsystem.theme.TextColor @Composable fun SyncStatusItem( @@ -59,6 +63,61 @@ fun SyncStatusItem( } } +@Composable +fun SyncUiStatusIcon(status: SyncStatus) { + if (status == SyncStatus.UPLOADING) { + SyncingIcon() + } else { + val (imageVector, tint) = status.toIconData() + Icon( + imageVector = imageVector, + tint = tint, + contentDescription = "sync", + ) + } +} + +@Composable +private fun SyncStatus.toIconData(): Pair<ImageVector, Color> { + val imageVector = + when (this) { + SyncStatus.NOT_SYNCED, + SyncStatus.UPLOADING, + -> ImageVector.vectorResource(id = R.drawable.ic_sync_problem_grey) + + SyncStatus.ERROR -> + ImageVector.vectorResource(id = R.drawable.ic_sync_problem_red) + + SyncStatus.WARNING -> + ImageVector.vectorResource(id = R.drawable.ic_sync_warning) + + SyncStatus.SENT_VIA_SMS, + SyncStatus.SYNCED_VIA_SMS, + -> ImageVector.vectorResource(id = R.drawable.ic_sync_sms) + + SyncStatus.SYNCED, + SyncStatus.RELATIONSHIP, + -> ImageVector.vectorResource(id = R.drawable.ic_status_synced) + } + val tint = + when (this) { + SyncStatus.NOT_SYNCED, + SyncStatus.UPLOADING, + -> Color("#333333".toColorInt()) + + SyncStatus.ERROR -> Color("#E91E63".toColorInt()) + SyncStatus.WARNING -> Color("#FF9800".toColorInt()) + SyncStatus.SENT_VIA_SMS, + SyncStatus.SYNCED_VIA_SMS, + -> Color("#03A9F4".toColorInt()) + + SyncStatus.SYNCED, + SyncStatus.RELATIONSHIP, + -> TextColor.OnSurfaceLight + } + return Pair(imageVector, tint) +} + @Preview(showBackground = true) @Composable fun SyncStatusItemPreview() { diff --git a/app/src/main/java/org/dhis2/utils/granularsync/GranularSyncRepository.kt b/app/src/main/java/org/dhis2/utils/granularsync/data/GranularSyncRepository.kt similarity index 79% rename from app/src/main/java/org/dhis2/utils/granularsync/GranularSyncRepository.kt rename to app/src/main/java/org/dhis2/utils/granularsync/data/GranularSyncRepository.kt index 31eecdd3c15..cc2bcc13c38 100644 --- a/app/src/main/java/org/dhis2/utils/granularsync/GranularSyncRepository.kt +++ b/app/src/main/java/org/dhis2/utils/granularsync/data/GranularSyncRepository.kt @@ -1,12 +1,14 @@ -package org.dhis2.utils.granularsync +package org.dhis2.utils.granularsync.data -import io.reactivex.Single +import kotlinx.coroutines.async +import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.withContext import org.dhis2.R import org.dhis2.commons.bindings.categoryOptionCombo import org.dhis2.commons.bindings.countEventImportConflicts import org.dhis2.commons.bindings.countTeiImportConflicts import org.dhis2.commons.bindings.dataElement +import org.dhis2.commons.bindings.dataSet import org.dhis2.commons.bindings.dataSetInstanceSummaries import org.dhis2.commons.bindings.dataSetInstancesBy import org.dhis2.commons.bindings.dataSetSummaryBy @@ -19,13 +21,10 @@ import org.dhis2.commons.bindings.event import org.dhis2.commons.bindings.eventImportConflictsBy import org.dhis2.commons.bindings.eventsBy import org.dhis2.commons.bindings.isStockProgram -import org.dhis2.commons.bindings.observeDataSetInstancesBy -import org.dhis2.commons.bindings.observeEvent -import org.dhis2.commons.bindings.observeProgram -import org.dhis2.commons.bindings.observeTei import org.dhis2.commons.bindings.organisationUnit import org.dhis2.commons.bindings.period import org.dhis2.commons.bindings.program +import org.dhis2.commons.bindings.programStage import org.dhis2.commons.bindings.programs import org.dhis2.commons.bindings.stockUseCase import org.dhis2.commons.bindings.tei @@ -44,6 +43,10 @@ import org.dhis2.commons.sync.SyncStatusItem import org.dhis2.commons.sync.SyncStatusType import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.dhislogic.DhisProgramUtils +import org.dhis2.utils.granularsync.domain.MissingSyncTargetException +import org.dhis2.utils.granularsync.SyncDate +import org.dhis2.utils.granularsync.domain.SyncStatus +import org.dhis2.utils.granularsync.domain.SyncStatusData import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.dataset.DataSetInstance @@ -61,246 +64,125 @@ class GranularSyncRepository( private val resourceManager: ResourceManager, private val dispatcher: DispatcherProvider, ) { - fun getUiState(forcedState: State? = null): SyncUiState = - Single - .zip( - getState(), - getLastSynced(), - ) { state, lastSync -> - buildUiState( - forcedState.takeIf { it != null } ?: state, - lastSync, - ) - }.blockingGet() + suspend fun getSyncStatus(forcedState: State? = null): SyncStatusData = + coroutineScope { + val lastSync = async { getLastSynced() } + val state = forcedState ?: getState() + SyncStatusData( + syncState = state.toSyncStatus(), + lastSyncDate = lastSync.await().takeIf { state != State.UPLOADING }?.date, + content = getContent(state), + targetName = getTitle(), + ) + } - private fun getState(): Single<State> = + private fun getState(): State = when (syncContext.conflictType()) { ConflictType.PROGRAM -> d2 - .observeProgram(syncContext.recordUid()) - .map { dhisProgramUtils.getProgramState(it) } + .program(syncContext.recordUid()) + ?.let { dhisProgramUtils.getProgramState(it) } + ?: throw missingSyncTargetException() ConflictType.TEI -> { val enrollment = d2.enrollment(syncContext.recordUid()) d2 - .observeTei(enrollment?.trackedEntityInstance() ?: syncContext.recordUid()) - .map { it.aggregatedSyncState() } + .tei(enrollment?.trackedEntityInstance() ?: syncContext.recordUid()) + ?.aggregatedSyncState() + ?: throw missingSyncTargetException() } ConflictType.EVENT -> - d2.observeEvent(syncContext.recordUid()).map { it.aggregatedSyncState() } + d2.event(syncContext.recordUid())?.aggregatedSyncState() ?: throw missingSyncTargetException() - ConflictType.DATA_SET -> - d2 - .observeDataSetInstancesBy(syncContext.recordUid()) - .map { dataSetInstances -> - getStateFromCandidates(dataSetInstances.map { it.state() }.toMutableList()) - } + ConflictType.DATA_SET -> { + d2.dataSet(syncContext.recordUid()) ?: throw missingSyncTargetException() + getStateFromCandidates( + d2 + .dataSetInstancesBy(syncContext.recordUid()) + .map { it.state() } + .toMutableList(), + ) + } ConflictType.DATA_VALUES -> with(syncContext as SyncContext.DataSetInstance) { - d2 - .observeDataSetInstancesBy( - dataSetUid = dataSetUid, - orgUnitUid = orgUnitUid, - periodId = periodId, - attrOptionComboUid = attributeOptionComboUid, - ).map { dataSetInstance -> - getStateFromCandidates(dataSetInstance.map { it.state() }.toMutableList()) - } + val dataSetInstances = + d2 + .dataSetModule() + .dataSetInstances() + .byDataSetUid() + .eq(dataSetUid) + .byOrganisationUnitUid() + .eq(orgUnitUid) + .byPeriod() + .eq(periodId) + .byAttributeOptionComboUid() + .eq(attributeOptionComboUid) + .blockingGet() + + if (dataSetInstances.isEmpty()) { + throw missingSyncTargetException() + } + + getStateFromCandidates( + dataSetInstances + .map { it.state() } + .toMutableList(), + ) } - ConflictType.ALL -> Single.just(dhisProgramUtils.getServerState()) + ConflictType.ALL -> dhisProgramUtils.getServerState() } - private fun getLastSynced(returnEmpty: Boolean = true): Single<SyncDate> = + private fun getLastSynced(returnEmpty: Boolean = true): SyncDate = if (returnEmpty) { - Single.just(SyncDate(null)) + SyncDate(null) } else { when (syncContext.conflictType()) { ConflictType.PROGRAM -> - d2.observeProgram(syncContext.recordUid()).map { SyncDate(it.lastUpdated()) } + SyncDate(d2.program(syncContext.recordUid())?.lastUpdated()) ConflictType.TEI -> { val enrollment = d2.enrollment(syncContext.recordUid()) - d2 - .observeTei(enrollment?.trackedEntityInstance() ?: syncContext.recordUid()) - .map { SyncDate(it.lastUpdated()) } + SyncDate( + d2 + .tei(enrollment?.trackedEntityInstance() ?: syncContext.recordUid()) + ?.lastUpdated(), + ) } ConflictType.EVENT -> - d2.observeEvent(syncContext.recordUid()).map { SyncDate(it.lastUpdated()) } + SyncDate(d2.event(syncContext.recordUid())?.lastUpdated()) ConflictType.DATA_SET -> - d2 - .dataSetModule() - .dataSets() - .uid(syncContext.recordUid()) - .get() - .map { dataSet -> SyncDate(dataSet.lastUpdated()) } + SyncDate(d2.dataSet(syncContext.recordUid())?.lastUpdated()) ConflictType.DATA_VALUES -> with(syncContext as SyncContext.DataSetInstance) { - d2 - .observeDataSetInstancesBy( - dataSetUid = dataSetUid, - orgUnitUid = orgUnitUid, - periodId = periodId, - attrOptionComboUid = attributeOptionComboUid, - ).map { dataSetInstance -> - dataSetInstance.sortedBy { it.lastUpdated() } - SyncDate( - dataSetInstance - .apply { - sortedBy { it.lastUpdated() } - }.first() - .lastUpdated(), - ) - } + SyncDate( + d2 + .dataSetModule() + .dataSetInstances() + .byDataSetUid() + .eq(dataSetUid) + .byOrganisationUnitUid() + .eq(orgUnitUid) + .byPeriod() + .eq(periodId) + .byAttributeOptionComboUid() + .eq(attributeOptionComboUid) + .blockingGet() + .mapNotNull { it.lastUpdated() } + .minOrNull(), + ) } ConflictType.ALL -> - Single.just(SyncDate(preferenceProvider.lastSync())) + SyncDate(preferenceProvider.lastSync()) } } - private fun buildUiState( - state: State, - lastSync: SyncDate, - ): SyncUiState = - SyncUiState( - syncState = state, - title = getTitleForState(state), - lastSyncDate = lastSync.takeIf { state != State.UPLOADING }, - message = getMessageForState(state), - mainActionLabel = getMainActionLabel(state), - secondaryActionLabel = getSecondaryActionLabel(state), - content = getContent(state), - ) - - private fun getTitleForState(state: State): String = - when (state) { - State.TO_POST, - State.TO_UPDATE, - -> resourceManager.getString(R.string.sync_dialog_title_not_synced) - - State.ERROR -> resourceManager.getString(R.string.sync_dialog_title_error) - State.RELATIONSHIP, - State.SYNCED, - -> resourceManager.getString(R.string.sync_dialog_title_synced) - - State.WARNING -> resourceManager.getString(R.string.sync_dialog_title_warning) - State.UPLOADING -> resourceManager.getString(R.string.sync_dialog_title_syncing) - State.SENT_VIA_SMS, - State.SYNCED_VIA_SMS, - -> resourceManager.getString(R.string.sync_dialog_title_sms_syced) - } - - private fun getMessageForState(state: State): String? = - when (state) { - State.TO_POST, - State.TO_UPDATE, - -> getNotSyncedMessage() - - State.SYNCED -> getSyncedMessage() - State.SENT_VIA_SMS, - State.SYNCED_VIA_SMS, - -> getSmsSyncedMessage() - - State.ERROR, - State.WARNING, - State.RELATIONSHIP, - State.UPLOADING, - -> null - } - - private fun getNotSyncedMessage(): String = - when (syncContext.conflictType()) { - ConflictType.ALL -> - resourceManager.getString(R.string.sync_dialog_message_not_synced_all) - - ConflictType.DATA_SET, - ConflictType.DATA_VALUES, - ConflictType.PROGRAM, - -> - resourceManager.getString( - R.string.sync_dialog_message_not_synced_program, - getMessageArgument(), - ) - - ConflictType.TEI, ConflictType.EVENT -> - resourceManager.getString( - R.string.sync_dialog_message_not_synced_tei, - getMessageArgument(), - ) - } - - private fun getSyncedMessage(): String = - when (syncContext.conflictType()) { - ConflictType.ALL -> resourceManager.getString(R.string.sync_dialog_message_synced_all) - ConflictType.DATA_SET, - ConflictType.DATA_VALUES, - ConflictType.PROGRAM, - -> - resourceManager.getString( - R.string.sync_dialog_message_synced_program, - getMessageArgument(), - ) - - ConflictType.TEI, ConflictType.EVENT -> - resourceManager.getString( - R.string.sync_dialog_message_synced_tei, - getMessageArgument(), - ) - } - - private fun getSmsSyncedMessage(): String? = - when (syncContext.conflictType()) { - ConflictType.ALL, - ConflictType.DATA_SET, - ConflictType.PROGRAM, - -> null - - ConflictType.DATA_VALUES, - ConflictType.TEI, - ConflictType.EVENT, - -> resourceManager.getString(R.string.sync_dialog_message_sms_synced) - } - - private fun getMainActionLabel(state: State): String? = - when (state) { - State.TO_POST, - State.SENT_VIA_SMS, - State.SYNCED_VIA_SMS, - State.TO_UPDATE, - -> resourceManager.getString(R.string.sync_dialog_action_send) - - State.ERROR, - State.SYNCED, - State.WARNING, - -> resourceManager.getString(R.string.sync_dialog_action_refresh) - - State.UPLOADING, - State.RELATIONSHIP, - -> null - } - - private fun getSecondaryActionLabel(state: State): String? = - when (state) { - State.UPLOADING, - State.RELATIONSHIP, - -> null - - State.TO_POST, - State.TO_UPDATE, - State.ERROR, - State.SYNCED, - State.SENT_VIA_SMS, - State.SYNCED_VIA_SMS, - State.WARNING, - -> resourceManager.getString(R.string.sync_dialog_action_not_now) - } - private fun getContent(state: State): List<SyncStatusItem> = when (state) { State.TO_POST, @@ -1020,61 +902,55 @@ class GranularSyncRepository( } } - private fun getMessageArgument(): String = getTitle().blockingGet() + private fun State.toSyncStatus(): SyncStatus = + when (this) { + State.TO_POST, + State.TO_UPDATE, + -> SyncStatus.NOT_SYNCED + + State.ERROR -> SyncStatus.ERROR + State.WARNING -> SyncStatus.WARNING + State.SYNCED -> SyncStatus.SYNCED + State.RELATIONSHIP -> SyncStatus.RELATIONSHIP + State.UPLOADING -> SyncStatus.UPLOADING + State.SENT_VIA_SMS -> SyncStatus.SENT_VIA_SMS + State.SYNCED_VIA_SMS -> SyncStatus.SYNCED_VIA_SMS + } + + private fun missingSyncTargetException(): MissingSyncTargetException = + MissingSyncTargetException(syncContext.recordUid()) - private fun getTitle(): Single<String> = + private fun getTitle(): String = when (syncContext.conflictType()) { - ConflictType.ALL -> Single.just("") + ConflictType.ALL -> "" ConflictType.PROGRAM -> d2 - .programModule() - .programs() - .uid(syncContext.recordUid()) - .get() - .map { it.displayName() } + .program(syncContext.recordUid()) + ?.displayName() + ?: syncContext.recordUid() ConflictType.TEI -> { val enrollment = - d2 - .enrollmentModule() - .enrollments() - .uid(syncContext.recordUid()) - .blockingGet() + d2.enrollment(syncContext.recordUid()) d2 - .trackedEntityModule() - .trackedEntityTypes() - .uid( - d2 - .trackedEntityModule() - .trackedEntityInstances() - .uid(enrollment?.trackedEntityInstance() ?: syncContext.recordUid()) - .blockingGet() - ?.trackedEntityType(), - ).get() - .map { it.displayName() } + .tei(enrollment?.trackedEntityInstance() ?: syncContext.recordUid()) + ?.trackedEntityType() + ?.let { d2.trackedEntityType(it)?.displayName() } + ?: syncContext.recordUid() } ConflictType.EVENT -> d2 - .programModule() - .programStages() - .uid( - d2 - .eventModule() - .events() - .uid(syncContext.recordUid()) - .blockingGet() - ?.programStage(), - ).get() - .map { it.displayName() } + .event(syncContext.recordUid()) + ?.programStage() + ?.let { d2.programStage(it)?.displayName() } + ?: syncContext.recordUid() ConflictType.DATA_SET, ConflictType.DATA_VALUES -> d2 - .dataSetModule() - .dataSets() - .uid(syncContext.recordUid()) - .get() - .map { it.displayName() } + .dataSet(syncContext.recordUid()) + ?.displayName() + ?: syncContext.recordUid() } suspend fun checkServerAvailability() = diff --git a/app/src/main/java/org/dhis2/utils/granularsync/domain/MissingSyncTargetException.kt b/app/src/main/java/org/dhis2/utils/granularsync/domain/MissingSyncTargetException.kt new file mode 100644 index 00000000000..99966aaee3c --- /dev/null +++ b/app/src/main/java/org/dhis2/utils/granularsync/domain/MissingSyncTargetException.kt @@ -0,0 +1,5 @@ +package org.dhis2.utils.granularsync.domain + +class MissingSyncTargetException( + val recordUid: String, +) : IllegalStateException("Resource not found: $recordUid") \ No newline at end of file diff --git a/app/src/main/java/org/dhis2/utils/granularsync/domain/SyncStatus.kt b/app/src/main/java/org/dhis2/utils/granularsync/domain/SyncStatus.kt new file mode 100644 index 00000000000..81a2f4a0914 --- /dev/null +++ b/app/src/main/java/org/dhis2/utils/granularsync/domain/SyncStatus.kt @@ -0,0 +1,12 @@ +package org.dhis2.utils.granularsync.domain + +enum class SyncStatus { + NOT_SYNCED, + ERROR, + WARNING, + SYNCED, + RELATIONSHIP, + UPLOADING, + SENT_VIA_SMS, + SYNCED_VIA_SMS, +} \ No newline at end of file diff --git a/app/src/main/java/org/dhis2/utils/granularsync/domain/SyncStatusData.kt b/app/src/main/java/org/dhis2/utils/granularsync/domain/SyncStatusData.kt new file mode 100644 index 00000000000..4c7feaf84ca --- /dev/null +++ b/app/src/main/java/org/dhis2/utils/granularsync/domain/SyncStatusData.kt @@ -0,0 +1,11 @@ +package org.dhis2.utils.granularsync.domain + +import org.dhis2.commons.sync.SyncStatusItem +import java.util.Date + +data class SyncStatusData( + val syncState: SyncStatus, + val lastSyncDate: Date?, + val content: List<SyncStatusItem>, + val targetName: String, +) diff --git a/app/src/main/java/org/dhis2/utils/granularsync/SyncUiState.kt b/app/src/main/java/org/dhis2/utils/granularsync/ui/SyncUiState.kt similarity index 64% rename from app/src/main/java/org/dhis2/utils/granularsync/SyncUiState.kt rename to app/src/main/java/org/dhis2/utils/granularsync/ui/SyncUiState.kt index 92dbe1e8dd5..553d86bd675 100644 --- a/app/src/main/java/org/dhis2/utils/granularsync/SyncUiState.kt +++ b/app/src/main/java/org/dhis2/utils/granularsync/ui/SyncUiState.kt @@ -1,10 +1,11 @@ -package org.dhis2.utils.granularsync +package org.dhis2.utils.granularsync.ui import org.dhis2.commons.sync.SyncStatusItem -import org.hisp.dhis.android.core.common.State +import org.dhis2.utils.granularsync.SyncDate +import org.dhis2.utils.granularsync.domain.SyncStatus data class SyncUiState( - val syncState: State, + val syncState: SyncStatus, val title: String, val lastSyncDate: SyncDate?, val message: String?, @@ -12,4 +13,4 @@ data class SyncUiState( val secondaryActionLabel: String?, val content: List<SyncStatusItem>, val shouldDismissOnUpdate: Boolean = false, -) +) \ No newline at end of file diff --git a/app/src/main/java/org/dhis2/utils/granularsync/ui/SyncUiStateMapper.kt b/app/src/main/java/org/dhis2/utils/granularsync/ui/SyncUiStateMapper.kt new file mode 100644 index 00000000000..34a98ac2b9b --- /dev/null +++ b/app/src/main/java/org/dhis2/utils/granularsync/ui/SyncUiStateMapper.kt @@ -0,0 +1,160 @@ +package org.dhis2.utils.granularsync.ui + +import org.dhis2.R +import org.dhis2.commons.resources.ResourceManager +import org.dhis2.commons.sync.ConflictType +import org.dhis2.commons.sync.SyncContext +import org.dhis2.utils.granularsync.SyncDate +import org.dhis2.utils.granularsync.domain.SyncStatus +import org.dhis2.utils.granularsync.domain.SyncStatusData + +class SyncUiStateMapper( + private val syncContext: SyncContext, + private val resourceManager: ResourceManager, +) { + fun toUiState( + data: SyncStatusData, + shouldDismissOnUpdate: Boolean = false, + ): SyncUiState = + SyncUiState( + syncState = data.syncState, + title = getTitleForState(data.syncState), + lastSyncDate = data.lastSyncDate?.let { SyncDate(it) }, + message = getMessageForState(data.syncState, data.targetName), + mainActionLabel = getMainActionLabel(data.syncState), + secondaryActionLabel = getSecondaryActionLabel(data.syncState), + content = data.content, + shouldDismissOnUpdate = shouldDismissOnUpdate, + ) + + fun missingTargetUiState(recordUid: String): SyncUiState = + SyncUiState( + syncState = SyncStatus.ERROR, + title = getTitleForState(SyncStatus.ERROR), + lastSyncDate = null, + message = resourceManager.getString(R.string.resource_not_found, recordUid), + mainActionLabel = getMainActionLabel(SyncStatus.ERROR), + secondaryActionLabel = getSecondaryActionLabel(SyncStatus.ERROR), + content = emptyList(), + ) + + private fun getTitleForState(status: SyncStatus): String = + when (status) { + SyncStatus.NOT_SYNCED -> + resourceManager.getString(R.string.sync_dialog_title_not_synced) + + SyncStatus.ERROR -> resourceManager.getString(R.string.sync_dialog_title_error) + SyncStatus.RELATIONSHIP, + SyncStatus.SYNCED, + -> resourceManager.getString(R.string.sync_dialog_title_synced) + + SyncStatus.WARNING -> resourceManager.getString(R.string.sync_dialog_title_warning) + SyncStatus.UPLOADING -> resourceManager.getString(R.string.sync_dialog_title_syncing) + SyncStatus.SENT_VIA_SMS, + SyncStatus.SYNCED_VIA_SMS, + -> resourceManager.getString(R.string.sync_dialog_title_sms_syced) + } + + private fun getMessageForState( + status: SyncStatus, + targetName: String, + ): String? = + when (status) { + SyncStatus.NOT_SYNCED -> getNotSyncedMessage(targetName) + SyncStatus.SYNCED -> getSyncedMessage(targetName) + SyncStatus.SENT_VIA_SMS, + SyncStatus.SYNCED_VIA_SMS, + -> getSmsSyncedMessage() + + SyncStatus.ERROR, + SyncStatus.WARNING, + SyncStatus.RELATIONSHIP, + SyncStatus.UPLOADING, + -> null + } + + private fun getNotSyncedMessage(targetName: String): String = + when (syncContext.conflictType()) { + ConflictType.ALL -> + resourceManager.getString(R.string.sync_dialog_message_not_synced_all) + + ConflictType.DATA_SET, + ConflictType.DATA_VALUES, + ConflictType.PROGRAM, + -> + resourceManager.getString( + R.string.sync_dialog_message_not_synced_program, + targetName, + ) + + ConflictType.TEI, ConflictType.EVENT -> + resourceManager.getString( + R.string.sync_dialog_message_not_synced_tei, + targetName, + ) + } + + private fun getSyncedMessage(targetName: String): String = + when (syncContext.conflictType()) { + ConflictType.ALL -> resourceManager.getString(R.string.sync_dialog_message_synced_all) + ConflictType.DATA_SET, + ConflictType.DATA_VALUES, + ConflictType.PROGRAM, + -> + resourceManager.getString( + R.string.sync_dialog_message_synced_program, + targetName, + ) + + ConflictType.TEI, ConflictType.EVENT -> + resourceManager.getString( + R.string.sync_dialog_message_synced_tei, + targetName, + ) + } + + private fun getSmsSyncedMessage(): String? = + when (syncContext.conflictType()) { + ConflictType.ALL, + ConflictType.DATA_SET, + ConflictType.PROGRAM, + -> null + + ConflictType.DATA_VALUES, + ConflictType.TEI, + ConflictType.EVENT, + -> resourceManager.getString(R.string.sync_dialog_message_sms_synced) + } + + private fun getMainActionLabel(status: SyncStatus): String? = + when (status) { + SyncStatus.NOT_SYNCED, + SyncStatus.SENT_VIA_SMS, + SyncStatus.SYNCED_VIA_SMS, + -> resourceManager.getString(R.string.sync_dialog_action_send) + + SyncStatus.ERROR, + SyncStatus.SYNCED, + SyncStatus.WARNING, + -> resourceManager.getString(R.string.sync_dialog_action_refresh) + + SyncStatus.UPLOADING, + SyncStatus.RELATIONSHIP, + -> null + } + + private fun getSecondaryActionLabel(status: SyncStatus): String? = + when (status) { + SyncStatus.UPLOADING, + SyncStatus.RELATIONSHIP, + -> null + + SyncStatus.NOT_SYNCED, + SyncStatus.ERROR, + SyncStatus.SYNCED, + SyncStatus.SENT_VIA_SMS, + SyncStatus.SYNCED_VIA_SMS, + SyncStatus.WARNING, + -> resourceManager.getString(R.string.sync_dialog_action_not_now) + } +} \ No newline at end of file diff --git a/app/src/main/java/org/dhis2/utils/session/PinDialog.kt b/app/src/main/java/org/dhis2/utils/session/PinDialog.kt deleted file mode 100644 index caa274c6db8..00000000000 --- a/app/src/main/java/org/dhis2/utils/session/PinDialog.kt +++ /dev/null @@ -1,142 +0,0 @@ -package org.dhis2.utils.session - -import android.app.Dialog -import android.os.Bundle -import android.os.Handler -import android.os.Process -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.view.Window -import android.widget.Toast -import androidx.fragment.app.DialogFragment -import androidx.fragment.app.FragmentManager -import org.dhis2.R -import org.dhis2.bindings.app -import org.dhis2.databinding.DialogPinBinding -import javax.inject.Inject - -const val PIN_DIALOG_TAG: String = "PINDIALOG" - -class PinDialog( - val mode: Mode, - private val canBeClosed: Boolean, - private val unlockCallback: () -> Unit, - private val forgotPinCallback: () -> Unit, -) : DialogFragment(), - PinView { - private lateinit var binding: DialogPinBinding - - @Inject - lateinit var presenter: PinPresenter - - enum class Mode { - SET, - ASK, - } - - private var pinAttempts = 0 - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setStyle(STYLE_NO_TITLE, android.R.style.Theme_DeviceDefault_Light_NoActionBar) - app().createSessionComponent(PinModule(this)).inject(this) - } - - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val dialog = super.onCreateDialog(savedInstanceState) - dialog.window!!.apply { - requestFeature(Window.FEATURE_NO_TITLE) - setBackgroundDrawableResource(android.R.color.transparent) - setWindowAnimations(R.style.pin_dialog_animation) - isCancelable = false - } - return dialog - } - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle?, - ): View? { - binding = DialogPinBinding.inflate(layoutInflater, container, false) - binding.closeButton.apply { - visibility = if (canBeClosed) View.VISIBLE else View.GONE - setOnClickListener { closeDialog() } - } - - when (mode) { - Mode.ASK -> { - binding.title.text = getString(R.string.unblock_session) - binding.forgotCode.apply { - visibility = View.VISIBLE - setOnClickListener { recoverPin() } - } - } - Mode.SET -> { - binding.title.text = getString(R.string.set_pin) - binding.forgotCode.visibility = View.GONE - } - } - - binding.pinLockView.attachIndicatorDots(binding.indicatorDots) - binding.pinLockView.onPinSet { - when (mode) { - Mode.SET -> { - presenter.savePin(it) - blockSession() - } - Mode.ASK -> - presenter.unlockSession( - it, - attempts = pinAttempts, - onPinCorrect = unlockCallback, - onError = { - pinAttempts += 1 - Toast - .makeText( - context, - getString(R.string.wrong_pin), - Toast.LENGTH_LONG, - ).show() - binding.pinLockView.resetPinLockView() - }, - onTwoManyAttempts = { recoverPin() }, - ) - } - } - - return binding.root - } - - private fun blockSession() { - Handler().postDelayed( - { Process.killProcess(Process.myPid()) }, - 1500, - ) - } - - override fun closeDialog() { - dismissAllowingStateLoss() - } - - override fun dismiss() { - app().releaseSessionComponent() - dismissAllowingStateLoss() - } - - override fun recoverPin() { - presenter.logOut() - forgotPinCallback.invoke() - dismissAllowingStateLoss() - } - - override fun show( - manager: FragmentManager, - tag: String?, - ) { - if (manager.findFragmentByTag(tag) == null) { - manager.beginTransaction().add(this, tag).commitAllowingStateLoss() - } - } -} diff --git a/app/src/main/java/org/dhis2/utils/session/PinExtensions.kt b/app/src/main/java/org/dhis2/utils/session/PinExtensions.kt deleted file mode 100644 index 68c0f5319f3..00000000000 --- a/app/src/main/java/org/dhis2/utils/session/PinExtensions.kt +++ /dev/null @@ -1,23 +0,0 @@ -package org.dhis2.utils.session - -import com.andrognito.pinlockview.PinLockListener -import com.andrognito.pinlockview.PinLockView - -inline fun PinLockView.onPinSet(crossinline continuation: (String) -> Unit) { - setPinLockListener( - object : PinLockListener { - override fun onEmpty() { - } - - override fun onComplete(pin: String) { - continuation(pin) - } - - override fun onPinChange( - pinLength: Int, - intermediatePin: String?, - ) { - } - }, - ) -} diff --git a/app/src/main/java/org/dhis2/utils/session/PinModule.kt b/app/src/main/java/org/dhis2/utils/session/PinModule.kt deleted file mode 100644 index b09629983b3..00000000000 --- a/app/src/main/java/org/dhis2/utils/session/PinModule.kt +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2004 - 2019, University of Oslo - * All rights reserved. - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * Neither the name of the HISP project nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package org.dhis2.utils.session - -import dagger.Module -import dagger.Provides -import org.dhis2.commons.prefs.PreferenceProvider -import org.hisp.dhis.android.core.D2 - -@Module -class PinModule( - val view: PinView, -) { - @Provides - fun providesPresenter( - d2: D2, - preferenceProvider: PreferenceProvider, - ): PinPresenter = PinPresenter(view, preferenceProvider, d2) -} diff --git a/app/src/main/java/org/dhis2/utils/session/PinPresenter.kt b/app/src/main/java/org/dhis2/utils/session/PinPresenter.kt deleted file mode 100644 index ddbd8e97112..00000000000 --- a/app/src/main/java/org/dhis2/utils/session/PinPresenter.kt +++ /dev/null @@ -1,58 +0,0 @@ -package org.dhis2.utils.session - -import org.dhis2.commons.prefs.Preference -import org.dhis2.commons.prefs.PreferenceProvider -import org.hisp.dhis.android.core.D2 -import timber.log.Timber - -class PinPresenter( - val view: PinView, - val preferenceProvider: PreferenceProvider, - val d2: D2, -) { - fun unlockSession( - pin: String, - attempts: Int, - onPinCorrect: () -> Unit, - onError: () -> Unit, - onTwoManyAttempts: () -> Unit, - ) { - val pinStored = - d2 - .dataStoreModule() - .localDataStore() - .value(Preference.PIN) - .blockingGet() - ?.value() - when { - pinStored == pin -> { - onPinCorrect() - } - attempts < 2 -> onError() - else -> onTwoManyAttempts() - } - } - - fun savePin(pin: String) { - d2 - .dataStoreModule() - .localDataStore() - .value(Preference.PIN) - .blockingSet(pin) - preferenceProvider.setValue(Preference.SESSION_LOCKED, true) - } - - fun logOut() { - try { - d2 - .dataStoreModule() - .localDataStore() - .value(Preference.PIN) - .blockingDelete() - d2.userModule().blockingLogOut() - preferenceProvider.setValue(Preference.SESSION_LOCKED, false) - } catch (e: Exception) { - Timber.e(e) - } - } -} diff --git a/app/src/main/java/org/dhis2/utils/session/PinView.kt b/app/src/main/java/org/dhis2/utils/session/PinView.kt deleted file mode 100644 index 1f5df61eb7d..00000000000 --- a/app/src/main/java/org/dhis2/utils/session/PinView.kt +++ /dev/null @@ -1,7 +0,0 @@ -package org.dhis2.utils.session - -interface PinView { - fun closeDialog() - - fun recoverPin() -} diff --git a/app/src/main/java/org/dhis2/utils/session/SessionComponent.kt b/app/src/main/java/org/dhis2/utils/session/SessionComponent.kt deleted file mode 100644 index ea6b8372ca4..00000000000 --- a/app/src/main/java/org/dhis2/utils/session/SessionComponent.kt +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2004 - 2019, University of Oslo - * All rights reserved. - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * Neither the name of the HISP project nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package org.dhis2.utils.session - -import dagger.Subcomponent - -@Subcomponent(modules = [PinModule::class]) -interface SessionComponent { - fun inject(pinDialog: PinDialog) -} diff --git a/app/src/main/res/layout-land/activity_dashboard_mobile.xml b/app/src/main/res/layout-land/activity_dashboard_mobile.xml index dbb50705748..c19252df565 100644 --- a/app/src/main/res/layout-land/activity_dashboard_mobile.xml +++ b/app/src/main/res/layout-land/activity_dashboard_mobile.xml @@ -38,7 +38,8 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/ic_arrow_back" - tools:ignore="ContentDescription" /> + tools:ignore="ContentDescription" + app:tint="?onToolbarColor" /> <ImageView android:id="@+id/syncButton" @@ -48,7 +49,7 @@ app:layout_constraintEnd_toStartOf="@id/relationshipIcon" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/ic_sync" - app:tint="?colorOnPrimary" + app:tint="?onToolbarColor" tools:ignore="ContentDescription" /> <androidx.compose.ui.platform.ComposeView @@ -60,7 +61,7 @@ app:layout_constraintEnd_toStartOf="@id/moreOptions" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/ic_map" - app:tint="@color/white" + app:tint="?onToolbarColor" tools:ignore="ContentDescription" tools:visibility="visible" /> diff --git a/app/src/main/res/layout-land/activity_search.xml b/app/src/main/res/layout-land/activity_search.xml index c529486d080..1c1398cf4d6 100644 --- a/app/src/main/res/layout-land/activity_search.xml +++ b/app/src/main/res/layout-land/activity_search.xml @@ -62,6 +62,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/ic_arrow_back" + app:tint="?onToolbarColor" tools:ignore="ContentDescription" /> <TextView @@ -72,7 +73,7 @@ android:layout_toEndOf="@id/back_button" android:gravity="center_vertical" android:text="@string/search" - android:textColor="@color/white_faf" + android:textColor="?onToolbarColor" android:textSize="20sp" android:visibility="gone" app:layout_constraintStart_toEndOf="@id/back_button" @@ -85,7 +86,7 @@ android:layout_marginStart="24dp" android:layout_marginTop="24dp" android:padding="2dp" - android:visibility="gone" + android:visibility="@{totalFilters>0?View.VISIBLE:View.GONE}" app:layout_constraintStart_toStartOf="@id/filter" app:layout_constraintTop_toTopOf="@id/filter" tools:visibility="visible"> @@ -94,13 +95,13 @@ android:id="@+id/totalFilterCount" android:layout_width="match_parent" android:layout_height="match_parent" + android:backgroundTint="?onToolbarColor" android:background="@drawable/ic_oval_shape_white" android:gravity="center" android:includeFontPadding="false" android:text='@{""+totalFilters}' android:textColor="?colorPrimary" android:textSize="10sp" - android:visibility="@{totalFilters>0?View.VISIBLE:View.GONE}" tools:ignore="SmallSp" tools:text="1" /> </androidx.constraintlayout.widget.ConstraintLayout> @@ -110,6 +111,7 @@ style="@style/ActionIcon" android:onClick="@{()->presenter.showFilterGeneral()}" android:visibility="gone" + app:tint="?onToolbarColor" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" @@ -124,7 +126,7 @@ app:layout_constraintEnd_toStartOf="@id/filter" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/ic_sync" - app:tint="?colorOnPrimary" + app:tint="?onToolbarColor" tools:ignore="ContentDescription" /> <Spinner diff --git a/app/src/main/res/layout-land/layout_pin.xml b/app/src/main/res/layout-land/layout_pin.xml deleted file mode 100644 index 3a8dd114cc2..00000000000 --- a/app/src/main/res/layout-land/layout_pin.xml +++ /dev/null @@ -1,89 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<layout xmlns:tools="http://schemas.android.com/tools"> - - <data /> - - <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:background="@color/white" - android:clickable="true" - android:focusable="true" - android:visibility="gone" - tools:visibility="visible"> - - <RelativeLayout - android:id="@+id/header" - android:layout_width="match_parent" - android:layout_height="100dp" - android:background="?colorPrimary" - android:gravity="center" - app:layout_constraintTop_toTopOf="parent"> - - <ImageView - android:layout_width="match_parent" - android:layout_height="60dp" - android:layout_centerInParent="true" - app:srcCompat="@drawable/ic_dhis_white" /> - </RelativeLayout> - - - <TextView - android:id="@+id/title" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_centerHorizontal="true" - android:layout_margin="10dp" - android:text="@string/set_pin" - android:textColor="@android:color/black" - android:textSize="20sp" - android:textStyle="bold" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/header" /> - - <com.andrognito.pinlockview.IndicatorDots - android:id="@+id/indicator_dots" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="10dp" - android:gravity="center" - app:dotDiameter="12dp" - app:dotFilledBackground="@drawable/primary_dot_indicator" - app:dotSpacing="27dp" - app:layout_constraintTop_toBottomOf="@id/title" /> - - <TextView - android:id="@+id/forgotCode" - android:layout_width="match_parent" - android:layout_height="0dp" - android:layout_centerHorizontal="true" - android:layout_margin="8dp" - android:gravity="center" - android:text="@string/forgot_your_code" - android:textColor="?colorPrimary" - android:textSize="12sp" - android:textStyle="bold" - android:visibility="gone" - app:layout_constraintTop_toBottomOf="@id/indicator_dots" - tools:visibility="visible" /> - - <com.andrognito.pinlockview.PinLockView - android:id="@+id/pin_lock_view" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_below="@id/indicator_dots" - app:indicatorType="fillWithAnimation" - app:keypadDeleteButtonSize="24dp" - app:keypadShowDeleteButton="true" - app:keypadTextColor="?colorPrimary" - app:keypadTextSize="24sp" - app:keypadVerticalSpacing="24dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/forgotCode" - app:pinLength="4" /> - </androidx.constraintlayout.widget.ConstraintLayout> -</layout> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_dashboard_mobile.xml b/app/src/main/res/layout/activity_dashboard_mobile.xml index a787d3dbd12..c2a978209eb 100644 --- a/app/src/main/res/layout/activity_dashboard_mobile.xml +++ b/app/src/main/res/layout/activity_dashboard_mobile.xml @@ -42,6 +42,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/ic_arrow_back" + app:tint="?onToolbarColor" tools:ignore="ContentDescription" /> <TextView @@ -52,7 +53,7 @@ android:gravity="center_vertical" android:maxLines="1" android:text='@{title}' - android:textColor="?colorAccent" + android:textColor="?onToolbarColor" android:textSize="20sp" app:layout_constraintEnd_toStartOf="@id/editButton" app:layout_constraintStart_toEndOf="@id/back" @@ -75,7 +76,7 @@ app:layout_constraintEnd_toStartOf="@id/relationshipIcon" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/ic_sync" - app:tint="?colorOnPrimary" + app:tint="?onToolbarColor" tools:ignore="ContentDescription" tools:visibility="gone" /> @@ -88,7 +89,7 @@ app:layout_constraintEnd_toStartOf="@id/moreOptions" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/ic_map" - app:tint="@color/white" + app:tint="?onToolbarColor" tools:ignore="ContentDescription" tools:visibility="gone" /> diff --git a/app/src/main/res/layout/activity_dataset_detail.xml b/app/src/main/res/layout/activity_dataset_detail.xml index ff9ea62e1c7..10aaee1ac5d 100644 --- a/app/src/main/res/layout/activity_dataset_detail.xml +++ b/app/src/main/res/layout/activity_dataset_detail.xml @@ -42,6 +42,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:srcCompat="@drawable/ic_arrow_back" + app:tint="?onToolbarColor" tools:ignore="ContentDescription" /> <TextView @@ -54,7 +55,7 @@ android:gravity="center_vertical" android:maxLines="1" android:text="@{ name }" - android:textColor="@android:color/white" + android:textColor="?onToolbarColor" android:textSize="17sp" app:layout_constraintEnd_toStartOf="@id/syncButton" app:layout_constraintStart_toEndOf="@id/menu" @@ -69,7 +70,7 @@ app:layout_constraintEnd_toStartOf="@id/filter" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/ic_sync" - app:tint="?colorOnPrimary" + app:tint="?onToolbarColor" tools:ignore="ContentDescription" /> <ImageView @@ -80,6 +81,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" + app:tint="?onToolbarColor" app:srcCompat="@drawable/ic_filter" tools:ignore="ContentDescription" /> @@ -101,6 +103,7 @@ android:includeFontPadding="false" android:text='@{""+totalFilters}' android:textColor="?colorPrimary" + android:backgroundTint="?onToolbarColor" android:textSize="10sp" android:visibility="@{totalFilters>0?View.VISIBLE:View.GONE}" tools:text="1" /> diff --git a/app/src/main/res/layout/activity_dataset_initial.xml b/app/src/main/res/layout/activity_dataset_initial.xml index 13ae1610f6f..f3030a387e4 100644 --- a/app/src/main/res/layout/activity_dataset_initial.xml +++ b/app/src/main/res/layout/activity_dataset_initial.xml @@ -39,7 +39,8 @@ android:onClick="@{()->presenter.onBackClick()}" android:layout_marginStart="4dp" app:srcCompat="@drawable/ic_arrow_back" - tools:ignore="ContentDescription" /> + tools:ignore="ContentDescription" + app:tint="?onToolbarColor" /> <TextView android:layout_width="0dp" @@ -48,7 +49,7 @@ android:layout_marginStart="4dp" android:gravity="start|center" android:text="@{dataSetModel.displayName}" - android:textColor="@android:color/white" + android:textColor="?onToolbarColor" android:textSize="20sp" tools:text="DATA_SET_TITLE" /> diff --git a/app/src/main/res/layout/activity_event_capture.xml b/app/src/main/res/layout/activity_event_capture.xml index 01e4321e76b..88bb161e684 100644 --- a/app/src/main/res/layout/activity_event_capture.xml +++ b/app/src/main/res/layout/activity_event_capture.xml @@ -35,7 +35,8 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - app:srcCompat="@drawable/ic_arrow_back" /> + app:srcCompat="@drawable/ic_arrow_back" + app:tint="?onToolbarColor" /> <androidx.compose.ui.platform.ComposeView android:id="@+id/moreOptions" @@ -51,11 +52,11 @@ android:layout_width="wrap_content" android:layout_height="0dp" app:circleColor="@color/circleColor" - app:completionColor="@color/completionColor" + app:completionColor="?onToolbarColor" app:layout_constraintBottom_toBottomOf="@+id/moreOptions" app:layout_constraintEnd_toStartOf="@id/relationshipIcon" app:layout_constraintTop_toTopOf="@+id/moreOptions" - app:percentageColor="@color/percentageColor" + app:percentageColor="?onToolbarColor" app:percentageSize="13sp" app:secondaryColor="@color/secondaryColor" app:strokeSize="3dp" @@ -81,7 +82,7 @@ android:layout_marginStart="12dp" android:gravity="center_vertical" android:maxLines="1" - android:textColor="?colorAccent" + android:textColor="?onToolbarColor" android:textSize="22sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/syncButton" @@ -97,7 +98,7 @@ app:layout_constraintEnd_toStartOf="@id/completion" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/ic_sync" - app:tint="?colorOnPrimary" + app:tint="?onToolbarColor" tools:ignore="ContentDescription" tools:visibility="visible" /> diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index c8565416d31..8537db061a2 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -8,22 +8,6 @@ <import type="org.dhis2.R" /> <import type="android.view.View" /> - - <variable - name="theme" - type="android.content.res.Resources.Theme" /> - - <variable - name="userName" - type="java.lang.String" /> - - <variable - name="presenter" - type="org.dhis2.usescases.main.MainPresenter" /> - - <variable - name="totalFilters" - type="Integer" /> </data> <androidx.constraintlayout.widget.ConstraintLayout @@ -49,97 +33,15 @@ android:layout_height="match_parent" android:background="?colorPrimary"> - <androidx.constraintlayout.widget.ConstraintLayout - android:id="@+id/toolbar" - android:layout_width="0dp" - android:layout_height="?attr/actionBarSize" - android:background="?colorPrimary" - android:elevation="0dp" - android:gravity="center_vertical" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent"> - - <ImageView - android:id="@+id/menu" - style="@style/ActionIcon" - android:focusable="true" - android:onClick="@{()->presenter.onMenuClick()}" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:srcCompat="@drawable/ic_menu" - tools:ignore="ContentDescription" /> - - <TextView - android:id="@+id/title" - android:layout_width="0dp" - android:layout_height="0dp" - android:gravity="center_vertical" - android:text="@string/done_task" - android:textColor="@android:color/white" - android:textSize="20sp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toStartOf="@id/syncActionButton" - app:layout_constraintStart_toEndOf="@id/menu" - app:layout_constraintTop_toTopOf="parent" /> - - <ImageView - android:id="@+id/syncActionButton" - style="@style/ActionIcon" - android:layout_marginEnd="8dp" - android:onClick="@{()->presenter.onSyncAllClick()}" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toStartOf="@id/filterActionButton" - app:layout_constraintTop_toTopOf="parent" - app:srcCompat="@drawable/ic_sync" - app:tint="?colorOnPrimary" - tools:ignore="ContentDescription" /> - - <ImageView - android:id="@+id/filterActionButton" - style="@style/ActionIcon" - android:onClick="@{()->presenter.showFilter()}" - android:layout_marginEnd="8dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:srcCompat="@drawable/ic_filter" - tools:ignore="ContentDescription" /> - - <androidx.constraintlayout.widget.ConstraintLayout - android:id="@+id/filterCounter" - android:layout_width="24dp" - android:layout_height="24dp" - android:layout_marginStart="24dp" - android:layout_marginTop="24dp" - android:padding="2dp" - app:layout_constraintTop_toTopOf="@id/filterActionButton" - app:layout_constraintStart_toStartOf="@id/filterActionButton"> - - <TextView - android:layout_width="match_parent" - android:layout_height="match_parent" - android:background="@drawable/ic_oval_shape_white" - android:gravity="center" - android:includeFontPadding="false" - android:textColor="?colorPrimary" - android:text='@{""+totalFilters}' - android:visibility="@{totalFilters>0?View.VISIBLE:View.GONE}" - android:textSize="10sp" - tools:text="1" /> - </androidx.constraintlayout.widget.ConstraintLayout> - - </androidx.constraintlayout.widget.ConstraintLayout> <androidx.recyclerview.widget.RecyclerView android:id="@+id/filterRecycler" android:layout_width="0dp" android:layout_height="wrap_content" - app:layout_constraintEnd_toEndOf="parent" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - tools:listitem="@layout/item_header_filter" - app:layout_constraintTop_toBottomOf="@id/toolbarProgress" /> + app:layout_constraintTop_toBottomOf="@id/toolbarProgress" + tools:listitem="@layout/item_header_filter" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/backdropGuide" @@ -157,7 +59,7 @@ android:indeterminate="true" android:padding="0dp" android:visibility="gone" - app:layout_constraintTop_toBottomOf="@id/toolbar" /> + app:layout_constraintTop_toTopOf="parent" /> <FrameLayout android:id="@+id/fragment_container" @@ -165,18 +67,11 @@ android:layout_height="0dp" android:background="@drawable/ic_front_home_backdrop_bg" android:clipToPadding="false" - app:layout_constraintBottom_toTopOf="@id/navigationBar" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/toolbarProgress" /> - - <androidx.compose.ui.platform.ComposeView - android:id="@+id/navigationBar" - android:layout_width="match_parent" - android:layout_height="wrap_content" - app:layout_constraintBottom_toBottomOf="parent"/> - </androidx.constraintlayout.widget.ConstraintLayout> <!--End of Main Content--> @@ -193,11 +88,6 @@ app:itemTextColor="@color/text_black_333" app:menu="@menu/main_menu" /> - <include - android:id="@+id/pin_layout" - layout="@layout/layout_pin" - tools:visibility="gone" /> - </androidx.drawerlayout.widget.DrawerLayout> </androidx.constraintlayout.widget.ConstraintLayout> </layout> diff --git a/app/src/main/res/layout/activity_program_event_detail.xml b/app/src/main/res/layout/activity_program_event_detail.xml index 72e09e38d90..036801f79bc 100644 --- a/app/src/main/res/layout/activity_program_event_detail.xml +++ b/app/src/main/res/layout/activity_program_event_detail.xml @@ -42,6 +42,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/ic_arrow_back" + app:tint="?onToolbarColor" tools:ignore="ContentDescription" /> <TextView @@ -54,7 +55,7 @@ android:gravity="center_vertical" android:maxLines="1" android:text="@{ name }" - android:textColor="@android:color/white" + android:textColor="?onToolbarColor" android:textSize="17sp" app:layout_constraintEnd_toStartOf="@id/syncButton" app:layout_constraintStart_toEndOf="@id/menu" @@ -67,7 +68,7 @@ app:layout_constraintEnd_toStartOf="@id/filter" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/ic_sync" - app:tint="?colorOnPrimary" + app:tint="?onToolbarColor" tools:ignore="ContentDescription" /> <ImageView @@ -79,7 +80,8 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/ic_filter" - tools:ignore="ContentDescription" /> + tools:ignore="ContentDescription" + app:tint="?onToolbarColor" /> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/filterCounter" @@ -94,6 +96,7 @@ <TextView android:layout_width="match_parent" android:layout_height="match_parent" + android:backgroundTint="?onToolbarColor" android:background="@drawable/ic_oval_shape_white" android:gravity="center" android:includeFontPadding="false" diff --git a/app/src/main/res/layout/activity_search.xml b/app/src/main/res/layout/activity_search.xml index 35846f1fc28..ab5ceeec47f 100644 --- a/app/src/main/res/layout/activity_search.xml +++ b/app/src/main/res/layout/activity_search.xml @@ -38,6 +38,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/ic_arrow_back" + app:tint="?onToolbarColor" tools:ignore="ContentDescription" /> <TextView @@ -48,7 +49,7 @@ android:layout_toEndOf="@id/back_button" android:gravity="center_vertical" android:text="@string/search" - android:textColor="@color/white_faf" + android:textColor="?onToolbarColor" android:textSize="20sp" android:visibility="gone" app:layout_constraintStart_toEndOf="@id/back_button" @@ -72,6 +73,7 @@ android:layout_height="match_parent" android:background="@drawable/ic_oval_shape_white" android:gravity="center" + android:backgroundTint="?onToolbarColor" android:includeFontPadding="false" android:text='@{""+totalFilters}' android:textColor="?colorPrimary" @@ -88,6 +90,7 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/ic_filter" + app:tint="?onToolbarColor" tools:ignore="ContentDescription" /> <ImageView @@ -97,7 +100,7 @@ app:layout_constraintEnd_toStartOf="@id/filter" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/ic_sync" - app:tint="?colorOnPrimary" + app:tint="?onToolbarColor" tools:ignore="ContentDescription" /> <Spinner diff --git a/app/src/main/res/layout/dialog_pin.xml b/app/src/main/res/layout/dialog_pin.xml deleted file mode 100644 index 2a7ee79489a..00000000000 --- a/app/src/main/res/layout/dialog_pin.xml +++ /dev/null @@ -1,87 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<layout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools"> - - <androidx.cardview.widget.CardView - android:id="@+id/cardview_pin" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_margin="32dp" - app:cardUseCompatPadding="true" - app:cardBackgroundColor="@color/white" - app:cardCornerRadius="8dp"> - - <androidx.constraintlayout.widget.ConstraintLayout - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <ImageButton - android:id="@+id/closeButton" - style="@style/ActionIcon" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:tint="?colorPrimary" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:srcCompat="@drawable/ic_clear" /> - - <TextView - android:id="@+id/title" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_centerHorizontal="true" - android:layout_margin="16dp" - android:text="@string/set_pin" - android:textColor="@android:color/black" - android:textSize="20sp" - android:textStyle="bold" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/closeButton" /> - - <com.andrognito.pinlockview.IndicatorDots - android:id="@+id/indicator_dots" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="32dp" - android:gravity="center" - app:dotDiameter="12dp" - app:dotFilledBackground="@drawable/primary_dot_indicator" - app:dotSpacing="27dp" - app:layout_constraintTop_toBottomOf="@id/title" /> - - <TextView - android:id="@+id/forgotCode" - android:layout_width="match_parent" - android:layout_height="0dp" - android:layout_centerHorizontal="true" - android:layout_margin="16dp" - android:gravity="center" - android:text="@string/forgot_your_code" - android:textColor="?colorPrimary" - android:textSize="12sp" - android:textStyle="bold" - android:visibility="gone" - app:layout_constraintTop_toBottomOf="@id/indicator_dots" - tools:visibility="visible" /> - - <com.andrognito.pinlockview.PinLockView - android:id="@+id/pin_lock_view" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_below="@id/indicator_dots" - app:indicatorType="fillWithAnimation" - app:keypadDeleteButtonSize="24dp" - app:keypadShowDeleteButton="true" - app:keypadTextColor="?colorPrimary" - app:keypadTextSize="24sp" - app:keypadVerticalSpacing="24dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/forgotCode" - app:pinLength="4" /> - </androidx.constraintlayout.widget.ConstraintLayout> - </androidx.cardview.widget.CardView> -</layout> \ No newline at end of file diff --git a/app/src/main/res/layout/item_search_tracked_entity.xml b/app/src/main/res/layout/item_search_tracked_entity.xml index 06af4e8de80..df9d01217d2 100644 --- a/app/src/main/res/layout/item_search_tracked_entity.xml +++ b/app/src/main/res/layout/item_search_tracked_entity.xml @@ -21,7 +21,7 @@ <variable name="attribute" - type="java.util.List&lt;org.hisp.dhis.android.core.trackedentity.TrackedEntityAttributeValue&gt;" /> + type="java.util.List&lt;org.dhis2.tracker.search.model.TrackedEntitySearchItemAttributeDomain&gt;" /> <variable name="attributeNames" @@ -222,7 +222,7 @@ android:ellipsize="end" android:fontFamily="@font/rubik_regular" android:singleLine="true" - android:text='@{attribute.size()>0 ? attribute.get(0).value() : "" , default="attribute 1"}' + android:text='@{attribute.size()>0 ? attribute.get(0).value : "" , default="attribute 1"}' android:textColor="@color/textSecondary" android:textSize="14sp" android:visibility='@{attribute.size()>0?View.VISIBLE:View.GONE}' @@ -241,7 +241,7 @@ android:ellipsize="end" android:fontFamily="@font/rubik_regular" android:singleLine="true" - android:text='@{attribute.size() > 1 ? attribute.get(1).value() : "" , default="attribute 2"}' + android:text='@{attribute.size() > 1 ? attribute.get(1).value : "" , default="attribute 2"}' android:textColor="@color/textSecondary" android:textSize="12sp" android:visibility='@{attribute.size() > 1 &amp;&amp; !attributeListOpened ? View.VISIBLE : View.GONE}' diff --git a/app/src/main/res/layout/layout_pin.xml b/app/src/main/res/layout/layout_pin.xml deleted file mode 100644 index 284544d1295..00000000000 --- a/app/src/main/res/layout/layout_pin.xml +++ /dev/null @@ -1,101 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<layout xmlns:tools="http://schemas.android.com/tools"> - - <data /> - - <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:background="@color/white" - android:clickable="true" - android:focusable="true" - android:visibility="gone" - tools:visibility="visible"> - - <RelativeLayout - android:id="@+id/header" - android:layout_width="match_parent" - android:layout_height="100dp" - android:background="?colorPrimary" - android:gravity="center" - app:layout_constraintTop_toTopOf="parent"> - - <ImageView - android:layout_width="match_parent" - android:layout_height="60dp" - android:layout_centerInParent="true" - app:srcCompat="@drawable/ic_dhis_white" /> - </RelativeLayout> - - - <TextView - android:id="@+id/title" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_centerHorizontal="true" - android:layout_margin="16dp" - android:text="@string/set_pin" - android:textColor="@android:color/black" - android:textSize="20sp" - android:textStyle="bold" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/header" /> - - <com.andrognito.pinlockview.IndicatorDots - android:id="@+id/indicator_dots" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="32dp" - android:gravity="center" - app:dotDiameter="12dp" - app:dotFilledBackground="@drawable/primary_dot_indicator" - app:dotSpacing="27dp" - app:layout_constraintTop_toBottomOf="@id/title" /> - - <TextView - android:id="@+id/forgotCode" - android:layout_width="match_parent" - android:layout_height="0dp" - android:layout_centerHorizontal="true" - android:layout_margin="16dp" - android:gravity="center" - android:text="@string/forgot_your_code" - android:textColor="?colorPrimary" - android:textSize="12sp" - android:textStyle="bold" - android:visibility="gone" - app:layout_constraintTop_toBottomOf="@id/indicator_dots" - tools:visibility="visible" /> - - <CheckBox - android:buttonTint="?colorPrimary" - android:checked="true" - android:id="@+id/lockPin" - android:layout_margin="8dp" - android:text="@string/disable_pin_locked" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/forgotCode" - android:layout_width="wrap_content" - android:layout_height="wrap_content"/> - - <com.andrognito.pinlockview.PinLockView - android:id="@+id/pin_lock_view" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_below="@id/indicator_dots" - app:indicatorType="fillWithAnimation" - app:keypadDeleteButtonSize="24dp" - app:keypadShowDeleteButton="true" - app:keypadTextColor="?colorPrimary" - app:keypadTextSize="24sp" - app:keypadVerticalSpacing="24dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/lockPin" - app:pinLength="4" /> - </androidx.constraintlayout.widget.ConstraintLayout> -</layout> \ No newline at end of file diff --git a/app/src/main/res/layout/spinner_program_item_layout.xml b/app/src/main/res/layout/spinner_program_item_layout.xml new file mode 100644 index 00000000000..8b3cebea964 --- /dev/null +++ b/app/src/main/res/layout/spinner_program_item_layout.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<layout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools"> + + <data> + + <variable + name="program" + type="org.dhis2.usescases.searchTrackEntity.ProgramSpinnerModel" /> + </data> + + <TextView + android:id="@+id/spinner_text" + android:layout_width="match_parent" + android:layout_height="50dp" + android:drawableEnd="@{@drawable/ic_arrow_drop_down_black_24dp}" + android:gravity="center_vertical" + android:padding="5dp" + android:text="@{program.displayName}" + android:textColor="@color/text_black_333" + android:maxLines="1" + android:alpha="@{program.downloading ? 0.5f : 1f}" + android:clickable="@{program.downloading}" + android:ellipsize="end" + android:textSize="16sp" + tools:text="nameddddddddddddddddddddddddddddddddddddddddddddddddddddddd" + tools:drawableEnd="@drawable/ic_arrow_drop_down_black_24dp" /> +</layout> \ No newline at end of file diff --git a/app/src/main/res/layout/spinner_program_layout.xml b/app/src/main/res/layout/spinner_program_layout.xml index 2baa2e324a2..0a3571cfb61 100644 --- a/app/src/main/res/layout/spinner_program_layout.xml +++ b/app/src/main/res/layout/spinner_program_layout.xml @@ -17,12 +17,13 @@ android:gravity="center_vertical" android:padding="5dp" android:text="@{program.displayName}" - android:textColor="@color/text_black_333" + android:textColor="?onToolbarColor" android:maxLines="1" android:alpha="@{program.downloading ? 0.5f : 1f}" android:clickable="@{program.downloading}" android:ellipsize="end" - android:textSize="16sp" + android:textSize="20sp" + android:drawableTint="?onToolbarColor" tools:text="nameddddddddddddddddddddddddddddddddddddddddddddddddddddddd" tools:drawableEnd="@drawable/ic_arrow_drop_down_black_24dp"/> </layout> \ No newline at end of file diff --git a/app/src/main/res/menu/main_menu.xml b/app/src/main/res/menu/main_menu.xml index f17b3bdf1b5..e1eb40687e4 100644 --- a/app/src/main/res/menu/main_menu.xml +++ b/app/src/main/res/menu/main_menu.xml @@ -50,6 +50,12 @@ android:icon="@drawable/ic_troubleshooting" android:title="@string/main_menu_troubleshooting"/> + <item + android:id="@+id/menu_dev" + android:icon="@drawable/ic_doctor_positive" + android:title="@string/main_menu_developer_scree" + android:visible="false" /> + <item android:id="@+id/menu_about" android:icon="@drawable/ic_menu_info" diff --git a/app/src/main/res/values-ar-rIQ/strings.xml b/app/src/main/res/values-ar-rIQ/strings.xml index f99c6b87d72..2e6c4b5bb71 100644 --- a/app/src/main/res/values-ar-rIQ/strings.xml +++ b/app/src/main/res/values-ar-rIQ/strings.xml @@ -1,8 +1,6 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!-- Warnings and error messages --> <string name="error">خطأ</string> - <string name="add_new">إضافة جديد</string> - <string name="user_hint">اسم المستخدم</string> <!--PERIOD--> <string name="DAILY">يومي</string> <string name="WEEKLY">أسبوعي</string> @@ -12,21 +10,24 @@ <string name="action_share_zero_items">مشاركة</string> <!-- Input hints --> <string name="search">البحث</string> + <!-- Status --> + <string name="event_open">فتح</string> <string name="completed">مكتمل</string> <string name="cancelled">تم الإلغاء</string> <string name="active">فعال</string> <string name="state_error">خطأ</string> + + <!--Completion--> + <!--Event initial--> - <string name="create">إنشاء</string> <string name="update">تحديث</string> - <string name="date">التاريخ</string> - <string name="new_event">حدث جديد</string> <!--Event Detail--> <string name="due_date">تاريخ الاستحقاق</string> <string name="cancel">إلغاء</string> <string name="delete">حذف</string> + <!--TEI DASHBOARD--> <string name="edit">تعديل</string> <string name="done_task">الرئيسية</string> <string name="wipe_data_ok">قبول</string> @@ -34,44 +35,22 @@ <string name="settingsTwoFAStatus">الحالة</string> <!--endregion--> - <string name="enrollmment_date">تاريخ التسجيل</string> - <!-- SEARCH OPTION SET --> <string name="search_optionset">البحث</string> + <!--EVENT SUMMARY--> + <!--AGE CUSTOM VIEW--> - <string name="hint_day">‏‏الأيام</string> - <string name="hint_month">الأشهر</string> - <string name="hint_year">السنوات</string> - <string name="week">الأسابيع</string> <string name="incident_date">تاريخ الواقعة</string> - <string name="date_dialog_clear">مسح</string> + <!-- RELATIONSHIPS --> <string name="next">التالي</string> - <string name="SAVE">حفظ</string> <string name="qr_attributes">السمات</string> <string name="qr_relationships">علاقات</string> <string name="about">حول</string> <string name="share">مشاركة</string> - <string name="max">الأعلى</string> - <string name="warning_on_complete_title">تحذير</string> - <string name="error_on_complete_title">خطأ</string> <string name="save">حفظ</string> <string name="menu_home">الرئيسية</string> - <string name="dashboard_relationships">علاقات</string> - <string name="dashboard_indicators">المؤشرات</string> - <string name="event_overview">التفاصيل</string> - <string name="event_indicators">المؤشرات</string> - <string name="finish">إنهاء</string> - <string name="event_overdue">متأخر</string> - <string name="table">الجدول</string> - <string name="local_data_accept">قبول</string> <string name="state_warning">تحذير</string> <string name="action_close">إغلاق</string> - <string name="data_set_complete">مكتمل</string> - <string name="data_set_open">فتح</string> - <string name="data_every_day">يومي</string> - <string name="data_every_week">أسبوعي</string> - <string name="sms_completed">مكتمل</string> - <string name="filters_title_status">الحالة</string> <string name="filter_period_today">اليوم</string> <string name="filter_period_yesterday">الأمس</string> <string name="filter_period_this_week">الأسبوع الحالي</string> @@ -84,19 +63,11 @@ <string name="filter_event_status_skipped">تم التخطي</string> <string name="data_sets">حزم البيانات</string> <string name="interval_yesterday">الأمس</string> - <string name="dataset_overview">التفاصيل</string> - <string name="dataset_comments">التعليقات</string> - <string name="name">الاسم</string> <string name="filters_title_event_status">حالة الحدث</string> - <string name="enrollment_date">تاريخ التسجيل</string> <string name="enrollment_status_active">فتح</string> <string name="enrollment_status_completed">مكتمل</string> <string name="enrollment_status_cancelled">تم الإلغاء</string> - <string name="event_data">البيانات</string> - <string name="are_you_sure">هل أنت متأكد؟</string> <string name="filters_title_date">التاريخ</string> - <string name="filters_title_event_date">بيانات الحدث</string> - <string name="customactivityoncrash_error_activity_error_details_close">إغلاق</string> <string name="section_charts">المخططات البيانية</string> <string name="navigation_map_view">الخريطة</string> <string name="navigation_programs">البرامج</string> @@ -114,8 +85,6 @@ <string name="filter_period_last_financial_year">السنة المالية الماضية</string> <string name="section_feedback">التغذية الراجعة</string> <string name="section_indicators">المؤشرات</string> - <string name="value">القيمة</string> - <string name="available">متوفر</string> <string name="sync_dialog_title_syncing">تزامن</string> <string name="skipped">تم التخطي</string> <string name="programs">البرامج</string> diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 88db2cf3a2b..efa22a4b97d 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -1,66 +1,26 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!--GENERAL--> <string name="app_name">Dhis2</string> - <string name="logo_text">dhis</string> - <string name="logo_number">2</string> <!-- Warnings and error messages --> <string name="error">خطأ</string> - <plurals name="error_message"> - <item quantity="zero">أخطاء</item> - <item quantity="one">خطأ</item> - <item quantity="two">خطأين</item> - <item quantity="few">أخطاء</item> - <item quantity="many">أخطاء</item> - <item quantity="other">أخطاء</item> - </plurals> - <string name="error_wrong_server_url">رابط الخادم غير صحيح</string> - <string name="error_wrong_credentials">خطأ في الإعتمادات</string> - <string name="error_unexpected_error">خطأ غير متوقع</string> - <string name="error_internal_server_error">خطأ داخلي في الخادم</string> - <string name="no_value">لاتوجد قيمة</string> <string name="no_reserved_values">لا يوجد المزيد من القيم المحجوزة. اتصل بمسؤول النظام</string> - <string name="no_reserved_values_connection">لا يوجد المزيد من القيم المحجوزة. اتصل بالشبكة لإعادة تعبئتها</string> - <string name="errors">أخطاء</string> <string name="something_wrong">حدث خطأ ما</string> <!-- SyncService strings: --> - <string name="sync_now">مزامنة الآن</string> - <string name="sync_text">مزامنة مع الخادم</string> - <string name="sync_title">تتم المزامنة الآن</string> - <string name="sync_metadata">البيانات الوصفية</string> <string name="sync_events">الأحداث</string> - <string name="sync_tei">الكيانات المتعقبة</string> - - <string name="sync_complete_title">اكتمل</string> - <string name="sync_complete_text">اكتملت المزامنة</string> <string name="sync_error_title">خطأ في المزامنة</string> <string name="sync_error_text">حدث خطأ أثناء المزامنة. يرجى اعادة المحاولة.</string> <string name="sync_incomplete_error_text">انتهت المزامنة ولكن لم نتلق تأكيدًا من الخادم لجميع السجلات. هذه السجلات لا تزال تحمل علامة \"غير مزامن\" في التطبيق. نوصي بإعادة محاولة المزامنة.</string> - <string name="data_sync_warning_program">تحذير: تم مزامنة معظم البيانات الخاصة بك ولكن يوجد تعارضات في بعض الحقول. قم بعمل مزامنة للتكوين الخاص بك وحاول مرة أخرى. إذا استمر التحذير ، فتحقق من حالة المزامنة: يتم وضع علامة @ على البرامج و TEI والأحداث المتعارضة.</string> - <string name="server_sync_error">حدث خطأ ولم يستجب الخادم. تواصل مع مديرك.</string> - - <string name="search_result_text">تم العثور على %s نتيجة</string> - <string name="add_new">إضافة جديد</string> - <string name="add">إضافة</string> - <string name="schedule_new">جدولة جديدة</string> <string name="referral">إحالة</string> <!-- Login --> - <string name="url_hint">رابط الخادم</string> - <string name="user_hint">اسم المستخدم</string> - <string name="password_hint">كلمة المرور</string> - <string name="log_in_button">تسجيل الدخول</string> - <string name="unlock_button">الغاء القفل عن الجلسة</string> <string name="syncing_configuration">مزامنة التكوين الخاص بك</string> <string name="syncing_data_shortly">سيتم مزامنة بياناتك بعد لحظات</string> <string name="syncing_data">مزامنة بياناتك</string> <string name="configuration_ready">التكوين الخاص بك جاهز</string> <string name="data_ready">بياناتك جاهزة</string> - <string name="configuration_sync_failed">فشل مزامنة التكوين</string> - <string name="data_sync_failed">فشل مزامنة البيانات</string> <string name="account_recovery">استرداد الحساب</string> - <string name="no_network_to_recover_account">يلزم وجود اتصال بالشبكة لاسترداد حسابك.</string> <!--PERIOD--> <string name="DAILY">يومي</string> @@ -81,137 +41,83 @@ <string name="enter_text">أدخل نصًا</string> <string name="enter_long_text">أدخل نصًا طويلاً</string> <string name="enter_number">ادخل رقمًا</string> - <string name="enter_integer">أدخل عددًا صحيحًا</string> <string name="enter_negative_integer">أدخل عددًا صحيحًا سالبًا</string> <string name="enter_positive_integer_or_zero">أدخل عددًا صحيحًا موجبًا أو صفر</string> <string name="enter_positive_integer">أدخل عددًا صحيحًا موجبًا</string> - <string name="filter_options">خيارات التصفية</string> <string name="choose_date">اختر التاريخ</string> - <string name="change_calendar">تغيير طريقة عرض التقويم</string> <!-- Status --> - <string name="program_completed">تم اكمال البرنامج</string> - <string name="program_inactive">البرنامج غير نشط</string> <string name="event_open">مفتوح</string> <string name="event_not_completed">لم يكتمل</string> <string name="event_completed">الحدث مكتمل</string> <string name="read_only">للقراءة فقط</string> - <string name="finish_and_complete">انهاء ومكتمل</string> <string name="completed">مكتمل</string> <string name="cancelled">تم الإلغاء</string> <string name="re_open">إعادة فتح</string> - <string name="activate">تنشيط</string> <string name="active">فعال</string> <!-- State --> <string name="state_synced">حالة المزامنة</string> <string name="state_to_post">للإرسال</string> <string name="state_to_update">للتحديث</string> - <string name="state_to_delete">للحذف</string> <string name="state_error">خطأ</string> - <string name="action_sync">مزامنة</string> - <string name="action_send">إرسال</string> - <string name="action_sync_sms">مزامنة sms</string> <!--Completion--> - <string name="completion">الإكمال</string> <!--Event initial--> - <string name="create">إنشاء</string> <string name="update">تحديث</string> - <string name="date">التاريخ</string> <string name="org_unit">الوحدة التنظيمية</string> <string name="no_org_units">لا توجد أي وحدات تنظيمية مفتوحة للتاريخ المحدد. يرجى تحديد تاريخ آخر أو وحدة تنظيمية أخرى.</string> - <string name="category_option">خيار الفئة</string> <string name="latitude">خط العرض</string> <string name="longitude">خط الطول</string> - <string name="new_event">حدث جديد</string> - <string name="one_time">مرة واحدة</string> - <string name="permanent">دائم</string> <!--DataSet initial--> <string name="report_period">الفترة الزمنية للتقرير</string> - <string name="cat_option">خيار فئة</string> - <string name="field_required">إذا قمت بتعيين قيمة ، فإن الصف بأكمله يحتاج إلى كل القيم لإكمال مجموعة البيانات.</string> - <string name="field_mandatory">بعض القيم المطلوبة مفقودة. تحتاج إلى إدخال القيم الإلزامية لتتمكن من الإكمال.</string> - <string name="field_mandatory_v2">هناك حقول إلزامية مفقودة. من فضلك قم بملؤها لإكمال حزمة البيانات.</string> - <string name="datavalue_saved">تم حفظ القيمة!</string> - <string name="there_is_no_available_period">لا توجد فترات متاحة للاختيار.</string> <!--Event Detail--> <string name="due_date">تاريخ الاستحقاق</string> <string name="cat_combo">تجميع فئة</string> - <string name="date_default">DD/MM/YYYY</string> <string name="cancel">إلغاء</string> <string name="delete">حذف</string> - <string name="total">الإجمالي</string> <string name="most_recent_event_date">تاريخ أحدث حدث</string> <string name="no_options">لا تتوفر خيارات</string> <string name="active_programs">البرامج النشطة</string> - <string name="to_enroll_programs">برامج للتسجيل</string> <string name="enroll">تسجيل</string> - <string name="last_visit">آخر زيارة:</string> - <string name="apply">تطبيق</string> <!--TEI DASHBOARD--> - <string name="see_details">انظر التفاصيل</string> - <string name="view_more">عرض المزيد</string> <string name="edit">تعديل</string> - <string name="follow_up">متابعة</string> - <string name="follow_up_enabled">تم تمكين المتابعة</string> - <string name="follow_up_disabled">تم ايقاف المتابعة</string> <string name="deactivate">إلغاء التنشيط</string> <string name="program_not_allow_events">هذا البرنامج لا يسمح بإضافة أحداث أكثر</string> <!--DONE TASKS--> - <string name="events_no_data">لا توجد بيانات</string> <string name="events">الأحداث</string> <string name="done_task">الرئيسية</string> - <string name="app_info">معلومات التطبيق</string> <string name="log_out">تسجيل الخروج</string> - <string name="block_session">حظر الجلسة</string> <string name="show_more_events">عرض %s المزيد...</string> <string name="show_less_events">عرض أقل...</string> <!-- SYNC --> - <string name="a_minute">1 دقيقة</string> - <string name="fifteen_minute">15 دقيقة</string> <string name="thirty_minutes">30 دقيقة</string> <string name="a_hour">1 ساعة</string> <string name="every_6_hours">6 ساعات</string> <string name="a_day">1 يوم (افتراضي)</string> <string name="every_12_hours">12 ساعة</string> - <string name="Automatic_Sync_Data">المزامنة التلقائية للبيانات كل:</string> <string name="Manual">يدوياً</string> - <string name="Automatic_Sync_Metadata">المزامنة التلقائية للتكوين كل:</string> <string name="a_week">1 أسبوع</string> <string name="sync_max_parameters">عوامل المزامنة الحالية:</string> <string name="sync_default_parameters">إعادة التعيين إلى الافتراضي</string> + <string name="wipe_data_meesage">سيتم حذف قاعدة البيانات. سيُطلب منك تسجيل الدخول مرة أخرى.</string> <string name="wipe_data_ok">قبول</string> <string name="wipe_data_no">إلغاء</string> <string name="SYNC_DATA">مزامنة البيانات الآن</string> <string name="SYNC_META">مزامنة التكوين الآن</string> <string name="SYNC_MANAGER">الإعدادات</string> - <string name="last_data_sync_date">آخر عملية مزامنة في: %s</string> - <string name="last_metadata_sync_date">آخر عملية مزامنة في: %s</string> <string name="refill_reserved_values">إعادة ملء</string> - <string name="settings_sms_module_title">وحدة sms: </string> <string name="settings_sms_receiver_number">بوابة sms</string> <string name="settings_sms_result_sender_number">مرسل نتيجة sms</string> - <string name="settings_sms_result_timeout_hint">ثواني</string> - <string name="settings_sms_result_sender_hint">رقم</string> - <string name="settings_sms_receiver_number_hint">رقم</string> <string name="settings_sms_module_switch">تمكين إرسال SMS</string> <string name="settings_sms_response_wait_switch">انتظر لرد ونتيجة SMS</string> - <plurals name="settings_specific_programs"> - <item quantity="zero">يوجد %s برامج ذات إعدادات محددة</item> - <item quantity="one">يوجد %s برنامج مع إعدادات محددة</item> - <item quantity="two">يوجد %s برامج ذات إعدادات محددة</item> - <item quantity="few">يوجد %s برامج ذات إعدادات محددة</item> - <item quantity="many">يوجد %s برامج ذات إعدادات محددة</item> - <item quantity="other">يوجد %s برامج ذات إعدادات محددة</item> - </plurals> <string name="settings_limit_scope">الإعدادات محدودة</string> <string name="settings_limit_globally">شامل</string> <string name="settings_limit_program">لكل برنامج</string> @@ -229,19 +135,14 @@ <string name="settingsErrorLog_descr">يحتوي هذا السجل على جميع الأخطاء الناتجة عن مزامنة بياناتك والبيانات الوصفية.</string> <string name="settingsDeleteLocalData">حذف البيانات المحفوظة محلياً في هذا الجهاز</string> <string name="settingsDeleteLocalData_descr">سيتم حذف جميع بيانات التطبيق المخزنة في الجهاز. سيتم فقدان البيانات التي لم يتم مزامنتها مع الخادم.</string> - <string name="settingsReset">إعادة تعيين بيانات التطبيق و معلومات التكوين</string> - <string name="settingsReset_descr">سيتم حذف بيانات التكوين والتطبيق المخزنة في الجهاز. سيُطلب منك تسجيل الدخول مرة أخرى وستفقد البيانات التي لم يتم مزامنتها مع الخادم.</string> <string name="settingsSms">إعدادات SMS</string> <string name="settingsSms_descr">فحص وتعديل العوامل المتعلقة ببوابة sms</string> <string name="settingsCheckVersion">تحديث البرنامج</string> - <string name="settingsCheckVersionMessage">البرمجيات</string> <string name="settingsExportDB">قاعدة بيانات التصدير</string> <string name="settingsExportDBMessage">قم بتصدير قاعدة البيانات الخاصة بك ومشاركتها مع المسؤول عنك</string> <string name="settingsTwoFAStatus">الحالة</string> <!--endregion--> - <string name="enrollmment_date">تاريخ التسجيل</string> - <!-- SEARCH OPTION SET --> <string name="search_optionset">بحث</string> <!--FORM FRAGMENT--> @@ -263,29 +164,15 @@ <string name="tei_coordinates">إحداثيات لـ </string> <!--EVENT SUMMARY--> - <string name="section_list">قائمة الأقسام</string> - <string name="event_summary_header" formatted="false">تم إكمال %s سؤال من %s</string> - <string name="event_summary_sections_header" formatted="false">إكتمال %s من %s</string> - <string name="complete_and_close">مكتمل ومغلق</string> <!--AGE CUSTOM VIEW--> - <string name="hint_day">‏‏الأيام</string> - <string name="hint_month">الأشهر</string> - <string name="hint_year">السنوات</string> - <string name="week">الأسابيع</string> <string name="incident_date">تاريخ وقوع الحدث</string> - <string name="local_results">النتائج المحفوظة محلياً</string> - <string name="online_results">النتائج المحفوظة على الإنترنت</string> <string name="past_programs">البرامج الماضية</string> <!--PERMISSIONS--> <string name="permission_denied">ليس لديك الإذن المطلوب للقيام بهذا الإجراء</string> - <string name="add_relation_button">إضافة كـ ...</string> - <string name="date_dialog_clear">مسح</string> <string name="period">الفترة الزمنية</string> - <string name="org_unit_filter">(%d) وحدة تنظيمية</string> - <string name="org_unit_select_level">المستوى %d</string> <string name="tuto_main_1">مرحباً بكم في dhis2</string> <string name="tuto_main_2">هنا يمكنك رؤية أنشطتك</string> <string name="tuto_main_3">يمكنك تطبيق عامل تصفية...</string> @@ -294,16 +181,11 @@ <string name="tuto_main_6">الق نظرة على الإجراءات الأخرى في القائمة الرئيسية</string> <!-- RELATIONSHIPS --> - <string name="default_relationship_label">إنشاء علاقة</string> <string name="next">التالي</string> <string name="search_min_num_attr">تحتاج إلى ادخال %d على الأقل من السمات للقيام بالبحث</string> - <string name="search_attr">تحتاج إلى ادخال واحدة على الأقل من السمات للقيام بالبحث</string> - <string name="search_max_tei_reached">هناك أكثر من %d نتيجة. يرجى إدخال معايير بحث أخرى</string> - <string name="search_init">ادخل معايير البحث التي تريد</string> <!-- QR --> <string name="QR_SCANNER">إستيراد بيانات من رمز QR</string> - <string name="SAVE">حفظ</string> <string name="button_ok">موافق</string> <string name="qr_id">التعريف</string> <string name="qr_attributes">السمات</string> @@ -315,32 +197,20 @@ <string name="qr_no_data">لا وجود لبيانات</string> <string name="qr_error_id">رمز QR غير صالح</string> <string name="qr_error_attr">هذه السمة لايمكن إضافتها</string> - <string name="qr_error_enrollment">هذا التسجيل لايمكن إضافته</string> <string name="about">حول التطبيق</string> <string name="programs_to_enroll">برامج للتسجيل</string> - <string name="select_all">تحديد الكل</string> - <string name="clear_all">الغاء التحديد</string> - <string name="empty_program_list">لا توجد معلومات لعوامل التصفية المحددة. يرجى محاولة تغييرها.</string> <string name="share">مشاركة</string> <string name="share_qr">مشاركة رمز الـ QR</string> <string name="max">الأعلى</string> <string name="current">الحالي</string> <string name="tei">TEI</string> <string name="teis">TEIs</string> - <string name="limit_by_organisation_unit">ضع حداً حسب الوحدة التنظيمية</string> - <string name="limit_by_program">ضع حداً حسب البرنامج</string> - <string name="programs_list">قائمة البرنامج</string> <string name="wipe_data">إعادة تعيين بيانات التطبيق و التكوين</string> - <string name="add_relationship_error">من غير الممكن إضافة هذه العلاقة</string> <string name="warning_error_on_complete_title">تحقق من هذا!</string> - <string name="warning_on_complete_title">تحذير</string> - <string name="error_on_complete_title">خطأ</string> <string name="save">حفظ</string> <string name="reserved_value">القيم المحجوزة</string> - <string name="downloaded_confirm">هل تريد إضافة المزيد من البيانات من رمز QR؟</string> - <!--ABOUT--> <string name="about_app">إصدار التطبيق: %s</string> <string name="about_sdk">إصدار SDK: %s</string> @@ -351,131 +221,43 @@ <string name="about_dev">يتم تطويره وصيانته عبر مشروع <a href="https://www.dhis2.org/">DHIS2</a>، وهو جزء من جامعة أوسلو ، <a href="https://www.mn.uio.no/ifi/english/">قسم المعلوماتية</a>.</string> <string name="about_contact">لمزيد من المعلومات أو الأسئلة حول هذا التطبيق ، يرجى الكتابة إلى <a href="mailto:android@dhis2.org">android@dhis2.org</a></string> - <string name="login_error_null_pass">كلمة المرور مفقودة. يرجى ملء هذا الحقل.</string> - <string name="login_error_null_username">اسم المستخدم مفقود. يرجى ملء هذا الحقل.</string> - <string name="login_error_dhis_version">يقوم هذا الخادم بتشغيل إصدار dhis مختلف عن 2.29. قم بتحديث إصدار الخادم الخاص بك أو استخدم بيئة الاختبار للمتابعة.</string> - <string name="login_error_dhis_version_v2">هذا الخادم يقوم بتشغيل إصدار dhis يختلف عن %s. قم بتحديث إصدار الخادم الخاص بك أو استخدم بيئة الاختبار للمتابعة.</string> - <string name="login_error_unsuccessful_response">حدث خطأ ما. يرجى التحقق من صحة عنوان url للخادم واسم المستخدم وكلمة المرور وحاول مرة أخرى.</string> - <string name="login_error_error_response">تعذر على الخادم إكمال هذا الطلب.</string> - <string name="login_error_default">حدثت مشكلة أثناء محاولة تسجيل الدخول إلى الخادم.</string> - <string name="login_error">خطأ في تسجيل الدخول</string> - <string name="missing_mandatory_fields">بعض الحقول الإلزامية مفقودة</string> - <string name="online_search_unexpected">خطأ غير متوقع أثناء البحث عبر الإنترنت</string> - <string name="online_search_parsing_error">خطأ أثناء تحليل النتائج</string> - <string name="online_search_error">أعاد البحث عبر الإنترنت خطأ</string> - <string name="online_search_response_error">حدث خطأ في الخادم</string> <string name="search_program_not_selected">حدد برنامجاً لتمكين التسجيل</string> <string name="search_access_error">ليس لديك الإذن المطلوب</string> - <string name="feature_unavaible">هذه الوظيفة ليست جاهزة بعد.</string> - <string name="relationship_label_error">خطأ في الحصول على تسمية العلاقة</string> <string name="all_tei_type">كل %s</string> <string name="invalid_phone_number">هذه ليست صيغة رقم هاتف سليمة</string> - <string name="invalid_email">هذه ليست صيغة بريد إلكتروني سليمة</string> - <string name="invalid_negative_number">يُسمح فقط بالأرقام السالبة</string> <string name="invalid_possitive_zero">يُسمح فقط بالأرقام الموجبة</string> - <string name="invalid_possitive">يُسمح فقط بالأرقام الموجبة</string> - <string name="invalid_interval">يُسمح فقط بقيمة بين 0 و 1</string> - <string name="invalid_percentage">يُسمح فقط بقيمة بين 0 و 100</string> - <string name="date_dialog_tigle">حدد التواريخ للتصفية</string> <string name="select_option">تحديد الخيار</string> - <string name="issue_reported">تم الإبلاغ عن المشكلة</string> - <string name="dialog_generate_new_event">توليد حدث جديد</string> - <string name="message_generate_new_event">هل تريد إنشاء حدث جديد</string> <string name="event_completed_title">اكتملت الأحداث</string> <string name="event_completed_message">اكتمال جميع الأحداث في هذا البرنامج. هل ترغب أيضاً في تعيين البرنامج كمغلق؟</string> - <string name="complete_enrollment_message">هل ترغب أيضاً في تعيين هذا التسجيل كمكتمل؟</string> <string name="complete_enrollment_message_V2">هل ترغب في إكمال %s أيضاً؟</string> <string name="check_event">تحقق</string> <string name="menu_home">الرئيسية</string> <string name="appwidget_text">مثال</string> - <string name="add_widget">إضافة أداة</string> <string name="showHelp">إظهار المساعدة</string> - <string name="tuto_settings_1">مزامنة بياناتك...</string> - <string name="tuto_settings_2">...التكوين الخاص بك...</string> - <string name="tuto_settings_3">...تعيين عدد السجلات التي يتم تحميلها من الخادم ...</string> - <string name="tuto_settings_reserved">التحقق من وإدارة عدد القيم المحجوزة المتبقية</string> - <string name="tuto_settings_errors">تحقق مما إذا فشل الاتصال بالخادم</string> - <string name="tuto_settings_reset">حرر بعض المساحة في الذاكرة</string> - <string name="tuto_settings_4">... أو احذف كل شيء للبدء من جديد.</string> - <string name="tuto_search_1_v2">ابحث عن الكيانات الخاصة بك المحفوظة في جهازك وفي خادم الإنترنت.</string> - <string name="tuto_search_2">يمكنك التبديل إلى برامج أخرى</string> - <string name="tuto_search_3_v2">بحث أو إضافة كيانات جديدة. تحتاج إلى البحث قبل أن تتمكن من إضافة أي جديد!</string> - <string name="tuto_search_4_v2">انقر هنا لتنظيف الحقول وإعادة البحث.</string> <string name="tuto_dashboard_1">هذه لوحة معلومات الكيان المسجل</string> <string name="tuto_dashboard_2">الإطلاع على المعلومات الخاصة بالكيانات...</string> - <string name="tuto_dashboard_3">...مشاركة المعلومات عبر QR أو SMS...</string> - <string name="tuto_dashboard_4">...أو ضع علامة على الكيان للمتابعة</string> - <string name="tuto_dashboard_5">انقر لإنشاء أو جدولة حدث أو الإحالة إلى وحدة تنظيمية أخرى.</string> <string name="tuto_dashboard_6">هنا سترى جميع الأحداث. انقر لرؤية تفاصيل حدث.</string> <string name="tuto_dashboard_7">تنقل خلال القائمة لإضافة العلاقات أو مشاهدة المؤشرات أو كتابة الملاحظات.</string> - <string name="tuto_dashboard_8">انقر لرؤية جميع التسجيلات أو إنشاء تسجيل جديد.</string> - <string name="tuto_tei_event_1">انقر لحذف هذا الحدث. لا يمكن التراجع عن هذا الإجراء.</string> - <string name="tuto_tei_event_2">إكمال الحدث.</string> - <string name="tuto_program_event_1">سيتم سرد جميع الأحداث المتعلقة بهذا البرنامج هنا.</string> - <string name="tuto_program_event_2">انقر لإضافة حدث جديد</string> <string name="tuto_event_initial_new_1">أدخل جميع البيانات لإنشاء الحدث</string> <string name="tuto_event_initial_1">انقر للتحقق من حالة إكتمال الحدث</string> - <string name="tuto_event_summary">انقر لإكمال أو لإعادة فتح حدث</string> - <string name="tuto_main_7">قراءة وتخزين المعلومات من أجهزة أخرى عبر QR</string> - <string name="tuto_main_8">مزامنة بياناتك مع الخادم</string> - <string name="tuto_main_9">حظر العمل برمز مكون من 4 أرقام. لا تنس الرمز الخاص بك!</string> - <string name="tuto_main_10">قم بتسجيل الخروج لتغيير المستخدم أو الخادم. ستتمكن من تسجيل الدخول مرة أخرى حتى إذا لم يكن هناك اتصال بالإنترنت.</string> - <string name="text_plus_colon">%s:</string> <string name="relationships">العلاقات</string> <string name="empty_tei_add">لا توجد أحداث مسجلة، انقر على \"+\" لإضافة حدث جديد.</string> - <string name="empty_tei_no_add">لا توجد أحداث مسجلة</string> <string name="qr_data_values">قيم البيانات</string> <string name="info">معلومات</string> <string name="qr_no_id_error">تعذر قراءة رقم التعريف هذا</string> <string name="delete_local_data">حذف البيانات المحفوظة محلياً في هذا الجهاز</string> <string name="dashboard_overview">نظرة عامة</string> - <string name="dashboard_relationships">العلاقات</string> - <string name="dashboard_indicators">المؤشرات</string> - <string name="dashboard_analytics">التحليلات</string> <string name="empty_indicators">لا توجد مؤشرات لهذا البرنامج.</string> - <string name="dashboard_notes">الملاحظات</string> - <string name="unable_to_complete">غير قادر على الإكمال</string> - <string name="unable_to_save">لا يمكن حفظه</string> - <string name="warnings_in_form">هناك تحذيرات في النموذج</string> - <string name="what_to_do">ماذا تريد ان تفعل؟</string> - <string name="field_errors">تحتوي بعض الحقول على أخطاء. من فضلك، تحقق منها حتى تتمكن من الإكمال</string> <string name="unselect_enrollment">كل التسجيلات</string> <string name="unselect_enrollment_description">عرض لوحة معلومات بجميع البرامج النشطة</string> - <string name="CHECK_SYNC_ERRORS">فتح سجل أخطاء المزامنة</string> <string name="error_dialog_title">سجل أخطاء المزامنة</string> <string name="share_with">مشاركة مع...</string> - <string name="errors_during_sync">فشلت مزامنة التكوين الخاص بك. قد يكون هناك أخطاء في الخادم الخاص بك. انقر هنا للمزيد من المعلومات.</string> - <string name="sectionSelectorPrev">السابق</string> - <string name="sectionSelectorNext">التالي</string> - <string name="event_overview">التفاصيل</string> - <string name="event_indicators">المؤشرات</string> - <string name="event_notes">ملاحظات</string> - <string name="complete_add_new"><![CDATA[إكمال وإضافة جديد]]></string> - <string name="complete_later">الإكمال لاحقاً</string> - <string name="finish_add_new"><![CDATA[إنهاء وإضافة جديد]]></string> - <string name="finish">إنهاء</string> - <string name="error_fields_title">الحقول التي بها أخطاء</string> - <string name="error_fields_events">تحتوي بعض الحقول على أخطاء. لم يتم حفظها. يرجى التحقق منها.</string> <string name="unique_warning">يجب أن تكون القيمة فريدة، يوجد تعارض تكرار لنفس القيمة. لم يتم الحفظ. يرجى التحقق.</string> - <string name="unique_coincidence_found">وجد تعارض في حقل ذو قيمة فريدة. لحفظ التسجيل، يرجي التحقق من النموذج.</string> <string name="please_wait">الرجاء الانتظار</string> <string name="skip">تخطى</string> - <string name="reschedule">اعادة جدولة</string> <string name="no_intructions">لا توجد معلومات عن هذه الشاشة</string> - <string name="event_overdue">متأخر</string> - <string name="unsupported_program_rule">هناك قاعدة برنامج واحدة غير معتمدة. يرجى زيارة التوثيق للتحقق</string> - <string name="empty_description">لا توجد معلومات عن هذا الحقل</string> - <string name="biometrics_dialog_title">إعتمادات فارغة</string> - <string name="biometrics_first_use_text">لتتمكن من تسجيل الدخول باستخدام ماسح بصمة الإصبع، تحتاج أولاً إلى تسجيل الدخول بإستخدام الطريقة الافتراضية</string> - <string name="biometrics_security_title">الأمن البيومتري</string> - <string name="biometrics_login_title">تسجيل الدخول السريع</string> - <string name="biometrics_login_text">هل ترغب في استخدام بصمة إصبعك أو طريقة بيومترية أخرى لتسجيل الدخول؟</string> - <string name="tab_tables">جداول</string> - <string name="table">الجدول</string> - <string name="login_https">https://</string> <string name="delete_local_data_message">سيتم فقدان البيانات التي لم يتم مزامنتها. هل تريد حقاً المتابعة؟</string> - <string name="local_data_accept">قبول</string> <string name="delete_local_data_error">تعذر حذف البيانات. يرجى اعادة المحاولة.</string> <string name="delete_local_data_done">انتهاء عملية حذف البيانات المحلية بنجاح.</string> <string name="org_unit_selection_warning">يجب تحديد وحدة تنظيمية واحدة على الأقل</string> @@ -498,33 +280,16 @@ <string name="state_uploading">رفع</string> <string name="state_relationship">العلاقة</string> <string name="sent_by_sms">مرسل عن طريق sms</string> - <string name="no_conflicts_message">لا توجد أي تعارضات لهذا البرنامج</string> - <string name="network_unavailable_sms">اتصال الشبكة غير متاح ، ولكن يبدو أن هناك خدمات هاتفية - يمكنك استخدام الرسائل القصيرة.</string> - <string name="network_unavailable">اتصال الشبكة غير متوفر.</string> <string name="action_close">إغلاق</string> <string name="tuto_main_11">الآن يمكنك التحقق من معلومات المزامنة بالضغط هنا</string> - <string name="no_conflicts_update_message">يتم تخزين هذه البيانات في جهازك فقط، ولم يتم مزامنتها مع الخادم.</string> - <string name="no_conflicts_synced_message">لديك آخر التحديثات حتى الآن! كل بياناتك تم ارسالها إلى السيرفر</string> <string name="relationship_error_recursive">لا يمكنك ربط سجل مع نفسه</string> - <string name="unblock_session">رفع الحظر عن الجلسة</string> - <string name="data_set_complete">مكتمل</string> - <string name="data_set_open">مفتوح</string> - <string name="unsupported_value_type">نوع القيمة غير مدعوم</string> <string name="change_calendar_view">تغيير طريقة عرض التقويم</string> - <string name="data_every_fifteen_minutes">15 دقيقة</string> - <string name="data_every_hour">كل ساعة</string> - <string name="data_every_day">يومي</string> - <string name="data_every_week">أسبوعي</string> - <string name="period_week">أسبوع</string> - <string name="sync_setting">إعداد المزامنة: %s</string> <string name="relationship_without_enrollment">السجل الذي تحاول الوصول إليه ليس لديه تسجيل. لا يمكنك الوصول إلى لوحة المعلومات.</string> <string name="formatting_error">خطأ في التنسيق</string> <string name="dashboard_menu_delete_tei_v2">حذف %s</string> <string name="delete_authority_error">ليس لديك الصلاحية لحذف هذا السجل</string> - <string name="validation_url">هذا ليس عنوان url صالحاً</string> <string name="adjusting_form">تسوية وضبط النموذج</string> - <string name="sms_receiver_number">رقم المستلم</string> <string name="sms_amount_question">هل تقبل بإرسال %d رسالة؟</string> <string name="sms_sending">ارسال %1$d/%2$d</string> <string name="sms_waiting_amount_confirm">مقدار انتظار التأكيد - %d</string> @@ -542,51 +307,29 @@ <string name="sms_error_no_gateway_set">لم يتم تعيين بوابة عبور sms</string> <string name="sms_error_no_user_login">المستخدم لم يقم بتسجيل الدخول</string> <string name="sms_error_module_disabled">وحدة الرسائل القصيرة غير مفعلة</string> - <string name="sms_error_ongoing_sunmission">جاري إرسال رسالة SMS أخرى</string> <string name="sms_metadata_empty">لم تبدأ وحدة الرسائل القصيرة، لم يتم العثور على البيانات الوصفية المطلوبة</string> - <string name="sms_completed">مكتمل</string> <string name="sms_count_error">لم يتم قبول عدد الرسائل القصيرة</string> <string name="sms_state_started">بدء إرسال الرسالة القصيرة</string> <string name="sms_state_converted">تم قراءة البيانات وتحويلها. الرقم المعرف للإرسال: %d</string> - <string name="sms_general_error">خطأ في إرسال الرسالة القصيرة</string> <string name="sms_title_enrollment">تسجيل وضم TEI عبر SMS</string> <string name="sms_title_event">إرسال الحدث sms</string> <string name="sms_title_data_set">إرسال حزمة البيانات SMS</string> - <string name="sms_bar_state_starting">البدء</string> - <string name="sms_bar_state_sending">قيد العمل</string> - <string name="sms_bar_state_sent">تم الإرسال</string> - <string name="sms_bar_state_failed">فشل</string> - <string name="start_sync_granular">بدء المزامنة</string> <string name="syncing">مزامنة...</string> - <string name="end_sync_granular">اكتمال عملية المزامنة</string> - <string name="error_sync">حدث خطأ أثناء المزامنة.</string> - <string name="error_sync_check_logs">حدث خطأ أثناء المزامنة. انقر هنا للتحقق من سجلات الأخطاء</string> - <string name="cancel_sync">تزامن ملغي.</string> <string name="copied_text">تم النسخ</string> - <string name="image_selected">تم تحديد الصورة</string> - <string name="show_in_map">إظهار على الخريطة</string> - <string name="show_list">إظهار القائمة</string> <!--region TRACKER IMPORT CONFLICT MESSAGES--> - <string name="value_required_but_not_provided">%s إلزامي ولكن لم يتم توفيره.</string> - <string name="polygon_captured">تم التقاط المضلع</string> <string name="polygon">مضلع</string> <!--endregion--> - <string name="fingerprint_title">البصمة</string> - <string name="fingerprint_message">من فضلك ، ضع إصبعك في قارئ بصمة الإصبع الخاص بك.</string> <string name="security_title">الأمان</string> <string name="security_rooted_message">لأسباب أمنية ، لا يُسمح باستخدام هذا الإصدار من التطبيق في الأجهزة الـ rooted. يرجى استخدام النسخة التدريبية.</string> - <string name="fix_error">هناك بعض الأخطاء. يرجى إصلاحها قبل المتابعة.</string> <string name="filters_active">تطبيق عوامل تصفية</string> <string name="filters_disabled">لم يتم تطبيق عوامل تصفية</string> <string name="filters_title_period">الفترة الزمنية</string> <string name="filters_title_org_unit">الوحدة التنظيمية</string> - <string name="filters_title_sorting">جار الفرز</string> - <string name="filters_title_status">الحالة</string> <string name="filters_title_state">مزامنة</string> <string name="filters_title_assigned">تم تعيينه لي</string> <string name="filter_period_today">اليوم</string> @@ -601,8 +344,6 @@ <string name="filter_period_form_to">من - إلى</string> <string name="filter_period_other">أخرى</string> <string name="filter_period_any">في أي وقت</string> - <string name="data_values_error_sync_message">فشلت المزامنة. تحقق من قيم البيانات وحاول اصلاح المشكلة ثم حاول مرة أخرى. إذا استمرت المشكلة بالظهور اتصل بمسؤول النظام</string> - <string name="sms_synced_message">تم إرسال هذه البيانات إلى الخادم ولكن ليس مضموناً أنه تم تخزينها</string> <string name="filter_event_status_open">المفتوحة</string> <string name="filter_event_status_schedule">المجدولة زمنياً</string> <string name="filter_event_status_overdue">المتأخرة</string> @@ -618,7 +359,6 @@ <string name="sms_empty_gateway">لايمكن ترك بوابة عبور رسائل sms فارغ</string> <string name="granular_sync_enrollments_empty">لا توجد تسجيلات ليتم رفعها</string> <string name="granular_sync_unsupported_task">هذه الـ convertTask غير مدعومة</string> - <string name="disable_pin_locked">لا تظهر قفل الشاشة مرة أخرى</string> <string name="set_pin">تعيين رمز</string> <string name="conflict">تعارض</string> <string name="change_event_date">غير التاريخ</string> @@ -643,11 +383,7 @@ <string name="choose_ou">إختر وحدة تنظيمية</string> <string name="enter_url">أدخل رابط url</string> <string name="enter_value">أدخل قيمة</string> - <string name="choose_image">اختر صورة</string> - <string name="scan_code">مسح الرمز</string> - <string name="choose_option">إختر خياراً</string> <string name="reserved_values_hint">القيم المحجوزة التي يتم تنزيلها لكل سمة TEI</string> - <string name="settings_reserved_values_message">القيم المحجوزة التي يتم تنزيلها لكل سمة TEI</string> <string name="reserved_values_left">بقي %s من القيم المحجوزة</string> <string name="manage_reserved_values_button">إدارة القيم المحجوزة</string> <string name="events_to_download">الأحداث التي يتم تنزيلها</string> @@ -667,39 +403,19 @@ <string name="filter_sync_not_synced">الغير متزامنة</string> <string name="filter_sync_error">تحوي أخطاء في المزامنة</string> <string name="filter_sync_sms">التي تم مزامنتها عبر SMS</string> - <string name="dataset_overview">التفاصيل</string> - <string name="dataset_comments">التعليقات</string> <string name="saved">تم الحفظ!</string> - <string name="run_validation_rules">هل تريد التحقق من جودة البيانات؟</string> - <string name="validation_success_title">كل شيء يبدو جيدا!</string> - <string name="mark_dataset_complete">هل تريد أيضاً تعيين حزمة البيانات كمكتملة؟</string> - <string name="dataset_completed">تعيين كمكتمل</string> - <string name="name">الإسم</string> - <string name="formula">الصيغة</string> - <string name="complete_anyway">إكمال على أية حال</string> <string name="fk_message">%s%s مفقود من %s%s</string> <string name="filters_title_event_status">حالة الحدث</string> - <string name="enrollment_date">تاريخ التسجيل</string> <string name="dataset_empty_list_can_create">لا توجد بيانات. انقر فوق \"+\" لإضافة سجل جديد</string> <string name="dataset_emtpy_list_can_not_create">لا توجد بيانات. ليس لديك إذن بإضافة سجلات جديدة.</string> <string name="validation_rules_empty_description">لم يتم تعيين وصف أو تعليمات</string> <string name="validation_rules_data_to_review">بيانات للمراجعة</string> - <string name="dataset_saved_completed">محفوظ ومكتمل</string> <string name="status_change_error_active_exist">يوجد مسبقاً تسجيل نشط</string> <string name="enrollment_status_active">مفتوح</string> <string name="enrollment_status_completed">مكتمل</string> <string name="enrollment_status_cancelled">تم الإلغاء</string> - <string name="event_data">بيانات</string> <string name="download_tei_error">تعذر تنزيل %s المحددة</string> - <string name="completed_by">تم الإكمال من قبل %s:%s</string> - <string name="updated_time">تم التحديث: %s</string> - <string name="action_done">تم</string> - <string name="validation_internal_error_datasets">لم نتمكن من التحقق من جودة البيانات. تواصل مع مديرك</string> - <string name="are_you_sure">هل أنت متأكد؟</string> - <string name="reopen_question">هل تريد إعادة فتح حزمة البيانات؟</string> <string name="filters_title_date">التاريخ</string> - <string name="filters_title_event_date">بيانات الحدث</string> - <string name="tei_type_has_no_attributes">%s لا يملك أي سمات عامة، يرجى تحديد برنامج</string> <string name="privacy_policy_title">سياسة الخصوصية</string> <string name="open_privacy_policy">إنقر هنا للإطلاع على <a href=""> سياسة الخصوصية الخاصة بنا</a></string> <string name="coordinates_error">قيم الإحداثيات غير صالحة</string> @@ -707,15 +423,8 @@ <string name="security_debugger_message">لأسباب أمنية ، لا يُسمح باستخدام هذه النسخة من التطبيق مع adb. الرجاء استخدام نسخة هذا التطبيق المخصصة للتدريب.</string> <string name="customactivityoncrash_error_activity_restart_app">رجوع</string> - <string name="customactivityoncrash_error_activity_close_app">إغلاق التطبيق</string> - <string name="customactivityoncrash_error_activity_error_details">تفاصيل أكثر</string> - <string name="customactivityoncrash_error_activity_error_details_title">تفاصيل أكثر</string> - <string name="customactivityoncrash_error_activity_error_details_close">إغلاق</string> <string name="customactivityoncrash_error_activity_error_details_copy">نسخ إلى الحافظة</string> - <string name="customactivityoncrash_error_activity_error_details_copied">تم النسخ إلى الحافظة</string> - <string name="customactivityoncrash_error_activity_error_details_clipboard_label">معلومات الخطأ</string> <string name="metada_first_sync_error">وجدنا خطأ عند المزامنة مع الخادم الخاص بك. شارك الخطأ مع مسؤول النظام إن أمكن.</string> - <string name="error_init_session">لم نتمكن من بدء الجلسة مع المستخدم الخاص بك</string> <string name="enrollment_date_edition_warning">هناك أحداث مخطط لها لن تتم إعادة جدولتها</string> <string name="section_charts">المخططات البيانية</string> <string name="navigation_list_view">عرض</string> @@ -763,41 +472,25 @@ <string name="section_feedback">التغذية الراجعة</string> <string name="section_indicators">المؤشرات</string> <string name="value">القيمة</string> + <string name="camera_permission_denied">تم رفض إذن الكاميرا.\n تحتاج إلى تمكينها لاستخدام هذه الميزة.</string> <string name="section_charts_indicators">الرسوم البيانية والمؤشرات</string> <string name="take_photo">التقط صورة</string> - <string name="from_gallery">اختر من استوديو الصور</string> - <string name="data_set_quality_check_done">تم الإنتهاء!</string> <string name="break_glass_dialog_title">هذا البرنامج محمي</string> <string name="break_glass_hint">صف السبب هنا</string> - <string name="authenticating">تتم المصادقة</string> - <string name="login_error_no_dhis_instance">عنوان url للخادم ليس نسخة dhis</string> - <string name="login_error_bad_credentials">خطأ في الإعتمادات</string> - <string name="login_error_unknown_host">خادم غير معروف</string> - <string name="invalid_integer">يجب أن تكون القيمة عدداً صحيحاً</string> <string name="openid_session_expired">انتهت الجلسة</string> <string name="openid_session_expired_message">لقد انتهت جلستك الحالية. لأسباب أمنية ، ستحتاج إلى تقديم بيانات الاعتماد الخاصة بك مرة أخرى</string> - <string name="dataset_column_default">القيم</string> <string name="week_period_span_default_label">الأسابيع %d %s إلى %s</string> <string name="action_do_not_show_again">لا تظهر مرة أخرى</string> - <string name="coordinate_feature_type_error">لا يمكن تعيين نوع الإحداثيات</string> <string name="filter_follow_up_label">تمت المتابعة %s</string> - <string name="wrong_date_format">لا يمكن تحليل %s كتاريخ</string> <string name="update_field_error">لا يمكن تحديث هذا الحقل. حاول مرة اخرى</string> - <string name="available">متوفر</string> <string name="blocked_by_completion">هذه البيانات غير قابلة للتحرير لأنه تم تعليمها على أنها مكتملة</string> <string name="edition_expired">هذه البيانات غير قابلة للتعديل لأن وقت إصدارها قد انتهى</string> <string name="edition_no_write_access">ليس لديك إذن لتحرير هذه البيانات</string> <string name="event_date_not_in_orgunit_range">هذه البيانات غير قابلة للتعديل لأنه تم اغلاق الوحدة التنظيمية</string> <string name="edition_no_catcombo_access">ليس لديك إذن لتحرير هذه البيانات</string> - <string name="edition_orgunit_capture_scope">لا يمكنك تحرير البيانات من هذه الوحدة التنظيمية</string> - <string name="reload_list">إعادة البحث</string> + <string name="edition_orgunit_user_scope">لا يمكنك تحرير البيانات من هذه الوحدة التنظيمية</string> <string name="error_tei_online_search_title">البحث عبر الإتصال بالسيرفر عن طريق الإنترنت ارجع الرسالة التالية:</string> - <string name="program_rules_loop_warning_title">تحذير قواعد البرنامج</string> - <string name="granular_sync_refresh">إعادة التجديد</string> - <string name="unknown_date">غير معروف</string> - <string name="granular_sync_refresh_title">قم بتحديث كافة البيانات</string> <string name="delete_account">حذف الحساب</string> - <string name="manage_accounts">إدارة الحسابات</string> <string name="main_menu_troubleshooting">استكشاف أخطاء التكوين وإصلاحها</string> <string name="troubleshooting_language_title">اللغة</string> <string name="troubleshooting_language_description">انقر هنا لتغيير لغة التطبيق</string> @@ -813,8 +506,6 @@ <string name="search_no_results">لا توجد نتائج لهذا البحث</string> <string name="search_too_many_results">نتائج كثيرة جدًا</string> <string name="search_too_many_results_message">حاول تغيير البحث لتضييق نطاق النتائج.</string> - <string name="search_create_new">إنشاء جديد</string> - <string name="search_min_attributes_message">من الضروري إدخال سمات %s على الأقل للبحث</string> <string name="action_ok">موافق\!</string> <string name="init_search">ابدأ بحثًا للعثور على أي %s</string> <string name="search_or_create">يمكنك البحث أو إنشاء %s جديد</string> @@ -823,7 +514,6 @@ <string name="missing_error_fields_events">بعض الحقول بها أخطاء ولم يتم حفظها. \nهل تريد مراجعة النموذج؟</string> <string name="event_can_be_completed">هل تريد وضع علامة على هذا النموذج كمكتمل؟</string> <string name="event_error_on_complete">لديك بعض رسائل الخطأ.\nهل تريد مراجعتها؟</string> - <string name="changes_will_be_discarted">إذا قمت بالخروج الآن سيتم تجاهل التغييرات.</string> <string name="re_opened">أعيد فتحه</string> <string name="account_disable_title">الحساب معطل</string> <string name="account_disable_message">تم تعطيل حسابك من قبل المسؤول.</string> @@ -831,18 +521,7 @@ <string name="customactivityoncrash_error_activity_current_date">التاريخ الحالي: %s</string> <string name="customactivityoncrash_error_activity_device">الجهاز: %s</string> <string name="customactivityoncrash_error_activity_os_version">إصدار نظام التشغيل: %s</string> - <string name="open_details">افتح تفاصيل %s</string> <string name="syncing_resource">مزامنة %s ...</string> - <string name="sms_sync_waiting_for_response">تم إرسال الرسالة القصيرة. في انتظار استجابة الخادم.</string> - <string name="sms_sync_sms_reached_server">تم تأكيد وصول الرسالة القصيرة إلى الخادم. تحديث الحالة</string> - <string name="sms_sync_sms_reached_server_error">لا يمكننا تأكيد وصول الرسالة القصيرة إلى الخادم. تحديث الحالة</string> - <string name="sms_sync_sent">تم إرسال الرسالة القصيرة. تحديث الحالة.</string> - <string name="sms_sync_not_sent">لم يتم إرسال الرسالة القصيرة.</string> - <string name="sms_sync_opening_app">فتح تطبيق الرسائل القصيرة. لا تعدل الرسالة من فضلك.</string> - <string name="sms_sync_manual_confirmation">في انتظار التأكيد اليدوي</string> - <string name="syncing_events">مزامنة الأحداث</string> - <string name="syncing_done">تمت المزامنة</string> - <string name="wrong_pin">دبوس خاطئ</string> <string name="enrolledIn">مسجل في</string> <string name="ownedBy">مملوكة من قبل</string> <string name="sync_dialog_title_not_synced">المزامنة مطلوبة</string> @@ -855,27 +534,10 @@ <string name="sync_dialog_action_send">إرسال</string> <string name="sync_dialog_action_refresh">تحديث</string> <string name="sync_dialog_action_not_now">ليس الان</string> - <plurals name="error_count_label"> - <item quantity="zero">%s الأخطاء</item> - <item quantity="one">%s الخطأ</item> - <item quantity="two">%s الأخطاء</item> - <item quantity="few">%s الأخطاء</item> - <item quantity="many">%s الأخطاء</item> - <item quantity="other">%s الأخطاء</item> - </plurals> - <plurals name="warning_count_label"> - <item quantity="zero">%s التحذيرات</item> - <item quantity="one">%s تحذير</item> - <item quantity="two">%s التحذيرات</item> - <item quantity="few">%s التحذيرات</item> - <item quantity="many">%s التحذيرات</item> - <item quantity="other">%s التحذيرات</item> - </plurals> <string name="software_update">تحديث البرنامج</string> <string name="remind_me_later">في وقت لاحق</string> <string name="download_now">حمّل الآن</string> <string name="check_for_updates">تحقق من وجود تحديثات</string> - <string name="checking_for_updates">التحقق من وجود تحديثات</string> <string name="no_updates">لا توجد تحديثات جديدة</string> <string name="app_version">إصدار التطبيق</string> <string name="not_synced">غير متزامن</string> @@ -897,15 +559,38 @@ <string name="program_stage">مرحلة البرنامج</string> <string name="event">حدث</string> <string name="timeline">الجدول الزمني</string> - <string name="optional">اختياري</string> <string name="show_more">إظهار المزيد</string> <string name="show_less">إظهار أقل</string> <string name="sync">حالة التزامن</string> - <string name="show_fields">إظهار الحقول</string> - <string name="hide_fields">إخفاء الحقول</string> <string name="successful_sync">مزامنة ناجحة</string> <string name="syncing_something">مزامنة %s ...</string> <string name="show_description">إظهار الوصف</string> <string name="hide_description">إخفاء الوصف</string> <string name="use_password">استخدام كلمة المرور</string> - </resources> + <plurals name="error_count_label"> + <item quantity="zero">%s الأخطاء</item> + <item quantity="one">%s الخطأ</item> + <item quantity="two">%s الأخطاء</item> + <item quantity="few">%s الأخطاء</item> + <item quantity="many">%s الأخطاء</item> + <item quantity="other">%s الأخطاء</item> + </plurals> + + <plurals name="warning_count_label"> + <item quantity="zero">%s التحذيرات</item> + <item quantity="one">%s تحذير</item> + <item quantity="two">%s التحذيرات</item> + <item quantity="few">%s التحذيرات</item> + <item quantity="many">%s التحذيرات</item> + <item quantity="other">%s التحذيرات</item> + </plurals> + + <plurals name="settings_specific_programs"> + <item quantity="zero">يوجد %s برامج ذات إعدادات محددة</item> + <item quantity="one">يوجد %s برنامج مع إعدادات محددة</item> + <item quantity="two">يوجد %s برامج ذات إعدادات محددة</item> + <item quantity="few">يوجد %s برامج ذات إعدادات محددة</item> + <item quantity="many">يوجد %s برامج ذات إعدادات محددة</item> + <item quantity="other">يوجد %s برامج ذات إعدادات محددة</item> + </plurals> +</resources> diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 15ac9b5cbaa..1788146de07 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -1,33 +1,16 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!-- Warnings and error messages --> <string name="error">ভুল</string> - <plurals name="error_message"> - <item quantity="one">ভুলগুলো</item> - <item quantity="other">ভুলগুলো</item> - </plurals> - <string name="error_wrong_server_url">ভুল সার্ভার</string> - <string name="add">যোগ করুন</string> <string name="completed">সম্পন্ন</string> <string name="state_error">ভুল</string> - <string name="date">তারিখ</string> + <!--Event Detail--> <string name="due_date">নির্ধারিত তারিখ</string> <string name="settingsTwoFAStatus">অবস্থা</string> - <!--endregion--> - - <string name="enrollmment_date">নিবন্ধনের তারিখ</string> - <!--FORM FRAGMENT--> <string name="report_date">পরিদর্শনের তারিখ</string> - <string name="error_on_complete_title">ভুল</string> - <string name="dashboard_notes">মন্তব্য</string> - <string name="event_notes">মন্তব্য</string> - <string name="sms_completed">সম্পন্ন</string> - <string name="filters_title_status">অবস্থা</string> <string name="filter_event_status_completed">সম্পন্ন</string> - <string name="enrollment_date">নিবন্ধনের তারিখ</string> <string name="filters_title_date">তারিখ</string> <string name="navigation_notes">মন্তব্য</string> <string name="navigation_data_entry">তথ্যের অন্তর্ভুক্তি</string> - <string name="invalid_integer">অবশ্যই সংখ্যা হতে হবে</string> </resources> diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index e8002220ed6..e80cde13ada 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -1,34 +1,13 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!--GENERAL--> <string name="app_name">Dhis2</string> - <string name="logo_text">dhis</string> - <string name="logo_number">2</string> <!-- Warnings and error messages --> <string name="error">هەڵە</string> - <plurals name="error_message"> - <item quantity="one">هەڵە</item> - <item quantity="other">هەڵە</item> - </plurals> - <string name="error_wrong_server_url">بەستەری ڕاژە دروست نییە</string> - <string name="error_wrong_credentials">زانیارییەکان دروست نین</string> - <string name="error_unexpected_error">هەڵەی چاوەڕواننەکراو</string> - <string name="error_internal_server_error">هەڵەی ناوەکیی ڕاژە</string> - <string name="no_value">هیچ نرخێک</string> <string name="no_reserved_values">هیچ نرخێکی دیکەی تەرخانکراو نەما. پەیوەندی بە بەڕێوەبەری سیستەمەکەتەوە بکە</string> - <string name="no_reserved_values_connection">هیچ نرخێکی دیکەی تەرخانکراو نەما. پەیوەندی بە تۆڕەکەوە بکە بۆ دووبارە پڕکردنەوەیان</string> - <string name="errors">هەڵە</string> <string name="something_wrong">هەڵەیەک ڕووی دا</string> <!-- SyncService strings: --> - <string name="sync_now">هاوکاتگەری بکە ئێستا</string> - <string name="sync_text">لەگەڵ ڕاژەکە هاوکاتگەر دەکرێت</string> - <string name="sync_title">هاوکاتگەر دەکرێت</string> - <string name="sync_metadata">داتا پەیوەندیدارەکان</string> <string name="sync_events">ڕووداوەکان</string> - <string name="sync_tei">پێکهاتە چاودێریکراوەکان</string> - - <string name="sync_complete_title">تەواوکرا</string> - <string name="sync_complete_text">هاوکاتگەریکردن تەواو بوو</string> <string name="sync_error_title">هەڵە لە هاوکاتگەری</string> <string name="sync_error_text">هەڵەیەک لە کاتی هاوکاتگەری کردن ڕووی دا. تکایە دووبارەی بکەوە.</string> @@ -39,46 +18,35 @@ <string name="active">چاڵاک</string> <string name="state_error">هەڵە</string> + + <!--Completion--> + + <!--Event initial--> <string name="update">نويَ كردنةوة</string> - <string name="date">داتا</string> - <string name="new_event">رووداوي نوي</string> <string name="cancel">لابردن</string> <string name="delete">سرينةوة</string> - <string name="total">كؤي طشتي</string> + <!--TEI DASHBOARD--> <string name="edit">دةستكاري</string> <string name="done_task">ماڵةوة</string> <string name="wipe_data_ok">پەسندکردن</string> <string name="wipe_data_no">لابردن</string> <string name="SYNC_MANAGER">ريكخستن</string> <string name="settingsTwoFAStatus">پێگە</string> + <!--endregion--> + <!-- SEARCH OPTION SET --> <string name="search_optionset">طةران</string> - <!--AGE CUSTOM VIEW--> - <string name="hint_day">رۆژەکان</string> - <string name="hint_month">مانگەکان</string> - <string name="hint_year">ساڵەکان</string> - <string name="date_dialog_clear">باك</string> <string name="period">ماوة</string> + <!-- RELATIONSHIPS --> <string name="next">داهاتوو</string> - <string name="SAVE">خةزن كردن</string> <string name="button_ok">تةواو</string> <string name="qr_events">ڕووداوەکان</string> <string name="qr_relationships">پەیوەندیەکان</string> <string name="about">دةربارةي</string> - <string name="max">زیاترین</string> - <string name="error_on_complete_title">هەڵە</string> <string name="save">خةزن كردن</string> <string name="menu_home">ماڵةوة</string> - <string name="dashboard_relationships">پەیوەندیەکان</string> - <string name="dashboard_indicators">نیشاندەر</string> - <string name="event_indicators">نیشاندەر</string> - <string name="finish">تەواکردن</string> - <string name="local_data_accept">پەسندکردن</string> <string name="action_close">داخستن</string> - <string name="data_set_complete">تەواوبکە</string> - <string name="sms_completed">تەواوبوو</string> <string name="filters_title_period">ماوة</string> - <string name="filters_title_status">پێگە</string> <string name="filter_period_today">ئەمڕۆ</string> <string name="filter_period_this_week">ئەم هەفتەیە</string> <string name="filter_period_last_week">هەفتەی پێشووتر</string> @@ -87,18 +55,12 @@ <string name="filter_event_status_completed">تەواوبوو</string> <string name="go_back">بؤ دواوة</string> <string name="filter_sync_error">هەڵە لە هاوکاتگەری</string> - <string name="dataset_comments">کۆمێنتەکان</string> <string name="enrollment_status_completed">تەواوبکە</string> - <string name="action_done">تةواو كرا</string> <string name="filters_title_date">بەروار</string> - <string name="filters_title_event_date">بيركاري داتا</string> <string name="customactivityoncrash_error_activity_restart_app">بؤ دواوة</string> - <string name="customactivityoncrash_error_activity_error_details_close">داخستن</string> <string name="navigation_programs">بةرنامةكان</string> <string name="section_feedback">ڕاووبۆچون</string> <string name="section_indicators">نیشاندەر</string> - <string name="value">بةها</string> - <string name="login_error_bad_credentials">زانیارییەکان دروست نین</string> <string name="sync_dialog_title_syncing">هاوتاکردن</string> <string name="programs">بةرنامةكان</string> <string name="sync_error">هەڵە لە هاوکاتگەری</string> diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 3adb854eeac..b444ccbb248 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -1,69 +1,32 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!--GENERAL--> <string name="app_name">Dhis2</string> - <string name="logo_text">dhis</string> - <string name="logo_number">2</string> <!-- Warnings and error messages --> <string name="error">Chyba</string> - <plurals name="error_message"> - <item quantity="one">Chyba</item> - <item quantity="few">Chyby</item> - <item quantity="many">Chyb</item> - <item quantity="other">Chyb</item> - </plurals> - <string name="error_wrong_server_url">Chybné URL serveru</string> - <string name="error_wrong_credentials">Chybné registrační údaje</string> - <string name="error_unexpected_error">Neočekávaná chyba</string> - <string name="error_internal_server_error">Interní chyba serveru</string> - <string name="no_value">žádná hodnota</string> <string name="no_reserved_values">Neexistují žádné další rezervované hodnoty. Obraťte se na správce systému</string> - <string name="no_reserved_values_connection">Neexistují žádné další rezervované hodnoty. Připojte se k síti a doplňte je</string> - <string name="errors">chyby</string> <string name="something_wrong">Něco se pokazilo</string> <!-- SyncService strings: --> - <string name="sync_now">Synchronizovat nyní</string> - <string name="sync_text">Synchronizace se serverem</string> - <string name="sync_title">Probíhá synchronizace</string> - <string name="sync_metadata">Metadata</string> <string name="sync_events">Události</string> - <string name="sync_tei">Trasované entity</string> - - <string name="sync_complete_title">Dokončeno</string> - <string name="sync_complete_text">Synchronizace dokončena</string> <string name="sync_error_title">Chyba synchronizace</string> <string name="sync_error_text">Během synchronizace došlo k chybě. Zkuste to prosím znovu.</string> <string name="sync_incomplete_error_text">Synchronizace dokončena, ale neobdrželi jsme potvrzení serveru pro všechny záznamy. Tyto záznamy jsou v aplikaci stále označeny jako „offline“. Doporučujeme synchronizaci zopakovat.</string> <string name="metadata_sync_error">CHYBA: V procesu synchronizace se něco pokazilo. Pokud máte připojení, zkuste to prosím znovu. Pokud chyba přetrvává, obraťte se na správce.</string> <string name="data_sync_warning_v2">Ve vašich datech jsou rozpory. Synchronizujte prosím svou konfiguraci, zkontrolujte svá data a zkuste synchronizaci provést znovu.</string> - <string name="data_sync_warning_program">UPOZORNĚNÍ: Většina vašich dat je synchronizována, ale některá pole vykazovala konflikty. Synchronizujte svou konfiguraci a zkuste to znovu. Pokud varování přetrvává, zkontrolujte jejich stav synchronizace: programy, TEI a události s konflikty jsou označeny jako @.</string> <string name="data_sync_error_v2">Některá vaše data se nepodařilo synchronizovat.</string> - <string name="server_sync_error">Došlo k chybě a server neodpovídá. Kontaktujte svého správce.</string> - <string name="search_result_text">Nalezeno %s výsledků</string> - <string name="add_new">Přidat nový</string> - <string name="add">Přidat</string> <string name="enter_event_data">Zadat %s</string> <string name="enter_cancel_event_data">Zadat / přeskočit %s</string> - <string name="schedule_new">Naplánovat nový</string> <string name="referral">Doporučení</string> <!-- Login --> - <string name="url_hint">URL serveru</string> - <string name="user_hint">Uživatelské jméno</string> - <string name="password_hint">Heslo</string> - <string name="log_in_button">Přihlásit se</string> - <string name="unlock_button">Odemkněte relaci</string> <string name="syncing_configuration">Synchronizuje se vaše konfigurace</string> <string name="syncing_data_shortly">Vaše data budou brzy synchronizována</string> <string name="syncing_data">Synchronizace vašich dat</string> <string name="configuration_ready">Vaše konfigurace je připravena</string> <string name="data_ready">Vaše data jsou připravena</string> - <string name="configuration_sync_failed">Synchronizace konfigurace selhala</string> - <string name="data_sync_failed">Synchronizace dat selhala</string> <string name="account_recovery">Obnovení účtu</string> - <string name="no_network_to_recover_account">K obnovení účtu je potřeba připojení k síti.</string> <!--PERIOD--> <string name="DAILY">Denně</string> @@ -84,141 +47,88 @@ <string name="enter_text">Zadejte text</string> <string name="enter_long_text">Zadejte dlouhý text</string> <string name="enter_number">Zadejte číslo</string> - <string name="enter_integer">Zadejte celé číslo</string> <string name="enter_negative_integer">Zadejte záporné celé číslo</string> <string name="enter_positive_integer_or_zero">Zadejte kladné celé číslo nebo nulu</string> <string name="enter_positive_integer">Zadejte kladné celé číslo</string> - <string name="filter_options">Možnosti filtru</string> <string name="choose_date">Zvolte datum</string> - <string name="change_calendar">Změnit kalendář</string> <!-- Status --> - <string name="program_completed">Program dokončen</string> - <string name="program_inactive">Program neaktivní</string> <string name="event_open">Otevřít</string> <string name="event_not_completed">Není dokončeno</string> <string name="event_completed">Událost dokončena</string> <string name="read_only">Pouze ke čtení</string> - <string name="finish_and_complete">Hotovo a dokončit</string> <string name="completed">Dokončeno</string> <string name="cancelled">Zrušeno</string> <string name="re_open">Znovu otevřít</string> - <string name="re_open_form">Znovu otevřít formulář</string> - <string name="activate">Aktivovat</string> <string name="active">Aktivní</string> <!-- State --> <string name="state_synced">Synchronizace</string> <string name="state_to_post">Poslat</string> <string name="state_to_update">Aktualizovat</string> - <string name="state_to_delete">Smazat</string> <string name="state_error">Chyba</string> - <string name="action_sync">SYNCHRONIZOVAT</string> - <string name="action_send">ODESLAT</string> - <string name="action_sync_sms">SYNCHRONIZOVAT SMS</string> <!--Completion--> - <string name="completion">Dokončení</string> <!--Event initial--> - <string name="create">Vytvořit</string> <string name="update">Aktualizovat</string> - <string name="date">Datum</string> <string name="org_unit">Org. jednotka</string> <string name="no_org_units">Pro vybrané datum nejsou k dispozici žádné otevřené organizační jednotky. Vyberte prosím jiné datum nebo jinou organizační jednotku.</string> - <string name="category_option">Možnosti kategorie</string> <string name="latitude">Zeměpisná šířka</string> <string name="longitude">Zeměpisná délka</string> - <string name="new_event">Nová událost</string> - <string name="one_time">Jednou</string> - <string name="permanent">Trvale</string> <!--DataSet initial--> <string name="report_period">Období hlášení zpráv</string> - <string name="cat_option">Možnosti kategorie</string> - <string name="field_required">Pokud nastavíte hodnotu, celý řádek potřebuje k dokončení datové sady všechny hodnoty.</string> - <string name="field_mandatory">Některé požadované hodnoty chybí. K dokončení datové sady je třeba zadat povinné hodnoty.</string> - <string name="field_mandatory_v2">Chybí povinná pole. Chcete-li vyplnit soubor dat, vyplňte je prosím.</string> - <string name="datavalue_saved">Hodnota je uložena!</string> - <string name="there_is_no_available_period">Nejsou k dispozici žádná období k výběru.</string> <!--Event Detail--> <string name="due_date">Poslední termín</string> <string name="next_event">Další %1$s</string> <string name="cat_combo">Kombinace kategorií</string> - <string name="date_default">DD/MM/RRRR</string> <string name="cancel">Zrušit</string> <string name="delete">Smazat</string> - <string name="total">Celkem</string> <string name="most_recent_event_date">Datum poslední události</string> <string name="no_options">K dispozici nejsou žádné možnosti</string> <!--TEI Enrollment list--> <string name="enrollment_list">Seznam zápisů</string> <string name="active_programs">Aktivní programy</string> - <string name="to_enroll_programs">Programy k zápisu</string> <string name="enroll">Zapsat</string> - <string name="last_visit">Poslední návštěva:</string> - <string name="apply">použít</string> <!--TEI DASHBOARD--> - <string name="see_details">Prohlednout detaily</string> - <string name="view_more">UKÁZAT VÍCE</string> <string name="edit">Upravit</string> - <string name="follow_up">Následovat</string> - <string name="follow_up_enabled">Sledování povoleno</string> - <string name="follow_up_disabled">Sledování zakázáno</string> <string name="deactivate">Deaktivovat</string> <string name="program_not_allow_events">Tento program neumožňuje více událostí</string> <!--DONE TASKS--> - <string name="events_no_data">Nejsou data</string> <string name="events">události</string> <string name="done_task">Úvodní strana</string> - <string name="app_info">Info o aplikaci</string> <string name="log_out">Odhlášení</string> - <string name="block_session">Blokovat relaci</string> <string name="show_more_events">Zobrazit %s dalších...</string> <string name="show_less_events">Zobrazit méně...</string> <!-- SYNC --> - <string name="a_minute">1 minuta</string> - <string name="fifteen_minute">15 minut</string> <string name="thirty_minutes">30 minut</string> <string name="a_hour">1 hodina</string> <string name="every_6_hours">6h</string> <string name="a_day">1 den (výchozí)</string> <string name="every_12_hours">12h</string> - <string name="Automatic_Sync_Data">Automatická synchronizace dat každých:</string> <string name="Manual">Ručně</string> - <string name="Automatic_Sync_Metadata">Konfigurace automatické synchronizace každých:</string> <string name="a_week">1 týden</string> <string name="sync_max_parameters">Aktuální parametry synchronizace:</string> <string name="sync_default_parameters">Obnovit do základního nastavení</string> + <string name="wipe_data_meesage">Databáze bude smazána.\nBudete požádán o opětovné přihlášení.</string> <string name="wipe_data_ok">Přijmout</string> <string name="wipe_data_no">Zrušit</string> <string name="SYNC_DATA">SYNCHRONIZOVAT Data teď</string> <string name="SYNC_META">SYNCHRONIZOVAT Konfiguraci teď</string> <string name="SYNC_MANAGER">Nastavení</string> - <string name="last_data_sync_date">Poslední synchronizace: %s</string> <string name="last_data_sync">Poslední synchronizace v</string> - <string name="last_metadata_sync_date">Poslední synchronizace: %s</string> <string name="refill_reserved_values">Doplňte</string> - <string name="settings_sms_module_title">SMS modul:</string> <string name="settings_sms_receiver_number">SMS brána</string> <string name="settings_sms_result_sender_number">Odesílatel výsledků SMS</string> <string name="settings_sms_result_timeout">Časový limit výsledku SMS (s)</string> - <string name="settings_sms_result_timeout_hint">vteřin</string> - <string name="settings_sms_result_sender_hint">číslo</string> - <string name="settings_sms_receiver_number_hint">číslo</string> <string name="settings_sms_module_switch">Povolit odesílání SMS</string> <string name="settings_sms_response_wait_switch">Počkejte na odpověď na výsledek SMS</string> - <plurals name="settings_specific_programs"> - <item quantity="one">Je tu %s program se specifickým nastavením</item> - <item quantity="few">Jsou tu %sprogramy se specifickým nastavením</item> - <item quantity="many">Je tu %s programů se specifickým nastavením</item> - <item quantity="other">Jsou tu %s programy se specifickým nastavením</item> - </plurals> <string name="settings_sync_period_v2">Doba synchronizace</string> <string name="settings_limit_scope">Nastavení omezeno</string> <string name="settings_limit_globally">Globálně</string> @@ -237,12 +147,9 @@ <string name="settingsErrorLog_descr">Tento protokol obsahuje všechny chyby způsobené synchronizací vašich dat a metadat.</string> <string name="settingsDeleteLocalData">Odstranit místní data</string> <string name="settingsDeleteLocalData_descr">Všechna data aplikace Capture uložená ve vašem zařízení budou smazána. Data, která nejsou synchronizována se serverem, budou ztracena.</string> - <string name="settingsReset">Resetovat data aplikace a konfiguraci</string> - <string name="settingsReset_descr">Vaše konfigurace a data aplikace uložená v zařízení budou smazána. Budete požádáni o opětovné přihlášení a data, která nejsou synchronizována se serverem, budou ztracena.</string> <string name="settingsSms">SMS nastavení</string> <string name="settingsSms_descr">Zkontrolujte a upravte parametry týkající se brány SMS</string> <string name="settingsCheckVersion">Aktualizace softwaru</string> - <string name="settingsCheckVersionMessage">Software</string> <string name="settingsExportDB">Export databáze</string> <string name="settingsExportDBMessage">Export databáze a její sdílení se správcem</string> <string name="settingTwoFA">Dvoufaktorové ověřování</string> @@ -250,8 +157,6 @@ <string name="settingTwoFADescr">Ověřování můžete povolit nebo zakázat ve dvou krocích.</string> <!--endregion--> - <string name="enrollmment_date">Datum zápisu</string> - <!-- SEARCH OPTION SET --> <string name="search_optionset">Hledat</string> <!--FORM FRAGMENT--> @@ -273,29 +178,15 @@ <string name="tei_coordinates">Souřadnice pro</string> <!--EVENT SUMMARY--> - <string name="section_list">Seznam oddílů</string> - <string name="event_summary_header" formatted="false">%s otázek z %s dokončeno</string> - <string name="event_summary_sections_header" formatted="false">%s z %s dokončeno</string> - <string name="complete_and_close">Dokončit a zavřít</string> <!--AGE CUSTOM VIEW--> - <string name="hint_day">Dny</string> - <string name="hint_month">Měsíce</string> - <string name="hint_year">Roky</string> - <string name="week">Týdny</string> <string name="incident_date">Datum incidentu</string> - <string name="local_results">Místní výsledky</string> - <string name="online_results">Výsledky online</string> <string name="past_programs">Minulé programy</string> <!--PERMISSIONS--> <string name="permission_denied">K provedení této akce nemáte požadované oprávnění</string> - <string name="add_relation_button">Přidat jako…</string> - <string name="date_dialog_clear">Vymazat</string> <string name="period">Období</string> - <string name="org_unit_filter">(%d) Org jednotek</string> - <string name="org_unit_select_level">Úroveň %d</string> <string name="tuto_main_1">Vítejte na dhis2</string> <string name="tuto_main_2">Zde můžete vidět své aktivity</string> <string name="tuto_main_3">Můžete použít filtr ...</string> @@ -304,16 +195,11 @@ <string name="tuto_main_6">Zkontrolujte další akce v hlavní nabídce</string> <!-- RELATIONSHIPS --> - <string name="default_relationship_label">Vytvořit vztah</string> <string name="next">Další</string> <string name="search_min_num_attr">Chcete-li provést vyhledávání, musíte zadat alespoň %d atributy</string> - <string name="search_attr">Chcete-li provést vyhledávání, musíte zadat alespoň jeden z atributů</string> - <string name="search_max_tei_reached">Je toho víc než %d výsledků. Zadejte prosím další kritéria hledání</string> - <string name="search_init">Zadejte kritéria hledání</string> <!-- QR --> <string name="QR_SCANNER">Importovat QR data</string> - <string name="SAVE">Uložit</string> <string name="button_ok">OK</string> <string name="qr_id">Identifikace</string> <string name="qr_attributes">Atributy</string> @@ -325,32 +211,20 @@ <string name="qr_no_data">žádná data</string> <string name="qr_error_id">Neplatný QR kód</string> <string name="qr_error_attr">Tento atribut nelze přidat</string> - <string name="qr_error_enrollment">Tento zápis nelze přidat</string> <string name="about">O nás</string> <string name="programs_to_enroll">Programy k zápisu</string> - <string name="select_all">vybrat vše</string> - <string name="clear_all">vymazat výběr</string> - <string name="empty_program_list">O vybraných filtrech nejsou žádné informace. Zkuste je změnit.</string> <string name="share">Sdílet</string> <string name="share_qr">Sdílet QR</string> <string name="max">Max</string> <string name="current">stávající</string> <string name="tei">TEI</string> <string name="teis">TEIs</string> - <string name="limit_by_organisation_unit">Omezit podle organizační jednotky</string> - <string name="limit_by_program">Omezit podle programu</string> - <string name="programs_list">Seznam programů</string> <string name="wipe_data">Resetovat data aplikace a konfiguraci</string> - <string name="add_relationship_error">Tento vztah není možné přidat</string> <string name="warning_error_on_complete_title">Zkontrolovat to!</string> - <string name="warning_on_complete_title">Varování</string> - <string name="error_on_complete_title">Chyba</string> <string name="save">Uložit</string> <string name="reserved_value">Rezervované hodnoty</string> - <string name="downloaded_confirm">Chcete přidat více dat z QR?</string> - <!--ABOUT--> <string name="about_app">Verze aplikace: %s</string> <string name="about_sdk">Verze SDK: %s</string> @@ -361,131 +235,43 @@ <string name="about_dev">Vyvinuto a udržováno projektem <a href="https://www.dhis2.org/">DHIS2</a>, který je součástí University of Oslo, <a href="https://www.mn.uio.no/ifi/english/">oddělení informatiky</a>.</string> <string name="about_contact">Další informace nebo dotazy týkající se této aplikace získáte na <a href="mailto:android@dhis2.org">android@dhis2.org</a></string> - <string name="login_error_null_pass">Chybí heslo. Vyplňte prosím toto pole.</string> - <string name="login_error_null_username">Chybí uživatelské jméno. Vyplňte prosím toto pole.</string> - <string name="login_error_dhis_version">Tento server používá jinou verzi DHIS než 2.29. Aktualizujte verzi serveru nebo pokračujte testovacím prostředím.</string> - <string name="login_error_dhis_version_v2">Tento server používá jinou verzi dhis než je %s. Aktualizujte verzi serveru nebo pokračujte testovacím prostředím.</string> - <string name="login_error_unsuccessful_response">Něco se pokazilo. Zkontrolujte správnost adresy URL serveru, uživatelského jména a hesla a zkuste to znovu.</string> - <string name="login_error_error_response">Server nemohl tento požadavek dokončit.</string> - <string name="login_error_default">Při pokusu o přihlášení k serveru došlo k problému.</string> - <string name="login_error">Chyba přihlášení</string> - <string name="missing_mandatory_fields">Chybí povinná pole</string> - <string name="online_search_unexpected">Neočekávaná chyba při online vyhledávání</string> - <string name="online_search_parsing_error">Chyba při analýze výsledků</string> - <string name="online_search_error">Hledání online vrátilo chybu</string> - <string name="online_search_response_error">Na serveru se něco pokazilo</string> <string name="search_program_not_selected">Vyberte program, který umožní registraci</string> <string name="search_access_error">Nemáte požadované povolení</string> - <string name="feature_unavaible">Tato funkce ještě není připravena.</string> - <string name="relationship_label_error">Chyba při získávání štítku vztahu</string> <string name="all_tei_type">Vše %s</string> <string name="invalid_phone_number">Toto není platné telefonní číslo</string> - <string name="invalid_email">Toto není platný e-mail</string> - <string name="invalid_negative_number">Povolena jsou pouze záporná čísla</string> <string name="invalid_possitive_zero">Povolena pouze kladná čísla nebo nula</string> - <string name="invalid_possitive">Povolena jsou pouze kladná čísla</string> - <string name="invalid_interval">Povoleny jsou pouze hodnoty od 0 do 1</string> - <string name="invalid_percentage">Povoleny jsou pouze hodnoty od 0 do 100</string> - <string name="date_dialog_tigle">Vyberte data, která chcete filtrovat</string> <string name="select_option">Vyberte možnost</string> - <string name="issue_reported">Problém byl nahlášen</string> - <string name="dialog_generate_new_event">Generovat novou událost</string> - <string name="message_generate_new_event">Chcete vytvořit další událost?</string> <string name="event_completed_title">Události byly dokončeny</string> <string name="event_completed_message">Všechny události v tomto programu jsou dokončeny. Chcete také ukončit program?</string> - <string name="complete_enrollment_message">Chcete také dokončit zápis?</string> <string name="complete_enrollment_message_V2">Chtěli byste také vyplnit stránku %s?</string> <string name="check_event">Zkontrolovat</string> <string name="menu_home">Úvodní strana</string> <string name="appwidget_text">PŘÍKLAD</string> - <string name="add_widget">Přidat widget</string> <string name="showHelp">Zobrazit nápovědu</string> - <string name="tuto_settings_1">Synchronizujte svá data…</string> - <string name="tuto_settings_2">... vaši konfiguraci ...</string> - <string name="tuto_settings_3">... nastavte, kolik záznamů se má stáhnout ze serveru ...</string> - <string name="tuto_settings_reserved">Zkontrolujte a spravujte, kolik zbývajících rezervovaných hodnot zbývá</string> - <string name="tuto_settings_errors">Zkontrolujte, zda připojení k serveru neselhalo</string> - <string name="tuto_settings_reset">Uvolněte místo na disku</string> - <string name="tuto_settings_4">… nebo odstraňte vše a začněte znovu.</string> - <string name="tuto_search_1_v2">Najděte své entity ve svém místním zařízení i na online serveru.</string> - <string name="tuto_search_2">Můžete přepnout na jiné programy</string> - <string name="tuto_search_3_v2">Vyhledejte nebo přidejte nové entity. Musíte hledat, než budete moci přidat nový!</string> - <string name="tuto_search_4_v2">Kliknutím sem pole vyčistíte a znovu spustíte vyhledávání.</string> <string name="tuto_dashboard_1">Toto je řídicí panel entity</string> <string name="tuto_dashboard_2">Zobrazte informace o profilu entit ...</string> - <string name="tuto_dashboard_3">… Sdílejte informace prostřednictvím QR kódu nebo SMS…</string> - <string name="tuto_dashboard_4">… Nebo označte entitu pro další sledování</string> - <string name="tuto_dashboard_5">Kliknutím vytvoříte nebo naplánujete událost nebo přejdete na jinou organizační jednotku.</string> <string name="tuto_dashboard_6">Zde uvidíte všechny události. Kliknutím zobrazíte podrobnosti události.</string> <string name="tuto_dashboard_7">V nabídce můžete přidávat vztahy, zobrazovat indikátory nebo psát poznámky.</string> - <string name="tuto_dashboard_8">Kliknutím zobrazíte všechny registrace své entity nebo vytvoříte novou.</string> - <string name="tuto_tei_event_1">Kliknutím tuto událost smažete. Tuto akci nelze vrátit zpět.</string> - <string name="tuto_tei_event_2">Dokončete událost.</string> - <string name="tuto_program_event_1">Zde budou uvedeny všechny události související s tímto programem.</string> - <string name="tuto_program_event_2">Kliknutím přidáte novou událost</string> <string name="tuto_event_initial_new_1">Zadejte všechna data k vytvoření události</string> <string name="tuto_event_initial_1">Klepnutím zkontrolujete stav dokončení události.</string> - <string name="tuto_event_summary">Kliknutím událost dokončíte nebo znovu otevřete</string> - <string name="tuto_main_7">Čtěte a ukládejte informace z jiných zařízení pomocí QR kódu</string> - <string name="tuto_main_8">Synchronizujte svá data se serverem</string> - <string name="tuto_main_9">Blokujte relaci pomocí 4místného kódu. Nezapomeňte svůj kód!</string> - <string name="tuto_main_10">Odhlaste se a změňte uživatele nebo server. Budete se moci znovu přihlásit, i když nemáte připojení k internetu.</string> - <string name="text_plus_colon">%s:</string> <string name="relationships">vztahy</string> <string name="empty_tei_add">Nejsou zaregistrovány žádné události, kliknutím na „+“ přidáte novou.</string> - <string name="empty_tei_no_add">Nejsou registrovány žádné události.</string> <string name="qr_data_values">Datové hodnoty</string> <string name="info">Info</string> <string name="qr_no_id_error">Toto ID se nepodařilo přečíst</string> <string name="delete_local_data">Odstranit místní data</string> <string name="dashboard_overview">Přehled</string> - <string name="dashboard_relationships">Vztahy</string> - <string name="dashboard_indicators">Indikátory</string> - <string name="dashboard_analytics">Analytiky</string> <string name="empty_indicators">Pro tento program neexistují žádné ukazatele.</string> - <string name="dashboard_notes">Poznámky</string> - <string name="unable_to_complete">Nelze dokončit</string> - <string name="unable_to_save">Nelze uložit</string> - <string name="warnings_in_form">Ve formuláři jsou varování</string> - <string name="what_to_do">co chcete dělat?</string> - <string name="field_errors">Některá pole obsahují chyby. Zkontrolujte je prosím, abyste je mohli dokončit</string> <string name="unselect_enrollment">Všechny zápisy</string> <string name="unselect_enrollment_description">Zobrazit řídicí panel se všemi aktivními programy</string> - <string name="CHECK_SYNC_ERRORS">Otevřít protokol chyb synchronizace</string> <string name="error_dialog_title">Protokol chyb synchronizace</string> <string name="share_with">Sdílet s...</string> - <string name="errors_during_sync">Vaše synchronizace konfigurace se nezdařila. Na vašem serveru mohou být chyby. Další informace získáte kliknutím sem.</string> - <string name="sectionSelectorPrev">ZPĚT</string> - <string name="sectionSelectorNext">VPŘED</string> - <string name="event_overview">Detaily</string> - <string name="event_indicators">Indikátory</string> - <string name="event_notes">Poznámky</string> - <string name="complete_add_new"><![CDATA[Dokončit a přidat nový]]></string> - <string name="complete_later">Dokončit později</string> - <string name="finish_add_new"><![CDATA[Hotovo a přidat nový]]></string> - <string name="finish">Dokončit</string> - <string name="error_fields_title">Pole s chybami</string> - <string name="error_fields_events">Některá pole obsahují chyby. Nebyla uložena. Prosím, zkontrolujte je.</string> <string name="unique_warning">Hodnota by měla být jedinečná, byla nalezena koincidence. Nebylo uloženo. Prosím zkontrolujte to.</string> - <string name="unique_coincidence_found">Byla nalezena koincidence v jedinečném poli. Pro uložení zápisu prosím zkontrolujte formulář.</string> <string name="please_wait">Prosím, čekejte</string> <string name="skip">Přeskočit</string> - <string name="reschedule">Přeplánovat</string> <string name="no_intructions">O této obrazovce nejsou žádné informace</string> - <string name="event_overdue">Vypršelo</string> - <string name="unsupported_program_rule">Existuje jedno programové pravidlo, které není podporováno. Zkontrolujte dokumentaci</string> - <string name="empty_description">Žádné informace pro toto pole</string> - <string name="biometrics_dialog_title">Prázdné pověření</string> - <string name="biometrics_first_use_text">Abyste se mohli přihlásit pomocí snímače otisků prstů, musíte nejprve použít výchozí způsob</string> - <string name="biometrics_security_title">Biometrické zabezpečení</string> - <string name="biometrics_login_title">Rychlé přihlášení</string> - <string name="biometrics_login_text">Chcete se přihlásit pomocí otisku prstu nebo jiné biometrické metody?</string> - <string name="tab_tables">Tabulky</string> - <string name="table">Tabulka</string> - <string name="login_https">https://</string> <string name="delete_local_data_message">Nesynchronizovaná data budou ztracena. Opravdu chcete pokračovat?</string> - <string name="local_data_accept">Přijmout</string> <string name="delete_local_data_error">Data nelze smazat. Zkuste to prosím znovu.</string> <string name="delete_local_data_done">Odstranění místních dat bylo úspěšně dokončeno.</string> <string name="org_unit_selection_warning">Musí být vybrána alespoň jedna organizační jednotka</string> @@ -509,33 +295,16 @@ <string name="state_uploading">Nahrávám</string> <string name="state_relationship">Vztah</string> <string name="sent_by_sms">Odesláno sms</string> - <string name="no_conflicts_message">U tohoto programu nejsou žádné konflikty</string> - <string name="network_unavailable_sms">Síťové připojení není k dispozici, ale vypadá to, že existují telefonní služby - můžete použít SMS.</string> - <string name="network_unavailable">Síťové připojení není k dispozici.</string> <string name="action_close">Zavřít</string> <string name="tuto_main_11">Nyní můžete zkontrolovat informace o synchronizaci kliknutím sem</string> - <string name="no_conflicts_update_message">Tato data jsou uložena pouze ve vašem zařízení, nejsou synchronizována se serverem.</string> - <string name="no_conflicts_synced_message">Jste aktuální! Všechna vaše data jsou odeslána na server.</string> <string name="relationship_error_recursive">Nemůžete spojit záznam sám se sebou</string> - <string name="unblock_session">Odblokovat relaci</string> - <string name="data_set_complete">Dokončit</string> - <string name="data_set_open">Otevřít</string> - <string name="unsupported_value_type">Nepodporovaný typ hodnoty</string> <string name="change_calendar_view">Změnit zobrazení kalendáře</string> - <string name="data_every_fifteen_minutes">15 minut</string> - <string name="data_every_hour">Každou hodinu</string> - <string name="data_every_day">Denně</string> - <string name="data_every_week">Týdně</string> - <string name="period_week">Týden</string> - <string name="sync_setting">Nastavení synchronizace: %s</string> <string name="relationship_without_enrollment">Záznam, ke kterému se pokoušíte získat přístup, nemá žádnou registraci. K hlavnímu panelu nemáte přístup.</string> <string name="formatting_error">Chyba formátování</string> <string name="dashboard_menu_delete_tei_v2">Smazat %s</string> <string name="delete_authority_error">Nemáte oprávnění tento záznam mazat</string> - <string name="validation_url">Toto není platné URL</string> <string name="adjusting_form">Úprava formuláře…</string> - <string name="sms_receiver_number">Číslo příjemce</string> <string name="sms_amount_question">Souhlasíte s odesláním %d zpráv?</string> <string name="sms_sending">Odesílání %1$d/%2$d</string> <string name="sms_waiting_amount_confirm">Čeká množství potvrzení - %d</string> @@ -553,51 +322,29 @@ <string name="sms_error_no_gateway_set">Nenastavena žádná brána</string> <string name="sms_error_no_user_login">Uživatel není přihlášen</string> <string name="sms_error_module_disabled">SMS modul je deaktivován</string> - <string name="sms_error_ongoing_sunmission">Probíhá další odesílání SMS</string> <string name="sms_metadata_empty">SMS modul nebyl spuštěn, nenalezena požadovaná metadata</string> - <string name="sms_completed">Dokončeno</string> <string name="sms_count_error">Počet SMS není přijat</string> <string name="sms_state_started">Zahájeno odesílání SMS</string> <string name="sms_state_converted">Přečtená a převedená data. ID příspěvku: %d</string> - <string name="sms_general_error">Chyba při odesílání SMS zprávy</string> <string name="sms_title_enrollment">SMS TEI registrace a zápis</string> <string name="sms_title_event">Odeslání události SMS</string> <string name="sms_title_data_set">Odeslání SMS datové sady </string> - <string name="sms_bar_state_starting">Začíná</string> - <string name="sms_bar_state_sending">Probíhá</string> - <string name="sms_bar_state_sent">Odesláno</string> - <string name="sms_bar_state_failed">Selhalo</string> - <string name="start_sync_granular">Spouštění synchronizace.</string> <string name="syncing">Probíhá synchronizace ...</string> - <string name="end_sync_granular">Synchronizace dokončena.</string> - <string name="error_sync">Během synchronizace došlo k chybě.</string> - <string name="error_sync_check_logs">Během synchronizace došlo k chybě. Kliknutím sem zkontrolujete protokoly chyb</string> - <string name="cancel_sync">Zrušená synchronizace.</string> <string name="copied_text">Zkopírováno</string> - <string name="image_selected">Obrázek vybrán</string> - <string name="show_in_map">Zobrazit na mapě</string> - <string name="show_list">Zobrazit seznam</string> <!--region TRACKER IMPORT CONFLICT MESSAGES--> - <string name="value_required_but_not_provided">%s je povinné, ale nebylo poskytnuto.</string> - <string name="polygon_captured">Polygon zachycen</string> <string name="polygon">Polygon</string> <!--endregion--> - <string name="fingerprint_title">Otisk prstu</string> - <string name="fingerprint_message">Položte prst na čtečku otisků prstů.</string> <string name="security_title">Zabezpečení</string> <string name="security_rooted_message">Z bezpečnostních důvodů není možné tuto verzi aplikace používat v rootovaných zařízeních. Použijte tréninkovou verzi.</string> - <string name="fix_error">Došlo k několika chybám. Než budete pokračovat, opravte je.</string> <string name="filters_active">Filtry se používají</string> <string name="filters_disabled">Nejsou použity žádné filtry</string> <string name="filters_title_period">Období</string> <string name="filters_title_org_unit">Org. jednotka</string> - <string name="filters_title_sorting">Třídění</string> - <string name="filters_title_status">Status</string> <string name="filters_title_state">Synchronizace</string> <string name="filters_title_assigned">Přiděleno mně</string> <string name="filter_period_today">Dnes</string> @@ -612,8 +359,6 @@ <string name="filter_period_form_to">Od - Do</string> <string name="filter_period_other">Ostatní</string> <string name="filter_period_any">Kdykoli</string> - <string name="data_values_error_sync_message">Synchronizace se nezdařila. Zkontrolujte hodnoty dat, pokuste se problém vyřešit a zkuste to znovu. Pokud stále selhává, obraťte se na správce systému</string> - <string name="sms_synced_message">Tato data byla odeslána na server, ale není zaručeno, že budou uložena</string> <string name="filter_event_status_open">Otevřít</string> <string name="filter_event_status_schedule">Plán</string> <string name="filter_event_status_overdue">Vypršelo</string> @@ -622,15 +367,12 @@ <string name="filter_event_status_skipped">Přeskočeno</string> <string name="event_tei_limits">Události:%smax:%s%saktuální:%s TEI:%smax:%s%saktuální:%s</string> <string name="limit_setting">Omezené nastavení %s</string> - <string name="enrollment_data_hide">Skrýt údaje o zápisu</string> - <string name="enrollment_data_show">Zobrazit údaje o zápisu</string> <string name="sms_enabled">SMS modul povolen</string> <string name="sms_disabled">SMS modul deaktivován</string> <string name="sms_downloading_data">Stahování dat pro modul SMS. Prosím, čekejte</string> <string name="sms_empty_gateway">Brána SMS nemůže být prázdná</string> <string name="granular_sync_enrollments_empty">Nejsou žádné zápisy k nahrání</string> <string name="granular_sync_unsupported_task">Tento convertTask není podporován</string> - <string name="disable_pin_locked">Nezobrazovat znovu zamykací obrazovku</string> <string name="set_pin">Nastavit PIN</string> <string name="conflict">Konflikt</string> <string name="change_event_date">Změnit datum</string> @@ -655,11 +397,7 @@ <string name="choose_ou">Vyberte organizační jednotku</string> <string name="enter_url">Zadejte url</string> <string name="enter_value">Zadejte hodnotu</string> - <string name="choose_image">Vyberte obrázek</string> - <string name="scan_code">naskenovat kód</string> - <string name="choose_option">Vyberte možnost</string> <string name="reserved_values_hint">Stažené rezervované hodnoty podle atributu TEI</string> - <string name="settings_reserved_values_message">Stažené rezervované hodnoty podle atributu TEI</string> <string name="reserved_values_left">zbývá %s rezervovaných hodnot</string> <string name="manage_reserved_values_button">Spravovat vyhrazené hodnoty</string> <string name="events_to_download">Události ke stažení</string> @@ -679,55 +417,29 @@ <string name="filter_sync_not_synced">Nesynchronizováno</string> <string name="filter_sync_error">Chyba synchronizace</string> <string name="filter_sync_sms">SMS synchronizováno</string> - <string name="dataset_overview">Detaily</string> - <string name="dataset_comments">Komentáře</string> <string name="saved">Uloženo!</string> - <string name="run_validation_rules">Chcete zkontrolovat kvalitu dat?</string> - <string name="validation_success_title">Všechno vypadá dobře!</string> - <string name="mark_dataset_complete">Chcete také vyplnit soubor dat?</string> - <string name="dataset_completed">Označit jak dokončené</string> - <string name="name">Název</string> - <string name="formula">Vzorec</string> - <string name="complete_anyway">Přesto dokončit</string> <string name="fk_message">Chybí %s %s z %s %s</string> <string name="filters_title_event_status">Stav události</string> - <string name="enrollment_date">Datum zápisu</string> <string name="dataset_empty_list_can_create">Nejsou k dispozici žádná data. Kliknutím na „+“ přidáte nový záznam</string> <string name="dataset_emtpy_list_can_not_create">Nejsou k dispozici žádná data. Nemáte oprávnění k přidávání nových záznamů.</string> <string name="validation_rules_empty_description">Nebyl poskytnut žádný popis ani instrukce</string> <string name="validation_rules_data_to_review">Data ke kontrole</string> - <string name="dataset_saved_completed">Uloženo a dokončeno!</string> <string name="status_change_error_active_exist">Již tu je aktivní zápis</string> <string name="enrollment_status_active">Otevřít</string> <string name="enrollment_status_completed">Dokončit</string> <string name="enrollment_status_cancelled">Zrušeno</string> - <string name="event_data">Data</string> <string name="download_tei_error">Vybraný %s nelze stáhnout.</string> - <string name="completed_by">Dokončeno %s : %s</string> - <string name="updated_time">Aktualizováno: %s</string> - <string name="action_done">Hotovo</string> - <string name="validation_internal_error_datasets">Nemohli jsme zkontrolovat kvalitu dat. Kontaktujte svého správce</string> - <string name="are_you_sure">Jste si jist?</string> - <string name="reopen_question">Chcete znovu otevřít soubor dat?</string> <string name="filters_title_date">Datum</string> - <string name="filters_title_event_date">Datum události</string> - <string name="tei_type_has_no_attributes">%s nemá žádné veřejné atributy. Vyberte program</string> <string name="privacy_policy_title">Zásady ochrany osobních údajů</string> <string name="open_privacy_policy">Kliknutím sem zobrazíte naše <a href="">zásady ochrany osobních údajů</a></string> <string name="coordinates_error">Hodnoty souřadnic nejsou platné</string> + <string name="break_glass_error_v2">Do tohoto programu nemůžete zapsat %s z jiných organizačních jednotek, protože je chráněný.\nKontaktujte svého správce.</string> <string name="field_is_mandatory">Toto pole je povinné</string> <string name="security_debugger_message">Z bezpečnostních důvodů není možné tuto verzi aplikace používat s adb. Použijte tréninkovou verzi.</string> <string name="customactivityoncrash_error_activity_restart_app">Zpět</string> - <string name="customactivityoncrash_error_activity_close_app">Zavřít aplikaci</string> - <string name="customactivityoncrash_error_activity_error_details">Více detailů</string> - <string name="customactivityoncrash_error_activity_error_details_title">Více detailů</string> - <string name="customactivityoncrash_error_activity_error_details_close">Zavřít</string> <string name="customactivityoncrash_error_activity_error_details_copy">Zkopírovat do schránky</string> - <string name="customactivityoncrash_error_activity_error_details_copied">Zkopírováno do schránky</string> - <string name="customactivityoncrash_error_activity_error_details_clipboard_label">Informace o chybě</string> <string name="metada_first_sync_error">Při synchronizaci se serverem jsme našli chybu. Pokud je to možné, sdílejte chybu se správcem systému.</string> - <string name="error_init_session">Nemohli jsme zahájit relaci s vaším uživatelem</string> <string name="enrollment_date_edition_warning">Jsou plánované události, které nebudou znovu naplánovány</string> <string name="section_charts">Grafy</string> <string name="navigation_list_view">Seznam</string> @@ -778,47 +490,26 @@ <string name="section_feedback">Zpětná vazba</string> <string name="section_indicators">Indikátory</string> <string name="camera_permission_denied">Povolení k použití kamery je zamítnuto.\nChcete-li tuto funkci používat, musíte ji povolit.</string> - <string name="value">Hodnota</string> <string name="section_charts_indicators">Grafy a indikátory</string> <string name="take_photo">Vyfotit</string> - <string name="from_gallery">Vybrat z galerie</string> - <string name="data_set_quality_check_done">Hotovo!</string> <string name="break_glass_dialog_title">Tento program je chráněn</string> <string name="break_glass_hint">Zde popište důvod</string> - <string name="authenticating">Ověření</string> - <string name="login_error_no_dhis_instance">Zadaná adresa URL serveru není instance dhis</string> - <string name="login_error_bad_credentials">Chybné registrační údaje</string> - <string name="login_error_unknown_host">Neznámý server</string> - <string name="invalid_integer">Hodnota musí být celé číslo</string> <string name="openid_session_expired">Platnost relace vypršela</string> <string name="openid_session_expired_message">Vaše aktuální relace vypršela. Z bezpečnostních důvodů budete muset znovu zadat své přihlašovací údaje</string> - <string name="dataset_column_default">Hodnoty</string> <string name="week_period_span_default_label">Týden %d %s až %s</string> <string name="action_do_not_show_again">Znovu nezobrazovat</string> <string name="feature_configuration">Konfigurace funkcí</string> <string name="show_radar_graph">Zobrazit jako radar</string> - <string name="coordinate_feature_type_error">Nelze nastavit typ souřadnic</string> <string name="filter_follow_up_label">Navázalo na %s</string> - <string name="wrong_date_format">%s nelze analyzovat jako datum</string> <string name="update_field_error">Toto pole nelze aktualizovat. Prosím zkuste to znovu</string> - <string name="edition">Vydání</string> - <string name="available">Dostupné</string> <string name="blocked_by_completion">Tato data nelze upravovat, protože jsou označena jako dokončená</string> <string name="edition_expired">Tato data nelze upravovat, protože vypršel čas jejich vydání</string> <string name="edition_no_write_access">K úpravě těchto údajů nemáte oprávnění</string> <string name="event_date_not_in_orgunit_range">Tato data nelze upravovat, protože organizační jednotka je zavřená</string> <string name="edition_no_catcombo_access">K úpravě těchto údajů nemáte oprávnění</string> - <string name="edition_orgunit_capture_scope">Data z této organizační jednotky nemůžete upravovat</string> - <string name="reload_list">Obnovit vyhledávání</string> + <string name="edition_orgunit_user_scope">Data z této organizační jednotky nemůžete upravovat</string> <string name="error_tei_online_search_title">Online vyhledávání vrátilo následující zprávu:</string> - <string name="program_rules_loop_warning_title">Upozornění na pravidla programu</string> - <string name="program_rules_loop_warning_message">Došlo k problému s konfigurací, který způsobuje smyčku v pravidlech. Kontaktujte svého správce.</string> - <string name="granular_sync_refresh">OBNOVIT</string> - <string name="unknown_date">Neznámý</string> - <string name="granular_sync_refresh_title">Obnovit všechna data</string> - <string name="max_accounts_text">Dosáhli jste maximálního počtu účtů (%d). Chcete-li přidat nový účet, přihlaste se a smažte jeden ze svých účtů</string> <string name="delete_account">Smazat účet</string> - <string name="manage_accounts">Spravovat účty</string> <string name="main_menu_troubleshooting">Odstraňování problémů s konfigurací</string> <string name="troubleshooting_language_title">Jazyk</string> <string name="troubleshooting_language_description">Klepnutím sem změníte jazyk aplikace</string> @@ -837,9 +528,7 @@ <string name="search_no_results">Pro toto hledání nejsou žádné výsledky</string> <string name="search_too_many_results">Příliš mnoho výsledků</string> <string name="search_too_many_results_message">Zkuste změnit vyhledávání a zúžit výsledky.</string> - <string name="search_create_new">Vytvořit nový</string> <string name="search_new_te_type">Nový %s</string> - <string name="search_min_attributes_message">Pro vyhledávání je nutné zadat alespoň atributy %s</string> <string name="action_ok">Ok</string> <string name="init_search">Spusťte vyhledávání a najděte jakýkoli %s</string> <string name="search_or_create">Můžete vyhledat nebo vytvořit nový %s</string> @@ -848,7 +537,6 @@ <string name="missing_error_fields_events">Některá pole obsahují chyby a neukládají se. \nChcete formulář zkontrolovat\?</string> <string name="event_can_be_completed">Chcete tento formulář označit jako vyplněný?</string> <string name="event_error_on_complete">Máte několik chybových hlášení.\nChcete je zkontrolovat\?</string> - <string name="changes_will_be_discarted">Pokud nyní skončíte, změny budou zahozeny.</string> <string name="re_opened">Znovu otevřeno</string> <string name="account_disable_title">Účet zakázán</string> <string name="account_disable_message">Váš účet byl zakázán správcem.</string> @@ -858,27 +546,10 @@ <string name="customactivityoncrash_error_activity_current_date">Aktuální datum: %s</string> <string name="customactivityoncrash_error_activity_device">Zařízení: %s</string> <string name="customactivityoncrash_error_activity_os_version">Verze OS: %s</string> - <string name="open_details">Otevřete podrobnosti %s</string> - <string name="tracked_entity_type_details">Podrobnosti %s</string> <string name="syncing_resource">Synchronizace %s…</string> - <string name="sms_sync_waiting_for_response">SMS odeslána. Čekání na odpověď serveru.</string> - <string name="sms_sync_sms_reached_server">SMS potvrzena pro spojení se serverem. Aktualizace stavu</string> - <string name="sms_sync_sms_reached_server_error">Nemůžeme potvrdit, že SMS dorazila na server. Aktualizace stavu</string> - <string name="sms_sync_sent">SMS odeslána. Aktualizace stavu.</string> - <string name="sms_sync_not_sent">SMS nebyla odeslána.</string> - <string name="sms_sync_opening_app">Otevření aplikace SMS. Zprávu prosím neupravujte.</string> <string name="sms_sync_sms_app_chooser_title">Poslat SMS s</string> <string name="sms_sync_is_sms_sent">Poslal jste sms?</string> - <string name="sms_sync_manual_confirmation">Čeká se na ruční potvrzení</string> - <string name="syncing_events">Synchronizace událostí</string> - <string name="syncing_teis">Synchronizace trasovaných entit</string> - <string name="syncing_data_sets">Synchronizace datových sad</string> - <string name="syncing_resources">Synchronizace zdrojů</string> - <string name="syncing_done">Synchronizace dokončena</string> - <string name="sms_available_for_individual_records">Synchronizace SMS je k dispozici, ale musí být přístupná pro každý jednotlivý záznam</string> <string name="downloading_image_resources">Stahování obrázků...</string> - <string name="program_description">Popis programu</string> - <string name="wrong_pin">Špatný pin</string> <string name="enrolledIn">Zapsáno v</string> <string name="ownedBy">Ve vlastnictví</string> <string name="sync_dialog_title_not_synced">Je nutná synchronizace</string> @@ -898,24 +569,11 @@ <string name="sync_dialog_action_refresh">Obnovit</string> <string name="sync_dialog_action_not_now">Teď ne</string> <string name="tap_to_explore_action">Klepnutím sem prozkoumejte</string> - <plurals name="error_count_label"> - <item quantity="one">%s chyba</item> - <item quantity="few">%s chyby</item> - <item quantity="many">%s chyb</item> - <item quantity="other">%s chyb</item> - </plurals> - <plurals name="warning_count_label"> - <item quantity="one">%s varování</item> - <item quantity="few">%s varování</item> - <item quantity="many">%s varování</item> - <item quantity="other">%s varování</item> - </plurals> <string name="new_version_message">Nyní je k dispozici verze aplikace <b>%s </b> . Chcete si ji stáhnout?</string> <string name="software_update">Aktualizace softwaru</string> <string name="remind_me_later">Později</string> <string name="download_now">Stáhnout teď</string> <string name="check_for_updates">Kontrola aktualizací</string> - <string name="checking_for_updates">Kontrola aktualizací</string> <string name="no_updates">Nejsou žádné nové aktualizace</string> <string name="app_version">Verze aplikace</string> <string name="error_applying_rule_effects">Něco se pokazilo v konfiguraci programu, tuto událost nelze načíst. Obraťte se prosím na správce systému.</string> @@ -954,18 +612,10 @@ <string name="program_stage">Programová fáze</string> <string name="event">událost</string> <string name="timeline">Časová osa</string> - <string name="clear_search">Vymazat hledání</string> - <string name="optional">Volitelný</string> <string name="database_export_downloaded">Databáze stažena</string> - <string name="importing_database">Importování databáze</string> - <string name="empty_search_attributes_message">Nejsou nakonfigurována žádná pole pro vyhledávání.\nObraťte se na správce.</string> <string name="show_more">Zobrazit více</string> <string name="show_less">Zobrazit méně</string> <string name="sync">Synchronizace</string> - <string name="show_fields">Zobrazit pole</string> - <string name="hide_fields">Skrýt pole</string> - <string name="importing_successful">Import byl úspěšný</string> - <string name="section_misconfigured">Tato část je špatně nakonfigurovaná.\nObraťte se na správce.</string> <string name="successful_sync">Úspěšná synchronizace</string> <string name="syncing_something">Synchronizace %s…</string> <string name="file_resources">zdroje souborů</string> @@ -982,4 +632,24 @@ <string name="complete_enrollment_label">Dokončeno %s</string> <string name="deactivate_enrollment_label">Deaktivovat %s</string> <string name="reopen_enrollment_label">Znovu otevřít %s</string> + <plurals name="error_count_label"> + <item quantity="one">%s chyba</item> + <item quantity="few">%s chyby</item> + <item quantity="many">%s chyb</item> + <item quantity="other">%s chyb</item> + </plurals> + + <plurals name="warning_count_label"> + <item quantity="one">%s varování</item> + <item quantity="few">%s varování</item> + <item quantity="many">%s varování</item> + <item quantity="other">%s varování</item> + </plurals> + + <plurals name="settings_specific_programs"> + <item quantity="one">Je tu %s program se specifickým nastavením</item> + <item quantity="few">Jsou tu %sprogramy se specifickým nastavením</item> + <item quantity="many">Je tu %s programů se specifickým nastavením</item> + <item quantity="other">Jsou tu %s programy se specifickým nastavením</item> + </plurals> </resources> diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 3598c37b99f..6eb6eb75ffa 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -1,27 +1,29 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!-- Warnings and error messages --> <string name="error">Error</string> + <!-- SyncService strings: --> + <string name="sync_events">Events</string> - <string name="add_new">Add new</string> - <string name="add">Add</string> - <string name="user_hint">Username</string> - <string name="password_hint">Password</string> + <string name="account_recovery">Account recovery</string> + <!--PERIOD--> <string name="DAILY">Daily</string> <string name="WEEKLY">Weekly</string> <string name="MONTHLY">Monthly</string> <string name="YEARLY">Yearly</string> + <!-- Status --> + <string name="event_open">Open</string> <string name="read_only">Read only</string> <string name="active">Active</string> <string name="state_error">Error</string> + + <!--Completion--> + <!--Event initial--> - <string name="create">Create</string> <string name="update">Update</string> - <string name="date">Date</string> - <string name="category_option">Category option</string> <!--Event Detail--> <string name="due_date">Due date</string> <string name="cancel">Cancel</string> @@ -29,50 +31,31 @@ <string name="wipe_data_no">Cancel</string> <string name="SYNC_MANAGER">Settings</string> <string name="settingsTwoFAStatus">Status</string> - <!--endregion--> - - <string name="enrollmment_date">Enrollment date</string> + <!--EVENT SUMMARY--> + <!--AGE CUSTOM VIEW--> <string name="incident_date">Incident date</string> - <string name="date_dialog_clear">Clear</string> + <!-- RELATIONSHIPS --> <string name="next">Next</string> - <string name="SAVE">Save</string> <string name="button_ok">OK</string> <string name="qr_events">Events</string> <string name="about">About</string> - <string name="max">Max</string> - <string name="warning_on_complete_title">Warning</string> - <string name="error_on_complete_title">Error</string> <string name="save">Save</string> - <string name="dashboard_indicators">Indicators</string> - <string name="event_overview">Details</string> - <string name="event_indicators">Indicators</string> <string name="please_wait">Please wait</string> <string name="state_warning">Warning</string> <string name="action_close">Close</string> - <string name="data_set_open">Open</string> - <string name="data_every_day">Daily</string> - <string name="data_every_week">Weekly</string> - <string name="filters_title_status">Status</string> <string name="filter_period_last_week">Last week</string> <string name="filter_period_last_month">Last month</string> <string name="filter_period_other">Other</string> <string name="filter_event_status_open">Open</string> <string name="data_sets">Data sets</string> - <string name="dataset_overview">Details</string> - <string name="name">Name</string> - <string name="enrollment_date">Enrollment date</string> <string name="enrollment_status_active">Open</string> <string name="filters_title_date">Date</string> - <string name="customactivityoncrash_error_activity_error_details_close">Close</string> <string name="section_charts">Charts</string> <string name="navigation_programs">Programs</string> <string name="navigation_charts">Charts</string> <string name="navigation_tei_data">Details</string> <string name="section_feedback">Feedback</string> <string name="section_indicators">Indicators</string> - <string name="invalid_integer">Value must be an integer</string> - <string name="available">Available</string> <string name="programs">Programs</string> - <string name="optional">Optional</string> </resources> diff --git a/app/src/main/res/values-en-rUS/strings.xml b/app/src/main/res/values-en-rUS/strings.xml index 6a29a088d9e..51a85ddf68d 100644 --- a/app/src/main/res/values-en-rUS/strings.xml +++ b/app/src/main/res/values-en-rUS/strings.xml @@ -11,11 +11,13 @@ <string name="enter_positive_integer_or_zero">Enter positive integer or zero</string> <string name="enter_positive_integer">Enter positive integer</string> <string name="choose_date">Choose date</string> + <string name="state_error">Error</string> - <string name="date">Date</string> + <string name="org_unit">Org unit</string> <string name="latitude">Latitude</string> <string name="longitude">Longitude</string> + <!--Event Detail--> <string name="due_date">Due date</string> <string name="cat_combo">Cat combo</string> @@ -27,32 +29,20 @@ <string name="add_file">Add file</string> <string name="tei_coordinates">Coordinates for the</string> + <!--EVENT SUMMARY--> + <!--AGE CUSTOM VIEW--> - <string name="hint_day">Days</string> - <string name="hint_month">Months</string> - <string name="hint_year">Years</string> <string name="incident_date">Incident date</string> <string name="share">Share</string> <string name="warning_error_on_complete_title">Check this!</string> - <string name="error_on_complete_title">Error</string> - <string name="login_error_dhis_version">This server is running a dhis version different than 2.29. Update your server version or use the testing environment to proceed.</string> - <string name="online_search_parsing_error">Error while parsing results</string> <string name="invalid_phone_number">This is not a valid phone number</string> - <string name="invalid_email">This is not a valid email</string> - <string name="invalid_negative_number">Only negative numbers are allowed</string> <string name="invalid_possitive_zero">Only positive numbers or zero allowed</string> - <string name="invalid_possitive">Only positive numbers are allowed</string> - <string name="invalid_interval">Only values from 0 to 1 are allowed</string> - <string name="invalid_percentage">Only values from 0 to 100 are allowed</string> <string name="unique_warning">The value should be unique, a coincidence has been found. It has not been saved. Please check it.</string> - <string name="empty_description">No info for this field</string> - <string name="local_data_accept">Accept</string> <string name="action_close">Close</string> - <string name="data_set_complete">Complete</string> <string name="formatting_error">Formatting error</string> - <string name="validation_url">This is not a valid url</string> <string name="copied_text">Copied</string> - <string name="polygon_captured">Polygon captured</string> + + <!--region TRACKER IMPORT CONFLICT MESSAGES--> <string name="polygon">Polygon</string> <string name="enrollment_single_section_label">Attributes - %s</string> <string name="select_time">Select time</string> @@ -66,23 +56,14 @@ <string name="enter_value">Enter value</string> <string name="saved">Saved!</string> <string name="enrollment_status_completed">Complete</string> - <string name="action_done">Done</string> <string name="filters_title_date">Date</string> - <string name="coordinates_error">Coordinates values are not valid</string> <string name="field_is_mandatory">This field is mandatory</string> - <string name="customactivityoncrash_error_activity_error_details_close">Close</string> <string name="take_photo">Take Photo</string> - <string name="login_error_unknown_host">Unknown server</string> - <string name="invalid_integer">Value must be an integer</string> <string name="action_do_not_show_again">Do not show again</string> - <string name="wrong_date_format">%s can\'t be parsed as a date</string> <string name="update_field_error">This field could not be updated. Please try again</string> - <string name="program_rules_loop_warning_title">Program rules warning</string> - <string name="program_rules_loop_warning_message">There is a configuration issue causing a loop in the rules. Contact you administrator.</string> <string name="not_saved">Not saved</string> <string name="missing_warning_fields_completed_events">You have some warning messages.</string> <string name="event_can_be_completed">Do you want to mark this form as complete?</string> - <string name="tracked_entity_type_details">%s details</string> <string name="sync_dialog_action_not_now">Not now</string> <string name="coordinates">Coordinates</string> <string name="show_less">Show less</string> diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 4224606fe9b..2298920f257 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -1,63 +1,26 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!--GENERAL--> <string name="app_name">DHIS 2</string> - <string name="logo_text">DHIS</string> - <string name="logo_number">2</string> <!-- Warnings and error messages --> <string name="error">Error</string> - <plurals name="error_message"> - <item quantity="one">Error</item> - <item quantity="many">Errores</item> - <item quantity="other">Errores</item> - </plurals> - <string name="error_wrong_server_url">URL incorrecta</string> - <string name="error_wrong_credentials">Credenciales incorrectas</string> - <string name="error_unexpected_error">Error desconocido</string> - <string name="error_internal_server_error">Error interno</string> - <string name="no_value">sin valor</string> <string name="no_reserved_values">No quedan valores reservados. Contacte con el administrador del sistema.</string> - <string name="no_reserved_values_connection">No quedan valores reservados. Conéctese a internet para recargarlos.</string> - <string name="errors">errores</string> <string name="something_wrong">Algo ha ido mal</string> <!-- SyncService strings: --> - <string name="sync_now">Sincronizar ahora</string> - <string name="sync_text">Sincronizando con el servidor</string> - <string name="sync_title">Sincronizando</string> - <string name="sync_metadata">Metadatos</string> <string name="sync_events">Eventos</string> - <string name="sync_tei">Entidades monitoreadas</string> - - <string name="sync_complete_title">Terminado</string> - <string name="sync_complete_text">Sincronizacion completa</string> <string name="sync_error_title">Error en sincronizacion</string> <string name="sync_error_text">La sincronizacion ha fallado. Intentelo de nuevo.</string> <string name="sync_incomplete_error_text">La sincronización ha terminado pero no se ha recibido confirmación del servidor en algunos rescursos. Éstos estarán marcados como \"no sincronizados\" en la App. Recomendamos reintentar la sincronización.</string> - <string name="data_sync_warning_program">WARNING: la mayoría de sus datos se han sincronizado, pero algunos generaron conflictos. Sincronice su configuración y pruebe otra vez. Si el error persiste, revise el estado de sincronización: los programas, TEIs y events con conflictos tienen el icono @</string> - <string name="server_sync_error">Hubo un error y el serivdor no respondío. Contacte su administrador.</string> - - <string name="search_result_text">%s resultados</string> - <string name="add_new">Agregar nuevo</string> - <string name="add">Añadir</string> - <string name="schedule_new">Programar</string> <string name="referral">Remitir</string> <!-- Login --> - <string name="url_hint">URL de servidor</string> - <string name="user_hint">Nombre de usuario</string> - <string name="password_hint">Contraseña</string> - <string name="log_in_button">Iniciar sesion</string> - <string name="unlock_button">Desbloquear sesion</string> <string name="syncing_configuration">Sincronizando tu configuracion</string> <string name="syncing_data_shortly">Sus datos estaran disponibles pronto</string> <string name="syncing_data">Sincronizando sus datos</string> <string name="configuration_ready">Su configuracion esta lista</string> <string name="data_ready">Sus datos están disponibles</string> - <string name="configuration_sync_failed">Error en la sincronizacion de configuracion</string> - <string name="data_sync_failed">Error en la sincronizacion de datos</string> <string name="account_recovery">Recuperación de cuenta</string> - <string name="no_network_to_recover_account">Necesita conexión de datos si desea recuperar su cuenta.</string> <!--PERIOD--> <string name="DAILY">Diario</string> @@ -75,126 +38,74 @@ <string name="enter_text">Introducir texto</string> <string name="enter_long_text">Introducir texto largo</string> <string name="enter_number">Introducir numero</string> - <string name="enter_integer">Introducir entero</string> <string name="enter_negative_integer">Introducir entero negativo</string> <string name="enter_positive_integer_or_zero">Introducir entero o cero</string> <string name="enter_positive_integer">Introducir entero positivo</string> - <string name="filter_options">Opciones</string> <string name="choose_date">Introducir fecha</string> - <string name="change_calendar">Cambiar calendario</string> <!-- Status --> - <string name="program_completed">Programa Completado</string> - <string name="program_inactive">Programa suspendido</string> <string name="event_open">Abrir</string> <string name="event_completed">Evento completado</string> <string name="read_only">Sólo lectura</string> - <string name="finish_and_complete">Acabar y completar</string> <string name="completed">Completado</string> <string name="cancelled">Cancelar</string> - <string name="activate">Activar</string> <string name="active">Activo</string> <!-- State --> <string name="state_synced">Sincronizado</string> <string name="state_to_post">Por enviar</string> <string name="state_to_update">Para actualizar</string> - <string name="state_to_delete">Para borrar</string> <string name="state_error">Error</string> - <string name="action_sync">Sincronizar</string> - <string name="action_send">ENVIAR</string> - <string name="action_sync_sms">Sincronizar SMS</string> <!--Completion--> - <string name="completion">Completado</string> <!--Event initial--> - <string name="create">Crear</string> <string name="update">Actualizar</string> - <string name="date">Fecha</string> <string name="org_unit">Unidad Organizativa</string> <string name="no_org_units">No hay Unidades Organizativas abiertas para la fecha seleccionada. Seleccione otra fecha u otra Unidad Organizativa.</string> - <string name="category_option">Opcion de categoria</string> <string name="latitude">Latitud</string> <string name="longitude">Longitud</string> - <string name="new_event">Evento nuevo</string> - <string name="one_time">Una vez</string> - <string name="permanent">Permanente</string> <!--DataSet initial--> <string name="report_period">Periodo de presentacion de informe</string> - <string name="cat_option">Opción de categoría</string> - <string name="field_required">Si introduce un valor, tendrá que completar toda la fila para poder marcar como Completado el Data Set.</string> - <string name="field_mandatory">Hay campos obligatorios vacíos. Deben tener valor para poder marcar como Completado el Data Set.</string> - <string name="field_mandatory_v2">Hay campos obligatorios vacíos. Por favor, rellénelos para poder completar el set de datos.</string> - <string name="datavalue_saved">Guardado!</string> - <string name="there_is_no_available_period">No hay periodos disponibles.</string> <!--Event Detail--> <string name="due_date">Fecha de vencimiento</string> <string name="cat_combo">Cat Combo</string> - <string name="date_default">DD/MM/YYYY</string> <string name="cancel">Cancelar</string> <string name="delete">Borrar</string> - <string name="total">Total</string> <string name="most_recent_event_date">Fecha de evento más reciente</string> <string name="active_programs">Programas activos</string> - <string name="to_enroll_programs">Programas disponibles para inscripción</string> <string name="enroll">Admitir</string> - <string name="last_visit">Ultima visita:</string> - <string name="apply">Aplicar</string> - - <!--TEI DASHBOARD--> - <string name="see_details">Ver detalles</string> - <string name="view_more">Ver mas</string> - <string name="follow_up">Seguimiento</string> - <string name="follow_up_enabled">Seguimiento activado</string> - <string name="follow_up_disabled">Seguimiento desactivado</string> + <string name="deactivate">Desactivar</string> <string name="program_not_allow_events">Este programa no admite más eventos</string> <!--DONE TASKS--> - <string name="events_no_data">No hay datos</string> <string name="events">Eventos</string> <string name="done_task">Inicio</string> - <string name="app_info">Información de la App</string> <string name="log_out">Cerrar Sesion</string> - <string name="block_session">Bloquear sesion</string> <!-- SYNC --> - <string name="a_minute">1 minuto</string> - <string name="fifteen_minute">15 minutos</string> <string name="thirty_minutes">30 minutos</string> <string name="a_hour">1 hora</string> <string name="every_6_hours">6h</string> <string name="a_day">1 día (por defecto)</string> <string name="every_12_hours">12h</string> - <string name="Automatic_Sync_Data">Sincronizacion de datos automatica cada:</string> <string name="Manual">Manual</string> - <string name="Automatic_Sync_Metadata">Sincronizacion de configuracion automatica cada:</string> <string name="a_week">Semanal</string> <string name="sync_max_parameters">Ajustes actuales de sincronización:</string> <string name="sync_default_parameters">Volver a los valores por defecto</string> + <string name="wipe_data_meesage">Se borrará la base de datos. \nTendrá que volver a iniciar sesión.</string> <string name="wipe_data_ok">Aceptar</string> <string name="wipe_data_no">Cancelar</string> <string name="SYNC_DATA">Sincronizar datos Ahora</string> <string name="SYNC_META">Sincronizar configuracion ahora</string> <string name="SYNC_MANAGER">Configuración</string> - <string name="last_data_sync_date">Última sincronización: %s</string> - <string name="last_metadata_sync_date">Última sincronización: %s</string> <string name="refill_reserved_values">Recargar</string> - <string name="settings_sms_module_title">Modulo SMS:</string> <string name="settings_sms_receiver_number">SMS gateway</string> <string name="settings_sms_result_sender_number">Emisor del SMS de resultado</string> - <string name="settings_sms_result_timeout_hint">segundos</string> - <string name="settings_sms_result_sender_hint">numero</string> - <string name="settings_sms_receiver_number_hint">numero</string> <string name="settings_sms_module_switch">Permitir envío por SMS</string> <string name="settings_sms_response_wait_switch">Esperar confirmación por SMS</string> - <plurals name="settings_specific_programs"> - <item quantity="one">Hay %s programa con una configuración específica</item> - <item quantity="many">Hay %s programas con configuraciones específicas</item> - <item quantity="other">Hay %s programas con configuraciones específicas</item> - </plurals> <string name="settings_limit_scope">Configuración limitada</string> <string name="settings_limit_globally">Globalmente</string> <string name="settings_limit_program">por programa</string> @@ -212,15 +123,11 @@ <string name="settingsErrorLog_descr">Aquí están todos los errores encontrados durante la sincronización de datos y metadatos.</string> <string name="settingsDeleteLocalData">Borrar datos locales</string> <string name="settingsDeleteLocalData_descr">Se borrarán todos los datos guardados por la App. Los datos que no se hayan enviado al servidor se perderán.</string> - <string name="settingsReset">Reiniciar app</string> - <string name="settingsReset_descr">Se borrará la configuración y todos los datos guardados por la App. Tendrá que iniciar sesión de nuevo y los datos que no se hayan enviado al servidor se perderán.</string> <string name="settingsSms">Configuración SMS</string> <string name="settingsSms_descr">Verifique los parámetros relacionados con la SMS gateway</string> <string name="settingsTwoFAStatus">Estado</string> <!--endregion--> - <string name="enrollmment_date">Fecha de inscripción</string> - <!-- SEARCH OPTION SET --> <string name="search_optionset">Buscar</string> <!--FORM FRAGMENT--> @@ -241,29 +148,15 @@ <string name="tei_coordinates">Coordenadas para</string> <!--EVENT SUMMARY--> - <string name="section_list">Lista de secciones</string> - <string name="event_summary_header" formatted="false">%s preguntas de %s completadas</string> - <string name="event_summary_sections_header" formatted="false">%s de %s completados</string> - <string name="complete_and_close">Completar y cerrar</string> <!--AGE CUSTOM VIEW--> - <string name="hint_day">Días</string> - <string name="hint_month">Meses</string> - <string name="hint_year">Años</string> - <string name="week">Semanas</string> <string name="incident_date">Fecha del incidente</string> - <string name="local_results">Resultados locales</string> - <string name="online_results">Resultados online</string> <string name="past_programs">Programas pasados</string> <!--PERMISSIONS--> <string name="permission_denied">No tiene los permisos necesarios para realizar esta acción</string> - <string name="add_relation_button">Añadir como…</string> - <string name="date_dialog_clear">Limpiar</string> <string name="period">Periodo</string> - <string name="org_unit_filter">(%d) Unidad Org.</string> - <string name="org_unit_select_level">Nivel %d</string> <string name="tuto_main_1">Bienvenido a dhis2</string> <string name="tuto_main_2">Aquí aparecerán sus actividades</string> <string name="tuto_main_3">Puedes aplicar un filtro…</string> @@ -272,16 +165,11 @@ <string name="tuto_main_6">En el menú principal podrá realizar más acciones</string> <!-- RELATIONSHIPS --> - <string name="default_relationship_label">Añadir relación</string> <string name="next">Siguiente</string> <string name="search_min_num_attr">Es necesario introducir al menos %d de los atributos para iniciar una búsqueda</string> - <string name="search_attr">Hay que rellenar al menos un atributo para buscar</string> - <string name="search_max_tei_reached">Hay más de %d resultados. Por favor, especifique más su búsqueda</string> - <string name="search_init">Introduzca algún criterio de búsqueda</string> <!-- QR --> <string name="QR_SCANNER">Importar datos QR</string> - <string name="SAVE">Guardar</string> <string name="button_ok">Correcto</string> <string name="qr_id">Identificación</string> <string name="qr_attributes">Atributos</string> @@ -293,32 +181,20 @@ <string name="qr_no_data">sin datos</string> <string name="qr_error_id">Código QR no válido</string> <string name="qr_error_attr">Este atributo no puede ser añadido</string> - <string name="qr_error_enrollment">Esta admisión no puede ser añadida</string> <string name="about">Acerca de</string> <string name="programs_to_enroll">Programas disponibles para admisión</string> - <string name="select_all">Selecionar todo</string> - <string name="clear_all">Borrar selección</string> - <string name="empty_program_list">No hay información para los filtros seleccionados. Pruebe modificándolos.</string> <string name="share">Compartir</string> <string name="share_qr">Compartir QR</string> <string name="max">Máx</string> <string name="current">En uso</string> <string name="tei">TEI</string> <string name="teis">TEIs</string> - <string name="limit_by_organisation_unit">Limitar por unid. organizativa</string> - <string name="limit_by_program">Limitado por programa</string> - <string name="programs_list">Listado de programas</string> <string name="wipe_data">Reiniciar app</string> - <string name="add_relationship_error">No es posible añadir esta relación</string> <string name="warning_error_on_complete_title">¡Importante!</string> - <string name="warning_on_complete_title">Advertencia</string> - <string name="error_on_complete_title">Error</string> <string name="save">Guardar</string> <string name="reserved_value">Valores Reservados</string> - <string name="downloaded_confirm">Quiere añadir más información de códigos QR?</string> - <!--ABOUT--> <string name="about_app">Versión de la app: %s</string> <string name="about_sdk">Versión del SDK: %s</string> @@ -329,141 +205,44 @@ <string name="about_dev">Desarrollada y mantenida por el proyecto <a href="https://www.dhis2.org/">DHIS2</a>, parte de la Universidad de Oslo, <a href="https://www.mn.uio.no/ifi/english/">departamento de informática</a>.</string> <string name="about_contact">Para más información o preguntas sobre la aplicación, por favor escriba a <a href="mailto:android@dhis2.org">android\@dhis2.org</a></string> - <string name="login_error_null_pass">La contraseña está vacía. Complete este campo por favor.</string> - <string name="login_error_null_username">El usuario está vacío. Complete este campo por favor.</string> - <string name="login_error_dhis_version">Este servidor trabaja sobre una versión de dhis distinta a 2.29. Actualice el servidor o utilice el entorno de pruebas para continuar.</string> - <string name="login_error_dhis_version_v2">Este servidor tiene una version de dhis diferente de %s. Actualice su servidor o use el servidor de testing para continuar.</string> - <string name="login_error_unsuccessful_response">Algo ha ido mal. Por favor, compruebe que tanto la url del servidor como el usuario y contraseña son correctos y pruebe otra vez.</string> - <string name="login_error_error_response">El servidor no ha podido completar su solicitur.</string> - <string name="login_error_default">Ha habido un problema intentando conectarse al servidor.</string> - <string name="login_error">Error de Acceso</string> - <string name="missing_mandatory_fields">Los campos obligatorios no pueden estar vacios</string> - <string name="online_search_unexpected">Error inesperado mientras se ejecutaba la búsqueda online</string> - <string name="online_search_parsing_error">Error al obtener los resultados</string> - <string name="online_search_error">La busqueda online devolvió un error</string> - <string name="online_search_response_error">Algo fue mal al conectar con el servidor</string> <string name="search_program_not_selected">Seleccione un programa para habilitar nuevas admisiones</string> <string name="search_access_error">No tiene los permisos necesarios</string> - <string name="feature_unavaible">Esta funcionalidad no está lista.</string> - <string name="relationship_label_error">Error al recuperar la etiqueta de la relación</string> <string name="all_tei_type">Todo %s</string> <string name="invalid_phone_number">Este no es un número de teléfono válido</string> - <string name="invalid_email">Este no es un email válido</string> - <string name="invalid_negative_number">Solo se permiten números negativos</string> <string name="invalid_possitive_zero">Solo se permiten números positivos o cero</string> - <string name="invalid_possitive">Solo se permiten números positivos</string> - <string name="invalid_interval">Solo se permiten valores entre 0 y 1</string> - <string name="invalid_percentage">Solo se permiten valores entre 0 y 100</string> - <string name="date_dialog_tigle">Selecciona las fechas para filtrar</string> <string name="select_option">Seleccionar opción</string> - <string name="issue_reported">Incidencia reportada</string> - <string name="dialog_generate_new_event">Generar nuevo evento</string> - <string name="message_generate_new_event">¿Quiere crear un nuevo evento?</string> <string name="event_completed_title">Eventos Completados</string> <string name="event_completed_message">Todos los eventos de este programa están completados. ¿Quiere completar el programa también?</string> - <string name="complete_enrollment_message">¿ Completar también la inscripción? </string> <string name="check_event">Ver</string> <string name="menu_home">Inicio</string> <string name="appwidget_text">EJEMPLO</string> - <string name="add_widget">Añadir Widget</string> <string name="showHelp">Ver ayuda</string> - <string name="tuto_settings_1">Sincronice sus datos...</string> - <string name="tuto_settings_2">... sincronive su configuracion...</string> - <string name="tuto_settings_3">Configure el almacenamiento local</string> - <string name="tuto_settings_reserved">Ver y gestionar cuantos valores reservados quedan</string> - <string name="tuto_settings_errors">Compruebe si la conexión con el servidor ha fallado</string> - <string name="tuto_settings_reset">Liberar memoria</string> - <string name="tuto_settings_4">o borre todo y empiece de cero.</string> - <string name="tuto_search_1_v2">Encuentre sus entidades tanto en tu dispositivo local como en el servidor.</string> - <string name="tuto_search_2">Puede cambiar de programa</string> - <string name="tuto_search_3_v2">Buscar o añadir nuevas entidades. ¡ Hay que buscar antes de añadir nuevas entidades !</string> - <string name="tuto_search_4_v2">Click aquí para limpiar los campos y reiniciar la búsqueda.</string> <string name="tuto_dashboard_1">Este es el Dashboard de entidad</string> <string name="tuto_dashboard_2">Puede ver la información de perfil</string> - <string name="tuto_dashboard_3">Compartir información via QR o SMS</string> - <string name="tuto_dashboard_4">O marcar una entidad para seguimiento</string> - <string name="tuto_dashboard_5">Puede crear o programar un evento, o referir a otra Org. Unit</string> <string name="tuto_dashboard_6">Aquí estan todos los eventos. Pulse para ver los detalles.</string> <string name="tuto_dashboard_7">Navegue el menú para añadir relaciones, ver indicadores o escribir notas.</string> - <string name="tuto_dashboard_8">Aqui puede ver todos los enrolments o crear uno nuevo.</string> - <string name="tuto_tei_event_1">Pulse para borrar este evento. Esta acción no se puede deshacer.</string> - <string name="tuto_tei_event_2">Completar el evento.</string> - <string name="tuto_program_event_1">Todos los eventos de este programa seran listados aqui.</string> - <string name="tuto_program_event_2">Haga click para añadir un nuevo evento</string> <string name="tuto_event_initial_new_1">Complete todos los campos para crear el evento</string> <string name="tuto_event_initial_1">Aqui puedes ver el % de campos completos en el evento. </string> - <string name="tuto_event_summary">Haga click para completar o re-abrir un evento</string> - <string name="tuto_main_7">Lea y almacene información de otros dispositivos a través de códigos QR</string> - <string name="tuto_main_8">Sincronice sus datos con el servidor</string> - <string name="tuto_main_9">Bloquee la session con un digito de 4 cifras. ¡No olvide su codigo! </string> - <string name="tuto_main_10">Cierre sesión para cambiar de usuario o de servidor. Podrá volver a entrar con el mismo usuario si no hay internet.</string> - <string name="text_plus_colon">%s:</string> <string name="relationships">relaciones</string> <string name="empty_tei_add">No hay eventos registrados, haga click en \"+\" para añadir uno.</string> - <string name="empty_tei_no_add">No hay eventos registrados.</string> <string name="qr_data_values">Valores de datos</string> <string name="info">Información</string> <string name="qr_no_id_error">No se ha podido leer este Id</string> <string name="delete_local_data">Borrar datos</string> <string name="dashboard_overview">General</string> - <string name="dashboard_relationships">Relaciones</string> - <string name="dashboard_indicators">Indicadores</string> - <string name="dashboard_analytics">Analíticas</string> <string name="empty_indicators">No hay indicadores para este programa.</string> - <string name="dashboard_notes">Notas</string> - <string name="unable_to_complete">No se puede completar</string> - <string name="unable_to_save">No se pudo guardar</string> - <string name="warnings_in_form">Hay mensajes de aviso en el formulario</string> - <string name="what_to_do">¿Qué quiere hacer?</string> - <string name="field_errors">Algunos campos contienen errores. Por favor, revíselos para poder completar.</string> <string name="unselect_enrollment">Deseleccionar inscripción</string> <string name="unselect_enrollment_description">Mostrar todos los programas activos</string> - <string name="CHECK_SYNC_ERRORS">Comprobar errores de sincronización</string> <string name="error_dialog_title">Lista de errores de sincronización</string> <string name="share_with">Compartir con...</string> - <string name="errors_during_sync">La sincronización de configuración ha fallado. Puede haber fallos en el servidor. Haga click aquí para mas información.</string> - <string name="sectionSelectorPrev">ANTERIOR</string> - <string name="sectionSelectorNext">SIGUIENTE</string> - <string name="event_overview">Detalles</string> - <string name="event_indicators">Indicadores</string> - <string name="event_notes">Notas</string> - <string name="complete_add_new"><![CDATA[Completar y añadir]]></string> - <string name="complete_later">Completar mas tarde</string> - <string name="finish_add_new"><![CDATA[Acabar y añadir]]></string> - <string name="finish">Acabar</string> - <string name="error_fields_title">Campos con errores</string> - <string name="error_fields_events">Algunos campos presentan errores. No se han guardado. Revíselos por favor.</string> <string name="unique_warning">El valor debe ser único, se ha encontrado una coincidencia. El campo no se ha guardado, revíselo.</string> - <string name="unique_coincidence_found">Se ha encontrado una coincidencia en un campo único. Por favor compruebe el formulario para guardar el registro.</string> <string name="please_wait">Por favor, espere</string> <string name="skip">Omitir</string> - <string name="reschedule">Reprogramar</string> <string name="no_intructions">No hay información sobre esta pantalla</string> - <string name="event_overdue">Atrasado</string> - <string name="unsupported_program_rule">Hay alguna program rule no soportada. Revise la documentación.</string> - <string name="empty_description">No hay información para este campo</string> - <string name="biometrics_dialog_title">Vaciar credenciales</string> - <string name="biometrics_first_use_text">Para poder iniciar sesión por huella dactilar debe entrar primero por el modo normal</string> - <string name="biometrics_security_title">Seguridad biométrica</string> - <string name="tab_tables">Tablas</string> - <string name="table">Tabla</string> - <string name="login_https">https://</string> <string name="delete_local_data_message">Los datos no sincronizados se perderán. Continuar?</string> - <string name="local_data_accept">Aceptar</string> <string name="delete_local_data_error">Los datos no se pudieron borrar. Inténtelo de nuevo.</string> <string name="delete_local_data_done">Los datos locales se borraron correctamente.</string> - <string name="org_unit_selection_warning">Debe seleccionar al menos una unidad organizativa.</string> - <string name="send_user_name_title">Enviar datos</string> - <string name="send_user_name_mesage">Ayude a DHIS2 a mejorar esta app compartiendo errores asociados a su usuario.</string> - <string name="check_mandatory_field">Comprobar campos</string> - <string name="error_no_network_during_sync">Se perdió la conexión a internet durante la sincronización. Inténtelo mas tarde.</string> - <string name="action_agree">Confirmar</string> - <string name="action_continue">Seguir</string> - <string name="login_server_info_title">URL de servidor</string> - <string name="forgot_your_code">¿Olvido su código?</string> - <string name="event_form_end_options_title">¿Que quiere hacer con este evento?</string> - <string name="sectionSelectorEnd">FIN</string> <string name="resource_not_found">%s no encontrado</string> <string name="relationship_not_found_message">Este registro no esta disponible. ¿Quiere buscarlo?</string> <string name="sync_by_sms">Sincronizado por SMS</string> @@ -471,33 +250,16 @@ <string name="state_uploading">Subiendo</string> <string name="state_relationship">Relación</string> <string name="sent_by_sms">Enviado por mensaje de texto</string> - <string name="no_conflicts_message">Este programa no tiene conflictos</string> - <string name="network_unavailable_sms">No hay conexión a internet, pero hay señal telefónica - puede utilizar SMS.</string> - <string name="network_unavailable">Conexión no disponible.</string> <string name="action_close">Cerrar</string> <string name="tuto_main_11">Puede ver la información de configuración haciendo click aquí</string> - <string name="no_conflicts_update_message">Estos datos están guardados en su dispositivo solamente, no se han enviado al servidor.</string> - <string name="no_conflicts_synced_message">¡Esta al día! Todos tus datos se han enviado al servidor.</string> <string name="relationship_error_recursive">No se puede relacionar un registro con el mismo</string> - <string name="unblock_session">Desbloquear sesión</string> - <string name="data_set_complete">Completar</string> - <string name="data_set_open">Abierto</string> - <string name="unsupported_value_type">Tipo de valor no admitido</string> <string name="change_calendar_view">Cambiar vista</string> - <string name="data_every_fifteen_minutes">15 minutos</string> - <string name="data_every_hour">Cada hora</string> - <string name="data_every_day">Diario</string> - <string name="data_every_week">Semanal</string> - <string name="period_week">Semana</string> - <string name="sync_setting">Parámetros de configuración: %s</string> <string name="relationship_without_enrollment">Este registro no tiene ninguna inscripción. No se puede acceder al dashboard.</string> <string name="formatting_error">Error de formato</string> <string name="dashboard_menu_delete_tei_v2">Eliminar %s</string> <string name="delete_authority_error">No tienes permisos para borrar este registro</string> - <string name="validation_url">La URL no es válida</string> <string name="adjusting_form">Adaptando el formulario...</string> - <string name="sms_receiver_number">Numero receptor</string> <string name="sms_amount_question">Quiere enviar %d SMS?</string> <string name="sms_sending">Enviando %1$d/%2$d</string> <string name="sms_waiting_amount_confirm">Esperando confirmación - %d</string> @@ -515,51 +277,29 @@ <string name="sms_error_no_gateway_set">Puerta de acceso no definida</string> <string name="sms_error_no_user_login">El usuario no ha iniciado sesión</string> <string name="sms_error_module_disabled">Modulo SMS desabilitado</string> - <string name="sms_error_ongoing_sunmission">Se está enviando otro SMS en este momento</string> <string name="sms_metadata_empty">Modulo SMS no inicializado. No se encontraron los metadatos necesarios.</string> - <string name="sms_completed">Completado</string> <string name="sms_count_error">No se ha aceptado el número de SMS</string> <string name="sms_state_started">Inicio del envío de sms</string> <string name="sms_state_converted">Datos leídos y convertidos. Id de envío: 1%d</string> - <string name="sms_general_error">Error al enviar sms</string> <string name="sms_title_enrollment">SMS para registro de TEI</string> <string name="sms_title_event">SMS para evento</string> <string name="sms_title_data_set">SMS para conjunto de datos</string> - <string name="sms_bar_state_starting">Iniciando</string> - <string name="sms_bar_state_sending">En proceso</string> - <string name="sms_bar_state_sent">Enviado</string> - <string name="sms_bar_state_failed">Ha fallado</string> - <string name="start_sync_granular">Iniciando sincronización.</string> <string name="syncing">Sincronizando...</string> - <string name="end_sync_granular">Sincronización completada</string> - <string name="error_sync">Ocurrió un error en la sincronización</string> - <string name="error_sync_check_logs">Se ha producido un error durante la sincronización. Pulse aquí para ver el listado de errores</string> - <string name="cancel_sync">Cancelar sincronización</string> <string name="copied_text">Copiado</string> - <string name="image_selected">Imagen seleccionada</string> - <string name="show_in_map">Mostrar en el Mapa</string> - <string name="show_list">Mostrar lista</string> <!--region TRACKER IMPORT CONFLICT MESSAGES--> - <string name="value_required_but_not_provided">%s es obligatorio y no tiene valor</string> - <string name="polygon_captured">Polígono guardado</string> <string name="polygon">Polígono</string> <!--endregion--> - <string name="fingerprint_title">Huella dactilar</string> - <string name="fingerprint_message">Por favor, toque con el dedo el lector de huellas.</string> <string name="security_title">Seguridad</string> <string name="security_rooted_message">Por motivos de seguridad, esta versión de la aplicación no permite su uso en dispositivos root. Por favor use la versión de formación.</string> - <string name="fix_error">Hay algunos errores. Por favor corríjalos antes de continuar.</string> <string name="filters_active">Filtros activos</string> <string name="filters_disabled">Filtros desactivados</string> <string name="filters_title_period">Periodo</string> <string name="filters_title_org_unit">Unidad Org.</string> - <string name="filters_title_sorting">Orden</string> - <string name="filters_title_status">Estado</string> <string name="filters_title_state">Sincronizado</string> <string name="filters_title_assigned">Asignado a mí</string> <string name="filter_period_today">Hoy</string> @@ -574,8 +314,6 @@ <string name="filter_period_form_to">Desde - hasta</string> <string name="filter_period_other">Otro</string> <string name="filter_period_any">Cualquier momento</string> - <string name="data_values_error_sync_message">La sincronización falló. Compruebe los valores para tratar de resolver el problema e inténtelo otra vez. Si el fallo persiste contacte con su administrador del sistema.</string> - <string name="sms_synced_message">Los datos se han enviado al servidor pero no se puede garantizar que se hayan guardado</string> <string name="filter_event_status_open">Abierto</string> <string name="filter_event_status_schedule">Planificado</string> <string name="filter_event_status_overdue">Atrasado</string> @@ -591,7 +329,6 @@ <string name="sms_empty_gateway">El gateway de SMS no puede estar vacío</string> <string name="granular_sync_enrollments_empty">No hay registros que sincronizar</string> <string name="granular_sync_unsupported_task">La conversión elegida no está soportada</string> - <string name="disable_pin_locked">No volver a mostrar la pantalla de bloqueo</string> <string name="set_pin">Establecer pin</string> <string name="conflict">Conflicto</string> <string name="change_event_date">Cambiar fecha</string> @@ -616,11 +353,7 @@ <string name="choose_ou">Elija unidad organizativa</string> <string name="enter_url">Introduzca url</string> <string name="enter_value">Introduzca valor</string> - <string name="choose_image">Elija una imagen</string> - <string name="scan_code">Escanear código</string> - <string name="choose_option">Elija una opción</string> <string name="reserved_values_hint">Valores reservados descargados por atributo de entidad</string> - <string name="settings_reserved_values_message">Valores reservados descargados por atributo de entidad</string> <string name="reserved_values_left">Quedan %s valores reservados</string> <string name="manage_reserved_values_button">Gestionar valores reservados</string> <string name="events_to_download">Eventos a descargar</string> @@ -640,55 +373,29 @@ <string name="filter_sync_not_synced">No Sincronizado</string> <string name="filter_sync_error">Error en la sincronización</string> <string name="filter_sync_sms">Sincronización de SMS</string> - <string name="dataset_overview">Detalles</string> - <string name="dataset_comments">Comentarios</string> <string name="saved">¡Guardado!</string> - <string name="run_validation_rules">¿Quiere validar la calidad de los datos?</string> - <string name="validation_success_title">¡Parece que todo está bien!</string> - <string name="mark_dataset_complete">¿Quiere completar también el set de datos?</string> - <string name="dataset_completed">Marcar como completado</string> - <string name="name">Nombre</string> - <string name="formula">Fórmula</string> - <string name="complete_anyway">Completar de todas formas</string> <string name="fk_message">No se ha encontrado %s %s en %s %s</string> <string name="filters_title_event_status">Estado del evento</string> - <string name="enrollment_date">Fecha de inscripción</string> <string name="dataset_empty_list_can_create">No hay datos. Pulse \"+\" para añadir un nuevo registro</string> <string name="dataset_emtpy_list_can_not_create">No hay datos. No tiene permisos para añadir un nuevo registro.</string> <string name="validation_rules_empty_description">No se han proporcionado descripción o instrucciones</string> <string name="validation_rules_data_to_review">Datos a revisar</string> - <string name="dataset_saved_completed">¡Guardado y completado!</string> <string name="status_change_error_active_exist">Ya existe un registro activo</string> <string name="enrollment_status_active">Abierto</string> <string name="enrollment_status_completed">Completar</string> <string name="enrollment_status_cancelled">Cancelar</string> - <string name="event_data">Datos</string> <string name="download_tei_error">El %s seleccionado no puede ser descargado.</string> - <string name="completed_by">Completado por %s: %s</string> - <string name="updated_time">Actualizado: %s</string> - <string name="action_done">Terminado</string> - <string name="validation_internal_error_datasets">No hemos podido verificar la calidad de los datos. Contacte con su administrador</string> - <string name="are_you_sure">¿Está seguro?</string> - <string name="reopen_question">¿Quiere reabrir este set de datos?</string> <string name="filters_title_date">Fecha</string> - <string name="filters_title_event_date">Fecha de evento</string> - <string name="tei_type_has_no_attributes">%s no tiene atributos públicos. Por favor seleccione un programa</string> <string name="privacy_policy_title">Política de privacidad</string> <string name="open_privacy_policy">Pulse aquí para comprobar nuestra <a href="">política de privacidad</a></string> <string name="coordinates_error">El valor de las coordenadas no es válido</string> + <string name="break_glass_error_v2">No puede registrar un/una %s desde otras unidades organizativas en este programa por que está protegido.\nContacte con su administrador.</string> <string name="field_is_mandatory">El campo es obligatorio</string> <string name="security_debugger_message">Por razones de seguridad, esta versión de la app no permite el uso de adb. Por favor use la versión de formación.</string> <string name="customactivityoncrash_error_activity_restart_app">Ir atrás</string> - <string name="customactivityoncrash_error_activity_close_app">Cerrar app</string> - <string name="customactivityoncrash_error_activity_error_details">Más detalles</string> - <string name="customactivityoncrash_error_activity_error_details_title">Más detalles</string> - <string name="customactivityoncrash_error_activity_error_details_close">Cerrar</string> <string name="customactivityoncrash_error_activity_error_details_copy">Copiar al portapapeles</string> - <string name="customactivityoncrash_error_activity_error_details_copied">Copiado al portapapeles</string> - <string name="customactivityoncrash_error_activity_error_details_clipboard_label">Información del error</string> <string name="metada_first_sync_error">Encontramos un error al sincronizar con su servidor. Comparta el error con el administrador del sistema si es posible.</string> - <string name="error_init_session">No pudimos iniciar la sesión con su usuario</string> <string name="enrollment_date_edition_warning">Hay eventos planificados que no serán reprogramados</string> <string name="section_charts">Gráficas</string> <string name="navigation_table_view">Vista de tabla</string> @@ -735,46 +442,27 @@ <string name="section_feedback">Retroalimentación</string> <string name="section_indicators">Indicadores</string> <string name="value">Valor</string> + <string name="camera_permission_denied">El permiso de la cámara está denegado.\nDebe habilitarlo para usar esta función.</string> <string name="section_charts_indicators">Gráficos e indicadores</string> <string name="take_photo">Tomar foto</string> - <string name="from_gallery">Elija de la galería</string> - <string name="data_set_quality_check_done">¡Listo!</string> <string name="break_glass_dialog_title">Este programa está protegido</string> <string name="break_glass_hint">Describe aquí la razón</string> - <string name="authenticating">Autentificando</string> - <string name="login_error_no_dhis_instance">El enlace del servidor proporcionada no es una instancia de dhis</string> - <string name="login_error_bad_credentials">Credenciales incorrectas</string> - <string name="login_error_unknown_host">Servidor desconocido</string> - <string name="invalid_integer">El valor debe ser un entero</string> <string name="openid_session_expired">La sesión ha terminado</string> <string name="openid_session_expired_message">Su sesión actual ha terminado. Por razones de seguridad, tendrá que volver a proporcionar sus credenciales</string> - <string name="dataset_column_default">Valores</string> <string name="week_period_span_default_label">Semana %d %s a %s</string> <string name="action_do_not_show_again">No volver a mostrar</string> <string name="feature_configuration">Configuración de funciones</string> <string name="show_radar_graph">Ver como gráfico de radar</string> - <string name="coordinate_feature_type_error">No se pudo modificar las coordenadas</string> <string name="filter_follow_up_label">Seguido %s</string> - <string name="wrong_date_format">%s no es una fecha válida</string> <string name="update_field_error">No se ha podido actualizar este campo. Prueba otra vez.</string> - <string name="edition">Edición</string> - <string name="available">Disponible</string> <string name="blocked_by_completion">Los datos no son editables por que está marcado como completado.</string> <string name="edition_expired">Los datos no son editables por que el tiempo de edición ha expirado.</string> <string name="edition_no_write_access">No tiene permisos de edición para estos datos.</string> <string name="event_date_not_in_orgunit_range">Los datos no son editables por que la unidad organizativa está cerrada.</string> <string name="edition_no_catcombo_access">No tiene permisos de edición para estos datos.</string> - <string name="edition_orgunit_capture_scope">No puede editar datos en esta unidad organizativa.</string> - <string name="reload_list">Reiniciar búsqueda</string> + <string name="edition_orgunit_user_scope">No puede editar datos en esta unidad organizativa.</string> <string name="error_tei_online_search_title">La búsqueda online a devuelto este mensaje:</string> - <string name="program_rules_loop_warning_title">Advertencia de reglas del programa</string> - <string name="program_rules_loop_warning_message">Hay un problema de configuración que provoca un bucle en las reglas. Póngase en contacto con su administrador.</string> - <string name="granular_sync_refresh">Recarga</string> - <string name="unknown_date">Desconocido</string> - <string name="granular_sync_refresh_title">Recarga todos los datos</string> - <string name="max_accounts_text">Se ha alcanzado el nunero máximo de cuentas de usuario (%d). Para agregar una nueva cuenta, inicie sesion y elimine una de las existentes.</string> <string name="delete_account">Eliminar una cuenta</string> - <string name="manage_accounts">Administrar cuenta</string> <string name="main_menu_troubleshooting">Revisión de configuración </string> <string name="troubleshooting_language_title">Idioma</string> <string name="troubleshooting_language_description">Toque aquí para cambiar el idioma de la aplicación</string> @@ -792,13 +480,12 @@ <string name="search_no_results">No hay más resultados para esta búsqueda</string> <string name="search_too_many_results">Demasiados resultados</string> <string name="search_too_many_results_message">Intente cambiar su búsqueda para restringir los resultados.</string> - <string name="search_create_new">Crear nuevo</string> - <string name="search_min_attributes_message">Es necesario que ingrese al menos %s atributos para iniciar la búsqueda</string> <string name="action_ok">De acuerdo</string> <string name="init_search">Empieza una búsqueda para encontrar %s</string> <string name="search_or_create">Puedes buscar o crear un nuevo %s</string> <string name="event_can_be_completed">¿Desea marcar este formulario como completo?</string> <string name="changes_will_be_discarted">Si sales los cambios serán descartados.</string> + <string name="event_error_on_complete">Tiene algunos mensajes de error. \n¿Desea revisarlos?</string> <string name="re_opened">Reabrir</string> <string name="account_disable_title">Cuenta deshabilitada</string> <string name="account_disable_message">Tu cuenta ha sido deshabilitada por un administrador</string> @@ -808,16 +495,8 @@ <string name="customactivityoncrash_error_activity_current_date">Fecha actual: %s</string> <string name="customactivityoncrash_error_activity_device">Dispositivo: %s</string> <string name="customactivityoncrash_error_activity_os_version">Versión del SO: %s</string> - <string name="open_details">Abrir detalles de %s</string> <string name="syncing_resource">Sincronizando %s...</string> - <string name="sms_sync_waiting_for_response">SMS enviado. Esperando respuesta del servidor.</string> - <string name="sms_sync_sms_reached_server">Se ha confirmado que el SMS llegó al servidor. Actualizando estado</string> - <string name="sms_sync_sms_reached_server_error">No podemos confirmar que el SMS llegó al servidor. Actualizando estado</string> - <string name="sms_sync_sent">SMS enviado. Actualizando estado.</string> - <string name="sms_sync_not_sent">SMS no enviado.</string> - <string name="sms_sync_opening_app">Abriendo aplicación de SMS. Por favor, no modifique el mensaje.</string> <string name="sms_sync_sms_app_chooser_title">Enviar SMS con</string> - <string name="sms_sync_manual_confirmation">Esperando confirmación manual</string> <string name="sync_dialog_title_synced">Sincronizado</string> <string name="sync_dialog_title_syncing">Sincronizando</string> <string name="sync_dialog_action_not_now">Ahora no</string> @@ -829,4 +508,9 @@ <string name="event">evento</string> <string name="sync">Sincronizado</string> <string name="syncing_something">Sincronizando %s...</string> - </resources> + <plurals name="settings_specific_programs"> + <item quantity="one">Hay %s programa con una configuración específica</item> + <item quantity="many">Hay %s programas con configuraciones específicas</item> + <item quantity="other">Hay %s programas con configuraciones específicas</item> + </plurals> +</resources> diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 0ba47fac40a..73b5115e7af 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1,65 +1,28 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!--GENERAL--> <string name="app_name">DHIS 2</string> - <string name="logo_text">DHIS</string> - <string name="logo_number">2</string> <!-- Warnings and error messages --> <string name="error">Error</string> - <plurals name="error_message"> - <item quantity="one">Error</item> - <item quantity="many">Errores</item> - <item quantity="other">Errores</item> - </plurals> - <string name="error_wrong_server_url">URL incorrecta</string> - <string name="error_wrong_credentials">Credenciales incorrectas</string> - <string name="error_unexpected_error">Error desconocido</string> - <string name="error_internal_server_error">Error interno</string> - <string name="no_value">sin valor</string> <string name="no_reserved_values">No quedan valores reservados. Contacte con el administrador del sistema.</string> - <string name="no_reserved_values_connection">No quedan valores reservados. Conéctese a internet para recargarlos.</string> - <string name="errors">errores</string> <string name="something_wrong">Algo ha ido mal</string> <!-- SyncService strings: --> - <string name="sync_now">Sincronizar ahora</string> - <string name="sync_text">Sincronizando con el servidor</string> - <string name="sync_title">Sincronizando</string> - <string name="sync_metadata">Metadatos</string> <string name="sync_events">Eventos</string> - <string name="sync_tei">Entidades monitoreadas</string> - - <string name="sync_complete_title">Terminado</string> - <string name="sync_complete_text">Sincronizacion completa</string> <string name="sync_error_title">Error en sincronizacion</string> <string name="sync_error_text">La sincronizacion ha fallado. Intentelo de nuevo.</string> <string name="sync_incomplete_error_text">La sincronización ha terminado pero no se ha recibido confirmación del servidor en algunos rescursos. Éstos estarán marcados como \"no sincronizados\" en la App. Recomendamos reintentar la sincronización.</string> - <string name="data_sync_warning_program">WARNING: la mayoría de sus datos se han sincronizado, pero algunos generaron conflictos. Sincronice su configuración y pruebe otra vez. Si el error persiste, revise el estado de sincronización: los programas, TEIs y events con conflictos tienen el icono @</string> - <string name="server_sync_error">Hubo un error y el serivdor no respondío. Contacte su administrador.</string> - - <string name="search_result_text">%s resultados</string> - <string name="add_new">Agregar nuevo</string> - <string name="add">Añadir</string> <string name="enter_event_data">Ingresar %s</string> <string name="enter_cancel_event_data">Editar / Omitir %s</string> - <string name="schedule_new">Programar</string> <string name="referral">Remitir</string> <!-- Login --> - <string name="url_hint">URL de servidor</string> - <string name="user_hint">Nombre de usuario</string> - <string name="password_hint">Contraseña</string> - <string name="log_in_button">Iniciar sesion</string> - <string name="unlock_button">Desbloquear sesion</string> <string name="syncing_configuration">Sincronizando tu configuracion</string> <string name="syncing_data_shortly">Sus datos estaran disponibles pronto</string> <string name="syncing_data">Sincronizando sus datos</string> <string name="configuration_ready">Su configuracion esta lista</string> <string name="data_ready">Sus datos están disponibles</string> - <string name="configuration_sync_failed">Error en la sincronizacion de configuracion</string> - <string name="data_sync_failed">Error en la sincronizacion de datos</string> <string name="account_recovery">Recuperación de cuenta</string> - <string name="no_network_to_recover_account">Necesita conexión de datos si desea recuperar su cuenta.</string> <!--PERIOD--> <string name="DAILY">Diario</string> @@ -80,140 +43,88 @@ <string name="enter_text">Introducir texto</string> <string name="enter_long_text">Introducir texto largo</string> <string name="enter_number">Introducir numero</string> - <string name="enter_integer">Introducir entero</string> <string name="enter_negative_integer">Introducir entero negativo</string> <string name="enter_positive_integer_or_zero">Introducir entero o cero</string> <string name="enter_positive_integer">Introducir entero positivo</string> - <string name="filter_options">Opciones</string> <string name="choose_date">Introducir fecha</string> - <string name="change_calendar">Cambiar calendario</string> <!-- Status --> - <string name="program_completed">Programa Completado</string> - <string name="program_inactive">Programa suspendido</string> <string name="event_open">Abrir</string> <string name="event_not_completed">No completado</string> <string name="event_completed">Evento completado</string> <string name="read_only">Sólo lectura</string> - <string name="finish_and_complete">Acabar y completar</string> <string name="completed">Completado</string> <string name="cancelled">Cancelar</string> <string name="re_open">Reabrir</string> - <string name="re_open_form">Reabrir formulario</string> - <string name="activate">Activar</string> <string name="active">Activo</string> <!-- State --> <string name="state_synced">Sincronizado</string> <string name="state_to_post">Por enviar</string> <string name="state_to_update">Para actualizar</string> - <string name="state_to_delete">Para borrar</string> <string name="state_error">Error</string> - <string name="action_sync">Sincronizar</string> - <string name="action_send">ENVIAR</string> - <string name="action_sync_sms">Sincronizar SMS</string> <!--Completion--> - <string name="completion">Completado</string> <!--Event initial--> - <string name="create">Crear</string> <string name="update">Actualizar</string> - <string name="date">Fecha</string> <string name="org_unit">Unidad Organizativa</string> <string name="no_org_units">No hay Unidades Organizativas abiertas para la fecha seleccionada. Seleccione otra fecha u otra Unidad Organizativa.</string> - <string name="category_option">Opcion de categoria</string> <string name="latitude">Latitud</string> <string name="longitude">Longitud</string> - <string name="new_event">Evento nuevo</string> - <string name="one_time">Una vez</string> - <string name="permanent">Permanente</string> <!--DataSet initial--> <string name="report_period">Periodo de presentacion de informe</string> - <string name="cat_option">Opción de categoría</string> - <string name="field_required">Si introduce un valor, tendrá que completar toda la fila para poder marcar como Completado el Data Set.</string> - <string name="field_mandatory">Hay campos obligatorios vacíos. Deben tener valor para poder marcar como Completado el Data Set.</string> - <string name="field_mandatory_v2">Hay campos obligatorios vacíos. Por favor, rellénelos para poder completar el set de datos.</string> - <string name="datavalue_saved">Guardado!</string> - <string name="there_is_no_available_period">No hay periodos disponibles.</string> <!--Event Detail--> <string name="due_date">Fecha de vencimiento</string> <string name="next_event">Siguiente %1$s</string> <string name="cat_combo">Cat Combo</string> - <string name="date_default">DD/MM/YYYY</string> <string name="cancel">Cancelar</string> <string name="delete">Borrar</string> - <string name="total">Total</string> <string name="most_recent_event_date">Fecha de evento más reciente</string> <string name="no_options">No hay opciones disponibles</string> <!--TEI Enrollment list--> <string name="enrollment_list">Lista de inscripción</string> <string name="active_programs">Programas activos</string> - <string name="to_enroll_programs">Programas disponibles para inscripción</string> <string name="enroll">Admitir</string> - <string name="last_visit">Ultima visita:</string> - <string name="apply">Aplicar</string> <!--TEI DASHBOARD--> - <string name="see_details">Ver detalles</string> - <string name="view_more">Ver mas</string> <string name="edit">Editar</string> - <string name="follow_up">Seguimiento</string> - <string name="follow_up_enabled">Seguimiento activado</string> - <string name="follow_up_disabled">Seguimiento desactivado</string> <string name="deactivate">Desactivar</string> <string name="program_not_allow_events">Este programa no admite más eventos</string> <!--DONE TASKS--> - <string name="events_no_data">No hay datos</string> <string name="events">Eventos</string> <string name="done_task">Inicio</string> - <string name="app_info">Información de la App</string> <string name="log_out">Cerrar Sesion</string> - <string name="block_session">Bloquear sesion</string> <string name="show_more_events">Mostrar %s más...</string> <string name="show_less_events">Mostrar menos...</string> <!-- SYNC --> - <string name="a_minute">1 minuto</string> - <string name="fifteen_minute">15 minutos</string> <string name="thirty_minutes">30 minutos</string> <string name="a_hour">1 hora</string> <string name="every_6_hours">6h</string> <string name="a_day">1 día (por defecto)</string> <string name="every_12_hours">12h</string> - <string name="Automatic_Sync_Data">Sincronizacion de datos automatica cada:</string> <string name="Manual">Manual</string> - <string name="Automatic_Sync_Metadata">Sincronizacion de configuracion automatica cada:</string> <string name="a_week">Semanal</string> <string name="sync_max_parameters">Ajustes actuales de sincronización:</string> <string name="sync_default_parameters">Volver a los valores por defecto</string> + <string name="wipe_data_meesage">Se borrará la base de datos. \nTendrá que volver a iniciar sesión.</string> <string name="wipe_data_ok">Aceptar</string> <string name="wipe_data_no">Cancelar</string> <string name="SYNC_DATA">Sincronizar datos Ahora</string> <string name="SYNC_META">Sincronizar configuracion ahora</string> <string name="SYNC_MANAGER">Configuración</string> - <string name="last_data_sync_date">Última sincronización: %s</string> <string name="last_data_sync">Última sincronización</string> - <string name="last_metadata_sync_date">Última sincronización: %s</string> <string name="refill_reserved_values">Recargar</string> - <string name="settings_sms_module_title">Modulo SMS:</string> <string name="settings_sms_receiver_number">SMS gateway</string> <string name="settings_sms_result_sender_number">Emisor del SMS de resultado</string> <string name="settings_sms_result_timeout">Tiempo de espera para SMS (seg)</string> - <string name="settings_sms_result_timeout_hint">segundos</string> - <string name="settings_sms_result_sender_hint">numero</string> - <string name="settings_sms_receiver_number_hint">numero</string> <string name="settings_sms_module_switch">Permitir envío por SMS</string> <string name="settings_sms_response_wait_switch">Esperar confirmación por SMS</string> - <plurals name="settings_specific_programs"> - <item quantity="one">Hay %s programa con una configuración específica</item> - <item quantity="many">Hay %s programas con configuraciones específicas</item> - <item quantity="other">Hay %s programas con configuraciones específicas</item> - </plurals> <string name="settings_sync_period_v2">Periodo de sincronización</string> <string name="settings_limit_scope">Configuración limitada</string> <string name="settings_limit_globally">Globalmente</string> @@ -232,20 +143,15 @@ <string name="settingsErrorLog_descr">Aquí están todos los errores encontrados durante la sincronización de datos y metadatos.</string> <string name="settingsDeleteLocalData">Borrar datos locales</string> <string name="settingsDeleteLocalData_descr">Se borrarán todos los datos guardados por la App. Los datos que no se hayan enviado al servidor se perderán.</string> - <string name="settingsReset">Reiniciar app</string> - <string name="settingsReset_descr">Se borrará la configuración y todos los datos guardados por la App. Tendrá que iniciar sesión de nuevo y los datos que no se hayan enviado al servidor se perderán.</string> <string name="settingsSms">Configuración SMS</string> <string name="settingsSms_descr">Verifique los parámetros relacionados con la SMS gateway</string> <string name="settingsCheckVersion">Actualización de software</string> - <string name="settingsCheckVersionMessage">Software</string> <string name="settingsExportDB">Exportar base de datos</string> <string name="settingsExportDBMessage">Exporta tu base de datos y compártela con tu administrador</string> <string name="settingTwoFA">Autenticación de dos factores</string> <string name="settingsTwoFAStatus">Estado</string> <!--endregion--> - <string name="enrollmment_date">Fecha de inscripción</string> - <!-- SEARCH OPTION SET --> <string name="search_optionset">Buscar</string> <!--FORM FRAGMENT--> @@ -267,29 +173,15 @@ <string name="tei_coordinates">Coordenadas para</string> <!--EVENT SUMMARY--> - <string name="section_list">Lista de secciones</string> - <string name="event_summary_header" formatted="false">%s preguntas de %s completadas</string> - <string name="event_summary_sections_header" formatted="false">%s de %s completados</string> - <string name="complete_and_close">Completar y cerrar</string> <!--AGE CUSTOM VIEW--> - <string name="hint_day">Días</string> - <string name="hint_month">Meses</string> - <string name="hint_year">Años</string> - <string name="week">Semanas</string> <string name="incident_date">Fecha del incidente</string> - <string name="local_results">Resultados locales</string> - <string name="online_results">Resultados online</string> <string name="past_programs">Programas pasados</string> <!--PERMISSIONS--> <string name="permission_denied">No tiene los permisos necesarios para realizar esta acción</string> - <string name="add_relation_button">Añadir como…</string> - <string name="date_dialog_clear">Limpiar</string> <string name="period">Periodo</string> - <string name="org_unit_filter">(%d) Unidad Org.</string> - <string name="org_unit_select_level">Nivel %d</string> <string name="tuto_main_1">Bienvenido a dhis2</string> <string name="tuto_main_2">Aquí aparecerán sus actividades</string> <string name="tuto_main_3">Puedes aplicar un filtro…</string> @@ -298,16 +190,11 @@ <string name="tuto_main_6">En el menú principal podrá realizar más acciones</string> <!-- RELATIONSHIPS --> - <string name="default_relationship_label">Añadir relación</string> <string name="next">Siguiente</string> <string name="search_min_num_attr">Es necesario introducir al menos %d de los atributos para iniciar una búsqueda</string> - <string name="search_attr">Hay que rellenar al menos un atributo para buscar</string> - <string name="search_max_tei_reached">Hay más de %d resultados. Por favor, especifique más su búsqueda</string> - <string name="search_init">Introduzca algún criterio de búsqueda</string> <!-- QR --> <string name="QR_SCANNER">Importar datos QR</string> - <string name="SAVE">Guardar</string> <string name="button_ok">Correcto</string> <string name="qr_id">Identificación</string> <string name="qr_attributes">Atributos</string> @@ -319,32 +206,20 @@ <string name="qr_no_data">sin datos</string> <string name="qr_error_id">Código QR no válido</string> <string name="qr_error_attr">Este atributo no puede ser añadido</string> - <string name="qr_error_enrollment">Esta admisión no puede ser añadida</string> <string name="about">Acerca de</string> <string name="programs_to_enroll">Programas disponibles para admisión</string> - <string name="select_all">Selecionar todo</string> - <string name="clear_all">Borrar selección</string> - <string name="empty_program_list">No hay información para los filtros seleccionados. Pruebe modificándolos.</string> <string name="share">Compartir</string> <string name="share_qr">Compartir QR</string> <string name="max">Máx</string> <string name="current">En uso</string> <string name="tei">TEI</string> <string name="teis">TEIs</string> - <string name="limit_by_organisation_unit">Limitar por unid. organizativa</string> - <string name="limit_by_program">Limitado por programa</string> - <string name="programs_list">Listado de programas</string> <string name="wipe_data">Reiniciar app</string> - <string name="add_relationship_error">No es posible añadir esta relación</string> <string name="warning_error_on_complete_title">¡Importante!</string> - <string name="warning_on_complete_title">Advertencia</string> - <string name="error_on_complete_title">Error</string> <string name="save">Guardar</string> <string name="reserved_value">Valores Reservados</string> - <string name="downloaded_confirm">Quiere añadir más información de códigos QR?</string> - <!--ABOUT--> <string name="about_app">Versión de la app: %s</string> <string name="about_sdk">Versión del SDK: %s</string> @@ -355,131 +230,43 @@ <string name="about_dev">Desarrollada y mantenida por el proyecto <a href="https://www.dhis2.org/">DHIS2</a>, parte de la Universidad de Oslo, <a href="https://www.mn.uio.no/ifi/english/">departamento de informática</a>.</string> <string name="about_contact">Para más información o preguntas sobre la aplicación, por favor escriba a <a href="mailto:android@dhis2.org">android\@dhis2.org</a></string> - <string name="login_error_null_pass">La contraseña está vacía. Complete este campo por favor.</string> - <string name="login_error_null_username">El usuario está vacío. Complete este campo por favor.</string> - <string name="login_error_dhis_version">Este servidor trabaja sobre una versión de dhis distinta a 2.29. Actualice el servidor o utilice el entorno de pruebas para continuar.</string> - <string name="login_error_dhis_version_v2">Este servidor tiene una version de dhis diferente de %s. Actualice su servidor o use el servidor de testing para continuar.</string> - <string name="login_error_unsuccessful_response">Algo ha ido mal. Por favor, compruebe que tanto la url del servidor como el usuario y contraseña son correctos y pruebe otra vez.</string> - <string name="login_error_error_response">El servidor no ha podido completar su solicitur.</string> - <string name="login_error_default">Ha habido un problema intentando conectarse al servidor.</string> - <string name="login_error">Error de Acceso</string> - <string name="missing_mandatory_fields">Los campos obligatorios no pueden estar vacios</string> - <string name="online_search_unexpected">Error inesperado mientras se ejecutaba la búsqueda online</string> - <string name="online_search_parsing_error">Error al obtener los resultados</string> - <string name="online_search_error">La busqueda online devolvió un error</string> - <string name="online_search_response_error">Algo fue mal al conectar con el servidor</string> <string name="search_program_not_selected">Seleccione un programa para habilitar nuevas admisiones</string> <string name="search_access_error">No tiene los permisos necesarios</string> - <string name="feature_unavaible">Esta funcionalidad no está lista.</string> - <string name="relationship_label_error">Error al recuperar la etiqueta de la relación</string> <string name="all_tei_type">Todo %s</string> <string name="invalid_phone_number">Este no es un número de teléfono válido</string> - <string name="invalid_email">Este no es un email válido</string> - <string name="invalid_negative_number">Solo se permiten números negativos</string> <string name="invalid_possitive_zero">Solo se permiten números positivos o cero</string> - <string name="invalid_possitive">Solo se permiten números positivos</string> - <string name="invalid_interval">Solo se permiten valores entre 0 y 1</string> - <string name="invalid_percentage">Solo se permiten valores entre 0 y 100</string> - <string name="date_dialog_tigle">Selecciona las fechas para filtrar</string> <string name="select_option">Seleccionar opción</string> - <string name="issue_reported">Incidencia reportada</string> - <string name="dialog_generate_new_event">Generar nuevo evento</string> - <string name="message_generate_new_event">¿Quiere crear un nuevo evento?</string> <string name="event_completed_title">Eventos Completados</string> <string name="event_completed_message">Todos los eventos de este programa están completados. ¿Quiere completar el programa también?</string> - <string name="complete_enrollment_message">¿ Completar también la inscripción? </string> <string name="complete_enrollment_message_V2">¿Le gustaría completar %s también?</string> <string name="check_event">Ver</string> <string name="menu_home">Inicio</string> <string name="appwidget_text">EJEMPLO</string> - <string name="add_widget">Añadir Widget</string> <string name="showHelp">Ver ayuda</string> - <string name="tuto_settings_1">Sincronice sus datos...</string> - <string name="tuto_settings_2">... sincronive su configuracion...</string> - <string name="tuto_settings_3">Configure el almacenamiento local</string> - <string name="tuto_settings_reserved">Ver y gestionar cuantos valores reservados quedan</string> - <string name="tuto_settings_errors">Compruebe si la conexión con el servidor ha fallado</string> - <string name="tuto_settings_reset">Liberar memoria</string> - <string name="tuto_settings_4">o borre todo y empiece de cero.</string> - <string name="tuto_search_1_v2">Encuentre sus entidades tanto en tu dispositivo local como en el servidor.</string> - <string name="tuto_search_2">Puede cambiar de programa</string> - <string name="tuto_search_3_v2">Buscar o añadir nuevas entidades. ¡ Hay que buscar antes de añadir nuevas entidades !</string> - <string name="tuto_search_4_v2">Click aquí para limpiar los campos y reiniciar la búsqueda.</string> <string name="tuto_dashboard_1">Este es el Dashboard de entidad</string> <string name="tuto_dashboard_2">Puede ver la información de perfil</string> - <string name="tuto_dashboard_3">Compartir información via QR o SMS</string> - <string name="tuto_dashboard_4">O marcar una entidad para seguimiento</string> - <string name="tuto_dashboard_5">Puede crear o programar un evento, o referir a otra Org. Unit</string> <string name="tuto_dashboard_6">Aquí estan todos los eventos. Pulse para ver los detalles.</string> <string name="tuto_dashboard_7">Navegue el menú para añadir relaciones, ver indicadores o escribir notas.</string> - <string name="tuto_dashboard_8">Aqui puede ver todos los enrolments o crear uno nuevo.</string> - <string name="tuto_tei_event_1">Pulse para borrar este evento. Esta acción no se puede deshacer.</string> - <string name="tuto_tei_event_2">Completar el evento.</string> - <string name="tuto_program_event_1">Todos los eventos de este programa seran listados aqui.</string> - <string name="tuto_program_event_2">Haga click para añadir un nuevo evento</string> <string name="tuto_event_initial_new_1">Complete todos los campos para crear el evento</string> <string name="tuto_event_initial_1">Aqui puedes ver el % de campos completos en el evento. </string> - <string name="tuto_event_summary">Haga click para completar o re-abrir un evento</string> - <string name="tuto_main_7">Lea y almacene información de otros dispositivos a través de códigos QR</string> - <string name="tuto_main_8">Sincronice sus datos con el servidor</string> - <string name="tuto_main_9">Bloquee la session con un digito de 4 cifras. ¡No olvide su codigo! </string> - <string name="tuto_main_10">Cierre sesión para cambiar de usuario o de servidor. Podrá volver a entrar con el mismo usuario si no hay internet.</string> - <string name="text_plus_colon">%s:</string> <string name="relationships">relaciones</string> <string name="empty_tei_add">No hay eventos registrados, haga click en \"+\" para añadir uno.</string> - <string name="empty_tei_no_add">No hay eventos registrados.</string> <string name="qr_data_values">Valores de datos</string> <string name="info">Información</string> <string name="qr_no_id_error">No se ha podido leer este Id</string> <string name="delete_local_data">Borrar datos</string> <string name="dashboard_overview">General</string> - <string name="dashboard_relationships">Relaciones</string> - <string name="dashboard_indicators">Indicadores</string> - <string name="dashboard_analytics">Analíticas</string> <string name="empty_indicators">No hay indicadores para este programa.</string> - <string name="dashboard_notes">Notas</string> - <string name="unable_to_complete">No se puede completar</string> - <string name="unable_to_save">No se pudo guardar</string> - <string name="warnings_in_form">Hay mensajes de aviso en el formulario</string> - <string name="what_to_do">¿Qué quiere hacer?</string> - <string name="field_errors">Algunos campos contienen errores. Por favor, revíselos para poder completar.</string> <string name="unselect_enrollment">Deseleccionar inscripción</string> <string name="unselect_enrollment_description">Mostrar todos los programas activos</string> - <string name="CHECK_SYNC_ERRORS">Comprobar errores de sincronización</string> <string name="error_dialog_title">Lista de errores de sincronización</string> <string name="share_with">Compartir con...</string> - <string name="errors_during_sync">La sincronización de configuración ha fallado. Puede haber fallos en el servidor. Haga click aquí para mas información.</string> - <string name="sectionSelectorPrev">ANTERIOR</string> - <string name="sectionSelectorNext">SIGUIENTE</string> - <string name="event_overview">Detalles</string> - <string name="event_indicators">Indicadores</string> - <string name="event_notes">Notas</string> - <string name="complete_add_new"><![CDATA[Completar y añadir]]></string> - <string name="complete_later">Completar mas tarde</string> - <string name="finish_add_new"><![CDATA[Acabar y añadir]]></string> - <string name="finish">Acabar</string> - <string name="error_fields_title">Campos con errores</string> - <string name="error_fields_events">Algunos campos presentan errores. No se han guardado. Revíselos por favor.</string> <string name="unique_warning">El valor debe ser único, se ha encontrado una coincidencia. El campo no se ha guardado, revíselo.</string> - <string name="unique_coincidence_found">Se ha encontrado una coincidencia en un campo único. Por favor compruebe el formulario para guardar el registro.</string> <string name="please_wait">Por favor, espere</string> <string name="skip">Omitir</string> - <string name="reschedule">Reprogramar</string> <string name="no_intructions">No hay información sobre esta pantalla</string> - <string name="event_overdue">Atrasado</string> - <string name="unsupported_program_rule">Hay alguna program rule no soportada. Revise la documentación.</string> - <string name="empty_description">No hay información para este campo</string> - <string name="biometrics_dialog_title">Vaciar credenciales</string> - <string name="biometrics_first_use_text">Para poder iniciar sesión por huella dactilar debe entrar primero por el modo normal</string> - <string name="biometrics_security_title">Seguridad biométrica</string> - <string name="biometrics_login_title">Acceso rápido</string> - <string name="biometrics_login_text">¿Te gustaría usar tu huella o algún otro método biométrico para acceder?</string> - <string name="tab_tables">Tablas</string> - <string name="table">Tabla</string> - <string name="login_https">https://</string> <string name="delete_local_data_message">Los datos no sincronizados se perderán. Continuar?</string> - <string name="local_data_accept">Aceptar</string> <string name="delete_local_data_error">Los datos no se pudieron borrar. Inténtelo de nuevo.</string> <string name="delete_local_data_done">Los datos locales se borraron correctamente.</string> <string name="org_unit_selection_warning">Debe seleccionar al menos una unidad organizativa.</string> @@ -492,6 +279,7 @@ <string name="action_agree">Confirmar</string> <string name="action_continue">Seguir</string> <string name="login_server_info_title">URL de servidor</string> + <string name="login_server_info_message">Introduzca la URL del servidor DHIS 2 de su organización proporcionada por su administrador. También puede escanear un código QR con la URL de su servidor. </string> <string name="forgot_your_code">¿Olvido su código?</string> <string name="event_form_end_options_title">¿Que quiere hacer con este evento?</string> <string name="sectionSelectorEnd">FIN</string> @@ -502,33 +290,16 @@ <string name="state_uploading">Subiendo</string> <string name="state_relationship">Relación</string> <string name="sent_by_sms">Enviado por mensaje de texto</string> - <string name="no_conflicts_message">Este programa no tiene conflictos</string> - <string name="network_unavailable_sms">No hay conexión a internet, pero hay señal telefónica - puede utilizar SMS.</string> - <string name="network_unavailable">Conexión no disponible.</string> <string name="action_close">Cerrar</string> <string name="tuto_main_11">Puede ver la información de configuración haciendo click aquí</string> - <string name="no_conflicts_update_message">Estos datos están guardados en su dispositivo solamente, no se han enviado al servidor.</string> - <string name="no_conflicts_synced_message">¡Esta al día! Todos tus datos se han enviado al servidor.</string> <string name="relationship_error_recursive">No se puede relacionar un registro con el mismo</string> - <string name="unblock_session">Desbloquear sesión</string> - <string name="data_set_complete">Completar</string> - <string name="data_set_open">Abierto</string> - <string name="unsupported_value_type">Tipo de valor no admitido</string> <string name="change_calendar_view">Cambiar vista</string> - <string name="data_every_fifteen_minutes">15 minutos</string> - <string name="data_every_hour">Cada hora</string> - <string name="data_every_day">Diario</string> - <string name="data_every_week">Semanal</string> - <string name="period_week">Semana</string> - <string name="sync_setting">Parámetros de configuración: %s</string> <string name="relationship_without_enrollment">Este registro no tiene ninguna inscripción. No se puede acceder al dashboard.</string> <string name="formatting_error">Error de formato</string> <string name="dashboard_menu_delete_tei_v2">Eliminar %s</string> <string name="delete_authority_error">No tienes permisos para borrar este registro</string> - <string name="validation_url">La URL no es válida</string> <string name="adjusting_form">Adaptando el formulario...</string> - <string name="sms_receiver_number">Numero receptor</string> <string name="sms_amount_question">Quiere enviar %d SMS?</string> <string name="sms_sending">Enviando %1$d/%2$d</string> <string name="sms_waiting_amount_confirm">Esperando confirmación - %d</string> @@ -546,51 +317,29 @@ <string name="sms_error_no_gateway_set">Puerta de acceso no definida</string> <string name="sms_error_no_user_login">El usuario no ha iniciado sesión</string> <string name="sms_error_module_disabled">Modulo SMS desabilitado</string> - <string name="sms_error_ongoing_sunmission">Se está enviando otro SMS en este momento</string> <string name="sms_metadata_empty">Modulo SMS no inicializado. No se encontraron los metadatos necesarios.</string> - <string name="sms_completed">Completado</string> <string name="sms_count_error">No se ha aceptado el número de SMS</string> <string name="sms_state_started">Inicio del envío de sms</string> <string name="sms_state_converted">Datos leídos y convertidos. Id de envío: 1%d</string> - <string name="sms_general_error">Error al enviar sms</string> <string name="sms_title_enrollment">SMS para registro de TEI</string> <string name="sms_title_event">SMS para evento</string> <string name="sms_title_data_set">SMS para conjunto de datos</string> - <string name="sms_bar_state_starting">Iniciando</string> - <string name="sms_bar_state_sending">En proceso</string> - <string name="sms_bar_state_sent">Enviado</string> - <string name="sms_bar_state_failed">Ha fallado</string> - <string name="start_sync_granular">Iniciando sincronización.</string> <string name="syncing">Sincronizando...</string> - <string name="end_sync_granular">Sincronización completada</string> - <string name="error_sync">Ocurrió un error en la sincronización</string> - <string name="error_sync_check_logs">Se ha producido un error durante la sincronización. Pulse aquí para ver el listado de errores</string> - <string name="cancel_sync">Cancelar sincronización</string> <string name="copied_text">Copiado</string> - <string name="image_selected">Imagen seleccionada</string> - <string name="show_in_map">Mostrar en el Mapa</string> - <string name="show_list">Mostrar lista</string> <!--region TRACKER IMPORT CONFLICT MESSAGES--> - <string name="value_required_but_not_provided">%s es obligatorio y no tiene valor</string> - <string name="polygon_captured">Polígono guardado</string> <string name="polygon">Polígono</string> <!--endregion--> - <string name="fingerprint_title">Huella dactilar</string> - <string name="fingerprint_message">Por favor, toque con el dedo el lector de huellas.</string> <string name="security_title">Seguridad</string> <string name="security_rooted_message">Por motivos de seguridad, esta versión de la aplicación no permite su uso en dispositivos root. Por favor use la versión de formación.</string> - <string name="fix_error">Hay algunos errores. Por favor corríjalos antes de continuar.</string> <string name="filters_active">Filtros activos</string> <string name="filters_disabled">Filtros desactivados</string> <string name="filters_title_period">Periodo</string> <string name="filters_title_org_unit">Unidad Org.</string> - <string name="filters_title_sorting">Orden</string> - <string name="filters_title_status">Estado</string> <string name="filters_title_state">Sincronizado</string> <string name="filters_title_assigned">Asignado a mí</string> <string name="filter_period_today">Hoy</string> @@ -605,8 +354,6 @@ <string name="filter_period_form_to">Desde - hasta</string> <string name="filter_period_other">Otro</string> <string name="filter_period_any">Cualquier momento</string> - <string name="data_values_error_sync_message">La sincronización falló. Compruebe los valores para tratar de resolver el problema e inténtelo otra vez. Si el fallo persiste contacte con su administrador del sistema.</string> - <string name="sms_synced_message">Los datos se han enviado al servidor pero no se puede garantizar que se hayan guardado</string> <string name="filter_event_status_open">Abierto</string> <string name="filter_event_status_schedule">Planificado</string> <string name="filter_event_status_overdue">Atrasado</string> @@ -615,15 +362,12 @@ <string name="filter_event_status_skipped">Omitido</string> <string name="event_tei_limits">Eventos:%smax:%s%sactual:%sEntidades:%smax:%s%sactual:%s</string> <string name="limit_setting">Configuración limitada %s</string> - <string name="enrollment_data_hide">Ocultar datos de registro</string> - <string name="enrollment_data_show">Mostrar datos de registro</string> <string name="sms_enabled">Módulo de SMS activado</string> <string name="sms_disabled">Módulo de SMS desactivado</string> <string name="sms_downloading_data">Descargando datos para el módulo de SMS. Por favor espere.</string> <string name="sms_empty_gateway">El gateway de SMS no puede estar vacío</string> <string name="granular_sync_enrollments_empty">No hay registros que sincronizar</string> <string name="granular_sync_unsupported_task">La conversión elegida no está soportada</string> - <string name="disable_pin_locked">No volver a mostrar la pantalla de bloqueo</string> <string name="set_pin">Establecer pin</string> <string name="conflict">Conflicto</string> <string name="change_event_date">Cambiar fecha</string> @@ -648,11 +392,7 @@ <string name="choose_ou">Elija unidad organizativa</string> <string name="enter_url">Introduzca url</string> <string name="enter_value">Introduzca valor</string> - <string name="choose_image">Elija una imagen</string> - <string name="scan_code">Escanear código</string> - <string name="choose_option">Elija una opción</string> <string name="reserved_values_hint">Valores reservados descargados por atributo de entidad</string> - <string name="settings_reserved_values_message">Valores reservados descargados por atributo de entidad</string> <string name="reserved_values_left">Quedan %s valores reservados</string> <string name="manage_reserved_values_button">Gestionar valores reservados</string> <string name="events_to_download">Eventos a descargar</string> @@ -672,55 +412,29 @@ <string name="filter_sync_not_synced">No Sincronizado</string> <string name="filter_sync_error">Error en la sincronización</string> <string name="filter_sync_sms">Sincronización de SMS</string> - <string name="dataset_overview">Detalles</string> - <string name="dataset_comments">Comentarios</string> <string name="saved">¡Guardado!</string> - <string name="run_validation_rules">¿Quiere validar la calidad de los datos?</string> - <string name="validation_success_title">¡Parece que todo está bien!</string> - <string name="mark_dataset_complete">¿Quiere completar también el set de datos?</string> - <string name="dataset_completed">Marcar como completado</string> - <string name="name">Nombre</string> - <string name="formula">Fórmula</string> - <string name="complete_anyway">Completar de todas formas</string> <string name="fk_message">No se ha encontrado %s %s en %s %s</string> <string name="filters_title_event_status">Estado del evento</string> - <string name="enrollment_date">Fecha de inscripción</string> <string name="dataset_empty_list_can_create">No hay datos. Pulse \"+\" para añadir un nuevo registro</string> <string name="dataset_emtpy_list_can_not_create">No hay datos. No tiene permisos para añadir un nuevo registro.</string> <string name="validation_rules_empty_description">No se han proporcionado descripción o instrucciones</string> <string name="validation_rules_data_to_review">Datos a revisar</string> - <string name="dataset_saved_completed">¡Guardado y completado!</string> <string name="status_change_error_active_exist">Ya existe un registro activo</string> <string name="enrollment_status_active">Abierto</string> <string name="enrollment_status_completed">Completar</string> <string name="enrollment_status_cancelled">Cancelar</string> - <string name="event_data">Datos</string> <string name="download_tei_error">El %s seleccionado no puede ser descargado.</string> - <string name="completed_by">Completado por %s: %s</string> - <string name="updated_time">Actualizado: %s</string> - <string name="action_done">Terminado</string> - <string name="validation_internal_error_datasets">No hemos podido verificar la calidad de los datos. Contacte con su administrador</string> - <string name="are_you_sure">¿Está seguro?</string> - <string name="reopen_question">¿Quiere reabrir este set de datos?</string> <string name="filters_title_date">Fecha</string> - <string name="filters_title_event_date">Fecha de evento</string> - <string name="tei_type_has_no_attributes">%s no tiene atributos públicos. Por favor seleccione un programa</string> <string name="privacy_policy_title">Política de privacidad</string> <string name="open_privacy_policy">Pulse aquí para comprobar nuestra <a href="">política de privacidad</a></string> <string name="coordinates_error">El valor de las coordenadas no es válido</string> + <string name="break_glass_error_v2">No puede registrar un/una %s desde otras unidades organizativas en este programa por que está protegido.\nContacte con su administrador.</string> <string name="field_is_mandatory">El campo es obligatorio</string> <string name="security_debugger_message">Por razones de seguridad, esta versión de la app no permite el uso de adb. Por favor use la versión de formación.</string> <string name="customactivityoncrash_error_activity_restart_app">Ir atrás</string> - <string name="customactivityoncrash_error_activity_close_app">Cerrar app</string> - <string name="customactivityoncrash_error_activity_error_details">Más detalles</string> - <string name="customactivityoncrash_error_activity_error_details_title">Más detalles</string> - <string name="customactivityoncrash_error_activity_error_details_close">Cerrar</string> <string name="customactivityoncrash_error_activity_error_details_copy">Copiar al portapapeles</string> - <string name="customactivityoncrash_error_activity_error_details_copied">Copiado al portapapeles</string> - <string name="customactivityoncrash_error_activity_error_details_clipboard_label">Información del error</string> <string name="metada_first_sync_error">Encontramos un error al sincronizar con su servidor. Comparta el error con el administrador del sistema si es posible.</string> - <string name="error_init_session">No pudimos iniciar la sesión con su usuario</string> <string name="enrollment_date_edition_warning">Hay eventos planificados que no serán reprogramados</string> <string name="section_charts">Gráficas</string> <string name="navigation_list_view">Mostrar</string> @@ -771,47 +485,26 @@ <string name="section_feedback">Retroalimentación</string> <string name="section_indicators">Indicadores</string> <string name="camera_permission_denied">El permiso de cámara está denegado.\nDebes activarlo para usar esta función.</string> - <string name="value">Valor</string> <string name="section_charts_indicators">Gráficos e indicadores</string> <string name="take_photo">Tomar foto</string> - <string name="from_gallery">Elija de la galería</string> - <string name="data_set_quality_check_done">¡Listo!</string> <string name="break_glass_dialog_title">Este programa está protegido</string> <string name="break_glass_hint">Describe aquí la razón</string> - <string name="authenticating">Autentificando</string> - <string name="login_error_no_dhis_instance">El enlace del servidor proporcionada no es una instancia de dhis</string> - <string name="login_error_bad_credentials">Credenciales incorrectas</string> - <string name="login_error_unknown_host">Servidor desconocido</string> - <string name="invalid_integer">El valor debe ser un entero</string> <string name="openid_session_expired">La sesión ha terminado</string> <string name="openid_session_expired_message">Su sesión actual ha terminado. Por razones de seguridad, tendrá que volver a proporcionar sus credenciales</string> - <string name="dataset_column_default">Valores</string> <string name="week_period_span_default_label">Semana %d %s a %s</string> <string name="action_do_not_show_again">No volver a mostrar</string> <string name="feature_configuration">Configuración de funciones</string> <string name="show_radar_graph">Ver como gráfico de radar</string> - <string name="coordinate_feature_type_error">No se pudo modificar las coordenadas</string> <string name="filter_follow_up_label">Seguido %s</string> - <string name="wrong_date_format">%s no es una fecha válida</string> <string name="update_field_error">No se ha podido actualizar este campo. Prueba otra vez.</string> - <string name="edition">Edición</string> - <string name="available">Disponible</string> <string name="blocked_by_completion">Los datos no son editables por que está marcado como completado.</string> <string name="edition_expired">Los datos no son editables por que el tiempo de edición ha expirado.</string> <string name="edition_no_write_access">No tiene permisos de edición para estos datos.</string> <string name="event_date_not_in_orgunit_range">Los datos no son editables por que la unidad organizativa está cerrada.</string> <string name="edition_no_catcombo_access">No tiene permisos de edición para estos datos.</string> - <string name="edition_orgunit_capture_scope">No puede editar datos en esta unidad organizativa.</string> - <string name="reload_list">Reiniciar búsqueda</string> + <string name="edition_orgunit_user_scope">No puede editar datos en esta unidad organizativa.</string> <string name="error_tei_online_search_title">La búsqueda online a devuelto este mensaje:</string> - <string name="program_rules_loop_warning_title">Advertencia de reglas del programa</string> - <string name="program_rules_loop_warning_message">Hay un problema de configuración que provoca un bucle en las reglas. Póngase en contacto con su administrador.</string> - <string name="granular_sync_refresh">Recarga</string> - <string name="unknown_date">Desconocido</string> - <string name="granular_sync_refresh_title">Recarga todos los datos</string> - <string name="max_accounts_text">Se ha alcanzado el nunero máximo de cuentas de usuario (%d). Para agregar una nueva cuenta, inicie sesion y elimine una de las existentes.</string> <string name="delete_account">Eliminar una cuenta</string> - <string name="manage_accounts">Administrar cuenta</string> <string name="main_menu_troubleshooting">Revisión de configuración </string> <string name="troubleshooting_language_title">Idioma</string> <string name="troubleshooting_language_description">Toque aquí para cambiar el idioma de la aplicación</string> @@ -830,9 +523,7 @@ <string name="search_no_results">No hay más resultados para esta búsqueda</string> <string name="search_too_many_results">Demasiados resultados</string> <string name="search_too_many_results_message">Intente cambiar su búsqueda para restringir los resultados.</string> - <string name="search_create_new">Crear nuevo</string> <string name="search_new_te_type">Nuevo %s</string> - <string name="search_min_attributes_message">Es necesario que ingrese al menos %s atributos para iniciar la búsqueda</string> <string name="action_ok">De acuerdo</string> <string name="init_search">Empieza una búsqueda para encontrar %s</string> <string name="search_or_create">Puedes buscar o crear un nuevo %s</string> @@ -841,7 +532,6 @@ <string name="missing_error_fields_events">Algunos campos tienen errores y no se han guardado.\n¿Deseas revisar el formulario\?</string> <string name="event_can_be_completed">¿Desea marcar este formulario como completo?</string> <string name="event_error_on_complete">Tienes algunos mensajes de error.\n¿Deseas revisarlos\?</string> - <string name="changes_will_be_discarted">Si sales los cambios serán descartados.</string> <string name="re_opened">Reabrir</string> <string name="account_disable_title">Cuenta deshabilitada</string> <string name="account_disable_message">Tu cuenta ha sido deshabilitada por un administrador</string> @@ -851,27 +541,10 @@ <string name="customactivityoncrash_error_activity_current_date">Fecha actual: %s</string> <string name="customactivityoncrash_error_activity_device">Dispositivo: %s</string> <string name="customactivityoncrash_error_activity_os_version">Versión del SO: %s</string> - <string name="open_details">Abrir detalles de %s</string> - <string name="tracked_entity_type_details">%s detalles</string> <string name="syncing_resource">Sincronizando %s...</string> - <string name="sms_sync_waiting_for_response">SMS enviado. Esperando respuesta del servidor.</string> - <string name="sms_sync_sms_reached_server">Se ha confirmado que el SMS llegó al servidor. Actualizando estado</string> - <string name="sms_sync_sms_reached_server_error">No podemos confirmar que el SMS llegó al servidor. Actualizando estado</string> - <string name="sms_sync_sent">SMS enviado. Actualizando estado.</string> - <string name="sms_sync_not_sent">SMS no enviado.</string> - <string name="sms_sync_opening_app">Abriendo aplicación de SMS. Por favor, no modifique el mensaje.</string> <string name="sms_sync_sms_app_chooser_title">Enviar SMS con</string> <string name="sms_sync_is_sms_sent">¿Ha enviado el sms?</string> - <string name="sms_sync_manual_confirmation">Esperando confirmación manual</string> - <string name="syncing_events">Sincronizando eventos</string> - <string name="syncing_teis">Sincronizando entidades monitoreadas</string> - <string name="syncing_data_sets">Sincronizando set de datos</string> - <string name="syncing_resources">Sincronizando recursos</string> - <string name="syncing_done">Sincronización completada</string> - <string name="sms_available_for_individual_records">La sincronización de SMS está disponible, pero se debe acceder a cada registro.</string> <string name="downloading_image_resources">Descargando imágenes...</string> - <string name="program_description">Descripción del programa</string> - <string name="wrong_pin">Pin Incorrecto</string> <string name="enrolledIn">Inscrito en</string> <string name="ownedBy">Propiedad de</string> <string name="sync_dialog_title_not_synced">Sincronización necesaria</string> @@ -891,22 +564,11 @@ <string name="sync_dialog_action_refresh">Actualizar</string> <string name="sync_dialog_action_not_now">Ahora no</string> <string name="tap_to_explore_action">Toca aquí para explorar</string> - <plurals name="error_count_label"> - <item quantity="one">%s error</item> - <item quantity="many">%s errores</item> - <item quantity="other">%s errores</item> - </plurals> - <plurals name="warning_count_label"> - <item quantity="one">%s advertencia</item> - <item quantity="many">%s advertencias</item> - <item quantity="other">%s advertencias</item> - </plurals> <string name="new_version_message">La versión <b>%s</b> de la app está disponible. ¿Quieres descargarla?</string> <string name="software_update">Actualización de software</string> <string name="remind_me_later">Más tarde</string> <string name="download_now">Descarga ahora</string> <string name="check_for_updates">Comprobar actualizaciones</string> - <string name="checking_for_updates">Buscando actualizaciones</string> <string name="no_updates">No hay nuevas actualizaciones</string> <string name="app_version">Versión de la app</string> <string name="error_applying_rule_effects">Algo salió mal con la configuración del programa, no podemos cargar este evento. Comuníquese con el administrador de su sistema.</string> @@ -943,8 +605,6 @@ <string name="program_stage">Etapa de programa</string> <string name="event">evento</string> <string name="timeline">Línea de tiempo</string> - <string name="clear_search">Borrar búsqueda</string> - <string name="optional">Opcional</string> <string name="database_export_downloaded">Base de datos descargada</string> <string name="importing_database">Importando base de datos</string> <string name="show_more">Mostrar más</string> @@ -970,4 +630,22 @@ <string name="complete_enrollment_label">Completar %s</string> <string name="deactivate_enrollment_label">Desactivar %s</string> <string name="reopen_enrollment_label">Reabrir %s</string> + + <plurals name="error_count_label"> + <item quantity="one">%s error</item> + <item quantity="many">%s errores</item> + <item quantity="other">%s errores</item> + </plurals> + + <plurals name="warning_count_label"> + <item quantity="one">%s advertencia</item> + <item quantity="many">%s advertencias</item> + <item quantity="other">%s advertencias</item> + </plurals> + + <plurals name="settings_specific_programs"> + <item quantity="one">Hay %s programa con una configuración específica</item> + <item quantity="many">Hay %s programas con configuraciones específicas</item> + <item quantity="other">Hay %s programas con configuraciones específicas</item> + </plurals> </resources> diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index d7e5e5cab2f..29dfbe19889 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1,62 +1,27 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!--GENERAL--> <string name="app_name">Dhis2</string> - <string name="logo_text">dhis</string> - <string name="logo_number">2</string> <!-- Warnings and error messages --> <string name="error">Erreur</string> - <plurals name="error_message"> - <item quantity="one">Erreur</item> - <item quantity="many">Erreurs</item> - <item quantity="other">Erreurs</item> - </plurals> - <string name="error_wrong_server_url">URL incorrecte</string> - <string name="error_wrong_credentials">références incorrectes</string> - <string name="error_unexpected_error">Erreur inattendue </string> - <string name="error_internal_server_error">Erreur interne </string> - <string name="no_value">pas de valeur</string> <string name="no_reserved_values">Il n\'y a plus de valeurs réservées. Veuillez contacter votre administrateur système.</string> - <string name="no_reserved_values_connection">Il n\'y a plus de valeurs réservées. Veuillez vous connecter pour en obtenir d\'autres.</string> - <string name="errors">erreurs</string> <string name="something_wrong">Quelque chose a mal tourné</string> <!-- SyncService strings: --> - <string name="sync_now">Synchronisez_maintenant</string> - <string name="sync_text">Synchronisation avec le serveur</string> - <string name="sync_title">Synchronise maintenant</string> - <string name="sync_metadata">Méta-données</string> <string name="sync_events">Événements</string> - <string name="sync_tei">Entités suivies </string> - - <string name="sync_complete_title">Fini</string> - <string name="sync_complete_text">Synchronisation complète</string> <string name="sync_error_title">Problème de synchronisation</string> <string name="sync_error_text">Une erreur s´est produite pendant sync. Essayez à nouveau.</string> <string name="sync_incomplete_error_text">La synchronisation est terminée, mais nous n\'avons pas reçu de confirmation du serveur pour tous les enregistrements. Ces enregistrements sont toujours marqués comme \"hors ligne\" dans l\'application. Nous vous recommandons de réessayer la synchronisation.</string> - <string name="data_sync_warning_program">AVERTISSEMENT: La plupart de vos données ont été syncrhonisées mais certains champs ont eu des conflits. Synchronisez votre configuration et ressayez, Si l\'erreur persiste, vérifiez le statut de synchronisation: les programmes, TEIs et évènements avec conflits sont marqués avec @. </string> - <string name="server_sync_error">Une erreur s\'est produite et le serveur n\'a pas répondu. Contactez votre administrateur.</string> - - <string name="search_result_text">%s résultats trouvé</string> - <string name="add_new">Nouveau</string> - <string name="add">Ajouter</string> - <string name="schedule_new">planifier nouveau</string> <string name="referral">référence</string> <!-- Login --> - <string name="url_hint">URL du serveur</string> - <string name="user_hint">Nom d\'utilisateur</string> - <string name="password_hint">Mot de passe</string> - <string name="log_in_button">Se connecter</string> - <string name="unlock_button">Déverrouiller la session</string> <string name="syncing_configuration">Sync votre configuration</string> <string name="syncing_data_shortly">Vos données seront sync sous peu</string> <string name="syncing_data">Synchronisation des données</string> <string name="configuration_ready">La configuration est prête</string> <string name="data_ready">vos données sont prêtes</string> - <string name="configuration_sync_failed">La configuration a échoué</string> - <string name="data_sync_failed">Synchronisation a échoue</string> <string name="account_recovery">Récupération de compte</string> + <!--PERIOD--> <string name="DAILY">Quotidien</string> <string name="WEEKLY">Hebdomadaire</string> @@ -73,129 +38,78 @@ <string name="enter_text">Saisir du texte</string> <string name="enter_long_text">Saisir texte long</string> <string name="enter_number">Saisir un nombre</string> - <string name="enter_integer">Saisir un nombre entier</string> <string name="enter_negative_integer">Saisir un entier négatif</string> <string name="enter_positive_integer_or_zero">Saisir un entier ou zéro </string> <string name="enter_positive_integer">Saisir un entier positif</string> - <string name="filter_options">Options de filtre</string> <string name="choose_date">Choisissez une date</string> - <string name="change_calendar">Changer de calendrier</string> <!-- Status --> - <string name="program_completed">Programme complété</string> - <string name="program_inactive">Programme inactif</string> <string name="event_open">Ouvrir</string> <string name="event_completed">Événement terminé</string> <string name="read_only">Lecture seule</string> - <string name="finish_and_complete">Terminer et Compléter</string> <string name="completed">Terminé</string> <string name="cancelled">Annulé</string> - <string name="activate">Activer</string> <string name="active">Actif</string> <!-- State --> <string name="state_synced">Synchronisé</string> <string name="state_to_post">Envoyer</string> <string name="state_to_update">Prêts à actualiser</string> - <string name="state_to_delete">Prêts de supprimer</string> <string name="state_error">Erreur</string> - <string name="action_sync">Synchroniser</string> - <string name="action_send">ENVOYER</string> - <string name="action_sync_sms">SYNC SMS</string> <!--Completion--> - <string name="completion">Terminé</string> <!--Event initial--> - <string name="create">Créer</string> <string name="update">Mettre à jour</string> - <string name="date">Date</string> <string name="org_unit">Unités d´Organisation</string> - <string name="no_org_units">Il n\'y a pas d\'Unité d\'organisation Ouvert pour la date sélectionnée. Merci de sélectionner une autre date ou une autre Unité d\'Organisation.</string> - <string name="category_option">Options de catégorie</string> + <string name="no_org_units">Il n\'y a pas d\'unité d\'organisation ouverte pour la date sélectionnée. Merci de sélectionner une autre date ou une autre unité d\'organisation.</string> <string name="latitude">Latitude</string> <string name="longitude">Longitude</string> - <string name="new_event">Nouvel événement</string> - <string name="one_time">Une fois</string> - <string name="permanent">Définitif</string> <!--DataSet initial--> <string name="report_period">Période du rapport</string> - <string name="cat_option">Option de catégorie</string> - <string name="field_required">Si vous saisissez une valeur, la ligne entière doit être remplie pour compléter l\'ensemble de données.</string> - <string name="field_mandatory">Des valeurs obligatoires sont manquantes. Vous devez spécifier les valeurs obligatoires pour compléter l\'ensemble de données.</string> - <string name="field_mandatory_v2">Il manque des champs obligatoires. Veuillez les remplir pour compléter l\'ensemble de données.</string> - <string name="datavalue_saved">La valeur a été enregistrée</string> - <string name="there_is_no_available_period">Aucune période disponible pour sélectionner</string> <!--Event Detail--> <string name="due_date">Date d\'échéance</string> <string name="cat_combo">Combinaison de catégories</string> - <string name="date_default">JJ/MM/AAAA</string> <string name="cancel">Annuler</string> <string name="delete">Supprimer</string> - <string name="total">Total</string> <string name="most_recent_event_date">Date de l\'événement le plus récent</string> <string name="no_options">Aucune option disponible</string> <string name="active_programs">Programmes en cours</string> - <string name="to_enroll_programs">Programmes disponibles pour l´admission</string> <string name="enroll">Inscrire</string> - <string name="last_visit">Dernière visite</string> - <string name="apply">Appliquer</string> <!--TEI DASHBOARD--> - <string name="see_details">Voir les détails</string> - <string name="view_more">Afficher plus</string> <string name="edit">Modifier</string> - <string name="follow_up">Suivi</string> - <string name="follow_up_enabled">Suivi activé</string> - <string name="follow_up_disabled">Suivi désactivé</string> <string name="deactivate">Désactiver</string> <string name="program_not_allow_events">Ce programme ne permet pas plus d\'événements</string> <!--DONE TASKS--> - <string name="events_no_data">Aucune donnée</string> <string name="events">événements</string> <string name="done_task">Accueil</string> - <string name="app_info">Information de l´Appli</string> <string name="log_out">Déconnecter</string> - <string name="block_session">Bloquer la session</string> <!-- SYNC --> - <string name="a_minute">1 Minute</string> - <string name="fifteen_minute">15 Minutes</string> <string name="thirty_minutes">30 Minutes</string> <string name="a_hour">1 Heure</string> <string name="every_6_hours">6h</string> <string name="a_day">1 jour (par défaut)</string> <string name="every_12_hours">12h</string> - <string name="Automatic_Sync_Data">Données de synchronisation automatique (chaque:)</string> <string name="Manual">Manuel</string> - <string name="Automatic_Sync_Metadata">Configuration automatique de la synchronisation (chaque:)</string> <string name="a_week">1 Semaine</string> <string name="sync_max_parameters">Paramètres de synchronisation actuels</string> <string name="sync_default_parameters">Retour aux valeurs par défaut</string> + <string name="wipe_data_meesage">La base de données sera supprimée.\nVous devez donc entrer de nouveau</string> <string name="wipe_data_ok">Accepter</string> <string name="wipe_data_no">Annuler</string> <string name="SYNC_DATA">Synchroniser les données mainténant</string> <string name="SYNC_META">Synchroniser la configuration mainténant</string> <string name="SYNC_MANAGER">Paramètres</string> - <string name="last_data_sync_date">Dernière synchronisation sur: %s</string> - <string name="last_metadata_sync_date">Dernière synchronisation sur: %s</string> <string name="refill_reserved_values">Remplir</string> - <string name="settings_sms_module_title">Module SMS:</string> <string name="settings_sms_receiver_number">Passerelle SMS</string> <string name="settings_sms_result_sender_number">Résultat de l\'origine du SMS</string> - <string name="settings_sms_result_timeout_hint">secondes</string> - <string name="settings_sms_result_sender_hint">nombre</string> - <string name="settings_sms_receiver_number_hint">nombre</string> <string name="settings_sms_module_switch">Activer soumission SMS</string> <string name="settings_sms_response_wait_switch">En attente du résultat de la réponse SMS</string> - <plurals name="settings_specific_programs"> - <item quantity="one">Il y a %s programme avec des paramètres spécifiques</item> - <item quantity="many">Il y a %s programmes avec des paramètres spécifiques</item> - <item quantity="other">Il y a %s programmes avec des paramètres spécifiques</item> - </plurals> <string name="settings_limit_scope">Paramètres limités</string> <string name="settings_limit_globally">Globalement</string> <string name="settings_limit_program">par programme</string> @@ -213,20 +127,15 @@ <string name="settingsErrorLog_descr">Ce registre contient toutes les erreurs causées par la synchronisation de vos données et métadonnées.</string> <string name="settingsDeleteLocalData">Suprimmer les données</string> <string name="settingsDeleteLocalData_descr">Toutes les données de l\'application enregistrées sur votre appareil seront supprimées. Les données non synchronisées avec le serveur seront perdues.</string> - <string name="settingsReset">Redémarrer l´application</string> - <string name="settingsReset_descr">Votre configuration et les données de l\'application enregistrées sur l\'appareil seront supprimées. Vous devrez vous connecter de nouveau et les données non synchronisées avec le serveur seront perdues.</string> <string name="settingsSms">Paramètres SMS</string> <string name="settingsSms_descr">Cliquez et éditez les paramètres de la passerelle SMS</string> <string name="settingsCheckVersion">Mise à jour du logiciel</string> - <string name="settingsCheckVersionMessage">Logiciel</string> <string name="settingsExportDB">Exportation de la base des données</string> <string name="settingsExportDBMessage">Exporter votre base de données et le partager avec l\'administrateur</string> <string name="settingTwoFA">Authentification à deux facteurs</string> <string name="settingsTwoFAStatus">Statut</string> <!--endregion--> - <string name="enrollmment_date">Date d\'enrôlement</string> - <!-- SEARCH OPTION SET --> <string name="search_optionset">Chercher</string> <!--FORM FRAGMENT--> @@ -247,29 +156,15 @@ <string name="tei_coordinates">Coordonnées pour</string> <!--EVENT SUMMARY--> - <string name="section_list">Liste des sections</string> - <string name="event_summary_header" formatted="false">%s questions de %s complétées</string> - <string name="event_summary_sections_header" formatted="false">%s de %s complété</string> - <string name="complete_and_close">Completé et fermer</string> <!--AGE CUSTOM VIEW--> - <string name="hint_day">Jours</string> - <string name="hint_month">Mois</string> - <string name="hint_year">Années</string> - <string name="week">Semaines</string> <string name="incident_date">Date d\'incident</string> - <string name="local_results">Résultats locaux</string> - <string name="online_results">Résultats en ligne</string> <string name="past_programs">Programmes antérieurs</string> <!--PERMISSIONS--> <string name="permission_denied">Vous n\'êtes pas autorisé à effectuer cette action</string> - <string name="add_relation_button">Ajouter comme...</string> - <string name="date_dialog_clear">Effacer</string> <string name="period">Période</string> - <string name="org_unit_filter">(%d) L´unité d´Organisation</string> - <string name="org_unit_select_level">Niveau %d</string> <string name="tuto_main_1">Bienvenue à dhis2</string> <string name="tuto_main_2">Ici vous pouvez voir vos activités</string> <string name="tuto_main_3">Vous pouvez appliquer un filtre...</string> @@ -278,16 +173,11 @@ <string name="tuto_main_6">Vérifiez les autres actions dans le menu principal</string> <!-- RELATIONSHIPS --> - <string name="default_relationship_label">Créer une relation</string> <string name="next">Suivant</string> <string name="search_min_num_attr">Vous devez entrer au moins %d des attributs pour lancer une recherche</string> - <string name="search_attr">Vous devez renseigner au moins un des attributs afin d\'effectuer la recherche</string> - <string name="search_max_tei_reached">il y a plus de %d des résultats. Veuillez entrer les autres critères de recherche</string> - <string name="search_init">Entrez vos critères de recherche</string> <!-- QR --> <string name="QR_SCANNER">Importer des données QR</string> - <string name="SAVE">Enregistrer</string> <string name="button_ok">Ok</string> <string name="qr_id">Identification</string> <string name="qr_attributes">Attributs</string> @@ -299,32 +189,20 @@ <string name="qr_no_data">Aucune donnée</string> <string name="qr_error_id">Code QR invalide</string> <string name="qr_error_attr">Cet attribut ne peut pas être ajouté</string> - <string name="qr_error_enrollment">Cette inscription ne peu pas être ajoutée</string> <string name="about">À propos</string> <string name="programs_to_enroll">Programmes disponibles pour l´admission</string> - <string name="select_all">Tout sélectionner</string> - <string name="clear_all">Dégager sélection</string> - <string name="empty_program_list">Il n\'y a pas d\'information pour les critères choisis. Veuillez les changer</string> <string name="share">Partager</string> <string name="share_qr">Partager le QR</string> <string name="max">Max</string> <string name="current">Courant</string> <string name="tei">TEI</string> <string name="teis">TEIs</string> - <string name="limit_by_organisation_unit">Limite par l´unité organizationnelle</string> - <string name="limit_by_program">Limite par porgramme</string> - <string name="programs_list">Liste de Programmes</string> <string name="wipe_data">Redémarrer l´application</string> - <string name="add_relationship_error">Il n\'est pas possible d\'ajouter cette relation</string> <string name="warning_error_on_complete_title">Attention. Verifiez ça!</string> - <string name="warning_on_complete_title">Attention</string> - <string name="error_on_complete_title">Erreur</string> <string name="save">Enregistrer</string> <string name="reserved_value">Valeurs réservées</string> - <string name="downloaded_confirm">Voulez-vous ajouter plus de données de QR</string> - <!--ABOUT--> <string name="about_app">Version de l´appli: %s</string> <string name="about_sdk">Version de SDK: %s</string> @@ -335,128 +213,42 @@ <string name="about_dev">Développé et entretenu par le <a href="https://www.dhis2.org/">DHIS2</a> projet, partie de l\'Université d\'Oslo, <a href="https://www.mn.uio.no/ifi/english/">département d\'informatique</a>.</string> <string name="about_contact">Pour plus d\'informations ou des questions sur cette application, veuillez écrire à <a href="mailto:android@dhis2.org">android\@dhis2.org</a></string> - <string name="login_error_null_pass">Le mot de passe est manquant. Veuillez compléter ce champ</string> - <string name="login_error_null_username">Le nom d\'utilisateur est manquant. Veuillez compléter ce champ</string> - <string name="login_error_dhis_version">Ce serveur a une version différente de 2.29. Mettre à jour la version ou utiliser un environnement d\'essai pour continuer</string> - <string name="login_error_dhis_version_v2">Ce serveur utilise une version différente que %s. Veuillez mettre à jour votre serveur ou utilisez l\'environnement test pour continuer.</string> - <string name="login_error_unsuccessful_response">Quelque chose a mal tourné. veuillez vérifier l\'url du serveur, le nom d\'utilisateur et le mot de passe sont corrects et réessayez</string> - <string name="login_error_error_response">Le serveur ne peut pas terminer cette requête</string> - <string name="login_error_default">Il y a un problème en essayant de se connecter au serveur</string> - <string name="login_error">Erreur d\'accès</string> - <string name="missing_mandatory_fields">Les champs obligatoires sont manquant</string> - <string name="online_search_unexpected">Erreur inattendue lors d\'une recherche en ligne</string> - <string name="online_search_parsing_error">Erreur lors de l\'analyse des résultats</string> - <string name="online_search_error">La recherche en ligne a renvoyé une erreur</string> - <string name="online_search_response_error">Quelque chose a mal tourné dans le serveur</string> <string name="search_program_not_selected">Sélectionnez un programme pour permettre l\'inscription</string> <string name="search_access_error">Vous n\'avez pas l\'autorisation requise</string> - <string name="feature_unavaible">Cette fonctionnalité n\'est pas encore prête</string> - <string name="relationship_label_error">Erreur lors de l\'obtention de l\'étiquette de relation</string> <string name="all_tei_type">Tous %s</string> <string name="invalid_phone_number">N´est pas un numéro de téléphone valide</string> - <string name="invalid_email">Ce n´est pas une adresse e-mail</string> - <string name="invalid_negative_number">Seuls les nombres négatifs sont autorisés</string> <string name="invalid_possitive_zero">seuls les nombres positifs ou zéro sont autorisés</string> - <string name="invalid_possitive">Seuls les nombres positifs sont autorisés</string> - <string name="invalid_interval">Seules les valeurs de 0 à 1 sont autorisés</string> - <string name="invalid_percentage">Seules les valeurs de 0 à 100 sont autorisés</string> - <string name="date_dialog_tigle">sélectionner des dates pour filtrer</string> <string name="select_option">Sélectionnez une option</string> - <string name="issue_reported">Problème signalé</string> - <string name="dialog_generate_new_event">Générer un nouvel événement</string> - <string name="message_generate_new_event">Voulez-vous créer un nouvel événement</string> <string name="event_completed_title">événements terminés</string> <string name="event_completed_message">Tous les événements de ce programme sont terminés. Voulez-vous fermer le programme aussi?</string> - <string name="complete_enrollment_message">Souhaitez-vous également compléter l\'enrôlement?</string> <string name="check_event">Vérifier</string> <string name="menu_home">Accueil</string> <string name="appwidget_text">Exemple</string> - <string name="add_widget">Ajouter un widget </string> <string name="showHelp">Montrer l´aide</string> - <string name="tuto_settings_1">Synchronisation des données</string> - <string name="tuto_settings_2">Synchroniser votre configuration</string> - <string name="tuto_settings_3">Définir votre capacité de stockage locale</string> - <string name="tuto_settings_reserved">Vérifiez et gérez le nombre de valeurs réservées restantes</string> - <string name="tuto_settings_errors">Vérifiez si la connexion au serveur a échoué</string> - <string name="tuto_settings_reset">Libérer de l\'espace de stockage</string> - <string name="tuto_settings_4">...ou supprimer tout pour recommencer.</string> - <string name="tuto_search_1_v2">Trouvez les entités suivies aussi bien dans votre appareil mobile que dans le serveur</string> - <string name="tuto_search_2">Passer à un autre programme</string> - <string name="tuto_search_3_v2">Recherchez ou Ajouter de nouvelles entités. Vous devez effectuer une recherche avant de pouvoir en ajouter une nouvelle.</string> - <string name="tuto_search_4_v2">Cliquer ici pour réinitialiser les champs et pour recommencer la recherche</string> <string name="tuto_dashboard_1">C\'est le tableau de bord de l\'entité</string> <string name="tuto_dashboard_2">Voir les informations sur le profil des entités</string> - <string name="tuto_dashboard_3">...Partager des informations via QR ou SMS...</string> - <string name="tuto_dashboard_4">...Ou maqué l´entité pour le suivi</string> - <string name="tuto_dashboard_5">Cliquer pour planifier un événement ou faire référence à une autre unité d\'organisation</string> <string name="tuto_dashboard_6">Ici, vous verrez tous les événements. Cliquez pour voir un détail de l\'événement.</string> <string name="tuto_dashboard_7">Naviguer dans le menu pour ajouter des relations, voir des indicateurs ou écrire des notes</string> - <string name="tuto_dashboard_8">Cliquez pour voir toutes les inscriptions de votre entité ou en créer une nouvelle.</string> - <string name="tuto_tei_event_1">Cliquez ici pour supprimmer cet événement. Cette action ne peut pas être annulée</string> - <string name="tuto_tei_event_2">Completér l´événement</string> - <string name="tuto_program_event_1">Tous les événements liés à ce programme seront listés ici</string> - <string name="tuto_program_event_2">cliquez ici pour ajouter un nouvel événement</string> <string name="tuto_event_initial_new_1">Entrez toutes les données pour créer l\'événement</string> <string name="tuto_event_initial_1">Cliquez ici pour vérifier l\'état d\'achèvement de l\'événement</string> - <string name="tuto_event_summary">Cliquez ici pour complèter ou rouvrir un événement</string> - <string name="tuto_main_7">Lire et stocker des informations provenant d\'autres appareils via QR</string> - <string name="tuto_main_8">Synchroniser avec le serveur</string> - <string name="tuto_main_9">Bloquer la session avec un code à 4 chiffres. N\'oubliez pas votre code!</string> - <string name="tuto_main_10">Déconnectez-vous pour changer d\'utilisateur ou de serveur. Vous pourrez vous reconnecter même s\'il n\'y a pas de connexion internet</string> - <string name="text_plus_colon">%s:</string> <string name="relationships">Relation</string> <string name="empty_tei_add">Aucun évènement n\'a été enregistré, cliquez \"+\" pour en ajouter un nouveau.</string> - <string name="empty_tei_no_add">Aucun évènement enregistré.</string> <string name="qr_data_values">Valeurs de données</string> <string name="info">Info</string> <string name="qr_no_id_error">Impossible de lire cet Id</string> <string name="delete_local_data">Suprimmer les données</string> <string name="dashboard_overview">Général</string> - <string name="dashboard_relationships">Relations</string> - <string name="dashboard_indicators">Indicateurs</string> - <string name="dashboard_analytics">Analytiques</string> <string name="empty_indicators">Il n\'y a pas d\'indicateurs pour ce programme.</string> - <string name="dashboard_notes">Notes</string> - <string name="unable_to_complete">Impossible de terminer</string> - <string name="unable_to_save">Impossible de sauvegarder</string> - <string name="warnings_in_form">Il y a des avertissements dans le formulaire</string> - <string name="field_errors">Certains champs comportent des erreurs. Merci de les vérifier pour compléter.</string> <string name="unselect_enrollment">Désélectionner l\'inscription</string> <string name="unselect_enrollment_description">Montrer le tableau de bord avec tous les programmes actifs</string> - <string name="CHECK_SYNC_ERRORS">Vérifier les erreurs de synchronisation</string> <string name="error_dialog_title">Registre d\'erreur de synchronisation</string> <string name="share_with">Partager avec...</string> - <string name="errors_during_sync">Votre synchronisation a échoué. Il pourrait y avoir des erreurs dans le serveur. Cliquez ici pour plus d\'informations. </string> - <string name="sectionSelectorPrev">PREC</string> - <string name="sectionSelectorNext">SUIV.</string> - <string name="event_overview">Détails</string> - <string name="event_indicators">Indicateurs</string> - <string name="event_notes">Notes</string> - <string name="complete_add_new"><![CDATA[Compléter & ajouter nouveau]]></string> - <string name="complete_later">Compléter plus tard</string> - <string name="finish_add_new"><![CDATA[Terminer & ajouter nouveau]]></string> - <string name="finish">Terminer</string> - <string name="error_fields_title">Champs avec erreurs</string> - <string name="error_fields_events">Certains champs ont des erreurs. Les valeurs n\'ont pas été enregistrées. Veuillez les vérifier. </string> <string name="unique_warning">La valeur doit être unique, une coincidence a été trouvée. Elle n\'a pas été sauvegardée. Veuillez vérifier. </string> - <string name="unique_coincidence_found">Une coïncidence dans un domaine unique a été trouvée. Veuillez vérifier le formulaire pour enregistrer l\'inscription.</string> <string name="please_wait">Veuillez patienter</string> <string name="skip">Ignorer</string> - <string name="reschedule">Re-agender</string> <string name="no_intructions">Il n\'y a pas d\'information pour cet écran</string> - <string name="event_overdue">En retard</string> - <string name="unsupported_program_rule">Il y a une règle de programme dont le fonctionnement n\'est pas encore actif. Veuillez vérifiez la documentation</string> - <string name="empty_description">Pas d\'information pour ce champ</string> - <string name="biometrics_dialog_title">Références vides</string> - <string name="biometrics_first_use_text">Afin d\'utiliser la connexion par le scanner d\'empreinte digitale vous devez d\'abord vous connecter normalement</string> - <string name="biometrics_security_title">Sécurité biométrique</string> - <string name="biometrics_login_text">Voudriez-vous utiliser l\'empreinte digitale ou autre méthode biométrique pour se connecter</string> - <string name="tab_tables">Tables</string> - <string name="table">Tableau</string> - <string name="login_https">https://</string> <string name="delete_local_data_message">Les données non synchronisées seront perdues. Voulez-vous vraiment continuer? </string> - <string name="local_data_accept">Accepter</string> <string name="delete_local_data_error">Les données n\'ont pu être supprimées. Veuillez ressayer. </string> <string name="delete_local_data_done">Suppression des données locales terminée avec succès. </string> <string name="org_unit_selection_warning">Au moins une unité d\'organisation doit être sélectionnée</string> @@ -469,6 +261,7 @@ <string name="action_agree">Accord</string> <string name="action_continue">Continuer</string> <string name="login_server_info_title">URL du serveur</string> + <string name="login_server_info_message">Saisissez l\'URL du serveur DHIS 2 de votre organisation tel que fourni par votre administrateur système.\n\nVous pouvez également scanner le code QR avec le lien URL du serveur</string> <string name="forgot_your_code">Oublié le code?</string> <string name="event_form_end_options_title">Que souhaitez-vous faire pour cet évènement?</string> <string name="sectionSelectorEnd">FIN</string> @@ -479,33 +272,16 @@ <string name="state_uploading">Téléchargement en cours</string> <string name="state_relationship">Relation</string> <string name="sent_by_sms">Envoyé par sms</string> - <string name="no_conflicts_message">Il n\'y a pas de conflits pour ce programme</string> - <string name="network_unavailable_sms">La connexion réseau non disponible, mais apparemment le réseau mobile fonctionne - vous pouvez utiliser le SMS.</string> - <string name="network_unavailable">Connection réseau non disponible</string> <string name="action_close">Fermer</string> <string name="tuto_main_11">Maintenant vous pouvez vérifier l\'information de synchronisation en cliquant ici</string> - <string name="no_conflicts_update_message">Cette donnée est enregistrée seulement sur votre appareil et n\'a pas été synchronisée avec le serveur. </string> - <string name="no_conflicts_synced_message">Vous êtes à jour! Toutes vos données ont été envoyées au serveur. </string> - <string name="relationship_error_recursive">Vous ne pouvez pas établir de relation une donnée avec elle-même</string> - <string name="unblock_session">Dévérouiller la session</string> - <string name="data_set_complete">Terminer</string> - <string name="data_set_open">Ouvrir</string> - <string name="unsupported_value_type">Type de valeur non supporté</string> + <string name="relationship_error_recursive">Vous ne pouvez pas établir de relation entre une donnée et elle-même</string> <string name="change_calendar_view">Changer de vue calendrier</string> - <string name="data_every_fifteen_minutes">15 minutes</string> - <string name="data_every_hour">Toutes les heures</string> - <string name="data_every_day">Quotidien</string> - <string name="data_every_week">Hebdomadaire</string> - <string name="period_week">Semaine</string> - <string name="sync_setting">Paramètre de synchronisation: %s</string> - <string name="relationship_without_enrollment">La donnée à laquelle vous essayer d\'acceéer n\'a pas d\'enrôlement. Vous ne pouvez pas accéder au tableau de bord.</string> + <string name="relationship_without_enrollment">La donnée à laquelle vous essayer d\'accéder n\'a pas d\'enrôlement. Vous ne pouvez pas accéder au tableau de bord.</string> <string name="formatting_error">Erreur de formattage</string> <string name="dashboard_menu_delete_tei_v2">Supprimer 1%s</string> <string name="delete_authority_error">Vous n\'avez pas l\'autorité pour supprimer cette donnée</string> - <string name="validation_url">Ceci n\'est pas un lien URL valide</string> <string name="adjusting_form">Adapter le formulaire...</string> - <string name="sms_receiver_number">Numéro du destinataire</string> <string name="sms_amount_question">Acceptez-vous d\'envoyer %d messages?</string> <string name="sms_sending">Envoi de %1$d/%2$d</string> <string name="sms_waiting_amount_confirm">En attent de confirmation du montant - %d</string> @@ -523,51 +299,29 @@ <string name="sms_error_no_gateway_set">Aucune passerelle définie</string> <string name="sms_error_no_user_login">Utilisateur non connecté</string> <string name="sms_error_module_disabled">Le module SMS est désactivé</string> - <string name="sms_error_ongoing_sunmission">Une autre soumission SMS est en cours</string> <string name="sms_metadata_empty">Le module SMS n\'a pas été initié, metadata requises non trouvées</string> - <string name="sms_completed">Terminé</string> <string name="sms_count_error">Le compte SMS n\'a pas été accepté</string> <string name="sms_state_started">La soumission SMS a débuté</string> <string name="sms_state_converted">Données lues et converties. Identifiant de soumission: %d</string> - <string name="sms_general_error">Erreur avec l\'envoi de la soumission SMS</string> <string name="sms_title_enrollment">SMS TEI enregistrement et enrôlement</string> <string name="sms_title_event">Soumission SMS de l\'évènement</string> <string name="sms_title_data_set">Soumission SMS de l\'ensemble de données</string> - <string name="sms_bar_state_starting">Démarrage</string> - <string name="sms_bar_state_sending">En cours</string> - <string name="sms_bar_state_sent">Envoyé</string> - <string name="sms_bar_state_failed">Echoué</string> - <string name="start_sync_granular">Démarrage de la synchronisation.</string> <string name="syncing">Synchronisation...</string> - <string name="end_sync_granular">Synchronisation terminée</string> - <string name="error_sync">Une erreur s\'est produite lors de la synchronisation.</string> - <string name="error_sync_check_logs">Une erreur s\'est produite lors de la synchronisation. Cliquez ici pour vérifier les journaux d\'erreurs.</string> - <string name="cancel_sync">Synchronisation annulée</string> <string name="copied_text">Copié</string> - <string name="image_selected">Image sélectionnée</string> - <string name="show_in_map">Afficher sur la carte</string> - <string name="show_list">Afficher la liste</string> <!--region TRACKER IMPORT CONFLICT MESSAGES--> - <string name="value_required_but_not_provided">%s est obligatoire mais n\'a pas été spécifié.</string> - <string name="polygon_captured">Le polygône a été défini</string> <string name="polygon">Polygone</string> <!--endregion--> - <string name="fingerprint_title">Empreinte digitale</string> - <string name="fingerprint_message">Veuillez passer votre doigt dans le lecteur d\'empreintes digitales.</string> <string name="security_title">Securité</string> <string name="security_rooted_message">Pour des raisons de sécurité, cette version de l\'application n\'est pas autorisée à être utilisée sur des appareils enracinés. Veuillez utiliser la version de formation.</string> - <string name="fix_error">Il y a des erreurs. Veuillez les corriger avant de continuer.</string> <string name="filters_active">Application des filtres</string> <string name="filters_disabled">Aucun flitre n\'est appliqué</string> <string name="filters_title_period">Période</string> <string name="filters_title_org_unit">Unité d\'org.</string> - <string name="filters_title_sorting">Trier</string> - <string name="filters_title_status">Statut</string> <string name="filters_title_state">Synchronisation</string> <string name="filters_title_assigned">Assigné à moi</string> <string name="filter_period_today">Aujourd\'hui</string> @@ -582,8 +336,6 @@ <string name="filter_period_form_to">De - à</string> <string name="filter_period_other">Autre</string> <string name="filter_period_any">A tout moment</string> - <string name="data_values_error_sync_message">La synchronisation a échoué. La synchronisation a échoué. Vérifiez les valeurs des données pour essayer de résoudre le problème et réessayez. S\'il échoue, contactez votre administrateur système</string> - <string name="sms_synced_message">Ces données ont été envoyées au serveur mais il n\'est pas garanti qu\'elles aient été stockées</string> <string name="filter_event_status_open">Ouvrir</string> <string name="filter_event_status_schedule">Planning</string> <string name="filter_event_status_overdue">En retard</string> @@ -599,7 +351,6 @@ <string name="sms_empty_gateway">La passerelle SMS ne peut pas être vide</string> <string name="granular_sync_enrollments_empty">Il n\'y a aucune inscription à télécharger</string> <string name="granular_sync_unsupported_task">Cette tâche de conversion n\'est pas prise en charge</string> - <string name="disable_pin_locked">Ne plus afficher l\'écran de verrouillage</string> <string name="set_pin">Définir la broche</string> <string name="conflict">Conflit</string> <string name="change_event_date">Date de modification</string> @@ -624,11 +375,7 @@ <string name="choose_ou">Choisissez l\'unité d\'organisation</string> <string name="enter_url">Entrez url</string> <string name="enter_value">Entrez une valeur</string> - <string name="choose_image">Choisissez l\'image</string> - <string name="scan_code">Scanner le code</string> - <string name="choose_option">Choisissez une option</string> <string name="reserved_values_hint">Valeurs réservées téléchargées par attribut TEI</string> - <string name="settings_reserved_values_message">Valeurs réservées téléchargées par attribut TEI</string> <string name="reserved_values_left">%s valeurs réservées restantes</string> <string name="manage_reserved_values_button">Gérer les valeurs réservées</string> <string name="events_to_download">Événements à télécharger</string> @@ -648,39 +395,19 @@ <string name="filter_sync_not_synced">Non synchronisé</string> <string name="filter_sync_error">Erreur de synchronisation</string> <string name="filter_sync_sms">SMS synchronisé</string> - <string name="dataset_overview">Details</string> - <string name="dataset_comments">Commentaires</string> <string name="saved">Enregistré!</string> - <string name="run_validation_rules">Voulez-vous vérifier la qualité des données?</string> - <string name="validation_success_title">Tout a l\'air bien!</string> - <string name="mark_dataset_complete">Voulez-vous également compléter l\'ensemble de données?</string> - <string name="dataset_completed">Marquer comme terminé</string> - <string name="name">Nom</string> - <string name="formula">Formule</string> - <string name="complete_anyway">Terminer quand même</string> <string name="fk_message">Disparu%s%sde%s%s</string> <string name="filters_title_event_status">Statut de l\'événement</string> - <string name="enrollment_date">Date d\'enrôlement</string> <string name="dataset_empty_list_can_create">Il n\'y a pas de données. Cliquez \"+\" pour ajouter un nouvel enregistrement</string> <string name="dataset_emtpy_list_can_not_create">Il n\'y a pas de données. Vous n\'êtes pas autorisé à ajouter de nouveaux enregistrements.</string> <string name="validation_rules_empty_description">Pas de description ou instruction fournie</string> <string name="validation_rules_data_to_review">Données à examiner</string> - <string name="dataset_saved_completed">Enregistré et terminé!</string> <string name="status_change_error_active_exist">Il y a déjà une enrôlement active</string> <string name="enrollment_status_active">Ouvrir</string> <string name="enrollment_status_completed">Terminer</string> <string name="enrollment_status_cancelled">Annulé</string> - <string name="event_data">Données</string> <string name="download_tei_error">La sélection %s n\'a pas pu être téléchargé.</string> - <string name="completed_by">Terminé par %s: %s</string> - <string name="updated_time">Mis à jour: %s</string> - <string name="action_done">Terminé</string> - <string name="validation_internal_error_datasets">Nous n\'avons pas pu vérifier la qualité des données. Contactez votre administrateur</string> - <string name="are_you_sure">Etes-vous sûre ?</string> - <string name="reopen_question">Voulez-vous rouvrir l\'ensemble de données?</string> <string name="filters_title_date">Date</string> - <string name="filters_title_event_date">Date d´événement</string> - <string name="tei_type_has_no_attributes">%s n\'a pas d\'attributs publics. Veuillez sélectionner un programme</string> <string name="privacy_policy_title">Politique de confidentialité</string> <string name="open_privacy_policy">Cliquez ici pour consulter notre <a href=""> politique de confidentialité </a></string> <string name="coordinates_error">Les valeurs des coordonnées ne sont pas valides</string> @@ -688,15 +415,8 @@ <string name="security_debugger_message">Pour des raisons de sécurité, cette version de l\'application ne peut pas être utilisée avec adb. Veuillez utiliser la version de formation.</string> <string name="customactivityoncrash_error_activity_restart_app">Précédent</string> - <string name="customactivityoncrash_error_activity_close_app">Fermer l\'application</string> - <string name="customactivityoncrash_error_activity_error_details">Plus de détails</string> - <string name="customactivityoncrash_error_activity_error_details_title">Plus de détails</string> - <string name="customactivityoncrash_error_activity_error_details_close">Fermer</string> <string name="customactivityoncrash_error_activity_error_details_copy">Copier dans le presse-papier</string> - <string name="customactivityoncrash_error_activity_error_details_copied">Copié dans le presse-papier</string> - <string name="customactivityoncrash_error_activity_error_details_clipboard_label">Informations d\'erreur</string> <string name="metada_first_sync_error">Nous avons trouvé une erreur lors de la synchronisation avec votre serveur. Partagez l\'erreur avec votre administrateur système si c\'est possible</string> - <string name="error_init_session">Nous n\'avons pas pu connecter la session avec votre nom d\'utilisateur</string> <string name="enrollment_date_edition_warning">Il y a des événements planifiés qui ne seront pas reprogrammés</string> <string name="section_charts">Graphiques</string> <string name="navigation_list_view">Lister</string> @@ -745,63 +465,39 @@ <string name="section_feedback">Réaction</string> <string name="section_indicators">Indicateurs</string> <string name="value">Valeur</string> + <string name="camera_permission_denied">L\'autorisation de la caméra est refusée. \nVous devez l\'activer pour utiliser cette fonctionnalité.</string> <string name="section_charts_indicators">Graphiques et indicateurs</string> <string name="take_photo">Prendre une photo</string> - <string name="from_gallery">Choisir depuis la galerie</string> - <string name="data_set_quality_check_done">Terminé!</string> <string name="break_glass_dialog_title">Ce programme est protégé</string> <string name="break_glass_hint">Décrivez la raison ici</string> - <string name="authenticating">En cours d\'authentification</string> - <string name="login_error_no_dhis_instance">L\'URL du serveur fournie n\'est pas une instance dhis</string> - <string name="login_error_bad_credentials">références incorrectes</string> - <string name="login_error_unknown_host">Serveur inconnu</string> - <string name="invalid_integer">La valeur doit être un entier</string> <string name="openid_session_expired">La session a expiré</string> <string name="openid_session_expired_message">Votre session actuelle a expiré. Pour des raisons de sécurité, vous devrez fournir à nouveau vos informations d\'identification</string> - <string name="dataset_column_default">Valeurs</string> <string name="week_period_span_default_label">Semaine %d %s à %s</string> <string name="action_do_not_show_again">Ne pas montrer de nouveau</string> - <string name="wrong_date_format"> 1%s ne peut pas être analysé comme une date</string> <string name="update_field_error">Ce champ n\'a pas pu être mis à jour. Veuillez réessayer</string> - <string name="available">Disponible</string> <string name="blocked_by_completion">Ces données ne sont pas modifiables car elles sont marquées comme terminées</string> <string name="edition_expired">Cette donnée n\'est pas modifiable car son heure d\'édition est expirée</string> <string name="edition_no_write_access">Vous n\'êtes pas autorisé à modifier ces données</string> <string name="edition_no_catcombo_access">Vous n\'êtes pas autorisé à modifier ces données</string> - <string name="edition_orgunit_capture_scope">Vous ne pouvez pas modifier les données de cette unité organisationnelle</string> - <string name="reload_list">Réinitialiser la recherche</string> + <string name="edition_orgunit_user_scope">Vous ne pouvez pas modifier les données de cette unité organisationnelle</string> <string name="error_tei_online_search_title">La recherche en ligne a renvoyé le message suivant :</string> - <string name="program_rules_loop_warning_title">Avertissement relatif aux règles du programme</string> - <string name="program_rules_loop_warning_message">Il y a un problème de configuration provoquant une boucle dans les règles. Contactez votre administrateur.</string> - <string name="granular_sync_refresh">Actualiser</string> - <string name="unknown_date">Inconnu</string> - <string name="granular_sync_refresh_title">Actualiser toutes les données</string> <string name="delete_account">Supprimer compte</string> - <string name="manage_accounts">Gérer les comptes</string> <string name="troubleshooting_language_title">Langue</string> <string name="not_saved">Non enregistré!</string> <string name="search_no_results">Il n\'y a pas de résultats pour cette recherche</string> <string name="search_too_many_results">Résultats trop nombreux</string> - <string name="search_create_new">Créer nouveau</string> <string name="action_ok">Ok</string> <string name="init_search">Lancez une recherche pour trouver 1%s</string> <string name="search_or_create">Vous pouvez rechercher ou créer un nouveau 1%s</string> <string name="missing_warning_fields_completed_events">Vous avez des messages d\'avertissement.</string> <string name="event_can_be_completed">Voulez-vous marquer ce formulaire comme complet?</string> <string name="changes_will_be_discarted">Si vous quittez maintenant, les modifications seront ignorées.</string> + <string name="event_error_on_complete">Vous avez des messages d\'erreur.\nVoulez-vous les consulter ?</string> <string name="re_opened">Réouvert</string> <string name="account_disable_title">Compte désactivé</string> <string name="account_disable_message">Votre compte a été désactivé par votre administrateur.</string> <string name="search_unable_search_outside">Pour rechercher en dehors de ce programme, ouvrez le formulaire de recherche et remplissez l\'un des champs 1%s suivants :</string> - <string name="open_details">Ouvrir détails %s </string> - <string name="tracked_entity_type_details">%s détails</string> - <string name="sms_sync_sms_reached_server">SMS confirmé pour atteindre le serveur. Mise à jour du statut</string> - <string name="sms_sync_sent">SMS envoyé. Mise à jour du statut.</string> - <string name="sms_sync_not_sent">SMS non envoyé.</string> <string name="sms_sync_sms_app_chooser_title">Envoyer des SMS avec</string> - <string name="syncing_events">Synchroniser les événements</string> - <string name="syncing_teis">Synchronisation des entités suivies</string> - <string name="syncing_data_sets">Synchronisation des ensembles de données</string> <string name="downloading_image_resources">Téléchargement d\'images ...</string> <string name="sync_dialog_title_not_synced">Synchronisation nécessaire</string> <string name="sync_dialog_title_error">Erreur de synchronisation</string> @@ -812,16 +508,6 @@ <string name="sync_dialog_action_send">Envoyer</string> <string name="sync_dialog_action_refresh">Actualiser</string> <string name="sync_dialog_action_not_now">Pas maintenant</string> - <plurals name="error_count_label"> - <item quantity="one">%s erreur</item> - <item quantity="many">%s erreurs</item> - <item quantity="other">%s erreurs</item> - </plurals> - <plurals name="warning_count_label"> - <item quantity="one">%s avertissement</item> - <item quantity="many">%s avertissements</item> - <item quantity="other">%s avertissements</item> - </plurals> <string name="software_update">Mise à jour du logiciel</string> <string name="check_for_updates">Vérifier les mises à jour</string> <string name="no_updates">Pas de nouvelles mises à jour</string> @@ -845,14 +531,28 @@ <string name="program_stage">Étape du programme</string> <string name="event">événement</string> <string name="timeline">Chronologie</string> - <string name="optional">Optional</string> <string name="show_more">Afficher plus</string> <string name="show_less">Afficher moins</string> <string name="sync">Synchronisation</string> - <string name="show_fields">Afficher les champs</string> - <string name="hide_fields">Masquer les champs</string> <string name="successful_sync">Synchronisation réussie</string> <string name="show_description">Afficher la description</string> <string name="hide_description">Masquer la description</string> <string name="transfer">Transférer</string> - </resources> + <plurals name="error_count_label"> + <item quantity="one">%s erreur</item> + <item quantity="many">%s erreurs</item> + <item quantity="other">%s erreurs</item> + </plurals> + + <plurals name="warning_count_label"> + <item quantity="one">%s avertissement</item> + <item quantity="many">%s avertissements</item> + <item quantity="other">%s avertissements</item> + </plurals> + + <plurals name="settings_specific_programs"> + <item quantity="one">Il y a %s programme avec des paramètres spécifiques</item> + <item quantity="many">Il y a %s programmes avec des paramètres spécifiques</item> + <item quantity="other">Il y a %s programmes avec des paramètres spécifiques</item> + </plurals> +</resources> diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml index e103b8d156d..72145803d40 100644 --- a/app/src/main/res/values-hi-rIN/strings.xml +++ b/app/src/main/res/values-hi-rIN/strings.xml @@ -1,23 +1,13 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!-- Warnings and error messages --> <string name="error">त्रुटि</string> - <string name="error_wrong_server_url">गलत सर्वर</string> - <string name="error_wrong_credentials">गलत लॉगिन जानकारी</string> <string name="something_wrong">कुछ गलत हुआ</string> <!-- SyncService strings: --> - <string name="sync_now">अभी सिंक करें</string> - <string name="sync_text">सिंक हो रहा है</string> - <string name="sync_title">सिंक हो रहा है</string> <string name="sync_events">इवेंट्स</string> - <string name="sync_complete_title">खत्म</string> - <string name="sync_complete_text">सिंक पूरा हुआ</string> <string name="sync_error_title">सिंक की गलती</string> <string name="sync_error_text">सिंक के दौरान एक त्रुटि हुई है। कृपया फिर से प्रयास करें।</string> - <string name="add">जोड़ें</string> - <string name="user_hint">यूज़रनेम</string> - <string name="password_hint">पासवर्ड</string> <!--PERIOD--> <string name="DAILY">रोज़ाना</string> <string name="WEEKLY">साप्ताहिक</string> @@ -31,71 +21,49 @@ <string name="enter_long_text">लंबा अक्षर दर्ज करें</string> <string name="enter_number">नंबर दर्ज करें</string> <string name="choose_date">दिन चुनें</string> + + <!-- Status --> + <string name="event_open">खोलें</string> <string name="event_completed">इवेंट कंप्लीटेड</string> <string name="completed">पूरा हुआ</string> <string name="state_error">त्रुटि</string> + + <!--Completion--> + <!--Event initial--> - <string name="create">बनाएँ</string> <string name="update">अपडेट करें</string> - <string name="date">तारीख</string> <string name="latitude">अक्षांश</string> <string name="longitude">देशांतर</string> - <string name="new_event">नया इवेंट</string> - <string name="field_required">यदि आप कोई वैल्यू दर्ज करते हैं, तो डेटा सेट पूरा करने के लिए पूरी पंक्ति के सभी वैल्यू आवश्यक हैं।</string> - <string name="field_mandatory_v2">कुछ अनिवार्य फ़ील्ड खाली हैं। डेटा सेट पूरा करने के लिए उन्हें भरें।</string> + <string name="cancel">रद्द करें</string> <string name="delete">हटाएं</string> + <!--TEI DASHBOARD--> <string name="edit">संपादन करें</string> <!--DONE TASKS--> - <string name="events_no_data">कोई डेटा नहीं</string> <string name="events">इवेंट्स</string> <string name="wipe_data_ok">स्वीकार करें</string> <string name="wipe_data_no">रद्द करें</string> <string name="SYNC_MANAGER">सेटिंग्स</string> - <string name="settingsCheckVersionMessage">सॉफ्टवेयर</string> + <!--endregion--> + <!-- SEARCH OPTION SET --> <string name="search_optionset">सर्च करें / खोजें</string> <string name="add_file">फ़ाइल जोड़ें</string> - <!--AGE CUSTOM VIEW--> - <string name="hint_day">दिन</string> - <string name="hint_month">महीने</string> - <string name="hint_year">वर्ष</string> - <string name="week">सप्ताह</string> - <string name="date_dialog_clear">साफ़ करें</string> + <!-- RELATIONSHIPS --> <string name="next">आगे</string> - <string name="SAVE">सहेजें</string> <string name="button_ok">ठीक है</string> <string name="qr_events">इवेंट्स</string> <string name="share">साझा करें</string> - <string name="max">अधिकतम</string> - <string name="error_on_complete_title">त्रुटि</string> <string name="save">सहेजें</string> <string name="invalid_phone_number">यह मान्य फ़ोन नंबर नहीं है</string> - <string name="invalid_email">यह मान्य ईमेल नहीं है</string> - <string name="invalid_negative_number">केवल नेगेटिव संख्या ही अनुमति है</string> <string name="invalid_possitive_zero">केवल शून्य या पॉजिटिव संख्या ही अनुमति है</string> - <string name="invalid_possitive">केवल पॉजिटिव संख्या ही अनुमति है</string> - <string name="invalid_interval">केवल 0 से 1 के मान ही अनुमति हैं</string> - <string name="invalid_percentage">केवल 0 से 100 के वैल्यूज़ अनुमति हैं</string> - <string name="dialog_generate_new_event">नया इवेंट जनरेट करें</string> - <string name="message_generate_new_event">क्या आप एक और इवेंट बनाना चाहते हैं?</string> - <string name="dashboard_indicators">इंडिकेटर्स</string> - <string name="event_indicators">इंडिकेटर्स</string> - <string name="finish">खत्म</string> <string name="unique_warning">मान अद्वितीय होना चाहिए। समान मान मिला है। इसे सहेजा नहीं गया। कृपया जाँच करें</string> <string name="skip">छोड़ें</string> - <string name="event_overdue">अतिदेय</string> - <string name="local_data_accept">स्वीकार करें</string> <string name="state_relationship">संबंध</string> <string name="action_close">बंद करें</string> - <string name="data_set_complete">पूरा हुआ</string> - <string name="data_set_open">खोलें</string> - <string name="data_every_day">रोज़ाना</string> - <string name="data_every_week">साप्ताहिक</string> - <string name="validation_url">यह मान्य URL नहीं है</string> - <string name="sms_completed">पूरा हुआ</string> <string name="syncing">सिंक हो रहा है…</string> + <string name="filter_period_today">आज</string> <string name="filter_period_yesterday">कल (बिता हुआ)</string> <string name="filter_period_this_week">इस सप्ताह</string> @@ -119,39 +87,23 @@ <string name="enter_value">मान दर्ज करें</string> <string name="filter_sync_error">सिंक की गलती</string> <string name="saved">सेव</string> - <string name="run_validation_rules">क्या आप डेटा क्वालिटी चेक करना चाहते हैं\?</string> - <string name="mark_dataset_complete">क्या आप डेटा सेट पूरा करना चाहते हैं\?</string> - <string name="name">नाम</string> - <string name="complete_anyway">फिर भी पूरा करें</string> <string name="validation_rules_data_to_review">रिव्यू के लिए डेटा</string> - <string name="dataset_saved_completed">सेव और कंप्लीटेड</string> <string name="enrollment_status_active">खोलें</string> <string name="enrollment_status_completed">पूरा हुआ</string> - <string name="event_data">डेटा</string> - <string name="action_done">पूरा हुआ</string> - <string name="are_you_sure">क्या आप सुनिश्चित हैं?</string> <string name="filters_title_date">तारीख</string> <string name="field_is_mandatory">यह फ़ील्ड आवश्यक है</string> <string name="customactivityoncrash_error_activity_restart_app">पीछे जाएं</string> - <string name="customactivityoncrash_error_activity_error_details_close">बंद करें</string> <string name="filter_period_this_year">इस वर्ष</string> <string name="filter_period_last_quarter">पिछली तिमाही</string> <string name="filter_period_last_year">पिछला वर्ष</string> <string name="section_indicators">इंडिकेटर्स</string> - <string name="value">वैल्यू</string> <string name="take_photo">फ़ोटो लें</string> <string name="break_glass_dialog_title">यह प्रोग्राम सुरक्षित है</string> - <string name="login_error_bad_credentials">गलत लॉगिन जानकारी</string> - <string name="dataset_column_default">वैल्यू</string> - <string name="wrong_date_format">%s डेट के रूप में पढ़ा नहीं जा सकता</string> <string name="update_field_error">यह फ़ील्ड अपडेट नहीं हो सका। कृपया फिर से प्रयास करें</string> - <string name="available">उपलब्ध</string> <string name="edition_no_write_access">इस डेटा को संपादित करने की अनुमति नहीं है</string> <string name="edition_no_catcombo_access">इस डेटा को संपादित करने की अनुमति नहीं है</string> - <string name="unknown_date">अज्ञात</string> <string name="troubleshooting_language_title">भाषा</string> <string name="not_saved">सेव नहीं</string> - <string name="search_create_new">नया बनाएँ</string> <string name="missing_warning_fields_completed_events">आपके पास कुछ चेतावनी संदेश हैं</string> <string name="missing_warning_fields_events">आपके पास कुछ चेतावनी संदेश हैं\nक्या आप इस फ़ॉर्म को कम्प्लीट मार्क करना चाहते हैं\?</string> <string name="sync_dialog_title_syncing">सिंक हो रहा है</string> @@ -160,10 +112,6 @@ <string name="sync_error">सिंक की गलती</string> <string name="refer">रेफर करें</string> <string name="event">इवेंट</string> - <string name="clear_search">खोज साफ़ करें</string> - <string name="optional">वैकल्पिक</string> - <string name="empty_search_attributes_message">उपयोग के लिए कोई खोज फ़ील्ड कॉन्फ़िगर नहीं है\nकृपया अपने एडमिन से संपर्क करें</string> <string name="show_more">और दिखाएँ</string> <string name="show_less">कम दिखाएँ</string> - <string name="section_misconfigured">यह सेक्शन सही तरह से कॉन्फ़िगर नहीं है\nअपने एडमिन से संपर्क करें</string> </resources> diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index e7bde4535ac..bfd1c88a934 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -1,59 +1,26 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!--GENERAL--> <string name="app_name">DHIS2</string> - <string name="logo_text">dhis</string> - <string name="logo_number">2</string> <!-- Warnings and error messages --> <string name="error">Error</string> - <plurals name="error_message"> - <item quantity="other">Kesalahan</item> - </plurals> - <string name="error_wrong_server_url">URL Server salah</string> - <string name="error_wrong_credentials">Kredensial salah</string> - <string name="error_unexpected_error">Kesalahan tak terduga</string> - <string name="error_internal_server_error">Kesalahan internal server</string> - <string name="no_value">tidak ada nilai</string> <string name="no_reserved_values">Tidak ada nilai lainnya. Hubungi admin sistem Anda.</string> - <string name="no_reserved_values_connection">Tidak ada nilai lainnya. Sambungkan ke Internet untuk mengisi.</string> - <string name="errors">Kesalahan</string> <string name="something_wrong">Terjadi kesalahan</string> <!-- SyncService strings: --> - <string name="sync_now">Sinkronkan sekarang</string> - <string name="sync_text">Mensinkronkan dengan server</string> - <string name="sync_title">Sedang mensinkronkan</string> - <string name="sync_metadata">Metadata</string> <string name="sync_events">Event</string> - <string name="sync_tei">Entitas terlacak</string> - - <string name="sync_complete_title">Selesai</string> - <string name="sync_complete_text">Sync lengkap</string> <string name="sync_error_title">Sync error</string> <string name="sync_error_text">Terjadi kesalahan saat sinkronisasi. Silakan coba kembali.</string> - <string name="data_sync_warning_program">PERINGATAN: Sebagian besar data telah tersinkronisasi tapi terdapat beberapa konflik. Sinkronisasi konfigurasi Anda dan coba kembali. Jika status sinkronisasi: program, TEI, dan event yang berkonflik ditandai sebagai @.</string> - <string name="server_sync_error">Terjadi kesalahan dan server tidak merespon. Hubungi administrator anda.</string> - - <string name="search_result_text">%s hasil ditemukan</string> - <string name="add_new">Tambahkan baru</string> - <string name="add">Tambah</string> - <string name="schedule_new">Penjadwalan baru</string> <string name="referral">Rujukan</string> <!-- Login --> - <string name="url_hint">URL server</string> - <string name="user_hint">User name</string> - <string name="password_hint">Password</string> - <string name="log_in_button">Masuk</string> - <string name="unlock_button">Buka sesi</string> <string name="syncing_configuration">Mensinkronkan konfigurasi Anda</string> <string name="syncing_data_shortly">Data Anda segera disinkronkan</string> <string name="syncing_data">Mensinkronkan data Anda</string> <string name="configuration_ready">Konfigurasi Anda siap digunakan</string> <string name="data_ready">Data Anda tersedia</string> - <string name="configuration_sync_failed">Konfigurasi sinkron gagal</string> - <string name="data_sync_failed">Sinkronisasi data gagal</string> <string name="account_recovery">Penyelamatan akun</string> + <!--PERIOD--> <string name="DAILY">Harian</string> <string name="WEEKLY">Mingguan</string> @@ -70,125 +37,76 @@ <string name="enter_text">Masukkan teks</string> <string name="enter_long_text">Masukkan teks panjang</string> <string name="enter_number">Masukkan angka</string> - <string name="enter_integer">Masukkan angka positif</string> <string name="enter_negative_integer">Masukkan angka bulat negatif</string> <string name="enter_positive_integer_or_zero">Masukkan bilangan bulat positif atau nol</string> <string name="enter_positive_integer">Masukkan bilangan bulat</string> - <string name="filter_options">Pilihan penyaringan</string> <string name="choose_date">Pilih tanggal</string> - <string name="change_calendar">Ganti kalender</string> <!-- Status --> - <string name="program_completed">Program selesai</string> - <string name="program_inactive">Program tidak aktif</string> <string name="event_open">Buka</string> <string name="event_completed">Even selesai</string> <string name="read_only">Baca saja</string> - <string name="finish_and_complete">Selesai dan lengkap</string> <string name="completed">Selesai</string> <string name="cancelled">Dibatalkan</string> - <string name="activate">Aktivasi</string> <string name="active">Aktif</string> <!-- State --> <string name="state_synced">Sinkronisasi</string> <string name="state_to_post">Untuk dikirim</string> <string name="state_to_update">Untuk diperbarui</string> - <string name="state_to_delete">Untuk dihapus</string> <string name="state_error">Error</string> - <string name="action_sync">SINKRONISASI</string> - <string name="action_send">KIRIM</string> - <string name="action_sync_sms">SINKRONISASI SMS</string> <!--Completion--> - <string name="completion">Melengkapi</string> <!--Event initial--> - <string name="create">Buat</string> <string name="update">perbarui</string> - <string name="date">Tanggal</string> <string name="org_unit">Unit Organisasi</string> <string name="no_org_units">Tidak ada unit organisasi yang terbuka untuk tanggal terpilih. Mohon pilih tanggal atau unit organisasi lain</string> - <string name="category_option">Kategori opsi</string> <string name="latitude">Lintang</string> <string name="longitude">Bujur</string> - <string name="new_event">Event baru</string> - <string name="one_time">Satu kali</string> - <string name="permanent">Permanen</string> <!--DataSet initial--> <string name="report_period">Periode pelaporan</string> - <string name="cat_option">Opsi kategori</string> - <string name="field_required">Jika Anda mengisi, semua baris harus terisi untuk menyelesaikan data set</string> - <string name="field_mandatory">Beberapa data yang diperlukan tidak ada. Anda perlu menetapkan data wajib terisi untuk menyelesaikan Data.Set</string> - <string name="field_mandatory_v2">Terdapat hal penting yang hilang. Harap mengisinya untuk melengkapi data.set</string> - <string name="datavalue_saved">Data tersimpan!</string> - <string name="there_is_no_available_period">Tidak ada periode yang dapat dipilih.</string> <!--Event Detail--> <string name="due_date">Tanggal jatuh tempo</string> <string name="cat_combo">Cat Combo</string> - <string name="date_default">DD/MM/YYYY</string> <string name="cancel">batal</string> <string name="delete">hapus</string> - <string name="total">Total</string> <string name="most_recent_event_date">hal yang paling terbaru</string> <string name="active_programs">Aktifkan program</string> - <string name="to_enroll_programs">Program untuk didaftarkan</string> <string name="enroll">Daftar</string> - <string name="last_visit">Kunjungan terakhir:</string> - <string name="apply">Terapkan</string> <!--TEI DASHBOARD--> - <string name="see_details">Lihat rincian</string> - <string name="view_more">LIHAT LAINNYA</string> <string name="edit">Sunting</string> - <string name="follow_up">Tindak lanjut</string> - <string name="follow_up_enabled">Tindak lanjut diterapkan</string> - <string name="follow_up_disabled">Tindak lanjut ditutup</string> <string name="deactivate">Deaktivasi</string> <string name="program_not_allow_events">Program ini tidak diperbolehkan menambah even</string> <!--DONE TASKS--> - <string name="events_no_data">Tidak ada data</string> <string name="events">Even</string> <string name="done_task">Beranda</string> - <string name="app_info">Informasi App</string> <string name="log_out">Keluar</string> - <string name="block_session">Tutup sesi</string> <!-- SYNC --> - <string name="a_minute">1 Menit</string> - <string name="fifteen_minute">15 Menit</string> <string name="thirty_minutes">30 Menit</string> <string name="a_hour">1 Jam</string> <string name="every_6_hours">6 Jam</string> <string name="a_day">1 Hari (Default)</string> <string name="every_12_hours">12 Jam</string> - <string name="Automatic_Sync_Data">Sinkronisasi data otomatis setiap:</string> <string name="Manual">Manual</string> - <string name="Automatic_Sync_Metadata">Sinkronisasi konfigurasi otomasi setiap:</string> <string name="a_week">1 Minggu</string> <string name="sync_max_parameters">Parameter sinkronisasi saat ini:</string> <string name="sync_default_parameters">Kembalikan ke default</string> + <string name="wipe_data_meesage">Database akan dihapus. Anda akan diminta masuk lagi</string> <string name="wipe_data_ok">Terima</string> <string name="wipe_data_no">batal</string> <string name="SYNC_DATA">Sinkronkan Data Sekarang</string> <string name="SYNC_META">Sinkronkan Konfigurasi Sekarang</string> <string name="SYNC_MANAGER">Setting</string> - <string name="last_data_sync_date">Sinkronisasi terakhir pada: %s</string> - <string name="last_metadata_sync_date">Sinkronisasi terakhir pada: %s</string> <string name="refill_reserved_values">Isi ulang</string> - <string name="settings_sms_module_title">Modul SMS:</string> <string name="settings_sms_receiver_number">SMS Gateway</string> <string name="settings_sms_result_sender_number">Pengirim hasil SMS</string> - <string name="settings_sms_result_timeout_hint">Kedua</string> - <string name="settings_sms_result_sender_hint">Nomor</string> - <string name="settings_sms_receiver_number_hint">Nomor</string> <string name="settings_sms_module_switch">Fungsikan pengiriman SMS</string> <string name="settings_sms_response_wait_switch">Tunggu balasan hasil SMS</string> - <plurals name="settings_specific_programs"> - <item quantity="other">Terdapat %s program dengan pengaturan khusus</item> - </plurals> <string name="settings_limit_scope">pengaturan terbatas</string> <string name="settings_limit_globally">Secara global</string> <string name="settings_limit_program">berdasarkan program</string> @@ -206,15 +124,11 @@ <string name="settingsErrorLog_descr">Log ini berisi semua kesalahan yang disebabkan karena sinkronisasi data dan metadata Anda</string> <string name="settingsDeleteLocalData">Menghapus data local</string> <string name="settingsDeleteLocalData_descr">Semua data aplikasi yang tersimpan pada perangkat Anda akan dihapus. Data yang belum tersinkron pada server akan hilang.</string> - <string name="settingsReset">Setel ulang app data &amp; konfigurasi</string> - <string name="settingsReset_descr">Konfigurasi dan aplikasi penyimpan data pada perangkat Anda akan dihapus. Anda akan diminta untuk masuk kembali dan data yang belum disinkronkan pada server akan hilang.</string> <string name="settingsSms">Pengaturan SMS</string> <string name="settingsSms_descr">Periksa dan edit parameter yang terkait dengan SMS gateway</string> <string name="settingsTwoFAStatus">Status</string> <!--endregion--> - <string name="enrollmment_date">Tanggal pendaftaran</string> - <!-- SEARCH OPTION SET --> <string name="search_optionset">Pencarian</string> <!--FORM FRAGMENT--> @@ -223,11 +137,6 @@ <string name="write_new_note">Tulis catatan baru</string> <string name="clear">Kosongkan</string> <string name="add_note">Tambah catatan</string> - <string name="revert">Kembali</string> - <string name="activated">Diaktifkan</string> - <string name="missing_mandatory_fields_title">Bidang wajib tidak ada</string> - <string name="missing_mandatory_fields_text">Beberapa bidang wajib tidak ada. Jika Anda ingin kembali sekarang, semua informasi yang disimpan akan dihapus.</string> - <string name="missing_mandatory_fields_text_not_delete">Beberapa bidang wajib tidak ada. Jika Anda ingin kembali, silakan isi.</string> <string name="title_delete_go_back">Data Anda tidak disimpan</string> <string name="delete_go_back">Jika Anda kembali sekarang, semua informasi yang dimasukkan akan dihapus.</string> <string name="missing_mandatory_fields_go_back">Hapus dan kembali</string> @@ -235,29 +144,15 @@ <string name="tei_coordinates">Koordinat untuk</string> <!--EVENT SUMMARY--> - <string name="section_list">Daftar bagian</string> - <string name="event_summary_header" formatted="false">%s pertanyaan %s selesai</string> - <string name="event_summary_sections_header" formatted="false">%s dari %s selesai</string> - <string name="complete_and_close">Selesai dan tutup</string> <!--AGE CUSTOM VIEW--> - <string name="hint_day">Hari</string> - <string name="hint_month">Bulan</string> - <string name="hint_year">Tahun</string> - <string name="week">Minggu</string> <string name="incident_date">Tanggal insiden</string> - <string name="local_results">Hasil lokal</string> - <string name="online_results">Hasil online</string> <string name="past_programs">Program sebelumnya</string> <!--PERMISSIONS--> <string name="permission_denied">Anda tidak memiliki izin yang dibutuhkan untuk melakukan tindakan ini</string> - <string name="add_relation_button">Tambahkan sebagai…</string> - <string name="date_dialog_clear">Hapus</string> <string name="period">Periode</string> - <string name="org_unit_filter">(%d) Unit Organisasi</string> - <string name="org_unit_select_level">Tingkat %d</string> <string name="tuto_main_1">Selamat datang di dhis2</string> <string name="tuto_main_2">Di sini Anda dapat melihat aktivitas Anda</string> <string name="tuto_main_3">Anda dapat menerapkan filter…</string> @@ -266,17 +161,11 @@ <string name="tuto_main_6">Periksa tindakan lain di menu utama</string> <!-- RELATIONSHIPS --> - <string name="default_relationship_label">Buat hubungan</string> <string name="next">Se;lanjutnya</string> <string name="search_min_num_attr">Anda harus memasukkan setidaknya %d atribut untuk melakukan pencarian</string> - <string name="search_attr">Anda harus memasukkan setidaknya satu atribut untuk melakukan pencarian</string> - <string name="search_max_tei_reached">Ada lebih dari %d hasil. Silakan masukkan kriteria pencarian lebih lanjut</string> - <string name="search_criteria_not_met">Kriteria penelusuran Anda tidak memberikan hasil apa pun.\nRevisi kriteria Anda atau daftarkan %s baru</string> - <string name="search_init">Masukkan kriteria pencarian Anda</string> <!-- QR --> <string name="QR_SCANNER">Impor data QR</string> - <string name="SAVE">Simpan</string> <string name="button_ok">OK</string> <string name="qr_id">Identifikasi</string> <string name="qr_attributes">Atribut</string> @@ -288,33 +177,18 @@ <string name="qr_no_data">tidak ada data</string> <string name="qr_error_id">Kode QR tidak valid</string> <string name="qr_error_attr">Atribut ini tidak dapat ditambahkan</string> - <string name="qr_error_enrollment">Pendaftaran ini tidak dapat ditambahkan</string> <string name="about">Tentang</string> <string name="programs_to_enroll">Program untuk didaftarkan</string> - <string name="select_all">Pilih Semua</string> - <string name="clear_all">hapus pilihan</string> - <string name="empty_program_list">Tidak ada informasi untuk filter yang dipilih. Silakan coba mengubahnya.</string> <string name="share">Bagikan</string> <string name="share_qr">Bagikan QR</string> - <string name="teiType_search_online">Pencarian menurut jenis tidak dimungkinkan untuk pencarian online.\nSilakan pilih program dari daftar.</string> - <string name="max">Maks</string> - <string name="current">Saat ini</string> <string name="tei">TEI</string> <string name="teis">TEI</string> - <string name="limit_by_organisation_unit">Batasi menurut unit organisasi</string> - <string name="limit_by_program">Batasi menurut program</string> - <string name="programs_list">Daftar program</string> <string name="wipe_data">Setel ulang app data &amp; konfigurasi</string> - <string name="add_relationship_error">Tidak mungkin untuk menambahkan hubungan ini</string> <string name="warning_error_on_complete_title">Periksa ini!</string> - <string name="warning_on_complete_title">Peringatan</string> - <string name="error_on_complete_title">Error</string> <string name="save">Simpan</string> <string name="reserved_value">Nilai Cadangan</string> - <string name="downloaded_confirm">Apakah Anda ingin menambahkan lebih banyak data dari QR?</string> - <!--ABOUT--> <string name="about_app">Versi Aplikasi: %s</string> <string name="about_sdk">Versi SDK: %s</string> @@ -325,137 +199,44 @@ <string name="about_dev">Dikembangkan dan dikelola oleh proyek <a href="https://www.dhis2.org/"> DHIS2 </a>, bagian dari Universitas Oslo, <a href="https://www.mn.uio.no/ifi/english/"> departemen informatika </a> .</string> <string name="about_contact">Untuk informasi lebih lanjut atau pertanyaan tentang aplikasi ini, silakan menulis ke <a href="mailto:android@dhis2.org"> android@dhis2.org </a></string> - <string name="login_error_null_pass">Kata sandi tidak ada. Silakan isi kolom ini.</string> - <string name="login_error_null_username">Nama pengguna tidak ada. Silakan isi kolom ini.</string> - <string name="login_error_dhis_version">Server ini menjalankan versi dhis yang berbeda dari 2.29. Perbarui versi server Anda atau gunakan pengujian lingkungan untuk melanjutkan.</string> - <string name="login_error_dhis_version_v2">Server ini menjalankan versi dhis yang berbeda dari %s. Perbarui versi server Anda atau gunakan pengujian lingkungan untuk melanjutkan.</string> - <string name="login_error_unsuccessful_response">Ada yang salah. Harap periksa bahwa url server, nama pengguna, dan kata sandi sudah benar dan coba lagi.</string> - <string name="login_error_error_response">Server tidak dapat menyelesaikan permintaan ini.</string> - <string name="login_error_default">Terjadi masalah saat mencoba masuk ke server.</string> - <string name="login_error">Kesalahan login</string> - <string name="missing_mandatory_fields">Bidang wajib tidak ada</string> - <string name="online_search_unexpected">Kesalahan tak terduga pada saat pencarian online</string> - <string name="online_search_parsing_error">Kesalahan saat penguraian hasil</string> - <string name="online_search_error">Pencarian online menghasilkan kesalahan</string> - <string name="online_search_response_error">Ada yang salah di server</string> <string name="search_program_not_selected">Pilih program untuk mengaktifkan pendaftaran</string> <string name="search_access_error">Anda tidak memiliki izin yang diperlukan</string> - <string name="feature_unavaible">Fungsi ini belum tersedia</string> - <string name="relationship_label_error">Kesalahan saat mengambil label hubungan</string> <string name="all_tei_type">Semua %s</string> <string name="invalid_phone_number">Ini bukan nomor telepon yang valid</string> - <string name="invalid_email">Ini bukan email yang valid</string> - <string name="invalid_negative_number">Hanya angka negatif yang diperbolehkan</string> <string name="invalid_possitive_zero">Hanya angka positif atau nol yang diperbolehkan</string> - <string name="invalid_possitive">Hanya angka positif yang diperbolehkan</string> - <string name="invalid_interval">Hanya nilai dari 0 hingga 1 yang diperbolehkan</string> - <string name="invalid_percentage">Hanya nilai dari 0 hingga 100 yang diizinkan</string> - <string name="date_dialog_tigle">Pilih tanggal untuk difilter</string> <string name="select_option">Pilih opsi</string> - <string name="issue_reported">Masalah dilaporkan</string> - <string name="dialog_generate_new_event">Buat even baru</string> - <string name="message_generate_new_event">Apakah Anda ingin membuat even lain?</string> <string name="event_completed_title">Even Selesai</string> <string name="event_completed_message">Semua even dalam program ini selesai. Apakah Anda ingin menutup program?</string> - <string name="complete_enrollment_message">Apakah Anda ingin menyelesaikan pendaftaran juga?</string> <string name="check_event">Memeriksa</string> <string name="menu_home">Beranda</string> <string name="appwidget_text">CONTOH</string> - <string name="add_widget">Tambahkan widget</string> <string name="showHelp">Tampilkan bantuan</string> - <string name="tuto_settings_1">Proses sinkronisasi data...</string> - <string name="tuto_settings_2">…konfigurasi Anda…</string> - <string name="tuto_settings_3">…atur berapa banyak catatan yang akan diunduh dari server…</string> - <string name="tuto_settings_reserved">Periksa dan kelola berapa banyak nilai cadangan yang tersisa</string> - <string name="tuto_settings_errors">Periksa apakah koneksi ke server gagal</string> - <string name="tuto_settings_reset">Kosongkan sebagian ruang disk</string> - <string name="tuto_settings_4">…atau hapus semuanya untuk memulai dari awal.</string> - <string name="tuto_search_1_v2">Temukan entitas Anda baik di perangkat lokal maupun server online.</string> - <string name="tuto_search_2">Anda dapat beralih ke program lain</string> - <string name="tuto_search_3_v2">Cari atau Tambahkan entitas baru. Anda perlu mencari sebelum Anda dapat menambahkan yang baru!</string> - <string name="tuto_search_4_v2">Klik di sini untuk membersihkan bidang dan memulai kembali pencarian.</string> <string name="tuto_dashboard_1">Ini adalah dasbor entitas</string> <string name="tuto_dashboard_2">Lihat informasi profil entitas…</string> - <string name="tuto_dashboard_3">…Berbagi informasi melalui QR atau SMS…</string> - <string name="tuto_dashboard_4">…Atau tandai entitas untuk ditindaklanjuti</string> - <string name="tuto_dashboard_5">Klik untuk membuat atau menjadwalkan even atau alihkan ke Unit Org lain.</string> <string name="tuto_dashboard_6">Di sini Anda akan melihat semua even. Klik untuk melihat detail even.</string> <string name="tuto_dashboard_7">Navigasikan menu untuk menambahkan hubungan, melihat indikator, atau menulis catatan.</string> - <string name="tuto_dashboard_8">Klik untuk melihat semua pendaftaran entitas Anda atau buat yang baru.</string> - <string name="tuto_tei_event_1">Klik untuk menghapus even ini. Tindakan ini tidak bisa dibatalkan.</string> - <string name="tuto_tei_event_2">Selesaikan even.</string> - <string name="tuto_program_event_1">Semua even yang terkait dengan program ini akan dicantumkan di sini.</string> - <string name="tuto_program_event_2">Klik untuk menambahkan even baru</string> <string name="tuto_event_initial_new_1">Masukkan semua data untuk membuat even</string> <string name="tuto_event_initial_1">Klik untuk memeriksa status penyelesaian even.</string> - <string name="tuto_event_summary">Klik untuk menyelesaikan atau membuka kembali even</string> - <string name="tuto_main_7">Baca dan simpan informasi dari perangkat lain melalui QR</string> - <string name="tuto_main_8">Mensinkronkan data Anda pada server</string> - <string name="tuto_main_9">Blokir sesi dengan kode 4 digit. Jangan lupa kode Anda!</string> - <string name="tuto_main_10">Logout untuk mengubah pengguna atau server. Anda akan dapat masuk kembali meskipun tidak ada koneksi internet.</string> - <string name="text_plus_colon">%s:</string> <string name="relationships">hubungan</string> <string name="empty_tei_add">Tidak ada acara yang terdaftar, klik \"+\" untuk menambahkan yang baru.</string> - <string name="empty_tei_no_add">Tidak ada even yang terdaftar.</string> <string name="qr_data_values">Nilai data</string> <string name="info">Info</string> <string name="qr_no_id_error">Tidak dapat membaca ID ini</string> <string name="delete_local_data">Menghapus data lokal</string> <string name="dashboard_overview">Gambaran</string> - <string name="dashboard_relationships">Hubungan</string> - <string name="dashboard_indicators">Indikator</string> - <string name="dashboard_analytics">Analitik</string> <string name="empty_indicators">Tidak ada indikator untuk program ini.</string> - <string name="dashboard_notes">Catatan</string> - <string name="field_errors">Beberapa parameter terjadi kesalahan. Mohon periksa untuk dapat menyelesaikannya</string> <string name="unselect_enrollment">Semua pendaftaran</string> <string name="unselect_enrollment_description">Tampilkan dasbor dengan semua program aktif</string> - <string name="CHECK_SYNC_ERRORS">Buka log kesalahan sinkronisasi</string> <string name="error_dialog_title">Log kesalahan sinkronisasi</string> <string name="share_with">Berbagi dengan...</string> - <string name="errors_during_sync">Konfigurasi sinkronisasi Anda gagal. Terdapat kesalahan pada server. Klik bagian ini untuk informasi lebih lanjut</string> - <string name="sectionSelectorPrev">SEBELUMNYA</string> - <string name="sectionSelectorNext">SELANJUTNYA</string> - <string name="event_overview">Rincian</string> - <string name="event_indicators">Indikator</string> - <string name="event_notes">Catatan</string> - <string name="complete_add_new"> <![CDATA[Complete & add new]]></string> - <string name="complete_later">Selesaikan nanti</string> - <string name="finish_add_new"> <![CDATA[Finish & add new]]></string> - <string name="finish">Selesai</string> - <string name="error_fields_title">Parameter dengan kesalahan</string> - <string name="error_fields_events">Beberapa parameter terdapat kesalahan. Parameter ini belum disimpan. Mohon periksa kembali</string> <string name="unique_warning">Nilai harus unik, kebetulan telah ditemukan. Itu belum disimpan. Tolong diperiksa.</string> - <string name="unique_coincidence_found">Sebuah kebetulan di bidang yang unik telah ditemukan. Silakan periksa formulir untuk menyimpan Pendaftaran.</string> <string name="please_wait">Mohon tunggu</string> <string name="skip">Lewati</string> - <string name="reschedule">Jadwal ulang</string> <string name="no_intructions">Tidak ada informasi untuk layar ini</string> - <string name="event_overdue">Lewat waktu</string> - <string name="unsupported_program_rule">Terdapat satu aturan program yang tidak didukung. Silakan periksa dokumentasi</string> - <string name="empty_description">Tidak ada info untuk bidang ini</string> - <string name="biometrics_dialog_title">Kredensial Kosong</string> - <string name="biometrics_first_use_text">Untuk dapat login menggunakan pemindai sidik jari, Anda terlebih dahulu harus menggunakan cara default</string> - <string name="biometrics_security_title">Keamanan Biometrik</string> - <string name="tab_tables">Tabel</string> - <string name="table">Tabel</string> - <string name="login_https">https://</string> <string name="delete_local_data_message">Data yang belum tersinkron akan hilang. Apakah Anda akan melanjutkan?</string> - <string name="local_data_accept">Terima</string> <string name="delete_local_data_error">Data tidak dapat dihapus. Silakan coba lagi.</string> <string name="delete_local_data_done">Hapus data lokal berhasil diselesaikan.</string> - <string name="org_unit_selection_warning">Setidaknya satu unit organisasi harus dipilih</string> - <string name="send_user_name_title">Kirim data</string> - <string name="send_user_name_mesage">Bantu DHIS2 menyempurnakan app ini dengan membagi log kesalahan yang berkaitan dengan id user Anda</string> - <string name="check_mandatory_field">Periksa bidang</string> - <string name="error_no_network_during_sync">Anda kehilangan koneksi internet saat sedang mensinkronkan konfigurasi. Silahkan coba lagi nanti</string> - <string name="action_agree">Setuju</string> - <string name="action_continue">Terus</string> - <string name="login_server_info_title">URL server</string> - <string name="forgot_your_code">Lupa kode Anda?</string> - <string name="event_form_end_options_title">Apa yang ingin Anda lakukan untuk even ini?</string> - <string name="sectionSelectorEnd">AKHIR</string> <string name="resource_not_found">%s tidak ditemukan</string> <string name="relationship_not_found_message">Catatan yang Anda coba akses tidak tersedia. Apakah Anda ingin mencarinya?</string> <string name="sync_by_sms">Sinkronkan dengan SMS</string> @@ -463,32 +244,15 @@ <string name="state_uploading">Mengunggah</string> <string name="state_relationship">Hubungan</string> <string name="sent_by_sms">Dikirim melalui sms</string> - <string name="no_conflicts_message">Tidak ada konflik untuk program ini</string> - <string name="network_unavailable_sms">Koneksi jaringan tidak tersedia, tetapi sepertinya ada layanan telepon - Anda dapat menggunakan SMS.</string> - <string name="network_unavailable">Koneksi jaringan tidak tersedia.</string> <string name="action_close">Tutup</string> <string name="tuto_main_11">Anda bisa melihat hasil sinkronisasi dengan klik bagian ini</string> - <string name="no_conflicts_update_message">Data ini disimpan dalam perangkat Anda saja, tidak disinkronkan pada server</string> - <string name="no_conflicts_synced_message">Anda up to date! Semua data Anda dikirim ke server.</string> <string name="relationship_error_recursive">Anda tidak dapat menghubungkan rekaman dengan dirinya sendiri</string> - <string name="unblock_session">Buka blokir sesi</string> - <string name="data_set_complete">Lengkap</string> - <string name="data_set_open">Buka</string> - <string name="unsupported_value_type">Jenis nilai yang tidak didukung</string> <string name="change_calendar_view">Ubah tampilan kalender</string> - <string name="data_every_fifteen_minutes">15 menit</string> - <string name="data_every_hour">Setiap jam</string> - <string name="data_every_day">Harian</string> - <string name="data_every_week">Mingguan</string> - <string name="period_week">Minggu</string> - <string name="sync_setting">Pengaturan sinkronisasi: %s</string> <string name="relationship_without_enrollment">Catatan yang Anda coba akses tidak memiliki pendaftaran. Anda tidak dapat mengakses dasbor.</string> <string name="formatting_error">Memformat kesalahan</string> <string name="delete_authority_error">Anda tidak memiliki wewenang untuk menghapus catatan ini</string> - <string name="validation_url">Ini bukan url yang valid</string> <string name="adjusting_form">Menyesuaikan formulir…</string> - <string name="sms_receiver_number">Nomor penerima</string> <string name="sms_amount_question">Apakah Anda menerima untuk mengirim pesan %d?</string> <string name="sms_sending">Mengirim %1$d/%2$d</string> <string name="sms_waiting_amount_confirm">Konfirmasi jumlah tunggu - %d</string> @@ -506,51 +270,29 @@ <string name="sms_error_no_gateway_set">Tidak ada gateway yang disetel</string> <string name="sms_error_no_user_login">Pengguna tidak masuk</string> <string name="sms_error_module_disabled">Modul SMS dinonaktifkan</string> - <string name="sms_error_ongoing_sunmission">Pengiriman SMS lainnya sedang berlangsung</string> <string name="sms_metadata_empty">Modul SMS tidak dimulai, tidak ditemukan metadata yang diperlukan</string> - <string name="sms_completed">Selesai</string> <string name="sms_count_error">Jumlah SMS tidak diterima</string> <string name="sms_state_started">Mulai pengiriman sms</string> <string name="sms_state_converted">Data dibaca dan dikonversi. Id pengiriman: %d</string> - <string name="sms_general_error">Kesalahan pengiriman sms</string> <string name="sms_title_enrollment">Pendaftaran dan registrasi SMS TEI</string> <string name="sms_title_event">Pengiriman even SMS</string> <string name="sms_title_data_set">Pengiriman data set SMS</string> - <string name="sms_bar_state_starting">Mulai</string> - <string name="sms_bar_state_sending">Dalam proses</string> - <string name="sms_bar_state_sent">terkirim</string> - <string name="sms_bar_state_failed">Gagal</string> - <string name="start_sync_granular">Mulai sinkronisasi</string> <string name="syncing">Sedang sinkronisasi...</string> - <string name="end_sync_granular">Sinkronisasi selesai.</string> - <string name="error_sync">Kesalahan terjadi saat sinkronisasi</string> - <string name="error_sync_check_logs">Terjadi kesalahan selama sinkronisasi. Klik di sini untuk memeriksa log kesalahan</string> - <string name="cancel_sync">Batalkan sinkronisasi.</string> <string name="copied_text">Tersalin</string> - <string name="image_selected">Gambar dipilih</string> - <string name="show_in_map">Tampilkan di peta</string> - <string name="show_list">Tampilkan daftar</string> <!--region TRACKER IMPORT CONFLICT MESSAGES--> - <string name="value_required_but_not_provided">%s adalah wajib tetapi belum disediakan.</string> - <string name="polygon_captured">Poligon ditangkap</string> <string name="polygon">Poligon</string> <!--endregion--> - <string name="fingerprint_title">Sidik jari</string> - <string name="fingerprint_message">Harap, letakkan jari Anda di pembaca sidik jari Anda.</string> <string name="security_title">Keamanan</string> <string name="security_rooted_message">Untuk alasan keamanan, versi aplikasi ini tidak diizinkan untuk digunakan di perangkat yang di-rooting. Silakan gunakan versi pelatihan.</string> - <string name="fix_error">Terdapat beberapa kesalahan. Mohon perbaiki sebelum melanjutkan</string> <string name="filters_active">Filter menerapkan</string> <string name="filters_disabled">Tidak ada filter yang diterapkan</string> <string name="filters_title_period">Periode</string> <string name="filters_title_org_unit">Organisasi Satuan</string> - <string name="filters_title_sorting">Penyortiran</string> - <string name="filters_title_status">Status</string> <string name="filters_title_state">Sinkronisasi</string> <string name="filters_title_assigned">Ditugaskan kepada saya</string> <string name="filter_period_today">Hari ini</string> @@ -565,135 +307,18 @@ <string name="filter_period_form_to">Dari untuk</string> <string name="filter_period_other">Lainnya</string> <string name="filter_period_any">Kapan saja</string> - <string name="data_values_error_sync_message">Sinkronisasi gagal. Periksa kembali nilai data untuk memperbaiki permasalahan kemudian coba lagi. Jika tetap gagal hubungi administrator sistem</string> - <string name="sms_synced_message">Data ini telah terkirim ke server tetapi tidak dijamin telah disimpan</string> <string name="filter_event_status_open">Buka</string> <string name="filter_event_status_schedule">Jadwal</string> <string name="filter_event_status_overdue">Lewat waktu</string> <string name="filter_event_status_visited">Dikunjungi</string> <string name="filter_event_status_completed">Selesai</string> <string name="filter_event_status_skipped">Dilewati</string> - <string name="event_tei_limits">Even:%smaks:%s%ssaatini:%s TEI:%smaks:%s%ssatt ini:%s -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - </string> - <string name="event_tei_limits_v2">Pengaturan terbatas %s\nAcara: %s/%s TEI: %s/%s</string> - <string name="enrollment_data_hide">Sembunyikan data pendaftaran</string> - <string name="enrollment_data_show">Tampilkan data pendaftaran</string> <string name="sms_enabled">Modul SMS diaktifkan</string> <string name="sms_disabled">Modul SMS dinonaktifkan</string> <string name="sms_downloading_data">Mengunduh data untuk modul SMS. Mohon tunggu</string> <string name="sms_empty_gateway">Gerbang SMS tidak boleh kosong</string> <string name="granular_sync_enrollments_empty">Tidak ada pendaftaran untuk diunggah</string> <string name="granular_sync_unsupported_task">convertTask ini tidak didukung</string> - <string name="disable_pin_locked">Jangan tampilkan layar kunci lagi</string> <string name="set_pin">Setel pin</string> <string name="conflict">Konflik</string> <string name="change_event_date">Ganti tanggal</string> @@ -718,11 +343,7 @@ <string name="choose_ou">Pilih unit organisasi</string> <string name="enter_url">Masukkan URL</string> <string name="enter_value">Masukkan nilai</string> - <string name="choose_image">Pilih gambar</string> - <string name="scan_code">Pindai kode</string> - <string name="choose_option">Pilih opsi</string> <string name="reserved_values_hint">Nilai yang dicadangkan diunduh per atribut TEI</string> - <string name="settings_reserved_values_message">Nilai yang dicadangkan diunduh per atribut TEI</string> <string name="reserved_values_left">%s nilai yang dicadangkan tersisa</string> <string name="manage_reserved_values_button">Kelola nilai yang dicadangkan</string> <string name="events_to_download">Even untuk diunduh</string> @@ -742,56 +363,27 @@ <string name="filter_sync_not_synced">Tidak tersinkronisasi</string> <string name="filter_sync_error">Sync error</string> <string name="filter_sync_sms">SMS tersinkronisasi</string> - <string name="dataset_overview">Rincian</string> - <string name="dataset_comments">Komentar</string> <string name="saved">Tersimpan!</string> - <string name="run_validation_rules">Apakah Anda ingin memeriksa kualitas data?</string> - <string name="validation_success_title">Semuanya terlihat bagus!</string> - <string name="mark_dataset_complete">Apakah Anda juga ingin melengkapi data set?</string> - <string name="dataset_completed">Tandai sebagai selesai</string> - <string name="name">Nama</string> - <string name="formula">Formula</string> - <string name="complete_anyway">Lengkap</string> <string name="fk_message">Tidak ada %s %s dari %s %s</string> <string name="filters_title_event_status">Status even</string> - <string name="enrollment_date">Tanggal pendaftaran</string> <string name="dataset_empty_list_can_create">Tidak ada data. Klik \"+\" untuk menambahkan catatan baru</string> <string name="dataset_emtpy_list_can_not_create">Tidak ada data. Anda tidak memiliki izin untuk menambahkan catatan baru.</string> <string name="validation_rules_empty_description">Tidak ada deskripsi atau instruksi yang tersedia</string> <string name="validation_rules_data_to_review">Data untuk ditinjau</string> - <string name="dataset_saved_completed">Tersimpan dan selesai!</string> <string name="status_change_error_active_exist">Sudah ada pendaftaran aktif</string> <string name="enrollment_status_active">Buka</string> <string name="enrollment_status_completed">Lengkap</string> <string name="enrollment_status_cancelled">Dibatalkan</string> - <string name="event_data">Data</string> <string name="download_tei_error">%s yang dipilih tidak dapat diunduh.</string> - <string name="completed_by">Diselesaikan oleh %s: %s</string> - <string name="updated_time">Diperbarui: %s</string> - <string name="action_done">Selesai</string> - <string name="validation_internal_error_datasets">Kami tidak dapat memeriksa kualitas data. Hubungi administrator Anda</string> - <string name="are_you_sure">Anda yakin?</string> - <string name="reopen_question">Apakah Anda ingin membuka kembali data set?</string> <string name="filters_title_date">Tanggal</string> - <string name="filters_title_event_date">Tanggal even</string> - <string name="tei_type_has_no_attributes">%s tidak memiliki atribut publik. Silakan pilih program</string> <string name="privacy_policy_title">Kebijakan pribadi</string> <string name="open_privacy_policy">Klik di sini untuk memeriksa kebijakan privasi <a href=""> kami </a></string> - <string name="coordinates_error">Nilai koordinat tidak valid</string> - <string name="break_glass_error">Anda tidak dapat mendaftarkan TEI dari unit organisasi lain dalam program ini karena program ini dilindungi.\nHubungi administrator Anda.</string> <string name="field_is_mandatory">Bidang ini wajib</string> <string name="security_debugger_message">Untuk alasan keamanan, versi aplikasi ini tidak diizinkan untuk digunakan dengan adb. Silakan gunakan versi pelatihan.</string> <string name="customactivityoncrash_error_activity_restart_app">Kembali</string> - <string name="customactivityoncrash_error_activity_close_app">Tutup aplikasi</string> - <string name="customactivityoncrash_error_activity_error_details">Keterangan lebih lanjut</string> - <string name="customactivityoncrash_error_activity_error_details_title">Keterangan lebih lanjut</string> - <string name="customactivityoncrash_error_activity_error_details_close">Tutup</string> <string name="customactivityoncrash_error_activity_error_details_copy">Menyalin ke clipboard</string> - <string name="customactivityoncrash_error_activity_error_details_copied">Disalin ke papan klip</string> - <string name="customactivityoncrash_error_activity_error_details_clipboard_label">Informasi kesalahan</string> <string name="metada_first_sync_error">Kami menemukan kesalahan saat menyinkronkan dengan server Anda. Bagikan kesalahan dengan administrator sistem Anda jika memungkinkan.</string> - <string name="error_init_session">Kami tidak dapat memulai sesi dengan pengguna Anda</string> <string name="enrollment_date_edition_warning">Ada even yang direncanakan yang tidak akan dijadwalkan ulang</string> <string name="section_charts">Grafik</string> <string name="navigation_list_view">Daftar</string> @@ -836,23 +428,14 @@ <string name="section_feedback">Umpan balik</string> <string name="section_indicators">Indikator</string> <string name="camera_permission_denied">Izin kamera ditolak.\nAnda harus mengaktifkannya untuk menggunakan fitur ini.</string> - <string name="value">Nilai</string> <string name="section_charts_indicators">Grafik dan indikator</string> <string name="take_photo">Ambil gambar</string> - <string name="from_gallery">Pilih dari galeri</string> - <string name="data_set_quality_check_done">Selesai!</string> <string name="break_glass_dialog_title">Program ini dilindungi</string> <string name="break_glass_hint">Jelaskan alasannya di sini</string> - <string name="authenticating">Otentikasi</string> - <string name="login_error_no_dhis_instance">URL server yang disediakan bukan instance dhis</string> - <string name="login_error_bad_credentials">Kredensial salah</string> - <string name="invalid_integer">Nilai harus dalam bilangan bulat</string> <string name="openid_session_expired">Sesi telah berakhir</string> <string name="openid_session_expired_message">Sesi Anda saat ini telah kedaluwarsa. Untuk alasan keamanan, Anda harus memberikan kredensial Anda lagi</string> - <string name="dataset_column_default">Nilai</string> <string name="week_period_span_default_label">Minggu %d %s hingga %s</string> <string name="action_do_not_show_again">Jangan perlihatkan lagi</string> - <string name="available">Tersedia</string> <string name="troubleshooting_language_title">Bahasa</string> <string name="search_too_many_results">Hasil terlalu banyak</string> <string name="sync_dialog_title_synced">Tersinkronisasi</string> @@ -871,4 +454,7 @@ <string name="show_less">Tampilkan kurang</string> <string name="sync">Sinkronkan</string> <string name="show_description">Tampilkan keterangan</string> - </resources> + <plurals name="settings_specific_programs"> + <item quantity="other">Terdapat %s program dengan pengaturan khusus</item> + </plurals> +</resources> diff --git a/app/src/main/res/values-km/strings.xml b/app/src/main/res/values-km/strings.xml index 106273f220e..100ab4b963f 100644 --- a/app/src/main/res/values-km/strings.xml +++ b/app/src/main/res/values-km/strings.xml @@ -1,50 +1,25 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!--GENERAL--> <string name="app_name">ឌីអេចអាយអេសធូ (DHIS 2)</string> - <string name="logo_text">ឌីអេចអាយអេសធូ (DHIS 2)</string> - <string name="logo_number">លេខពីរ</string> <!-- Warnings and error messages --> <string name="error">កំហុសបច្ចេកទេស</string> - <string name="error_wrong_server_url">អាសយដ្ឋានម៉ាស៊ីនមេមិនត្រឹមត្រូវ</string> - <string name="error_wrong_credentials">អត្ដសញ្ញាណមិនត្រឹមត្រូវ</string> - <string name="error_unexpected_error">កំហុសបច្ចេកទេសមិនបានរំពឹងទុក</string> - <string name="error_internal_server_error">ម៉ាស៊ីនមេខាងក្នុងមានបញ្ហាបច្ចេកទេស</string> - <string name="no_value">មិនមានតំលៃ</string> <string name="something_wrong">មានអ្វីមួយខុសប្រក្រតី</string> <!-- SyncService strings: --> - <string name="sync_now">បញ្ជូនទិន្នន័យឥឡូវនេះ</string> - <string name="sync_text">កំពុងបញ្ជូនទិន្នន័យទៅកាន់ម៉ាស៊ីនមេ</string> - <string name="sync_title">បញ្ចូនទិន្នន័យឥឡូវនេះ </string> - <string name="sync_metadata">ទិន្នន័យ</string> <string name="sync_events">ព្រឹត្តិការណ៏</string> - <string name="sync_tei">ផ្នែកតាមដាន</string> - - <string name="sync_complete_title">បានបញ្ចប់</string> - <string name="sync_complete_text">ការបញ្ចូនទិន្នន័យបានបញ្ចប់</string> <string name="sync_error_title">ការបញ្ចូនទិន្នន័យមានបញ្ហាបច្ចេកទេស</string> <string name="sync_error_text">មានបញ្ហាបច្ចេកទេសក្នុងកំឡុងពេលបញ្ជូនទិន្នន័យ, សូមព្យាយាម្ដងទៀត។</string> - <string name="search_result_text">%s លទ្ធផលដែលបានរកឃើញ</string> - <string name="add_new">បន្ថែម​ថ្មី​</string> - <string name="add">បន្ថែម</string> - <string name="schedule_new">កំណត់កាលវិភាគឥឡូវនេះ</string> <string name="referral">ការបញ្ជូន</string> <!-- Login --> - <string name="url_hint">អាសយដ្ឋានរបស់ម៉ាស៊ីនមេ</string> - <string name="user_hint">ឈ្មោះ​គណនី</string> - <string name="password_hint">ពាក្យ​សម្ងាត់</string> - <string name="log_in_button">ចូលដំណើរការ</string> - <string name="unlock_button">ដោះសោ</string> <string name="syncing_configuration">កំពុងបញ្ជូនការកំណត់​រចនាសម្ព័ន្ធរបស់អ្នក</string> <string name="syncing_data_shortly">ទិន្នន័យរបស់អ្នកនឹងបញ្ជូនក្នុងពេលដ៏ខ្លីខាងមុខនេះ</string> <string name="syncing_data">កំពុងបញ្ជូនទិន្នន័យរបស់អ្នក</string> <string name="configuration_ready">ការកំណត់​រចនាសម្ព័ន្ធរបស់អ្នករួចរាល់</string> <string name="data_ready">ទិន្នន័យរបស់អ្នករួចរាល់</string> - <string name="configuration_sync_failed">ការបញ្ជូនការកំណត់​រចនាសម្ព័ន្ធរបស់អ្នកបរាជ័យ</string> - <string name="data_sync_failed">ការបញ្ជូនទិន្នន័យបរាជ័យ</string> <string name="account_recovery">ស្តារគណនីឡើងវិញ</string> + <!--PERIOD--> <string name="DAILY">រាល់​ថ្ងៃ</string> <string name="WEEKLY">រាល់​សប្ដាហ៍</string> @@ -58,15 +33,12 @@ <string name="enter_text">បញ្ជូលអក្សរ</string> <string name="enter_long_text">បញ្ចូលអក្សរច្រើន</string> <string name="enter_number">បញ្ជូលលេខ</string> - <string name="enter_integer">បញ្ជូលទិន្នន័យជាលេខ</string> <string name="enter_negative_integer">បញ្ជូលទិន្នន័យជាលេខ (អវិជ្ជមាន)</string> <string name="enter_positive_integer_or_zero">បញ្ជូលទិន្នន័យជាលេខ (វិជ្ជមាន រឺ លេខ ០)</string> <string name="enter_positive_integer">បញ្ជូលទិន្នន័យជាលេខ (វិជ្ជមាន)</string> - <string name="filter_options">ជំរើសសម្រាប់ច្រោះមើលទិន្នន័យ</string> <string name="choose_date">ជ្រើសរើសថ្ងៃខែឆ្នាំ</string> + <!-- Status --> - <string name="program_completed">កម្មវិធីបានបញ្ចប់</string> - <string name="program_inactive">កម្មវិធីមិនដំណើរការ</string> <string name="event_open">បើក</string> <string name="read_only">បានត្រឹមតែអាន</string> @@ -75,79 +47,50 @@ <!-- State --> <string name="state_synced">បញ្ចូន</string> <string name="state_to_update">ដើម្បីធ្វើបច្ចុប្បន្នភាព</string> - <string name="state_to_delete">ដើម្បីលុប</string> <string name="state_error">កំហុសបច្ចេកទេស</string> - <string name="action_sync">បញ្ជូន</string> + <!--Completion--> - <string name="completion">ការបញ្ចប់</string> <!--Event initial--> - <string name="create">​បង្កើត</string> <string name="update">ធ្វើ​បច្ចុប្បន្នភាព</string> - <string name="date">កាលបរិច្ឆេទ</string> <string name="org_unit">អង្គភាព</string> - <string name="category_option">ជម្រើសប្រភេទ</string> <string name="latitude">រយៈទទឹង</string> <string name="longitude">រយៈបណ្តោយ</string> - <string name="new_event">ព្រឹត្តិការណ៏ថ្មី</string> - <string name="one_time">មួយពេល</string> - <string name="permanent">អចិន្ត្រៃយ៍</string> <!--DataSet initial--> <string name="report_period">Report period</string> <!--Event Detail--> <string name="due_date">កាលបរិច្ឆេទកំណត់</string> <string name="cat_combo">ប្រភេទបន្សំចូលគ្នា</string> - <string name="date_default">ថ្ងៃថ្ងៃ/ខែខែ/ឆ្នាំឆ្នាំឆ្នាំឆ្នាំ</string> <string name="cancel">បោះបង់</string> <string name="delete">​លុប​</string> <string name="active_programs">កម្មវិធីដំណើរការ</string> - <string name="to_enroll_programs">កម្មវិធីចុះឈ្មោះ</string> <string name="enroll">ចុះឈ្មោះ</string> - <string name="last_visit">ជួបចុងក្រោយ​</string> - <string name="apply">អនុវត្ត</string> <!--TEI DASHBOARD--> - <string name="see_details">មើលលំអិត</string> - <string name="view_more">មើលច្រើនទៀត</string> <string name="edit">កែសម្រួល​</string> - <string name="follow_up">តាមដាន</string> - <string name="follow_up_enabled">ការតាមដានដំណើរការ</string> - <string name="follow_up_disabled">ការតាមដានមិនដំណើរការ</string> <string name="deactivate">ធ្វើអោយអសកម្ម</string> <string name="program_not_allow_events">កម្មវិធីនេះមិនអនុញ្ញាតអោយមានព្រឹត្តិការណ៏ច្រើនទេ</string> <!--DONE TASKS--> - <string name="events_no_data">មិនមានទិន្នន័យ</string> <string name="events">ព្រឹត្តិការណ៏</string> <string name="done_task">ផ្ទាំងដើម</string> - <string name="app_info">ព័ត៌មានកម្មវិធី</string> <string name="log_out">ចាកចេញ</string> - <string name="block_session">ការទប់ស្កាត់</string> - <!-- SYNC --> - <string name="a_minute">១នាទី</string> - <string name="fifteen_minute">១៥នាទី</string> <string name="a_hour">១ម៉ោង</string> <string name="a_day">១ថ្ងៃ (លំនាំដើម)</string> - <string name="Automatic_Sync_Data">កំណត់ការបញ្ជូនទិន្នន័យដោយស្វ័យប្រវត្តិជារៀងរាល់</string> <string name="Manual">ហត្ថកម្ម</string> - <string name="Automatic_Sync_Metadata">កំណត់​រចនាសម្ព័ន្ការដោយស្វ័យប្រវត្តិជារៀងរាល់</string> <string name="a_week">១សប្តាហ៍</string> <string name="sync_max_parameters">ប៉ារ៉ាម៉ែត្រដែលកំពុងធ្វើការបញ្ជូន</string> <string name="sync_default_parameters">ធ្វើអោយទោលំនាំដើម</string> + <string name="wipe_data_meesage">ប្រព័ន្ធទិន្នន័យនឹងត្រូវលុបចោល\nអ្នកត្រូវចូលមកប្រើម្ដងទៀតដោយបញ្ចុលឈ្មោះ និង លេខសំងាត់​</string> <string name="wipe_data_ok">ទទួលយក</string> <string name="wipe_data_no">បោះបង់</string> <string name="SYNC_DATA">បញ្ជូនទិន្នន័យឥឡូវនេះ</string> <string name="SYNC_META">បញ្ជូនការកំណត់​រចនាសម្ព័ន្ធឥឡូវនេះ</string> <string name="SYNC_MANAGER">ការ​កំណត់</string> - <string name="last_data_sync_date">បានបញ្ជូនចុងក្រោយ: %s</string> - <string name="last_metadata_sync_date">បានបញ្ជូនចុងក្រោយ: %s</string> - <string name="settingsReset">កំណត់កម្មវិធីឡើងវិញ</string> <string name="settingsTwoFAStatus">ស្ថានភាព</string> <!--endregion--> - <string name="enrollmment_date">ថ្ងៃខែឆ្នាំចុះឈ្មោះ</string> - <!-- SEARCH OPTION SET --> <string name="search_optionset">ស្វែងរក</string> <!--FORM FRAGMENT--> @@ -156,34 +99,16 @@ <string name="write_new_note">កត់ចំណាំថ្មី</string> <string name="clear">លុបចោល</string> <string name="add_note">បន្ថែមការកត់ចំណាំ</string> - <string name="revert">ត្រលប់ក្រោយ</string> - <string name="activated">បានដាក់អោយដំណើរការ</string> - <string name="missing_mandatory_fields_title">ទិន្នន័យចាំបាច់មិនមាន</string> - <string name="missing_mandatory_fields_text">ឈ្មោះទិន្នន័យចាំបាច់ខ្លះមិនមាន, ប្រសិនបើអ្នកចង់ត្រឡប់ទៅវិញ រាល់ពត៏មាននិងត្រូវលុយចោល</string> - <string name="missing_mandatory_fields_go_back">លុប ហើយត្រឡប់ទៅវិញ</string> <!--EVENT SUMMARY--> - <string name="section_list">បញ្ជីតាមផ្នែក</string> - <string name="event_summary_header" formatted="false">%s សំនួរនៃ %s ដែលបានបញ្ចប់</string> - <string name="event_summary_sections_header" formatted="false">%s នៃ %s ដែលបានបញ្ចប់</string> - <string name="complete_and_close">បញ្ចប់ និង ចាកចេញ</string> <!--AGE CUSTOM VIEW--> - <string name="hint_day">ថ្ងៃ</string> - <string name="hint_month">ខែ</string> - <string name="hint_year">ឆ្នាំ</string> - <string name="week">សប្ដាហ៏</string> <string name="incident_date">ថ្ងៃខែឆ្នាំ ធ្វើរោគវិនិច្ឆ័យ</string> - <string name="local_results">លទ្ធផលក្នុងតំបន់</string> - <string name="online_results">លទ្ធផលអនឡាញ</string> <string name="past_programs">កម្មវិធីពីមុន</string> <!--PERMISSIONS--> <string name="permission_denied">អ្នកមិនមានសិទ្ធិគ្រប់គ្រាន់ដើម្បីដំណើរការផ្នែកនេះទេ</string> - <string name="add_relation_button">បន្ថែមថ្មីជា​</string> - <string name="date_dialog_clear">លុបចោល</string> <string name="period">កំឡុងពេល</string> - <string name="org_unit_filter">(%d) អង្គភាព</string> <string name="tuto_main_1">សូមស្វាគមន៏មកកាន់ប្រព័ន្ធ DHIS2</string> <string name="tuto_main_2">នៅទីនេះអ្នកអាចឃើញសកម្មភាពរបស់អ្នក</string> <string name="tuto_main_3">អ្នកអាចអនុវត្តការច្រោះទិន្នន័យ​</string> @@ -192,15 +117,11 @@ <string name="tuto_main_6">ពិនិត្យមើលសកម្មភាពផ្សេងទៀតនៅផ្ទាំងបញ្ជីដើម</string> <!-- RELATIONSHIPS --> - <string name="default_relationship_label">បង្កើតទំនាក់ទំនង</string> <string name="next">បន្ទាប់</string> <string name="search_min_num_attr">អ្នកត្រូវបញ្ចូលយ៉ាងហោចណាស់ %d នៃលក្ខណៈ (Attributes) ដើម្បីធ្វើការស្វែងរក</string> - <string name="search_max_tei_reached">មានលទ្ធផលច្រើនជាង %d សូមបញ្ចូលលក្ខខណ្ឌផ្សេងទៀតដើម្បីស្វែងរកបន្ថែម</string> - <string name="search_init">បញ្ចូលលក្ខខណ្ឌដើម្បីស្វែងរក</string> <!-- QR --> <string name="QR_SCANNER">នាំចូលទិន្នន័យ QR</string> - <string name="SAVE">រក្សាទុក​</string> <string name="button_ok">យល់ព្រម</string> <string name="qr_id">ការកំណត់អត្តសញ្ញាណ</string> <string name="qr_attributes">លក្ខណៈ (Attributes)</string> @@ -212,26 +133,17 @@ <string name="qr_no_data">មិនមានទិន្នន័យ</string> <string name="qr_error_id">លេខកូដ QR មិនត្រឹមត្រូវ</string> <string name="qr_error_attr">Attribute (លក្ខណៈនេះ) មិនអាចត្រូវបានបន្ថែមទេ</string> - <string name="qr_error_enrollment">ការចុះឈ្មោះនេះមិនអាចបន្ថែមបានឡើយ</string> <string name="about">អំពី</string> <string name="programs_to_enroll">កម្មវិធីចុះឈ្មោះ</string> - <string name="select_all">ជ្រើសរើសទាំងអស់</string> - <string name="empty_program_list">មិនមានព៌ត័មានដែលអ្នកបានច្រោះមើលនេះទេ, សូមប្ដូរចេញ​</string> <string name="share">ចែករំលែក</string> <string name="share_qr">ចែករំលែកលេខកូដ QR</string> <string name="max">អតិបរមា</string> <string name="current">បច្ចុប្បន្ន</string> <string name="tei">TEI</string> - <string name="limit_by_organisation_unit">កំណត់ដោយអង្គភាព</string> - <string name="programs_list">បញ្ជីកម្មវិធី</string> <string name="wipe_data">កំណត់កម្មវិធីឡើងវិញ</string> - <string name="add_relationship_error">មិនអាចទៅរួចទេក្នុងការបន្ថែមទំនាក់ទំនងនៅទីនេះ</string> <string name="warning_error_on_complete_title">ពិនិត្យទីនេះ​</string> - <string name="error_on_complete_title">កំហុសបច្ចេកទេស</string> <string name="save">រក្សាទុក​</string> - <string name="downloaded_confirm">តើអ្នកចង់បន្ថែមទិន្នន័យពី QR ដែររឺទេ?</string> - <!--ABOUT--> <string name="about_app">កំណែកម្មវិធី %s</string> <string name="about_sdk">កំណែរ SDK: %s</string> @@ -242,86 +154,29 @@ <string name="about_dev">Developed and maintained by the <a href="https://www.dhis2.org/">DHIS2</a> project, part of University of Oslo, <a href="https://www.mn.uio.no/ifi/english/">department of informatics</a></string> <string name="about_contact">សម្រាប់ព៌ត័មានបន្ថែម រឺ ក៏មានសំនួរអំពីកម្មវិធីនេះ, សូមសរសេរមកកាន់<a href="mailto:android@dhis2.org">android\@dhis2.org</a></string> - <string name="login_error_null_pass">មិនមានលេខសំងាត់, សូមបំពេញ​</string> - <string name="login_error_null_username">មិនមានឈ្មោះអ្នកប្រើប្រាស់, សូមបំពេញ​</string> - <string name="login_error_dhis_version">ម៉ាស៊ីនមេនេះកំពុងដំណើរការខុសពី DHIS ២.២៩។ សូមធ្វើបច្ចុប្បន្នភាពលើម៉ាស៊ីនមេរបស់អ្នក​</string> - <string name="login_error_unsuccessful_response">មានអ្វីមួយមិនប្រក្រតី​ សូមមើលអាសយដ្ឋានម៉ាស៊ីនមេ ឈ្នោះ លេខសម្ងាត់ ហើយព្យាយាមម្តងទៀត</string> - <string name="login_error_error_response">ម៉ាស៊ីនមេមិនអាចបំពេញសំណើរនេះបានទេ​</string> - <string name="login_error_default">មានបញ្ហានៅពេលព្យាយាមចូលទៅក្នុងម៉ាស៊ីនមេ​</string> - <string name="login_error">ការចូលទៅប្រើប្រាស់មានបញ្ហា</string> - <string name="missing_mandatory_fields">ទិន្នន័យចាំបាច់មិនមាន</string> - <string name="online_search_unexpected">កំហុសដែលមិនបានរំពឹងទុកនៅពេលដែលកំពុងស្វែងរកនៅលើអនឡាញ</string> - <string name="online_search_parsing_error">កំហុសខណៈពេលញែកលទ្ធផល</string> - <string name="online_search_error">ការស្វែងរកតាមអនឡានមានបញ្ហាបច្ចេកទេស</string> - <string name="online_search_response_error">មានអ្វីមួយខុសបច្ចេកទេសនៅលើម៉ាស៊ីនមេ</string> <string name="search_program_not_selected">ជ្រើសរើសកម្មវិធីដើម្បីដំណើរការចុះឈ្មោះ</string> <string name="search_access_error">អ្នកមិនមានសិទ្ធិគ្រប់គ្រាន់</string> - <string name="feature_unavaible">មុខងារនេះមិនទាន់រួចរាល់នៅឡើយទេ​</string> - <string name="relationship_label_error">កំហុសក្នុងការធ្វើទំនាក់ទំនង</string> <string name="all_tei_type">ទាំងអស់ %s</string> <string name="invalid_phone_number">លេខទូរស័ព្ទមិនត្រឹមត្រូវ</string> - <string name="invalid_email">អាសយដ្ឋានអ៊ីមែលមិនត្រឹមត្រូវ</string> - <string name="invalid_negative_number">លេខអវិជ្ជមានតែមួយគត់ដែលត្រូវបានអនុញ្ញាត</string> <string name="invalid_possitive_zero">លេខវិជ្ជមាន រឺ លេខ ០ តែមួយគត់ដែលត្រូវបានអនុញ្ញាត</string> - <string name="invalid_possitive">លេខវិជ្ជមានតែមួយគត់ដែលត្រូវបានអនុញ្ញាត</string> - <string name="invalid_interval">តំលៃចន្លោះពីលេខ ០ ដល់ ១ ត្រូវបានអនុញ្ញាត</string> - <string name="invalid_percentage">តំលៃចន្លោះពីលេខ ០ ដល់ ១០០ ត្រូវបានអនុញ្ញាត</string> - <string name="date_dialog_tigle">ជ្រើសរើសថ្ងៃខែឆ្នាំដើម្បីច្រោះទិន្នន័យ</string> <string name="select_option">កំណត់​ជម្រើស</string> - <string name="issue_reported">បានរាយការណ៏បញ្ហា</string> - <string name="dialog_generate_new_event">បង្កើតព្រឹត្តិការណ៏ថ្មី</string> - <string name="message_generate_new_event">តើអ្នកចង់បង្កើតព្រឹត្តិការណ៏ថ្មីមួយទៀតទេ?</string> <string name="event_completed_title">ព្រឹត្តិការណ៏បានបញ្ចប់</string> <string name="event_completed_message">គ្រប់ព្រឹត្តិការណ៏ទាំងអស់នៅក្នុងកម្មវិធីនេះបានបញ្ចប់។ តើអ្នកចង់បិទកម្មវិធីនេះទេ?</string> <string name="check_event">ត្រួតពិនិត្យ</string> <string name="menu_home">ផ្ទាំងដើម</string> <string name="appwidget_text">ឧទាហរណ៏</string> - <string name="add_widget">បន្ថែម Widget</string> <string name="showHelp">បង្ហាញជំនួយ</string> - <string name="tuto_settings_1">កំពុងបញ្ជូនទិន្នន័យរបស់អ្នក...</string> - <string name="tuto_settings_2">...ការកំណត់​រចនាសម្ព័ន្ធរបស់អ្នក...</string> - <string name="tuto_settings_3">...កំណត់ទំហំផ្ទុកក្នុងម៉ាស៊ីនរបស់អ្នក...</string> - <string name="tuto_settings_4">...រឺ លុបគ្រប់យ៉ាងដើម្បីចាប់ផ្ដើមឡើងវិញ</string> - <string name="tuto_search_2">អ្នកអាចផ្លាស់ប្ដូរទៅកម្មវិធីផ្សេងទៀត</string> <string name="tuto_dashboard_1">នេះគឺជាផ្ទាំងបង្ហាញព៌ត័មានរបស់អង្គភាព</string> <string name="tuto_dashboard_2">មើលព័ត៌មានប្រវត្តិរូបរបស់អង្គភាព...</string> - <string name="tuto_dashboard_3">...ចែករំលែកព៌ត័មានតាមរយៈ QR រឹ SMS...</string> - <string name="tuto_dashboard_4">...ឬសម្គាល់អង្គភាពសម្រាប់ការតាមដាន</string> - <string name="tuto_dashboard_5">ចុចដើម្បីបង្កើត រឺ ធ្វើកាលវិភាគលើព្រឹត្តិការណ៏មួយ រឺ បញ្ជូនទៅអង្គភាពផ្សេង</string> <string name="tuto_dashboard_6">ទីនេះអ្នកនឹងឃើញគ្រប់ព្រឹត្តិការណ៏ទាំងអស់, ចុចដើម្បីពិនិត្យមើលលំអិតពីព្រឹត្តិការណ៏</string> <string name="tuto_dashboard_7">ចុចលើផ្ទាំង Menu ដើម្បីបន្ថែមទំនាក់ទំនង, មើលសូចនាករ រឺ សរសេរកំណត់ត្រា</string> - <string name="tuto_dashboard_8">ចុចដើម្បីមើលបញ្ជីទាំងអស់នៃអង្គភាពរបស់អ្នក ឬ បង្កើតថ្មី</string> - <string name="tuto_tei_event_1">ចុចដើម្បីលុបព្រឹត្តិការណ៏នេះ,​ សកម្មភាពនេះមិនអាចត្រលប់មកវិញបានទេ</string> - <string name="tuto_tei_event_2">បញ្ចប់ព្រឹត្តិការណ៏</string> - <string name="tuto_program_event_1">គ្រប់ព្រឹត្តិការណ៏ទាំងអស់ដែលទាក់ទងនឹងកម្មវិធីនេះត្រូវបង្ហាញនៅទីនេះ</string> - <string name="tuto_program_event_2">ចុចដើម្បីបន្ថែមនូវព្រឹត្តិការណ៏ថ្មី</string> <string name="tuto_event_initial_new_1">បញ្ចូលគ្រប់ទិន្នន័យទាំងអស់ដើម្បីបង្កើតព្រឹត្តិការណ៏ថ្មី</string> <string name="tuto_event_initial_1">ចុចដើម្បីពិនិត្យពីស្ថានភាពនៃការបញ្ចប់របស់ព្រឹត្តិការណ៍</string> - <string name="tuto_event_summary">ចុចដើម្បីបញ្ចប់ រឺ បើកឡើងវិញនូវព្រឹត្តិការណ៏</string> - <string name="tuto_main_7">អាន និង ផ្ទុកព៌ត័មានពីឧបករណ៏ផ្សេងៗតាមរយៈ QR</string> - <string name="tuto_main_8">កំពុងបញ្ជូនទិន្នន័យរបស់អ្នកទៅកាន់ម៉ាស៊ីនមេ</string> - <string name="tuto_main_9">បិទកម្មវិធីដោយលេខកូដ ៤ ខ្ទង់។ កុំភ្លេចលេខកូដរបស់អ្នក!</string> - <string name="tuto_main_10">ចាកចេញដើម្បីប្ដូរឈ្មោះអ្នកប្រើប្រាស់ រឺ ដូរម៉ាស៊ីនមេ។ អ្នកនឹងអាចចូលមកប្រើបម្ដងទៀតទោះបីជាមិនភ្ជាប់អ៊ិនធើណែតក៏ដោយ</string> <string name="relationships">ទំនាក់ទំនង</string> <string name="dashboard_overview">ទិដ្ឋភាពទូទៅ</string> - <string name="dashboard_relationships">ទំនាក់ទំនង</string> - <string name="dashboard_indicators">Indicators</string> - <string name="dashboard_notes">ចំណាំ</string> - <string name="event_overview">លម្អិត</string> - <string name="event_indicators">Indicators</string> - <string name="event_notes">ចំណាំ</string> - <string name="local_data_accept">ទទួលយក</string> - <string name="action_continue">បន្ត</string> - <string name="login_server_info_title">អាសយដ្ឋានរបស់ម៉ាស៊ីនមេ</string> <string name="action_close">បិទ</string> - <string name="data_set_complete">បញ្ចប់</string> - <string name="data_set_open">បើក</string> - <string name="data_every_day">រាល់​ថ្ងៃ</string> - <string name="data_every_week">រាល់​សប្ដាហ៍</string> - <string name="sms_completed">បានបញ្ចប់</string> <string name="filters_title_period">កំឡុងពេល</string> - <string name="filters_title_status">ស្ថានភាព</string> <string name="filters_title_state">បញ្ចូន</string> <string name="filter_period_today">ថ្ងៃនេះ</string> <string name="filter_period_yesterday">កាលពីម្សិលមិញ</string> @@ -335,19 +190,11 @@ <string name="go_back">ត្រលប់ថយ​ក្រោយ</string> <string name="interval_yesterday">កាលពីម្សិលមិញ</string> <string name="filter_sync_error">ការបញ្ចូនទិន្នន័យមានបញ្ហាបច្ចេកទេស</string> - <string name="dataset_overview">លម្អិត</string> - <string name="name">ឈ្មោះ</string> - <string name="enrollment_date">ថ្ងៃខែឆ្នាំចុះឈ្មោះ</string> <string name="enrollment_status_active">បើក</string> <string name="enrollment_status_completed">បញ្ចប់</string> <string name="enrollment_status_cancelled">បានលុបចោល</string> - <string name="event_data">Data</string> - <string name="action_done">Done</string> - <string name="are_you_sure">តើអ្នកច្បាស់ទេ?</string> <string name="filters_title_date">កាលបរិច្ឆេទ</string> - <string name="filters_title_event_date">ថ្ងៃខែឆ្នាំរបស់ព្រឹត្តិការណ៏</string> <string name="customactivityoncrash_error_activity_restart_app">ត្រលប់ថយ​ក្រោយ</string> - <string name="customactivityoncrash_error_activity_error_details_close">បិទ</string> <string name="section_charts">គំនូសតាង(ក្រាប)</string> <string name="navigation_charts">គំនូសតាង(ក្រាប)</string> <string name="navigation_notes">ចំណាំ</string> @@ -367,13 +214,8 @@ <string name="filter_period_last_financial_year">ឆ្នាំហិរញ្ញវត្ថុមុន</string> <string name="section_feedback">មតិ​ឆ្លើយតប</string> <string name="section_indicators">Indicators</string> - <string name="value">តម្លៃ</string> - <string name="login_error_bad_credentials">អត្ដសញ្ញាណមិនត្រឹមត្រូវ</string> - <string name="available">អាច​រក​បាន​</string> - <string name="unknown_date">មិន​ស្គាល់</string> <string name="sync_dialog_action_send">ផ្ញើទៅ</string> <string name="sync_error">ការបញ្ចូនទិន្នន័យមានបញ្ហាបច្ចេកទេស</string> - <string name="optional">មិនមានក៏បាន</string> <string name="show_more">បង្ហាញច្រើនទៀត</string> <string name="sync">បញ្ចូន</string> <string name="show_description">បង្ហាញការពិពណ៌នា</string> diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index 04563b74d4d..489b9fa322c 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -1,63 +1,28 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!--GENERAL--> <string name="app_name">ລະບົບ DHIS2</string> - <string name="logo_text">ລະບົບຂໍ້ມູນຂ່າວສານດ້ານສຸຂະພາບຂັ້ນເມືອງ</string> - <string name="logo_number">2</string> <!-- Warnings and error messages --> <string name="error">ເກີດການຜິດພາດ</string> - <plurals name="error_message"> - <item quantity="other">ຂໍ້ຜິດພາດ</item> - </plurals> - <string name="error_wrong_server_url">ຄວາມຜິດພາດຈາກການເຊື່ອມຕໍ່ຂອງເຄື່ອງຄອມພີວເຕີໜ່ວຍແມ່</string> - <string name="error_wrong_credentials">ຄວາມຜິດພາດຈາກຢັ້ງຢືນເອກະລັກບຸກຄົນ</string> - <string name="error_unexpected_error">ຄໍາຜິດທີ່ເກີດຂື້ນໂດຍບັງເອີນ</string> - <string name="error_internal_server_error">ຄໍາຜິດທີ່ເກີດຈາກພາຍໃນເຄື່ອງຄອມພີວເຕີໜ່ວຍແມ່</string> - <string name="no_value">ບໍ່ມີຂໍ້ມູນ</string> <string name="no_reserved_values">ບໍ່ມີຄ່າທີ່ສະຫງວນໃວ້. ຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ</string> - <string name="no_reserved_values_connection">ບໍ່ມີຄ່າທີ່ສະຫງວນໃວ້. ເຊື່ອມຕໍ່ກັບເຄື່ອຂ່າຍເພື່ອບັນຈຸອີກ</string> - <string name="errors">ຂໍ້ຜິດພາດ</string> <string name="something_wrong">ມີບາງຢ່າງຜິດພາດ</string> <!-- SyncService strings: --> - <string name="sync_now">ດຽວນີ້, ລະບົບກໍາລັງທຳງານຮ່ວມກັນ</string> - <string name="sync_text">ກໍາລັງທໍາງານຮ່ວມກັນກັບຄອມພີວເຕີໜ່ວຍແມ່</string> - <string name="sync_title">ລະບົບກໍາລັງທໍາງານຮ່ວມກັນ</string> - <string name="sync_metadata">ໂຄງຮ່າງຖານຂໍ້ມູນ</string> <string name="sync_events">ເຫດການ</string> - <string name="sync_tei">ຂໍ້ມູນບົ່ງບອກເອກະລັກທີ່ຖືກຕິດຕາມ</string> - - <string name="sync_complete_title">ສໍາເລັດ</string> - <string name="sync_complete_text">ການທຳງານຮ່ວມກັນຂອງລະບົບສໍາເລັດແລ້ວ</string> <string name="sync_error_title">ຄໍາຜິດທີ່ເກີດຈາກການທໍາງານຮ່ວມກັນຂອງລະບົບ</string> <string name="sync_error_text">ມີຄໍາຜິດເກີດຂື້ນໃນຂະນະທີ່ລະບົບທໍາງານຮ່ວມກັນ. ກະລຸນາ, ທົດລອງເບີ່ງອີກ...</string> <string name="sync_incomplete_error_text">ອັບເດດຂໍ້ມູນໃຫ້ຄືກັນສຳເລັດແລ້ວ ແຕ່ພວກເຮົາບໍ່ໄດ້ຮັບການຢືນຢັນຈາກເຄື່ອງຄອມພິວເຕິ້ໜ່ວຍແມ່ສຳລັບບັນທຶກທັງໝົດ. ເຫຼົ່ານັ້ນຍັງຖືກໝາຍເປັນ \"ອອບລາຍ\" ໃນແອັບ. ພວກເຮົາແນະນຳໃຫ້ລອງການຕັ້ງຄ່າການຊິ້ງຂໍ້ມູນອີກຄັ້ງ.</string> - <string name="data_sync_warning_program">ຂໍ້ຄວນລະວັງ: ຂໍ້ມູນຂອງທ່ານໄດ້ຖຶກຊິ້ງແລ້ວ ແຕ່ບາງຂໍ້ມູນມີຂໍ້ຂັດແຍ້ງ. ກົດການຕັ້ງຄ່າການຊິ້ງຂໍ້ມູນ ແລະ ລອງໃໝ່ອີກຄັ້ງ. ຖ້າຂໍ້ຄວນລະວັງຍັງຄົງຢູ່ ໃຫ້ກວດເບີ່ງສະຖານະການຊິິ້ງຂອງ: ໂປຣແກຣມ, TEI\'s ແລະ ເຫດການທີ່ມີການຂັດແຍ້ງຈະຖຶກໝາຍເປັນ @.</string> - <string name="server_sync_error">ເກີດຂໍ້ຜິດພາດ ແລະເຄື່ອງຄອມພິວເຕິ້ໜ່ວຍແມ່ບໍ່ຕອບສະໜອງ. ຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ.</string> - - <string name="search_result_text">%sຜົນໄດ້ຮັບທີ່ຖືກພົບເຫັນ</string> - <string name="add_new">ເພີ່ມໃໝ່</string> - <string name="add">ເພີ່ມ</string> <string name="enter_event_data">ປ້ອນ%s</string> <string name="enter_cancel_event_data">ປ້ອນ / ຂ້າມ%s</string> - <string name="schedule_new">ສ້າງແຜນໃໝ່</string> <string name="referral">ການສົ່ງຕໍ່</string> <!-- Login --> - <string name="url_hint">ທີ່ຢູ່ຂອງເຄື່ອງຄອມພີວເຕີໜ່ວຍແມ່</string> - <string name="user_hint">ຊື່ຜູ້ໃຊ້</string> - <string name="password_hint">ລະຫັດ</string> - <string name="log_in_button">ເຂົ້າລະບົບ</string> - <string name="unlock_button">ໄລຍະເປີດໃຫ້ນໍາໃຊ້</string> <string name="syncing_configuration">ລະບົບກໍາລັງທໍາງານຮ່ວມກັບການຈັດວ່າງລະບົບຂອງທ່ານ</string> <string name="syncing_data_shortly">ຂໍ້ມູນຂອງທ່ານຈະຖືກສົ່ງເຂົ້າລະບົບໃນໄວໆນີ້</string> <string name="syncing_data">ຂໍ້ມູນຂອງທ່ານກໍາລັງຖືກສົ່ງເຂົ້າໃນລະບົບ</string> <string name="configuration_ready">ການຈັດວ່າງລະບົບຂອງທ່ານກຽມພ້ອມແລ້ວ</string> <string name="data_ready">ຂໍ້ມູນຂອງທ່ານກຽມພ້ອມແລ້ວ</string> - <string name="configuration_sync_failed">ການຈັດວ່າງລະບົບຂອງທ່ານເພື່ອໃຫ້ທໍາງານຮ່ວມກັນຫຼົມເຫຼວ (ບໍ່ສໍາເລັດ)</string> - <string name="data_sync_failed">ການເຊື່ອມຂໍ້ມູນເຂົ້າກັບລະບົບຫຼົມເຫຼວ (ບໍ່ສໍາເລັດ)</string> <string name="account_recovery">​ປັບ​ປຸງ​ຄືນ​ບັນ​ຊີ​ຂອງ​ທ່ານ</string> - <string name="no_network_to_recover_account">ຈໍາເປັນຕ້ອງມີການເຊື່ອມຕໍ່ອິນເຕີເນັດ ເພື່ອກູ້ຄືນບັນຊີຂອງທ່ານ.</string> <!--PERIOD--> <string name="DAILY">ທຸກໆມື້</string> @@ -78,129 +43,80 @@ <string name="enter_text">ຂຽນຄໍາຕອບ</string> <string name="enter_long_text">ປ້ອນຂໍ້ມູນເປັນຂໍ້ຄວາມຍາວ</string> <string name="enter_number">ຕື່ມຕົວເລກ</string> - <string name="enter_integer">ປ້ອນຂໍ້ມູນເປັນຈໍານວນຖ້ວນ</string> <string name="enter_negative_integer">ປ້ອນຂໍ້ມູນເປັນຈໍານວນຖ້ວນຄ່າລົບ</string> <string name="enter_positive_integer_or_zero">ຕື່ມຕົວເລກ</string> <string name="enter_positive_integer">ປ້ອນຂໍ້ມູນເປັນຈໍານວນຖ້ວນຄ່າບວກ</string> - <string name="filter_options">ຄັດກອງເອົາຕົວເລືອກ</string> <string name="choose_date">ເລືອກວັນທີ</string> - <string name="change_calendar">ປ່ຽນປະຕິທິນ</string> <!-- Status --> - <string name="program_completed">ໂປຣແກຣມດໍາເນີນການສໍາເລັດແລ້ວ</string> - <string name="program_inactive">ໂປຣແກຣມທີ່ບໍ່ໄດ້ເປີດໃຊ້ງານ</string> <string name="event_open">ເປີດ</string> <string name="event_not_completed">ບໍ່ສຳເລັດ</string> <string name="event_completed">ກິດຈະກຳສຳເລັດແລ້ວ</string> <string name="read_only">ອ່ານໄດ້ເທົ່ານັ້ນ</string> - <string name="finish_and_complete">ສີ້ນສຸດ ແລະ ສໍາເລັດ</string> <string name="completed">ສໍາເລັດແລ້ວ</string> <string name="cancelled">ຍົກເລີກແລ້ວ</string> - <string name="re_open_form">ເປິດຟອມຄືນໃໝ່</string> - <string name="activate">ເປິດໃຊ້ງານ</string> <string name="active">ທີ່ຍັງນໍາໃຊ້ຢູ່</string> <!-- State --> <string name="state_synced">ອັບເດດຂໍ້ມູນໃຫ້ຄືກັນ</string> <string name="state_to_post">ສົ່ງ</string> <string name="state_to_update">ຕ້ອງການອັບເດດ</string> - <string name="state_to_delete">ເພື່ອລືບອອກ</string> <string name="state_error">ເກີດການຜິດພາດ</string> - <string name="action_sync">ອັບເດດຂໍ້ມູນໃຫ້ຄືກັນ</string> - <string name="action_send">ສົ່ງ</string> - <string name="action_sync_sms">ຊິ້ງຂໍ້ຄວາມ</string> <!--Completion--> - <string name="completion">ການສໍາເລັດ</string> <!--Event initial--> - <string name="create">ສ້າງ</string> <string name="update">ປັບປຸງ</string> - <string name="date">ວັນທີ່</string> <string name="org_unit">ສະຖານທີ່</string> <string name="no_org_units">ບໍ່ມີໜ່ວຍງານໃດທີ່ເປິດຢູ່ສຳລັບວັນທີທີ່ເລືອກ. ກະລຸນາເລືອກວັນທີ່ອື່ນຫຼືໜ່ວຍງານອື່ນ</string> - <string name="category_option">Category Option</string> <string name="latitude">ເສັ້ນຂະໜານ</string> <string name="longitude">ເສັ້ນແວງ</string> - <string name="new_event">ກໍລະນີໃໝ່</string> - <string name="one_time">ເທື່ອດຽວ</string> - <string name="permanent">ຖາວອນ</string> <!--DataSet initial--> <string name="report_period">ຊ່ວງເວລາ ການລາຍງານ</string> - <string name="field_required">ຖ້າທ່ານຕັ້ງຄ່າ, ແຖວທັ້ງໝົດຕ້ອງໃຊ້ຄ່າທັ້ງໝົດເພື່ອເຮັດໃຫ້ຊຸດຂໍ້ມູນສົມບູນ</string> - <string name="field_mandatory">ຄ່າຂໍ້ມູນບາງຄ່າທີ່ຈຳເປັນຫາຍໄປ. ທ່ານຕ້ອງກຳນົດຄ່າບັງຄັບ ເພື່ອໃຫ້ຊຸດຂໍ້ມູນສົມບູນ</string> - <string name="field_mandatory_v2">ຍັງປ້ອນຂໍ້ມູນບັງຄັບບໍ່ຄົບ. ກະລຸນາ, ປ້ອນຂໍ້ມູນເພື່ອໃຫ້ຊຸດຂໍ້ມູນຄົບຖ້ວນ.</string> - <string name="datavalue_saved">ປະຫຍັດຄ່າ!</string> - <string name="there_is_no_available_period">ບໍ່ມີໄລຍະເວລາທີຈະເລືອກ</string> <!--Event Detail--> <string name="due_date">ວັນທີຕ້ອງແລ້ວ</string> <string name="cat_combo">ລາຍການທີ່ໃຫ້ເລືອກ</string> - <string name="date_default">ວ/ດ/ປ</string> <string name="cancel">ຍົກເລີກ</string> <string name="delete">ລົບ</string> - <string name="total">ລວມ</string> <string name="most_recent_event_date">ວັນທີເຫດການຄັ້ງຫຼ້າສຸດ</string> <string name="active_programs">ໂປຣແກຣທີ່ເປີດນໍາໃຊ້</string> - <string name="to_enroll_programs">ໂປຣແກຣມເພື່ອລົງທະບຽນ</string> <string name="enroll">ຂື້ນທະບຽນ</string> - <string name="last_visit">ການລົງຢ້ຽມຢາມຄັ້ງທີ່ຜ່ານມາ</string> - <string name="apply">ນໍາໃຊ້</string> <!--TEI DASHBOARD--> - <string name="see_details">ເບິ່ງຂໍ້ມູນເພີ່ມຕື່ມ</string> - <string name="view_more">ເບີ່ງຕື່ມ</string> <string name="edit">ແກ້ໄຂ</string> - <string name="follow_up">ຕິດຕາມ</string> - <string name="follow_up_enabled">ເປີດການຕິດຕາມ</string> - <string name="follow_up_disabled">ການຕິດຕາມບໍ່ສາມາດນໍາໃຊ້ໄດ້</string> <string name="deactivate">ຢຸດນໍາໃຊ້</string> <string name="program_not_allow_events">ໂປຣແກຣມນີ້ບໍ່ອະນຸຍາດຕື່ມກໍລະນີເຂົ້າອີກ</string> <!--DONE TASKS--> - <string name="events_no_data">ບໍ່ມີຂໍ້ມູນ</string> <string name="events">ເຫດການ</string> <string name="done_task">ໜ້າຫຼັກ</string> - <string name="app_info">ຂໍ້ມູນກ່ຽວກັບໂປຣແກຣມ</string> <string name="log_out">ອອກຈາກລະບົບ</string> - <string name="block_session">ໄລຍະປີດການນໍາໃຊ້</string> <string name="show_more_events">ສະແດງ%sເພີ່ມເຕີມ</string> <string name="show_less_events">ສະແດງໃຫ້ເຫັນໜ້ອຍລົງ</string> <!-- SYNC --> - <string name="a_minute">1 ນາທີ</string> - <string name="fifteen_minute">15 ນາທີ</string> <string name="thirty_minutes">30 ນາທີ</string> <string name="a_hour">1 ຊົ່ວໂມງ</string> <string name="every_6_hours">6h</string> <string name="a_day">1 ມື້ (ຄ່າມາດຕະຖານ)</string> <string name="every_12_hours">12h</string> - <string name="Automatic_Sync_Data">ສົ່ງຂໍ້ມູນໂອໂຕມະຕິກ ແຕ່ລະ:</string> <string name="Manual">ຄູ່ມື</string> - <string name="Automatic_Sync_Metadata">ປັບປຸງການຕັ້ງຄ່າແບບໂອໂຕມຕິກ ທຸກໆ: </string> <string name="a_week">1 ອາທິດ</string> <string name="sync_max_parameters">ຂອບເຂດທີ່ຕັ້ງໄວ້ໃຫ້ລະບົບທໍາງານຮ່ວມກັນໃນປະຈຸບັນ</string> <string name="sync_default_parameters">ປັບລະບົບໃຫ້ທໍາງານໃນຄ່າປົກະຕິ</string> + <string name="wipe_data_meesage">ຖານຂໍ້ມູນຈະຖືກລືບ.\nທ່ານຈະໄດ້ເຂົ້າລະບົບໃໝ່</string> <string name="wipe_data_ok">ຍອມຮັບ</string> <string name="wipe_data_no">ຍົກເລີກ</string> <string name="SYNC_DATA">ອັບເດດຂໍ້ມູນໃຫ້ຄືກັນນະຕອນນີ້</string> <string name="SYNC_META">ປັບການຕັ້ງຄ່າດຽວນີ້</string> <string name="SYNC_MANAGER">ຕັ້ງຄ່າ</string> - <string name="last_data_sync_date">ອັບເດດຂໍ້ມູນຄັ້ງສຸດທ້າຍເມື່ອ:%s</string> - <string name="last_metadata_sync_date">ອັບເດດຂໍ້ມູນຄັ້ງສຸດທ້າຍເມື່ອ:%s</string> <string name="refill_reserved_values">ໃສ່ອີກ</string> - <string name="settings_sms_module_title">ໂມດູນ SMS:</string> <string name="settings_sms_receiver_number">ເສັ້ນທາງການນຳສົ່ງຂໍ້ຄວາມ</string> <string name="settings_sms_result_sender_number">ຜູ້ສົ່ງຜົນຂໍ້ຄວາມ</string> - <string name="settings_sms_result_timeout_hint">ວິນາທີ</string> - <string name="settings_sms_result_sender_hint">ຈຳນວນ</string> - <string name="settings_sms_receiver_number_hint">ຈຳນວນ</string> <string name="settings_sms_module_switch">ເປິດໃຊ້ການສົ່ງຂໍ້ຄວາມ</string> <string name="settings_sms_response_wait_switch">ລໍຖ້າການຕອບກັບທາງຂໍ້ຄວາມ</string> - <plurals name="settings_specific_programs"> - <item quantity="other">ມີ%s ສາຍງານທີ່ມີການຕັ້ງຄ່າສະເພາະ</item> - </plurals> <string name="settings_limit_scope">ຈໍາກັດການຕັ້ງຄ່າ</string> <string name="settings_limit_globally">ໃນທົ່ວໂລກ</string> <string name="settings_limit_program">ຕໍ່ແຜນງານ</string> @@ -218,17 +134,12 @@ <string name="settingsErrorLog_descr">ບັນທຶກນີ້ມີຂໍ້ຜິດພາດທັ້ງໝົດທີ່ເກີດຈາກການຊິ້ງຂໍ້ມູນ ແລະ metadata ຂອງທ່ານ.</string> <string name="settingsDeleteLocalData">ລົບຂໍ້ມູນໃນເຄື່ອງ</string> <string name="settingsDeleteLocalData_descr">ຂໍ້ມູນແອັບ Capture ທັງໝົດທີ່ເກັບໄວ້ໃນອຸປະກອນຂອງທ່ານຈະຖືກລຶບອອກ. ຂໍ້​ມູນ​ທີ່​ບໍ່​ໄດ້​ຊິ້ງຂໍ້ມູນກັບຄອມພິວເຕີ້ໜ່ວຍແມ່​ຈະ​ສູນ​ເສຍ​ໄປ.</string> - <string name="settingsReset">ຕັ້ງຄ່າໂປຣແກຣມຄືນໃໝ່</string> - <string name="settingsReset_descr">ການຕັ້ງຄ່າ ແລະ ຂໍ້ມູນແອັບທີ່ເກັບໄວ້ໃນອຸປະກອນຈະຖືກລຶບອອກ. ທ່ານຈະຖືກຖາມໃຫ້ເຂົ້າສູ່ລະບົບອີກຄັ້ງ ແລະ ຂໍ້ມູນທີ່ບໍ່ໄດ້ຊິງຄ໌ກັບເຄື່ອງຄອມພິວເຕີ້ໜ່ວຍແມ່ຈະສູນເສຍໄປ.</string> <string name="settingsSms">ຕັ້ງຄ່າຂໍ້ຄວາມ</string> <string name="settingsCheckVersion">ອັບເດດຊັອບແວ</string> - <string name="settingsCheckVersionMessage">ຊອບແວ</string> <string name="settingTwoFA">ກວດສອບຄວາມຖືກຕ້ອງແບບ 2 ຂັ້ນ</string> <string name="settingsTwoFAStatus">ສະຖານະ</string> <!--endregion--> - <string name="enrollmment_date">ວັນທີ່ລົງທະບຽນ</string> - <!-- SEARCH OPTION SET --> <string name="search_optionset">ຄົນຫາ</string> <!--FORM FRAGMENT--> @@ -249,29 +160,15 @@ <string name="tei_coordinates">ປະສານງານຫາ</string> <!--EVENT SUMMARY--> - <string name="section_list">ລາຍຊື່ຂອງແຕ່ລະພາກ</string> - <string name="event_summary_header" formatted="false">%s ຄໍາຖາມໃນ %s ທີ່ສໍາເລັດແລ້ວ</string> - <string name="event_summary_sections_header" formatted="false">%s ໃນ %s ທີ່ສໍາເລັດແລ້ວ</string> - <string name="complete_and_close">ກົດສໍາເລັດ ແລະ ອອກ</string> <!--AGE CUSTOM VIEW--> - <string name="hint_day">ມື້</string> - <string name="hint_month">ເດືອນ</string> - <string name="hint_year">ປີ</string> - <string name="week">ອາທິດ</string> <string name="incident_date">ວັນທີເດືອນປີທີ່ເຫດການເກີດຂື້ນ</string> - <string name="local_results">ຜົນໄດ້ຮັບໃນໂທລະສັບ</string> - <string name="online_results">ຜົນໄດ້ຮັບທາງອອນລາຍ</string> <string name="past_programs">ໂປຣແກຣມທີ່ຜ່ານມາ</string> <!--PERMISSIONS--> <string name="permission_denied">ທ່ານບໍ່ໄດ້ຮັບອະນຸຍາດໃນການດໍາເນີນການໜ້າວຽກນີ້</string> - <string name="add_relation_button">ເພີ່ມເຂົ້າເປັນ ...</string> - <string name="date_dialog_clear">ລຶບ</string> <string name="period">ໄລຍະ ເວລາ</string> - <string name="org_unit_filter">(%d) ຂອງ ສະຖານທີ່</string> - <string name="org_unit_select_level">ລະດັບ %d</string> <string name="tuto_main_1">ຍີນດີຕ້ອນຮັບເຂົ້າສູ່ ລະບົບ DHIS2</string> <string name="tuto_main_2">ທີ່ນີ້, ທ່ານສາມາດເບີ່ງກິດຈະກໍາ ຂອງທ່ານໄດ້</string> <string name="tuto_main_3">ທ່ານສາມາດນໍາໃຊ້ເຄື່ອງມືຄັດຈ້ອນ...</string> @@ -280,16 +177,11 @@ <string name="tuto_main_6">ກວດເບີ່ງໜ້າວຽກອື່ນໆໃນລາຍການຫຼັກ</string> <!-- RELATIONSHIPS --> - <string name="default_relationship_label">ສ້າງສາຍພົວພັນ</string> <string name="next">ຕໍ່ໄປ</string> <string name="search_min_num_attr">ທ່ານຕ້ອງປ້ອນຢ່າງໜອຍ %d ຂອງ ຄຸນລັກສະນະເຂົ້າເພື່ອຊອກຫາ</string> - <string name="search_attr">ທ່ານຕ້ອງໃສ່ຢ່າງຫນ້ອຍຫນຶ່ງ ຂອງຄຸນລັກສະນະເພື່ອເຮັດການຄົ້ນຫາ</string> - <string name="search_max_tei_reached">ມີຫຼາຍກ່ວາ %d ຂອງຜົນໄດ້ຮັບ. ກະລຸນາເພີ່ມເງື່ອນໄຂໃນການຄົ້ນຫາເຂົ້າຕື່ມ</string> - <string name="search_init">ປ້ອນເງື່ອນໄຂການຊອກຫາຂອງທ່ານ</string> <!-- QR --> <string name="QR_SCANNER">ນໍາເອົາຂໍ້ມູນ QR ເຂົ້າ</string> - <string name="SAVE">ບັນທຶກ</string> <string name="button_ok">​ຕົກ​ລົງ</string> <string name="qr_id">ເອກະລັກສ່ວນຕົວ</string> <string name="qr_attributes">Attributes</string> @@ -301,31 +193,19 @@ <string name="qr_no_data">ບໍໍ່ມີຂໍ້ມູນ</string> <string name="qr_error_id">ລະຫັດ QR ບໍ່ຖືກ</string> <string name="qr_error_attr">ຄຸນລັກສະນະອັນນີ້ບໍ່ສາມາດປ້ອນເຂົ້າໄດ້</string> - <string name="qr_error_enrollment">ການຂື້ນທະບຽນນີ້ບໍ່ສາມາດປ້ອນເຂົ້າໄດ້</string> <string name="about">ກ່ຽວກັບ</string> <string name="programs_to_enroll">ໂປຣແກຣມເພື່ອລົງທະບຽນ</string> - <string name="select_all">ເລືອກທັງໝົດ</string> - <string name="clear_all">ລຶບການເລືອກ</string> - <string name="empty_program_list">ບໍ່ມີຂໍ້ມູນສໍາລັບການຄັດຈ້ອນທີ່ເລືອກມາ. ກະລຸນາພະຍາຍາມປ່ຽນຕົວຄັດຈ້ອນເບີ່ງ</string> <string name="share">ແລກປ່ຽນ</string> <string name="share_qr">ແລກປ່ຽນ QR</string> <string name="max">ຄ່າໃຫ່ຍສຸດ</string> <string name="current">ປະຈຸບັນ</string> <string name="tei">ຈໍານວນກໍລະນີທີ່ປ້ອນເຂົ້າ</string> - <string name="limit_by_organisation_unit">ຄັດຈ້ອນຕາມສະຖານທີ</string> - <string name="limit_by_program">ຈຳກັດໂດຍສາຍງານ</string> - <string name="programs_list">ລາຍຊື່ຂອງໂປຣແກຣມ</string> <string name="wipe_data">ຕັ້ງຄ່າໂປຣແກຣມຄືນໃໝ່</string> - <string name="add_relationship_error">ເປັນໄປບໍ່ໄດ້ທີ່ຈະຕື່ມສາຍພົວພັນນີ້ເຂົ້າໄປ</string> <string name="warning_error_on_complete_title">ກວດເບີ່ງອັນນີ້</string> - <string name="warning_on_complete_title">ແຈ້ງເຕືອນ</string> - <string name="error_on_complete_title">ເກີດການຜິດພາດ</string> <string name="save">ບັນທຶກ</string> <string name="reserved_value">ຄ່າລິຂະສິດ</string> - <string name="downloaded_confirm">ທ່ານຕ້ອງການເພີມຂໍ້ມູນຕື່ມຈາກລະຫັດ QR ນີ້ອີກບໍ?</string> - <!--ABOUT--> <string name="about_app">ໂປຣແກຣມລຸ້ນ: %s</string> <string name="about_sdk">SDK ລຸ້ນ: %s</string> @@ -336,138 +216,44 @@ <string name="about_dev">ຖືກພັດທະນາ ແລະ ບໍາລຸງຮັກສາໂດຍ <a href="https://www.dhis2.org/">DHIS2</a> ໂຄງການເຊີ່ງເປັນພາກສ່ວນໜື່ງຂອງມຫາວິທະຍາໄລ ໂອສໂລ, ກົມຂໍ້ມູນຂ່າວສານ<a href="https://www.mn.uio.no/ifi/english/">department of informatics</a>.</string> <string name="about_contact">ສໍາລັບຂໍ້ມູນເພີມຕື່ມ ຫຼື ມີຄໍາຖາມກ່ຽວກັບໂປຣແກຣມນີ້, ກະລຸນາ ຂຽນໄປສອບຖາມໄດ້ທີ <a href="mailto:android@dhis2.org">android\@dhis2.org</a></string> - <string name="login_error_null_pass">ບໍ່ມີລະຫັດຜ່ານ. ກະລຸນາ ໃສ່ລະຫັດຜ່ານ</string> - <string name="login_error_null_username">ບໍ່ມີຊື່ຜູ້ໃຊ້. ກະລຸນາ ໃສ່ຊື່ຜູ້ໃຊ້</string> - <string name="login_error_dhis_version">ຄອມພີວເຕີໜ່ວຍແມ່ກໍາລັງທໍາງານກັບລະບົບ DHIS2 ລຸ້ນສູງກ່ວາ 2.29. ກະລຸນາ ນໍາໃຊ້ລຸນທີ່ສູງກ່ວາ ຫຼື ນໍາໃຊ້ລະບົບທົດລອງແທນ</string> - <string name="login_error_dhis_version_v2">ຄອມພິວເຕີໜ່ວຍແມ່ເຄື່ອງນີ້ ໃຊ້ເວີຊັ່ນdhisທີ່ແຕກຕ່າງຈາກ %s. ໃຫ້ອັບເດດເວີຊັ່ນຂອງທ່ານ ຫຼື ໃຊ້ສະພາບແວດລ້ອມການທົດລອງ ເພື່ອດຳເນີນການຕໍ່</string> - <string name="login_error_unsuccessful_response">ມີບາງສີ່ງບາງຢ່າງທໍາງານບໍ່ຖືກຕ້ອງ. ກະລຸນາກວດເບີ່ງ ທີ່ຢູ່ຂອງຄອມພີວເຕີໜ່ວຍແມ່, ຊື່ຜູ້ນໍາໃຊ້ ແລະ ລະຫັດຜ່ານວ່າຖືກຕ້ອງແລ້ວບໍ, ແລ້ວພະຍາຍາມເຂົ້າອີກເບີ່ງ</string> - <string name="login_error_error_response">ເຄື່ອງຄອມພີວເຕີໜ່ວຍແມ່ບໍ່ສາມາດດໍາເນີນການຕາມຄໍາຮ້ອງຂໍນີ້ໄດ້</string> - <string name="login_error_default">ມີບັນຫາເກີດຂື້ນໃນຂະນະທີ່ພະຍາຍາມເຂົ້າຫາຄອມພີວເຕີໜ່ວຍແມ່</string> - <string name="login_error">ຄໍາຜິດທີ່ເກີດຈາກການເຂົ້ານໍາໃຊ້ລະບົບ</string> - <string name="missing_mandatory_fields">ຫ້ອງປ້ອນຂໍ້ມູນທີ່ຈໍາເປັນ ບໍ່ເຫັນ</string> - <string name="online_search_unexpected">ຄໍາຜິດເກີດຂື້ນໂດຍບໍ່ຄາດຄິດໃນຂະນະທີ່ກໍາລັງຊອກຫາທາງອອນລາຍ</string> - <string name="online_search_parsing_error">ມີຄໍາຜິດໃນຂະນະທີ່ສົ່ງຜົນໄດ້ຮັບ</string> - <string name="online_search_error">ການຄັົ້ນຫາທາງອອນລາຍໄດ້ສົ່ງຄໍາຜິດກັບຄືນມາ</string> - <string name="online_search_response_error">ບາງສີ່ງບາງຢ່າງໃນຄອມພີວເຕີໜ່ວຍແມ່ທໍາງານຜິດພາດ</string> <string name="search_program_not_selected">ເລືອກໂປຣແກຣມເພື່ອໃຫ້ສາມາດຂື້ນທະບຽນໄດ້</string> <string name="search_access_error">ທ່ານບໍ່ໄດ້ຮັບອະນຸຍາດຕາມທີ່ໄດ້ຮ້ອງຂໍ</string> - <string name="feature_unavaible">ໜ້າທີ່ປະຕິບັດການນີ້ຍັງບໍ່ທັນກຽມພ້ອມ</string> - <string name="relationship_label_error">ຄໍາຜິດທີ່ເກີດຈາກສາຍພົວພັນຂອງການຕັ້ງຊື່</string> <string name="all_tei_type">ທັງໝົດຂອງ %s</string> <string name="invalid_phone_number">ເບີໂທລະສັບບໍ່ຖືກຕ້ອງ</string> - <string name="invalid_email">ຊື່ອີແມ໋ວບໍ່ຖືກ</string> - <string name="invalid_negative_number">ອະນຸຍາດໃຫ້ປ້ອນໄດ້ພຽງແຕ່ຄ່າລົບເທົ່ານັ້ນ</string> <string name="invalid_possitive_zero">ອະນຸຍາດໃຫ້ປ້ອນໄດ້ພຽງແຕ່ຄ່າບວກ ຫຼື ສູນເທົ່ານັ້ນ</string> - <string name="invalid_possitive">ອະນຸຍາດໃຫ້ປ້ອນແຕ່ຄ່າບວກເທົ່ານັ້ນ</string> - <string name="invalid_interval">ອະນຸຍາດໃຫ້ປ້ອນແຕ່ຄ່າ 0 ຫາ 1 ເທົ່ານັ້ນ</string> - <string name="invalid_percentage">ອະຍາດໃຫ້ປ້ອນແຕ່ຄ່າ 0 ຫາ 100 ເທົ່ານັ້ນ </string> - <string name="date_dialog_tigle">ເລືອກວັນທີເພື່ອຄັດຈ້ອນ</string> <string name="select_option">ເລືອກທາງເລືອກ</string> - <string name="issue_reported">ບັນຫາຖືກລາຍງານແລ້ວ</string> - <string name="dialog_generate_new_event">ປ້ອນເຫດການໃໝ່</string> - <string name="message_generate_new_event">ທ່ານຕ້ອງການປ້ອນຂໍ້ມູນກໍລະນີອື່ນບໍ?</string> <string name="event_completed_title">ກໍລະນີໄດ້ປ້ອນເຂົ້າສໍາເລັດແລ້ວ</string> <string name="event_completed_message">ກໍລະນີທັງໝົດໃນໂປຣແກຣມນີ້ໄດ້ຖືກດໍາເນີນການສໍາເລັດແລ້ວ. ທ່ານຕ້ອງການປິດໂປຣແກຣມນີ້ບໍ່?</string> - <string name="complete_enrollment_message">ທ່ານຕ້ອງການລົງທະບຽນໃຫ້ສຳເລັດຫຼືບໍ?</string> <string name="check_event">ກວດເບີ່ງ</string> <string name="menu_home">ໜ້າຫຼັກ</string> <string name="appwidget_text">ຕົວຢ່າງ</string> - <string name="add_widget">ເພີມອົງປະກອບຂອງໂປຣແກຣມ</string> <string name="showHelp">ຊ່ວຍເຫຼືອ</string> - <string name="tuto_settings_1">ສົ່ງຂໍ້ມູນຂອງທ່ານ</string> - <string name="tuto_settings_2">...ການປັບແລະຕັ້ງຄ່າຂອງທ່ານ...</string> - <string name="tuto_settings_3">...ຕັ້ງຄ່າຂີດຄວາມສາມາດໃນການບັນທຶກຂອງໂທລະສັບຂອງທ່ານ...</string> - <string name="tuto_settings_reserved">ກວດສອບ ແລະ ຈັດການມູນຄ່າສຳລອງທີຍັງເຫຼືອ</string> - <string name="tuto_settings_errors">ກວດເບິ່ງຄືນການເຊື່ອມຕໍ່ກັບຄອມພິວເຕີໜ່ວຍແມ່ວ່າລົ້ມເຫລວບໍໍ່</string> - <string name="tuto_settings_4">... ຫຼືລືບທຸກສີ່ງທຸກຢ່າງເພື່ອເລີ່ມໃໝ່</string> - <string name="tuto_search_1_v2">ຊອກຫາໜ່ວຍງານຂອງທ່ານ ທັ້ງໃນອຸປະກອນຟື້ນທີ່ຂອງທ່ານ ແລະ ເຄື່ອງຄອມພິວເຕີໜ່ວຍແມ່</string> - <string name="tuto_search_2">ທ່ານສາມາດປ່ຽນໄປເລືອກເອົາໂປຣແກຣມອື່ນ</string> - <string name="tuto_search_3_v2">ຄົ້ນຫາ ຫຼືເພີ່ມຫົວໜ່ວຍໃໝ່. ທ່ານຕ້ອງຄົ້ນຫາກ່ອນທ່ານຈື່ງສາມາດເພີ່ມອັນໃຫມ່ໄດ້!</string> - <string name="tuto_search_4_v2">ຄລິກບ່ອນນີ້ເພື່ອລ້າງ ແລະ ເລີ່ມການຄົ້ນຫາໃໝ່.</string> <string name="tuto_dashboard_1">ນີ້ແມ່ນກະດານຂ່າວສໍາລັບຂໍ້ມູນສ່ວນຕົວ</string> <string name="tuto_dashboard_2">ເບີ່ງຂໍ້ມູນກ່ຽວກັບປະຫັວດສ່ວນຕົວ</string> - <string name="tuto_dashboard_3">...ແບ່ງປັນຂໍ້ມູນຜ່ານທາງ QR ຫຼື ຂໍ້ຄວາມ SMS...</string> - <string name="tuto_dashboard_4">...ໝາຍຂໍ້ມູນສ່ວນຕົວເພື່ອຕິດຕາມ</string> - <string name="tuto_dashboard_5">ກົດເພື່ອສ້າງ ຫຼື ເຮັດແຜນສໍາລັບ ກໍລະນີ ຫຼື ເພື່ອນໍາສົ່ງໄປສະຖານທີ່ອື່ນ</string> <string name="tuto_dashboard_6">ທີ່ນີ້, ທ່ານຈະເຫັນກໍລະນີທັງໝົດ. ກົດເພື່ອເບີ່ງລາຍລະອຽດ</string> <string name="tuto_dashboard_7">ຊອກຜ່ານລາຍການເພື່ອເພີ່ມສາຍພົວພັນເຂົ້າ, ເບີ່ງຄ່າຕົວປ່ຽນ ຫຼື ບັນທຶກໄວ້</string> - <string name="tuto_dashboard_8">ກົດເພື່ອເບີ່ງການຂື້ນທະບຽນຂໍ້ມູນທັງໝົດ ຂອງ ທ່ານ ຫຼື ຂື້ນທະບຽນໃໝ່</string> - <string name="tuto_tei_event_1">ກົດເພື່ອລືບກໍລະນີນີ້. ພຶດຕິກໍານີ້ສາມາດຍົກເລີກໄດ້</string> - <string name="tuto_tei_event_2">ບັນທຶກ ກໍລະນີໃຫ້ສໍາເລັດ</string> - <string name="tuto_program_event_1">ກໍລະນີທັງໝົດທີ່ກ່ຽວຂ້ອງກັບໂປຣແກຣມນີ້ຈະປະກົດຂື້ນທີ່ນີ້</string> - <string name="tuto_program_event_2">ກົດເພື່ອເພີ່ມກໍລະນີໃໝ່ເຂົ້າ</string> <string name="tuto_event_initial_new_1">ປ້ອນຂໍ້ມູນທັງໝົດເຂົ້າເພື່ອສ້າງເປັນກໍລະນີ</string> <string name="tuto_event_initial_1">ກົດເພື່ອກວດເບີ່ງການເຮັດສໍາເລັດການບັນທຶກກໍລະນີ</string> - <string name="tuto_event_summary">ກົດເພື່ອຢັ້ງຢືນການເຮັດສໍາເລັດ ຫຼື ເປີດກໍລະນີຄືນໃໝ່ເພືອດັດແປງ</string> - <string name="tuto_main_7">ອ່ານ ແລະ ບັນທຶກຂໍ້ມູນຈາກໂທລະສັບໜ່ວຍອື່ນຜ່ານ QR</string> - <string name="tuto_main_8">ສົ່ງຂໍ້ມູນຂອງທ່ານໄປຫາຄອມພີມເຕີໜ່ວຍແມ່</string> - <string name="tuto_main_9">ປິດໄລຍະການນໍາໃຊ້ດ້ວຍລະຫັດ4ໂຕ. ຢ່າລືມລະຫັດດັ່ງກ່າວ</string> - <string name="tuto_main_10">Lອອກຈາກໂປຣແກຣມເພື່ອປ່ຽນຜູ້ໃຊ້ຫຼືທີ່ຢູ່ຂອງຄອມພີວເຕີໜ່ວຍແມ່. ທ່ານຈະສາມາດເຂົ້າໂປຣແກຣມຄືນໄດ້ເຖີງແມ່ນວ່າບໍ່ມີການເຊື່ອມຕໍ່ອີນເຕີແນັດກໍ່ຕາມ.</string> - <string name="text_plus_colon">%s:</string> <string name="relationships">ສາຍພົວພັນ</string> <string name="empty_tei_add">ບໍ່ມີເຫດການທີ່ລົງທະບຽນໃວ້, ຄລິກ \"+\" ເພື່ອເພີ່ມເຫດການໃໝ່</string> - <string name="empty_tei_no_add">ບໍໍມີເຫດການທີ່ລົງທະບຽນ</string> <string name="qr_data_values">Data values</string> <string name="info">ຂໍ້ມູນ</string> <string name="qr_no_id_error">ອ່ານໄອດີນີ້ບໍໄດ້</string> <string name="delete_local_data">ລົບຂໍ້ມູນໃນເຄື່ອງ</string> <string name="dashboard_overview">ພາບລວມ</string> - <string name="dashboard_relationships">ສາຍພົວພັນ</string> - <string name="dashboard_indicators">ຕົວຊີ້ວັດ</string> - <string name="dashboard_analytics">ການວິເຄາະ</string> <string name="empty_indicators">ບໍ່ມີຕົວຊີ້ບອກສຳລັບສາຍງານນີ້</string> - <string name="dashboard_notes">ຂໍ້ຄວາມ</string> - <string name="unable_to_complete">ບໍ່ສາມາດສຳເລັດໄດ້</string> - <string name="unable_to_save">ບໍ່ສາມາດບັນທຶກໄດ້</string> - <string name="warnings_in_form">ມີການແຈ້ງເຕືອນຢູ່ໃນຟອມ</string> - <string name="what_to_do">ເຈົ້າ​ຕ້ອງ​ການ​ເຮັດ​ຫຍັງ?</string> - <string name="field_errors">ຂໍ້ມູນມີຂໍ້ຜິດພາດ. ກະລຸນາ, ກວດເບິ່ງເພື່ອໃຫ້ສາມາດເຮັດສໍາເລັດ</string> <string name="unselect_enrollment">ການລົງທະບຽນທັງໝົດ</string> <string name="unselect_enrollment_description">ສະແດງກະດານຂ່າວພ້ອມສາຍງານທີ່ເຮັດວຽກທັ້ງໝົດ</string> - <string name="CHECK_SYNC_ERRORS">ເປິດບັນທຶກຂໍ້ຜິດພາດໃນການຊິ້ງ</string> <string name="error_dialog_title">ບັນທຶກຂໍ້ຜິດພາດໃນການຊິ້ງ</string> <string name="share_with">ຮ່ວມກັບ</string> - <string name="errors_during_sync">ການຕັ້ງຄ່າການຊິ້ງຂໍ້ມູນຂອງທ່ານລົ້ມເຫຼວ ອາດມີຂໍ້ຜິດພາດໃນເຄື່ອງຄອມພິວເຕີໜ່ວຍແມ່ຂອງທ່ານ. ຄລິກບ່ອນນີ້ສຳລັບຂໍ້ມູນເພີ່ມເຕີມ</string> - <string name="sectionSelectorNext">ຕໍ່ໄປ</string> - <string name="event_overview">ລາຍລະອຽດ</string> - <string name="event_indicators">ຕົວຊີ້ວັດ</string> - <string name="event_notes">ຂໍ້ຄວາມ</string> - <string name="complete_add_new"><![CDATA[ສໍາເລັດ & ເພີ່ມໃຫມ່]]></string> - <string name="complete_later">ສຳເລັດພາຍຫຼັງ</string> - <string name="finish_add_new"><![CDATA[ສຳເລັດແລ້ວ ແລະເພີ່ມໃໝ່]]></string> - <string name="finish">ສີ້ນສຸດ</string> - <string name="error_fields_title">ຂໍ້ມູນມີຂໍ້ຜິດພາດ</string> - <string name="error_fields_events">ບາງຊ່ອງຂໍ້ມູນມີຂໍ້ຜິດພາດ. ຍັງບໍໄດ້ບັນທຶກ ກະລຸນາກວດສອບ</string> <string name="unique_warning">ຄ່າບໍໍຄວນຊ້ຳກັນ ບັງເອີນໄດ້ຖຶກພົບເຫັນ. ມັນບໍໄດ້ບັນທຶກ. ກະລຸນາກວດສອບ</string> - <string name="unique_coincidence_found">ໄດ້ພົບເຫັນຊ່ອງປ້ອນຂໍ້ມູນທີ່ເປັນເອກະລັກ. ກະລຸນາກວດສອບແບບຟອມເພື່ອບັນທຶກການລົງທະບຽນ</string> <string name="please_wait">ກະລຸນາລໍຖ້າ</string> <string name="skip">ຂ້າມ</string> - <string name="reschedule">ກຳນົດເວລາໃໝ່</string> <string name="no_intructions">ບໍ່ມີຂໍ້ມູນສຳລັບໜ້າຈໍນີ້</string> - <string name="event_overdue">ກາຍເວລາທີ່ກໍານົດ</string> - <string name="unsupported_program_rule">ມີກົດລະບຽບຂອງສາຍງານໜື່ງຂໍ້ທີບໍໄດ້ຮອງຮັບ. ກະລຸນາກວດສອບເອກະສານ</string> - <string name="empty_description">ບໍ່ມີຂໍ້ມູນສຳລັບຫ້ອງຂໍ້ມູນນີ້</string> - <string name="biometrics_dialog_title">ຂໍ້ມູນປະຈຳຕົວຫວ່າງເປົ່າ</string> - <string name="biometrics_first_use_text">ເພື່ອໃຫ້ສາມາດເຂົ້າສູ່ລະບົບໂດຍໃຊ້ເຄື່ອງສະແກນລາຍນິ້ວມື້ ທ່ານຕ້ອງໃຊ້ວິທີເລີ່ມຕົ້ນກ່ອນ</string> - <string name="tab_tables">ຕາຕະລາງຂໍ້ມູນ</string> - <string name="table">ຕາຕະລາງຂໍ້ມູນ</string> <string name="delete_local_data_message">ຂໍ້ມູນທີ່ບໍ່ໄດ້ຮັບການຊິ້ງຈະສູນເສຍໄປ. ທ່ານຕ້ອງການສືບຕໍ່ຫຼືບໍ?</string> - <string name="local_data_accept">ຍອມຮັບ</string> <string name="delete_local_data_error">ບໍ່ສາມາດລົບຂໍ້ມູນໄດ້ ກະລຸນາລອງໃໝ່ອີກຄັ້ງ</string> <string name="delete_local_data_done">ລົບຂໍ້ມູນໃນເຄື່ອງຮຽບຮ້ອຍແລ້ວ</string> - <string name="org_unit_selection_warning">ຕ້ອງເລືອກຢ່າງຫນ້ອຍໜື່ງໂຄງຮ່າງການຈັດຕັ້ງ</string> - <string name="send_user_name_title">ສົ່ງຂໍ້ມູນ</string> - <string name="send_user_name_mesage">ຊ່ວຍ DHIS2 ປັບປຸງແອບນີ້ດ້ວຍການແບ່ງປັນຂໍ້ຜິດພາດທີ່ກຽ່ວຂ້ອງກັບໄອດີຜູ້ໃຊ້ຂອງທ່ານ</string> - <string name="improve_app_msg_title">ທ່ານຕ້ອງການຊ່ວຍພວກເຮົາປັບປຸງແອັບນີ້ບໍ?</string> - <string name="check_mandatory_field">ກວດເບີ່ງຫ້ອງປ້ອນຂໍ້ມູນ</string> - <string name="error_no_network_during_sync">ທ່ານສູນເສຍການເຊື່ອມຕໍ່ອິນເຕີເນັດຂອງທ່ານໃນຂະນະທີ່ດໍາເນີນການຊິ້ງຂໍ້ມູນການຕັ້ງຄ່າຂອງທ່ານ. ກະລຸນາລອງໃໝ່ອີກຄັ້ງ</string> - <string name="action_agree">ຍິນຍອມ</string> - <string name="action_continue">ຕໍ່ໄປ</string> - <string name="login_server_info_title">ທີ່ຢູ່ຂອງເຄື່ອງຄອມພີວເຕີໜ່ວຍແມ່</string> - <string name="forgot_your_code">ລືມລະຫັດຂອງທ່ານ?</string> - <string name="event_form_end_options_title">ທ່ານຕ້ອງເຮັດຫຍັງສໍາລັບເຫດການນີ້?</string> - <string name="sectionSelectorEnd">ສິ້ນສຸດ</string> <string name="resource_not_found">%s ບໍ່ພົບເຫັນ</string> <string name="relationship_not_found_message">ບັນທຶກທີ່ທ່ານກຳລັງເຂົ້າເຖີງຍັງບໍ່ສາມາດເຂົ້າໄດ້ ທ່ານຕ້ອງການຄົ້ນຫາຫຼືບໍ?</string> <string name="sync_by_sms">ຊິ້ງຂໍ້ມູນດ້ວຍຂໍ້ຄວາມ</string> @@ -475,33 +261,16 @@ <string name="state_uploading">ກຳລັງອັບໂຫຼດ</string> <string name="state_relationship">ຄວາມສໍາພັນ</string> <string name="sent_by_sms">ສົ່ງຂໍ້ຄວາມ</string> - <string name="no_conflicts_message">ສາຍງານນີ້ບໍມີຂໍ້ຂັດແຍ້ງ</string> - <string name="network_unavailable_sms">ບໍ່ມີການເຊື່ອຕໍ່ກັບເຄື່ອຂ່າຍ, ແຕ່ເບີ່ງຄືວ່າມີບໍລິການໂທລະສັບ - ທ່ານສາມາດໃຊ້ຂໍ້ຄວາມໄດ້</string> - <string name="network_unavailable">ການເຊື່ອມຕໍ່ກັບເຄື່ອຂ່າຍບໍສາມາດໃຊ້ໄດ້</string> <string name="action_close">ປິດ</string> <string name="tuto_main_11">ຕອນນີ້ທ່ານສາມາດກວດສອບການຊິ້ງຂອງຂໍ້ມູນ ໂດຍການກົດໃສ່</string> - <string name="no_conflicts_update_message">ຂໍ້ມູນນີ້ຈັດເກັບໃວ້ໃນອຸປະກອນຂອງທ່ານເທົ່ານັ້ນ, ບໍ່ມີການຊິ້ງກັບເຄື່ອງຄອມພິວເຕິ້ໜ່ວຍແມ່</string> - <string name="no_conflicts_synced_message">ທ່ານອັບເດດແລ້ວ! ຂໍ້ມູນຂອງທ່ານທັງຫມົດຖືກສົ່ງໄປຫາເຄື່ອງຄອມພິວເຕີ້ໜ່ວຍແມ່.</string> <string name="relationship_error_recursive">ທ່ານບໍ່ສາມາດເຊື່ອມໂຍງບັນທຶກກັບຕົວມັນເອງໄດ້</string> - <string name="unblock_session">ໄລຍະເປິດໃຫ້ນຳໃຊ້</string> - <string name="data_set_complete">ສຳເລັດແລ້ວ</string> - <string name="data_set_open">ເປີດ</string> - <string name="unsupported_value_type">ປະເພດຄ່າບໍ່ຮອງຮັບ</string> <string name="change_calendar_view">ປ່ຽນຮູບແບບປະຕິທິນ</string> - <string name="data_every_fifteen_minutes">15 ນາທີ</string> - <string name="data_every_hour">ທຸກໆຊົ່ວໂມງ</string> - <string name="data_every_day">ທຸກໆມື້</string> - <string name="data_every_week">ເປັນອາທິດ</string> - <string name="period_week">ອາທິດ</string> - <string name="sync_setting">ການຕັ້ງຄ່າການຊິ້ງຂໍ້ມູນ %s</string> <string name="relationship_without_enrollment">ບັນທຶກທີ່ທ່ານພະຍາຍາມເຂົ້າບໍ່ມີການລົງທະບຽນ. ທ່ານບໍສາມາດເຂົ້າເຖີງໜ້າກະດານຂ່າວໄດ້</string> <string name="formatting_error">ຂໍ້ຜິດພາດໃນການຈັດຮູບແບບ</string> <string name="dashboard_menu_delete_tei_v2">ລົບ%s</string> <string name="delete_authority_error">ທ່ານບໍສາມາດທີ່ຈະລົບບັນທຶກນີ້ໄດ້</string> - <string name="validation_url">ຊື່ url ບໍ່ຖຶກຕ້ອງ</string> <string name="adjusting_form">ກຳລັງປັບຟອມ...</string> - <string name="sms_receiver_number">ຕົວເລກຜູ້ຮັບ</string> <string name="sms_amount_question">ທ່ານຍອມຮັບທີ່ຈະສົ່ງ %d ຂໍ້ຄວາມຫຼືບໍ?</string> <string name="sms_sending">ກຳລັງສົ່ງ %1$d/%2$d</string> <string name="sms_waiting_amount_confirm">ການຢືນຢັນຈຳນວນທີ່ລໍຖ້າ%d</string> @@ -519,50 +288,27 @@ <string name="sms_error_no_gateway_set">ບໍ່ໄດ້ຕັ້ງຄ່າການນຳສົ່ງ</string> <string name="sms_error_no_user_login">ຜູ້ໃຊ້ບໍໄດ້ເຂົ້າລະບົບ</string> <string name="sms_error_module_disabled">ໂມດູນຂໍ້ຄວາມຖືກປິດໃຊ້ງານ</string> - <string name="sms_error_ongoing_sunmission">ການສົ່ງຂໍ້ຄວາມອື່ນກຳລັງດຳເນີນຢູ່</string> <string name="sms_metadata_empty">ບໍ່ໄດ້ເລີ່ມໂມດູນຂອງຂໍ້ຄວາມ ບໍພົບ Metadata ທີ່ຕ້ອງການ</string> - <string name="sms_completed">ສໍາເລັດແລ້ວ</string> <string name="sms_count_error">ບໍ່ຍອມຮັບການນັບຂໍ້ຄວາມ</string> <string name="sms_state_started">ເລີ່ມສົ່ງຂໍ້ຄວາມ</string> <string name="sms_state_converted">ຂໍ້ມູນການອ່ານ ແລະ ແປງ. ລະຫັດການສົ່ງ: %d</string> - <string name="sms_general_error">ເກີດຂໍ້ຜິດພາດໃນການສົ່ງຂໍ້ຄວາມ</string> <string name="sms_title_enrollment">ການລົງທະບຽນ ແລະ ລົງທະບຽນຂໍ້ຄວາມ TEI</string> <string name="sms_title_event">ສົ່ງເຫດການທາງຂໍ້ຄວາມ</string> <string name="sms_title_data_set">ການສົ່ງຊຸດຂໍ້ມູນຂໍ້ຄວາມ</string> - <string name="sms_bar_state_starting">ເລີ່ມຕົ້ນ</string> - <string name="sms_bar_state_sending">ກໍາລັງດໍາເນີນການ</string> - <string name="sms_bar_state_sent">ສົ່ງແລ້ວ</string> - <string name="sms_bar_state_failed">Failed</string> - <string name="start_sync_granular">ກຳລັງເລີ່ມການຕັ້ງຄ່າການຊິ້ງຂໍ້ມູນ</string> <string name="syncing">ກຳລັງຊິ້ງຂໍ້ມູນ</string> - <string name="end_sync_granular">ການຕັ້ງຄ່າການຊິ້ງຂໍ້ມູນສຳເລັດແລ້ວ</string> - <string name="error_sync">ເກີດຂໍ້ຜິດພາດລະຫວ່າງການຊິ້ງຂໍ້ມູນ</string> - <string name="error_sync_check_logs">ມີຂໍ້ຜິດພາດເກີດຂຶ້ນໃນລະຫວ່າງການຕັ້ງຄ່າການຊິ້ງຂໍ້ມູນ ຄລິກທີ່ນີ້ເພື່ອກວດສອບເບິ່ງຂໍ້ຜິດພາດ</string> - <string name="cancel_sync">ຍົກເລິກການຊິ້ງຂໍ້ມຸນແລ້ວ</string> <string name="copied_text">ສຳເນົາແລ້ວ</string> - <string name="image_selected">ເລືອກຮູບແລ້ວ</string> - <string name="show_in_map">ສະແດງແຜ່ນທີ</string> - <string name="show_list">ສະແດງລາຍການ</string> <!--region TRACKER IMPORT CONFLICT MESSAGES--> - <string name="value_required_but_not_provided">%s ບັງຄັບແຕ່ບໍໄດ້ລະບຸໃວ້</string> - <string name="polygon_captured">ບັນທຶກຮູບຫຼາຍຫຼ່ຽມ</string> <string name="polygon">Polygon</string> <!--endregion--> - <string name="fingerprint_title">ລາຍນິ້ວມື</string> - <string name="fingerprint_message">ກະລຸນາ, ວາງນິ້ວມືຂອງທ່ານໃນເຄື່ອງອ່ານລາຍນິ້ວມື</string> <string name="security_title">ຄວາມປອດໄພ</string> - <string name="fix_error">ມີຂໍ້ຜິດພາດບາງຢ່າງ. ກະລຸນາແກ້ໄຂກ່ອນທີ່ຈະສຶບຕໍ່</string> - <string name="filters_active">ກຳລັງນຳໃຊ້ຕົວກອງ</string> <string name="filters_disabled">ບໍ່ໄດ້ໃຊ້ຕົວກອງ</string> <string name="filters_title_period">ຊ່ວງເວລາ</string> <string name="filters_title_org_unit">ຫົວ​ໜ່ວຍ​ການ​ຈັດ​ຕັ້ງ</string> - <string name="filters_title_sorting">ການຈັດຮຽງ</string> - <string name="filters_title_status">ສະຖານະ</string> <string name="filters_title_state">ໃຫ້ລະບົບທໍາງານຮ່ວມກັນ</string> <string name="filters_title_assigned">ມອບໝາຍໃຫ້ຂ້ອຍ</string> <string name="filter_period_today">ມື້ນີ້</string> @@ -577,8 +323,6 @@ <string name="filter_period_form_to">ຈາກ - ເຖິງ</string> <string name="filter_period_other">ອື່ນໆ</string> <string name="filter_period_any">ທຸກເວລາ</string> - <string name="data_values_error_sync_message">ການຊິ້ງລົ້ມເຫຼວ. ການຊິ້ງລົ້ມເຫຼວ. ກວດສອບເບີ່ງຄ່າຂໍ້ມູນເພື່ອລອງແກ້ໄຂບັນຫາ ແລະ ລອງໃໝ່ອີກຄັ້ງ. ຖ້າຫາກຍັງລົ້ມເຫຼວຢູ່ໃຫ້ຕິດຕໍ່ຜູ້ດູແລຮັກສາລະບົບຂອງທ່ານ</string> - <string name="sms_synced_message">ຂໍ້ມູນນີ້ຖຶກສົ່ງໄປຫາເຄື່ອງຄອມພິວເຕີໜ່ວຍແມ່ແລ້ວ ແຕ່ບໍໄດ້ຮັບປະກັນວ່າຈະໄດ້ຮັບການຮັກສາໃວ້</string> <string name="filter_event_status_open">ເປີດ</string> <string name="filter_event_status_schedule">ກຳນົດເວລາ</string> <string name="filter_event_status_overdue">ກາຍເວລາທີ່ກໍານົດ</string> @@ -594,7 +338,6 @@ <string name="sms_empty_gateway">ເສັ້ນທາງການນຳສົ່ງຂໍ້ຄວາມຕ້ອງບໍ່ຫວ່າງເປົ່າ</string> <string name="granular_sync_enrollments_empty">ບໍ່ມີການລົງທະບຽນທີ່ຈະອັບໂຫຼດ</string> <string name="granular_sync_unsupported_task">ຍັງບໍ່ມີການຮອງຮັບຫນ້າວຽກການແປງນີ້</string> - <string name="disable_pin_locked">ບໍ່ຕ້ອງສະແດງລັອກໜ້າຈໍອີກ</string> <string name="set_pin">ຕັ້ງລະຫັດຜ່ານ</string> <string name="conflict">ຂັດແຍ້ງ</string> <string name="change_event_date">ປ່ຽນວັນທີ</string> @@ -618,11 +361,7 @@ <string name="choose_ou">ເລືອກຫົວໜ່ວຍອົງກອນ</string> <string name="enter_url">ປ້ອນ url</string> <string name="enter_value">ປ້ອນຄ່າ</string> - <string name="choose_image">ເລືອກຮູບພາບ</string> - <string name="scan_code">ສະແກນລະຫັດ</string> - <string name="choose_option">ເລືອກຄໍາຕອບ</string> <string name="reserved_values_hint">ດາວໂຫຼດຄ່າລິຂະສິດຕາມຄຸນລັກສະນະTEI</string> - <string name="settings_reserved_values_message">ດາວໂຫຼດຄ່າລິຂະສິດຕາມຄຸນລັກສະນະTEI</string> <string name="manage_reserved_values_button">ຈັດການຄ່າລິຂະສິດ</string> <string name="events_to_download">ດາວໂຫຼດເຫດການ</string> <string name="teis_to_download">ດາວໂຫຼດ TEIs</string> @@ -641,39 +380,19 @@ <string name="filter_sync_not_synced">ບໍ່ໄດ້ອັບເດດຂໍ້ມູນໃຫ້ຄືກັນ</string> <string name="filter_sync_error">ຄໍາຜິດທີ່ເກີດຈາກການທໍາງານຮ່ວມກັນຂອງລະບົບ</string> <string name="filter_sync_sms">ຂໍ້ຄວາມອັບເດດຂໍ້ມູນໃຫ້ຄືກັນ</string> - <string name="dataset_overview">ລາຍລະອຽດ</string> - <string name="dataset_comments">ຄຳເຫັນ</string> <string name="saved">ບັນທຶກແລ້ວ!</string> - <string name="run_validation_rules">ທ່ານຕ້ອງການກວດສອບຄຸນນະພາບຂໍ້ມູນນີ້ບໍ?</string> - <string name="validation_success_title">ທຸກຢ່າງຮຽບຮ້ອຍດີ</string> - <string name="mark_dataset_complete">ທ່ານຕ້ອງການເຮັດຊຸດຂໍ້ມູນໃຫ້ຄົບຖ້ວນບໍ?</string> - <string name="dataset_completed">ເຮັດໃຫ້ສຳເລັດແລ້ວ</string> - <string name="name">ຊື່</string> - <string name="formula">Formula</string> - <string name="complete_anyway">ແນວໃດກໍ່ສຳເລັດຂໍ້ມູນ</string> <string name="fk_message">ບໍ່ຄົບຖ້ວນ%s%sຈາກ%s%s</string> <string name="filters_title_event_status">ສະຖານະຂອງເຫດການ</string> - <string name="enrollment_date">ວັນທີ່ລົງທະບຽນ</string> <string name="dataset_empty_list_can_create">ບໍ່ມີຂໍ້ມູນ. ກົດ \"+\" ເພື່ອເພີ່ມບັນທຶກໃຫມ່</string> <string name="dataset_emtpy_list_can_not_create">ບໍ່ມີຂໍ້ມູນ. ທ່ານບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ເພີ່ມໃຫມ່.</string> <string name="validation_rules_empty_description">ບໍ່ມີຄໍາອະທິບາຍຫຼືຄໍາແນະນໍາໃຫ້</string> <string name="validation_rules_data_to_review">ຂໍ້ມູນທີ່ຕ້ອງທົບທວນ</string> - <string name="dataset_saved_completed">ບັນ​ທຶກ​ແລະ​ສໍາ​ເລັດ​!</string> <string name="status_change_error_active_exist">ມີການລົງທະບຽນທີ່ໃຊ້ງານຢູ່ແລ້ວ</string> <string name="enrollment_status_active">ເປີດ</string> <string name="enrollment_status_completed">ສຳເລັດແລ້ວ</string> <string name="enrollment_status_cancelled">ຍົກເລີກແລ້ວ</string> - <string name="event_data">ຂໍ້ມູນ</string> <string name="download_tei_error">ບໍ່ສາມາດດາວໂຫຼດສິ່ງທີ່ເລືອກໄດ້%s</string> - <string name="completed_by">ສຳເລັດໂດຍ %s:%s</string> - <string name="updated_time">ອັບເດດແລ້ວ: %s</string> - <string name="action_done">ສຳເລັດ</string> - <string name="validation_internal_error_datasets">ພວກເຮົາບໍ່ສາມາດກວດສອບຄຸນນະພາບຂໍ້ມູນໄດ້. ຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ</string> - <string name="are_you_sure">ທ່ານ​ແນ່​ໃຈ​ບໍ່?</string> - <string name="reopen_question">ທ່ານຕ້ອງການເປີດຊຸດຂໍ້ມູນຄືນໃໝ່ບໍ?</string> <string name="filters_title_date">ວັນທີ່</string> - <string name="filters_title_event_date">ວັນທີເຫດການ</string> - <string name="tei_type_has_no_attributes">%sບໍ່ມີຄຸນສົມບັດສາທາລະນະ. ກະລຸນາເລືອກສາຍງານ</string> <string name="privacy_policy_title">ນະໂຍບາຍຄວາມເປັນສ່ວນຕົວ</string> <string name="open_privacy_policy">ກົດບ່ອນນີ້ເພື່ອກວດສອບ<a href="">ນະໂຍບາຍຄວາມເປັນສ່ວນຕົວ</a>ຂອງພວກເຮົາ</string> <string name="coordinates_error">ປະສານງານບໍ່ຖືກຕ້ອງ</string> @@ -681,12 +400,7 @@ <string name="security_debugger_message">ເຫດຜົນດ້ານຄວາມປອດໄພ, ແອັບເວີຊັ່ນນີ້ບໍ່ອະນຸຍາດໃຫ້ໃຊ້ກັບ adb. ກະລຸນາໃຊ້ເວີຊັ່ນທີ່ໃຊ້ສະເພາະການຝຶກອົບຮົມ.</string> <string name="customactivityoncrash_error_activity_restart_app">ກັບຄືນ</string> - <string name="customactivityoncrash_error_activity_close_app">ປິດແອັບ</string> - <string name="customactivityoncrash_error_activity_error_details">ລາຍ​ລະ​ອຽດ​ເພີ່ມ​ເຕີມ</string> - <string name="customactivityoncrash_error_activity_error_details_title">ລາຍ​ລະ​ອຽດ​ເພີ່ມ​ເຕີມ</string> - <string name="customactivityoncrash_error_activity_error_details_close">ປິດ</string> <string name="customactivityoncrash_error_activity_error_details_copy">ສຳເນົາໄປຫາ ຄິບບອດ</string> - <string name="customactivityoncrash_error_activity_error_details_clipboard_label">ຂໍ້​ມູນ​ຜິດ​ພາດ​</string> <string name="metada_first_sync_error">ພວກເຮົາພົບເຫັນຂໍ້ຜິດພາດໃນເວລາຊິ້ງກັບເຄື່ອງຄອມພິວເຕິ້ໜ່ວຍແມ່ຂອງທ່ານ. ແບ່ງປັນຂໍ້ຜິດພາດກັບຜູ້ດູແລລະບົບຂອງທ່ານຖ້າເປັນໄປໄດ້.</string> <string name="enrollment_date_edition_warning">ເຫດການທີ່ວາງແຜນໄວ້ຈະບໍ່ຖືກກຳນົດເວລາໃໝ່</string> <string name="section_charts">ແຜນວາດຂໍ້ມູນ</string> @@ -735,44 +449,27 @@ <string name="section_feedback">ຜົນຕອບຮັບ</string> <string name="section_indicators">ຕົວຊີ້ວັດ</string> <string name="value">Value</string> + <string name="camera_permission_denied">ການ​ອະ​ນຸ​ຍາດ​ໃຊ້ກ້ອງ​ຖ່າຍ​ຮູບ​ຖືກ​ປະ​ຕິ​ເສດ. ທ່ານ​​ຕ້ອງ​ເປີດ​ໃຊ້​ງານເພື່ອ​ໃຊ້​ຄຸນ​ສົມ​ບັດ​ນີ້​.</string> <string name="section_charts_indicators">ແຜນວາດ ແລະ ຕົວຊີ້ວັດ</string> <string name="take_photo">ຖ່າຍຮູບ</string> - <string name="from_gallery">ເລືອກຈາກຄັງຮູບ</string> - <string name="data_set_quality_check_done">ສຳເລັດແລ້ວ!</string> <string name="break_glass_dialog_title">ໂປຣແກຣມນີ້ໄດ້ຮັບການຄຸ້ມຄອງ</string> <string name="break_glass_hint">ອະທິບາຍເຫດຜົນຢູ່ບ່ອນນີ້</string> - <string name="authenticating">ກຳລັງກວດສອບຄວາມຖືກຕ້ອງ</string> - <string name="login_error_no_dhis_instance">ທີ່ຢູ່ຂອງເຄື່ອງຄອມພິວເຕິ້ໜ່ວຍແມ່ທີ່ໃສ່ ບໍ່ແມ່ນຕົວຢ່າງຂອງ dhis</string> - <string name="login_error_bad_credentials">ຄວາມຜິດພາດຈາກຢັ້ງຢືນເອກະລັກບຸກຄົນ</string> - <string name="login_error_unknown_host">ບໍ່ຮູ້ເຄື່ອງຄອມພິວເຕິ້ໜ່ວຍແມ່</string> - <string name="invalid_integer">ຄ່າຕ້ອງເປັນຈຳນວນຖ້ວນ</string> <string name="openid_session_expired">ໄລຍະເວລາການສື່ສານໄດ້ສິ້ນສຸດລົງແລ້ວ</string> <string name="openid_session_expired_message">ເຊດຊັນປັດຈຸບັນຂອງທ່ານໝົດອາຍຸແລ້ວ. ດ້ວຍເຫດຜົນດ້ານຄວາມປອດໄພ, ທ່ານຈະຕ້ອງໃຫ້ຂໍ້ມູນປະຈໍາຕົວຂອງທ່ານອີກເທື່ອຫນຶ່ງ</string> - <string name="dataset_column_default">ຄ່າ</string> <string name="week_period_span_default_label">ອາທິດ%d%sຫາ%s</string> <string name="action_do_not_show_again">ບໍ່ຕ້ອງສະແດງອີກ</string> <string name="feature_configuration">ການຕັ້ງຄ່າຄຸນສົມບັດ</string> <string name="show_radar_graph">ສະແດງເປັນ Radar</string> - <string name="coordinate_feature_type_error">ບໍ່ສາມາດກຳນົດປະເພດການປະສານງານໄດ້</string> <string name="filter_follow_up_label">ຕິດຕາມ%s</string> - <string name="wrong_date_format">%sບໍ່ສາມາດວິເຄາະເປັນວັນທີໄດ້</string> <string name="update_field_error">ບໍ່ສາມາດອັບເດດຫ້ອງປ້ອນຂໍ້ມູນນີ້ໄດ້. ກະລຸນາລອງໃໝ່ອີກຄັ້ງ</string> - <string name="available">ສີ່ງທີ່ມີ</string> <string name="blocked_by_completion">ຂໍ້ມູນນີ້ບໍ່ສາມາດແກ້ໄຂໄດ້ເນື່ອງຈາກຖືກໝາຍວ່າສຳເລັດແລ້ວ</string> <string name="edition_expired">ຂໍ້ມູນນີ້ບໍ່ສາມາດແກ້ໄຂໄດ້ເນື່ອງຈາກເວລາຂອງມັນໝົດອາຍຸແລ້ວ</string> <string name="edition_no_write_access">ທ່ານບໍ່ໄດ້ຮັບອານຸຍາດໃນການແກ້ໄຂຂໍ້ມູນນີ້</string> <string name="event_date_not_in_orgunit_range">ຂໍ້ມູນນີ້ບໍ່ສາມາດແກ້ໄຂໄດ້ເນື່ອງຈາກຫົວຫນ່ວຍການຈັດຕັ້ງຖືກປິດໃວ້ຢູ່</string> <string name="edition_no_catcombo_access">ທ່ານບໍ່ໄດ້ຮັບອານຸຍາດໃນການແກ້ໄຂຂໍ້ມູນນີ້</string> - <string name="edition_orgunit_capture_scope">ທ່ານບໍ່ສາມາດແກ້ໄຂຂໍ້ມູນຈາກຫົວຫນ່ວຍການຈັດຕັ້ງນີ້ໄດ້</string> - <string name="reload_list">ລີເຊັດການຄົ້ນຫາ</string> + <string name="edition_orgunit_user_scope">ທ່ານບໍ່ສາມາດແກ້ໄຂຂໍ້ມູນຈາກຫົວຫນ່ວຍການຈັດຕັ້ງນີ້ໄດ້</string> <string name="error_tei_online_search_title">ການຄົ້ນຫາອອນໄລນ໌ສົ່ງຂໍ້ຄວາມຕໍ່ໄປນີ້:</string> - <string name="program_rules_loop_warning_title">ຂໍ້ຄວນລະວັງກົດຂອງສາຍງານ</string> - <string name="program_rules_loop_warning_message">ມີບັນຫາການກຳນົດຄ່າທີ່ເຮັດໃຫ້ເກີດມີຊ່ອງຫວ່າງໃນກົດລະບຽບ. ຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ.</string> - <string name="granular_sync_refresh">ເລີ່ມໃໝ່</string> - <string name="unknown_date">ບໍ່ຮູ້</string> - <string name="granular_sync_refresh_title">ໂຫຼດຂໍ້ມູນທັງໝົດຄືນໃໝ່</string> <string name="delete_account">ລົບບັນຊີ</string> - <string name="manage_accounts">ຈັດການບັນຊີ</string> <string name="main_menu_troubleshooting">ການ​ແກ້​ໄຂ​ບັນ​ຫາ​ການ​ກຳນົດຄ່າ</string> <string name="troubleshooting_language_title">Language</string> <string name="troubleshooting_language_description">ແຕະບ່ອນນີ້ເພື່ອ ປ່ຽນພາສາຂອງແອັບພິເຄຊັ່ນ</string> @@ -789,36 +486,22 @@ <string name="search_no_results">ບໍ່ມີຜົນລັບສຳລັບການຄົ້ນຫານີ້</string> <string name="search_too_many_results">ຜົນໄດ້ຮັບຫຼາຍເກີນໄປ</string> <string name="search_too_many_results_message">ລອງປ່ຽນການຄົ້ນຫາຂອງທ່ານເພື່ອຈຳກັດຜົນລັບໃຫ້ແຄບລົງ.</string> - <string name="search_create_new">ສ້າງໃໝ່</string> - <string name="search_min_attributes_message">ທ່ານຕ້ອງປ້ອນຢ່າງໜ້ອຍ %s ຂອງຄຸນລັກສະນະເຂົ້າເພື່ອຄົ້ນຫາ</string> <string name="action_ok">ຕົກລົງ</string> <string name="init_search">ເລີ່ມການຄົ້ນຫາເພື່ອຊອກຫາອັນໃດນຶ່ງ%s</string> <string name="search_or_create">ທ່ານສາມາດຄົ້ນຫາຫຼືສ້າງໃຫມ່%s</string> <string name="event_can_be_completed">ທ່ານຕ້ອງການໝາຍແບບຟອມນີ້ວ່າສຳເລັດແລ້ວຫຼືບໍ?</string> <string name="changes_will_be_discarted">ຖ້າທ່ານອອກດຽວນີ້, ການປ່ຽນແປງຈະຖືກຍົກເລີກ.</string> + <string name="event_error_on_complete">ທ່ານມີຂໍ້ຜິດພາດໃນບາງຂໍ້ຄວາມ.\nທ່ານຕ້ອງການກວດເບິ່ງຄືນບໍ?</string> <string name="re_opened">ເປີດຄືນໃໝ່</string> <string name="account_disable_title">ບັນຊີຖືກປິດ</string> <string name="account_disable_message">ບັນຊີຂອງທ່ານຖືກປິດການນຳໃຊ້ໂດຍຜູ້ຮັກສາລະບົບ.</string> <string name="customactivityoncrash_error_activity_current_date">ວັນທີປະຈຸບັນນີ້: %s</string> <string name="customactivityoncrash_error_activity_device">ອຸປະກອນ: %s</string> <string name="customactivityoncrash_error_activity_os_version">Os ລຸ້ນ: %s</string> - <string name="open_details">ເປິດ %s ລາຍລະອຽດ</string> - <string name="tracked_entity_type_details">%s ລາຍລະອຽດ</string> <string name="syncing_resource">ກຳລັງອັບເດດຂໍ້ມູນໃຫ້ຄືກັນ %s...</string> - <string name="sms_sync_waiting_for_response">ຂໍ້ຄວາມໄດ້ສົ່ງແລ້ວ. ກຳລັງລໍຖ້າໃຫ້ເຄື່ອງຄອມພິວເຕີໜ່ວຍແມ່ຕອບກັບ.</string> - <string name="sms_sync_sent">ສົ່ງຂໍ້ຄວາມແລ້ວ. ກຳລັງອັບເດດສະຖານະ.</string> - <string name="sms_sync_not_sent">ບໍ່ໄດ້ສົ່ງຂໍ້ຄວາມ</string> <string name="sms_sync_sms_app_chooser_title">ສົ່ງຂໍ້ຄວາມກັບ</string> <string name="sms_sync_is_sms_sent">ທ່ານໄດ້ສົ່ງຂໍ້ຄວາມແລ້ວບໍ?</string> - <string name="sms_sync_manual_confirmation">ກຳລັງລໍຖ້າການຢຶນຢັນຄູ່ມື</string> - <string name="syncing_events">ອັບເດດເຫດການໃຫ້ຄືກັນ</string> - <string name="syncing_teis">ອັບເດດຫົວໜ່ວຍທີ່ຕິດຕາມໃຫ້ຄືກັນ</string> - <string name="syncing_data_sets">ອັບເດດຊຸດຂໍ້ມູນໃຫ້ຄືກັນ</string> - <string name="syncing_done">ອັບເດດຂໍ້ມູນໃຫ້ຄືກັນສຳເລັດແລ້ວ</string> - <string name="sms_available_for_individual_records">ການ​ອັບເດດຂໍ້ຄວາມໃຫ້ຄືກັນ ແມ່ນ​ມີ​ຢູ່​ແຕ່​ມີ​ການ​ເຂົ້າ​ເຖິງ​ສໍາ​ລັບ​ການ​ບັນ​ທຶກ​ຂອງ​ແຕ່​ລະ​ລາຍການ</string> <string name="downloading_image_resources">ກຳລັງດາວໂຫຼດຮູບພາບ...</string> - <string name="program_description">ລາຍລະອຽດຂອງສາຍງານ</string> - <string name="wrong_pin">ລະຫັດຜ່ານຜິດພາດ</string> <string name="sync_dialog_title_not_synced">ຈຳເປັນຕ້ອງອັບເດດຂໍ້ມູນໃຫ້ຄືກັນ</string> <string name="sync_dialog_title_error">ມີຂໍ້ຜິດພາດໃນການອັບເດດຂໍ້ມູນໃຫ້ຄືກັນ</string> <string name="sync_dialog_title_synced">ອັບເດດຂໍ້ມູນໃຫ້ຄືກັນແລ້ວ</string> @@ -833,9 +516,6 @@ <string name="sync_dialog_action_send">ສົ່ງ</string> <string name="sync_dialog_action_refresh">Refresh</string> <string name="sync_dialog_action_not_now">ບໍ່​ແມ່ນ​ຕອນ​ນີ້</string> - <plurals name="error_count_label"> - <item quantity="other">%s ຂໍ້ຜິດພາດ</item> - </plurals> <string name="software_update">ອັບເດດຊັອບແວ</string> <string name="download_now">ດາວໂຫຼດດຽວນີ້</string> <string name="check_for_updates">ກວດສອບເພື່ອປັບປຸງ</string> @@ -856,7 +536,6 @@ <string name="enter_event">ປ້ອນ%1$s</string> <string name="program_stage">ຂັ້ນຂອງສາຍງານ</string> <string name="event">ເຫດການ</string> - <string name="optional">​ຢ່າງ​ຕ່ຳ ມີ​ ທັງ​ໝົດ 8 ຄຳ ໃນ​ນັ້ນ​ຕ້ອງ​ມີ​ໂຕ​ໃຫ​ຍ່ 1 ໂຕ ແລະ ໂຕ​ເລກ 1 ໂຕ</string> <string name="show_more">ສະແດງໃຫ້ເຫັນຫຼາຍຂຶ້ນ</string> <string name="show_less">ສະແດງໃຫ້ເຫັນໜ້ອຍລົງ</string> <string name="sync">ອັບເດດຂໍ້ມູນໃຫ້ຄືກັນ</string> @@ -864,4 +543,11 @@ <string name="show_description">ສະແດງຄຳອະທິບາຍ</string> <string name="hide_description">ເຊື່ອງຄຳອະທິບາຍ</string> <string name="transfer">ໂອນ</string> - </resources> + <plurals name="error_count_label"> + <item quantity="other">%s ຂໍ້ຜິດພາດ</item> + </plurals> + + <plurals name="settings_specific_programs"> + <item quantity="other">ມີ%s ສາຍງານທີ່ມີການຕັ້ງຄ່າສະເພາະ</item> + </plurals> +</resources> diff --git a/app/src/main/res/values-my/strings.xml b/app/src/main/res/values-my/strings.xml index 8b5fedc6759..bce5f17f333 100644 --- a/app/src/main/res/values-my/strings.xml +++ b/app/src/main/res/values-my/strings.xml @@ -1,107 +1,77 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!-- Warnings and error messages --> <string name="error">အမှား</string> + <!-- SyncService strings: --> + <string name="sync_events">Events</string> - <string name="sync_complete_title">ပြီးဆုံးသည်</string> - <string name="add_new">အသစ်ထည့်ခြင်း</string> - <string name="add">ထပ်ထည့်သည်</string> - <string name="schedule_new">အသစ်ချိန်းဆိုခြင်း</string> + <string name="referral">ညွှန်းပို့ခြင်း</string> - <string name="user_hint">အသုံးပြုသူအမည်</string> - <string name="password_hint">လျှို့ဝှက်နံပါတ်</string> <string name="account_recovery">ပြန်လည်အသုံးပြုနိုင်ရန်သိမ်းဆည်းခြင်း</string> + <!--PERIOD--> <string name="DAILY">နေ့စဉ်</string> <string name="WEEKLY">အပတ်စဉ်</string> <string name="MONTHLY">လစဉ်</string> <string name="YEARLY">နှစ်စဉ်</string> <string name="choose_date">ရက်စွဲ ကိုရွေးချယ်ပါ</string> + + <!-- Status --> + <string name="event_open">Open</string> <string name="read_only">ဖတ်ရန်အတွက်သာ</string> - <string name="finish_and_complete">ပြီးဆုံးသည်</string> <string name="active">လုပ်ဆောင်နိုင်သည်</string> <string name="state_error">အမှား</string> + + <!--Completion--> + <!--Event initial--> - <string name="create">ဖန်တီးသည်</string> <string name="update">‌နောက်ဆုံးသတင်းကိုရစေခြင်း</string> - <string name="date">ရက်စွဲ</string> <string name="org_unit">ဖွဲ့စည်းပုံယူနစ်</string> - <string name="category_option">category option</string> <!--DataSet initial--> <string name="report_period">အစီရင်ခံစာကာလအပိုင်းအခြား</string> <!--Event Detail--> <string name="due_date">Дата выполнения</string> - <string name="date_default">နေ့/လ/နှစ်</string> <string name="cancel">ပယ်ဖျက်သည်</string> <string name="delete">ဖျက်ဆီးသည်</string> <!--TEI DASHBOARD--> - <string name="see_details">အသေးစိတ်ကြည့်ရန်</string> <string name="edit">တည်းဖြတ်သည်</string> - <!--DONE TASKS--> - <string name="events_no_data">အချက်အလက်မရှိပါ။</string> <string name="done_task">ပင်မစာမျက်နှာ</string> <string name="log_out">ထွက်ရန်</string> <string name="wipe_data_no">ပယ်ဖျက်သည်</string> <string name="SYNC_MANAGER">တည်ဆောက်ထားသည့်အနေအထား</string> <string name="settingsTwoFAStatus">အခြေအနေ</string> - <!--endregion--> - - <string name="enrollmment_date">Дата зачисления</string> - <string name="write_new_note">မှတ်စုအသစ်ရေးရန်</string> - <string name="hint_month">လများ</string> - <string name="hint_year">နှစ်များ</string> + <!--EVENT SUMMARY--> + + <!--AGE CUSTOM VIEW--> <string name="incident_date">Incident date</string> - <string name="date_dialog_clear">ရှင်းလင်းသည်</string> <string name="period">အချိန်ကာလ</string> + <!-- RELATIONSHIPS --> <string name="next">ရှေ့သို့</string> - <string name="SAVE">သိမ်းဆည်းသည်</string> <string name="button_ok">လက်ခံသည်</string> <string name="qr_events">Events</string> <string name="about">အကြောင်းအရာ</string> - <string name="max">အများဆုံး</string> - <string name="current">လက်ရှိ</string> - <string name="warning_on_complete_title">သတိ</string> - <string name="error_on_complete_title">အမှား</string> <string name="save">သိမ်းဆည်းသည်</string> <string name="menu_home">ပင်မစာမျက်နှာ</string> <string name="showHelp">အကူအညီ</string> <string name="qr_data_values">data တန်ဖိုးများ</string> <string name="dashboard_overview">အကျဥ်း</string> - <string name="dashboard_indicators">အညွှန်းများ</string> - <string name="dashboard_notes">မှတ်စု</string> - <string name="event_overview">အသေးစိတ်များ</string> - <string name="event_indicators">အညွှန်းများ</string> - <string name="event_notes">မှတ်စု</string> - <string name="finish">မှတ်သားမည်</string> <string name="please_wait">‌ကျေးဇူးပြု၍စောင့်ပါ</string> <string name="state_warning">သတိ</string> <string name="action_close">ပိတ်သည်</string> - <string name="data_set_complete">ပြည့်စုံသည်။</string> - <string name="data_set_open">Open</string> - <string name="data_every_day">နေ့စဉ်</string> - <string name="data_every_week">အပတ်စဉ်</string> <string name="filters_title_period">အချိန်ကာလ</string> - <string name="filters_title_status">အခြေအနေ</string> <string name="filter_period_last_week">Last week</string> <string name="filter_period_last_month">ယခင်လ</string> <string name="filter_period_other">အခြား</string> <string name="filter_event_status_open">Open</string> <string name="go_back">ပြန်သွားပါ</string> <string name="data_sets">စီမံချက်</string> - <string name="dataset_overview">အသေးစိတ်များ</string> - <string name="name">အမည်</string> - <string name="enrollment_date">Дата зачисления</string> <string name="enrollment_status_active">Open</string> <string name="enrollment_status_completed">ပြည့်စုံသည်။</string> - <string name="event_data">အချက်အလက်</string> - <string name="action_done">Done</string> - <string name="are_you_sure">သေချာပါသလား။</string> <string name="filters_title_date">ရက်စွဲ</string> <string name="customactivityoncrash_error_activity_restart_app">ပြန်သွားပါ</string> - <string name="customactivityoncrash_error_activity_error_details_close">ပိတ်သည်</string> <string name="section_charts">ဂရပ် ပုံစံများ</string> <string name="navigation_programs">Programs</string> <string name="navigation_charts">ဂရပ် ပုံစံများ</string> @@ -113,11 +83,6 @@ <string name="filter_period_last_year">ယခင်နှစ်</string> <string name="section_feedback">အကြောင်းပြန်ကြားချက်</string> <string name="section_indicators">အညွှန်းများ</string> - <string name="value">တန်ဖိုး</string> - <string name="invalid_integer">တန်ဖိုးသည် ကိန်းဂဏန်းသာ ဖြစ်ရမည်။</string> - <string name="available">ရနိုင်သည်</string> - <string name="unknown_date">မသိပါ</string> <string name="sync_dialog_action_send">ပို့သည်</string> <string name="programs">Programs</string> - <string name="optional">မဖြစ်မနေလုပ်ရန်မလိုပါ။</string> </resources> diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index cad1a18384a..b853f6ebaaa 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -1,58 +1,26 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!--GENERAL--> <string name="app_name">Dhis2</string> - <string name="logo_text">dhis</string> - <string name="logo_number">2</string> <!-- Warnings and error messages --> <string name="error">Feil</string> - <plurals name="error_message"> - <item quantity="one">Feil</item> - <item quantity="other">Feil</item> - </plurals> - <string name="error_wrong_server_url">Feil server URL</string> - <string name="error_wrong_credentials">Feil opplysninger</string> - <string name="error_unexpected_error">Uventet feil</string> - <string name="error_internal_server_error">Intern serverfeil</string> - <string name="no_value">ingen verdi</string> <string name="no_reserved_values">Det er ingen flere reserverte verdier. Kontakt din systemadministrator</string> - <string name="no_reserved_values_connection">Det er ingen flere reserverte verdier. Koble til nettverket for å fylle på dem</string> - <string name="errors">feil</string> <string name="something_wrong">Noe gikk galt</string> <!-- SyncService strings: --> - <string name="sync_now">Synkroniser nå</string> - <string name="sync_text">Synkroniserer med server</string> - <string name="sync_title">Synkroniserer nå</string> - <string name="sync_metadata">Metadata</string> <string name="sync_events">Hendelser</string> - <string name="sync_tei">Sporede enheter</string> - - <string name="sync_complete_title">Fullført</string> - <string name="sync_complete_text">Synkronisering fullført</string> <string name="sync_error_title">Synkroniseringsfeil</string> <string name="sync_error_text">En feil har oppstått under synkronisering. Vennligst prøv på nytt</string> - <string name="data_sync_warning_program">ADVARSEL: Mesteparten av dine data er synkroniserte men noen felter presenterte konflinkter. Synkroniser din konfigurasjon og prøv igjen. Hvis advarselen vedvarer, sjekk deres synkroniseringsstatus: programmer, TEI\'s og hendelser med konflikter er merket som @.</string> - <string name="search_result_text">%sresultater funnet</string> - <string name="add_new">Legg til ny</string> - <string name="add">Legg til</string> - <string name="schedule_new">Planlegg ny</string> <string name="referral">Henvisning</string> <!-- Login --> - <string name="url_hint">Server URL</string> - <string name="user_hint">Brukernavn</string> - <string name="password_hint">Passord</string> - <string name="log_in_button">Logg inn</string> - <string name="unlock_button">Lås opp sesjonen</string> <string name="syncing_configuration">Synkroniserer konfigurasjonen din</string> <string name="syncing_data_shortly">Dataene dine vil snart bli synkronisert</string> <string name="syncing_data">Synkroniserer dataene dine</string> <string name="configuration_ready">Din konfigurasjon er klar</string> <string name="data_ready">Dine data er klare</string> - <string name="configuration_sync_failed">Synkronisering av konfigurasjonen mislyktes</string> - <string name="data_sync_failed">Synkronisering av data mislyktes</string> <string name="account_recovery">Kontogjenoppretting</string> + <!--PERIOD--> <string name="DAILY">Daglig</string> <string name="WEEKLY">Ukentlig</string> @@ -69,128 +37,78 @@ <string name="enter_text">Legg inn tekst</string> <string name="enter_long_text">Legg inn lang tekst</string> <string name="enter_number">Legg inn nummer</string> - <string name="enter_integer">Legg inn tall</string> <string name="enter_negative_integer">Legg inn et negativt tall</string> <string name="enter_positive_integer_or_zero">Legg inn et positivt tall eller null</string> <string name="enter_positive_integer">Legg inn positivt tall</string> - <string name="filter_options">Filteralternativ</string> <string name="choose_date">Velg dato</string> - <string name="change_calendar">Endre kalender</string> <!-- Status --> - <string name="program_completed">Programmet er fullført</string> - <string name="program_inactive">Programmet er inaktivt</string> <string name="event_open">Åpne</string> <string name="event_completed">Hendelse fullført</string> <string name="read_only">Skrivebeskyttet</string> - <string name="finish_and_complete">Gjør ferdig og fullfør</string> <string name="completed">Fullført</string> <string name="cancelled">Kansellert</string> - <string name="activate">Aktiver</string> <string name="active">Aktiv</string> <!-- State --> <string name="state_synced">Synk</string> <string name="state_to_post">Å sende</string> <string name="state_to_update">Å oppdatere</string> - <string name="state_to_delete">Å slette</string> <string name="state_error">Feil</string> - <string name="action_sync">SYNK</string> - <string name="action_send">SEND</string> - <string name="action_sync_sms">SYNK SMS</string> <!--Completion--> - <string name="completion">Ferdigstilling</string> <!--Event initial--> - <string name="create">Opprett</string> <string name="update">Oppdater</string> - <string name="date">Dato</string> <string name="org_unit">Org enhet</string> <string name="no_org_units">Det er ingen åpne organisasjonsenheter for den valgte datoen. Vennligst velg en annen dato eller organisasjonsenhet.</string> - <string name="category_option">Kategorivalg</string> <string name="latitude">Breddegrad</string> <string name="longitude">Lengdegrad</string> - <string name="new_event">Ny hendelse</string> - <string name="one_time">En gang</string> - <string name="permanent">Permanent</string> <!--DataSet initial--> <string name="report_period">Rapportperiode</string> - <string name="cat_option">Kat alternativ</string> - <string name="field_required">Hvis du setter en verdi, så trenger hele raden alle verdier for å fullføre datasettet.</string> - <string name="field_mandatory">Noen verdier som er påkrevd mangler. Du må sette obligatoriske verdier for å fullføre datasettet.</string> - <string name="field_mandatory_v2">Det mangler obligatoriske felt. Vennligst fyll dem for å fullføre datasettet.</string> - <string name="datavalue_saved">Verdien er lagret!</string> - <string name="there_is_no_available_period">Det er ingen tilgjengelige perioder å velge.</string> <!--Event Detail--> <string name="due_date">Forfallsdato</string> <string name="cat_combo">Kat kombo</string> - <string name="date_default">DD/MM/ÅÅÅÅ</string> <string name="cancel">Avbryt</string> <string name="delete">Slett</string> - <string name="total">Totalt</string> <string name="most_recent_event_date">Siste hendelsesdato</string> <string name="no_options">Ingen alternativer er tilgjengelige</string> <string name="active_programs">Aktive programmer</string> - <string name="to_enroll_programs">Programmer å registrere</string> <string name="enroll">Registrere</string> - <string name="last_visit">Siste besøk: </string> - <string name="apply">Bruk</string> <!--TEI DASHBOARD--> - <string name="see_details">Se detaljer</string> - <string name="view_more">VIS MER</string> <string name="edit">Rediger</string> - <string name="follow_up">Oppfølging</string> - <string name="follow_up_enabled">Oppfølging er aktivert</string> - <string name="follow_up_disabled">Oppfølging er deaktivert</string> <string name="deactivate">Deaktiver</string> <string name="program_not_allow_events">Dette programmet tillater ikke flere hendelser</string> <!--DONE TASKS--> - <string name="events_no_data">Ingen data</string> <string name="events">hendelser</string> <string name="done_task">Hjem</string> - <string name="app_info">App Info</string> <string name="log_out">Logg ut</string> - <string name="block_session">Blokker sesjon</string> <!-- SYNC --> - <string name="a_minute">1 minutt</string> - <string name="fifteen_minute">15 minutt</string> <string name="thirty_minutes">30 minutt</string> <string name="a_hour">1 time</string> <string name="every_6_hours">6t</string> <string name="a_day">1 dag (Standard)</string> <string name="every_12_hours">12t</string> - <string name="Automatic_Sync_Data">Synkroniser data automatisk hver: </string> <string name="Manual">Manuelt</string> - <string name="Automatic_Sync_Metadata">Synkroniser konfigurasjon automatisk hver:</string> <string name="a_week">1 uke</string> <string name="sync_max_parameters">Gjeldende synkroniseringsparametre</string> <string name="sync_default_parameters">Tilbakestill til standard</string> + <string name="wipe_data_meesage">Databasen vil bli slettet. Du vil bli spurt om å logge inn igjen.</string> <string name="wipe_data_ok">Aksepter</string> <string name="wipe_data_no">Avbryt</string> <string name="SYNC_DATA">SYNK data nå</string> <string name="SYNC_META">SYNK konfigurasjon nå</string> <string name="SYNC_MANAGER">Innstillinger</string> - <string name="last_data_sync_date">Siste synk på: %s</string> - <string name="last_metadata_sync_date">Siste synk på: %s</string> <string name="refill_reserved_values">Fyll på</string> - <string name="settings_sms_module_title">SMS modul:</string> <string name="settings_sms_receiver_number">SMS inngangsport</string> <string name="settings_sms_result_sender_number">SMS resultat sender</string> - <string name="settings_sms_result_timeout_hint">sekunder</string> - <string name="settings_sms_result_sender_hint">nummer</string> - <string name="settings_sms_receiver_number_hint">nummer</string> <string name="settings_sms_module_switch">Aktiver innsending av SMS</string> <string name="settings_sms_response_wait_switch">Vent på SMS resultatsvar</string> - <plurals name="settings_specific_programs"> - <item quantity="one">Det er %s program med spesifikke innstillinger</item> - <item quantity="other">Det er %s programmer med spesifikke innstillinger</item> - </plurals> <string name="settings_limit_scope">Begrensede innstillinger</string> <string name="settings_limit_globally">Globalt</string> <string name="settings_limit_program">etter program</string> @@ -208,15 +126,11 @@ <string name="settingsErrorLog_descr">Denne loggen inneholder alle feil som er forårsaket av synkronisering av data og metadata.</string> <string name="settingsDeleteLocalData">Slett lokaldata</string> <string name="settingsDeleteLocalData_descr">Alle Capture APP data er lagret i din enhet og vil bli slettet. Data som ikke er synkronisert til server vil bli borte.</string> - <string name="settingsReset">Resett app data &amp; konfigurasjon</string> - <string name="settingsReset_descr">Din konfigurasjon og App data lagret på enheten vil bli slettet. Du vil bli bedt om å logge inn på nytt, og data som ikke er synkronisert til serveren vil bli borte.</string> <string name="settingsSms">SMS innstillinger</string> <string name="settingsSms_descr">Sjekk og rediger parametre relatert til SMS inngangsport</string> <string name="settingsTwoFAStatus">Status</string> <!--endregion--> - <string name="enrollmment_date">Registreringsdato</string> - <!-- SEARCH OPTION SET --> <string name="search_optionset">Søk</string> <!--FORM FRAGMENT--> @@ -225,11 +139,6 @@ <string name="write_new_note">Skriv nytt notat</string> <string name="clear">tøm</string> <string name="add_note">Legg til notat</string> - <string name="revert">Reverser</string> - <string name="activated">Aktivert</string> - <string name="missing_mandatory_fields_title">Obligatoriske felter mangler</string> - <string name="missing_mandatory_fields_text">Noen obligatoriske felt mangler. Hvis du vil gå tilbake nå, all lagret informasjon vil bli slettet.</string> - <string name="missing_mandatory_fields_text_not_delete">Noen obligatoriske felt mangler. Hvis du vil gå tilbake, vennligst fyll inn dem.</string> <string name="title_delete_go_back">Dine data er ikke lagret</string> <string name="delete_go_back">Hvis du går tilbake nå, vil all informasjon som har blitt lagt inn bli slettet.</string> <string name="missing_mandatory_fields_go_back">Slett og gå tilbake</string> @@ -237,29 +146,15 @@ <string name="tei_coordinates">Koordinater for</string> <!--EVENT SUMMARY--> - <string name="section_list">Seksjonliste</string> - <string name="event_summary_header" formatted="false">%sspørsmål av %ser fullført</string> - <string name="event_summary_sections_header" formatted="false">%sav %sfullført</string> - <string name="complete_and_close">Fullfør og lukk</string> <!--AGE CUSTOM VIEW--> - <string name="hint_day">Dager</string> - <string name="hint_month">Måneder</string> - <string name="hint_year">År</string> - <string name="week">Uker</string> <string name="incident_date">Forekomstdato</string> - <string name="local_results">lokale resultater</string> - <string name="online_results">Tilkoblede resultater</string> <string name="past_programs">Tidligere programmer</string> <!--PERMISSIONS--> <string name="permission_denied">Du har ikke tilstrekkelig tillatelse for å utføre denne handlingen</string> - <string name="add_relation_button">Legg til som...</string> - <string name="date_dialog_clear">Fjern</string> <string name="period">Periode</string> - <string name="org_unit_filter">(%d) Org Enhet</string> - <string name="org_unit_select_level">Nivå %d</string> <string name="tuto_main_1">Velkommen til dhis2</string> <string name="tuto_main_2">Her kan du se dine aktiviteter</string> <string name="tuto_main_3">Du kan bruke et filter...</string> @@ -268,16 +163,11 @@ <string name="tuto_main_6">Sjekk andre handlinger i hovedmenyen</string> <!-- RELATIONSHIPS --> - <string name="default_relationship_label">Opprett en relasjon</string> <string name="next">Neste</string> <string name="search_min_num_attr">Du må legge inn minst %dav attributtene for å foreta et søk</string> - <string name="search_attr">Du må legge inn minst en av attributtene for å foreta et søk</string> - <string name="search_max_tei_reached">Det er mer enn%dresultater. Vennligst legg inn flere søkekriterier</string> - <string name="search_init">Skriv inn søkekriterier</string> <!-- QR --> <string name="QR_SCANNER">Importer QR data</string> - <string name="SAVE">Lagre</string> <string name="button_ok">OK</string> <string name="qr_id">Identifikasjon</string> <string name="qr_attributes">Egenskaper</string> @@ -289,32 +179,20 @@ <string name="qr_no_data">ingen data</string> <string name="qr_error_id">Ugyldig QR kode</string> <string name="qr_error_attr">Denne attributten kan ikke legges til</string> - <string name="qr_error_enrollment">Denne registreringen kan ikke legges til</string> <string name="about">Om</string> <string name="programs_to_enroll">Programmer å registrere</string> - <string name="select_all">velg alle</string> - <string name="clear_all">tøm valg</string> - <string name="empty_program_list">Det er ikke noe informasjon for de valgte filtre. Vennligst prøv å endre dem.</string> <string name="share">Del</string> <string name="share_qr">Del QR</string> <string name="max">Max</string> <string name="current">Nåværende</string> <string name="tei">TEI</string> <string name="teis">TEIs</string> - <string name="limit_by_organisation_unit">Begrens etter organisasjonsenhet</string> - <string name="limit_by_program">Begrens etter program</string> - <string name="programs_list">Programliste</string> <string name="wipe_data">Resett app data &amp; konfigurasjon</string> - <string name="add_relationship_error">Det er ikke mulig å legge til relasjon</string> <string name="warning_error_on_complete_title">Sjekk dette!</string> - <string name="warning_on_complete_title">Advarsel</string> - <string name="error_on_complete_title">Feil</string> <string name="save">Lagre</string> <string name="reserved_value">Reserverte verdier</string> - <string name="downloaded_confirm">Vil du legge til mer data fra QR?</string> - <!--ABOUT--> <string name="about_app">App versjon: %s</string> <string name="about_sdk">SDK versjon: %s</string> @@ -325,169 +203,58 @@ <string name="about_dev">Utviklet og vedlikeholdt av <a href="https://www.dhis2.org/">DHIS2</a>-prosjektet, del av Universitetet i Oslo, <a href="https://www.mn.uio.no/ifi/english/">Institutt for informatikk</a>.</string> <string name="about_contact">For mer informasjon eller spørsmål om denne applikasjonen, vennligst skriv til<a href="mailto:android@dhis2.org">android@dhis2.org</a></string> - <string name="login_error_null_pass">Passord mangler. Vennligst fyll det feltet</string> - <string name="login_error_null_username">Brukernavn mangler. Vennligst fyll inn det feltet.</string> - <string name="login_error_dhis_version">Denne serveren kjører en dhis versjon som er forskjellig fra 2.29. Oppdater din serverversjon eller bruk testmiljøet for å fortsette.</string> - <string name="login_error_dhis_version_v2">Denne serveren kjører en dhis versjon forskjellig fra %s. Oppdater serverversjonen din eller bruk testmiljøet for å fortsette.</string> - <string name="login_error_unsuccessful_response">Noe gikk galt. Vennligst sjekk at server URL, brukernavn og passord er korrekt og prøv igjen.</string> - <string name="login_error_error_response">Serveren kunne ikke fullføre denne forespørselen</string> - <string name="login_error_default">Det har oppstått et problem ved pålogging til serveren.</string> - <string name="login_error">Påloggingsfeil</string> - <string name="missing_mandatory_fields">Obligatoriske felter mangler</string> - <string name="online_search_unexpected">Uventet feil ved søking online</string> - <string name="online_search_parsing_error">Feil under analyse av resultater</string> - <string name="online_search_error">Søk online returnerte en feil</string> - <string name="online_search_response_error">Noe gikk galt på serveren</string> <string name="search_program_not_selected">Velg et program for å aktivere registrering</string> <string name="search_access_error">Du har ikke tilstrekkelig tillatelse</string> - <string name="feature_unavaible">Denne funksjonaliteten er ikke klar ennå.</string> - <string name="relationship_label_error">Feil ved henting av relasjonsetikett</string> <string name="all_tei_type">Alle %s</string> <string name="invalid_phone_number">Dette er ikke et gyldig telefonnummer</string> - <string name="invalid_email">Dette er ikke en gyldig e-post</string> - <string name="invalid_negative_number">Bare negative siffer er tillatt</string> <string name="invalid_possitive_zero">Bare positive siffer eller null er tillatt</string> - <string name="invalid_possitive">Bare positive siffer er tillatt</string> - <string name="invalid_interval">Bare verdier fra 0 til 1 er tillatt</string> - <string name="invalid_percentage">Bare verdier fra 0 til 100 er tillatt</string> - <string name="date_dialog_tigle">Velg datoer for å filtrere</string> <string name="select_option">Velg et alternativ</string> - <string name="issue_reported">Problemer rapportert</string> - <string name="dialog_generate_new_event">Generer en ny hendelse</string> - <string name="message_generate_new_event">Vil du opprette en ny hendelse?</string> <string name="event_completed_title">Hendelser er fullført</string> <string name="event_completed_message">Alle hendelser i dette programmet er fullført. Vil du lukke programmet også?</string> - <string name="complete_enrollment_message">Vil du fullføre registreringen også?</string> <string name="check_event">Sjekk</string> <string name="menu_home">Hjem</string> <string name="appwidget_text">EKSEMPEL</string> - <string name="add_widget">Legg til moduler</string> <string name="showHelp">Vis hjelp</string> - <string name="tuto_settings_1">Synkroniser dine data...</string> - <string name="tuto_settings_2">... din konfigurasjon...</string> - <string name="tuto_settings_3">...sett hvor mange oppføringer som skal lastes ned fra server...</string> - <string name="tuto_settings_reserved">Sjekk og administrer hvor mange reserverte verdier som står igjen</string> - <string name="tuto_settings_errors">Sjekk om tilkobling til serveren mislyktes</string> - <string name="tuto_settings_reset">Frigjør diskplass</string> - <string name="tuto_settings_4">...eller slett alt og start på nytt.</string> - <string name="tuto_search_1_v2">Finn dine forekomster både på din lokale enhet og på onlineserver.</string> - <string name="tuto_search_2">Du kan bytte til andre programmer</string> - <string name="tuto_search_3_v2">Søk eller legg til nye forekomster. Du må søke før du kan legge til en ny!</string> - <string name="tuto_search_4_v2">Klikk her for å tømme feltene og starte et nytt søk.</string> <string name="tuto_dashboard_1">Dette er dashbord for forekomster</string> <string name="tuto_dashboard_2">Se forekomstprofil informasjon...</string> - <string name="tuto_dashboard_3">....Del informasjon via QR eller SMS....</string> - <string name="tuto_dashboard_4">...Eller merk forekomsten for oppfølging</string> - <string name="tuto_dashboard_5">Klikk for å opprette eller planlegge en hendelse eller referer til en annen organisasjonsenhet.</string> <string name="tuto_dashboard_6">Her vil du se alle hendelser. Klikk for å se en hendelsedetalj.</string> <string name="tuto_dashboard_7">Naviger gjennom menyen for å legge til relasjoner, se indikatorer eller skrive notater.</string> - <string name="tuto_dashboard_8">Klikk for å se alle registreringer av din forekomst eller opprett en ny.</string> - <string name="tuto_tei_event_1">Klikk for å slette denne hendelsen. Denne handlingen kan ikke angres.</string> - <string name="tuto_tei_event_2">Fullfør hendelsen.</string> - <string name="tuto_program_event_1">Alle hendelser relatert til dette programmet vil bli opplistet her.</string> - <string name="tuto_program_event_2">Klikk for å legge til ny hendelse</string> <string name="tuto_event_initial_new_1">Fyll inn all data for å opprette hendelsen</string> <string name="tuto_event_initial_1">Klikk for å sjekke status for fullføring av hendelsen.</string> - <string name="tuto_event_summary">Klikk for å fullføre eller gjenåpne en hendelse</string> - <string name="tuto_main_7">Les og lagre informasjon fra andre enheter via QR</string> - <string name="tuto_main_8">Synkroniser dine data med serveren</string> - <string name="tuto_main_9">Blokk sesjon med en 4 sifret kode. Ikke glem koden din!</string> - <string name="tuto_main_10">Logg ut for å endre bruker på server. Du vil kunne logge inn igjen selv om det ikke er noen internettilkobling.</string> - <string name="text_plus_colon">%s:</string> <string name="relationships">relasjoner</string> <string name="empty_tei_add">Det er ingen hendelser registrert, klikk \"+\" for å legge til en ny.</string> - <string name="empty_tei_no_add">Det er ingen hendelser registrert.</string> <string name="qr_data_values">Dataverdier</string> <string name="info">Info</string> <string name="qr_no_id_error">Kunne ikke lese denne ID-en</string> <string name="delete_local_data">Slett lokaldata</string> <string name="dashboard_overview">Oversikt</string> - <string name="dashboard_relationships">Relasjoner</string> - <string name="dashboard_indicators">Indikatorer</string> - <string name="dashboard_analytics">Analyser</string> <string name="empty_indicators">Det er ingen indikatorer for dette programmet.</string> - <string name="dashboard_notes">Notater</string> - <string name="unable_to_complete">Kunne ikke fullføre</string> - <string name="field_errors">Noen felt har feil. Vennligst sjekk dem for å kunne fullføre</string> <string name="unselect_enrollment">Alle registreringer</string> <string name="unselect_enrollment_description">Vis dashbord med alle aktive programmer</string> - <string name="CHECK_SYNC_ERRORS">Åpne synk feillogg</string> <string name="error_dialog_title">Synk feillogg</string> <string name="share_with">Del med...</string> - <string name="errors_during_sync">Din konfigurasjons synk har mislyktes. Det kan være feil på serveren din. Klikk her for mer informasjon.</string> - <string name="sectionSelectorPrev">FORRIGE</string> - <string name="sectionSelectorNext">NESTE</string> - <string name="event_overview">Detaljer</string> - <string name="event_indicators">Indikatorer</string> - <string name="event_notes">Notater</string> - <string name="complete_add_new"><![CDATA[Complete & add new]]></string> - <string name="complete_later">Fullfør senere</string> - <string name="finish_add_new"><![CDATA[Finish & add new]]></string> - <string name="finish">Fullfør</string> - <string name="error_fields_title">Felt som inneholder feil</string> - <string name="error_fields_events">Noen felter inneholder feil. De har ikke blitt lagret. Vennligt, sjekk dem.</string> <string name="unique_warning">Verdien skal være unik, et sammentreff ble funnet. Det har ikke blitt lagret. Vennligst sjekk det.</string> - <string name="unique_coincidence_found">Et sammentreff i et unikt felt ble funnet. Vennligst sjekk skjema for å lagre registrering.</string> <string name="please_wait">Vennligst vent</string> <string name="skip">Hopp over</string> - <string name="reschedule">Planlegg på nytt</string> <string name="no_intructions">Det er ingen informasjon for denne skjermen</string> - <string name="event_overdue">Forfalt</string> - <string name="unsupported_program_rule">Det er ingen programregel som ikke er støttet. Vennligst sjekk dokumentasjonen</string> - <string name="empty_description">Ingen info for dette feltet</string> - <string name="biometrics_dialog_title">Tomme opplysninger</string> - <string name="biometrics_first_use_text">For å kunne logge inn ved bruk av fingerskanner må du først logge inn på standard måte</string> - <string name="biometrics_security_title">Biometrisk sikkerhet</string> - <string name="tab_tables">Tabeller</string> - <string name="table">Tabell</string> - <string name="login_https">https://</string> <string name="delete_local_data_message">Ikke synkroniserte data vil bli bort. Vil du virkelig fortsette?</string> - <string name="local_data_accept">Aksepter</string> <string name="delete_local_data_error">Data kunne ikke slettes. Vennligst prøv på nytt.</string> <string name="delete_local_data_done">Lokal data ble slettet.</string> - <string name="org_unit_selection_warning">Minst en organisasjonsenhet må merkes</string> - <string name="send_user_name_title">Send data</string> - <string name="send_user_name_mesage">Hjelp DHIS2 å forbedre denne appen ved å dele feillogger assosiert med din bruker ID.</string> - <string name="check_mandatory_field">Sjekk felter</string> - <string name="error_no_network_during_sync">Du mistet internettilkoblingen mens du utførte din konfigurasjonssynk. Vennligst prøv igjen senere</string> - <string name="action_agree">Enig</string> - <string name="action_continue">Fortsett</string> - <string name="login_server_info_title">Server URL</string> - <string name="forgot_your_code">Har du glemt koden?</string> - <string name="event_form_end_options_title">Hva vil du gjøre for denne hendelsen?</string> - <string name="sectionSelectorEnd">SLUTT</string> <string name="resource_not_found">%sikke funnet</string> <string name="relationship_not_found_message">Oppføringen du prøver å gå inn på er ikke tilgjengelig. Vil du søke etter den?</string> <string name="sync_by_sms">Synkronisert ved SMS</string> <string name="state_warning">Advarsel</string> <string name="state_relationship">Relasjon</string> - <string name="no_conflicts_message">Det er ingen konflikter for dette programmet</string> - <string name="network_unavailable_sms">Nettverkstilkobling er ikke tilgjengelig, men det ser ut som det er telefonservice - du kan bruke SMS.</string> - <string name="network_unavailable">Internettilkoblingen er ikke tilgjengelig</string> <string name="action_close">Lukk</string> <string name="tuto_main_11">Nå kan du sjekke synk informasjon ved å klikke her.</string> - <string name="no_conflicts_update_message">Denne dataen er lagret kun på din enhet, det er ikke synkronisert med serveren.</string> - <string name="no_conflicts_synced_message">Du er oppdatert! Alle dataene dine er sendt til serveren.</string> <string name="relationship_error_recursive">Du kan ikke relatere en oppføring med seg selv</string> - <string name="unblock_session">Fjern blokkering på sesjonen</string> - <string name="data_set_complete">Fullfør</string> - <string name="data_set_open">Åpne</string> - <string name="unsupported_value_type">Verditypen er ikke støttet</string> <string name="change_calendar_view">Endre kalendervisning</string> - <string name="data_every_fifteen_minutes">15 minutter</string> - <string name="data_every_hour">Hver time</string> - <string name="data_every_day">Daglig</string> - <string name="data_every_week">Ukentlig</string> - <string name="period_week">Uke</string> - <string name="sync_setting">Synkroniseringsinnstillinger: %s</string> <string name="relationship_without_enrollment">Oppføringen du prøver å gå inn på har ingen registrering. Du kan ikke gå til dashbord.</string> <string name="formatting_error">Formateringsfeil</string> <string name="delete_authority_error">Du har ikke autoritet til å slette denne oppføringen</string> - <string name="validation_url">Dette er ikke en gyldig URL</string> <string name="adjusting_form">Justerer fra...</string> - <string name="sms_receiver_number">Mottakernummer</string> <string name="sms_amount_question">Aksepterer du å sende %dmeldinger? </string> <string name="sms_sending">Sending %1$d/%2$d</string> <string name="sms_waiting_amount_confirm">Bekreftelse av ventet mengde - %d</string> @@ -505,51 +272,29 @@ <string name="sms_error_no_gateway_set">Ingen inngangsport satt</string> <string name="sms_error_no_user_login">Bruker er ikke innlogget</string> <string name="sms_error_module_disabled">SMS modul er deaktivert</string> - <string name="sms_error_ongoing_sunmission">Enda en SMS-innsending pågår</string> <string name="sms_metadata_empty">SMS-modul ikke startet, ikke funnet obligatoriske metadata</string> - <string name="sms_completed">Fullført</string> <string name="sms_count_error">SMS-telling ikke akseptert</string> <string name="sms_state_started">SMS innsending er startet</string> <string name="sms_state_converted">Data lest og konvertert. Innsendings ID: %d</string> - <string name="sms_general_error">Feil ved sending av SMS innsending</string> <string name="sms_title_enrollment">SMS TEI registrering og registrering</string> <string name="sms_title_event">SMS hendelseinnsending</string> <string name="sms_title_data_set">SMS datasett innsending</string> - <string name="sms_bar_state_starting">Starter</string> - <string name="sms_bar_state_sending">Pågående</string> - <string name="sms_bar_state_sent">Sendt</string> - <string name="sms_bar_state_failed">Mislyktes</string> - <string name="start_sync_granular">Starter synkronisering.</string> <string name="syncing">Synkroniserer...</string> - <string name="end_sync_granular">Synkroniseringen er fullført.</string> - <string name="error_sync">En feil har oppstått under synkronisering.</string> - <string name="error_sync_check_logs">Det har skjedd en feil under synkroniseringen. Klikk her for å sjekke feillrapport</string> - <string name="cancel_sync">Avbrutt synkronisering.</string> <string name="copied_text">Kopiert</string> - <string name="image_selected">Bilde er valgt</string> - <string name="show_in_map">Vis i kart</string> - <string name="show_list">Vis liste</string> <!--region TRACKER IMPORT CONFLICT MESSAGES--> - <string name="value_required_but_not_provided">%ser obligatorisk men har ikke blitt oppgitt.</string> - <string name="polygon_captured">Polygon oppfanget</string> <string name="polygon">Polygon</string> <!--endregion--> - <string name="fingerprint_title">Fingeravtrykk</string> - <string name="fingerprint_message">Vennligst, plasser fingeren din på fingeravtrykkleseren.</string> <string name="security_title">Sikkerhet</string> <string name="security_rooted_message">Av sikkerhetsgrunner, så er denne versjonen av appen ikke tillatt til å bli brukt i rotenheter. Vennligst bruk treningsversjon.</string> - <string name="fix_error">Det er noen feil. Vennligst fiks dem før du fortsetter.</string> <string name="filters_active">Filtere som brukes</string> <string name="filters_disabled">Ingen filter brukt</string> <string name="filters_title_period">Periode</string> <string name="filters_title_org_unit">Org. Enhet</string> - <string name="filters_title_sorting">Sorterer</string> - <string name="filters_title_status">Status</string> <string name="filters_title_state">Synk</string> <string name="filters_title_assigned">Tildelt til meg</string> <string name="filter_period_today">I dag</string> @@ -564,8 +309,6 @@ <string name="filter_period_form_to">Fra - Til</string> <string name="filter_period_other">Annet</string> <string name="filter_period_any">Når som helst</string> - <string name="data_values_error_sync_message">Synkronisering mislyktes. Sjekk dataverdiene for å prøve å fikse problemet og prøv på nytt. Hvis det fortsatt mislykkes, kontakt din systemadministrator.</string> - <string name="sms_synced_message">Denne data har blitt sent til serveren men det er ikke sikkert den har blitt lagret</string> <string name="filter_event_status_open">Åpne</string> <string name="filter_event_status_schedule">Planlegg</string> <string name="filter_event_status_overdue">Forfalt</string> @@ -581,7 +324,6 @@ <string name="sms_empty_gateway">SMS inngangsport kan ikke være tom</string> <string name="granular_sync_enrollments_empty">Det er ingen registreringer å laste opp</string> <string name="granular_sync_unsupported_task">Denne konverteringsoppgaven er ikke støttet</string> - <string name="disable_pin_locked">Ikke vis igjen, lås skjerm</string> <string name="set_pin">Sett pin</string> <string name="conflict">Konflikt</string> <string name="change_event_date">Endre dato</string> @@ -606,11 +348,7 @@ <string name="choose_ou">Velg organisasjonsenhet</string> <string name="enter_url">Legg inn URL</string> <string name="enter_value">Legg inn verdi</string> - <string name="choose_image">Velg bilde</string> - <string name="scan_code">Skann kode</string> - <string name="choose_option">Velg alternativ</string> <string name="reserved_values_hint">Reserverte verdier lastet ned per TEI attributt</string> - <string name="settings_reserved_values_message">Reserverte verdier lastet ned per TEI attributt</string> <string name="reserved_values_left">%sreserverte verdier igjen</string> <string name="manage_reserved_values_button">Administrer reserverte verdier</string> <string name="events_to_download">Hendelser å laste ned</string> @@ -630,39 +368,19 @@ <string name="filter_sync_not_synced">Ikke synkronisert</string> <string name="filter_sync_error">Synkroniseringsfeil</string> <string name="filter_sync_sms">SMS synkronisert</string> - <string name="dataset_overview">Detaljer</string> - <string name="dataset_comments">Kommentarer</string> <string name="saved">Lagret!</string> - <string name="run_validation_rules">Vil du sjekke datakvaliteten?</string> - <string name="validation_success_title">Alt ser bra ut</string> - <string name="mark_dataset_complete">Vil du også fullføre datasettet?</string> - <string name="dataset_completed">Merk som fullført</string> - <string name="name">Navn</string> - <string name="formula">Formel</string> - <string name="complete_anyway">Fullfør likevel</string> <string name="fk_message">Mangler %s%sfra %s%s</string> <string name="filters_title_event_status">Hendelsesstatus</string> - <string name="enrollment_date">Registreringsdato</string> <string name="dataset_empty_list_can_create">Det er ingen data. Klikk på \"+\" for å legge til en ny oppføring</string> <string name="dataset_emtpy_list_can_not_create">Det er ingen data. Du har ikke tillatelse til å legge til nye oppføringer.</string> <string name="validation_rules_empty_description">Ingen beskrivelse eller instruksjon gitt</string> <string name="validation_rules_data_to_review">Data til gjennomgang</string> - <string name="dataset_saved_completed">Lagret og fullført!</string> <string name="status_change_error_active_exist">Det er allerede en aktiv registrering</string> <string name="enrollment_status_active">Åpne</string> <string name="enrollment_status_completed">Fullfør</string> <string name="enrollment_status_cancelled">Kansellert</string> - <string name="event_data">Data</string> <string name="download_tei_error">Den valgte %s kunne ikke lastes ned</string> - <string name="completed_by">Fullført av %s: %s</string> - <string name="updated_time">Oppdatert: %s</string> - <string name="action_done">Fullfør</string> - <string name="validation_internal_error_datasets">Vi kunne ikke sjekke datakvaliteten. Kontakt administratoren din</string> - <string name="are_you_sure">Er du sikker?</string> - <string name="reopen_question">Vil du åpne datasettet på nytt?</string> <string name="filters_title_date">Dato</string> - <string name="filters_title_event_date">Hendelsesdato</string> - <string name="tei_type_has_no_attributes">%shar ingen offentlige attributter. Velg et program</string> <string name="privacy_policy_title">Personvernregler</string> <string name="open_privacy_policy">Klikk her for å sjekke<a href="">personvernreglene</a> våre</string> <string name="coordinates_error">Koordinatverdiene er ikke gyldige</string> @@ -670,13 +388,7 @@ <string name="security_debugger_message">Av sikkerhetsgrunner, så er denne versjonen av appen ikke tillatt til å bli brukt med adb. Vennligst bruk treningsversjonen.</string> <string name="customactivityoncrash_error_activity_restart_app">Gå tilbake</string> - <string name="customactivityoncrash_error_activity_close_app">Lukk app</string> - <string name="customactivityoncrash_error_activity_error_details">Flere detaljer</string> - <string name="customactivityoncrash_error_activity_error_details_title">Flere detaljer</string> - <string name="customactivityoncrash_error_activity_error_details_close">Lukk</string> <string name="customactivityoncrash_error_activity_error_details_copy">Kopier til utklippstavle</string> - <string name="customactivityoncrash_error_activity_error_details_copied">Kopiert til utklippstavle</string> - <string name="customactivityoncrash_error_activity_error_details_clipboard_label">Informasjon om feil</string> <string name="enrollment_date_edition_warning">Det er planlagte arrangementer som ikke vil bli planlagt på nytt</string> <string name="section_charts">Diagrammer</string> <string name="navigation_list_view">Vis</string> @@ -705,17 +417,9 @@ <string name="filter_period_last_financial_year">Siste regnskapsår</string> <string name="section_feedback">Tilbakemelding</string> <string name="section_indicators">Indikatorer</string> - <string name="value">Verdi</string> - <string name="data_set_quality_check_done">Fullført!</string> <string name="break_glass_dialog_title">Dette programmet er beskyttet</string> - <string name="login_error_bad_credentials">Feil opplysninger</string> - <string name="invalid_integer">Verdien må være et heltall</string> - <string name="dataset_column_default">Verdier</string> - <string name="available">Tilgjengelig</string> - <string name="unknown_date">Ukjent</string> <string name="troubleshooting_language_title">Språk</string> <string name="search_too_many_results">For mange resultat</string> - <string name="search_create_new">Opprett ny</string> <string name="action_ok">Ok</string> <string name="sync_dialog_title_synced">Synkronisert</string> <string name="sync_dialog_title_syncing">Synkroniserer</string> @@ -732,11 +436,14 @@ <string name="program_stage">Programfase</string> <string name="event">hendelse</string> <string name="timeline">Tidslinje</string> - <string name="optional">Valgfri</string> <string name="show_more">Vis mer</string> <string name="show_less">Vis mindre</string> <string name="sync">Synk</string> <string name="show_description">Vis beskrivelse</string> <string name="hide_description">Skjul beskrivelse</string> <string name="transfer">Overfør </string> - </resources> + <plurals name="settings_specific_programs"> + <item quantity="one">Det er %s program med spesifikke innstillinger</item> + <item quantity="other">Det er %s programmer med spesifikke innstillinger</item> + </plurals> +</resources> diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index 2eb92cf551b..4463bcc4e0e 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -1,26 +1,22 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> - <string name="add">थप्नुहोस्</string> <!--PERIOD--> <string name="DAILY">दैनिक</string> <string name="action_accept">स्वीकार</string> <!-- Input hints --> <string name="search">खोज</string> + <!-- Status --> + <string name="event_open">खोल्नुहोस्</string> - <!--Event initial--> - <string name="create">सिर्जना गर्नुहोस्</string> - <string name="date">मिति</string> <string name="cancel">रद्द गर्नुहोस्</string> <string name="wipe_data_ok">स्वीकार</string> <string name="wipe_data_no">रद्द गर्नुहोस्</string> <string name="settingsTwoFAStatus">स्थिती</string> + <!--endregion--> + <!-- SEARCH OPTION SET --> <string name="search_optionset">खोज</string> <string name="period">अबधि</string> - <string name="local_data_accept">स्वीकार</string> - <string name="data_set_open">खोल्नुहोस्</string> - <string name="data_every_day">दैनिक</string> <string name="filters_title_period">अबधि</string> - <string name="filters_title_status">स्थिती</string> <string name="filters_title_assigned">मलाई निर्दिष्ट गरिएको </string> <string name="filter_period_today">आज</string> <string name="filter_period_yesterday">हिजो</string> diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index fcc4441995e..10c26f41b09 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -1,62 +1,26 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!--GENERAL--> <string name="app_name">Dhis2</string> - <string name="logo_text">dhis</string> - <string name="logo_number">2</string> <!-- Warnings and error messages --> <string name="error">Fout</string> - <plurals name="error_message"> - <item quantity="one">Fout</item> - <item quantity="other">Fouten</item> - </plurals> - <string name="error_wrong_server_url">Verkeerde server-URL</string> - <string name="error_wrong_credentials">Verkeerde inloggegevens</string> - <string name="error_unexpected_error">Onverwachte fout</string> - <string name="error_internal_server_error">Interne Server Fout</string> - <string name="no_value">geen waarde</string> <string name="no_reserved_values">Er zijn geen gereserveerde waarden meer. Neem contact op met uw systeembeheerder</string> - <string name="no_reserved_values_connection">Er zijn geen gereserveerde waarden meer. Maak verbinding met het netwerk om ze bij te vullen</string> - <string name="errors">fouten</string> <string name="something_wrong">Er is iets fout gegaan</string> <!-- SyncService strings: --> - <string name="sync_now">Synchroniseer nu</string> - <string name="sync_text">Synchroniseren met server</string> - <string name="sync_title">Nu synchroniseren</string> - <string name="sync_metadata">Metagegevens</string> <string name="sync_events">Gebeurtenissen</string> - <string name="sync_tei">Getraceerde entiteiten</string> - - <string name="sync_complete_title">Afgerond</string> - <string name="sync_complete_text">Synchronisatie voltooid</string> <string name="sync_error_title">Synchronisatiefout</string> <string name="sync_error_text">Er is een fout opgetreden tijdens de synchronisatie. Probeer het opnieuw.</string> <string name="sync_incomplete_error_text">De synchronisatie is voltooid, maar we hebben geen serverbevestiging ontvangen voor alle records. Die gegevens zijn nog steeds gemarkeerd als \"offline\" in de app. We raden aan om de synchronisatie opnieuw te proberen.</string> - <string name="data_sync_warning_program">WAARSCHUWING: de meeste van uw gegevens zijn gesynchroniseerd, maar sommige velden leverden problemen op. Synchroniseer uw configuratie en probeer het opnieuw. Als de waarschuwing aanhoudt, controleer dan hun synchronisatiestatus: programma\'s, TEI\'s en gebeurtenissen met conflicten zijn gemarkeerd als @.</string> - <string name="server_sync_error">Er is een fout opgetreden en de server heeft niet gereageerd. Neem contact op met uw beheerder.</string> - - <string name="search_result_text">%s resultaten gevonden</string> - <string name="add_new">Nieuw toevoegen</string> - <string name="add">Toevoegen</string> - <string name="schedule_new">Nieuw schema</string> <string name="referral">Verwijzing</string> <!-- Login --> - <string name="url_hint">Server-URL</string> - <string name="user_hint">Gebruikersnaam</string> - <string name="password_hint">Wachtwoord</string> - <string name="log_in_button">Log in</string> - <string name="unlock_button">Sessie ontgrendelen</string> <string name="syncing_configuration">Synchroniseer uw configuratie</string> <string name="syncing_data_shortly">Uw gegevens worden binnenkort gesynchroniseerd</string> <string name="syncing_data">synchroniseer uw gegevens </string> <string name="configuration_ready">Uw configuratie is klaar</string> <string name="data_ready">Uw gegevens zijn klaar</string> - <string name="configuration_sync_failed">Configuratiesynchronisatie mislukt</string> - <string name="data_sync_failed">Gegevenssynchronisatie mislukt</string> <string name="account_recovery">Accountherstel</string> - <string name="no_network_to_recover_account">Er is een netwerkverbinding nodig om uw account te herstellen.</string> <!--PERIOD--> <string name="DAILY">Dagelijks</string> @@ -74,127 +38,77 @@ <string name="enter_text">Tekst invoeren</string> <string name="enter_long_text">Voer lange tekst in</string> <string name="enter_number">Voer nummer in</string> - <string name="enter_integer">Voer een geheel getal in</string> <string name="enter_negative_integer">Voer een negatief geheel getal in</string> <string name="enter_positive_integer_or_zero">Voer een positief geheel getal of nul in</string> <string name="enter_positive_integer">Voer een positief geheel getal in</string> - <string name="filter_options">Filter opties</string> <string name="choose_date">Kies datum</string> - <string name="change_calendar">Kalender wijzigen</string> <!-- Status --> - <string name="program_completed">Programma voltooid</string> - <string name="program_inactive">Programma inactief</string> <string name="event_open">Open</string> <string name="event_completed">Evenement voltooid</string> <string name="read_only">Alleen lezen</string> - <string name="finish_and_complete">Afwerken en voltooi</string> <string name="completed">Voltooid</string> <string name="cancelled">Geannuleerd</string> - <string name="activate">Activeren</string> <string name="active">Actief</string> <!-- State --> <string name="state_synced">Synchroniseren</string> <string name="state_to_post">Versturen</string> <string name="state_to_update">Updaten</string> - <string name="state_to_delete">Verwijderen</string> <string name="state_error">Fout</string> - <string name="action_sync">SYNCHRONISEREN</string> - <string name="action_send">VERSTUREN</string> - <string name="action_sync_sms">SYNCHRONISEERDE SMS</string> <!--Completion--> - <string name="completion">Voltooiing</string> <!--Event initial--> - <string name="create">Creëren</string> <string name="update">Bijwerken</string> - <string name="date">Datum</string> <string name="org_unit">Organisatieëenheid</string> <string name="no_org_units">Er zijn geen open organisatie-eenheden voor de geselecteerde datum. Selecteer een andere datum of een andere organisatie-eenheid.</string> - <string name="category_option">Categorie optie</string> <string name="latitude">Breedtegraad</string> <string name="longitude">Lengtegraad</string> - <string name="new_event">Nieuw evenement</string> - <string name="one_time">Een keer</string> - <string name="permanent">permanent</string> <!--DataSet initial--> <string name="report_period">Verslagperiode</string> - <string name="cat_option">Optie computer ondersteund vertalen </string> - <string name="field_required">Als u een waarde instelt, heeft de hele rij alle waarden nodig om de gegevensset te voltooien.</string> - <string name="field_mandatory">Sommige vereiste waarden ontbreken. U moet verplichte waarden instellen om de gegevensset te voltooien.</string> - <string name="field_mandatory_v2">Er ontbreken verplichte velden. Gelieve deze in te vullen om de dataset compleet te maken.</string> - <string name="datavalue_saved">Waarde is opgeslagen!</string> - <string name="there_is_no_available_period">Er zijn geen beschikbare periodes om te selecteren.</string> <!--Event Detail--> <string name="due_date">Deadline</string> <string name="cat_combo">Katten combinatie</string> - <string name="date_default">DD/MM/JJJJ</string> <string name="cancel">Annuleren</string> <string name="delete">Verwijder</string> - <string name="total">Totaal</string> <string name="most_recent_event_date">Datum meest recente evenement</string> <string name="active_programs">Actieve programma\'s</string> - <string name="to_enroll_programs">Programma\'s om in te schrijven</string> <string name="enroll">Inschrijven</string> - <string name="last_visit">Laatste bezoek:</string> - <string name="apply">toepassen</string> <!--TEI DASHBOARD--> - <string name="see_details">Zie de details</string> - <string name="view_more">BEKIJK MEER</string> <string name="edit">Bewerk</string> - <string name="follow_up">Volg op</string> - <string name="follow_up_enabled">Vervolg ingeschakeld</string> - <string name="follow_up_disabled">Opvolging uitgeschakeld</string> <string name="deactivate">Deactiveren</string> <string name="program_not_allow_events">Dit programma staat niet meer evenementen toe</string> <!--DONE TASKS--> - <string name="events_no_data">Geen gegevens</string> <string name="events">evenementen</string> <string name="done_task">Thuis</string> - <string name="app_info">App informatie</string> <string name="log_out">Uitloggen</string> - <string name="block_session">Sessie blokkeren</string> <!-- SYNC --> - <string name="a_minute">1 minuut</string> - <string name="fifteen_minute">15 minuten</string> <string name="thirty_minutes">30 minuten</string> <string name="a_hour">1 uur</string> <string name="every_6_hours">6 uur</string> <string name="a_day">1 dag (standaard)</string> <string name="every_12_hours">12 uur</string> - <string name="Automatic_Sync_Data">Automatische synchronisatiegegevens elke:</string> <string name="Manual">Handmatig</string> - <string name="Automatic_Sync_Metadata">Automatische synchronisatieconfiguratie elke:</string> <string name="a_week">1 week</string> <string name="sync_max_parameters">Huidige synchronisatieparameters:</string> <string name="sync_default_parameters">Resetten naar standaard</string> + <string name="wipe_data_meesage">Database wordt verwijderd.\nU wordt gevraagd opnieuw in te loggen.</string> <string name="wipe_data_ok">Aanvaarden</string> <string name="wipe_data_no">Annuleren</string> <string name="SYNC_DATA">SYNCHRONISATIE gegevens nu</string> <string name="SYNC_META">SYNCHRONISATIE-configuratie nu</string> <string name="SYNC_MANAGER">Instellingen</string> - <string name="last_data_sync_date">Laatste synchronisatie op: %s</string> - <string name="last_metadata_sync_date">Laatste synchronisatie op: %s</string> <string name="refill_reserved_values">Bijvullen</string> - <string name="settings_sms_module_title">SMS-module:</string> <string name="settings_sms_receiver_number">SMS-poort</string> <string name="settings_sms_result_sender_number">SMS resultaat afzender</string> <string name="settings_sms_result_timeout">Time-out sms-resultaat (sec)</string> - <string name="settings_sms_result_timeout_hint">seconden</string> - <string name="settings_sms_result_sender_hint">nummer</string> - <string name="settings_sms_receiver_number_hint">nummer</string> <string name="settings_sms_module_switch">Sms-verzending inschakelen</string> <string name="settings_sms_response_wait_switch">Wacht op de reactie van het sms-resultaat</string> - <plurals name="settings_specific_programs"> - <item quantity="one">Er is een %s-programma met specifieke instellingen</item> - <item quantity="other">Er zijn %s-programma\'s met specifieke instellingen</item> - </plurals> <string name="settings_limit_scope">Instellingen beperkt</string> <string name="settings_limit_globally">Wereldwijd</string> <string name="settings_limit_program">per programma</string> @@ -212,18 +126,13 @@ <string name="settingsErrorLog_descr">Dit logboek bevat alle fouten die zijn veroorzaakt door het synchroniseren van uw gegevens en metagegevens.</string> <string name="settingsDeleteLocalData">Verwijder lokale gegevens</string> <string name="settingsDeleteLocalData_descr">Alle Capture App-gegevens die op uw apparaat zijn opgeslagen, worden verwijderd. Gegevens die niet met de server zijn gesynchroniseerd, gaan verloren.</string> - <string name="settingsReset">Reset app-gegevens &amp;-configuratie</string> - <string name="settingsReset_descr">Uw configuratie en app-gegevens die op het apparaat zijn opgeslagen, worden verwijderd. U wordt gevraagd om opnieuw in te loggen en gegevens die niet met de server zijn gesynchroniseerd, gaan verloren.</string> <string name="settingsSms">SMS-instellingen</string> <string name="settingsSms_descr">Controleer en bewerk parameters met betrekking tot de sms-gateway</string> <string name="settingsCheckVersion">Software-update</string> - <string name="settingsCheckVersionMessage">Software</string> <string name="settingTwoFA">Twee-factor-authenticatie</string> <string name="settingsTwoFAStatus">status</string> <!--endregion--> - <string name="enrollmment_date">Inschrijvingsdatum</string> - <!-- SEARCH OPTION SET --> <string name="search_optionset">Zoek</string> <!--FORM FRAGMENT--> @@ -244,29 +153,15 @@ <string name="tei_coordinates">Coördinaten voor de</string> <!--EVENT SUMMARY--> - <string name="section_list">Sectie lijst</string> - <string name="event_summary_header" formatted="false">%s vragen van %s voltooid</string> - <string name="event_summary_sections_header" formatted="false">%s van %s voltooid</string> - <string name="complete_and_close">Voltooien en afsluiten</string> <!--AGE CUSTOM VIEW--> - <string name="hint_day">Dagen</string> - <string name="hint_month">Maanden</string> - <string name="hint_year">Jaren</string> - <string name="week">Weken</string> <string name="incident_date">Incident datum</string> - <string name="local_results">Lokale resultaten</string> - <string name="online_results">Online resultaten</string> <string name="past_programs">Eerdere programma\'s</string> <!--PERMISSIONS--> <string name="permission_denied">U heeft niet de vereiste rechten om deze actie uit te voeren</string> - <string name="add_relation_button">Toevoegen als…</string> - <string name="date_dialog_clear">Verwijder</string> <string name="period">Periode</string> - <string name="org_unit_filter">(%d) Organisatie-eenheid</string> - <string name="org_unit_select_level">Niveau %d</string> <string name="tuto_main_1">Welkom bij dhis2</string> <string name="tuto_main_2">Hier kunt u uw activiteiten zien</string> <string name="tuto_main_3">U kunt een filter toepassen...</string> @@ -275,16 +170,11 @@ <string name="tuto_main_6">Controleer andere acties in het hoofdmenu</string> <!-- RELATIONSHIPS --> - <string name="default_relationship_label">Relatie creëren</string> <string name="next">Volgende</string> <string name="search_min_num_attr">U moet minimaal %d van de attributen invoeren om een zoekopdracht uit te voeren</string> - <string name="search_attr">U moet ten minste één van de kenmerken invoeren om een zoekopdracht uit te voeren</string> - <string name="search_max_tei_reached">Er zijn meer dan %d resultaten. Vul a.u.b. verdere zoekcriteria in</string> - <string name="search_init">Voer uw zoekcriteria in</string> <!-- QR --> <string name="QR_SCANNER">QR-gegevens importeren</string> - <string name="SAVE">Sla op</string> <string name="button_ok">OK</string> <string name="qr_id">Identificatie</string> <string name="qr_attributes">attributen</string> @@ -296,32 +186,20 @@ <string name="qr_no_data">geen gegevens</string> <string name="qr_error_id">Ongeldige QR-code</string> <string name="qr_error_attr">Dit kenmerk kan niet worden toegevoegd</string> - <string name="qr_error_enrollment">Deze inschrijving kan niet worden toegevoegd</string> <string name="about">Over</string> <string name="programs_to_enroll">Programma\'s om in te schrijven</string> - <string name="select_all">selecteer alles</string> - <string name="clear_all">Verwijder selectie</string> - <string name="empty_program_list">Er is geen informatie voor de geselecteerde filters. Probeer ze te veranderen.</string> <string name="share">Deel</string> <string name="share_qr">QR delen</string> <string name="max">Max</string> <string name="current">Huidig</string> <string name="tei">TEI</string> <string name="teis">TEI\'s</string> - <string name="limit_by_organisation_unit">Beperken per organisatie-eenheid</string> - <string name="limit_by_program">Beperk per programma</string> - <string name="programs_list">Programma lijst</string> <string name="wipe_data">Reset app-gegevens &amp;-configuratie</string> - <string name="add_relationship_error">Het is niet mogelijk om deze relatie toe te voegen</string> <string name="warning_error_on_complete_title">Check dit!</string> - <string name="warning_on_complete_title">Waarschuwing</string> - <string name="error_on_complete_title">Fout</string> <string name="save">Sla op</string> <string name="reserved_value">Gereserveerde waarden</string> - <string name="downloaded_confirm">Wilt u meer gegevens uit QR toevoegen?</string> - <!--ABOUT--> <string name="about_app">App-versie: %s</string> <string name="about_sdk">SDK-versie: %s</string> @@ -332,128 +210,42 @@ <string name="about_dev">Ontwikkeld en onderhouden door het <a href="https://www.dhis2.org/"> DHIS2 </a>-project, onderdeel van de Universiteit van Oslo, <a href="https://www.mn.uio.no/ifi/english/"> afdeling informatica </a>.</string> <string name="about_contact">Voor meer informatie of vragen over deze toepassing kunt u schrijven naar <a href="mailto:android@dhis2.org"> android@dhis2.org </a></string> - <string name="login_error_null_pass">Wachtwoord ontbreekt. Vul dit veld in.</string> - <string name="login_error_null_username">Gebruikersnaam ontbreekt. Vul dit veld in.</string> - <string name="login_error_dhis_version">Deze server draait een andere versie dan 2.29. Werk uw serverversie bij of gebruik de testomgeving om verder te gaan.</string> - <string name="login_error_dhis_version_v2">Deze server draait een andere versie dan %s. Werk uw serverversie bij of gebruik de testomgeving om verder te gaan.</string> - <string name="login_error_unsuccessful_response">Er is iets fout gegaan. Controleer of de server-URL, gebruikersnaam en wachtwoord correct zijn en probeer het opnieuw.</string> - <string name="login_error_error_response">De server kan dit verzoek niet voltooien.</string> - <string name="login_error_default">Er is een probleem opgetreden bij het inloggen op de server.</string> - <string name="login_error">Login fout</string> - <string name="missing_mandatory_fields">Verplichte velden ontbreken</string> - <string name="online_search_unexpected">Onverwachte fout tijdens online zoeken</string> - <string name="online_search_parsing_error">Fout bij het parseren van resultaten</string> - <string name="online_search_error">Online zoeken leverde een fout op</string> - <string name="online_search_response_error">Er is iets misgegaan in de server</string> <string name="search_program_not_selected">Selecteer een programma om inschrijven mogelijk te maken</string> <string name="search_access_error">U heeft niet de vereiste toestemming</string> - <string name="feature_unavaible">Deze functionaliteit is nog niet gereed.</string> - <string name="relationship_label_error">Fout bij ophalen relatielabel</string> <string name="all_tei_type">Alle %s</string> <string name="invalid_phone_number">dit is geen geldig telefoonnummer</string> - <string name="invalid_email">Dit is geen geldig e-mailadres</string> - <string name="invalid_negative_number">Alleen negatieve getallen zijn toegestaan</string> <string name="invalid_possitive_zero">Alleen positieve getallen of nul toegestaan</string> - <string name="invalid_possitive">Alleen positieve getallen zijn toegestaan</string> - <string name="invalid_interval">Alleen waarden van 0 tot 1 zijn toegestaan</string> - <string name="invalid_percentage">Alleen waarden van 0 tot 100 zijn toegestaan</string> - <string name="date_dialog_tigle">Selecteer datums om te filteren</string> <string name="select_option">Selecteer optie</string> - <string name="issue_reported">Probleem gemeld</string> - <string name="dialog_generate_new_event">Nieuw evenement genereren</string> - <string name="message_generate_new_event">Wil je nog een evenement aanmaken?</string> <string name="event_completed_title">Evenementen voltooid</string> <string name="event_completed_message">Alle evenementen in dit programma zijn voltooid. Wilt u het programma ook afsluiten?</string> - <string name="complete_enrollment_message">Wil je de inschrijving ook afronden?</string> <string name="check_event">Controleer</string> <string name="menu_home">Thuis</string> <string name="appwidget_text">VOORBEELD</string> - <string name="add_widget">Widget toevoegen</string> <string name="showHelp">Hulp laten zien</string> - <string name="tuto_settings_1">Synchroniseer uw gegevens...</string> - <string name="tuto_settings_2">...uw configuratie...</string> - <string name="tuto_settings_3">...stel in hoeveel records van de server moeten worden gedownload...</string> - <string name="tuto_settings_reserved">Controleer en beheer hoeveel gereserveerde waarden er nog over zijn</string> - <string name="tuto_settings_errors">Controleer of een verbinding met de server is mislukt</string> - <string name="tuto_settings_reset">Maak wat schijfruimte vrij</string> - <string name="tuto_settings_4">…of verwijder alles om opnieuw te beginnen.</string> - <string name="tuto_search_1_v2">Vind uw entiteiten zowel op uw lokale apparaat als op de online server.</string> - <string name="tuto_search_2">U kunt overschakelen naar andere programma\'s</string> - <string name="tuto_search_3_v2">Zoek of voeg nieuwe entiteiten toe. U moet zoeken voordat u een nieuwe kunt toevoegen!</string> - <string name="tuto_search_4_v2">Klik hier om de velden op te schonen en de zoekopdracht opnieuw te starten.</string> <string name="tuto_dashboard_1">Dit is het entiteitsdashboard</string> <string name="tuto_dashboard_2">Profielgegevens van entiteiten bekijken...</string> - <string name="tuto_dashboard_3">…Deel informatie via QR of SMS…</string> - <string name="tuto_dashboard_4">…Of markeer de entiteit voor opvolging</string> - <string name="tuto_dashboard_5">Klik om een evenement te maken of te plannen of om naar een andere organisatie-eenheid te verwijzen.</string> <string name="tuto_dashboard_6">Hier zie je alle evenementen. Klik om een gebeurtenisdetail te zien.</string> <string name="tuto_dashboard_7">Navigeer door het menu om relaties toe te voegen, indicatoren te zien of notities te schrijven.</string> - <string name="tuto_dashboard_8">Klik om alle inschrijvingen van uw entiteit te zien of maak een nieuwe aan.</string> - <string name="tuto_tei_event_1">Klik om dit evenement te verwijderen. Deze actie kan niet ongedaan gemaakt worden.</string> - <string name="tuto_tei_event_2">Voltooi het evenement.</string> - <string name="tuto_program_event_1">Alle evenementen gerelateerd aan dit programma worden hier vermeld.</string> - <string name="tuto_program_event_2">Klik om een nieuw evenement toe te voegen</string> <string name="tuto_event_initial_new_1">Voer alle gegevens in om het evenement aan te maken</string> <string name="tuto_event_initial_1">Klik om de voltooiingsstatus van het evenement te controleren.</string> - <string name="tuto_event_summary">Klik om een evenement te voltooien of opnieuw te openen</string> - <string name="tuto_main_7">Lees en bewaar informatie van andere apparaten via QR</string> - <string name="tuto_main_8">Synchroniseer uw gegevens met de server</string> - <string name="tuto_main_9">Blokkeer sessie met een 4-cijferige code. Vergeet je code niet!</string> - <string name="tuto_main_10">Log uit om gebruiker of server te wijzigen. U kunt opnieuw inloggen, ook als er geen internetverbinding is.</string> - <string name="text_plus_colon">%s:</string> <string name="relationships">relaties</string> <string name="empty_tei_add">Er zijn geen evenementen geregistreerd, klik op \"+\" om een nieuwe toe te voegen.</string> - <string name="empty_tei_no_add">Er zijn geen evenementen geregistreerd.</string> <string name="qr_data_values">Gegevens waarden</string> <string name="info">Info</string> <string name="qr_no_id_error">Kan dit ID niet lezen</string> <string name="delete_local_data">Verwijder lokale gegevens</string> <string name="dashboard_overview">Overzicht</string> - <string name="dashboard_relationships">Relaties</string> - <string name="dashboard_indicators">Indicatoren</string> - <string name="dashboard_analytics">Analyse</string> <string name="empty_indicators">Er zijn geen indicatoren voor dit programma.</string> - <string name="dashboard_notes">Notities</string> - <string name="unable_to_complete">Kan niet voltooien</string> - <string name="unable_to_save">Kan niet opslaan</string> - <string name="warnings_in_form">Er staan waarschuwingen in het formulier</string> - <string name="what_to_do">Wat wil je doen?</string> - <string name="field_errors">Sommige velden bevatten fouten. Controleer ze alstublieft om ze te kunnen voltooien</string> <string name="unselect_enrollment">Alle inschrijvingen</string> <string name="unselect_enrollment_description">Toon dashboard met alle actieve programma\'s</string> - <string name="CHECK_SYNC_ERRORS">Open logboek met synchronisatiefouten</string> <string name="error_dialog_title">Fout logboek synchroniseren</string> <string name="share_with">Delen met...</string> - <string name="errors_during_sync">Uw configuratiesynchronisatie is mislukt. Er kunnen fouten in uw server zitten. Klik hier voor meer informatie.</string> - <string name="sectionSelectorPrev">VORIGE</string> - <string name="sectionSelectorNext">VOLGENDE</string> - <string name="event_overview">Details</string> - <string name="event_indicators">Indicatoren</string> - <string name="event_notes">Notities</string> - <string name="complete_add_new"> <![CDATA[Voltooi en voeg nieuwe toe]]></string> - <string name="complete_later">Voltooi later</string> - <string name="finish_add_new"> <![CDATA[maak af & voeg nieuwe toe]]></string> - <string name="finish">Finish</string> - <string name="error_fields_title">Velden met fouten</string> - <string name="error_fields_events">Sommige velden bevatten fouten. Ze zijn niet opgeslagen. Controleer ze alsjeblieft.</string> <string name="unique_warning">De waarde moet uniek zijn, er is een toeval gevonden. Het is niet opgeslagen. Controleer het alstublieft.</string> - <string name="unique_coincidence_found">Er is een toeval gevonden in een uniek veld. Controleer het formulier om de inschrijving op te slaan.</string> <string name="please_wait">Even geduld alstublieft</string> <string name="skip">Overslaan</string> - <string name="reschedule">Opnieuw plannen</string> <string name="no_intructions">Er is geen informatie voor dit scherm</string> - <string name="event_overdue">Verlopen</string> - <string name="unsupported_program_rule">Er is één programmaregel die niet wordt ondersteund. Controleer de documentatie</string> - <string name="empty_description">Geen info voor dit veld</string> - <string name="biometrics_dialog_title">Lege inloggegevens</string> - <string name="biometrics_first_use_text">Om in te kunnen loggen met de vingerafdrukscanner moet je eerst de standaardmanier gebruiken</string> - <string name="biometrics_security_title">Biometrische beveiliging</string> - <string name="tab_tables">Tafels</string> - <string name="table">Tafel</string> - <string name="login_https">https://</string> <string name="delete_local_data_message">Niet-gesynchroniseerde gegevens gaan verloren. Wil je echt doorgaan?</string> - <string name="local_data_accept">Aanvaarden</string> <string name="delete_local_data_error">Gegevens konden niet worden verwijderd. Probeer het opnieuw.</string> <string name="delete_local_data_done">Verwijderen van lokale gegevens is voltooid.</string> <string name="org_unit_selection_warning">Er moet ten minste één organisatie-eenheid worden geselecteerd</string> @@ -466,6 +258,7 @@ <string name="action_agree">Mee eens zijn</string> <string name="action_continue">Doorgaan</string> <string name="login_server_info_title">Server-URL</string> + <string name="login_server_info_message">Voer de DHIS 2-server-URL voor uw organisatie in zoals verstrekt door uw systeembeheerder.\n\nU kunt ook een QR-code scannen met de URL van uw server</string> <string name="forgot_your_code">Ben je je code vergeten?</string> <string name="event_form_end_options_title">Wat zou je willen doen voor dit evenement?</string> <string name="sectionSelectorEnd">EINDE</string> @@ -476,33 +269,16 @@ <string name="state_uploading">Uploaden</string> <string name="state_relationship">Relatie</string> <string name="sent_by_sms">Per sms verzonden</string> - <string name="no_conflicts_message">Er zijn geen conflicten voor dit programma</string> - <string name="network_unavailable_sms">Netwerkverbinding is niet beschikbaar, maar het lijkt erop dat er telefoondiensten zijn - u kunt sms gebruiken.</string> - <string name="network_unavailable">Netwerkverbinding is niet beschikbaar.</string> <string name="action_close">Sluit</string> <string name="tuto_main_11">Nu kunt u de synchronisatie-informatie controleren door hier te klikken</string> - <string name="no_conflicts_update_message">Deze gegevens worden alleen op uw apparaat opgeslagen, ze worden niet met de server gesynchroniseerd.</string> - <string name="no_conflicts_synced_message">Je bent up-to-date! Al uw gegevens worden naar de server gestuurd.</string> <string name="relationship_error_recursive">U kunt een record niet met zichzelf in verband brengen</string> - <string name="unblock_session">Sessie deblokkeren</string> - <string name="data_set_complete">Compleet</string> - <string name="data_set_open">Open</string> - <string name="unsupported_value_type">Niet-ondersteund waardetype</string> <string name="change_calendar_view">Agendaweergave wijzigen</string> - <string name="data_every_fifteen_minutes">15 minuten</string> - <string name="data_every_hour">Elk uur</string> - <string name="data_every_day">Dagelijks</string> - <string name="data_every_week">Wekelijks</string> - <string name="period_week">Week</string> - <string name="sync_setting">Synchronisatie-instelling: %s</string> <string name="relationship_without_enrollment">Het record dat u probeert te openen heeft geen inschrijving. U heeft geen toegang tot het dashboard.</string> <string name="formatting_error">Formatteringsfout</string> <string name="dashboard_menu_delete_tei_v2">Verwijder %s</string> <string name="delete_authority_error">U bent niet bevoegd om dit record te verwijderen</string> - <string name="validation_url">Dit is geen geldige URL</string> <string name="adjusting_form">Formulier aanpassen…</string> - <string name="sms_receiver_number">Ontvanger nummer</string> <string name="sms_amount_question">Accepteert u het verzenden van %d-berichten?</string> <string name="sms_sending">Verzenden van %1$d/%2$d</string> <string name="sms_waiting_amount_confirm">Bevestiging wachtend bedrag - %d</string> @@ -520,51 +296,29 @@ <string name="sms_error_no_gateway_set">Geen gateway ingesteld</string> <string name="sms_error_no_user_login">Gebruiker niet ingelogd</string> <string name="sms_error_module_disabled">SMS-module is uitgeschakeld</string> - <string name="sms_error_ongoing_sunmission">Er is nog een SMS-inzending aan de gang</string> <string name="sms_metadata_empty">SMS-module niet gestart, vereiste metadata niet gevonden</string> - <string name="sms_completed">Voltooid</string> <string name="sms_count_error">Aantal sms\'jes niet geaccepteerd</string> <string name="sms_state_started">Sms-verzending gestart</string> <string name="sms_state_converted">Gegevens gelezen en geconverteerd. Inzendings-ID: %d</string> - <string name="sms_general_error">Fout bij verzenden van sms-inzending</string> <string name="sms_title_enrollment">SMS TEI registratie en inschrijving</string> <string name="sms_title_event">Sms-gebeurtenis indienen</string> <string name="sms_title_data_set">Indiening van een sms-gegevensset</string> - <string name="sms_bar_state_starting">Beginnend</string> - <string name="sms_bar_state_sending">Bezig</string> - <string name="sms_bar_state_sent">Verstuurd</string> - <string name="sms_bar_state_failed">Mislukt</string> - <string name="start_sync_granular">Synchronisatie starten.</string> <string name="syncing">Synchroniseren...</string> - <string name="end_sync_granular">Synchronisatie voltooid.</string> - <string name="error_sync">Er is een fout opgetreden tijdens de synchronisatie.</string> - <string name="error_sync_check_logs">Er is een fout opgetreden tijdens de synchronisatie. Klik hier om foutlogboeken te controleren</string> - <string name="cancel_sync">Geannuleerde synchronisatie.</string> <string name="copied_text">Gekopieerd</string> - <string name="image_selected">Afbeelding geselecteerd</string> - <string name="show_in_map">Toon op kaart</string> - <string name="show_list">Toon lijst</string> <!--region TRACKER IMPORT CONFLICT MESSAGES--> - <string name="value_required_but_not_provided">%s is verplicht maar is niet verstrekt.</string> - <string name="polygon_captured">Polygoon vastgelegd</string> <string name="polygon">Veelhoek</string> <!--endregion--> - <string name="fingerprint_title">Vingerafdruk</string> - <string name="fingerprint_message">Steek alstublieft uw vinger in uw vingerafdruklezer.</string> <string name="security_title">Beveiliging</string> <string name="security_rooted_message">Om veiligheidsredenen mag deze versie van de app niet worden gebruikt op geroote apparaten. Gebruik de trainingsversie.</string> - <string name="fix_error">Er zijn enkele fouten. Corrigeer ze alstublieft voordat u verder gaat.</string> <string name="filters_active">Filters van toepassing</string> <string name="filters_disabled">Geen filters toegepast</string> <string name="filters_title_period">Periode</string> <string name="filters_title_org_unit">Org. Eenheid</string> - <string name="filters_title_sorting">Sorteren</string> - <string name="filters_title_status">status</string> <string name="filters_title_state">Synchroniseren</string> <string name="filters_title_assigned">Toegewezen aan mij</string> <string name="filter_period_today">Vandaag</string> @@ -579,8 +333,6 @@ <string name="filter_period_form_to">Van - naar</string> <string name="filter_period_other">Anders</string> <string name="filter_period_any">Altijd</string> - <string name="data_values_error_sync_message">Synchronisatie mislukt. Synchronisatie mislukt. Controleer de gegevenswaarden om te proberen het probleem op te lossen en probeer het opnieuw. Neem contact op met uw systeembeheerder als het blijft mislukken</string> - <string name="sms_synced_message">Deze gegevens zijn naar de server verzonden, maar het is niet gegarandeerd dat ze zijn opgeslagen</string> <string name="filter_event_status_open">Open</string> <string name="filter_event_status_schedule">Schema</string> <string name="filter_event_status_overdue">Verlopen</string> @@ -596,7 +348,6 @@ <string name="sms_empty_gateway">SMS-gateway mag niet leeg zijn</string> <string name="granular_sync_enrollments_empty">Er zijn geen inschrijvingen om te uploaden</string> <string name="granular_sync_unsupported_task">Deze convertTask wordt niet ondersteund</string> - <string name="disable_pin_locked">Vergrendelscherm niet meer weergeven</string> <string name="set_pin">Speld instellen</string> <string name="conflict">Conflict</string> <string name="change_event_date">Verander de datum</string> @@ -621,11 +372,7 @@ <string name="choose_ou">Kies organisatie-eenheid</string> <string name="enter_url">URL invoeren</string> <string name="enter_value">Voer waarde in</string> - <string name="choose_image">Kies afbeelding</string> - <string name="scan_code">Scancode</string> - <string name="choose_option">Kies optie</string> <string name="reserved_values_hint">Gereserveerde waarden gedownload per TEI-attribuut</string> - <string name="settings_reserved_values_message">Gereserveerde waarden gedownload per TEI-attribuut</string> <string name="reserved_values_left">%s gereserveerde waarden over</string> <string name="manage_reserved_values_button">Beheer gereserveerde waarden</string> <string name="events_to_download">Evenementen om te downloaden</string> @@ -645,55 +392,29 @@ <string name="filter_sync_not_synced">Niet gesynchroniseerd</string> <string name="filter_sync_error">Synchronisatiefout</string> <string name="filter_sync_sms">SMS gesynchroniseerd</string> - <string name="dataset_overview">Details</string> - <string name="dataset_comments">Opmerkingen</string> <string name="saved">Opgeslagen!</string> - <string name="run_validation_rules">Wilt u de datakwaliteit controleren?</string> - <string name="validation_success_title">Alles ziet er goed uit!</string> - <string name="mark_dataset_complete">Wil je ook de dataset compleet maken?</string> - <string name="dataset_completed">Markeer als voltooid</string> - <string name="name">Naam</string> - <string name="formula">Formule</string> - <string name="complete_anyway">In ieder geval compleet</string> <string name="fk_message">Ontbrekende %s %s van %s %s</string> <string name="filters_title_event_status">Gebeurtenisstatus</string> - <string name="enrollment_date">Inschrijvingsdatum</string> <string name="dataset_empty_list_can_create">Er zijn geen gegevens. Klik op \"+\" om een nieuw record toe te voegen</string> <string name="dataset_emtpy_list_can_not_create">Er zijn geen gegevens. U heeft geen rechten om nieuwe records toe te voegen.</string> <string name="validation_rules_empty_description">Geen beschrijving of instructie verstrekt</string> <string name="validation_rules_data_to_review">Gegevens om te bekijken</string> - <string name="dataset_saved_completed">Opgeslagen en voltooid!</string> <string name="status_change_error_active_exist">Er is al een actieve inschrijving</string> <string name="enrollment_status_active">Open</string> <string name="enrollment_status_completed">Compleet</string> <string name="enrollment_status_cancelled">Geannuleerd</string> - <string name="event_data">Gegevens</string> <string name="download_tei_error">De geselecteerde %s kon niet worden gedownload.</string> - <string name="completed_by">Aangevuld door %s: %s</string> - <string name="updated_time">Bijgewerkt: %s</string> - <string name="action_done">Klaar</string> - <string name="validation_internal_error_datasets">We konden de gegevenskwaliteit niet controleren. Neem contact op met uw beheerder</string> - <string name="are_you_sure">Weet je het zeker?</string> - <string name="reopen_question">Wilt u de dataset opnieuw openen?</string> <string name="filters_title_date">Datum</string> - <string name="filters_title_event_date">Evenement datum</string> - <string name="tei_type_has_no_attributes">%s heeft geen openbare attributen. Selecteer een programma</string> <string name="privacy_policy_title">Privacybeleid</string> <string name="open_privacy_policy">Klik hier om ons privacybeleid <a href=""> te bekijken </a></string> <string name="coordinates_error">Coördinatenwaarden zijn niet geldig</string> + <string name="break_glass_error_v2">U kunt een %s van andere organisatie-eenheden niet inschrijven in dit programma omdat deze beveiligd is.\nNeem contact op met uw beheerder.</string> <string name="field_is_mandatory">Dit veld is verplicht</string> <string name="security_debugger_message">Om veiligheidsredenen mag deze versie van de app niet worden gebruikt met adb. Gebruik de trainingsversie.</string> <string name="customactivityoncrash_error_activity_restart_app">Ga terug</string> - <string name="customactivityoncrash_error_activity_close_app">App sluiten</string> - <string name="customactivityoncrash_error_activity_error_details">Meer details</string> - <string name="customactivityoncrash_error_activity_error_details_title">Meer details</string> - <string name="customactivityoncrash_error_activity_error_details_close">Sluit</string> <string name="customactivityoncrash_error_activity_error_details_copy">Kopieer naar klembord</string> - <string name="customactivityoncrash_error_activity_error_details_copied">Gekopieerd naar het klembord</string> - <string name="customactivityoncrash_error_activity_error_details_clipboard_label">Fout informatie</string> <string name="metada_first_sync_error">We hebben een fout gevonden bij het synchroniseren met uw server. Deel de fout indien mogelijk met uw systeembeheerder.</string> - <string name="error_init_session">We kunnen de sessie met uw gebruiker niet starten</string> <string name="enrollment_date_edition_warning">Er zijn geplande evenementen die niet opnieuw worden gepland</string> <string name="section_charts">Grafieken</string> <string name="navigation_list_view">Lijst</string> @@ -741,46 +462,27 @@ <string name="section_feedback">Feedback</string> <string name="section_indicators">Indicatoren</string> <string name="value">Waarde</string> + <string name="camera_permission_denied">Cameratoestemming is geweigerd.\Je moet deze inschakelen om deze functie te gebruiken.</string> <string name="section_charts_indicators">Grafieken en indicatoren</string> <string name="take_photo">Neem foto</string> - <string name="from_gallery">Kies uit gallerij</string> - <string name="data_set_quality_check_done">Klaar!</string> <string name="break_glass_dialog_title">Dit programma is beveiligd</string> <string name="break_glass_hint">Omschrijf hier de reden</string> - <string name="authenticating">Verificatie</string> - <string name="login_error_no_dhis_instance">De opgegeven server-URL is geen dhis-instantie</string> - <string name="login_error_bad_credentials">Verkeerde inloggegevens</string> - <string name="login_error_unknown_host">Onbekende server</string> - <string name="invalid_integer">Waarde moet een geheel getal zijn</string> <string name="openid_session_expired">De sessie is verlopen</string> <string name="openid_session_expired_message">Uw huidige sessie is verlopen. Om veiligheidsredenen moet u uw inloggegevens opnieuw opgeven</string> - <string name="dataset_column_default">Waarden</string> <string name="week_period_span_default_label">Week %d %s tot %s</string> <string name="action_do_not_show_again">Niet meer laten zien</string> <string name="feature_configuration">Functieconfiguratie</string> <string name="show_radar_graph">Weergeven als radar</string> - <string name="coordinate_feature_type_error">Kan coördinaattype niet instellen</string> <string name="filter_follow_up_label">Gevolgd %s</string> - <string name="wrong_date_format">%s kan niet worden verwerkt als een datum</string> <string name="update_field_error">Dit veld kan niet worden bijgewerkt. Probeer het opnieuw</string> - <string name="edition">Editie</string> - <string name="available">Beschikbaar</string> <string name="blocked_by_completion">Deze gegevens kunnen niet worden bewerkt omdat ze als voltooid zijn gemarkeerd</string> <string name="edition_expired">Deze gegevens kunnen niet worden bewerkt omdat de bewerkingstijd is verstreken</string> <string name="edition_no_write_access">U heeft geen toestemming om deze gegevens te bewerken</string> <string name="event_date_not_in_orgunit_range">Deze gegevens zijn niet bewerkbaar omdat de organisatie-eenheid gesloten is</string> <string name="edition_no_catcombo_access">U heeft geen toestemming om deze gegevens te bewerken</string> - <string name="edition_orgunit_capture_scope">U kunt gegevens van deze organisatie-eenheid niet bewerken</string> - <string name="reload_list">Zoeken resetten</string> + <string name="edition_orgunit_user_scope">U kunt gegevens van deze organisatie-eenheid niet bewerken</string> <string name="error_tei_online_search_title">De online zoekopdracht leverde het volgende bericht op:</string> - <string name="program_rules_loop_warning_title">Waarschuwing programmaregels</string> - <string name="program_rules_loop_warning_message">Er is een configuratieprobleem dat een lus in de regels veroorzaakt. Neem contact op met uw beheerder.</string> - <string name="granular_sync_refresh">VERFRISSEN</string> - <string name="unknown_date">Onbekend</string> - <string name="granular_sync_refresh_title">Ververs alle gegevens</string> - <string name="max_accounts_text">U heeft het maximale aantal accounts bereikt (%d). Om een nieuw account toe te voegen, logt u in en verwijdert u een van uw accounts</string> <string name="delete_account">Account verwijderen</string> - <string name="manage_accounts">Accounts beheren</string> <string name="main_menu_troubleshooting">Problemen met configuratie oplossen</string> <string name="troubleshooting_language_title">Taal</string> <string name="troubleshooting_language_description">Tik hier om de taal van de applicatie te wijzigen</string> @@ -798,13 +500,12 @@ <string name="search_no_results">Er zijn geen resultaten voor deze zoekopdracht</string> <string name="search_too_many_results">Te veel resultaten</string> <string name="search_too_many_results_message">Probeer uw zoekopdracht te wijzigen om de resultaten te verfijnen.</string> - <string name="search_create_new">Maak nieuw</string> - <string name="search_min_attributes_message">Het is noodzakelijk om minimaal %s attributen in te voeren om te zoeken</string> <string name="action_ok">OK</string> <string name="init_search">Start een zoekopdracht om een %s</string> <string name="search_or_create">U kunt zoeken of een nieuwe creëren %s</string> <string name="event_can_be_completed">Wilt u dit formulier als voltooid markeren?</string> <string name="changes_will_be_discarted">Als u nu afsluit, worden de wijzigingen verwijderd.</string> + <string name="event_error_on_complete">U heeft een aantal foutmeldingen.\nWilt u deze bekijken?</string> <string name="re_opened">heropend</string> <string name="account_disable_title">Account ongebruikelijk gemaakt</string> <string name="account_disable_message">Uw account is uitgeschakeld door een beheerder.</string> @@ -814,27 +515,10 @@ <string name="customactivityoncrash_error_activity_current_date">Huidige datum: %s</string> <string name="customactivityoncrash_error_activity_device">Apparaat: %s</string> <string name="customactivityoncrash_error_activity_os_version">OS-versie: %s</string> - <string name="open_details">Open %s-gegevens</string> - <string name="tracked_entity_type_details">%s gegevens</string> <string name="syncing_resource">%s synchroniseren...</string> - <string name="sms_sync_waiting_for_response">SMS verzonden. Wachten op reactie van de server.</string> - <string name="sms_sync_sms_reached_server">SMS bevestigd om de server te bereiken. Status bijwerken</string> - <string name="sms_sync_sms_reached_server_error">We kunnen niet bevestigen dat de sms de server heeft bereikt. Status bijwerken</string> - <string name="sms_sync_sent">SMS verzonden. Status bijwerken.</string> - <string name="sms_sync_not_sent">Sms niet verzonden.</string> - <string name="sms_sync_opening_app">SMS-app openen. Wijzig het bericht alstublieft niet.</string> <string name="sms_sync_sms_app_chooser_title">Sms\'en met</string> <string name="sms_sync_is_sms_sent">Heb je de sms gestuurd?</string> - <string name="sms_sync_manual_confirmation">In afwachting van handmatige bevestiging</string> - <string name="syncing_events">Evenementen synchroniseren</string> - <string name="syncing_teis">Bijgehouden entiteiten synchroniseren</string> - <string name="syncing_data_sets">Gegevenssets synchroniseren</string> - <string name="syncing_resources">Bronnen synchroniseren</string> - <string name="syncing_done">Synchronisatie voltooid</string> - <string name="sms_available_for_individual_records">SMS-synchronisatie is beschikbaar, maar moet voor elk afzonderlijk record worden geopend</string> <string name="downloading_image_resources">Afbeeldingen downloaden...</string> - <string name="program_description">Programma beschrijving</string> - <string name="wrong_pin">Verkeerde speld</string> <string name="sync_dialog_title_not_synced">Synchronisatie nodig</string> <string name="sync_dialog_title_error">Synchronisatiefout</string> <string name="sync_dialog_title_synced">Gesynchroniseerd</string> @@ -852,19 +536,10 @@ <string name="sync_dialog_action_refresh">Vernieuwen</string> <string name="sync_dialog_action_not_now">Niet nu</string> <string name="tap_to_explore_action">Tik hier om te verkennen</string> - <plurals name="error_count_label"> - <item quantity="one">%s-fout</item> - <item quantity="other">%s fouten</item> - </plurals> - <plurals name="warning_count_label"> - <item quantity="one">%s waarschuwing</item> - <item quantity="other">%s waarschuwingen</item> - </plurals> <string name="software_update">Software-update</string> <string name="remind_me_later">Later</string> <string name="download_now">Download nu</string> <string name="check_for_updates">Controleer op updates</string> - <string name="checking_for_updates">Controleren op updates</string> <string name="no_updates">Er zijn geen nieuwe updates</string> <string name="app_version">App versie</string> <string name="error_applying_rule_effects">Er is iets misgegaan met de programmaconfiguratie, we kunnen dit evenement niet laden. Neem contact op met uw systeembeheerder.</string> @@ -887,4 +562,18 @@ <string name="syncing_something">%s synchroniseren...</string> <string name="show_description">Laat beschrijving zien</string> <string name="hide_description">Beschrijving verbergen</string> - </resources> + <plurals name="error_count_label"> + <item quantity="one">%s-fout</item> + <item quantity="other">%s fouten</item> + </plurals> + + <plurals name="warning_count_label"> + <item quantity="one">%s waarschuwing</item> + <item quantity="other">%s waarschuwingen</item> + </plurals> + + <plurals name="settings_specific_programs"> + <item quantity="one">Er is een %s-programma met specifieke instellingen</item> + <item quantity="other">Er zijn %s-programma\'s met specifieke instellingen</item> + </plurals> +</resources> diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index ce483c05713..d9689d0b17a 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -6,28 +6,23 @@ <string name="enter_positive_integer_or_zero">ଧନାତ୍ମକ ପୂର୍ଣ୍ଣସଂଖ୍ୟା କିମ୍ବା ଶୂନ ପ୍ରବେଶ କରନ୍ତୁ</string> <string name="enter_positive_integer">ଧନାତ୍ମକ ପୂର୍ଣ୍ଣସଂଖ୍ୟା ପ୍ରବେଶ କରନ୍ତୁ</string> <string name="choose_date">ତାରିଖ ବାଛନ୍ତୁ</string> + <string name="latitude">ଅକ୍ଷାଂଶ</string> <string name="longitude">ଦ୍ରାଘିମା</string> + <string name="done_task">ଗୃହ</string> - <string name="app_info">ଆପ୍ ସୂଚନା</string> <!-- SYNC --> - <string name="a_minute">୧ ମିନିଟ୍</string> - <string name="fifteen_minute">୧୫ ମିନିଟ୍</string> <string name="thirty_minutes">୩୦ ମିନିଟ୍</string> <string name="a_hour">୧ ଘଣ୍ଟା</string> <string name="every_6_hours">୬ଘ</string> <string name="a_day">୧ ଦିନ (ଡିଫଲ୍ଟ)</string> <string name="every_12_hours">୧୨ଘ</string> <string name="a_week">୧ ସପ୍ତାହ</string> - <string name="invalid_negative_number">କେବଳ ଋଣାତ୍ମକ ସଂଖ୍ୟା ଅନୁମୋଦିତ</string> <string name="invalid_possitive_zero">କେବଳ ଧନାତ୍ମକ ସଂଖ୍ୟା କିମ୍ବା ଶୂନ ଅନୁମୋଦିତ</string> - <string name="invalid_possitive">କେବଳ ଧନାତ୍ମକ ସଂଖ୍ୟା ଅନୁମୋଦିତ</string> <string name="menu_home">ଗୃହ</string> <string name="info">ସୂଚନା</string> - <string name="event_overview">ବିବରଣୀ</string> - <string name="data_every_week">ସାପ୍ତାହିକ</string> + <!--region TRACKER IMPORT CONFLICT MESSAGES--> <string name="polygon">ବହୁଭୂଜ</string> - <string name="filters_title_sorting">ସଜାଣି</string> <string name="filter_period_today">ଆଜି</string> <string name="filter_period_yesterday">ଗତକାଲି</string> <string name="filter_period_tomorrow">ଆସନ୍ତାକାଲି</string> @@ -37,8 +32,6 @@ <string name="filter_period_last_month">ଗତ ମାସ</string> <string name="interval_now">ଏବେ</string> <string name="interval_yesterday">ଗତକାଲି</string> - <string name="dataset_overview">ବିବରଣୀ</string> - <string name="action_done">ହୋଇଗଲା</string> <string name="navigation_tei_data">ବିବରଣୀ</string> <string name="section_feedback">ମତାମତ</string> </resources> diff --git a/app/src/main/res/values-prs/strings.xml b/app/src/main/res/values-prs/strings.xml index 843fcc035be..7a00ed0a423 100644 --- a/app/src/main/res/values-prs/strings.xml +++ b/app/src/main/res/values-prs/strings.xml @@ -1,15 +1,14 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!-- Warnings and error messages --> <string name="error">خطا</string> + <!-- SyncService strings: --> + <string name="sync_events">پېښې</string> - <string name="add_new">اضافه کردن تجدید</string> - <string name="add">افزودن</string> - <string name="schedule_new">تقسیم اوقات جدید</string> + <string name="referral">مراجعه</string> - <string name="user_hint">نام کاربر</string> - <string name="password_hint">کلید رمز</string> <string name="account_recovery">بهبود حساب</string> + <!--PERIOD--> <string name="DAILY">روزنه</string> <string name="WEEKLY">هفته وار</string> @@ -19,36 +18,36 @@ <string name="action_share_zero_items">اشتراک</string> <!-- Input hints --> <string name="search">جستجو</string> + <!-- Status --> + <string name="event_open">باز کردن</string> <string name="read_only">تنها قابل مطالعه میباشد</string> <string name="completed">تکمیل شد</string> - <string name="activate">فعال</string> <string name="active">فعال</string> <string name="state_error">خطا</string> + + <!--Completion--> + <!--Event initial--> - <string name="create">ایجاد</string> <string name="update">تجدید</string> - <string name="date">تاریخ</string> - <string name="category_option">کتگوری گزینه ها</string> <string name="latitude">عرض البلد</string> <string name="longitude">طول البلد</string> - <string name="new_event">رویداد جدید</string> + <!--DataSet initial--> <string name="report_period">معیاد گزارش</string> <!--Event Detail--> <string name="due_date">موعد مقرر</string> <string name="cancel">انصراف</string> <string name="delete">حذف</string> - <string name="total">مجموع</string> <string name="no_options">هیچ گزینه موجود نیست</string> <string name="active_programs">برنامه های فعال</string> <string name="enroll">ثبت نام</string> + + <!--TEI DASHBOARD--> <string name="edit">تجدید</string> <string name="deactivate">غیر فعال</string> - <!--DONE TASKS--> - <string name="events_no_data">معلوماتی وجود ندارد</string> <string name="done_task">صفحه اصلی</string> <string name="wipe_data_ok">پذیرش</string> <string name="wipe_data_no">انصراف</string> @@ -56,69 +55,36 @@ <string name="settingsTwoFAStatus">وضعیت</string> <!--endregion--> - <string name="enrollmment_date">تاریخ شمولیت</string> - <!-- SEARCH OPTION SET --> <string name="search_optionset">جستجو</string> <!--FORM FRAGMENT--> <string name="report_date">تاریخ گزارش</string> <string name="add_note">افزودن یاداشت</string> + <!--EVENT SUMMARY--> + <!--AGE CUSTOM VIEW--> - <string name="hint_day">روزها</string> - <string name="hint_month">ماه ها</string> - <string name="hint_year">سالانه</string> - <string name="week">هفته ها</string> <string name="incident_date">تاریخ رویداد/ واقعه</string> - <string name="date_dialog_clear">پاک کردن</string> <string name="period">دوره</string> + <!-- RELATIONSHIPS --> <string name="next">بعدی</string> - <string name="SAVE">ذخیره</string> <string name="button_ok">تأیید</string> <string name="qr_attributes">مشخصات</string> <string name="qr_events">پېښې</string> <string name="qr_relationships">وابستگی ها</string> <string name="about">درباره</string> <string name="share">اشتراک</string> - <string name="max">بزرگتر</string> - <string name="current">کنونی/ فعلی</string> - <string name="warning_on_complete_title">اخطاریه</string> - <string name="error_on_complete_title">خطا</string> <string name="save">ذخیره</string> <string name="select_option">انتخاب گزینه</string> <string name="menu_home">صفحه اصلی</string> <string name="qr_data_values">مجموعه های اطلاعات</string> - <string name="dashboard_relationships">وابستگی ها</string> - <string name="dashboard_indicators">شاخص ها</string> - <string name="dashboard_analytics">تجزیه و تحلیل</string> - <string name="dashboard_notes">یاداشت ها</string> - <string name="event_overview">جزئیات</string> - <string name="event_indicators">شاخص ها</string> - <string name="event_notes">یاداشت ها</string> <string name="please_wait">لطفاً انتظار بکشید</string> <string name="skip">اسکیپ</string> - <string name="reschedule">زمانبندی دوباره</string> - <string name="event_overdue">گذشته از موعد</string> - <string name="table">جدول</string> - <string name="local_data_accept">پذیرش</string> - <string name="action_continue">ادامه</string> <string name="state_warning">اخطاریه</string> <string name="state_relationship">رابطه/ وابستگی</string> <string name="action_close">بستن</string> - <string name="data_set_complete">تکمیل</string> - <string name="data_set_open">باز کردن</string> - <string name="unsupported_value_type">نوع پرونده پشتیبانی نمی‌شود.</string> - <string name="data_every_day">روزنه</string> - <string name="data_every_week">هفته وار</string> - <string name="period_week">هفته</string> - <string name="sms_completed">تکمیل شد</string> - <string name="sms_bar_state_sending">در حال پیشرفت</string> - <string name="sms_bar_state_sent">ارسال شده</string> - <string name="sms_bar_state_failed">ناکام</string> - + <!--region TRACKER IMPORT CONFLICT MESSAGES--> <string name="polygon">چند ضلعی</string> <string name="filters_title_period">دوره</string> - <string name="filters_title_sorting">تنظیم کردن</string> - <string name="filters_title_status">وضعیت</string> <string name="filter_period_today">امروز</string> <string name="filter_period_yesterday">دیروز</string> <string name="filter_period_this_week">هفته جاری</string> @@ -134,20 +100,10 @@ <string name="go_back">برگشتن</string> <string name="data_sets">دیتا سیت ها</string> <string name="interval_yesterday">دیروز</string> - <string name="dataset_overview">جزئیات</string> - <string name="dataset_comments">نظرات</string> - <string name="name">نام</string> - <string name="formula">فورمول</string> - <string name="enrollment_date">تاریخ شمولیت</string> <string name="enrollment_status_active">باز کردن</string> <string name="enrollment_status_completed">تکمیل</string> - <string name="event_data">دیتا</string> - <string name="action_done">انجام شد</string> - <string name="are_you_sure">آیا ډاډه یاست؟</string> <string name="filters_title_date">تاریخ</string> - <string name="filters_title_event_date">تاریخ واقعه</string> <string name="customactivityoncrash_error_activity_restart_app">برگشتن</string> - <string name="customactivityoncrash_error_activity_error_details_close">بستن</string> <string name="section_charts">چارت ها</string> <string name="navigation_list_view">لیست</string> <string name="navigation_map_view">نقشه</string> @@ -168,10 +124,6 @@ <string name="filter_period_last_financial_year">سال گذشته مالی</string> <string name="section_feedback">نظرات/فیدبک</string> <string name="section_indicators">شاخص ها</string> - <string name="value">مقدار</string> - <string name="invalid_integer">رقم باید کامل باشد</string> - <string name="available">موجود</string> - <string name="unknown_date">نا معلوم</string> <string name="troubleshooting_language_title">زبان</string> <string name="action_ok">او کی\!</string> <string name="sync_dialog_action_send">فرستادن</string> @@ -183,7 +135,6 @@ <string name="schedule">تقسیم اوقات</string> <string name="scheduled_enter_event">زمان بندی شده</string> <string name="program_stage">مراحل برنامه</string> - <string name="optional">گزینه ها</string> <string name="show_more">نمایش دادن بیشتر</string> <string name="show_less">نمایش دادن کم</string> </resources> diff --git a/app/src/main/res/values-ps/strings.xml b/app/src/main/res/values-ps/strings.xml index ddd8d5e949d..382c45bcba6 100644 --- a/app/src/main/res/values-ps/strings.xml +++ b/app/src/main/res/values-ps/strings.xml @@ -1,15 +1,14 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!-- Warnings and error messages --> <string name="error">تېروته</string> + <!-- SyncService strings: --> + <string name="sync_events">پېښې</string> - <string name="add_new">د نویو مالوماتو ورعلاوه کول</string> - <string name="add">اضافه یې کړئ</string> - <string name="schedule_new">د نویو مهالوېش وټاکئ</string> + <string name="referral">مراجعه</string> - <string name="user_hint">کارېدونکی نوم</string> - <string name="password_hint">پټنوم</string> <string name="account_recovery">حساب بېرته ترلاسه کړئ</string> + <!--PERIOD--> <string name="DAILY">ورځني [ د مودې ډول ]</string> <string name="WEEKLY">اوونیز</string> @@ -19,37 +18,37 @@ <string name="action_share_zero_items">شریک یې کړئ</string> <!-- Input hints --> <string name="search">جستجو</string> + <!-- Status --> + <string name="event_open">خلاص یې کړئ</string> <string name="read_only">یوازې یې ولولئ</string> <string name="completed">بشپړ شوی</string> <string name="cancelled">لغوه شوی</string> - <string name="activate">فعال دی</string> <string name="active">فعال</string> <string name="state_error">تېروته</string> + + <!--Completion--> + <!--Event initial--> - <string name="create">جوړ یې کړئ</string> <string name="update">تجدید یا نوي یې کړئ</string> - <string name="date">نېټه</string> - <string name="category_option">د کټګورۍ غوروی</string> <string name="latitude">لېټېټيوډ</string> <string name="longitude">لانګېټيوډ</string> - <string name="new_event">نوې پېښه</string> + <!--DataSet initial--> <string name="report_period">د راپور ورکولو موده</string> <!--Event Detail--> <string name="due_date">ټاکلې نېټه</string> <string name="cancel">رد یې کړئ [ ژباړه ـ ردول ]</string> <string name="delete">خذف یې کړئ</string> - <string name="total">ټولټال</string> <string name="no_options">هېڅ انتخاب شتون نه لري</string> <string name="active_programs">فعال پروګرامونه</string> <string name="enroll">نوم لیکنه یا شمولیت</string> + + <!--TEI DASHBOARD--> <string name="edit">درست یې کړئ</string> <string name="deactivate">غېرې فعال یې کړئ</string> - <!--DONE TASKS--> - <string name="events_no_data">د مالوماتو (ډاټا) نشتوالۍ</string> <string name="done_task">کور پاڼه</string> <string name="wipe_data_ok">د منلو وړ</string> <string name="wipe_data_no">رد یې کړئ [ ژباړه ـ ردول ]</string> @@ -57,64 +56,31 @@ <string name="settingsTwoFAStatus">وضعیت</string> <!--endregion--> - <string name="enrollmment_date">د نوم ثبتونې نېټه</string> - <!-- SEARCH OPTION SET --> <string name="search_optionset">جستجو</string> <!--FORM FRAGMENT--> <string name="report_date">د راپور نېټه</string> <string name="add_note">نوټ ور اضافه کړئ</string> + <!--EVENT SUMMARY--> + <!--AGE CUSTOM VIEW--> - <string name="hint_day">ورځې</string> - <string name="hint_month">میاشت</string> - <string name="hint_year">کلونه</string> - <string name="week">اونۍ</string> <string name="incident_date">د پېښې نېټه</string> - <string name="date_dialog_clear">پاک یې کړئ</string> <string name="period">معیاد</string> + <!-- RELATIONSHIPS --> <string name="next">راتلونکی</string> - <string name="SAVE">ثبت یې کړئ [ ژباړه - ثبت کړئ ]</string> <string name="button_ok">سم دی</string> <string name="qr_events">پېښې</string> <string name="qr_relationships">اړیکې</string> <string name="about">په هکله</string> <string name="share">شریک یې کړئ</string> - <string name="max">حداعظم</string> - <string name="current">اوسنۍ</string> - <string name="warning_on_complete_title">خبرداری</string> - <string name="error_on_complete_title">تېروته</string> <string name="save">ثبت یې کړئ [ ژباړه - ثبت کړئ ]</string> <string name="menu_home">کور پاڼه</string> - <string name="dashboard_relationships">اړیکې</string> - <string name="dashboard_indicators">شاخصونه</string> - <string name="dashboard_analytics">تحلیلي</string> - <string name="dashboard_notes">یادداښتونه</string> - <string name="event_overview">جزیات [ ژباړه ـ جزیات ]</string> - <string name="event_indicators">شاخصونه</string> - <string name="event_notes">یادداښتونه</string> <string name="please_wait">لطفاً صبر وکړئ</string> <string name="skip">ترې تېر شئ</string> - <string name="reschedule">د مهالوېش له سره ټاکل</string> - <string name="event_overdue">ځنډول</string> - <string name="table">جدول</string> - <string name="local_data_accept">د منلو وړ</string> - <string name="action_continue">دوام ورکړئ</string> <string name="state_warning">خبرداری</string> <string name="state_relationship">اړیکه</string> <string name="action_close">بند یې کړئ</string> - <string name="data_set_complete">بشپړ یې کړئ</string> - <string name="data_set_open">خلاص یې کړئ</string> - <string name="unsupported_value_type">د ارزښت نه منل کېدونکی ډول</string> - <string name="data_every_day">ورځني [ د مودې ډول ]</string> - <string name="data_every_week">اوونیز</string> - <string name="period_week">اونۍ</string> - <string name="sms_completed">بشپړ شوی</string> - <string name="sms_bar_state_sending">دوام لري</string> - <string name="sms_bar_state_sent">لېږل شوي</string> - <string name="sms_bar_state_failed">ناکام شوي</string> - <string name="filters_title_period">معیاد</string> - <string name="filters_title_status">وضعیت</string> <string name="filter_period_today">نن ورځ</string> <string name="filter_period_yesterday">پرونۍ ورځ</string> <string name="filter_period_this_week">هفته هذا</string> @@ -130,21 +96,12 @@ <string name="go_back">شا ته وګرځئ</string> <string name="data_sets">د مالوماتو یا ډاټا ټولګې</string> <string name="interval_yesterday">پرونۍ ورځ</string> - <string name="dataset_overview">جزیات [ ژباړه ـ جزیات ]</string> - <string name="dataset_comments">څرګندونې</string> - <string name="name">نوم</string> <string name="filters_title_event_status">د پېښې وضعیت او څرنګوالۍ</string> - <string name="enrollment_date">د نوم ثبتونې نېټه</string> <string name="enrollment_status_active">خلاص یې کړئ</string> <string name="enrollment_status_completed">بشپړ یې کړئ</string> <string name="enrollment_status_cancelled">لغوه شوی</string> - <string name="event_data">مالومات (ډاټا)</string> - <string name="action_done">ترسره شو</string> - <string name="are_you_sure">آیا ډاډه یاست؟</string> <string name="filters_title_date">نېټه</string> - <string name="filters_title_event_date">د پېښې نېټه</string> <string name="customactivityoncrash_error_activity_restart_app">شا ته وګرځئ</string> - <string name="customactivityoncrash_error_activity_error_details_close">بند یې کړئ</string> <string name="section_charts">چارټونه</string> <string name="navigation_list_view">لېسټ</string> <string name="navigation_map_view">نقشه</string> @@ -166,10 +123,6 @@ <string name="filter_period_last_financial_year">تېر مالي کال</string> <string name="section_feedback">د فیډبک یا نظر ورکول</string> <string name="section_indicators">شاخصونه</string> - <string name="value">ارزښت یا رقم</string> - <string name="invalid_integer">ارقام باید صحیح عدد وي</string> - <string name="available">د لاس رسي وړ دي</string> - <string name="unknown_date">ناپېژنده</string> <string name="sync_dialog_action_send">لېږل</string> <string name="skipped">له پامه غورځول شوی</string> <string name="programs">پروګرامونه</string> @@ -178,7 +131,6 @@ <string name="schedule">مهالوېش یې وټاکئ</string> <string name="scheduled_enter_event">پروګرام شوی</string> <string name="program_stage">د پروګرام پړاو</string> - <string name="optional">اختیاري دی</string> <string name="show_more">ډېر ښکاره کړئ</string> <string name="show_less">لږ ښکاره کړئ</string> </resources> diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 9291ff729a4..a7fb14fc1ad 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1,25 +1,10 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!-- Warnings and error messages --> <string name="error">Erro</string> - <plurals name="error_message"> - <item quantity="one">Erros</item> - <item quantity="many">Erros</item> - <item quantity="other">Erros</item> - </plurals> - <string name="error_wrong_server_url">Url do servidor errado</string> - <string name="error_wrong_credentials">Credenciais erradas</string> - <string name="error_unexpected_error">Erro inesperado</string> - <string name="error_internal_server_error">Erro interno do servidor</string> - <string name="no_value">sem valor</string> - <string name="sync_metadata">Metadados</string> - <string name="add_new">Adicionar novo</string> - <string name="add">Adicionar</string> - <string name="schedule_new">Novo agendamento</string> <string name="referral">Transferência</string> - <string name="user_hint">Utilizador</string> - <string name="password_hint">Password</string> <string name="account_recovery">Recuperar Conta</string> + <!--PERIOD--> <string name="DAILY">Diário</string> <string name="WEEKLY">Semanal</string> @@ -29,36 +14,35 @@ <string name="action_share_zero_items">Partilhar</string> <!-- Input hints --> <string name="search">Pesquisar</string> - <string name="filter_options">Opções de filtro</string> + <!-- Status --> + <string name="event_open">Abrir</string> <string name="read_only">Apenas leitura</string> <string name="completed">Concluído</string> <string name="cancelled">Cancelado</string> - <string name="activate">Ativar</string> <string name="active">Activo</string> <string name="state_error">Erro</string> + + <!--Completion--> + <!--Event initial--> - <string name="create">Criar</string> <string name="update">Actualizar</string> - <string name="date">Data</string> - <string name="category_option">Opcções de categorias</string> <string name="latitude">Latitude</string> <string name="longitude">Longitude</string> - <string name="new_event">Novo evento</string> + <!--DataSet initial--> <string name="report_period">Período de relatório</string> <!--Event Detail--> <string name="due_date">Data de vencimento</string> <string name="cancel">Cancelar</string> <string name="delete">Apagar</string> - <string name="total">Total</string> <string name="active_programs">Programas ativos</string> <string name="enroll">Registrar</string> + + <!--TEI DASHBOARD--> <string name="edit">Editar</string> <string name="deactivate">Desativar</string> - <!--DONE TASKS--> - <string name="events_no_data">Não ha dados</string> <string name="done_task">Origem</string> <string name="wipe_data_no">Cancelar</string> <string name="SYNC_MANAGER">Configurações</string> @@ -66,63 +50,38 @@ <string name="settingsTwoFAStatus">Situação</string> <!--endregion--> - <string name="enrollmment_date">Data de inscrição</string> - <!-- SEARCH OPTION SET --> <string name="search_optionset">Pesquisar</string> <!--FORM FRAGMENT--> <string name="report_date">Data do relatório</string> <string name="add_note">Adicionar uma nota</string> + <!--EVENT SUMMARY--> + <!--AGE CUSTOM VIEW--> - <string name="hint_day">Dias</string> - <string name="hint_month">Meses</string> - <string name="hint_year">Anos</string> <string name="incident_date">Data do incidente</string> - <string name="date_dialog_clear">Limpar</string> <string name="period">Período</string> + <!-- RELATIONSHIPS --> <string name="next">Próximo</string> - <string name="SAVE">Salvar</string> <string name="button_ok">Aprovado</string> <string name="qr_attributes">Atributos</string> <string name="qr_relationships">Relacionamentos</string> <string name="about">Acerca</string> <string name="share">Partilhar</string> - <string name="max">Máx</string> - <string name="current">Corrente</string> - <string name="warning_on_complete_title">Advertência</string> - <string name="error_on_complete_title">Erro</string> <string name="save">Salvar</string> <string name="menu_home">Origem</string> <string name="qr_data_values">Valor de Dados</string> <string name="dashboard_overview">Visão geral</string> - <string name="dashboard_relationships">Relacionamentos</string> - <string name="dashboard_indicators">Indicadores</string> - <string name="dashboard_notes">Notas</string> - <string name="event_overview">Detalhes</string> - <string name="event_indicators">Indicadores</string> - <string name="event_notes">Notas</string> <string name="please_wait">Por favor aguarde...</string> <string name="skip">Pular</string> - <string name="reschedule">Reprogramar</string> - <string name="event_overdue">Atrasado</string> - <string name="action_continue">Continuar</string> <string name="state_warning">Advertência</string> <string name="state_relationship">Relação</string> <string name="action_close">Fechar</string> - <string name="data_set_complete">Completo</string> - <string name="data_set_open">Abrir</string> - <string name="unsupported_value_type">Tipo de valor não suportado</string> - <string name="data_every_day">Diário</string> - <string name="data_every_week">Semanal</string> - <string name="period_week">Semana</string> - <string name="sms_completed">Concluído</string> - <string name="sms_bar_state_sending">Em andamento</string> - <string name="sms_bar_state_sent">Enviar</string> - <string name="polygon_captured">Polígono capturado</string> + <!--region TRACKER IMPORT CONFLICT MESSAGES--> <string name="polygon">Poligono</string> + <!--endregion--> + <string name="security_title">Segurança</string> <string name="filters_title_period">Período</string> - <string name="filters_title_status">Estado</string> <string name="filter_period_today">Hoje</string> <string name="filter_period_yesterday">Ontém</string> <string name="filter_period_last_week">Última semana</string> @@ -136,20 +95,11 @@ <string name="go_back">Voltar</string> <string name="data_sets">Agregação de Dados</string> <string name="interval_yesterday">Ontém</string> - <string name="dataset_overview">Detalhes</string> - <string name="name">Nome</string> - <string name="formula">Fórmula</string> - <string name="enrollment_date">Data de inscrição</string> <string name="enrollment_status_active">Abrir</string> <string name="enrollment_status_completed">Completo</string> <string name="enrollment_status_cancelled">Cancelado</string> - <string name="event_data">Dados</string> - <string name="action_done">Concluído</string> - <string name="are_you_sure">Tem certeza?</string> <string name="filters_title_date">Data</string> - <string name="filters_title_event_date">Data do evento</string> <string name="customactivityoncrash_error_activity_restart_app">Voltar</string> - <string name="customactivityoncrash_error_activity_error_details_close">Fechar</string> <string name="customactivityoncrash_error_activity_error_details_copy">Copiar para área de transferência</string> <string name="navigation_list_view">Lista</string> <string name="navigation_map_view">Mapa</string> @@ -166,11 +116,6 @@ <string name="filter_period_last_financial_year">último ano financeiro</string> <string name="section_feedback">Retroinformacão</string> <string name="section_indicators">Indicadores</string> - <string name="value">Valor</string> - <string name="login_error_bad_credentials">Credenciais erradas</string> - <string name="invalid_integer">Valor deve ser um número inteiro</string> - <string name="available">Disponível</string> - <string name="unknown_date">Desconhecido</string> <string name="action_ok">Esta bem</string> <string name="sync_dialog_action_send">Enviar</string> <string name="sync_dialog_action_refresh">Actualizar</string> @@ -181,5 +126,4 @@ <string name="schedule">Programar</string> <string name="scheduled_enter_event">Agendado</string> <string name="program_stage">Estágio do programa</string> - <string name="optional">Opcional</string> </resources> diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 2af82023cec..d2186a9d0a1 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -1,65 +1,28 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!--GENERAL--> <string name="app_name">Dhis2</string> - <string name="logo_text">dhis</string> - <string name="logo_number">2</string> <!-- Warnings and error messages --> <string name="error">Erro</string> - <plurals name="error_message"> - <item quantity="one">Erro</item> - <item quantity="many">Erros</item> - <item quantity="other">Erros</item> - </plurals> - <string name="error_wrong_server_url">URL do servidor errado</string> - <string name="error_wrong_credentials">Credenciais erradas</string> - <string name="error_unexpected_error">Erro inesperado</string> - <string name="error_internal_server_error">Erro do Servidor Interno</string> - <string name="no_value">sem valor</string> <string name="no_reserved_values">Não há mais valores reservados. Entre em contato com o administrador do sistema</string> - <string name="no_reserved_values_connection">Não há mais valores reservados. Conecte-se à rede para recarregá-los</string> - <string name="errors">erros</string> <string name="something_wrong">Ocorreu algo de errado</string> <!-- SyncService strings: --> - <string name="sync_now">Sincronize agora</string> - <string name="sync_text">Sincronizando com o servidor</string> - <string name="sync_title">Sincronizar agora</string> - <string name="sync_metadata">Metadados</string> <string name="sync_events">Eventos</string> - <string name="sync_tei">Entidades rastreadas</string> - - <string name="sync_complete_title">Acabado</string> - <string name="sync_complete_text">Sincronização concluída</string> <string name="sync_error_title">Erro de sincronização</string> <string name="sync_error_text">Ocorreu um erro durante a sincronização. Por favor tente novamente.</string> <string name="sync_incomplete_error_text">A sincronização foi concluída, mas não recebemos a confirmação do servidor para todos os registos. Esses registos ainda estão marcados como “offline” na aplicação. Recomendamos que tente novamente a sincronização.</string> - <string name="data_sync_warning_program">AVISO: A maioria dos seus dados é sincronizada, mas alguns campos apresentaram conflitos. Sincronize sua configuração e tente novamente. Se o aviso persistir, verifique o status de sincronização: programas, TEIs e eventos com conflitos são marcados como @.</string> - <string name="server_sync_error"> Ocorreu um erro e o servidor não respondeu. Contacte o seu administrador.</string> - - <string name="search_result_text">%s resultados encontrados</string> - <string name="add_new">Novo</string> - <string name="add">Adicionar</string> <string name="enter_event_data">Entrar %s</string> <string name="enter_cancel_event_data">Introduzir / Saltar %s</string> - <string name="schedule_new">Nova agenda</string> <string name="referral">Transferência</string> <!-- Login --> - <string name="url_hint">url do servidor</string> - <string name="user_hint">Nome de usuário</string> - <string name="password_hint">Senha</string> - <string name="log_in_button">Conecte-se</string> - <string name="unlock_button">Desbloquear sessão</string> <string name="syncing_configuration">Sincronizando sua configuração</string> <string name="syncing_data_shortly">Seus dados serão sincronizados em breve</string> <string name="syncing_data">Sincronizando seus dados</string> <string name="configuration_ready">Sua configuração está pronta</string> <string name="data_ready">Seus dados estão prontos</string> - <string name="configuration_sync_failed">Falha na sincronização da configuração</string> - <string name="data_sync_failed">Falha na sincronização de dados</string> <string name="account_recovery">Recuperar Conta</string> - <string name="no_network_to_recover_account"> É necessária uma ligação à rede para recuperar a sua conta.</string> <!--PERIOD--> <string name="DAILY">Diário</string> @@ -80,139 +43,87 @@ <string name="enter_text">Inserir texto</string> <string name="enter_long_text">Inserir texto longo</string> <string name="enter_number">Inserir numeros</string> - <string name="enter_integer">Digite inteiro</string> <string name="enter_negative_integer">Digite um número inteiro negativo</string> <string name="enter_positive_integer_or_zero">Digite um número inteiro positivo ou zero</string> <string name="enter_positive_integer">Digite um número inteiro positivo</string> - <string name="filter_options">Opções de filtro</string> <string name="choose_date">Escolha a data</string> - <string name="change_calendar">Alterar calendário</string> <!-- Status --> - <string name="program_completed">Programa concluído</string> - <string name="program_inactive">Programa inativo</string> <string name="event_open">Abrir</string> <string name="event_not_completed">Não concluído</string> <string name="event_completed">Evento concluído</string> <string name="read_only">Apenas leitura</string> - <string name="finish_and_complete">Terminar e concluir</string> <string name="completed">Completo</string> <string name="cancelled">Cancelado</string> <string name="re_open"> Reabrir</string> - <string name="re_open_form"> Reabrir o formulário</string> - <string name="activate">Activar</string> <string name="active">Activo</string> <!-- State --> <string name="state_synced">Sincronizar</string> <string name="state_to_post">Para enviar</string> <string name="state_to_update">Atualizar</string> - <string name="state_to_delete">Suprimir</string> <string name="state_error">Erro</string> - <string name="action_sync">SINCRONIZAR</string> - <string name="action_send">ENVIAR</string> - <string name="action_sync_sms">SINCRONIZAR SMS</string> <!--Completion--> - <string name="completion">Conclusão</string> <!--Event initial--> - <string name="create">Criar</string> <string name="update">Actualizar</string> - <string name="date">Data</string> <string name="org_unit">Unidade organizacional</string> <string name="no_org_units">Não há unidades de organização abertas para a data selecionada. Selecione outra data ou outra unidade organizacional.</string> - <string name="category_option">Opções de categorias</string> <string name="latitude">Latitude</string> <string name="longitude">Longitude</string> - <string name="new_event">Novo evento</string> - <string name="one_time">Um tempo</string> - <string name="permanent">Permanente</string> <!--DataSet initial--> <string name="report_period">Período de relatório</string> - <string name="cat_option">Opção de gato</string> - <string name="field_required">Se você definir um valor, a linha inteira precisa de todos os valores para concluir o conjunto de dados.</string> - <string name="field_mandatory">Alguns valores necessários estão ausentes. Você precisa definir valores obrigatórios para concluir o conjunto de dados.</string> - <string name="field_mandatory_v2">Estão faltando campos obrigatórios. Por favor, preencha-os para completar o conjunto de dados.</string> - <string name="datavalue_saved">O valor é salvo!</string> - <string name="there_is_no_available_period">Não há períodos disponíveis para seleção.</string> <!--Event Detail--> <string name="due_date">Data de vencimento</string> <string name="next_event">Próximo %1$s</string> <string name="cat_combo">Combinação de categoria</string> - <string name="date_default">DD/MM/AAAA</string> <string name="cancel">Cancelar</string> <string name="delete">Apagar</string> - <string name="total">Total</string> <string name="most_recent_event_date">Data do evento mais recente</string> <string name="no_options">Nenhuma opção disponível</string> <!--TEI Enrollment list--> <string name="enrollment_list">Lista de inscrições</string> <string name="active_programs">Programas activos</string> - <string name="to_enroll_programs">Programas para inscrição</string> <string name="enroll">Registrar</string> - <string name="last_visit">Ultima visita:</string> - <string name="apply">aplique</string> <!--TEI DASHBOARD--> - <string name="see_details">Veja detalhes</string> - <string name="view_more">VEJA MAIS</string> <string name="edit">Editar</string> - <string name="follow_up">Acompanhamento</string> - <string name="follow_up_enabled">Acompanhamento ativado</string> - <string name="follow_up_disabled">Acompanhamento desativado</string> <string name="deactivate">Desactivar</string> <string name="program_not_allow_events">Este programa não permite mais eventos</string> <!--DONE TASKS--> - <string name="events_no_data">Sem dados</string> <string name="events">eventos</string> <string name="done_task">Início</string> - <string name="app_info">Informações do aplicativo</string> <string name="log_out">Sair</string> - <string name="block_session">Bloquear Sessão</string> <string name="show_more_events">Mostrar%s mais…</string> <string name="show_less_events">Mostrar menos</string> <!-- SYNC --> - <string name="a_minute">1 Minuto</string> - <string name="fifteen_minute">15 Minutos</string> <string name="thirty_minutes">30 Minutos</string> <string name="a_hour">1 Hora</string> <string name="every_6_hours">6h</string> <string name="a_day">1 dia (Padrão)</string> <string name="every_12_hours">12h</string> - <string name="Automatic_Sync_Data">Dados de sincronização automática a cada:</string> <string name="Manual">Manual</string> - <string name="Automatic_Sync_Metadata">Configuração de sincronização automática a cada:</string> <string name="a_week">1 Semana</string> <string name="sync_max_parameters">Parâmetros de sincronização atuais:</string> <string name="sync_default_parameters">Restaurar ao padrão</string> + <string name="wipe_data_meesage">O banco de dados será excluído. \nVocê será solicitado a fazer login novamente.</string> <string name="wipe_data_ok">Aceitar</string> <string name="wipe_data_no">Cancelar</string> <string name="SYNC_DATA">SINCRONIZAR Dados agora</string> <string name="SYNC_META">SINCRONIZAR Configuração agora</string> <string name="SYNC_MANAGER">Configuração</string> - <string name="last_data_sync_date">Última sincronização ativada: %s</string> - <string name="last_metadata_sync_date">Última sincronização ativada: %s</string> <string name="refill_reserved_values">Recarga</string> - <string name="settings_sms_module_title">Módulo SMS:</string> <string name="settings_sms_receiver_number">Porta de entrada SMS:</string> <string name="settings_sms_result_sender_number">remetente do resultado SMS</string> <string name="settings_sms_result_timeout"> Tempo limite do resultado SMS (seg)</string> - <string name="settings_sms_result_timeout_hint">segundos</string> - <string name="settings_sms_result_sender_hint">número</string> - <string name="settings_sms_receiver_number_hint">número</string> <string name="settings_sms_module_switch">Ativar envio de SMS</string> <string name="settings_sms_response_wait_switch">Aguardar resposta do resultado do SMS</string> - <plurals name="settings_specific_programs"> - <item quantity="one">Há sim %s programa com configurações específicas</item> - <item quantity="many">Há%s programas com configurações específicas</item> - <item quantity="other">Há%s programas com configurações específicas</item> - </plurals> <string name="settings_limit_scope">Configurações limitadas</string> <string name="settings_limit_globally">Globalmente</string> <string name="settings_limit_program">por programa</string> @@ -230,20 +141,15 @@ <string name="settingsErrorLog_descr">Este registro contém todos os erros causados ​​pela sincronização de seus dados e metadados.</string> <string name="settingsDeleteLocalData">Suprimir dados locais</string> <string name="settingsDeleteLocalData_descr">Todos os dados do Capture App armazenados no seu dispositivo serão excluídos. Os dados que não são sincronizados com o servidor serão perdidos.</string> - <string name="settingsReset">Redefinir dados do aplicativo e configuração</string> - <string name="settingsReset_descr">Sua configuração e dados do aplicativo armazenados no dispositivo serão excluídos. Você será solicitado a fazer login novamente e os dados que não forem sincronizados com o servidor serão perdidos.</string> <string name="settingsSms">Configurações de SMS</string> <string name="settingsSms_descr">Verifique e edite os parâmetros relacionados ao porta de entrada sms</string> <string name="settingsCheckVersion"> Atualização do software</string> - <string name="settingsCheckVersionMessage">Software</string> <string name="settingsExportDB">Exportar base de dados</string> <string name="settingsExportDBMessage"> Exporte a sua base de dados e partilhe-a com o seu administrador</string> <string name="settingTwoFA">Autenticação de dois factores</string> <string name="settingsTwoFAStatus">Estado</string> <!--endregion--> - <string name="enrollmment_date">Data de inscrição</string> - <!-- SEARCH OPTION SET --> <string name="search_optionset">Pesquisar</string> <!--FORM FRAGMENT--> @@ -264,29 +170,15 @@ <string name="tei_coordinates">Coordenadas para o</string> <!--EVENT SUMMARY--> - <string name="section_list">Lista de seções</string> - <string name="event_summary_header" formatted="false">%s perguntas de %s concluída</string> - <string name="event_summary_sections_header" formatted="false">%s de %s concluído</string> - <string name="complete_and_close">Concluir e fechar</string> <!--AGE CUSTOM VIEW--> - <string name="hint_day">Dias</string> - <string name="hint_month">Meses</string> - <string name="hint_year">Anos</string> - <string name="week">Semanas</string> <string name="incident_date">Data do incidente</string> - <string name="local_results">Resultados locais</string> - <string name="online_results">Resultados online</string> <string name="past_programs">Programas anteriores</string> <!--PERMISSIONS--> <string name="permission_denied">Você não tem a permissão necessária para executar esta ação</string> - <string name="add_relation_button">Adicionar como…</string> - <string name="date_dialog_clear">Limpar</string> <string name="period">Período</string> - <string name="org_unit_filter">(%d) Unidade Org</string> - <string name="org_unit_select_level">Nível %d</string> <string name="tuto_main_1">Bem-vindo ao dhis2</string> <string name="tuto_main_2">Aqui você pode ver suas atividades</string> <string name="tuto_main_3">Você pode aplicar um filtro...</string> @@ -295,16 +187,11 @@ <string name="tuto_main_6">Verifique outras ações no menu principal</string> <!-- RELATIONSHIPS --> - <string name="default_relationship_label">Criar relação</string> <string name="next">Próximo</string> <string name="search_min_num_attr">Você precisa inserir pelo menos %d dos atributos para fazer uma pesquisa</string> - <string name="search_attr">Você precisa inserir pelo menos um dos atributos para fazer uma pesquisa</string> - <string name="search_max_tei_reached">Há mais de %d resultados. Digite mais critérios de pesquisa</string> - <string name="search_init">Digite seu critério de pesquisa</string> <!-- QR --> <string name="QR_SCANNER">Importar dados QR</string> - <string name="SAVE">Salvar</string> <string name="button_ok">Aprovado</string> <string name="qr_id">Identificação</string> <string name="qr_attributes">Atributos</string> @@ -316,32 +203,20 @@ <string name="qr_no_data">sem dados</string> <string name="qr_error_id">Código QR inválido</string> <string name="qr_error_attr">Este atributo não pode ser adicionado</string> - <string name="qr_error_enrollment">Esta inscrição não pode ser adicionada</string> <string name="about">Acerca</string> <string name="programs_to_enroll">Programas para inscrição</string> - <string name="select_all">selecionar tudo</string> - <string name="clear_all">seleção clara</string> - <string name="empty_program_list">Não há informações para os filtros selecionados. Por favor, tente alterá-los.</string> <string name="share">Partilha</string> <string name="share_qr">Compartilhe QR</string> <string name="max">Máx</string> <string name="current">Corrente</string> <string name="tei">TEI</string> <string name="teis">TEIs</string> - <string name="limit_by_organisation_unit">Limite por unidade organizacional</string> - <string name="limit_by_program">Limitar por programa</string> - <string name="programs_list">Lista de programas</string> <string name="wipe_data">Redefinir dados do aplicativo e configuração</string> - <string name="add_relationship_error">Não é possível adicionar esse relacionamento</string> <string name="warning_error_on_complete_title">Verifique isso!</string> - <string name="warning_on_complete_title">Advertência</string> - <string name="error_on_complete_title">Erro</string> <string name="save">Salvar</string> <string name="reserved_value">Valores Reservados</string> - <string name="downloaded_confirm">Deseja adicionar mais dados do QR?</string> - <!--ABOUT--> <string name="about_app">Versão da aplicação: %s</string> <string name="about_sdk">Versão do SDK: %s</string> @@ -352,131 +227,43 @@ <string name="about_dev">Desenvolvido e mantido pela <a href="https://www.dhis2.org/">DHIS2 </a> projeto, parte da Universidade de Oslo, <a href="https://www.mn.uio.no/ifi/english/"> departamento de informática</a>.</string> <string name="about_contact">Para mais informações ou perguntas sobre este aplicativo, please write to <a href="mailto:android@dhis2.org">android@dhis2.org </a></string> - <string name="login_error_null_pass">Falta a senha. Por favor preencha este campo.</string> - <string name="login_error_null_username">O nome de usuário está ausente. Por favor preencha este campo.</string> - <string name="login_error_dhis_version">Este servidor está executando uma versão dhis diferente de 2.29. Atualize a versão do servidor ou use o ambiente de teste para continuar.</string> - <string name="login_error_dhis_version_v2">Este servidor está executando uma versão dhis diferente de %s. Atualize a versão do servidor ou use o ambiente de teste para continuar.</string> - <string name="login_error_unsuccessful_response">Algo deu errado. Verifique se o URL, o nome de usuário e a senha do servidor estão corretos e tente novamente.</string> - <string name="login_error_error_response">O servidor não pôde concluir esta solicitação.</string> - <string name="login_error_default">Ocorreu um problema ao tentar fazer login no servidor.</string> - <string name="login_error">Erro de login</string> - <string name="missing_mandatory_fields">Faltam campos obrigatórios</string> - <string name="online_search_unexpected">Erro inesperado ao pesquisar online</string> - <string name="online_search_parsing_error">Erro ao analisar resultados</string> - <string name="online_search_error">A pesquisa online retornou um erro</string> - <string name="online_search_response_error">Algo deu errado no servidor</string> <string name="search_program_not_selected">Selecione um programa para ativar a inscrição</string> <string name="search_access_error">Você não tem a permissão necessária</string> - <string name="feature_unavaible">Essa funcionalidade ainda não está pronta.</string> - <string name="relationship_label_error">Erro ao obter o rótulo do relacionamento</string> <string name="all_tei_type">Tudo %s</string> <string name="invalid_phone_number">Este não é um número de telefone válido</string> - <string name="invalid_email">Este não é um email válido</string> - <string name="invalid_negative_number">Somente números negativos são permitidos</string> <string name="invalid_possitive_zero">Somente números positivos ou zero são permitidos</string> - <string name="invalid_possitive">Somente números positivos são permitidos</string> - <string name="invalid_interval">Somente valores de 0 a 1 são permitidos</string> - <string name="invalid_percentage">Somente valores de 0 a 100 são permitidos</string> - <string name="date_dialog_tigle">Selecione as datas para filtrar</string> <string name="select_option">Selecionar opção</string> - <string name="issue_reported">Problema relatado</string> - <string name="dialog_generate_new_event">Gerar novo evento</string> - <string name="message_generate_new_event">Deseja criar outro evento?</string> <string name="event_completed_title">Eventos Concluídos</string> <string name="event_completed_message">Todos os eventos deste programa estão concluídos. Deseja encerrar o programa também?</string> - <string name="complete_enrollment_message">Deseja concluir a inscrição também?</string> <string name="complete_enrollment_message_V2">Gostaria de completar também as %s</string> <string name="check_event">Verifica</string> <string name="menu_home">Início</string> <string name="appwidget_text">EXEMPLO</string> - <string name="add_widget">Adicionar widget</string> <string name="showHelp">Mostre ajuda</string> - <string name="tuto_settings_1">Sincronize seus dados...</string> - <string name="tuto_settings_2">...sua configuração...</string> - <string name="tuto_settings_3">...definir quantos registros baixar do servidor...</string> - <string name="tuto_settings_reserved">Verifique e gerencie quantos valores reservados restam</string> - <string name="tuto_settings_errors">Verifique se uma conexão com o servidor falhou</string> - <string name="tuto_settings_reset">Libere espaço em disco</string> - <string name="tuto_settings_4">...ou exclua tudo para começar de novo.</string> - <string name="tuto_search_1_v2">Encontre suas entidades no dispositivo local e no servidor online.</string> - <string name="tuto_search_2">Você pode mudar para outros programas</string> - <string name="tuto_search_3_v2">Pesquise ou adicione novas entidades. Você precisa pesquisar antes de poder adicionar um novo!</string> - <string name="tuto_search_4_v2">Clique aqui para limpar os campos e reiniciar a pesquisa.</string> <string name="tuto_dashboard_1">Este é o painel da entidade</string> <string name="tuto_dashboard_2">Ver informações do perfil de entidades...</string> - <string name="tuto_dashboard_3">...Compartilhe informações via QR ou SMS...</string> - <string name="tuto_dashboard_4">...Ou marque a entidade para acompanhamento</string> - <string name="tuto_dashboard_5">Clique para criar ou agendar um evento ou se referir a outra Unidade Org.</string> <string name="tuto_dashboard_6">Aqui você verá todos os eventos. Clique para ver um detalhe do evento.</string> <string name="tuto_dashboard_7">Navegue pelo menu para adicionar relacionamentos, ver indicadores ou escrever notas.</string> - <string name="tuto_dashboard_8">Clique para ver todas as inscrições da sua entidade ou crie uma nova.</string> - <string name="tuto_tei_event_1">Clique para excluir este evento. Essa ação não pode ser desfeita.</string> - <string name="tuto_tei_event_2">Complete o evento.</string> - <string name="tuto_program_event_1">Todos os eventos relacionados a este programa serão listados aqui.</string> - <string name="tuto_program_event_2">Clique para adicionar um novo evento</string> <string name="tuto_event_initial_new_1">Digite todos os dados para criar o evento</string> <string name="tuto_event_initial_1">Clique para verificar o status de conclusão do evento.</string> - <string name="tuto_event_summary">Clique para concluir ou reabrir um evento</string> - <string name="tuto_main_7">Leia e armazene informações de outros dispositivos via QR</string> - <string name="tuto_main_8">Sincronize seus dados com o servidor</string> - <string name="tuto_main_9">Bloqueie a sessão com um código de 4 dígitos. Não esqueça seu código!</string> - <string name="tuto_main_10">Faça logout para alterar usuário ou servidor. Você poderá fazer login novamente, mesmo se não houver conexão com a Internet.</string> - <string name="text_plus_colon">%s:</string> <string name="relationships">Relacionamentos</string> <string name="empty_tei_add">Não há eventos registrados, clique em \"+\" para adicionar um novo.</string> - <string name="empty_tei_no_add">Não há eventos registrados.</string> <string name="qr_data_values">Valor de Dados</string> <string name="info">Informações</string> <string name="qr_no_id_error">Não foi possível ler este ID</string> <string name="delete_local_data">Suprimir dados locais</string> <string name="dashboard_overview">Visão global</string> - <string name="dashboard_relationships">Relacionamentos</string> - <string name="dashboard_indicators">Indicadores</string> - <string name="dashboard_analytics">Google Analytics</string> <string name="empty_indicators">Não há indicadores para este programa.</string> - <string name="dashboard_notes">Notas</string> - <string name="unable_to_complete">Não foi possível concluir</string> - <string name="unable_to_save"> Não é possível guardar</string> - <string name="warnings_in_form">Existem avisos no formulário</string> - <string name="what_to_do">O que quer fazer?</string> - <string name="field_errors">Alguns campos possuem erros. Por favor, verifique-os para poder concluir</string> <string name="unselect_enrollment">Todas as inscrições</string> <string name="unselect_enrollment_description">Mostrar painel com todos os programas ativos</string> - <string name="CHECK_SYNC_ERRORS">Registro de erros de sincronização aberta</string> <string name="error_dialog_title">Sincronizar registro de erros</string> <string name="share_with">Compartilhar com...</string> - <string name="errors_during_sync">Sua sincronização de configuração falhou. Pode haver erros no seu servidor. Clique aqui para obter mais informações.</string> - <string name="sectionSelectorPrev">ANTERIOR</string> - <string name="sectionSelectorNext">PRÓXIMO</string> - <string name="event_overview">Detalhes</string> - <string name="event_indicators">Indicadores</string> - <string name="event_notes">Notas</string> - <string name="complete_add_new"><![CDATA[Conclua e adicione novo]]></string> - <string name="complete_later">Conclua mais tarde</string> - <string name="finish_add_new"><![CDATA[Terminar e adicionar novo]]></string> - <string name="finish">Terminar</string> - <string name="error_fields_title">Campos com erros</string> - <string name="error_fields_events">Alguns campos possuem erros. Eles não foram salvos. Por favor, verifique-os.</string> <string name="unique_warning">O valor deve ser único, uma coincidência foi encontrada. Não foi salvo. Por favor verifique isto.</string> - <string name="unique_coincidence_found">Foi encontrada uma coincidência em um campo único. Verifique o formulário para salvar a Inscrição.</string> <string name="please_wait">Por favor aguarde...</string> <string name="skip">Saltar</string> - <string name="reschedule">Reprogramar</string> <string name="no_intructions">Não há informações para esta tela</string> - <string name="event_overdue">Atrasado</string> - <string name="unsupported_program_rule">There is one program rule which is not supported. Por favor verifique a documentação</string> - <string name="empty_description">Nenhuma informação para este campo</string> - <string name="biometrics_dialog_title">Credenciais Vazias</string> - <string name="biometrics_first_use_text">Para poder fazer login usando o scanner de impressão digital você precisa primeiro usar a maneira padrão</string> - <string name="biometrics_security_title">Segurança biométrica</string> - <string name="biometrics_login_title">Início de sessão rápido</string> - <string name="biometrics_login_text">Gostaria de utilizar a sua impressão digital ou outro método biométrico para iniciar sessão?</string> - <string name="tab_tables">Tabelas</string> - <string name="table">Tabela</string> - <string name="login_https">https:// </string> <string name="delete_local_data_message">Dados não sincronizados serão perdidos. Deseja mesmo continuar?</string> - <string name="local_data_accept">Aceitar</string> <string name="delete_local_data_error">Não foi possível excluir os dados. Por favor tente novamente.</string> <string name="delete_local_data_done">Exclua os dados locais concluídos com sucesso.</string> <string name="org_unit_selection_warning">Pelo menos uma unidade organizacional deve ser selecionada</string> @@ -489,6 +276,7 @@ <string name="action_agree">Aceita</string> <string name="action_continue">Continuar</string> <string name="login_server_info_title">url do servidor</string> + <string name="login_server_info_message">Digite o URL do servidor DHIS 2 da sua organização, conforme fornecido pelo administrador do sistema.\n\nAlternativamente, você pode digitalizar um código QR contendo o URL do seu servido</string> <string name="forgot_your_code">Esqueceu seu código?</string> <string name="event_form_end_options_title">O que você gostaria de fazer para este evento?</string> <string name="sectionSelectorEnd">FIM</string> @@ -499,33 +287,16 @@ <string name="state_uploading">A carregar</string> <string name="state_relationship">Relação</string> <string name="sent_by_sms">Enviado por SMS</string> - <string name="no_conflicts_message">Não há conflitos para este programa</string> - <string name="network_unavailable_sms">A conexão de rede não está disponível, mas parece que existem serviços telefônicos - você pode usar o SMS.</string> - <string name="network_unavailable">A conexão de rede não está disponível.</string> <string name="action_close">Fechar</string> <string name="tuto_main_11">Agora você pode verificar as informações de sincronização clicando aqui</string> - <string name="no_conflicts_update_message">Esses dados são armazenados apenas no seu dispositivo, não está sincronizado com o servidor. </string> - <string name="no_conflicts_synced_message">Você esta atualizado! Todos os seus dados são enviados para o servidor.</string> <string name="relationship_error_recursive">Você não pode relacionar um registro consigo mesmo</string> - <string name="unblock_session">Desbloquear sessão</string> - <string name="data_set_complete">Completo</string> - <string name="data_set_open">Abrir</string> - <string name="unsupported_value_type">Tipo de valor não suportado</string> <string name="change_calendar_view">Alterar visualização da agenda</string> - <string name="data_every_fifteen_minutes">15 minutos</string> - <string name="data_every_hour">Toda hora</string> - <string name="data_every_day">Diário</string> - <string name="data_every_week">Semanal</string> - <string name="period_week">Semana</string> - <string name="sync_setting">Configuração de sincronização: %s</string> <string name="relationship_without_enrollment">O registro que você está tentando acessar não tem inscrição. Você não pode acessar o painel.</string> <string name="formatting_error">Erro de formatação</string> <string name="dashboard_menu_delete_tei_v2">Apagar%s</string> <string name="delete_authority_error">Você não tem autoridade para suprimir este registro</string> - <string name="validation_url">Este url não é válido</string> <string name="adjusting_form">Ajustando formulário...</string> - <string name="sms_receiver_number">Número do receptor</string> <string name="sms_amount_question">Você aceita enviar %d mensagens?</string> <string name="sms_sending">Enviando %1$d/%2$d</string> <string name="sms_waiting_amount_confirm">Aguardando confirmação do valor - %d</string> @@ -543,51 +314,29 @@ <string name="sms_error_no_gateway_set">Nenhum conjunto de porta de entrada</string> <string name="sms_error_no_user_login">Usuário não logado</string> <string name="sms_error_module_disabled">O módulo SMS está desativado</string> - <string name="sms_error_ongoing_sunmission">Outro envio de SMS em andamento</string> <string name="sms_metadata_empty">Módulo SMS não iniciado, não encontrado metadados necessários</string> - <string name="sms_completed">Completo</string> <string name="sms_count_error">Contagem de SMS não aceita</string> <string name="sms_state_started">Iniciado envio de sms</string> <string name="sms_state_converted">Dados lidos e convertidos. ID da submissão: %d</string> - <string name="sms_general_error">Erro ao enviar envio de sms</string> <string name="sms_title_enrollment">Registro e inscrição de SMS TEI</string> <string name="sms_title_event">Envio de evento por SMS</string> <string name="sms_title_data_set">envio de conjunto de dados SMS</string> - <string name="sms_bar_state_starting">Iniciando</string> - <string name="sms_bar_state_sending">Em curso</string> - <string name="sms_bar_state_sent">Enviar</string> - <string name="sms_bar_state_failed">Falhou</string> - <string name="start_sync_granular">Iniciando a sincronização.</string> <string name="syncing">Sincronizando...</string> - <string name="end_sync_granular">Sincronização concluída.</string> - <string name="error_sync">Ocorreu um erro durante a sincronização.</string> - <string name="error_sync_check_logs">Ocorreu um erro durante a sincronização. Clique aqui para verificar os logs de erros</string> - <string name="cancel_sync">Sincronização cancelada.</string> <string name="copied_text">Copiado</string> - <string name="image_selected">Imagem selecionada</string> - <string name="show_in_map">Mostrar no mapa</string> - <string name="show_list">Mostrar lista</string> <!--region TRACKER IMPORT CONFLICT MESSAGES--> - <string name="value_required_but_not_provided">%s é obrigatório mas não foi fornecido.</string> - <string name="polygon_captured">Polígono capturado</string> <string name="polygon">Poligono</string> <!--endregion--> - <string name="fingerprint_title">Impressão digital</string> - <string name="fingerprint_message">Por favor, coloque o dedo no seu leitor de impressões digitais.</string> <string name="security_title">Segurança</string> <string name="security_rooted_message">Por razões de segurança, esta versão do aplicativo não pode ser usada em dispositivos raiz. Por favor, use a versão de treinamento. </string> - <string name="fix_error">Existem alguns erros. Por favor corrija-os antes de continuar.</string> <string name="filters_active">Aplicação de filtros</string> <string name="filters_disabled">Nenhum filtro aplicado</string> <string name="filters_title_period">Período</string> <string name="filters_title_org_unit">Unidade Org.</string> - <string name="filters_title_sorting">Ordem</string> - <string name="filters_title_status">Estado</string> <string name="filters_title_state">Sincronizar</string> <string name="filters_title_assigned">Atribuído a mim</string> <string name="filter_period_today">Hoje</string> @@ -602,8 +351,6 @@ <string name="filter_period_form_to">De - Para</string> <string name="filter_period_other">Outro</string> <string name="filter_period_any">A qualquer momento</string> - <string name="data_values_error_sync_message">Falha na sincronização. Falha na sincronização. Verifique os valores dos dados para tentar corrigir o problema e tente novamente. Se continuar falhando, entre em contato com o administrador do sistema.</string> - <string name="sms_synced_message">Esses dados foram enviados ao servidor mas não é garantido que tenham sido armazenados</string> <string name="filter_event_status_open">Abrir</string> <string name="filter_event_status_schedule">Programar</string> <string name="filter_event_status_overdue">Atrasado</string> @@ -619,7 +366,6 @@ <string name="sms_empty_gateway">A porta de entrada do SMS não pode estar vazio</string> <string name="granular_sync_enrollments_empty">Não há inscrições para envio</string> <string name="granular_sync_unsupported_task">Este convertTask não é suportado</string> - <string name="disable_pin_locked">Não mostrar novamente a tela de bloqueio</string> <string name="set_pin">Definir pino</string> <string name="conflict">Conflito</string> <string name="change_event_date">Mudar data</string> @@ -644,11 +390,7 @@ <string name="choose_ou">Escolha a unidade organizacional</string> <string name="enter_url">Digite o URL</string> <string name="enter_value">Digite o valor</string> - <string name="choose_image">Escolha a imagem</string> - <string name="scan_code">Código de digitalização</string> - <string name="choose_option">Escolha a opção</string> <string name="reserved_values_hint">Valores reservados baixados por atributo TEI</string> - <string name="settings_reserved_values_message">Valores reservados baixados por atributo TEI</string> <string name="reserved_values_left">%s valores reservados restantes</string> <string name="manage_reserved_values_button">Gerenciar valores reservados</string> <string name="events_to_download">Eventos para baixar</string> @@ -668,55 +410,29 @@ <string name="filter_sync_not_synced">Não sincronizado</string> <string name="filter_sync_error">Erro de Sincronização</string> <string name="filter_sync_sms">SMS sincronizado</string> - <string name="dataset_overview">Detalhes</string> - <string name="dataset_comments">Comentarios</string> <string name="saved">Gravado!</string> - <string name="run_validation_rules">Você quer verificar a qualidade dos dados?</string> - <string name="validation_success_title">Tudo parece bem!</string> - <string name="mark_dataset_complete">Você também deseja completar o conjunto de dados?</string> - <string name="dataset_completed">Marcar como completado</string> - <string name="name">Nome</string> - <string name="formula">Fórmula</string> - <string name="complete_anyway">Completar mesmo assim</string> <string name="fk_message">Ausência de %s %s de %s %s</string> <string name="filters_title_event_status">Estado do evento </string> - <string name="enrollment_date">Data de inscrição</string> <string name="dataset_empty_list_can_create">Não existem dados. Clique em \"+\" para adicionar um novo registro</string> <string name="dataset_emtpy_list_can_not_create">Não existem dados. Você não tem permissão para adicionar novos registros.</string> <string name="validation_rules_empty_description">Nenhuma descrição ou instrução fornecida</string> <string name="validation_rules_data_to_review">Dados para revisar</string> - <string name="dataset_saved_completed">Salvo e concluído!</string> <string name="status_change_error_active_exist">Já existe uma inscrição ativa</string> <string name="enrollment_status_active">Abrir</string> <string name="enrollment_status_completed">Completo</string> <string name="enrollment_status_cancelled">Cancelado</string> - <string name="event_data">Dados</string> <string name="download_tei_error">O selecionado %s não pôde ser baixado.</string> - <string name="completed_by">Completado por %s: %s</string> - <string name="updated_time">Atualizado: %s</string> - <string name="action_done">Feito</string> - <string name="validation_internal_error_datasets">Não foi possível verificar a qualidade dos dados. Contate seu administrador</string> - <string name="are_you_sure">Tem certeza?</string> - <string name="reopen_question">Você deseja reabrir o conjunto de dados?</string> <string name="filters_title_date">Data</string> - <string name="filters_title_event_date">Data de incidente</string> - <string name="tei_type_has_no_attributes">%s não tem atributos públicos. Selecione um programa</string> <string name="privacy_policy_title">Política de Privacidade</string> <string name="open_privacy_policy">Clique aqui para conferir nosso <a href=""> política de privacidade </a></string> <string name="coordinates_error">Os valores das coordenadas não são válidos</string> + <string name="break_glass_error_v2">Não é possível inscrever um %s de outras unidades organizacionais neste programa porque está protegido.\nContacte o seu administrador.</string> <string name="field_is_mandatory">Este campo é obrigatório</string> <string name="security_debugger_message">Por razões de segurança, esta versão do aplicativo não pode ser usada com o adb. Por favor, use a versão de treinamento.</string> <string name="customactivityoncrash_error_activity_restart_app">Voltar</string> - <string name="customactivityoncrash_error_activity_close_app">Fechar aplicativo</string> - <string name="customactivityoncrash_error_activity_error_details">Mais detalhes</string> - <string name="customactivityoncrash_error_activity_error_details_title">Mais detalhes</string> - <string name="customactivityoncrash_error_activity_error_details_close">Fechar</string> <string name="customactivityoncrash_error_activity_error_details_copy">Copiar para área de transferência</string> - <string name="customactivityoncrash_error_activity_error_details_copied">Copiado para área de transferência</string> - <string name="customactivityoncrash_error_activity_error_details_clipboard_label">Informação de erro</string> <string name="metada_first_sync_error">Encontramos um erro ao sincronizar com seu servidor. Compartilhe o erro com o administrador do sistema, se for possível.</string> - <string name="error_init_session">Não foi possível fazer login com seu nome de usuário</string> <string name="enrollment_date_edition_warning">Existem eventos planejados que não serão reprogramados</string> <string name="section_charts">Gráficos</string> <string name="navigation_list_view">Lista</string> @@ -767,46 +483,27 @@ <string name="section_feedback">Retroinformacão</string> <string name="section_indicators">Indicadores</string> <string name="value">Valor</string> + <string name="camera_permission_denied">A permissão da câmara é negada.\nPrecisa de a ativar para utilizar esta funcionalidade.</string> <string name="section_charts_indicators">Gráficos e indicadores</string> <string name="take_photo"> Tirar fotografia</string> - <string name="from_gallery">Selecionar a partir da galeria</string> - <string name="data_set_quality_check_done">Feito!</string> <string name="break_glass_dialog_title">Este programa está protegido</string> <string name="break_glass_hint">Descreva aqui o motivo</string> - <string name="authenticating">Autenticando</string> - <string name="login_error_no_dhis_instance">O URL do servidor fornecido não é uma instância dhis</string> - <string name="login_error_bad_credentials">Credenciais erradas</string> - <string name="login_error_unknown_host">Servidor desconhecido</string> - <string name="invalid_integer">Valor deve ser um número inteiro</string> <string name="openid_session_expired">A sessão expirou</string> <string name="openid_session_expired_message">A sua sessão atual expirou. Por motivos de segurança, terá de fornecer novamente as suas credenciais</string> - <string name="dataset_column_default">Valores</string> <string name="week_period_span_default_label">Semana %d %s a%s</string> <string name="action_do_not_show_again">Não voltar a mostrar</string> <string name="feature_configuration">Configuração de funções</string> <string name="show_radar_graph">Mostrar como radar</string> - <string name="coordinate_feature_type_error">Não é possível definir o tipo de coordenadas</string> <string name="filter_follow_up_label">Seguimento%s</string> - <string name="wrong_date_format">%s não pode ser analisado como uma data</string> <string name="update_field_error">Não foi possível atualizar este campo. Por favor, tente novamente</string> - <string name="edition">Edição</string> - <string name="available">Disponível</string> <string name="blocked_by_completion">Estes dados não são editáveis porque estão marcados como concluídos</string> <string name="edition_expired">Estes dados não são editáveis porque o seu tempo de edição expirou</string> <string name="edition_no_write_access">Não tem permissão para editar estes dados</string> <string name="event_date_not_in_orgunit_range">Estes dados não são editáveis porque a unidade organizacional está encerrada</string> <string name="edition_no_catcombo_access">Não tem permissão para editar estes dados</string> - <string name="edition_orgunit_capture_scope">Não é possível editar dados desta unidade organizacional</string> - <string name="reload_list">Repor a pesquisa</string> + <string name="edition_orgunit_user_scope">Não é possível editar dados desta unidade organizacional</string> <string name="error_tei_online_search_title">A pesquisa em linha deu a seguinte mensagem:</string> - <string name="program_rules_loop_warning_title">Aviso de regras do programa</string> - <string name="program_rules_loop_warning_message">Existe um problema de configuração que está a provocar um ciclo nas regras. Contacte o seu administrador.</string> - <string name="granular_sync_refresh">ACTUALIZAR</string> - <string name="unknown_date">Desconhecido</string> - <string name="granular_sync_refresh_title">Atualizar todos os dados</string> - <string name="max_accounts_text"> Atingiu o número máximo de contas (%d). Para adicionar uma nova conta, inicie sessão e elimine uma das suas contas</string> <string name="delete_account">Eliminar conta</string> - <string name="manage_accounts">Gerir contas</string> <string name="main_menu_troubleshooting">Resolução de problemas de configuração</string> <string name="troubleshooting_language_title">Idioma</string> <string name="troubleshooting_language_description">Toque aqui para alterar o idioma da aplicação</string> @@ -824,15 +521,14 @@ <string name="search_no_results">Não existem resultados para esta pesquisa</string> <string name="search_too_many_results">Muitos resultados</string> <string name="search_too_many_results_message">Tente alterar a sua pesquisa para restringir os resultados.</string> - <string name="search_create_new">Crie um novo</string> <string name="search_new_te_type">Novo %s</string> - <string name="search_min_attributes_message">É necessário introduzir pelo menos %s atributos para pesquisar</string> <string name="action_ok">Esta bem</string> <string name="init_search">Iniciar uma pesquisa para encontrar qualquer %s</string> <string name="search_or_create">É possível pesquisar ou criar um novo %s</string> <string name="missing_warning_fields_completed_events">Tem algumas mensagens de aviso.</string> <string name="event_can_be_completed">Deseja marcar este formulário como completo?</string> <string name="changes_will_be_discarted">Se sair agora, as alterações serão rejeitadas.</string> + <string name="event_error_on_complete">Tem algumas mensagens de erro. Quer revê-las?</string> <string name="re_opened">Reaberto</string> <string name="account_disable_title">Conta desactivada</string> <string name="account_disable_message">A sua conta foi desactivada por um administrador.</string> @@ -842,27 +538,10 @@ <string name="customactivityoncrash_error_activity_current_date">Data actual: %s</string> <string name="customactivityoncrash_error_activity_device">Dispositivo: %s</string> <string name="customactivityoncrash_error_activity_os_version">Versão do sistema operativo: %s</string> - <string name="open_details">Abrir detalhes de %s </string> - <string name="tracked_entity_type_details">%s detalhes</string> <string name="syncing_resource">A sincronizar %s…</string> - <string name="sms_sync_waiting_for_response">SMS enviado. A aguardar resposta do servidor.</string> - <string name="sms_sync_sms_reached_server">SMS confirmado para chegar ao servidor. Actualização do estado</string> - <string name="sms_sync_sms_reached_server_error">Não podemos confirmar se o SMS chegou ao servidor. Actualização do estado</string> - <string name="sms_sync_sent">SMS enviado. Atualização do estado.</string> - <string name="sms_sync_not_sent">SMS não enviado.</string> - <string name="sms_sync_opening_app">Abrir a aplicação SMS. Não modificar a mensagem, por favor.</string> <string name="sms_sync_sms_app_chooser_title">Enviar Sms com</string> <string name="sms_sync_is_sms_sent">Enviou a sms?</string> - <string name="sms_sync_manual_confirmation">A aguardar confirmação manual</string> - <string name="syncing_events">Sincronização de eventos</string> - <string name="syncing_teis">Sincronização de entidades monitorizadas</string> - <string name="syncing_data_sets">Sincronização de conjuntos de dados</string> - <string name="syncing_resources">Sincronização de recursos</string> - <string name="syncing_done">Sincronização efectuada</string> - <string name="sms_available_for_individual_records">A sincronização de SMS está disponível, mas tem de ser acedida para cada registo individual</string> <string name="downloading_image_resources">Descarregar imagens...</string> - <string name="program_description">Descrição do programa</string> - <string name="wrong_pin">Pin errado</string> <string name="enrolledIn">Inscrito em</string> <string name="ownedBy">Propriedade de</string> <string name="sync_dialog_title_not_synced">Sincronização necessária</string> @@ -882,22 +561,11 @@ <string name="sync_dialog_action_refresh">Actualizar</string> <string name="sync_dialog_action_not_now">Não agora</string> <string name="tap_to_explore_action">Toque aqui para explorar</string> - <plurals name="error_count_label"> - <item quantity="one">%s erro</item> - <item quantity="many">%s erros</item> - <item quantity="other">%s Erros</item> - </plurals> - <plurals name="warning_count_label"> - <item quantity="one">%s aviso</item> - <item quantity="many">%s avisos</item> - <item quantity="other">%s Alertas</item> - </plurals> <string name="new_version_message">A versão <b>%s</b> aplicação já está disponível. Quer baixá-lo?</string> <string name="software_update"> Atualização do software</string> <string name="remind_me_later">Mais tarde</string> <string name="download_now">Descarregar agora</string> <string name="check_for_updates">Verifique se existem atualizações</string> - <string name="checking_for_updates">Verificação de actualizações</string> <string name="no_updates">Não há novas actualizações</string> <string name="app_version">Versão da aplicação</string> <string name="error_applying_rule_effects">Algo correu mal com a configuração do programa, não é possível carregar este evento. Contacte o administrador do sistema.</string> @@ -934,8 +602,6 @@ <string name="program_stage">Estagio de programa</string> <string name="event">evento</string> <string name="timeline">Linha do tempo</string> - <string name="clear_search">Limpar pesquisa</string> - <string name="optional">Opcional</string> <string name="database_export_downloaded">Banco de dados descarregado</string> <string name="importing_database">Importando base de dados</string> <string name="show_more">Mostre mais</string> @@ -957,4 +623,21 @@ <string name="successfully_transferred">Transferido com sucesso</string> <string name="event_cancelled">%1$s cancelado</string> <string name="due_date_updated">Data de vencimento actualizada</string> - </resources> + <plurals name="error_count_label"> + <item quantity="one">%s erro</item> + <item quantity="many">%s erros</item> + <item quantity="other">%s Erros</item> + </plurals> + + <plurals name="warning_count_label"> + <item quantity="one">%s aviso</item> + <item quantity="many">%s avisos</item> + <item quantity="other">%s Alertas</item> + </plurals> + + <plurals name="settings_specific_programs"> + <item quantity="one">Há sim %s programa com configurações específicas</item> + <item quantity="many">Há%s programas com configurações específicas</item> + <item quantity="other">Há%s programas com configurações específicas</item> + </plurals> +</resources> diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index c777a674a2e..c55464225ca 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -1,8 +1,6 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!-- Warnings and error messages --> <string name="error">Eroare</string> - <string name="add_new">Adăugare nou</string> - <string name="add">Adăugare</string> <string name="MONTHLY">Lunar</string> <string name="YEARLY">Anual</string> <string name="action_accept">Accept</string> @@ -15,16 +13,18 @@ <string name="active">Activ</string> <string name="state_error">Eroare</string> + + <!--Completion--> + <!--Event initial--> - <string name="create">Creare</string> <string name="update">Actualizare</string> - <string name="date">Data</string> - <string name="new_event">Eveniment nou</string> <!--DataSet initial--> <string name="report_period">Perioada raportului</string> <string name="cancel">Anulare</string> <string name="delete">Lichidare</string> + <!--TEI DASHBOARD--> <string name="edit">Editare</string> + <!--DONE TASKS--> <string name="events">evenimente</string> <string name="done_task">Acasă</string> <string name="wipe_data_ok">Accept</string> @@ -32,37 +32,22 @@ <string name="settingsTwoFAStatus">Stare</string> <!--endregion--> - <string name="enrollmment_date">Data înrolării</string> - <!-- SEARCH OPTION SET --> <string name="search_optionset">Căutare</string> <!--FORM FRAGMENT--> <string name="report_date">Data raportului</string> + <!--EVENT SUMMARY--> + <!--AGE CUSTOM VIEW--> - <string name="hint_day">Zile</string> - <string name="hint_month">Luni</string> - <string name="hint_year">Ani</string> - <string name="week">Săptămâni</string> <string name="incident_date">Data incidentului</string> + <!-- RELATIONSHIPS --> <string name="next">Următorul</string> - <string name="SAVE">salva</string> <string name="qr_relationships">Relații</string> <string name="share">Partajare</string> - <string name="max">Max</string> - <string name="warning_on_complete_title">Avertizare</string> - <string name="error_on_complete_title">Eroare</string> <string name="save">salva</string> <string name="menu_home">Acasă</string> - <string name="dashboard_relationships">Relații</string> - <string name="dashboard_indicators">Indicatori</string> - <string name="event_indicators">Indicatori</string> - <string name="finish">Finalizare</string> - <string name="local_data_accept">Accept</string> - <string name="action_continue">Continuare</string> <string name="state_warning">Avertizare</string> <string name="action_close">Închidere</string> - <string name="sms_completed">Complet</string> - <string name="filters_title_status">Stare</string> <string name="filter_period_today">Astăzi</string> <string name="filter_period_yesterday">Ieri</string> <string name="filter_period_this_week">Săptămâna aceasta</string> @@ -71,12 +56,8 @@ <string name="filter_period_last_month">Luna trecută</string> <string name="filter_event_status_completed">Complet</string> <string name="interval_yesterday">Ieri</string> - <string name="dataset_comments">Comentarii</string> - <string name="enrollment_date">Data înrolării</string> <string name="enrollment_status_cancelled">Anulat</string> - <string name="action_done">Terminat</string> <string name="filters_title_date">Data</string> - <string name="customactivityoncrash_error_activity_error_details_close">Închidere</string> <string name="filter_period_last_quarter">Ultimul trimestru</string> <string name="filter_period_weeks_this_year">Săptămâni în anul curent</string> <string name="filter_period_months_this_year">Luni în anul curent</string> diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index bbf63ec9bdb..462c583a6b6 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1,66 +1,28 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!--GENERAL--> <string name="app_name">Dhis2</string> - <string name="logo_text">dhis</string> - <string name="logo_number">2</string> <!-- Warnings and error messages --> <string name="error">Ошибка</string> - <plurals name="error_message"> - <item quantity="one">Ошибка</item> - <item quantity="few">Ошибки</item> - <item quantity="many">Ошибки</item> - <item quantity="other">Ошибки</item> - </plurals> - <string name="error_wrong_server_url">Неправильный веб-адрес</string> - <string name="error_wrong_credentials">Неверные учетные данные</string> - <string name="error_unexpected_error">Непредвиденная ошибка</string> - <string name="error_internal_server_error">Внутренняя ошибка сервера</string> - <string name="no_value">нет значения</string> <string name="no_reserved_values">Больше нет зарезервированных значений. Обратитесь к системному администратору</string> - <string name="no_reserved_values_connection">Зарезервированных значений больше нет. Подключитесь к сети, чтобы пополнить их</string> - <string name="errors">ошибки</string> <string name="something_wrong">Что-то пошло не так</string> <!-- SyncService strings: --> - <string name="sync_now">Синхронизировать сейчас</string> - <string name="sync_text">Синхронизация с сервером</string> - <string name="sync_title">Синхронизация сейчас</string> - <string name="sync_metadata">Метаданные</string> <string name="sync_events">События</string> - <string name="sync_tei">Отслеживаемые объекты</string> - - <string name="sync_complete_title">Завершено</string> - <string name="sync_complete_text">Синхронизация завершена</string> <string name="sync_error_title">Ошибка синхронизации</string> <string name="sync_error_text">Во время синхронизации произошла ошибка. Пожалуйста, повторите попытку.</string> <string name="sync_incomplete_error_text">Синхронизация завершена, но мы не получили подтверждения сервера для всех записей. Эти записи по-прежнему отмечены в приложении как \"оффлайн\". Мы рекомендуем повторить синхронизацию.</string> - <string name="data_sync_warning_program">ВНИМАНИЕ: Большая часть данных синхронизирована, но некоторые поля представлены с конфликтами. Синхронизируйте конфигурацию и повторите попытку. Если предупреждение сохраняется, проверьте статус синхронизации: программы, отслеживаемые объекты и события с конфликтами отмечены как @.</string> - <string name="server_sync_error">Произошла ошибка, и сервер не ответил. Обратитесь к своему администратору.</string> - - <string name="search_result_text">%s результатов найдено</string> - <string name="add_new">Добавить новое</string> - <string name="add">Добавить</string> <string name="enter_event_data">Введено %s</string> <string name="enter_cancel_event_data">Введено / пропущено%s</string> - <string name="schedule_new">Распланировать новое</string> <string name="referral">Направление</string> <!-- Login --> - <string name="url_hint">Адрес веб-страницы сервера</string> - <string name="user_hint">Имя пользователя</string> - <string name="password_hint">Пароль</string> - <string name="log_in_button">Вход</string> - <string name="unlock_button">Разблокировать сессию</string> <string name="syncing_configuration">Синхронизация Вашей конфигурации</string> <string name="syncing_data_shortly">Ваши данные вскоре будут синхронизированы</string> <string name="syncing_data">Синхронизация данных</string> <string name="configuration_ready">Ваша конфигурация готова</string> <string name="data_ready">Ваши данные готовы</string> - <string name="configuration_sync_failed">Не удалось синхронизировать конфигурацию</string> - <string name="data_sync_failed">Сбой синхронизации данных</string> <string name="account_recovery">Восстановить учетную запись</string> - <string name="no_network_to_recover_account">Для восстановления учетной записи необходимо подключение к сети.</string> <!--PERIOD--> <string name="DAILY">Ежедневно</string> @@ -81,134 +43,82 @@ <string name="enter_text">Введите текст</string> <string name="enter_long_text">Введите длинный текст</string> <string name="enter_number">Введите номер</string> - <string name="enter_integer">Введите целое число</string> <string name="enter_negative_integer">Введите отрицательное целое число</string> <string name="enter_positive_integer_or_zero">Введите целое положительное число или ноль</string> <string name="enter_positive_integer">Введите целое положительное число</string> - <string name="filter_options">Параметры фильтров</string> <string name="choose_date">Выберите дату</string> - <string name="change_calendar">Изменить календарь</string> <!-- Status --> - <string name="program_completed">Программа завершена</string> - <string name="program_inactive">Программа неактивна</string> <string name="event_open">Открыть</string> <string name="event_not_completed">Не завершено</string> <string name="event_completed">Событие завершено</string> <string name="read_only">Только читать</string> - <string name="finish_and_complete">Закончить и завершить</string> <string name="completed">Завершенный</string> <string name="cancelled">Отмененный</string> <string name="re_open">Открыть заново</string> - <string name="re_open_form">Открыть форму заново</string> - <string name="activate">Активировать</string> <string name="active">Действующий</string> <!-- State --> <string name="state_synced">Синхронизировать</string> <string name="state_to_post">Отправить</string> <string name="state_to_update">Обновить</string> - <string name="state_to_delete">Удалить</string> <string name="state_error">Ошибка</string> - <string name="action_sync">СИНХРОНИЗАЦИЯ</string> - <string name="action_send">ОТПРАВИТЬ</string> - <string name="action_sync_sms">СИНХРОНИЗАЦИЯ ПО SMS</string> <!--Completion--> - <string name="completion">Завершение</string> <!--Event initial--> - <string name="create">Создать</string> <string name="update">Обновить</string> - <string name="date">Дата</string> <string name="org_unit">Организационная единица</string> <string name="no_org_units">На выбранную дату нет свободных организационных единиц. Пожалуйста, выберите другую дату или другую организационную единицу. </string> - <string name="category_option">Опции категории</string> <string name="latitude">Широта</string> <string name="longitude">Долгота</string> - <string name="new_event">Новое событие</string> - <string name="one_time">Один раз</string> - <string name="permanent">Постоянно</string> <!--DataSet initial--> <string name="report_period">Отчет за период</string> - <string name="field_required">Если вы задали значение, то для заполнения набора данных в строке должны быть все значения.</string> - <string name="field_mandatory">Некоторые необходимые значения отсутствуют. Для заполнения набора данных необходимо установить обязательные значения.</string> - <string name="field_mandatory_v2">Не заполнены обязательные поля. Пожалуйста, заполните их, чтобы завершить набор данных.</string> - <string name="datavalue_saved">Значение сохранено!</string> - <string name="there_is_no_available_period">Нет доступных периодов для выбора.</string> <!--Event Detail--> <string name="due_date">Дата выполнения</string> <string name="next_event">Следующий %1$s</string> - <string name="date_default">ДД/ММ/ГГГГ</string> <string name="cancel">Отмена</string> <string name="delete">Удалить</string> - <string name="total">Всего</string> <string name="most_recent_event_date">Дата последнего события</string> <string name="no_options">Нет доступных вариантов</string> <!--TEI Enrollment list--> <string name="enrollment_list">Список регистраций</string> <string name="active_programs">Действующие программы</string> - <string name="to_enroll_programs">Программы для регистрации</string> <string name="enroll">Регистрировать</string> - <string name="last_visit">Последнее посещение:</string> - <string name="apply">применить</string> <!--TEI DASHBOARD--> - <string name="see_details">Посмотреть детали</string> - <string name="view_more">ПОСМОТРЕТЬ БОЛЬШЕ</string> <string name="edit">Редактировать</string> - <string name="follow_up">Отслеживать</string> - <string name="follow_up_enabled">Последующие действия включены</string> - <string name="follow_up_disabled">Последующие действия выключены</string> <string name="deactivate">Деактивировать</string> <string name="program_not_allow_events">Эта программа не позволяет иметь больше событий</string> <!--DONE TASKS--> - <string name="events_no_data">Нет данных</string> <string name="events">события/й</string> <string name="done_task">Главная</string> - <string name="app_info">Информация о приложении</string> <string name="log_out">Выйти из системы</string> - <string name="block_session">Заблокировать сессию</string> <string name="show_more_events">Показать %s больше...</string> <string name="show_less_events">Показать меньше...</string> <!-- SYNC --> - <string name="a_minute">1 минута</string> - <string name="fifteen_minute">15 минут</string> <string name="thirty_minutes">30 минут</string> <string name="a_hour">1 час</string> <string name="every_6_hours">6 часов</string> <string name="a_day">1 день (по умолчанию)</string> <string name="every_12_hours">12 часов</string> - <string name="Automatic_Sync_Data">Автоматическая синхронизация данных каждый:</string> <string name="Manual">Вручную</string> - <string name="Automatic_Sync_Metadata">Автоматическая синхронизации конфигурации каждый:</string> <string name="a_week">1 неделя</string> <string name="sync_max_parameters">Текущие параметры синхронизации:</string> <string name="sync_default_parameters">Возвратить в исходное положение по умолчанию</string> + <string name="wipe_data_meesage">База данных будет удалена.Вам будет предложено войти в систему снова.</string> <string name="wipe_data_ok">Принять</string> <string name="wipe_data_no">Отмена</string> <string name="SYNC_DATA">СИНХРОНИЗИРОВАТЬ данные сейчас</string> <string name="SYNC_META">СИНХРОНИЗИРОВАТЬ конфигурацию сейчас</string> <string name="SYNC_MANAGER">Настройки</string> - <string name="last_data_sync_date">Последняя синхронизация: %s</string> - <string name="last_metadata_sync_date">Последняя синхронизация: %s</string> - <string name="settings_sms_module_title">Модуль SMS:</string> - <string name="settings_sms_result_timeout_hint">секунд</string> - <string name="settings_sms_result_sender_hint">число</string> - <string name="settings_sms_receiver_number_hint">число</string> <string name="settings_sms_module_switch">Включить отправку SMS</string> <string name="settings_sms_response_wait_switch">Дождитесь ответа на SMS-сообщение</string> - <plurals name="settings_specific_programs"> - <item quantity="one">Существует программа %s с определенными настройками.</item> - <item quantity="few">Существуют программы %s с определенными настройками.</item> - <item quantity="many">Существуют программы %s с определенными настройками.</item> - <item quantity="other">Существуют программы %s с определенными настройками.</item> - </plurals> <string name="settings_limit_scope">Настройки ограничены</string> <string name="settings_limit_globally">Глобально</string> <string name="settings_limit_program">по программам</string> @@ -226,19 +136,14 @@ <string name="settingsErrorLog_descr">Этот журнал содержит все ошибки, вызванные синхронизацией данных и метаданных.</string> <string name="settingsDeleteLocalData">Удалить локальные данные</string> <string name="settingsDeleteLocalData_descr">Все данные приложения Capture App, хранящиеся на вашем устройстве, будут удалены. Данные, не синхронизированные с сервером, будут потеряны.</string> - <string name="settingsReset">Сброс данных приложения &amp; конфигурация</string> - <string name="settingsReset_descr">Ваша конфигурация и данные приложения, хранящиеся на устройстве, будут удалены. Вам будет предложено снова войти в систему, а данные, не синхронизированные с сервером, будут потеряны.</string> <string name="settingsSms">Настройки SMS</string> <string name="settingsSms_descr">Проверка и редактирование параметров, связанных с SMS-шлюзом</string> <string name="settingsCheckVersion">Обновление программного обеспечения</string> - <string name="settingsCheckVersionMessage">Программное обеспечение</string> <string name="settingsExportDB">Экспорт базы данных</string> <string name="settingsExportDBMessage">Экспортируйте свою базу данных и передайте ее Вашему администратору</string> <string name="settingsTwoFAStatus">Статус</string> <!--endregion--> - <string name="enrollmment_date">Дата зачисления</string> - <!-- SEARCH OPTION SET --> <string name="search_optionset">Поиск</string> <!--FORM FRAGMENT--> @@ -259,29 +164,15 @@ <string name="tei_coordinates">Координаты для</string> <!--EVENT SUMMARY--> - <string name="section_list">Список разделов</string> - <string name="event_summary_header" formatted="false">%s вопросов %s завершены</string> - <string name="event_summary_sections_header" formatted="false">%sиз %s завершено</string> - <string name="complete_and_close">Завершить и закрыть</string> <!--AGE CUSTOM VIEW--> - <string name="hint_day">Дни</string> - <string name="hint_month">Месяцы</string> - <string name="hint_year">Годы</string> - <string name="week">Недели</string> <string name="incident_date">Дата происшествия</string> - <string name="local_results">Локальные результаты</string> - <string name="online_results">Результаты онлайн</string> <string name="past_programs">Прошлые программы </string> <!--PERMISSIONS--> <string name="permission_denied">У Вас нет необходимых полномочий для выполнения этого действия</string> - <string name="add_relation_button">Добавить как...</string> - <string name="date_dialog_clear">Очистить</string> <string name="period">Период</string> - <string name="org_unit_filter">(%d) Орг.подразделение</string> - <string name="org_unit_select_level">Уровень %d</string> <string name="tuto_main_1">Добро пожаловать в dhis2</string> <string name="tuto_main_2">Здесь Вы можете увидеть свою деятельность</string> <string name="tuto_main_3">Вы можете применить фильтр...</string> @@ -290,16 +181,11 @@ <string name="tuto_main_6">Проверьте другие действия в главном меню</string> <!-- RELATIONSHIPS --> - <string name="default_relationship_label">Создать взаимоотношения</string> <string name="next">Следующая</string> <string name="search_min_num_attr">Для поиска необходимо ввести как минимум %d атрибутов.</string> - <string name="search_attr">Чтобы выполнить поиск, необходимо ввести хотя бы один из атрибутов</string> - <string name="search_max_tei_reached">Есть больше, чем %d результатов. Пожалуйста, введите дополнительные критерии поиска</string> - <string name="search_init">Введите критерии поиска</string> <!-- QR --> <string name="QR_SCANNER">Импорт данных через QR</string> - <string name="SAVE">Сохранить</string> <string name="button_ok">ОК</string> <string name="qr_id">Идентификация</string> <string name="qr_attributes">Атрибуты</string> @@ -311,29 +197,19 @@ <string name="qr_no_data">нет данных</string> <string name="qr_error_id">Неверный QR-код</string> <string name="qr_error_attr">Этот атрибут не может быть добавлен</string> - <string name="qr_error_enrollment">Эта регистрация не может быть добавлена</string> <string name="about">Об</string> <string name="programs_to_enroll">Программы для регистрации</string> - <string name="select_all">выбрать всё</string> - <string name="clear_all">очистить выбор</string> - <string name="empty_program_list">Для выбранных фильтров нет информации. Пожалуйста, попробуйте изменить их.</string> <string name="share">Поделиться</string> <string name="share_qr">Поделиться QR</string> <string name="max">Макс</string> <string name="current">Текущий</string> <string name="tei">TEI</string> - <string name="programs_list">Список программ</string> <string name="wipe_data">Сброс данных приложения &amp; конфигурации</string> - <string name="add_relationship_error">Невозможно добавить эту связь </string> <string name="warning_error_on_complete_title">Проверьте это!</string> - <string name="warning_on_complete_title">Предупреждение</string> - <string name="error_on_complete_title">Ошибка</string> <string name="save">Сохранить</string> <string name="reserved_value">Зарезервированные значения</string> - <string name="downloaded_confirm">Хотите добавить больше данных с помощью QR-кода?</string> - <!--ABOUT--> <string name="about_app">Версия приложения: %s</string> <string name="about_sdk">Версия SDK: %s</string> @@ -344,125 +220,41 @@ <string name="about_dev">Разработан и поддерживается проектом <a href="https://www.dhis2.org/">DHIS2</a>, входящим в состав Университета Осло, <a href="https://www.mn.uio.no/ifi/english/">департамент информатики</a>.</string> <string name="about_contact">Для получения дополнительной информации или вопросов по данному приложению пишите по адресу <a href="mailto:android@dhis2.org">android@dhis2.org.</a></string> - <string name="login_error_null_pass">Пароль отсутствует. Пожалуйста, заполните это поле.</string> - <string name="login_error_null_username">Имя пользователя отсутствует. Пожалуйста, заполните это поле.</string> - <string name="login_error_dhis_version">На этом сервере установлена версия dhis, отличная от 2.29. Обновите версию своего сервера или используйте тестовую среду для продолжения работы.</string> - <string name="login_error_dhis_version_v2">На этом сервере установлена версия dhis, отличная от %s. Обновите версию своего сервера или используйте тестовую среду для продолжения работы.</string> - <string name="login_error_unsuccessful_response">Что-то пошло не так. Пожалуйста, проверьте правильность url-адреса сервера, имени пользователя и пароля и повторите попытку.</string> - <string name="login_error_error_response">Сервер не смог выполнить этот запрос.</string> - <string name="login_error_default">При попытке войти на сервер возникла проблема.</string> - <string name="login_error">Ошибка входа в систему</string> - <string name="missing_mandatory_fields">Не заполнены обязательные поля </string> - <string name="online_search_unexpected">Неожиданная ошибка при поиске онлайн</string> - <string name="online_search_parsing_error">Ошибка при разборе результатов</string> - <string name="online_search_error">Поиск онлайн дал ошибку</string> - <string name="online_search_response_error">Что-то пошло не так на сервере</string> <string name="search_program_not_selected">Выберите программу для возможности регистрации</string> <string name="search_access_error">У Вас нет требуемого разрешения</string> - <string name="feature_unavaible">Эта функциональность еще не готова.</string> - <string name="relationship_label_error">Ошибка при получении метки взаимоотношений</string> <string name="all_tei_type">Все %s</string> <string name="invalid_phone_number">Это недействительный номер телефона</string> - <string name="invalid_email">Это недействительный адрес электронной почты</string> - <string name="invalid_negative_number">Допускаются только отрицательные числа</string> <string name="invalid_possitive_zero">Допускаются только положительные числа или ноль</string> - <string name="invalid_possitive">Допускаются только положительные числа</string> - <string name="invalid_interval">Допускаются только значения от 0 до 1</string> - <string name="invalid_percentage">Допускаются только значения от 0 до 100</string> - <string name="date_dialog_tigle">Выберите даты для фильтрации</string> <string name="select_option">Выберите опцию</string> - <string name="issue_reported">Сообщается о проблеме</string> - <string name="dialog_generate_new_event">Создать новое событие</string> - <string name="message_generate_new_event">Хотите создать еще одно событие?</string> <string name="event_completed_title">Завершенные события</string> <string name="event_completed_message">Все события в этой программе завершены. Вы хотите закрыть и эту программу?</string> - <string name="complete_enrollment_message">Вы хотите также завершить регистрацию?</string> <string name="complete_enrollment_message_V2">Вы хотите также завершить %s?</string> <string name="check_event">Проверьте</string> <string name="menu_home">Главная</string> <string name="appwidget_text">ПРИМЕР</string> - <string name="add_widget">Добавить виджет</string> <string name="showHelp">Показать помощь</string> - <string name="tuto_settings_1">Синхронизация Ваших данных...</string> - <string name="tuto_settings_2">...Вашей конфигурации...</string> - <string name="tuto_settings_3">...задайте количество записей, которые нужно загрузить с сервера...</string> - <string name="tuto_settings_reserved">Проверяйте и управляйте количеством оставшихся зарезервированных значений</string> - <string name="tuto_settings_errors">Проверьте, не нарушилось ли соединение с сервером</string> - <string name="tuto_settings_reset">Освободите немного места на диске</string> - <string name="tuto_settings_4">...или удалите все, чтобы начать сначала.</string> - <string name="tuto_search_2">Вы можете переключиться на другие программы</string> - <string name="tuto_search_3_v2">Поиск или добавление новых объектов. Прежде чем добавить новый объект, необходимо выполнить поиск!</string> - <string name="tuto_search_4_v2">Нажмите здесь, чтобы очистить поля и заново начать поиск.</string> - <string name="tuto_dashboard_3">...Делитесь информацией через QR или SMS...</string> - <string name="tuto_dashboard_5">Нажмите, чтобы создать или запланировать событие или обратиться к другому орг. подразделению.</string> <string name="tuto_dashboard_6">Здесь вы увидите все события. Нажмите, чтобы просмотреть подробности события.</string> <string name="tuto_dashboard_7">Перемещайтесь по меню, чтобы добавить связи, посмотреть индикаторы или написать заметки.</string> - <string name="tuto_tei_event_1">Нажмите, чтобы удалить это событие. Это действие нельзя отменить.</string> - <string name="tuto_tei_event_2">Завершить событие.</string> - <string name="tuto_program_event_1">Все события, связанные с этой программой, будут перечислены здесь.</string> - <string name="tuto_program_event_2">Нажмите, чтобы добавить новое событие</string> <string name="tuto_event_initial_new_1">Введите все данные для создания событие</string> <string name="tuto_event_initial_1">Нажмите, чтобы проверить состояние завершения события.</string> - <string name="tuto_event_summary">Нажмите, чтобы завершить или снова открыть событие</string> - <string name="tuto_main_7">Считывайте и сохраняйте информацию с других устройств с помощью QR</string> - <string name="tuto_main_8">Синхронизация Ваших данных с сервером</string> - <string name="tuto_main_9">Заблокируйте сессию с помощью 4-значного кода. Не забывайте свой код!</string> - <string name="tuto_main_10">Выйдите из системы, чтобы сменить пользователя или сервер. Вы сможете снова войти в систему даже при отсутствии подключения к Интернету.</string> - <string name="text_plus_colon">%s:</string> <string name="relationships">связи</string> <string name="empty_tei_add">Нет зарегистрированных событий, нажмите \"+\", чтобы добавить новое.</string> - <string name="empty_tei_no_add">Нет зарегистрированных событий.</string> <string name="qr_data_values">Значение данных</string> <string name="info">Информация</string> <string name="qr_no_id_error">Невозможно прочитать этот Id</string> <string name="delete_local_data">Удаление локальных данных</string> <string name="dashboard_overview">Обзор</string> - <string name="dashboard_relationships">Зависимости</string> - <string name="dashboard_indicators">Индикаторы</string> - <string name="dashboard_analytics">Аналитика</string> <string name="empty_indicators">Для этой программы не существует индикаторов.</string> - <string name="dashboard_notes">Заметки</string> - <string name="unable_to_complete">Невозможно завершить</string> - <string name="unable_to_save">Невозможно сохранить</string> - <string name="warnings_in_form">Есть предупреждения в форме</string> - <string name="what_to_do">Что Вы хотите делать?</string> - <string name="field_errors">В некоторых полях есть ошибки. Пожалуйста, проверьте их, чтобы заполнить</string> <string name="unselect_enrollment">Все регистрации</string> <string name="unselect_enrollment_description">Показать инфопанель со всеми активными программами</string> - <string name="CHECK_SYNC_ERRORS">Открыть журнал ошибок синхронизации</string> <string name="error_dialog_title">Журнал ошибок синхронизации</string> <string name="share_with">Поделиться с...</string> - <string name="errors_during_sync">Синхронизация Вашей конфигурации не удалась. Возможно, на Вашем сервере возникли ошибки. Нажмите здесь для получения дополнительной информации.</string> - <string name="sectionSelectorPrev">ПРЕДЫДУЩИЙ</string> - <string name="sectionSelectorNext">СЛЕДУЮЩИЙ</string> - <string name="event_overview">Детали</string> - <string name="event_indicators">Индикаторы</string> - <string name="event_notes">Заметки</string> - <string name="complete_add_new"><![CDATA[Завершить & добавить новое]]></string> - <string name="complete_later">Завершить позже</string> - <string name="finish">Завершить</string> - <string name="error_fields_title">Поля с ошибками</string> - <string name="error_fields_events">Некоторые поля содержат ошибки. Они не были сохранены. Пожалуйста, проверьте их.</string> <string name="unique_warning">Значение должно быть уникальным, совпадение найдено. Оно не было сохранено. Пожалуйста, проверьте его.</string> - <string name="unique_coincidence_found">Найдено совпадение в уникальном поле. Пожалуйста, проверьте форму, чтобы сохранить регистрацию.</string> <string name="please_wait">Пожалуйста, подождите</string> <string name="skip">Пропустить</string> - <string name="reschedule">Перепланировать</string> <string name="no_intructions">Информация для этого экрана отсутствует</string> - <string name="event_overdue">Просроченный</string> - <string name="unsupported_program_rule">Существует одно программное правило, которое не поддерживается. Пожалуйста, проверьте документацию</string> - <string name="empty_description">Нет информации для этого поля</string> - <string name="biometrics_dialog_title">Пустые учетные данные</string> - <string name="biometrics_first_use_text">Чтобы войти в систему с помощью сканера отпечатков пальцев, сначала нужно воспользоваться стандартным способом</string> - <string name="biometrics_security_title">Биометрическая безопасность</string> - <string name="biometrics_login_title">Быстрый вход в систему</string> - <string name="biometrics_login_text">Хотите использовать отпечаток пальца или другой биометрический метод для входа в систему?</string> - <string name="tab_tables">Таблицы</string> - <string name="table">Таблица</string> - <string name="login_https">https://</string> <string name="delete_local_data_message">Не синхронизированные данные будут потеряны. Вы действительно хотите продолжить?</string> - <string name="local_data_accept">Принять</string> <string name="delete_local_data_error">Данные не удалось удалить. Пожалуйста, повторите попытку.</string> <string name="delete_local_data_done">Удаление локальных данных успешно завершено.</string> <string name="org_unit_selection_warning">Необходимо выбрать хотя бы одну Организационную единицу.</string> @@ -475,6 +267,7 @@ <string name="action_agree">Согласен</string> <string name="action_continue">Продолжить</string> <string name="login_server_info_title">Адрес веб-страницы сервера</string> + <string name="login_server_info_message">Введите URL-адрес сервера DHIS 2 для Вашей организации, предоставленный Вашим системным администратором. Другой вариант - отсканировать QR-код, содержащий URL-адрес Вашего сервера.</string> <string name="forgot_your_code">Забыли свой код?</string> <string name="event_form_end_options_title">Что бы Вы хотели сделать для этого события?</string> <string name="sectionSelectorEnd">КОНЕЦ</string> @@ -485,33 +278,16 @@ <string name="state_uploading">Загрузка</string> <string name="state_relationship">Зависимость</string> <string name="sent_by_sms">Отправлено по SMS</string> - <string name="no_conflicts_message">Для этой программы нет конфликтов</string> - <string name="network_unavailable_sms">Подключение к сети недоступно, но, похоже, есть телефонная связь - можно использовать SMS.</string> - <string name="network_unavailable">Сетевое подключение недоступно.</string> <string name="action_close">Закрыть</string> <string name="tuto_main_11">Теперь Вы можете проверить информацию о синхронизации, нажав здесь</string> - <string name="no_conflicts_update_message">Эти данные хранятся только на Вашем устройстве, они не синхронизированы с сервером.</string> - <string name="no_conflicts_synced_message">Вы обновлены! Все Ваши данные отправлены на сервер.</string> <string name="relationship_error_recursive">Вы не можете связать запись с самой собой</string> - <string name="unblock_session">Разблокировать сессию</string> - <string name="data_set_complete">Завершенный</string> - <string name="data_set_open">Открыть</string> - <string name="unsupported_value_type">Неподдерживаемый тип значения</string> <string name="change_calendar_view">Изменить вид календаря</string> - <string name="data_every_fifteen_minutes">15 минут</string> - <string name="data_every_hour">Каждый час</string> - <string name="data_every_day">Ежедневно</string> - <string name="data_every_week">Еженедельно</string> - <string name="period_week">Неделя</string> - <string name="sync_setting">Настройка синхронизации: %s</string> <string name="relationship_without_enrollment">Запись, к которой Вы пытаетесь получить доступ, не зарегистрирована. Вы не можете получить доступ к инфопанели.</string> <string name="formatting_error">Ошибка форматирования</string> <string name="dashboard_menu_delete_tei_v2">Удалить %s</string> <string name="delete_authority_error">Вы не имеете права удалять эту запись</string> - <string name="validation_url">Это не правильный url</string> <string name="adjusting_form">Настройка формы...</string> - <string name="sms_receiver_number">Номер приемника</string> <string name="sms_amount_question">Согласны ли Вы отправлять сообщения на %d?</string> <string name="sms_sending">Отправка %1$d/%2$d</string> <string name="sms_waiting_amount_confirm">Ожидание подтверждения количества - %d</string> @@ -529,48 +305,25 @@ <string name="sms_error_no_gateway_set">Шлюз не установлен</string> <string name="sms_error_no_user_login">Пользователь не вошел в систему</string> <string name="sms_error_module_disabled">Модуль SMS отключен</string> - <string name="sms_error_ongoing_sunmission">Продолжается отправка очередного SMS-сообщения</string> <string name="sms_metadata_empty">Модуль SMS не инициирован, не найдены необходимые метаданные</string> - <string name="sms_completed">Завершенный</string> <string name="sms_count_error">SMS не принимаются</string> <string name="sms_state_started">Запуск отправки смс</string> <string name="sms_state_converted">Данные прочитаны и преобразованы. Идентификатор заявки: %d</string> - <string name="sms_general_error">Ошибка отправки смс</string> - <string name="sms_bar_state_starting">Начало</string> - <string name="sms_bar_state_sending">Выполняется</string> - <string name="sms_bar_state_sent">Отправлено</string> - <string name="sms_bar_state_failed">Сбой</string> - - <string name="start_sync_granular">Запуск синхронизации.</string> <string name="syncing">Синхронизация...</string> - <string name="end_sync_granular">Синхронизация завершена.</string> - <string name="error_sync">Во время синхронизации произошла ошибка.</string> - <string name="error_sync_check_logs">Во время синхронизации произошла ошибка. Нажмите здесь, чтобы проверить журналы ошибок</string> - <string name="cancel_sync">Синхронизация отменена </string> <string name="copied_text">Скопировано</string> - <string name="image_selected">Выбранное изображение</string> - <string name="show_in_map">Показать на карте</string> - <string name="show_list">Показать список</string> <!--region TRACKER IMPORT CONFLICT MESSAGES--> - <string name="value_required_but_not_provided">%s является обязательным, но не был предоставлен.</string> - <string name="polygon_captured">Полигон зафиксирован</string> <string name="polygon">Полигон</string> <!--endregion--> - <string name="fingerprint_title">Отпечаток пальца</string> - <string name="fingerprint_message">Пожалуйста, приложите палец к считывателю отпечатков пальцев.</string> <string name="security_title">Безопасность</string> <string name="security_rooted_message">По соображениям безопасности эта версия приложения не может быть использована на корневых устройствах. Пожалуйста, используйте учебную версию.</string> - <string name="fix_error">Здесь есть несколько ошибок. Пожалуйста, исправьте их, прежде чем продолжить.</string> <string name="filters_active">Применение фильтров</string> <string name="filters_disabled">Фильтры не применены</string> <string name="filters_title_period">Период</string> <string name="filters_title_org_unit">Орг. единица</string> - <string name="filters_title_sorting">Сортировка</string> - <string name="filters_title_status">Статус</string> <string name="filters_title_state">Синхронизировать</string> <string name="filters_title_assigned">Назначен мне</string> <string name="filter_period_today">Сегодня</string> @@ -585,18 +338,13 @@ <string name="filter_period_form_to">От - до</string> <string name="filter_period_other">Другое</string> <string name="filter_period_any">Любое время</string> - <string name="data_values_error_sync_message">Синхронизация не удалась. Синхронизация не удалась. Проверьте значения данных, чтобы попытаться устранить проблему, и повторите попытку. Если попытка не удалась, обратитесь к системному администратору.</string> - <string name="sms_synced_message">Эти данные были отправлены на сервер, но не гарантируется, что они были сохранены</string> <string name="filter_event_status_open">Открыть</string> <string name="filter_event_status_schedule">Расписание</string> <string name="filter_event_status_overdue">Просроченный</string> <string name="filter_event_status_visited">Посещено</string> <string name="filter_event_status_completed">Завершенный</string> <string name="filter_event_status_skipped">Пропущенный</string> - <string name="enrollment_data_hide">Скрыть данные регистрации</string> - <string name="enrollment_data_show">Показать данные регистрации</string> <string name="granular_sync_enrollments_empty">Нет регистраций к загрузке</string> - <string name="disable_pin_locked">Не показывать снова экран блокировки</string> <string name="set_pin">Установить пин</string> <string name="conflict">Конфликт</string> <string name="change_event_date">Изменить дату</string> @@ -621,9 +369,6 @@ <string name="choose_ou">Выберите Организационную единицу</string> <string name="enter_url">Введите url</string> <string name="enter_value">Введите значение</string> - <string name="choose_image">Выбрать изображение</string> - <string name="scan_code">Сканировать код</string> - <string name="choose_option">Выберите опцию</string> <string name="manage_reserved_values_button">Управление зарезервированными значениями</string> <string name="events_to_download">События для загрузки</string> <string name="teis_to_download">Отслеживаемые объекты для загрузки</string> @@ -642,55 +387,29 @@ <string name="filter_sync_not_synced">Не синхронизировано</string> <string name="filter_sync_error">Ошибка синхронизации</string> <string name="filter_sync_sms">Синхронизированное SMS</string> - <string name="dataset_overview">Детали</string> - <string name="dataset_comments">Комментарии</string> <string name="saved">Сохранено!</string> - <string name="run_validation_rules">Вы хотите проверить качество данных?</string> - <string name="validation_success_title">Все выглядит хорошо!</string> - <string name="mark_dataset_complete">Вы также хотите завершить набор данных?</string> - <string name="dataset_completed">Отметить как завершенное</string> - <string name="name">Название</string> - <string name="formula">Формула</string> - <string name="complete_anyway">Завершить все равно</string> <string name="fk_message">Отсутствует %s %s из %s %s</string> <string name="filters_title_event_status">Статус события</string> - <string name="enrollment_date">Дата зачисления</string> <string name="dataset_empty_list_can_create">Нет никаких данных. Нажмите \"+\", чтобы добавить новую запись</string> <string name="dataset_emtpy_list_can_not_create">Нет данных. У Вас нет разрешения на добавление новых записей.</string> <string name="validation_rules_empty_description">Описание и инструкция отсутствуют</string> <string name="validation_rules_data_to_review">Данные для просмотра</string> - <string name="dataset_saved_completed">Сохранено и завершено!</string> <string name="status_change_error_active_exist">Уже есть активная регистрация</string> <string name="enrollment_status_active">Открыть</string> <string name="enrollment_status_completed">Завершенный</string> <string name="enrollment_status_cancelled">Отмененный</string> - <string name="event_data">Данные</string> <string name="download_tei_error">Не удалось загрузить выбранные %s.</string> - <string name="completed_by">Завершено на %s: %s</string> - <string name="updated_time">Обновлено: %s</string> - <string name="action_done">Готово</string> - <string name="validation_internal_error_datasets">Мы не смогли проверить качество данных. Свяжитесь с Вашим администратором</string> - <string name="are_you_sure">Вы уверены?</string> - <string name="reopen_question">Хотите ли Вы снова открыть набор данных?</string> <string name="filters_title_date">Дата</string> - <string name="filters_title_event_date">Дата происшествия</string> - <string name="tei_type_has_no_attributes">%s не имеет публичных атрибутов. Пожалуйста, выберите программу</string> <string name="privacy_policy_title">Политика конфиденциальности</string> <string name="open_privacy_policy">Нажмите здесь, чтобы ознакомиться с нашей политикой конфиденциальности <a href=""></a> . </string> <string name="coordinates_error">Значения координат не действительны</string> + <string name="break_glass_error_v2">Вы не можете зарегистрировать %s из других организационных подразделений в этой программе, потому что она защищена. Свяжитесь с Вашим администратором.</string> <string name="field_is_mandatory">Это поле обязательно для заполнения</string> <string name="security_debugger_message">По соображениям безопасности эта версия приложения не может быть использована с adb. Пожалуйста, используйте учебную версию.</string> <string name="customactivityoncrash_error_activity_restart_app">Вернуться</string> - <string name="customactivityoncrash_error_activity_close_app">Закрыть приложение</string> - <string name="customactivityoncrash_error_activity_error_details">Подробнее</string> - <string name="customactivityoncrash_error_activity_error_details_title">Подробнее</string> - <string name="customactivityoncrash_error_activity_error_details_close">Закрыть</string> <string name="customactivityoncrash_error_activity_error_details_copy">Копировать в буфер обмена</string> - <string name="customactivityoncrash_error_activity_error_details_copied">Скопировано в буфер обмена</string> - <string name="customactivityoncrash_error_activity_error_details_clipboard_label">Информация об ошибках</string> <string name="metada_first_sync_error">Мы обнаружили ошибку при синхронизации с Вашим сервером. По возможности сообщите об ошибке своему системному администратору.</string> - <string name="error_init_session">Мы не смогли инициировать сессию с Вашим пользователем</string> <string name="enrollment_date_edition_warning">Есть запланированные события, которые не будут перенесены на другой день</string> <string name="section_charts">Диаграммы</string> <string name="navigation_list_view">Список</string> @@ -740,44 +459,25 @@ <string name="section_feedback">Обратная связь</string> <string name="section_indicators">Индикаторы</string> <string name="camera_permission_denied">Разрешение камеры запрещено.\nЧтобы использовать эту функцию, ее необходимо разрешить.</string> - <string name="value">Значение</string> <string name="section_charts_indicators">Диаграммы и индикаторы</string> <string name="take_photo">Сделать фото</string> - <string name="from_gallery">Выбрать из галереи</string> - <string name="data_set_quality_check_done">Готово!</string> <string name="break_glass_dialog_title">Данная программа защищена</string> <string name="break_glass_hint">Опишите причину здесь</string> - <string name="authenticating">Автентификация</string> - <string name="login_error_no_dhis_instance">Предоставленный адрес сервера не является экземпляром dhis</string> - <string name="login_error_bad_credentials">Неверные учетные данные</string> - <string name="login_error_unknown_host">Неизвестный сервер</string> - <string name="invalid_integer">Значение должно быть целым числом</string> <string name="openid_session_expired">Сессия истекла</string> <string name="openid_session_expired_message">Срок действия Вашей текущей сессии истек. По соображениям безопасности Вам нужно будет снова предоставить свои учетные данные</string> - <string name="dataset_column_default">Значения</string> <string name="week_period_span_default_label">Неделя %d %s до %s</string> <string name="action_do_not_show_again">Больше не показывать</string> <string name="show_radar_graph">Показать как радар</string> <string name="filter_follow_up_label">Отмеченные для последующего наблюдения %s</string> <string name="update_field_error">Это поле не удалось обновить. Пожалуйста, попробуйте еще раз</string> - <string name="edition">Издание</string> - <string name="available">Доступно</string> <string name="blocked_by_completion">Эти данные нельзя редактировать, поскольку они помечены как завершенные</string> <string name="edition_expired">Эти данные нельзя редактировать, так как время их редактирования истекло</string> <string name="edition_no_write_access">У Вас нет прав на редактирование этих данных</string> <string name="event_date_not_in_orgunit_range">Эти данные нельзя редактировать, потому что организационное подразделение закрыто</string> <string name="edition_no_catcombo_access">У вас нет прав на редактирование этих данных</string> - <string name="edition_orgunit_capture_scope">Вы не можете редактировать данные из этой Организационной единицы</string> - <string name="reload_list">Сброс поиска</string> + <string name="edition_orgunit_user_scope">Вы не можете редактировать данные из этой Организационной единицы</string> <string name="error_tei_online_search_title">Онлайн поиск дал следующее сообщение:</string> - <string name="program_rules_loop_warning_title">Предупреждение о правилах программы</string> - <string name="program_rules_loop_warning_message">Существует проблема конфигурации, вызывающая зацикливание правил. Обратитесь к администратору.</string> - <string name="granular_sync_refresh">ОБНОВИТЬ</string> - <string name="unknown_date">Неизвестный</string> - <string name="granular_sync_refresh_title">Обновить все данные</string> - <string name="max_accounts_text">Вы достигли максимального количества учетных записей (%d). Чтобы добавить новую учетную запись, войдите в систему и удалите одну из своих учетных записей</string> <string name="delete_account">Удалить аккаунт</string> - <string name="manage_accounts">Управление учетными записями</string> <string name="main_menu_troubleshooting">Устранение неисправностей конфигурации</string> <string name="troubleshooting_language_title">Язык</string> <string name="troubleshooting_language_description">Нажмите здесь, чтобы изменить язык приложения</string> @@ -796,9 +496,7 @@ <string name="search_no_results">Для этого поиска нет результатов</string> <string name="search_too_many_results">Слишком много результатов</string> <string name="search_too_many_results_message">Попробуйте изменить поиск, чтобы сузить результаты.</string> - <string name="search_create_new">Создать новый</string> <string name="search_new_te_type">Новый %s</string> - <string name="search_min_attributes_message">Для поиска необходимо ввести как минимум %s атрибутов.</string> <string name="action_ok">Ok</string> <string name="init_search">Начните поиск, чтобы найти любой %s</string> <string name="search_or_create">Вы можете найти или создать новый %s</string> @@ -807,7 +505,6 @@ <string name="missing_error_fields_events">В некоторых полях есть ошибки, и они не сохраняются. \nВы хотите просмотреть форму\?</string> <string name="event_can_be_completed">Хотите ли Вы отметить эту форму как завершенную?</string> <string name="event_error_on_complete">У Вас есть несколько сообщений об ошибках.\nХотите просмотреть их\?</string> - <string name="changes_will_be_discarted">Если Вы выйдете сейчас, изменения будут отменены.</string> <string name="re_opened">Открыть заново</string> <string name="account_disable_title">Аккаунт дезактивирован</string> <string name="account_disable_message">Ваша учетная запись была отключена администратором.</string> @@ -816,18 +513,8 @@ <string name="customactivityoncrash_error_activity_current_date">Текущая дата: %s</string> <string name="customactivityoncrash_error_activity_device">Устройство: %s</string> <string name="customactivityoncrash_error_activity_os_version">Версия Os: %s</string> - <string name="open_details">Открыть %s деталей</string> - <string name="tracked_entity_type_details">%s деталей</string> <string name="syncing_resource">Синхронизация %s...</string> - <string name="sms_sync_manual_confirmation">Ожидает подтверждения вручную</string> - <string name="syncing_events">Синхронизация событий</string> - <string name="syncing_teis">Синхронизация отслеживаемых объектов</string> - <string name="syncing_data_sets">Синхронизация наборов данных</string> - <string name="syncing_resources">Синхронизация ресурсов</string> - <string name="syncing_done">Синхронизация выполнена</string> <string name="downloading_image_resources">Загрузка изображений...</string> - <string name="program_description">Описание программы</string> - <string name="wrong_pin">Неправильный пин</string> <string name="enrolledIn">Зарегистрирован в </string> <string name="ownedBy">Владелец</string> <string name="sync_dialog_title_not_synced">Необходима синхронизация</string> @@ -846,24 +533,11 @@ <string name="sync_dialog_action_refresh">Обновить</string> <string name="sync_dialog_action_not_now">Не сейчас</string> <string name="tap_to_explore_action">Нажмите здесь, чтобы посмотреть</string> - <plurals name="error_count_label"> - <item quantity="one">%s ошибка</item> - <item quantity="few">%s ошибки</item> - <item quantity="many">%s ошибки</item> - <item quantity="other">%s ошибок</item> - </plurals> - <plurals name="warning_count_label"> - <item quantity="one">%s предупреждение</item> - <item quantity="few">%s предупреждения</item> - <item quantity="many">%s предупреждения</item> - <item quantity="other">%s предупреждений</item> - </plurals> <string name="new_version_message">Версия приложения <b>%s </b> уже доступна. Хотите загрузить ее?</string> <string name="software_update">Обновление программного обеспечения</string> <string name="remind_me_later">Позже</string> <string name="download_now">Скачать сейчас</string> <string name="check_for_updates">Проверить наличие обновлений</string> - <string name="checking_for_updates">Проверка наличия обновлений</string> <string name="no_updates">Новые обновления отсутствуют</string> <string name="app_version">Версия приложения</string> <string name="error_applying_rule_effects">Что-то пошло не так в конфигурации программы, мы не можем загрузить это событие. Пожалуйста, свяжитесь с Вашим системным администратором.</string> @@ -900,8 +574,6 @@ <string name="program_stage">Этап программы</string> <string name="event">событие</string> <string name="timeline">Временная шкала</string> - <string name="clear_search">Очистить поиск</string> - <string name="optional">Опционно</string> <string name="database_export_downloaded">База данных загружена</string> <string name="importing_database">Импорт базы данных</string> <string name="show_more">Показать больше</string> @@ -926,4 +598,25 @@ <string name="complete_enrollment_label">Завершить %s</string> <string name="deactivate_enrollment_label">Деактивировать %s</string> <string name="reopen_enrollment_label">Окрыть повторно %s</string> + + <plurals name="error_count_label"> + <item quantity="one">%s ошибка</item> + <item quantity="few">%s ошибки</item> + <item quantity="many">%s ошибки</item> + <item quantity="other">%s ошибок</item> + </plurals> + + <plurals name="warning_count_label"> + <item quantity="one">%s предупреждение</item> + <item quantity="few">%s предупреждения</item> + <item quantity="many">%s предупреждения</item> + <item quantity="other">%s предупреждений</item> + </plurals> + + <plurals name="settings_specific_programs"> + <item quantity="one">Существует программа %s с определенными настройками.</item> + <item quantity="few">Существуют программы %s с определенными настройками.</item> + <item quantity="many">Существуют программы %s с определенными настройками.</item> + <item quantity="other">Существуют программы %s с определенными настройками.</item> + </plurals> </resources> diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index 6293b752657..535e27f892f 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -1,7 +1,6 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!-- Warnings and error messages --> <string name="error">දෝෂය</string> - <string name="password_hint">රහස්‍ය පදය</string> <!--PERIOD--> <string name="DAILY">දිනපතා</string> <string name="WEEKLY">සතිපතා</string> @@ -10,35 +9,23 @@ <string name="action_accept">පිළිගන්න</string> <!-- Input hints --> <string name="search">සොයන්න</string> + <!-- Status --> + <string name="event_open">විවෘත කරන්න</string> <string name="state_error">දෝෂය</string> - <string name="date">දිනය</string> + <string name="delete">ඉවත් කරන්න</string> - <string name="total">එකතුව</string> + <!--TEI DASHBOARD--> <string name="edit">වෙනස් කරන්න</string> <string name="wipe_data_ok">පිළිගන්න</string> + <!--endregion--> + <!-- SEARCH OPTION SET --> <string name="search_optionset">සොයන්න</string> - <!--AGE CUSTOM VIEW--> - <string name="hint_day">දින</string> - <string name="hint_month">මාස</string> - <string name="hint_year">අවුරුදු</string> - <string name="week">සති</string> - <string name="SAVE">සුරකින්න</string> - <string name="max">උපරිම</string> - <string name="warning_on_complete_title">අවවාදයයි</string> - <string name="error_on_complete_title">දෝෂය</string> <string name="save">සුරකින්න</string> <string name="qr_data_values">දත්ත අගයන්</string> - <string name="local_data_accept">පිළිගන්න</string> <string name="state_warning">අවවාදයයි</string> <string name="action_close">වසන්න</string> - <string name="data_set_open">විවෘත කරන්න</string> - <string name="data_every_day">දිනපතා</string> - <string name="data_every_week">සතිපතා</string> - <string name="period_week">සතිය</string> - <string name="sms_bar_state_failed">අසාර්ථකයි</string> - <string name="filter_period_today">අද</string> <string name="filter_period_yesterday">ඊයේ</string> <string name="filter_period_this_week">මෙම සතිය</string> @@ -48,12 +35,8 @@ <string name="filter_period_other">වෙනත්</string> <string name="filter_event_status_open">විවෘත කරන්න</string> <string name="interval_yesterday">ඊයේ</string> - <string name="name">නම</string> <string name="enrollment_status_active">විවෘත කරන්න</string> - <string name="event_data">දත්ත</string> - <string name="action_done">නිම කළා</string> <string name="filters_title_date">දිනය</string> - <string name="customactivityoncrash_error_activity_error_details_close">වසන්න</string> <string name="section_charts">ප්‍රස්ථාර</string> <string name="navigation_map_view">සිතියම</string> <string name="navigation_charts">ප්‍රස්ථාර</string> @@ -61,8 +44,6 @@ <string name="show_table_value">අගයක් ලෙස නරඹන්න</string> <string name="filter_period_this_year">මෙම වසර</string> <string name="filter_period_last_year">පසුගිය වසර</string> - <string name="value">අගය</string> - <string name="dataset_column_default">අගයන්</string> <string name="sync_dialog_action_send">යවන්න</string> <string name="show_more">වැඩියෙන් පෙන්වන්න</string> <string name="show_description">විස්තරය පෙන්වන්න</string> diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 44ba1862386..23e02b2e7d9 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -1,50 +1,25 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!--GENERAL--> <string name="app_name">DHIS2</string> - <string name="logo_text">DHIS</string> - <string name="logo_number">2</string> <!-- Warnings and error messages --> <string name="error">Fel</string> - <string name="error_wrong_server_url">Fel serveradress</string> - <string name="error_wrong_credentials">Felaktiga uppgifter</string> - <string name="error_unexpected_error">Oväntat fel</string> - <string name="error_internal_server_error">Internt serverfel</string> - <string name="no_value">inget värde</string> <string name="something_wrong">Något gick fel</string> <!-- SyncService strings: --> - <string name="sync_now">Synkronisera nu</string> - <string name="sync_text">Synkroniserar med server</string> - <string name="sync_title">Synkronisera nu</string> - <string name="sync_metadata">Metadata</string> <string name="sync_events">Händelser</string> - <string name="sync_tei">Tracked entities</string> - - <string name="sync_complete_title">Klar</string> - <string name="sync_complete_text">Synkronisering färdig</string> <string name="sync_error_title">Synkroniseringsfel</string> <string name="sync_error_text">Ett fel har inträffat under synkroniseringen. Försök igen.</string> - <string name="search_result_text">%s resultat hittades</string> - <string name="add_new">Lägg till ny</string> - <string name="add">Lägg till</string> - <string name="schedule_new">Planera nytt</string> <string name="referral">Remiss</string> <!-- Login --> - <string name="url_hint">Server URL</string> - <string name="user_hint">Användarnamn</string> - <string name="password_hint">Lösenord</string> - <string name="log_in_button">Logga in</string> - <string name="unlock_button">Lås session</string> <string name="syncing_configuration">Synkronisera din konfiguration</string> <string name="syncing_data_shortly">Dina data kommer snart att synkroniseras</string> <string name="syncing_data">Synkronisera dina data</string> <string name="configuration_ready">Din konfiguration är klar</string> <string name="data_ready">Dina data är klara</string> - <string name="configuration_sync_failed">Konfigurationssynkroniseringen misslyckades</string> - <string name="data_sync_failed">Data synkronisering misslyckades</string> <string name="account_recovery">kontoåterställning</string> + <!--PERIOD--> <string name="DAILY">Dagligen</string> <string name="WEEKLY">Varje vecka</string> @@ -58,15 +33,12 @@ <string name="enter_text">Ange text</string> <string name="enter_long_text">Ange långtext</string> <string name="enter_number">Ange ett nummer</string> - <string name="enter_integer">Ange ett heltal</string> <string name="enter_negative_integer">Ange ett negativt heltal</string> <string name="enter_positive_integer_or_zero">Ange ett positivt heltal eller noll.</string> <string name="enter_positive_integer">Ange ett positivt heltal</string> - <string name="filter_options">Filteralternativ</string> <string name="choose_date">Välj datum</string> + <!-- Status --> - <string name="program_completed">Program avslutat</string> - <string name="program_inactive">Programm inaktivt</string> <string name="event_open">Öppen</string> <string name="read_only">read only</string> @@ -77,76 +49,48 @@ <!-- State --> <string name="state_synced">Synkronisera</string> <string name="state_to_update">Att uppdatera</string> - <string name="state_to_delete">Att radera</string> <string name="state_error">Fel</string> - <string name="action_sync">SYNKRONISERA</string> + <!--Completion--> - <string name="completion">Komplettering</string> <!--Event initial--> - <string name="create">Skapa</string> <string name="update">Uppdatera</string> - <string name="date">Datum</string> <string name="org_unit">Organisationsenhet</string> - <string name="category_option">Kategorialternativ</string> <string name="latitude">Latitud</string> <string name="longitude">Longitud</string> - <string name="new_event">Ny händelse</string> - <string name="one_time">En gång</string> - <string name="permanent">Permanent</string> <!--Event Detail--> <string name="due_date">Förfallodatum</string> <string name="cat_combo">Kategori kombination</string> - <string name="date_default">DD/MM/ÅÅÅÅ</string> <string name="cancel">Avbryt</string> <string name="delete">Radera</string> - <string name="total">Totalt</string> <string name="active_programs">Aktiva program</string> - <string name="to_enroll_programs">Program för att registrera</string> <string name="enroll">Registrera</string> - <string name="last_visit">Senaste besök:</string> - <string name="apply">verkställ</string> <!--TEI DASHBOARD--> - <string name="see_details">Se detaljer</string> - <string name="view_more">VISA MER</string> <string name="edit">Redigera</string> - <string name="follow_up">Följ upp</string> - <string name="follow_up_enabled">Uppföljning aktiverad</string> - <string name="follow_up_disabled">Uppföljning avaktiverad</string> <string name="deactivate">Inaktivera</string> <string name="program_not_allow_events">Det här programmet tillåter inte fler händelser</string> + <!--DONE TASKS--> <string name="events">händelser</string> <string name="done_task">Hem</string> - <string name="app_info">App Info</string> <string name="log_out">Logga ut</string> - <string name="block_session">Blockera sessionen</string> - <!-- SYNC --> - <string name="a_minute">1 minut</string> - <string name="fifteen_minute">15 minuter</string> <string name="a_hour">1 timme</string> <string name="a_day">1 dag (Standard)</string> - <string name="Automatic_Sync_Data">Automatisk synkronisering varje dag</string> <string name="Manual">Manuell</string> - <string name="Automatic_Sync_Metadata">Automatisk konfigurationssynkronisering varje:</string> <string name="a_week">1 vecka</string> <string name="sync_max_parameters">Nuvarande synkroniseringsparametrar</string> <string name="sync_default_parameters">Återställ till standardvärden</string> + <string name="wipe_data_meesage">Databasen kommer att raderas\nDu måste logga in igen.</string> <string name="wipe_data_ok">Acceptera</string> <string name="wipe_data_no">Avbryt</string> <string name="SYNC_DATA">Synkronisera data nu</string> <string name="SYNC_META">Synkronisera konfigurationen nu</string> <string name="SYNC_MANAGER">Inställningar</string> - <string name="last_data_sync_date">Senaste synkronisering %s</string> - <string name="last_metadata_sync_date">Senaste synkronisering %s</string> - <string name="settingsReset">Återställ app</string> <string name="settingsTwoFAStatus">Status</string> <!--endregion--> - <string name="enrollmment_date">inskrivning datum</string> - <!-- SEARCH OPTION SET --> <string name="search_optionset">Sök</string> <!--FORM FRAGMENT--> @@ -155,34 +99,16 @@ <string name="write_new_note">Skapa ny notering</string> <string name="clear">ta bort</string> <string name="add_note">Lägg till anteckning</string> - <string name="revert">Återställ</string> - <string name="activated">Aktiverad</string> - <string name="missing_mandatory_fields_title">Obligatoriska fält saknas</string> - <string name="missing_mandatory_fields_text">Några obligatoriska fält saknas. Om du vill gå tillbaka nu raderas alla sparade uppgifter.</string> - <string name="missing_mandatory_fields_go_back">Ta bort och gå tillbaka</string> <!--EVENT SUMMARY--> - <string name="section_list">Sektion lista</string> - <string name="event_summary_header" formatted="false">%s frågor av %s slutförd</string> - <string name="event_summary_sections_header" formatted="false">%s av %s klart</string> - <string name="complete_and_close">Slutför och stäng</string> <!--AGE CUSTOM VIEW--> - <string name="hint_day">Dagar</string> - <string name="hint_month">Månader</string> - <string name="hint_year">År</string> - <string name="week">Veckor</string> <string name="incident_date">infall datum</string> - <string name="local_results">Resultat på denna enhet</string> - <string name="online_results">Online resultat</string> <string name="past_programs">Tidigare program</string> <!--PERMISSIONS--> <string name="permission_denied">Du har antagligen inte den nödvändiga behörigheten för att utföra åtgärden.</string> - <string name="add_relation_button">Lägg till som ...</string> - <string name="date_dialog_clear">Klar</string> <string name="period">Period</string> - <string name="org_unit_filter">(%d) Organisationsenhet</string> <string name="tuto_main_1">Välkommen till DHIS2</string> <string name="tuto_main_2">Här kan du se dina program</string> <string name="tuto_main_3">Du kan använda ett filter...</string> @@ -191,15 +117,11 @@ <string name="tuto_main_6">Kontrollera andra åtgärder i huvudmenyn</string> <!-- RELATIONSHIPS --> - <string name="default_relationship_label">Skapa relation</string> <string name="next">Nästa</string> <string name="search_min_num_attr">Du måste ange minst %d av attributen för att göra en sökning</string> - <string name="search_max_tei_reached">Det finns mer än %d resultat. Vänligen ange ytterligare sökkriterier</string> - <string name="search_init">Definiera sökkriterier</string> <!-- QR --> <string name="QR_SCANNER">Importerar QR data</string> - <string name="SAVE">Spara</string> <string name="button_ok">ok</string> <string name="qr_id">Identifikation</string> <string name="qr_attributes">Attribut</string> @@ -211,84 +133,38 @@ <string name="qr_no_data">inget data</string> <string name="qr_error_id">Ogiltig QR-kod</string> <string name="qr_error_attr">Det här attributet kan inte läggas till</string> - <string name="qr_error_enrollment">Denna inskrivning kan inte läggas till</string> <string name="about">Handla om</string> <string name="programs_to_enroll">Program för att registrera</string> - <string name="select_all">markera allt</string> - <string name="empty_program_list">Det finns ingen information för de valda filteren. Var god försök ändra dem.</string> <string name="share">Dela med sig</string> <string name="share_qr">Dela QR</string> <string name="max">max</string> <string name="current">AKTUELL</string> <string name="tei">TEI</string> - <string name="limit_by_organisation_unit">Begränsa per organisationsenhet</string> - <string name="programs_list">Programlista</string> <string name="wipe_data">Återställ app</string> - <string name="add_relationship_error">Det är inte möjligt att lägga till denna relationen</string> <string name="warning_error_on_complete_title">Kolla detta!</string> - <string name="warning_on_complete_title">Varning</string> - <string name="error_on_complete_title">Fel</string> <string name="save">Spara</string> - <string name="downloaded_confirm">Vill du lägga till fler data från QR?</string> - <!--ABOUT--> <string name="about_app">App version: %s</string> <string name="about_sdk">SDK Version: %s</string> <string name="about_connected">Ansluten till: %s</string> <string name="about_user">Aktuell användare: %s</string> - <string name="login_error_null_pass">Lösenordet saknas. Vänligen fyll i detta fält.</string> - <string name="login_error_null_username">Användarnamnet saknas. Vänligen fyll i detta fält.</string> - <string name="login_error_dhis_version">Den här servern kör en dhis-version som skiljer sig från 2.29. Uppdatera din serverversion eller använd testmiljön för att fortsätta.</string> - <string name="login_error_unsuccessful_response">Något gick fel. Kontrollera att serveradressen, användarnamnet och lösenordet är korrekta och försök igen.</string> - <string name="login_error_error_response">Servern kunde inte slutföra denna begäran.</string> - <string name="login_error_default">Ett problem uppstod när du försökte logga in på servern</string> - <string name="login_error">Inloggningsfel</string> - <string name="missing_mandatory_fields">Obligatoriska fält saknas</string> - <string name="online_search_unexpected">Oväntat fel vid sökning online</string> - <string name="online_search_parsing_error">Fel vid tolkning av resultat</string> - <string name="online_search_error">Online-sökning gav ett fel</string> - <string name="online_search_response_error">Något gick fel på servern</string> <string name="search_program_not_selected">Välj ett program för att aktivera registrering</string> <string name="search_access_error">Du har inte behörig behörighet</string> - <string name="feature_unavaible">Den här funktionaliteten är inte klar än.</string> - <string name="relationship_label_error">Ett fel uppstod vid återhämtning av relationsbeskrivning</string> <string name="all_tei_type">Alla %s</string> <string name="invalid_phone_number">Detta är inte ett giltigt telefonnummer</string> - <string name="invalid_email">Det här är inte en giltig e-postadress</string> - <string name="invalid_negative_number">Endast negativa siffror är tillåtna</string> <string name="invalid_possitive_zero">Endast positiva tal eller noll tillåts</string> - <string name="invalid_possitive">Endast positiva siffror är tillåtna</string> - <string name="invalid_interval">Endast värden från 0 till 1 är tillåtna</string> - <string name="invalid_percentage">Endast värden från 0 till 100 är tillåtna</string> - <string name="date_dialog_tigle">Välj datum för att filtrera</string> <string name="select_option">Välj alternativ</string> - <string name="issue_reported">Problem rapporterat</string> - <string name="dialog_generate_new_event">Skapa ny händelse</string> - <string name="message_generate_new_event">Vill du skapa en annan händelse?</string> <string name="event_completed_title">Avslutade händelser</string> <string name="event_completed_message">Alla händelser i detta program är avslutade. Vill du stänga programmet också?</string> <string name="check_event">Kontrollera</string> <string name="menu_home">Hem</string> <string name="relationships">relationer</string> - <string name="dashboard_relationships">Relationer</string> - <string name="dashboard_indicators">indikatorer</string> - <string name="event_overview">detaljer</string> - <string name="event_indicators">indikatorer</string> <string name="please_wait">Vänta</string> - <string name="table">Tabell</string> - <string name="local_data_accept">Acceptera</string> - <string name="login_server_info_title">Server URL</string> <string name="state_warning">Varning</string> <string name="action_close">Stänga</string> - <string name="data_set_complete">Färdigt</string> - <string name="data_set_open">Öppen</string> - <string name="data_every_day">Dagligen</string> - <string name="data_every_week">Varje vecka</string> - <string name="sms_completed">Avklarad</string> <string name="filters_title_period">Period</string> - <string name="filters_title_status">Status</string> <string name="filters_title_state">Synkronisera</string> <string name="filter_period_this_week">Denna vecka</string> <string name="filter_period_last_week">Förra veckan</string> @@ -300,18 +176,12 @@ <string name="go_back">Gå tillbaka</string> <string name="data_sets">dataset</string> <string name="filter_sync_error">Synkroniseringsfel</string> - <string name="dataset_overview">detaljer</string> - <string name="name">Namn</string> <string name="filters_title_event_status">Händelsestatus</string> - <string name="enrollment_date">inskrivning datum</string> <string name="enrollment_status_active">Öppen</string> <string name="enrollment_status_completed">Färdigt</string> <string name="enrollment_status_cancelled">Avbruten</string> - <string name="event_data">Data</string> <string name="filters_title_date">Datum</string> - <string name="filters_title_event_date">Händelse datum</string> <string name="customactivityoncrash_error_activity_restart_app">Gå tillbaka</string> - <string name="customactivityoncrash_error_activity_error_details_close">Stänga</string> <string name="section_charts">diagram</string> <string name="navigation_map_view">Karta</string> <string name="navigation_programs">program</string> @@ -328,18 +198,11 @@ <string name="filter_period_last_financial_year">Föregående räkenskapsår</string> <string name="section_feedback">Återkoppling</string> <string name="section_indicators">indikatorer</string> - <string name="value">Värde</string> - <string name="login_error_bad_credentials">Felaktiga uppgifter</string> - <string name="invalid_integer">Värdet måste vara ett heltal</string> - <string name="available">Tillgängliga</string> - <string name="unknown_date">Okänd</string> - <string name="search_create_new">Skapa ny</string> <string name="sync_dialog_action_send">Skicka</string> <string name="programs">program</string> <string name="sync_error">Synkroniseringsfel</string> <string name="coordinates">koordinater</string> <string name="scheduled_enter_event">Schemalagd</string> - <string name="optional">Frivillig</string> <string name="show_more">Visa mer</string> <string name="show_less">Visa mindre</string> <string name="sync">Synkronisera</string> diff --git a/app/src/main/res/values-tet/strings.xml b/app/src/main/res/values-tet/strings.xml index 540830eb8e2..a8fc31e8316 100644 --- a/app/src/main/res/values-tet/strings.xml +++ b/app/src/main/res/values-tet/strings.xml @@ -1,11 +1,8 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!-- Warnings and error messages --> <string name="error">Erru</string> - <string name="add_new">Aumenta foun</string> - <string name="add">Aumenta</string> - <string name="user_hint">Utilizador nia Naran</string> - <string name="password_hint">Seña</string> <string name="account_recovery">Restaurasaun konta</string> + <!--PERIOD--> <string name="DAILY">Diáriu</string> <string name="WEEKLY">Semanal</string> @@ -16,60 +13,40 @@ <string name="active">Ativu</string> <string name="state_error">Erru</string> + + <!--Completion--> + <!--Event initial--> - <string name="create">Kria</string> <string name="update">Atualiza</string> - <string name="date">Data</string> <string name="cancel">Kansela</string> <string name="delete">Soe</string> + <!--TEI DASHBOARD--> <string name="edit">Edita</string> - <!--DONE TASKS--> - <string name="events_no_data">Laiha dadus</string> <string name="done_task">Pájina inisial</string> <string name="wipe_data_no">Kansela</string> <string name="SYNC_MANAGER">Konfigurasaun</string> <string name="settingsTwoFAStatus">Estadu</string> - <string name="hint_month">Fulan</string> - <string name="hint_year">Tinan</string> - <string name="week">Semanas</string> - <string name="date_dialog_clear">Hamós</string> <string name="period">Períodu</string> + <!-- RELATIONSHIPS --> <string name="next">Próximu</string> - <string name="SAVE">Rai</string> <string name="button_ok">OK</string> <string name="about">Konabá</string> <string name="share">Partilla</string> - <string name="max">Max</string> - <string name="warning_on_complete_title">Avizu</string> - <string name="error_on_complete_title">Erru</string> <string name="save">Rai</string> <string name="select_option">Hili opsaun</string> <string name="menu_home">Pájina inisial</string> - <string name="dashboard_indicators">Indikadores</string> - <string name="event_overview">Detalles</string> - <string name="event_indicators">Indikadores</string> <string name="please_wait">Favor hein</string> - <string name="table">Tabela</string> <string name="state_warning">Avizu</string> <string name="action_close">Taka</string> - <string name="data_set_complete">Kompletu</string> - <string name="data_every_day">Diáriu</string> - <string name="data_every_week">Semanal</string> <string name="filters_title_period">Períodu</string> - <string name="filters_title_status">Estadu</string> <string name="filter_period_last_week">Semana kotuk</string> <string name="filter_period_last_month">Fulan kotuk</string> <string name="filter_period_other">Seluk</string> <string name="go_back">Fila ba kotuk</string> <string name="data_sets">Pakote dadus</string> - <string name="dataset_overview">Detalles</string> - <string name="name">Naran</string> <string name="enrollment_status_completed">Kompletu</string> - <string name="event_data">Dadus</string> - <string name="are_you_sure">Itabo\'ot iha duni serteza kah??</string> <string name="filters_title_date">Data</string> <string name="customactivityoncrash_error_activity_restart_app">Fila ba kotuk</string> - <string name="customactivityoncrash_error_activity_error_details_close">Taka</string> <string name="navigation_map_view">Mapa</string> <string name="navigation_tei_data">Detalles</string> <string name="filter_period_this_year">Tina ida ne\'e</string> @@ -82,9 +59,5 @@ <string name="filter_period_last_financial_year">Tinan finanseiru kotuk</string> <string name="section_feedback">Feedback</string> <string name="section_indicators">Indikadores</string> - <string name="value">Valor</string> - <string name="available">Disponível</string> - <string name="unknown_date">Deskoñesidu</string> <string name="sync_dialog_action_send">Haruka</string> - <string name="optional">Opsional</string> </resources> diff --git a/app/src/main/res/values-tg/strings.xml b/app/src/main/res/values-tg/strings.xml index f892302b8c5..69f79dc603f 100644 --- a/app/src/main/res/values-tg/strings.xml +++ b/app/src/main/res/values-tg/strings.xml @@ -1,12 +1,12 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!-- Warnings and error messages --> <string name="error">Хатогӣ</string> + <!-- SyncService strings: --> + <string name="sync_events">Рӯйдодҳо</string> - <string name="add_new">Иловаи нав</string> - <string name="add">Илова кардан</string> - <string name="user_hint">Номи корбар</string> - <string name="password_hint">Парол</string> + <string name="account_recovery">Барқароркунии ҳисоб</string> + <!--PERIOD--> <string name="DAILY">Ҳаррӯза</string> <string name="WEEKLY">Ҳафтаина</string> @@ -20,71 +20,49 @@ <string name="active">Фаъол</string> <string name="state_error">Хатогӣ</string> + + <!--Completion--> + <!--Event initial--> - <string name="create">Сохтан</string> <string name="update">Навсозӣ</string> - <string name="date">Сана</string> - <string name="category_option">Имкони категория</string> <string name="latitude">Тӯл</string> <string name="longitude">Арз</string> + <!--DataSet initial--> <string name="report_period">Давраи ҳисобот</string> <!--Event Detail--> <string name="due_date">Санаи пешбинишуда</string> <string name="cancel">Бекор кардан</string> <string name="delete">Нест кардан</string> + <!--TEI DASHBOARD--> <string name="edit">Таҳрир</string> - <!--DONE TASKS--> - <string name="events_no_data">Ягон иттилоот нест</string> <string name="done_task">Саҳифаи асосӣ</string> <string name="wipe_data_no">Бекор кардан</string> <string name="SYNC_MANAGER">Танзимот</string> <string name="settingsTwoFAStatus">Ҳолат</string> <!--endregion--> - <string name="enrollmment_date">Санаи номнавис</string> - <!-- SEARCH OPTION SET --> <string name="search_optionset">Ҷустуҷӯ</string> <!--FORM FRAGMENT--> <string name="report_date">Санаи ҳисобот</string> - <string name="hint_month">Моҳҳо</string> - <string name="hint_year">Солҳо</string> - <string name="week">Ҳафтаҳо</string> - <string name="date_dialog_clear">Пок кардан</string> <string name="period">Давра</string> + <!-- RELATIONSHIPS --> <string name="next">Навбатӣ</string> - <string name="SAVE">Захира кардан</string> <string name="button_ok">OK</string> <string name="qr_attributes">Нишонаҳо</string> <string name="qr_events">Рӯйдодҳо</string> <string name="about">Дар бораи</string> <string name="share">Мубодила</string> - <string name="max">Макс</string> - <string name="current">Ҷорӣ</string> - <string name="warning_on_complete_title">Огоҳӣ</string> - <string name="error_on_complete_title">Хатогӣ</string> <string name="save">Захира кардан</string> <string name="menu_home">Саҳифаи асосӣ</string> <string name="qr_data_values">Қиматҳои иттлоот</string> - <string name="dashboard_indicators">Индикаторҳо</string> - <string name="event_overview">Маълумоти муфассал</string> - <string name="event_indicators">Индикаторҳо</string> <string name="please_wait">Лутфан мунтазир шавед</string> - <string name="table">Ҷадвал</string> - <string name="action_continue">Идома додан</string> <string name="state_warning">Огоҳӣ</string> <string name="action_close">Пӯшидан</string> - <string name="data_set_complete">Анҷом ёфт</string> - <string name="data_every_day">Ҳаррӯза</string> - <string name="data_every_week">Ҳафтаина</string> - <string name="sms_completed">Анҷомёфта</string> - <string name="sms_bar_state_sent">Фиристодашуда</string> - <string name="sms_bar_state_failed">Иҷро нашуд</string> - + <!--region TRACKER IMPORT CONFLICT MESSAGES--> <string name="polygon">Бисёркунҷа</string> <string name="filters_title_period">Давра</string> - <string name="filters_title_status">Ҳолат</string> <string name="filter_period_today">Имрӯз</string> <string name="filter_period_yesterday">Дирӯз</string> <string name="filter_period_last_week">Ҳафтаи гузашта</string> @@ -95,17 +73,9 @@ <string name="go_back">Ба ҷафо равед</string> <string name="data_sets">Маҷмӯъҳои иттилоот</string> <string name="interval_yesterday">Дирӯз</string> - <string name="dataset_overview">Маълумоти муфассал</string> - <string name="name">Ном</string> - <string name="formula">Формула</string> - <string name="enrollment_date">Санаи номнавис</string> <string name="enrollment_status_completed">Анҷом ёфт</string> - <string name="event_data">Иттилоот</string> - <string name="action_done">Иҷро шуд</string> - <string name="are_you_sure">Оё боварӣ доред?</string> <string name="filters_title_date">Сана</string> <string name="customactivityoncrash_error_activity_restart_app">Ба ҷафо равед</string> - <string name="customactivityoncrash_error_activity_error_details_close">Пӯшидан</string> <string name="navigation_map_view">Харитаҳо</string> <string name="navigation_programs">Барномаҳо</string> <string name="navigation_data_entry">Ворид кардани иттилоот</string> @@ -119,14 +89,9 @@ <string name="filter_period_last_financial_year">Соли молиявии гузашта</string> <string name="section_feedback">Изҳори назар</string> <string name="section_indicators">Индикаторҳо</string> - <string name="value">Қимат</string> - <string name="invalid_integer">Қимат бояд адади бутун бошад</string> - <string name="available">Мавҷуда</string> - <string name="unknown_date">Номаълум</string> <string name="sync_dialog_action_send">Фиристодан</string> <string name="sync_dialog_action_refresh">Таҷдид</string> <string name="programs">Барномаҳо</string> <string name="coordinates">Координатаҳо</string> <string name="schedule">Ҷадвал</string> - <string name="optional">Ихтиёрӣ</string> </resources> diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 255156fec32..f6e17a02e9e 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -1,66 +1,28 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!--GENERAL--> <string name="app_name">Dhis2</string> - <string name="logo_text">dhis</string> - <string name="logo_number">2</string> <!-- Warnings and error messages --> <string name="error">Помилка</string> - <plurals name="error_message"> - <item quantity="one">Помилка</item> - <item quantity="few">Помилки</item> - <item quantity="many">Помилки</item> - <item quantity="other">Помилки</item> - </plurals> - <string name="error_wrong_server_url">Помилка в URL адресі </string> - <string name="error_wrong_credentials">Неправильні облікові дані </string> - <string name="error_unexpected_error">Неочікувана помилка</string> - <string name="error_internal_server_error">Помилка серверу</string> - <string name="no_value">немає значення</string> <string name="no_reserved_values">Більше немає зарезервованих значень. Зверніться до свого системного адміністратора</string> - <string name="no_reserved_values_connection">Більше немає зарезервованих значень. Щоб поповнити їх, підключіться до мережі</string> - <string name="errors">помилки</string> <string name="something_wrong">Сталася помилка</string> <!-- SyncService strings: --> - <string name="sync_now">Синхронізувати зараз</string> - <string name="sync_text">Синхронізація із сервером</string> - <string name="sync_title">Синхронізування</string> - <string name="sync_metadata">Метадані</string> <string name="sync_events">Події</string> - <string name="sync_tei">Об’єкти, які відстежуються</string> - - <string name="sync_complete_title">Завершено</string> - <string name="sync_complete_text">Синхронізацію завершено</string> <string name="sync_error_title">Помилка синхронізації</string> <string name="sync_error_text">Під час синхронізації сталася помилка. Будь ласка, повторіть спробу.</string> <string name="sync_incomplete_error_text">Синхронізацію завершено, але ми не отримали підтвердження від серверу для усіх записів. Ці записи все ще позначено як \"офлайн\" у програмі. Рекомендуємо повторити спробу синхронізації.</string> - <string name="data_sync_warning_program">ПОПЕРЕДЖЕННЯ: Більшість Ваших даних синхронізовано, але виникли конфлікти в деяких полях. Синхронізуйте конфігурацію та повторіть спробу. Якщо попередження не зникає, перевірте стан синхронізації: програм, об’єктів, які відстежуються та випадків з конфліктами позначені як @.</string> - <string name="server_sync_error">Сталася помилка, і сервер не відповідає. Зверніться до свого адміністратора.</string> - - <string name="search_result_text">%s результатів знайдено</string> - <string name="add_new">Додати нове</string> - <string name="add">Додати</string> <string name="enter_event_data">Введіть %s</string> <string name="enter_cancel_event_data">Ввести / Пропустити %s</string> - <string name="schedule_new">Запланувати нове</string> <string name="referral">Направлення</string> <!-- Login --> - <string name="url_hint">URL-адреса серверу</string> - <string name="user_hint">Ім\'я користувача</string> - <string name="password_hint">Пароль</string> - <string name="log_in_button">Увійти</string> - <string name="unlock_button">Розблокувати сесію</string> <string name="syncing_configuration">Синхронізація Вашої конфігурації</string> <string name="syncing_data_shortly">Ваші дані незабаром буде синхронізовано</string> <string name="syncing_data">Синхронізація Ваших даних</string> <string name="configuration_ready">Ваша конфігурація готова</string> <string name="data_ready">Ваші дані готові</string> - <string name="configuration_sync_failed">Помилка синхронізації конфігурації</string> - <string name="data_sync_failed">Помилка синхронізації даних</string> <string name="account_recovery">Відновлення облікового запису</string> - <string name="no_network_to_recover_account">Для відновлення облікового запису потрібне підключення до мережі.</string> <!--PERIOD--> <string name="DAILY">Щодня</string> @@ -80,134 +42,82 @@ <string name="enter_text">Введіть текст</string> <string name="enter_long_text">Введіть довгий текст</string> <string name="enter_number">Введіть номер</string> - <string name="enter_integer">Введіть ціле число</string> <string name="enter_negative_integer">Введіть ціле від’ємне число</string> <string name="enter_positive_integer_or_zero">Введіть додатне число або нуль</string> <string name="enter_positive_integer">Введіть додатне число</string> - <string name="filter_options">Параметри фільтру</string> <string name="choose_date">Оберіть дату</string> - <string name="change_calendar">Змінити календар</string> <!-- Status --> - <string name="program_completed">Програму завершено</string> - <string name="program_inactive">Програма неактивна</string> <string name="event_open">Відкрити</string> <string name="event_not_completed">Не завершено</string> <string name="event_completed">Подія завершена</string> <string name="read_only">Тільки читати</string> - <string name="finish_and_complete">Закінчити і завершити</string> <string name="completed">Завершено</string> <string name="cancelled">Скасовано</string> - <string name="activate">Активувати</string> <string name="active">Активно</string> <!-- State --> <string name="state_synced">Синхронізація</string> <string name="state_to_post">Надіслати</string> <string name="state_to_update">Оновити</string> - <string name="state_to_delete">Видалити</string> <string name="state_error">Помилка</string> - <string name="action_sync">СИНХРОНІЗАЦІЯ</string> - <string name="action_send">НАДІСЛАТИ</string> - <string name="action_sync_sms">СИНХРОНІЗАЦІЯ ЧЕРЕЗ SMS</string> <!--Completion--> - <string name="completion">Завершення</string> <!--Event initial--> - <string name="create">Створити</string> <string name="update">Оновити</string> - <string name="date">Дата</string> <string name="org_unit">Організаційний підрозділ</string> <string name="no_org_units">На вибрану дату немає відкритих організаційних підрозділів. Виберіть іншу дату або інший організаційний підрозділ.</string> - <string name="category_option">Опція категорії</string> <string name="latitude">Широта</string> <string name="longitude">Довгота</string> - <string name="new_event">Нова подія</string> - <string name="one_time">Одноразово</string> - <string name="permanent">Постійно</string> <!--DataSet initial--> <string name="report_period">Звітний період</string> - <string name="cat_option">Параметр категорії</string> - <string name="field_required">Якщо Ви встановлюєте значення, то щодо усього рядка потрібно вказати всі значення, щоб завершити набір даних.</string> - <string name="field_mandatory">Деякі необхідні значення відсутні. Потрібно встановити обов’язкові значення, щоб заповнити набір даних.</string> - <string name="field_mandatory_v2">Обов\'язкові поля не заповнені. Будь ласка, заповніть їх, щоб завершити набір даних.</string> - <string name="datavalue_saved">Значення збережено!</string> - <string name="there_is_no_available_period">Немає доступних періодів для вибору.</string> <!--Event Detail--> <string name="due_date">Дата виконання</string> <string name="cat_combo">Комбінація категорій</string> - <string name="date_default">ДД/ММ/РРРР</string> <string name="cancel">Скасувати</string> <string name="delete">Видалити</string> - <string name="total">Підсумок</string> <string name="most_recent_event_date">Дата останнього випадку</string> <string name="no_options">Немає доступних опцій</string> <string name="active_programs">Активні програми</string> - <string name="to_enroll_programs">Програми для реєстрації</string> <string name="enroll">Зареєструвати</string> - <string name="last_visit">Останній візит:</string> - <string name="apply">застосувати</string> <!--TEI DASHBOARD--> - <string name="see_details">Подивитись подробиці</string> - <string name="view_more">ДИВИТИСЬ БІЛЬШЕ</string> <string name="edit">Редагувати</string> - <string name="follow_up">Подальші дії</string> - <string name="follow_up_enabled">Подальші дії увімкнено</string> - <string name="follow_up_disabled">Подальші дії вимкнено</string> <string name="deactivate">Деактивувати</string> <string name="program_not_allow_events">Ця програма не дозволяє мати більше випадків</string> <!--DONE TASKS--> - <string name="events_no_data">Немає даних</string> <string name="events">випадки</string> <string name="done_task">Головна</string> - <string name="app_info">Інформація про додаток</string> <string name="log_out">Вийти з системи</string> - <string name="block_session">Заблокувати сесію</string> <string name="show_more_events">Показати %s більше...</string> <string name="show_less_events">Показати менше...</string> <!-- SYNC --> - <string name="a_minute">1 хвилина</string> - <string name="fifteen_minute">15 хвилин</string> <string name="thirty_minutes">30 хвилин</string> <string name="a_hour">1 година</string> <string name="every_6_hours">6 год</string> <string name="a_day">1 день (за замовчуванням)</string> <string name="every_12_hours">12 год</string> - <string name="Automatic_Sync_Data">Автоматична синхронізація даних кожні:</string> <string name="Manual">Вручну</string> - <string name="Automatic_Sync_Metadata">Автоматична синхронізація конфігурації кожні:</string> <string name="a_week">1 тиждень</string> <string name="sync_max_parameters">Поточні параметри синхронізації:</string> <string name="sync_default_parameters">Установити за замовчуванням</string> + <string name="wipe_data_meesage">Базу даних буде видалено. Вам буде запропоновано увійти знову.</string> <string name="wipe_data_ok">Прийняти</string> <string name="wipe_data_no">Скасувати</string> <string name="SYNC_DATA">СИНХРОНІЗУВАТИ дані зараз</string> <string name="SYNC_META">СИНХРОНІЗУВАТИ конфігурацію зараз</string> <string name="SYNC_MANAGER">Налаштування</string> - <string name="last_data_sync_date">Дата останньої синхронізації: %s</string> - <string name="last_metadata_sync_date">Дата останньої синхронізації: %s</string> <string name="refill_reserved_values">Поповнити</string> - <string name="settings_sms_module_title">SMS модуль:</string> <string name="settings_sms_receiver_number">SMS шлюз</string> <string name="settings_sms_result_sender_number">Результат SMS відправнику </string> - <string name="settings_sms_result_timeout_hint">секунд</string> - <string name="settings_sms_result_sender_hint">номер</string> - <string name="settings_sms_receiver_number_hint">номер</string> <string name="settings_sms_module_switch">Увімкнути надсилання SMS</string> <string name="settings_sms_response_wait_switch">Дочекайтеся відповіді щодо результату SMS</string> - <plurals name="settings_specific_programs"> - <item quantity="one">Є програма %s зі специфічними налаштуваннями</item> - <item quantity="few">Є програми %s зі спеціальними налаштуваннями</item> - <item quantity="many">Є програми %s зі спеціальними налаштуваннями</item> - <item quantity="other">Є програми %s зі спеціальними налаштуваннями</item> - </plurals> <string name="settings_limit_scope">Налаштування застосовуються</string> <string name="settings_limit_globally">Всюди</string> <string name="settings_limit_program">за програмою</string> @@ -225,8 +135,6 @@ <string name="settingsErrorLog_descr">Цей журнал містить усі помилки, спричинені синхронізацією Ваших даних і метаданих.</string> <string name="settingsDeleteLocalData">Видалити локальні дані</string> <string name="settingsDeleteLocalData_descr">Усі дані, що зберігаються на Вашому пристрої, буде видалено. Дані, які не синхронізовані із сервером, буде втрачено.</string> - <string name="settingsReset">Скинути дані програми та конфігурацію</string> - <string name="settingsReset_descr">Вашу конфігурацію та дані додатку, що зберігаються на пристрої, буде видалено. Вас потрібно увійти знову, і дані, які не синхронізовані із сервером, будуть втрачені.</string> <string name="settingsSms">Налаштування SMS</string> <string name="settingsSms_descr">Перевірте та відредагуйте параметри, що стосуються SMS-шлюзу</string> <string name="settingsCheckVersion">Оновлення додатку</string> @@ -235,8 +143,6 @@ <string name="settingsTwoFAStatus">Статус</string> <!--endregion--> - <string name="enrollmment_date">Дата реєстрації</string> - <!-- SEARCH OPTION SET --> <string name="search_optionset">Пошук</string> <!--FORM FRAGMENT--> @@ -257,29 +163,15 @@ <string name="tei_coordinates">Координати для</string> <!--EVENT SUMMARY--> - <string name="section_list">Список розділів</string> - <string name="event_summary_header" formatted="false">%s питань %s виконано</string> - <string name="event_summary_sections_header" formatted="false">%s з %s завершено</string> - <string name="complete_and_close">Завершити та закрити</string> <!--AGE CUSTOM VIEW--> - <string name="hint_day">Дні</string> - <string name="hint_month">Місяці</string> - <string name="hint_year">Роки</string> - <string name="week">Тижні</string> <string name="incident_date">Дата інциденту</string> - <string name="local_results">Локальні результати</string> - <string name="online_results">Онлайн результати</string> <string name="past_programs">Минулі програми</string> <!--PERMISSIONS--> <string name="permission_denied">Ви не маєте необхідного дозволу для виконання цієї дії</string> - <string name="add_relation_button">Додати як…</string> - <string name="date_dialog_clear">Очистити</string> <string name="period">Період</string> - <string name="org_unit_filter">(%d) Організаційний підрозділ</string> - <string name="org_unit_select_level">Рівень %d</string> <string name="tuto_main_1">Ласкаво просимо до dhis2</string> <string name="tuto_main_2">Тут Ви можете бачити свою активність</string> <string name="tuto_main_3">Ви можете застосувати фільтр…</string> @@ -288,16 +180,11 @@ <string name="tuto_main_6">Перевірте інші дії в головному меню</string> <!-- RELATIONSHIPS --> - <string name="default_relationship_label">Створити зв’язок</string> <string name="next">Наступне</string> <string name="search_min_num_attr">Для пошуку потрібно ввести принаймні %d атрибутів</string> - <string name="search_attr">Для пошуку потрібно ввести принаймні один із атрибутів</string> - <string name="search_max_tei_reached">Є більше ніж %d результатів. Будь ласка, введіть додаткові критерії пошуку</string> - <string name="search_init">Введіть критерії пошуку</string> <!-- QR --> <string name="QR_SCANNER">Імпорт QR-даних</string> - <string name="SAVE">Зберегти</string> <string name="button_ok">ОК</string> <string name="qr_id">Ідентифікація</string> <string name="qr_attributes">Атрибути</string> @@ -309,32 +196,20 @@ <string name="qr_no_data">немає даних</string> <string name="qr_error_id">Невірний QR-код</string> <string name="qr_error_attr">Цей атрибут не можна додати</string> - <string name="qr_error_enrollment">Цю реєстрацію не можна додати</string> <string name="about">Про</string> <string name="programs_to_enroll">Програми для реєстрації</string> - <string name="select_all">обрати усі</string> - <string name="clear_all">очистити вибір</string> - <string name="empty_program_list">Немає інформації для вибраних фільтрів. Будь ласка, спробуйте змінити їх.</string> <string name="share">Поділитися</string> <string name="share_qr">Поділитись QR</string> <string name="max">Макс</string> <string name="current">Поточний</string> <string name="tei">Об’єкт, який відстежується</string> <string name="teis">Об’єкти, які відстежуються</string> - <string name="limit_by_organisation_unit">Обмеження за організаційним підрозділом</string> - <string name="limit_by_program">Обмеження за програмою</string> - <string name="programs_list">Список програм</string> <string name="wipe_data">Скинути дані програми &amp; конфігурацію</string> - <string name="add_relationship_error">Неможливо додати цей зв’язок</string> <string name="warning_error_on_complete_title">Перевірити це!</string> - <string name="warning_on_complete_title">Попередження</string> - <string name="error_on_complete_title">Помилка</string> <string name="save">Зберегти</string> <string name="reserved_value">Зарезервовані значення</string> - <string name="downloaded_confirm">Бажаєте додати більше даних із QR?</string> - <!--ABOUT--> <string name="about_app">Версія додатку: %s</string> <string name="about_sdk">Версія SDK: %s</string> @@ -345,128 +220,42 @@ <string name="about_dev">Розроблено та підтримується <a href="https://www.dhis2.org/"> DHIS2 </a>проєктом, який є частиною Університету Осло, <a href="https://www.mn.uio.no/ifi/english/"> факультету інформатики </a> .</string> <string name="about_contact">Щоб отримати додаткову інформацію або отримати відповіді на запитання щодо цієї програми, напишіть на <a href="mailto:android@dhis2.org"> android@dhis2.org </a></string> - <string name="login_error_null_pass">Пароль відсутній. Будь ласка, заповніть це поле.</string> - <string name="login_error_null_username">Ім\'я користувача відсутнє. Будь ласка, заповніть це поле.</string> - <string name="login_error_dhis_version">На цьому сервері працює інша версія dhis, ніж 2.29. Щоб продовжити, оновіть версію сервера або скористайтеся середовищем тестування.</string> - <string name="login_error_dhis_version_v2">На цьому сервері працює версія dhis, що відрізняється від %s. Щоб продовжити, оновіть версію сервера або скористайтеся середовищем тестування.</string> - <string name="login_error_unsuccessful_response">Сталася помилка. Будь ласка, перевірте правильність URL-адреси сервера, імені користувача та пароля і повторіть спробу.</string> - <string name="login_error_error_response">Сервер не зміг виконати цей запит.</string> - <string name="login_error_default">Виникла проблема під час спроби входу на сервер.</string> - <string name="login_error">Помилка входу</string> - <string name="missing_mandatory_fields">Не заповнено обов\'язкові поля</string> - <string name="online_search_unexpected">Неочікувана помилка під час пошуку онлайн</string> - <string name="online_search_parsing_error">Помилка аналізу результатів</string> - <string name="online_search_error">Пошук онлайн спричинив помилку</string> - <string name="online_search_response_error">Сталася помилка на сервері</string> <string name="search_program_not_selected">Оберіть програму, щоб розпочати реєстрацію</string> <string name="search_access_error">Ви не маєте необхідного дозволу</string> - <string name="feature_unavaible">Ця функція ще не готова.</string> - <string name="relationship_label_error">Помилка при отриманні примітки зв’язку</string> <string name="all_tei_type">Усі %s</string> <string name="invalid_phone_number">Це недійсний номер телефону</string> - <string name="invalid_email">Ця електронна адреса невірна</string> - <string name="invalid_negative_number">Допускаються лише від’ємні числа</string> <string name="invalid_possitive_zero">Дозволені лише додатні числа або нуль</string> - <string name="invalid_possitive">Допускаються лише додатні числа</string> - <string name="invalid_interval">Допускаються лише значення від 0 до 1</string> - <string name="invalid_percentage">Допускаються лише значення від 0 до 100</string> - <string name="date_dialog_tigle">Обрати дати для фільтрування</string> <string name="select_option">Обрати опцію</string> - <string name="issue_reported">Про проблему повідомлено</string> - <string name="dialog_generate_new_event">Створити новий випадок</string> - <string name="message_generate_new_event">Ви хочете створити інший випадок?</string> <string name="event_completed_title">Завершені випадки</string> <string name="event_completed_message">Усі випадки цієї програми завершено. Ви бажаєте закрити також і програму?</string> - <string name="complete_enrollment_message">Бажаєте також завершити реєстрацію?</string> <string name="check_event">Перевірка</string> <string name="menu_home">Головна</string> <string name="appwidget_text">ПРИКЛАД</string> - <string name="add_widget">Додати віджет</string> <string name="showHelp">Показати допомогу</string> - <string name="tuto_settings_1">Синхронізація Ваших даних…</string> - <string name="tuto_settings_2">...Вашої конфігурації...</string> - <string name="tuto_settings_3">…встановити, скільки записів завантажувати із сервера…</string> - <string name="tuto_settings_reserved">Перевірка та управління кількістю зарезервованих значень, які залишились</string> - <string name="tuto_settings_errors">Перевірка, чи при підключенні до серверу сталась помилка</string> - <string name="tuto_settings_reset">Звільнити місце на диску</string> - <string name="tuto_settings_4">…або видалити усе, щоб почати спочатку.</string> - <string name="tuto_search_1_v2">Знаходження усіх об\'єктів, які відстежуються, як на локальному пристрої, так і на онлайн-сервері.</string> - <string name="tuto_search_2">Ви можете перемикатися на інші програми</string> - <string name="tuto_search_3_v2">Пошук або додавання нових об’єктів. Вам потрібно виконати пошук, перш ніж додати новий!</string> - <string name="tuto_search_4_v2">Натисніть тут, щоб очистити поля та перезапустити пошук.</string> <string name="tuto_dashboard_1">Це інформаційна панель об\'єкту, який відстежується</string> <string name="tuto_dashboard_2">Переглянути інформацію про профіль об\'єкту, який відстежується…</string> - <string name="tuto_dashboard_3">… Поділитись інформацією за допомогою QR-коду або SMS…</string> - <string name="tuto_dashboard_4">…Або позначити об\'єкт, який відстежується, для подальших дій</string> - <string name="tuto_dashboard_5">Натисніть, щоб створити або запланувати випадок або зробити перенаправлення до іншого організаційного підрозділу.</string> <string name="tuto_dashboard_6">Тут Ви побачите усі випадки. Натисніть, щоб переглянути деталі випадку.</string> <string name="tuto_dashboard_7">Скористайтесь меню, щоб додати зв’язки, переглянути індикатори або написати примітки.</string> - <string name="tuto_dashboard_8">Натисніть, щоб переглянути усі реєстрації Вашого об\'єкту, або створити нову.</string> - <string name="tuto_tei_event_1">Натисніть, щоб видалити цей випадок. Цю дію не можна скасувати.</string> - <string name="tuto_tei_event_2">Завершити випадок.</string> - <string name="tuto_program_event_1">Тут будуть перераховані всі випадки, які пов’язані з цією програмою.</string> - <string name="tuto_program_event_2">Натисніть, щоб додати новий випадок</string> <string name="tuto_event_initial_new_1">Введіть усі дані для створення випадку</string> <string name="tuto_event_initial_1">Натисніть, щоб перевірити статус завершення випадку.</string> - <string name="tuto_event_summary">Натисніть, щоб завершити або повторно відкрити випадок</string> - <string name="tuto_main_7">Читайте та зберігайте інформацію з інших пристроїв за допомогою QR</string> - <string name="tuto_main_8">Синхронізуйте свої дані з сервером</string> - <string name="tuto_main_9">Заблокуйте сесію 4-значним кодом. Не забудьте свій код!</string> - <string name="tuto_main_10">Вийдіть, щоб змінити користувача або адресу серверу. Ви зможете увійти знову, навіть якщо немає підключення до Інтернету.</string> - <string name="text_plus_colon">%s:</string> <string name="relationships">зв\'язки</string> <string name="empty_tei_add">Немає зареєстрованих випадків, натисніть «+», щоб додати новий.</string> - <string name="empty_tei_no_add">Немає зареєстрованих випадків.</string> <string name="qr_data_values">Значення даних</string> <string name="info">Інформація</string> <string name="qr_no_id_error">Не вдалося прочитати цей ідентифікатор</string> <string name="delete_local_data">Видалити локальні дані</string> <string name="dashboard_overview">Огляд</string> - <string name="dashboard_relationships">Зв\'язки</string> - <string name="dashboard_indicators">Показники</string> - <string name="dashboard_analytics">Аналітика</string> <string name="empty_indicators">Індикаторів для цієї програми немає.</string> - <string name="dashboard_notes">Нотатки</string> - <string name="unable_to_complete">Не вдалося завершити</string> - <string name="unable_to_save">Не вдалося зберегти</string> - <string name="warnings_in_form">Форма містить попередження </string> - <string name="what_to_do">Що би Ви хотіли зробити?</string> - <string name="field_errors">У деяких полях є помилки. Будь ласка, перевірте їх, щоб мати можливість завершити</string> <string name="unselect_enrollment">Усі реєстрації</string> <string name="unselect_enrollment_description">Показати інформаційну панель з усіма активними програмами</string> - <string name="CHECK_SYNC_ERRORS">Відкрити журнал помилок синхронізації</string> <string name="error_dialog_title">Журнал помилок синхронізації</string> <string name="share_with">Поділитися з...</string> - <string name="errors_during_sync">Помилка синхронізації конфігурації. На Вашому сервері можуть бути помилки. Натисніть тут для отримання додаткової інформації.</string> - <string name="sectionSelectorPrev">ПОПЕР</string> - <string name="sectionSelectorNext">ДАЛІ</string> - <string name="event_overview">Деталі</string> - <string name="event_indicators">Показники</string> - <string name="event_notes">Нотатки</string> - <string name="complete_add_new"> <![CDATA[Завершити & Додати нове]]></string> - <string name="complete_later">Завершити пізніше</string> - <string name="finish_add_new"> <![CDATA[Закінчити & Додати нове]]></string> - <string name="finish">Закінчити</string> - <string name="error_fields_title">Поля з помилками</string> - <string name="error_fields_events">У деяких полях є помилки. Вони не збереглися. Будь ласка, перевірте їх.</string> <string name="unique_warning">Значення має бути унікальним, знайдено збіг. Значення не збереглось. Будь ласка, перевірте це.</string> - <string name="unique_coincidence_found">Виявлено збіг в унікальному полі. Будь ласка, перевірте форму, щоб зберегти реєстрацію.</string> <string name="please_wait">Будь ласка, почекайте</string> <string name="skip">Пропустити</string> - <string name="reschedule">Перепланувати</string> <string name="no_intructions">Для цієї частини немає інформації</string> - <string name="event_overdue">Прострочене</string> - <string name="unsupported_program_rule">Є одне правило програми, яке не підтримується. Будь ласка, зверніться до інструкції</string> - <string name="empty_description">Немає інформації для цього поля</string> - <string name="biometrics_dialog_title">Порожні облікові дані</string> - <string name="biometrics_first_use_text">Щоб мати можливість увійти за допомогою сканера відбитків пальців, спочатку потрібно використовувати спосіб за замовчуванням</string> - <string name="biometrics_security_title">Біометрична безпека</string> - <string name="tab_tables">Таблиці</string> - <string name="table">Таблиця</string> - <string name="login_https">https://</string> <string name="delete_local_data_message">Несинхронізовані дані буде втрачено. Ви дійсно хочете продовжити?</string> - <string name="local_data_accept">Прийняти</string> <string name="delete_local_data_error">Не вдалося видалити дані. Будь ласка, повторіть спробу.</string> <string name="delete_local_data_done">Видалення локальних даних успішно завершено.</string> <string name="org_unit_selection_warning">Необхідно вибрати принаймні один організаційний підрозділ</string> @@ -478,6 +267,7 @@ <string name="action_agree">Погодитись</string> <string name="action_continue">Продовжити</string> <string name="login_server_info_title">URL-адреса серверу</string> + <string name="login_server_info_message">Введіть URL-адресу серверу DHIS 2 для Вашої організації, надану Вашим системним адміністратором. Альтернативно, Ви можете відсканувати QR-код, що містить URL-адресу Вашого сервера</string> <string name="forgot_your_code">Забули код?</string> <string name="event_form_end_options_title">Що б Ви хотіли зробити для цього випадку?</string> <string name="sectionSelectorEnd">КІН</string> @@ -488,33 +278,16 @@ <string name="state_uploading">Завантаження</string> <string name="state_relationship">Зв\'язок</string> <string name="sent_by_sms">Надіслано через SMS</string> - <string name="no_conflicts_message">Для цієї програми немає конфліктів</string> - <string name="network_unavailable_sms">Підключення до мережі недоступне, але, схоже, є телефонні послуги - можна використовувати SMS.</string> - <string name="network_unavailable">Підключення до мережі недоступне.</string> <string name="action_close">Закрити</string> <string name="tuto_main_11">Тепер Ви можете перевірити інформацію про синхронізацію, натиснувши тут</string> - <string name="no_conflicts_update_message">Ці дані зберігаються лише на Вашому пристрої, вони не синхронізуються із сервером.</string> - <string name="no_conflicts_synced_message">Дані оновлено! Усі Ваші дані надіслано на сервер.</string> <string name="relationship_error_recursive">Ви не можете пов\'язати запис із самим собою</string> - <string name="unblock_session">Розблокувати сесію</string> - <string name="data_set_complete">Завершити</string> - <string name="data_set_open">Відкрити</string> - <string name="unsupported_value_type">Тип значення, що не підтримується</string> <string name="change_calendar_view">Змінити вид календаря</string> - <string name="data_every_fifteen_minutes">15 хвилин</string> - <string name="data_every_hour">Щогодини</string> - <string name="data_every_day">Щодня</string> - <string name="data_every_week">Щотижня</string> - <string name="period_week">Тиждень</string> - <string name="sync_setting">Налаштування синхронізації: %s</string> <string name="relationship_without_enrollment">Запис, до якого Ви намагаєтеся отримати доступ, не зареєстрований. Ви не можете отримати доступ до інформаційної панелі.</string> <string name="formatting_error">Помилка форматування</string> <string name="dashboard_menu_delete_tei_v2">Видалити %s</string> <string name="delete_authority_error">Ви не маєте повноважень видаляти цей запис</string> - <string name="validation_url">Це недійсна URL-адреса</string> <string name="adjusting_form">Коригування форми…</string> - <string name="sms_receiver_number">Номер одержувача</string> <string name="sms_amount_question">Чи підтверджуєте надсилання %dповідомлень ?</string> <string name="sms_sending">Надсилання %1$d/%2$d</string> <string name="sms_waiting_amount_confirm">Очікування обсягу підтвердження - %d</string> @@ -532,51 +305,29 @@ <string name="sms_error_no_gateway_set">Шлюз не встановлено</string> <string name="sms_error_no_user_login">Користувач не ввійшов у систему</string> <string name="sms_error_module_disabled">SMS модуль вимкнено</string> - <string name="sms_error_ongoing_sunmission">Триває надсилання ще одного SMS</string> <string name="sms_metadata_empty">Модуль SMS не запущено, необхідні метадані не знайдені</string> - <string name="sms_completed">Завершено</string> <string name="sms_count_error">Підрахунок SMS не приймається</string> <string name="sms_state_started">Розпочато відправку SMS</string> <string name="sms_state_converted">Дані зчитано та конвертовано. Ідентифікатор подання: %d</string> - <string name="sms_general_error">Помилка надсилання SMS-повідомлення</string> <string name="sms_title_enrollment">Реєстрація об\'єкту, який відстежується, та випадку за допомогою SMS </string> <string name="sms_title_event">Надсилання випадку через SMS</string> <string name="sms_title_data_set">Надсилання набору даних через SMS</string> - <string name="sms_bar_state_starting">Початок</string> - <string name="sms_bar_state_sending">Виконується</string> - <string name="sms_bar_state_sent">Надіслано</string> - <string name="sms_bar_state_failed">Помилка</string> - <string name="start_sync_granular">Початок синхронізації.</string> <string name="syncing">Синхронізація...</string> - <string name="end_sync_granular">Синхронізацію завершено.</string> - <string name="error_sync">Під час синхронізації сталася помилка.</string> - <string name="error_sync_check_logs">Під час синхронізації сталася помилка. Натисніть тут, щоб перевірити журнали помилок</string> - <string name="cancel_sync">Синхронізацію скасовано.</string> <string name="copied_text">Скопійовано</string> - <string name="image_selected">Зображення обрано</string> - <string name="show_in_map">Показати на карті</string> - <string name="show_list">Показати списком</string> <!--region TRACKER IMPORT CONFLICT MESSAGES--> - <string name="value_required_but_not_provided">%s є обов’язковим, але не заповнено.</string> - <string name="polygon_captured">Зафіксовано багатокутник</string> <string name="polygon">Багатокутник</string> <!--endregion--> - <string name="fingerprint_title">Відбиток пальця</string> - <string name="fingerprint_message">Будь ласка, піднесіть палець до сканеру відбитків пальців.</string> <string name="security_title">Безпека</string> <string name="security_rooted_message">З міркувань безпеки цю версію додатку не можна використовувати на пристроях з кореневим доступом. Будь ласка, використовуйте навчальну версію.</string> - <string name="fix_error">Є деякі помилки. Перш ніж продовжити, виправте їх.</string> <string name="filters_active">Застосовано фільтри</string> <string name="filters_disabled">Фільтрів не застосовано</string> <string name="filters_title_period">Період</string> <string name="filters_title_org_unit">Орг. підрозділ</string> - <string name="filters_title_sorting">Сортування</string> - <string name="filters_title_status">Статус</string> <string name="filters_title_state">Синхронізація</string> <string name="filters_title_assigned">Призначено мені</string> <string name="filter_period_today">Сьогодні</string> @@ -591,8 +342,6 @@ <string name="filter_period_form_to">Від - До</string> <string name="filter_period_other">Інше</string> <string name="filter_period_any">Будь-коли</string> - <string name="data_values_error_sync_message">Помилка синхронізації. Помилка синхронізації. Перевірте значення даних, щоб спробувати вирішити проблему, і повторіть спробу. Якщо збій продовжується, зверніться до системного адміністратора</string> - <string name="sms_synced_message">Ці дані були надіслані на сервер, але їх збереження не гарантовано</string> <string name="filter_event_status_open">Відкрити</string> <string name="filter_event_status_schedule">Запланувати</string> <string name="filter_event_status_overdue">Прострочено</string> @@ -608,7 +357,6 @@ <string name="sms_empty_gateway">SMS-шлюз не може бути порожнім</string> <string name="granular_sync_enrollments_empty">Немає реєстрацій для завантаження</string> <string name="granular_sync_unsupported_task">Цей convertTask не підтримується</string> - <string name="disable_pin_locked">Більше не показувати екран блокування</string> <string name="set_pin">Встановити PIN</string> <string name="conflict">Помилка</string> <string name="change_event_date">Змінити дату</string> @@ -633,11 +381,7 @@ <string name="choose_ou">Оберіть організаційний підрозділ</string> <string name="enter_url">Введіть URL-адресу</string> <string name="enter_value">Введіть значення</string> - <string name="choose_image">Оберіть зображення</string> - <string name="scan_code">Сканувати код</string> - <string name="choose_option">Оберіть варіант</string> <string name="reserved_values_hint">Зарезервовані значення, завантажені для атрибута об\'єкту</string> - <string name="settings_reserved_values_message">Зарезервовані значення, завантажені для атрибута об\'єкту</string> <string name="reserved_values_left">%s залишилося зарезервованих значень</string> <string name="manage_reserved_values_button">Управління зарезервованими значеннями</string> <string name="events_to_download">Випадків для завантаження</string> @@ -657,55 +401,29 @@ <string name="filter_sync_not_synced">Не синхронізовано</string> <string name="filter_sync_error">Помилка синхронізації</string> <string name="filter_sync_sms">Синхронізовано через SMS</string> - <string name="dataset_overview">Деталі</string> - <string name="dataset_comments">Коментарі</string> <string name="saved">Збережено!</string> - <string name="run_validation_rules">Хочете перевірити якість даних?</string> - <string name="validation_success_title">Все виглядає добре!</string> - <string name="mark_dataset_complete">Ви бажаєте також завершити набір даних?</string> - <string name="dataset_completed">Позначити як виконане</string> - <string name="name">Ім\'я</string> - <string name="formula">Формула</string> - <string name="complete_anyway">Все одно завершити</string> <string name="fk_message">Відсутній %s %s від %s %s</string> <string name="filters_title_event_status">Статус випадку</string> - <string name="enrollment_date">Дата реєстрації</string> <string name="dataset_empty_list_can_create">Немає даних. Натисніть «+», щоб додати новий запис</string> <string name="dataset_emtpy_list_can_not_create">Немає даних. Ви не маєте дозволу додавати нові записи.</string> <string name="validation_rules_empty_description">Немає опису чи інструкції</string> <string name="validation_rules_data_to_review">Дані для перегляду</string> - <string name="dataset_saved_completed">Збережено та завершено!</string> <string name="status_change_error_active_exist">Вже є активна реєстрація</string> <string name="enrollment_status_active">Відкрити</string> <string name="enrollment_status_completed">Завершити</string> <string name="enrollment_status_cancelled">Скасовано</string> - <string name="event_data">Дані</string> <string name="download_tei_error">Не вдалося завантажити вибраний %s.</string> - <string name="completed_by">Виконано з %s: %s</string> - <string name="updated_time">Оновлено: %s</string> - <string name="action_done">Обрати</string> - <string name="validation_internal_error_datasets">Ми не змогли перевірити якість даних. Зверніться до свого адміністратора</string> - <string name="are_you_sure">Чи Ви впевнені?</string> - <string name="reopen_question">Хочете знову відкрити набір даних?</string> <string name="filters_title_date">Дата</string> - <string name="filters_title_event_date">Дата випадку</string> - <string name="tei_type_has_no_attributes">%s не має публічних атрибутів. Виберіть програму</string> <string name="privacy_policy_title">Політика конфіденційності</string> <string name="open_privacy_policy">Натисніть тут, щоб ознайомитися з нашою <a href=""> політикою конфіденційності </a></string> <string name="coordinates_error">Значення координат недійсні</string> + <string name="break_glass_error_v2">Ви не можете зареєструвати %s з інших організаційних підрозділів у цій програмі, оскільки вона закрита для Вас. Зверніться до свого адміністратора.</string> <string name="field_is_mandatory">Це поле обов\'язкове для заповнення</string> <string name="security_debugger_message">З міркувань безпеки цю версію додатку не можна використовувати з adb. Будь ласка, використовуйте навчальну версію.</string> <string name="customactivityoncrash_error_activity_restart_app">Повернутися</string> - <string name="customactivityoncrash_error_activity_close_app">Закрити додаток</string> - <string name="customactivityoncrash_error_activity_error_details">Детальніше</string> - <string name="customactivityoncrash_error_activity_error_details_title">Детальніше</string> - <string name="customactivityoncrash_error_activity_error_details_close">Закрити</string> <string name="customactivityoncrash_error_activity_error_details_copy">Копіювати в буфер обміну</string> - <string name="customactivityoncrash_error_activity_error_details_copied">Скопійовано до буферу обміну</string> - <string name="customactivityoncrash_error_activity_error_details_clipboard_label">Інформація про помилку</string> <string name="metada_first_sync_error">Ми знайшли помилку під час синхронізації з Вашим сервером. Якщо можливо, повідомте про помилку системному адміністратору.</string> - <string name="error_init_session">Нам не вдалося почати сесію із Вашим користувачем</string> <string name="enrollment_date_edition_warning">Є заплановані випадки, які не будуть перенесені</string> <string name="section_charts">Діаграми</string> <string name="navigation_list_view">Список</string> @@ -754,46 +472,27 @@ <string name="section_feedback">Відгук</string> <string name="section_indicators">Показники</string> <string name="value">Значення</string> + <string name="camera_permission_denied">Відмовлено у використанні камери. Вам потрібно ввімкнути цей дозвіл, щоб використовувати цю функцію.</string> <string name="section_charts_indicators">Діаграми та індикатори</string> <string name="take_photo">Зробити фото</string> - <string name="from_gallery">Обрати з галереї</string> - <string name="data_set_quality_check_done">Готово!</string> <string name="break_glass_dialog_title">Ця програма закрита для Вас</string> <string name="break_glass_hint">Опишіть причину тут</string> - <string name="authenticating">Автентифікація</string> - <string name="login_error_no_dhis_instance">Надана URL-адреса сервера не є екземпляром dhis</string> - <string name="login_error_bad_credentials">Неправильні облікові дані</string> - <string name="login_error_unknown_host">Невідомий сервер</string> - <string name="invalid_integer">Значення має бути цілим числом</string> <string name="openid_session_expired">Сесія неактивна</string> <string name="openid_session_expired_message">Ваша поточна сесія неактивна. З міркувань безпеки Вам потрібно знову ввести свої облікові дані</string> - <string name="dataset_column_default">Значення</string> <string name="week_period_span_default_label">Тиждень %d %s до %s</string> <string name="action_do_not_show_again">Не показувати знову</string> <string name="feature_configuration">Конфігурація функції</string> <string name="show_radar_graph">Показати як діаграму Радар</string> - <string name="coordinate_feature_type_error">Неможливо встановити тип координат</string> <string name="filter_follow_up_label">Для подальших дій %s</string> - <string name="wrong_date_format">%s не можна проаналізувати як дату</string> <string name="update_field_error">Це поле не вдалося оновити. Будь ласка спробуйте ще раз</string> - <string name="edition">Версія</string> - <string name="available">Доступно</string> <string name="blocked_by_completion">Ці дані не можна редагувати, оскільки вони позначені як завершені</string> <string name="edition_expired">Ці дані не можна редагувати, оскільки час їх редагування минув</string> <string name="edition_no_write_access">Ви не маєте дозволу редагувати ці дані</string> <string name="event_date_not_in_orgunit_range">Ці дані не можна редагувати, оскільки організаційний підрозділ закрито</string> <string name="edition_no_catcombo_access">Ви не маєте дозволу редагувати ці дані</string> - <string name="edition_orgunit_capture_scope">Ви не можете редагувати дані з цього організаційного підрозділу</string> - <string name="reload_list">Скинути пошук</string> + <string name="edition_orgunit_user_scope">Ви не можете редагувати дані з цього організаційного підрозділу</string> <string name="error_tei_online_search_title">Онлайн-пошук дав таке повідомлення:</string> - <string name="program_rules_loop_warning_title">Попередження про правила програми</string> - <string name="program_rules_loop_warning_message">Існує проблема конфігурації, яка спричиняє помилку у правилах. Зверніться до адміністратора.</string> - <string name="granular_sync_refresh">ОНОВИТИ</string> - <string name="unknown_date">Невідомо</string> - <string name="granular_sync_refresh_title">Оновити всі дані</string> - <string name="max_accounts_text">Ви досягли максимальної кількості акаунтів (%d). Щоб додати новий обліковий запис, увійдіть і видаліть один із своїх облікових записів</string> <string name="delete_account">Видалити обліковий запис</string> - <string name="manage_accounts">Управління обліковими записами</string> <string name="main_menu_troubleshooting">Усунення несправностей конфігурації</string> <string name="troubleshooting_language_title">Мова</string> <string name="troubleshooting_language_description">Натисніть тут, щоб змінити мову додатку</string> @@ -811,14 +510,13 @@ <string name="search_no_results">Для цього пошуку результатів немає </string> <string name="search_too_many_results">Забагато результатів</string> <string name="search_too_many_results_message">Спробуйте змінити пошук, щоб звузити результати.</string> - <string name="search_create_new">Створити новий</string> <string name="search_new_te_type">Новий 1%s</string> - <string name="search_min_attributes_message">Для пошуку необхідно ввести хоча б %s атрибут</string> <string name="action_ok">OK</string> <string name="init_search">Почніть пошук, щоб знайти будь-який %s</string> <string name="search_or_create">Ви можете знайти або створити новий %s</string> <string name="event_can_be_completed">Ви бажаєте позначити цю форму як завершену?</string> <string name="changes_will_be_discarted">Якщо Ви зараз вийдете, зміни буде скасовано.</string> + <string name="event_error_on_complete">У вас є кілька повідомлень про помилки. Бажаєте їх переглянути?</string> <string name="re_opened">Відкрито знову</string> <string name="account_disable_title">Обліковий запис вимкнено</string> <string name="account_disable_message">Ваш обліковий запис було вимкнено адміністратором.</string> @@ -828,18 +526,8 @@ <string name="customactivityoncrash_error_activity_current_date">Поточна дата: %s</string> <string name="customactivityoncrash_error_activity_device">Пристрій: %s</string> <string name="customactivityoncrash_error_activity_os_version">Версія ОС: %s</string> - <string name="open_details">Відкрити деталі %s</string> - <string name="tracked_entity_type_details">%s Деталі</string> <string name="syncing_resource">Синхронізація %s…</string> - <string name="sms_sync_waiting_for_response">SMS відправлено. Очікування відповіді серверу.</string> - <string name="sms_sync_sms_reached_server">SMS підтверджено на сервері. Оновлення статусу</string> - <string name="sms_sync_sms_reached_server_error">Ми не можемо підтвердити, що SMS надійшло на сервер. Оновлення статусу</string> - <string name="sms_sync_sent">SMS відправлено. Оновлення статусу.</string> - <string name="sms_sync_not_sent">SMS не відправлено.</string> - <string name="sms_sync_opening_app">Відкриття програми SMS. Будь ласка, не змінюйте повідомлення.</string> <string name="sms_sync_sms_app_chooser_title">Надіслати SMS за допомогою</string> - <string name="sms_sync_manual_confirmation">Очікується підтвердження вручну</string> - <string name="syncing_events">Синхронізація подій</string> <string name="enrolledIn">Зареєстровано в:</string> <string name="ownedBy">Власник:</string> <string name="sync_dialog_title_not_synced">Потрібна синхронізація</string> @@ -849,7 +537,6 @@ <string name="sync_dialog_action_not_now">Не зараз</string> <string name="software_update">Оновлення додатку</string> <string name="check_for_updates">Перевірити оновлення</string> - <string name="checking_for_updates">Перевірка оновлень</string> <string name="no_updates">Оновлення відсутні</string> <string name="app_version">Версія додатку</string> <string name="not_synced">Не синхронізовано</string> @@ -869,15 +556,17 @@ <string name="enter_event">Введіть %1$s</string> <string name="program_stage">Етап програми</string> <string name="event">подія</string> - <string name="clear_search">Очистити пошук</string> - <string name="optional">Необов\'язково</string> <string name="show_more">Показати більше</string> <string name="show_less">Показати менше</string> <string name="sync">Синхронізація</string> - <string name="show_fields">Показати поля</string> - <string name="hide_fields">Приховати поля</string> <string name="syncing_something">Синхронізація %s…</string> <string name="show_description">Показати опис</string> <string name="hide_description">Приховати опис</string> <string name="transfer">Перевести</string> - </resources> + <plurals name="settings_specific_programs"> + <item quantity="one">Є програма %s зі специфічними налаштуваннями</item> + <item quantity="few">Є програми %s зі спеціальними налаштуваннями</item> + <item quantity="many">Є програми %s зі спеціальними налаштуваннями</item> + <item quantity="other">Є програми %s зі спеціальними налаштуваннями</item> + </plurals> +</resources> diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index 8afc2fd4f7a..21515732ec1 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -1,16 +1,14 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!-- Warnings and error messages --> <string name="error">غلطی</string> - <string name="sync_metadata">میٹا ڈیٹا</string> + <!-- SyncService strings: --> + <string name="sync_events">تقریبات</string> - <string name="add_new">نیا شامل</string> - <string name="add">اضافہ</string> - <string name="schedule_new">نیا شیڈول</string> + <string name="referral">حوالہ دیتے ہیں</string> - <string name="user_hint">صارف کا ناÙ</string> - <string name="password_hint">پاسورڈ</string> <string name="account_recovery">اکاؤنٹ بحالی</string> + <!--PERIOD--> <string name="DAILY">روزانہ</string> <string name="WEEKLY">ہفتہ وار</string> @@ -19,104 +17,70 @@ <string name="action_share_zero_items">بانٹیں</string> <!-- Input hints --> <string name="search">تلاش کریں</string> + <!-- Status --> + <string name="event_open">کھلا</string> <string name="read_only">صرف دیکھنے کی حد تک</string> <string name="completed">مکمل</string> <string name="cancelled">منسوخ</string> - <string name="activate">چالو کریں</string> <string name="active">فعال</string> <string name="state_error">غلطی</string> + <!--Completion--> - <string name="completion">پروگرام کا مرحلہ</string> <!--Event initial--> - <string name="create">تخلیق</string> <string name="update">اپڈیٹ</string> - <string name="date">تاریخ</string> - <string name="category_option">اختیاری قسم</string> <string name="latitude">طول</string> <string name="longitude">لمبائی</string> - <string name="new_event">نئی تقریب</string> + <!--Event Detail--> <string name="due_date">اخری تاریخ</string> <string name="cancel">منسوخ</string> <string name="delete">حذف</string> - <string name="total">کُل</string> <string name="no_options">کوئی اختیار دستیاب نہیں ہے</string> <string name="active_programs">فعال پروگرام</string> <string name="enroll">اندراج کریں</string> + + <!--TEI DASHBOARD--> <string name="edit">ترمیم</string> <string name="deactivate">غیر فعال</string> - <!--DONE TASKS--> - <string name="events_no_data">کوئی مواد نہیں</string> <string name="done_task">گھر</string> <string name="wipe_data_no">منسوخ</string> <string name="SYNC_MANAGER">ترتیبات</string> <string name="settingsTwoFAStatus">حالت</string> <!--endregion--> - <string name="enrollmment_date">اندراج کی تاریخ</string> - <!-- SEARCH OPTION SET --> <string name="search_optionset">تلاش کریں</string> <!--FORM FRAGMENT--> <string name="report_date">رپورٹ کی تاریخ</string> <string name="add_note">نوٹ شامل</string> + <!--EVENT SUMMARY--> + <!--AGE CUSTOM VIEW--> - <string name="hint_day">دن</string> - <string name="hint_month">مہینے</string> - <string name="hint_year">سال</string> - <string name="week">ہفتوں</string> <string name="incident_date">واقعات کی تاریخ</string> - <string name="date_dialog_clear">کلیئر</string> <string name="period">مدت</string> + <!-- RELATIONSHIPS --> <string name="next">اگلہ</string> - <string name="SAVE">محفوظ</string> <string name="button_ok">ٹھیک</string> <string name="qr_attributes">خصوصیات</string> <string name="qr_events">تقریبات</string> <string name="qr_relationships">تعلقات</string> <string name="about">متعلق</string> <string name="share">بانٹیں</string> - <string name="max">زیادہ سے زیادہ</string> - <string name="current">موجودہ</string> - <string name="warning_on_complete_title">وارنگ</string> - <string name="error_on_complete_title">غلطی</string> <string name="save">محفوظ</string> <string name="menu_home">گھر</string> <string name="qr_data_values">ڈیٹا اقدار</string> - <string name="dashboard_relationships">تعلقات</string> - <string name="dashboard_indicators">اشارے</string> - <string name="dashboard_analytics">تجزیات</string> - <string name="dashboard_notes">نوٹس</string> - <string name="event_overview">تفصیلات</string> - <string name="event_indicators">اشارے</string> - <string name="event_notes">نوٹس</string> <string name="please_wait">انتظار کیجئے</string> <string name="skip">چھوڑ دو</string> - <string name="reschedule">تجزیہ کریں</string> - <string name="event_overdue">زیادہ سے زیادہ</string> - <string name="table">ٹیبل</string> - <string name="action_continue">جاری رہے</string> <string name="state_warning">وارنگ</string> <string name="state_relationship">تعلقات</string> <string name="action_close">بند</string> - <string name="data_set_complete">مکمل</string> - <string name="data_set_open">کھلا</string> - <string name="unsupported_value_type">غیر قابل قدر قیمت کی قسم</string> - <string name="data_every_day">روزانہ</string> - <string name="data_every_week">ہفتہ وار</string> - <string name="period_week">ہفتہ</string> - <string name="sms_completed">مکمل</string> - <string name="sms_bar_state_sending">کام جاری ہے</string> - <string name="sms_bar_state_failed">ناکام</string> - + <!--region TRACKER IMPORT CONFLICT MESSAGES--> <string name="polygon">کثیر زبان</string> <string name="filters_title_period">مدت</string> - <string name="filters_title_sorting">ترتیب دیں</string> - <string name="filters_title_status">حالت</string> <string name="filter_period_today">آج</string> <string name="filter_period_yesterday">کل</string> <string name="filter_period_this_week">اس ہفتے</string> @@ -132,22 +96,12 @@ <string name="go_back">واپس</string> <string name="data_sets">ڈیٹا سیٹس</string> <string name="interval_yesterday">کل</string> - <string name="dataset_overview">تفصیلات</string> - <string name="dataset_comments">تبصرے</string> - <string name="name">ناÙ</string> - <string name="formula">فارمولہ</string> <string name="filters_title_event_status">واقعہ کی حیثیت</string> - <string name="enrollment_date">اندراج کی تاریخ</string> <string name="enrollment_status_active">کھلا</string> <string name="enrollment_status_completed">مکمل</string> <string name="enrollment_status_cancelled">منسوخ</string> - <string name="event_data">ڈیٹا</string> - <string name="action_done">ہو گیا</string> - <string name="are_you_sure">کیا تمہیں یقین ہے؟</string> <string name="filters_title_date">تاریخ</string> - <string name="filters_title_event_date">واقعہ کی تاریخ</string> <string name="customactivityoncrash_error_activity_restart_app">واپس</string> - <string name="customactivityoncrash_error_activity_error_details_close">بند</string> <string name="section_charts">چارٹس</string> <string name="navigation_list_view">فہرست</string> <string name="navigation_map_view">نقشہ</string> @@ -172,10 +126,6 @@ <string name="filter_period_last_financial_year">آخری مالیاتی سال</string> <string name="section_feedback">رائے</string> <string name="section_indicators">اشارے</string> - <string name="value">قدر</string> - <string name="invalid_integer">ویلیو انٹیجر ہونی چاہیے</string> - <string name="available">موجودہ</string> - <string name="unknown_date">نامعلوم</string> <string name="troubleshooting_language_title">زبان</string> <string name="action_ok">ٹھیک ہے\!</string> <string name="sync_dialog_action_send">بھیجو</string> @@ -187,7 +137,6 @@ <string name="schedule">شیڈول</string> <string name="scheduled_enter_event">شیڈول کردہ</string> <string name="program_stage">پروگرام کا مرحلہ</string> - <string name="optional">اختیاری</string> <string name="show_more">اور دیکھاو</string> <string name="show_less">کم دکھائیں</string> </resources> diff --git a/app/src/main/res/values-uz-rUZ/strings.xml b/app/src/main/res/values-uz-rUZ/strings.xml index 05321637d82..7586c57baf5 100644 --- a/app/src/main/res/values-uz-rUZ/strings.xml +++ b/app/src/main/res/values-uz-rUZ/strings.xml @@ -1,52 +1,26 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!--GENERAL--> <string name="app_name">DHIS2</string> - <string name="logo_text">DHIS</string> - <string name="logo_number">2</string> <!-- Warnings and error messages --> <string name="error">Xatolik</string> - <string name="error_wrong_server_url">Server URLi notoʼgʼri</string> - <string name="error_wrong_credentials">Notoʼgʼri maʼlumot</string> - <string name="error_unexpected_error">Kutilmagan xatolik</string> - <string name="error_internal_server_error">Serverdagi ichki xatolik</string> <string name="no_reserved_values">Saqlangan boshqa qiymatlar yoʼq. Tizim administratoriga murojaat qiling.</string> - <string name="no_reserved_values_connection">Saqlangan boshqa qiymatlar yoʼq. Ularni toʼldirish uchun tarmoqqa ulaning.</string> <string name="something_wrong">Nimadir notoʼgʼri bajarildi</string> <!-- SyncService strings: --> - <string name="sync_now">Hozir sinxronlashtiring</string> - <string name="sync_text">Server bilan sinxronlash</string> - <string name="sync_title">Hozir sinxronlash</string> - <string name="sync_metadata">Metadata</string> <string name="sync_events">Hodisa/tadbirlar</string> - <string name="sync_tei">Kuzatuvdagi obʼektlar</string> - - <string name="sync_complete_title">Tugadi</string> - <string name="sync_complete_text">Sinxronlash tugallandi</string> <string name="sync_error_title">Sinxronlashda xatolik</string> <string name="sync_error_text">Sinxronlash paytida xatolik yuz berdi. Iltimos, qayta urinib koʼring</string> - <string name="data_sync_warning_program">OGOHLАNTIRISh: Maʼlumotlarning aksariyat qismi sinxronlashtirildi. Lekin, baʼzi ziddiyatlar kelib chiqdi. Konfiguratsiyani sinxronlang va qaytadan urinib koʼring. Аgar ogohlantirish davom etsa, ularning sinxronlash holatini tekshiring: @ sifatida belgilangan dasturlar, TEIni va hodisa/tadbirlarni.</string> - <string name="search_result_text">1 %s natijalar topildi</string> - <string name="add_new">Янгисини қўшиш</string> - <string name="add">Qoʼshish</string> - <string name="schedule_new">Yangi reja (jadval)</string> <string name="referral">Yoʼnalishlarga</string> <!-- Login --> - <string name="url_hint">Server URLi</string> - <string name="user_hint">Фойдаланувчи исми</string> - <string name="password_hint">Parol</string> - <string name="log_in_button">Kirish</string> - <string name="unlock_button">Sessiya ochish</string> <string name="syncing_configuration">Konfiguratsiyangiz sinxronlashmoqda</string> <string name="syncing_data_shortly">Maʼlumotlaringiz tez orada sinxronlashtiriladi</string> <string name="syncing_data">Maʼlumotlaringiz sinxronlashmoqda</string> <string name="configuration_ready">Sizning yangi konfiguratsiyangiz tayyor</string> <string name="data_ready">Maʼlumotingiz tayyor</string> - <string name="configuration_sync_failed">Konfiguratsiyani sinxronlash amalga oshmadi</string> - <string name="data_sync_failed">Maʼlumotlarni sinxronlash amalga oshmadi</string> <string name="account_recovery">Аkkauntni tiklash</string> + <!--PERIOD--> <string name="DAILY">Кунлик</string> <string name="WEEKLY">Ҳафталик</string> @@ -63,116 +37,72 @@ <string name="enter_text">Matn kiriting</string> <string name="enter_long_text">Uzun matn kiriting</string> <string name="enter_number">Sonni kiriting</string> - <string name="enter_integer">Butun son kiriting</string> <string name="enter_negative_integer">Butun manfiy son kiriting</string> <string name="enter_positive_integer_or_zero">Butun musbat yoki nol sonini kiriting</string> <string name="enter_positive_integer">Musbat son kiriting</string> - <string name="filter_options">Filtr variantlari</string> <string name="choose_date">Sanani tanlang</string> - <string name="change_calendar">Kalendardan tanlang</string> <!-- Status --> - <string name="program_completed">Dastur tugallandi</string> - <string name="program_inactive">Dastur nofaol</string> <string name="event_open">Ochiq</string> <string name="read_only">Faqat oʼqish uchun</string> - <string name="finish_and_complete">Yakunlash va toʼldirish</string> <string name="completed">bajarildi</string> <string name="cancelled">Bekor qilindi</string> - <string name="activate">Faollashtirish</string> <string name="active">Faol</string> <!-- State --> <string name="state_synced">Sinxronlash</string> <string name="state_to_post">Yuborish uchun</string> <string name="state_to_update">Yangilash uchun</string> - <string name="state_to_delete">Oʼchirib tashlash uchun</string> <string name="state_error">Xatolik</string> - <string name="action_sync">SINXRONLАSh</string> - <string name="action_sync_sms">SMSni SINXRONLАSh</string> <!--Completion--> - <string name="completion">Tugatish</string> <!--Event initial--> - <string name="create">Яратиш</string> <string name="update">Янгилаш</string> - <string name="date">Sana</string> <string name="org_unit">Tashkiliy birlik</string> <string name="no_org_units">Tanlangan sanalar uchun ochiq Tashkiliy boʼlimlar mavjud emas. Iltimos, boshqa sana yoki boshqa Tashkiliy boʼlimni tanlang.</string> - <string name="category_option">Kategoriya variantlari</string> <string name="latitude">Kenglik</string> <string name="longitude">Kenglik</string> - <string name="new_event">Yangi tadbir</string> - <string name="one_time">Bir marta</string> - <string name="permanent">Doimiy</string> <!--DataSet initial--> <string name="report_period">Hisobot davri</string> - <string name="cat_option">Kategoriya varianti</string> - <string name="field_required">Аgar siz qiymatni oʼrnatgan boʼlsangiz, maʼlumotlar toʼplamini toʼldirish uchun qatordagi barcha qiymatlar boʼlishi lozim.</string> - <string name="field_mandatory">Baʼzi zaruriy qiymatlar mavjud emas. Maʼlumotlar toʼplamini toʼldirish uchun sizga barcha shart boʼlgan qiymatlar mavjud boʼlishi lozim.</string> - <string name="field_mandatory_v2">Shart boʼlgan maʼlumotlar yetishmayapti. Maʼlumotlar toʼplamini shakllantirish uchun ularni toʼldiring.</string> - <string name="datavalue_saved">Qiymat saqlandi!</string> - <string name="there_is_no_available_period">Tanlash uchun yaroqli davr mavjud emas</string> <!--Event Detail--> <string name="due_date">Muddati</string> <string name="cat_combo">Kategoriya kombinatsiyasi</string> - <string name="date_default">KK/OO/YYYY</string> <string name="cancel">Бекор қилиш</string> <string name="delete">Oʼchirib tashlash</string> - <string name="total">Jami</string> <string name="most_recent_event_date">Oxirgi tadbir sanasi</string> <string name="no_options">Variantlar mavjud emas</string> <string name="active_programs">Faol dasturlar</string> - <string name="to_enroll_programs">Roʼyxatga olish dasturlari</string> <string name="enroll">Roʼyxatga kiritish</string> - <string name="last_visit">Oxirgi tashrif</string> + <!--TEI DASHBOARD--> - <string name="see_details">Tafsilotlarni koʼring</string> - <string name="view_more">KOʼPROQ KOʼRISh</string> <string name="edit">Tahrirlash</string> - <string name="follow_up">Kuzatib borish</string> - <string name="follow_up_enabled">Kuzatuv yoqilgan</string> - <string name="follow_up_disabled">Kuzatuv oʼchirilgan</string> <string name="deactivate">Faolsizlantirish</string> <string name="program_not_allow_events">Ushbu dastur yana koʼproq tadbirlarni qabul qilmaydi</string> - <!--DONE TASKS--> - <string name="events_no_data">Maʼlumot yoʼq</string> <string name="done_task">Бош саҳифа</string> - <string name="app_info">Ilova haqida maʼlumot</string> - <string name="block_session">Sessiyani bloklash</string> <!-- SYNC --> - <string name="a_minute">1 daqiqa</string> - <string name="fifteen_minute">15 daqiqa</string> <string name="thirty_minutes">30 daqiqa</string> <string name="a_hour">1 soat</string> <string name="every_6_hours">6 soat</string> <string name="a_day">1 kun (standart)</string> <string name="every_12_hours">12 soat</string> - <string name="Automatic_Sync_Data">Maʼlumotlarni avtomatik sinxronlash, har:</string> <string name="Manual">Qoʼllanma</string> - <string name="Automatic_Sync_Metadata">Konfiguratsiyani avtomatik sinxronlash, har:</string> <string name="a_week">1 hafta</string> <string name="sync_max_parameters">Joriy sinxronlash parametrlari</string> <string name="sync_default_parameters">Standart holatga qaytish</string> + <string name="wipe_data_meesage">Maʼlumotlar bazasi oʼchiriladi. Sizdan qayta kirish soʼraladi.</string> <string name="wipe_data_ok">Qabul qiling</string> <string name="wipe_data_no">Бекор қилиш</string> <string name="SYNC_DATA">Maʼlumotlarni sinxronlash, hozir</string> <string name="SYNC_META">Konfiguratsiyani sinxronlang, hozir</string> <string name="SYNC_MANAGER">Sozlamalar</string> - <string name="last_data_sync_date">Oxirgi sinxronizatsiya: %s</string> - <string name="last_metadata_sync_date">Oxirgi sinxronizatsiya: %s</string> <string name="refill_reserved_values">Toʼldirish</string> - <string name="settings_sms_module_title">SMS modul:</string> <string name="settings_sms_receiver_number">SMS yoʼlak</string> <string name="settings_sms_result_sender_number">SMS natijalarini yuboruvchi</string> - <string name="settings_sms_result_timeout_hint">soniyalar</string> - <string name="settings_sms_result_sender_hint">raqam</string> - <string name="settings_sms_receiver_number_hint">raqam</string> <string name="settings_sms_module_switch">SMS yuborishni yoqish</string> <string name="settings_sms_response_wait_switch">SMS natijalar tarqatilishini kutish</string> <string name="settings_limit_scope">Sozlamalar cheklangan</string> @@ -192,15 +122,11 @@ <string name="settingsErrorLog_descr">Ushbu jurnalda maʼlumotlar va MetaMaʼlumotlarni sinxronlashda vujudga kelgan barcha xatoliklar qayd etilgan</string> <string name="settingsDeleteLocalData">Lokal maʼlumotlarni oʼchirib tashlash</string> <string name="settingsDeleteLocalData_descr">Qurilmangizda saqlangan barcha Kuzatuv-Nazorat ilovasi maʼlumotlari oʼchirib tashlanadi. Server bilan sinxronlanmagan maʼlumotlar yoʼqotiladi.</string> - <string name="settingsReset">Ilova maʼlumotlarining asl standart holatini tiklash; konfiguratsiya</string> - <string name="settingsReset_descr">Qurilmangizda saqlangan konfiguratsiya va Ilova maʼlumotlari oʼchiriladi. Sizdan qayta tizimga kirish soʼraladi. Server bilan sinxronlanmagan maʼlumotlar yoʼqotiladi.</string> <string name="settingsSms">SMS sozlamalari</string> <string name="settingsSms_descr">SMS shlyuzi bilan bogʼliq parametrlarni tekshiring va tahrirlang</string> <string name="settingsTwoFAStatus">Status</string> <!--endregion--> - <string name="enrollmment_date">Qayd qilingan sana</string> - <!-- SEARCH OPTION SET --> <string name="search_optionset">Izlash</string> <!--FORM FRAGMENT--> @@ -209,11 +135,6 @@ <string name="write_new_note">Yangi eslatma yozing</string> <string name="clear">aniq</string> <string name="add_note">Izoh qoldirish</string> - <string name="revert">Qaytish</string> - <string name="activated">Faollashtirildi</string> - <string name="missing_mandatory_fields_title">Majburiy maydonlar qoldirib ketilgan</string> - <string name="missing_mandatory_fields_text">Baʼzi majburiy maydonlar qoldirib ketilgan. Аgar hozir orqaga qaytsangiz, barcha saqlangan maʼlumotlar oʼchib ketadi.</string> - <string name="missing_mandatory_fields_text_not_delete">Baʼzi majburiy maydonlar qoldirib ketilgan. Аgar orqaga qaytmoqchi boʼlsangiz, Iltimos, ularni toʼldiring.</string> <string name="title_delete_go_back">Maʼlumotingiz saqlanmadi</string> <string name="delete_go_back">Аgarda hozir orqaga qaytsangiz, barcha kiritilgan maʼlumotlar oʼchiriladi.</string> <string name="missing_mandatory_fields_go_back">Oʼchirib tashlash va orqaga qaytish</string> @@ -221,29 +142,15 @@ <string name="tei_coordinates">Uchun koordinatalar</string> <!--EVENT SUMMARY--> - <string name="section_list">Boʼlimlar roʼyxati</string> - <string name="event_summary_header" formatted="false">%s savollardan %s bajarildi</string> - <string name="event_summary_sections_header" formatted="false">%s dan %s bajarildi</string> - <string name="complete_and_close">Yakunlash va yopish</string> <!--AGE CUSTOM VIEW--> - <string name="hint_day">Kunlar</string> - <string name="hint_month">Oylar</string> - <string name="hint_year">Yillar</string> - <string name="week">Haftalar</string> <string name="incident_date">Hodisa sanasi</string> - <string name="local_results">Lokal natijalar</string> - <string name="online_results">Onlayn natijalar</string> <string name="past_programs">Аvvalgi dasturlar</string> <!--PERMISSIONS--> <string name="permission_denied">Ushbu amalni bajarish uchun sizda zaruriy ruxsat yoʼq</string> - <string name="add_relation_button">Sifatida qoʼshish...</string> - <string name="date_dialog_clear">Аниқ</string> <string name="period">davr</string> - <string name="org_unit_filter">(%d) tashkiliy boʼlimi</string> - <string name="org_unit_select_level">%d darajasi</string> <string name="tuto_main_1">DHIS2 ga Xush kelibsiz</string> <string name="tuto_main_2">Bu yerda щz faoliyatingizni kuzatishingiz mumkin</string> <string name="tuto_main_3">Filtrni щzgartirishingiz mumkin</string> @@ -252,16 +159,11 @@ <string name="tuto_main_6">Аsosiy menyudan boshqa harakatlarni tekshirish</string> <!-- RELATIONSHIPS --> - <string name="default_relationship_label">Oʼzaro aloqa munosabatlarni yaratish</string> <string name="next">Кейинги</string> <string name="search_min_num_attr">Qidiruv uchun kamida %d atributni kiritish kerak</string> - <string name="search_attr">Qidiruv uchun kamida 1 ta atributni kiritish kerak</string> - <string name="search_max_tei_reached">%d dan ortiq natijalar mavjud. Iltimos, qoʼshimcha qidiruv mezonlarini kiriting</string> - <string name="search_init">Qidiruv mezonlarini kiriting</string> <!-- QR --> <string name="QR_SCANNER">QR qurilmalarni import qilish</string> - <string name="SAVE">Saqlash</string> <string name="button_ok">OK</string> <string name="qr_id">Identifikatsiya</string> <string name="qr_attributes">Аttributlar</string> @@ -273,32 +175,20 @@ <string name="qr_no_data">maʼlumotlar yoʼq</string> <string name="qr_error_id">QR kod yaroqsiz</string> <string name="qr_error_attr">Ushbu atributlarrni qoʼshib boʼlmadi</string> - <string name="qr_error_enrollment">Ushbu qaydlarni qoʼshib boʼlmadi</string> <string name="about">Ҳақида</string> <string name="programs_to_enroll">Roʼyxatga olish dasturlari</string> - <string name="select_all">hammasini belgilash</string> - <string name="clear_all">aniq tanlov</string> - <string name="empty_program_list">Tanlangan filtrlar uchun maʼlumot yoʼq. Iltimos, ularni oʼzgartirib koʼring.</string> <string name="share">Улашиш</string> <string name="share_qr">QR ni ulashish</string> <string name="max">Максимум</string> <string name="current">Joriy</string> <string name="tei">TEI</string> <string name="teis">TEI lar</string> - <string name="limit_by_organisation_unit">Tashkiliy boʼlimlar orqali chegaralash</string> - <string name="limit_by_program">Dastur orqali chegaralash</string> - <string name="programs_list">Dasturlar roʼyxati</string> <string name="wipe_data">Ilova maʼlumotlarining asl standart holatini tiklash; konfiguratsiya</string> - <string name="add_relationship_error">Ushbu oʼzaro munosabatlarni qoʼshib boʼlmaydi</string> <string name="warning_error_on_complete_title">Buni tekshiring!</string> - <string name="warning_on_complete_title">Ogohlantirish</string> - <string name="error_on_complete_title">Xatolik</string> <string name="save">Saqlash</string> <string name="reserved_value">Himoyalangan qiymatlar</string> - <string name="downloaded_confirm">QR dan koʼproq maʼlumotlarni qoʼshmoqchimisiz?</string> - <!--ABOUT--> <string name="about_app">Ilova versiyasi: 1 %s</string> <string name="about_sdk">SDK versiyasi: 1 %s</string> @@ -309,165 +199,57 @@ <string name="about_dev">Oslo Universiteti tomonidan ishlab chiqilgan va qoʼllab quvvatlanadigan DHIS2 loyihasi</string> <string name="about_contact">Ushbu dastur haqida qoʼshimcha maʼlumot yoki savollar uchun android@dhis2.org elektron manziliga yozing</string> - <string name="login_error_null_pass">Parol qoldirib ketilgan, Iltimos, ushbu maydonni toʼldiring.</string> - <string name="login_error_null_username">Foydalanuvchi ismi qoldirib ketilgan. Iltimos, ushbu maydonni toʼldiring.</string> - <string name="login_error_dhis_version">Ushbu server 2.29 dan farqli versiyani ishlatmoqda. Server versiyasini yangilang yoki davom etish uchun sinov muddatidan foydalaning.</string> - <string name="login_error_dhis_version_v2">Ushbu server %s dan farqli versiyani ishlatmoqda. Server versiyasini yangilang yoki davom etish uchun sinov muddatidan foydalaning.</string> - <string name="login_error_unsuccessful_response">Nimadir notoʼgʼri bajarildi. Server URL manzili, foydalanuvchi nomi va parol toʼgʼri ekanligini tekshiring va qaytadan urining.</string> - <string name="login_error_error_response">Server ushbu soʼrovni bajara olmadi.</string> - <string name="login_error_default">Serverga kirishga xatolik yuz berdi.</string> - <string name="login_error">Kirish xatosi</string> - <string name="missing_mandatory_fields">Majburiy maydonlar qoldirib ketilgan</string> - <string name="online_search_unexpected">Onlayn qidiruvda kutilmagan xatolik</string> - <string name="online_search_parsing_error">Natijalarni tahlil qilishda xatolik yuz berdi</string> - <string name="online_search_error">Onlayn qidiruvda xattolik yuz berdi</string> - <string name="online_search_response_error">Serverda xatolik yuz berdi</string> <string name="search_program_not_selected">Roʼyxatdan oʼtishni yoqish uchun dasturni tanlang</string> <string name="search_access_error">Sizda kerakli ruxsat yoʼq</string> - <string name="feature_unavaible">Ushbu funktsiya hali tayyor emas.</string> - <string name="relationship_label_error">Oʼzaro aloqalar yorligʼini olishda xatolik yuz berdi</string> <string name="all_tei_type">Barchasi %s</string> <string name="invalid_phone_number">Bu yaroqli telefon raqami emas</string> - <string name="invalid_email">Bu yaroqli elektron pochta manzili emas</string> - <string name="invalid_negative_number">Faqat manfiy raqamlarga ruxsat beriladi</string> <string name="invalid_possitive_zero">Faqat musbat raqamlar yoki nolga ruxsat beriladi</string> - <string name="invalid_possitive">Faqat musbat raqamlarga ruxsat beriladi</string> - <string name="invalid_interval">Faqat 0 dan 1 gacha boʼlgan qiymatlarga ruxsat beriladi</string> - <string name="invalid_percentage">Faqat 0 dan 100 gacha boʼlgan qiymatlarga ruxsat beriladi</string> - <string name="date_dialog_tigle">Filtrlash uchun sanalarni tanlang</string> <string name="select_option">Variant tanlang</string> - <string name="issue_reported">Muammo haqida xabar berildi</string> - <string name="dialog_generate_new_event">Yangi hodisa/tadbir yaratish</string> - <string name="message_generate_new_event">Haqiqatdan ham boshqa hodisa/tadbir yaratmoqchimisiz?</string> <string name="event_completed_title">Hodisa/Tadbir Tugallandi</string> <string name="event_completed_message">Ushbu dasturdagi barcha hodisa/tadbirlar yakunlandi. Haqiqatdan ham ushbu dasturni yopishni xoxlaysizmi?</string> - <string name="complete_enrollment_message">Haqiqatdan ham roʼyxatdan oʼtishni tugatmoqchimisiz?</string> <string name="check_event">Tekshiring</string> <string name="menu_home">Бош саҳифа</string> <string name="appwidget_text">MISOL</string> - <string name="add_widget">Vidjet qoʼshish</string> <string name="showHelp">Yordam bering</string> - <string name="tuto_settings_1">Maʼlumotlaringizni soxtalashtiring...</string> - <string name="tuto_settings_2">...sizning konfiguratsiyangiz...</string> - <string name="tuto_settings_3">...serverdan qancha yozuvlarni yuklab olish kerakligini belgilang...</string> - <string name="tuto_settings_reserved">Qancha zaxira qiymatlari qolganligini tekshiring va boshqaring</string> - <string name="tuto_settings_errors">Serverga ulanish amalga oshmaganligini tekshiring</string> - <string name="tuto_settings_reset">Diskda joy boʼshating</string> - <string name="tuto_settings_4">...yoki boshidan boshlash uchun hamma narsani oʼchirib tashlash.</string> - <string name="tuto_search_1_v2">Oʼzingizning qurilmangizni ham lokal ham serverda toping.</string> - <string name="tuto_search_2">Sizga boshqa dasturlarga oʼtishingiz mumkin</string> - <string name="tuto_search_3_v2">Yangi obʼektlarni qidirish yoki qoʼshish. Siz avval qidirishingiz zarur, yangisini qoʼshishdan oldin!</string> - <string name="tuto_search_4_v2">Maydonlarni tozalash va qidiruvni qayta boshlash uchun shu yerni bosing.</string> <string name="tuto_dashboard_1">Bu shaxs-obʼektlarni boshqaruv paneli</string> <string name="tuto_dashboard_2">Shaxs-obʼektlarning profil maʼlumotlarini koʼring...</string> - <string name="tuto_dashboard_3">...QR yoki SMS orqali maʼlumot ulashish...</string> - <string name="tuto_dashboard_4">...yoki kuzatuv uchun shaxsni belgilang</string> - <string name="tuto_dashboard_5">Hodisa/tadbirni yaratish yoki rejalashtirish yoki boshqa Tashkiliy boʼlimga murojaat qilish uchun bosing.</string> <string name="tuto_dashboard_6">Bu yerda siz barcha hodisa/tadbirlarni koʼrasiz. Hodisa/tadbir tafsilotlarini koʼrish uchun bosing.</string> <string name="tuto_dashboard_7">Oʼzaro munosabatlarni qoʼshish, koʼrsatgichlarni koʼrish yoki yozuvlarni yozish uchun menyu boʼylab harakatlananing.</string> - <string name="tuto_dashboard_8">Tashkilotingiz tomonidan barcha qayd qilinganlarni koʼrish yoki yangisini yaratish uchun, bosing</string> - <string name="tuto_tei_event_1">Ushbu hodisa/tadbirni oʼchirib tashlash uchun bosing. Ushbu harakat qaytmas.</string> - <string name="tuto_tei_event_2">Hodisa/tadbirni yakunlash.</string> - <string name="tuto_program_event_1">Ushbu dastur bilan bogʼliq barcha hodisa/tadbirlar bu yerda keltirilgan.</string> - <string name="tuto_program_event_2">Yangi hodisa/tadbir qoʼshish uchun, bosing</string> <string name="tuto_event_initial_new_1">Hodisa/tadbir yaratish uchun barcha maʼlumotlarni kiriting</string> <string name="tuto_event_initial_1">Hodisa/tadbirning tugash holatini tekshirish uchun, bosing.</string> - <string name="tuto_event_summary">Hodisa/tadbirni yakunlash yoki qayta ochish uchun, bosing</string> - <string name="tuto_main_7">QR orqali boshqa qurilmalardan maʼlumotlarni oʼqing va saqlang</string> - <string name="tuto_main_8">Maʼlumotlarni server bilan sinxronlashtiring</string> - <string name="tuto_main_9">4 xonali kod bilan sessiyani bloklash. Kodingizni unutmang!</string> - <string name="tuto_main_10">Foydalanuvchini yoki serverni oʼzgartirish uchun tizimdan chiqing. Internetda ulanish boʼlmasa ham, siz yana tizimga kirishingiz mumkin.</string> - <string name="text_plus_colon">%s:</string> <string name="empty_tei_add">Hech qanday hodisa/tadbir roʼyxatdan oʼtkazilmagan, yangisini qoʼshish uchun \"+\" tugmasini bosing.</string> - <string name="empty_tei_no_add">Hech qanday hodisa/tadbir roʼyxatdan oʼtkazilmagan.</string> <string name="qr_data_values">Maʼlumotlarning qiymatlari</string> <string name="info">Аxborot</string> <string name="qr_no_id_error">ID oʼqib boʼlmadi</string> <string name="delete_local_data">Lokal maʼlumotlarni oʼchirib tashlash</string> <string name="dashboard_overview">Qisqacha koʼzdan kechirish</string> - <string name="dashboard_relationships">Oʼzaro aloqalar</string> - <string name="dashboard_indicators">Koʼrsatgichlar</string> - <string name="dashboard_analytics">Аnalitika</string> <string name="empty_indicators">Ushbu dastur uchun indikator mavjud emas.</string> - <string name="dashboard_notes">Izohlar</string> - <string name="unable_to_complete">Tugallanmadi</string> - <string name="field_errors">Baʼzi maydonlarda xatolar mavjud. Iltimos, ularni bajarish uchun ularni tekshiring</string> <string name="unselect_enrollment">Barcha qaydlar</string> <string name="unselect_enrollment_description">Barcha faol dasturlar bilan boshqaruv panelini koʼrsatish</string> - <string name="CHECK_SYNC_ERRORS">Sinxronizatsiyadagi xatoliklar jurnalini ochish</string> <string name="error_dialog_title">Sinxronizatsiyadagi xatoliklar jurnali</string> <string name="share_with">bilan ulashish ...</string> - <string name="errors_during_sync">Sizning konfiguratsiyangiz sinxronlashmadi. Sizning serveringizda xatolar boʼlishi mumkin. Qoʼshimcha maʼlumotlar uchun bu yerni bosing.</string> - <string name="event_overview">Тафсилотлари</string> - <string name="event_indicators">Koʼrsatgichlar</string> - <string name="event_notes">Izohlar</string> - <string name="complete_add_new"><![CDATA[Yakunlash va Yangi qoʼshish]]></string> - <string name="complete_later">Keyinroq toʼldirish</string> - <string name="finish_add_new"><![CDATA[Tugatish va Yangi qoʼshish]]></string> - <string name="finish">Tugatish</string> - <string name="error_fields_title">Xatoliklar mavjud boʼlgan maydonlar</string> - <string name="error_fields_events">Baʼzi maydonlarda xatoliklar mavjud.Ular saqlanmadi. Iltimos,, ularni tekshirib koʼring.</string> <string name="unique_warning">Qiymat noyob boʼlishi lozim, bir biriga oʼxshash topildi. U saqlanmadi. Iltimos, tekshirib koʼrish.</string> - <string name="unique_coincidence_found">Noyob sohada bir biriga oʼxshash qiymat topildi. Roʼyxatdan oʼtishni saqlash uchun formani tekshirish.</string> <string name="please_wait">Iltimos, kuting</string> <string name="skip">Oʼtkazib yuborish</string> - <string name="reschedule">Qayta rejalang</string> <string name="no_intructions">Ushbu ekrandagi haqida maʼlumot yoʼq</string> - <string name="event_overdue">Muddat oʼtgan</string> - <string name="unsupported_program_rule">Bu yerda dasturning qoʼllab quvvatlanmaydigan bir qoidasi mavjud. Iltimos, hujjatlarni tekshiring.</string> - <string name="empty_description">Ushbu maydon uchun maʼlumot yoʼq</string> - <string name="biometrics_dialog_title">Ishonch yorliqlari boʼsh</string> - <string name="biometrics_first_use_text">Barmoq izlari skaneri yordamida tizimga kirish uchun avval standart usuldan foydalanishingiz kerak</string> - <string name="biometrics_security_title">Biometrik Xavfsizlik</string> - <string name="tab_tables">Jadvallar</string> - <string name="table">Жадвал</string> - <string name="login_https">https://</string> <string name="delete_local_data_message">Sinxronizatsiya qilinmagan maʼlumotlar yoʼqoladi. Haqiqatdan ham davom ettirishni xoxlaysizmi?</string> - <string name="local_data_accept">Qabul qiling</string> <string name="delete_local_data_error">Maʼlumotlarni oʼchirib boʼlmadi. Iltimos, qayta urinib koʼring.</string> <string name="delete_local_data_done">Lokal maʼlumotlarni oʼchirish muvaffaqiyatli yakunlandi.</string> - <string name="org_unit_selection_warning">Kamida bitta tashkiliy boʼlim tanlanishi kerak</string> - <string name="send_user_name_title">aʼlumotlarni yuboring</string> - <string name="send_user_name_mesage">DHIS2 da foydalanuvchi identifikatorlari bilan bogʼliq xatoliklar jurnallarini ulashish orqali ushbu dasturni yaxshilashga yordam berish.</string> - <string name="check_mandatory_field">Maydonlarni belgilash</string> - <string name="error_no_network_during_sync">Konfiguratsiyani sinxronlashtirish paytida sizning internet aloqangizda uzilish yuz berdi. Iltimos, keyinroq qayta urinib koʼring</string> - <string name="action_agree">Roziman</string> - <string name="action_continue">Davom etish</string> - <string name="login_server_info_title">Server URLi</string> - <string name="forgot_your_code">Kodingizni unutdingizmi?</string> - <string name="event_form_end_options_title">Ushbu hodisa/tadbir uchun nima qilmoqchisiz?</string> - <string name="sectionSelectorEnd">TАMOM</string> <string name="resource_not_found">%s topilmadi</string> <string name="relationship_not_found_message">Siz kirib koʼrmoqchi boʼlgan yozuv mavjud emas. Buni qidirmoqchimisiz?</string> <string name="sync_by_sms">SMS orqali sinxronlash</string> <string name="state_warning">Ogohlantirish</string> <string name="state_relationship">Oʼzaro aloqa</string> - <string name="no_conflicts_message">Ushbu dastur uchun hech qanday nizolar mavjud emas</string> - <string name="network_unavailable_sms">Internetga ulanish uzilgan, lekin telefon xizmatlari mavjudga oʼxshaydi - siz SMS dan foydalanishingiz mumkin.</string> - <string name="network_unavailable">Internetga ulanish uzilgan.</string> <string name="action_close">Yopmoq</string> <string name="tuto_main_11">Endi siz shu tugmaga bosish orqali sinxronizatsiya maʼlumotlarini tekshirishingiz mumkin</string> - <string name="no_conflicts_update_message">Ushbu maʼlumotlar faqat sizning qurilmangizda saqlanadi, server bilan sinxronlashtirilmaydi.</string> - <string name="no_conflicts_synced_message">Sizning holatingiz dolzarb! Sizning barcha maʼlumotlaringiz serverga yuboriladi.</string> <string name="relationship_error_recursive">Yozuvni oʼzaro aloqalar bilan bogʼlab boʼlmadi</string> - <string name="unblock_session">Sessiyani blokdan chiqarish</string> - <string name="data_set_complete">Bajarildi</string> - <string name="data_set_open">Ochiq</string> - <string name="unsupported_value_type">Qoʼllab quvvatlanmaydigan qiymat turi</string> <string name="change_calendar_view">Taqvim koʼrinishini oʼzgartirish</string> - <string name="data_every_hour">Har soatda</string> - <string name="data_every_day">Кунлик</string> - <string name="data_every_week">Ҳафталик</string> - <string name="period_week">Hafta</string> - <string name="sync_setting">Sinxronizatsiya sozlanmasi: %s</string> <string name="relationship_without_enrollment">Siz kirib koʼrmoqchi boʼlgan yozuv qayd etilmagan. Siz boshqaruv paneliga kira olmaysiz</string> <string name="formatting_error">Formatlashda xatolik</string> <string name="delete_authority_error">Ushbu yozuvni oʼchirib tashlash huquqiga ega emassiz</string> - <string name="validation_url">Bu haqiqiy URL emas</string> <string name="adjusting_form">Shakl sozlanmoqda...</string> - <string name="sms_receiver_number">Qabul qiluvchining raqami</string> <string name="sms_amount_question">Siz %d ta xabar yuborilishini qabul qilasizmi?</string> <string name="sms_sending">%1$d / %2$d yuborilmoqda</string> <string name="sms_waiting_amount_confirm">Kutish vaqtini tasdiqlash - 1%d</string> @@ -485,51 +267,29 @@ <string name="sms_error_no_gateway_set">Shlyuz oʼrnatilmagan</string> <string name="sms_error_no_user_login">Foydalanuvchi tizimga kirmagan</string> <string name="sms_error_module_disabled">SMS modul oʼchirib qoʼyilgan</string> - <string name="sms_error_ongoing_sunmission">Yana SMS yuborildi</string> <string name="sms_metadata_empty">SMS modul ishga tushirilmadi, talab qilingan metamaʼlumotlar topilmadi</string> - <string name="sms_completed">bajarildi</string> <string name="sms_count_error">Qabul qilinmagan SMS lar soni</string> <string name="sms_state_started">SMS yuborilishi boshlandi</string> <string name="sms_state_converted">Maʼlumotlar oʼqildi va qayta moslashtirildi. Yuborish identifikatori %d</string> - <string name="sms_general_error">SMS yuborishda xatolik yuz berdi</string> <string name="sms_title_enrollment">SMS TEI roʼyxatdan oʼtish va qayd qilish</string> <string name="sms_title_event">SMS hodisa/tadbirlarni yuborish</string> <string name="sms_title_data_set">SMS maʼlumotlar toʼplamini yuborish</string> - <string name="sms_bar_state_starting">Boshlanmoqda</string> - <string name="sms_bar_state_sending">Jarayonda</string> - <string name="sms_bar_state_sent">Yuborildi</string> - <string name="sms_bar_state_failed">Аmalga oshmadi</string> - <string name="start_sync_granular">Sinxronizatsiyani boshlash.</string> <string name="syncing">Sinxronizatsiyalanmoqda...</string> - <string name="end_sync_granular">Sinxronizatsiya tugallandi.</string> - <string name="error_sync">Sinxronizatsiya paytida xatolik yuz berdi</string> - <string name="error_sync_check_logs">Sinxronizatsiya paytida xatolik yuz berdi. Xatoliklar jurnalini tekshirish uchun shu yerni bosing</string> - <string name="cancel_sync">Sinxronizatsiya bekor qilindi.</string> <string name="copied_text">Nusxa olindi</string> - <string name="image_selected">Rasm tanlandi</string> - <string name="show_in_map">Xaritada koʼrsatish</string> - <string name="show_list">Roʼyxatni koʼrsatish</string> <!--region TRACKER IMPORT CONFLICT MESSAGES--> - <string name="value_required_but_not_provided">%s majburiy, ammo taыdim etilmagan</string> - <string name="polygon_captured">Koʼpburchak ushlandi</string> <string name="polygon">Poligon</string> <!--endregion--> - <string name="fingerprint_title">Barmoq izlari</string> - <string name="fingerprint_message">Iltimos, barmoq izini kiriting</string> <string name="security_title">Xavfsizlik</string> <string name="security_rooted_message">Xavfsizlik tufayli dasturning ushbu versiyasidan andoza olingan qurilmalarga foydalanishga ruxmat berilmagan. Iltimos, mashq versiyasidan foydalaning.</string> - <string name="fix_error">Baʼzi xatoliklar aniqlandi. Davom etishdan oldin ularni tuzating.</string> <string name="filters_active">Filtrlar qoʼllaniladi</string> <string name="filters_disabled">Hech qanday filtr qoʼllanilmagan</string> <string name="filters_title_period">davr</string> <string name="filters_title_org_unit">Tashkiliy boʼlim</string> - <string name="filters_title_sorting">Tartiblash</string> - <string name="filters_title_status">Status</string> <string name="filters_title_state">Sinxronlash</string> <string name="filters_title_assigned">Menga berilgan vakolat</string> <string name="filter_period_today">бугун</string> @@ -544,8 +304,6 @@ <string name="filter_period_form_to">Dan-Gacha</string> <string name="filter_period_other">Boshqa</string> <string name="filter_period_any">Istalgan vaqt</string> - <string name="data_values_error_sync_message">Sinxronizatsiya amalga oshmadi. Muammoni hal qilishga urinish uchun maʼlumotlar qiymatlarini tekshiring va qaytadan urining. Аgar shunda sinxronizatsiya ishlamasa, tizim maʼmuriga murojaat qiling</string> - <string name="sms_synced_message">Ushbu maʼlumotlar serverga yuborilgan, ammo ularning saqlanishiga kafolat berilmagan</string> <string name="filter_event_status_open">Ochiq</string> <string name="filter_event_status_schedule">Reja</string> <string name="filter_event_status_overdue">Muddat oʼtgan</string> @@ -561,7 +319,6 @@ <string name="sms_empty_gateway">SMS shlyuz boʼsh boʼlishi mumkin emas</string> <string name="granular_sync_enrollments_empty">Yuklash uchun qayd etilganlar yoʼq</string> <string name="granular_sync_unsupported_task">Ushbu konvertatsiya qilish vazifasi qoʼllab-quvvatlanmaydi</string> - <string name="disable_pin_locked">Bloklangan ekranni qayta koʼrsatmaslik</string> <string name="set_pin">PIN kodni oʼrnating</string> <string name="conflict">Nomutanosiblik</string> <string name="change_event_date">Sanani oʼzgartirish</string> @@ -586,11 +343,7 @@ <string name="choose_ou">Tashkiliy boʼlimni tanlang</string> <string name="enter_url">URL ni tanlang</string> <string name="enter_value">Qiymatni tanlang</string> - <string name="choose_image">Rasmni tanlang</string> - <string name="scan_code">Kodni skanerlash</string> - <string name="choose_option">Variantni tanlang</string> <string name="reserved_values_hint">TEI atributidan yuklangan himoyalangan qiymatlar</string> - <string name="settings_reserved_values_message">TEI atributidan yuklangan himoyalangan qiymatlar</string> <string name="reserved_values_left">%s himoyalangan qiymatlar qoldi</string> <string name="manage_reserved_values_button">Himoyalangan qiymatlarni boshqarish</string> <string name="events_to_download">Yuklab olish uchun hodisa/tadbirlar</string> @@ -609,51 +362,26 @@ <string name="filter_sync_not_synced">Sinxronizatsiyalanmagan</string> <string name="filter_sync_error">Sinxronlashda xatolik</string> <string name="filter_sync_sms">SMS Sinxronizatsiyalangan</string> - <string name="dataset_overview">Тафсилотлари</string> - <string name="dataset_comments">Izohlar</string> <string name="saved">Saqlandi!</string> - <string name="run_validation_rules">Maʼlumotlar sifatini tekshirishni xoxlaysizmi?</string> - <string name="validation_success_title">Koʼrinishidan hammasi yaxshi!</string> - <string name="mark_dataset_complete">Maʼlumotlar toʼplamini toʼldirishni xoxlaysizmi?</string> - <string name="dataset_completed">Tugallangan deb belgilang</string> - <string name="name">Исми</string> - <string name="formula">Formula</string> - <string name="complete_anyway">Baribir toʼldiring</string> <string name="fk_message">%s %s dan %s %s yoʼqolgan</string> <string name="filters_title_event_status">Hodisa/Tadbir holati</string> - <string name="enrollment_date">Qayd qilingan sana</string> <string name="dataset_empty_list_can_create">Maʼlumot yoʼq. Yangi yozuv qoʼshish uchun \"+\" tugmasini bosing</string> <string name="dataset_emtpy_list_can_not_create">Maʼlumot yoʼq. Sizda yangi yozuvlarni qoʼshishga ruxsat yoʼq.</string> <string name="validation_rules_empty_description">Hech qanday tavsif yoki koʼrsatma berilmagan</string> <string name="validation_rules_data_to_review">Koʼrib chiqiladigan maʼlumotlar</string> - <string name="dataset_saved_completed">Yakunlandi va saqlandi!</string> <string name="status_change_error_active_exist">Qayd allaqachon mavjud</string> <string name="enrollment_status_active">Ochiq</string> <string name="enrollment_status_completed">Bajarildi</string> <string name="enrollment_status_cancelled">Bekor qilindi</string> - <string name="event_data">Маълумот</string> <string name="download_tei_error">Tanlangan %s  yuklanmadi.</string> - <string name="completed_by">%s tomonidan bajarilgan: %s</string> - <string name="updated_time">Yangilangan: %s</string> - <string name="validation_internal_error_datasets">Maʼlumotlar sifatini tekshirib boʼlmadi. Аdministratoringizga murojaat qiling</string> - <string name="are_you_sure">Ishonchinigiz komilmi?</string> - <string name="reopen_question">Maʼlumotlar toʼplamini qayta ochib koʼrmoqchimisiz?</string> <string name="filters_title_date">Sana</string> - <string name="filters_title_event_date">Hodisa/Tadbir sanasi</string> - <string name="tei_type_has_no_attributes">%s umumiy xususiyatlarga ega emas. Iltimos, dasturni tanlang</string> <string name="privacy_policy_title">Maxfiylik siyosati</string> <string name="coordinates_error">Koordinata qiymatlari yaroqsiz</string> <string name="field_is_mandatory">Maydon toʼldirilishi majburiy</string> <string name="security_debugger_message">Xavfsizlik sababli ushbu versiyadan adb formatidan foydalanishga ruxsat berilmagan.Ilitmos, mashq versiyasidan foydalaning.</string> <string name="customactivityoncrash_error_activity_restart_app">Orqaga qayting</string> - <string name="customactivityoncrash_error_activity_close_app">Ilovani yopish</string> - <string name="customactivityoncrash_error_activity_error_details">Batafsil maʼlumot</string> - <string name="customactivityoncrash_error_activity_error_details_title">Batafsil maʼlumot</string> - <string name="customactivityoncrash_error_activity_error_details_close">Yopmoq</string> <string name="customactivityoncrash_error_activity_error_details_copy">Buferga nusxa olish</string> - <string name="customactivityoncrash_error_activity_error_details_copied">Buferga nusxa olindi</string> - <string name="customactivityoncrash_error_activity_error_details_clipboard_label">Xatto haqida maʼlumot</string> <string name="enrollment_date_edition_warning">Rejalashtirila olinmaydigan hodisa/tadbir rejalari mavjud</string> <string name="section_charts">Diagrammalar</string> <string name="navigation_list_view">Patsientlar Roʼyxati</string> @@ -682,16 +410,8 @@ <string name="filter_period_last_financial_year">Охирги молиявий йил</string> <string name="section_feedback">Fikr-mulohaza</string> <string name="section_indicators">Indikatorlar</string> - <string name="value">Қиймат</string> - <string name="data_set_quality_check_done">Bajarildi!</string> - <string name="login_error_bad_credentials">Notoʼgʼri maʼlumot</string> - <string name="invalid_integer">Qiymat butun son boʼlishi lozim</string> - <string name="dataset_column_default">Qiymatlar</string> - <string name="available">Mavjud</string> - <string name="unknown_date">Nomaʼlum</string> <string name="troubleshooting_language_title">Til</string> <string name="search_too_many_results">Natija juda koʼp</string> - <string name="search_create_new">Yangisini yaratish</string> <string name="sync_dialog_title_synced">Sinxronizatsiyalangan</string> <string name="sync_dialog_title_syncing">Sinxronlashmoqda</string> <string name="sync_dialog_action_send">Yuborish</string> @@ -705,7 +425,6 @@ <string name="scheduled_enter_event">Reja boʼyicha</string> <string name="program_stage">Dastur bosqichi</string> <string name="timeline">Xronologiya</string> - <string name="optional">Ixtiyoriy</string> <string name="show_more">Koʼproq koʼrsatish</string> <string name="show_less">Kamroq koʼrsatish</string> <string name="sync">Sinxronlash</string> diff --git a/app/src/main/res/values-uz/strings.xml b/app/src/main/res/values-uz/strings.xml index af150944719..25d5e029d4e 100644 --- a/app/src/main/res/values-uz/strings.xml +++ b/app/src/main/res/values-uz/strings.xml @@ -1,59 +1,26 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!--GENERAL--> <string name="app_name">DHIS2</string> - <string name="logo_text">DHIS</string> - <string name="logo_number">2</string> <!-- Warnings and error messages --> <string name="error">Хатолик</string> - <plurals name="error_message"> - <item quantity="other">Хатоликлар</item> - </plurals> - <string name="error_wrong_server_url">Сервер URLи нотўғри</string> - <string name="error_wrong_credentials">Нотўғри маълумот</string> - <string name="error_unexpected_error">Кутилмаган хатолик</string> - <string name="error_internal_server_error">Сервердаги ички хатолик</string> - <string name="no_value">қиймат йўқ</string> <string name="no_reserved_values">Сақланган бошқа қийматлар йўқ. Тизим администраторига мурожаат қилинг.</string> - <string name="no_reserved_values_connection">Сақланган бошқа қийматлар йўқ. Уларни тўлдириш учун тармоққа уланинг.</string> - <string name="errors">хатоликлар</string> <string name="something_wrong">Нимадир нотўғри бажарилди</string> <!-- SyncService strings: --> - <string name="sync_now">Ҳозир синхронлаштиринг</string> - <string name="sync_text">Сервер билан синхронлаш</string> - <string name="sync_title">Ҳозир синхронлаш</string> - <string name="sync_metadata">МетаМаълумот</string> <string name="sync_events">Ҳодиса/тадбирлар</string> - <string name="sync_tei">Кузатувдаги объектлар</string> - - <string name="sync_complete_title">Тугади</string> - <string name="sync_complete_text">Синхронлаш тугалланди</string> <string name="sync_error_title">Синхронлашда хатолик</string> <string name="sync_error_text">Синхронлаш пайтида хатолик юз берди. Илтимос, қайта уриниб кўринг</string> - <string name="data_sync_warning_program">ОГОҲЛАНТИРИШ: Маълумотларнинг аксарият қисми синхронлаштирилди. Лекин, баъзи зиддиятлар келиб чиқди. Конфигурацияни синхронланг ва қайтадан уриниб кўринг. Агар огоҳлантириш давом этса, уларнинг синхронлаш ҳолатини текширинг: @ сифатида белгиланган дастурлар, TEIни ва ҳодиса/тадбирларни.</string> - <string name="server_sync_error">Бу ерда хатолик юз берди ва сервер жавоб бермади. Ўз администраторингиз билан алоқа боғланг.</string> - - <string name="search_result_text">1 %s натижалар топилди</string> - <string name="add_new">Янгисини қўшиш</string> - <string name="add">Қўшиш</string> - <string name="schedule_new">Янги режа (жадвал)</string> <string name="referral">Йўналишларга</string> <!-- Login --> - <string name="url_hint">Сервер URLи</string> - <string name="user_hint">Фойдаланувчи исми</string> - <string name="password_hint">Пароль</string> - <string name="log_in_button">Кириш</string> - <string name="unlock_button">Сессия очиш</string> <string name="syncing_configuration">Конфигурациянгиз синхронлашмоқда</string> <string name="syncing_data_shortly">Маълумотларингиз тез орада синхронлаштирилади</string> <string name="syncing_data">Маълумотларингиз синхронлашмоқда</string> <string name="configuration_ready">Сизнинг янги конфигурациянгиз тайёр</string> <string name="data_ready">Маълумотингиз тайёр</string> - <string name="configuration_sync_failed">Конфигурацияни синхронлаш амалга ошмади</string> - <string name="data_sync_failed">Маълумотларни синхронлаш амалга ошмади</string> <string name="account_recovery">Аккаунтни тиклаш</string> + <!--PERIOD--> <string name="DAILY">Кунлик</string> <string name="WEEKLY">Ҳафталик</string> @@ -70,127 +37,78 @@ <string name="enter_text">Матн киритинг</string> <string name="enter_long_text">Узун матн киритинг</string> <string name="enter_number">Сонни киритинг</string> - <string name="enter_integer">Бутун сон киритинг</string> <string name="enter_negative_integer">Бутун манфий сон киритинг</string> <string name="enter_positive_integer_or_zero">Бутун мусбат ёки ноль сонини киритинг</string> <string name="enter_positive_integer">Мусбат сон киритинг</string> - <string name="filter_options">Фильтр вариантлари</string> <string name="choose_date">Санани танланг</string> - <string name="change_calendar">Календардан танланг</string> <!-- Status --> - <string name="program_completed">Дастур тугалланди</string> - <string name="program_inactive">Дастур нофаол</string> <string name="event_open">Очиш</string> <string name="event_completed">Ҳодиса/тадбир якунланди</string> <string name="read_only">Фақат ўқиш учун</string> - <string name="finish_and_complete">Якунлаш ва тўлдириш</string> <string name="completed">Тўлдирилди</string> <string name="cancelled">Бекор қилинди</string> - <string name="activate">Фаоллаштириш</string> <string name="active">Фаол</string> <!-- State --> <string name="state_synced">Синхронлаш</string> <string name="state_to_post">Юбориш учун</string> <string name="state_to_update">Янгилаш учун</string> - <string name="state_to_delete">Ўчириб ташлаш учун</string> <string name="state_error">Хатолик</string> - <string name="action_sync">СИНХРОНЛАШ</string> - <string name="action_send">ЮБОРИШ</string> - <string name="action_sync_sms">СМСни СИНХРОНЛАШ</string> <!--Completion--> - <string name="completion">Тугатиш</string> <!--Event initial--> - <string name="create">Яратиш</string> <string name="update">Янгилаш</string> - <string name="date">Сана</string> <string name="org_unit">Ташкилий бўлим</string> <string name="no_org_units">Танланган саналар учун очиқ Ташкилий бўлимлар мавжуд эмас. Илтимос, бошқа сана ёки бошқа Ташкилий бўлимни танланг.</string> - <string name="category_option">Категория вариантлари</string> <string name="latitude">Кенглик</string> <string name="longitude">Узунлик</string> - <string name="new_event">Янги тадбир</string> - <string name="one_time">Бир марта</string> - <string name="permanent">Доимий</string> <!--DataSet initial--> <string name="report_period">Ҳисобот даври</string> - <string name="cat_option">Категория варианти</string> - <string name="field_required">Агар сиз қийматни ўрнатган бўлсангиз, маълумотлар тўпламини тўлдириш учун қатордаги барча қийматлар бўлиши лозим.</string> - <string name="field_mandatory">Баъзи зарурий қийматлар мавжуд эмас. Маълумотлар тўпламини тўлдириш учун сизга барча шарт бўлган қийматлар мавжуд бўлиши лозим.</string> - <string name="field_mandatory_v2">Шарт бўлган маълумотлар етишмаяпти. Маълумотлар тўпламини шакллантириш учун уларни тўлдиринг.</string> - <string name="datavalue_saved">Қиймат сақланди!</string> - <string name="there_is_no_available_period">Танлаш учун яроқли давр мавжуд эмас</string> <!--Event Detail--> <string name="due_date">Муддати</string> <string name="cat_combo">Категория комбинацияси</string> - <string name="date_default">КК/ОО/ЙЙЙЙ</string> <string name="cancel">Бекор қилиш</string> <string name="delete">Ўчириб ташлаш</string> - <string name="total">Жами</string> <string name="most_recent_event_date">Охирги тадбир санаси</string> <string name="no_options">Вариантлар мавжуд эмас</string> <string name="active_programs">Фаол дастурлар</string> - <string name="to_enroll_programs">Рўйхатга олиш дастурлари</string> <string name="enroll">Рўйхатга киритиш</string> - <string name="last_visit">Охирги ташриф</string> - <string name="apply">Мурожаат қилиш</string> <!--TEI DASHBOARD--> - <string name="see_details">Тафсилотларни кўринг</string> - <string name="view_more">КЎПРОҚ КЎРИШ</string> <string name="edit">Таҳрирлаш</string> - <string name="follow_up">Кузатиб бориш</string> - <string name="follow_up_enabled">Кузатув ёқилган</string> - <string name="follow_up_disabled">Кузатув ўчирилган</string> <string name="deactivate">Фаолсизлантириш</string> <string name="program_not_allow_events">Ушбу дастур яна кўпроқ тадбирларни қабул қилмайди</string> <!--DONE TASKS--> - <string name="events_no_data">Маълумот йўқ</string> <string name="events">ҳодиса/тадбирлар</string> <string name="done_task">Бош саҳифа</string> - <string name="app_info">Илова ҳақида маълумот</string> <string name="log_out">Чиқиш</string> - <string name="block_session">Сессияни блоклаш</string> <!-- SYNC --> - <string name="a_minute">1 дақиқа</string> - <string name="fifteen_minute">15 дақиқа</string> <string name="thirty_minutes">30 дақиқа</string> <string name="a_hour">1 соат</string> <string name="every_6_hours">6 соат</string> <string name="a_day">1 кун (стандарт)</string> <string name="every_12_hours">12 соат</string> - <string name="Automatic_Sync_Data">Маълумотларни автоматик синхронлаш, ҳар:</string> <string name="Manual">Қўлланма</string> - <string name="Automatic_Sync_Metadata">Конфигурацияни автоматик синхронлаш, ҳар:</string> <string name="a_week">1 ҳафта</string> <string name="sync_max_parameters">Жорий синхронлаш параметрлари</string> <string name="sync_default_parameters">Стандарт ҳолатга қайтиш</string> + <string name="wipe_data_meesage">Маълумотлар базаси ўчирилади. Сиздан қайта кириш сўралади.</string> <string name="wipe_data_ok">Қабул қилинг</string> <string name="wipe_data_no">Бекор қилиш</string> <string name="SYNC_DATA">Маълумотларни синхронлаш, ҳозир</string> <string name="SYNC_META">Конфигурацияни синхронланг, ҳозир</string> <string name="SYNC_MANAGER">Созламалар</string> - <string name="last_data_sync_date">Охирги синхронизация: %s</string> - <string name="last_metadata_sync_date">Охирги синхронизация: %s</string> <string name="refill_reserved_values">Тўлдириш</string> - <string name="settings_sms_module_title">СМС модуль:</string> <string name="settings_sms_receiver_number">СМС йўлак</string> <string name="settings_sms_result_sender_number">СМС натижаларини юборувчи</string> - <string name="settings_sms_result_timeout_hint">сониялар</string> - <string name="settings_sms_result_sender_hint">рақам</string> - <string name="settings_sms_receiver_number_hint">рақам</string> <string name="settings_sms_module_switch">СМС юборишни ёқиш</string> <string name="settings_sms_response_wait_switch">СМС натижалар тарқатилишини кутиш</string> - <plurals name="settings_specific_programs"> - <item quantity="other">Махсус созламаларга эга бўлган дастурлар %s</item> - </plurals> <string name="settings_limit_scope">Созламалар чекланган</string> <string name="settings_limit_globally">Глобал миқёсда</string> <string name="settings_limit_program">дастур бўйича</string> @@ -208,15 +126,11 @@ <string name="settingsErrorLog_descr">Ушбу журналда маълумотлар ва МетаМаълумотларни синхронлашда вужудга келган барча хатоликлар қайд этилган</string> <string name="settingsDeleteLocalData">Локал маълумотларни ўчириб ташлаш</string> <string name="settingsDeleteLocalData_descr">Қурилмангизда сақланган барча Кузатув-Назорат иловаси маълумотлари ўчириб ташланади. Сервер билан синхронланмаган маълумотлар йўқотилади.</string> - <string name="settingsReset">Илова маълумотларининг асл стандарт ҳолатини тиклаш; конфигурация</string> - <string name="settingsReset_descr">Қурилмангизда сақланган конфигурация ва Илова маълумотлари ўчирилади. Сиздан қайта тизимга кириш сўралади. Сервер билан синхронланмаган маълумотлар йўқотилади.</string> <string name="settingsSms">СМС созламалари</string> <string name="settingsSms_descr">СМС шлюзи билан боғлиқ параметрларни текширинг ва таҳрирланг</string> <string name="settingsTwoFAStatus">Статус</string> <!--endregion--> - <string name="enrollmment_date">Қабул қилинган сана</string> - <!-- SEARCH OPTION SET --> <string name="search_optionset">Излаш</string> <!--FORM FRAGMENT--> @@ -225,11 +139,6 @@ <string name="write_new_note">Янги эслатма ёзинг</string> <string name="clear">аниқ</string> <string name="add_note">Изоҳ қолдириш</string> - <string name="revert">Қайтиш</string> - <string name="activated">Фаоллаштирилди</string> - <string name="missing_mandatory_fields_title">Мажбурий майдонлар қолдириб кетилган</string> - <string name="missing_mandatory_fields_text">Баъзи мажбурий майдонлар қолдириб кетилган. Агар ҳозир орқага қайтсангиз, барча сақланган маълумотлар ўчиб кетади.</string> - <string name="missing_mandatory_fields_text_not_delete">Баъзи мажбурий майдонлар қолдириб кетилган. Агар орқага қайтмоқчи бўлсангиз, Илтимос, уларни тўлдиринг.</string> <string name="title_delete_go_back">Маълумотингиз сақланмади</string> <string name="delete_go_back">Агарда ҳозир орқага қайтсангиз, барча киритилган маълумотлар ўчирилади.</string> <string name="missing_mandatory_fields_go_back">Ўчириб ташлаш ва орқага қайтиш</string> @@ -237,29 +146,15 @@ <string name="tei_coordinates">Учун координаталар</string> <!--EVENT SUMMARY--> - <string name="section_list">Бўлимлар рўйхати</string> - <string name="event_summary_header" formatted="false">%s саволлардан %s бажарилди</string> - <string name="event_summary_sections_header" formatted="false">%s дан %s бажарилди</string> - <string name="complete_and_close">Якунлаш ва ёпиш</string> <!--AGE CUSTOM VIEW--> - <string name="hint_day">Кунлар</string> - <string name="hint_month">Ойлар</string> - <string name="hint_year">Йиллар</string> - <string name="week">Ҳафталар</string> <string name="incident_date">Ҳодиса санаси</string> - <string name="local_results">Локал натижалар</string> - <string name="online_results">Онлайн натижалар</string> <string name="past_programs">Аввалги дастурлар</string> <!--PERMISSIONS--> <string name="permission_denied">Ушбу амални бажариш учун сизда зарурий рухсат йўқ</string> - <string name="add_relation_button">Сифатида қўшиш...</string> - <string name="date_dialog_clear">Тозалаш</string> <string name="period">давр</string> - <string name="org_unit_filter">(%d) ташкилий бўлими</string> - <string name="org_unit_select_level">%d даражаси</string> <string name="tuto_main_1">DHIS2 га Хуш келибсиз</string> <string name="tuto_main_2">Бу ерда щз фаолиятингизни кузатишингиз мумкин</string> <string name="tuto_main_3">Фильтрни щзгартиришингиз мумкин</string> @@ -268,16 +163,11 @@ <string name="tuto_main_6">Асосий менюдан бошқа ҳаракатларни текшириш</string> <!-- RELATIONSHIPS --> - <string name="default_relationship_label">Ўзаро алоқа муносабатларни яратиш</string> <string name="next">Кейинги</string> <string name="search_min_num_attr">Қидирув учун камида %d атрибутни киритиш керак</string> - <string name="search_attr">Қидирув учун камида 1 та атрибутни киритиш керак</string> - <string name="search_max_tei_reached">%d дан ортиқ натижалар мавжуд. Илтимос, қўшимча қидирув мезонларини киритинг</string> - <string name="search_init">Қидирув мезонларини киритинг</string> <!-- QR --> <string name="QR_SCANNER">QR қурилмаларни импорт қилиш</string> - <string name="SAVE">Сақлаш</string> <string name="button_ok">ОК</string> <string name="qr_id">Идентификация</string> <string name="qr_attributes">Аттрибутлар</string> @@ -289,32 +179,20 @@ <string name="qr_no_data">маълумотлар йўқ</string> <string name="qr_error_id">QR код яроқсиз</string> <string name="qr_error_attr">Ушбу атрибутларрни қўшиб бўлмади</string> - <string name="qr_error_enrollment">Ушбу қайдларни қўшиб бўлмади</string> <string name="about">Ҳақида</string> <string name="programs_to_enroll">Рўйхатга олиш дастурлари</string> - <string name="select_all">ҳаммасини белгилаш</string> - <string name="clear_all">аниқ танлов</string> - <string name="empty_program_list">Танланган фильтрлар учун маълумот йўқ. Илтимос, уларни ўзгартириб кўринг.</string> <string name="share">Улашиш</string> <string name="share_qr">QR ни улашиш</string> <string name="max">Максимум</string> <string name="current">Жорий</string> <string name="tei">TEI</string> <string name="teis">TEI лар</string> - <string name="limit_by_organisation_unit">Ташкилий бўлимлар орқали чегаралаш</string> - <string name="limit_by_program">Дастур орқали чегаралаш</string> - <string name="programs_list">Дастурлар рўйхати</string> <string name="wipe_data">Илова маълумотларининг асл стандарт ҳолатини тиклаш; конфигурация</string> - <string name="add_relationship_error">Ушбу ўзаро муносабатларни қўшиб бўлмайди</string> <string name="warning_error_on_complete_title">Буни текширинг!</string> - <string name="warning_on_complete_title">Огоҳлантириш</string> - <string name="error_on_complete_title">Хато</string> <string name="save">Сақлаш</string> <string name="reserved_value">Ҳимояланган қийматлар</string> - <string name="downloaded_confirm">QR дан кўпроқ маълумотларни қўшмоқчимисиз?</string> - <!--ABOUT--> <string name="about_app">Илова версияси: 1 %s</string> <string name="about_sdk">SDK версияси: 1 %s</string> @@ -325,138 +203,44 @@ <string name="about_dev">Осло Университети томонидан ишлаб чиқилган ва қўллаб қувватланадиган DHIS2 лойиҳаси</string> <string name="about_contact">Ушбу дастур ҳақида қўшимча маълумот ёки саволлар учун android@dhis2.org электрон манзилига ёзинг</string> - <string name="login_error_null_pass">Пароль қолдириб кетилган, Илтимос, ушбу майдонни тўлдиринг.</string> - <string name="login_error_null_username">Фойдаланувчи исми қолдириб кетилган. Илтимос, ушбу майдонни тўлдиринг.</string> - <string name="login_error_dhis_version">Ушбу сервер 2.29 дан фарқли версияни ишлатмоқда. Сервер версиясини янгиланг ёки давом этиш учун синов муддатидан фойдаланинг.</string> - <string name="login_error_dhis_version_v2">Ушбу сервер %s дан фарқли версияни ишлатмоқда. Сервер версиясини янгиланг ёки давом этиш учун синов муддатидан фойдаланинг.</string> - <string name="login_error_unsuccessful_response">Нимадир нотўғри бажарилди. Сервер URL манзили, фойдаланувчи номи ва пароль тўғри эканлигини текширинг ва қайтадан урининг.</string> - <string name="login_error_error_response">Сервер ушбу сўровни бажара олмади.</string> - <string name="login_error_default">Серверга киришга хатолик юз берди.</string> - <string name="login_error">Кириш хатоси</string> - <string name="missing_mandatory_fields">Мажбурий майдонлар қолдириб кетилган</string> - <string name="online_search_unexpected">Онлайн қидирувда кутилмаган хатолик</string> - <string name="online_search_parsing_error">Натижаларни таҳлил қилишда хатолик юз берди</string> - <string name="online_search_error">Онлайн қидирувда хаттолик юз берди</string> - <string name="online_search_response_error">Серверда хатолик юз берди</string> <string name="search_program_not_selected">Рўйхатдан ўтишни ёқиш учун дастурни танланг</string> <string name="search_access_error">Сизда керакли рухсат йўқ</string> - <string name="feature_unavaible">Ушбу функция ҳали тайёр эмас.</string> - <string name="relationship_label_error">Ўзаро алоқалар ёрлиғини олишда хатолик юз берди</string> <string name="all_tei_type">Барчаси %s</string> <string name="invalid_phone_number">Бу яроқли телефон рақами эмас</string> - <string name="invalid_email">Бу яроқли электрон почта манзили эмас</string> - <string name="invalid_negative_number">Фақат манфий рақамларга рухсат берилади</string> <string name="invalid_possitive_zero">Фақат мусбат рақамлар ёки нолга рухсат берилади</string> - <string name="invalid_possitive">Фақат мусбат рақамларга рухсат берилади</string> - <string name="invalid_interval">Фақат 0 дан 1 гача бўлган қийматларга рухсат берилади</string> - <string name="invalid_percentage">Фақат 0 дан 100 гача бўлган қийматларга рухсат берилади</string> - <string name="date_dialog_tigle">Фильтрлаш учун саналарни танланг</string> <string name="select_option">Вариант танланг</string> - <string name="issue_reported">Муаммо ҳақида хабар берилди</string> - <string name="dialog_generate_new_event">Янги ҳодиса/тадбир яратиш</string> - <string name="message_generate_new_event">Ҳақиқатдан ҳам бошқа ҳодиса/тадбир яратмоқчимисиз?</string> <string name="event_completed_title">Ҳодиса/Тадбир Тугалланди</string> <string name="event_completed_message">Ушбу дастурдаги барча ҳодиса/тадбирлар якунланди. Ҳақиқатдан ҳам ушбу дастурни ёпишни хохлайсизми?</string> - <string name="complete_enrollment_message">Ҳақиқатдан ҳам рўйхатдан ўтишни тугатмоқчимисиз?</string> <string name="check_event">Текширинг</string> <string name="menu_home">Бош саҳифа</string> <string name="appwidget_text">МИСОЛ</string> - <string name="add_widget">Виджет қўшиш</string> <string name="showHelp">Ёрдам беринг</string> - <string name="tuto_settings_1">Маълумотларингизни сохталаштиринг...</string> - <string name="tuto_settings_2">...сизнинг конфигурациянгиз...</string> - <string name="tuto_settings_3">...сервердан қанча ёзувларни юклаб олиш кераклигини белгиланг...</string> - <string name="tuto_settings_reserved">Қанча захира қийматлари қолганлигини текширинг ва бошқаринг</string> - <string name="tuto_settings_errors">Серверга уланиш амалга ошмаганлигини текширинг</string> - <string name="tuto_settings_reset">Дискда жой бўшатинг</string> - <string name="tuto_settings_4">...ёки бошидан бошлаш учун ҳамма нарсани ўчириб ташлаш.</string> - <string name="tuto_search_1_v2">Ўзингизнинг қурилмангизни ҳам локал ҳам серверда топинг.</string> - <string name="tuto_search_2">Сизга бошқа дастурларга ўтишингиз мумкин</string> - <string name="tuto_search_3_v2">Янги объектларни қидириш ёки қўшиш. Сиз аввал қидиришингиз зарур, янгисини қўшишдан олдин!</string> - <string name="tuto_search_4_v2">Майдонларни тозалаш ва қидирувни қайта бошлаш учун шу ерни босинг.</string> <string name="tuto_dashboard_1">Бу шахс-объектларни бошқарув панели</string> <string name="tuto_dashboard_2">Шахс-объектларнинг профиль маълумотларини кўринг...</string> - <string name="tuto_dashboard_3">...QR ёки СМС орқали маълумот улашиш...</string> - <string name="tuto_dashboard_4">...ёки кузатув учун шахсни белгиланг</string> - <string name="tuto_dashboard_5">Ҳодиса/тадбирни яратиш ёки режалаштириш ёки бошқа Ташкилий бўлимга мурожаат қилиш учун босинг.</string> <string name="tuto_dashboard_6">Бу ерда сиз барча ҳодиса/тадбирларни кўрасиз. Ҳодиса/тадбир тафсилотларини кўриш учун босинг.</string> <string name="tuto_dashboard_7">Ўзаро муносабатларни қўшиш, кўрсатгичларни кўриш ёки ёзувларни ёзиш учун меню бўйлаб ҳаракатлананинг.</string> - <string name="tuto_dashboard_8">Ташкилотингиз томонидан барча қайд қилинганларни кўриш ёки янгисини яратиш учун, босинг</string> - <string name="tuto_tei_event_1">Ушбу ҳодиса/тадбирни ўчириб ташлаш учун босинг. Ушбу ҳаракат қайтмас.</string> - <string name="tuto_tei_event_2">Ҳодиса/тадбирни якунлаш.</string> - <string name="tuto_program_event_1">Ушбу дастур билан боғлиқ барча ҳодиса/тадбирлар бу ерда келтирилган.</string> - <string name="tuto_program_event_2">Янги ҳодиса/тадбир қўшиш учун, босинг</string> <string name="tuto_event_initial_new_1">Ҳодиса/тадбир яратиш учун барча маълумотларни киритинг</string> <string name="tuto_event_initial_1">Ҳодиса/тадбирнинг тугаш ҳолатини текшириш учун, босинг.</string> - <string name="tuto_event_summary">Ҳодиса/тадбирни якунлаш ёки қайта очиш учун, босинг</string> - <string name="tuto_main_7">QR орқали бошқа қурилмалардан маълумотларни ўқинг ва сақланг</string> - <string name="tuto_main_8">Маълумотларни сервер билан синхронлаштиринг</string> - <string name="tuto_main_9">4 хонали код билан сессияни блоклаш. Кодингизни унутманг!</string> - <string name="tuto_main_10">Фойдаланувчини ёки серверни ўзгартириш учун тизимдан чиқинг. Интернетда уланиш бўлмаса ҳам, сиз яна тизимга киришингиз мумкин.</string> - <string name="text_plus_colon">%s:</string> <string name="relationships">ўзаро алоқалар</string> <string name="empty_tei_add">Ҳеч қандай ҳодиса/тадбир рўйхатдан ўтказилмаган, янгисини қўшиш учун \"+\" тугмасини босинг.</string> - <string name="empty_tei_no_add">Ҳеч қандай ҳодиса/тадбир рўйхатдан ўтказилмаган.</string> <string name="qr_data_values">Маълумотларнинг қийматлари</string> <string name="info">Ахборот</string> <string name="qr_no_id_error">ID ўқиб бўлмади</string> <string name="delete_local_data">Локал маълумотларни ўчириб ташлаш</string> <string name="dashboard_overview">Қисқача кўздан кечириш</string> - <string name="dashboard_relationships">Ўзаро алоқалар</string> - <string name="dashboard_indicators">Кўрсатгичлар</string> - <string name="dashboard_analytics">Аналитика</string> <string name="empty_indicators">Ушбу дастур учун индикатор мавжуд эмас.</string> - <string name="dashboard_notes">Изоҳлар</string> - <string name="unable_to_complete">Тугалланмади</string> - <string name="field_errors">Баъзи майдонларда хатолар мавжуд. Илтимос, уларни бажариш учун уларни текширинг</string> <string name="unselect_enrollment">Барча қайдлар</string> <string name="unselect_enrollment_description">Барча фаол дастурлар билан бошқарув панелини кўрсатиш</string> - <string name="CHECK_SYNC_ERRORS">Синхронизациядаги хатоликлар журналини очиш</string> <string name="error_dialog_title">Синхронизациядаги хатоликлар журнали</string> <string name="share_with">билан улашиш ...</string> - <string name="errors_during_sync">Сизнинг конфигурациянгиз синхронлашмади. Сизнинг серверингизда хатолар бўлиши мумкин. Қўшимча маълумотлар учун бу ерни босинг.</string> - <string name="sectionSelectorPrev">ОЛДИНГИ</string> - <string name="sectionSelectorNext">КЕЙИНГИ</string> - <string name="event_overview">Тафсилотлари</string> - <string name="event_indicators">Индикаторлар</string> - <string name="event_notes">Изоҳлар</string> - <string name="complete_add_new"><![CDATA[Якунлаш ва Янги қўшиш]]></string> - <string name="complete_later">Кейинроқ тўлдириш</string> - <string name="finish_add_new"><![CDATA[Тугатиш ва Янги қўшиш]]></string> - <string name="finish">Тугатиш</string> - <string name="error_fields_title">Хатоликлар мавжуд бўлган майдонлар</string> - <string name="error_fields_events">Баъзи майдонларда хатоликлар мавжуд.Улар сақланмади. Илтимос,, уларни текшириб кўринг.</string> <string name="unique_warning">Қиймат ноёб бўлиши лозим, бир бирига ўхшаш топилди. У сақланмади. Илтимос, текшириб кўриш.</string> - <string name="unique_coincidence_found">Ноёб соҳада бир бирига ўхшаш қиймат топилди. Рўйхатдан ўтишни сақлаш учун формани текшириш.</string> <string name="please_wait">Илтимос, кутинг</string> <string name="skip">Ўтказиб юбориш</string> - <string name="reschedule">Қайта режаланг</string> <string name="no_intructions">Ушбу экрандаги ҳақида маълумот йўқ</string> - <string name="event_overdue">Муддат ўтган</string> - <string name="unsupported_program_rule">Бу ерда дастурнинг қўллаб қувватланмайдиган бир қоидаси мавжуд. Илтимос, ҳужжатларни текширинг.</string> - <string name="empty_description">Ушбу майдон учун маълумот йўқ</string> - <string name="biometrics_dialog_title">Ишонч ёрлиқлари бўш</string> - <string name="biometrics_first_use_text">Бармоқ излари сканери ёрдамида тизимга кириш учун аввал стандарт усулдан фойдаланишингиз керак</string> - <string name="biometrics_security_title">Биометрик Хавфсизлик</string> - <string name="tab_tables">Жадваллар</string> - <string name="table">Жадвал</string> - <string name="login_https">https://</string> <string name="delete_local_data_message">Синхронизация қилинмаган маълумотлар йўқолади. Ҳақиқатдан ҳам давом эттиришни хохлайсизми?</string> - <string name="local_data_accept">Қабул қилинг</string> <string name="delete_local_data_error">Маълумотларни ўчириб бўлмади. Илтимос, қайта уриниб кўринг. </string> <string name="delete_local_data_done">Локал маълумотларни ўчириш муваффақиятли якунланди.</string> - <string name="org_unit_selection_warning">Камида битта ташкилий бўлим танланиши керак</string> - <string name="send_user_name_title">аълумотларни юборинг</string> - <string name="send_user_name_mesage">DHIS2 да фойдаланувчи идентификаторлари билан боғлиқ хатоликлар журналларини улашиш орқали ушбу дастурни яхшилашга ёрдам бериш.</string> - <string name="check_mandatory_field">Майдонларни белгилаш</string> - <string name="error_no_network_during_sync">Конфигурацияни синхронлаштириш пайтида сизнинг интернет алоқангизда узилиш юз берди. Илтимос, кейинроқ қайта уриниб кўринг</string> - <string name="action_agree">Розиман</string> - <string name="action_continue">Давом этиш</string> - <string name="login_server_info_title">Сервер URLи</string> - <string name="forgot_your_code">Кодингизни унутдингизми?</string> - <string name="event_form_end_options_title">Ушбу ҳодиса/тадбир учун нима қилмоқчисиз?</string> - <string name="sectionSelectorEnd">ТАМОМ</string> <string name="resource_not_found">%s топилмади</string> <string name="relationship_not_found_message">Сиз кириб кўрмоқчи бўлган ёзув мавжуд эмас. Буни қидирмоқчимисиз?</string> <string name="sync_by_sms">СМС орқали синхронлаш</string> @@ -464,32 +248,15 @@ <string name="state_uploading">Юкланмоқда</string> <string name="state_relationship">Ўзаро алоқа</string> <string name="sent_by_sms">СМС орқали юборилган</string> - <string name="no_conflicts_message">Ушбу дастур учун ҳеч қандай низолар мавжуд эмас</string> - <string name="network_unavailable_sms">Интернетга уланиш узилган, лекин телефон хизматлари мавжудга ўхшайди - сиз СМС дан фойдаланишингиз мумкин.</string> - <string name="network_unavailable">Интернетга уланиш узилган.</string> <string name="action_close">Ёпмоқ</string> <string name="tuto_main_11">Энди сиз шу тугмага босиш орқали синхронизация маълумотларини текширишингиз мумкин</string> - <string name="no_conflicts_update_message">Ушбу маълумотлар фақат сизнинг қурилмангизда сақланади, сервер билан синхронлаштирилмайди.</string> - <string name="no_conflicts_synced_message">Сизнинг ҳолатингиз долзарб! Сизнинг барча маълумотларингиз серверга юборилади.</string> <string name="relationship_error_recursive">Ёзувни ўзаро алоқалар билан боғлаб бўлмади</string> - <string name="unblock_session">Сессияни блокдан чиқариш</string> - <string name="data_set_complete">Бажарилди</string> - <string name="data_set_open">Очиш</string> - <string name="unsupported_value_type">Қўллаб қувватланмайдиган қиймат тури</string> <string name="change_calendar_view">Тақвим кўринишини ўзгартириш</string> - <string name="data_every_fifteen_minutes">15 дақиқа</string> - <string name="data_every_hour">Ҳар соатда</string> - <string name="data_every_day">Кунлик</string> - <string name="data_every_week">Ҳафталик</string> - <string name="period_week">Ҳафта</string> - <string name="sync_setting">Синхронизация созланмаси: %s</string> <string name="relationship_without_enrollment">Сиз кириб кўрмоқчи бўлган ёзув қайд этилмаган. Сиз бошқарув панелига кира олмайсиз</string> <string name="formatting_error">Форматлашда хатолик</string> <string name="delete_authority_error">Ҳуқуқингиз чегараланганлиги сабабни ушбу ёзувни ўчириб ташлолмайсиз</string> - <string name="validation_url">Бу ҳақиқий URL эмас</string> <string name="adjusting_form">Шакл созланмоқда...</string> - <string name="sms_receiver_number">Қабул қилувчининг рақами</string> <string name="sms_amount_question">Сиз %d та хабар юборилишини қабул қиласизми?</string> <string name="sms_sending">%1$d / %2$d юборилмоқда</string> <string name="sms_waiting_amount_confirm">Кутиш вақтини тасдиқлаш - 1%d</string> @@ -507,51 +274,29 @@ <string name="sms_error_no_gateway_set">Шлюз ўрнатилмаган</string> <string name="sms_error_no_user_login"> Фойдаланувчи тизимга кирмаган</string> <string name="sms_error_module_disabled">СМС модуль ўчириб қўйилган</string> - <string name="sms_error_ongoing_sunmission">Яна СМС юборилди</string> <string name="sms_metadata_empty">СМС модуль ишга туширилмади, талаб қилинган метамаълумотлар топилмади</string> - <string name="sms_completed">бажарилди</string> <string name="sms_count_error">Қабул қилинмаган СМС лар сони</string> <string name="sms_state_started">СМС юборилиши бошланди</string> <string name="sms_state_converted">Маълумотлар ўқилди ва қайта мослаштирилди. Юбориш идентификатори %d</string> - <string name="sms_general_error">СМС юборишда хатолик юз берди</string> <string name="sms_title_enrollment">СМС TEI рўйхатдан ўтиш ва қайд қилиш</string> <string name="sms_title_event">СМС ҳодиса/тадбирларни юбориш</string> <string name="sms_title_data_set">СМС маълумотлар тўпламини юбориш</string> - <string name="sms_bar_state_starting">Бошланмоқда</string> - <string name="sms_bar_state_sending">Жараёнда</string> - <string name="sms_bar_state_sent">Юборилди</string> - <string name="sms_bar_state_failed">Амалга ошмади</string> - <string name="start_sync_granular">Синхронизацияни бошлаш.</string> <string name="syncing">Синхронизацияланмоқда...</string> - <string name="end_sync_granular">Синхронизация тугалланди.</string> - <string name="error_sync">Синхронизация пайтида хатолик юз берди</string> - <string name="error_sync_check_logs">Синхронизация пайтида хатолик юз берди. Хатоликлар журналини текшириш учун шу ерни босинг</string> - <string name="cancel_sync">Синхронизация бекор қилинди.</string> <string name="copied_text">Нусха олинди</string> - <string name="image_selected">Расм танланди</string> - <string name="show_in_map">Харитада кўрсатиш</string> - <string name="show_list">Рўйхатни кўрсатиш</string> <!--region TRACKER IMPORT CONFLICT MESSAGES--> - <string name="value_required_but_not_provided">%s мажбурий, аммо таыдим этилмаган</string> - <string name="polygon_captured">Кўпбурчак ушланди</string> <string name="polygon">Полигон</string> <!--endregion--> - <string name="fingerprint_title">Бармоқ излари</string> - <string name="fingerprint_message">Илтимос, бармоқ изини киритинг</string> <string name="security_title">Хавфсизлик</string> <string name="security_rooted_message">Хавфсизлик туфайли дастурнинг ушбу версиясидан андоза олинган қурилмаларга фойдаланишга рухмат берилмаган. Илтимос, машқ версиясидан фойдаланинг.</string> - <string name="fix_error">Баъзи хатоликлар аниқланди. Давом этишдан олдин уларни тузатинг.</string> <string name="filters_active">Фильтрлар қўлланилади</string> <string name="filters_disabled">Ҳеч қандай фильтр қўлланилмаган</string> <string name="filters_title_period">Давр</string> <string name="filters_title_org_unit">Ташкилий бўлим</string> - <string name="filters_title_sorting">Тартиблаш</string> - <string name="filters_title_status">Статус</string> <string name="filters_title_state">Синхронлаш</string> <string name="filters_title_assigned">Менга берилган ваколат</string> <string name="filter_period_today">бугун</string> @@ -566,8 +311,6 @@ <string name="filter_period_form_to">Дан-Гача</string> <string name="filter_period_other">Бошқа</string> <string name="filter_period_any">Исталган вақт</string> - <string name="data_values_error_sync_message">Синхронизация амалга ошмади. Муаммони ҳал қилишга уриниш учун маълумотлар қийматларини текширинг ва қайтадан урининг. Агар шунда синхронизация ишламаса, тизим маъмурига мурожаат қилинг</string> - <string name="sms_synced_message">Ушбу маълумотлар серверга юборилган, аммо уларнинг сақланишига кафолат берилмаган</string> <string name="filter_event_status_open">Очиш</string> <string name="filter_event_status_schedule">Режа</string> <string name="filter_event_status_overdue">Муддат ўтган</string> @@ -583,7 +326,6 @@ <string name="sms_empty_gateway">СМС шлюз бўш бўлиши мумкин эмас</string> <string name="granular_sync_enrollments_empty">Юклаш учун қайд этилганлар йўқ</string> <string name="granular_sync_unsupported_task">Ушбу конвертация қилиш вазифаси қўллаб-қувватланмайди</string> - <string name="disable_pin_locked">Блокланган экранни қайта кўрсатмаслик</string> <string name="set_pin">ПИН кодни ўрнатинг</string> <string name="conflict">Номутаносиблик</string> <string name="change_event_date">Санани ўзгартириш</string> @@ -608,11 +350,7 @@ <string name="choose_ou">Ташкилий бўлимни танланг</string> <string name="enter_url">URL ни танланг</string> <string name="enter_value">Қийматни танланг</string> - <string name="choose_image">Расмни танланг</string> - <string name="scan_code">Кодни сканерлаш</string> - <string name="choose_option">Вариантни танланг</string> <string name="reserved_values_hint">TEI атрибутидан юкланган ҳимояланган қийматлар</string> - <string name="settings_reserved_values_message">TEI атрибутидан юкланган ҳимояланган қийматлар</string> <string name="reserved_values_left">%s ҳимояланган қийматлар қолди</string> <string name="manage_reserved_values_button">Ҳимояланган қийматларни бошқариш</string> <string name="events_to_download">Юклаб олиш учун ҳодиса/тадбирлар</string> @@ -632,39 +370,19 @@ <string name="filter_sync_not_synced">Синхронизацияланмаган</string> <string name="filter_sync_error">Синхронлашда хатолик</string> <string name="filter_sync_sms">СМС Синхронизацияланган</string> - <string name="dataset_overview">Тафсилотлари</string> - <string name="dataset_comments">Изоҳлар</string> <string name="saved">Сақланди!</string> - <string name="run_validation_rules">Маълумотлар сифатини текширишни хохлайсизми?</string> - <string name="validation_success_title">Кўринишидан ҳаммаси яхши!</string> - <string name="mark_dataset_complete">Маълумотлар тўпламини тўлдиришни хохлайсизми?</string> - <string name="dataset_completed">Тугалланган сифатида белгилансин</string> - <string name="name">Исми</string> - <string name="formula">Формула</string> - <string name="complete_anyway">Барибир тўлдиринг</string> <string name="fk_message">%s %s дан %s %s йўқолган</string> <string name="filters_title_event_status">Ҳодиса/Тадбир ҳолати</string> - <string name="enrollment_date">Қайд қилинган сана</string> <string name="dataset_empty_list_can_create">Маълумот йўқ. Янги ёзув қўшиш учун \"+\" тугмасини босинг</string> <string name="dataset_emtpy_list_can_not_create">Маълумот йўқ. Сизда янги ёзувларни қўшишга рухсат йўқ.</string> <string name="validation_rules_empty_description">Ҳеч қандай тавсиф ёки кўрсатма берилмаган</string> <string name="validation_rules_data_to_review">Кўриб чиқиладиган маълумотлар</string> - <string name="dataset_saved_completed">Якунланди ва сақланди!</string> <string name="status_change_error_active_exist">Қайд аллақачон мавжуд</string> <string name="enrollment_status_active">Очиш</string> <string name="enrollment_status_completed">Бажарилди</string> <string name="enrollment_status_cancelled">Бекор қилинди</string> - <string name="event_data">Маълумот</string> <string name="download_tei_error">Танланган %s  юкланмади.</string> - <string name="completed_by">%s томонидан бажарилган: %s</string> - <string name="updated_time">Янгиланган: %s</string> - <string name="action_done">Бажарилди</string> - <string name="validation_internal_error_datasets">Маълумотлар сифатини текшириб бўлмади. Администраторингизга мурожаат қилинг</string> - <string name="are_you_sure">Ишончинигиз комилми?</string> - <string name="reopen_question">Маълумотлар тўпламини қайта очиб кўрмоқчимисиз?</string> <string name="filters_title_date">Сана</string> - <string name="filters_title_event_date">Тадбир санаси</string> - <string name="tei_type_has_no_attributes">%s умумий хусусиятларга эга эмас. Илтимос, дастурни танланг</string> <string name="privacy_policy_title">Махфийлик сиёсати</string> <string name="open_privacy_policy">Махфийлик сиёсатини текшириш учун шу ерни босинг</string> <string name="coordinates_error">Координата қийматлари яроқсиз</string> @@ -672,15 +390,8 @@ <string name="security_debugger_message">Хавфсизлик сабабли ушбу версиядан adb форматидан фойдаланишга рухсат берилмаган.Илитмос, машқ версиясидан фойдаланинг.</string> <string name="customactivityoncrash_error_activity_restart_app">Орқага қайтинг</string> - <string name="customactivityoncrash_error_activity_close_app">Иловани ёпиш</string> - <string name="customactivityoncrash_error_activity_error_details">Батафсил маълумот</string> - <string name="customactivityoncrash_error_activity_error_details_title">Батафсил маълумот</string> - <string name="customactivityoncrash_error_activity_error_details_close">Ёпмоқ</string> <string name="customactivityoncrash_error_activity_error_details_copy">Буферга нусха олиш</string> - <string name="customactivityoncrash_error_activity_error_details_copied">Буферга нусха олинди</string> - <string name="customactivityoncrash_error_activity_error_details_clipboard_label">Хатто ҳақида маълумот</string> <string name="metada_first_sync_error">Серверингиз билан синхронизацияда хатоликни аниқладик. Иложи бўлса, хатолик ҳақида администраторингизга хабар беринг.</string> - <string name="error_init_session">Сизнинг фойдаланувчингиз билан сеанс ташкиллаштира олмадик</string> <string name="enrollment_date_edition_warning">Режалаштирила олинмайдиган ҳодиса/тадбир режалари мавжуд</string> <string name="section_charts">Диаграммалар</string> <string name="navigation_list_view">Пациентлар Рўйхати</string> @@ -719,37 +430,22 @@ <string name="section_feedback">Фикр-мулоҳаза</string> <string name="section_indicators">Кўрсатгичлар</string> <string name="value">Қиймат</string> + <string name="camera_permission_denied">Камерада фойдаланишга рухсат берилмаган. Ушбу функциядан фойдаланиш учун уни ёқишингиз керак.</string> <string name="section_charts_indicators">Диаграммалар ва индикаторлар</string> <string name="take_photo">Суратга олиш</string> - <string name="from_gallery">Галереядан танлаш</string> - <string name="data_set_quality_check_done">Бажарилди!</string> <string name="break_glass_dialog_title">Ушбу дастур ҳимояланган</string> <string name="break_glass_hint">Сабабини шу ерда ёзиб қолдиринг</string> - <string name="authenticating">Аутентификация қилинмоқда</string> - <string name="login_error_no_dhis_instance">Кўрсатиб ўтилган URL манзил DHIS шаблонида эмас</string> - <string name="login_error_bad_credentials">Нотўғри маълумот</string> - <string name="invalid_integer">Қиймат бутун сон бўлиши лозим</string> <string name="openid_session_expired">Сессия муддати тугаган</string> <string name="openid_session_expired_message">Сизнинг жорий сессиянгиз муддати тугаган. Хавфсизлик нуқтаи назаридан, сиз қайтадан аккаунт маълумотларини тақдим этишингиз лозим.</string> - <string name="dataset_column_default">Қийматлар</string> <string name="show_radar_graph">Радар (тўрсимон) сифатда кўриш</string> - <string name="available">Мавжуд</string> - <string name="unknown_date">Номаълум</string> <string name="troubleshooting_language_title">Тил</string> <string name="search_too_many_results">Натижа жуда кўп</string> - <string name="search_create_new">Янгисини яратиш</string> <string name="action_ok">Яхши</string> <string name="sync_dialog_title_synced">Синхронизацияланган</string> <string name="sync_dialog_title_syncing">Синхронлашмоқда</string> <string name="sync_dialog_action_send">Юбориш</string> <string name="sync_dialog_action_refresh">Янгилаш</string> <string name="sync_dialog_action_not_now">Hozir emas</string> - <plurals name="error_count_label"> - <item quantity="other">%s da xatoliklar</item> - </plurals> - <plurals name="warning_count_label"> - <item quantity="other">%s da ogohlantirishlar</item> - </plurals> <string name="marked_follow_up">Кузатув учун белгиланган</string> <string name="view_only">Фақат кўриш учун</string> <string name="skipped">Ўтказиб юборилди</string> @@ -762,13 +458,21 @@ <string name="program_stage">Дастур босқичи</string> <string name="event">ҳодиса/тадбир</string> <string name="timeline">Хронология</string> - <string name="optional">Ихтиёрий</string> <string name="show_more">Кўпроқ кўрсатиш</string> <string name="show_less">Камроқ кўрсатиш</string> <string name="sync">Синх</string> - <string name="show_fields">Қаторларни кўрсатиш</string> - <string name="hide_fields">Қаторларни беркитиш</string> <string name="show_description">Тавсифни кўрсатиш</string> <string name="hide_description">Тавсифни беркитиш</string> <string name="transfer">Ўтказиш</string> - </resources> + <plurals name="error_count_label"> + <item quantity="other">%s da xatoliklar</item> + </plurals> + + <plurals name="warning_count_label"> + <item quantity="other">%s da ogohlantirishlar</item> + </plurals> + + <plurals name="settings_specific_programs"> + <item quantity="other">Махсус созламаларга эга бўлган дастурлар %s</item> + </plurals> +</resources> diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 03a600a9022..dd4b7a8f15d 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -1,63 +1,28 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!--GENERAL--> <string name="app_name">Dhis2</string> - <string name="logo_text">dhis</string> - <string name="logo_number">2</string> <!-- Warnings and error messages --> <string name="error">Lỗi</string> - <plurals name="error_message"> - <item quantity="other">Lỗi</item> - </plurals> - <string name="error_wrong_server_url">Sai đường dẫn đến máy chủ</string> - <string name="error_wrong_credentials">Sai thông tin đăng nhập </string> - <string name="error_unexpected_error">Lỗi không mong muốn</string> - <string name="error_internal_server_error">Lỗi máy chủ nội bộ</string> - <string name="no_value">không có giá trị</string> <string name="no_reserved_values">Không còn giá trị dành riêng. Liên hệ với quản trị viên hệ thống của bạn</string> - <string name="no_reserved_values_connection">Không còn giá trị dành riêng. Kết nối với mạng để nạp thêm</string> - <string name="errors">lỗi</string> <string name="something_wrong">Có gì đó không đúng</string> <!-- SyncService strings: --> - <string name="sync_now">Đồng bộ ngay</string> - <string name="sync_text">Đang đồng bộ với máy chủ</string> - <string name="sync_title">Đang đồng bộ</string> - <string name="sync_metadata">Siêu dữ liệu</string> <string name="sync_events">Sự kiện</string> - <string name="sync_tei">Đối tượng theo dõi</string> - - <string name="sync_complete_title">Lưu</string> - <string name="sync_complete_text">Hoàn thành đồng bộ</string> <string name="sync_error_title">Lỗi đồng bộ</string> <string name="sync_error_text">Xảy ra lỗi trong quá trình đồng bộ. Vui lòng thử lại.</string> <string name="sync_incomplete_error_text">Đồng bộ đã hoàn tất nhưng chúng tôi không nhận được xác nhận máy chủ cho tất cả dữ liệu. Các dữ liệu vẫn được đánh dấu là \"Ngoại tuyến\" trong Ứng dụng. Chúng tôi khuyên bạn thử đồng bộ lại.</string> - <string name="data_sync_warning_program">CẢNH BÁO: Hầu hết dữ liệu của bạn đã được đồng bộ nhưng một vài dữ liệu vẫn bị xung đột. Hãy thử đồng bộ cấu hình và thử lại. Nếu cảnh báo vẫn tiếp diễn, kiểm tra trạng thái đồng bộ của chương trình, các Đối Tượng Theo Dõi và các sự kiện với các dấu hiệu xung đột là @.</string> - <string name="server_sync_error">Có lỗi và máy chủ không phản hồi. Liên hệ quản trị viên của bạn.</string> - - <string name="search_result_text">Tìm thấy %s kết quả</string> - <string name="add_new">Thêm sự kiện mới</string> - <string name="add">Thêm</string> <string name="enter_event_data">Nhập %s</string> <string name="enter_cancel_event_data">Nhập / Bỏ qua %s</string> - <string name="schedule_new">Đặt lịch hẹn</string> <string name="referral">Giới thiệu đến cơ sở khác</string> <!-- Login --> - <string name="url_hint">Đường dẫn đến máy chủ</string> - <string name="user_hint">Tên đăng nhập</string> - <string name="password_hint">Mật khẩu</string> - <string name="log_in_button">Đăng nhập</string> - <string name="unlock_button">Mở khóa phần nhập</string> <string name="syncing_configuration">Đang đồng bộ Cấu Hình của bạn</string> <string name="syncing_data_shortly">Dự Liệu của bạn sẽ được sớm đồng bộ </string> <string name="syncing_data">Đang đồng bộ Dữ Liệu của bạn</string> <string name="configuration_ready">Cấu Hình của bạn đã sẵn sàng</string> <string name="data_ready">Dữ Liệu của bạn đã sẵn sàng</string> - <string name="configuration_sync_failed">Đồng bộ Cấu Hình thất bại</string> - <string name="data_sync_failed">Đồng bộ Dữ Liệu thất bại</string> <string name="account_recovery">Phục hồi tài khoản</string> - <string name="no_network_to_recover_account">Cần có kết nối mạng để phục hồi tài khoảng của bạn</string> <!--PERIOD--> <string name="DAILY">Hàng Ngày</string> @@ -78,137 +43,87 @@ <string name="enter_text">Nhập văn bản</string> <string name="enter_long_text">Nhập văn bản dài</string> <string name="enter_number">Nhập số</string> - <string name="enter_integer">Nhập số nguyên</string> <string name="enter_negative_integer">Nhập số nguyên âm</string> <string name="enter_positive_integer_or_zero">Nhập số nguyên dương hoặc số 0</string> <string name="enter_positive_integer">Nhập số nguyên dương</string> - <string name="filter_options">Tùy Chọn Bộ Lọc</string> <string name="choose_date">Chọn ngày</string> - <string name="change_calendar">Thay đổi lịch</string> <!-- Status --> - <string name="program_completed">Chương trình đã hoàn tất</string> - <string name="program_inactive">Chương trình không hoạt động</string> <string name="event_open">Mở</string> <string name="event_not_completed">Chưa hoàn tất</string> <string name="event_completed">Sự kiện đã hoàn tất</string> <string name="read_only">Chỉ Xem</string> - <string name="finish_and_complete">Lưu và Hoàn Tất</string> <string name="completed">Đã hoàn tất</string> <string name="cancelled">Đã hủy</string> <string name="re_open">Mở lại</string> - <string name="re_open_form">Mở lại biểu nhập</string> - <string name="activate">Kích hoạt</string> <string name="active">Hoạt động</string> <!-- State --> <string name="state_synced">Đồng bộ</string> <string name="state_to_post">Gửi</string> <string name="state_to_update">Cập nhật</string> - <string name="state_to_delete">Xóa</string> <string name="state_error">Lỗi</string> - <string name="action_sync">ĐỒNG BỘ</string> - <string name="action_send">GỬI ĐI</string> - <string name="action_sync_sms">ĐỒNG BỘ SMS</string> <!--Completion--> - <string name="completion">Hoàn tất</string> <!--Event initial--> - <string name="create">Tạo mới</string> <string name="update">Cập nhật</string> - <string name="date">Ngày</string> <string name="org_unit">Đơn vị</string> <string name="no_org_units">Không có Đơn Vị nào trong ngày được chọn. Xin vui lòng chọn ngày khác hoặc Đơn Vị khác.</string> - <string name="category_option">Tùy Chọn Phân Loại</string> <string name="latitude">Vĩ độ</string> <string name="longitude">Kinh độ</string> - <string name="new_event">Sự kiện mới</string> - <string name="one_time">Một lần</string> - <string name="permanent">Cố định</string> <!--DataSet initial--> <string name="report_period">Thời điểm báo cáo</string> - <string name="cat_option">Tùy chọn</string> - <string name="field_required">Nếu bạn nhập một giá trị, cần nhập tất cả giá trị để hoàn tất Biểu Nhập</string> - <string name="field_mandatory">Một số giá trị bắt buộc đang bị thiếu. Bạn cần nhập giá trị bắt buộc để hoàn tất Biểu Nhập.</string> - <string name="field_mandatory_v2">Các trường nhập bắt buộc đang bị thiếu. Xin vui lòng điền giá trị bắt buộc để hoàn thành biểu nhập.</string> - <string name="datavalue_saved">Giá trị đã được lưu!</string> - <string name="there_is_no_available_period">Không có thời điểm để chọn.</string> <!--Event Detail--> <string name="due_date">Ngày đến hạn</string> <string name="next_event">%1$skế tiếp</string> <string name="cat_combo">Tổ hợp Phân Loại</string> - <string name="date_default">DD/MM/YYYY</string> <string name="cancel">Hủy</string> <string name="delete">Xóa</string> - <string name="total">Tổng số</string> <string name="most_recent_event_date">Ngày sự kiện gần nhất</string> <string name="no_options">Không có tùy chọn</string> <!--TEI Enrollment list--> <string name="enrollment_list">Danh sách đăng ký</string> <string name="active_programs">Các chương trình đang hoạt động</string> - <string name="to_enroll_programs">Chương trình để đăng ký</string> <string name="enroll">Đăng ký</string> - <string name="last_visit">Ngày đến khám gần nhất : </string> - <string name="apply">áp dụng</string> <!--TEI DASHBOARD--> - <string name="see_details">Xem Chi Tiết</string> - <string name="view_more">XEM THÊM</string> <string name="edit">Chỉnh sửa</string> - <string name="follow_up">Theo dõi</string> - <string name="follow_up_enabled">Đã bật theo dõi</string> - <string name="follow_up_disabled">Đã tắt theo dõi</string> <string name="deactivate">Không hoạt động</string> <string name="program_not_allow_events">Chương trình này không cho phép thêm sự kiện</string> <!--DONE TASKS--> - <string name="events_no_data">Không có dữ liệu</string> <string name="events">sự kiện</string> <string name="done_task">Trang chủ</string> - <string name="app_info">Thông Tin Ứng Dụng</string> <string name="log_out">Đăng Xuất</string> - <string name="block_session">Khóa Phiên đăng nhập</string> <string name="show_more_events">Hiển thị thêm %s...</string> <string name="show_less_events">Ẩn bớt...</string> <!-- SYNC --> - <string name="a_minute">1 Phút</string> - <string name="fifteen_minute">15 Phút</string> <string name="thirty_minutes">30 Phút</string> <string name="a_hour">1 Giờ</string> <string name="every_6_hours">6 Giờ</string> <string name="a_day">1 Ngày (Mặc định)</string> <string name="every_12_hours">12 Giờ</string> - <string name="Automatic_Sync_Data">Đồng bộ dữ liệu tự động mỗi:</string> <string name="Manual">Thủ công</string> - <string name="Automatic_Sync_Metadata">Tự động đồng bộ cấu hình mỗi:</string> <string name="a_week">1 Tuần</string> <string name="sync_max_parameters">Các tham số đồng bộ hiện tại:</string> <string name="sync_default_parameters">Trở về cài đặt mặc định</string> + <string name="wipe_data_meesage">Cơ sở dữ liệu sẽ được xóa.\nBạn sẽ được yêu cầu đăng nhập lại.</string> <string name="wipe_data_ok">Chấp nhận</string> <string name="wipe_data_no">Hủy</string> <string name="SYNC_DATA">Đồng Bộ Dữ Liệu Ngay</string> <string name="SYNC_META">Đồng Bộ Cấu Hình Ngay</string> <string name="SYNC_MANAGER">Cài đặt</string> - <string name="last_data_sync_date">Đồng bộ lần cuối: %s</string> - <string name="last_metadata_sync_date">Đồng bộ lần cuối: %s</string> <string name="refill_reserved_values">Nạp lại</string> - <string name="settings_sms_module_title">Mô đun SMS:</string> <string name="settings_sms_receiver_number">Cổng SMS</string> <string name="settings_sms_result_sender_number">Người gửi kết quả SMS</string> <string name="settings_sms_result_timeout">Thời gian chờ kết quả SMS (giây)</string> - <string name="settings_sms_result_timeout_hint">giây</string> - <string name="settings_sms_result_sender_hint">số</string> - <string name="settings_sms_receiver_number_hint">số</string> <string name="settings_sms_module_switch">Cho phép nộp SMS</string> <string name="settings_sms_response_wait_switch">Đợi phản hồi kết quả SMS</string> - <plurals name="settings_specific_programs"> - <item quantity="other">Có %s chương trình với các cài đặt riêng</item> - </plurals> <string name="settings_limit_scope">Cài đặt bị giới hạn</string> <string name="settings_limit_globally">Toàn cầu</string> <string name="settings_limit_program">theo chương trình</string> @@ -226,20 +141,15 @@ <string name="settingsErrorLog_descr">Nhật ký này chứa tất cả các lỗi gây ra khi đồng bộ dữ liệu và siêu dữ liệu của bạn.</string> <string name="settingsDeleteLocalData">Xóa dữ liệu nội bộ</string> <string name="settingsDeleteLocalData_descr">Tất cả dữ liệu của Ứng Dụng này được lưu trữ trong thiết bị của bạn sẽ bị xóa. Dữ liệu chưa được đồng bộ lên máy chủ sẽ bị mất.</string> - <string name="settingsReset">Cài đặt lại dữ liệu và cấu hình</string> - <string name="settingsReset_descr">Cấu hình và dữ liệu trong ứng dụng của bạn được lưu trữ trong thiết bị sẽ bị xóa. Bạn sẽ được yêu cầu đăng nhập lại và dữ liệu chưa đồng bộ lên máy chủ sẽ bị mất.</string> <string name="settingsSms">Cài đặt SMS</string> <string name="settingsSms_descr">Kiểm tra và chỉnh sửa các tham số liên quan tới cổng sms</string> <string name="settingsCheckVersion">Cập nhật phần mềm</string> - <string name="settingsCheckVersionMessage">Phần mềm</string> <string name="settingsExportDB">Xuất cơ sở dữ liệu</string> <string name="settingsExportDBMessage">Xuất cơ sở dữ liệu và chia sẻ nó với quản trị của bạn</string> <string name="settingTwoFA">Xác thực hai yếu tố</string> <string name="settingsTwoFAStatus">Trạng thái</string> <!--endregion--> - <string name="enrollmment_date">Ngày đăng ký</string> - <!-- SEARCH OPTION SET --> <string name="search_optionset">Tìm kiếm</string> <!--FORM FRAGMENT--> @@ -261,29 +171,15 @@ <string name="tei_coordinates">Tọa độ của </string> <!--EVENT SUMMARY--> - <string name="section_list">Danh sách phân đoạn</string> - <string name="event_summary_header" formatted="false">%s câu hỏi của %s đã hoàn tất</string> - <string name="event_summary_sections_header" formatted="false">%s của %s đã hoàn tất</string> - <string name="complete_and_close">Hoàn tất và Đóng</string> <!--AGE CUSTOM VIEW--> - <string name="hint_day">Ngày</string> - <string name="hint_month">Tháng</string> - <string name="hint_year">Năm</string> - <string name="week">Tuần</string> <string name="incident_date">Ngày khởi phát</string> - <string name="local_results">Kết quả cục bộ</string> - <string name="online_results">Kết quả trực tuyến</string> <string name="past_programs">Các chương trình cũ</string> <!--PERMISSIONS--> <string name="permission_denied">Bạn không có quyền thực hiện hành động này</string> - <string name="add_relation_button">Thêm làm</string> - <string name="date_dialog_clear">Xóa</string> <string name="period">Thời điểm</string> - <string name="org_unit_filter">(%d) Đơn vị</string> - <string name="org_unit_select_level">Tuyến %d</string> <string name="tuto_main_1">Chào mừng đến với dhis2</string> <string name="tuto_main_2">Bạn có thể xem các hoạt động của mình tại đây</string> <string name="tuto_main_3">Bạn có thể áp dụng bộ lọc...</string> @@ -292,16 +188,11 @@ <string name="tuto_main_6">Xem các hoạt động khác ở trình đơn chính</string> <!-- RELATIONSHIPS --> - <string name="default_relationship_label">Tạo mối quan hệ</string> <string name="next">Tiếp tục</string> <string name="search_min_num_attr">Bạn cần nhập ít nhất %d thuộc tính để thực hiện tìm kiếm</string> - <string name="search_attr">Bạn cần nhập ít nhất một thuộc tính để tìm kiếm</string> - <string name="search_max_tei_reached">Có nhiều hơn %d kết quả. Vui lòng nhập thêm thông số tìm kiếm khác</string> - <string name="search_init">Nhập thông số tìm kiếm của bạn</string> <!-- QR --> <string name="QR_SCANNER">Nhập dữ liệu QR</string> - <string name="SAVE">Lưu</string> <string name="button_ok">OK</string> <string name="qr_id">Nhận dạng</string> <string name="qr_attributes">Thuộc Tính</string> @@ -313,32 +204,20 @@ <string name="qr_no_data">không có dữ liệu</string> <string name="qr_error_id">Mã QR không hợp lệ</string> <string name="qr_error_attr">Không thể thêm thuộc tính này</string> - <string name="qr_error_enrollment">Không thể đăng ký</string> <string name="about">Giới thiệu</string> <string name="programs_to_enroll">Chương trình để đăng ký</string> - <string name="select_all">chọn tất cả</string> - <string name="clear_all">Bỏ chọn</string> - <string name="empty_program_list">Không có thông tin với các bộ lọc đã chọn. Vui lòng thay đổi</string> <string name="share">Chia sẻ</string> <string name="share_qr">Chia sẻ mã QR</string> <string name="max">Lớn nhất</string> <string name="current">Hiện tại</string> <string name="tei">ĐỐI TƯỢNG THEO DÕI</string> <string name="teis">ĐỐI TƯỢNG THEO DÕI</string> - <string name="limit_by_organisation_unit">GIới hạn bởi đơn vị</string> - <string name="limit_by_program">Giới hạn bởi chương trình</string> - <string name="programs_list">Danh sách chương trình</string> <string name="wipe_data">Cài đặt lại Dữ liệu &amp; cấu hình</string> - <string name="add_relationship_error">Không thể thêm mối quan hệ này</string> <string name="warning_error_on_complete_title">Kiểm tra cái này!</string> - <string name="warning_on_complete_title">Cảnh báo</string> - <string name="error_on_complete_title">Lỗi</string> <string name="save">Lưu</string> <string name="reserved_value">Giá trị dành riêng</string> - <string name="downloaded_confirm">Bạn có muốn thêm dữ liệu từ mã QR không?</string> - <!--ABOUT--> <string name="about_app">Phiên bản Ứng dụng: %s</string> <string name="about_sdk">Phiên bản SDK: %s</string> @@ -349,131 +228,43 @@ <string name="about_dev">Phát triển và duy trì bởi dự án <a href="https://www.dhis2.org/">DHIS2</a>, thuộc trường Đại học Oslo, <a href="https://www.mn.uio.no/ifi/english/">Khoa Tin học</a>.</string> <string name="about_contact">Để biết thêm thông tin hoặc hỏi về ứng dụng này, vui lòng gửi thư đến <a href="mailto:android@dhis2.org">android@dhis2.org</a></string> - <string name="login_error_null_pass">Chưa nhập mật khẩu. Vui lòng nhập mật khẩu.</string> - <string name="login_error_null_username">Chưa nhập tên đăng nhập. Vui lòng nhập tên đăng nhập.</string> - <string name="login_error_dhis_version">Máy chủ này đang chạy phiên bản dhis khác với phiên bản 2.29. Hãy cập nhật phiên bản máy chủ của bạn hoặc sử dụng môi trường thực nghiệm để tiếp tục.</string> - <string name="login_error_dhis_version_v2">Máy chủ này đang chạy một phiên bản dhis khác với %s. Hãy cập nhật phiên bản máy chủ của bạn hoặc sử dụng môi trường thử nghiệm để tiếp tục.</string> - <string name="login_error_unsuccessful_response">Có gì đó không đúng. Vui lòng kiểm tra lại đường dẫn máy chủ, tên đăng nhập và mật khẩu và thử lại.</string> - <string name="login_error_error_response">Máy chủ không thể hoàn thành yêu cầu này.</string> - <string name="login_error_default">Có vấn đề khi đang đăng nhập vào máy chủ.</string> - <string name="login_error">Lỗi đăng nhập</string> - <string name="missing_mandatory_fields">Các trường dữ liệu bắt buộc bị thiếu</string> - <string name="online_search_unexpected">Xảy ra lỗi không mong muốn khi tìm kiếm trực tuyến</string> - <string name="online_search_parsing_error">Xảy ra lỗi khi chuyển đổi kết quả</string> - <string name="online_search_error">Tìm kiếm trực tuyến trả về lỗi</string> - <string name="online_search_response_error">Có lỗi gì đó trên máy chủ</string> <string name="search_program_not_selected">Chọn một chương trình để đăng ký</string> <string name="search_access_error">Bạn không có quyền cần thiết</string> - <string name="feature_unavaible">Chức năng này chưa hoạt động.</string> - <string name="relationship_label_error">Có lỗi khi lấy nhãn mối quan hệ</string> <string name="all_tei_type">Tất cả %s</string> <string name="invalid_phone_number">Số điện thoại này không hợp lệ</string> - <string name="invalid_email">Email này không hợp lệ</string> - <string name="invalid_negative_number">Chỉ cho phép nhập số âm</string> <string name="invalid_possitive_zero">Chỉ cho phép số nguyên hoặc số 0</string> - <string name="invalid_possitive">Chỉ cho phép số dương</string> - <string name="invalid_interval">Chỉ cho phép giá trị từ 0 đến 1</string> - <string name="invalid_percentage">Chỉ cho phép giá trị từ 0 đến 100</string> - <string name="date_dialog_tigle">Chọn ngày để lọc</string> <string name="select_option">Tùy chọn</string> - <string name="issue_reported">Vấn đề đã được báo cáo</string> - <string name="dialog_generate_new_event">Tạo sự kiện mới</string> - <string name="message_generate_new_event">Bạn có muốn tạo một sự kiện khác?</string> <string name="event_completed_title">Sự kiện đã hoàn tất</string> <string name="event_completed_message">Tất cả các sự kiện trong chương trình này đã hoàn tất. Bạn có muốn đóng chương trình không?</string> - <string name="complete_enrollment_message">Bạn có muốn hoàn tất đăng ký?</string> <string name="complete_enrollment_message_V2">Bạn có muốn hoàn tất %sluôn không?</string> <string name="check_event">Kiểm tra</string> <string name="menu_home">Trang chủ</string> <string name="appwidget_text">VÍ DỤ</string> - <string name="add_widget">Thêm tiện ích</string> <string name="showHelp">Hiện trợ giúp</string> - <string name="tuto_settings_1">Đang đồng bộ dữ liệu của bạn...</string> - <string name="tuto_settings_2">...cấu hình của bạn...</string> - <string name="tuto_settings_3">...cài đặt bao nhiêu hồ sơ có thể tải xuống từ máy chủ...</string> - <string name="tuto_settings_reserved">Kiểm tra và quản lý còn bao nhiêu giá trị dành riêng</string> - <string name="tuto_settings_errors">Kiểm tra kết nối mạng đến máy chủ bị lỗi hay không</string> - <string name="tuto_settings_reset">Giải phóng một ít dung lượng ổ đĩa</string> - <string name="tuto_settings_4">...hoặc xóa tất cả để bắt đầu lại từ đầu.</string> - <string name="tuto_search_1_v2">Tìm kiếm đối tượng theo dõi của bạn tại thiết bị của bạn hoặc trên máy chủ trực tuyến</string> - <string name="tuto_search_2">Bạn có thể đổi sang các chương trình khác.</string> - <string name="tuto_search_3_v2">Tìm kiếm hoặc Thêm đối tượng theo dõi mới. Bạn cần phải tìm kiếm trước khi thêm một đối tượng mới!</string> - <string name="tuto_search_4_v2">Bấm vào đây để xóa các trường dữ liệu và đặt lại thông tin tìm kiếm</string> <string name="tuto_dashboard_1">Đây là bản trình bày dữ liệu của đối tượng theo dõi</string> <string name="tuto_dashboard_2">Xem thông tin hồ sơ của các đối tượng theo dõi...</string> - <string name="tuto_dashboard_3">...Chia sẻ thông tin qua mã QR hoặc SMS...</string> - <string name="tuto_dashboard_4">...Hoặc đánh dấu đối tượng để theo dõi</string> - <string name="tuto_dashboard_5">Bấm để tạo hoặc đặt lịch cho một sự kiện hoặc giới thiệu đến một đơn vị khác.</string> <string name="tuto_dashboard_6">Tại đây bạn sẽ thấy tất cả các sự kiện. Bấm để xem chi tiết một sự kiện.</string> <string name="tuto_dashboard_7">Thao tác điều hướng trong trình đơn để Thêm mối quan hệ, Xem chỉ số hoặc Viết ghi chú</string> - <string name="tuto_dashboard_8">Bấm vào đây để xem tất cả các đăng ký của đối tượng theo dõi hoặc đăng ký mới.</string> - <string name="tuto_tei_event_1">Bấm để xóa sự kiện này. Hành động này không thể hoàn tác.</string> - <string name="tuto_tei_event_2">Hoàn tất sự kiện.</string> - <string name="tuto_program_event_1">Tất cả các sự kiện liên quan tới chương trình này sẽ được liệt kê ở đây.</string> - <string name="tuto_program_event_2">Bấm để thêm một sự kiện mới</string> <string name="tuto_event_initial_new_1">Nhập tất cả dữ liệu để tạo sự kiện</string> <string name="tuto_event_initial_1">Bấm để kiểm tra trạng thái hoàn tất sự kiện</string> - <string name="tuto_event_summary">Bấm để Hoàn tất hoặc Mở-lại sự kiện</string> - <string name="tuto_main_7">Đọc và lưu thông tin từ thiết bị khác bằng QR</string> - <string name="tuto_main_8">Đồng bộ dữ liệu của bạn với máy chủ</string> - <string name="tuto_main_9">Khóa phiên đăng nhập với mã 4 ký tự số. Đừng quên mã của bạn!</string> - <string name="tuto_main_10">Đăng xuất để thay đổi tên đăng nhập hoặc máy chủ. Bạn vẫn sẽ có thể đăng nhập lại thậm chí khi không có kết nối mạng.</string> - <string name="text_plus_colon">%s:</string> <string name="relationships">mối quan hệ</string> <string name="empty_tei_add">Không có sự kiện đã đăng ký, bấm vào \"+\" để thêm một sự kiện mới.</string> - <string name="empty_tei_no_add">Không có sự kiện được đăng ký</string> <string name="qr_data_values">Giá trị dữ liệu</string> <string name="info">Thông tin</string> <string name="qr_no_id_error">Không thể đọc được mã nhận dạng này</string> <string name="delete_local_data">Xóa dữ liệu nội bộ</string> <string name="dashboard_overview">Tổng quan</string> - <string name="dashboard_relationships">Mối quan hệ</string> - <string name="dashboard_indicators">Chỉ số</string> - <string name="dashboard_analytics">Phân tích</string> <string name="empty_indicators">Không có chỉ số cho chương trình này.</string> - <string name="dashboard_notes">Ghi Chú</string> - <string name="unable_to_complete">Không thể hoàn tất</string> - <string name="unable_to_save">Không thể lưu</string> - <string name="warnings_in_form">Có cảnh báo trong biểu nhập.</string> - <string name="what_to_do">Bạn muốn làm gì?</string> - <string name="field_errors">Một số trường dữ liệu có lỗi. Vui lòng kiểm tra chúng để có thể hoàn tất.</string> <string name="unselect_enrollment">Tất cả đăng ký</string> <string name="unselect_enrollment_description">Bảng hiển thị dữ liệu với tất cả chương trình đang hoạt động</string> - <string name="CHECK_SYNC_ERRORS">Mở lịch sử lỗi đồng bộ</string> <string name="error_dialog_title">Lịch sử lỗi đồng bộ</string> <string name="share_with">Chia sẻ với...</string> - <string name="errors_during_sync">Đồng bộ cấu hình của bạn thất bại. Có thể có lỗi nào đó trong máy chủ của bạn. Bấm vào đây để biết thêm chi tiết</string> - <string name="sectionSelectorPrev">TRƯỚC</string> - <string name="sectionSelectorNext">SAU</string> - <string name="event_overview">Chi tiết</string> - <string name="event_indicators">Chỉ số</string> - <string name="event_notes">Ghi Chú</string> - <string name="complete_add_new"><![CDATA[Hoàn tất & thêm mới]]></string> - <string name="complete_later">Hoàn tất sau</string> - <string name="finish_add_new"><![CDATA[Lưu và Thêm mới]]></string> - <string name="finish">Lưu</string> - <string name="error_fields_title">Các trường dữ liệu có lỗi</string> - <string name="error_fields_events">Một số trường dữ liệu có lỗi. Chúng chưa được lưu. Xin vui lòng kiểm tra lại.</string> <string name="unique_warning">Giá trị phải là duy nhất, có một giá trị bị trùng. Nó chưa được lưu lại. Xin vui lòng kiểm tra. </string> - <string name="unique_coincidence_found">Có một sự trùng lặp trong trường duy nhất. Xin vui lòng kiểm tra lại biểu nhập để lưu Đăng ký này. </string> <string name="please_wait">Xin vui lòng đợi</string> <string name="skip">Bỏ qua</string> - <string name="reschedule">Sửa lịch hẹn</string> <string name="no_intructions">Không có thông tin cho màn hình này</string> - <string name="event_overdue">Quá hạn</string> - <string name="unsupported_program_rule">Có một quy tắc chương trình không được hỗ trợ. Vui lòng kiểm tra tài liệu.</string> - <string name="empty_description">Không có thông tin cho trường dữ liệu này</string> - <string name="biometrics_dialog_title">Xóa hết thông tin đăng nhập</string> - <string name="biometrics_first_use_text">Để có thể đăng nhập bằng cách sử dụng máy quét dấu vân tay, trước tiên bạn cần phải sử dụng cách mặc định.</string> - <string name="biometrics_security_title">Bảo mật sinh trắc học</string> - <string name="biometrics_login_title">Đăng nhập nhanh</string> - <string name="biometrics_login_text">Bạn có muốn sử dụng dấu vân tay của bạn hoặc phương thức sinh học khác để đăng nhập không?</string> - <string name="tab_tables">Bảng</string> - <string name="table">Bảng</string> - <string name="login_https">https://</string> <string name="delete_local_data_message">Dữ liệu đã đồng bộ sẽ không bị mất. Bạn có muốn tiếp tục không?</string> - <string name="local_data_accept">Chấp nhận</string> <string name="delete_local_data_error">Không thể xóa dữ liệu. Vui lòng thử lại.</string> <string name="delete_local_data_done">Đã xóa dữ liệu cục bộ thành công</string> <string name="org_unit_selection_warning">Phải chọn ít nhất một đơn vị</string> @@ -486,6 +277,7 @@ <string name="action_agree">Đồng ý</string> <string name="action_continue">Tiếp tục</string> <string name="login_server_info_title">Đường dẫn đến máy chủ</string> + <string name="login_server_info_message">Nhập đường dẫn liên kết đến máy chủ DHIS 2 với đơn vị được cung cấp bởi quản lý của bạn.\n\n Hoặc bạn có thể quét mã QR có chứa đường dẫn liên kết đến máy chủ.</string> <string name="forgot_your_code">Bạn đã quên mã của bạn phải không?</string> <string name="event_form_end_options_title">Bạn muốn làm gì với sự kiện này?</string> <string name="sectionSelectorEnd">KẾT THÚC</string> @@ -496,33 +288,16 @@ <string name="state_uploading">Đang tải lên</string> <string name="state_relationship">Mối quan hệ</string> <string name="sent_by_sms">Đã gửi bằng SMS</string> - <string name="no_conflicts_message">Không có xung đột trong trường trình này</string> - <string name="network_unavailable_sms">Không có kết nối mạng, nhưng dường như có dịch vụ điện thoại - bạn có thể sử dụng SMS.</string> - <string name="network_unavailable">Không có kết nối mạng</string> <string name="action_close">Đóng</string> <string name="tuto_main_11">Bây giờ bạn có thể kiểm tra thông tin đồng bộ bằng cách bấm vào đây</string> - <string name="no_conflicts_update_message">Dữ liệu này chỉ được lưu trong thiết bị của bạn, nó chưa được đồng bộ lên máy chủ.</string> - <string name="no_conflicts_synced_message">Bạn đã được cập nhật! Tất cả dữ liệu của bạn đã gửi đến máy chủ.</string> <string name="relationship_error_recursive">Bạn không thể liên kết một hồ sơ với chính nó</string> - <string name="unblock_session">Mở khóa phiên đăng nhập</string> - <string name="data_set_complete">Hoàn tất</string> - <string name="data_set_open">Mở</string> - <string name="unsupported_value_type">Không hỗ trợ kiểu giá trị này</string> <string name="change_calendar_view">Thay đổi xem lịch</string> - <string name="data_every_fifteen_minutes">15 Phút</string> - <string name="data_every_hour">Mỗi Giờ</string> - <string name="data_every_day">Hàng ngày</string> - <string name="data_every_week">Hàng tuần</string> - <string name="period_week">Tuần</string> - <string name="sync_setting">Cài đặt đồng bộ: %s</string> <string name="relationship_without_enrollment">Hồ sơ bạn đang truy suất không có đăng ký. Bạn không thể mở bảng trình bày dữ liệu</string> <string name="formatting_error">Lỗi định dạng</string> <string name="dashboard_menu_delete_tei_v2">Xóa %s</string> <string name="delete_authority_error">Bạn không có quyền để xóa dữ liệu này</string> - <string name="validation_url">Đường dẫn liên kết không đúng</string> <string name="adjusting_form">Đang điều chỉnh biểu nhập...</string> - <string name="sms_receiver_number">Số người nhận</string> <string name="sms_amount_question">Bạn có chấp nhận gửi %dtin nhắn không?</string> <string name="sms_sending">Đang gửi %1$d/%2$d</string> <string name="sms_waiting_amount_confirm">Đang đợi xác nhận số lượng - %d</string> @@ -540,51 +315,29 @@ <string name="sms_error_no_gateway_set">Không cài đặt cổng</string> <string name="sms_error_no_user_login">Người dùng chưa đăng nhập</string> <string name="sms_error_module_disabled">Mô đung SMS bị tắt</string> - <string name="sms_error_ongoing_sunmission">Đang nộp SMS khác</string> <string name="sms_metadata_empty">Mô đun SMS không được khởi tạo, không tìm thấy siêu dữ liệu yêu cầu.</string> - <string name="sms_completed">Hoàn tất</string> <string name="sms_count_error">Đếm SMS không được chấp nhận</string> <string name="sms_state_started">Đã Nộp SMS</string> <string name="sms_state_converted">Đọc và chuyển đổi dữ liệu. Mã nộp : %d</string> - <string name="sms_general_error">Lỗi khi gửi sms</string> <string name="sms_title_enrollment">SMS đăng ký đối tượng theo dõi</string> <string name="sms_title_event">SMS nộp sự kiện</string> <string name="sms_title_data_set">SMS nộp biểu nhập</string> - <string name="sms_bar_state_starting">Đang bắt đầu</string> - <string name="sms_bar_state_sending">Đang tiến hành</string> - <string name="sms_bar_state_sent">Đã gửi</string> - <string name="sms_bar_state_failed">Thất bại</string> - <string name="start_sync_granular">Đang bắt đầu đồng bộ</string> <string name="syncing">Đang đồng bộ...</string> - <string name="end_sync_granular">Đồng bộ đã hoàn tất.</string> - <string name="error_sync">Lỗi đã xảy ra trong khi đồng bộ.</string> - <string name="error_sync_check_logs">Có một lỗi đã xảy ra trong khi đồng bộ. Bấm vào đây để kiểm tra nhật ký lỗi.</string> - <string name="cancel_sync">Đã hủy đồng bộ</string> <string name="copied_text">Đã sao chép</string> - <string name="image_selected">Hình ảnh đã chọn</string> - <string name="show_in_map">Hiển thị trong bản đồ</string> - <string name="show_list">Hiển thị danh sách</string> <!--region TRACKER IMPORT CONFLICT MESSAGES--> - <string name="value_required_but_not_provided">%slà bắt buộc nhưng chưa được cung cấp.</string> - <string name="polygon_captured">Đã thêm bản đồ ranh giới</string> <string name="polygon">Bản đồ ranh giới</string> <!--endregion--> - <string name="fingerprint_title">Vân tay</string> - <string name="fingerprint_message">Vui lòng đặt ngón tay của bạn lên chỗ đọc dấu vân tay</string> <string name="security_title">Bảo mật</string> <string name="security_rooted_message">Vì lí do bảo mật, phiên bản này của ứng dụng không cho phép sử dụng trong các thiết bị nguồn. Vui lòng sử dụng phiên bản đào tạo. </string> - <string name="fix_error">Có một số lỗi. Vui lòng sửa chúng trước khi tiếp tục.</string> <string name="filters_active">Đang áp dụng các bộ lọc</string> <string name="filters_disabled">Không có bộ lọc nào được áp dụng</string> <string name="filters_title_period">Thời điểm</string> <string name="filters_title_org_unit">Đơn vị</string> - <string name="filters_title_sorting">Đang sắp xếp thứ tự</string> - <string name="filters_title_status">Trạng thái</string> <string name="filters_title_state">Đồng bộ</string> <string name="filters_title_assigned">Đã gán cho tôi</string> <string name="filter_period_today">Hôm Nay</string> @@ -599,8 +352,6 @@ <string name="filter_period_form_to">Từ - Đến</string> <string name="filter_period_other">Khác</string> <string name="filter_period_any">Bất cứ khi nào</string> - <string name="data_values_error_sync_message">Lỗi đồng bộ. Kiểm tra giá trị dữ liệu để sửa vấn đề và thử lại. Nếu nó vẫn bị lỗi, hãy liên lạc quản lý của bạn.</string> - <string name="sms_synced_message">Dữ liệu này đã được gửi đến máy chủ nhưng nó không đảm bảo đã được lưu trữ</string> <string name="filter_event_status_open">Mở</string> <string name="filter_event_status_schedule">Lịch hẹn</string> <string name="filter_event_status_overdue">Quá hạn</string> @@ -616,7 +367,6 @@ <string name="sms_empty_gateway">Cổng SMS không được để trống</string> <string name="granular_sync_enrollments_empty">Không có đăng ký để tải lên</string> <string name="granular_sync_unsupported_task">Nhiệm vụ chuyển đổi này không hỗ trợ</string> - <string name="disable_pin_locked">Không hiển thị lại màn hình khóa</string> <string name="set_pin">Cài đặt mã pin</string> <string name="conflict">Xung đột</string> <string name="change_event_date">Thay đổi ngày</string> @@ -641,11 +391,7 @@ <string name="choose_ou">Chọn đơn vị</string> <string name="enter_url">Nhập đường dẫn liên kết</string> <string name="enter_value">Nhập giá trị</string> - <string name="choose_image">Chọn hình ảnh</string> - <string name="scan_code">Mã scan</string> - <string name="choose_option">Chọn tùy chọn</string> <string name="reserved_values_hint">Các giá trị dành riêng đã tải xuống cho mỗi thuộc tính Đối Tượng Theo Dõi</string> - <string name="settings_reserved_values_message">Các giá trị dành riêng đã tải xuống cho mỗi thuộc tính Đối Tượng Theo Dõi</string> <string name="reserved_values_left">Còn %s giá trị dành riêng</string> <string name="manage_reserved_values_button">Quản lý giá trị dành riêng</string> <string name="events_to_download">Sự kiện để tải xuống</string> @@ -665,55 +411,29 @@ <string name="filter_sync_not_synced">Chưa đồng bộ</string> <string name="filter_sync_error">Lỗi đồng bộ</string> <string name="filter_sync_sms">Đã đồng bộ SMS</string> - <string name="dataset_overview">Chi tiết</string> - <string name="dataset_comments">Ghi chú</string> <string name="saved">Đã lưu!</string> - <string name="run_validation_rules">Ban có muốn kiểm tra chất lượng dữ liệu không?</string> - <string name="validation_success_title">Mọi thứ đều ổn!</string> - <string name="mark_dataset_complete">Bạn cũng muốn hoàn tất biểu nhập phải không?</string> - <string name="dataset_completed">Đánh dấu đã hoàn tất</string> - <string name="name">Tên</string> - <string name="formula">Công thức</string> - <string name="complete_anyway">Hoàn tất luôn</string> <string name="fk_message">Thiếu %s %s từ %s %s</string> <string name="filters_title_event_status">Trạng thái sự kiện</string> - <string name="enrollment_date">Ngày đăng ký</string> <string name="dataset_empty_list_can_create">Không có dữ liệu. Bấm \"+\" để tạo hồ sơ mới.</string> <string name="dataset_emtpy_list_can_not_create">Không có dữ liệu. Bạn không có quyền để tạo hồ sơ mới.</string> <string name="validation_rules_empty_description">Không có mô tả hoặc hướng dẫn được cung cấp</string> <string name="validation_rules_data_to_review">Dữ liệu để xem xét</string> - <string name="dataset_saved_completed">Đã lưu và Hoàn tất!</string> <string name="status_change_error_active_exist">Có 1 đăng ký đang hoạt động</string> <string name="enrollment_status_active">Mở</string> <string name="enrollment_status_completed">Hoàn tất</string> <string name="enrollment_status_cancelled">Đã hủy</string> - <string name="event_data">Dữ liệu</string> <string name="download_tei_error">%s đã chọn không thể tải xuống</string> - <string name="completed_by">Đã hoàn tất được %s: %s</string> - <string name="updated_time">Đã cập nhật: %s</string> - <string name="action_done">Hoàn thành</string> - <string name="validation_internal_error_datasets">Chúng tôi không thể kiểm tra chất lượng dữ liệu. Hãy liên hệ quản lý của bạn.</string> - <string name="are_you_sure">Bạn có chắc chắn không?</string> - <string name="reopen_question">Bạn có muốn mở-lại biểu nhập này không?</string> <string name="filters_title_date">Ngày</string> - <string name="filters_title_event_date">Ngày sự kiện</string> - <string name="tei_type_has_no_attributes">%s không có các thuộc tính công khai. Vui lòng chọn một chương trình.</string> <string name="privacy_policy_title">Chính Sách Bảo Mật</string> <string name="open_privacy_policy">Bấm vào đây để kiểm tra<a href="">chính sách bảo mật</a></string> <string name="coordinates_error">Giá trị tọa độ không đúng</string> + <string name="break_glass_error_v2">Bạn không thể đăng ký %stừ đơn vị khác vào chương trình này bởi vì nó được bảo vệ.\n Hãy liên hệ quản lý của bạn.</string> <string name="field_is_mandatory">Trường dữ liệu này bắt buộc</string> <string name="security_debugger_message">Vì lí do bảo mật, phiên bản ứng dụng này không cho phép sử dụng với adb. Vui lòng sử dụng phiên bản đào tạo.</string> <string name="customactivityoncrash_error_activity_restart_app">Quay lại</string> - <string name="customactivityoncrash_error_activity_close_app">Đóng ứng dụng</string> - <string name="customactivityoncrash_error_activity_error_details">Thêm chi tiết</string> - <string name="customactivityoncrash_error_activity_error_details_title">Thêm chi tiết</string> - <string name="customactivityoncrash_error_activity_error_details_close">Đóng</string> <string name="customactivityoncrash_error_activity_error_details_copy">Sao chép vào bộ nhớ tạm</string> - <string name="customactivityoncrash_error_activity_error_details_copied">Đã sao chép vào bộ nhớ tạm</string> - <string name="customactivityoncrash_error_activity_error_details_clipboard_label">Thông tin lỗi</string> <string name="metada_first_sync_error">Chúng tôi đã tìm thấy một lỗi khi đang đồng bộ với máy chủ của bạn. Hãy chia sẻ lỗi này với quản lý của bạn nếu có thể.</string> - <string name="error_init_session">Chúng ta không thể khởi đầu phiên đăng nhập bằng tên đăng nhập của bạn</string> <string name="enrollment_date_edition_warning">Có các sự kiện đã lên kế hoạch mà sẽ không chỉnh sửa lịch hẹn.</string> <string name="section_charts">Biểu đồ</string> <string name="navigation_list_view">Danh sách</string> @@ -764,47 +484,26 @@ <string name="section_feedback">Phản hồi</string> <string name="section_indicators">Chỉ Số</string> <string name="camera_permission_denied">Quyền mở máy ảnh bị từ chối..\nBạn cần bật tính năng máy ảnh để sử dụng chức năng này.</string> - <string name="value">Giá trị</string> <string name="section_charts_indicators">Biểu đồ và Chỉ số</string> <string name="take_photo">Chụp ảnh</string> - <string name="from_gallery">Chọn từ thư viện ảnh</string> - <string name="data_set_quality_check_done">Hoàn thành!</string> <string name="break_glass_dialog_title">Chương trình này đã được bảo vệ</string> <string name="break_glass_hint">Mô tả lý do ở đây</string> - <string name="authenticating">Đang xác thực</string> - <string name="login_error_no_dhis_instance">Đường dẫn liên kết đã cung cấp không phải là đường dẫn đến máy chủ DHIS2</string> - <string name="login_error_bad_credentials">Sai thông tin đăng nhập </string> - <string name="login_error_unknown_host">Máy chủ không xác định</string> - <string name="invalid_integer">Giá trị phải là số nguyên</string> <string name="openid_session_expired">Phiên đăng nhập đã hết hạn</string> <string name="openid_session_expired_message">Phiên đăng nhập của bạn đã hết hạn. Vì lý do bảo mật, bạn cần cung cấp thông tin đăng nhập lại. </string> - <string name="dataset_column_default">Giá trị</string> <string name="week_period_span_default_label">Tuần 1%d 2%s đến 2%s</string> <string name="action_do_not_show_again">Không hiển thị lại</string> <string name="feature_configuration">Cấu hình chức năng</string> <string name="show_radar_graph">Xem Radar</string> - <string name="coordinate_feature_type_error">Không thể cài đặt kiểu tọa độ</string> <string name="filter_follow_up_label">Đã theo dõi %s</string> - <string name="wrong_date_format">%s không thể chuyển đổi thành Ngày</string> <string name="update_field_error">Không thể cập nhật trường dữ liệu này. Xin vui lòng thử lại.</string> - <string name="edition">Chỉnh sửa</string> - <string name="available">Hiện có</string> <string name="blocked_by_completion">Không thể chỉnh sửa dữ liệu này bởi vị chúng được đánh dấu đã hoàn tất</string> <string name="edition_expired">Không thể chỉnh sửa dữ liệu này bởi vì thời gian chỉnh sửa đã hết hạn</string> <string name="edition_no_write_access">Bạn không có quyền chỉnh sửa dữ liệu này</string> <string name="event_date_not_in_orgunit_range">Dữ liệu này không thể sửa bởi vì đơn vị đã bị đóng</string> <string name="edition_no_catcombo_access">Bạn không có quyền chỉnh sửa dữ liệu này</string> - <string name="edition_orgunit_capture_scope">Bạn không thể chỉnh sửa dữ liệu từ đơn vị này</string> - <string name="reload_list">Đặt lại Tìm Kiếm</string> + <string name="edition_orgunit_user_scope">Bạn không thể chỉnh sửa dữ liệu từ đơn vị này</string> <string name="error_tei_online_search_title">Tìm kiếm trực tuyến trả về tin nhắn sau: </string> - <string name="program_rules_loop_warning_title">Cảnh báo quy tắc chương trình</string> - <string name="program_rules_loop_warning_message">Có một vấn đề cấu hình gây ra một vòng lặp trong các quy tắc chương trình. Hãy liên lạc với quản lý của bạn.</string> - <string name="granular_sync_refresh">LÀM MỚI</string> - <string name="unknown_date">Không rõ</string> - <string name="granular_sync_refresh_title">Làm mới lại tất cả dữ liệu</string> - <string name="max_accounts_text">Bạn đã đạt số lượng tài khoản tối đa (%d). Để tạo thêm tài khoản, hãy đăng nhập và xóa một trong những tài khoản của bạn.</string> <string name="delete_account">Xóa Tài khoản</string> - <string name="manage_accounts">Quản lý Tài Khoản</string> <string name="main_menu_troubleshooting">Xử lý sự cố cấu hình</string> <string name="troubleshooting_language_title">Ngôn ngữ</string> <string name="troubleshooting_language_description">Bấm vào đây để thay đổi ngôn ngữ của ứng dụng</string> @@ -823,9 +522,7 @@ <string name="search_no_results">Không có kết quả cho tìm kiếm này</string> <string name="search_too_many_results">Có quá nhiều kết quả</string> <string name="search_too_many_results_message">Thử thay đổi tìm kiếm của bạn để thu hẹp kết quả.</string> - <string name="search_create_new">Tạo mới</string> <string name="search_new_te_type">%sMới</string> - <string name="search_min_attributes_message">Cần phải nhập ít nhất %sthuộc tính để tìm kiếm</string> <string name="action_ok">Ok</string> <string name="init_search">Mở trang tìm kiếm để tìm bất cứ %snào</string> <string name="search_or_create">Bạn có thể tìm kiếm hoặc tạo một %smới</string> @@ -834,7 +531,6 @@ <string name="missing_error_fields_events">Một số trường dữ liệu có lỗi và chưa được lưu. \nBạn có muốn xem lại biểu nhập không\?</string> <string name="event_can_be_completed">Bạn có muốn đánh dấu biểu nhập này là hoàn tất không?</string> <string name="event_error_on_complete">Bạn có một số tin nhắn lỗi.\nBạn có muốn xem không\?</string> - <string name="changes_will_be_discarted">Nếu bạn tắt bây giờ, tất cả thay đổi sẽ bị hủy bỏ.</string> <string name="re_opened">Đã Mở-lại</string> <string name="account_disable_title">Tài khoản đã bị vô hiệu hóa</string> <string name="account_disable_message">Tài khoản của bạn đã bị vô hiệu hóa bởi quản lý chương trình.</string> @@ -844,27 +540,10 @@ <string name="customactivityoncrash_error_activity_current_date">Ngày hiện tại: %s</string> <string name="customactivityoncrash_error_activity_device">Thiết bị: %s</string> <string name="customactivityoncrash_error_activity_os_version">Phiên bản hệ điều hành: %s</string> - <string name="open_details">Mở chi tiết %s</string> - <string name="tracked_entity_type_details">Chi tiết %s</string> <string name="syncing_resource">Đang đồng bộ %s...</string> - <string name="sms_sync_waiting_for_response">Đã gửi SMS. Đang đợi máy chủ trả lời</string> - <string name="sms_sync_sms_reached_server">Đã xác nhận SMS đến máy chủ. Đang cập nhật Trạng Thái</string> - <string name="sms_sync_sms_reached_server_error">Chúng tôi không thể xác nhận SMS đến máy chủ hay chưa. Đang cập nhật trạng thái</string> - <string name="sms_sync_sent">Đã gửi SMS. Đang cập nhật trạng thái.</string> - <string name="sms_sync_not_sent">Chưa gửi SMS.</string> - <string name="sms_sync_opening_app">Đang mở ứng dụng SMS. Xin vui lòng không chỉnh sửa tin nhắn.</string> <string name="sms_sync_sms_app_chooser_title">Gửi SMS với</string> <string name="sms_sync_is_sms_sent">Bạn đã gửi SMS chưa?</string> - <string name="sms_sync_manual_confirmation">Đang đợi xác nhận thủ công</string> - <string name="syncing_events">Đang đồng bộ các sự kiện</string> - <string name="syncing_teis">Đang đồng bộ các đối tượng theo dõi</string> - <string name="syncing_data_sets">Đang đồng bộ các tập dữ liệu</string> - <string name="syncing_resources">Đang đồng bộ tài nguyên</string> - <string name="syncing_done">Đồng bộ hoàn tất</string> - <string name="sms_available_for_individual_records">Đồng bộ SMS đang hiển thị nhưng phải được truy suất từng hồ sơ cá nhân</string> <string name="downloading_image_resources">Đang tải hình ảnh...</string> - <string name="program_description">Mô tả chương trình</string> - <string name="wrong_pin">Sai mã pin</string> <string name="enrolledIn">Đã đăng ký trong</string> <string name="ownedBy">Sở hữu bởi</string> <string name="sync_dialog_title_not_synced">Cần được đồng bộ</string> @@ -884,18 +563,11 @@ <string name="sync_dialog_action_refresh">Làm mới</string> <string name="sync_dialog_action_not_now">Không phải bây giờ</string> <string name="tap_to_explore_action">Bấm vào đây để xem thêm</string> - <plurals name="error_count_label"> - <item quantity="other">Các lỗi %s</item> - </plurals> - <plurals name="warning_count_label"> - <item quantity="other">Các cảnh báo %s</item> - </plurals> <string name="new_version_message">Phiên bản ứng dụng <b>%s</b> đang có. Bạn có muốn tải nó không?</string> <string name="software_update">Cập nhật phần mềm</string> <string name="remind_me_later">Để sau</string> <string name="download_now">Tải xuống ngay</string> <string name="check_for_updates">Kiểm tra các cập nhật</string> - <string name="checking_for_updates">Đang kiểm tra các cập nhật</string> <string name="no_updates">Không có cập nhật mới</string> <string name="app_version">Phiên bản ứng dụng</string> <string name="error_applying_rule_effects">Có lỗi trong cấu hình chương trình, chúng tôi không thể tải sự kiện này. Xin vui lòng liên hệ quản trị hệ thống của bạn.</string> @@ -932,8 +604,6 @@ <string name="program_stage">Giai Đoạn Chương Trình</string> <string name="event">sự kiện</string> <string name="timeline">Dòng thời gian</string> - <string name="clear_search">Bỏ tìm kiếm</string> - <string name="optional">Không bắt buộc</string> <string name="database_export_downloaded">Cơ sở dữ liệu đã được tải về</string> <string name="importing_database">Đang nhập cơ sở dữ liệu</string> <string name="show_more">Hiện thêm</string> @@ -956,4 +626,15 @@ <string name="successfully_transferred">Đã chuyển thành công</string> <string name="event_cancelled">%1$s đã hủy</string> <string name="due_date_updated">Ngày đến hạn đã được cập nhật</string> - </resources> + <plurals name="error_count_label"> + <item quantity="other">Các lỗi %s</item> + </plurals> + + <plurals name="warning_count_label"> + <item quantity="other">Các cảnh báo %s</item> + </plurals> + + <plurals name="settings_specific_programs"> + <item quantity="other">Có %s chương trình với các cài đặt riêng</item> + </plurals> +</resources> diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 8371a7a180e..37f60f48ed7 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -1,63 +1,28 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!--GENERAL--> <string name="app_name">DHIS2</string> - <string name="logo_text">区域健康信息系统</string> - <string name="logo_number">2</string> <!-- Warnings and error messages --> <string name="error">错误</string> - <plurals name="error_message"> - <item quantity="other">失误</item> - </plurals> - <string name="error_wrong_server_url">服务器URL错误</string> - <string name="error_wrong_credentials">证书不正确</string> - <string name="error_unexpected_error">未知错误</string> - <string name="error_internal_server_error">服务器内部错误</string> - <string name="no_value">无值</string> <string name="no_reserved_values">没有更多保留值,请联系管理员</string> - <string name="no_reserved_values_connection">没有更多保留值,连接网络重新填充他们</string> - <string name="errors">错误</string> <string name="something_wrong">出了些问题</string> <!-- SyncService strings: --> - <string name="sync_now">现在同步</string> - <string name="sync_text">与服务器同步中</string> - <string name="sync_title">同步</string> - <string name="sync_metadata">元数据</string> <string name="sync_events">事件</string> - <string name="sync_tei">跟踪的实体</string> - - <string name="sync_complete_title">已完成</string> - <string name="sync_complete_text">同步完成</string> <string name="sync_error_title">同步错误</string> <string name="sync_error_text">同步中发生错误,请重试</string> <string name="sync_incomplete_error_text">同步完成,但我们没有收到所有记录的服务器确认。这些记录在应用程序中仍被标记为“离线”状态。我们建议重试同步。</string> - <string name="data_sync_warning_program">警告:你的大多数数据已经同步,但是有些字段存在冲突,同步你的配置再试。如果警告仍然存在,检查你的同步状态:项目、跟踪实体和事件如果有冲突会标记为@。</string> - <string name="server_sync_error">发生错误,服务器未响应。与您的管理员联系。</string> - - <string name="search_result_text">发现结果:1%s</string> - <string name="add_new">新加</string> - <string name="add">添加</string> <string name="enter_event_data">输入%s</string> <string name="enter_cancel_event_data">输入/跳过 %s</string> - <string name="schedule_new">新调度</string> <string name="referral">流转</string> <!-- Login --> - <string name="url_hint">服务器URL</string> - <string name="user_hint">用户名</string> - <string name="password_hint">口令</string> - <string name="log_in_button">登录</string> - <string name="unlock_button">解锁会话</string> <string name="syncing_configuration">同步你的配置</string> <string name="syncing_data_shortly">你的数据很快会被同步</string> <string name="syncing_data">同步你的数据</string> <string name="configuration_ready">你的配置已经准备好</string> <string name="data_ready">你的数据已经准备好</string> - <string name="configuration_sync_failed">配置同步失败</string> - <string name="data_sync_failed">数据同步失败</string> <string name="account_recovery">账号恢复</string> - <string name="no_network_to_recover_account">需要网络连接才能恢复您的帐户。</string> <!--PERIOD--> <string name="DAILY">每天</string> @@ -78,138 +43,87 @@ <string name="enter_text">输入文本</string> <string name="enter_long_text">输入长文本</string> <string name="enter_number">输入数字</string> - <string name="enter_integer">输入整数</string> <string name="enter_negative_integer">输入负整数</string> <string name="enter_positive_integer_or_zero">输入正整数或零</string> <string name="enter_positive_integer">输入正整数</string> - <string name="filter_options">过滤选项</string> <string name="choose_date">选择日期</string> - <string name="change_calendar">改变日历</string> <!-- Status --> - <string name="program_completed">项目已经完成</string> - <string name="program_inactive">项目不活跃</string> <string name="event_open">开放</string> <string name="event_not_completed">没完成</string> <string name="event_completed">事件完成</string> <string name="read_only">只读</string> - <string name="finish_and_complete">完成</string> <string name="completed">已完成</string> <string name="cancelled">已取消</string> <string name="re_open">重新打开</string> - <string name="re_open_form">重新打开表单</string> - <string name="activate">激活</string> <string name="active">活跃的</string> <!-- State --> <string name="state_synced">同步</string> <string name="state_to_post">发送</string> <string name="state_to_update">更新</string> - <string name="state_to_delete">删除</string> <string name="state_error">错误</string> - <string name="action_sync">同步</string> - <string name="action_send">发送</string> - <string name="action_sync_sms">同步短信</string> <!--Completion--> - <string name="completion">完成</string> <!--Event initial--> - <string name="create">创建</string> <string name="update">更新</string> - <string name="date">日期</string> <string name="org_unit">机构</string> <string name="no_org_units">选择的日期没有开放的机构,请选择另外的日期或机构</string> - <string name="category_option">分类选项</string> <string name="latitude">维度</string> <string name="longitude">经度</string> - <string name="new_event">新事件</string> - <string name="one_time">一次</string> - <string name="permanent">永远</string> <!--DataSet initial--> <string name="report_period">报告期间</string> - <string name="cat_option">采集选项</string> - <string name="field_required">如果你设置值,整行的值需要设置才能完成数据集。</string> - <string name="field_mandatory">一些必需的值缺失,你需要设置强制的值才能完成数据集。</string> - <string name="field_mandatory_v2">有强制字段请填充后完成数据集</string> - <string name="datavalue_saved">值已被保存</string> - <string name="there_is_no_available_period">没有可用期间可选</string> <!--Event Detail--> <string name="due_date">到期日期</string> <string name="next_event">下一页%1$s</string> <string name="cat_combo">分类选择框</string> - <string name="date_default">DD/MM/YYYY</string> <string name="cancel">取消</string> <string name="delete">删除</string> - <string name="total">总共</string> <string name="most_recent_event_date">最近事件日期</string> <string name="no_options">无可用选项</string> <!--TEI Enrollment list--> <string name="enrollment_list">登记清单</string> <string name="active_programs">活动项目</string> - <string name="to_enroll_programs">注册的项目</string> <string name="enroll">注册</string> - <string name="last_visit">上次访问:</string> - <string name="apply">应用</string> <!--TEI DASHBOARD--> - <string name="see_details">查看详情</string> - <string name="view_more">更多</string> <string name="edit">编辑</string> - <string name="follow_up">后续跟踪</string> - <string name="follow_up_enabled">使能后续跟踪</string> - <string name="follow_up_disabled">后续跟踪关闭</string> <string name="deactivate">去活</string> <string name="program_not_allow_events">该项目不允许更多事件</string> <!--DONE TASKS--> - <string name="events_no_data">无数据</string> <string name="events">事件</string> <string name="done_task">首页</string> - <string name="app_info">应用信息</string> <string name="log_out">退出</string> - <string name="block_session">阻止会话</string> <string name="show_more_events">显示%s更多…</string> <string name="show_less_events">显示较少…</string> <!-- SYNC --> - <string name="a_minute">1分钟</string> - <string name="fifteen_minute">15分钟</string> <string name="thirty_minutes">30分钟</string> <string name="a_hour">一小时</string> <string name="every_6_hours">六小时</string> <string name="a_day">一天(缺省)</string> <string name="every_12_hours">12小时</string> - <string name="Automatic_Sync_Data">自动同步数据 每:</string> <string name="Manual">手工</string> - <string name="Automatic_Sync_Metadata">自动同步配置 -每:</string> <string name="a_week">一周</string> <string name="sync_max_parameters">当前同步参数</string> <string name="sync_default_parameters">复位缺省值</string> + <string name="wipe_data_meesage">数据库将被删除,\n 你将被要求再次登录。</string> <string name="wipe_data_ok">接受</string> <string name="wipe_data_no">取消</string> <string name="SYNC_DATA">现在同步数据</string> <string name="SYNC_META">现在同步配置</string> <string name="SYNC_MANAGER">设置</string> - <string name="last_data_sync_date">上次同步:1%s</string> - <string name="last_metadata_sync_date">上次同步:%s</string> <string name="refill_reserved_values">重新填充</string> - <string name="settings_sms_module_title">短信模块:</string> <string name="settings_sms_receiver_number">短信网关</string> <string name="settings_sms_result_sender_number">短信结果发送者</string> <string name="settings_sms_result_timeout">SMS 结果超时(秒)</string> - <string name="settings_sms_result_timeout_hint">秒</string> - <string name="settings_sms_result_sender_hint">数量</string> - <string name="settings_sms_receiver_number_hint">数量</string> <string name="settings_sms_module_switch">激活短信提交</string> <string name="settings_sms_response_wait_switch">等待短信结果响应</string> - <plurals name="settings_specific_programs"> - <item quantity="other">这里有%s个项目有特定的设置</item> - </plurals> <string name="settings_limit_scope">设置限制</string> <string name="settings_limit_globally">全局</string> <string name="settings_limit_program">按项目</string> @@ -227,19 +141,14 @@ <string name="settingsErrorLog_descr">该日志包括你同步数据和元数据的所有错误。</string> <string name="settingsDeleteLocalData">删除本地数据</string> <string name="settingsDeleteLocalData_descr">所有存储在你的设备的采集app数据将被删除。没有同步到服务器的数据将丢失。</string> - <string name="settingsReset">重置应用数据和配置</string> - <string name="settingsReset_descr">所有存储在你的设备的采集app数据和配置将被删除。你将被要求重新登录并且没有与服务器同步的数据将会丢失。</string> <string name="settingsSms">短信设置</string> <string name="settingsSms_descr">检查和编辑短信网关的相关参数。</string> <string name="settingsCheckVersion">软件更新</string> - <string name="settingsCheckVersionMessage">软件</string> <string name="settingsExportDB">导出数据库</string> <string name="settingsExportDBMessage">导出数据库并与管理员共享</string> <string name="settingsTwoFAStatus">状态</string> <!--endregion--> - <string name="enrollmment_date">注册日期</string> - <!-- SEARCH OPTION SET --> <string name="search_optionset">搜索</string> <!--FORM FRAGMENT--> @@ -260,29 +169,15 @@ <string name="tei_coordinates">坐标</string> <!--EVENT SUMMARY--> - <string name="section_list">分段列表</string> - <string name="event_summary_header" formatted="false">已经完成 %s 个问题,总共%s。</string> - <string name="event_summary_sections_header" formatted="false">完成 %s共 %s</string> - <string name="complete_and_close">完成并关闭</string> <!--AGE CUSTOM VIEW--> - <string name="hint_day">天数</string> - <string name="hint_month">月</string> - <string name="hint_year">年</string> - <string name="week">周</string> <string name="incident_date">事故日期</string> - <string name="local_results">本地结果</string> - <string name="online_results">在线结果</string> <string name="past_programs">过去的项目</string> <!--PERMISSIONS--> <string name="permission_denied">你没有执行该操作的权限</string> - <string name="add_relation_button">添加为</string> - <string name="date_dialog_clear">清除</string> <string name="period">期间</string> - <string name="org_unit_filter">(%d)机构</string> - <string name="org_unit_select_level">等级%d</string> <string name="tuto_main_1">欢迎来到DHIS2</string> <string name="tuto_main_2">你可以在这里查看你的活动</string> <string name="tuto_main_3">你可以应用一个过滤器</string> @@ -291,16 +186,11 @@ <string name="tuto_main_6">选择主菜单的其它操作</string> <!-- RELATIONSHIPS --> - <string name="default_relationship_label">创建关系</string> <string name="next">下一个</string> <string name="search_min_num_attr">你至少需要输入 %d个属性便于搜索</string> - <string name="search_attr">你至少需要输入 一个属性便于搜索</string> - <string name="search_max_tei_reached">有多余%d个结果,请再细化搜索条件</string> - <string name="search_init">输入你的搜索条件</string> <!-- QR --> <string name="QR_SCANNER">导入二维码数据</string> - <string name="SAVE">保存</string> <string name="button_ok">好</string> <string name="qr_id">标识</string> <string name="qr_attributes">属性</string> @@ -312,32 +202,20 @@ <string name="qr_no_data">无数据</string> <string name="qr_error_id">无效的二维码</string> <string name="qr_error_attr">该属性不能被添加</string> - <string name="qr_error_enrollment">该注册不能添加</string> <string name="about">关于</string> <string name="programs_to_enroll">注册的项目</string> - <string name="select_all">全选</string> - <string name="clear_all">清除选择</string> - <string name="empty_program_list">选择的过滤器没有相关信息,请尝试改变</string> <string name="share">共享</string> <string name="share_qr">共享二维码</string> <string name="max">最大</string> <string name="current">当前</string> <string name="tei">跟踪实体</string> <string name="teis">跟踪实体</string> - <string name="limit_by_organisation_unit">按机构限制</string> - <string name="limit_by_program">按项目限制</string> - <string name="programs_list">项目列表</string> <string name="wipe_data">重置应用数据和配置</string> - <string name="add_relationship_error">不能添加该关系</string> <string name="warning_error_on_complete_title">检查</string> - <string name="warning_on_complete_title">警告</string> - <string name="error_on_complete_title">错误</string> <string name="save">保存</string> <string name="reserved_value">保留值</string> - <string name="downloaded_confirm">你想从二维码添加更多数据?</string> - <!--ABOUT--> <string name="about_app">应用版本:%s</string> <string name="about_sdk">SDK版本:%s</string> @@ -348,131 +226,43 @@ <string name="about_dev">由挪威奥斯陆大学信息系的一部分,DHIS2项目组开发和维护,</string> <string name="about_contact">关于该应用更多信息或问题请联系 <a href="mailto:android@dhis2.org">android@dhis2.org</a></string> - <string name="login_error_null_pass">口令缺失,请输入。</string> - <string name="login_error_null_username">用户名缺失,请输入。</string> - <string name="login_error_dhis_version">服务器运行版本不是2.29,请更新服务器版本或使用测试环境继续</string> - <string name="login_error_dhis_version_v2">服务器运行的版本不是 %s。更新服务器版本使用测试的环境继续。</string> - <string name="login_error_unsuccessful_response">有些事出错,请检查服务器URL,用户名和口令是否正确后再试。</string> - <string name="login_error_error_response">服务器不能完成该请求。</string> - <string name="login_error_default">试图登录服务器存在问题。</string> - <string name="login_error">登录错误</string> - <string name="missing_mandatory_fields">强制字段缺失</string> - <string name="online_search_unexpected">在线搜索发生未知的错误</string> - <string name="online_search_parsing_error">解析结果发生错误</string> - <string name="online_search_error">在线搜索返回错误。</string> - <string name="online_search_response_error">服务器出现错误</string> <string name="search_program_not_selected">选择一个项目开始注册</string> <string name="search_access_error">你没有请求的权限</string> - <string name="feature_unavaible">功能还没有实现。</string> - <string name="relationship_label_error">获取关系标签发生错误</string> <string name="all_tei_type">所有 %s</string> <string name="invalid_phone_number">不是有效的的电话号码</string> - <string name="invalid_email">不是有效的电子邮件</string> - <string name="invalid_negative_number">仅仅允许负数</string> <string name="invalid_possitive_zero">仅仅允许正整数和零</string> - <string name="invalid_possitive">仅仅允许正数。</string> - <string name="invalid_interval">仅仅 从0到1的值允许</string> - <string name="invalid_percentage">仅仅从0到100的值允许</string> - <string name="date_dialog_tigle">选择过滤日期</string> <string name="select_option">选择选项</string> - <string name="issue_reported">报告的问题</string> - <string name="dialog_generate_new_event">生成新事件</string> - <string name="message_generate_new_event">你要创建另外的事件?</string> <string name="event_completed_title">完成的事件</string> <string name="event_completed_message">该项目的所有事件已经完成。你同时要关闭该项目吗?</string> - <string name="complete_enrollment_message">你同时要完成登记注册吗?</string> <string name="complete_enrollment_message_V2">您也想完成%s吗?</string> <string name="check_event">检查</string> <string name="menu_home">首页</string> <string name="appwidget_text">例子</string> - <string name="add_widget">添加组件</string> <string name="showHelp">显示帮助</string> - <string name="tuto_settings_1">同步你的数据</string> - <string name="tuto_settings_2">你的配置</string> - <string name="tuto_settings_3">设置从服务器下载多少记录</string> - <string name="tuto_settings_reserved">检查和管理剩下多少保留值</string> - <string name="tuto_settings_errors">检查是否到服务器的连接失败</string> - <string name="tuto_settings_reset">释放更多盘空间</string> - <string name="tuto_settings_4">删除启动后的所有东西</string> - <string name="tuto_search_1_v2">发现在本地和联机服务器的实体</string> - <string name="tuto_search_2">你可以切换到其它项目</string> - <string name="tuto_search_3_v2">搜索或添加一个新实体。你需要先搜索再添加一个新的</string> - <string name="tuto_search_4_v2">点击这里清除字段和重启搜索。</string> <string name="tuto_dashboard_1">这是实体仪表盘</string> <string name="tuto_dashboard_2">查看实体概要信息</string> - <string name="tuto_dashboard_3">通过二维码或短信共享信息。</string> - <string name="tuto_dashboard_4">或者标记实体为后续跟踪。</string> - <string name="tuto_dashboard_5">点击创建或调度一个事件或流转到其它机构</string> <string name="tuto_dashboard_6">这里你将看到所有的事件。点击查看事件详情。</string> <string name="tuto_dashboard_7">通过菜单添加关系、查看指标或写笔记。</string> - <string name="tuto_dashboard_8">点击查看实体的所有注册数据或者创建一个新的</string> - <string name="tuto_tei_event_1">点击删除该事件。该操作不能取消。</string> - <string name="tuto_tei_event_2">完成事件</string> - <string name="tuto_program_event_1">所有该项目的相关事件将列表在这里。</string> - <string name="tuto_program_event_2">点击添加新事件</string> <string name="tuto_event_initial_new_1">输入所有数据创建事件</string> <string name="tuto_event_initial_1">点击检查事件完成状态</string> - <string name="tuto_event_summary">点击完成或重新打开事件</string> - <string name="tuto_main_7">通过二维码从其它设备读取并存储信息。</string> - <string name="tuto_main_8">和服务器同步你的数据</string> - <string name="tuto_main_9">用四个数字阻止会话。不要忘记你的口令。</string> - <string name="tuto_main_10">退出以便改变用户或服务器,你将可以再次登录即使没有互联网。</string> - <string name="text_plus_colon">%s:</string> <string name="relationships">关系</string> <string name="empty_tei_add">还没有登记的事件,点击“+”新建一个。</string> - <string name="empty_tei_no_add">还没有登记或上报的事件</string> <string name="qr_data_values">数据值</string> <string name="info">信息</string> <string name="qr_no_id_error">不能读取该ID</string> <string name="delete_local_data">删除本地数据</string> <string name="dashboard_overview">概要</string> - <string name="dashboard_relationships">关系</string> - <string name="dashboard_indicators">指标</string> - <string name="dashboard_analytics">分析</string> <string name="empty_indicators">该项目无指标</string> - <string name="dashboard_notes">笔记</string> - <string name="unable_to_complete">不能完成</string> - <string name="unable_to_save">无法保存</string> - <string name="warnings_in_form">表格中有警告</string> - <string name="what_to_do">你想做什么?</string> - <string name="field_errors">有些字段有错误,请检查,才能完成项目</string> <string name="unselect_enrollment">所有的注册</string> <string name="unselect_enrollment_description">显示所有活动项目的仪表盘</string> - <string name="CHECK_SYNC_ERRORS">打开同步错误日志</string> <string name="error_dialog_title">同步错误日志</string> <string name="share_with">分享</string> - <string name="errors_during_sync">你的配置同步失败。服务器可能有错误,点击查看更多信息。</string> - <string name="sectionSelectorPrev">前一个</string> - <string name="sectionSelectorNext">下一个</string> - <string name="event_overview">详情</string> - <string name="event_indicators">指标</string> - <string name="event_notes">笔记</string> - <string name="complete_add_new"><![CDATA[完成并新加]]></string> - <string name="complete_later">稍后完成</string> - <string name="finish_add_new"><![CDATA[完成并新加]]></string> - <string name="finish">保存</string> - <string name="error_fields_title">有错误的字段</string> - <string name="error_fields_events">有些字段有错误,他们已经保存,请检查。</string> <string name="unique_warning">值应该唯一,发现相同的。还没有保存,请检查。</string> - <string name="unique_coincidence_found">唯一字段发现相同的,请检查表单 以便保存注册</string> <string name="please_wait">请等待</string> <string name="skip">跳过</string> - <string name="reschedule">重新调度</string> <string name="no_intructions">该屏没有信息</string> - <string name="event_overdue">逾期</string> - <string name="unsupported_program_rule">存在不支持的项目规则,请检查文档。</string> - <string name="empty_description">该字段没有相关信息</string> - <string name="biometrics_dialog_title">空证书</string> - <string name="biometrics_first_use_text">为了能够使用指纹扫描器,你需要先使用缺省的方法</string> - <string name="biometrics_security_title">生物特征安全</string> - <string name="biometrics_login_title">快速登录</string> - <string name="biometrics_login_text">您想使用指纹或其他生物识别方法登录吗?</string> - <string name="tab_tables">表</string> - <string name="table">表</string> - <string name="login_https">https://</string> <string name="delete_local_data_message">没有同步的数据不会丢失,你真想要继续</string> - <string name="local_data_accept">接受</string> <string name="delete_local_data_error">数据不能删除,请重试</string> <string name="delete_local_data_done">删除本地数据成功完成</string> <string name="org_unit_selection_warning">至少得选择一个机构</string> @@ -495,33 +285,16 @@ <string name="state_uploading">上载中</string> <string name="state_relationship">关系</string> <string name="sent_by_sms">通过短信发送</string> - <string name="no_conflicts_message">该项目没有冲突。</string> - <string name="network_unavailable_sms">网络不可用。但是看起来电话系统可用,你可以使用短信</string> - <string name="network_unavailable">网络连接不可用。</string> <string name="action_close">关闭</string> <string name="tuto_main_11">点击这里检查同步信息。</string> - <string name="no_conflicts_update_message">数据仅仅存储在你的设备。还没有与服务器同步。</string> - <string name="no_conflicts_synced_message">已经更新。所有的数据已经发送到服务器。</string> <string name="relationship_error_recursive">你不能关联记录到自身。</string> - <string name="unblock_session">解锁会话</string> - <string name="data_set_complete">完成</string> - <string name="data_set_open">Open</string> - <string name="unsupported_value_type">不支持的值类型</string> <string name="change_calendar_view">改变日历视图。</string> - <string name="data_every_fifteen_minutes">15分钟</string> - <string name="data_every_hour">每小时</string> - <string name="data_every_day">每天</string> - <string name="data_every_week">每周</string> - <string name="period_week">周</string> - <string name="sync_setting">同步设置:%s</string> <string name="relationship_without_enrollment">你试图访问的记录还没有注册。你不能访问仪表盘。</string> <string name="formatting_error">格式化错误</string> <string name="dashboard_menu_delete_tei_v2">删除 %s</string> <string name="delete_authority_error">你没有删除记录的权限</string> - <string name="validation_url">没有有效的URL</string> <string name="adjusting_form">调整表单。。。</string> - <string name="sms_receiver_number">接收号码</string> <string name="sms_amount_question">你接受发送 %d消息?</string> <string name="sms_sending">发送 %1$d/%2$d</string> <string name="sms_waiting_amount_confirm">等待确认量:%d</string> @@ -539,51 +312,29 @@ <string name="sms_error_no_gateway_set">没有设置网关</string> <string name="sms_error_no_user_login">用户没有登录</string> <string name="sms_error_module_disabled">短信模块被关闭</string> - <string name="sms_error_ongoing_sunmission">其它的短信提交在进行中</string> <string name="sms_metadata_empty">短信模块没有初始化,没有发现需要的元数据。</string> - <string name="sms_completed">已完成</string> <string name="sms_count_error">短信数量不能接受</string> <string name="sms_state_started">开始的短信提交。</string> <string name="sms_state_converted">数据读取和转换的。提交ID:%d</string> - <string name="sms_general_error">短信提交发送错误</string> <string name="sms_title_enrollment">短信 实体注册和登记</string> <string name="sms_title_event">SMS事件注册</string> <string name="sms_title_data_set">SMS数据集提交</string> - <string name="sms_bar_state_starting">开始</string> - <string name="sms_bar_state_sending">进行中</string> - <string name="sms_bar_state_sent">发送</string> - <string name="sms_bar_state_failed">失败</string> - <string name="start_sync_granular">开始同步</string> <string name="syncing">同步</string> - <string name="end_sync_granular">同步完成</string> - <string name="error_sync">同步中发生错误。</string> - <string name="error_sync_check_logs">同步期间发生错误。点击这里查看错误日志</string> - <string name="cancel_sync">取消的同步</string> <string name="copied_text">副本</string> - <string name="image_selected">选择的图像</string> - <string name="show_in_map">地图上显示</string> - <string name="show_list">显示列表</string> <!--region TRACKER IMPORT CONFLICT MESSAGES--> - <string name="value_required_but_not_provided">%s是强制的但是没有提供</string> - <string name="polygon_captured">采集的多边形。</string> <string name="polygon">多边形</string> <!--endregion--> - <string name="fingerprint_title">指纹</string> - <string name="fingerprint_message">请在指纹阅读器输入指纹</string> <string name="security_title">安全</string> <string name="security_rooted_message">基于安全原因,该版本的app不允许使用根设备。请使用培训版本。</string> - <string name="fix_error">有些错误,请修正后继续</string> <string name="filters_active">应用过滤器</string> <string name="filters_disabled">无过滤器</string> <string name="filters_title_period">期间</string> <string name="filters_title_org_unit">机构</string> - <string name="filters_title_sorting">排序</string> - <string name="filters_title_status">状态</string> <string name="filters_title_state">同步</string> <string name="filters_title_assigned">指派给我</string> <string name="filter_period_today">今天</string> @@ -598,8 +349,6 @@ <string name="filter_period_form_to">从——到</string> <string name="filter_period_other">其它</string> <string name="filter_period_any">任何时候</string> - <string name="data_values_error_sync_message">同步失败,检查数据值修正错误再试。如果仍然失败,联系管理员。</string> - <string name="sms_synced_message">数据已经发送到服务器,但不保证已经被保存。</string> <string name="filter_event_status_open">开放</string> <string name="filter_event_status_schedule">调度</string> <string name="filter_event_status_overdue">逾期</string> @@ -615,7 +364,6 @@ <string name="sms_empty_gateway">短信网关不能为空</string> <string name="granular_sync_enrollments_empty">没有注册可以上传</string> <string name="granular_sync_unsupported_task">转换任务不支持。</string> - <string name="disable_pin_locked">不再显示锁屏</string> <string name="set_pin">设置PIN</string> <string name="conflict">冲突</string> <string name="change_event_date">改变日期</string> @@ -640,11 +388,7 @@ <string name="choose_ou">选择机构</string> <string name="enter_url">输入url</string> <string name="enter_value">输入值</string> - <string name="choose_image">选择图像</string> - <string name="scan_code">扫描码</string> - <string name="choose_option">选择选项</string> <string name="reserved_values_hint">每个TEI的属性下载的保留值</string> - <string name="settings_reserved_values_message">每个TEI的属性下载的保留值</string> <string name="reserved_values_left">剩下%s 保留值</string> <string name="manage_reserved_values_button">管理保留值</string> <string name="events_to_download">下载的事件</string> @@ -664,55 +408,29 @@ <string name="filter_sync_not_synced">未同步</string> <string name="filter_sync_error">同步错误</string> <string name="filter_sync_sms">短信已同步</string> - <string name="dataset_overview">详情</string> - <string name="dataset_comments">评论</string> <string name="saved">已经保存!</string> - <string name="run_validation_rules">你要检查数据质量?</string> - <string name="validation_success_title">一切都很好</string> - <string name="mark_dataset_complete">你要完成数据集?</string> - <string name="dataset_completed">标记已经完成</string> - <string name="name">名称</string> - <string name="formula">公式</string> - <string name="complete_anyway">任何都要完成</string> <string name="fk_message">遗失 %s %s 从%s %s</string> <string name="filters_title_event_status">事件状态</string> - <string name="enrollment_date">注册日期</string> <string name="dataset_empty_list_can_create">没有数据,点击“+”添加新的记录</string> <string name="dataset_emtpy_list_can_not_create">没有数据,您没有权限添加新记录</string> <string name="validation_rules_empty_description">没有提供描述或指导</string> <string name="validation_rules_data_to_review">复查的数据</string> - <string name="dataset_saved_completed">保存并完成!</string> <string name="status_change_error_active_exist">已经存在活动的注册</string> <string name="enrollment_status_active">Open</string> <string name="enrollment_status_completed">完成</string> <string name="enrollment_status_cancelled">取消</string> - <string name="event_data">数据</string> <string name="download_tei_error">选择的%s不能下载</string> - <string name="completed_by">%s完成:%s</string> - <string name="updated_time">已更新:%s</string> - <string name="action_done">完成</string> - <string name="validation_internal_error_datasets">不能检查质量,联系管理员</string> - <string name="are_you_sure">你确信?</string> - <string name="reopen_question">你要重新打开数据集?</string> <string name="filters_title_date">日期</string> - <string name="filters_title_event_date">事故日期</string> - <string name="tei_type_has_no_attributes">%s没有公有属性,请选择一个项目</string> <string name="privacy_policy_title">私有策略</string> <string name="open_privacy_policy">点击这里检查<a href="">隐私策略</a></string> <string name="coordinates_error">坐标值无效</string> + <string name="break_glass_error_v2">您无法在此项目中加入来自其他组织单位的 %s,因为它受到保护。\n请与您的管理员联系。</string> <string name="field_is_mandatory">此字段是必填字段</string> <string name="security_debugger_message">出于安全原因,此版本的应用程序不允许与adb一起使用。请使用培训版本。</string> <string name="customactivityoncrash_error_activity_restart_app">回退</string> - <string name="customactivityoncrash_error_activity_close_app">关闭应用</string> - <string name="customactivityoncrash_error_activity_error_details">更多细节</string> - <string name="customactivityoncrash_error_activity_error_details_title">更多细节</string> - <string name="customactivityoncrash_error_activity_error_details_close">关闭</string> <string name="customactivityoncrash_error_activity_error_details_copy">复制到剪贴板</string> - <string name="customactivityoncrash_error_activity_error_details_copied">复制到剪贴板</string> - <string name="customactivityoncrash_error_activity_error_details_clipboard_label">错误信息</string> <string name="metada_first_sync_error">与您的服务器同步时发现错误。如果可能,与系统管理员共享错误。</string> - <string name="error_init_session">我们无法与您的用户发起会话</string> <string name="enrollment_date_edition_warning">已经计划的事件不会重新安排</string> <string name="section_charts">图表</string> <string name="navigation_list_view">列表</string> @@ -763,46 +481,27 @@ <string name="section_feedback">反馈</string> <string name="section_indicators">指标</string> <string name="value">值</string> + <string name="camera_permission_denied">相机权限被拒绝。\n 您需要启用它才能使用此功能。</string> <string name="section_charts_indicators">图表和指标</string> <string name="take_photo">拍照</string> - <string name="from_gallery">从图库中选择</string> - <string name="data_set_quality_check_done">完成!</string> <string name="break_glass_dialog_title">该项目受保护</string> <string name="break_glass_hint">在此说明原因</string> - <string name="authenticating">验证中</string> - <string name="login_error_no_dhis_instance">提供的服务器URL不是dhis实例</string> - <string name="login_error_bad_credentials">证书不正确</string> - <string name="login_error_unknown_host">未知服务器</string> - <string name="invalid_integer">值必须是一个整数</string> <string name="openid_session_expired">会话已过期</string> <string name="openid_session_expired_message">您当前的会话已过期。出于安全原因,您将需要再次提供凭据</string> - <string name="dataset_column_default">值</string> <string name="week_period_span_default_label">星期%d %s到%s</string> <string name="action_do_not_show_again">不再显示</string> <string name="feature_configuration">特征配置</string> <string name="show_radar_graph">显示为雷达图</string> - <string name="coordinate_feature_type_error">无法设置坐标类型</string> <string name="filter_follow_up_label">跟进%s</string> - <string name="wrong_date_format">%s 无法解析为日期</string> <string name="update_field_error">无法更新此字段。请再试一次</string> - <string name="edition">版</string> - <string name="available">可用的</string> <string name="blocked_by_completion">此数据不可编辑,因为已标记为已完成</string> <string name="edition_expired">此数据不可编辑,因为其编辑时间已过期</string> <string name="edition_no_write_access">您无权编辑此数据</string> <string name="event_date_not_in_orgunit_range">此数据不可修改,因为单位部门已关闭</string> <string name="edition_no_catcombo_access">您无权编辑此数据</string> - <string name="edition_orgunit_capture_scope">您无法编辑此机构的数据</string> - <string name="reload_list">重置搜索</string> + <string name="edition_orgunit_user_scope">您无法编辑此机构的数据</string> <string name="error_tei_online_search_title">网上搜索返回如下信息:</string> - <string name="program_rules_loop_warning_title">项目规则警告</string> - <string name="program_rules_loop_warning_message">存在导致规则循环的配置问题。联系您的管理员。</string> - <string name="granular_sync_refresh">刷新</string> - <string name="unknown_date">未知</string> - <string name="granular_sync_refresh_title">刷新所有数据</string> - <string name="max_accounts_text">您已达到最大帐户数 (%d)。要添加新帐户,请登录并删除您的一个帐户</string> <string name="delete_account">删除帐户</string> - <string name="manage_accounts">管理帐户</string> <string name="main_menu_troubleshooting">配置疑难解答</string> <string name="troubleshooting_language_title">语言</string> <string name="troubleshooting_language_description">点击此处更改应用程序的语言</string> @@ -820,15 +519,14 @@ <string name="search_no_results">此搜索没有结果</string> <string name="search_too_many_results">结果太多</string> <string name="search_too_many_results_message">尝试更改搜索以缩小结果范围。</string> - <string name="search_create_new">新建</string> <string name="search_new_te_type">新%s</string> - <string name="search_min_attributes_message">需要至少输入%s属性才能搜索</string> <string name="action_ok">Ok!</string> <string name="init_search">开始搜索以找到任何 %s</string> <string name="search_or_create">您可以搜索或创建一个新的 %s</string> <string name="missing_warning_fields_completed_events">您收到了一些警告信息。</string> <string name="event_can_be_completed">您想将此表单标记为已完成吗?</string> <string name="changes_will_be_discarted">如果您现在退出,更改将被丢弃。</string> + <string name="event_error_on_complete">您有一些错误消息。\n您要查看它们吗?</string> <string name="re_opened">重新开放</string> <string name="account_disable_title">帐户已禁用</string> <string name="account_disable_message">您的帐户已被管理员禁用。</string> @@ -838,27 +536,10 @@ <string name="customactivityoncrash_error_activity_current_date">当前日期:%s</string> <string name="customactivityoncrash_error_activity_device">设备:%s</string> <string name="customactivityoncrash_error_activity_os_version">操作系统版本:%s</string> - <string name="open_details">打开 %s 详细信息</string> - <string name="tracked_entity_type_details">%s 细节</string> <string name="syncing_resource">正在同步 %s…</string> - <string name="sms_sync_waiting_for_response">短信发送。等待服务器响应。</string> - <string name="sms_sync_sms_reached_server">短信确认到达服务器。更新状态</string> - <string name="sms_sync_sms_reached_server_error">我们无法确认 SMS 已到达服务器。更新状态</string> - <string name="sms_sync_sent">短信发送。更新状态。</string> - <string name="sms_sync_not_sent">短信未发送。</string> - <string name="sms_sync_opening_app">打开短信应用。请不要修改留言。</string> <string name="sms_sync_sms_app_chooser_title">发送短信</string> <string name="sms_sync_is_sms_sent">你发短信了吗?</string> - <string name="sms_sync_manual_confirmation">等待手工确认</string> - <string name="syncing_events">同步事件</string> - <string name="syncing_teis">同步跟踪的实体</string> - <string name="syncing_data_sets">同步数据集</string> - <string name="syncing_resources">同步资源</string> - <string name="syncing_done">同步完成</string> - <string name="sms_available_for_individual_records">SMS 同步可用,但必须为每个单独的记录访问</string> <string name="downloading_image_resources">正在下载图片...</string> - <string name="program_description">项目说明</string> - <string name="wrong_pin">错误的密码</string> <string name="enrolledIn">已加入</string> <string name="ownedBy">拥有者</string> <string name="sync_dialog_title_not_synced">需要同步</string> @@ -878,18 +559,11 @@ <string name="sync_dialog_action_refresh">刷新</string> <string name="sync_dialog_action_not_now">现在不要</string> <string name="tap_to_explore_action">点击此处探索</string> - <plurals name="error_count_label"> - <item quantity="other">%s 错误</item> - </plurals> - <plurals name="warning_count_label"> - <item quantity="other">%s 警告</item> - </plurals> <string name="new_version_message">应用程序版本<b>%s </b> 现已推出。您想下载吗?</string> <string name="software_update">软件更新</string> <string name="remind_me_later">之后</string> <string name="download_now">现在下载</string> <string name="check_for_updates">检查更新</string> - <string name="checking_for_updates">查询更新</string> <string name="no_updates">没有新的更新</string> <string name="app_version">应用版本</string> <string name="error_applying_rule_effects">程序配置出了问题,我们无法加载此事件。请联系您的系统管理员。</string> @@ -926,8 +600,6 @@ <string name="program_stage">项目阶段</string> <string name="event">事件</string> <string name="timeline">时间线</string> - <string name="clear_search">清除搜索</string> - <string name="optional">可选项描述</string> <string name="database_export_downloaded">数据库已下载</string> <string name="importing_database">导入数据库</string> <string name="show_more">更多</string> @@ -952,4 +624,16 @@ <string name="complete_enrollment_label">完整%s</string> <string name="deactivate_enrollment_label">停用%s</string> <string name="reopen_enrollment_label">重新打开%s</string> + + <plurals name="error_count_label"> + <item quantity="other">%s 错误</item> + </plurals> + + <plurals name="warning_count_label"> + <item quantity="other">%s 警告</item> + </plurals> + + <plurals name="settings_specific_programs"> + <item quantity="other">这里有%s个项目有特定的设置</item> + </plurals> </resources> diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index ef76fabce31..218c288afc0 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -1,66 +1,32 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!--GENERAL--> <string name="app_name">DHIS2</string> - <string name="logo_text">区域健康信息系统</string> - <string name="logo_number">2</string> <!-- Warnings and error messages --> <string name="error">错误</string> - <plurals name="error_message"> - <item quantity="other">错误</item> - </plurals> - <string name="error_wrong_server_url">服务器URL错误</string> - <string name="error_wrong_credentials">凭证错误</string> - <string name="error_unexpected_error">未知错误</string> - <string name="error_internal_server_error">服务器内部错误</string> - <string name="no_value">无值</string> <string name="no_reserved_values">没有更多保留值,请联系管理员</string> - <string name="no_reserved_values_connection">没有更多保留值,连接网络重新填充他们</string> - <string name="errors">错误</string> <string name="something_wrong">出问题了</string> <!-- SyncService strings: --> - <string name="sync_now">现在同步</string> - <string name="sync_text">与服务器同步中</string> - <string name="sync_title">现在同步</string> - <string name="sync_metadata">元数据</string> <string name="sync_events">事件</string> - <string name="sync_tei">跟踪的实体</string> - - <string name="sync_complete_title">已完成</string> - <string name="sync_complete_text">同步完成</string> <string name="sync_error_title">同步错误</string> <string name="sync_error_text">同步中发生错误,请重试</string> <string name="sync_incomplete_error_text">同步完成,但我们没有收到所有记录的服务器确认。这些记录在应用程序中仍被标记为“离线”状态。我们建议重试同步。</string> <string name="metadata_sync_error">失败:同步过程中出了问题。如果有连接,请重试。如果错误仍然存在,请联系您的管理员。</string> <string name="data_sync_warning_v2">您的数据存在冲突。请同步您的配置,查看数据并尝试再次同步。</string> - <string name="data_sync_warning_program">警告:你的大多数数据已经同步,但是有些字段存在冲突,同步你的配置再试。如果警告仍然存在,检查你的同步状态:项目、跟踪实体和事件如果有冲突会标记为@。</string> <string name="data_sync_error_v2">您的部分数据未能同步。</string> - <string name="server_sync_error">发生错误,服务器未响应。与您的管理员联系。</string> - <string name="search_result_text">发现结果:1%s</string> - <string name="add_new">新增</string> - <string name="add">添加</string> <string name="enter_event_data">输入%s</string> <string name="enter_cancel_event_data">输入/跳过 %s</string> - <string name="schedule_new">新调度</string> <string name="referral">转派</string> <!-- Login --> - <string name="url_hint">服务器URL</string> - <string name="user_hint">用户名</string> - <string name="password_hint">口令</string> - <string name="log_in_button">登录</string> - <string name="unlock_button">解锁会话</string> <string name="syncing_configuration">同步你的配置</string> <string name="syncing_data_shortly">你的数据很快会被同步</string> <string name="syncing_data">同步你的数据</string> <string name="configuration_ready">你的配置已经准备好</string> <string name="data_ready">你的数据已经准备好</string> - <string name="configuration_sync_failed">配置同步失败</string> - <string name="data_sync_failed">数据同步失败</string> <string name="account_recovery">账号恢复</string> - <string name="no_network_to_recover_account">需要网络连接才能恢复您的帐户。</string> <!--PERIOD--> <string name="DAILY">每日</string> @@ -81,117 +47,73 @@ <string name="enter_text">输入文本</string> <string name="enter_long_text">输入长文本</string> <string name="enter_number">输入数字</string> - <string name="enter_integer">输入整数</string> <string name="enter_negative_integer">输入负整数</string> <string name="enter_positive_integer_or_zero">输入正整数或零</string> <string name="enter_positive_integer">输入正整数</string> - <string name="filter_options">过滤选项</string> <string name="choose_date">选择日期</string> - <string name="change_calendar">改变日历</string> <!-- Status --> - <string name="program_completed">项目已经完成</string> - <string name="program_inactive">项目不活跃</string> <string name="event_open">开放</string> <string name="event_not_completed">没完成</string> <string name="event_completed">事件完成</string> <string name="read_only">只读</string> - <string name="finish_and_complete">完成</string> <string name="completed">已完成</string> <string name="cancelled">已取消</string> <string name="re_open">重新打开</string> - <string name="re_open_form">重新打开表单</string> - <string name="activate">激活</string> <string name="active">活跃的</string> <!-- State --> <string name="state_synced">同步</string> <string name="state_to_post">发送</string> <string name="state_to_update">更新</string> - <string name="state_to_delete">删除</string> <string name="state_error">错误</string> - <string name="action_sync">同步</string> - <string name="action_send">发送</string> - <string name="action_sync_sms">同步短信</string> <!--Completion--> - <string name="completion">完成</string> <!--Event initial--> - <string name="create">创建</string> <string name="update">更新</string> - <string name="date">日期</string> <string name="org_unit">机构</string> <string name="no_org_units">选择的日期没有开放的机构,请选择另外的日期或机构</string> - <string name="category_option">分类选项</string> <string name="latitude">纬度</string> <string name="longitude">经度</string> - <string name="new_event">新事件</string> - <string name="one_time">一次</string> - <string name="permanent">永远</string> <!--DataSet initial--> <string name="report_period">报表周期</string> - <string name="cat_option">采集选项</string> - <string name="field_required">如果你设置值,整行的值需要设置才能完成数据集。</string> - <string name="field_mandatory">一些必需的值缺失,你需要设置强制的值才能完成数据集。</string> - <string name="field_mandatory_v2">有强制字段请填充后完成数据集</string> - <string name="datavalue_saved">值已被保存</string> - <string name="there_is_no_available_period">没有可用期间可选</string> <!--Event Detail--> <string name="due_date">到期日期</string> <string name="next_event">下一页%1$s</string> <string name="cat_combo">分类选择框</string> - <string name="date_default">DD/MM/YYYY</string> <string name="cancel">取消</string> <string name="delete">删除</string> - <string name="total">总共</string> <string name="most_recent_event_date">最近事件日期</string> <string name="no_options">无可用选项</string> <!--TEI Enrollment list--> <string name="enrollment_list">报名名单</string> <string name="active_programs">活动项目</string> - <string name="to_enroll_programs">加入的项目</string> <string name="enroll">加入</string> - <string name="last_visit">上次访问:</string> - <string name="apply">应用</string> <!--TEI DASHBOARD--> - <string name="see_details">查看详情</string> - <string name="view_more">更多</string> <string name="edit">编辑</string> - <string name="follow_up">后续跟踪</string> - <string name="follow_up_enabled">使能后续跟踪</string> - <string name="follow_up_disabled">后续跟踪关闭</string> <string name="deactivate">去活</string> <string name="program_not_allow_events">该项目不允许更多事件</string> <!--DONE TASKS--> - <string name="events_no_data">无数据</string> <string name="events">事件</string> <string name="done_task">主页</string> - <string name="app_info">应用信息</string> <string name="log_out">退出</string> - <string name="block_session">阻止会话</string> <string name="show_more_events">显示%s更多…</string> <string name="show_less_events">显示较少…</string> <!-- SYNC --> - <string name="a_minute">1分钟</string> - <string name="fifteen_minute">15分钟</string> <string name="thirty_minutes">30分钟</string> <string name="a_hour">1小时</string> <string name="every_6_hours">6小时</string> <string name="a_day">1天(默认)</string> <string name="every_12_hours">12小时</string> - <string name="Automatic_Sync_Data">自动同步数据 每:</string> <string name="Manual">手工</string> - <string name="Automatic_Sync_Metadata">自动同步配置:</string> <string name="a_week">1周</string> - <string name="sync_max_parameters">当前同步参数</string> - <string name="sync_default_parameters">复位缺省值</string> <string name="wipe_data_meesage">数据库将被删除。 您将被要求重新登录。</string> <string name="wipe_data_ok">接受</string> @@ -199,22 +121,13 @@ <string name="SYNC_DATA">现在同步数据</string> <string name="SYNC_META">现在同步配置</string> <string name="SYNC_MANAGER">设置</string> - <string name="last_data_sync_date">上次同步:1%s</string> <string name="last_data_sync">最后一次同步时间</string> - <string name="last_metadata_sync_date">上次同步:%s</string> <string name="refill_reserved_values">重新填充</string> - <string name="settings_sms_module_title">短信模块:</string> <string name="settings_sms_receiver_number">短信网关</string> <string name="settings_sms_result_sender_number">短信结果发送者</string> <string name="settings_sms_result_timeout">SMS 结果超时(秒)</string> - <string name="settings_sms_result_timeout_hint">秒</string> - <string name="settings_sms_result_sender_hint">数量</string> - <string name="settings_sms_receiver_number_hint">数量</string> <string name="settings_sms_module_switch">激活短信提交</string> <string name="settings_sms_response_wait_switch">等待短信结果响应</string> - <plurals name="settings_specific_programs"> - <item quantity="other">这里有%s个项目有特定的设置</item> - </plurals> <string name="settings_sync_period_v2">同步周期</string> <string name="settings_limit_scope">设置限制</string> <string name="settings_limit_globally">全局</string> @@ -233,12 +146,9 @@ <string name="settingsErrorLog_descr">该日志包括你同步数据和元数据的所有错误。</string> <string name="settingsDeleteLocalData">删除本地数据</string> <string name="settingsDeleteLocalData_descr">所有存储在你的设备的采集app数据将被删除。没有同步到服务器的数据将丢失。</string> - <string name="settingsReset">重置应用数据和配置</string> - <string name="settingsReset_descr">所有存储在你的设备的采集app数据和配置将被删除。你将被要求重新登录并且没有与服务器同步的数据将会丢失。</string> <string name="settingsSms">短信设置</string> <string name="settingsSms_descr">检查和编辑短信网关的相关参数。</string> <string name="settingsCheckVersion">软件更新</string> - <string name="settingsCheckVersionMessage">软件</string> <string name="settingsExportDB">导出数据库</string> <string name="settingsExportDBMessage">导出数据库并与管理员共享</string> <string name="settingTwoFA">双重身份验证</string> @@ -246,8 +156,6 @@ <string name="settingTwoFADescr">分两步启用或禁用身份验证。</string> <!--endregion--> - <string name="enrollmment_date">加入日期</string> - <!-- SEARCH OPTION SET --> <string name="search_optionset">搜索</string> <!--FORM FRAGMENT--> @@ -256,12 +164,6 @@ <string name="write_new_note">书写新笔记</string> <string name="clear">清除</string> <string name="add_note">添加笔记</string> - <string name="revert">反转</string> - <string name="activated">激活</string> - <string name="missing_mandatory_fields_title">强制字段缺失</string> - <string name="missing_mandatory_fields_text">有些强制字段缺失,如果你后退,所有保存的信息将被删除。</string> - <string name="missing_mandatory_fields_text_not_delete">有些强制字段缺失,如果你后退,请填充他们</string> - <string name="missing_mandatory_fields_events">某些字段需要您注意。\n您要查看表单吗?</string> <string name="title_delete_go_back">你的数据已经被保存</string> <string name="delete_go_back">如果退回,所有输入信息将被删除</string> <string name="missing_mandatory_fields_go_back">删除并后退</string> @@ -272,29 +174,15 @@ <string name="tei_coordinates">坐标</string> <!--EVENT SUMMARY--> - <string name="section_list">分段列表</string> - <string name="event_summary_header" formatted="false">已经完成 %s 个问题,总共%s。</string> - <string name="event_summary_sections_header" formatted="false">完成 %s共 %s</string> - <string name="complete_and_close">完成并关闭</string> <!--AGE CUSTOM VIEW--> - <string name="hint_day">天</string> - <string name="hint_month">月</string> - <string name="hint_year">岁</string> - <string name="week">星期</string> <string name="incident_date">发生日期</string> - <string name="local_results">本地结果</string> - <string name="online_results">在线结果</string> <string name="past_programs">过去的项目</string> <!--PERMISSIONS--> <string name="permission_denied">你没有执行该操作的权限</string> - <string name="add_relation_button">添加为</string> - <string name="date_dialog_clear">清除</string> <string name="period">周期</string> - <string name="org_unit_filter">(%d)机构</string> - <string name="org_unit_select_level">等级%d</string> <string name="tuto_main_1">欢迎来到DHIS2</string> <string name="tuto_main_2">你可以在这里查看你的活动</string> <string name="tuto_main_3">你可以应用一个过滤器</string> @@ -303,7 +191,6 @@ <string name="tuto_main_6">在主菜单上的选择其他操作</string> <!-- RELATIONSHIPS --> - <string name="default_relationship_label">创建关系</string> <string name="next">下一步</string> <string name="search_min_num_attr">你至少需要输入 %d个属性便于搜索</string> <string name="search_attr">你至少需要输入 一个属性便于搜索</string> @@ -314,7 +201,6 @@ <!-- QR --> <string name="QR_SCANNER">导入二维码数据</string> - <string name="SAVE">保存</string> <string name="button_ok">好</string> <string name="qr_id">标识</string> <string name="qr_attributes">属性</string> @@ -326,13 +212,9 @@ <string name="qr_no_data">无数据</string> <string name="qr_error_id">无效的二维码</string> <string name="qr_error_attr">该属性不能被添加</string> - <string name="qr_error_enrollment">该加入登记不能添加</string> <string name="about">关于</string> <string name="programs_to_enroll">加入的项目</string> - <string name="select_all">全选</string> - <string name="clear_all">清除选择</string> - <string name="empty_program_list">选择的过滤器没有相关信息,请尝试改变</string> <string name="share">分享</string> <string name="share_qr">共享二维码</string> <string name="teiType_search_online">在线搜索无法按类型搜索。 @@ -341,19 +223,11 @@ <string name="current">当前</string> <string name="tei">跟踪实体</string> <string name="teis">跟踪实体</string> - <string name="limit_by_organisation_unit">按机构限制</string> - <string name="limit_by_program">按项目限制</string> - <string name="programs_list">项目列表</string> <string name="wipe_data">重置应用数据和配置</string> - <string name="add_relationship_error">不能添加该关系</string> <string name="warning_error_on_complete_title">检查</string> - <string name="warning_on_complete_title">警告</string> - <string name="error_on_complete_title">错误</string> <string name="save">保存</string> <string name="reserved_value">保留值</string> - <string name="downloaded_confirm">你想从二维码添加更多数据?</string> - <!--ABOUT--> <string name="about_app">应用版本:%s</string> <string name="about_sdk">SDK版本:%s</string> @@ -364,148 +238,45 @@ <string name="about_dev">由<a href="https://www.dhis2.org/"> DHIS2 </a>项目组开发和维护,这是奥斯陆大学<a href="https://www.mn.uio.no/ifi/english/">信息学系</a>的一部分。</string> <string name="about_contact">关于该应用更多信息或问题请联系 <a href="mailto:android@dhis2.org">android@dhis2.org</a>和lin_xd@126.com</string> - <string name="login_error_null_pass">口令缺失,请输入。</string> - <string name="login_error_null_username">用户名缺失,请输入。</string> - <string name="login_error_dhis_version">服务器运行版本不是2.29,请更新服务器版本或使用测试环境继续</string> - <string name="login_error_dhis_version_v2">服务器运行的版本不是 %s。更新服务器版本使用测试的环境继续。</string> - <string name="login_error_unsuccessful_response">有些事出错,请检查服务器URL,用户名和口令是否正确后再试。</string> - <string name="login_error_error_response">服务器不能完成该请求。</string> - <string name="login_error_default">试图登录服务器存在问题。</string> - <string name="login_error">登录错误</string> - <string name="missing_mandatory_fields">强制字段缺失</string> - <string name="online_search_unexpected">在线搜索发生未知的错误</string> - <string name="online_search_parsing_error">解析结果发生错误</string> - <string name="online_search_error">在线搜索返回错误。</string> - <string name="online_search_response_error">服务器出现错误</string> <string name="search_program_not_selected">选择一个项目开始加入登记</string> <string name="search_access_error">你没有请求的权限</string> - <string name="feature_unavaible">功能还没有实现。</string> - <string name="relationship_label_error">获取关系标签发生错误</string> <string name="all_tei_type">所有 %s</string> <string name="invalid_phone_number">不是有效的的电话号码</string> - <string name="invalid_email">不是有效的电子邮件</string> - <string name="invalid_negative_number">仅仅允许负数</string> <string name="invalid_possitive_zero">仅仅允许正整数和零</string> - <string name="invalid_possitive">仅仅允许正数。</string> - <string name="invalid_interval">仅仅 从0到1的值允许</string> - <string name="invalid_percentage">仅仅从0到100的值允许</string> - <string name="date_dialog_tigle">选择过滤日期</string> <string name="select_option">选择选项</string> - <string name="issue_reported">报告的问题</string> - <string name="dialog_generate_new_event">生成新事件</string> - <string name="message_generate_new_event">你要创建另外的事件?</string> <string name="event_completed_title">完成的事件</string> <string name="event_completed_message">该项目的所有事件已经完成。你同时要关闭该项目吗?</string> - <string name="complete_enrollment_message">您还想同时完成加入登记吗?</string> <string name="complete_enrollment_message_V2">您也想完成%s吗?</string> <string name="check_event">检查</string> <string name="menu_home">主页</string> <string name="appwidget_text">例子</string> - <string name="add_widget">添加组件</string> <string name="showHelp">显示帮助</string> - <string name="tuto_settings_1">同步你的数据</string> - <string name="tuto_settings_2">你的配置</string> - <string name="tuto_settings_3">设置从服务器下载多少记录</string> - <string name="tuto_settings_reserved">检查和管理剩下多少保留值</string> - <string name="tuto_settings_errors">检查是否到服务器的连接失败</string> - <string name="tuto_settings_reset">释放更多盘空间</string> - <string name="tuto_settings_4">删除启动后的所有东西</string> - <string name="tuto_search_1_v2">发现在本地和联机服务器的实体</string> - <string name="tuto_search_2">你可以切换到其它项目</string> - <string name="tuto_search_3_v2">搜索或添加一个新实体。你需要先搜索再添加一个新的</string> - <string name="tuto_search_4_v2">点击这里清除字段和重启搜索。</string> <string name="tuto_dashboard_1">这是实体仪表盘</string> <string name="tuto_dashboard_2">查看实体概要信息</string> - <string name="tuto_dashboard_3">通过二维码或短信共享信息。</string> - <string name="tuto_dashboard_4">或者标记实体为后续跟踪。</string> - <string name="tuto_dashboard_5">点击创建或调度一个事件或流转到其它机构</string> <string name="tuto_dashboard_6">这里你将看到所有的事件。点击查看事件详情。</string> <string name="tuto_dashboard_7">通过菜单添加关系、查看指标或写笔记。</string> - <string name="tuto_dashboard_8">点击查看实体的所有登记数据或者创建一个新的</string> - <string name="tuto_tei_event_1">点击删除该事件。该操作不能取消。</string> - <string name="tuto_tei_event_2">完成事件</string> - <string name="tuto_program_event_1">所有该项目的相关事件将列表在这里。</string> - <string name="tuto_program_event_2">点击添加新事件</string> <string name="tuto_event_initial_new_1">输入所有数据创建事件</string> <string name="tuto_event_initial_1">点击检查事件完成状态</string> - <string name="tuto_event_summary">点击完成或重新打开事件</string> - <string name="tuto_main_7">通过二维码从其它设备读取并存储信息。</string> - <string name="tuto_main_8">和服务器同步你的数据</string> - <string name="tuto_main_9">用四个数字阻止会话。不要忘记你的口令。</string> - <string name="tuto_main_10">退出以便改变用户或服务器,你将可以再次登录即使没有互联网。</string> - <string name="text_plus_colon">%s:</string> <string name="relationships">关系</string> <string name="empty_tei_add">没有注册事件,单击“ +”添加一个新事件。</string> - <string name="empty_tei_no_add">没有注册事件。</string> <string name="qr_data_values">数据值</string> <string name="info">信息</string> <string name="qr_no_id_error">不能读取该ID</string> <string name="delete_local_data">删除本地数据</string> <string name="dashboard_overview">概要</string> - <string name="dashboard_relationships">关系</string> - <string name="dashboard_indicators">指标</string> - <string name="dashboard_analytics">Analytics</string> <string name="empty_indicators">该项目无指标</string> - <string name="dashboard_notes">笔记</string> - <string name="unable_to_complete">不能完成</string> - <string name="unable_to_save">无法保存</string> - <string name="warnings_in_form">表格中有警告</string> - <string name="what_to_do">你想做什么?</string> - <string name="field_errors">有些字段有错误,请检查,才能完成项目</string> <string name="unselect_enrollment">所有的加入登记</string> <string name="unselect_enrollment_description">显示所有活动项目的仪表盘</string> - <string name="CHECK_SYNC_ERRORS">打开同步错误日志</string> <string name="error_dialog_title">同步错误日志</string> <string name="share_with">分享</string> - <string name="errors_during_sync">你的配置同步失败。服务器可能有错误,点击查看更多信息。</string> - <string name="sectionSelectorPrev">前一个</string> - <string name="sectionSelectorNext">下一个</string> - <string name="event_overview">详情</string> - <string name="event_indicators">指标</string> - <string name="event_notes">笔记</string> - <string name="complete_add_new"><![CDATA[完成并新加]]></string> - <string name="complete_later">稍后完成</string> - <string name="finish_add_new"><![CDATA[完成并新加]]></string> - <string name="finish">保存</string> - <string name="error_fields_title">有错误的字段</string> - <string name="error_fields_events">有些字段有错误,他们已经保存,请检查。</string> <string name="unique_warning">值应该唯一,发现相同的。还没有保存,请检查。</string> - <string name="unique_coincidence_found">唯一字段发现相同的,请检查表单 以便保存注册</string> <string name="please_wait">请等待.....</string> <string name="skip">跳过</string> - <string name="reschedule">重新调度</string> <string name="no_intructions">该屏没有信息</string> - <string name="event_overdue">逾期</string> - <string name="unsupported_program_rule">存在不支持的项目规则,请检查文档。</string> - <string name="empty_description">该字段没有相关信息</string> - <string name="biometrics_dialog_title">空证书</string> - <string name="biometrics_first_use_text">为了能够使用指纹扫描器,你需要先使用缺省的方法</string> - <string name="biometrics_security_title">生物特征安全</string> - <string name="biometrics_login_title">快速登录</string> - <string name="biometrics_login_text">您想使用指纹或其他生物识别方法登录吗?</string> - <string name="tab_tables">表</string> - <string name="table">表</string> - <string name="login_https">https://</string> <string name="delete_local_data_message">没有同步的数据不会丢失,你真想要继续</string> - <string name="local_data_accept">接受</string> <string name="delete_local_data_error">数据不能删除,请重试</string> <string name="delete_local_data_done">删除本地数据成功完成</string> - <string name="org_unit_selection_warning">至少得选择一个机构</string> - <string name="send_user_name_title">发送数据</string> - <string name="send_user_name_mesage">通过共享与您的用户ID相关的错误日志来帮助DHIS2改进此应用程序。</string> - <string name="improve_app_msg_title">你想帮助我们改进这个应用程序吗?</string> - <string name="improve_app_msg_text">如果您同意,应用程序将发送匿名统计数据和错误日志,帮助我们改善用户体验和性能。</string> - <string name="improve_app_msg_clickable_word">隐私政策</string> - <string name="check_mandatory_field">检查字段</string> - <string name="error_no_network_during_sync">你丢掉了互联网连接,当执行配置同步的时候。稍后再试。</string> - <string name="action_agree">同意</string> - <string name="action_continue">继续</string> - <string name="login_server_info_title">服务器URL</string> - <string name="login_server_info_message">输入系统管理员为贵组织提供的 DHIS 2 服务器网址。\n\n或者,您也可以扫描包含服务器 URL 的 QR 代码</string> - <string name="forgot_your_code">忘记你的数字口令</string> - <string name="event_form_end_options_title">对该事件你想做什么?</string> - <string name="sectionSelectorEnd">结束</string> <string name="resource_not_found">%s没有发现</string> <string name="relationship_not_found_message">你试图访问的记录不可用。你想搜索吗?</string> <string name="sync_by_sms">通过短信同步。</string> @@ -513,33 +284,16 @@ <string name="state_uploading">上载中</string> <string name="state_relationship">关系</string> <string name="sent_by_sms">通过短信发送</string> - <string name="no_conflicts_message">该项目没有冲突。</string> - <string name="network_unavailable_sms">网络不可用。但是看起来电话系统可用,你可以使用短信</string> - <string name="network_unavailable">网络连接不可用。</string> <string name="action_close">关闭</string> <string name="tuto_main_11">点击这里检查同步信息。</string> - <string name="no_conflicts_update_message">数据仅仅存储在你的设备。还没有与服务器同步。</string> - <string name="no_conflicts_synced_message">已经更新。所有的数据已经发送到服务器。</string> <string name="relationship_error_recursive">你不能关联记录到自身。</string> - <string name="unblock_session">解锁会话</string> - <string name="data_set_complete">完成</string> - <string name="data_set_open">开放</string> - <string name="unsupported_value_type">不支持的值类型</string> <string name="change_calendar_view">改变日历视图。</string> - <string name="data_every_fifteen_minutes">15分钟</string> - <string name="data_every_hour">每小时</string> - <string name="data_every_day">每日</string> - <string name="data_every_week">每周</string> - <string name="period_week">周</string> - <string name="sync_setting">同步设置:%s</string> <string name="relationship_without_enrollment">你试图访问的记录还没有注册。你不能访问仪表盘。</string> <string name="formatting_error">格式化错误</string> <string name="dashboard_menu_delete_tei_v2">删除 %s</string> <string name="delete_authority_error">你没有删除记录的权限</string> - <string name="validation_url">没有有效的URL</string> <string name="adjusting_form">调整表单。。。</string> - <string name="sms_receiver_number">接收号码</string> <string name="sms_amount_question">你接受发送 %d消息?</string> <string name="sms_sending">发送 %1$d/%2$d</string> <string name="sms_waiting_amount_confirm">等待确认量:%d</string> @@ -557,51 +311,29 @@ <string name="sms_error_no_gateway_set">没有设置网关</string> <string name="sms_error_no_user_login">用户没有登录</string> <string name="sms_error_module_disabled">短信模块被关闭</string> - <string name="sms_error_ongoing_sunmission">其它的短信提交在进行中</string> <string name="sms_metadata_empty">短信模块没有初始化,没有发现需要的元数据。</string> - <string name="sms_completed">已完成</string> <string name="sms_count_error">短信数量不能接受</string> <string name="sms_state_started">开始的短信提交。</string> <string name="sms_state_converted">数据读取和转换的。提交ID:%d</string> - <string name="sms_general_error">短信提交发送错误</string> <string name="sms_title_enrollment">SMS 跟踪实体实例TEI注册和报名</string> <string name="sms_title_event">SMS事件注册</string> <string name="sms_title_data_set">SMS数据集提交</string> - <string name="sms_bar_state_starting">开始</string> - <string name="sms_bar_state_sending">进行中</string> - <string name="sms_bar_state_sent">发送</string> - <string name="sms_bar_state_failed">失败</string> - <string name="start_sync_granular">开始同步</string> <string name="syncing">同步</string> - <string name="end_sync_granular">同步完成</string> - <string name="error_sync">同步中发生错误。</string> - <string name="error_sync_check_logs">同步期间发生错误。点击这里查看错误日志</string> - <string name="cancel_sync">取消的同步</string> <string name="copied_text">副本</string> - <string name="image_selected">选择的图像</string> - <string name="show_in_map">地图上显示</string> - <string name="show_list">显示列表</string> <!--region TRACKER IMPORT CONFLICT MESSAGES--> - <string name="value_required_but_not_provided">%s是强制的但是没有提供</string> - <string name="polygon_captured">采集的多边形。</string> <string name="polygon">多边形</string> <!--endregion--> - <string name="fingerprint_title">指纹</string> - <string name="fingerprint_message">请在指纹阅读器输入指纹</string> <string name="security_title">安全</string> <string name="security_rooted_message">基于安全原因,该版本的app不允许使用根设备。请使用培训版本。</string> - <string name="fix_error">有些错误,请修正后继续</string> <string name="filters_active">应用过滤器</string> <string name="filters_disabled">无过滤器</string> <string name="filters_title_period">周期</string> <string name="filters_title_org_unit">机构</string> - <string name="filters_title_sorting">排序</string> - <string name="filters_title_status">状态</string> <string name="filters_title_state">同步</string> <string name="filters_title_assigned">指派给我</string> <string name="filter_period_today">今天</string> @@ -616,8 +348,6 @@ <string name="filter_period_form_to">从——到</string> <string name="filter_period_other">其它</string> <string name="filter_period_any">任何时候</string> - <string name="data_values_error_sync_message">同步失败,检查数据值修正错误再试。如果仍然失败,联系管理员。</string> - <string name="sms_synced_message">数据已经发送到服务器,但不保证已经被保存。</string> <string name="filter_event_status_open">开放</string> <string name="filter_event_status_schedule">调度</string> <string name="filter_event_status_overdue">逾期</string> @@ -628,15 +358,12 @@ <string name="event_tei_limits_v2">设置有限%s 活动:%s/%s TEI:%s/%s</string> <string name="limit_setting">设置限制%s</string> - <string name="enrollment_data_hide">隐藏加入数据</string> - <string name="enrollment_data_show">显示加入数据</string> <string name="sms_enabled">短信模块被激活</string> <string name="sms_disabled">短信模块被关闭</string> <string name="sms_downloading_data">下载短信模块,请等待。</string> <string name="sms_empty_gateway">短信网关不能为空</string> <string name="granular_sync_enrollments_empty">没有登记可以上传</string> <string name="granular_sync_unsupported_task">转换任务不支持。</string> - <string name="disable_pin_locked">不再显示锁屏</string> <string name="set_pin">设置PIN</string> <string name="conflict">冲突</string> <string name="change_event_date">改变日期</string> @@ -661,11 +388,7 @@ <string name="choose_ou">选择机构</string> <string name="enter_url">输入url</string> <string name="enter_value">输入值</string> - <string name="choose_image">选择图像</string> - <string name="scan_code">扫描码</string> - <string name="choose_option">选择选项</string> <string name="reserved_values_hint">每个TEI的属性下载的保留值</string> - <string name="settings_reserved_values_message">每个TEI的属性下载的保留值</string> <string name="reserved_values_left">剩下%s 保留值</string> <string name="manage_reserved_values_button">管理保留值</string> <string name="events_to_download">待下载的事件</string> @@ -685,39 +408,19 @@ <string name="filter_sync_not_synced">未同步</string> <string name="filter_sync_error">同步错误</string> <string name="filter_sync_sms">短信已同步</string> - <string name="dataset_overview">详情</string> - <string name="dataset_comments">评论</string> <string name="saved">已经保存!</string> - <string name="run_validation_rules">您要检查数据质量吗?</string> - <string name="validation_success_title">一切看起来都不错!</string> - <string name="mark_dataset_complete">你要完成数据集?</string> - <string name="dataset_completed">标记为完成</string> - <string name="name">名称</string> - <string name="formula">公式</string> - <string name="complete_anyway">任何都要完成</string> <string name="fk_message">遗失 %s %s 从%s %s</string> <string name="filters_title_event_status">事件状态</string> - <string name="enrollment_date">登记日期</string> <string name="dataset_empty_list_can_create">没有数据,点击“+”添加新的记录</string> <string name="dataset_emtpy_list_can_not_create">没有数据,您没有权限添加新记录</string> <string name="validation_rules_empty_description">没有提供描述或指导</string> <string name="validation_rules_data_to_review">复查的数据</string> - <string name="dataset_saved_completed">保存并完成!</string> <string name="status_change_error_active_exist">已经存在活动的注册</string> <string name="enrollment_status_active">开放</string> <string name="enrollment_status_completed">完成</string> <string name="enrollment_status_cancelled">已取消</string> - <string name="event_data">数据</string> <string name="download_tei_error">选择的%s不能下载</string> - <string name="completed_by">%s完成:%s</string> - <string name="updated_time">已更新:%s</string> - <string name="action_done">完成</string> - <string name="validation_internal_error_datasets">不能检查质量,联系管理员</string> - <string name="are_you_sure">你确信?</string> - <string name="reopen_question">你要重新打开数据集?</string> <string name="filters_title_date">日期</string> - <string name="filters_title_event_date">事件日期</string> - <string name="tei_type_has_no_attributes">%s没有公有属性,请选择一个项目</string> <string name="privacy_policy_title">私有策略</string> <string name="open_privacy_policy">点击这里检查<a href="">隐私策略</a></string> <string name="coordinates_error">坐标值无效</string> @@ -731,15 +434,8 @@ <string name="customactivityoncrash_error_activity_error_occurred_explanation">哎呀!有些事情没有按计划进行。 让我们帮你恢复行动。</string> <string name="customactivityoncrash_error_activity_restart_app">后退</string> - <string name="customactivityoncrash_error_activity_close_app">关闭应用</string> - <string name="customactivityoncrash_error_activity_error_details">更多细节</string> - <string name="customactivityoncrash_error_activity_error_details_title">更多细节</string> - <string name="customactivityoncrash_error_activity_error_details_close">关闭</string> <string name="customactivityoncrash_error_activity_error_details_copy">复制到剪贴板</string> - <string name="customactivityoncrash_error_activity_error_details_copied">复制到剪贴板</string> - <string name="customactivityoncrash_error_activity_error_details_clipboard_label">错误信息</string> <string name="metada_first_sync_error">与您的服务器同步时发现错误。如果可能,与系统管理员共享错误。</string> - <string name="error_init_session">我们无法与您的用户发起会话</string> <string name="enrollment_date_edition_warning">还有计划的事件,不能重新安排</string> <string name="section_charts">图表</string> <string name="navigation_list_view">列表</string> @@ -790,47 +486,26 @@ <string name="section_feedback">反馈</string> <string name="section_indicators">指标</string> <string name="camera_permission_denied">相机权限被拒绝。\n您需要启用它才能使用此功能。</string> - <string name="value">值</string> <string name="section_charts_indicators">图表和指标</string> <string name="take_photo">拍照</string> - <string name="from_gallery">从图库中选择</string> - <string name="data_set_quality_check_done">完成!</string> <string name="break_glass_dialog_title">该项目受保护</string> <string name="break_glass_hint">在此说明原因</string> - <string name="authenticating">验证中</string> - <string name="login_error_no_dhis_instance">提供的服务器URL不是dhis实例</string> - <string name="login_error_bad_credentials">凭证错误</string> - <string name="login_error_unknown_host">未知服务器</string> - <string name="invalid_integer">值必须是整数</string> <string name="openid_session_expired">会话已过期</string> <string name="openid_session_expired_message">您当前的会话已过期。出于安全原因,您将需要再次提供凭据</string> - <string name="dataset_column_default">值</string> <string name="week_period_span_default_label">星期%d %s到%s</string> <string name="action_do_not_show_again">不再显示</string> <string name="feature_configuration">特征配置</string> <string name="show_radar_graph">显示为雷达图</string> - <string name="coordinate_feature_type_error">无法设置坐标类型</string> <string name="filter_follow_up_label">跟进%s</string> - <string name="wrong_date_format">%s 无法解析为日期</string> <string name="update_field_error">无法更新此字段。请再试一次</string> - <string name="edition">版</string> - <string name="available">可用的</string> <string name="blocked_by_completion">此数据不可编辑,因为已标记为已完成</string> <string name="edition_expired">此数据不可编辑,因为其编辑时间已过期</string> <string name="edition_no_write_access">您无权编辑此数据</string> <string name="event_date_not_in_orgunit_range">此数据不可修改,因为单位部门已关闭</string> <string name="edition_no_catcombo_access">您无权编辑此数据</string> - <string name="edition_orgunit_capture_scope">您无法编辑此机构的数据</string> - <string name="reload_list">重置搜索</string> + <string name="edition_orgunit_user_scope">您无法编辑此机构的数据</string> <string name="error_tei_online_search_title">网上搜索返回如下信息:</string> - <string name="program_rules_loop_warning_title">项目规则警告</string> - <string name="program_rules_loop_warning_message">存在导致规则循环的配置问题。联系您的管理员。</string> - <string name="granular_sync_refresh">刷新</string> - <string name="unknown_date">未知</string> - <string name="granular_sync_refresh_title">刷新所有数据</string> - <string name="max_accounts_text">您已达到最大帐户数 (%d)。要添加新帐户,请登录并删除您的一个帐户</string> <string name="delete_account">删除帐户</string> - <string name="manage_accounts">管理帐户</string> <string name="main_menu_troubleshooting">配置疑难解答</string> <string name="troubleshooting_language_title">语言</string> <string name="troubleshooting_language_description">点击此处更改应用程序的语言</string> @@ -849,9 +524,7 @@ <string name="search_no_results">此搜索没有结果</string> <string name="search_too_many_results">结果太多</string> <string name="search_too_many_results_message">尝试更改搜索以缩小结果范围。</string> - <string name="search_create_new">新建</string> <string name="search_new_te_type">新%s</string> - <string name="search_min_attributes_message">需要至少输入%s属性才能搜索</string> <string name="action_ok">Ok!</string> <string name="init_search">开始搜索以找到任何 %s</string> <string name="search_or_create">您可以搜索或创建一个新的 %s</string> @@ -860,7 +533,6 @@ <string name="missing_error_fields_events">一些字段有错误并且它们没有被保存。 \n您要查看表单吗?</string> <string name="event_can_be_completed">您想将此表单标记为已完成吗?</string> <string name="event_error_on_complete">您有一些错误消息。\n您要查看它们吗?</string> - <string name="changes_will_be_discarted">如果您现在退出,更改将被丢弃。</string> <string name="re_opened">重新开放</string> <string name="account_disable_title">帐户已禁用</string> <string name="account_disable_message">您的帐户已被管理员禁用。</string> @@ -870,27 +542,10 @@ <string name="customactivityoncrash_error_activity_current_date">当前日期:%s</string> <string name="customactivityoncrash_error_activity_device">设备:%s</string> <string name="customactivityoncrash_error_activity_os_version">操作系统版本:%s</string> - <string name="open_details">打开 %s 详细信息</string> - <string name="tracked_entity_type_details">%s 细节</string> <string name="syncing_resource">正在同步 %s…</string> - <string name="sms_sync_waiting_for_response">短信发送。等待服务器响应。</string> - <string name="sms_sync_sms_reached_server">短信确认到达服务器。更新状态</string> - <string name="sms_sync_sms_reached_server_error">我们无法确认 SMS 已到达服务器。更新状态</string> - <string name="sms_sync_sent">短信发送。更新状态。</string> - <string name="sms_sync_not_sent">短信未发送。</string> - <string name="sms_sync_opening_app">打开短信应用。请不要修改留言。</string> <string name="sms_sync_sms_app_chooser_title">发送短信</string> <string name="sms_sync_is_sms_sent">你发短信了吗?</string> - <string name="sms_sync_manual_confirmation">等待手工确认</string> - <string name="syncing_events">同步事件</string> - <string name="syncing_teis">同步跟踪的实体</string> - <string name="syncing_data_sets">同步数据集</string> - <string name="syncing_resources">同步资源</string> - <string name="syncing_done">同步完成</string> - <string name="sms_available_for_individual_records">SMS 同步可用,但必须为每个单独的记录访问</string> <string name="downloading_image_resources">正在下载图片...</string> - <string name="program_description">项目说明</string> - <string name="wrong_pin">错误的密码</string> <string name="enrolledIn">已加入</string> <string name="ownedBy">拥有者</string> <string name="sync_dialog_title_not_synced">需要同步</string> @@ -910,18 +565,11 @@ <string name="sync_dialog_action_refresh">刷新</string> <string name="sync_dialog_action_not_now">现在不要</string> <string name="tap_to_explore_action">点击此处探索</string> - <plurals name="error_count_label"> - <item quantity="other">%s 错误</item> - </plurals> - <plurals name="warning_count_label"> - <item quantity="other">%s 警告</item> - </plurals> <string name="new_version_message">应用程序版本<b>%s </b> 现已推出。您想下载吗?</string> <string name="software_update">软件更新</string> <string name="remind_me_later">之后</string> <string name="download_now">现在下载</string> <string name="check_for_updates">检查更新</string> - <string name="checking_for_updates">查询更新</string> <string name="no_updates">没有新的更新</string> <string name="unknow_sources_denied">未知来源权限被拒绝。\n您需要启用它才能安装版本。</string> <string name="storage_denied">存储权限被拒绝。\n您需要启用它才能安装版本。</string> @@ -963,8 +611,6 @@ <string name="program_stage">项目阶段</string> <string name="event">事件</string> <string name="timeline">时间线</string> - <string name="clear_search">清除搜索</string> - <string name="optional">可选项描述</string> <string name="database_export_downloaded">数据库已下载</string> <string name="importing_database">导入数据库</string> <string name="empty_search_attributes_message">没有配置可使用的搜索字段。 @@ -972,10 +618,6 @@ <string name="show_more">更多</string> <string name="show_less">显示较少</string> <string name="sync">同步</string> - <string name="show_fields">显示字段</string> - <string name="hide_fields">隐藏字段</string> - <string name="importing_successful">导入成功</string> - <string name="section_misconfigured">此部分配置错误。</string> <string name="successful_sync">成功同步</string> <string name="syncing_something">正在同步 %s…</string> <string name="file_resources">文件资源</string> @@ -992,4 +634,15 @@ <string name="complete_enrollment_label">完整%s</string> <string name="deactivate_enrollment_label">停用%s</string> <string name="reopen_enrollment_label">重新打开%s</string> + <plurals name="error_count_label"> + <item quantity="other">%s 错误</item> + </plurals> + + <plurals name="warning_count_label"> + <item quantity="other">%s 警告</item> + </plurals> + + <plurals name="settings_specific_programs"> + <item quantity="other">这里有%s个项目有特定的设置</item> + </plurals> </resources> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e232d4731bd..45f07e1d317 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,70 +1,33 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"> <!--GENERAL--> <string name="app_name">Dhis2</string> - <string name="logo_text">dhis</string> - <string name="logo_number">2</string> - <string name="tab" translatable="false">\u0009</string> - <string name="default_notification_channel_id" translatable="false">20180901</string> <!-- Warnings and error messages --> <string name="error">Error</string> - <plurals name="error_message"> - <item quantity="one">Error</item> - <item quantity="other">Errors</item> - </plurals> - <string name="error_wrong_server_url">Wrong server url</string> - <string name="error_wrong_credentials">Wrong credentials</string> - <string name="error_unexpected_error">Unexpected error</string> - <string name="error_internal_server_error">Internal server error</string> - <string name="no_value">no value</string> <string name="no_reserved_values">There are no more reserved values. Contact your system administrator</string> - <string name="no_reserved_values_connection">There are no more reserved values. Connect to the network to refill them</string> - <string name="errors">errors</string> <string name="something_wrong">Something went wrong</string> <!-- SyncService strings: --> - <string name="sync_now">Synchronise now</string> - <string name="sync_text">Synchronising with server</string> - <string name="sync_title">Syncing now</string> - <string name="sync_metadata">Metadata</string> <string name="sync_events">Events</string> - <string name="sync_tei">Tracked entities</string> - - <string name="sync_complete_title">Finished</string> - <string name="sync_complete_text">Sync complete</string> <string name="sync_error_title">Sync Error</string> <string name="sync_error_text">An error has occurred during synchronisation. Please retry.</string> <string name="sync_incomplete_error_text">Sync finished but we did not receive server confirmation for all records. Those record are still marked as \"offline\" in the App. We recommend to retry the synchronization.</string> <string name="metadata_sync_error">FAIL: Something went wrong in the sync process. If you have connection please try again. If the error persists, contact your administrator.</string> <string name="data_sync_warning_v2">There are conflicts in your data. Please sync your configuration, review your data and try syncing again.</string> - <string name="data_sync_warning_program">WARNING: Most of your data is synced but some fields presented conflicts. Sync your configuration and try again. If warning persists, check their sync status: programs, TEI\'s and events with conflicts are marked as @.</string> <string name="data_sync_error_v2">Some of your data failed to sync.</string> - <string name="server_sync_error">There was an error and the server did not respond. Contact your administrator.</string> - <string name="search_result_text">%s results found</string> - <string name="add_new">Add new</string> - <string name="add">Add</string> <string name="enter_event_data">Enter %s</string> <string name="enter_cancel_event_data">Enter / Skip %s</string> - <string name="schedule_new">Schedule new</string> <string name="lorem" translatable="false">Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat</string> <string name="referral">Referral</string> <!-- Login --> - <string name="url_hint">Server url</string> - <string name="user_hint">Username</string> - <string name="password_hint">Password</string> - <string name="log_in_button">Log In</string> - <string name="unlock_button">Unlock session</string> <string name="syncing_configuration">Syncing your Configuration</string> <string name="syncing_data_shortly">Your Data will shortly be synced</string> <string name="syncing_data">Syncing your Data</string> <string name="configuration_ready">Your Configuration is ready</string> <string name="data_ready">Your Data is ready</string> - <string name="configuration_sync_failed">Configuration sync failed</string> - <string name="data_sync_failed">Data sync failed</string> <string name="account_recovery">Account recovery</string> - <string name="no_network_to_recover_account">A network connection is needed to recover your account.</string> <!--PERIOD--> <string name="DAILY">Daily</string> @@ -84,146 +47,92 @@ <string name="simprints_biometric_search">Biometric search</string> <string name="simprints_possible_duplicates">Possible duplicates</string> <string name="simprints_biometric_search_fallback_action">No biometric match?\nSearch by name instead</string> + <string name="simprints_biometric_search_no_matches">No biometric search matches. Try searching by name, etc.</string> <string name="simprints_none_of_the_above">None of the above</string> <string name="add_te_type">Add new %s</string> <string name="enter_text">Enter text</string> <string name="enter_long_text">Enter long text</string> <string name="enter_number">Enter number</string> - <string name="enter_integer">Enter integer</string> <string name="enter_negative_integer">Enter negative integer</string> <string name="enter_positive_integer_or_zero">Enter positive integer or zero</string> <string name="enter_positive_integer">Enter positive integer</string> - <string name="filter_options">Filter options</string> <string name="choose_date">Choose date</string> - <string name="change_calendar">Change calendar</string> <!-- Status --> - <string name="program_completed">Program Completed</string> - <string name="program_inactive">Program inactive</string> <string name="event_open">Open</string> <string name="event_not_completed">Not completed</string> <string name="event_completed">Event completed</string> <string name="read_only">Read only</string> - <string name="finish_and_complete">Finish and complete</string> <string name="completed">Completed</string> <string name="cancelled">Cancelled</string> <string name="re_open">Re-open</string> - <string name="re_open_form">Re-open form</string> - <string name="activate">Activate</string> <string name="active">Active</string> <!-- State --> <string name="state_synced">Sync</string> <string name="state_to_post">To send</string> <string name="state_to_update">To update</string> - <string name="state_to_delete">To delete</string> <string name="state_error">Error</string> - <string name="action_sync">SYNC</string> - <string name="action_send">SEND</string> - <string name="action_sync_sms">SYNC SMS</string> <!--Completion--> - <string name="completion">Completion</string> <!--Event initial--> - <string name="create">Create</string> <string name="update">Update</string> - <string name="date">Date</string> <string name="org_unit">Org unit</string> <string name="no_org_units">There aren\'t any open Organization Units for the selected date. Please select another date or another Organisation Unit.</string> - <string name="category_option">Category option</string> <string name="latitude">Latitude</string> <string name="longitude">Longitude</string> - <string name="new_event">New event</string> - <string name="fake_program_stage_description" translatable="false">Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.</string> - <string name="one_time">One time</string> - <string name="permanent">Permanent</string> <!--DataSet initial--> <string name="report_period">Report period</string> - <string name="cat_option">Cat option</string> - <string name="field_required">If you set a value, the whole row needs all of values to complete the Data Set.</string> - <string name="field_mandatory">Some values required are missing. You need set mandatory values to complete the Data Set.</string> - <string name="field_mandatory_v2">There are missing mandatory fields. Please, fill them to complete the data set.</string> - <string name="datavalue_saved">Value is saved!</string> - <string name="there_is_no_available_period">There is no available periods to select.</string> <!--Event Detail--> <string name="due_date">Due date</string> <string name="next_event">Next %1$s</string> <string name="cat_combo">Cat combo</string> - <string name="date_default">DD/MM/YYYY</string> <string name="cancel">Cancel</string> <string name="delete">Delete</string> - <string name="total">Total</string> <string name="most_recent_event_date">Most recent event date</string> <string name="no_options">No options available</string> <!--TEI Enrollment list--> <string name="enrollment_list">Enrollment list</string> <string name="active_programs">Active programs</string> - <string name="to_enroll_programs">Programs to enroll</string> <string name="enroll">Enroll</string> - <string name="last_visit">Last Visit:</string> - <string name="apply">apply</string> <!--TEI DASHBOARD--> - <string name="see_details">See Details</string> - <string name="view_more">VIEW MORE</string> <string name="edit">Edit</string> - <string name="follow_up">Follow up</string> - <string name="follow_up_enabled">Follow up enabled</string> - <string name="follow_up_disabled">Follow up disabled</string> <string name="deactivate">Deactivate</string> <string name="program_not_allow_events">This program does not allow more events</string> <!--DONE TASKS--> - <string name="events_no_data">No data</string> <string name="events">events</string> <string name="done_task">Home</string> - <string name="app_info">App Info</string> <string name="log_out">Log Out</string> - <string name="block_session">Block Session</string> <string name="show_more_events">Show %s more…</string> <string name="show_less_events">Show less…</string> <!-- SYNC --> - <string name="a_minute">1 Minute</string> - <string name="fifteen_minute">15 Minutes</string> <string name="thirty_minutes">30 Minutes</string> <string name="a_hour">1 Hour</string> <string name="every_6_hours">6h</string> <string name="a_day">1 Day (Default)</string> <string name="every_12_hours">12h</string> - <string name="Automatic_Sync_Data">Automatic Sync Data every:</string> <string name="Manual">Manual</string> - <string name="Automatic_Sync_Metadata">Automatic Sync Configuration every:</string> <string name="a_week">1 Week</string> - <string name="sync_max_parameters">Current sync parameters:</string> - <string name="sync_default_parameters">Reset to default</string> <string name="wipe_data_meesage">Database will be deleted.\nYou will be asked to log in again.</string> <string name="wipe_data_ok">Accept</string> <string name="wipe_data_no">Cancel</string> <string name="SYNC_DATA">SYNC Data Now</string> <string name="SYNC_META">SYNC Configuration Now</string> <string name="SYNC_MANAGER">Settings</string> - <string name="last_data_sync_date">Last sync on: %s</string> <string name="last_data_sync">Last sync on</string> - <string name="last_metadata_sync_date">Last sync on: %s</string> <string name="refill_reserved_values">Refill</string> - <string name="settings_sms_module_title">SMS module:</string> <string name="settings_sms_receiver_number">SMS gateway</string> <string name="settings_sms_result_sender_number">SMS result sender</string> <string name="settings_sms_result_timeout">SMS result timeout (sec)</string> - <string name="settings_sms_result_timeout_hint">seconds</string> - <string name="settings_sms_result_sender_hint">number</string> - <string name="settings_sms_receiver_number_hint">number</string> <string name="settings_sms_module_switch">Enable SMS submission</string> <string name="settings_sms_response_wait_switch">Wait for SMS result response</string> - <plurals name="settings_specific_programs"> - <item quantity="one">There is %s program with specific settings</item> - <item quantity="other">There are %s programs with specific settings</item> - </plurals> <string name="settings_sync_period_v2">Sync period</string> <string name="settings_limit_scope">Settings limited</string> <string name="settings_limit_globally">Globally</string> @@ -242,12 +151,9 @@ <string name="settingsErrorLog_descr">This log contains all errors caused by syncing your data and metadata.</string> <string name="settingsDeleteLocalData">Delete local data</string> <string name="settingsDeleteLocalData_descr">All Capture App data stored in your device will be deleted. Data which is not synced to the server will be lost.</string> - <string name="settingsReset">Reset app data &amp; configuration</string> - <string name="settingsReset_descr">Your configuration and App data stored in the device will be deleted. You will be asked to log in again and data which is not synced to the server will be lost.</string> <string name="settingsSms">SMS Settings</string> <string name="settingsSms_descr">Check and edit parameters related to the sms gateway</string> <string name="settingsCheckVersion">Software update</string> - <string name="settingsCheckVersionMessage">Software</string> <string name="settingsExportDB">Export database</string> <string name="settingsExportDBMessage">Export your database and share it with your administrator</string> <string name="settingTwoFA">Two factor authentication</string> @@ -255,8 +161,6 @@ <string name="settingTwoFADescr">Enable or disable the authentication in two steps.</string> <!--endregion--> - <string name="enrollmment_date">Enrollment date</string> - <!-- SEARCH OPTION SET --> <string name="search_optionset">Search</string> <!--FORM FRAGMENT--> @@ -265,43 +169,19 @@ <string name="write_new_note">Write new note</string> <string name="clear">clear</string> <string name="add_note">Add note</string> - <string name="revert">Revert</string> - <string name="activated">Activated</string> - <string name="missing_mandatory_fields_title">Mandatory fields are missing</string> - <string name="missing_mandatory_fields_text">Some mandatory fields are missing. If you want to go back now, all saved information will be deleted.</string> - <string name="missing_mandatory_fields_text_not_delete">Some mandatory fields are missing. If you want to go back, please fill them.</string> - <string name="missing_mandatory_fields_events">Some fields need your attention.\nDo you want to review the form?</string> <string name="title_delete_go_back">Your data is not saved</string> - <string name="delete_go_back">If you go back now all information entered will be deleted.</string> - <string name="missing_mandatory_fields_go_back">Delete and go back</string> - <string name="error_fields">Some fields have errors:\n%s\nPlease, check them.</string> - <string name="missing_mandatory_fields_finish">Some mandatory fields are missing. You can finish data entry and exit, but the event cannot be completed.</string> <string name="tei_coordinates">Coordinates for the</string> <!--EVENT SUMMARY--> - <string name="section_list">Section list</string> - <string name="event_summary_header" formatted="false">%s questions of %s completed</string> - <string name="event_summary_sections_header" formatted="false">%s of %s completed</string> - <string name="complete_and_close">Complete and close</string> <!--AGE CUSTOM VIEW--> - <string name="hint_day">Days</string> - <string name="hint_month">Months</string> - <string name="hint_year">Years</string> - <string name="week">Weeks</string> <string name="incident_date">Incident date</string> - <string name="local_results">Local results</string> - <string name="online_results">Online results</string> <string name="past_programs">Past programs</string> <!--PERMISSIONS--> <string name="permission_denied">You don\'t have the required permission to perform this action</string> - <string name="add_relation_button">Add as…</string> - <string name="date_dialog_clear">Clear</string> <string name="period">Period</string> - <string name="org_unit_filter">(%d) Org Unit</string> - <string name="org_unit_select_level">Level %d</string> <string name="tuto_main_1">Welcome to dhis2</string> <string name="tuto_main_2">Here you can see your activities</string> <string name="tuto_main_3">You can apply a filter…</string> @@ -310,17 +190,11 @@ <string name="tuto_main_6">Check other actions on the main menu</string> <!-- RELATIONSHIPS --> - <string name="default_relationship_label">Create relationship</string> <string name="next">Next</string> <string name="search_min_num_attr">You need to enter at least %d of the attributes to do a search</string> - <string name="search_attr">You need to enter at least one of the attributes to do a search</string> - <string name="search_max_tei_reached">There is more than %d results. Please enter further search criteria</string> - <string name="search_criteria_not_met">Your search criteria didn\'t return any result.\nRevise your criteria or enroll a new %s</string> - <string name="search_init">Enter your search criteria</string> <!-- QR --> <string name="QR_SCANNER">Import QR data</string> - <string name="SAVE">Save</string> <string name="button_ok">OK</string> <string name="qr_id">Identification</string> <string name="qr_attributes">Attributes</string> @@ -332,33 +206,18 @@ <string name="qr_no_data">no data</string> <string name="qr_error_id">Invalid QR code</string> <string name="qr_error_attr">This attribute can\'t be added</string> - <string name="qr_error_enrollment">This enrollment can\'t be added</string> <string name="about">About</string> <string name="programs_to_enroll">Programs to enroll</string> - <string name="select_all">select all</string> - <string name="clear_all">clear selection</string> - <string name="empty_program_list">There is no information for the filters selected. Please try changing them.</string> <string name="share">Share</string> <string name="share_qr">Share QR</string> - <string name="teiType_search_online">Search by type is not possible for online search.\nPlease select a program from the list.</string> - <string name="max">Max</string> - <string name="current">Current</string> <string name="tei">TEI</string> <string name="teis">TEIs</string> - <string name="limit_by_organisation_unit">Limit by organisation unit</string> - <string name="limit_by_program">Limit by program</string> - <string name="programs_list">Program list</string> <string name="wipe_data">Reset app data &amp; configuration</string> - <string name="add_relationship_error">It\'s not possible to add this relationship</string> <string name="warning_error_on_complete_title">Check this!</string> - <string name="warning_on_complete_title">Warning</string> - <string name="error_on_complete_title">Error</string> <string name="save">Save</string> <string name="reserved_value">Reserved Values</string> - <string name="downloaded_confirm">Do you want to add more data from QR?</string> - <!--ABOUT--> <string name="ramp_capture_version">RAMPcapture Version: %s</string> <string name="about_app">DHIS2 App Version: %s</string> @@ -370,148 +229,45 @@ <string name="about_dev">Developed and maintained by the <a href="https://www.dhis2.org/">DHIS2</a> project, part of University of Oslo, <a href="https://www.mn.uio.no/ifi/english/">department of informatics</a>.</string> <string name="about_contact">For more information or questions about this application, please write to <a href="mailto:android@dhis2.org">android@dhis2.org</a></string> - <string name="login_error_null_pass">Password is missing. Please fill this field.</string> - <string name="login_error_null_username">Username is missing. Please fill this field.</string> - <string name="login_error_dhis_version">This server is running a dhis version different than 2.29. Update your server version or use the testing environment to proceed.</string> - <string name="login_error_dhis_version_v2">This server is running a dhis version different than %s. Update your server version or use the testing environment to proceed.</string> - <string name="login_error_unsuccessful_response">Something went wrong. Please check that server url, username and password are correct and try again.</string> - <string name="login_error_error_response">The server could not complete this request.</string> - <string name="login_error_default">There has been a problem while trying to log into the server.</string> - <string name="login_error">Login error</string> - <string name="missing_mandatory_fields">Mandatory fields are missing</string> - <string name="online_search_unexpected">Unexpected error while searching online</string> - <string name="online_search_parsing_error">Error while parsing results</string> - <string name="online_search_error">Searching online returned an error</string> - <string name="online_search_response_error">Something went wrong in the server</string> <string name="search_program_not_selected">Select a program to enable enrolling</string> <string name="search_access_error">You don\'t have the requiered permission</string> - <string name="feature_unavaible">This functionality is not ready yet.</string> - <string name="relationship_label_error">Error getting relationship label</string> <string name="all_tei_type">All %s</string> <string name="invalid_phone_number">This is not a valid phone number</string> - <string name="invalid_email">This is not a valid email</string> - <string name="invalid_negative_number">Only negative numbers are allowed</string> <string name="invalid_possitive_zero">Only positive numbers or zero allowed</string> - <string name="invalid_possitive">Only positive numbers are allowed</string> - <string name="invalid_interval">Only values from 0 to 1 are allowed</string> - <string name="invalid_percentage">Only values from 0 to 100 are allowed</string> - <string name="date_dialog_tigle">Select dates to filter</string> <string name="select_option">Select option</string> - <string name="issue_reported">Issue reported</string> - <string name="dialog_generate_new_event">Generate new event</string> - <string name="message_generate_new_event">Do you want to create another event?</string> <string name="event_completed_title">Events Completed</string> <string name="event_completed_message">All events in this program are completed. Would you like to close the program as well?</string> - <string name="complete_enrollment_message">Would you like to complete the enrollment as well?</string> <string name="complete_enrollment_message_V2">Would you like to complete the %s as well?</string> <string name="check_event">Check</string> <string name="menu_home">Home</string> <string name="appwidget_text">EXAMPLE</string> - <string name="add_widget">Add widget</string> <string name="showHelp">Show help</string> - <string name="tuto_settings_1">Synchronize your data…</string> - <string name="tuto_settings_2">…your configuration…</string> - <string name="tuto_settings_3">…set how many records to download from server…</string> - <string name="tuto_settings_reserved">Check and manage how many reserved values are left</string> - <string name="tuto_settings_errors">Check if a connection to the server failed</string> - <string name="tuto_settings_reset">Free some disk space</string> - <string name="tuto_settings_4">…or delete everything to start over.</string> - <string name="tuto_search_1_v2">Find your entities both in your local device and the online server.</string> - <string name="tuto_search_2">You can switch to other programs</string> - <string name="tuto_search_3_v2">Search or Add new entities. You need to search before you can add a new one!</string> - <string name="tuto_search_4_v2">Click here to clean the fields and restart the search.</string> <string name="tuto_dashboard_1">This is the entity dashboard</string> <string name="tuto_dashboard_2">See entities profile information…</string> - <string name="tuto_dashboard_3">…Share information via QR or SMS…</string> - <string name="tuto_dashboard_4">…Or mark the entity for follow-up</string> - <string name="tuto_dashboard_5">Click to create or schedule an event or refer to another Org Unit.</string> <string name="tuto_dashboard_6">Here you will see all events. Click to see an event detail.</string> <string name="tuto_dashboard_7">Navigate through the menu to add relationships, see indicators or write notes.</string> - <string name="tuto_dashboard_8">Click to see all enrollments of your entity or create a new one.</string> - <string name="tuto_tei_event_1">Click to delete this event. This action can not be undone.</string> - <string name="tuto_tei_event_2">Complete the event.</string> - <string name="tuto_program_event_1">All events related to this program will be listed here.</string> - <string name="tuto_program_event_2">Click to add a new event</string> <string name="tuto_event_initial_new_1">Enter all data to create the event</string> <string name="tuto_event_initial_1">Click to check the event completion status.</string> - <string name="tuto_event_summary">Click to complete or re-open an event</string> - <string name="tuto_main_7">Read and store information from other devices via QR</string> - <string name="tuto_main_8">Synchronize your data with the server</string> - <string name="tuto_main_9">Block session with a 4 digit code. Do not forget your code!</string> - <string name="tuto_main_10">Log out to change user or server. You will be able to log in again even if there is no internet connection.</string> - <string name="text_plus_colon">%s:</string> <string name="relationships">relationships</string> <string name="empty_tei_add">There are no events registered, click \"+\" to add a new one.</string> - <string name="empty_tei_no_add">There are no events registered.</string> <string name="qr_data_values">Data values</string> <string name="info">Info</string> <string name="qr_no_id_error">Could not read this Id</string> <string name="delete_local_data">Delete local data</string> <string name="dashboard_overview">Overview</string> - <string name="dashboard_relationships">Relationships</string> - <string name="dashboard_indicators">Indicators</string> - <string name="dashboard_analytics">Analytics</string> <string name="empty_indicators">There are no indicators for this program.</string> - <string name="dashboard_notes">Notes</string> - <string name="unable_to_complete">Unable to complete</string> - <string name="unable_to_save">Unable to save</string> - <string name="warnings_in_form">There are warnings in the form</string> - <string name="what_to_do">What do yo want to do?</string> - <string name="field_errors">Some fields have errors. Please, check them to be able to complete</string> <string name="unselect_enrollment">All enrollments</string> <string name="unselect_enrollment_description">Show dashboard with all active programs</string> - <string name="CHECK_SYNC_ERRORS">Open sync errors log</string> <string name="error_dialog_title">Sync error log</string> <string name="share_with">Share with...</string> - <string name="errors_during_sync">Your configuration sync has failed. There could be errors in your server. Click here for more information.</string> - <string name="sectionSelectorPrev">PREV</string> - <string name="sectionSelectorNext">NEXT</string> - <string name="event_overview">Details</string> - <string name="event_indicators">Indicators</string> - <string name="event_notes">Notes</string> - <string name="complete_add_new"><![CDATA[Complete & add new]]></string> - <string name="complete_later">Complete later</string> - <string name="finish_add_new"><![CDATA[Finish & add new]]></string> - <string name="finish">Finish</string> - <string name="error_fields_title">Fields with errors</string> - <string name="error_fields_events">Some fields have errors. They have not been saved. Please, check them.</string> <string name="unique_warning">The value should be unique, a coincidence has been found. It has not been saved. Please check it.</string> - <string name="unique_coincidence_found">A coincidence in a unique field has been found. Please check form to save Enrollment.</string> <string name="please_wait">Please wait</string> <string name="skip">Skip</string> - <string name="reschedule">Reschedule</string> <string name="no_intructions">There is no information for this screen</string> - <string name="event_overdue">Overdue</string> - <string name="unsupported_program_rule">There is one program rule which is not supported. Please check the documentation</string> - <string name="empty_description">No info for this field</string> - <string name="biometrics_dialog_title">Empty Credentials</string> - <string name="biometrics_first_use_text">To be able to log in using the fingerprint scanner you first need to use the default way</string> - <string name="biometrics_security_title">Biometric Security</string> - <string name="biometrics_login_title">Quick login</string> - <string name="biometrics_login_text">Would you like to use your fingerprint or another biometric method to log in?</string> - <string name="tab_tables">Tables</string> - <string name="table">Table</string> - <string name="login_https">https://</string> <string name="delete_local_data_message">Non synchronized data will be lost. Do you really want to continue?</string> - <string name="local_data_accept">Accept</string> <string name="delete_local_data_error">Data could not be deleted. Please retry.</string> <string name="delete_local_data_done">Delete local data finished successfully.</string> - <string name="org_unit_selection_warning">At least one organisation unit must be selected</string> - <string name="send_user_name_title">Send data</string> - <string name="send_user_name_mesage">Help DHIS2 improve this app by sharing error logs associated to your user id.</string> - <string name="improve_app_msg_title">Do you want to help us improve this app?</string> - <string name="improve_app_msg_text">If you say yes the app will send anonymous statistics and error logs which help us improve user experience and performance.\n\nFor further details, please refer to our privacy policy.</string> - <string name="improve_app_msg_clickable_word">privacy policy</string> - <string name="check_mandatory_field">Check fields</string> - <string name="error_no_network_during_sync">You lost your internet connection while performing your configuration sync. Please try again later</string> - <string name="action_agree">Agree</string> - <string name="action_continue">Continue</string> - <string name="login_server_info_title">Server url</string> - <string name="login_server_info_message">Enter the DHIS 2 server url for your organisation as provided by your system administrator.\n\nAlternatively, you can scan a QR code containing the URL of your server</string> - <string name="forgot_your_code">Forgot your code?</string> - <string name="event_form_end_options_title">What would you like to do for this event?</string> - <string name="sectionSelectorEnd">END</string> <string name="resource_not_found">%s not found</string> <string name="relationship_not_found_message">The record you are trying to access is not available. Would you like to search for it?</string> <string name="sync_by_sms">Synced by SMS</string> @@ -519,33 +275,16 @@ <string name="state_uploading">Uploading</string> <string name="state_relationship">Relationship</string> <string name="sent_by_sms">Sent by sms</string> - <string name="no_conflicts_message">There are no conflicts for this program</string> - <string name="network_unavailable_sms">Network connection is not available, but it looks like there is phone services - you can use SMS.</string> - <string name="network_unavailable">Network connection is not available.</string> <string name="action_close">Close</string> <string name="tuto_main_11">Now you can check sync information by clicking here</string> - <string name="no_conflicts_update_message">This data is stored in your device only, it is not synced with the server.</string> - <string name="no_conflicts_synced_message">You are up to date! All your data is sent to the server.</string> <string name="relationship_error_recursive">You can\'t relate a record with itself</string> - <string name="unblock_session">Unblock session</string> - <string name="data_set_complete">Complete</string> - <string name="data_set_open">Open</string> - <string name="unsupported_value_type">Unsupported value type</string> <string name="change_calendar_view">Change calendar view</string> - <string name="data_every_fifteen_minutes">15 minutes</string> - <string name="data_every_hour">Every hour</string> - <string name="data_every_day">Daily</string> - <string name="data_every_week">Weekly</string> - <string name="period_week">Week</string> - <string name="sync_setting">Synchronization setting: %s</string> <string name="relationship_without_enrollment">The record you are trying to access has no enrollment. You can\'t access the dashboard.</string> <string name="formatting_error">Formatting error</string> <string name="dashboard_menu_delete_tei_v2">Delete %s</string> <string name="delete_authority_error">You do not have the authority to delete this record</string> - <string name="validation_url">This is not a valid url</string> <string name="adjusting_form">Adjusting form…</string> - <string name="sms_receiver_number">Receiver number</string> <string name="sms_amount_question">Do you accept to send %d messages?</string> <string name="sms_sending">Sending %1$d/%2$d</string> <string name="sms_waiting_amount_confirm">Waiting amount confirmation - %d</string> @@ -563,51 +302,29 @@ <string name="sms_error_no_gateway_set">No gateway set</string> <string name="sms_error_no_user_login">User not logged in</string> <string name="sms_error_module_disabled">SMS module is disabled</string> - <string name="sms_error_ongoing_sunmission">Another SMS submission ongoing</string> <string name="sms_metadata_empty">SMS module not initiated, not found required metadata</string> - <string name="sms_completed">Completed</string> <string name="sms_count_error">SMS count not accepted</string> <string name="sms_state_started">Started sms submission</string> <string name="sms_state_converted">Data read and converted. Submission id: %d</string> - <string name="sms_general_error">Error sending sms submission</string> <string name="sms_title_enrollment">SMS TEI registration and enrollment</string> <string name="sms_title_event">SMS event submission</string> <string name="sms_title_data_set">SMS data set submission</string> - <string name="sms_bar_state_starting">Starting</string> - <string name="sms_bar_state_sending">In progress</string> - <string name="sms_bar_state_sent">Sent</string> - <string name="sms_bar_state_failed">Failed</string> - <string name="start_sync_granular">Starting synchronization.</string> <string name="syncing">Synchronizing...</string> - <string name="end_sync_granular">Synchronization completed.</string> - <string name="error_sync">Error has happened during synchronization.</string> - <string name="error_sync_check_logs">An error has happened during synchronization. Click here to check error logs</string> - <string name="cancel_sync">Cancelled synchronization.</string> <string name="copied_text">Copied</string> - <string name="image_selected">Image selected</string> - <string name="show_in_map">Show in map</string> - <string name="show_list">Show list</string> <!--region TRACKER IMPORT CONFLICT MESSAGES--> - <string name="value_required_but_not_provided">%s is mandatory but has not been provided.</string> - <string name="polygon_captured">Polygon captured</string> <string name="polygon">Polygon</string> <!--endregion--> - <string name="fingerprint_title">Fingerprint</string> - <string name="fingerprint_message">Please, put your finger in your fingerprint reader.</string> <string name="security_title">Security</string> <string name="security_rooted_message">For security reasons, this version of the app is not allow to be used in rooted devices. Please use the training version.</string> - <string name="fix_error">There are some errors. Please fix them before continuing.</string> <string name="filters_active">Filters applying</string> <string name="filters_disabled">No filters applied</string> <string name="filters_title_period">Period</string> <string name="filters_title_org_unit">Org. Unit</string> - <string name="filters_title_sorting">Sorting</string> - <string name="filters_title_status">Status</string> <string name="filters_title_state">Sync</string> <string name="filters_title_assigned">Assigned to me</string> <string name="filter_period_today">Today</string> @@ -622,26 +339,19 @@ <string name="filter_period_form_to">From - To</string> <string name="filter_period_other">Other</string> <string name="filter_period_any">Anytime</string> - <string name="data_values_error_sync_message">Sync failed. Sync failed. Check the data values to try to fix the problem and try again. If it keeps failing contact your system administrator</string> - <string name="sms_synced_message">This data has been sent to the server but it is not guaranteed to have been stored</string> <string name="filter_event_status_open">Open</string> <string name="filter_event_status_schedule">Schedule</string> <string name="filter_event_status_overdue">Overdue</string> <string name="filter_event_status_visited">Visited</string> <string name="filter_event_status_completed">Completed</string> <string name="filter_event_status_skipped">Skipped</string> - <string name="event_tei_limits">Events:%smax:%s%scurrent:%s TEI:%smax:%s%scurrent:%s</string> - <string name="event_tei_limits_v2">Settings limited %s\nEvents: %s/%s TEI: %s/%s</string> <string name="limit_setting">Settings limited %s</string> - <string name="enrollment_data_hide">Hide enrollment data</string> - <string name="enrollment_data_show">Show enrollment data</string> <string name="sms_enabled">SMS module enabled</string> <string name="sms_disabled">SMS module disabled</string> <string name="sms_downloading_data">Downloading data for SMS module. Please wait</string> <string name="sms_empty_gateway">SMS gateway can\'t be empty</string> <string name="granular_sync_enrollments_empty">There are no enrollments to upload</string> <string name="granular_sync_unsupported_task">This convertTask is not supported</string> - <string name="disable_pin_locked">Don´t show again lock screen</string> <string name="set_pin">Set pin</string> <string name="conflict">Conflict</string> <string name="change_event_date">Change date</string> @@ -671,11 +381,7 @@ <string name="choose_ou">Choose organisation unit</string> <string name="enter_url">Enter url</string> <string name="enter_value">Enter value</string> - <string name="choose_image">Choose image</string> - <string name="scan_code">Scan code</string> - <string name="choose_option">Choose option</string> <string name="reserved_values_hint">Reserved values downloaded per TEI attribute</string> - <string name="settings_reserved_values_message">Reserved values downloaded per TEI attribute</string> <string name="reserved_values_left">%s reserved values left</string> <string name="manage_reserved_values_button">Manage reserved values</string> <string name="events_to_download">Events to download</string> @@ -695,60 +401,31 @@ <string name="filter_sync_not_synced">Not Synced</string> <string name="filter_sync_error">Sync Error</string> <string name="filter_sync_sms">SMS Synced</string> - <string name="dataset_overview">Details</string> - <string name="dataset_comments">Comments</string> <string name="saved">Saved!</string> - <string name="run_validation_rules">Do you want to check data quality?</string> - <string name="validation_success_title">Everything looks good!</string> - <string name="mark_dataset_complete">Do you also want to complete the data set?</string> - <string name="dataset_completed">Mark as completed</string> - <string name="name">Name</string> - <string name="formula">Formula</string> - <string name="complete_anyway">Complete anyway</string> <string name="fk_message">Missing %s %s from %s %s</string> <string name="filters_title_event_status">Event status</string> <string name="filters_title_enrollment_status" translatable="false">@string/enrollment_status</string> - <string name="enrollment_date">Enrollment date</string> <string name="dataset_empty_list_can_create">There are no data. Click \"+\" to add new a new record</string> <string name="dataset_emtpy_list_can_not_create">There are no data. You don\'t have permission to add new records.</string> <string name="validation_rules_empty_description">No description or instruction provided</string> <string name="validation_rules_data_to_review">Data to review</string> - <string name="dataset_saved_completed">Saved and completed!</string> <string name="status_change_error_active_exist">There is already an active enrollment</string> <string name="enrollment_status_active">Open</string> <string name="enrollment_status_completed">Complete</string> <string name="enrollment_status_cancelled">Cancelled</string> <string name="unknownValue" translatable="false">-</string> - <string name="event_data">Data</string> <string name="download_tei_error">The selected %s could not be downloaded.</string> - <string name="completed_by">Completed by %s: %s</string> - <string name="updated_time">Updated: %s</string> - <string name="action_done">Done</string> - <string name="validation_internal_error_datasets">We could not check data quality. Contact your administrator</string> - <string name="are_you_sure">Are you sure?</string> - <string name="reopen_question">Do you want to re-open the data set?</string> <string name="filters_title_date">Date</string> - <string name="filters_title_event_date">Event date</string> - <string name="tei_type_has_no_attributes">%s has no public attributes. Please select a program</string> <string name="privacy_policy_title">Privacy Policy</string> <string name="open_privacy_policy">Click here to check our <a href="">privacy policy</a> </string> - <string name="coordinates_error">Coordinates values are not valid</string> - <string name="break_glass_error">You cannot enroll TEIs from other org units in this program because it is protected.\nContact your administrator.</string> <string name="break_glass_error_v2">You cannot enroll a %s from other org units in this program because it is protected.\nContact your administrator.</string> <string name="field_is_mandatory">This field is mandatory</string> <string name="security_debugger_message">For security reasons, this version of the app is not allow to be used with adb. Please use the training version.</string> <string name="customactivityoncrash_error_activity_error_occurred_explanation">Oops! Something didn\'t go as planned.\nLet us get you back in action.</string> <string name="customactivityoncrash_error_activity_restart_app">Go back</string> - <string name="customactivityoncrash_error_activity_close_app">Close app</string> - <string name="customactivityoncrash_error_activity_error_details">More details</string> - <string name="customactivityoncrash_error_activity_error_details_title">More details</string> - <string name="customactivityoncrash_error_activity_error_details_close">Close</string> <string name="customactivityoncrash_error_activity_error_details_copy">Copy to clipboard</string> - <string name="customactivityoncrash_error_activity_error_details_copied">Copied to clipboard</string> - <string name="customactivityoncrash_error_activity_error_details_clipboard_label">Error information</string> <string name="metada_first_sync_error">We found an error when syncing with your server. Share the error with your system administrator if possible.</string> - <string name="error_init_session">We could not init the session with your user</string> <string name="enrollment_date_edition_warning">There are planned events that won\'t be re-scheduled</string> <string name="section_charts">Charts</string> <string name="navigation_list_view">List</string> @@ -804,49 +481,28 @@ <string name="section_feedback">Feedback</string> <string name="section_indicators">Indicators</string> <string name="camera_permission_denied">Camera permission is denied.\nYou need to enable it to use this feature.</string> - <string name="value">Value</string> <string name="section_charts_indicators">Charts and indicators</string> <string name="take_photo">Take Photo</string> - <string name="from_gallery">Choose from gallery</string> - <string name="data_set_quality_check_done">Done!</string> <string name="break_glass_dialog_title">This program is protected</string> <string name="break_glass_hint">Describe the reason here</string> - <string name="authenticating">Authenticating</string> - <string name="login_error_no_dhis_instance">Provided server url is not a dhis instance</string> - <string name="login_error_bad_credentials">Wrong credentials</string> - <string name="login_error_unknown_host">Unknown server</string> - <string name="invalid_integer">Value must be an integer</string> <string name="openid_session_expired">The session has expired</string> <string name="openid_session_expired_message">Your current session has expired. For security reasons you will need to provide your credentials again</string> - <string name="dataset_column_default">Values</string> <string name="period_span_default_label" translatable="false">%s - %s</string> <string name="week_period_span_default_label">Week %d %s to %s</string> <string name="biweek_period_span_default_label" translatable="false">%d %s - %d %s</string> <string name="action_do_not_show_again">Do not show again</string> <string name="feature_configuration">Feature Configuration</string> <string name="show_radar_graph">Show as Radar</string> - <string name="coordinate_feature_type_error">Can not set coordinate type</string> <string name="filter_follow_up_label">Followed up %s</string> - <string name="wrong_date_format">%s can\'t be parsed as a date</string> <string name="update_field_error">This field could not be updated. Please try again</string> - <string name="edition">Edition</string> - <string name="available">Available</string> <string name="blocked_by_completion">This data is not editable because is marked as completed</string> <string name="edition_expired">This data is not editable because its edition time is expired</string> <string name="edition_no_write_access">You do not have permission to edit this data</string> <string name="event_date_not_in_orgunit_range">This data is not editable because the organization unit is closed</string> <string name="edition_no_catcombo_access">You do not have permission to edit this data</string> - <string name="edition_orgunit_capture_scope">You cannot edit data from this organisation unit</string> - <string name="reload_list">Reset search</string> + <string name="edition_orgunit_user_scope">You cannot edit data from this organisation unit</string> <string name="error_tei_online_search_title">The online search returned the following message:</string> - <string name="program_rules_loop_warning_title">Program rules warning</string> - <string name="program_rules_loop_warning_message">There is a configuration issue causing a loop in the rules. Contact you administrator.</string> - <string name="granular_sync_refresh">REFRESH</string> - <string name="unknown_date">Unknown</string> - <string name="granular_sync_refresh_title">Refresh all data</string> - <string name="max_accounts_text">You have reached the maximum number of accounts (%d). To add a new account, log in and delete one of your accounts</string> <string name="delete_account">Delete Account</string> - <string name="manage_accounts">Manage Accounts</string> <string name="main_menu_troubleshooting">Configuration troubleshooting</string> <string name="troubleshooting_language_title">Language</string> <string name="troubleshooting_language_description">Tap here to change the language of the application</string> @@ -865,7 +521,6 @@ <string name="search_no_results">There are no results for this search</string> <string name="search_too_many_results">Too many results</string> <string name="search_too_many_results_message">Try changing your search to narrow down the results.</string> - <string name="search_create_new">Create new</string> <string name="search_new_te_type">New %s</string> <string name="search_new_te_type_with_last_biometrics">New %s with last biometrics</string> <string name="search_min_attributes_message">It is necessary to enter at least %s attributes to search</string> @@ -877,7 +532,6 @@ <string name="missing_error_fields_events">Some fields have errors and they are not saved. \nDo you want to review the form?</string> <string name="event_can_be_completed">Do you want to mark this form as complete?</string> <string name="event_error_on_complete">You have some error messages.\nDo you want to review them?</string> - <string name="changes_will_be_discarted">If you exit now the changes will be discarded.</string> <string name="re_opened">Re-opened</string> <string name="account_disable_title">Account disabled</string> <string name="account_disable_message">Your account has been disabled by an administrator.</string> @@ -887,27 +541,10 @@ <string name="customactivityoncrash_error_activity_current_date">Current date: %s</string> <string name="customactivityoncrash_error_activity_device">Device: %s</string> <string name="customactivityoncrash_error_activity_os_version">Os version: %s</string> - <string name="open_details">Open %s details</string> - <string name="tracked_entity_type_details">%s details</string> <string name="syncing_resource">Syncing %s…</string> - <string name="sms_sync_waiting_for_response">SMS sent. Waiting for server response.</string> - <string name="sms_sync_sms_reached_server">SMS confirmed to reach server. Updating Status</string> - <string name="sms_sync_sms_reached_server_error">We can\'t confirm the SMS reached the server. Updating Status</string> - <string name="sms_sync_sent">SMS sent. Updating status.</string> - <string name="sms_sync_not_sent">SMS not sent.</string> - <string name="sms_sync_opening_app">Opening SMS app. Do not modify the message please.</string> <string name="sms_sync_sms_app_chooser_title">Send Sms with</string> <string name="sms_sync_is_sms_sent">Did you send the sms?</string> - <string name="sms_sync_manual_confirmation">Awaiting manual confirmation</string> - <string name="syncing_events">Syncing events</string> - <string name="syncing_teis">Syncing tracked entities</string> - <string name="syncing_data_sets">Syncing data sets</string> - <string name="syncing_resources">Syncing resources</string> - <string name="syncing_done">Syncing done</string> - <string name="sms_available_for_individual_records">SMS sync is available but has to be accessed for each individual record</string> <string name="downloading_image_resources">Downloading images...</string> - <string name="program_description">Program description</string> - <string name="wrong_pin">Wrong pin</string> <string name="enrolledIn">Enrolled in</string> <string name="ownedBy">Owned by</string> <string name="sync_dialog_title_not_synced">Sync needed</string> @@ -927,20 +564,11 @@ <string name="sync_dialog_action_refresh">Refresh</string> <string name="sync_dialog_action_not_now">Not now</string> <string name="tap_to_explore_action">Tap here to explore</string> - <plurals name="error_count_label"> - <item quantity="one">%s error</item> - <item quantity="other">%s errors</item> - </plurals> - <plurals name="warning_count_label"> - <item quantity="one">%s warning</item> - <item quantity="other">%s warnings</item> - </plurals> <string name="new_version_message">App version <b>%s</b> is now available. Do you want to download it?</string> <string name="software_update">Software update</string> <string name="remind_me_later">Later</string> <string name="download_now">Download now</string> <string name="check_for_updates">Check for updates</string> - <string name="checking_for_updates">Checking for updates</string> <string name="no_updates">There are no new updates</string> <string name="unknow_sources_denied">Unknown sources permission is denied.\nYou need to enable it to install version.</string> <string name="storage_denied">Storage permission is denied.\nYou need to enable it to install version.</string> @@ -982,18 +610,10 @@ <string name="program_stage">Program stage</string> <string name="event">event</string> <string name="timeline">Timeline</string> - <string name="clear_search">Clear search</string> - <string name="optional">Optional</string> <string name="database_export_downloaded">Database downloaded</string> - <string name="importing_database">Importing database</string> - <string name="empty_search_attributes_message">There are no search fields configured to use.\nPlease contact your admin.</string> <string name="show_more">Show more</string> <string name="show_less">Show less</string> <string name="sync">Sync</string> - <string name="show_fields">Show fields</string> - <string name="hide_fields">Hide fields</string> - <string name="importing_successful">Import successful</string> - <string name="section_misconfigured">This section is misconfigured.\nContact your administrator.</string> <string name="successful_sync">Successful sync</string> <string name="syncing_something">Syncing %s…</string> <string name="file_resources">file resources</string> @@ -1010,4 +630,20 @@ <string name="complete_enrollment_label">Complete %s</string> <string name="deactivate_enrollment_label">Deactivate %s</string> <string name="reopen_enrollment_label">Re-open %s</string> + <string name="main_menu_developer_scree">Developer options</string> + + <plurals name="error_count_label"> + <item quantity="one">%s error</item> + <item quantity="other">%s errors</item> + </plurals> + + <plurals name="warning_count_label"> + <item quantity="one">%s warning</item> + <item quantity="other">%s warnings</item> + </plurals> + + <plurals name="settings_specific_programs"> + <item quantity="one">There is %s program with specific settings</item> + <item quantity="other">There are %s programs with specific settings</item> + </plurals> </resources> diff --git a/app/src/test/java/org/dhis2/bindings/SettingsExtensionsTest.kt b/app/src/test/java/org/dhis2/bindings/SettingsExtensionsTest.kt index c2cc572746f..21bb995381c 100644 --- a/app/src/test/java/org/dhis2/bindings/SettingsExtensionsTest.kt +++ b/app/src/test/java/org/dhis2/bindings/SettingsExtensionsTest.kt @@ -8,6 +8,7 @@ class SettingsExtensionsTest { private val metadataSyncingPeriods = arrayListOf( EVERY_HOUR, + EVERY_6_HOUR, EVERY_12_HOUR, EVERY_24_HOUR, EVERY_7_DAYS, diff --git a/app/src/test/java/org/dhis2/bindings/TEICardExtensionsTest.kt b/app/src/test/java/org/dhis2/bindings/TEICardExtensionsTest.kt index 6aa51739cbf..dd5fb510726 100644 --- a/app/src/test/java/org/dhis2/bindings/TEICardExtensionsTest.kt +++ b/app/src/test/java/org/dhis2/bindings/TEICardExtensionsTest.kt @@ -8,6 +8,7 @@ import org.dhis2.commons.resources.ColorUtils import org.dhis2.commons.resources.ResourceManager import org.dhis2.mobile.commons.model.MetadataIconData import org.hisp.dhis.android.core.common.ObjectStyle +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.program.Program import org.junit.Test import org.mockito.kotlin.any @@ -128,5 +129,7 @@ class TEICardExtensionsTest { .color("color") .icon("icon") .build(), - ).build() + ).categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) + .build() } diff --git a/app/src/test/java/org/dhis2/data/dhislogic/DhisEnrollmentUtilsTest.kt b/app/src/test/java/org/dhis2/data/dhislogic/DhisEnrollmentUtilsTest.kt index 0fe12fafebd..bc018e273e9 100644 --- a/app/src/test/java/org/dhis2/data/dhislogic/DhisEnrollmentUtilsTest.kt +++ b/app/src/test/java/org/dhis2/data/dhislogic/DhisEnrollmentUtilsTest.kt @@ -47,6 +47,7 @@ class DhisEnrollmentUtilsTest { .builder() .uid("enrollmentUid") .status(EnrollmentStatus.CANCELLED) + .attributeOptionCombo("attributeOptionComboUid") .build() val result = dhisEnrollmentUtils.isEventEnrollmentOpen( @@ -92,6 +93,7 @@ class DhisEnrollmentUtilsTest { .builder() .uid("enrollmentUid") .status(EnrollmentStatus.ACTIVE) + .attributeOptionCombo("attributeOptionComboUid") .build() val result = dhisEnrollmentUtils.isEventEnrollmentOpen( diff --git a/app/src/test/java/org/dhis2/data/dhislogic/DhisPeriodUtilsTest.kt b/app/src/test/java/org/dhis2/data/dhislogic/DhisPeriodUtilsTest.kt index 423bc8ad1ae..7e32ff6d492 100644 --- a/app/src/test/java/org/dhis2/data/dhislogic/DhisPeriodUtilsTest.kt +++ b/app/src/test/java/org/dhis2/data/dhislogic/DhisPeriodUtilsTest.kt @@ -154,6 +154,31 @@ class DhisPeriodUtilsTest { ) } + @Test + fun `WeeklyFriday period should return expected result`() { + whenever( + periodHelper.blockingGetPeriodForPeriodTypeAndDate( + PeriodType.WeeklyFriday, + testDate, + ), + ) doReturn + Period + .builder() + .periodId("2019ThuW2") + .startDate(GregorianCalendar(2019, 0, 11).time) + .endDate(GregorianCalendar(2019, 0, 17).time) + .build() + + Assert.assertEquals( + "Week 0 2019-01-11 To 2019-01-17", + periodUtils.getPeriodUIString( + PeriodType.WeeklyFriday, + testDate, + Locale.ENGLISH, + ), + ) + } + @Test fun `WeeklySaturday period should return expected result`() { whenever( @@ -430,6 +455,31 @@ class DhisPeriodUtilsTest { ) } + @Test + fun `FinancialFeb period should return expected result`() { + whenever( + periodHelper.blockingGetPeriodForPeriodTypeAndDate( + PeriodType.FinancialFeb, + testDate, + ), + ) doReturn + Period + .builder() + .periodId("periodId") + .startDate(GregorianCalendar(2018, 1, 1).time) + .endDate(GregorianCalendar(2019, 0, 31).time) + .build() + + Assert.assertEquals( + "Feb 2018 - Jan 2019", + periodUtils.getPeriodUIString( + PeriodType.FinancialFeb, + testDate, + Locale.ENGLISH, + ), + ) + } + @Test fun `FinancialApril period should return expected result`() { whenever( @@ -480,6 +530,56 @@ class DhisPeriodUtilsTest { ) } + @Test + fun `FinancialAug period should return expected result`() { + whenever( + periodHelper.blockingGetPeriodForPeriodTypeAndDate( + PeriodType.FinancialAug, + testDate, + ), + ) doReturn + Period + .builder() + .periodId("periodId") + .startDate(GregorianCalendar(2018, 7, 1).time) + .endDate(GregorianCalendar(2019, 6, 31).time) + .build() + + Assert.assertEquals( + "Aug 2018 - Jul 2019", + periodUtils.getPeriodUIString( + PeriodType.FinancialAug, + testDate, + Locale.ENGLISH, + ), + ) + } + + @Test + fun `FinancialSep period should return expected result`() { + whenever( + periodHelper.blockingGetPeriodForPeriodTypeAndDate( + PeriodType.FinancialSep, + testDate, + ), + ) doReturn + Period + .builder() + .periodId("periodId") + .startDate(GregorianCalendar(2018, 8, 1).time) + .endDate(GregorianCalendar(2019, 7, 31).time) + .build() + + Assert.assertEquals( + "Sep 2018 - Aug 2019", + periodUtils.getPeriodUIString( + PeriodType.FinancialSep, + testDate, + Locale.ENGLISH, + ), + ) + } + @Test fun `FinancialOct period should return expected result`() { whenever( diff --git a/app/src/test/java/org/dhis2/data/dhislogic/EnrollmentEventGeneratorTest.kt b/app/src/test/java/org/dhis2/data/dhislogic/EnrollmentEventGeneratorTest.kt index dff2410bd0c..77fc808aa2d 100644 --- a/app/src/test/java/org/dhis2/data/dhislogic/EnrollmentEventGeneratorTest.kt +++ b/app/src/test/java/org/dhis2/data/dhislogic/EnrollmentEventGeneratorTest.kt @@ -1,6 +1,7 @@ package org.dhis2.data.dhislogic import org.dhis2.commons.Constants +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.period.PeriodType import org.hisp.dhis.android.core.program.Program @@ -163,6 +164,7 @@ class EnrollmentEventGeneratorTest { GregorianCalendar(2019, 0, 1).time, ).program(PROGRAM_UID) .organisationUnit(ENROLLMENT_ORG_UNIT) + .attributeOptionCombo("attributeOptionComboUid") .build() private fun mockedProgram(useFirstStage: Boolean) = @@ -170,6 +172,8 @@ class EnrollmentEventGeneratorTest { .builder() .uid(PROGRAM_UID) .useFirstStageDuringRegistration(useFirstStage) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() private fun mockedAutogeneratedEvents( diff --git a/app/src/test/java/org/dhis2/data/filter/FilterRepositoryTest.kt b/app/src/test/java/org/dhis2/data/filter/FilterRepositoryTest.kt index fb4eb711151..1fa1ddc8cb8 100644 --- a/app/src/test/java/org/dhis2/data/filter/FilterRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/data/filter/FilterRepositoryTest.kt @@ -18,6 +18,7 @@ import org.dhis2.commons.filters.workingLists.ProgramStageToWorkingListItemMappe import org.dhis2.commons.filters.workingLists.TeiFilterToWorkingListItemMapper import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.category.CategoryCombo +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.program.Program import org.hisp.dhis.android.core.settings.FilterSetting import org.hisp.dhis.android.core.settings.HomeFilter @@ -211,6 +212,8 @@ class FilterRepositoryTest { Program .builder() .uid("random") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .programType(org.hisp.dhis.android.core.program.ProgramType.WITH_REGISTRATION) .build() val catCombo = @@ -286,6 +289,8 @@ class FilterRepositoryTest { Program .builder() .uid("random") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .programType(org.hisp.dhis.android.core.program.ProgramType.WITH_REGISTRATION) .build() val catCombo = @@ -380,6 +385,8 @@ class FilterRepositoryTest { Program .builder() .uid("random") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .programType(org.hisp.dhis.android.core.program.ProgramType.WITH_REGISTRATION) .build() val catCombo = @@ -459,6 +466,8 @@ class FilterRepositoryTest { Program .builder() .uid("random") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .programType(org.hisp.dhis.android.core.program.ProgramType.WITH_REGISTRATION) .trackedEntityType( TrackedEntityType @@ -600,6 +609,8 @@ class FilterRepositoryTest { Program .builder() .uid("random") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .programType(org.hisp.dhis.android.core.program.ProgramType.WITH_REGISTRATION) .trackedEntityType( TrackedEntityType diff --git a/app/src/test/java/org/dhis2/data/forms/dataentry/ValueStoreTest.kt b/app/src/test/java/org/dhis2/data/forms/dataentry/ValueStoreTest.kt index d177b550eec..c8442c42f7d 100644 --- a/app/src/test/java/org/dhis2/data/forms/dataentry/ValueStoreTest.kt +++ b/app/src/test/java/org/dhis2/data/forms/dataentry/ValueStoreTest.kt @@ -1,13 +1,18 @@ package org.dhis2.data.forms.dataentry +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.flowOf import org.dhis2.commons.data.EntryMode import org.dhis2.commons.network.NetworkUtils import org.dhis2.commons.resources.ResourceManager +import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.dhislogic.DhisEnrollmentUtils import org.dhis2.form.model.ValueStoreResult +import org.dhis2.mobile.commons.network.NetworkStatusProvider import org.dhis2.mobile.commons.providers.FieldErrorMessageProvider import org.dhis2.mobile.commons.reporting.CrashReportController import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.android.core.dataelement.DataElement import org.hisp.dhis.android.core.option.Option @@ -27,14 +32,18 @@ class ValueStoreTest { private lateinit var dvValueStore: ValueStore private val d2: D2 = Mockito.mock(D2::class.java, Mockito.RETURNS_DEEP_STUBS) private val dhisEnrollmentUtils: DhisEnrollmentUtils = DhisEnrollmentUtils(d2) - private val fieldErrorMessageProvider: FieldErrorMessageProvider = mock() private val crashReportController: CrashReportController = mock() - private val networkUtils: NetworkUtils = mock() + private val networkStatusProvider: NetworkStatusProvider = mock() private val searchTEIRepository: SearchTEIRepository = mock() private val resourceManager: ResourceManager = mock() + private val dispatchers: DispatcherProvider = + mock { + on { io() } doReturn Dispatchers.IO + } @Before fun setUp() { + whenever(networkStatusProvider.connectionStatus) doReturn flowOf(false) attrValueStore = ValueStoreImpl( d2, @@ -42,10 +51,10 @@ class ValueStoreTest { EntryMode.ATTR, dhisEnrollmentUtils, crashReportController, - networkUtils, searchTEIRepository, - fieldErrorMessageProvider, resourceManager, + networkStatusProvider, + dispatchers, ) deValueStore = ValueStoreImpl( @@ -54,10 +63,10 @@ class ValueStoreTest { EntryMode.DE, dhisEnrollmentUtils, crashReportController, - networkUtils, searchTEIRepository, - fieldErrorMessageProvider, resourceManager, + networkStatusProvider, + dispatchers, ) dvValueStore = ValueStoreImpl( @@ -66,10 +75,10 @@ class ValueStoreTest { EntryMode.DV, dhisEnrollmentUtils, crashReportController, - networkUtils, searchTEIRepository, - fieldErrorMessageProvider, resourceManager, + networkStatusProvider, + dispatchers, ) } @@ -346,6 +355,7 @@ class ValueStoreTest { .builder() .uid("fieldUid") .valueType(ValueType.TEXT) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build() val storeResult = deValueStore.deleteOptionValueIfSelected( @@ -418,6 +428,7 @@ class ValueStoreTest { .builder() .uid(testingUid) .valueType(ValueType.TEXT) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build() whenever( d2 @@ -509,6 +520,7 @@ class ValueStoreTest { .builder() .uid("uid") .valueType(ValueType.TEXT) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build() private fun mockedUniqueAttribute(): TrackedEntityAttribute = diff --git a/app/src/test/java/org/dhis2/data/services/SyncPresenterTest.kt b/app/src/test/java/org/dhis2/data/services/SyncPresenterTest.kt index 0803f07bf51..8c262cbac20 100644 --- a/app/src/test/java/org/dhis2/data/services/SyncPresenterTest.kt +++ b/app/src/test/java/org/dhis2/data/services/SyncPresenterTest.kt @@ -1,48 +1,33 @@ package org.dhis2.data.services -import io.reactivex.Completable -import io.reactivex.Completable.complete import io.reactivex.Observable -import io.reactivex.Observable.fromArray -import io.reactivex.Observable.just +import org.dhis2.commons.bindings.event import org.dhis2.commons.bindings.program import org.dhis2.commons.prefs.PreferenceProvider -import org.dhis2.commons.simprints.ramp.repository.RampDatastoreRepository as SimprintsRampDatastoreRepository import org.dhis2.data.service.SyncPresenterImpl import org.dhis2.data.service.SyncRepository import org.dhis2.data.service.SyncResult -import org.dhis2.data.service.SyncStatusController -import org.dhis2.data.service.workManager.WorkManagerController -import org.dhis2.utils.analytics.AnalyticsHelper +import org.dhis2.mobile.sync.domain.SyncStatusController import org.hisp.dhis.android.core.D2 -import org.hisp.dhis.android.core.arch.call.BaseD2Progress import org.hisp.dhis.android.core.arch.call.D2Progress import org.hisp.dhis.android.core.arch.call.D2ProgressStatus import org.hisp.dhis.android.core.arch.call.D2ProgressSyncStatus import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.event.Event -import org.hisp.dhis.android.core.fileresource.FileResourceDomainType import org.hisp.dhis.android.core.program.Program import org.hisp.dhis.android.core.program.ProgramType -import org.hisp.dhis.android.core.settings.GeneralSettings -import org.hisp.dhis.android.core.settings.GeneralSettings.builder import org.hisp.dhis.android.core.settings.LimitScope import org.hisp.dhis.android.core.settings.ProgramSetting import org.hisp.dhis.android.core.settings.ProgramSettings +import org.hisp.dhis.android.core.settings.SynchronizationSettings import org.hisp.dhis.android.core.trackedentity.TrackedEntityInstance import org.hisp.dhis.android.core.tracker.exporter.TrackerD2Progress -import org.junit.Assert.assertThrows import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import org.mockito.Mockito -import org.mockito.kotlin.any import org.mockito.kotlin.doReturn -import org.mockito.kotlin.doThrow import org.mockito.kotlin.mock -import org.mockito.kotlin.times -import org.mockito.kotlin.verify -import org.mockito.kotlin.verifyNoMoreInteractions import org.mockito.kotlin.whenever class SyncPresenterTest { @@ -50,11 +35,8 @@ class SyncPresenterTest { private val d2: D2 = Mockito.mock(D2::class.java, Mockito.RETURNS_DEEP_STUBS) private val preferences: PreferenceProvider = mock() - private val workManagerController: WorkManagerController = mock() - private val analyticsHelper: AnalyticsHelper = mock() private val syncStatusController: SyncStatusController = mock() private val syncRepository: SyncRepository = mock() - private val simprintsRampDatastoreRepository: SimprintsRampDatastoreRepository = mock() @Before fun setUp() { @@ -62,11 +44,8 @@ class SyncPresenterTest { SyncPresenterImpl( d2, preferences, - workManagerController, - analyticsHelper, - syncStatusController, syncRepository, - simprintsRampDatastoreRepository, + syncStatusController, ) } @@ -78,8 +57,14 @@ class SyncPresenterTest { 200, LimitScope.GLOBAL, ) + val mockedSyncSettings = + mock<SynchronizationSettings> { + on { programSettings() } doReturn mockedProgramSettings + } - whenever(d2.settingModule().programSetting().blockingGet()) doReturn mockedProgramSettings + whenever( + d2.settingModule().synchronizationSettings().blockingGet(), + ) doReturn mockedSyncSettings val (eventLimit, limitByOU, limitByProgram) = presenter.getDownloadLimits() @@ -95,8 +80,14 @@ class SyncPresenterTest { LimitScope.PER_OU_AND_PROGRAM, ) - whenever(d2.settingModule().programSetting().blockingGet()) doReturn mockedProgramSettings + val mockedSyncSettings = + mock<SynchronizationSettings> { + on { programSettings() } doReturn mockedProgramSettings + } + whenever( + d2.settingModule().synchronizationSettings().blockingGet(), + ) doReturn mockedSyncSettings val (eventLimit, limitByOU, limitByProgram) = presenter.getDownloadLimits() assertTrue(eventLimit == 200 && limitByOU && limitByProgram) @@ -111,8 +102,14 @@ class SyncPresenterTest { LimitScope.PER_PROGRAM, ) - whenever(d2.settingModule().programSetting().blockingGet()) doReturn mockedProgramSettings + val mockedSyncSettings = + mock<SynchronizationSettings> { + on { programSettings() } doReturn mockedProgramSettings + } + whenever( + d2.settingModule().synchronizationSettings().blockingGet(), + ) doReturn mockedSyncSettings val (eventLimit, limitByOU, limitByProgram) = presenter.getDownloadLimits() assertTrue(eventLimit == 200 && !limitByOU && limitByProgram) @@ -127,200 +124,19 @@ class SyncPresenterTest { LimitScope.PER_ORG_UNIT, ) - whenever(d2.settingModule().programSetting().blockingGet()) doReturn mockedProgramSettings + val mockedSyncSettings = + mock<SynchronizationSettings> { + on { programSettings() } doReturn mockedProgramSettings + } + whenever( + d2.settingModule().synchronizationSettings().blockingGet(), + ) doReturn mockedSyncSettings val (eventLimit, limitByOU, limitByProgram) = presenter.getDownloadLimits() assertTrue(eventLimit == 200 && limitByOU && !limitByProgram) } - @Test - fun `Should configure secondary tracker if configuration exists`() { - whenever( - d2.metadataModule().download(), - ) doReturn - Observable.fromArray( - BaseD2Progress.empty(2), - ) - whenever( - d2.settingModule().generalSetting().blockingGet(), - ) doReturn - GeneralSettings - .builder() - .encryptDB(false) - .matomoID(11111) - .matomoURL("MatomoURL") - .build() - whenever( - d2.mapsModule().mapLayersDownloader().downloadMetadata(), - ) doReturn Completable.complete() - - whenever( - d2 - .fileResourceModule() - .fileResourceDownloader() - .byDomainType() - .eq(FileResourceDomainType.ICON) - .download(), - ) doReturn Observable.just(BaseD2Progress.empty(1)) - - presenter.syncMetadata { } - - verify(analyticsHelper, times(1)).updateMatomoSecondaryTracker(any(), any(), any()) - } - - @Test - fun `Should not configure secondary tracker if matomo settings is missing`() { - whenever( - d2.metadataModule().download(), - ) doReturn - Observable.fromArray( - BaseD2Progress.empty(2), - ) - whenever( - d2.settingModule().generalSetting().blockingGet(), - ) doReturn - GeneralSettings - .builder() - .encryptDB(false) - .build() - whenever( - d2.mapsModule().mapLayersDownloader().downloadMetadata(), - ) doReturn Completable.complete() - whenever( - d2 - .fileResourceModule() - .fileResourceDownloader() - .byDomainType() - .eq(FileResourceDomainType.ICON) - .download(), - ) doReturn Observable.just(BaseD2Progress.empty(1)) - presenter.syncMetadata { } - - verifyNoMoreInteractions(analyticsHelper) - } - - @Test - fun `Should not configure secondary tracker if no configuration exists`() { - whenever( - d2.metadataModule().download(), - ) doReturn - Observable.fromArray( - BaseD2Progress.empty(2), - ) - whenever( - d2.settingModule().generalSetting().blockingGet(), - ) doReturn null - whenever( - d2.mapsModule().mapLayersDownloader().downloadMetadata(), - ) doReturn Completable.complete() - whenever( - d2.mapsModule().mapLayersDownloader().downloadMetadata(), - ) doReturn Completable.complete() - whenever( - d2 - .fileResourceModule() - .fileResourceDownloader() - .byDomainType() - .eq(FileResourceDomainType.ICON) - .download(), - ) doReturn Observable.just(BaseD2Progress.empty(1)) - presenter.syncMetadata { } - - verify(analyticsHelper, times(0)).updateMatomoSecondaryTracker(any(), any(), any()) - } - - @Test - fun `Should clear secondary tracker`() { - whenever( - d2.metadataModule().download(), - ) doReturn - Observable.fromArray( - BaseD2Progress.empty(2), - ) - whenever( - d2.settingModule().generalSetting().blockingGet(), - ) doReturn null - whenever( - d2.mapsModule().mapLayersDownloader().downloadMetadata(), - ) doReturn Completable.complete() - whenever( - d2 - .fileResourceModule() - .fileResourceDownloader() - .byDomainType() - .eq(FileResourceDomainType.ICON) - .download(), - ) doReturn Observable.just(BaseD2Progress.empty(1)) - presenter.syncMetadata { } - - verify(analyticsHelper, times(0)).updateMatomoSecondaryTracker(any(), any(), any()) - verify(analyticsHelper).clearMatomoSecondaryTracker() - } - - @Test - fun `Should sync simprints ramp datastore when syncing metadata`() { - whenever( - d2.metadataModule().download(), - ) doReturn fromArray(BaseD2Progress.empty(2)) - whenever( - d2.settingModule().generalSetting().blockingGet(), - ) doReturn - builder() - .encryptDB(false) - .build() - whenever( - d2.mapsModule().mapLayersDownloader().downloadMetadata(), - ) doReturn complete() - whenever( - d2 - .fileResourceModule() - .fileResourceDownloader() - .byDomainType() - .eq(FileResourceDomainType.ICON) - .download(), - ) doReturn just(BaseD2Progress.empty(1)) - - presenter.syncMetadata { } - - verify(simprintsRampDatastoreRepository).sync() - } - - @Test - fun `Should throw when simprints ramp datastore sync fails`() { - whenever( - d2.metadataModule().download(), - ) doReturn fromArray(BaseD2Progress.empty(2)) - whenever( - d2.settingModule().generalSetting().blockingGet(), - ) doReturn - builder() - .encryptDB(false) - .build() - whenever( - d2.mapsModule().mapLayersDownloader().downloadMetadata(), - ) doReturn complete() - whenever( - d2 - .fileResourceModule() - .fileResourceDownloader() - .byDomainType() - .eq(FileResourceDomainType.ICON) - .download(), - ) doReturn just(BaseD2Progress.empty(1)) - - val syncError = RuntimeException("network down") - whenever(simprintsRampDatastoreRepository.sync()) doThrow syncError - - val thrown = - assertThrows(RuntimeException::class.java) { - presenter.syncMetadata { } - } - - assertTrue(thrown === syncError) - verify(simprintsRampDatastoreRepository).sync() - } - @Test fun `Should return successfully SYNC if tei enrollment and events are ok`() { whenever( @@ -501,8 +317,14 @@ class SyncPresenterTest { eventUid: String = "uid", programUid: String = "programUid", ) { + whenever(d2.event(eventUid)) doReturn + Event + .builder() + .uid(eventUid) + .program(programUid) + .build() whenever( - syncRepository.downLoadEvent(eventUid), + syncRepository.downLoadEvent(eventUid, programUid), ) doReturn Observable.fromArray( TrackerD2Progress.builder().build(), diff --git a/app/src/test/java/org/dhis2/data/sorting/SearchSortingValueSetterTest.kt b/app/src/test/java/org/dhis2/data/sorting/SearchSortingValueSetterTest.kt index 36203ba359f..26136ea205f 100644 --- a/app/src/test/java/org/dhis2/data/sorting/SearchSortingValueSetterTest.kt +++ b/app/src/test/java/org/dhis2/data/sorting/SearchSortingValueSetterTest.kt @@ -4,16 +4,23 @@ import org.dhis2.commons.filters.Filters import org.dhis2.commons.filters.sorting.SortingItem import org.dhis2.commons.filters.sorting.SortingStatus import org.dhis2.data.enrollment.EnrollmentUiDataHelper +import org.dhis2.tracker.search.model.DomainEnrollment +import org.dhis2.tracker.search.model.DomainObjectStyle +import org.dhis2.tracker.search.model.DomainProgram +import org.dhis2.tracker.search.model.EnrollmentStatus +import org.dhis2.tracker.search.model.GeometryFeatureType +import org.dhis2.tracker.search.model.SyncState +import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult +import org.dhis2.tracker.search.model.TrackedEntityTypeAttributeDomain +import org.dhis2.tracker.search.model.TrackedEntityTypeDomain import org.dhis2.usescases.searchTrackEntity.SearchTeiModel import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.arch.repositories.scope.RepositoryScope -import org.hisp.dhis.android.core.enrollment.Enrollment -import org.hisp.dhis.android.core.enrollment.EnrollmentStatus +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.event.Event import org.hisp.dhis.android.core.event.EventStatus import org.hisp.dhis.android.core.organisationunit.OrganisationUnit import org.hisp.dhis.android.core.program.Program -import org.hisp.dhis.android.core.trackedentity.TrackedEntityInstance import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test @@ -21,14 +28,32 @@ import org.mockito.Mockito import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock import org.mockito.kotlin.whenever -import java.time.Instant import java.util.Date +import kotlin.time.Instant as KtlInstant +import java.time.Instant class SearchSortingValueSetterTest { lateinit var searchSortingValueSetter: SearchSortingValueSetter private val d2: D2 = Mockito.mock(D2::class.java, Mockito.RETURNS_DEEP_STUBS) private val enrollmentUiDataHelper: EnrollmentUiDataHelper = mock() - + private val enrollmentUid = "enrollmentUid" + private val programUid = "programUid" + private val enrollmentOrgUnit = "enrollmentOrgUnit" + private val teiUid = "teiUid" + private val selectedEnrollment = DomainEnrollment( + uid = enrollmentUid, + orgUnit = enrollmentOrgUnit, + program = programUid, + enrollmentDate = KtlInstant.parse("2020-01-01T00:00:00.00Z"), + incidentDate = KtlInstant.parse("2020-01-01T00:00:00.00Z"), + completedDate = KtlInstant.parse("2020-01-01T00:00:00.00Z"), + followUp = false, + status = EnrollmentStatus.ACTIVE, + trackedEntityInstance = teiUid, + ) + private val enrollments = listOf( + selectedEnrollment + ) @Before fun setUp() { searchSortingValueSetter = @@ -50,14 +75,14 @@ class SearchSortingValueSetterTest { .eventModule() .events() .byEnrollmentUid() - .eq(""), + .eq("enrollmentUid"), ) doReturn mock() whenever( d2 .eventModule() .events() .byEnrollmentUid() - .eq("") + .eq("enrollmentUid") .byDeleted(), ) doReturn mock() whenever( @@ -65,7 +90,7 @@ class SearchSortingValueSetterTest { .eventModule() .events() .byEnrollmentUid() - .eq("") + .eq("enrollmentUid") .byDeleted() .isFalse, ) doReturn mock() @@ -74,7 +99,7 @@ class SearchSortingValueSetterTest { .eventModule() .events() .byEnrollmentUid() - .eq("") + .eq("enrollmentUid") .byDeleted() .isFalse .orderByTimeline(RepositoryScope.OrderByDirection.ASC), @@ -84,7 +109,7 @@ class SearchSortingValueSetterTest { .eventModule() .events() .byEnrollmentUid() - .eq("") + .eq("enrollmentUid") .byDeleted() .isFalse .orderByTimeline(RepositoryScope.OrderByDirection.ASC) @@ -154,7 +179,7 @@ class SearchSortingValueSetterTest { val result = searchSortingValueSetter.setSortingItem( - searchTeiModel(), + generateSearchTeiModel(), SortingItem(Filters.PERIOD, SortingStatus.ASC), ) @@ -215,7 +240,7 @@ class SearchSortingValueSetterTest { val result = searchSortingValueSetter.setSortingItem( - searchTeiModel(), + generateSearchTeiModel(), SortingItem(Filters.PERIOD, SortingStatus.ASC), ) @@ -276,7 +301,7 @@ class SearchSortingValueSetterTest { val result = searchSortingValueSetter.setSortingItem( - searchTeiModel(), + generateSearchTeiModel(), SortingItem(Filters.PERIOD, SortingStatus.ASC), ) @@ -304,7 +329,7 @@ class SearchSortingValueSetterTest { val result = searchSortingValueSetter.setSortingItem( - searchTeiModel(), + generateSearchTeiModel(), SortingItem(Filters.ORG_UNIT, SortingStatus.ASC), ) @@ -329,7 +354,7 @@ class SearchSortingValueSetterTest { val result = searchSortingValueSetter.setSortingItem( - searchTeiModel(), + generateSearchTeiModel(), SortingItem(Filters.ORG_UNIT, SortingStatus.ASC), ) @@ -409,7 +434,7 @@ class SearchSortingValueSetterTest { val result = searchSortingValueSetter.setSortingItem( - searchTeiModel(), + generateSearchTeiModel(), SortingItem(Filters.ENROLLMENT_STATUS, SortingStatus.ASC), ) @@ -447,12 +472,14 @@ class SearchSortingValueSetterTest { Program .builder() .uid("programUid") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .enrollmentDateLabel("programEnrollmentDateLabel") .build() val result = searchSortingValueSetter.setSortingItem( - searchTeiModel(), + generateSearchTeiModel(), SortingItem(Filters.ENROLLMENT_DATE, SortingStatus.ASC), ) @@ -481,11 +508,13 @@ class SearchSortingValueSetterTest { Program .builder() .uid("programUid") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() val result = searchSortingValueSetter.setSortingItem( - searchTeiModel(), + generateSearchTeiModel(), SortingItem(Filters.ENROLLMENT_DATE, SortingStatus.ASC), ) @@ -532,43 +561,66 @@ class SearchSortingValueSetterTest { .build(), ) - private fun searchTeiModel(): SearchTeiModel = - SearchTeiModel().apply { - setCurrentEnrollment( - Enrollment - .builder() - .uid("enrollmentUid") - .organisationUnit("enrollmentOrgUnit") - .status(EnrollmentStatus.ACTIVE) - .program("programUid") - .enrollmentDate(Date.from(Instant.parse("2020-01-01T00:00:00.00Z"))) - .build(), - ) - tei = - TrackedEntityInstance - .builder() - .uid("teiUid") - .organisationUnit("teiOrgUnit") - .build() - } + private fun generateSearchTeiModel(): SearchTeiModel { + val tei = TrackedEntitySearchItemResult( + uid = "teiUid", + created = KtlInstant.parse("2020-01-01T00:00:00.00Z"), + lastUpdated = KtlInstant.parse("2020-01-01T00:00:00.00Z"), + createdAtClient = KtlInstant.parse("2020-01-01T00:00:00.00Z"), + lastUpdatedAtClient = KtlInstant.parse("2020-01-01T00:00:00.00Z"), + ownerOrgUnit = "ownerOrgUnit", + enrollmentOrgUnit = "enrollmentOrgUnit", + shouldDisplayOrgUnit = true, + geometry = null, + syncState = SyncState.SYNCED, + aggregatedSyncState = SyncState.SYNCED, + deleted = false, + isOnline = true, + teTypeName = "teTypeName", + type = TrackedEntityTypeDomain( + trackedEntityTypeAttributeDomains = listOf(TrackedEntityTypeAttributeDomain( + trackedEntityTypeUid= "trackedEntityTypeUid", + trackedEntityAttributeUid = "trackedEntityAttributeUid", + displayInList= true, + mandatory = false, + searchable = true, + sortOrder = 1, + )), + featureType = GeometryFeatureType.POINT, + ), + header = "teiHeader", + overDueDate = null, + selectedEnrollment = selectedEnrollment, + profilePicture = null, + enrolledPrograms = listOf(DomainProgram( + uid = "programUid", + displayName = "programDisplayName", + style = DomainObjectStyle( + icon = "iconUid", + color = "colorUid" + ) + )), + enrollments = enrollments, + relationships = null, + defaultTypeIcon = null, + attributeValues = emptyList(), + ) + val searchTeiModel = SearchTeiModel() + searchTeiModel.tei = tei + return searchTeiModel + } - private fun onlineSearchTeiModel(): SearchTeiModel = - SearchTeiModel().apply { - tei = - TrackedEntityInstance - .builder() - .uid("teiUid") - .organisationUnit("teiOrgUnit") - .build() - } + private fun onlineSearchTeiModel(): SearchTeiModel { + val searchTeiModel = generateSearchTeiModel() + searchTeiModel.tei = searchTeiModel.tei?.copy(isOnline = true) + return searchTeiModel + } + + + private fun searchTeiModelWithoutEnrollment(): SearchTeiModel { + val searchTeiModel = generateSearchTeiModel() + searchTeiModel.tei = searchTeiModel.tei?.copy(selectedEnrollment = null, enrollments = emptyList()) + return searchTeiModel + } - private fun searchTeiModelWithoutEnrollment(): SearchTeiModel = - SearchTeiModel().apply { - tei = - TrackedEntityInstance - .builder() - .uid("teiUid") - .organisationUnit("teiOrgUnit") - .build() - } } diff --git a/app/src/test/java/org/dhis2/simprints/SimprintsLoadBiometricSearchResultsUseCaseTest.kt b/app/src/test/java/org/dhis2/simprints/SimprintsLoadBiometricSearchResultsUseCaseTest.kt index d9d5302e140..1969cdfd61e 100644 --- a/app/src/test/java/org/dhis2/simprints/SimprintsLoadBiometricSearchResultsUseCaseTest.kt +++ b/app/src/test/java/org/dhis2/simprints/SimprintsLoadBiometricSearchResultsUseCaseTest.kt @@ -4,19 +4,18 @@ import androidx.paging.testing.asSnapshot import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import org.dhis2.commons.simprints.usecases.SimprintsOrderSearchResultsByIdentifyResponseUseCase -import org.dhis2.data.search.SearchParametersModel import org.dhis2.form.model.FieldUiModelImpl import org.dhis2.mobile.commons.model.CustomIntentModel -import org.dhis2.usescases.searchTrackEntity.SearchRepository +import org.dhis2.tracker.search.domain.SearchTrackedEntities +import org.dhis2.tracker.search.model.QueryData +import org.dhis2.tracker.search.model.SearchTrackedEntitiesInput +import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult import org.dhis2.usescases.searchTrackEntity.SearchRepositoryKt -import org.dhis2.usescases.searchTrackEntity.SearchTeiModel import org.hisp.dhis.android.core.common.ValueType -import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItem import org.junit.Assert.assertEquals import org.junit.Assert.assertNull import org.junit.Test import org.mockito.kotlin.any -import org.mockito.kotlin.anyOrNull import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock import org.mockito.kotlin.verify @@ -24,74 +23,95 @@ import org.mockito.kotlin.whenever @OptIn(ExperimentalCoroutinesApi::class) class SimprintsLoadBiometricSearchResultsUseCaseTest { - private val searchRepository: SearchRepository = mock() private val searchRepositoryKt: SearchRepositoryKt = mock() + private val searchTrackedEntities: SearchTrackedEntities = mock() private val orderSearchResultsByIdentifyResponse: SimprintsOrderSearchResultsByIdentifyResponseUseCase = mock() private val useCase = SimprintsLoadBiometricSearchResultsUseCase( - searchRepository = searchRepository, searchRepositoryKt = searchRepositoryKt, + searchTrackedEntities = searchTrackedEntities, orderSearchResultsByIdentifyResponse = orderSearchResultsByIdentifyResponse, ) @Test fun `invoke should return ordered biometric search results when available`() = runTest { - val firstItem = mock<TrackedEntitySearchItem>() - val secondItem = mock<TrackedEntitySearchItem>() - val firstModel = searchTeiModel("first") - val secondModel = searchTeiModel("second") + val firstItem = + trackedEntitySearchResult( + uid = "tei-1", + attributeValues = listOf(trackedEntityAttributeValue("biometric", "guid-1")), + ) + val secondItem = + trackedEntitySearchResult( + uid = "tei-2", + attributeValues = listOf(trackedEntityAttributeValue("biometric", "guid-2")), + ) + val firstModel = searchTeiModel("tei-1", "first") + val secondModel = searchTeiModel("tei-2", "second") + whenever( - orderSearchResultsByIdentifyResponse( - any(), - any(), - any<suspend () -> List<TrackedEntitySearchItem>>(), + orderSearchResultsByIdentifyResponse<TrackedEntitySearchItemResult>( + searchFields = any(), + queryData = any(), + searchTrackedEntities = any(), + getUid = any(), + getAttributeValue = any(), ), ) doReturn listOf(secondItem, firstItem) - whenever(searchRepository.transform(secondItem, null, false, null)) doReturn secondModel - whenever(searchRepository.transform(firstItem, null, false, null)) doReturn firstModel + whenever(searchRepositoryKt.mapTrackedEntitySearchItemResultToSearchTeiModel(secondItem, null)) doReturn secondModel + whenever(searchRepositoryKt.mapTrackedEntitySearchItemResultToSearchTeiModel(firstItem, null)) doReturn firstModel val result = useCase( searchItems = listOf(simprintsBiometricSearchField()), - searchParametersModel = - SearchParametersModel( - selectedProgram = null, - queryData = mutableMapOf("biometric" to listOf("guid-1", "guid-2")), + searchInput = + searchInput( + queryDataList = + listOf( + QueryData( + attributeId = "biometric", + values = listOf("guid-1", "guid-2"), + searchOperator = null, + ), + ), ), - isOnline = true, - offlineOnly = false, sortingItem = null, ) assertEquals(listOf(secondModel, firstModel), result?.asSnapshot()) - verify(searchRepository).transform(secondItem, null, false, null) - verify(searchRepository).transform(firstItem, null, false, null) + verify(searchRepositoryKt).mapTrackedEntitySearchItemResultToSearchTeiModel(secondItem, null) + verify(searchRepositoryKt).mapTrackedEntitySearchItemResultToSearchTeiModel(firstItem, null) } @Test fun `invoke should return null when biometric ordering is not available`() = runTest { whenever( - orderSearchResultsByIdentifyResponse( - any(), - any(), - any<suspend () -> List<TrackedEntitySearchItem>>(), + orderSearchResultsByIdentifyResponse<TrackedEntitySearchItemResult>( + searchFields = any(), + queryData = any(), + searchTrackedEntities = any(), + getUid = any(), + getAttributeValue = any(), ), ) doReturn null val result = useCase( searchItems = listOf(simprintsBiometricSearchField()), - searchParametersModel = - SearchParametersModel( - selectedProgram = null, - queryData = mutableMapOf("biometric" to listOf("guid-1")), + searchInput = + searchInput( + queryDataList = + listOf( + QueryData( + attributeId = "biometric", + values = listOf("guid-1"), + searchOperator = null, + ), + ), ), - isOnline = true, - offlineOnly = false, sortingItem = null, ) @@ -117,8 +137,13 @@ class SimprintsLoadBiometricSearchResultsUseCaseTest { ), ) - private fun searchTeiModel(header: String) = - SearchTeiModel().apply { - setHeader(header) - } + private fun searchInput(queryDataList: List<QueryData>) = + SearchTrackedEntitiesInput( + selectedProgram = null, + allowCache = true, + excludeValues = emptySet(), + hasStateFilters = false, + isOnline = true, + queryDataList = queryDataList, + ) } diff --git a/app/src/test/java/org/dhis2/simprints/SimprintsLoadPossibleDuplicatesSearchResultsUseCaseTest.kt b/app/src/test/java/org/dhis2/simprints/SimprintsLoadPossibleDuplicatesSearchResultsUseCaseTest.kt index ea227fdfb08..0db7e494050 100644 --- a/app/src/test/java/org/dhis2/simprints/SimprintsLoadPossibleDuplicatesSearchResultsUseCaseTest.kt +++ b/app/src/test/java/org/dhis2/simprints/SimprintsLoadPossibleDuplicatesSearchResultsUseCaseTest.kt @@ -2,11 +2,10 @@ package org.dhis2.simprints import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest -import org.dhis2.data.search.SearchParametersModel -import org.dhis2.usescases.searchTrackEntity.SearchRepository +import org.dhis2.tracker.search.domain.SearchTrackedEntities +import org.dhis2.tracker.search.model.QueryData +import org.dhis2.tracker.search.model.SearchTrackedEntitiesInput import org.dhis2.usescases.searchTrackEntity.SearchRepositoryKt -import org.dhis2.usescases.searchTrackEntity.SearchTeiModel -import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItem import org.junit.Assert.assertEquals import org.junit.Assert.assertNull import org.junit.Test @@ -19,13 +18,13 @@ import org.mockito.kotlin.whenever @OptIn(ExperimentalCoroutinesApi::class) class SimprintsLoadPossibleDuplicatesSearchResultsUseCaseTest { - private val searchRepository: SearchRepository = mock() private val searchRepositoryKt: SearchRepositoryKt = mock() + private val searchTrackedEntities: SearchTrackedEntities = mock() private val useCase = SimprintsLoadPossibleDuplicatesSearchResultsUseCase( - searchRepository = searchRepository, searchRepositoryKt = searchRepositoryKt, + searchTrackedEntities = searchTrackedEntities, ) @Test @@ -33,9 +32,8 @@ class SimprintsLoadPossibleDuplicatesSearchResultsUseCaseTest { runTest { val result = useCase( - searchParametersModel = SearchParametersModel(selectedProgram = null, queryData = null), - isOnline = true, - offlineOnly = false, + queryDataList = emptyList(), + searchInput = searchInput(emptyList()), sortingItem = null, ) @@ -45,15 +43,19 @@ class SimprintsLoadPossibleDuplicatesSearchResultsUseCaseTest { @Test fun `invoke should return null when query contains only blank values`() = runTest { + val queryDataList = + listOf( + QueryData( + attributeId = "biometric", + values = listOf(" ", ""), + searchOperator = null, + ), + ) + val result = useCase( - searchParametersModel = - SearchParametersModel( - selectedProgram = null, - queryData = mutableMapOf("biometric" to listOf(" ", "")), - ), - isOnline = true, - offlineOnly = false, + queryDataList = queryDataList, + searchInput = searchInput(queryDataList), sortingItem = null, ) @@ -63,50 +65,58 @@ class SimprintsLoadPossibleDuplicatesSearchResultsUseCaseTest { @Test fun `invoke should return transformed possible duplicates results in order`() = runTest { - val item1 = - mock<TrackedEntitySearchItem> { - on { uid() } doReturn "tei-1" - } - val item2 = - mock<TrackedEntitySearchItem> { - on { uid() } doReturn "tei-2" - } + val item1 = trackedEntitySearchResult(uid = "tei-1") + val item2 = trackedEntitySearchResult(uid = "tei-2") - whenever(searchRepositoryKt.searchTrackedEntitiesImmediate(any(), any())).thenAnswer { - val params = it.arguments[0] as SearchParametersModel - when (params.queryData?.get("biometric")?.firstOrNull()) { + whenever(searchTrackedEntities.invokeImmediate(any())).thenAnswer { invocation -> + val input = invocation.arguments[0] as SearchTrackedEntitiesInput + val guidValue = + input + .queryDataList + ?.firstOrNull { queryData -> queryData.attributeId == "biometric" } + ?.values + ?.firstOrNull() + when (guidValue) { "guid-1" -> listOf(item1, item2) "guid-2" -> listOf(item1) else -> emptyList() } } - val model1 = searchTeiModel("model-1") - val model2 = searchTeiModel("model-2") - whenever(searchRepository.transform(item1, null, false, null)) doReturn model1 - whenever(searchRepository.transform(item2, null, false, null)) doReturn model2 + val model1 = searchTeiModel("tei-1", "model-1") + val model2 = searchTeiModel("tei-2", "model-2") + whenever(searchRepositoryKt.mapTrackedEntitySearchItemResultToSearchTeiModel(item1, null)) doReturn model1 + whenever(searchRepositoryKt.mapTrackedEntitySearchItemResultToSearchTeiModel(item2, null)) doReturn model2 + + val queryDataList = + listOf( + QueryData( + attributeId = "biometric", + values = listOf("guid-1", "guid-2"), + searchOperator = null, + ), + ) val result = useCase( - searchParametersModel = - SearchParametersModel( - selectedProgram = null, - queryData = mutableMapOf("biometric" to listOf("guid-1", "guid-2")), - ), - isOnline = true, - offlineOnly = false, + queryDataList = queryDataList, + searchInput = searchInput(queryDataList), sortingItem = null, ) assertEquals(listOf(model1, model2), result) - verify(searchRepositoryKt, times(2)).searchTrackedEntitiesImmediate(any(), any()) - verify(searchRepository).transform(item1, null, false, null) - verify(searchRepository).transform(item2, null, false, null) + verify(searchTrackedEntities, times(2)).invokeImmediate(any()) + verify(searchRepositoryKt).mapTrackedEntitySearchItemResultToSearchTeiModel(item1, null) + verify(searchRepositoryKt).mapTrackedEntitySearchItemResultToSearchTeiModel(item2, null) } - private fun searchTeiModel(header: String) = - SearchTeiModel().apply { - setHeader(header) - } + private fun searchInput(queryDataList: List<QueryData>) = + SearchTrackedEntitiesInput( + selectedProgram = null, + allowCache = true, + excludeValues = emptySet(), + hasStateFilters = false, + isOnline = true, + queryDataList = queryDataList, + ) } - diff --git a/app/src/test/java/org/dhis2/simprints/SimprintsResolveSingleBiometricSearchNavigationUseCaseTest.kt b/app/src/test/java/org/dhis2/simprints/SimprintsResolveSingleBiometricSearchNavigationUseCaseTest.kt index eddc1dc31bb..3f48930cf84 100644 --- a/app/src/test/java/org/dhis2/simprints/SimprintsResolveSingleBiometricSearchNavigationUseCaseTest.kt +++ b/app/src/test/java/org/dhis2/simprints/SimprintsResolveSingleBiometricSearchNavigationUseCaseTest.kt @@ -6,19 +6,17 @@ import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.runTest import org.dhis2.commons.filters.FilterManager import org.dhis2.commons.network.NetworkUtils -import org.dhis2.data.search.SearchParametersModel +import org.dhis2.tracker.search.domain.SearchTrackedEntities +import org.dhis2.tracker.search.model.QueryData +import org.dhis2.tracker.search.model.SearchTrackedEntitiesInput import org.dhis2.usescases.searchTrackEntity.SearchRepository import org.dhis2.usescases.searchTrackEntity.SearchRepositoryKt -import org.dhis2.usescases.searchTrackEntity.SearchTeiModel -import org.hisp.dhis.android.core.enrollment.Enrollment +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.program.Program -import org.hisp.dhis.android.core.trackedentity.TrackedEntityInstance -import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItem import org.junit.Assert.assertEquals import org.junit.Assert.assertNull import org.junit.Test import org.mockito.kotlin.any -import org.mockito.kotlin.anyOrNull import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock import org.mockito.kotlin.never @@ -29,33 +27,39 @@ import org.mockito.kotlin.whenever class SimprintsResolveSingleBiometricSearchNavigationUseCaseTest { private val searchRepository: SearchRepository = mock() private val searchRepositoryKt: SearchRepositoryKt = mock() + private val searchTrackedEntities: SearchTrackedEntities = mock() private val networkUtils: NetworkUtils = mock() private val filterManager: FilterManager = mock() @Test fun `invoke should return matched enrollment navigation when a single biometric result is found`() = runTest { - val program = Program.builder().uid("initialProgramUid").build() - val trackedEntity: TrackedEntitySearchItem = mock() + val program = program("initialProgramUid") + val trackedEntity = trackedEntitySearchResult(uid = "teiUid", isOnline = true) val searchTeiModel = searchTeiModel( teiUid = "teiUid", - enrollmentUid = "enrollmentUid", - enrollmentProgramUid = "matchedProgramUid", + selectedEnrollment = + domainEnrollment( + uid = "enrollmentUid", + programUid = "matchedProgramUid", + teiUid = "teiUid", + ), + isOnline = true, ) whenever(searchRepository.getProgram("initialProgramUid")) doReturn program + whenever(searchRepositoryKt.getExcludeValues()) doReturn HashSet() whenever(networkUtils.isOnline()) doReturn true whenever(filterManager.stateFilters) doReturn emptyList() - whenever( - searchRepositoryKt.searchTrackedEntitiesImmediate( - SearchParametersModel( - selectedProgram = program, - queryData = mutableMapOf("biometric" to listOf("guid-1")), + doReturn(listOf(trackedEntity)) + .whenever(searchTrackedEntities) + .invokeImmediate( + searchInput( + selectedProgram = "initialProgramUid", + isOnline = true, ), - true, - ), - ) doReturn listOf(trackedEntity) - whenever(searchRepository.transform(trackedEntity, program, false, null)) doReturn + ) + whenever(searchRepositoryKt.mapTrackedEntitySearchItemResultToSearchTeiModel(trackedEntity, null)) doReturn searchTeiModel val result = @@ -79,22 +83,22 @@ class SimprintsResolveSingleBiometricSearchNavigationUseCaseTest { @Test fun `invoke should fall back to the initial program when the matched result has no selected enrollment`() = runTest { - val program = Program.builder().uid("initialProgramUid").build() - val trackedEntity: TrackedEntitySearchItem = mock() + val program = program("initialProgramUid") + val trackedEntity = trackedEntitySearchResult(uid = "teiUid", isOnline = false) whenever(searchRepository.getProgram("initialProgramUid")) doReturn program + whenever(searchRepositoryKt.getExcludeValues()) doReturn HashSet() whenever(networkUtils.isOnline()) doReturn false whenever(filterManager.stateFilters) doReturn emptyList() - whenever( - searchRepositoryKt.searchTrackedEntitiesImmediate( - SearchParametersModel( - selectedProgram = program, - queryData = mutableMapOf("biometric" to listOf("guid-1")), + doReturn(listOf(trackedEntity)) + .whenever(searchTrackedEntities) + .invokeImmediate( + searchInput( + selectedProgram = "initialProgramUid", + isOnline = false, ), - false, - ), - ) doReturn listOf(trackedEntity) - whenever(searchRepository.transform(trackedEntity, program, true, null)) doReturn - searchTeiModel(teiUid = "teiUid") + ) + whenever(searchRepositoryKt.mapTrackedEntitySearchItemResultToSearchTeiModel(trackedEntity, null)) doReturn + searchTeiModel(teiUid = "teiUid", isOnline = false) val result = useCase(StandardTestDispatcher(testScheduler))( @@ -108,7 +112,7 @@ class SimprintsResolveSingleBiometricSearchNavigationUseCaseTest { teiUid = "teiUid", programUid = "initialProgramUid", enrollmentUid = null, - isOnline = true, + isOnline = false, ), result, ) @@ -125,25 +129,29 @@ class SimprintsResolveSingleBiometricSearchNavigationUseCaseTest { ) assertNull(result) - verify(searchRepositoryKt, never()).searchTrackedEntitiesImmediate(any(), any()) + verify(searchTrackedEntities, never()).invokeImmediate(any()) } @Test fun `invoke should return null when search resolves multiple tracked entities`() = runTest { - val program = Program.builder().uid("initialProgramUid").build() + val program = program("initialProgramUid") whenever(searchRepository.getProgram("initialProgramUid")) doReturn program + whenever(searchRepositoryKt.getExcludeValues()) doReturn HashSet() whenever(networkUtils.isOnline()) doReturn true whenever(filterManager.stateFilters) doReturn emptyList() - whenever( - searchRepositoryKt.searchTrackedEntitiesImmediate( - SearchParametersModel( - selectedProgram = program, - queryData = mutableMapOf("biometric" to listOf("guid-1")), - ), - true, + doReturn( + listOf( + trackedEntitySearchResult(uid = "tei-1"), + trackedEntitySearchResult(uid = "tei-2"), ), - ) doReturn listOf(mock(), mock()) + ).whenever(searchTrackedEntities) + .invokeImmediate( + searchInput( + selectedProgram = "initialProgramUid", + isOnline = true, + ), + ) val result = useCase(StandardTestDispatcher(testScheduler))( @@ -153,38 +161,43 @@ class SimprintsResolveSingleBiometricSearchNavigationUseCaseTest { ) assertNull(result) - verify(searchRepository, never()).transform(any(), anyOrNull(), any(), anyOrNull()) + verify(searchRepositoryKt, never()).mapTrackedEntitySearchItemResultToSearchTeiModel(any(), any()) } private fun useCase(ioDispatcher: CoroutineDispatcher) = SimprintsResolveSingleBiometricSearchNavigationUseCase( searchRepository = searchRepository, searchRepositoryKt = searchRepositoryKt, + searchTrackedEntities = searchTrackedEntities, networkUtils = networkUtils, filterManager = filterManager, ioDispatcher = ioDispatcher, ) - private fun searchTeiModel( - teiUid: String, - enrollmentUid: String? = null, - enrollmentProgramUid: String? = null, - ) = SearchTeiModel().apply { - tei = - TrackedEntityInstance - .builder() - .uid(teiUid) - .trackedEntityType("teiType") - .organisationUnit("orgUnit") - .build() - enrollmentUid?.let { uid -> - setCurrentEnrollment( - Enrollment - .builder() - .uid(uid) - .program(enrollmentProgramUid) - .build(), - ) - } - } + private fun program(uid: String): Program = + Program + .builder() + .uid(uid) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) + .build() + + private fun searchInput( + selectedProgram: String, + isOnline: Boolean, + ) = SearchTrackedEntitiesInput( + selectedProgram = selectedProgram, + allowCache = false, + excludeValues = emptySet(), + hasStateFilters = false, + isOnline = isOnline, + queryDataList = + listOf( + QueryData( + attributeId = "biometric", + values = listOf("guid-1"), + searchOperator = null, + ), + ), + ) } diff --git a/app/src/test/java/org/dhis2/simprints/SimprintsSearchTestModels.kt b/app/src/test/java/org/dhis2/simprints/SimprintsSearchTestModels.kt new file mode 100644 index 00000000000..1e072fa0588 --- /dev/null +++ b/app/src/test/java/org/dhis2/simprints/SimprintsSearchTestModels.kt @@ -0,0 +1,96 @@ +package org.dhis2.simprints + +import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.search.model.DomainEnrollment +import org.dhis2.tracker.search.model.EnrollmentStatus +import org.dhis2.tracker.search.model.GeometryFeatureType +import org.dhis2.tracker.search.model.SyncState +import org.dhis2.tracker.search.model.TrackedEntitySearchItemAttributeDomain +import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult +import org.dhis2.tracker.search.model.TrackedEntityTypeDomain +import org.dhis2.usescases.searchTrackEntity.SearchTeiModel + +internal fun trackedEntitySearchResult( + uid: String, + header: String = uid, + isOnline: Boolean = false, + selectedEnrollment: DomainEnrollment? = null, + attributeValues: List<TrackedEntitySearchItemAttributeDomain> = emptyList(), +): TrackedEntitySearchItemResult = + TrackedEntitySearchItemResult( + uid = uid, + created = null, + lastUpdated = null, + createdAtClient = null, + lastUpdatedAtClient = null, + ownerOrgUnit = null, + enrollmentOrgUnit = null, + shouldDisplayOrgUnit = false, + geometry = null, + syncState = SyncState.SYNCED, + aggregatedSyncState = SyncState.SYNCED, + deleted = false, + isOnline = isOnline, + teTypeName = "Person", + type = + TrackedEntityTypeDomain( + trackedEntityTypeAttributeDomains = emptyList(), + featureType = GeometryFeatureType.NONE, + ), + header = header, + overDueDate = null, + selectedEnrollment = selectedEnrollment, + profilePicture = null, + enrolledPrograms = null, + enrollments = null, + relationships = null, + defaultTypeIcon = null, + attributeValues = attributeValues, + ) + +internal fun trackedEntityAttributeValue( + attribute: String, + value: String?, +): TrackedEntitySearchItemAttributeDomain = + TrackedEntitySearchItemAttributeDomain( + attribute = attribute, + displayName = attribute, + displayFormName = attribute, + value = value, + valueType = TrackerInputType.TEXT, + displayInList = true, + optionSet = null, + ) + +internal fun domainEnrollment( + uid: String, + programUid: String?, + teiUid: String, +): DomainEnrollment = + DomainEnrollment( + uid = uid, + orgUnit = "orgUnit", + program = programUid, + enrollmentDate = null, + incidentDate = null, + completedDate = null, + followUp = false, + status = EnrollmentStatus.ACTIVE, + trackedEntityInstance = teiUid, + ) + +internal fun searchTeiModel( + teiUid: String, + header: String = teiUid, + isOnline: Boolean = false, + selectedEnrollment: DomainEnrollment? = null, +): SearchTeiModel = + SearchTeiModel().apply { + tei = + trackedEntitySearchResult( + uid = teiUid, + header = header, + isOnline = isOnline, + selectedEnrollment = selectedEnrollment, + ) + } diff --git a/app/src/test/java/org/dhis2/simprints/ramp/data/EventHistoryTableRepositoryTest.kt b/app/src/test/java/org/dhis2/simprints/ramp/data/EventHistoryTableRepositoryTest.kt index 37e443480ae..1a0eeacb641 100644 --- a/app/src/test/java/org/dhis2/simprints/ramp/data/EventHistoryTableRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/simprints/ramp/data/EventHistoryTableRepositoryTest.kt @@ -441,6 +441,7 @@ class EventHistoryTableRepositoryTest { .displayShortName("Weight") .displayName("Weight (kg)") .valueType(ValueType.NUMBER) + .categoryCombo(ObjectWithUid.create(CATEGORY_COMBO_UID)) .build() whenever( d2 @@ -455,6 +456,7 @@ class EventHistoryTableRepositoryTest { .displayShortName("Status") .valueType(ValueType.TEXT) .optionSet(ObjectWithUid.create(OPTION_SET_UID)) + .categoryCombo(ObjectWithUid.create(CATEGORY_COMBO_UID)) .build() whenever( d2 @@ -468,6 +470,7 @@ class EventHistoryTableRepositoryTest { .uid(BOOLEAN_UID) .displayShortName("Confirmed") .valueType(ValueType.BOOLEAN) + .categoryCombo(ObjectWithUid.create(CATEGORY_COMBO_UID)) .build() whenever( d2 @@ -481,6 +484,7 @@ class EventHistoryTableRepositoryTest { .uid(EXCLUDED_UID) .displayShortName("Excluded") .valueType(ValueType.TEXT) + .categoryCombo(ObjectWithUid.create(CATEGORY_COMBO_UID)) .build() } @@ -513,7 +517,7 @@ class EventHistoryTableRepositoryTest { ): ProgramStageDataElement = mock { on { programStage() } doReturn programStage - on { dataElement() } doReturn dataElement + on { dataElement() } doReturn ObjectWithUid.create(dataElement.uid()) } private fun event( @@ -541,7 +545,12 @@ class EventHistoryTableRepositoryTest { .value(value) .build() - private fun dataElement(uid: String): DataElement = DataElement.builder().uid(uid).build() + private fun dataElement(uid: String): DataElement = + DataElement + .builder() + .uid(uid) + .categoryCombo(ObjectWithUid.create(CATEGORY_COMBO_UID)) + .build() private data class TestSectionDefinition( val uid: String, @@ -561,5 +570,6 @@ class EventHistoryTableRepositoryTest { const val BOOLEAN_UID = "boolean" const val EXCLUDED_UID = "excluded" const val OPTION_SET_UID = "option-set" + const val CATEGORY_COMBO_UID = "category-combo" } } diff --git a/app/src/test/java/org/dhis2/uicomponents/map/geometry/MapCoordinateFieldToFeatureCollectionTest.kt b/app/src/test/java/org/dhis2/uicomponents/map/geometry/MapCoordinateFieldToFeatureCollectionTest.kt index c63760f9c95..55bcaa81c08 100644 --- a/app/src/test/java/org/dhis2/uicomponents/map/geometry/MapCoordinateFieldToFeatureCollectionTest.kt +++ b/app/src/test/java/org/dhis2/uicomponents/map/geometry/MapCoordinateFieldToFeatureCollectionTest.kt @@ -7,6 +7,7 @@ import org.dhis2.maps.utils.CoordinateAttributeInfo import org.dhis2.maps.utils.CoordinateDataElementInfo import org.hisp.dhis.android.core.common.FeatureType import org.hisp.dhis.android.core.common.Geometry +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.dataelement.DataElement import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.event.Event @@ -69,11 +70,13 @@ class MapCoordinateFieldToFeatureCollectionTest { .builder() .uid("deUid") .displayFormName("deName") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), Enrollment .builder() .uid("enrollmentUid") .trackedEntityInstance("teiUid") + .attributeOptionCombo("attributeOptionComboUid") .build(), Geometry .builder() @@ -96,11 +99,13 @@ class MapCoordinateFieldToFeatureCollectionTest { .builder() .uid("de2Uid") .displayFormName("de2Name") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), Enrollment .builder() .uid("enrollmentUid") .trackedEntityInstance("teiUid") + .attributeOptionCombo("attributeOptionComboUid") .build(), Geometry .builder() @@ -123,11 +128,13 @@ class MapCoordinateFieldToFeatureCollectionTest { .builder() .uid("deUid") .displayFormName("deName") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), Enrollment .builder() .uid("enrollmentUid") .trackedEntityInstance("teiUid") + .attributeOptionCombo("attributeOptionComboUid") .build(), Geometry .builder() diff --git a/app/src/test/java/org/dhis2/uicomponents/map/geometry/mapper/featurecollection/MapDataElementToFeatureTest.kt b/app/src/test/java/org/dhis2/uicomponents/map/geometry/mapper/featurecollection/MapDataElementToFeatureTest.kt index 41076b5017b..4945cb931f5 100644 --- a/app/src/test/java/org/dhis2/uicomponents/map/geometry/mapper/featurecollection/MapDataElementToFeatureTest.kt +++ b/app/src/test/java/org/dhis2/uicomponents/map/geometry/mapper/featurecollection/MapDataElementToFeatureTest.kt @@ -6,6 +6,7 @@ import org.dhis2.maps.utils.CoordinateDataElementInfo import org.dhis2.uicomponents.map.geometry.MapEventToFeatureCollectionTest import org.hisp.dhis.android.core.common.FeatureType import org.hisp.dhis.android.core.common.Geometry +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.dataelement.DataElement import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.event.Event @@ -78,11 +79,13 @@ class MapDataElementToFeatureTest { .builder() .uid("deUid") .displayFormName("deName") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), Enrollment .builder() .uid("enrollmentUid") .trackedEntityInstance("teiUid") + .attributeOptionCombo("attributeOptionComboUid") .build(), Geometry .builder() @@ -105,11 +108,13 @@ class MapDataElementToFeatureTest { .builder() .uid("de2Uid") .displayFormName("de2Name") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), Enrollment .builder() .uid("enrollmentUid") .trackedEntityInstance("teiUid") + .attributeOptionCombo("attributeOptionComboUid") .build(), Geometry .builder() @@ -132,11 +137,13 @@ class MapDataElementToFeatureTest { .builder() .uid("deUid") .displayFormName("deName") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), Enrollment .builder() .uid("enrollmentUid") .trackedEntityInstance("teiUid") + .attributeOptionCombo("attributeOptionComboUid") .build(), Geometry .builder() diff --git a/app/src/test/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailRepositoryTest.kt index c4bd86431a0..466ed46772e 100644 --- a/app/src/test/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailRepositoryTest.kt @@ -3,6 +3,7 @@ package org.dhis2.usescases.datasets.datasetDetail import dhis2.org.analytics.charts.Charts import io.reactivex.Single import org.dhis2.commons.resources.DhisPeriodUtils +import org.dhis2.data.dhislogic.AUTH_ALL import org.dhis2.data.dhislogic.AUTH_DATAVALUE_ADD import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.category.CategoryCombo @@ -103,14 +104,14 @@ class DataSetDetailRepositoryTest { .userModule() .authorities() .byName() - .eq(AUTH_DATAVALUE_ADD), + .`in`(AUTH_DATAVALUE_ADD, AUTH_ALL), ) doReturn mock() whenever( d2 .userModule() .authorities() .byName() - .eq(AUTH_DATAVALUE_ADD) + .`in`(AUTH_DATAVALUE_ADD, AUTH_ALL) .blockingIsEmpty(), ) doReturn false @@ -165,14 +166,14 @@ class DataSetDetailRepositoryTest { .userModule() .authorities() .byName() - .eq(AUTH_DATAVALUE_ADD), + .`in`(AUTH_DATAVALUE_ADD, AUTH_ALL), ) doReturn mock() whenever( d2 .userModule() .authorities() .byName() - .eq(AUTH_DATAVALUE_ADD) + .`in`(AUTH_DATAVALUE_ADD, AUTH_ALL) .blockingIsEmpty(), ) doReturn true @@ -235,14 +236,14 @@ class DataSetDetailRepositoryTest { .userModule() .authorities() .byName() - .eq(AUTH_DATAVALUE_ADD), + .`in`(AUTH_DATAVALUE_ADD, AUTH_ALL), ) doReturn mock() whenever( d2 .userModule() .authorities() .byName() - .eq(AUTH_DATAVALUE_ADD) + .`in`(AUTH_DATAVALUE_ADD, AUTH_ALL) .blockingIsEmpty(), ) doReturn false @@ -311,14 +312,14 @@ class DataSetDetailRepositoryTest { .userModule() .authorities() .byName() - .eq(AUTH_DATAVALUE_ADD), + .`in`(AUTH_DATAVALUE_ADD, AUTH_ALL), ) doReturn mock() whenever( d2 .userModule() .authorities() .byName() - .eq(AUTH_DATAVALUE_ADD) + .`in`(AUTH_DATAVALUE_ADD, AUTH_ALL) .blockingIsEmpty(), ) doReturn false diff --git a/app/src/test/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailViewModelTest.kt b/app/src/test/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailViewModelTest.kt index bcebeeba2ab..d0010d2e98d 100644 --- a/app/src/test/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailViewModelTest.kt +++ b/app/src/test/java/org/dhis2/usescases/datasets/datasetDetail/DataSetDetailViewModelTest.kt @@ -1,12 +1,15 @@ package org.dhis2.usescases.datasets.datasetDetail import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import androidx.lifecycle.ViewModelStore import junit.framework.TestCase.assertEquals import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.setMain import org.dhis2.commons.viewmodel.DispatcherProvider +import org.junit.After import org.junit.Before import org.junit.Rule import org.junit.Test @@ -19,18 +22,27 @@ class DataSetDetailViewModelTest { @get:Rule val executorRule = InstantTaskExecutorRule() + private val testingDispatcher = UnconfinedTestDispatcher() + private val viewModelStore = ViewModelStore() private val dispatcher: DispatcherProvider = mock { - on { io() } doReturn Dispatchers.IO + on { io() } doReturn testingDispatcher } private val dataSetPageConfigurator: DataSetPageConfigurator = mock() private val initializedConfigurator: DataSetPageConfigurator = mock() private lateinit var viewModel: DataSetDetailViewModel + @After + fun tearDown() { + viewModelStore.clear() + testingDispatcher.scheduler.advanceUntilIdle() + Dispatchers.resetMain() + } + @Before fun setUp() { - Dispatchers.setMain(UnconfinedTestDispatcher()) + Dispatchers.setMain(testingDispatcher) } @Test @@ -41,7 +53,7 @@ class DataSetDetailViewModelTest { DataSetDetailViewModel( dispatcher, dataSetPageConfigurator, - ) + ).also { viewModelStore.put("DataSetDetailViewModel", it) } viewModel.pageConfiguration.observeForever { result -> assertEquals(result, initializedConfigurator) } diff --git a/app/src/test/java/org/dhis2/usescases/datasets/datasetDetail/datasetlist/DataSetListViewModelTest.kt b/app/src/test/java/org/dhis2/usescases/datasets/datasetDetail/datasetlist/DataSetListViewModelTest.kt index 0d5e30f80a3..b0761a17be7 100644 --- a/app/src/test/java/org/dhis2/usescases/datasets/datasetDetail/datasetlist/DataSetListViewModelTest.kt +++ b/app/src/test/java/org/dhis2/usescases/datasets/datasetDetail/datasetlist/DataSetListViewModelTest.kt @@ -1,13 +1,15 @@ package org.dhis2.usescases.datasets.datasetDetail.datasetlist import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import androidx.lifecycle.ViewModelStore import io.reactivex.Flowable import io.reactivex.processors.FlowableProcessor import io.reactivex.processors.PublishProcessor import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.setMain import org.dhis2.commons.filters.FilterManager import org.dhis2.commons.matomo.Actions @@ -19,6 +21,7 @@ import org.dhis2.usescases.datasets.datasetDetail.DataSetDetailModel import org.dhis2.usescases.datasets.datasetDetail.DataSetDetailRepository import org.dhis2.usescases.datasets.datasetDetail.datasetList.DataSetListViewModel import org.hisp.dhis.android.core.common.State +import org.junit.After import org.junit.Before import org.junit.Rule import org.junit.Test @@ -29,40 +32,39 @@ import org.mockito.kotlin.verify import org.mockito.kotlin.whenever import java.util.Date +@OptIn(ExperimentalCoroutinesApi::class) class DataSetListViewModelTest { @get:Rule val instantTaskExecutorRule = InstantTaskExecutorRule() private lateinit var viewModel: DataSetListViewModel + private val viewModelStore = ViewModelStore() private val repository: DataSetDetailRepository = mock() private val filterManager: FilterManager = mock() private val matomoAnalyticsController: MatomoAnalyticsController = mock() - private val testingDispatcher = StandardTestDispatcher() + private val testingDispatcher = UnconfinedTestDispatcher() - private val filterProcessor: FlowableProcessor<FilterManager> = PublishProcessor.create() - private val filterManagerFlowable = Flowable.just(filterManager).startWith(filterProcessor) + private lateinit var filterProcessor: FlowableProcessor<FilterManager> + private lateinit var filterManagerFlowable: Flowable<FilterManager> + + @After + fun tearDown() { + filterProcessor.onComplete() + viewModelStore.clear() + testingDispatcher.scheduler.advanceUntilIdle() + Dispatchers.resetMain() + } - @OptIn(ExperimentalCoroutinesApi::class) @Before fun setUp() { Dispatchers.setMain(testingDispatcher) + filterProcessor = PublishProcessor.create() + filterManagerFlowable = Flowable.just(filterManager).startWith(filterProcessor) whenever(filterManager.asFlowable()) doReturn filterManagerFlowable whenever(repository.canWriteAny()) doReturn Flowable.just(true) - viewModel = - DataSetListViewModel( - repository, - filterManager, - matomoAnalyticsController, - object : DispatcherProvider { - override fun io(): CoroutineDispatcher = testingDispatcher - - override fun computation(): CoroutineDispatcher = testingDispatcher - - override fun ui(): CoroutineDispatcher = testingDispatcher - }, - ) + viewModel = createViewModel() } @Test @@ -71,19 +73,7 @@ class DataSetListViewModelTest { whenever( repository.dataSetGroups(any(), any(), any(), any()), ) doReturn Flowable.just(dataSets) - viewModel = - DataSetListViewModel( - repository, - filterManager, - matomoAnalyticsController, - object : DispatcherProvider { - override fun io(): CoroutineDispatcher = testingDispatcher - - override fun computation(): CoroutineDispatcher = testingDispatcher - - override fun ui(): CoroutineDispatcher = testingDispatcher - }, - ) + viewModel = createViewModel() testingDispatcher.scheduler.advanceUntilIdle() assert(viewModel.datasets.value == dataSets) } @@ -120,6 +110,20 @@ class DataSetListViewModelTest { verify(filterManager).publishData() } + private fun createViewModel() = + DataSetListViewModel( + repository, + filterManager, + matomoAnalyticsController, + object : DispatcherProvider { + override fun io(): CoroutineDispatcher = testingDispatcher + + override fun computation(): CoroutineDispatcher = testingDispatcher + + override fun ui(): CoroutineDispatcher = testingDispatcher + }, + ).also { viewModelStore.put("DataSetListViewModel", it) } + private fun dummyDataSet() = DataSetDetailModel( "", diff --git a/app/src/test/java/org/dhis2/usescases/enrollment/EnrollmentFormRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/enrollment/EnrollmentFormRepositoryTest.kt index 8b59fa59d37..0d5185fd534 100644 --- a/app/src/test/java/org/dhis2/usescases/enrollment/EnrollmentFormRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/usescases/enrollment/EnrollmentFormRepositoryTest.kt @@ -3,6 +3,7 @@ package org.dhis2.usescases.enrollment import org.dhis2.data.dhislogic.DhisEnrollmentUtils import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.arch.repositories.`object`.ReadOnlyOneObjectRepositoryFinalImpl +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.enrollment.EnrollmentObjectRepository import org.hisp.dhis.android.core.enrollment.EnrollmentStatus @@ -35,6 +36,8 @@ class EnrollmentFormRepositoryTest { .builder() .uid("programUid") .displayName("programName") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() whenever(enrollmentRepository.blockingGet()) doReturn Enrollment diff --git a/app/src/test/java/org/dhis2/usescases/enrollment/EnrollmentPresenterImplTest.kt b/app/src/test/java/org/dhis2/usescases/enrollment/EnrollmentPresenterImplTest.kt index 4ce9b67fd85..921e44ff171 100644 --- a/app/src/test/java/org/dhis2/usescases/enrollment/EnrollmentPresenterImplTest.kt +++ b/app/src/test/java/org/dhis2/usescases/enrollment/EnrollmentPresenterImplTest.kt @@ -1,10 +1,7 @@ package org.dhis2.usescases.enrollment -import android.content.Intent -import androidx.arch.core.executor.testing.InstantTaskExecutorRule import io.reactivex.Single import io.reactivex.processors.PublishProcessor -import kotlinx.coroutines.test.runTest import org.dhis2.commons.matomo.MatomoAnalyticsController import org.dhis2.commons.schedulers.SchedulerProvider import org.dhis2.data.schedulers.TrampolineSchedulerProvider @@ -19,7 +16,7 @@ import org.hisp.dhis.android.core.common.Access import org.hisp.dhis.android.core.common.DataAccess import org.hisp.dhis.android.core.common.FeatureType import org.hisp.dhis.android.core.common.Geometry -import org.hisp.dhis.android.core.enrollment.Enrollment +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.enrollment.EnrollmentAccess import org.hisp.dhis.android.core.enrollment.EnrollmentObjectRepository import org.hisp.dhis.android.core.enrollment.EnrollmentStatus @@ -30,11 +27,8 @@ import org.hisp.dhis.android.core.program.Program import org.hisp.dhis.android.core.trackedentity.TrackedEntityInstance import org.hisp.dhis.android.core.trackedentity.TrackedEntityInstanceObjectRepository import org.junit.Before -import org.junit.Rule import org.junit.Test import org.mockito.Mockito -import org.mockito.kotlin.any -import org.mockito.kotlin.anyOrNull import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock import org.mockito.kotlin.never @@ -42,9 +36,6 @@ import org.mockito.kotlin.verify import org.mockito.kotlin.whenever class EnrollmentPresenterImplTest { - @get:Rule - val instantTaskExecutorRule = InstantTaskExecutorRule() - private val enrollmentFormRepository: EnrollmentFormRepository = mock() private val programRepository: ReadOnlyOneObjectRepositoryFinalImpl<Program> = mock() private val teiRepository: TrackedEntityInstanceObjectRepository = mock() @@ -86,6 +77,8 @@ class EnrollmentPresenterImplTest { Program .builder() .uid("") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .access( Access .builder() @@ -107,6 +100,8 @@ class EnrollmentPresenterImplTest { Program .builder() .uid("") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .access( Access .builder() @@ -174,7 +169,13 @@ class EnrollmentPresenterImplTest { .geometry(geometry) .uid("random") .build() - val program = Program.builder().uid("tUID").build() + val program = + Program + .builder() + .uid("tUID") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) + .build() whenever(teiRepository.blockingGet()) doReturn tei whenever(programRepository.blockingGet()) doReturn program @@ -206,7 +207,13 @@ class EnrollmentPresenterImplTest { .geometry(geometry) .uid("random") .build() - val program = Program.builder().uid("tUID").build() + val program = + Program + .builder() + .uid("tUID") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) + .build() whenever(teiRepository.blockingGet()) doReturn tei whenever(programRepository.blockingGet()) doReturn program @@ -266,62 +273,6 @@ class EnrollmentPresenterImplTest { assert(!presenter.isEventScheduleOrSkipped("uid")) } - @Test - fun `Should delegate finish request to Simprints enrollment view model`() = - runTest { - val intent: Intent = mock() - whenever( - simprintsEnrollmentViewModel.onFinishRequested( - enrollmentUid = "enrollmentUid", - ), - ) doReturn intent - - val result = presenter.onFinishRequested("enrollmentUid") - - assert(result == intent) - } - - @Test - fun `Should delegate register last result using current enrollment tei to Simprints enrollment view model`() = - runTest { - val enrollment: Enrollment = - mock { - on { trackedEntityInstance() } doReturn "teiUid" - on { uid() } doReturn "enrollmentUid" - } - whenever(enrollmentRepository.blockingGet()) doReturn enrollment - whenever( - simprintsEnrollmentViewModel.onRegisterLastResult( - resultCode = any(), - data = anyOrNull(), - teiUid = anyOrNull(), - enrollmentUid = anyOrNull(), - ), - ) doReturn SimprintsEnrollmentViewModel.RegisterLastResult.CONTINUE_FINISH - - val result = - presenter.onRegisterLastResult( - resultCode = 1, - data = null, - enrollmentUid = "enrollmentUidExtra", - ) - - verify(simprintsEnrollmentViewModel).onRegisterLastResult( - resultCode = 1, - data = null, - teiUid = "teiUid", - enrollmentUid = "enrollmentUidExtra", - ) - assert(result == SimprintsEnrollmentViewModel.RegisterLastResult.CONTINUE_FINISH) - } - - @Test - fun `Should notify Simprints enrollment view model when register last launch fails`() { - presenter.onRegisterLastLaunchFailed() - - verify(simprintsEnrollmentViewModel).onRegisterLastLaunchFailed() - } - @Test fun `should create an event right after enrollment creation`() { whenever(enrollmentFormRepository.generateEvents()) doReturn diff --git a/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImplTest.kt b/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImplTest.kt index 045a7a84e96..9591732b249 100644 --- a/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImplTest.kt +++ b/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventCapture/EventCaptureRepositoryImplTest.kt @@ -8,6 +8,7 @@ import org.dhis2.commons.simprints.ramp.repository.RampDatastoreRepository import org.dhis2.data.dhislogic.AUTH_ALL import org.dhis2.data.dhislogic.AUTH_UNCOMPLETE_EVENT import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.dataelement.DataElement import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.enrollment.EnrollmentStatus @@ -25,10 +26,10 @@ import org.junit.Test import org.mockito.Mockito import org.mockito.kotlin.any import org.mockito.kotlin.doReturn -import org.mockito.kotlin.doReturnConsecutively import org.mockito.kotlin.mock import org.mockito.kotlin.times import org.mockito.kotlin.verify +import org.mockito.kotlin.verifyNoInteractions import org.mockito.kotlin.whenever import java.util.Date import java.util.GregorianCalendar @@ -36,7 +37,6 @@ import java.util.GregorianCalendar class EventCaptureRepositoryImplTest { private val eventUid = "eventUid" private val d2: D2 = Mockito.mock(D2::class.java, Mockito.RETURNS_DEEP_STUBS) - private val rampDatastoreRepository: RampDatastoreRepository = mock() private val trackerEventEnrollmentUid = "enrollmentUid" private val testEventStageUid = "stageUid" @@ -66,12 +66,7 @@ class EventCaptureRepositoryImplTest { d2.enrollmentModule().enrollmentService().blockingIsOpen(eventUid), ) doReturn true - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - rampDatastoreRepository, - ) + val repository = createRepository() assertTrue(repository.isEnrollmentOpen) } @@ -85,12 +80,7 @@ class EventCaptureRepositoryImplTest { d2.enrollmentModule().enrollmentService().blockingIsOpen(eventUid), ) doReturn true - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - rampDatastoreRepository, - ) + val repository = createRepository() repository.isEnrollmentOpen @@ -111,12 +101,7 @@ class EventCaptureRepositoryImplTest { .blockingGet(), ) doReturn null - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - rampDatastoreRepository, - ) + val repository = createRepository() assertTrue(!repository.isEnrollmentCancelled) } @@ -137,14 +122,10 @@ class EventCaptureRepositoryImplTest { .builder() .uid(trackerEventEnrollmentUid) .status(EnrollmentStatus.CANCELLED) + .attributeOptionCombo("attributeOptionComboUid") .build() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - rampDatastoreRepository, - ) + val repository = createRepository() assertTrue(repository.isEnrollmentCancelled) } @@ -154,12 +135,7 @@ class EventCaptureRepositoryImplTest { mockEvent(trackerEventEnrollmentUid) mockEmptySections() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - rampDatastoreRepository, - ) + val repository = createRepository() repository.isEventEditable(eventUid) @@ -188,12 +164,7 @@ class EventCaptureRepositoryImplTest { .build(), ) - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - rampDatastoreRepository, - ) + val repository = createRepository() val testObserver = repository.programStageName().test() testObserver @@ -206,12 +177,7 @@ class EventCaptureRepositoryImplTest { mockEvent(trackerEventEnrollmentUid) mockEmptySections() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - rampDatastoreRepository, - ) + val repository = createRepository() whenever( d2 @@ -237,12 +203,7 @@ class EventCaptureRepositoryImplTest { mockEvent() mockSections() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - rampDatastoreRepository, - ) + val repository = createRepository() whenever( d2 @@ -264,12 +225,7 @@ class EventCaptureRepositoryImplTest { mockEvent() mockSections() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - rampDatastoreRepository, - ) + val repository = createRepository() val testStatus = EventStatus.SKIPPED whenever( d2.eventModule().events().uid(eventUid), @@ -287,12 +243,7 @@ class EventCaptureRepositoryImplTest { mockEvent() mockSections() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - rampDatastoreRepository, - ) + val repository = createRepository() val testNewDate = GregorianCalendar(3021, 11, 1).time whenever( d2.eventModule().events().uid(eventUid), @@ -313,12 +264,7 @@ class EventCaptureRepositoryImplTest { mockEvent() mockSections() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - rampDatastoreRepository, - ) + val repository = createRepository() repository .programStage() @@ -332,11 +278,7 @@ class EventCaptureRepositoryImplTest { mockEvent() mockSections() - val repository = EventCaptureRepositoryImpl( - eventUid, - d2, - rampDatastoreRepository, - ) + val repository = createRepository() whenever( d2 @@ -355,11 +297,7 @@ class EventCaptureRepositoryImplTest { mockEvent() mockSections() - val repository = EventCaptureRepositoryImpl( - eventUid, - d2, - rampDatastoreRepository, - ) + val repository = createRepository() whenever( d2 @@ -378,12 +316,7 @@ class EventCaptureRepositoryImplTest { mockEvent() mockSections() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - rampDatastoreRepository, - ) + val repository = createRepository() repository .eventStatus() @@ -397,12 +330,7 @@ class EventCaptureRepositoryImplTest { mockEvent() mockSections() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - rampDatastoreRepository, - ) + val repository = createRepository() whenever( d2 @@ -450,12 +378,7 @@ class EventCaptureRepositoryImplTest { mockEvent(status = EventStatus.COMPLETED) mockSections() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - rampDatastoreRepository, - ) + val repository = createRepository() whenever( d2.eventModule().eventService().getEditableStatus(eventUid), @@ -476,12 +399,7 @@ class EventCaptureRepositoryImplTest { mockEvent(status = EventStatus.COMPLETED) mockSections() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - rampDatastoreRepository, - ) + val repository = createRepository() whenever( d2.eventModule().eventService().getEditableStatus(eventUid), @@ -502,12 +420,7 @@ class EventCaptureRepositoryImplTest { mockEvent() mockSections() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - rampDatastoreRepository, - ) + val repository = createRepository() repository .eventIntegrityCheck() @@ -521,12 +434,7 @@ class EventCaptureRepositoryImplTest { mockEvent(eventDate = GregorianCalendar(3021, 0, 1).time) mockSections() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - rampDatastoreRepository, - ) + val repository = createRepository() repository .eventIntegrityCheck() @@ -540,12 +448,8 @@ class EventCaptureRepositoryImplTest { mockEvent() mockSections() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - rampDatastoreRepository, - ) + val repository = createRepository() + val numberOfNotes = 12 whenever( d2.noteModule().notes().byEventUid(), @@ -577,12 +481,7 @@ class EventCaptureRepositoryImplTest { mockEvent() mockSections() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - rampDatastoreRepository, - ) + val repository = createRepository() whenever( d2.settingModule().appearanceSettings().blockingExists(), @@ -596,12 +495,7 @@ class EventCaptureRepositoryImplTest { mockEvent() mockSections() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - rampDatastoreRepository, - ) + val repository = createRepository() whenever( d2.settingModule().appearanceSettings().blockingExists(), @@ -626,12 +520,7 @@ class EventCaptureRepositoryImplTest { mockEvent() mockSections() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - rampDatastoreRepository, - ) + val repository = createRepository() whenever( d2.settingModule().appearanceSettings().blockingExists(), @@ -651,70 +540,13 @@ class EventCaptureRepositoryImplTest { assertTrue(!repository.showCompletionPercentage()) } - @Test - fun `hasSimprintsRampProgramStageHistoryTable should return true if RAMP program stage history table is configured for event`() { - mockEvent() - mockRampConfig( - programUid = " $testEventProgramUid ", - programStageUid = " $testEventStageUid ", - ) - - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - rampDatastoreRepository, - ) - - assertTrue(repository.hasSimprintsRampProgramStageHistoryTable()) - } - - @Test - fun `hasSimprintsRampProgramStageHistoryTable should not cache false if event is unavailable for RAMP program stage history table`() { - whenever( - d2 - .eventModule() - .events() - .uid(eventUid) - .blockingGet(), - ) doReturnConsecutively - listOf( - null, - Event - .builder() - .uid(eventUid) - .programStage(testEventStageUid) - .eventDate(GregorianCalendar(2021, 0, 1).time) - .organisationUnit(testEventOrgUnitUid) - .deleted(false) - .status(EventStatus.ACTIVE) - .program(testEventProgramUid) - .build(), - ) - mockRampConfig() - - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - rampDatastoreRepository, - ) - - assertFalse(repository.hasSimprintsRampProgramStageHistoryTable()) - assertTrue(repository.hasSimprintsRampProgramStageHistoryTable()) - } - @Test fun `Should have analytics if there are indicators`() { mockEvent() mockSections() - val repository = - EventCaptureRepositoryImpl( - eventUid, - d2, - rampDatastoreRepository, - ) + val repository = createRepository() + whenever( d2 .programModule() @@ -751,6 +583,62 @@ class EventCaptureRepositoryImplTest { assertTrue(repository.hasAnalytics()) } + @Test + fun `Should not show Simprints RAMP history table if event is unavailable`() { + val rampDatastoreRepository: RampDatastoreRepository = mock() + whenever( + d2 + .eventModule() + .events() + .uid(eventUid) + .blockingGet(), + ) doReturn null + + val repository = + EventCaptureRepositoryImpl( + d2 = d2, + eventUid = eventUid, + rampDatastoreRepository = rampDatastoreRepository, + ) + + assertFalse(repository.hasSimprintsRampProgramStageHistoryTable()) + verifyNoInteractions(rampDatastoreRepository) + } + + @Test + fun `Should show Simprints RAMP history table for configured program and program stage`() { + val rampDatastoreRepository: RampDatastoreRepository = mock() + mockEvent() + whenever(rampDatastoreRepository.getConfig()) doReturn + RampDatastoreConfig( + programStageHistoryTables = + listOf( + ProgramStageHistoryTableConfig( + programId = " $testEventProgramUid ", + followUpVisitProgramStageId = " $testEventStageUid ", + ), + ), + ) + + val repository = + EventCaptureRepositoryImpl( + d2 = d2, + eventUid = eventUid, + rampDatastoreRepository = rampDatastoreRepository, + ) + + assertTrue(repository.hasSimprintsRampProgramStageHistoryTable()) + } + + private fun createRepository( + rampDatastoreRepository: RampDatastoreRepository = mock(), + ): EventCaptureRepositoryImpl = + EventCaptureRepositoryImpl( + d2 = d2, + eventUid = eventUid, + rampDatastoreRepository = rampDatastoreRepository, + ) + private fun mockEvent( enrollmentUid: String? = null, attrOptionComboUid: String? = null, @@ -780,24 +668,6 @@ class EventCaptureRepositoryImplTest { .build() } - private fun mockRampConfig( - programUid: String? = testEventProgramUid, - programStageUid: String? = testEventStageUid, - ) { - whenever(rampDatastoreRepository.getConfig()) doReturn - RampDatastoreConfig( - programStageHistoryTables = - listOf( - ProgramStageHistoryTableConfig( - programId = programUid, - followUpVisitProgramStageId = programStageUid, - followUpVisitMaxNumber = 3, - headerVisitNumberDataElementId = "visitNumberUid", - ), - ), - ) - } - private fun mockEmptySections() { whenever( d2 @@ -858,7 +728,11 @@ class EventCaptureRepositoryImplTest { .sortOrder(sectionOrderC) .dataElements( mutableListOf( - DataElement.builder().uid(sectionCDataElementA).build(), + DataElement + .builder() + .uid(sectionCDataElementA) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .build(), ), ).build(), ProgramStageSection @@ -868,8 +742,16 @@ class EventCaptureRepositoryImplTest { .sortOrder(sectionOrderB) .dataElements( mutableListOf( - DataElement.builder().uid(sectionBDataElementA).build(), - DataElement.builder().uid(sectionBDataElementB).build(), + DataElement + .builder() + .uid(sectionBDataElementA) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .build(), + DataElement + .builder() + .uid(sectionBDataElementB) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .build(), ), ).build(), ProgramStageSection @@ -879,7 +761,11 @@ class EventCaptureRepositoryImplTest { .sortOrder(sectionOrderA) .dataElements( mutableListOf( - DataElement.builder().uid(sectionADataElementA).build(), + DataElement + .builder() + .uid(sectionADataElementA) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .build(), ), ).build(), ) diff --git a/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialPresenterTest.kt index 0ba99a2cf04..af4c0c5a36e 100644 --- a/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialPresenterTest.kt @@ -12,6 +12,7 @@ import org.dhis2.usescases.eventsWithoutRegistration.eventCapture.EventFieldMapp import org.dhis2.utils.analytics.AnalyticsHelper import org.hisp.dhis.android.core.common.FeatureType import org.hisp.dhis.android.core.common.Geometry +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.event.Event import org.hisp.dhis.android.core.event.EventEditableStatus.Editable import org.hisp.dhis.android.core.event.EventEditableStatus.NonEditable @@ -364,7 +365,13 @@ class EventInitialPresenterTest { programStageUid: String?, moreOrgUnits: Boolean = false, ) { - val program = Program.builder().uid(uid).build() + val program = + Program + .builder() + .uid(uid) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) + .build() val orgUnits = mutableListOf( OrganisationUnit diff --git a/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialRepositoryImplTest.kt b/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialRepositoryImplTest.kt index 501f6b8559f..eeb1fec1baf 100644 --- a/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialRepositoryImplTest.kt +++ b/app/src/test/java/org/dhis2/usescases/eventsWithoutRegistration/eventInitial/EventInitialRepositoryImplTest.kt @@ -259,6 +259,8 @@ class EventInitialRepositoryImplTest { Program .builder() .uid("programUid") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .access(Access.create(true, true, DataAccess.create(true, hasAccess))) .build() } diff --git a/app/src/test/java/org/dhis2/usescases/login/SyncIsPerformedInteractorTest.kt b/app/src/test/java/org/dhis2/usescases/login/SyncIsPerformedInteractorTest.kt deleted file mode 100644 index da548816f47..00000000000 --- a/app/src/test/java/org/dhis2/usescases/login/SyncIsPerformedInteractorTest.kt +++ /dev/null @@ -1,115 +0,0 @@ -package org.dhis2.usescases.login - -import org.dhis2.data.server.UserManager -import org.dhis2.usescases.sync.WAS_INITIAL_SYNC_DONE -import org.hisp.dhis.android.core.configuration.internal.DatabaseAccount -import org.hisp.dhis.android.core.systeminfo.SystemInfo -import org.hisp.dhis.android.core.user.User -import org.junit.Before -import org.junit.Test -import org.mockito.Mockito -import org.mockito.kotlin.doReturn -import org.mockito.kotlin.mock -import org.mockito.kotlin.whenever - -class SyncIsPerformedInteractorTest { - private lateinit var interactor: SyncIsPerformedInteractor - private val userManager: UserManager = - Mockito.mock(UserManager::class.java, Mockito.RETURNS_DEEP_STUBS) - - @Before - fun setup() { - interactor = SyncIsPerformedInteractor(userManager) - } - - @Test - fun `Should check if entry exists on datastore module`() { - whenever(userManager.d2.dataStoreModule().localDataStore()) doReturn mock() - whenever( - userManager.d2 - .dataStoreModule() - .localDataStore() - .value(WAS_INITIAL_SYNC_DONE), - ) doReturn mock() - whenever( - userManager.d2 - .dataStoreModule() - .localDataStore() - .value(WAS_INITIAL_SYNC_DONE) - .blockingExists(), - ) doReturn false - whenever( - userManager.d2 - .userModule() - .accountManager() - .getCurrentAccount(), - ) doReturn null - - val result = interactor.execute() - - assert(!result) - } - - @Test - fun `Should check if import exists on datastore module`() { - val serverUrl = "https://play.dhis2.org/40" - val userName = "pepe" - - whenever(userManager.d2.dataStoreModule().localDataStore()) doReturn mock() - whenever( - userManager.d2 - .dataStoreModule() - .localDataStore() - .value(WAS_INITIAL_SYNC_DONE), - ) doReturn mock() - whenever( - userManager.d2 - .dataStoreModule() - .localDataStore() - .value(WAS_INITIAL_SYNC_DONE) - .blockingExists(), - ) doReturn false - - val mockedSystemInfo: SystemInfo = - mock { - on { contextPath() } doReturn serverUrl - } - - val mockedUser: User = - mock { - on { username() } doReturn userName - } - - whenever( - userManager.d2 - .userModule() - .user() - .blockingGet(), - ) doReturn mockedUser - - whenever( - userManager.d2 - .systemInfoModule() - .systemInfo() - .blockingGet(), - ) doReturn mockedSystemInfo - - val mockedAccount: DatabaseAccount = - mock { - on { serverUrl() } doReturn serverUrl - on { username() } doReturn userName - on { importDB() } doReturn mock() - } - - whenever( - userManager.d2 - .userModule() - .accountManager() - .getCurrentAccount(), - ) doReturn mockedAccount - - val result = interactor.execute() - - assert(result) - } -} diff --git a/app/src/test/java/org/dhis2/usescases/main/MainPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/main/MainPresenterTest.kt deleted file mode 100644 index 2604bc66e6a..00000000000 --- a/app/src/test/java/org/dhis2/usescases/main/MainPresenterTest.kt +++ /dev/null @@ -1,323 +0,0 @@ -package org.dhis2.usescases.main - -import androidx.arch.core.executor.testing.InstantTaskExecutorRule -import io.reactivex.Flowable -import io.reactivex.Single -import io.reactivex.processors.BehaviorProcessor -import io.reactivex.processors.FlowableProcessor -import io.reactivex.processors.PublishProcessor -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.test.UnconfinedTestDispatcher -import kotlinx.coroutines.test.runTest -import kotlinx.coroutines.test.setMain -import org.dhis2.commons.filters.FilterManager -import org.dhis2.commons.filters.FilterManager.PeriodRequest -import org.dhis2.commons.filters.Filters -import org.dhis2.commons.filters.data.FilterRepository -import org.dhis2.commons.matomo.Categories.Companion.HOME -import org.dhis2.commons.matomo.MatomoAnalyticsController -import org.dhis2.commons.prefs.Preference.Companion.DEFAULT_CAT_COMBO -import org.dhis2.commons.prefs.Preference.Companion.PREF_DEFAULT_CAT_OPTION_COMBO -import org.dhis2.commons.prefs.PreferenceProvider -import org.dhis2.commons.schedulers.SchedulerProvider -import org.dhis2.commons.viewmodel.DispatcherProvider -import org.dhis2.data.schedulers.TrampolineSchedulerProvider -import org.dhis2.data.server.UserManager -import org.dhis2.data.service.SyncStatusController -import org.dhis2.data.service.VersionRepository -import org.dhis2.data.service.workManager.WorkManagerController -import org.dhis2.usescases.login.SyncIsPerformedInteractor -import org.dhis2.usescases.main.domain.LogoutUser -import org.dhis2.usescases.settings.DeleteUserData -import org.hisp.dhis.android.core.category.CategoryCombo -import org.hisp.dhis.android.core.category.CategoryOptionCombo -import org.hisp.dhis.android.core.configuration.internal.DatabaseAccount -import org.hisp.dhis.android.core.systeminfo.SystemInfo -import org.hisp.dhis.android.core.user.User -import org.junit.Assert.assertTrue -import org.junit.Before -import org.junit.Rule -import org.junit.Test -import org.mockito.kotlin.any -import org.mockito.kotlin.doReturn -import org.mockito.kotlin.mock -import org.mockito.kotlin.times -import org.mockito.kotlin.verify -import org.mockito.kotlin.verifyNoMoreInteractions -import org.mockito.kotlin.whenever -import java.io.File -import java.util.Date - -@OptIn(ExperimentalCoroutinesApi::class) -class MainPresenterTest { - private lateinit var presenter: MainPresenter - private val repository: HomeRepository = mock() - private val schedulers: SchedulerProvider = TrampolineSchedulerProvider() - private val view: MainView = mock() - private val preferences: PreferenceProvider = mock() - private val workManagerController: WorkManagerController = mock() - private val filterManager: FilterManager = mock() - private val filterRepository: FilterRepository = mock() - - private val matomoAnalyticsController: MatomoAnalyticsController = mock() - private val userManager: UserManager = mock() - private val deleteUserData: DeleteUserData = mock() - private val syncIsPerfomedInteractor: SyncIsPerformedInteractor = mock() - private val syncStatusController: SyncStatusController = mock() - private val versionRepository: VersionRepository = mock() - private val testingDispatcher = UnconfinedTestDispatcher() - private val dispatcherProvider: DispatcherProvider = - mock { - on { io() } doReturn testingDispatcher - on { ui() } doReturn testingDispatcher - } - - private val forceToNotSynced: Boolean = false - - private val logoutUser: LogoutUser = mock() - - @Rule - @JvmField - val rule = InstantTaskExecutorRule() - - @Before - fun setUp() { - Dispatchers.setMain(testingDispatcher) - whenever(versionRepository.newAppVersion) doReturn MutableSharedFlow() - presenter = - MainPresenter( - view, - repository, - schedulers, - preferences, - workManagerController, - filterManager, - filterRepository, - matomoAnalyticsController, - userManager, - deleteUserData, - syncIsPerfomedInteractor, - syncStatusController, - versionRepository, - dispatcherProvider, - forceToNotSynced, - logoutUser, - ) - } - - @Test - fun `Should save default settings and render user name when the activity is resumed`() { - presenterMocks() - - presenter.init() - - verify(view).renderUsername(any()) - verify(preferences).setValue(DEFAULT_CAT_COMBO, "uid") - verify(preferences).setValue(PREF_DEFAULT_CAT_OPTION_COMBO, "uid") - } - - @Test - fun `Should log out`() = - runTest { - val accountsCount = 1 - whenever(logoutUser()) doReturn Result.success(accountsCount) - - presenter.logOut() - - verify(logoutUser, times(1)).invoke() - verify(view).goToLogin(accountsCount, false) - } - - @Test - fun `Should block session`() { - presenter.blockSession() - - verify(workManagerController).cancelAllWork() - verify(view).back() - } - - @Test - fun `Should clear disposable when activity is paused`() { - presenter.onDetach() - - val disposableSize = presenter.disposable.size() - - assertTrue(disposableSize == 0) - } - - @Test - fun `Should open drawer when menu is clicked`() { - presenter.onMenuClick() - - verify(view).openDrawer(any()) - } - - @Test - fun `should return to home section when user taps back in a different section`() { - val filterProcessor: FlowableProcessor<FilterManager> = PublishProcessor.create() - val filterManagerFlowable = Flowable.just(filterManager).startWith(filterProcessor) - val periodRequest: FlowableProcessor<kotlin.Pair<PeriodRequest, Filters?>> = - BehaviorProcessor.create() - whenever(filterManager.asFlowable()) doReturn filterManagerFlowable - whenever(filterManager.periodRequest) doReturn periodRequest - whenever(filterManager.ouTreeFlowable()) doReturn Flowable.just(true) - - presenter.onNavigateBackToHome() - - verify(view).goToHome() - } - - @Test - fun `Should track event when clicking on SyncManager`() { - presenter.onClickSyncManager() - - verify(matomoAnalyticsController).trackEvent(any(), any(), any()) - } - - @Test - fun `Should go to delete account`() { - val randomFile = File("random") - whenever(view.obtainFileView()) doReturn randomFile - whenever(userManager.d2) doReturn mock() - whenever(userManager.d2.userModule()) doReturn mock() - whenever(userManager.d2.userModule().accountManager()) doReturn mock() - whenever(view.obtainFileView()) doReturn randomFile - whenever(repository.accountsCount()) doReturn 1 - - presenter.onDeleteAccount() - - verify(view).showProgressDeleteNotification() - verify(deleteUserData).wipeCacheAndPreferences(randomFile) - verify(userManager.d2?.userModule()?.accountManager())?.deleteCurrentAccount() - verify(view).cancelNotifications() - verify(view).goToLogin(1, true) - } - - @Test - fun `Should go to manage account`() { - val firstRandomUserAccount = - DatabaseAccount - .builder() - .username("random") - .serverUrl("https://www.random.com/") - .encrypted(false) - .databaseName("none") - .databaseCreationDate("16/2/2012") - .build() - val secondRandomUserAccount = - DatabaseAccount - .builder() - .username("random") - .serverUrl("https://www.random.com/") - .encrypted(false) - .databaseName("none") - .databaseCreationDate("16/2/2012") - .build() - - val randomFile = File("random") - - whenever(view.obtainFileView()) doReturn randomFile - whenever(userManager.d2) doReturn mock() - whenever(userManager.d2.userModule()) doReturn mock() - whenever(userManager.d2.userModule().accountManager()) doReturn mock() - whenever( - userManager.d2 - .userModule() - .accountManager() - .getAccounts(), - ) doReturn - listOf( - firstRandomUserAccount, - secondRandomUserAccount, - ) - whenever(repository.accountsCount()) doReturn 2 - - presenter.onDeleteAccount() - - verify(deleteUserData).wipeCacheAndPreferences(randomFile) - verify(userManager.d2?.userModule()?.accountManager())?.deleteCurrentAccount() - verify(view).showProgressDeleteNotification() - verify(view).cancelNotifications() - verify(view).goToLogin(2, true) - } - - @Test - fun `Should track server first time`() { - val serverVersion = "2.38" - whenever(repository.getServerVersion()) doReturn Single.just(systemInfo()) - whenever(preferences.getString(DHIS2, "")) doReturn "" - - presenter.trackDhis2Server() - - verify(matomoAnalyticsController).trackEvent(HOME, SERVER_ACTION, serverVersion) - verify(preferences).setValue(DHIS2, serverVersion) - } - - @Test - fun `Should track server when there is an update`() { - val oldVersion = "2.37" - val newVersion = "2.38" - whenever(repository.getServerVersion()) doReturn Single.just(systemInfo()) - whenever(preferences.getString(DHIS2, "")) doReturn oldVersion - - presenter.trackDhis2Server() - - verify(matomoAnalyticsController).trackEvent(HOME, SERVER_ACTION, newVersion) - verify(preferences).setValue(DHIS2, newVersion) - } - - @Test - fun `Should not track server`() { - whenever(repository.getServerVersion()) doReturn Single.just(systemInfo("")) - whenever(preferences.getString(DHIS2, "")) doReturn "" - - presenter.trackDhis2Server() - - verifyNoMoreInteractions(matomoAnalyticsController) - } - - private fun presenterMocks() { - // UserModule - whenever(repository.user()) doReturn Single.just(createUser()) - - // categoryModule - whenever(repository.defaultCatCombo()) doReturn Single.just(createCategoryCombo()) - whenever(repository.defaultCatOptCombo()) doReturn Single.just(createCategoryOptionCombo()) - - val oldVersion = "2.37" - whenever(repository.getServerVersion()) doReturn Single.just(systemInfo()) - whenever(preferences.getString(DHIS2, "")) doReturn oldVersion - } - - private fun systemInfo(server: String = "2.38") = - SystemInfo - .builder() - .systemName("random") - .contextPath("random too") - .dateFormat("dd/mm/yyyy") - .serverDate(Date()) - .version(server) - .build() - - private fun createUser(): User = - User - .builder() - .uid("userUid") - .firstName("test_name") - .surname("test_surName") - .build() - - private fun createCategoryCombo(): CategoryCombo = - CategoryCombo - .builder() - .uid("uid") - .build() - - private fun createCategoryOptionCombo(): CategoryOptionCombo = - CategoryOptionCombo - .builder() - .uid("uid") - .build() -} diff --git a/app/src/test/java/org/dhis2/usescases/main/MainViewModelIntegrationTest.kt b/app/src/test/java/org/dhis2/usescases/main/MainViewModelIntegrationTest.kt new file mode 100644 index 00000000000..9f14b3c78b5 --- /dev/null +++ b/app/src/test/java/org/dhis2/usescases/main/MainViewModelIntegrationTest.kt @@ -0,0 +1,462 @@ +package org.dhis2.usescases.main + +import android.content.Context +import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import app.cash.turbine.test +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.runTest +import kotlinx.coroutines.test.setMain +import org.dhis2.commons.filters.FilterManager +import org.dhis2.commons.filters.data.FilterRepository +import org.dhis2.commons.matomo.MatomoAnalyticsController +import org.dhis2.commons.resources.ResourceManager +import org.dhis2.commons.viewmodel.DispatcherProvider +import org.dhis2.mobile.commons.providers.PreferenceProvider +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.domain.SyncStatusController +import org.dhis2.mobile.sync.model.SyncStatusData +import org.dhis2.usescases.main.data.HomeRepository +import org.dhis2.usescases.main.domain.CheckSingleNavigation +import org.dhis2.usescases.main.domain.ConfigureHomeNavigationBar +import org.dhis2.usescases.main.domain.DeleteAccount +import org.dhis2.usescases.main.domain.DownloadNewVersion +import org.dhis2.usescases.main.domain.GetHomeFilters +import org.dhis2.usescases.main.domain.GetLockAction +import org.dhis2.usescases.main.domain.GetUserName +import org.dhis2.usescases.main.domain.LaunchInitialSync +import org.dhis2.usescases.main.domain.LogoutUser +import org.dhis2.usescases.main.domain.ScheduleNewVersionAlert +import org.dhis2.usescases.main.domain.UpdateInitialSyncStatus +import org.dhis2.usescases.main.ui.model.HomeEffect +import org.dhis2.utils.MainCoroutineScopeRule +import org.hisp.dhis.android.core.user.User +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.mockito.kotlin.any +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever +import java.io.File + +/** + * Integration test for [MainViewModel]. + * + * Use cases are real instances wired with a mocked [HomeRepository]. Only infrastructure + * boundaries (repository, sync, analytics) are mocked. This validates the contract between + * the ViewModel and the domain layer end-to-end. + */ +@OptIn(ExperimentalCoroutinesApi::class) +class MainViewModelIntegrationTest { + + @get:Rule + val instantExecutorRule = InstantTaskExecutorRule() + + @get:Rule + val coroutineScopeRule = MainCoroutineScopeRule() + + private val testingDispatcher = StandardTestDispatcher() + + // --- Repository mocks (boundary under test) --- + private val homeRepository: HomeRepository = mock() + private val filterRepository: FilterRepository = mock() + + // --- Infrastructure mocks --- + private val filterManager: FilterManager = mock() + private val matomoAnalyticsController: MatomoAnalyticsController = mock() + private val syncStatusController: SyncStatusController = mock() + private val resourceManager: ResourceManager = mock() + private val mainNavigator: MainNavigator = mock() + private val preferences: PreferenceProvider = mock() + private val syncBackgroundJobAction: SyncBackgroundJobAction = mock() + private val downloadNewVersion: DownloadNewVersion = mock() + private val scheduleNewVersionAlert: ScheduleNewVersionAlert = mock() + + private val syncStatusFlow = MutableStateFlow(SyncStatusData()) + private val newVersionFlow = MutableSharedFlow<String>() + private val filterManagerFlow = MutableStateFlow(0) + + // --- Real use cases (wired with mocked repos) --- + private lateinit var getUserName: GetUserName + private lateinit var configureHomeNavigationBar: ConfigureHomeNavigationBar + private lateinit var getHomeFilters: GetHomeFilters + private lateinit var getLockAction: GetLockAction + private lateinit var checkSingleNavigation: CheckSingleNavigation + private lateinit var launchInitialSync: LaunchInitialSync + private lateinit var logOutUser: LogoutUser + private lateinit var deleteAccount: DeleteAccount + private lateinit var updateInitialSyncStatus: UpdateInitialSyncStatus + + private lateinit var viewModel: MainViewModel + + @Before + fun setUp() = runTest { + Dispatchers.setMain(testingDispatcher) + + getUserName = GetUserName(homeRepository) + configureHomeNavigationBar = ConfigureHomeNavigationBar(homeRepository, resourceManager) + getHomeFilters = GetHomeFilters(filterRepository) + getLockAction = GetLockAction(homeRepository) + checkSingleNavigation = CheckSingleNavigation(homeRepository) + updateInitialSyncStatus = UpdateInitialSyncStatus(homeRepository) + logOutUser = LogoutUser(homeRepository, syncBackgroundJobAction, syncStatusController, filterManager) + deleteAccount = DeleteAccount(filterManager, homeRepository) + // skipSync = true avoids triggering a background sync in every test + launchInitialSync = LaunchInitialSync( + skipSync = true, + homeRepository = homeRepository, + versionRepository = mock(), + syncBackgroundJobAction = syncBackgroundJobAction, + ) + + whenever(syncStatusController.observeDownloadProcess()) doReturn syncStatusFlow + whenever(scheduleNewVersionAlert.newVersionFlow) doReturn newVersionFlow + whenever(filterManager.asFlow(any())) doReturn filterManagerFlow + whenever(filterManager.periodRequest) doReturn mock() + whenever(filterManager.ouTreeFlowable()) doReturn mock() + // ConfigureHomeNavigationBar builds NavigationBarItem(label = getString(...)); a null + // label causes a NPE that silently crashes loadData. Stub it globally here. + whenever(resourceManager.getString(any())) doReturn "" + + // Default: multiple programs → CheckSingleNavigation fails silently, no effect emitted + whenever(homeRepository.homeItemCount()) doReturn 2 + } + + // ------------------------------------------------------------------ helpers + + private fun buildViewModel( + initialScreen: MainScreenType = MainScreenType.Home(HomeScreen.Programs), + ) { + viewModel = MainViewModel( + preferences = preferences, + filterManager = filterManager, + matomoAnalyticsController = matomoAnalyticsController, + syncStatusController = syncStatusController, + mainNavigator = mainNavigator, + getUserName = getUserName, + configureHomeNavigationBar = configureHomeNavigationBar, + getHomeFilters = getHomeFilters, + downloadNewVersion = downloadNewVersion, + logOutUser = logOutUser, + deleteAccount = deleteAccount, + getLockAction = getLockAction, + updateInitialSyncStatus = updateInitialSyncStatus, + checkSingleNavigation = checkSingleNavigation, + launchInitialSync = launchInitialSync, + scheduleNewVersionAlert = scheduleNewVersionAlert, + syncBackgroundJobAction = syncBackgroundJobAction, + initialScreen = initialScreen, + dispatcher = object : DispatcherProvider { + override fun io(): CoroutineDispatcher = testingDispatcher + override fun computation(): CoroutineDispatcher = testingDispatcher + override fun ui(): CoroutineDispatcher = testingDispatcher + }, + ) + } + + // NOTE: The User mock must be created before any `whenever` call is opened, because + // Mockito's stubbing state machine gets confused if another mock is configured while a + // stubbing is "in progress" (hint #3 of UnfinishedStubbingException). + private fun mockUser(firstName: String?, surname: String?): User = mock { + on { firstName() } doReturn firstName + on { surname() } doReturn surname + } + + // ------------------------------------------------------------------ state tests + + @Test + fun `should expose full name built by GetUserName use case`() = runTest { + val user = mockUser("Jane", "Doe") + whenever(homeRepository.user()) doReturn user + whenever(homeRepository.hasHomeAnalytics()) doReturn false + whenever(filterRepository.homeFilters()) doReturn emptyList() + whenever(filterManager.totalFilters) doReturn 0 + + buildViewModel() + + viewModel.homeScreenState.test { + awaitItem() // default / loading state + assertEquals("Jane Doe", awaitItem().userName) + } + } + + @Test + fun `should expose only first name when surname is absent`() = runTest { + val user = mockUser("Jane", null) + whenever(homeRepository.user()) doReturn user + whenever(homeRepository.hasHomeAnalytics()) doReturn false + whenever(filterRepository.homeFilters()) doReturn emptyList() + whenever(filterManager.totalFilters) doReturn 0 + + buildViewModel() + + viewModel.homeScreenState.test { + awaitItem() + assertEquals("Jane", awaitItem().userName) + } + } + + @Test + fun `should show two nav items and bottom bar when analytics are configured`() = runTest { + val user = mockUser("User", null) + whenever(homeRepository.user()) doReturn user + whenever(homeRepository.hasHomeAnalytics()) doReturn true + whenever(filterRepository.homeFilters()) doReturn emptyList() + whenever(filterManager.totalFilters) doReturn 0 + whenever(resourceManager.getString(any())) doReturn "" + + buildViewModel() + + viewModel.homeScreenState.test { + awaitItem() + val state = awaitItem() + assertEquals(2, state.navigationBarItems.size) + assertTrue(state.bottomNavigationBarVisible) + } + } + + @Test + fun `should show one nav item and hide bottom bar when analytics are not configured`() = runTest { + val user = mockUser("User", null) + whenever(homeRepository.user()) doReturn user + whenever(homeRepository.hasHomeAnalytics()) doReturn false + whenever(filterRepository.homeFilters()) doReturn emptyList() + whenever(filterManager.totalFilters) doReturn 0 + + buildViewModel() + + viewModel.homeScreenState.test { + awaitItem() + val state = awaitItem() + assertEquals(1, state.navigationBarItems.size) + assertFalse(state.bottomNavigationBarVisible) + } + } + + @Test + fun `should expose active filter count from filterManager`() = runTest { + // FilterItem is a sealed abstract class and cannot be mocked; test activeFilters + // (from FilterManager) and homeFilters (from FilterRepository) independently. + val user = mockUser("User", null) + whenever(homeRepository.user()) doReturn user + whenever(homeRepository.hasHomeAnalytics()) doReturn false + whenever(filterRepository.homeFilters()) doReturn emptyList() + whenever(filterManager.totalFilters) doReturn 3 + + buildViewModel() + + viewModel.homeScreenState.test { + awaitItem() // default state + // filterManager.asFlow fires before loadData completes → intermediate state with + // activeFilters=3 on the default skeleton. Both this state and the fully-loaded + // state will have activeFilters=3, so checking the first non-default item is enough. + assertEquals(3, awaitItem().activeFilters) + cancelAndIgnoreRemainingEvents() + } + } + + // ------------------------------------------------------------------ lock / pin effects + + @Test + fun `should emit ShowPinDialog when no pin is stored`() = runTest { + whenever(homeRepository.isPinStored()) doReturn false + + buildViewModel() + + viewModel.homeEffects.test { + viewModel.onBlockSession() + assertEquals(HomeEffect.ShowPinDialog, awaitItem()) + } + } + + @Test + fun `should emit BlockSession when a pin is already stored`() = runTest { + whenever(homeRepository.isPinStored()) doReturn true + + buildViewModel() + + viewModel.homeEffects.test { + viewModel.onBlockSession() + assertEquals(HomeEffect.BlockSession, awaitItem()) + } + } + + // ------------------------------------------------------------------ logout + + @Test + fun `should emit GoToLogin with correct account count after logout`() = runTest { + whenever(homeRepository.clearPin()) doReturn Result.success(Unit) + whenever(homeRepository.logOut()) doReturn Result.success(Unit) + whenever(homeRepository.accountsCount()) doReturn 2 + + buildViewModel() + + viewModel.homeEffects.test { + viewModel.logOut() + assertEquals(HomeEffect.GoToLogin(accountsCount = 2, isDeletion = false), awaitItem()) + } + } + + @Test + fun `should cancel sync jobs and restore sync state on logout`() = runTest { + whenever(homeRepository.clearPin()) doReturn Result.success(Unit) + whenever(homeRepository.logOut()) doReturn Result.success(Unit) + whenever(homeRepository.accountsCount()) doReturn 1 + + buildViewModel() + viewModel.logOut() + advanceUntilIdle() + + verify(syncBackgroundJobAction).cancelAll() + verify(syncStatusController).restore() + verify(homeRepository).logOut() + } + + // ------------------------------------------------------------------ delete account + + @Test + fun `should emit ShowDeleteNotification then GoToLogin after account deletion`() = runTest { + // Explicitly stub all suspend funs used by DeleteAccount so mockito-kotlin + // resumes the continuation correctly (unspecified suspend funs may not resume). + whenever(homeRepository.clearCache(any())) doReturn false + whenever(homeRepository.clearPreferences()) doReturn Unit + whenever(homeRepository.wipeAll()) doReturn Unit + whenever(homeRepository.deleteCurrentAccount()) doReturn Unit + whenever(homeRepository.accountsCount()) doReturn 0 + + buildViewModel() + + viewModel.homeEffects.test { + val mockedContext = mock<Context>() + whenever(mockedContext.cacheDir) doReturn File("cache") + with(mockedContext) { viewModel.onDeleteAccount() } + + assertEquals(HomeEffect.ShowDeleteNotification, awaitItem()) + assertEquals(HomeEffect.GoToLogin(accountsCount = 0, isDeletion = true), awaitItem()) + } + } + + @Test + fun `should wipe account data and cancel sync on account deletion`() = runTest { + whenever(homeRepository.clearCache(any())) doReturn false + whenever(homeRepository.clearPreferences()) doReturn Unit + whenever(homeRepository.wipeAll()) doReturn Unit + whenever(homeRepository.deleteCurrentAccount()) doReturn Unit + whenever(homeRepository.accountsCount()) doReturn 0 + + buildViewModel() + + val mockedContext = mock<Context>() + whenever(mockedContext.cacheDir) doReturn File("cache") + with(mockedContext) { viewModel.onDeleteAccount() } + advanceUntilIdle() + + verify(homeRepository).wipeAll() + verify(homeRepository).deleteCurrentAccount() + verify(syncBackgroundJobAction).cancelAll() + } + + // ------------------------------------------------------------------ sync status + + @Test + fun `should mark initial sync done when sync process completes`() = runTest { + buildViewModel() + + syncStatusFlow.emit(SyncStatusData(running = false)) + advanceUntilIdle() + + verify(homeRepository).setInitialSyncDone() + } + + @Test + fun `should hide filter and sync buttons while sync is running`() = runTest { + val user = mockUser("User", null) + whenever(homeRepository.user()) doReturn user + whenever(homeRepository.hasHomeAnalytics()) doReturn false + whenever(filterRepository.homeFilters()) doReturn emptyList() + whenever(filterManager.totalFilters) doReturn 0 + + buildViewModel() + + viewModel.homeScreenState.test { + awaitItem() // loading state + awaitItem() // loaded state + + syncStatusFlow.emit(SyncStatusData(running = true)) + with(awaitItem()) { + assertFalse(filterButtonVisible) + assertFalse(syncButtonVisible) + assertFalse(bottomNavigationBarVisible) + } + } + } + + @Test + fun `should restore filter and sync buttons after sync completes`() = runTest { + val user = mockUser("User", null) + whenever(homeRepository.user()) doReturn user + whenever(homeRepository.hasHomeAnalytics()) doReturn true + whenever(filterRepository.homeFilters()) doReturn emptyList() + whenever(filterManager.totalFilters) doReturn 0 + whenever(resourceManager.getString(any())) doReturn "" + + buildViewModel() + + viewModel.homeScreenState.test { + awaitItem() + awaitItem() // loaded state + + syncStatusFlow.emit(SyncStatusData(running = true)) + awaitItem() // running state + + syncStatusFlow.emit(SyncStatusData(running = false)) + with(awaitItem()) { + assertTrue(filterButtonVisible) + assertTrue(syncButtonVisible) + } + } + } + + // ------------------------------------------------------------------ single program navigation + + @Test + fun `should emit SingleProgramNavigation when only one home item exists`() = runTest { + val singleItem = HomeItemData.EventProgram( + uid = "program_uid", + label = "Only Program", + accessDataWrite = true, + ) + whenever(homeRepository.homeItemCount()) doReturn 1 + whenever(homeRepository.singleHomeItemData()) doReturn singleItem + + buildViewModel() + + viewModel.homeEffects.test { + val effect = awaitItem() + assertTrue(effect is HomeEffect.SingleProgramNavigation) + assertEquals(singleItem, (effect as HomeEffect.SingleProgramNavigation).homeItemData) + } + } + + @Test + fun `should not emit SingleProgramNavigation when multiple home items exist`() = runTest { + whenever(homeRepository.homeItemCount()) doReturn 3 + + buildViewModel() + + viewModel.homeEffects.test { + advanceUntilIdle() + expectNoEvents() + } + } +} diff --git a/app/src/test/java/org/dhis2/usescases/main/MainViewModelTest.kt b/app/src/test/java/org/dhis2/usescases/main/MainViewModelTest.kt new file mode 100644 index 00000000000..34d6b3e81f6 --- /dev/null +++ b/app/src/test/java/org/dhis2/usescases/main/MainViewModelTest.kt @@ -0,0 +1,287 @@ +package org.dhis2.usescases.main + +import android.content.Context +import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.BarChart +import app.cash.turbine.test +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.runTest +import kotlinx.coroutines.test.setMain +import org.dhis2.commons.filters.FilterManager +import org.dhis2.commons.matomo.Actions.Companion.BLOCK_SESSION_PIN +import org.dhis2.commons.matomo.Actions.Companion.SETTINGS +import org.dhis2.commons.matomo.Categories.Companion.HOME +import org.dhis2.commons.matomo.Labels.Companion.CLICK +import org.dhis2.commons.matomo.MatomoAnalyticsController +import org.dhis2.commons.resources.ResourceManager +import org.dhis2.commons.viewmodel.DispatcherProvider +import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.commons.providers.PreferenceProvider +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.domain.SyncStatusController +import org.dhis2.mobile.sync.model.SyncStatusData +import org.dhis2.usescases.main.domain.CheckSingleNavigation +import org.dhis2.usescases.main.domain.ConfigureHomeNavigationBar +import org.dhis2.usescases.main.domain.DeleteAccount +import org.dhis2.usescases.main.domain.DownloadNewVersion +import org.dhis2.usescases.main.domain.GetHomeFilters +import org.dhis2.usescases.main.domain.GetLockAction +import org.dhis2.usescases.main.domain.GetUserName +import org.dhis2.usescases.main.domain.InitialSyncAction +import org.dhis2.usescases.main.domain.LaunchInitialSync +import org.dhis2.usescases.main.domain.LogoutUser +import org.dhis2.usescases.main.domain.ScheduleNewVersionAlert +import org.dhis2.usescases.main.domain.UpdateInitialSyncStatus +import org.dhis2.usescases.main.domain.model.LockAction +import org.dhis2.usescases.main.ui.Form +import org.dhis2.usescases.main.ui.model.HomeAction +import org.dhis2.usescases.main.ui.model.HomeEffect +import org.dhis2.usescases.main.ui.model.VersionToUpdateState +import org.dhis2.utils.MainCoroutineScopeRule +import org.dhis2.utils.analytics.CLOSE_SESSION +import org.dhis2.utils.customviews.navigationbar.NavigationPage +import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarItem +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.mockito.kotlin.any +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock +import org.mockito.kotlin.times +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever +import java.io.File + +@OptIn(ExperimentalCoroutinesApi::class) +class MainViewModelTest { + + @get:Rule + val instantExecutorRule = InstantTaskExecutorRule() + + @get:Rule + val coroutineScopeRule = MainCoroutineScopeRule() + + private val testingDispatcher = StandardTestDispatcher() + + private val preferences: PreferenceProvider = mock() + private val filterManager: FilterManager = mock() + private val matomoAnalyticsController: MatomoAnalyticsController = mock() + private val syncStatusController: SyncStatusController = mock() + private val resourceManager: ResourceManager = mock() + private val mainNavigator: MainNavigator = mock() + private val getUserName: GetUserName = mock() + private val configureHomeNavigationBar: ConfigureHomeNavigationBar = mock() + private val getHomeFilters: GetHomeFilters = mock() + private val downloadNewVersion: DownloadNewVersion = mock() + private val logOutUser: LogoutUser = mock() + private val deleteAccount: DeleteAccount = mock() + private val getLockAction: GetLockAction = mock() + private val updateInitialSyncStatus: UpdateInitialSyncStatus = mock() + private val checkSingleNavigation: CheckSingleNavigation = mock() + private val launchInitialSync: LaunchInitialSync = mock() + private val scheduleNewVersionAlert: ScheduleNewVersionAlert = mock() + private val syncBackgroundJobAction: SyncBackgroundJobAction = mock() + + private lateinit var viewModel: MainViewModel + + private val mockedFilterManagerMock = MutableStateFlow<Int>(0) + + private val syncStatusFlow = MutableStateFlow(SyncStatusData()) + private val newVersionFlow = MutableSharedFlow<String>() + + @Before + fun setUp() = runTest { + Dispatchers.setMain(testingDispatcher) + + whenever(syncStatusController.observeDownloadProcess()) doReturn syncStatusFlow + whenever(scheduleNewVersionAlert.newVersionFlow) doReturn newVersionFlow + whenever(filterManager.asFlow(any())) doReturn mockedFilterManagerMock + whenever(filterManager.periodRequest) doReturn mock() + whenever(filterManager.ouTreeFlowable()) doReturn mock() + whenever(launchInitialSync()) doReturn Result.success(InitialSyncAction.Skip) + whenever(checkSingleNavigation()) doReturn Result.failure(Exception("no single navigation")) + + viewModel = MainViewModel( + preferences = preferences, + filterManager = filterManager, + matomoAnalyticsController = matomoAnalyticsController, + syncStatusController = syncStatusController, + mainNavigator = mainNavigator, + getUserName = getUserName, + configureHomeNavigationBar = configureHomeNavigationBar, + getHomeFilters = getHomeFilters, + downloadNewVersion = downloadNewVersion, + logOutUser = logOutUser, + deleteAccount = deleteAccount, + getLockAction = getLockAction, + updateInitialSyncStatus = updateInitialSyncStatus, + checkSingleNavigation = checkSingleNavigation, + launchInitialSync = launchInitialSync, + scheduleNewVersionAlert = scheduleNewVersionAlert, + syncBackgroundJobAction = syncBackgroundJobAction, + initialScreen = MainScreenType.Home(HomeScreen.Programs), + dispatcher = object : DispatcherProvider { + override fun io(): CoroutineDispatcher = testingDispatcher + + override fun computation(): CoroutineDispatcher = testingDispatcher + + override fun ui(): CoroutineDispatcher = testingDispatcher + }, + ) + } + + @Test + fun `Should save default settings and render user name when the activity is resumed`() = + runTest { + whenever(getUserName()) doReturn Result.success("mocked_user_name") + whenever(configureHomeNavigationBar()) doReturn Result.success(emptyList()) + whenever(getHomeFilters()) doReturn Result.success(emptyList()) + whenever(resourceManager.getString(-1)) doReturn "" + whenever(filterManager.totalFilters) doReturn 0 + + viewModel.homeScreenState.test { + awaitItem() + assertTrue(awaitItem().userName == "mocked_user_name") + } + } + + @Test + fun `Should log out`() = + runTest { + whenever(logOutUser()) doReturn Result.success(1) + viewModel.homeEffects.test { + viewModel.logOut() + advanceUntilIdle() + verify(matomoAnalyticsController).trackEvent(HOME, CLOSE_SESSION, CLICK) + assertTrue(awaitItem() == HomeEffect.GoToLogin(1, false)) + } + } + + @Test + fun `Should block session`() = runTest { + + whenever(getLockAction()) doReturn Result.success(LockAction.BlockSession) + + viewModel.homeEffects.test { + viewModel.onBlockSession() + assertTrue(awaitItem() == HomeEffect.BlockSession) + verify(matomoAnalyticsController).trackEvent( + HOME, BLOCK_SESSION_PIN, CLICK + ) + } + } + + @Test + fun `Should open drawer when menu is clicked`() = runTest { + viewModel.homeEffects.test { + viewModel.onAction(HomeAction.MenuClicked) + assertTrue(awaitItem() == HomeEffect.ToggleSideMenu) + } + } + + @Test + fun `should return to home section when user taps back in a different section`() = runTest { + whenever(mainNavigator.openHome()) doReturn MainScreenType.Home(HomeScreen.Programs) + viewModel.onChangeScreen(MainScreenType.Settings) + viewModel.onAction(HomeAction.BackPressed) + advanceUntilIdle() + verify(mainNavigator, times(1)).openHome() + } + + @Test + fun `should close app when user taps back in a home section`() = runTest { + viewModel.homeEffects.test { + viewModel.onChangeScreen(MainScreenType.Home(HomeScreen.Programs)) + viewModel.onAction(HomeAction.BackPressed) + assertTrue(awaitItem() is HomeEffect.BlockSession) + } + } + + @Test + fun `Should track event when clicking on SyncManager`() = runTest { + viewModel.onChangeScreen(MainScreenType.Settings) + advanceUntilIdle() + verify(matomoAnalyticsController).trackEvent(HOME, SETTINGS, CLICK) + } + + @Test + fun `Should go to delete account`() = runTest { + + whenever(deleteAccount(any())) doReturn Result.success(1) + + viewModel.homeEffects.test { + val mockedContext = mock<Context>() + whenever(mockedContext.cacheDir) doReturn File("random") + with(mockedContext) { + viewModel.onDeleteAccount() + } + + assertTrue(awaitItem() == HomeEffect.ShowDeleteNotification) + verify(syncBackgroundJobAction).cancelAll() + assertTrue(awaitItem() == HomeEffect.GoToLogin(1, true)) + + } + } + + @Test + fun shouldSetVersionToUpdate() = runTest { + whenever(getUserName()) doReturn Result.success("username") + whenever(configureHomeNavigationBar()) doReturn Result.success(emptyList()) + whenever(getHomeFilters()) doReturn Result.success(emptyList()) + whenever(filterManager.totalFilters) doReturn 0 + + viewModel.homeScreenState.test { + awaitItem() + newVersionFlow.emit("test.test.test") + with(awaitItem()) { + assertTrue(versionToUpdate is VersionToUpdateState.New) + assertTrue((versionToUpdate as VersionToUpdateState.New).version == "test.test.test") + } + } + } + + @Test + fun shouldSendGranularSyncEvent() = runTest { + viewModel.homeEffects.test { + viewModel.onAction(HomeAction.SyncClicked) + assertTrue(awaitItem() is HomeEffect.ShowGranularSync) + } + } + + @Test + fun shouldToggleFilters() = runTest { + whenever(getUserName()) doReturn Result.success("username") + whenever(configureHomeNavigationBar()) doReturn Result.success( + listOf( + NavigationBarItem( + id = NavigationPage.PROGRAMS, + icon = Icons.Filled.Form, + label = "Program" + ), + NavigationBarItem( + id = NavigationPage.ANALYTICS, + icon = Icons.Filled.BarChart, + label = "Analytics", + ) + ) + ) + whenever(getHomeFilters()) doReturn Result.success(emptyList()) + whenever(filterManager.totalFilters) doReturn 0 + + viewModel.homeScreenState.test { + viewModel.onAction(HomeAction.FilterClicked) + viewModel.homeEffects.test { + assertTrue((this).awaitItem() is HomeEffect.ToggleFilters) + } + assertTrue((this@test).awaitItem().bottomNavigationBarVisible.not()) + } + } +} diff --git a/app/src/test/java/org/dhis2/usescases/main/domain/CheckSingleNavigationTest.kt b/app/src/test/java/org/dhis2/usescases/main/domain/CheckSingleNavigationTest.kt new file mode 100644 index 00000000000..afa1fbd1c78 --- /dev/null +++ b/app/src/test/java/org/dhis2/usescases/main/domain/CheckSingleNavigationTest.kt @@ -0,0 +1,70 @@ +package org.dhis2.usescases.main.domain + +import kotlinx.coroutines.test.runTest +import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.HomeItemData +import org.dhis2.usescases.main.data.HomeRepository +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.given +import org.mockito.kotlin.mock +import org.mockito.kotlin.times +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever +import org.mockito.kotlin.willAnswer + +class CheckSingleNavigationTest { + private val homeRepository: HomeRepository = mock() + private lateinit var checkSingleNavigation: CheckSingleNavigation + + @Before + fun setUp() { + checkSingleNavigation = CheckSingleNavigation(homeRepository) + } + + @Test + fun `should return HomeDataItem if there is only one program`() = + runTest { + whenever(homeRepository.homeItemCount()) doReturn 1 + whenever(homeRepository.singleHomeItemData()) doReturn + HomeItemData.EventProgram( + "eventUid", + "eventLabel", + true, + ) + assertTrue(checkSingleNavigation().isSuccess) + } + + @Test + fun `should return failure if more than one program`() = + runTest { + whenever(homeRepository.homeItemCount()) doReturn 2 + with(checkSingleNavigation()) { + verify(homeRepository, times(0)).singleHomeItemData() + assertTrue(isFailure) + } + } + + @Test + fun `should return failure if there are no programs`() = + runTest { + whenever(homeRepository.homeItemCount()) doReturn 0 + with(checkSingleNavigation()) { + verify(homeRepository, times(0)).singleHomeItemData() + assertTrue(isFailure) + } + } + + @Test + fun `should return failure if there is a domain exception`() = + runTest { + given(homeRepository.homeItemCount()) willAnswer { throw DomainError.DatabaseError("Test") } + with(checkSingleNavigation()) { + assertTrue(isFailure) + assertTrue(exceptionOrNull() is DomainError) + } + } +} diff --git a/app/src/test/java/org/dhis2/usescases/main/domain/ConfigureHomeNavigationBarTest.kt b/app/src/test/java/org/dhis2/usescases/main/domain/ConfigureHomeNavigationBarTest.kt new file mode 100644 index 00000000000..63b2cb40869 --- /dev/null +++ b/app/src/test/java/org/dhis2/usescases/main/domain/ConfigureHomeNavigationBarTest.kt @@ -0,0 +1,63 @@ +package org.dhis2.usescases.main.domain + +import kotlinx.coroutines.test.runTest +import org.dhis2.R +import org.dhis2.commons.resources.ResourceManager +import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.data.HomeRepository +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.given +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever +import org.mockito.kotlin.willAnswer + +class ConfigureHomeNavigationBarTest { + private val homeRepository: HomeRepository = mock() + private val resourceManager: ResourceManager = mock() + lateinit var configureHomeNavigationBar: ConfigureHomeNavigationBar + + @Before + fun setUp() { + whenever(resourceManager.getString(R.string.navigation_programs)) doReturn "Programs" + whenever(resourceManager.getString(R.string.navigation_charts)) doReturn "Analytics" + configureHomeNavigationBar = + ConfigureHomeNavigationBar( + homeRepository = homeRepository, + resourceManager = resourceManager, + ) + } + + @Test + fun `should return programs and analytics items if configured`() = + runTest { + whenever(homeRepository.hasHomeAnalytics()) doReturn true + with(configureHomeNavigationBar()) { + assertTrue(isSuccess) + assertTrue(getOrNull()?.size == 2) + } + } + + @Test + fun `should return just programs if analytics is not configured`() = + runTest { + whenever(homeRepository.hasHomeAnalytics()) doReturn false + with(configureHomeNavigationBar()) { + assertTrue(isSuccess) + assertTrue(getOrNull()?.size == 1) + } + } + + @Test + fun `should return just programs if an exception is thrown`() = + runTest { + given(homeRepository.hasHomeAnalytics()) willAnswer { throw DomainError.DatabaseError("Test") } + with(configureHomeNavigationBar()) { + assertTrue(isSuccess) + assertTrue(getOrNull()?.size == 1) + } + } +} diff --git a/app/src/test/java/org/dhis2/usescases/main/domain/DeleteAccountTest.kt b/app/src/test/java/org/dhis2/usescases/main/domain/DeleteAccountTest.kt new file mode 100644 index 00000000000..a3f6f112651 --- /dev/null +++ b/app/src/test/java/org/dhis2/usescases/main/domain/DeleteAccountTest.kt @@ -0,0 +1,65 @@ +package org.dhis2.usescases.main.domain + +import junit.framework.Assert.assertTrue +import kotlinx.coroutines.test.runTest +import org.dhis2.commons.filters.FilterManager +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.data.HomeRepository +import org.junit.Before +import org.junit.Test +import org.mockito.Mockito.mock +import org.mockito.kotlin.any +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.given +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever +import org.mockito.kotlin.willAnswer +import kotlin.io.path.createTempFile + +class DeleteAccountTest { + private val filterManager: FilterManager = mock() + private val repository: HomeRepository = mock() + private lateinit var deleteAccount: DeleteAccount + + @Before + fun setUp() { + deleteAccount = + DeleteAccount( + filterManager = filterManager, + repository = repository, + ) + } + + @Test + fun `should successfully return and clear all data`() = + runTest { + val cacheFile = createTempFile().toFile() + whenever(repository.clearCache(any())) doReturn true + whenever(repository.accountsCount()) doReturn 3 + with(deleteAccount(cacheFile)) { + verify(filterManager).clearAllFilters() + verify(repository).clearCache(cacheFile) + verify(repository).clearPreferences() + verify(repository).wipeAll() + verify(repository).deleteCurrentAccount() + assertTrue(isSuccess) + assertTrue(getOrNull() == 3) + } + } + + @Test + fun `should return failure when domain exception is thrown`() = + runTest { + val cacheFile = createTempFile().toFile() + whenever(repository.clearCache(any())) doReturn true + given(repository.deleteCurrentAccount()) willAnswer { throw DomainError.DatabaseError("Test") } + with(deleteAccount(cacheFile)) { + verify(filterManager).clearAllFilters() + verify(repository).clearCache(cacheFile) + verify(repository).clearPreferences() + verify(repository).wipeAll() + verify(repository).deleteCurrentAccount() + assertTrue(isFailure) + } + } +} diff --git a/app/src/test/java/org/dhis2/usescases/main/domain/DownloadNewVersionTest.kt b/app/src/test/java/org/dhis2/usescases/main/domain/DownloadNewVersionTest.kt new file mode 100644 index 00000000000..caaec27534d --- /dev/null +++ b/app/src/test/java/org/dhis2/usescases/main/domain/DownloadNewVersionTest.kt @@ -0,0 +1,60 @@ +package org.dhis2.usescases.main.domain + +import android.content.Context +import kotlinx.coroutines.test.runTest +import org.dhis2.data.service.VersionRepository +import org.dhis2.mobile.commons.error.DomainError +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.mockito.kotlin.any +import org.mockito.kotlin.given +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever +import org.mockito.kotlin.willAnswer + +class DownloadNewVersionTest { + private val versionRepository: VersionRepository = mock() + private lateinit var downloadNewVersion: DownloadNewVersion + + @Before + fun setUp() { + downloadNewVersion = DownloadNewVersion(versionRepository) + } + + @Test + fun `should successfully download new version`() = + runTest { + // GIVEN + val fakeUriPath = "fakeUriPath" + whenever( + versionRepository.download( + context = any(), + onDownloadCompleted = any(), + onDownloading = any(), + ), + ).thenAnswer { + // Simulate the callback being called upon successful download + val onDownloadCompletedCallback = it.getArgument<(String) -> Unit>(1) + onDownloadCompletedCallback.invoke(fakeUriPath) + } + val context: Context = mock() + + with(downloadNewVersion(context)) { + assertTrue(isSuccess) + } + } + + @Test + fun `should return failure if an exception is thrown`() = + runTest { + given(versionRepository.download(any(), any(), any())) willAnswer { + throw DomainError.DatabaseError("Test") + } + val context: Context = mock() + + with(downloadNewVersion(context)) { + assertTrue(isFailure) + } + } +} diff --git a/app/src/test/java/org/dhis2/usescases/main/domain/GetHomeFiltersTest.kt b/app/src/test/java/org/dhis2/usescases/main/domain/GetHomeFiltersTest.kt new file mode 100644 index 00000000000..cc5fb863bd5 --- /dev/null +++ b/app/src/test/java/org/dhis2/usescases/main/domain/GetHomeFiltersTest.kt @@ -0,0 +1,44 @@ +package org.dhis2.usescases.main.domain + +import kotlinx.coroutines.test.runTest +import org.dhis2.commons.filters.FilterItem +import org.dhis2.commons.filters.data.FilterRepository +import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.commons.error.DomainError +import org.junit.Before +import org.junit.Test +import org.mockito.Mockito.mock +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.given +import org.mockito.kotlin.whenever +import org.mockito.kotlin.willAnswer + +class GetHomeFiltersTest { + private val filterRepository: FilterRepository = mock() + private lateinit var getHomeFilters: GetHomeFilters + + @Before + fun setUp() { + getHomeFilters = GetHomeFilters(filterRepository) + } + + @Test + fun `should return a list of home filters`() = + runTest { + val expectedFilters: List<FilterItem> = mock() + whenever(filterRepository.homeFilters()) doReturn expectedFilters + val result = getHomeFilters() + assert(result.isSuccess) + assert(result.getOrNull() == expectedFilters) + } + + @Test + fun `should return a failure when an exception is thrown`() = + runTest { + given(filterRepository.homeFilters()) willAnswer { + throw DomainError.DatabaseError("Test") + } + val result = getHomeFilters() + assert(result.isFailure) + } +} diff --git a/app/src/test/java/org/dhis2/usescases/main/domain/GetLockActionTest.kt b/app/src/test/java/org/dhis2/usescases/main/domain/GetLockActionTest.kt new file mode 100644 index 00000000000..3db9ea7323e --- /dev/null +++ b/app/src/test/java/org/dhis2/usescases/main/domain/GetLockActionTest.kt @@ -0,0 +1,53 @@ +package org.dhis2.usescases.main.domain + +import kotlinx.coroutines.test.runTest +import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.data.HomeRepository +import org.dhis2.usescases.main.domain.model.LockAction +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.given +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever +import org.mockito.kotlin.willAnswer + +class GetLockActionTest { + private val homeRepository: HomeRepository = mock() + private lateinit var getLockAction: GetLockAction + + @Before + fun setUp() { + getLockAction = GetLockAction(homeRepository) + } + + @Test + fun `should return BlockSession action if pin is set`() = + runTest { + whenever(homeRepository.isPinStored()) doReturn true + val result = getLockAction() + assertTrue(result.isSuccess) + assertTrue(result.getOrNull() is LockAction.BlockSession) + } + + @Test + fun `should return CreatePin action if pin is set`() = + runTest { + whenever(homeRepository.isPinStored()) doReturn false + val result = getLockAction() + assertTrue(result.isSuccess) + assertTrue(result.getOrNull() is LockAction.CreatePin) + } + + @Test + fun `should return failure if an exception is thrown`() = + runTest { + given(homeRepository.isPinStored()) willAnswer { + throw DomainError.DatabaseError("Test") + } + val result = getLockAction() + assertTrue(result.isFailure) + } +} diff --git a/app/src/test/java/org/dhis2/usescases/main/domain/GetUserNameTest.kt b/app/src/test/java/org/dhis2/usescases/main/domain/GetUserNameTest.kt new file mode 100644 index 00000000000..aee8436306d --- /dev/null +++ b/app/src/test/java/org/dhis2/usescases/main/domain/GetUserNameTest.kt @@ -0,0 +1,99 @@ +package org.dhis2.usescases.main.domain + +import kotlinx.coroutines.test.runTest +import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.data.HomeRepository +import org.hisp.dhis.android.core.user.User +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.given +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever +import org.mockito.kotlin.willAnswer + +class GetUserNameTest { + private val homeRepository: HomeRepository = mock() + private lateinit var getUserName: GetUserName + + @Before + fun setUp() { + getUserName = GetUserName(homeRepository) + } + + @Test + fun `should return full name if user exists`() = + runTest { + val user: User = + mock { + on { firstName() } doReturn "Peter" + on { surname() } doReturn "Jones" + } + whenever(homeRepository.user()) doReturn user + + val result = getUserName() + + assertTrue(result.isSuccess) + assertEquals("Peter Jones", result.getOrNull()) + } + + @Test + fun `should return surname if first name is null`() = + runTest { + val user: User = + mock { + on { firstName() } doReturn null + on { surname() } doReturn "Jones" + } + whenever(homeRepository.user()) doReturn user + + val result = getUserName() + + assertTrue(result.isSuccess) + assertEquals("Jones", result.getOrNull()) + } + + @Test + fun `should return first name if surname is null`() = + runTest { + val user: User = + mock { + on { firstName() } doReturn "Peter" + on { surname() } doReturn null + } + whenever(homeRepository.user()) doReturn user + + val result = getUserName() + + assertTrue(result.isSuccess) + assertEquals("Peter", result.getOrNull()) + } + + @Test + fun `should return empty string if user is null`() = + runTest { + whenever(homeRepository.user()) doReturn null + + val result = getUserName() + + assertTrue(result.isSuccess) + assertEquals("", result.getOrNull()) + } + + @Test + fun `should return failure if repository throws error`() = + runTest { + val exception = DomainError.DatabaseError("Error") + given(homeRepository.user()) willAnswer { + throw exception + } + + val result = getUserName() + + assertTrue(result.isFailure) + assertEquals(exception, result.exceptionOrNull()) + } +} diff --git a/app/src/test/java/org/dhis2/usescases/main/domain/LaunchInitialSyncTest.kt b/app/src/test/java/org/dhis2/usescases/main/domain/LaunchInitialSyncTest.kt new file mode 100644 index 00000000000..17d861dfa9a --- /dev/null +++ b/app/src/test/java/org/dhis2/usescases/main/domain/LaunchInitialSyncTest.kt @@ -0,0 +1,144 @@ +package org.dhis2.usescases.main.domain + +import kotlinx.coroutines.test.runTest +import org.dhis2.data.service.VersionRepository +import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.usescases.main.data.HomeRepository +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Test +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.given +import org.mockito.kotlin.mock +import org.mockito.kotlin.verify +import org.mockito.kotlin.verifyNoInteractions +import org.mockito.kotlin.whenever + +class LaunchInitialSyncTest { + private val homeRepository: HomeRepository = mock() + private val versionRepository: VersionRepository = mock() + private val syncBackgroundJobAction: SyncBackgroundJobAction = mock() + private lateinit var launchInitialSync: LaunchInitialSync + + @Test + fun `should return Skip if skipSync is true`() = + runTest { + launchInitialSync = + LaunchInitialSync( + skipSync = true, + homeRepository = homeRepository, + versionRepository = versionRepository, + syncBackgroundJobAction = syncBackgroundJobAction, + ) + + val result = launchInitialSync() + + assertTrue(result.isSuccess) + assertEquals(InitialSyncAction.Skip, result.getOrNull()) + verifyNoInteractions(homeRepository) + verifyNoInteractions(versionRepository) + } + + @Test + fun `should return Skip if database is imported`() = + runTest { + whenever(homeRepository.isImportedDb()) doReturn true + launchInitialSync = + LaunchInitialSync( + skipSync = false, + homeRepository = homeRepository, + versionRepository = versionRepository, + syncBackgroundJobAction = syncBackgroundJobAction, + ) + + val result = launchInitialSync() + + assertTrue(result.isSuccess) + assertEquals(InitialSyncAction.Skip, result.getOrNull()) + } + + @Test + fun `should return Skip if initial sync is done`() = + runTest { + whenever(homeRepository.isImportedDb()) doReturn false + whenever(homeRepository.getInitialSyncDone()) doReturn true + launchInitialSync = + LaunchInitialSync( + skipSync = false, + homeRepository = homeRepository, + versionRepository = versionRepository, + syncBackgroundJobAction = syncBackgroundJobAction, + ) + + val result = launchInitialSync() + + assertTrue(result.isSuccess) + assertEquals(InitialSyncAction.Skip, result.getOrNull()) + } + + @Test + fun `should return Syncing and launch initial sync`() = + runTest { + whenever(homeRepository.isImportedDb()) doReturn false + whenever(homeRepository.getInitialSyncDone()) doReturn false + launchInitialSync = + LaunchInitialSync( + skipSync = false, + homeRepository = homeRepository, + versionRepository = versionRepository, + syncBackgroundJobAction = syncBackgroundJobAction, + ) + + val result = launchInitialSync() + + assertTrue(result.isSuccess) + assertEquals(InitialSyncAction.Syncing, result.getOrNull()) + verify(versionRepository).checkVersionUpdates() + } + + @Test + fun `should return failure if check version update fails`() = + runTest { + val exception = DomainError.DatabaseError("Error") + whenever(homeRepository.isImportedDb()) doReturn false + whenever(homeRepository.getInitialSyncDone()) doReturn false + given(versionRepository.checkVersionUpdates()).willAnswer { + throw exception + } + launchInitialSync = + LaunchInitialSync( + skipSync = false, + homeRepository = homeRepository, + versionRepository = versionRepository, + syncBackgroundJobAction = syncBackgroundJobAction, + ) + + val result = launchInitialSync() + + assertTrue(result.isFailure) + assertEquals(exception, result.exceptionOrNull()) + } + + @Test + fun `should return failure if home repository fails`() = + runTest { + val exception = DomainError.DatabaseError("Error") + given(homeRepository.isImportedDb()).willAnswer { + throw exception + } + launchInitialSync = + LaunchInitialSync( + skipSync = false, + homeRepository = homeRepository, + versionRepository = versionRepository, + syncBackgroundJobAction = syncBackgroundJobAction, + ) + + val result = launchInitialSync() + + assertTrue(result.isFailure) + assertEquals(exception, result.exceptionOrNull()) + } +} diff --git a/app/src/test/java/org/dhis2/usescases/main/domain/LogoutUserTest.kt b/app/src/test/java/org/dhis2/usescases/main/domain/LogoutUserTest.kt index df31b8e52fa..c45b523215b 100644 --- a/app/src/test/java/org/dhis2/usescases/main/domain/LogoutUserTest.kt +++ b/app/src/test/java/org/dhis2/usescases/main/domain/LogoutUserTest.kt @@ -2,10 +2,11 @@ package org.dhis2.usescases.main.domain import kotlinx.coroutines.test.runTest import org.dhis2.commons.filters.FilterManager -import org.dhis2.data.service.SyncStatusController -import org.dhis2.data.service.workManager.WorkManagerController +import org.dhis2.mobile.commons.domain.invoke import org.dhis2.mobile.commons.error.DomainError -import org.dhis2.usescases.main.HomeRepository +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.domain.SyncStatusController +import org.dhis2.usescases.main.data.HomeRepository import org.junit.Assert.assertTrue import org.junit.Assert.fail import org.junit.Before @@ -18,8 +19,8 @@ import org.mockito.kotlin.whenever class LogoutUserTest { private val repository: HomeRepository = mock() - private val workManagerController: WorkManagerController = mock() private val syncStatusController: SyncStatusController = mock() + private val syncBackgroundJobAction: SyncBackgroundJobAction = mock() private val filterManager: FilterManager = mock() private lateinit var logoutUser: LogoutUser @@ -29,7 +30,7 @@ class LogoutUserTest { logoutUser = LogoutUser( repository, - workManagerController, + syncBackgroundJobAction, syncStatusController, filterManager, ) @@ -41,10 +42,10 @@ class LogoutUserTest { whenever(repository.logOut()) doReturn Result.success(Unit) whenever(repository.accountsCount()) doReturn 1 val result = logoutUser() - verify(workManagerController).cancelAllWorkAndWait() + verify(syncBackgroundJobAction).cancelAll() verify(syncStatusController).restore() verify(filterManager).clearAllFilters() - verify(repository).clearSessionLock() + verify(repository).clearPin() verify(repository).logOut() verify(repository).accountsCount() @@ -55,12 +56,12 @@ class LogoutUserTest { fun `GIVEN the user logs out WHEN domain error THEN exception is returned`() = runTest { val testException = DomainError.UnexpectedError("test") - whenever(repository.clearSessionLock()) doReturn Result.failure(testException) + whenever(repository.clearPin()) doReturn Result.failure(testException) val result = logoutUser() - verify(workManagerController).cancelAllWorkAndWait() + verify(syncBackgroundJobAction).cancelAll() verify(syncStatusController).restore() verify(filterManager).clearAllFilters() - verify(repository).clearSessionLock() + verify(repository).clearPin() verify(repository, never()).logOut() verify(repository, never()).accountsCount() @@ -80,10 +81,10 @@ class LogoutUserTest { assertTrue(e == testException) } - verify(workManagerController).cancelAllWorkAndWait() + verify(syncBackgroundJobAction).cancelAll() verify(syncStatusController).restore() verify(filterManager).clearAllFilters() - verify(repository).clearSessionLock() + verify(repository).clearPin() verify(repository).logOut() verify(repository, never()).accountsCount() } diff --git a/app/src/test/java/org/dhis2/usescases/main/domain/ScheduleNewVersionAlertTest.kt b/app/src/test/java/org/dhis2/usescases/main/domain/ScheduleNewVersionAlertTest.kt new file mode 100644 index 00000000000..77f6c45144e --- /dev/null +++ b/app/src/test/java/org/dhis2/usescases/main/domain/ScheduleNewVersionAlertTest.kt @@ -0,0 +1,55 @@ +package org.dhis2.usescases.main.domain + +import kotlinx.coroutines.test.runTest +import org.dhis2.data.service.VersionRepository +import org.dhis2.data.service.workManager.WorkManagerController +import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.commons.error.DomainError +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.mockito.kotlin.any +import org.mockito.kotlin.given +import org.mockito.kotlin.mock +import org.mockito.kotlin.verify + +class ScheduleNewVersionAlertTest { + private val workManagerController: WorkManagerController = mock() + private val versionRepository: VersionRepository = mock() + private lateinit var scheduleNewVersionAlert: ScheduleNewVersionAlert + + @Before + fun setUp() { + scheduleNewVersionAlert = + ScheduleNewVersionAlert( + workManagerController = workManagerController, + versionRepository = versionRepository, + ) + } + + @Test + fun `should schedule new version alert and remove version info`() = + runTest { + val result = scheduleNewVersionAlert() + + assertTrue(result.isSuccess) + + verify(workManagerController).beginUniqueWork(any()) + verify(versionRepository).removeVersionInfo() + } + + @Test + fun `should return failure when remove version info fails`() = + runTest { + val exception = DomainError.DatabaseError("Error") + given(versionRepository.removeVersionInfo()).willAnswer { + throw exception + } + + val result = scheduleNewVersionAlert() + + assertTrue(result.isFailure) + assertEquals(exception, result.exceptionOrNull()) + } +} diff --git a/app/src/test/java/org/dhis2/usescases/main/domain/UpdateInitialSyncStatusTest.kt b/app/src/test/java/org/dhis2/usescases/main/domain/UpdateInitialSyncStatusTest.kt new file mode 100644 index 00000000000..11589c76b5f --- /dev/null +++ b/app/src/test/java/org/dhis2/usescases/main/domain/UpdateInitialSyncStatusTest.kt @@ -0,0 +1,46 @@ +package org.dhis2.usescases.main.domain + +import kotlinx.coroutines.test.runTest +import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.usescases.main.data.HomeRepository +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.mockito.kotlin.given +import org.mockito.kotlin.mock +import org.mockito.kotlin.verify + +class UpdateInitialSyncStatusTest { + private val homeRepository: HomeRepository = mock() + private lateinit var updateInitialSyncStatus: UpdateInitialSyncStatus + + @Before + fun setUp() { + updateInitialSyncStatus = UpdateInitialSyncStatus(homeRepository) + } + + @Test + fun `should call set initial sync done`() = + runTest { + val result = updateInitialSyncStatus() + + assertTrue(result.isSuccess) + verify(homeRepository).setInitialSyncDone() + } + + @Test + fun `should return failure when repository fails`() = + runTest { + val exception = DomainError.DatabaseError("Error") + given(homeRepository.setInitialSyncDone()).willAnswer { + throw exception + } + + val result = updateInitialSyncStatus() + + assertTrue(result.isFailure) + assertEquals(exception, result.exceptionOrNull()) + } +} diff --git a/app/src/test/java/org/dhis2/usescases/main/program/ProgramRepositoryImplTest.kt b/app/src/test/java/org/dhis2/usescases/main/program/ProgramRepositoryImplTest.kt index ff8c3653a59..00994f23b3f 100644 --- a/app/src/test/java/org/dhis2/usescases/main/program/ProgramRepositoryImplTest.kt +++ b/app/src/test/java/org/dhis2/usescases/main/program/ProgramRepositoryImplTest.kt @@ -12,12 +12,13 @@ import org.dhis2.commons.resources.MetadataIconProvider import org.dhis2.commons.resources.ResourceManager import org.dhis2.data.dhislogic.DhisProgramUtils import org.dhis2.data.schedulers.TrampolineSchedulerProvider -import org.dhis2.data.service.SyncStatusData import org.dhis2.mobile.commons.model.MetadataIconData +import org.dhis2.mobile.sync.model.SyncStatusData import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.common.Access import org.hisp.dhis.android.core.common.DataAccess import org.hisp.dhis.android.core.common.ObjectStyle +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.dataset.DataSet import org.hisp.dhis.android.core.dataset.DataSetInstanceSummary @@ -88,6 +89,7 @@ class ProgramRepositoryImplTest { .builder() .uid("dataSetUid") .description("description") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .style( ObjectStyle .builder() @@ -242,7 +244,7 @@ class ProgramRepositoryImplTest { filterPresenter.filteredTrackerProgram(any()).offlineFirst(), ) doReturn mock() whenever( - filterPresenter.filteredTrackerProgram(any<Program>()).offlineFirst().blockingGetUids(), + filterPresenter.filteredTrackerProgram(any()).offlineFirst().blockingGetUids(), ) doReturn listOf("0", "1") } @@ -274,6 +276,8 @@ class ProgramRepositoryImplTest { .displayName("program1") .programType(ProgramType.WITHOUT_REGISTRATION) .style(ObjectStyle.builder().build()) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), Program .builder() @@ -281,6 +285,8 @@ class ProgramRepositoryImplTest { .displayName("program2") .programType(ProgramType.WITH_REGISTRATION) .style(ObjectStyle.builder().build()) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .trackedEntityType( TrackedEntityType .builder() diff --git a/app/src/test/java/org/dhis2/usescases/main/program/ProgramViewModelTest.kt b/app/src/test/java/org/dhis2/usescases/main/program/ProgramViewModelTest.kt index 0b3804dde34..5f8271dc73c 100644 --- a/app/src/test/java/org/dhis2/usescases/main/program/ProgramViewModelTest.kt +++ b/app/src/test/java/org/dhis2/usescases/main/program/ProgramViewModelTest.kt @@ -16,10 +16,10 @@ import org.dhis2.commons.filters.FilterManager import org.dhis2.commons.matomo.MatomoAnalyticsController import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.schedulers.TestSchedulerProvider -import org.dhis2.data.service.SyncStatusController -import org.dhis2.data.service.SyncStatusData import org.dhis2.mobile.commons.extensions.toColor import org.dhis2.mobile.commons.model.MetadataIconData +import org.dhis2.mobile.sync.domain.SyncStatusController +import org.dhis2.mobile.sync.model.SyncStatusData import org.dhis2.utils.MainCoroutineScopeRule import org.hisp.dhis.android.core.common.State import org.hisp.dhis.mobile.ui.designsystem.component.ImageCardData diff --git a/app/src/test/java/org/dhis2/usescases/notes/NotesRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/notes/NotesRepositoryTest.kt index b931b2efaa0..87cb0762bcd 100644 --- a/app/src/test/java/org/dhis2/usescases/notes/NotesRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/usescases/notes/NotesRepositoryTest.kt @@ -4,6 +4,7 @@ import io.reactivex.Single import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.common.Access import org.hisp.dhis.android.core.common.DataAccess +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.note.Note import org.hisp.dhis.android.core.program.Program @@ -94,6 +95,8 @@ class NotesRepositoryTest { Program .builder() .uid(UUID.randomUUID().toString()) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .access( Access .builder() @@ -171,6 +174,11 @@ class NotesRepositoryTest { .eq(teiUid) .one() .blockingGet(), - ) doReturn Enrollment.builder().uid(enrollmentUid).build() + ) doReturn + Enrollment + .builder() + .uid(enrollmentUid) + .attributeOptionCombo("attributeOptionComboUid") + .build() } } diff --git a/app/src/test/java/org/dhis2/usescases/notes/noteDetail/NoteDetailRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/notes/noteDetail/NoteDetailRepositoryTest.kt index e228758c385..c8c2fd556ae 100644 --- a/app/src/test/java/org/dhis2/usescases/notes/noteDetail/NoteDetailRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/usescases/notes/noteDetail/NoteDetailRepositoryTest.kt @@ -153,6 +153,11 @@ class NoteDetailRepositoryTest { .eq(teiUid) .one() .blockingGet(), - ) doReturn Enrollment.builder().uid("EnrollmentUid").build() + ) doReturn + Enrollment + .builder() + .uid("EnrollmentUid") + .attributeOptionCombo("attributeOptionComboUid") + .build() } } diff --git a/app/src/test/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailPresenterTest.kt index 494382f094c..bffb0e8e37f 100644 --- a/app/src/test/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/programEventDetail/ProgramEventDetailPresenterTest.kt @@ -15,6 +15,7 @@ import org.dhis2.commons.prefs.PreferenceProvider import org.dhis2.data.schedulers.TrampolineSchedulerProvider import org.hisp.dhis.android.core.category.CategoryCombo import org.hisp.dhis.android.core.category.CategoryOptionCombo +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.program.Program import org.junit.After import org.junit.Assert.assertTrue @@ -69,7 +70,13 @@ class ProgramEventDetailPresenterTest { @Test fun `Should init screen`() { - val program = Program.builder().uid("programUid").build() + val program = + Program + .builder() + .uid("programUid") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) + .build() whenever(repository.getAccessDataWrite()) doReturn true whenever(repository.program()) doReturn Single.just(program) diff --git a/app/src/test/java/org/dhis2/usescases/programEventDetail/ProgramEventMapperTest.kt b/app/src/test/java/org/dhis2/usescases/programEventDetail/ProgramEventMapperTest.kt index cb20610a333..3c180e57073 100644 --- a/app/src/test/java/org/dhis2/usescases/programEventDetail/ProgramEventMapperTest.kt +++ b/app/src/test/java/org/dhis2/usescases/programEventDetail/ProgramEventMapperTest.kt @@ -7,6 +7,7 @@ import org.dhis2.mobile.commons.model.MetadataIconData import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.category.CategoryOptionCombo import org.hisp.dhis.android.core.common.ObjectStyle +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.event.Event import org.hisp.dhis.android.core.event.EventStatus @@ -49,7 +50,7 @@ class ProgramEventMapperTest { val result = mapper.eventToProgramEvent(event) assert(!result.isExpired) - assert(event.uid() == result.uid()) + assert(event.uid() == result.uid) assert(result.eventState == State.TO_UPDATE) } @@ -64,7 +65,7 @@ class ProgramEventMapperTest { val result = mapper.eventToProgramEvent(event) assert(!result.isExpired) - assert(event.uid() == result.uid()) + assert(event.uid() == result.uid) assert(result.eventState == State.SYNCED) } @@ -226,6 +227,8 @@ class ProgramEventMapperTest { .uid("programUid") .completeEventsExpiryDays(0) .expiryDays(0) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() private fun dummyCategoryOptionCombo() = diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryTest.kt index 4014e2b29b7..81c18f76301 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchRepositoryTest.kt @@ -6,27 +6,30 @@ import org.dhis2.commons.date.DateUtils import org.dhis2.commons.filters.Filters import org.dhis2.commons.filters.data.FilterPresenter import org.dhis2.commons.filters.sorting.SortingItem -import org.dhis2.commons.network.NetworkUtils -import org.dhis2.commons.resources.DhisPeriodUtils -import org.dhis2.commons.resources.MetadataIconProvider import org.dhis2.commons.resources.ResourceManager import org.dhis2.commons.simprints.ramp.repository.RampDatastoreRepository import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.forms.dataentry.SearchTEIRepository -import org.dhis2.data.sorting.SearchSortingValueSetter import org.dhis2.form.model.FieldUiModel import org.dhis2.form.model.FieldUiModelImpl import org.dhis2.form.model.UiRenderType -import org.dhis2.form.ui.FieldViewModelFactory import org.dhis2.mobile.commons.customintents.CustomIntentRepository +import org.dhis2.mobile.commons.extensions.getTodayAsInstant +import org.dhis2.mobile.commons.extensions.toKtxInstant +import org.dhis2.mobile.commons.network.NetworkStatusProvider import org.dhis2.mobile.commons.reporting.CrashReportController import org.dhis2.tracker.data.ProfilePictureProvider +import org.dhis2.tracker.search.model.GeometryFeatureType +import org.dhis2.tracker.search.model.SyncState +import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult +import org.dhis2.tracker.search.model.TrackedEntityTypeDomain import org.dhis2.ui.ThemeManager import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.arch.repositories.filters.internal.BooleanFilterConnector import org.hisp.dhis.android.core.arch.repositories.filters.internal.StringFilterConnector import org.hisp.dhis.android.core.arch.repositories.`object`.ReadOnlyOneObjectRepositoryFinalImpl import org.hisp.dhis.android.core.arch.repositories.scope.RepositoryScope +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.android.core.enrollment.Enrollment @@ -47,8 +50,8 @@ import org.hisp.dhis.android.core.trackedentity.TrackedEntityType import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItem import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItemAttribute import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItemHelper -import org.junit.Assert.assertEquals -import org.junit.Assert.assertFalse +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertNull import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test @@ -60,11 +63,10 @@ import org.mockito.kotlin.mock import org.mockito.kotlin.whenever import java.util.Calendar import java.util.Date +import kotlin.time.Instant class SearchRepositoryTest { private val d2: D2 = Mockito.mock(D2::class.java, Mockito.RETURNS_DEEP_STUBS) - private val fieldViewModelFactory: FieldViewModelFactory = mock() - private val metadataIconProvider: MetadataIconProvider = mock() private val dispatchers: DispatcherProvider = mock { on { io() } doReturn Dispatchers.IO @@ -76,31 +78,34 @@ class SearchRepositoryTest { private val trackedEntitySearchItemHelper: TrackedEntitySearchItemHelper = mock() private val enrollmentCollectionRepository: EnrollmentCollectionRepository = mock() - private val stringFilterConnector: StringFilterConnector<EnrollmentCollectionRepository> = mock() - private val booleanFilterConnector: BooleanFilterConnector<EnrollmentCollectionRepository> = mock() + private val stringFilterConnector: StringFilterConnector<EnrollmentCollectionRepository> = + mock() + private val booleanFilterConnector: BooleanFilterConnector<EnrollmentCollectionRepository> = + mock() private val programCollectionRepository: ProgramCollectionRepository = mock() - private val programReadOnlyOneObjectRepository: ReadOnlyOneObjectRepositoryFinalImpl<Program> = mock() + private val programReadOnlyOneObjectRepository: ReadOnlyOneObjectRepositoryFinalImpl<Program> = + mock() private val eventCollectionRepository: EventCollectionRepository = mock() private val eventStatusFilterConnector: EventStatusFilterConnector = mock() - private val stringEventFilterConnector: StringFilterConnector<EventCollectionRepository> = mock() + private val stringEventFilterConnector: StringFilterConnector<EventCollectionRepository> = + mock() private val orgUnitCollectionRepository: OrganisationUnitCollectionRepository = mock() - private val readOnlyOneObjectRepository: ReadOnlyOneObjectRepositoryFinalImpl<OrganisationUnit> = mock() + private val readOnlyOneObjectRepository: ReadOnlyOneObjectRepositoryFinalImpl<OrganisationUnit> = + mock() private val filterPresenter: FilterPresenter = mock() private val resourceManager: ResourceManager = mock() - private val sortingValueSetter: SearchSortingValueSetter = mock() - private val dhisPeriodUtils: DhisPeriodUtils = mock() private val charts: Charts = mock() private val crashReporterController: CrashReportController = mock() - private val networkUtils: NetworkUtils = mock() + private val networkUtils: NetworkStatusProvider = mock() private val searchTEIRepository: SearchTEIRepository = mock() private val themeManager: ThemeManager = mock() private val profilePictureProvider: ProfilePictureProvider = mock() - private val rampDatastoreRepository: RampDatastoreRepository = mock() private val dateUtils: DateUtils = DateUtils() + private val rampDatastoreRepository: RampDatastoreRepository = mock() @Before fun setUp() { @@ -113,7 +118,9 @@ class SearchRepositoryTest { ) val trackedEntityAttributeCollection = mock<TrackedEntityAttributeCollectionRepository>() - whenever(d2.trackedEntityModule().trackedEntityAttributes()).thenReturn(trackedEntityAttributeCollection) + whenever(d2.trackedEntityModule().trackedEntityAttributes()).thenReturn( + trackedEntityAttributeCollection, + ) whenever(trackedEntityAttributeCollection.uid(anyString())).thenAnswer { invocation -> val uid = invocation.arguments[0] as String trackedEntityAttributes[uid] ?: createTrackedEntityAttributeRepository(uid, false) @@ -124,8 +131,6 @@ class SearchRepositoryTest { searchRepositoryJava = mock(), d2 = d2, dispatcher = dispatchers, - fieldViewModelFactory = fieldViewModelFactory, - metadataIconProvider = metadataIconProvider, trackedEntityInstanceInfoProvider = mock(), eventInfoProvider = mock(), customIntentRepository = customIntentRepository, @@ -138,133 +143,83 @@ class SearchRepositoryTest { d2, filterPresenter, resourceManager, - sortingValueSetter, - dhisPeriodUtils, charts, crashReporterController, networkUtils, searchTEIRepository, themeManager, - metadataIconProvider, - profilePictureProvider, dateUtils, customIntentRepository, rampDatastoreRepository, + dispatchers, ) } @Test - fun shouldSortSearchParametersCorrectly() { - val mockData = createMockData() - val sortedData = searchRepository.sortSearchParameters(mockData) - - assertEquals("unique-code", sortedData[0].uid) - assertEquals("bp-number", sortedData[1].uid) - assertEquals("qr-code", sortedData[2].uid) - assertEquals("bar-code", sortedData[3].uid) - assertEquals("unique-id", sortedData[4].uid) - assertEquals("national-id", sortedData[5].uid) - assertEquals("first-name", sortedData[6].uid) - assertEquals("last-name", sortedData[7].uid) - assertEquals("phone-number", sortedData[8].uid) - assertEquals("state", sortedData[9].uid) + fun `isSearchEnabled delegates to RAMP datastore repository`() { + val programUid = "programUid" + searchRepositoryJava.setCurrentProgram(programUid) + whenever(rampDatastoreRepository.isSearchEnabled(programUid)) doReturn false + + assertTrue(!searchRepositoryJava.isSearchEnabled) } @Test fun shouldTransformToSearchTeiModelWithOverdueEvents() { - val searchItem = getTrackedEntitySearchItem("header") - val program = Program.builder().uid("programUid").build() - val sorting = SortingItem.create(Filters.ENROLLMENT_DATE) - val tei = TrackedEntitySearchItemHelper.toTrackedEntityInstance(searchItem) - val overdueDate = dateUtils.getCalendarByDate(Date()) overdueDate.add(Calendar.DATE, -2) - val enrollmentsInProgram = - listOf( - createEnrollment("enrollmentUid", "orgUnit", program.uid()), - createEnrollment("enrollmentUid_2", "orgUnit", program.uid()), - ) - val allEnrollments = - listOf( - createEnrollment("enrollmentUid_3", "orgUnit", "uid"), - createEnrollment("enrollmentUid_4", "orgUnit_2", "uid"), - ) - val events = - listOf( - createEvent("eventUid", EventStatus.OVERDUE, overdueDate.time), - createEvent("eventUid", EventStatus.SCHEDULE, overdueDate.time), - ) - - mockedSdkCalls(searchItem, tei, enrollmentsInProgram, allEnrollments, events) + val searchItemResult = createTrackedEntitySearchItemResult( + uid = "teiUid", + overDueDate = overdueDate.time.toKtxInstant(), + ) + val sorting = SortingItem.create(Filters.ENROLLMENT_DATE) - val result = searchRepositoryJava.transform(searchItem, program, true, sorting) + val result = searchRepository.mapTrackedEntitySearchItemResultToSearchTeiModel( + searchItemResult, + sorting, + ) - assertTrue(result.isHasOverdue) + assertNotNull(result.tei.overDueDate) + assertTrue(result.tei.overDueDate!! < getTodayAsInstant()) } @Test fun shouldTransformToSearchTeiModelWithOverdueScheduledEvents() { - val searchItem = getTrackedEntitySearchItem("header") - val program = Program.builder().uid("programUid").build() - val sorting = SortingItem.create(Filters.ENROLLMENT_DATE) - val tei = TrackedEntitySearchItemHelper.toTrackedEntityInstance(searchItem) - val overdueDate = dateUtils.getCalendarByDate(Date()) overdueDate.add(Calendar.DATE, -2) - val enrollmentsInProgram = - listOf( - createEnrollment("enrollmentUid", "orgUnit", program.uid()), - createEnrollment("enrollmentUid_2", "orgUnit", program.uid()), - ) - val allEnrollments = - listOf( - createEnrollment("enrollmentUid_3", "orgUnit", "uid"), - createEnrollment("enrollmentUid_4", "orgUnit_2", "uid"), - ) - val events = - listOf( - createEvent("eventUid", EventStatus.SCHEDULE, overdueDate.time), - ) - - mockedSdkCalls(searchItem, tei, enrollmentsInProgram, allEnrollments, events) + val searchItemResult = createTrackedEntitySearchItemResult( + uid = "teiUid", + overDueDate = overdueDate.time.toKtxInstant(), + ) + val sorting = SortingItem.create(Filters.ENROLLMENT_DATE) - val result = searchRepositoryJava.transform(searchItem, program, true, sorting) + val result = searchRepository.mapTrackedEntitySearchItemResultToSearchTeiModel( + searchItemResult, + sorting, + ) - assertTrue(result.isHasOverdue) + assertNotNull(result.tei.overDueDate) + assertTrue(result.tei.overDueDate!! < getTodayAsInstant()) } @Test fun shouldTransformToSearchTeiModelWithOutOverdueEvents() { - val searchItem = getTrackedEntitySearchItem("header") - val program = Program.builder().uid("programUid").build() + // Create a search result without overdue date (null means no overdue events) + val searchItemResult = createTrackedEntitySearchItemResult( + uid = "teiUid", + overDueDate = null, + ) val sorting = SortingItem.create(Filters.ENROLLMENT_DATE) - val tei = TrackedEntitySearchItemHelper.toTrackedEntityInstance(searchItem) - - val overdueDate = dateUtils.getCalendarByDate(Date()) - overdueDate.add(Calendar.DATE, 2) - val enrollmentsInProgram = - listOf( - createEnrollment("enrollmentUid", "orgUnit", program.uid()), - createEnrollment("enrollmentUid_2", "orgUnit", program.uid()), - ) - val allEnrollments = - listOf( - createEnrollment("enrollmentUid_3", "orgUnit", "uid"), - createEnrollment("enrollmentUid_4", "orgUnit_2", "uid"), - ) - val events = - listOf( - createEvent("eventUid", EventStatus.SCHEDULE, overdueDate.time), - ) - - mockedSdkCalls(searchItem, tei, enrollmentsInProgram, allEnrollments, events) - - val result = searchRepositoryJava.transform(searchItem, program, true, sorting) + val result = searchRepository.mapTrackedEntitySearchItemResultToSearchTeiModel( + searchItemResult, + sorting, + ) - assertFalse(result.isHasOverdue) + // When there are no overdue events, overDueDate should be null + assertNull(result.tei.overDueDate) } private fun mockedSdkCalls( @@ -346,7 +301,8 @@ class SearchRepositoryTest { enrollmentCollectionRepository.blockingGet(), ) doReturn enrollmentsForInfoToReturn - val programUid = if (enrollmentsForInfoToReturn.isNotEmpty()) enrollmentsForInfoToReturn[0].program() else "programUid" + val programUid = + if (enrollmentsForInfoToReturn.isNotEmpty()) enrollmentsForInfoToReturn[0].program() else "programUid" whenever(d2.programModule().programs()) doReturn programCollectionRepository whenever( programCollectionRepository.uid(any()), @@ -358,6 +314,8 @@ class SearchRepositoryTest { .builder() .uid(programUid) .displayFrontPageList(true) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() // Mock setOverdueEvents @@ -392,13 +350,23 @@ class SearchRepositoryTest { whenever( eventCollectionRepository.blockingGet(), ) doReturn eventsToReturn.filter { it.status() == EventStatus.OVERDUE } - whenever(eventStatusFilterConnector.eq(EventStatus.SCHEDULE)).thenReturn(eventCollectionRepository) - whenever(eventCollectionRepository.byStatus().eq(EventStatus.SCHEDULE)).thenReturn(eventCollectionRepository) - whenever(eventCollectionRepository.byProgramUid().eq(any())).thenReturn(eventCollectionRepository) - whenever(eventCollectionRepository.orderByDueDate(RepositoryScope.OrderByDirection.DESC)).thenReturn(eventCollectionRepository) + whenever(eventStatusFilterConnector.eq(EventStatus.SCHEDULE)).thenReturn( + eventCollectionRepository, + ) + whenever(eventCollectionRepository.byStatus().eq(EventStatus.SCHEDULE)).thenReturn( + eventCollectionRepository, + ) + whenever(eventCollectionRepository.byProgramUid().eq(any())).thenReturn( + eventCollectionRepository, + ) + whenever(eventCollectionRepository.orderByDueDate(RepositoryScope.OrderByDirection.DESC)).thenReturn( + eventCollectionRepository, + ) whenever(eventCollectionRepository.blockingGet()).thenReturn(eventsToReturn.filter { it.status() == EventStatus.SCHEDULE }) // mock orgUnitName(orgUnitUid) - whenever(d2.organisationUnitModule().organisationUnits()) doReturn orgUnitCollectionRepository + whenever( + d2.organisationUnitModule().organisationUnits(), + ) doReturn orgUnitCollectionRepository whenever( orgUnitCollectionRepository.uid(any()), ) doReturn readOnlyOneObjectRepository @@ -454,6 +422,7 @@ class SearchRepositoryTest { .organisationUnit(orgUnitUid) .program(programUid) .status(status) + .attributeOptionCombo("attributeOptionComboUid") .build() private fun createEvent( @@ -481,6 +450,41 @@ class SearchRepositoryTest { } } + private fun createTrackedEntitySearchItemResult( + uid: String, + overDueDate: Instant?, + ): TrackedEntitySearchItemResult { + return TrackedEntitySearchItemResult( + uid = uid, + created = null, + lastUpdated = null, + createdAtClient = null, + lastUpdatedAtClient = null, + ownerOrgUnit = null, + enrollmentOrgUnit = null, + shouldDisplayOrgUnit = false, + geometry = null, + syncState = SyncState.SYNCED, + aggregatedSyncState = SyncState.SYNCED, + deleted = false, + isOnline = false, + teTypeName = "Person", + type = TrackedEntityTypeDomain( + trackedEntityTypeAttributeDomains = emptyList(), + featureType = GeometryFeatureType.NONE, + ), + header = "Test Header", + overDueDate = overDueDate, + selectedEnrollment = null, + profilePicture = null, + enrolledPrograms = null, + enrollments = null, + relationships = null, + defaultTypeIcon = null, + attributeValues = emptyList(), + ) + } + private fun createMockData(): List<FieldUiModel> = listOf( FieldUiModelImpl( diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt index 22448d54908..732971e4884 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEIViewModelTest.kt @@ -1,23 +1,17 @@ package org.dhis2.usescases.searchTrackEntity -import android.app.Activity.RESULT_OK -import android.content.Intent import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.List import androidx.compose.material.icons.automirrored.outlined.List import androidx.compose.material.icons.filled.Map import androidx.compose.material.icons.outlined.Map -import androidx.lifecycle.MutableLiveData import androidx.paging.PagingData import androidx.paging.testing.asSnapshot import app.cash.turbine.test import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.async -import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.flow.drop import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.take import kotlinx.coroutines.test.StandardTestDispatcher @@ -29,10 +23,7 @@ import org.dhis2.commons.filters.FilterManager import org.dhis2.commons.network.NetworkUtils import org.dhis2.commons.resources.ResourceManager import org.dhis2.commons.viewmodel.DispatcherProvider -import org.dhis2.data.search.SearchParametersModel -import org.dhis2.form.model.FieldUiModel -import org.dhis2.form.model.FieldUiModelImpl -import org.dhis2.form.ui.intent.FormIntent +import org.dhis2.form.ui.customintent.CustomIntentResult import org.dhis2.form.ui.provider.DisplayNameProvider import org.dhis2.maps.geometry.mapper.EventsByProgramStage import org.dhis2.maps.usecases.MapStyleConfiguration @@ -40,18 +31,21 @@ import org.dhis2.mobile.commons.model.CustomIntentModel import org.dhis2.simprints.SimprintsLoadBiometricSearchResultsUseCase import org.dhis2.simprints.SimprintsMapBiometricSearchResultUseCase import org.dhis2.simprints.SimprintsSearchViewModel +import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.input.ui.action.TrackerInputAction +import org.dhis2.tracker.input.ui.state.TrackerInputUiState +import org.dhis2.tracker.search.domain.FetchOptionSetOptions +import org.dhis2.tracker.search.domain.FetchSearchParameters +import org.dhis2.tracker.search.domain.SearchTrackedEntities +import org.dhis2.tracker.search.model.SearchTrackedEntitiesInput import org.dhis2.usescases.searchTrackEntity.listView.SearchResult.SearchResultType import org.dhis2.utils.customviews.navigationbar.NavigationPage -import org.hisp.dhis.android.core.common.ValueType +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.program.Program -import org.hisp.dhis.android.core.trackedentity.TrackedEntityInstance import org.hisp.dhis.android.core.trackedentity.TrackedEntityType -import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItem +import org.hisp.dhis.mobile.ui.designsystem.component.Orientation import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarItem import org.junit.After -import org.junit.Assert.assertEquals -import org.junit.Assert.assertFalse -import org.junit.Assert.assertNull import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Rule @@ -59,13 +53,10 @@ import org.junit.Test import org.maplibre.geojson.BoundingBox import org.mockito.kotlin.any import org.mockito.kotlin.anyOrNull -import org.mockito.kotlin.clearInvocations -import org.mockito.kotlin.doAnswer import org.mockito.kotlin.doReturn import org.mockito.kotlin.eq import org.mockito.kotlin.mock import org.mockito.kotlin.never -import org.mockito.kotlin.times import org.mockito.kotlin.verify import org.mockito.kotlin.whenever @@ -78,10 +69,7 @@ class SearchTEIViewModelTest { private val initialProgram = "programUid" private val initialQuery = mutableMapOf<String, List<String>?>() private val repository: SearchRepository = mock() - private val repositoryKt: SearchRepositoryKt = - mock { - on { searchTrackedEntities(any(), any()) } doReturn flowOf(PagingData.empty()) - } + private val repositoryKt: SearchRepositoryKt = mock() private val pageConfigurator: SearchPageConfigurator = mock() private val mapDataRepository: MapDataRepository = mock() private val networkUtils: NetworkUtils = mock() @@ -89,12 +77,16 @@ class SearchTEIViewModelTest { private val resourceManager: ResourceManager = mock() private val displayNameProvider: DisplayNameProvider = mock() private val filterManager: FilterManager = mock() + private val searchTrackedEntities: SearchTrackedEntities = + mock { + onBlocking { invoke(any()) } doReturn Result.success(flowOf(PagingData.empty())) + } + + private val fetchSearchParameters: FetchSearchParameters = mock() + private val fetchOptionSetOptions: FetchOptionSetOptions = mock() private val simprintsSearchViewModel: SimprintsSearchViewModel = mock() private val loadSimprintsBiometricSearchResultsUseCase: SimprintsLoadBiometricSearchResultsUseCase = mock() private val mapSimprintsBiometricSearchResult: SimprintsMapBiometricSearchResultUseCase = mock() - private val simprintsBiometricSearchNavigation = MutableSharedFlow<Unit>(extraBufferCapacity = 1) - private val simprintsBiometricSearch = MutableLiveData(false) - private val simprintsUseLastBiometricsLabel = MutableLiveData(false) @ExperimentalCoroutinesApi private val testingDispatcher = StandardTestDispatcher() @@ -109,12 +101,8 @@ class SearchTEIViewModelTest { whenever(repository.isSearchEnabled()) doReturn true whenever(repository.getTrackedEntityType()) doReturn testingTrackedEntityType() whenever(repository.filtersApplyOnGlobalSearch()) doReturn true - whenever(filterManager.stateFilters) doReturn emptyList() - whenever(simprintsSearchViewModel.simprintsBiometricSearchNavigation) doReturn - simprintsBiometricSearchNavigation - whenever(simprintsSearchViewModel.isSimprintsBiometricSearch) doReturn simprintsBiometricSearch - whenever(simprintsSearchViewModel.isSimprintsUseLastBiometricsLabel) doReturn - simprintsUseLastBiometricsLabel + whenever(repositoryKt.getExcludeValues()) doReturn HashSet<String>() + whenever(repositoryKt.saveSearchValuesAndGetAllowCache(any(), any())) doReturn true viewModel = SearchTEIViewModel( initialProgram, @@ -135,6 +123,9 @@ class SearchTEIViewModelTest { resourceManager = resourceManager, displayNameProvider = displayNameProvider, filterManager = filterManager, + searchTrackedEntities = searchTrackedEntities, + fetchSearchParameters = fetchSearchParameters, + fetchOptionSetOptions = fetchOptionSetOptions, simprintsSearchViewModel = simprintsSearchViewModel, loadSimprintsBiometricSearchResultsUseCase = loadSimprintsBiometricSearchResultsUseCase, mapSimprintsBiometricSearchResult = mapSimprintsBiometricSearchResult, @@ -177,6 +168,16 @@ class SearchTEIViewModelTest { assertTrue((screenState as SearchList).searchForm.isOpened) } + @Test + fun `Should keep search form open after Simprints biometric search dropout`() { + viewModel.onSimprintsBiometricSearchDropout() + viewModel.setListScreen() + + val screenState = viewModel.screenState.value + assertTrue(screenState is SearchList) + assertTrue((screenState as SearchList).searchForm.isOpened) + } + @Test fun `Should set Map screen`() { viewModel.setMapScreen() @@ -210,160 +211,6 @@ class SearchTEIViewModelTest { assertTrue(screenState is SearchList) } - @Test - fun `Should not open search screen when search is disabled`() { - whenever(repository.isSearchEnabled()) doReturn false - viewModel = - SearchTEIViewModel( - initialProgram, - initialQuery, - repository, - repositoryKt, - pageConfigurator, - mapDataRepository, - networkUtils, - object : DispatcherProvider { - override fun io(): CoroutineDispatcher = testingDispatcher - - override fun computation(): CoroutineDispatcher = testingDispatcher - - override fun ui(): CoroutineDispatcher = testingDispatcher - }, - mapStyleConfiguration, - resourceManager = resourceManager, - displayNameProvider = displayNameProvider, - filterManager = filterManager, - simprintsSearchViewModel = simprintsSearchViewModel, - loadSimprintsBiometricSearchResultsUseCase = loadSimprintsBiometricSearchResultsUseCase, - mapSimprintsBiometricSearchResult = mapSimprintsBiometricSearchResult, - ) - testingDispatcher.scheduler.advanceUntilIdle() - - viewModel.setListScreen() - viewModel.setSearchScreen() - viewModel.onSearchFormRequested() - - val screenState = viewModel.screenState.value - assertFalse(viewModel.isSearchEnabled.value!!) - assertTrue(screenState is SearchList) - val searchForm = (screenState as SearchList).searchForm - assertFalse(searchForm.isEnabled) - assertFalse(searchForm.isOpened) - } - - @Test - fun `Should request Simprints biometric identification launch instead of opening search form`() = - runTest { - viewModel.setListScreen() - viewModel.searchParametersUiState = - viewModel.searchParametersUiState.copy( - items = listOf(simprintsBiometricSearchField()), - ) - - viewModel.simprintsBiometricIdentificationLaunch.test { - viewModel.onSearchFormRequested() - testingDispatcher.scheduler.advanceUntilIdle() - - awaitItem() - val screenState = viewModel.screenState.value - assertTrue(screenState is SearchList) - assertFalse((screenState as SearchList).searchForm.isOpened) - verify(simprintsSearchViewModel).clearPendingSession() - cancelAndIgnoreRemainingEvents() - } - } - - @Test - fun `Should not replay Simprints biometric identification launch when no collector is listening`() = - runTest { - viewModel.setListScreen() - viewModel.searchParametersUiState = - viewModel.searchParametersUiState.copy( - items = listOf(simprintsBiometricSearchField()), - ) - - viewModel.onSearchFormRequested() - testingDispatcher.scheduler.advanceUntilIdle() - - viewModel.simprintsBiometricIdentificationLaunch.test { - expectNoEvents() - cancelAndIgnoreRemainingEvents() - } - } - - @Test - fun `Should open search form when program does not have Simprints biometric search`() { - viewModel.searchParametersUiState = - viewModel.searchParametersUiState.copy( - items = - listOf( - FieldUiModelImpl( - uid = "name", - label = "Name", - autocompleteList = emptyList(), - optionSetConfiguration = null, - valueType = ValueType.TEXT, - ), - ), - ) - - viewModel.onSearchFormRequested() - testingDispatcher.scheduler.advanceUntilIdle() - - val screenState = viewModel.screenState.value - assertTrue(screenState is SearchList) - assertTrue((screenState as SearchList).searchForm.isOpened) - } - - @Test - fun `Should navigate to empty result list after Simprints biometric no matches`() = - runTest { - setCurrentProgram(testingProgram(displayFrontPageList = false, minAttributesToSearch = 2)) - setAllowCreateBeforeSearch(false) - whenever(resourceManager.getString(R.string.simprints_biometric_search)) doReturn "Biometric search" - viewModel.searchParametersUiState = - viewModel.searchParametersUiState.copy( - items = listOf(simprintsBiometricSearchField()), - ) - - val snapshot = - async { - viewModel.searchPagingData - .drop(1) - .take(1) - .asSnapshot() - } - viewModel.onSimprintsBiometricNoMatches("biometric") - testingDispatcher.scheduler.advanceUntilIdle() - - val screenState = viewModel.screenState.value as SearchList - assertEquals(SearchScreenState.LIST, screenState.screenState) - assertFalse(screenState.searchForm.isOpened) - assertFalse(screenState.searchForm.isForced) - assertEquals(mapOf("biometric" to "Biometric search"), viewModel.searchParametersUiState.searchedItems) - assertTrue(snapshot.await().isEmpty()) - verify(repository).clearFetchedList() - } - - @Test - fun `Should show no results state after Simprints biometric no matches`() { - whenever(resourceManager.getString(R.string.simprints_biometric_search)) doReturn "Biometric search" - viewModel.searchParametersUiState = - viewModel.searchParametersUiState.copy( - items = listOf(simprintsBiometricSearchField()), - ) - - viewModel.onSimprintsBiometricNoMatches("biometric") - testingDispatcher.scheduler.advanceUntilIdle() - viewModel.onDataLoaded(0, null) - - viewModel.dataResult.value?.apply { - assertTrue(isNotEmpty()) - assertTrue(size == 1) - assertEquals(SearchResultType.NO_RESULTS, first().type) - } - } - @Test fun `Should set previous screen`() { viewModel.setListScreen() @@ -383,74 +230,61 @@ class SearchTEIViewModelTest { @Test fun `Should update query data`() { - viewModel.onParameterIntent( - FormIntent.OnSave( - uid = "testingUid", - value = "testingValue", - valueType = ValueType.TEXT, - ), + viewModel.onValueChange( + fieldUid = "testingUid", + value = "testingValue", ) - val queryData = viewModel.queryData + val queryData = viewModel.queryDataList assertTrue(queryData.isNotEmpty()) - assertTrue(queryData["testingUid"]?.size == 1) - val values = queryData["testingUid"] - assertTrue(values?.contains("testingValue") == true) + assertTrue(queryData.size == 1) + val data = queryData.first { it.attributeId == "testingUid" } + assertTrue(data.values?.get(0) == "testingValue") } @Test fun `Should update query data when list of values is passed`() { - viewModel.onParameterIntent( - FormIntent.OnSave( - uid = "testingUid", - value = "testingValue,testingValue2", - valueType = ValueType.TEXT, - ), + viewModel.onValueChange( + fieldUid = "testingUid", + value = "testingValue,testingValue2", ) - val queryData = viewModel.queryData + val queryData = viewModel.queryDataList assertTrue(queryData.isNotEmpty()) - assertTrue(queryData.containsKey("testingUid")) - val values = queryData["testingUid"] - assertTrue(values?.size == 2) - assertTrue(values?.contains("testingValue") == true) - assertTrue(values?.contains("testingValue2") == true) + assertTrue(queryData.any { it.attributeId == "testingUid" }) + val data = queryData.first { it.attributeId == "testingUid" } + assertTrue(data.values?.size == 2) + assertTrue(data.values?.contains("testingValue") == true) + assertTrue(data.values?.contains("testingValue2") == true) } @Test fun `Should update query data when various list of values are passed`() { - viewModel.onParameterIntent( - FormIntent.OnSave( - uid = "testingUid", - value = "testingValue,testingValue2", - valueType = ValueType.TEXT, - ), + viewModel.onValueChange( + fieldUid = "testingUid", + value = "testingValue,testingValue2", ) - - viewModel.onParameterIntent( - FormIntent.OnSave( - uid = "testingUid2", - value = "testingValue,testingValue2", - valueType = ValueType.TEXT, - ), + viewModel.onValueChange( + fieldUid = "testingUid2", + value = "testingValue,testingValue2", ) - val queryData = viewModel.queryData + val queryData = viewModel.queryDataList assertTrue(queryData.isNotEmpty()) - assertTrue(queryData.containsKey("testingUid")) - val values1 = queryData["testingUid"] - assertTrue(values1?.size == 2) - assertTrue(values1?.contains("testingValue") == true) - assertTrue(values1?.contains("testingValue2") == true) - - assertTrue(queryData.containsKey("testingUid")) - val values2 = queryData["testingUid2"] - assertTrue(values2?.size == 2) - assertTrue(values2?.contains("testingValue") == true) - assertTrue(values2?.contains("testingValue2") == true) + assertTrue(queryData.any { it.attributeId == "testingUid" }) + val data1 = queryData.first { it.attributeId == "testingUid" } + assertTrue(data1.values?.size == 2) + assertTrue(data1.values?.contains("testingValue") == true) + assertTrue(data1.values?.contains("testingValue2") == true) + + assertTrue(queryData.any { it.attributeId == "testingUid2" }) + val data2 = queryData.first { it.attributeId == "testingUid2" } + assertTrue(data2.values?.size == 2) + assertTrue(data2.values?.contains("testingValue") == true) + assertTrue(data2.values?.contains("testingValue2") == true) } @ExperimentalCoroutinesApi @@ -462,12 +296,17 @@ class SearchTEIViewModelTest { viewModel.searchPagingData.take(1).asSnapshot() - verify(repositoryKt).searchTrackedEntities( - SearchParametersModel( - selectedProgram = testingProgram, - queryData = mutableMapOf(), + verify(searchTrackedEntities).invoke( + eq( + SearchTrackedEntitiesInput( + selectedProgram = testingProgram.uid(), + queryDataList = mutableListOf(), + allowCache = true, + excludeValues = emptySet(), + hasStateFilters = false, + isOnline = false, + ), ), - false, ) } @@ -478,21 +317,7 @@ class SearchTEIViewModelTest { setCurrentProgram(testingProgram) viewModel.searchPagingData.test { awaitItem() - verify(repositoryKt, times(0)).searchTrackedEntities( - SearchParametersModel( - selectedProgram = testingProgram, - queryData = mutableMapOf(), - ), - true, - ) - - verify(repositoryKt, times(0)).searchTrackedEntities( - SearchParametersModel( - selectedProgram = testingProgram, - queryData = mutableMapOf(), - ), - false, - ) + verify(searchTrackedEntities, never()).invoke(any()) } } @@ -503,184 +328,6 @@ class SearchTEIViewModelTest { assertTrue(result.isEmpty()) } - @Test - fun `Should return ordered Simprints biometric search results when available`() = - runTest { - val testingProgram = testingProgram(displayFrontPageList = false) - setCurrentProgram(testingProgram) - setAllowCreateBeforeSearch(false) - whenever(networkUtils.isOnline()) doReturn true - val firstModel = searchTeiModel("first") - val secondModel = searchTeiModel("second") - whenever( - loadSimprintsBiometricSearchResultsUseCase( - any(), - any(), - any(), - any(), - anyOrNull(), - ), - ) doReturn flowOf(PagingData.from(listOf(secondModel, firstModel))) - viewModel.searchParametersUiState = - viewModel.searchParametersUiState.copy( - items = listOf(simprintsBiometricSearchField()), - ) - viewModel.onParameterIntent( - FormIntent.OnSave( - uid = "biometric", - value = "guid-1,guid-2", - valueType = ValueType.TEXT, - ), - ) - viewModel.setListScreen() - viewModel.setSearchScreen() - testingDispatcher.scheduler.advanceUntilIdle() - - val result = - async { - viewModel.searchPagingData - .drop(1) - .take(1) - .asSnapshot() - } - viewModel.onSearch() - testingDispatcher.scheduler.advanceUntilIdle() - - assertEquals(listOf(secondModel, firstModel), result.await()) - verify(repositoryKt, times(0)).searchTrackedEntities(any(), any()) - } - - @Test - fun `Should fall back to regular search when Simprints ordering is not available`() = - runTest { - val testingProgram = testingProgram(displayFrontPageList = false) - setCurrentProgram(testingProgram) - setAllowCreateBeforeSearch(false) - whenever(networkUtils.isOnline()) doReturn true - val searchItem = trackedEntitySearchItem("tei-1") - val searchModel = searchTeiModel("regular") - whenever( - loadSimprintsBiometricSearchResultsUseCase( - any(), - any(), - any(), - any(), - anyOrNull(), - ), - ) doReturn null - whenever(repositoryKt.searchTrackedEntities(any(), any())) doReturn - flowOf(PagingData.from(listOf(searchItem))) - whenever(repository.transform(searchItem, testingProgram, false, null)) doReturn searchModel - viewModel.searchParametersUiState = - viewModel.searchParametersUiState.copy( - items = listOf(simprintsBiometricSearchField()), - ) - viewModel.onParameterIntent( - FormIntent.OnSave( - uid = "biometric", - value = "guid-1,guid-2", - valueType = ValueType.TEXT, - ), - ) - viewModel.setListScreen() - viewModel.setSearchScreen() - testingDispatcher.scheduler.advanceUntilIdle() - - val result = - async { - viewModel.searchPagingData - .drop(1) - .take(1) - .asSnapshot() - } - viewModel.onSearch() - testingDispatcher.scheduler.advanceUntilIdle() - - assertEquals(listOf(searchModel), result.await()) - verify(repositoryKt).searchTrackedEntities(any(), any()) - } - - @Test - fun `Should return Simprints possible duplicates search results when query contains multiple GUIDs`() = - runTest { - val testingProgram = testingProgram(displayFrontPageList = false) - setCurrentProgram(testingProgram) - setAllowCreateBeforeSearch(false) - whenever(networkUtils.isOnline()) doReturn true - viewModel.setSimprintsPossibleDuplicatesSearch(true) - - viewModel.queryData["biometric"] = listOf("guid-1", "guid-2") - - val searchItem1 = trackedEntitySearchItem("tei-1") - val searchItem2 = trackedEntitySearchItem("tei-2") - whenever(repositoryKt.searchTrackedEntitiesImmediate(any(), any())).thenAnswer { - val params = it.arguments[0] as SearchParametersModel - when (params.queryData?.get("biometric")?.firstOrNull()) { - "guid-1" -> listOf(searchItem1) - "guid-2" -> listOf(searchItem2) - else -> emptyList() - } - } - - val model1 = searchTeiModel("model-1", teiUid = "tei-1") - val model2 = searchTeiModel("model-2", teiUid = "tei-2") - whenever(repository.transform(searchItem1, testingProgram, false, null)) doReturn model1 - whenever(repository.transform(searchItem2, testingProgram, false, null)) doReturn model2 - - viewModel.setListScreen() - viewModel.setSearchScreen() - testingDispatcher.scheduler.advanceUntilIdle() - - val result = - async { - viewModel.searchPagingData - .drop(1) - .take(1) - .asSnapshot() - } - viewModel.onSearch() - testingDispatcher.scheduler.advanceUntilIdle() - - assertEquals(listOf(model1, model2), result.await()) - verify(repositoryKt, times(2)).searchTrackedEntitiesImmediate(any(), any()) - verify(repositoryKt, times(0)).searchTrackedEntities(any(), any()) - } - - @Test - fun `Should auto finish Simprints possible duplicates search when there are no DHIS2 matches`() = - runTest { - val testingProgram = testingProgram(displayFrontPageList = false, minAttributesToSearch = 2) - setCurrentProgram(testingProgram) - setAllowCreateBeforeSearch(false) - whenever(networkUtils.isOnline()) doReturn true - viewModel.setSimprintsPossibleDuplicatesSearch(true) - - viewModel.queryData["biometric"] = listOf("guid-1", "guid-2") - whenever(repositoryKt.searchTrackedEntitiesImmediate(any(), any())) doReturn emptyList() - - viewModel.setListScreen() - viewModel.setSearchScreen() - testingDispatcher.scheduler.advanceUntilIdle() - - viewModel.simprintsNavigation.test { - val snapshot = - async { - viewModel.searchPagingData - .drop(1) - .take(1) - .asSnapshot() - } - viewModel.onSearch() - testingDispatcher.scheduler.advanceUntilIdle() - - assertTrue(awaitItem() is SimprintsNavigationAction.AutoEnrollLastBiometricsFromSimprintsPossibleDuplicates) - snapshot.await() - cancelAndIgnoreRemainingEvents() - } - verify(simprintsSearchViewModel, never()).markPendingEnrollmentFromSimprintsPossibleDuplicates() - verify(repositoryKt, times(0)).searchTrackedEntities(any(), any()) - } - @ExperimentalCoroutinesApi @Test fun `Should fetch map results`() { @@ -700,7 +347,7 @@ class SearchTEIViewModelTest { whenever( mapDataRepository.getTrackerMapData( testingProgram(), - viewModel.queryData, + viewModel.queryDataAsMap(), ), ) doReturn trackerMapData @@ -717,6 +364,7 @@ class SearchTEIViewModelTest { fun `Should use callback to perform min attributes warning`() = runTest { setCurrentProgram(testingProgram(displayFrontPageList = false)) + setAllowCreateBeforeSearch(false) viewModel.onSearch() viewModel.searchParametersUiState.shouldShowMinAttributeWarning.test { assertTrue(awaitItem()) @@ -728,13 +376,11 @@ class SearchTEIViewModelTest { setCurrentProgram(testingProgram()) viewModel.setListScreen() viewModel.setSearchScreen() - viewModel.onParameterIntent( - FormIntent.OnSave( - uid = "testingUid", - value = "testingValue", - valueType = ValueType.TEXT, - ), + viewModel.onValueChange( + fieldUid = "testingUid", + value = "testingValue", ) + viewModel.onSearch() assertTrue(viewModel.refreshData.value != null) @@ -746,7 +392,7 @@ class SearchTEIViewModelTest { whenever( mapDataRepository.getTrackerMapData( testingProgram(), - viewModel.queryData, + viewModel.queryDataAsMap(), ), ) doReturn TrackerMapData( @@ -764,13 +410,11 @@ class SearchTEIViewModelTest { setCurrentProgram(testingProgram()) viewModel.setMapScreen() viewModel.setSearchScreen() - viewModel.onParameterIntent( - FormIntent.OnSave( - uid = "testingUid", - value = "testingValue", - valueType = ValueType.TEXT, - ), + viewModel.onValueChange( + fieldUid = "testingUid", + value = "testingValue", ) + viewModel.onSearch() testingDispatcher.scheduler.advanceUntilIdle() @@ -778,426 +422,14 @@ class SearchTEIViewModelTest { assertTrue(viewModel.refreshData.value != null) verify(mapDataRepository).getTrackerMapData( testingProgram(), - viewModel.queryData, + viewModel.queryDataAsMap(), ) } @Test fun `Should filter query data for new program`() { viewModel.queryDataByProgram("programUid") - verify(repository).filterQueryForProgram(viewModel.queryData, "programUid") - } - - @Test - fun `Should emit launch Simprints confirm identity navigation when opening dashboard requires callout`() = - runTest { - val intent: Intent = mock() - whenever( - simprintsSearchViewModel.onDashboardRequested(any(), any(), any(), any(), any()), - ) doReturn SimprintsSearchViewModel.DashboardAction.LaunchConfirmIdentity(intent) - - viewModel.simprintsNavigation.test { - viewModel.onOpenDashboardRequested("teiUid", "programUid", "enrollmentUid") - testingDispatcher.scheduler.advanceUntilIdle() - - val action = awaitItem() - assertTrue(action is SimprintsNavigationAction.LaunchConfirmIdentity) - assertEquals(intent, (action as SimprintsNavigationAction.LaunchConfirmIdentity).intent) - cancelAndIgnoreRemainingEvents() - } - } - - @Test - fun `Should emit open dashboard navigation when Simprints dashboard request resolves directly`() = - runTest { - whenever( - simprintsSearchViewModel.onDashboardRequested(any(), any(), any(), any(), any()), - ) doReturn - SimprintsSearchViewModel.DashboardAction.OpenDashboard( - SimprintsSearchViewModel.PendingDashboardNavigation( - teiUid = "teiUid", - programUid = "programUid", - enrollmentUid = "enrollmentUid", - ), - ) - - viewModel.simprintsNavigation.test { - viewModel.onOpenDashboardRequested("teiUid", "programUid", "enrollmentUid") - testingDispatcher.scheduler.advanceUntilIdle() - - val action = awaitItem() - assertTrue(action is SimprintsNavigationAction.OpenDashboard) - action as SimprintsNavigationAction.OpenDashboard - assertEquals("teiUid", action.teiUid) - assertEquals("programUid", action.programUid) - assertEquals("enrollmentUid", action.enrollmentUid) - cancelAndIgnoreRemainingEvents() - } - } - - @Test - fun `Should emit open dashboard navigation after Simprints confirm identity succeeds`() = - runTest { - whenever(simprintsSearchViewModel.onConfirmIdentityResult(RESULT_OK)) doReturn - SimprintsSearchViewModel.PendingDashboardNavigation( - teiUid = "teiUid", - programUid = "programUid", - enrollmentUid = "enrollmentUid", - ) - - viewModel.simprintsNavigation.test { - viewModel.onConfirmIdentityResult(RESULT_OK) - testingDispatcher.scheduler.advanceUntilIdle() - - val action = awaitItem() - assertTrue(action is SimprintsNavigationAction.OpenDashboard) - action as SimprintsNavigationAction.OpenDashboard - assertEquals("teiUid", action.teiUid) - assertEquals("programUid", action.programUid) - assertEquals("enrollmentUid", action.enrollmentUid) - cancelAndIgnoreRemainingEvents() - } - } - - @Test - fun `Should emit error message when Simprints confirm identity setup fails`() = - runTest { - whenever( - simprintsSearchViewModel.onDashboardRequested(any(), any(), any(), any(), any()), - ).thenThrow(RuntimeException()) - whenever(resourceManager.getString(R.string.custom_intent_error)) doReturn "Custom intent error" - - viewModel.simprintsNavigation.test { - viewModel.onOpenDashboardRequested("teiUid", "programUid", "enrollmentUid") - testingDispatcher.scheduler.advanceUntilIdle() - - val action = awaitItem() - assertTrue(action is SimprintsNavigationAction.ShowMessage) - assertEquals("Custom intent error", (action as SimprintsNavigationAction.ShowMessage).message) - cancelAndIgnoreRemainingEvents() - } - } - - @Test - fun `Should refresh Simprints last biometrics label state`() { - simprintsUseLastBiometricsLabel.value = true - clearInvocations(simprintsSearchViewModel) - - viewModel.refreshSimprintsUiState() - - assertTrue(viewModel.isSimprintsUseLastBiometricsLabel.value == true) - verify(simprintsSearchViewModel).refreshSimprintsUiState(any()) - } - - @Test - fun `Should delegate enrollment query preparation to SimprintsSearchViewModel`() { - val queryData = mapOf("name" to listOf("Name")) - whenever(simprintsSearchViewModel.prepareEnrollmentQueryData(any(), eq(queryData))) doReturn - hashMapOf("name" to listOf("Name")) - - val result = viewModel.prepareEnrollmentQueryData(queryData) - - assertEquals(hashMapOf("name" to listOf("Name")), result) - verify(simprintsSearchViewModel).prepareEnrollmentQueryData(any(), eq(queryData)) - } - - @Test - fun `Should delegate Simprints biometric identification result`() { - viewModel.onSimprintsBiometricIdentificationResult( - uid = "biometric", - value = "guid-1", - hasAutoOpenEligibleSimprintsIdentification = true, - ) - - verify(simprintsSearchViewModel).onSimprintsBiometricIdentificationResult( - uid = "biometric", - value = "guid-1", - hasAutoOpenEligibleSimprintsIdentification = true, - ) - } - - @Test - fun `Should delegate Simprints confirm identity launch failures`() { - viewModel.onConfirmIdentityLaunchFailed() - - verify(simprintsSearchViewModel).onConfirmIdentityLaunchFailed() - } - - @Test - fun `Should rehydrate initial query and enable search when search parameters are fetched`() = - runTest { - whenever(repositoryKt.searchParameters(initialProgram, "teiTypeUid")) doReturn - listOf(simprintsBiometricSearchField()) - val viewModel = - SearchTEIViewModel( - initialProgramUid = initialProgram, - initialQuery = mutableMapOf("biometric" to listOf("guid-1")), - searchRepository = repository, - searchRepositoryKt = repositoryKt, - searchNavPageConfigurator = pageConfigurator, - mapDataRepository = mapDataRepository, - networkUtils = networkUtils, - dispatchers = - object : DispatcherProvider { - override fun io(): CoroutineDispatcher = testingDispatcher - - override fun computation(): CoroutineDispatcher = testingDispatcher - - override fun ui(): CoroutineDispatcher = testingDispatcher - }, - mapStyleConfig = mapStyleConfiguration, - resourceManager = resourceManager, - displayNameProvider = displayNameProvider, - filterManager = filterManager, - simprintsSearchViewModel = simprintsSearchViewModel, - loadSimprintsBiometricSearchResultsUseCase = loadSimprintsBiometricSearchResultsUseCase, - mapSimprintsBiometricSearchResult = mapSimprintsBiometricSearchResult, - ) - - viewModel.fetchSearchParameters(initialProgram, "teiTypeUid") - testingDispatcher.scheduler.advanceUntilIdle() - - val fieldUiModel = viewModel.searchParametersUiState.items.single() - - assertEquals("guid-1", fieldUiModel.value) - assertTrue(viewModel.searchParametersUiState.clearSearchEnabled) - assertTrue(viewModel.searchParametersUiState.searchEnabled) - assertTrue(viewModel.searchParametersUiState.searchedItems.isNotEmpty()) - assertTrue(viewModel.screenState.value is SearchList) - } - - @Test - fun `Should preserve entered search parameter values when parameters are refetched`() = - runTest { - whenever(repositoryKt.searchParameters(initialProgram, "teiTypeUid")) doReturn - listOf(simprintsBiometricSearchField()) - viewModel.searchParametersUiState = - viewModel.searchParametersUiState.copy( - items = - listOf( - simprintsBiometricSearchField().copy( - value = "guid-1", - displayName = "guid-1", - ), - ), - ) - - viewModel.fetchSearchParameters(initialProgram, "teiTypeUid") - testingDispatcher.scheduler.advanceUntilIdle() - - val fieldUiModel = viewModel.searchParametersUiState.items.single() - - assertEquals("guid-1", fieldUiModel.value) - assertEquals("guid-1", fieldUiModel.displayName) - } - - @Test - fun `Should forward Simprints biometric search navigation flow`() = - runTest { - viewModel.simprintsBiometricSearchNavigation.test { - simprintsBiometricSearchNavigation.emit(Unit) - - awaitItem() - cancelAndIgnoreRemainingEvents() - } - } - - @Test - fun `Should switch to list screen and clear fetched results for Simprints biometric search navigation`() { - viewModel.onNavigationPageChanged(NavigationPage.MAP_VIEW) - viewModel.setMapScreen() - viewModel.queryData["testingUid"] = listOf("testingValue") - clearInvocations(repository) - - viewModel.onSimprintsBiometricSearchNavigation() - testingDispatcher.scheduler.advanceUntilIdle() - - assertEquals(NavigationPage.LIST_VIEW, viewModel.navigationBarUIState.value.selectedItem) - assertTrue(viewModel.screenState.value?.screenState == SearchScreenState.LIST) - verify(repository).clearFetchedList() - } - - @Test - fun `Should open dashboard when Simprints save resolves direct navigation`() = - runTest { - whenever( - simprintsSearchViewModel.onSimprintsParameterSaved( - any(), - anyOrNull(), - any(), - any(), - any(), - ), - ) doReturn - SimprintsSearchViewModel.PendingDashboardNavigation( - teiUid = "teiUid", - programUid = "matchedProgramUid", - enrollmentUid = "enrollmentUid", - isOnline = true, - ) - viewModel.onNavigationPageChanged(NavigationPage.MAP_VIEW) - viewModel.setMapScreen() - viewModel.queryData["existingQuery"] = listOf("value") - - viewModel.searchParametersUiState = - viewModel.searchParametersUiState.copy( - items = - listOf( - simprintsBiometricSearchField().copy( - value = "guid-1", - displayName = "guid-1", - ), - ), - ) - - viewModel.onParameterIntent( - FormIntent.OnSave( - uid = "biometric", - value = "guid-1", - valueType = ValueType.TEXT, - ), - ) - testingDispatcher.scheduler.advanceUntilIdle() - - val action = viewModel.legacyInteraction.value - assertTrue(action is LegacyInteraction.OnTeiClick) - action as LegacyInteraction.OnTeiClick - assertEquals("teiUid", action.teiUid) - assertEquals("enrollmentUid", action.enrollmentUid) - assertTrue(action.online) - assertEquals(NavigationPage.LIST_VIEW, viewModel.navigationBarUIState.value.selectedItem) - assertEquals(SearchScreenState.LIST, viewModel.screenState.value?.screenState) - assertTrue(viewModel.queryData.isEmpty()) - assertTrue(!viewModel.searchParametersUiState.clearSearchEnabled) - assertTrue(viewModel.searchParametersUiState.searchedItems.isEmpty()) - val searchItem = viewModel.searchParametersUiState.items.single() - assertNull(searchItem.value) - assertNull(searchItem.displayName) - } - - @Test - fun `Should return Simprints biometric global results when available`() = - runTest { - setCurrentProgram(testingProgram(displayFrontPageList = false)) - setAllowCreateBeforeSearch(false) - whenever(networkUtils.isOnline()) doReturn true - val globalModel = searchTeiModel("global") - whenever( - loadSimprintsBiometricSearchResultsUseCase( - any(), - any(), - any(), - any(), - anyOrNull(), - ), - ) doReturn flowOf(PagingData.from(listOf(globalModel))) - viewModel.searchParametersUiState = - viewModel.searchParametersUiState.copy( - items = listOf(simprintsBiometricSearchField()), - ) - viewModel.onParameterIntent( - FormIntent.OnSave( - uid = "biometric", - value = "guid-1,guid-2", - valueType = ValueType.TEXT, - ), - ) - viewModel.setListScreen() - viewModel.setSearchScreen() - viewModel.onSearch() - testingDispatcher.scheduler.advanceUntilIdle() - - val result = viewModel.fetchGlobalResults()?.asSnapshot() - - assertEquals(listOf(globalModel), result) - } - - @Test - fun `Should delegate Simprints biometric save handling to SimprintsSearchViewModel`() = - runTest { - viewModel.searchParametersUiState = - viewModel.searchParametersUiState.copy( - items = listOf(simprintsBiometricSearchField()), - ) - - whenever( - simprintsSearchViewModel.onSimprintsParameterSaved( - any(), - anyOrNull(), - any(), - any(), - any(), - ), - ) doAnswer { - simprintsBiometricSearchNavigation.tryEmit(Unit) - null - } - - viewModel.onParameterIntent( - FormIntent.OnSave( - uid = "biometric", - value = "guid-1", - valueType = ValueType.TEXT, - ), - ) - testingDispatcher.scheduler.advanceUntilIdle() - - verify(simprintsSearchViewModel).onSimprintsParameterSaved( - eq("biometric"), - eq("guid-1"), - any(), - any(), - any(), - ) - } - - @Test - fun `Should clear only Simprints biometric query data when requested to do so`() { - val biometricField = - simprintsBiometricSearchField().copy( - value = "guid-1", - displayName = "guid-1", - ) - val textField = - FieldUiModelImpl( - uid = "name", - label = "Name", - value = "Name", - displayName = "Name", - autocompleteList = emptyList(), - optionSetConfiguration = null, - valueType = ValueType.TEXT, - ) - viewModel.queryData["biometric"] = listOf("guid-1") - viewModel.queryData["name"] = listOf("Name") - viewModel.searchParametersUiState = - viewModel.searchParametersUiState.copy( - items = listOf(biometricField, textField), - ) - whenever( - simprintsSearchViewModel.clearSimprintsBiometricQueryData( - any(), - any(), - ), - ) doAnswer { invocation -> - @Suppress("UNCHECKED_CAST") - val queryData = invocation.arguments[1] as MutableMap<String, List<String>?> - queryData.remove("biometric") - listOf( - biometricField.copy(value = null, displayName = null), - textField, - ) - } - - viewModel.clearSimprintsBiometricQueryData() - - assertEquals(mapOf("name" to listOf("Name")), viewModel.queryData) - val biometricFieldUiModel = viewModel.searchParametersUiState.items.first() - - assertEquals(null, biometricFieldUiModel.value) - assertEquals("Name", viewModel.searchParametersUiState.items[1].value) - assertEquals(mapOf("name" to "Name"), viewModel.searchParametersUiState.searchedItems) - verify(simprintsSearchViewModel).clearSimprintsBiometricQueryData(any(), any()) + verify(repository).filterQueryForProgram(viewModel.queryDataAsMap(), "programUid") } @Test @@ -1289,8 +521,11 @@ class SearchTEIViewModelTest { setCurrentProgram(testingProgram(maxTeiCountToReturn = 1)) setAllowCreateBeforeSearch(false) whenever( - repository.filterQueryForProgram(viewModel.queryData, null), - ) doReturn mapOf("field" to listOf("value")) + repository.filterQueryForProgram( + any(), + anyOrNull(), + ), + ) doReturn mapOf("testingUid" to listOf("testingValue")) performSearch() viewModel.onDataLoaded(1) @@ -1305,7 +540,7 @@ class SearchTEIViewModelTest { fun `Should return unable to search outside result for search`() { setCurrentProgram(testingProgram(maxTeiCountToReturn = 1)) setAllowCreateBeforeSearch(false) - whenever(repository.filterQueryForProgram(viewModel.queryData, null)) doReturn mapOf() + whenever(repository.filterQueryForProgram(viewModel.queryDataAsMap(), null)) doReturn mapOf() whenever(repository.trackedEntityTypeFields()) doReturn listOf("Field_1", "Field_2") performSearch() @@ -1496,7 +731,8 @@ class SearchTEIViewModelTest { @Test fun `should return user-friendly names on search parameters fields`() { - viewModel.searchParametersUiState = viewModel.searchParametersUiState.copy(items = getFieldUIModels()) + viewModel.searchParametersUiState = + viewModel.searchParametersUiState.copy(items = getTrackerInputModels()) val expectedMap = mapOf( "uid1" to "Friendly OrgUnit Name", @@ -1504,7 +740,7 @@ class SearchTEIViewModelTest { "uid3" to "21/02/2024", "uid4" to "21/02/2024 - 01:00", "uid5" to "Boolean: false", - "uid6" to "Yes Only", + "uid6" to "Yes Only: true", "uid7" to "Text value", "uid9" to "18%", ) @@ -1516,18 +752,19 @@ class SearchTEIViewModelTest { @Test fun `should clear uiState when clearing data`() { - viewModel.searchParametersUiState = viewModel.searchParametersUiState.copy(items = getFieldUIModels()) + viewModel.searchParametersUiState = + viewModel.searchParametersUiState.copy(items = getTrackerInputModels()) performSearch() viewModel.clearQueryData() - assert(viewModel.queryData.isEmpty()) + assert(viewModel.queryDataList.isEmpty()) assert(viewModel.searchParametersUiState.items.all { it.value == null }) assert(viewModel.searchParametersUiState.searchedItems.isEmpty()) - verify(simprintsSearchViewModel).clearPendingSession() } @Test fun `should return date without format`() { - viewModel.searchParametersUiState = viewModel.searchParametersUiState.copy(items = getMalformedDateFieldUIModels()) + viewModel.searchParametersUiState = + viewModel.searchParametersUiState.copy(items = getMalformedDateFieldUIModels()) val expectedMap = mapOf( "uid1" to "04", @@ -1572,6 +809,9 @@ class SearchTEIViewModelTest { resourceManager = resourceManager, displayNameProvider = displayNameProvider, filterManager = filterManager, + searchTrackedEntities = searchTrackedEntities, + fetchSearchParameters = fetchSearchParameters, + fetchOptionSetOptions = fetchOptionSetOptions, simprintsSearchViewModel = simprintsSearchViewModel, loadSimprintsBiometricSearchResultsUseCase = loadSimprintsBiometricSearchResultsUseCase, mapSimprintsBiometricSearchResult = mapSimprintsBiometricSearchResult, @@ -1621,6 +861,9 @@ class SearchTEIViewModelTest { }, displayNameProvider = displayNameProvider, filterManager = filterManager, + searchTrackedEntities = searchTrackedEntities, + fetchSearchParameters = fetchSearchParameters, + fetchOptionSetOptions = fetchOptionSetOptions, simprintsSearchViewModel = simprintsSearchViewModel, loadSimprintsBiometricSearchResultsUseCase = loadSimprintsBiometricSearchResultsUseCase, mapSimprintsBiometricSearchResult = mapSimprintsBiometricSearchResult, @@ -1649,146 +892,295 @@ class SearchTEIViewModelTest { ) } - private fun getMalformedDateFieldUIModels(): List<FieldUiModel> = + @Test + fun `should send launch custom intent action`() = + runTest { + val customIntentModel: CustomIntentModel = mock() + whenever(repositoryKt.getCustomIntent(any())) doReturn customIntentModel + viewModel.searchActions.test { + viewModel.launchCustomIntent("fieldUid", "customIntentUid") + assertTrue(awaitItem() is TrackerInputAction.LaunchCustomIntent) + } + } + + @Test + fun `should set error if custom intent result is error`() { + whenever(resourceManager.getString(R.string.custom_intent_error)) doReturn "Custom intent error message" + viewModel.searchParametersUiState = + viewModel.searchParametersUiState.copy(items = customIntentFieldUIModels()) + viewModel.handleCustomIntentResult( + CustomIntentResult.Error("fieldUid"), + ) + assertTrue( + viewModel.searchParametersUiState.items + .first() + .error != null, + ) + } + + @Test + fun `should update values if custom intent result is successful`() = + runTest { + viewModel.searchParametersUiState = + viewModel.searchParametersUiState.copy(items = customIntentFieldUIModels()) + viewModel.handleCustomIntentResult( + CustomIntentResult.Success("fieldUid", "customValue", null, null), + ) + assertTrue( + viewModel.searchParametersUiState.items + .first() + .error == null, + ) + assertTrue( + viewModel.searchParametersUiState.items + .first() + .value == "customValue", + ) + } + + private fun customIntentFieldUIModels() = listOf( - FieldUiModelImpl( + TrackerInputUiState( + uid = "fieldUid", + label = "CustomIntent", + value = null, + focused = false, + valueType = TrackerInputType.ORGANISATION_UNIT, + description = null, + mandatory = false, + editable = true, + legend = null, + orientation = Orientation.HORIZONTAL, + optionSetConfiguration = null, + customIntentUid = "customIntentUid", + displayName = "Friendly OrgUnit Name", + orgUnitSelectorScope = null, + searchOperator = null, + minCharactersToSearch = null, + optionSet = null, + error = null, + warning = null, + ), + ) + + private fun getMalformedDateFieldUIModels(): List<TrackerInputUiState> = + listOf( + TrackerInputUiState( uid = "uid1", label = "Date", value = "04", - autocompleteList = emptyList(), + focused = false, + valueType = TrackerInputType.DATE, + description = null, + mandatory = false, + editable = true, + legend = null, + orientation = Orientation.HORIZONTAL, optionSetConfiguration = null, - valueType = ValueType.DATE, + customIntentUid = null, + displayName = "Friendly OrgUnit Name", + orgUnitSelectorScope = null, + searchOperator = null, + minCharactersToSearch = null, + optionSet = null, + error = null, + warning = null, ), ) - private fun getFieldUIModels(): List<FieldUiModel> = + private fun getTrackerInputModels(): List<TrackerInputUiState> = listOf( - FieldUiModelImpl( + TrackerInputUiState( uid = "uid1", label = "Org Unit", value = "orgUnitUid", - displayName = "Friendly OrgUnit Name", - autocompleteList = emptyList(), + focused = false, + valueType = TrackerInputType.ORGANISATION_UNIT, + description = null, + mandatory = false, + editable = true, + legend = null, + orientation = Orientation.HORIZONTAL, optionSetConfiguration = null, - valueType = ValueType.ORGANISATION_UNIT, + customIntentUid = null, + displayName = "Friendly OrgUnit Name", + orgUnitSelectorScope = null, + searchOperator = null, + minCharactersToSearch = null, + optionSet = null, + error = null, + warning = null, ), - FieldUiModelImpl( + TrackerInputUiState( uid = "uid2", label = "Gender", value = "M", - displayName = "Male", - autocompleteList = emptyList(), + focused = false, + valueType = TrackerInputType.MULTI_SELECTION, + description = null, + mandatory = false, + editable = true, + legend = null, + orientation = Orientation.HORIZONTAL, optionSetConfiguration = null, - valueType = ValueType.MULTI_TEXT, + customIntentUid = null, + displayName = "Male", + orgUnitSelectorScope = null, + searchOperator = null, + minCharactersToSearch = null, + optionSet = null, + error = null, + warning = null, ), - FieldUiModelImpl( + TrackerInputUiState( uid = "uid3", label = "Date", value = "2024-02-21", - autocompleteList = emptyList(), + focused = false, + valueType = TrackerInputType.DATE, + description = null, + mandatory = false, + editable = true, + legend = null, + orientation = Orientation.HORIZONTAL, optionSetConfiguration = null, - valueType = ValueType.DATE, + customIntentUid = null, + displayName = "21/02/2024", + orgUnitSelectorScope = null, + searchOperator = null, + minCharactersToSearch = null, + optionSet = null, + error = null, + warning = null, ), - FieldUiModelImpl( + TrackerInputUiState( uid = "uid4", label = "Date and Time", value = "2024-02-21T01:00", - autocompleteList = emptyList(), + focused = false, + valueType = TrackerInputType.DATE_TIME, + description = null, + mandatory = false, + editable = true, + legend = null, + orientation = Orientation.HORIZONTAL, optionSetConfiguration = null, - valueType = ValueType.DATETIME, + customIntentUid = null, + displayName = "21/02/2024 - 01:00", + orgUnitSelectorScope = null, + searchOperator = null, + minCharactersToSearch = null, + optionSet = null, + error = null, + warning = null, ), - FieldUiModelImpl( + TrackerInputUiState( uid = "uid5", label = "Boolean", value = "false", - autocompleteList = emptyList(), + focused = false, + valueType = TrackerInputType.HORIZONTAL_CHECKBOXES, + description = null, + mandatory = false, + editable = true, + legend = null, + orientation = Orientation.HORIZONTAL, optionSetConfiguration = null, - valueType = ValueType.BOOLEAN, + customIntentUid = null, + displayName = "Boolean: false", + orgUnitSelectorScope = null, + searchOperator = null, + minCharactersToSearch = null, + optionSet = null, + error = null, + warning = null, ), - FieldUiModelImpl( + TrackerInputUiState( uid = "uid6", label = "Yes Only", value = "true", - autocompleteList = emptyList(), + focused = false, + valueType = TrackerInputType.YES_ONLY_SWITCH, + description = null, + mandatory = false, + editable = true, + legend = null, + orientation = Orientation.HORIZONTAL, optionSetConfiguration = null, - valueType = ValueType.TRUE_ONLY, + customIntentUid = null, + displayName = "Yes Only; true", + orgUnitSelectorScope = null, + searchOperator = null, + minCharactersToSearch = null, + optionSet = null, + error = null, + warning = null, ), - FieldUiModelImpl( + TrackerInputUiState( uid = "uid7", label = "Text", value = "Text value", - autocompleteList = emptyList(), + focused = false, + valueType = TrackerInputType.TEXT, + description = null, + mandatory = false, + editable = true, + legend = null, + orientation = Orientation.HORIZONTAL, optionSetConfiguration = null, - valueType = ValueType.TEXT, + customIntentUid = null, + displayName = "Text value", + orgUnitSelectorScope = null, + searchOperator = null, + minCharactersToSearch = null, + optionSet = null, + error = null, + warning = null, ), - FieldUiModelImpl( + TrackerInputUiState( uid = "uid8", label = "Other field", value = null, - autocompleteList = emptyList(), + focused = false, + valueType = TrackerInputType.TEXT, + description = null, + mandatory = false, + editable = true, + legend = null, + orientation = Orientation.HORIZONTAL, optionSetConfiguration = null, - valueType = ValueType.TEXT, + customIntentUid = null, + displayName = "Male", + orgUnitSelectorScope = null, + searchOperator = null, + minCharactersToSearch = null, + optionSet = null, + error = null, + warning = null, ), - FieldUiModelImpl( + TrackerInputUiState( uid = "uid9", label = "Percentage", value = "18", - autocompleteList = emptyList(), + focused = false, + valueType = TrackerInputType.PERCENTAGE, + description = null, + mandatory = false, + editable = true, + legend = null, + orientation = Orientation.HORIZONTAL, optionSetConfiguration = null, - valueType = ValueType.PERCENTAGE, + customIntentUid = null, + displayName = "18%", + orgUnitSelectorScope = null, + searchOperator = null, + minCharactersToSearch = null, + optionSet = null, + error = null, + warning = null, ), ) - private fun simprintsBiometricSearchField() = - FieldUiModelImpl( - uid = "biometric", - label = "Biometric", - value = null, - autocompleteList = emptyList(), - optionSetConfiguration = null, - valueType = ValueType.TEXT, - customIntent = simprintsIdentifyIntent(), - ) - - private fun simprintsIdentifyIntent() = - CustomIntentModel( - uid = "identify", - name = "Identify", - packageName = "com.simprints.id.IDENTIFY", - customIntentRequest = emptyList(), - customIntentResponse = emptyList(), - ) - - private fun trackedEntitySearchItem(uid: String): TrackedEntitySearchItem = - TrackedEntitySearchItem( - uid = uid, - created = null, - lastUpdated = null, - createdAtClient = null, - lastUpdatedAtClient = null, - organisationUnit = "orgUnit", - geometry = null, - syncState = null, - aggregatedSyncState = null, - deleted = false, - type = TrackedEntityType.builder().uid("teiType").build(), - header = uid, - ) - - private fun searchTeiModel( - header: String, - teiUid: String = header, - ) = SearchTeiModel().apply { - setHeader(header) - tei = - TrackedEntityInstance - .builder() - .uid(teiUid) - .trackedEntityType("teiType") - .organisationUnit("orgUnit") - .build() - } - private fun testingProgram( displayFrontPageList: Boolean = true, minAttributesToSearch: Int = 1, @@ -1800,6 +1192,8 @@ class SearchTEIViewModelTest { .displayFrontPageList(displayFrontPageList) .minAttributesRequiredToSearch(minAttributesToSearch) .trackedEntityType(TrackedEntityType.builder().uid("teTypeUid").build()) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .apply { maxTeiCountToReturn?.let { maxTeiCountToReturn(maxTeiCountToReturn) @@ -1815,12 +1209,9 @@ class SearchTEIViewModelTest { @ExperimentalCoroutinesApi private fun performSearch() { - viewModel.onParameterIntent( - FormIntent.OnSave( - uid = "testingUid", - value = "testingValue", - valueType = ValueType.TEXT, - ), + viewModel.onValueChange( + fieldUid = "testingUid", + value = "testingValue", ) viewModel.setListScreen() viewModel.setSearchScreen() diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEPresenterTest.kt index aaac8009b41..449ecab97c9 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/SearchTEPresenterTest.kt @@ -10,9 +10,10 @@ import org.dhis2.commons.prefs.PreferenceProvider import org.dhis2.commons.resources.ColorUtils import org.dhis2.commons.resources.ResourceManager import org.dhis2.data.schedulers.TestSchedulerProvider -import org.dhis2.data.service.SyncStatusController +import org.dhis2.mobile.sync.domain.SyncStatusController import org.dhis2.utils.analytics.AnalyticsHelper import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.program.Program import org.hisp.dhis.android.core.trackedentity.TrackedEntityType import org.junit.After @@ -58,6 +59,8 @@ class SearchTEPresenterTest { .uid(initialProgram) .displayFrontPageList(true) .minAttributesRequiredToSearch(0) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() whenever( @@ -98,6 +101,8 @@ class SearchTEPresenterTest { .uid("uid") .displayFrontPageList(true) .minAttributesRequiredToSearch(1) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() presenter.setProgramForTesting(program) @@ -115,6 +120,8 @@ class SearchTEPresenterTest { .uid("uid") .displayFrontPageList(true) .minAttributesRequiredToSearch(1) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() val newSelectedProgram = @@ -123,6 +130,8 @@ class SearchTEPresenterTest { .uid("uid2") .displayFrontPageList(true) .minAttributesRequiredToSearch(1) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() whenever( diff --git a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapperTest.kt b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapperTest.kt index cd9dd6ffdfd..787a71b48d3 100644 --- a/app/src/test/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapperTest.kt +++ b/app/src/test/java/org/dhis2/usescases/searchTrackEntity/ui/mapper/TEICardMapperTest.kt @@ -6,13 +6,20 @@ import org.dhis2.commons.date.DateUtils import org.dhis2.commons.date.toDateSpan import org.dhis2.commons.date.toOverdueOrScheduledUiText import org.dhis2.commons.resources.ResourceManager +import org.dhis2.mobile.commons.extensions.toJavaDate +import org.dhis2.mobile.commons.extensions.toKtxInstant +import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.search.model.DomainEnrollment +import org.dhis2.tracker.search.model.DomainObjectStyle +import org.dhis2.tracker.search.model.DomainProgram +import org.dhis2.tracker.search.model.EnrollmentStatus +import org.dhis2.tracker.search.model.GeometryFeatureType +import org.dhis2.tracker.search.model.SyncState +import org.dhis2.tracker.search.model.TrackedEntitySearchItemAttributeDomain +import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult +import org.dhis2.tracker.search.model.TrackedEntityTypeAttributeDomain +import org.dhis2.tracker.search.model.TrackedEntityTypeDomain import org.dhis2.usescases.searchTrackEntity.SearchTeiModel -import org.hisp.dhis.android.core.common.State -import org.hisp.dhis.android.core.enrollment.Enrollment -import org.hisp.dhis.android.core.enrollment.EnrollmentStatus -import org.hisp.dhis.android.core.program.Program -import org.hisp.dhis.android.core.trackedentity.TrackedEntityAttributeValue -import org.hisp.dhis.android.core.trackedentity.TrackedEntityInstance import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test @@ -22,6 +29,7 @@ import org.mockito.kotlin.mock import org.mockito.kotlin.whenever import java.util.Calendar import java.util.Date +import kotlin.time.Instant class TEICardMapperTest { private val context: Context = mock() @@ -29,6 +37,24 @@ class TEICardMapperTest { private lateinit var mapper: TEICardMapper + private val enrollmentUid = "EnrollmentUid" + private val programUid = "programUid" + private val enrollmentOrgUnit = "OrgUnit" + private val teiUid = "TEIUid" + private val selectedEnrollment = DomainEnrollment( + uid = enrollmentUid, + orgUnit = enrollmentOrgUnit, + program = programUid, + enrollmentDate = Instant.parse("2020-01-01T00:00:00.00Z"), + incidentDate = Instant.parse("2020-01-01T00:00:00.00Z"), + completedDate = Instant.parse("2020-01-01T00:00:00.00Z"), + followUp = true, + status = EnrollmentStatus.COMPLETED, + trackedEntityInstance = teiUid, + ) + private val enrollments = listOf( + selectedEnrollment + ) @Before fun setUp() { whenever(context.getString(R.string.interval_now)) doReturn "now" @@ -49,7 +75,7 @@ class TEICardMapperTest { @Test fun shouldReturnCardFull() { - val model = createFakeModel(isOverdue = true) + val model = createFakeModel() val result = mapper.map( @@ -60,24 +86,25 @@ class TEICardMapperTest { ) assertEquals(result.title, model.header) - assertEquals(result.lastUpdated, model.tei.lastUpdated().toDateSpan(context)) - assertEquals(result.additionalInfo[0].value, model.attributeValues["Name"]?.value()) - assertEquals(result.additionalInfo[1].value, model.enrolledOrgUnit) + assertEquals(result.lastUpdated, model.tei.lastUpdated?.toJavaDate().toDateSpan(context)) + assertEquals(result.additionalInfo[0].value, model.attributeValues["Name"]?.value) + assertEquals(result.additionalInfo[1].value, model.tei.ownerOrgUnit) + assertEquals(result.additionalInfo[2].value, model.tei.enrollmentOrgUnit) assertEquals( - result.additionalInfo[2].value, - model.programInfo.map { it.name() }.joinToString(", "), + result.additionalInfo[3].value, + model.tei.enrolledPrograms?.joinToString(", ") { it.displayName }, ) assertEquals( - result.additionalInfo[3].value, + result.additionalInfo[4].value, "Enrollment Completed", ) assertEquals( - result.additionalInfo[4].value, - model.overdueDate.toOverdueOrScheduledUiText(resourceManager), + result.additionalInfo[5].value, + model.tei.overDueDate?.toJavaDate().toOverdueOrScheduledUiText(resourceManager), ) assertEquals( - result.additionalInfo[5].value, + result.additionalInfo[6].value, resourceManager.getString(R.string.marked_follow_up), ) } @@ -89,7 +116,7 @@ class TEICardMapperTest { whenever(resourceManager.getPlural(any(), any(), any())) doReturn "2 days" - val model = createFakeModel(overdueDate.time, true) + val model = createFakeModel(overdueDate.time) val result = mapper.map( @@ -99,72 +126,82 @@ class TEICardMapperTest { onImageClick = {}, ) assertEquals( - result.additionalInfo[4].value, - model.overdueDate.toOverdueOrScheduledUiText(resourceManager), + result.additionalInfo[5].value, + model.tei.overDueDate?.toJavaDate().toOverdueOrScheduledUiText(resourceManager), ) } private fun createFakeModel( currentDate: Date = Date(), - isOverdue: Boolean = false, ): SearchTeiModel { - val attributeValues = LinkedHashMap<String, TrackedEntityAttributeValue>() - attributeValues["Name"] = - TrackedEntityAttributeValue - .builder() - .value("Peter") - .build() - - val model = - SearchTeiModel().apply { - header = "TEI header" - tei = - TrackedEntityInstance - .builder() - .uid("TEIUid") - .lastUpdated(currentDate) - .organisationUnit("OrgUnit") - .aggregatedSyncState(State.SYNCED) - .build() - enrolledOrgUnit = "OrgUnit" - displayOrgUnit = true - setCurrentEnrollment( - Enrollment - .builder() - .uid("EnrollmentUid") - .program("programUid") - .status(EnrollmentStatus.COMPLETED) - .build(), - ) - setAttributeValues(attributeValues) - - addProgramInfo( - Program - .builder() - .uid("Program1Uid") - .displayName("Program 1") - .build(), - null, - ) - addProgramInfo( - Program - .builder() - .uid("Program2Uid") - .displayName("Program 2") - .build(), - null, + val attributeValues = LinkedHashMap<String, TrackedEntitySearchItemAttributeDomain>() + val attribute = TrackedEntitySearchItemAttributeDomain( + attribute = "attrUid1", + displayName = "Name", + displayFormName = "Name", + value = "Peter", + valueType = TrackerInputType.TEXT, + displayInList = true, + optionSet = null + ) + attributeValues["Name"] = attribute + + val tei = TrackedEntitySearchItemResult( + uid = "teiUid", + created = Instant.parse("2020-01-01T00:00:00.00Z"), + lastUpdated = Instant.parse("2020-01-01T00:00:00.00Z"), + createdAtClient = Instant.parse("2020-01-01T00:00:00.00Z"), + lastUpdatedAtClient = Instant.parse("2020-01-01T00:00:00.00Z"), + ownerOrgUnit = "ownerOrgUnit", + enrollmentOrgUnit = "enrollmentOrgUnit", + shouldDisplayOrgUnit = true, + geometry = null, + syncState = SyncState.SYNCED, + aggregatedSyncState = SyncState.SYNCED, + deleted = false, + isOnline = true, + teTypeName = "teTypeName", + type = TrackedEntityTypeDomain( + trackedEntityTypeAttributeDomains = listOf(TrackedEntityTypeAttributeDomain( + trackedEntityTypeUid= "trackedEntityTypeUid", + trackedEntityAttributeUid = "trackedEntityAttributeUid", + displayInList= true, + mandatory = false, + searchable = true, + sortOrder = 1, + )), + featureType = GeometryFeatureType.POINT, + ), + header = "TEI header", + overDueDate = currentDate.toKtxInstant(), + selectedEnrollment = selectedEnrollment, + profilePicture = null, + enrolledPrograms = listOf( + DomainProgram( + uid = "Program1Uid", + displayName = "Program 1", + style = DomainObjectStyle( + icon = "iconUid", + color = "colorUid" ) - overdueDate = currentDate - isHasOverdue = isOverdue - - addEnrollment( - Enrollment - .builder() - .uid("EnrollmentUid") - .followUp(true) - .build(), + ), + DomainProgram( + uid = "Program2Uid", + displayName = "Program 2", + style = DomainObjectStyle( + icon = "iconUid2", + color = "colorUid2" ) - } - return model + ),), + enrollments = enrollments, + relationships = null, + defaultTypeIcon = null, + attributeValues = listOf(attribute), + ) + val searchTeiModel = SearchTeiModel() + searchTeiModel.tei = tei + searchTeiModel.attributeValues = attributeValues + + return searchTeiModel } } diff --git a/app/src/test/java/org/dhis2/usescases/settings/DeleteUserDataTest.kt b/app/src/test/java/org/dhis2/usescases/settings/DeleteUserDataTest.kt index 76e9340f115..ede8a776864 100644 --- a/app/src/test/java/org/dhis2/usescases/settings/DeleteUserDataTest.kt +++ b/app/src/test/java/org/dhis2/usescases/settings/DeleteUserDataTest.kt @@ -1,28 +1,39 @@ package org.dhis2.usescases.settings +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.runTest import org.dhis2.commons.filters.FilterManager import org.dhis2.commons.prefs.PreferenceProvider +import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.service.workManager.WorkManagerController import org.junit.Before import org.junit.Test +import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock import org.mockito.kotlin.verify +@OptIn(ExperimentalCoroutinesApi::class) class DeleteUserDataTest { private lateinit var deleteUserData: DeleteUserData private val workManagerController: WorkManagerController = mock() private val filterManager: FilterManager = mock() private val preferencesProvider: PreferenceProvider = mock() + private val testingDispatcher = UnconfinedTestDispatcher() + private val dispatcherProvider: DispatcherProvider = mock { + on { io() } doReturn testingDispatcher + on { ui() } doReturn testingDispatcher + } @Before fun setup() { deleteUserData = - DeleteUserData(workManagerController, filterManager, preferencesProvider) + DeleteUserData(workManagerController, filterManager, preferencesProvider, dispatcherProvider) } @Test - fun `Should delete user data`() { + fun `Should delete user data`() = runTest { deleteUserData.wipeCacheAndPreferences(null) verify(workManagerController).cancelAllWork() diff --git a/app/src/test/java/org/dhis2/usescases/settings/SettingsRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/settings/SettingsRepositoryTest.kt index 4f241f06d06..fd3c9394c0f 100644 --- a/app/src/test/java/org/dhis2/usescases/settings/SettingsRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/usescases/settings/SettingsRepositoryTest.kt @@ -19,6 +19,7 @@ import org.dhis2.commons.prefs.Preference.Companion.TIME_META import org.dhis2.commons.prefs.Preference.Companion.TIME_WEEKLY import org.dhis2.commons.prefs.PreferenceProvider import org.dhis2.data.server.UserManager +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.settings.DataSyncPeriod @@ -27,6 +28,7 @@ import org.hisp.dhis.android.core.settings.LimitScope import org.hisp.dhis.android.core.settings.MetadataSyncPeriod import org.hisp.dhis.android.core.settings.ProgramSetting import org.hisp.dhis.android.core.settings.ProgramSettings +import org.hisp.dhis.android.core.settings.SynchronizationSettings import org.hisp.dhis.android.core.sms.domain.interactor.ConfigCase import org.junit.Before import org.junit.Test @@ -42,6 +44,11 @@ class SettingsRepositoryTest { Mockito.mock(UserManager::class.java, Mockito.RETURNS_DEEP_STUBS) private val preferencesProvider: PreferenceProvider = mock() private val featureConfigRepository: FeatureConfigRepository = mock() + private val syncBackgroundJobAction: SyncBackgroundJobAction = mock { + on { getNextSettingsSync() } doReturn null + on { getNextMetadataSync() } doReturn null + on { getNextDataSync() } doReturn null + } private val smsConfig: ConfigCase.SmsConfig = mock { on { isModuleEnabled } doReturn true @@ -62,6 +69,7 @@ class SettingsRepositoryTest { d2, preferencesProvider, featureConfigRepository, + syncBackgroundJobAction, ) configurePreferences() configureDataCount() @@ -70,6 +78,7 @@ class SettingsRepositoryTest { @Test fun `Should return metadata period from general settings if exist`() { + configureSyncSettings(true) configureGeneralSettings(true) val testObserver = settingsRepository.metaSync().test() testObserver @@ -92,6 +101,7 @@ class SettingsRepositoryTest { @Test fun `Should return data period from general settings if exist`() { + configureSyncSettings(true) configureGeneralSettings(true) configureDataErrors() val testObserver = settingsRepository.dataSync().test() @@ -116,8 +126,9 @@ class SettingsRepositoryTest { @Test fun `Should return parameters from general settings if exist`() { + configureSyncSettings(true) configureGeneralSettings(true) - configureProgramSettings(true) + val testObserver = settingsRepository.syncParameters().test() testObserver .assertNoErrors() @@ -130,8 +141,9 @@ class SettingsRepositoryTest { @Test fun `Should return parameters from preferences if general settings does not exist`() { + configureSyncSettings(false) configureGeneralSettings(false) - configureProgramSettings(false) + val testObserver = settingsRepository.syncParameters().test() testObserver .assertNoErrors() @@ -146,6 +158,7 @@ class SettingsRepositoryTest { fun `Should return reserved values from settings if exist`() { configureGeneralSettings(true) val testObserver = settingsRepository.reservedValues().test() + testObserver .assertNoErrors() .assertValue { @@ -157,6 +170,7 @@ class SettingsRepositoryTest { fun `Should return reserved values from preferences if settings does not exist`() { configureGeneralSettings(false) val testObserver = settingsRepository.reservedValues().test() + testObserver .assertNoErrors() .assertValue { @@ -168,6 +182,7 @@ class SettingsRepositoryTest { fun `Should return editable sms configuration if settings does not exist`() { configureGeneralSettings(false) val testObserver = settingsRepository.sms().test() + testObserver .assertNoErrors() .assertValue { @@ -175,6 +190,17 @@ class SettingsRepositoryTest { } } + private fun configureSyncSettings(hasSyncSettings: Boolean) { + whenever( + d2.settingModule().synchronizationSettings().blockingExists(), + ) doReturn hasSyncSettings + if (hasSyncSettings) { + whenever( + d2.settingModule().synchronizationSettings().blockingGet(), + ) doReturn mockedSyncSettings() + } + } + private fun configureGeneralSettings(hasGeneralSettings: Boolean) { whenever(d2.settingModule().generalSetting().blockingExists()) doReturn hasGeneralSettings @@ -185,15 +211,6 @@ class SettingsRepositoryTest { } } - private fun configureProgramSettings(hasProgramSettings: Boolean) { - whenever(d2.settingModule().programSetting().blockingExists()) doReturn - hasProgramSettings - if (hasProgramSettings) { - whenever(d2.settingModule().programSetting().blockingGet()) doReturn - mockedProgramSettings() - } - } - private fun configurePreferences() { whenever( preferencesProvider.getString(Constants.LAST_META_SYNC, "-"), @@ -469,11 +486,17 @@ class SettingsRepositoryTest { whenever(d2.smsModule().configCase()) doReturn configCase } - private fun mockedGeneralSettings(): GeneralSettings = - GeneralSettings + private fun mockedSyncSettings() = + SynchronizationSettings .builder() .dataSync(SETTINGS_DATA_PERIOD) .metadataSync(SETTINGS_METADATA_PERIOD) + .programSettings(mockedProgramSettings()) + .build() + + private fun mockedGeneralSettings(): GeneralSettings = + GeneralSettings + .builder() .encryptDB(SETTINGS_ENCRYPT) .reservedValues(SETTINGS_RV) .build() diff --git a/app/src/test/java/org/dhis2/usescases/settings/SyncManagerPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/settings/SyncManagerPresenterTest.kt index 4d70a7d708a..7fe223dfad8 100644 --- a/app/src/test/java/org/dhis2/usescases/settings/SyncManagerPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/settings/SyncManagerPresenterTest.kt @@ -39,7 +39,6 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.mockito.kotlin.any -import org.mockito.kotlin.anyOrNull import org.mockito.kotlin.doReturn import org.mockito.kotlin.doReturnConsecutively import org.mockito.kotlin.mock @@ -130,6 +129,8 @@ class SyncManagerPresenterTest { MetadataSettingsViewModel( metadataSyncPeriod = 100, lastMetadataSync = "test", + nextMetadataSync = null, + nextSettingsSync = null, hasErrors = false, canEdit = false, syncInProgress = false, @@ -139,6 +140,7 @@ class SyncManagerPresenterTest { DataSettingsViewModel( dataSyncPeriod = 100, lastDataSync = "test", + nextDataSync = null, syncHasErrors = false, dataHasErrors = false, dataHasWarnings = false, @@ -223,21 +225,20 @@ class SyncManagerPresenterTest { val timeoutTest = 1 whenever( getSettingsState.invoke( - anyOrNull(), - any(), - any(), any(), ), ) doReturnConsecutively listOf( - mockedSettingState(), - mockedSettingState().copy( - smsSettingsViewModel = - mockedSMSViewModel().copy( - isEnabled = true, - gatewayNumber = gatewayNumberTest, - responseTimeout = timeoutTest, - ), + Result.success(mockedSettingState()), + Result.success( + mockedSettingState().copy( + smsSettingsViewModel = + mockedSMSViewModel().copy( + isEnabled = true, + gatewayNumber = gatewayNumberTest, + responseTimeout = timeoutTest, + ), + ), ), ) @@ -254,7 +255,7 @@ class SyncManagerPresenterTest { awaitItem() presenter.enableSmsModule(true, gatewayNumberTest, timeoutTest) awaitItem() - verify(getSettingsState, times(2)).invoke(anyOrNull(), any(), any(), any()) + verify(getSettingsState, times(2)).invoke(any()) } } @@ -262,13 +263,8 @@ class SyncManagerPresenterTest { fun `Should not save gateway if validation fails`() = runTest { whenever( - getSettingsState.invoke( - anyOrNull(), - any(), - any(), - any(), - ), - ) doReturn mockedSettingState() + getSettingsState.invoke(any()), + ) doReturn Result.success(mockedSettingState()) val gatewayNumberTest = "+111" whenever( @@ -310,13 +306,8 @@ class SyncManagerPresenterTest { runTest { val smsResultSender = "test" whenever( - getSettingsState.invoke( - anyOrNull(), - any(), - any(), - any(), - ), - ) doReturn mockedSettingState() + getSettingsState.invoke(any()), + ) doReturn Result.success(mockedSettingState()) whenever(updateSmsResponse(any())) doReturn UpdateSmsResponse.UpdateSmsResponseResult.ValidationError( GatewayValidator.GatewayValidationResult.Invalid, @@ -364,17 +355,14 @@ class SyncManagerPresenterTest { fun `Should load data when setting manual trigger`() = runTest { whenever( - getSettingsState.invoke( - anyOrNull(), - any(), - any(), - any(), - ), + getSettingsState.invoke(any()), ) doReturnConsecutively listOf( - mockedSettingState(), - mockedSettingState().copy( - dataSettingsViewModel = mockedDataViewModel().copy(dataSyncPeriod = 0), + Result.success(mockedSettingState()), + Result.success( + mockedSettingState().copy( + dataSettingsViewModel = mockedDataViewModel().copy(dataSyncPeriod = 0), + ), ), ) @@ -402,13 +390,8 @@ class SyncManagerPresenterTest { fun `Should open clicked item`() = runTest { whenever( - getSettingsState.invoke( - anyOrNull(), - any(), - any(), - any(), - ), - ) doReturn mockedSettingState() + getSettingsState.invoke(any()), + ) doReturn Result.success(mockedSettingState()) presenter.settingsState.test { awaitItem() @@ -483,13 +466,8 @@ class SyncManagerPresenterTest { fun shouldUpdateSyncStatus() = runTest { whenever( - getSettingsState.invoke( - anyOrNull(), - any(), - any(), - any(), - ), - ) doReturn mockedSettingState() + getSettingsState.invoke(any()), + ) doReturn Result.success(mockedSettingState()) val dataSyncStartedProgress = LaunchSync.SyncStatusProgress( diff --git a/app/src/test/java/org/dhis2/usescases/settings/domain/LaunchSyncTest.kt b/app/src/test/java/org/dhis2/usescases/settings/domain/LaunchSyncTest.kt index 750be9ec62f..36d38577a53 100644 --- a/app/src/test/java/org/dhis2/usescases/settings/domain/LaunchSyncTest.kt +++ b/app/src/test/java/org/dhis2/usescases/settings/domain/LaunchSyncTest.kt @@ -1,22 +1,19 @@ package org.dhis2.usescases.settings.domain import androidx.arch.core.executor.testing.InstantTaskExecutorRule -import androidx.lifecycle.MutableLiveData -import androidx.work.ExistingPeriodicWorkPolicy -import androidx.work.ExistingWorkPolicy -import androidx.work.WorkInfo import app.cash.turbine.test import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.setMain import org.dhis2.commons.Constants import org.dhis2.commons.prefs.PreferenceProvider -import org.dhis2.data.service.workManager.WorkManagerController -import org.dhis2.data.service.workManager.WorkerItem -import org.dhis2.data.service.workManager.WorkerType +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.model.SyncJobStatus +import org.dhis2.mobile.sync.model.SyncStatus import org.dhis2.utils.analytics.AnalyticsHelper import org.junit.After import org.junit.Assert.assertEquals @@ -39,21 +36,21 @@ class LaunchSyncTest { private val testingDispatcher = UnconfinedTestDispatcher() private lateinit var launchSync: LaunchSync - private val workManagerController: WorkManagerController = mock() private val preferenceProvider: PreferenceProvider = mock() private val analyticsHelper: AnalyticsHelper = mock() - private val mockedMetadataWorkInfo = MutableLiveData<List<WorkInfo>>() - private val mockedDataWorkInfo = MutableLiveData<List<WorkInfo>>() + private val mockedMetadataWorkInfo = MutableStateFlow<List<SyncJobStatus>>(emptyList()) + private val mockedDataWorkInfo = MutableStateFlow<List<SyncJobStatus>>(emptyList()) + private val syncBackgroundJobAction: SyncBackgroundJobAction = mock() @Before fun setUp() { Dispatchers.setMain(testingDispatcher) - whenever(workManagerController.getWorkInfosByTagLiveData(Constants.META_NOW)) doReturn mockedMetadataWorkInfo - whenever(workManagerController.getWorkInfosByTagLiveData(Constants.DATA_NOW)) doReturn mockedDataWorkInfo + whenever(syncBackgroundJobAction.observeMetadataJob()) doReturn mockedMetadataWorkInfo + whenever(syncBackgroundJobAction.observeDataJob()) doReturn mockedDataWorkInfo launchSync = LaunchSync( - workManagerController = workManagerController, + syncBackgroundJobAction = syncBackgroundJobAction, preferenceProvider = preferenceProvider, analyticsHelper = analyticsHelper, ) @@ -67,71 +64,33 @@ class LaunchSyncTest { @Test fun shouldStartSyncMetadata() = runTest { - val expectedWorkerItem = - WorkerItem( - Constants.META_NOW, - WorkerType.METADATA, - null, - null, - ExistingWorkPolicy.KEEP, - null, - ) launchSync(LaunchSync.SyncAction.SyncMetadata) - verify(workManagerController, times(1)).syncDataForWorker(expectedWorkerItem) + verify(syncBackgroundJobAction, times(1)).launchMetadataSync(0) } @Test fun shouldStartSyncData() = runTest { - val expectedWorkerItem = - WorkerItem( - Constants.DATA_NOW, - WorkerType.DATA, - null, - null, - ExistingWorkPolicy.KEEP, - null, - ) launchSync(LaunchSync.SyncAction.SyncData) - verify(workManagerController, times(1)).syncDataForWorker(expectedWorkerItem) + verify(syncBackgroundJobAction, times(1)).launchDataSync(0) } @Test fun shouldUpdateSyncDataPeriod() = runTest { val newPeriod = 13 - val expectedWorkerItem = - WorkerItem( - Constants.DATA, - WorkerType.DATA, - newPeriod.toLong(), - null, - null, - ExistingPeriodicWorkPolicy.REPLACE, - ) launchSync(LaunchSync.SyncAction.UpdateSyncDataPeriod(newPeriod)) verify(preferenceProvider, times(1)).setValue(Constants.TIME_DATA, newPeriod) - verify(workManagerController, times(1)).cancelUniqueWork(Constants.DATA) - verify(workManagerController, times(1)).enqueuePeriodicWork(expectedWorkerItem) + verify(syncBackgroundJobAction, times(1)).launchDataSync(newPeriod.toLong()) } @Test fun shouldUpdateSyncMetadataPeriod() = runTest { val newPeriod = 13 - val expectedWorkerItem = - WorkerItem( - Constants.META, - WorkerType.METADATA, - newPeriod.toLong(), - null, - null, - ExistingPeriodicWorkPolicy.REPLACE, - ) launchSync(LaunchSync.SyncAction.UpdateSyncMetadataPeriod(newPeriod)) verify(preferenceProvider, times(1)).setValue(Constants.TIME_META, newPeriod) - verify(workManagerController, times(1)).cancelUniqueWork(Constants.META) - verify(workManagerController, times(1)).enqueuePeriodicWork(expectedWorkerItem) + verify(syncBackgroundJobAction, times(1)).launchMetadataSync(newPeriod.toLong()) } @Test @@ -139,7 +98,7 @@ class LaunchSyncTest { runTest { launchSync(LaunchSync.SyncAction.UpdateSyncDataPeriod(0)) verify(preferenceProvider, times(1)).setValue(Constants.TIME_DATA, 0) - verify(workManagerController, times(1)).cancelUniqueWork(Constants.DATA) + verify(syncBackgroundJobAction, times(1)).cancelDataSync() } @Test @@ -147,56 +106,123 @@ class LaunchSyncTest { runTest { launchSync(LaunchSync.SyncAction.UpdateSyncMetadataPeriod(0)) verify(preferenceProvider, times(1)).setValue(Constants.TIME_META, 0) - verify(workManagerController, times(1)).cancelUniqueWork(Constants.META) + verify(syncBackgroundJobAction, times(1)).cancelMetadataSync() } @Test fun shouldUpdateProgressStatus() = runTest { val startedMetadataWorkInfo = - mock<WorkInfo> { - on { state } doReturn WorkInfo.State.RUNNING + mock<SyncJobStatus> { + on { status } doReturn SyncStatus.Running } val startedDataWorkInfo = - mock<WorkInfo> { - on { state } doReturn WorkInfo.State.RUNNING + mock<SyncJobStatus> { + on { status } doReturn SyncStatus.Running } val finishedMetadataWorkInfo = - mock<WorkInfo> { - on { state } doReturn WorkInfo.State.SUCCEEDED + mock<SyncJobStatus> { + on { status } doReturn SyncStatus.Succeed } val finishedDataWorkInfo = - mock<WorkInfo> { - on { state } doReturn WorkInfo.State.SUCCEEDED + mock<SyncJobStatus> { + on { status } doReturn SyncStatus.Succeed } launchSync.syncWorkInfo.test { - mockedMetadataWorkInfo.postValue(listOf(startedMetadataWorkInfo)) - assertState(awaitItem(), LaunchSync.SyncStatus.InProgress, LaunchSync.SyncStatus.None) - mockedDataWorkInfo.postValue(listOf(startedDataWorkInfo)) + awaitItem() + awaitItem() + mockedMetadataWorkInfo.emit(listOf(startedMetadataWorkInfo)) + assertState( + awaitItem(), + LaunchSync.SyncStatus.InProgress, + LaunchSync.SyncStatus.None + ) + mockedDataWorkInfo.emit(listOf(startedDataWorkInfo)) with(awaitItem()) { assertState( this, LaunchSync.SyncStatus.InProgress, LaunchSync.SyncStatus.InProgress, ) - assertFalse(this.hasSyncFinished(metadataWasRunning = true, dataWasRunning = false)) + assertFalse( + this.hasSyncFinished( + metadataWasRunning = true, + dataWasRunning = false + ) + ) } - mockedMetadataWorkInfo.postValue(listOf(finishedMetadataWorkInfo)) + mockedMetadataWorkInfo.emit(listOf(finishedMetadataWorkInfo)) with(awaitItem()) { assertState( this, LaunchSync.SyncStatus.Finished, LaunchSync.SyncStatus.InProgress, ) - assertTrue(this.hasSyncFinished(metadataWasRunning = true, dataWasRunning = true)) + assertTrue( + this.hasSyncFinished( + metadataWasRunning = true, + dataWasRunning = true + ) + ) } - mockedDataWorkInfo.postValue(listOf(finishedDataWorkInfo)) - assertState(awaitItem(), LaunchSync.SyncStatus.Finished, LaunchSync.SyncStatus.Finished) + mockedDataWorkInfo.emit(listOf(finishedDataWorkInfo)) + assertState( + awaitItem(), + LaunchSync.SyncStatus.Finished, + LaunchSync.SyncStatus.Finished + ) cancelAndIgnoreRemainingEvents() } } + @Test + fun shouldCombineMetadataProgress() = + runTest { + launchSync.syncWorkInfo.test { + awaitItem() + awaitItem() + syncStatuses.forEach { metadataSyncStatus -> + syncStatuses.forEach { metadataNowSyncStatus -> + mockedMetadataWorkInfo.emit( + listOf( + metadataSyncStatus, + metadataNowSyncStatus + ) + ) + val expectedValue = when { + (metadataSyncStatus.status is SyncStatus.Running) or (metadataNowSyncStatus.status is SyncStatus.Running) -> LaunchSync.SyncStatus.InProgress + (metadataSyncStatus.status is SyncStatus.Blocked) or (metadataNowSyncStatus.status is SyncStatus.Blocked) -> LaunchSync.SyncStatus.InProgress + (metadataSyncStatus.status is SyncStatus.Enqueue) and (metadataNowSyncStatus.status is SyncStatus.Enqueue) -> LaunchSync.SyncStatus.None + (metadataSyncStatus.status is SyncStatus.Cancelled) and (metadataNowSyncStatus.status is SyncStatus.Cancelled) -> LaunchSync.SyncStatus.Cancelled + else -> LaunchSync.SyncStatus.Finished + + + } + + assertState( + awaitItem(), + expectedValue, + LaunchSync.SyncStatus.None + ) + } + } + } + } + + private val syncStatuses = listOf( + mockedMetadataSyncJobStatus(SyncStatus.Enqueue), + mockedMetadataSyncJobStatus(SyncStatus.Running), + mockedMetadataSyncJobStatus(SyncStatus.Succeed), + mockedMetadataSyncJobStatus(SyncStatus.Failed), + mockedMetadataSyncJobStatus(SyncStatus.Blocked), + mockedMetadataSyncJobStatus(SyncStatus.Cancelled), + ) + + private fun mockedMetadataSyncJobStatus(mockedStatus: SyncStatus) = mock<SyncJobStatus> { + on { status } doReturn mockedStatus + } + private fun assertState( syncStatusProgress: LaunchSync.SyncStatusProgress, metadataSyncProgress: LaunchSync.SyncStatus, diff --git a/app/src/test/java/org/dhis2/usescases/sync/SyncPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/sync/SyncPresenterTest.kt index 07b6c765d3b..c54d0634dd2 100644 --- a/app/src/test/java/org/dhis2/usescases/sync/SyncPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/sync/SyncPresenterTest.kt @@ -1,17 +1,15 @@ package org.dhis2.usescases.sync -import androidx.work.Data -import androidx.work.WorkInfo import io.reactivex.Completable import io.reactivex.Single -import org.dhis2.commons.Constants import org.dhis2.commons.prefs.Preference import org.dhis2.commons.prefs.PreferenceProvider import org.dhis2.commons.schedulers.SchedulerProvider import org.dhis2.data.schedulers.TrampolineSchedulerProvider import org.dhis2.data.server.UserManager -import org.dhis2.data.service.METADATA_MESSAGE -import org.dhis2.data.service.workManager.WorkManagerController +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.model.SyncJobStatus +import org.dhis2.mobile.sync.model.SyncStatus import org.junit.Before import org.junit.Test import org.mockito.Mockito @@ -20,7 +18,6 @@ import org.mockito.kotlin.mock import org.mockito.kotlin.times import org.mockito.kotlin.verify import org.mockito.kotlin.whenever -import java.util.UUID class SyncPresenterTest { lateinit var presenter: SyncPresenter @@ -28,9 +25,10 @@ class SyncPresenterTest { private val userManager: UserManager = Mockito.mock(UserManager::class.java, Mockito.RETURNS_DEEP_STUBS) private val schedulerProvider: SchedulerProvider = TrampolineSchedulerProvider() - private val workManagerController: WorkManagerController = mock() private val preferences: PreferenceProvider = mock() + private val backgroundJobAction: SyncBackgroundJobAction = mock() + @Before fun setUp() { presenter = @@ -38,7 +36,7 @@ class SyncPresenterTest { view, userManager, schedulerProvider, - workManagerController, + backgroundJobAction, preferences, ) } @@ -46,35 +44,31 @@ class SyncPresenterTest { @Test fun `Should start initial sync`() { presenter.sync() - verify(workManagerController, times(1)).syncMetaDataForWorker( - Constants.META_NOW, - Constants.INITIAL_SYNC, - ) + verify(backgroundJobAction, times(1)).launchMetadataSync(0) } @Test fun `Should return work info live data`() { presenter.observeSyncProcess() - verify(workManagerController, times(1)) - .getWorkInfosForUniqueWorkLiveData(Constants.INITIAL_SYNC) + verify(backgroundJobAction, times(1)).observeMetadataJob() } @Test fun `Should set metadata sync started`() { - presenter.handleSyncInfo(arrayListOf(metaWorkInfo(WorkInfo.State.RUNNING))) + presenter.handleSyncInfo(arrayListOf(metaSyncJobStatus(SyncStatus.Running))) verify(view, times(1)).setMetadataSyncStarted() } @Test fun `Should set metadata sync succeeded`() { - presenter.handleSyncInfo(arrayListOf(metaWorkInfo(WorkInfo.State.SUCCEEDED))) + presenter.handleSyncInfo(arrayListOf(metaSyncJobStatus(SyncStatus.Succeed))) verify(view, times(1)).setMetadataSyncSucceed() } @Test fun `Should show metadata sync error message`() { val message = "Error message" - presenter.handleSyncInfo(arrayListOf(metaWorkInfo(WorkInfo.State.FAILED, message))) + presenter.handleSyncInfo(arrayListOf(metaSyncJobStatus(SyncStatus.Failed, message))) verify(view, times(1)).showMetadataFailedMessage(message) } @@ -97,17 +91,12 @@ class SyncPresenterTest { verify(view, times(1)).goToLogin() } - private fun metaWorkInfo( - state: WorkInfo.State, + private fun metaSyncJobStatus( + state: SyncStatus, message: String? = null, - ): WorkInfo = - WorkInfo( - id = UUID.randomUUID(), - state = state, - outputData = Data.Builder().apply { putString(METADATA_MESSAGE, message) }.build(), - tags = setOf(Constants.META_NOW), - progress = Data.EMPTY, - runAttemptCount = 0, - generation = 0, - ) + ) = SyncJobStatus( + status = state, + message = message, + tags = listOf("METADATA_SYNC_NOW"), + ) } diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/DashboardRepositoryImplTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/DashboardRepositoryImplTest.kt index 1b84c6c4d7c..a096d5881eb 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/DashboardRepositoryImplTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/DashboardRepositoryImplTest.kt @@ -116,6 +116,7 @@ class DashboardRepositoryImplTest { .uid("enrollment_1") .deleted(true) .trackedEntityInstance(teiUid) + .attributeOptionCombo("attributeOptionComboUid") .build() val enrollment2 = getMockingEnrollment() @@ -602,6 +603,7 @@ class DashboardRepositoryImplTest { Enrollment .builder() .uid("enrollmentUid") + .attributeOptionCombo("attributeOptionComboUid") .build() private fun getMockSingleEvent(): Event = diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/DashboardViewModelTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/DashboardViewModelTest.kt index 64b033011ec..15fafeeb496 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/DashboardViewModelTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/DashboardViewModelTest.kt @@ -6,6 +6,7 @@ import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.setMain import org.dhis2.commons.resources.ResourceManager import org.dhis2.commons.viewmodel.DispatcherProvider @@ -13,11 +14,10 @@ import org.dhis2.utils.analytics.ACTIVE_FOLLOW_UP import org.dhis2.utils.analytics.AnalyticsHelper import org.dhis2.utils.analytics.FOLLOW_UP import org.dhis2.utils.customviews.navigationbar.NavigationPageConfigurator -import org.dhis2.tracker.TEIDashboardItems import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.enrollment.EnrollmentStatus -import org.junit.Assert.assertEquals +import org.junit.After import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Rule @@ -38,11 +38,15 @@ class DashboardViewModelTest { private val pageConfigurator: NavigationPageConfigurator = mock() private val resoourcesManager: ResourceManager = mock() + @After + fun tearDown() { + Dispatchers.resetMain() + } + @OptIn(ExperimentalCoroutinesApi::class) @Before fun setUp() { Dispatchers.setMain(testingDispatcher) - whenever(resoourcesManager.getString(any<Int>())) doReturn "" } @Test @@ -104,72 +108,6 @@ class DashboardViewModelTest { } } - @Test - fun shouldDisplayOnlyHistoryUntilLandscapeHistoryFullscreenIsForced() { - mockEnrollmentModel() - mockGrouping(false) - whenever(pageConfigurator.displayDetails()) doReturn false - whenever(pageConfigurator.displayAnalytics()) doReturn false - whenever(pageConfigurator.displayTableView()) doReturn true - - val dashboardViewModel = getViewModel() - - assertEquals( - listOf(TEIDashboardItems.SIMPRINTS_RAMP_HISTORY_TABLE), - dashboardViewModel.navigationItemIds(), - ) - assertEquals( - TEIDashboardItems.SIMPRINTS_RAMP_HISTORY_TABLE, - dashboardViewModel.navigationBarUIState.value.selectedItem, - ) - - dashboardViewModel.onNavigationItemSelected(TEIDashboardItems.SIMPRINTS_RAMP_HISTORY_TABLE) - - assertEquals( - listOf(TEIDashboardItems.SIMPRINTS_RAMP_HISTORY_TABLE), - dashboardViewModel.navigationItemIds(), - ) - - dashboardViewModel.setForceDisplayDetailsNavigationItemForSimprintsRampTable(true) - - assertEquals( - listOf( - TEIDashboardItems.DETAILS, - TEIDashboardItems.SIMPRINTS_RAMP_HISTORY_TABLE, - ), - dashboardViewModel.navigationItemIds(), - ) - assertEquals( - TEIDashboardItems.SIMPRINTS_RAMP_HISTORY_TABLE, - dashboardViewModel.navigationBarUIState.value.selectedItem, - ) - - dashboardViewModel.setForceDisplayDetailsNavigationItemForSimprintsRampTable(false) - - assertEquals( - listOf(TEIDashboardItems.SIMPRINTS_RAMP_HISTORY_TABLE), - dashboardViewModel.navigationItemIds(), - ) - assertEquals( - TEIDashboardItems.SIMPRINTS_RAMP_HISTORY_TABLE, - dashboardViewModel.navigationBarUIState.value.selectedItem, - ) - } - - @Test - fun shouldKeepDetailsVisibleInPortrait() { - mockEnrollmentModel() - mockGrouping(false) - whenever(pageConfigurator.displayDetails()) doReturn true - whenever(pageConfigurator.displayTableView()) doReturn true - - val dashboardViewModel = getViewModel() - - assertTrue(dashboardViewModel.navigationItemIds().contains(TEIDashboardItems.DETAILS)) - dashboardViewModel.onNavigationItemSelected(TEIDashboardItems.SIMPRINTS_RAMP_HISTORY_TABLE) - assertTrue(dashboardViewModel.navigationItemIds().contains(TEIDashboardItems.DETAILS)) - } - @Test fun shouldSetFollowUpOnEnrollment() { mockEnrollmentModel() @@ -237,9 +175,6 @@ class DashboardViewModelTest { testingDispatcher.scheduler.advanceUntilIdle() } - private fun DashboardViewModel.navigationItemIds(): List<TEIDashboardItems> = - navigationBarUIState.value.items.map { it.id } - private fun mockEnrollmentModel() { whenever(repository.getDashboardModel()) doReturn mockedEnrollmentModel whenever(mockedEnrollmentModel.currentEnrollment) doReturn mockedEnrollment diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiAttributesProviderTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiAttributesProviderTest.kt index 68e2e2c7c8a..be022f1f663 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiAttributesProviderTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiAttributesProviderTest.kt @@ -267,7 +267,13 @@ class TeiAttributesProviderTest { .byTrackedEntityTypeUid() .eq(teType) .blockingGet()[0], - ) doReturn Program.builder().uid(program).build() + ) doReturn + Program + .builder() + .uid(program) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) + .build() whenever(d2.programModule().programTrackedEntityAttributes()) doReturn mock() whenever(d2.programModule().programTrackedEntityAttributes().byProgram()) doReturn mock() diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiDashboardPageConfiguratorTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiDashboardPageConfiguratorTest.kt index 3182d09d7fe..6ca5598b905 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiDashboardPageConfiguratorTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiDashboardPageConfiguratorTest.kt @@ -1,7 +1,6 @@ package org.dhis2.usescases.teiDashboard import org.dhis2.utils.customviews.navigationbar.NavigationPageConfigurator -import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Test import org.mockito.kotlin.doReturn @@ -19,26 +18,6 @@ class TeiDashboardPageConfiguratorTest { assertTrue(pageConfigurator.displayDetails()) } - @Test - fun `Should display analytics screen if the program is configured and Simprints RAMP history screen is not configured`() { - whenever(dashboardRepository.programHasAnalytics()) doReturn true - whenever(dashboardRepository.programHasSimprintsRampProgramStageHistoryTable()) doReturn false - assertTrue(pageConfigurator.displayAnalytics()) - } - - @Test - fun `Should not display analytics screen if the program is configured`() { - whenever(dashboardRepository.programHasAnalytics()) doReturn false - assertTrue(!pageConfigurator.displayAnalytics()) - } - - @Test - fun `Should not display analytics screen if Simprints RAMP history screen is configured`() { - whenever(dashboardRepository.programHasAnalytics()) doReturn true - whenever(dashboardRepository.programHasSimprintsRampProgramStageHistoryTable()) doReturn true - assertFalse(pageConfigurator.displayAnalytics()) - } - @Test fun `Should display relationships screen if the program is configured`() { whenever(dashboardRepository.programHasRelationships()) doReturn true @@ -52,26 +31,7 @@ class TeiDashboardPageConfiguratorTest { } @Test - fun `Should display notes screen when history screen is not configured`() { - whenever(dashboardRepository.programHasSimprintsRampProgramStageHistoryTable()) doReturn false + fun `Should display the notes screen`() { assertTrue(pageConfigurator.displayNotes()) } - - @Test - fun `Should not display notes screen when history screen is configured`() { - whenever(dashboardRepository.programHasSimprintsRampProgramStageHistoryTable()) doReturn true - assertFalse(pageConfigurator.displayNotes()) - } - - @Test - fun `Should display history screen if the program is configured`() { - whenever(dashboardRepository.programHasSimprintsRampProgramStageHistoryTable()) doReturn true - assertTrue(pageConfigurator.displayTableView()) - } - - @Test - fun `Should not display history screen if the program is not configured`() { - whenever(dashboardRepository.programHasSimprintsRampProgramStageHistoryTable()) doReturn false - assertTrue(!pageConfigurator.displayTableView()) - } } diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiDashboardPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiDashboardPresenterTest.kt index f727dbf0576..ed5c643f437 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiDashboardPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/TeiDashboardPresenterTest.kt @@ -12,6 +12,7 @@ import org.dhis2.mobile.commons.model.MetadataIconData import org.dhis2.utils.analytics.AnalyticsHelper import org.dhis2.utils.analytics.CLICK import org.dhis2.utils.analytics.DELETE_TEI +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.enrollment.EnrollmentStatus import org.hisp.dhis.android.core.organisationunit.OrganisationUnit @@ -65,9 +66,20 @@ class TeiDashboardPresenterTest { @Test fun `Should set program and restore adapter`() { val programUid = "programUid" - val program = Program.builder().uid(programUid).build() + val program = + Program + .builder() + .uid(programUid) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) + .build() val trackedEntityInstance = TrackedEntityInstance.builder().uid(teiUid).build() - val enrollment = Enrollment.builder().uid("enrollmentUid").build() + val enrollment = + Enrollment + .builder() + .uid("enrollmentUid") + .attributeOptionCombo("attributeOptionComboUid") + .build() val programStages = listOf(ProgramStage.builder().uid("programStageUid").build()) val trackedEntityAttributes = listOf( @@ -81,7 +93,12 @@ class TeiDashboardPresenterTest { val programs = listOf( Pair( - Program.builder().uid(programUid).build(), + Program + .builder() + .uid(programUid) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) + .build(), MetadataIconData.defaultIcon(), ), ) diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/data/TeiDataPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/data/TeiDataPresenterTest.kt index 7d4574c7d0f..2fe28392f1a 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/data/TeiDataPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/data/TeiDataPresenterTest.kt @@ -78,6 +78,7 @@ class TeiDataPresenterTest { private val dispatcherProvider: DispatcherProvider = mock { on { io() } doReturn Dispatchers.Unconfined + on { ui() } doReturn Dispatchers.Unconfined } private val createEventUseCase: CreateEventUseCase = mock() private val d2ErrorUtils: D2ErrorUtils = mock() @@ -399,6 +400,103 @@ class TeiDataPresenterTest { verify(teiDataContractHandler).createEvent(any()) } + @Test + fun `should use enrollment org unit when owner org unit is null`() = + runBlocking { + val enrollmentOrgUnitUid = "enrollmentOrgUnit" + val programStageUid = "programStageUid" + val eventUid = "eventUid" + val programStage = ProgramStage.builder().uid(programStageUid).build() + + val mockedEnrollment: Enrollment = + mock { + on { organisationUnit() } doReturn enrollmentOrgUnitUid + } + whenever(d2.enrollment(enrollmentUid)) doReturn mockedEnrollment + whenever(teiDataRepository.ownerOrgUnit(teiUid)) doReturn null + whenever( + createEventUseCase.invoke( + programUid, + enrollmentOrgUnitUid, + programStageUid, + enrollmentUid, + ), + ) doReturn Result.success(eventUid) + + teiDataPresenter.onAddNewEventOptionSelected( + eventCreationType = EventCreationType.ADDNEW, + stage = programStage, + ) + + verify(createEventUseCase).invoke(programUid, enrollmentOrgUnitUid, programStageUid, enrollmentUid) + verify(view).goToEventDetails(eventUid, EventMode.NEW, programUid) + } + + @Test + fun `should use owner org unit when it is the same as enrollment org unit`() = + runBlocking { + val orgUnitUid = "enrollmentOrgUnit" + val programStageUid = "programStageUid" + val eventUid = "eventUid" + val programStage = ProgramStage.builder().uid(programStageUid).build() + + val mockedEnrollment: Enrollment = + mock { + on { organisationUnit() } doReturn orgUnitUid + } + whenever(d2.enrollment(enrollmentUid)) doReturn mockedEnrollment + whenever(teiDataRepository.ownerOrgUnit(teiUid)) doReturn orgUnitUid + whenever( + createEventUseCase.invoke( + programUid, + orgUnitUid, + programStageUid, + enrollmentUid, + ), + ) doReturn Result.success(eventUid) + + teiDataPresenter.onAddNewEventOptionSelected( + eventCreationType = EventCreationType.ADDNEW, + stage = programStage, + ) + + verify(createEventUseCase).invoke(programUid, orgUnitUid, programStageUid, enrollmentUid) + verify(view).goToEventDetails(eventUid, EventMode.NEW, programUid) + } + + @Test + fun `should use owner org unit when it is different from enrollment org unit`() = + runBlocking { + val enrollmentOrgUnitUid = "enrollmentOrgUnit" + val ownerOrgUnitUid = "ownerOrgUnit" + val programStageUid = "programStageUid" + val eventUid = "eventUid" + val programStage = ProgramStage.builder().uid(programStageUid).build() + + val mockedEnrollment: Enrollment = + mock { + on { organisationUnit() } doReturn enrollmentOrgUnitUid + } + whenever(d2.enrollment(enrollmentUid)) doReturn mockedEnrollment + whenever(teiDataRepository.ownerOrgUnit(teiUid)) doReturn ownerOrgUnitUid + whenever( + createEventUseCase.invoke( + programUid, + ownerOrgUnitUid, + programStageUid, + enrollmentUid, + ), + ) doReturn Result.success(eventUid) + + teiDataPresenter.onAddNewEventOptionSelected( + eventCreationType = EventCreationType.ADDNEW, + stage = programStage, + ) + + verify(createEventUseCase).invoke(programUid, ownerOrgUnitUid, programStageUid, enrollmentUid) + verify(view).goToEventDetails(eventUid, EventMode.NEW, programUid) + } + private fun fakeModel( eventCount: Int = 0, type: EventViewModelType = EventViewModelType.STAGE, diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/BaseIndicatorRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/BaseIndicatorRepositoryTest.kt new file mode 100644 index 00000000000..4fef338aebb --- /dev/null +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/BaseIndicatorRepositoryTest.kt @@ -0,0 +1,19 @@ +package org.dhis2.usescases.teiDashboard.dashboardfragments.indicators + +import org.dhis2.usescases.teiDashboard.dashboardfragments.indicators.BaseIndicatorRepository.Companion.getNumberValue +import org.junit.Test + +class BaseIndicatorRepositoryTest { + + @Test + fun `Should parse number value`() { + assert(getNumberValue("54") == 54.0) + assert(getNumberValue("54.3") == 54.3) + assert(getNumberValue("-12.2") == -12.2) + assert(getNumberValue("23456.6") == 23456.6) + assert(getNumberValue("23,456.6") == 23456.6) + assert(getNumberValue("54.1%") == 54.1) + assert(getNumberValue("54.1 %") == 54.1) + assert(getNumberValue("<14322>") == 14322.0) + } +} diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/EventIndicatorRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/EventIndicatorRepositoryTest.kt index 6ef547a9758..3a0ecc6f7b2 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/EventIndicatorRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/EventIndicatorRepositoryTest.kt @@ -2,6 +2,7 @@ package org.dhis2.usescases.teiDashboard.dashboardfragments.indicators import dhis2.org.analytics.charts.ui.SectionTitle import io.reactivex.Single +import kotlinx.coroutines.test.runTest import org.dhis2.commons.resources.ResourceManager import org.dhis2.mobileProgramRules.RuleEngineHelper import org.hisp.dhis.android.core.D2 @@ -11,6 +12,7 @@ import org.hisp.dhis.android.core.program.ProgramRuleAction import org.hisp.dhis.android.core.program.ProgramRuleActionType import org.hisp.dhis.rules.models.RuleAction import org.hisp.dhis.rules.models.RuleEffect +import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import org.mockito.Mockito @@ -70,7 +72,12 @@ class EventIndicatorRepositoryTest { .eq("programUid") .one() .blockingGet(), - ) doReturn Enrollment.builder().uid("enrollmentUid").build() + ) doReturn + Enrollment + .builder() + .uid("enrollmentUid") + .attributeOptionCombo("attributeOptionComboUid") + .build() whenever( resourceManager.sectionIndicators(), ) doReturn "Indicators" @@ -91,7 +98,7 @@ class EventIndicatorRepositoryTest { } @Test - fun `Should fetch analytic data for tracker`() { + fun `Should fetch analytic data for tracker`() = runTest { whenever( d2 .programModule() @@ -213,15 +220,14 @@ class EventIndicatorRepositoryTest { ruleEngineHelper.evaluate(), ) doReturn mockedEffects() - val testObserver = repository.fetchData().test() - testObserver.assertNoErrors() - testObserver.assertValue { - it.size == 5 && - it[0] is SectionTitle && - (it[0] as SectionTitle).title == "Feedback" && - it[2] is SectionTitle && - (it[2] as SectionTitle).title == "Indicators" - } + val result = repository.fetchData() + assertTrue( + result.size == 5 && + result[0] is SectionTitle && + (result[0] as SectionTitle).title == "Feedback" && + result[2] is SectionTitle && + (result[2] as SectionTitle).title == "Indicators", + ) } private fun mockedProgramIndicatorList(): List<ProgramIndicator> = diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorsPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorsPresenterTest.kt index 2e1298fadae..041236c9eb9 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorsPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/IndicatorsPresenterTest.kt @@ -3,11 +3,15 @@ package org.dhis2.usescases.teiDashboard.dashboardfragments.indicators import dhis2.org.analytics.charts.ui.AnalyticsModel import dhis2.org.analytics.charts.ui.IndicatorModel import dhis2.org.analytics.charts.ui.LOCATION_INDICATOR_WIDGET -import io.reactivex.Flowable -import org.dhis2.commons.schedulers.SchedulerProvider -import org.dhis2.data.schedulers.TrampolineSchedulerProvider +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.resetMain +import kotlinx.coroutines.test.setMain +import org.dhis2.commons.viewmodel.DispatcherProvider import org.hisp.dhis.android.core.program.ProgramIndicator -import org.junit.Assert +import org.junit.After import org.junit.Before import org.junit.Test import org.mockito.kotlin.any @@ -16,33 +20,43 @@ import org.mockito.kotlin.mock import org.mockito.kotlin.verify import org.mockito.kotlin.whenever +@OptIn(ExperimentalCoroutinesApi::class) class IndicatorsPresenterTest { - private val schedulers: SchedulerProvider = TrampolineSchedulerProvider() + private val testDispatcher = StandardTestDispatcher() + private val dispatcherProvider: DispatcherProvider = mock { + on { io() } doReturn testDispatcher + on { ui() } doReturn testDispatcher + } private val view: IndicatorsView = mock() private val indicatorRepository: IndicatorRepository = mock() private lateinit var presenter: IndicatorsPresenter @Before fun setUp() { - presenter = IndicatorsPresenter(schedulers, view, indicatorRepository) + Dispatchers.setMain(testDispatcher) + presenter = IndicatorsPresenter(dispatcherProvider, view, indicatorRepository) + } + + @After + fun tearDown() { + Dispatchers.resetMain() } @Test fun `Should get indicators`() { - whenever( - indicatorRepository.fetchData(), - ) doReturn Flowable.just(analyticsModels()) + runBlocking { + whenever(indicatorRepository.fetchData()) doReturn analyticsModels() + } presenter.init() + testDispatcher.scheduler.advanceUntilIdle() verify(view).swapAnalytics(any()) } @Test - fun `Should clear disposables`() { + fun `Should clear scope on detach`() { presenter.onDettach() - - Assert.assertTrue(presenter.compositeDisposable.size() == 0) } @Test diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/TrackerAnalyticsRepositoryTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/TrackerAnalyticsRepositoryTest.kt index a9ae3d0ccb1..d2ab6d2e6b9 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/TrackerAnalyticsRepositoryTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/indicators/TrackerAnalyticsRepositoryTest.kt @@ -4,6 +4,7 @@ import dhis2.org.analytics.charts.Charts import dhis2.org.analytics.charts.data.Graph import dhis2.org.analytics.charts.ui.SectionTitle import io.reactivex.Single +import kotlinx.coroutines.test.runTest import org.dhis2.commons.resources.ResourceManager import org.dhis2.mobileProgramRules.RuleEngineHelper import org.hisp.dhis.android.core.D2 @@ -15,6 +16,7 @@ import org.hisp.dhis.android.core.program.ProgramRuleAction import org.hisp.dhis.android.core.program.ProgramRuleActionType import org.hisp.dhis.rules.models.RuleAction import org.hisp.dhis.rules.models.RuleEffect +import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import org.mockito.Mockito @@ -76,7 +78,12 @@ class TrackerAnalyticsRepositoryTest { .eq("programUid") .one() .blockingGet(), - ) doReturn Enrollment.builder().uid("enrollmentUid").build() + ) doReturn + Enrollment + .builder() + .uid("enrollmentUid") + .attributeOptionCombo("attributeOptionComboUid") + .build() whenever( resourceManager.sectionCharts(), ) doReturn "Charts" @@ -104,7 +111,7 @@ class TrackerAnalyticsRepositoryTest { } @Test - fun `Should fetch analytic data for tracker`() { + fun `Should fetch analytic data for tracker`() = runTest { whenever( d2 .programModule() @@ -230,19 +237,18 @@ class TrackerAnalyticsRepositoryTest { charts.geEnrollmentCharts(any()), ) doReturn mockedCharts() - val testObserver = repository.fetchData().test() - testObserver.assertNoErrors() - testObserver.assertValue { - it.size == 7 && - it[0] is SectionTitle && - (it[0] as SectionTitle).title == "Feedback" && - it[2] is SectionTitle && - (it[2] as SectionTitle).title == "Charts and indicators" - } + val result = repository.fetchData() + assertTrue( + result.size == 7 && + result[0] is SectionTitle && + (result[0] as SectionTitle).title == "Feedback" && + result[2] is SectionTitle && + (result[2] as SectionTitle).title == "Charts and indicators", + ) } @Test - fun `Should fetch analytic data for tracker with only indicator section`() { + fun `Should fetch analytic data for tracker with only indicator section`() = runTest { whenever( d2 .programModule() @@ -368,15 +374,14 @@ class TrackerAnalyticsRepositoryTest { charts.geEnrollmentCharts(any()), ) doReturn emptyList() - val testObserver = repository.fetchData().test() - testObserver.assertNoErrors() - testObserver.assertValue { - it[0] is SectionTitle && (it[0] as SectionTitle).title == "Indicators" - } + val result = repository.fetchData() + assertTrue( + result[0] is SectionTitle && (result[0] as SectionTitle).title == "Indicators", + ) } @Test - fun `Should fetch analytic data for tracker with only charts section`() { + fun `Should fetch analytic data for tracker with only charts section`() = runTest { whenever( d2 .programModule() @@ -503,11 +508,10 @@ class TrackerAnalyticsRepositoryTest { charts.geEnrollmentCharts(any()), ) doReturn mockedCharts() - val testObserver = repository.fetchData().test() - testObserver.assertNoErrors() - testObserver.assertValue { - it[0] is SectionTitle && (it[0] as SectionTitle).title == "Charts" - } + val result = repository.fetchData() + assertTrue( + result[0] is SectionTitle && (result[0] as SectionTitle).title == "Charts", + ) } private fun mockedProgramIndicatorList(): List<ProgramIndicator> = diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/relationships/RelationshipPresenterTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/relationships/RelationshipPresenterTest.kt index bbc4d713712..36fb4159bd1 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/relationships/RelationshipPresenterTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/dashboardfragments/relationships/RelationshipPresenterTest.kt @@ -245,6 +245,7 @@ class RelationshipPresenterTest { Enrollment .builder() .uid("enrollmentUid") + .attributeOptionCombo("attributeOptionComboUid") .build(), ) diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/dialogs/scheduling/SchedulingViewModelTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/dialogs/scheduling/SchedulingViewModelTest.kt index 7ad7accf8d9..9909ea134db 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/dialogs/scheduling/SchedulingViewModelTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/dialogs/scheduling/SchedulingViewModelTest.kt @@ -3,81 +3,57 @@ package org.dhis2.usescases.teiDashboard.dialogs.scheduling import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.setMain -import org.dhis2.commons.bindings.enrollment -import org.dhis2.commons.bindings.programStage import org.dhis2.commons.data.EventCreationType import org.dhis2.commons.viewmodel.DispatcherProvider import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.arch.helpers.DateUtils -import org.hisp.dhis.android.core.arch.repositories.`object`.ReadOnlyOneObjectRepositoryFinalImpl import org.hisp.dhis.android.core.enrollment.Enrollment -import org.hisp.dhis.android.core.enrollment.EnrollmentCollectionRepository -import org.hisp.dhis.android.core.enrollment.EnrollmentModule -import org.hisp.dhis.android.core.enrollment.EnrollmentObjectRepository -import org.hisp.dhis.android.core.period.PeriodModule -import org.hisp.dhis.android.core.program.ProgramModule +import org.hisp.dhis.android.core.event.EventCollectionRepository +import org.hisp.dhis.android.core.program.ProgramCollectionRepository import org.hisp.dhis.android.core.program.ProgramStage -import org.hisp.dhis.android.core.program.ProgramStageCollectionRepository +import org.junit.After import org.junit.Before import org.junit.Test -import org.mockito.Mockito.spy +import org.mockito.Mockito import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever @OptIn(ExperimentalCoroutinesApi::class) class SchedulingViewModelTest { private lateinit var schedulingViewModel: SchedulingViewModel - private val testingDispatcher = UnconfinedTestDispatcher() + private val testingDispatcher = StandardTestDispatcher() - private val enrollment = Enrollment.builder().uid(ENROLLMENT_UID).build() - private val programStage = ProgramStage.builder().uid(STAGE).build() + private val enrollment = + Enrollment + .builder() + .uid(ENROLLMENT_UID) + .attributeOptionCombo("attributeOptionComboUid") + .build() - private val enrollmentObjectRepository: EnrollmentObjectRepository = - mock { - on { blockingGet() } doReturn enrollment - } - private val enrollmentCollectionRepository: EnrollmentCollectionRepository = - mock { - on { uid(ENROLLMENT_UID) } doReturn enrollmentObjectRepository - } - private val enrollmentModule: EnrollmentModule = - mock { - on { enrollments() } doReturn enrollmentCollectionRepository - } + private val d2: D2 = Mockito.mock(D2::class.java, Mockito.RETURNS_DEEP_STUBS) - private val readOnlyOneObjectRepositoryFinalImpl: ReadOnlyOneObjectRepositoryFinalImpl<ProgramStage> = - mock { - on { blockingGet() } doReturn programStage - } - private val programStageCollectionRepository: ProgramStageCollectionRepository = - mock { - on { uid(STAGE) } doReturn readOnlyOneObjectRepositoryFinalImpl - } - private val programModule: ProgramModule = - mock { - on { programStages() } doReturn programStageCollectionRepository - } - - private val periodModule: PeriodModule = - mock { - on { periodHelper() } doReturn mock() - } - - private val d2: D2 = - mock { - on { enrollmentModule() } doReturn enrollmentModule - on { programModule() } doReturn programModule - on { periodModule() } doReturn periodModule - } + @After + fun tearDown() { + Dispatchers.resetMain() + } @OptIn(ExperimentalCoroutinesApi::class) @Before fun setUp() { Dispatchers.setMain(testingDispatcher) + whenever(d2.enrollmentModule().enrollments().uid(ENROLLMENT_UID).blockingGet()) doReturn enrollment + whenever(d2.programModule().programStages().uid(STAGE).blockingGet()) doReturn + ProgramStage.builder().uid(STAGE).build() + whenever(d2.eventModule().events()) doReturn + Mockito.mock(EventCollectionRepository::class.java, Mockito.RETURNS_DEEP_STUBS) + whenever(d2.programModule().programs()) doReturn + Mockito.mock(ProgramCollectionRepository::class.java, Mockito.RETURNS_DEEP_STUBS) schedulingViewModel = SchedulingViewModel( d2 = d2, @@ -108,7 +84,7 @@ class SchedulingViewModelTest { @Test fun shouldSetReportDate() { val date = DateUtils.DATE_FORMAT.parse(REPORT_DATE) - val spy = spy(schedulingViewModel) + val spy = Mockito.spy(schedulingViewModel) spy.onDateSet(2024, 4, 14) verify(spy).setUpEventReportDate(date) } @@ -116,7 +92,7 @@ class SchedulingViewModelTest { @Test fun shouldSetReportDateForIncreasedNumberOfMonth() { val date = DateUtils.DATE_FORMAT.parse(REPORT_DATE_INCREASED_MONTH) - val spy = spy(schedulingViewModel) + val spy = Mockito.spy(schedulingViewModel) spy.onDateSet(2024, 13, 31) verify(spy).setUpEventReportDate(date) } diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListRepositoryImplTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListRepositoryImplTest.kt index c10529a1bd4..ec2de96bd51 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListRepositoryImplTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/teiProgramList/TeiProgramListRepositoryImplTest.kt @@ -5,6 +5,7 @@ import org.dhis2.commons.date.DateUtils import org.dhis2.commons.resources.MetadataIconProvider import org.dhis2.usescases.main.program.ProgramViewModelMapper import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.enrollment.EnrollmentCreateProjection import org.hisp.dhis.android.core.program.Program @@ -61,6 +62,8 @@ class TeiProgramListRepositoryImplTest { .builder() .uid("programUid") .displayIncidentDate(true) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() whenever( @@ -73,6 +76,7 @@ class TeiProgramListRepositoryImplTest { Enrollment .builder() .uid("enrollmentUid") + .attributeOptionCombo("attributeOptionComboUid") .build() val testObservable = @@ -125,6 +129,8 @@ class TeiProgramListRepositoryImplTest { .builder() .uid("programUid") .displayIncidentDate(false) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build() whenever( @@ -137,6 +143,7 @@ class TeiProgramListRepositoryImplTest { Enrollment .builder() .uid("enrollmentUid") + .attributeOptionCombo("attributeOptionComboUid") .build() val testObservable = diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/InfoBarMapperTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/InfoBarMapperTest.kt index b9224df9966..b52bee833c6 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/InfoBarMapperTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/InfoBarMapperTest.kt @@ -5,6 +5,7 @@ import org.dhis2.commons.resources.ResourceManager import org.dhis2.mobile.commons.model.MetadataIconData import org.dhis2.usescases.teiDashboard.DashboardEnrollmentModel import org.dhis2.usescases.teiDashboard.ui.model.InfoBarType +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.enrollment.EnrollmentStatus @@ -164,6 +165,7 @@ class InfoBarMapperTest { .status(status) .followUp(followup) .program("Program1Uid") + .attributeOptionCombo("attributeOptionComboUid") .build() private fun setPrograms() = @@ -173,6 +175,8 @@ class InfoBarMapperTest { .builder() .uid("Program1Uid") .displayName("Program 1") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), MetadataIconData.defaultIcon(), ), @@ -181,6 +185,8 @@ class InfoBarMapperTest { .builder() .uid("Program2Uid") .displayName("Program 2") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), MetadataIconData.defaultIcon(), ), diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/QuickActionsMapperTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/QuickActionsMapperTest.kt index af590ae0550..2343906cd72 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/QuickActionsMapperTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/QuickActionsMapperTest.kt @@ -117,6 +117,7 @@ class QuickActionsMapperTest { .status(status) .followUp(followup) .program("Program1Uid") + .attributeOptionCombo("attributeOptionComboUid") .build() val tei = TrackedEntityInstance diff --git a/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/TEIDetailMapperTest.kt b/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/TEIDetailMapperTest.kt index 93de79a22de..f8c2e9e03d4 100644 --- a/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/TEIDetailMapperTest.kt +++ b/app/src/test/java/org/dhis2/usescases/teiDashboard/ui/mapper/TEIDetailMapperTest.kt @@ -4,6 +4,7 @@ import org.dhis2.R import org.dhis2.commons.resources.ResourceManager import org.dhis2.mobile.commons.model.MetadataIconData import org.dhis2.usescases.teiDashboard.DashboardEnrollmentModel +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.common.State import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.enrollment.EnrollmentStatus @@ -123,6 +124,7 @@ class TEIDetailMapperTest { .status(EnrollmentStatus.COMPLETED) .program("Program1Uid") .organisationUnit("orgUnitUid") + .attributeOptionCombo("attributeOptionComboUid") .build() private fun setPrograms() = @@ -132,6 +134,8 @@ class TEIDetailMapperTest { .builder() .uid("Program1Uid") .displayName("Program 1") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), MetadataIconData.defaultIcon(), ), @@ -140,6 +144,8 @@ class TEIDetailMapperTest { .builder() .uid("Program2Uid") .displayName("Program 2") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) .build(), MetadataIconData.defaultIcon(), ), diff --git a/app/src/test/java/org/dhis2/usescases/tracker/TrackedEntityInstanceInfoProviderTests.kt b/app/src/test/java/org/dhis2/usescases/tracker/TrackedEntityInstanceInfoProviderTests.kt index 20b0453b82e..611d01a1214 100644 --- a/app/src/test/java/org/dhis2/usescases/tracker/TrackedEntityInstanceInfoProviderTests.kt +++ b/app/src/test/java/org/dhis2/usescases/tracker/TrackedEntityInstanceInfoProviderTests.kt @@ -3,11 +3,13 @@ package org.dhis2.usescases.tracker import androidx.compose.ui.graphics.Color import org.dhis2.commons.date.DateLabelProvider import org.dhis2.commons.resources.MetadataIconProvider +import org.dhis2.data.sorting.SearchSortingValueSetter import org.dhis2.mobile.commons.model.AvatarProviderConfiguration import org.dhis2.mobile.commons.model.MetadataIconData import org.dhis2.tracker.data.ProfilePictureProvider import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.common.ObjectStyle +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.program.Program import org.hisp.dhis.android.core.trackedentity.TrackedEntityInstance import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItem @@ -26,6 +28,7 @@ class TrackedEntityInstanceInfoProviderTests { private val d2: D2 = Mockito.mock(D2::class.java, Mockito.RETURNS_DEEP_STUBS) private val profilePictureProvider: ProfilePictureProvider = mock() private val dateLabelProvider: DateLabelProvider = mock() + private val searchSortingValueSetter: SearchSortingValueSetter = mock() private val metadataIconProvider: MetadataIconProvider = mock { on { invoke(any()) } doReturn MetadataIconData.defaultIcon() @@ -39,6 +42,8 @@ class TrackedEntityInstanceInfoProviderTests { profilePictureProvider, dateLabelProvider, metadataIconProvider, + searchSortingValueSetter, + ) } @@ -216,7 +221,12 @@ class TrackedEntityInstanceInfoProviderTests { .build() private fun mockProgram(hasStyle: Boolean = false): Program { - val program = Program.builder().uid("programUid") + val program = + Program + .builder() + .uid("programUid") + .categoryCombo(ObjectWithUid.create("categoryComboUid")) + .enrollmentCategoryCombo(ObjectWithUid.create("categoryComboUid")) if (hasStyle) { program.style( diff --git a/app/src/test/java/org/dhis2/utils/filters/FilterManagerTest.kt b/app/src/test/java/org/dhis2/utils/filters/FilterManagerTest.kt index e9e402e3f18..274245d70b5 100644 --- a/app/src/test/java/org/dhis2/utils/filters/FilterManagerTest.kt +++ b/app/src/test/java/org/dhis2/utils/filters/FilterManagerTest.kt @@ -164,6 +164,7 @@ class FilterManagerTest { fun `Should count filters in total for event working list`() { val workingListScope = EventWorkingListScope( + workingListUid = "uid", stageUid = "uid", eventDate = "23/11/2023", eventStatusList = listOf("status"), @@ -179,6 +180,7 @@ class FilterManagerTest { fun `Should count filters in total for tei working list`() { val workingListScope = TeiWorkingListScope( + workingListUid = "uid", enrollmentStatusList = listOf("status", "status"), enrollmentDate = null, eventStatusList = listOf(), diff --git a/app/src/test/java/org/dhis2/utils/granularsync/GranularSyncPresenterTest.kt b/app/src/test/java/org/dhis2/utils/granularsync/GranularSyncPresenterTest.kt index e1fd0ebf854..65993532019 100644 --- a/app/src/test/java/org/dhis2/utils/granularsync/GranularSyncPresenterTest.kt +++ b/app/src/test/java/org/dhis2/utils/granularsync/GranularSyncPresenterTest.kt @@ -14,13 +14,19 @@ import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.setMain -import org.dhis2.commons.Constants import org.dhis2.commons.sync.ConflictType import org.dhis2.commons.sync.SyncContext import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.data.schedulers.TrampolineSchedulerProvider import org.dhis2.data.service.workManager.WorkManagerController +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction import org.dhis2.usescases.sms.SmsSendingService +import org.dhis2.utils.granularsync.data.GranularSyncRepository +import org.dhis2.utils.granularsync.domain.MissingSyncTargetException +import org.dhis2.utils.granularsync.domain.SyncStatus +import org.dhis2.utils.granularsync.domain.SyncStatusData +import org.dhis2.utils.granularsync.ui.SyncUiState +import org.dhis2.utils.granularsync.ui.SyncUiStateMapper import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.common.State @@ -36,12 +42,16 @@ import org.junit.Test import org.mockito.ArgumentMatchers.anyList import org.mockito.Mockito import org.mockito.kotlin.any +import org.mockito.kotlin.anyOrNull import org.mockito.kotlin.doReturn import org.mockito.kotlin.doThrow import org.mockito.kotlin.mock import org.mockito.kotlin.times import org.mockito.kotlin.verify import org.mockito.kotlin.whenever +import org.koin.core.context.startKoin +import org.koin.core.context.stopKoin +import org.koin.dsl.module import java.util.Date @OptIn(ExperimentalCoroutinesApi::class) @@ -61,16 +71,45 @@ class GranularSyncPresenterTest { } private val workManager = Mockito.mock(WorkManagerController::class.java) private val smsSyncProvider: SMSSyncProvider = mock() + private val mapper: SyncUiStateMapper = mock() private val context: Context = mock() private val syncContext: SyncContext = SyncContext.Global() + private val syncBackgroundJobAction: SyncBackgroundJobAction = mock() @Before fun setUp() { + startKoin { + modules( + module { + single<SyncBackgroundJobAction> { syncBackgroundJobAction } + }, + ) + } Dispatchers.setMain(testingDispatcher) + runBlocking { + whenever(repository.getSyncStatus(anyOrNull())) doReturn + SyncStatusData( + syncState = SyncStatus.SYNCED, + lastSyncDate = null, + content = emptyList(), + targetName = "", + ) + } + whenever(mapper.toUiState(any(), any())) doReturn + SyncUiState( + syncState = SyncStatus.SYNCED, + title = "Title", + lastSyncDate = null, + message = null, + mainActionLabel = null, + secondaryActionLabel = null, + content = emptyList(), + ) } @After fun tearDown() { + stopKoin() Dispatchers.resetMain() } @@ -86,11 +125,19 @@ class GranularSyncPresenterTest { SyncContext.TrackerProgram("test_uid"), workManager, smsSyncProvider, + mapper, ) + val mockedStatusData = + SyncStatusData( + syncState = SyncStatus.ERROR, + lastSyncDate = Date(), + content = emptyList(), + targetName = "test", + ) val mockedState = SyncUiState( - syncState = State.ERROR, + syncState = SyncStatus.ERROR, title = "Title", lastSyncDate = SyncDate(Date()), message = "message", @@ -98,13 +145,53 @@ class GranularSyncPresenterTest { secondaryActionLabel = "action 2", content = emptyList(), ) - whenever(repository.getUiState()) doReturn mockedState + runBlocking { + whenever(repository.getSyncStatus(anyOrNull())) doReturn mockedStatusData + } + whenever(mapper.toUiState(any(), any())) doReturn mockedState presenter.refreshContent() val result = presenter.currentState.value assertEquals(mockedState, result) } + @Test + fun `should map missing target exception to error ui state`() { + val presenter = + GranularSyncPresenter( + d2, + view, + repository, + trampolineSchedulerProvider, + testDispatcher, + SyncContext.TrackerProgram("missing_uid"), + workManager, + smsSyncProvider, + mapper, + ) + + val missingTargetUiState = + SyncUiState( + syncState = SyncStatus.ERROR, + title = "Sync error", + lastSyncDate = null, + message = "missing_uid not found", + mainActionLabel = "Refresh", + secondaryActionLabel = "Not now", + content = emptyList(), + ) + + runBlocking { + whenever(repository.getSyncStatus(anyOrNull())) doThrow + MissingSyncTargetException("missing_uid") + } + whenever(mapper.missingTargetUiState("missing_uid")) doReturn missingTargetUiState + + presenter.refreshContent() + + assertEquals(missingTargetUiState, presenter.currentState.value) + } + @Test fun `should block sms for some conflict types`() { whenever( @@ -139,6 +226,7 @@ class GranularSyncPresenterTest { it, workManager, smsSyncProvider, + mapper, ).canSendSMS() it to enable }.forEach { (syncContext, canSendSMS) -> @@ -167,6 +255,7 @@ class GranularSyncPresenterTest { syncContext, workManager, smsSyncProvider, + mapper, ) val testingMsg = "testingMsg" @@ -195,6 +284,7 @@ class GranularSyncPresenterTest { syncContext, workManager, smsSyncProvider, + mapper, ) presenter.onSmsNotManuallySent(context) @@ -213,6 +303,7 @@ class GranularSyncPresenterTest { syncContext, workManager, smsSyncProvider, + mapper, ) whenever(smsSyncProvider.isPlayServicesEnabled()) doReturn false @@ -247,6 +338,7 @@ class GranularSyncPresenterTest { syncContext, workManager, smsSyncProvider, + mapper, ) whenever(smsSyncProvider.expectsResponseSMS()) doReturn false @@ -255,7 +347,9 @@ class GranularSyncPresenterTest { presenter.onSmsManuallySent(context) { } - verify(repository).getUiState() + runBlocking { + verify(repository).getSyncStatus(anyOrNull()) + } } @Test @@ -270,13 +364,16 @@ class GranularSyncPresenterTest { syncContext, workManager, smsSyncProvider, + mapper, ) whenever(smsSyncProvider.expectsResponseSMS()) doReturn true presenter.onSmsManuallySent(context) { } - verify(repository, times(0)).getUiState() + runBlocking { + verify(repository, times(0)).getSyncStatus(anyOrNull()) + } } @Test @@ -291,6 +388,7 @@ class GranularSyncPresenterTest { syncContext, workManager, smsSyncProvider, + mapper, ) whenever(smsSyncProvider.smsSender) doReturn mock() @@ -298,7 +396,9 @@ class GranularSyncPresenterTest { presenter.onConfirmationMessageStateChanged(true) - verify(repository).getUiState() + runBlocking { + verify(repository).getSyncStatus(anyOrNull()) + } } @Test @@ -313,6 +413,7 @@ class GranularSyncPresenterTest { syncContext, workManager, smsSyncProvider, + mapper, ) whenever(smsSyncProvider.smsSender) doReturn mock() @@ -320,7 +421,9 @@ class GranularSyncPresenterTest { presenter.onConfirmationMessageStateChanged(false) - verify(repository).getUiState() + runBlocking { + verify(repository).getSyncStatus(anyOrNull()) + } } @Test @@ -335,6 +438,7 @@ class GranularSyncPresenterTest { SyncContext.TrackerProgram("programUid"), workManager, smsSyncProvider, + mapper, ) val workInfoList = MutableLiveData<List<WorkInfo>>(emptyList()) @@ -360,6 +464,7 @@ class GranularSyncPresenterTest { SyncContext.TrackerProgramTei("enrollmentUid"), workManager, smsSyncProvider, + mapper, ) val workInfoList = MutableLiveData<List<WorkInfo>>(emptyList()) @@ -385,6 +490,7 @@ class GranularSyncPresenterTest { SyncContext.Event("eventUid"), workManager, smsSyncProvider, + mapper, ) val workInfoList = MutableLiveData<List<WorkInfo>>(emptyList()) @@ -410,6 +516,7 @@ class GranularSyncPresenterTest { SyncContext.DataSet("dataSetUid"), workManager, smsSyncProvider, + mapper, ) val workInfoList = MutableLiveData<List<WorkInfo>>(emptyList()) @@ -440,6 +547,7 @@ class GranularSyncPresenterTest { ), workManager, smsSyncProvider, + mapper, ) val mockedDataSet: DataSet = @@ -503,6 +611,7 @@ class GranularSyncPresenterTest { SyncContext.Global(), workManager, smsSyncProvider, + mapper, ) val workInfoList = MutableLiveData<List<WorkInfo>>(emptyList()) @@ -512,7 +621,6 @@ class GranularSyncPresenterTest { val resultLiveData = presenter.initGranularSync() resultLiveData.observeForever(workInfoObserver) - verify(workManager).syncDataForWorker(Constants.DATA_NOW, Constants.INITIAL_SYNC) verify(workInfoObserver).onChanged(anyList()) } @@ -531,6 +639,7 @@ class GranularSyncPresenterTest { SyncContext.Global(), workManager, smsSyncProvider, + mapper, ) presenter.checkServerAvailability() @@ -553,6 +662,7 @@ class GranularSyncPresenterTest { SyncContext.Global(), workManager, smsSyncProvider, + mapper, ) presenter.checkServerAvailability() diff --git a/app/src/test/java/org/dhis2/utils/granularsync/GranularSyncRepositoryTest.kt b/app/src/test/java/org/dhis2/utils/granularsync/GranularSyncRepositoryTest.kt new file mode 100644 index 00000000000..6776c8c9025 --- /dev/null +++ b/app/src/test/java/org/dhis2/utils/granularsync/GranularSyncRepositoryTest.kt @@ -0,0 +1,124 @@ +package org.dhis2.utils.granularsync + +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.resetMain +import kotlinx.coroutines.test.runTest +import kotlinx.coroutines.test.setMain +import org.dhis2.commons.prefs.PreferenceProvider +import org.dhis2.commons.resources.DhisPeriodUtils +import org.dhis2.commons.resources.ResourceManager +import org.dhis2.commons.sync.SyncContext +import org.dhis2.commons.viewmodel.DispatcherProvider +import org.dhis2.data.dhislogic.DhisProgramUtils +import org.dhis2.utils.granularsync.data.GranularSyncRepository +import org.dhis2.utils.granularsync.domain.MissingSyncTargetException +import org.hisp.dhis.android.core.D2 +import org.junit.After +import org.junit.Assert.assertEquals +import org.junit.Assert.fail +import org.junit.Before +import org.junit.Test +import org.mockito.Mockito +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever + +@OptIn(ExperimentalCoroutinesApi::class) +class GranularSyncRepositoryTest { + private val d2: D2 = Mockito.mock(D2::class.java, Mockito.RETURNS_DEEP_STUBS) + private val preferenceProvider: PreferenceProvider = mock() + private val dhisProgramUtils: DhisProgramUtils = mock() + private val periodUtils: DhisPeriodUtils = mock() + private val resourceManager: ResourceManager = mock() + private val testingDispatcher = UnconfinedTestDispatcher() + private val dispatcherProvider: DispatcherProvider = + mock { + on { io() } doReturn testingDispatcher + } + + @Before + fun setUp() { + Dispatchers.setMain(testingDispatcher) + } + + @After + fun tearDown() { + Dispatchers.resetMain() + } + + @Test + fun `should return error ui state when program is missing`() { + runTest { + whenever(d2.programModule().programs().uid("programUid").blockingGet()) doReturn null + + assertMissingSyncTarget( + syncContext = SyncContext.TrackerProgram("programUid"), + expectedRecordUid = "programUid", + ) + } + } + + @Test + fun `should return error ui state when tei is missing`() { + runTest { + whenever(d2.enrollmentModule().enrollments().uid("enrollmentUid").blockingGet()) doReturn null + whenever(d2.trackedEntityModule().trackedEntityInstances().uid("enrollmentUid").blockingGet()) doReturn null + + assertMissingSyncTarget( + syncContext = SyncContext.TrackerProgramTei("enrollmentUid"), + expectedRecordUid = "enrollmentUid", + ) + } + } + + @Test + fun `should return error ui state when event is missing`() { + runTest { + whenever(d2.eventModule().events().uid("eventUid").blockingGet()) doReturn null + + assertMissingSyncTarget( + syncContext = SyncContext.Event("eventUid"), + expectedRecordUid = "eventUid", + ) + } + } + + @Test + fun `should return error ui state when data set is missing`() { + runTest { + whenever(d2.dataSetModule().dataSets().uid("dataSetUid").blockingGet()) doReturn null + + assertMissingSyncTarget( + syncContext = SyncContext.DataSet("dataSetUid"), + expectedRecordUid = "dataSetUid", + ) + } + } + + private suspend fun assertMissingSyncTarget( + syncContext: SyncContext, + expectedRecordUid: String, + ) { + val repository = repositoryFor(syncContext) + + try { + repository.getSyncStatus() + fail("Expected MissingSyncTargetException") + } catch (exception: MissingSyncTargetException) { + assertEquals(expectedRecordUid, exception.recordUid) + } + } + + private fun repositoryFor(syncContext: SyncContext) = + GranularSyncRepository( + d2 = d2, + syncContext = syncContext, + preferenceProvider = preferenceProvider, + dhisProgramUtils = dhisProgramUtils, + periodUtils = periodUtils, + resourceManager = resourceManager, + dispatcher = dispatcherProvider, + ) +} diff --git a/app/src/test/java/org/dhis2/utils/session/PinPresenterTest.kt b/app/src/test/java/org/dhis2/utils/session/PinPresenterTest.kt deleted file mode 100644 index 09e73782e96..00000000000 --- a/app/src/test/java/org/dhis2/utils/session/PinPresenterTest.kt +++ /dev/null @@ -1,165 +0,0 @@ -package org.dhis2.utils.session - -import org.dhis2.commons.prefs.Preference -import org.dhis2.commons.prefs.PreferenceProvider -import org.hisp.dhis.android.core.D2 -import org.junit.Before -import org.junit.Test -import org.mockito.Mockito -import org.mockito.kotlin.doReturn -import org.mockito.kotlin.mock -import org.mockito.kotlin.times -import org.mockito.kotlin.verify -import org.mockito.kotlin.whenever - -class PinPresenterTest { - lateinit var presenter: PinPresenter - private var pinView: PinView = mock() - private var preferenceProvider: PreferenceProvider = mock() - private val d2: D2 = Mockito.mock(D2::class.java, Mockito.RETURNS_DEEP_STUBS) - - private val onPinCorrect: () -> Unit = mock() - private val onError: () -> Unit = mock() - private val onTwoManyAttempts: () -> Unit = mock() - - @Before - fun setUp() { - presenter = PinPresenter(pinView, preferenceProvider, d2) - } - - @Test - fun `Should return true if pin is correct`() { - val testPin = "testPin" - - whenever(d2.dataStoreModule()) doReturn mock() - whenever(d2.dataStoreModule().localDataStore()) doReturn mock() - whenever( - d2.dataStoreModule().localDataStore().value(Preference.PIN), - ) doReturn mock() - whenever( - d2 - .dataStoreModule() - .localDataStore() - .value(Preference.PIN) - .blockingGet(), - ) doReturn mock() - whenever( - d2 - .dataStoreModule() - .localDataStore() - .value(Preference.PIN) - .blockingGet() - ?.value(), - ) doReturn testPin - - presenter.unlockSession( - testPin, - attempts = 0, - onError = onError, - onPinCorrect = onPinCorrect, - onTwoManyAttempts = onTwoManyAttempts, - ) - - // SESSION_LOCKED stays true (PIN is still configured), no state change - verify(onPinCorrect).invoke() - } - - @Test - fun `Should return false if pin is wrong`() { - val testPin = "testPin" - val wrongPin = "wrongPin" - - whenever(d2.dataStoreModule()) doReturn mock() - whenever(d2.dataStoreModule().localDataStore()) doReturn mock() - whenever( - d2.dataStoreModule().localDataStore().value(Preference.PIN), - ) doReturn mock() - whenever( - d2 - .dataStoreModule() - .localDataStore() - .value(Preference.PIN) - .blockingGet(), - ) doReturn mock() - whenever( - d2 - .dataStoreModule() - .localDataStore() - .value(Preference.PIN) - .blockingGet() - ?.value(), - ) doReturn testPin - - presenter.unlockSession( - wrongPin, - attempts = 0, - onError = onError, - onPinCorrect = onPinCorrect, - onTwoManyAttempts = onTwoManyAttempts, - ) - - verify(onError).invoke() - } - - @Test - fun `Should call onTwoManyAttempts when try 3 times`() { - val testPin = "testPin" - val wrongPin = "wrongPin" - - whenever(d2.dataStoreModule()) doReturn mock() - whenever(d2.dataStoreModule().localDataStore()) doReturn mock() - whenever( - d2.dataStoreModule().localDataStore().value(Preference.PIN), - ) doReturn mock() - whenever( - d2 - .dataStoreModule() - .localDataStore() - .value(Preference.PIN) - .blockingGet(), - ) doReturn mock() - whenever( - d2 - .dataStoreModule() - .localDataStore() - .value(Preference.PIN) - .blockingGet() - ?.value(), - ) doReturn testPin - - presenter.unlockSession( - wrongPin, - attempts = 3, - onError = onError, - onPinCorrect = onPinCorrect, - onTwoManyAttempts = onTwoManyAttempts, - ) - - verify(onTwoManyAttempts).invoke() - } - - @Test - fun `Should save pin and block session`() { - val testPin = "testPin" - - whenever(d2.dataStoreModule()) doReturn mock() - whenever(d2.dataStoreModule().localDataStore()) doReturn mock() - whenever(d2.dataStoreModule().localDataStore().value(Preference.PIN)) doReturn mock() - - presenter.savePin(testPin) - verify(d2.dataStoreModule().localDataStore().value(Preference.PIN)).blockingSet(testPin) - verify(preferenceProvider, times(1)).setValue(Preference.SESSION_LOCKED, true) - } - - @Test - fun `Should clear pin and block session when logout`() { - whenever(d2.dataStoreModule()) doReturn mock() - whenever(d2.dataStoreModule().localDataStore()) doReturn mock() - whenever(d2.dataStoreModule().localDataStore().value(Preference.PIN)) doReturn mock() - - presenter.logOut() - - verify(d2.dataStoreModule().localDataStore().value(Preference.PIN)).blockingDelete() - verify(preferenceProvider, times(1)).setValue(Preference.SESSION_LOCKED, false) - } -} diff --git a/build.gradle.kts b/build.gradle.kts index 7b62571c3c3..a923bc4363b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -18,6 +18,8 @@ plugins { alias(libs.plugins.kotlin.compose.compiler) apply false alias(libs.plugins.ksp) apply false alias(libs.plugins.cyclonedx) + alias(libs.plugins.kotlin.multiplatform) apply false + alias(libs.plugins.android.kotlin.multiplatform.library) apply false } @@ -92,6 +94,8 @@ allprojects { } tasks.withType<AbstractTestTask> { + // ensures test results are not cached between test runs + outputs.upToDateWhen { false } afterSuite( KotlinClosure2({ desc: TestDescriptor, result: TestResult -> if (result.resultType == TestResult.ResultType.FAILURE) { diff --git a/commons/build.gradle.kts b/commons/build.gradle.kts index da9af0110d0..3d207288041 100644 --- a/commons/build.gradle.kts +++ b/commons/build.gradle.kts @@ -2,8 +2,7 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { id("com.android.library") - kotlin("android") - kotlin("kapt") + alias(libs.plugins.legacy.kapt) id("com.google.devtools.ksp") id("kotlin-parcelize") alias(libs.plugins.kotlin.compose.compiler) @@ -61,9 +60,12 @@ kotlin { } } +kapt { + correctErrorTypes = true +} + dependencies { implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) - api(project(":ui-components")) implementation(project(":commonskmm")) api(libs.dhis2.android.sdk) { @@ -81,6 +83,7 @@ dependencies { api(libs.androidx.viewModelKtx) api(libs.androidx.recyclerView) debugApi(libs.androidx.compose.uitooling) + api(libs.androidx.compose.preview) api(libs.androidx.compose.ui) api(libs.androidx.compose.livedata) api(libs.androidx.compose.paging) @@ -103,16 +106,16 @@ dependencies { api(libs.barcodeScanner.zxing.android) { exclude("com.google.zxing", "core") } - testApi(libs.test.junit) - testApi(libs.test.mockitoCore) - testApi(libs.test.mockitoKotlin) - testApi(libs.test.mockitoInline) - androidTestApi(libs.test.mockitoCore) - androidTestApi(libs.test.mockitoKotlin) - androidTestApi(libs.test.dexmaker.mockitoInline) - androidTestApi(libs.test.junit.ext) - androidTestApi(libs.test.espresso) - androidTestApi(libs.test.espresso.idlingresource) + testImplementation(libs.test.junit) + testImplementation(libs.test.mockitoCore) + testImplementation(libs.test.mockitoKotlin) + testImplementation(libs.test.mockitoInline) + androidTestImplementation(libs.test.mockitoCore) + androidTestImplementation(libs.test.mockitoKotlin) + androidTestImplementation(libs.test.dexmaker.mockitoInline) + androidTestImplementation(libs.test.junit.ext) + androidTestImplementation(libs.test.espresso) + androidTestImplementation(libs.test.espresso.idlingresource) api(libs.test.espresso.idlingresource) api(libs.test.espresso.idlingconcurrent) api(libs.analytics.sentry) diff --git a/commons/src/main/java/org/dhis2/commons/bindings/CommonExtensions.kt b/commons/src/main/java/org/dhis2/commons/bindings/CommonExtensions.kt index a5bbdcd6ae5..3bf11e76cb1 100644 --- a/commons/src/main/java/org/dhis2/commons/bindings/CommonExtensions.kt +++ b/commons/src/main/java/org/dhis2/commons/bindings/CommonExtensions.kt @@ -5,7 +5,6 @@ import android.graphics.Color import android.graphics.Outline import android.graphics.PorterDuff import android.graphics.Typeface -import android.os.Build import android.text.method.ScrollingMovementMethod import android.util.TypedValue import android.view.View @@ -116,45 +115,41 @@ val Int.px: Int get() = (this / Resources.getSystem().displayMetrics.density).toInt() fun View.clipWithRoundedCorners(curvedRadio: Int = 16.dp) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - outlineProvider = - object : ViewOutlineProvider() { - override fun getOutline( - view: View, - outline: Outline, - ) { - outline.setRoundRect( - 0, - 0, - view.width, - view.height + curvedRadio, - curvedRadio.toFloat(), - ) - } + outlineProvider = + object : ViewOutlineProvider() { + override fun getOutline( + view: View, + outline: Outline, + ) { + outline.setRoundRect( + 0, + 0, + view.width, + view.height + curvedRadio, + curvedRadio.toFloat(), + ) } - clipToOutline = true - } + } + clipToOutline = true } fun View.clipWithAllRoundedCorners(curvedRadio: Int = 16.dp) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - outlineProvider = - object : ViewOutlineProvider() { - override fun getOutline( - view: View, - outline: Outline, - ) { - outline.setRoundRect( - 0, - 0, - view.width, - view.height, - curvedRadio.toFloat(), - ) - } + outlineProvider = + object : ViewOutlineProvider() { + override fun getOutline( + view: View, + outline: Outline, + ) { + outline.setRoundRect( + 0, + 0, + view.width, + view.height, + curvedRadio.toFloat(), + ) } - clipToOutline = true - } + } + clipToOutline = true } fun HorizontalScrollView.scrollToPosition(viewTag: String) { diff --git a/commons/src/main/java/org/dhis2/commons/bindings/SdkExtensions.kt b/commons/src/main/java/org/dhis2/commons/bindings/SdkExtensions.kt index ee3b541d713..d60e42c8918 100644 --- a/commons/src/main/java/org/dhis2/commons/bindings/SdkExtensions.kt +++ b/commons/src/main/java/org/dhis2/commons/bindings/SdkExtensions.kt @@ -20,8 +20,6 @@ fun D2.programs(): List<Program> = programModule().programs().blockingGet() fun D2.program(programUid: String): Program? = programModule().programs().uid(programUid).blockingGet() -fun D2.observeProgram(programUid: String): Single<Program?> = programModule().programs().uid(programUid).get() - fun D2.isStockProgram(programUid: String): Boolean = useCaseModule() .stockUseCases() @@ -74,12 +72,6 @@ fun D2.tei(teiUid: String) = .uid(teiUid) .blockingGet() -fun D2.observeTei(teiUid: String) = - trackedEntityModule() - .trackedEntityInstances() - .uid(teiUid) - .get() - fun D2.teisBy( programs: List<String>? = null, aggregatedSynStates: List<State>? = null, @@ -92,13 +84,6 @@ fun D2.teisBy( return repository.blockingGet() } -fun D2.teiImportConflicts(teiUid: String): List<TrackerImportConflict> = - importModule() - .trackerImportConflicts() - .byTrackedEntityInstanceUid() - .eq(teiUid) - .blockingGet() - fun D2.teiImportConflictsBy( teiUid: String? = null, enrollmentUid: String? = null, @@ -217,12 +202,6 @@ fun D2.event(uid: String) = .uid(uid) .blockingGet() -fun D2.observeEvent(uid: String) = - eventModule() - .events() - .uid(uid) - .get() - fun D2.eventsBy( programUid: String? = null, enrollmentUid: String? = null, @@ -268,26 +247,6 @@ fun D2.dataSetInstancesBy( return repository.blockingGet() } -fun D2.observeDataSetInstancesBy( - dataSetUid: String? = null, - orgUnitUid: String? = null, - periodId: String? = null, - attrOptionComboUid: String? = null, - states: List<State>? = null, -): Single<List<DataSetInstance>> { - var repository = dataSetModule().dataSetInstances() - repository = dataSetUid?.let { repository.byDataSetUid().eq(dataSetUid) } ?: repository - repository = states?.let { - repository.byState().`in`(states) - } ?: repository - repository = orgUnitUid?.let { repository.byOrganisationUnitUid().eq(orgUnitUid) } ?: repository - repository = periodId?.let { repository.byPeriod().eq(periodId) } ?: repository - repository = attrOptionComboUid?.let { - repository.byAttributeOptionComboUid().eq(attrOptionComboUid) - } ?: repository - return repository.get() -} - fun D2.dataValueConflictsBy(dataSetUid: String): List<DataValueConflict> = dataValueModule() .dataValueConflicts() @@ -311,23 +270,6 @@ fun D2.dataValueConflicts( .eq(attrOptionComboUid) .blockingGet() -fun D2.countDataValueConflicts( - dataSetUid: String, - periodId: String, - orgUnitUid: String, - attrOptionComboUid: String, -): Int = - dataValueModule() - .dataValueConflicts() - .byDataSet(dataSetUid) - .byPeriod() - .eq(periodId) - .byOrganisationUnitUid() - .eq(orgUnitUid) - .byAttributeOptionCombo() - .eq(attrOptionComboUid) - .blockingCount() - fun D2.period(periodId: String) = periodModule() .periods() diff --git a/commons/src/main/java/org/dhis2/commons/bindings/TEICardExtensions.kt b/commons/src/main/java/org/dhis2/commons/bindings/TEICardExtensions.kt index 1e8c74bf814..9b529192065 100644 --- a/commons/src/main/java/org/dhis2/commons/bindings/TEICardExtensions.kt +++ b/commons/src/main/java/org/dhis2/commons/bindings/TEICardExtensions.kt @@ -1,13 +1,5 @@ package org.dhis2.commons.bindings -import android.content.Context -import android.graphics.drawable.GradientDrawable -import android.view.LayoutInflater -import android.view.View -import android.widget.ImageView -import android.widget.LinearLayout -import android.widget.TextView -import androidx.appcompat.content.res.AppCompatResources import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement.Absolute.spacedBy import androidx.compose.foundation.layout.Box @@ -27,18 +19,11 @@ import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp -import androidx.core.content.res.ResourcesCompat -import androidx.core.graphics.toColorInt import org.dhis2.commons.R import org.dhis2.commons.data.EnrollmentIconData -import org.dhis2.commons.databinding.ItemFieldValueBinding -import org.dhis2.commons.date.toUiText import org.dhis2.mobile.commons.extensions.toColor import org.dhis2.mobile.commons.model.MetadataIconData -import org.hisp.dhis.android.core.enrollment.Enrollment -import org.hisp.dhis.android.core.enrollment.EnrollmentStatus import org.hisp.dhis.android.core.program.Program -import org.hisp.dhis.android.core.trackedentity.TrackedEntityAttributeValue import org.hisp.dhis.mobile.ui.designsystem.component.MetadataAvatar import org.hisp.dhis.mobile.ui.designsystem.component.MetadataAvatarSize import org.hisp.dhis.mobile.ui.designsystem.component.MetadataIcon @@ -49,12 +34,6 @@ import java.util.Date const val ENROLLMENT_ICONS_TO_SHOW = 3 const val MAX_NUMBER_REMAINING_ENROLLMENTS = 99 -fun List<Enrollment>.hasFollowUp(): Boolean = - firstOrNull { enrollment -> - enrollment.followUp() == true - }?.let { - it.followUp() == true - } ?: false fun List<Program>.getEnrollmentIconsData( currentProgram: String?, @@ -146,7 +125,7 @@ private fun SquareWithNumber(number: Int) { text = "+$number", color = "#6f6f6f".toColor(), textAlign = TextAlign.Center, - fontFamily = FontFamily(Font(org.dhis2.ui.R.font.rubik_regular)), + fontFamily = FontFamily(Font(R.font.rubik_regular)), ) } } @@ -158,99 +137,3 @@ fun getRemainingEnrollmentsForTei(teiEnrollmentCount: Int): Int = teiEnrollmentCount - ENROLLMENT_ICONS_TO_SHOW } -fun Enrollment.setStatusText( - context: Context, - statusTextView: TextView, - isOverdue: Boolean, - dueDate: Date?, -) { - var textToShow: String? = null - var color = -1 - when { - isOverdue -> { - textToShow = dueDate.toUiText(context) - color = "#E91E63".toColorInt() - } - - status() == EnrollmentStatus.CANCELLED -> { - textToShow = context.getString(R.string.cancelled) - color = "#E91E63".toColorInt() - } - - status() == EnrollmentStatus.COMPLETED -> { - textToShow = context.getString(R.string.enrollment_status_completed) - color = "#8A333333".toColorInt() - } - } - statusTextView.visibility = if (textToShow == null) View.GONE else View.VISIBLE - statusTextView.text = textToShow - statusTextView.setTextColor(color) - val bgDrawable = - AppCompatResources.getDrawable( - context, - R.drawable.round_border_box_2, - ) as GradientDrawable? - bgDrawable!!.setStroke(2, color) - statusTextView.background = bgDrawable -} - -fun LinkedHashMap<String, TrackedEntityAttributeValue>.setAttributeList( - parentLayout: LinearLayout, - showAttributesButton: ImageView, - adapterPosition: Int, - listIsOpen: Boolean, - sortingKey: String?, - sortingValue: String?, - orgUnit: String, - showList: () -> Unit, -) { - parentLayout.removeAllViews() - if (size > 3) { - for (pos in 1 until size) { - val fieldName = - keys.toTypedArray()[pos] - val fieldValue = this[fieldName]?.value() - val itemFieldValueBinding = - ItemFieldValueBinding.inflate(LayoutInflater.from(parentLayout.context)) - itemFieldValueBinding.name = fieldName - itemFieldValueBinding.value = fieldValue - itemFieldValueBinding.root.tag = adapterPosition.toString() + "_" + fieldName - parentLayout.addView(itemFieldValueBinding.root) - } - val orgUnitKey = parentLayout.context.getString(R.string.enrolled_in) - val itemFieldValueBinding = - ItemFieldValueBinding.inflate(LayoutInflater.from(parentLayout.context)) - itemFieldValueBinding.name = orgUnitKey - itemFieldValueBinding.value = orgUnit - itemFieldValueBinding.root.tag = adapterPosition.toString() + "_" + orgUnitKey - parentLayout.addView(itemFieldValueBinding.root) - if (sortingKey != null) { - val binding = - ItemFieldValueBinding.inflate(LayoutInflater.from(parentLayout.context)) - binding.name = sortingKey - binding.fieldName.setTextColor( - ResourcesCompat.getColor( - binding.fieldName.context.resources, - R.color.sorting_attribute_key_color, - null, - ), - ) - binding.value = sortingValue - binding.fieldValue.setTextColor( - ResourcesCompat.getColor( - binding.fieldValue.context.resources, - R.color.sorting_attribute_value_color, - null, - ), - ) - binding.root.tag = adapterPosition.toString() + "_" + sortingValue - parentLayout.addView(binding.root) - } - showAttributesButton.scaleY = if (listIsOpen) -1F else 1F - showAttributesButton.setOnClickListener { - showList() - } - } else { - showAttributesButton.setOnClickListener(null) - } -} diff --git a/commons/src/main/java/org/dhis2/commons/data/CarouselItemModel.kt b/commons/src/main/java/org/dhis2/commons/data/CarouselItemModel.kt deleted file mode 100644 index be453285d0f..00000000000 --- a/commons/src/main/java/org/dhis2/commons/data/CarouselItemModel.kt +++ /dev/null @@ -1,5 +0,0 @@ -package org.dhis2.commons.data - -interface CarouselItemModel { - fun uid(): String -} diff --git a/commons/src/main/java/org/dhis2/commons/data/ProgramEventViewModel.kt b/commons/src/main/java/org/dhis2/commons/data/ProgramEventViewModel.kt index 289249854e0..342aa2d155f 100644 --- a/commons/src/main/java/org/dhis2/commons/data/ProgramEventViewModel.kt +++ b/commons/src/main/java/org/dhis2/commons/data/ProgramEventViewModel.kt @@ -17,6 +17,4 @@ data class ProgramEventViewModel( val attributeOptionComboName: String, val geometry: Geometry?, val canBeEdited: Boolean, -) : CarouselItemModel { - override fun uid() = uid -} +) diff --git a/commons/src/main/java/org/dhis2/commons/date/DateExtensions.kt b/commons/src/main/java/org/dhis2/commons/date/DateExtensions.kt index 478779db2ab..938b3241953 100644 --- a/commons/src/main/java/org/dhis2/commons/date/DateExtensions.kt +++ b/commons/src/main/java/org/dhis2/commons/date/DateExtensions.kt @@ -186,10 +186,11 @@ fun Date?.toUi(): String? = this?.let { DateUtils.uiDateFormat().format(this) } fun Dhis2PeriodType.toUiStringResource() = when (this) { Dhis2PeriodType.Weekly, + Dhis2PeriodType.WeeklyWednesday, + Dhis2PeriodType.WeeklyThursday, + Dhis2PeriodType.WeeklyFriday, Dhis2PeriodType.WeeklySaturday, Dhis2PeriodType.WeeklySunday, - Dhis2PeriodType.WeeklyThursday, - Dhis2PeriodType.WeeklyWednesday, -> R.string.period_weekly_title Dhis2PeriodType.BiWeekly -> R.string.period_biweekly_title @@ -205,8 +206,11 @@ fun Dhis2PeriodType.toUiStringResource() = -> R.string.period_six_monthly_title Dhis2PeriodType.Yearly -> R.string.period_yearly_title + Dhis2PeriodType.FinancialFeb, Dhis2PeriodType.FinancialApril, Dhis2PeriodType.FinancialJuly, + Dhis2PeriodType.FinancialAug, + Dhis2PeriodType.FinancialSep, Dhis2PeriodType.FinancialOct, Dhis2PeriodType.FinancialNov, -> R.string.period_financial_year_title diff --git a/commons/src/main/java/org/dhis2/commons/di/FilterModule.kt b/commons/src/main/java/org/dhis2/commons/di/FilterModule.kt new file mode 100644 index 00000000000..acf03d69a6c --- /dev/null +++ b/commons/src/main/java/org/dhis2/commons/di/FilterModule.kt @@ -0,0 +1,82 @@ +package org.dhis2.commons.di + +import org.dhis2.commons.filters.FilterManager +import org.dhis2.commons.filters.FilterResources +import org.dhis2.commons.filters.data.FilterPresenter +import org.dhis2.commons.filters.data.FilterRepository +import org.dhis2.commons.filters.data.GetFiltersApplyingWebAppConfig +import org.dhis2.commons.filters.workingLists.EventFilterToWorkingListItemMapper +import org.dhis2.commons.filters.workingLists.ProgramStageToWorkingListItemMapper +import org.dhis2.commons.filters.workingLists.TeiFilterToWorkingListItemMapper +import org.dhis2.commons.resources.EventResourcesProvider +import org.dhis2.commons.resources.ResourceManager +import org.koin.core.module.dsl.factoryOf +import org.koin.dsl.module + +val mainFilterModule = + module { + // Singleton for GetFiltersApplyingWebAppConfig + single { + GetFiltersApplyingWebAppConfig() + } + + // FilterManager - singleton per server + single { + FilterManager.initWith(get<ResourceManager>()) + } + + // FilterResources + factory { + FilterResources( + resourceManager = get(), + eventResourcesProvider = get(), + ) + } + + // EventResourcesProvider + factory { + EventResourcesProvider( + d2 = get(), + resourceManager = get(), + ) + } + + // Working list mappers + factory { + EventFilterToWorkingListItemMapper( + defaultWorkingListLabel = get<FilterResources>().defaultWorkingListLabel(), + ) + } + + factory { + TeiFilterToWorkingListItemMapper( + defaultWorkingListLabel = get<FilterResources>().defaultWorkingListLabel(), + ) + } + + factory { + ProgramStageToWorkingListItemMapper( + defaultWorkingListLabel = get<FilterResources>().defaultWorkingListLabel(), + ) + } + + // FilterRepository + factory { + FilterRepository( + d2 = get(), + resources = get(), + getFiltersApplyingWebAppConfig = get(), + eventFilterToWorkingListItemMapper = get(), + teiFilterToWorkingListItemMapper = get(), + programStageToWorkingListItemMapper = get(), + ) + } + + // FilterPresenter + factoryOf(::FilterPresenter) + } + +val filterModule = + module { + includes(mainFilterModule, resourceManagerModule) + } diff --git a/commons/src/main/java/org/dhis2/commons/di/ResourceManagerModule.kt b/commons/src/main/java/org/dhis2/commons/di/ResourceManagerModule.kt index e67a160e02a..8f98dff4375 100644 --- a/commons/src/main/java/org/dhis2/commons/di/ResourceManagerModule.kt +++ b/commons/src/main/java/org/dhis2/commons/di/ResourceManagerModule.kt @@ -3,6 +3,7 @@ package org.dhis2.commons.di import org.dhis2.commons.periods.data.PeriodLabelProvider import org.dhis2.commons.resources.ColorUtils import org.dhis2.commons.resources.ResourceManager +import org.koin.android.ext.koin.androidContext import org.koin.dsl.module val resourceManagerModule = @@ -10,8 +11,9 @@ val resourceManagerModule = single { ColorUtils() } - factory { params -> - ResourceManager(params.get(), get()) + + single { + ResourceManager(androidContext(), get()) } factory { diff --git a/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/BottomSheetDialog.kt b/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/BottomSheetDialog.kt index 411f9948d65..fa052662cd2 100644 --- a/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/BottomSheetDialog.kt +++ b/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/BottomSheetDialog.kt @@ -28,7 +28,7 @@ import androidx.compose.ui.text.style.TextDecoration import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialogFragment -import org.dhis2.ui.R +import org.dhis2.commons.R import org.hisp.dhis.mobile.ui.designsystem.component.BottomSheetShell import org.hisp.dhis.mobile.ui.designsystem.component.Button import org.hisp.dhis.mobile.ui.designsystem.component.ButtonBlock diff --git a/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/BottomSheetDialogContent.kt b/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/BottomSheetDialogContent.kt index 9f18de0dcb7..f1ab514d53a 100644 --- a/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/BottomSheetDialogContent.kt +++ b/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/BottomSheetDialogContent.kt @@ -39,7 +39,7 @@ import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import org.dhis2.ui.R +import org.dhis2.commons.R import org.hisp.dhis.mobile.ui.designsystem.component.Button import org.hisp.dhis.mobile.ui.designsystem.component.ButtonStyle import org.hisp.dhis.mobile.ui.designsystem.theme.TextColor diff --git a/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/DeleteBottomSheetDialog.kt b/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/DeleteBottomSheetDialog.kt index fd31a01b0d0..112d4979088 100644 --- a/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/DeleteBottomSheetDialog.kt +++ b/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/DeleteBottomSheetDialog.kt @@ -15,7 +15,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ViewCompositionStrategy import com.google.android.material.bottomsheet.BottomSheetDialogFragment -import org.dhis2.ui.R +import org.dhis2.commons.R import org.hisp.dhis.mobile.ui.designsystem.component.BottomSheetShell import org.hisp.dhis.mobile.ui.designsystem.component.Button import org.hisp.dhis.mobile.ui.designsystem.component.ButtonBlock diff --git a/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/DialogButtonStyle.kt b/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/DialogButtonStyle.kt index 6261f09a93d..d372c0e526d 100644 --- a/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/DialogButtonStyle.kt +++ b/commons/src/main/java/org/dhis2/commons/dialogs/bottomsheet/DialogButtonStyle.kt @@ -1,7 +1,7 @@ package org.dhis2.commons.dialogs.bottomsheet import androidx.compose.ui.graphics.Color -import org.dhis2.ui.R +import org.dhis2.commons.R import org.hisp.dhis.mobile.ui.designsystem.component.ButtonStyle import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor diff --git a/commons/src/main/java/org/dhis2/commons/dialogs/calendarpicker/CalendarPicker.kt b/commons/src/main/java/org/dhis2/commons/dialogs/calendarpicker/CalendarPicker.kt index 97b8897df33..67433ea0706 100644 --- a/commons/src/main/java/org/dhis2/commons/dialogs/calendarpicker/CalendarPicker.kt +++ b/commons/src/main/java/org/dhis2/commons/dialogs/calendarpicker/CalendarPicker.kt @@ -3,12 +3,9 @@ package org.dhis2.commons.dialogs.calendarpicker import android.app.AlertDialog import android.app.Dialog import android.content.Context -import android.os.Build import android.view.LayoutInflater import android.view.View import android.widget.DatePicker -import android.widget.LinearLayout -import androidx.databinding.BindingAdapter import org.dhis2.commons.R import org.dhis2.commons.databinding.CalendarPickerViewBinding import org.dhis2.commons.dialogs.calendarpicker.di.CalendarPickerComponentProvider @@ -174,13 +171,3 @@ class CalendarPicker( } } } - -@BindingAdapter("versionCustomVisibility") -fun setCustomVisibility( - linearLayout: LinearLayout, - check: Boolean, -) { - if (check && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - linearLayout.visibility = View.GONE - } -} diff --git a/commons/src/main/java/org/dhis2/commons/filters/FilterManager.java b/commons/src/main/java/org/dhis2/commons/filters/FilterManager.java index fb2d4a6b163..d993da4e34f 100644 --- a/commons/src/main/java/org/dhis2/commons/filters/FilterManager.java +++ b/commons/src/main/java/org/dhis2/commons/filters/FilterManager.java @@ -37,7 +37,6 @@ import kotlinx.coroutines.CoroutineScope; import kotlinx.coroutines.flow.Flow; import kotlinx.coroutines.flow.MutableSharedFlow; -import kotlinx.coroutines.flow.MutableStateFlow; import timber.log.Timber; public class FilterManager implements Serializable { @@ -590,7 +589,7 @@ public void clearAllFilters() { stateFilters.clear(); observableStates.postValue(stateFilters); ouFilters.clear(); - liveDataOUFilter.setValue(ouFilters); + liveDataOUFilter.postValue(ouFilters); periodFilters = new ArrayList<>(); observablePeriodFilters.set(periodFilters); enrollmentPeriodFilters = new ArrayList<>(); @@ -684,7 +683,7 @@ public boolean workingListActive() { } public void setWorkingListScope(WorkingListScope scope) { - if (!currentWorkingListScope.get().equals(scope)) { + if (!Objects.equals(currentWorkingListScope.get().workingListUid(), scope.workingListUid())) { currentWorkingListScope.set(scope); setFilterCountersForWorkingList(scope); } diff --git a/commons/src/main/java/org/dhis2/commons/filters/data/EventProgramFilterSearchHelper.kt b/commons/src/main/java/org/dhis2/commons/filters/data/EventProgramFilterSearchHelper.kt index 0be3b29d4c8..08262650f92 100644 --- a/commons/src/main/java/org/dhis2/commons/filters/data/EventProgramFilterSearchHelper.kt +++ b/commons/src/main/java/org/dhis2/commons/filters/data/EventProgramFilterSearchHelper.kt @@ -40,6 +40,7 @@ class EventProgramFilterSearchHelper filterManager.setWorkingListScope( it.scope.mapToEventWorkingListScope( filterRepository.resources, + filterManager.currentWorkingList()?.uid, ), ) } diff --git a/commons/src/main/java/org/dhis2/commons/filters/data/FilterPresenter.kt b/commons/src/main/java/org/dhis2/commons/filters/data/FilterPresenter.kt index b9e2fd347e5..a857bc0013f 100644 --- a/commons/src/main/java/org/dhis2/commons/filters/data/FilterPresenter.kt +++ b/commons/src/main/java/org/dhis2/commons/filters/data/FilterPresenter.kt @@ -34,15 +34,15 @@ class FilterPresenter fun filteredEventProgram(program: Program): EventQueryCollectionRepository = eventProgramFilterSearchHelper.getFilteredEventRepository(program) - fun filteredTrackerProgram(program: Program): TrackedEntitySearchCollectionRepository = - trackerFilterSearchHelper.getFilteredProgramRepository(program.uid()) + fun filteredTrackerProgram(program: String): TrackedEntitySearchCollectionRepository = + trackerFilterSearchHelper.getFilteredProgramRepository(program) fun filteredTrackedEntityTypes(trackedEntityTypeUid: String): TrackedEntitySearchCollectionRepository = trackerFilterSearchHelper .getFilteredTrackedEntityTypeRepository(trackedEntityTypeUid) fun filteredTrackedEntityInstances( - program: Program?, + program: String?, trackedEntityTypeUid: String, ): TrackedEntitySearchCollectionRepository = program?.let { filteredTrackerProgram(program) } diff --git a/commons/src/main/java/org/dhis2/commons/filters/data/FilterRepository.kt b/commons/src/main/java/org/dhis2/commons/filters/data/FilterRepository.kt index ab3d029da70..7387f2b32ba 100644 --- a/commons/src/main/java/org/dhis2/commons/filters/data/FilterRepository.kt +++ b/commons/src/main/java/org/dhis2/commons/filters/data/FilterRepository.kt @@ -44,187 +44,207 @@ import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchCollec import javax.inject.Inject class FilterRepository - @Inject - constructor( - private val d2: D2, - val resources: FilterResources, - private val getFiltersApplyingWebAppConfig: GetFiltersApplyingWebAppConfig, - private val eventFilterToWorkingListItemMapper: EventFilterToWorkingListItemMapper, - private val teiFilterToWorkingListItemMapper: TeiFilterToWorkingListItemMapper, - private val programStageToWorkingListItemMapper: ProgramStageToWorkingListItemMapper, - ) { - private val observableSortingInject = ObservableField<SortingItem>() - private val observableOpenFilter = ObservableField<Filters>() - private var orgUnitsCount: Int = -1 - - init { - orgUnitsCount = - d2 - .organisationUnitModule() - .organisationUnits() - .byOrganisationUnitScope(OrganisationUnit.Scope.SCOPE_TEI_SEARCH) - .blockingCount() - } - - fun trackedEntityInstanceQueryByProgram(programUid: String): TrackedEntitySearchCollectionRepository = - d2 - .trackedEntityModule() - .trackedEntitySearch() - .byProgram() - .eq(programUid) - - fun trackedEntityInstanceQueryByType(trackedEntityTypeUid: String): TrackedEntitySearchCollectionRepository = - d2 - .trackedEntityModule() - .trackedEntitySearch() - .byTrackedEntityType() - .eq(trackedEntityTypeUid) - - fun rootOrganisationUnitUids(): List<String> = - d2 - .organisationUnitModule() - .organisationUnits() - .byRootOrganisationUnit(true) - .blockingGetUids() - - fun applyEnrollmentStatusFilter( - repository: TrackedEntitySearchCollectionRepository, - enrollmentStatuses: List<EnrollmentStatus>, - ): TrackedEntitySearchCollectionRepository = repository.byEnrollmentStatus().`in`(enrollmentStatuses) - - fun applyEventStatusFilter( - repository: TrackedEntitySearchCollectionRepository, - eventStatuses: List<EventStatus>, - ): TrackedEntitySearchCollectionRepository = repository.byEventStatus().`in`(eventStatuses) - - fun applyEventStatusFilter( - repository: EventQueryCollectionRepository, - eventStatuses: List<EventStatus>, - ): EventQueryCollectionRepository = repository.byStatus().`in`(eventStatuses) - - fun applyCategoryOptionComboFilter( - repository: EventQueryCollectionRepository, - categoryOptionCombos: List<CategoryOptionCombo>, - ): EventQueryCollectionRepository = - repository.byAttributeOptionCombo().`in`( - categoryOptionCombos.map { it.uid() }, - ) - - fun applyOrgUnitFilter( - repository: TrackedEntitySearchCollectionRepository, - ouMode: OrganisationUnitMode, - orgUnitUis: List<String>, - ): TrackedEntitySearchCollectionRepository = - repository - .byOrgUnitMode() - .eq(ouMode) - .byOrgUnits() - .`in`(orgUnitUis) - - fun applyStateFilter( - repository: TrackedEntitySearchCollectionRepository, - states: List<State>, - ): TrackedEntitySearchCollectionRepository = repository.byStates().`in`(states) - - fun applyDateFilter( - repository: TrackedEntitySearchCollectionRepository, - datePeriod: DatePeriod, - ): TrackedEntitySearchCollectionRepository = repository.byEventDate().inDatePeriod(datePeriod) - - fun applyEnrollmentDateFilter( - repository: TrackedEntitySearchCollectionRepository, - datePeriod: DatePeriod, - ): TrackedEntitySearchCollectionRepository = repository.byProgramDate().inDatePeriod(datePeriod) - - fun applyAssignToMe(repository: TrackedEntitySearchCollectionRepository): TrackedEntitySearchCollectionRepository = - repository.byAssignedUserMode().eq(AssignedUserMode.CURRENT) - - fun applyFollowUp(repository: TrackedEntitySearchCollectionRepository): TrackedEntitySearchCollectionRepository = - repository.byFollowUp().isTrue - - fun sortByPeriod( - repository: TrackedEntitySearchCollectionRepository, - orderDirection: RepositoryScope.OrderByDirection, - ): TrackedEntitySearchCollectionRepository = repository.orderByEventDate().eq(orderDirection) - - fun sortByOrgUnit( - repository: TrackedEntitySearchCollectionRepository, - orderDirection: RepositoryScope.OrderByDirection, - ): TrackedEntitySearchCollectionRepository = repository.orderByOrganisationUnitName().eq(orderDirection) - - fun sortByEnrollmentDate( - repository: TrackedEntitySearchCollectionRepository, - orderDirection: RepositoryScope.OrderByDirection, - ): TrackedEntitySearchCollectionRepository = repository.orderByEnrollmentDate().eq(orderDirection) - - fun sortByEnrollmentStatus( - repository: TrackedEntitySearchCollectionRepository, - orderDirection: RepositoryScope.OrderByDirection, - ): TrackedEntitySearchCollectionRepository = repository.orderByEnrollmentStatus().eq(orderDirection) - - fun eventsByProgram(programUid: String): EventQueryCollectionRepository = - d2 - .eventModule() - .eventQuery() - .byIncludeDeleted() - .eq(false) - .byProgram() - .eq(programUid) - - fun applyOrgUnitFilter( - repository: EventQueryCollectionRepository, - orgUnitUis: List<String>, - ): EventQueryCollectionRepository = repository.byOrgUnits().`in`(orgUnitUis) - - fun applyStateFilter( - repository: EventQueryCollectionRepository, - states: List<State>, - ): EventQueryCollectionRepository = repository.byStates().`in`(states) - - fun applyDateFilter( - repository: EventQueryCollectionRepository, - datePeriod: DatePeriod, - ): EventQueryCollectionRepository = repository.byEventDate().inDatePeriod(datePeriod) - - fun applyAssignToMe(repository: EventQueryCollectionRepository): EventQueryCollectionRepository = - repository.byAssignedUser().eq(AssignedUserMode.CURRENT) - - fun sortByEventDate( - repository: EventQueryCollectionRepository, - orderDirection: RepositoryScope.OrderByDirection, - ): EventQueryCollectionRepository = repository.orderByEventDate().eq(orderDirection) - - fun sortByOrgUnit( - repository: EventQueryCollectionRepository, - orderDirection: RepositoryScope.OrderByDirection, - ): EventQueryCollectionRepository = repository.orderByOrganisationUnitName().eq(orderDirection) - - fun dataSetInstanceSummaries(): DataSetInstanceSummaryCollectionRepository = d2.dataSetModule().dataSetInstanceSummaries() - - fun applyOrgUnitFilter( - repository: DataSetInstanceSummaryCollectionRepository, - orgUnitUis: List<String>, - ): DataSetInstanceSummaryCollectionRepository = repository.byOrganisationUnitUid().`in`(orgUnitUis) - - fun applyStateFilter( - repository: DataSetInstanceSummaryCollectionRepository, - states: List<State>, - ): DataSetInstanceSummaryCollectionRepository = repository.byState().`in`(states) - - fun applyPeriodFilter( - repository: DataSetInstanceSummaryCollectionRepository, - datePeriods: List<DatePeriod>, - ): DataSetInstanceSummaryCollectionRepository = repository.byPeriodStartDate().inDatePeriods(datePeriods) - - fun orgUnitsByName(name: String): List<OrganisationUnit> = - d2 - .organisationUnitModule() - .organisationUnits() - .byDisplayName() - .like("%$name%") - .blockingGet() +@Inject +constructor( + private val d2: D2, + val resources: FilterResources, + private val getFiltersApplyingWebAppConfig: GetFiltersApplyingWebAppConfig, + private val eventFilterToWorkingListItemMapper: EventFilterToWorkingListItemMapper, + private val teiFilterToWorkingListItemMapper: TeiFilterToWorkingListItemMapper, + private val programStageToWorkingListItemMapper: ProgramStageToWorkingListItemMapper, +) { + private val observableSortingInject = ObservableField<SortingItem>() + private val observableOpenFilter = ObservableField<Filters>() + private fun orgUnitsCount() = + d2 + .organisationUnitModule() + .organisationUnits() + .byOrganisationUnitScope(OrganisationUnit.Scope.SCOPE_TEI_SEARCH) + .blockingCount() + + fun trackedEntityInstanceQueryByProgram(programUid: String): TrackedEntitySearchCollectionRepository = + d2 + .trackedEntityModule() + .trackedEntitySearch() + .byProgram() + .eq(programUid) + + fun trackedEntityInstanceQueryByType(trackedEntityTypeUid: String): TrackedEntitySearchCollectionRepository = + d2 + .trackedEntityModule() + .trackedEntitySearch() + .byTrackedEntityType() + .eq(trackedEntityTypeUid) + + fun rootOrganisationUnitUids(): List<String> = + d2 + .organisationUnitModule() + .organisationUnits() + .byRootOrganisationUnit(true) + .blockingGetUids() + + fun applyEnrollmentStatusFilter( + repository: TrackedEntitySearchCollectionRepository, + enrollmentStatuses: List<EnrollmentStatus>, + ): TrackedEntitySearchCollectionRepository = + repository.byEnrollmentStatus().`in`(enrollmentStatuses) + + fun applyEventStatusFilter( + repository: TrackedEntitySearchCollectionRepository, + eventStatuses: List<EventStatus>, + ): TrackedEntitySearchCollectionRepository = repository.byEventStatus().`in`(eventStatuses) + + fun applyEventStatusFilter( + repository: EventQueryCollectionRepository, + eventStatuses: List<EventStatus>, + ): EventQueryCollectionRepository = repository.byStatus().`in`(eventStatuses) + + fun applyCategoryOptionComboFilter( + repository: EventQueryCollectionRepository, + categoryOptionCombos: List<CategoryOptionCombo>, + ): EventQueryCollectionRepository = + repository.byAttributeOptionCombo().`in`( + categoryOptionCombos.map { it.uid() }, + ) + + fun applyOrgUnitFilter( + repository: TrackedEntitySearchCollectionRepository, + ouMode: OrganisationUnitMode, + orgUnitUis: List<String>, + ): TrackedEntitySearchCollectionRepository = + repository + .byOrgUnitMode() + .eq(ouMode) + .byOrgUnits() + .`in`(orgUnitUis) + + fun applyStateFilter( + repository: TrackedEntitySearchCollectionRepository, + states: List<State>, + ): TrackedEntitySearchCollectionRepository = repository.byStates().`in`(states) + + fun applyDateFilter( + repository: TrackedEntitySearchCollectionRepository, + datePeriod: DatePeriod, + ): TrackedEntitySearchCollectionRepository = repository.byEventDate().inDatePeriod(datePeriod) + + fun applyEnrollmentDateFilter( + repository: TrackedEntitySearchCollectionRepository, + datePeriod: DatePeriod, + ): TrackedEntitySearchCollectionRepository = repository.byProgramDate().inDatePeriod(datePeriod) + + fun applyAssignToMe(repository: TrackedEntitySearchCollectionRepository): TrackedEntitySearchCollectionRepository = + repository.byAssignedUserMode().eq(AssignedUserMode.CURRENT) + + fun applyFollowUp(repository: TrackedEntitySearchCollectionRepository): TrackedEntitySearchCollectionRepository = + repository.byFollowUp().isTrue + + fun sortByPeriod( + repository: TrackedEntitySearchCollectionRepository, + orderDirection: RepositoryScope.OrderByDirection, + ): TrackedEntitySearchCollectionRepository = repository.orderByEventDate().eq(orderDirection) + + fun sortByOrgUnit( + repository: TrackedEntitySearchCollectionRepository, + orderDirection: RepositoryScope.OrderByDirection, + ): TrackedEntitySearchCollectionRepository = + repository.orderByOrganisationUnitName().eq(orderDirection) + + fun sortByEnrollmentDate( + repository: TrackedEntitySearchCollectionRepository, + orderDirection: RepositoryScope.OrderByDirection, + ): TrackedEntitySearchCollectionRepository = + repository.orderByEnrollmentDate().eq(orderDirection) + + fun sortByEnrollmentStatus( + repository: TrackedEntitySearchCollectionRepository, + orderDirection: RepositoryScope.OrderByDirection, + ): TrackedEntitySearchCollectionRepository = + repository.orderByEnrollmentStatus().eq(orderDirection) + + fun eventsByProgram(programUid: String): EventQueryCollectionRepository = + d2 + .eventModule() + .eventQuery() + .byIncludeDeleted() + .eq(false) + .byProgram() + .eq(programUid) + + fun applyOrgUnitFilter( + repository: EventQueryCollectionRepository, + orgUnitUis: List<String>, + ): EventQueryCollectionRepository = repository.byOrgUnits().`in`(orgUnitUis) + + fun applyStateFilter( + repository: EventQueryCollectionRepository, + states: List<State>, + ): EventQueryCollectionRepository = repository.byStates().`in`(states) + + fun applyDateFilter( + repository: EventQueryCollectionRepository, + datePeriod: DatePeriod, + ): EventQueryCollectionRepository = repository.byEventDate().inDatePeriod(datePeriod) + + fun applyAssignToMe(repository: EventQueryCollectionRepository): EventQueryCollectionRepository = + repository.byAssignedUser().eq(AssignedUserMode.CURRENT) + + fun sortByEventDate( + repository: EventQueryCollectionRepository, + orderDirection: RepositoryScope.OrderByDirection, + ): EventQueryCollectionRepository = repository.orderByEventDate().eq(orderDirection) + + fun sortByOrgUnit( + repository: EventQueryCollectionRepository, + orderDirection: RepositoryScope.OrderByDirection, + ): EventQueryCollectionRepository = repository.orderByOrganisationUnitName().eq(orderDirection) + + fun dataSetInstanceSummaries(): DataSetInstanceSummaryCollectionRepository = + d2.dataSetModule().dataSetInstanceSummaries() + + fun applyOrgUnitFilter( + repository: DataSetInstanceSummaryCollectionRepository, + orgUnitUis: List<String>, + ): DataSetInstanceSummaryCollectionRepository = + repository.byOrganisationUnitUid().`in`(orgUnitUis) + + fun applyStateFilter( + repository: DataSetInstanceSummaryCollectionRepository, + states: List<State>, + ): DataSetInstanceSummaryCollectionRepository = repository.byState().`in`(states) + + fun applyPeriodFilter( + repository: DataSetInstanceSummaryCollectionRepository, + datePeriods: List<DatePeriod>, + ): DataSetInstanceSummaryCollectionRepository = + repository.byPeriodStartDate().inDatePeriods(datePeriods) + + fun orgUnitsByName(name: String): List<OrganisationUnit> = + d2 + .organisationUnitModule() + .organisationUnits() + .byDisplayName() + .like("%$name%") + .blockingGet() + + fun programFilters(programUid: String): List<FilterItem> = + d2 + .programModule() + .programs() + .uid(programUid) + .get() + .map { + if (it.programType() == + org.hisp.dhis.android.core.program.ProgramType.WITH_REGISTRATION + ) { + getTrackerFilters(it) + } else { + getEventFilters(it, ProgramType.EVENT) + } + }.blockingGet() - fun programFilters(programUid: String): List<FilterItem> = + fun workingListFilter(programUid: String): WorkingListFilter? = + try { d2 .programModule() .programs() @@ -234,75 +254,59 @@ class FilterRepository if (it.programType() == org.hisp.dhis.android.core.program.ProgramType.WITH_REGISTRATION ) { - getTrackerFilters(it) + getTrackerWorkingList(it) } else { - getEventFilters(it, ProgramType.EVENT) + getEventWorkingList(it) } }.blockingGet() + } catch (e: Exception) { + null + } - fun workingListFilter(programUid: String): WorkingListFilter? = - try { - d2 - .programModule() - .programs() - .uid(programUid) - .get() - .map { - if (it.programType() == - org.hisp.dhis.android.core.program.ProgramType.WITH_REGISTRATION - ) { - getTrackerWorkingList(it) - } else { - getEventWorkingList(it) - } - }.blockingGet() - } catch (e: Exception) { - null + fun dashboardFilters(programUid: String): List<FilterItem> = + d2 + .programModule() + .programs() + .uid(programUid) + .get() + .map { + getEventFilters(it, ProgramType.TRACKER) + }.blockingGet() + + fun globalTrackedEntityFilters(): List<FilterItem> { + val orgUnitsCount = orgUnitsCount() + val defaultFilters = createDefaultTrackedEntityFilters() + + if (webAppIsNotConfigured()) { + if (orgUnitsCount == 1) { + defaultFilters.remove(ProgramFilter.ORG_UNIT) } + return defaultFilters.values.toList() + } - fun dashboardFilters(programUid: String): List<FilterItem> = + val globalTrackedEntityTypeFiltersWebApp = d2 - .programModule() - .programs() - .uid(programUid) - .get() - .map { - getEventFilters(it, ProgramType.TRACKER) - }.blockingGet() + .settingModule() + .appearanceSettings() + .getTrackedEntityTypeFilters() + ?.toMutableMap() ?: mutableMapOf() - fun globalTrackedEntityFilters(): List<FilterItem> { - val defaultFilters = createDefaultTrackedEntityFilters() + globalTrackedEntityTypeFiltersWebApp.remove(ProgramFilter.ASSIGNED_TO_ME) + globalTrackedEntityTypeFiltersWebApp.remove(ProgramFilter.ENROLLMENT_DATE) - if (webAppIsNotConfigured()) { - if (orgUnitsCount == 1) { - defaultFilters.remove(ProgramFilter.ORG_UNIT) - } - return defaultFilters.values.toList() - } - - val globalTrackedEntityTypeFiltersWebApp = - d2 - .settingModule() - .appearanceSettings() - .getTrackedEntityTypeFilters() - ?.toMutableMap() ?: mutableMapOf() - - globalTrackedEntityTypeFiltersWebApp.remove(ProgramFilter.ASSIGNED_TO_ME) - globalTrackedEntityTypeFiltersWebApp.remove(ProgramFilter.ENROLLMENT_DATE) - - if (orgUnitsCount == 1) { - globalTrackedEntityTypeFiltersWebApp.remove(ProgramFilter.ORG_UNIT) - } - - return getFiltersApplyingWebAppConfig.execute( - defaultFilters, - globalTrackedEntityTypeFiltersWebApp, - ) + if (orgUnitsCount == 1) { + globalTrackedEntityTypeFiltersWebApp.remove(ProgramFilter.ORG_UNIT) } - private fun createDefaultTrackedEntityFilters(): LinkedHashMap<ProgramFilter, FilterItem> = - linkedMapOf( - ProgramFilter.ORG_UNIT to + return getFiltersApplyingWebAppConfig.execute( + defaultFilters, + globalTrackedEntityTypeFiltersWebApp, + ) + } + + private fun createDefaultTrackedEntityFilters(): LinkedHashMap<ProgramFilter, FilterItem> = + linkedMapOf( + ProgramFilter.ORG_UNIT to OrgUnitFilter( FilterManager.getInstance().observeOrgUnitFilters(), ProgramType.TRACKER, @@ -310,50 +314,52 @@ class FilterRepository observableOpenFilter, resources.filterOrgUnitLabel(), ), - ProgramFilter.SYNC_STATUS to + ProgramFilter.SYNC_STATUS to SyncStateFilter( ProgramType.TRACKER, observableSortingInject, observableOpenFilter, resources.filterSyncLabel(), ), - ) + ) - fun dataSetFilters(dataSetUid: String): List<FilterItem> { - val defaultFilters = createDefaultDatasetFilters(dataSetUid) + fun dataSetFilters(dataSetUid: String): List<FilterItem> { + val orgUnitsCount = orgUnitsCount() - if (webAppIsNotConfigured()) { - if (orgUnitsCount == 1) { - defaultFilters.remove(DataSetFilter.ORG_UNIT) - } - return defaultFilters.values.toList() - } - - val datasetFiltersWebApp = - d2 - .settingModule() - .appearanceSettings() - .getDataSetFiltersByUid(dataSetUid) - ?.toMutableMap() ?: mutableMapOf() + val defaultFilters = createDefaultDatasetFilters(dataSetUid) + if (webAppIsNotConfigured()) { if (orgUnitsCount == 1) { - datasetFiltersWebApp.remove(DataSetFilter.ORG_UNIT) + defaultFilters.remove(DataSetFilter.ORG_UNIT) } + return defaultFilters.values.toList() + } - return getFiltersApplyingWebAppConfig.execute(defaultFilters, datasetFiltersWebApp) + val datasetFiltersWebApp = + d2 + .settingModule() + .appearanceSettings() + .getDataSetFiltersByUid(dataSetUid) + ?.toMutableMap() ?: mutableMapOf() + + if (orgUnitsCount == 1) { + datasetFiltersWebApp.remove(DataSetFilter.ORG_UNIT) } - private fun createDefaultDatasetFilters(dataSetUid: String): LinkedHashMap<DataSetFilter, FilterItem> { - val datasetFilters = - linkedMapOf( - DataSetFilter.PERIOD to + return getFiltersApplyingWebAppConfig.execute(defaultFilters, datasetFiltersWebApp) + } + + private fun createDefaultDatasetFilters(dataSetUid: String): LinkedHashMap<DataSetFilter, FilterItem> { + val datasetFilters = + linkedMapOf( + DataSetFilter.PERIOD to PeriodFilter( ProgramType.DATASET, observableSortingInject, observableOpenFilter, resources.filterPeriodLabel(), ), - DataSetFilter.ORG_UNIT to + DataSetFilter.ORG_UNIT to OrgUnitFilter( FilterManager.getInstance().observeOrgUnitFilters(), ProgramType.DATASET, @@ -361,81 +367,82 @@ class FilterRepository observableOpenFilter, resources.filterOrgUnitLabel(), ), - DataSetFilter.SYNC_STATUS to + DataSetFilter.SYNC_STATUS to SyncStateFilter( ProgramType.DATASET, observableSortingInject, observableOpenFilter, resources.filterSyncLabel(), ), - ) + ) - val dataSet = - d2 - .dataSetModule() - .dataSets() - .uid(dataSetUid) - .blockingGet() - val categoryCombo = + val dataSet = + d2 + .dataSetModule() + .dataSets() + .uid(dataSetUid) + .blockingGet() + val categoryCombo = + d2 + .categoryModule() + .categoryCombos() + .uid(dataSet?.categoryCombo()?.uid()) + .blockingGet() + if (categoryCombo?.isDefault == false) { + CatOptionComboFilter( + categoryCombo, d2 .categoryModule() - .categoryCombos() - .uid(dataSet?.categoryCombo()?.uid()) - .blockingGet() - if (categoryCombo?.isDefault == false) { - CatOptionComboFilter( - categoryCombo, - d2 - .categoryModule() - .categoryOptionCombos() - .byCategoryComboUid() - .eq(categoryCombo.uid()) - .blockingGet(), - ProgramType.DATASET, - observableSortingInject, - observableOpenFilter, - categoryCombo.displayName() ?: "", - ).also { datasetFilters[DataSetFilter.CAT_COMBO] = it } - } - - return datasetFilters + .categoryOptionCombos() + .byCategoryComboUid() + .eq(categoryCombo.uid()) + .blockingGet(), + ProgramType.DATASET, + observableSortingInject, + observableOpenFilter, + categoryCombo.displayName() ?: "", + ).also { datasetFilters[DataSetFilter.CAT_COMBO] = it } } - fun homeFilters(): List<FilterItem> { - val defaultFilters = createDefaultHomeFilters() - - if (webAppIsNotConfigured()) { - if (orgUnitsCount == 1) { - defaultFilters.remove(HomeFilter.ORG_UNIT) - } - return defaultFilters.values.toList() - } + return datasetFilters + } - val homeFiltersWebApp = - d2 - .settingModule() - .appearanceSettings() - .getHomeFilters() - ?.toMutableMap() ?: mutableMapOf() + fun homeFilters(): List<FilterItem> { + val orgUnitsCount = orgUnitsCount() + val defaultFilters = createDefaultHomeFilters() + if (webAppIsNotConfigured()) { if (orgUnitsCount == 1) { - homeFiltersWebApp.remove(HomeFilter.ORG_UNIT) + defaultFilters.remove(HomeFilter.ORG_UNIT) } + return defaultFilters.values.toList() + } + + val homeFiltersWebApp = + d2 + .settingModule() + .appearanceSettings() + .getHomeFilters() + ?.toMutableMap() ?: mutableMapOf() - return getFiltersApplyingWebAppConfig.execute(defaultFilters, homeFiltersWebApp) + if (orgUnitsCount == 1) { + homeFiltersWebApp.remove(HomeFilter.ORG_UNIT) } - private fun createDefaultHomeFilters(): LinkedHashMap<HomeFilter, FilterItem> { - val homeFilter = - linkedMapOf( - HomeFilter.DATE to + return getFiltersApplyingWebAppConfig.execute(defaultFilters, homeFiltersWebApp) + } + + private fun createDefaultHomeFilters(): LinkedHashMap<HomeFilter, FilterItem> { + val homeFilter = + linkedMapOf( + HomeFilter.DATE to PeriodFilter( ProgramType.ALL, observableSortingInject, observableOpenFilter, resources.filterDateLabel(), ), - HomeFilter.ORG_UNIT to + HomeFilter.ORG_UNIT to OrgUnitFilter( FilterManager.getInstance().observeOrgUnitFilters(), ProgramType.ALL, @@ -443,367 +450,372 @@ class FilterRepository observableOpenFilter, resources.filterOrgUnitLabel(), ), - HomeFilter.SYNC_STATUS to + HomeFilter.SYNC_STATUS to SyncStateFilter( ProgramType.ALL, observableSortingInject, observableOpenFilter, resources.filterSyncLabel(), ), - ) + ) - val stagesByUserAssignment = - d2 - .programModule() - .programStages() - .byEnableUserAssignment() - .eq(true) - - if (!stagesByUserAssignment.blockingIsEmpty()) { - val assignToMeFilter = - AssignedFilter( - programType = ProgramType.ALL, - sortingItem = observableSortingInject, - openFilter = observableOpenFilter, - filterLabel = resources.filterAssignedToMeLabel(), - ) - homeFilter[HomeFilter.ASSIGNED_TO_ME] = assignToMeFilter - } - return homeFilter + val stagesByUserAssignment = + d2 + .programModule() + .programStages() + .byEnableUserAssignment() + .eq(true) + + if (!stagesByUserAssignment.blockingIsEmpty()) { + val assignToMeFilter = + AssignedFilter( + programType = ProgramType.ALL, + sortingItem = observableSortingInject, + openFilter = observableOpenFilter, + filterLabel = resources.filterAssignedToMeLabel(), + ) + homeFilter[HomeFilter.ASSIGNED_TO_ME] = assignToMeFilter } + return homeFilter + } - private fun webAppIsNotConfigured(): Boolean = !d2.settingModule().appearanceSettings().blockingExists() - - private fun getTrackerFilters(program: Program): List<FilterItem> { - val defaultFilters = createGetDefaultTrackerFilter(program) - - if (webAppIsNotConfigured()) { - if (orgUnitsCount == 1) { - defaultFilters.remove(ProgramFilter.ORG_UNIT) - } - return defaultFilters.values.toList() - } + private fun webAppIsNotConfigured(): Boolean = + !d2.settingModule().appearanceSettings().blockingExists() - val trackerFiltersWebApp = - d2 - .settingModule() - .appearanceSettings() - .getProgramFiltersByUid(program.uid()) - ?.toMutableMap() ?: mutableMapOf() + private fun getTrackerFilters(program: Program): List<FilterItem> { + val orgUnitsCount = orgUnitsCount() + val defaultFilters = createGetDefaultTrackerFilter(program) + if (webAppIsNotConfigured()) { if (orgUnitsCount == 1) { - trackerFiltersWebApp.remove(ProgramFilter.ORG_UNIT) + defaultFilters.remove(ProgramFilter.ORG_UNIT) } + return defaultFilters.values.toList() + } - val filterPreList = - getFiltersApplyingWebAppConfig.execute(defaultFilters, trackerFiltersWebApp) - - if (filterPreList.isEmpty()) { - return mutableListOf() - } + val trackerFiltersWebApp = + d2 + .settingModule() + .appearanceSettings() + .getProgramFiltersByUid(program.uid()) + ?.toMutableMap() ?: mutableMapOf() - return setupUpFollowUpFilter(program, filterPreList.toMutableList()) + if (orgUnitsCount == 1) { + trackerFiltersWebApp.remove(ProgramFilter.ORG_UNIT) } - private fun setupUpFollowUpFilter( - program: Program, - filtersToShow: MutableList<FilterItem>, - ): List<FilterItem> { - val teTypeName = - d2 - .trackedEntityModule() - .trackedEntityTypes() - .uid(program.trackedEntityType()?.uid()) - .blockingGet() - ?.displayName() ?: "" - val followUpFilter = - FollowUpFilter( - ProgramType.TRACKER, - observableSortingInject, - observableOpenFilter, - resources.filterFollowUpLabel(teTypeName), - ) + val filterPreList = + getFiltersApplyingWebAppConfig.execute(defaultFilters, trackerFiltersWebApp) - if (filtersToShow.any { it.type == Filters.ASSIGNED_TO_ME }) { - val index = filtersToShow.indexOfFirst { it.type == Filters.ASSIGNED_TO_ME } - filtersToShow.add(index, followUpFilter) - } else { - filtersToShow.add(followUpFilter) - } - return filtersToShow.toList() + if (filterPreList.isEmpty()) { + return mutableListOf() } - private fun createGetDefaultTrackerFilter(program: Program): LinkedHashMap<ProgramFilter, FilterItem> { - val defaultTrackerFilters = linkedMapOf<ProgramFilter, FilterItem>() - - defaultTrackerFilters[ProgramFilter.EVENT_DATE] = - PeriodFilter( - ProgramType.TRACKER, - observableSortingInject, - observableOpenFilter, - resources.filterEventDateLabel(program.uid()), - ) - defaultTrackerFilters[ProgramFilter.ENROLLMENT_DATE] = - EnrollmentDateFilter( - ProgramType.TRACKER, - observableSortingInject, - observableOpenFilter, - program.displayEnrollmentDateLabel() ?: resources - .filterEnrollmentDateLabel(program.uid()), - ) - defaultTrackerFilters[ProgramFilter.ORG_UNIT] = - OrgUnitFilter( - FilterManager.getInstance().observeOrgUnitFilters(), - ProgramType.TRACKER, - observableSortingInject, - observableOpenFilter, - resources.filterOrgUnitLabel(), - ) - defaultTrackerFilters[ProgramFilter.SYNC_STATUS] = - SyncStateFilter( - ProgramType.TRACKER, - observableSortingInject, - observableOpenFilter, - resources.filterSyncLabel(), - ) - defaultTrackerFilters[ProgramFilter.ENROLLMENT_STATUS] = - EnrollmentStatusFilter( - ProgramType.TRACKER, - observableSortingInject, - observableOpenFilter, - resources.filterEnrollmentStatusLabel(program.uid()), - ) - defaultTrackerFilters[ProgramFilter.EVENT_STATUS] = - EventStatusFilter( - ProgramType.TRACKER, - observableSortingInject, - observableOpenFilter, - resources.filterEventStatusLabel(program.uid()), - ) + return setupUpFollowUpFilter(program, filterPreList.toMutableList()) + } - val stagesByProgramUidAndUserAssignment = - d2 - .programModule() - .programStages() - .byProgramUid() - .eq(program.uid()) - .byEnableUserAssignment() - .eq(true) - - if (!stagesByProgramUidAndUserAssignment.blockingIsEmpty()) { - defaultTrackerFilters[ProgramFilter.ASSIGNED_TO_ME] = - AssignedFilter( - programType = ProgramType.TRACKER, - sortingItem = observableSortingInject, - openFilter = observableOpenFilter, - filterLabel = resources.filterAssignedToMeLabel(), - ) - } + private fun setupUpFollowUpFilter( + program: Program, + filtersToShow: MutableList<FilterItem>, + ): List<FilterItem> { + val teTypeName = + d2 + .trackedEntityModule() + .trackedEntityTypes() + .uid(program.trackedEntityType()?.uid()) + .blockingGet() + ?.displayName() ?: "" + val followUpFilter = + FollowUpFilter( + ProgramType.TRACKER, + observableSortingInject, + observableOpenFilter, + resources.filterFollowUpLabel(teTypeName), + ) - return defaultTrackerFilters + if (filtersToShow.any { it.type == Filters.ASSIGNED_TO_ME }) { + val index = filtersToShow.indexOfFirst { it.type == Filters.ASSIGNED_TO_ME } + filtersToShow.add(index, followUpFilter) + } else { + filtersToShow.add(followUpFilter) } + return filtersToShow.toList() + } - private fun getTrackerWorkingList(program: Program): WorkingListFilter? { - val workingLists = - d2 - .trackedEntityModule() - .trackedEntityInstanceFilters() - .byProgram() - .eq(program.uid()) - .withTrackedEntityInstanceEventFilters() - .blockingGet() - .mapNotNull { teiFilterToWorkingListItemMapper.map(it) } - .toMutableList() - - workingLists.addAll( - d2 - .programModule() - .programStageWorkingLists() - .byProgram() - .eq(program.uid()) - .withAttributeValueFilters() - .blockingGet() - .mapNotNull { programStageToWorkingListItemMapper.map(it) } - .toMutableList(), + private fun createGetDefaultTrackerFilter(program: Program): LinkedHashMap<ProgramFilter, FilterItem> { + val defaultTrackerFilters = linkedMapOf<ProgramFilter, FilterItem>() + + defaultTrackerFilters[ProgramFilter.EVENT_DATE] = + PeriodFilter( + ProgramType.TRACKER, + observableSortingInject, + observableOpenFilter, + resources.filterEventDateLabel(program.uid()), + ) + defaultTrackerFilters[ProgramFilter.ENROLLMENT_DATE] = + EnrollmentDateFilter( + ProgramType.TRACKER, + observableSortingInject, + observableOpenFilter, + program.displayEnrollmentDateLabel() ?: resources + .filterEnrollmentDateLabel(program.uid()), + ) + defaultTrackerFilters[ProgramFilter.ORG_UNIT] = + OrgUnitFilter( + FilterManager.getInstance().observeOrgUnitFilters(), + ProgramType.TRACKER, + observableSortingInject, + observableOpenFilter, + resources.filterOrgUnitLabel(), + ) + defaultTrackerFilters[ProgramFilter.SYNC_STATUS] = + SyncStateFilter( + ProgramType.TRACKER, + observableSortingInject, + observableOpenFilter, + resources.filterSyncLabel(), + ) + defaultTrackerFilters[ProgramFilter.ENROLLMENT_STATUS] = + EnrollmentStatusFilter( + ProgramType.TRACKER, + observableSortingInject, + observableOpenFilter, + resources.filterEnrollmentStatusLabel(program.uid()), + ) + defaultTrackerFilters[ProgramFilter.EVENT_STATUS] = + EventStatusFilter( + ProgramType.TRACKER, + observableSortingInject, + observableOpenFilter, + resources.filterEventStatusLabel(program.uid()), ) - var workingListFilter: WorkingListFilter? = null - if (workingLists.isNotEmpty()) { - workingListFilter = - WorkingListFilter( - workingLists, - ProgramType.TRACKER, - observableSortingInject, - observableOpenFilter, - "", - ) - } - return workingListFilter + val stagesByProgramUidAndUserAssignment = + d2 + .programModule() + .programStages() + .byProgramUid() + .eq(program.uid()) + .byEnableUserAssignment() + .eq(true) + + if (!stagesByProgramUidAndUserAssignment.blockingIsEmpty()) { + defaultTrackerFilters[ProgramFilter.ASSIGNED_TO_ME] = + AssignedFilter( + programType = ProgramType.TRACKER, + sortingItem = observableSortingInject, + openFilter = observableOpenFilter, + filterLabel = resources.filterAssignedToMeLabel(), + ) } - private fun getEventFilters( - program: Program, - programType: ProgramType, - ): List<FilterItem> { - val defaultFilters = createDefaultGetEventFilters(program, programType) - if (webAppIsNotConfigured()) { - if (orgUnitsCount == 1) { - defaultFilters.remove(ProgramFilter.ORG_UNIT) - } - return defaultFilters.values.toMutableList() - } + return defaultTrackerFilters + } - val eventFiltersWebApp = - d2 - .settingModule() - .appearanceSettings() - .getProgramFiltersByUid(program.uid()) - ?.toMutableMap() ?: mutableMapOf() + private fun getTrackerWorkingList(program: Program): WorkingListFilter? { + val workingLists = + d2 + .trackedEntityModule() + .trackedEntityInstanceFilters() + .byProgram() + .eq(program.uid()) + .withTrackedEntityInstanceEventFilters() + .blockingGet() + .mapNotNull { teiFilterToWorkingListItemMapper.map(it) } + .toMutableList() + workingLists.addAll( + d2 + .programModule() + .programStageWorkingLists() + .byProgram() + .eq(program.uid()) + .withAttributeValueFilters() + .blockingGet() + .mapNotNull { programStageToWorkingListItemMapper.map(it) } + .toMutableList(), + ) + + var workingListFilter: WorkingListFilter? = null + if (workingLists.isNotEmpty()) { + workingListFilter = + WorkingListFilter( + workingLists, + ProgramType.TRACKER, + observableSortingInject, + observableOpenFilter, + "", + ) + } + return workingListFilter + } + + private fun getEventFilters( + program: Program, + programType: ProgramType, + ): List<FilterItem> { + val orgUnitsCount = orgUnitsCount() + val defaultFilters = createDefaultGetEventFilters(program, programType) + if (webAppIsNotConfigured()) { if (orgUnitsCount == 1) { - eventFiltersWebApp.remove(ProgramFilter.ORG_UNIT) + defaultFilters.remove(ProgramFilter.ORG_UNIT) } + return defaultFilters.values.toMutableList() + } - val filtersToShow = - getFiltersApplyingWebAppConfig.execute(defaultFilters, eventFiltersWebApp) - - if (filtersToShow.isEmpty()) { - return mutableListOf() - } + val eventFiltersWebApp = + d2 + .settingModule() + .appearanceSettings() + .getProgramFiltersByUid(program.uid()) + ?.toMutableMap() ?: mutableMapOf() - return filtersToShow.toList() + if (orgUnitsCount == 1) { + eventFiltersWebApp.remove(ProgramFilter.ORG_UNIT) } - private fun getEventWorkingList(program: Program): WorkingListFilter? { - var workingListFilter: WorkingListFilter? = null - val workingLists = - d2 - .eventModule() - .eventFilters() - .byProgram() - .eq(program.uid()) - .blockingGet() - .mapNotNull { eventFilterToWorkingListItemMapper.map(it) } - - if (workingLists.isNotEmpty()) { - workingListFilter = - WorkingListFilter( - workingLists, - ProgramType.EVENT, - observableSortingInject, - observableOpenFilter, - "", - ) - } - return workingListFilter + val filtersToShow = + getFiltersApplyingWebAppConfig.execute(defaultFilters, eventFiltersWebApp) + + if (filtersToShow.isEmpty()) { + return mutableListOf() } - private fun createDefaultGetEventFilters( - program: Program, - programType: ProgramType, - ): LinkedHashMap<ProgramFilter, FilterItem> { - val defaultEventFilter = linkedMapOf<ProgramFilter, FilterItem>() + return filtersToShow.toList() + } - defaultEventFilter[ProgramFilter.EVENT_DATE] = - PeriodFilter( - programType, - observableSortingInject, - observableOpenFilter, - resources.filterDateLabel(), - ) + private fun getEventWorkingList(program: Program): WorkingListFilter? { + var workingListFilter: WorkingListFilter? = null + val workingLists = + d2 + .eventModule() + .eventFilters() + .byProgram() + .eq(program.uid()) + .blockingGet() + .mapNotNull { eventFilterToWorkingListItemMapper.map(it) } - defaultEventFilter[ProgramFilter.ORG_UNIT] = - OrgUnitFilter( - FilterManager.getInstance().observeOrgUnitFilters(), - programType, + if (workingLists.isNotEmpty()) { + workingListFilter = + WorkingListFilter( + workingLists, + ProgramType.EVENT, observableSortingInject, observableOpenFilter, - resources.filterOrgUnitLabel(), + "", ) + } + return workingListFilter + } - defaultEventFilter[ProgramFilter.SYNC_STATUS] = - SyncStateFilter( - programType, - observableSortingInject, - observableOpenFilter, - resources.filterSyncLabel(), - ) + private fun createDefaultGetEventFilters( + program: Program, + programType: ProgramType, + ): LinkedHashMap<ProgramFilter, FilterItem> { + val defaultEventFilter = linkedMapOf<ProgramFilter, FilterItem>() + + defaultEventFilter[ProgramFilter.EVENT_DATE] = + PeriodFilter( + programType, + observableSortingInject, + observableOpenFilter, + resources.filterDateLabel(), + ) + + defaultEventFilter[ProgramFilter.ORG_UNIT] = + OrgUnitFilter( + FilterManager.getInstance().observeOrgUnitFilters(), + programType, + observableSortingInject, + observableOpenFilter, + resources.filterOrgUnitLabel(), + ) + + defaultEventFilter[ProgramFilter.SYNC_STATUS] = + SyncStateFilter( + programType, + observableSortingInject, + observableOpenFilter, + resources.filterSyncLabel(), + ) + + defaultEventFilter[ProgramFilter.EVENT_STATUS] = + EventStatusFilter( + programType, + observableSortingInject, + observableOpenFilter, + resources.filterEventStatusLabel(program.uid()), + ) - defaultEventFilter[ProgramFilter.EVENT_STATUS] = - EventStatusFilter( + val stagesByProgramAndUserAssignment = + d2 + .programModule() + .programStages() + .byProgramUid() + .eq(program.uid()) + .byEnableUserAssignment() + .eq(true) + + if (!stagesByProgramAndUserAssignment.blockingIsEmpty()) { + defaultEventFilter[ProgramFilter.ASSIGNED_TO_ME] = + AssignedFilter( + programType = programType, + sortingItem = observableSortingInject, + openFilter = observableOpenFilter, + filterLabel = resources.filterAssignedToMeLabel(), + ) + } + val categoryCombo = + d2 + .categoryModule() + .categoryCombos() + .uid(program.categoryCombo()?.uid()) + .blockingGet() + if (categoryCombo?.isDefault == false) { + defaultEventFilter[ProgramFilter.CAT_COMBO] = + CatOptionComboFilter( + categoryCombo, + d2 + .categoryModule() + .categoryOptionCombos() + .byCategoryComboUid() + .eq(categoryCombo.uid()) + .blockingGet(), programType, observableSortingInject, observableOpenFilter, - resources.filterEventStatusLabel(program.uid()), + categoryCombo.displayName() ?: "", ) - - val stagesByProgramAndUserAssignment = - d2 - .programModule() - .programStages() - .byProgramUid() - .eq(program.uid()) - .byEnableUserAssignment() - .eq(true) - - if (!stagesByProgramAndUserAssignment.blockingIsEmpty()) { - defaultEventFilter[ProgramFilter.ASSIGNED_TO_ME] = - AssignedFilter( - programType = programType, - sortingItem = observableSortingInject, - openFilter = observableOpenFilter, - filterLabel = resources.filterAssignedToMeLabel(), - ) - } - val categoryCombo = - d2 - .categoryModule() - .categoryCombos() - .uid(program.categoryCombo()?.uid()) - .blockingGet() - if (categoryCombo?.isDefault == false) { - defaultEventFilter[ProgramFilter.CAT_COMBO] = - CatOptionComboFilter( - categoryCombo, - d2 - .categoryModule() - .categoryOptionCombos() - .byCategoryComboUid() - .eq(categoryCombo.uid()) - .blockingGet(), - programType, - observableSortingInject, - observableOpenFilter, - categoryCombo.displayName() ?: "", - ) - } - return defaultEventFilter } + return defaultEventFilter + } - fun applyWorkingList( - teiQuery: TrackedEntitySearchCollectionRepository, - currentWorkingList: WorkingListItem?, - ): TrackedEntitySearchCollectionRepository = - currentWorkingList?.let { - when (it) { - is EventWorkingList -> - null - is ProgramStageWorkingList -> - teiQuery.byProgramStageWorkingList().eq(it.uid) - is TrackedEntityInstanceWorkingList -> - teiQuery.byTrackedEntityInstanceFilter().eq(it.uid) - } - } ?: teiQuery - - fun applyWorkingList( - eventQuery: EventQueryCollectionRepository, - currentWorkingList: WorkingListItem?, - ): EventQueryCollectionRepository = - currentWorkingList?.let { - eventQuery.byEventFilter().eq(it.uid) - } ?: eventQuery - - fun collapseAllFilters() { - observableOpenFilter.set(Filters.NON) - } + fun applyWorkingList( + teiQuery: TrackedEntitySearchCollectionRepository, + currentWorkingList: WorkingListItem?, + ): TrackedEntitySearchCollectionRepository = + currentWorkingList?.let { + when (it) { + is EventWorkingList -> + null + + is ProgramStageWorkingList -> + teiQuery.byProgramStageWorkingList().eq(it.uid) + + is TrackedEntityInstanceWorkingList -> + teiQuery.byTrackedEntityInstanceFilter().eq(it.uid) + } + } ?: teiQuery + + fun applyWorkingList( + eventQuery: EventQueryCollectionRepository, + currentWorkingList: WorkingListItem?, + ): EventQueryCollectionRepository = + currentWorkingList?.let { + eventQuery.byEventFilter().eq(it.uid) + } ?: eventQuery + + fun collapseAllFilters() { + observableOpenFilter.set(Filters.NON) } +} diff --git a/commons/src/main/java/org/dhis2/commons/filters/data/TeiWorkingListScope.kt b/commons/src/main/java/org/dhis2/commons/filters/data/TeiWorkingListScope.kt index bd75e3c9bbc..8f0bd2650b1 100644 --- a/commons/src/main/java/org/dhis2/commons/filters/data/TeiWorkingListScope.kt +++ b/commons/src/main/java/org/dhis2/commons/filters/data/TeiWorkingListScope.kt @@ -28,6 +28,8 @@ sealed class WorkingListScope { abstract fun assignCount(): Int abstract fun value(filterType: Filters): String + + abstract fun workingListUid(): String? } data class EmptyWorkingList( @@ -54,9 +56,12 @@ data class EmptyWorkingList( override fun assignCount(): Int = 0 override fun value(filterType: Filters) = "" + + override fun workingListUid() = null } data class TeiWorkingListScope( + val workingListUid: String?, val enrollmentStatusList: List<String>?, val enrollmentDate: String?, val eventStatusList: List<String>?, @@ -99,9 +104,12 @@ data class TeiWorkingListScope( Filters.ENROLLMENT_STATUS -> enrollmentStatusList?.joinToString() ?: "" else -> "" } + + override fun workingListUid(): String? = workingListUid } data class EventWorkingListScope( + val workingListUid: String?, val stageUid: String?, val eventDate: String?, val eventStatusList: List<String>?, @@ -133,10 +141,13 @@ data class EventWorkingListScope( Filters.EVENT_STATUS -> eventStatusList?.joinToString() ?: "" else -> "" } + + override fun workingListUid(): String? = workingListUid } -fun TrackedEntityInstanceQueryRepositoryScope.mapToWorkingListScope(resources: FilterResources): TeiWorkingListScope = +fun TrackedEntityInstanceQueryRepositoryScope.mapToWorkingListScope(resources: FilterResources, workingListUid: String?): TeiWorkingListScope = TeiWorkingListScope( + workingListUid, enrollmentStatus()?.let { resources.enrollmentStatusToText(it) }, programDate()?.let { resources.dateFilterPeriodToText(it) }, resources.eventStatusToText( @@ -154,8 +165,9 @@ fun TrackedEntityInstanceQueryRepositoryScope.mapToWorkingListScope(resources: F dataValue().associateBy({ it.key() }, { it.value() }), ) -fun EventQueryRepositoryScope.mapToEventWorkingListScope(resources: FilterResources): EventWorkingListScope = +fun EventQueryRepositoryScope.mapToEventWorkingListScope(resources: FilterResources, workingListUid: String?): EventWorkingListScope = EventWorkingListScope( + workingListUid, programStage(), eventDate()?.let { resources.dateFilterPeriodToText(it) }, eventStatus()?.let { resources.eventStatusToText(it) }, diff --git a/commons/src/main/java/org/dhis2/commons/filters/data/TrackerFilterSearchHelper.kt b/commons/src/main/java/org/dhis2/commons/filters/data/TrackerFilterSearchHelper.kt index 9b0067c04f5..21f77b9abaa 100644 --- a/commons/src/main/java/org/dhis2/commons/filters/data/TrackerFilterSearchHelper.kt +++ b/commons/src/main/java/org/dhis2/commons/filters/data/TrackerFilterSearchHelper.kt @@ -46,7 +46,10 @@ class TrackerFilterSearchHelper filterManager.currentWorkingList(), ).also { filterManager.setWorkingListScope( - it.scope.mapToWorkingListScope(filterRepository.resources), + it.scope.mapToWorkingListScope( + filterRepository.resources, + filterManager.currentWorkingList()?.uid, + ), ) } } else { diff --git a/commons/src/main/java/org/dhis2/commons/filters/periods/data/FilterPeriodsRepository.kt b/commons/src/main/java/org/dhis2/commons/filters/periods/data/FilterPeriodsRepository.kt index 3470bfd0eea..7aa86a2c200 100644 --- a/commons/src/main/java/org/dhis2/commons/filters/periods/data/FilterPeriodsRepository.kt +++ b/commons/src/main/java/org/dhis2/commons/filters/periods/data/FilterPeriodsRepository.kt @@ -25,6 +25,7 @@ class FilterPeriodsRepository( FilterPeriodType.WEEKLY, FilterPeriodType.WEEKLY_WEDNESDAY, FilterPeriodType.WEEKLY_THURSDAY, + FilterPeriodType.WEEKLY_FRIDAY, FilterPeriodType.WEEKLY_SATURDAY, FilterPeriodType.WEEKLY_SUNDAY, FilterPeriodType.BI_WEEKLY, @@ -36,8 +37,11 @@ class FilterPeriodsRepository( FilterPeriodType.SIX_MONTHLY_APRIL, FilterPeriodType.SIX_MONTHLY_NOV, FilterPeriodType.YEARLY, + FilterPeriodType.FINANCIAL_FEB, FilterPeriodType.FINANCIAL_APRIL, FilterPeriodType.FINANCIAL_JULY, + FilterPeriodType.FINANCIAL_AUG, + FilterPeriodType.FINANCIAL_SEP, FilterPeriodType.FINANCIAL_OCT, FilterPeriodType.FINANCIAL_NOV, ) @@ -48,6 +52,7 @@ class FilterPeriodsRepository( FilterPeriodType.WEEKLY -> PeriodType.Weekly FilterPeriodType.WEEKLY_WEDNESDAY -> PeriodType.WeeklyWednesday FilterPeriodType.WEEKLY_THURSDAY -> PeriodType.WeeklyThursday + FilterPeriodType.WEEKLY_FRIDAY -> PeriodType.WeeklyFriday FilterPeriodType.WEEKLY_SATURDAY -> PeriodType.WeeklySaturday FilterPeriodType.WEEKLY_SUNDAY -> PeriodType.WeeklySunday FilterPeriodType.BI_WEEKLY -> PeriodType.BiWeekly @@ -59,8 +64,11 @@ class FilterPeriodsRepository( FilterPeriodType.SIX_MONTHLY_APRIL -> PeriodType.SixMonthlyApril FilterPeriodType.SIX_MONTHLY_NOV -> PeriodType.SixMonthlyNov FilterPeriodType.YEARLY -> PeriodType.Yearly + FilterPeriodType.FINANCIAL_FEB -> PeriodType.FinancialFeb FilterPeriodType.FINANCIAL_APRIL -> PeriodType.FinancialApril FilterPeriodType.FINANCIAL_JULY -> PeriodType.FinancialJuly + FilterPeriodType.FINANCIAL_AUG -> PeriodType.FinancialAug + FilterPeriodType.FINANCIAL_SEP -> PeriodType.FinancialSep FilterPeriodType.FINANCIAL_OCT -> PeriodType.FinancialOct FilterPeriodType.FINANCIAL_NOV -> PeriodType.FinancialNov FilterPeriodType.NONE -> PeriodType.Daily diff --git a/commons/src/main/java/org/dhis2/commons/filters/periods/data/PeriodTypeLabelProvider.kt b/commons/src/main/java/org/dhis2/commons/filters/periods/data/PeriodTypeLabelProvider.kt index 6f8730da45a..677f4750651 100644 --- a/commons/src/main/java/org/dhis2/commons/filters/periods/data/PeriodTypeLabelProvider.kt +++ b/commons/src/main/java/org/dhis2/commons/filters/periods/data/PeriodTypeLabelProvider.kt @@ -11,6 +11,7 @@ class PeriodTypeLabelProvider { FilterPeriodType.WEEKLY -> R.string.weekly FilterPeriodType.WEEKLY_WEDNESDAY -> R.string.weekly_start_wednesday FilterPeriodType.WEEKLY_THURSDAY -> R.string.weekly_start_thursday + FilterPeriodType.WEEKLY_FRIDAY -> R.string.weekly_start_friday FilterPeriodType.WEEKLY_SATURDAY -> R.string.weekly_start_saturday FilterPeriodType.WEEKLY_SUNDAY -> R.string.weekly_start_sunday FilterPeriodType.BI_WEEKLY -> R.string.bi_weekly @@ -22,8 +23,11 @@ class PeriodTypeLabelProvider { FilterPeriodType.SIX_MONTHLY_APRIL -> R.string.six_monthly_april FilterPeriodType.SIX_MONTHLY_NOV -> R.string.six_monthly_nov FilterPeriodType.YEARLY -> R.string.YEARLY + FilterPeriodType.FINANCIAL_FEB -> R.string.financial_year_february FilterPeriodType.FINANCIAL_APRIL -> R.string.financial_year_april FilterPeriodType.FINANCIAL_JULY -> R.string.financial_year_july + FilterPeriodType.FINANCIAL_AUG -> R.string.financial_year_august + FilterPeriodType.FINANCIAL_SEP -> R.string.financial_year_september FilterPeriodType.FINANCIAL_OCT -> R.string.financial_year_october FilterPeriodType.FINANCIAL_NOV -> R.string.financial_year_november } diff --git a/commons/src/main/java/org/dhis2/commons/filters/periods/di/FilterPeriodsModule.kt b/commons/src/main/java/org/dhis2/commons/filters/periods/di/FilterPeriodsModule.kt index 15bb0d6d421..402e5f224c5 100644 --- a/commons/src/main/java/org/dhis2/commons/filters/periods/di/FilterPeriodsModule.kt +++ b/commons/src/main/java/org/dhis2/commons/filters/periods/di/FilterPeriodsModule.kt @@ -7,7 +7,6 @@ import org.dhis2.commons.filters.periods.domain.GetFilterPeriods import org.dhis2.commons.filters.periods.ui.viewmodel.FilterPeriodsDialogViewmodel import org.koin.core.module.dsl.singleOf import org.koin.core.module.dsl.viewModel -import org.koin.core.parameter.parametersOf import org.koin.dsl.module val filterPeriodsModule = @@ -34,7 +33,7 @@ val filterPeriodsModule = FilterPeriodsDialogViewmodel( getFilterPeriods = get(), getFilterPeriodTypes = get(), - resourceManager = get { parametersOf(params.get()) }, + resourceManager = get(), periodTypeLabelProvider = get(), launchMode = params.get(), ) diff --git a/commons/src/main/java/org/dhis2/commons/filters/periods/model/FilterPeriodType.kt b/commons/src/main/java/org/dhis2/commons/filters/periods/model/FilterPeriodType.kt index e7af37e9a96..4d0fea03ad1 100644 --- a/commons/src/main/java/org/dhis2/commons/filters/periods/model/FilterPeriodType.kt +++ b/commons/src/main/java/org/dhis2/commons/filters/periods/model/FilterPeriodType.kt @@ -6,6 +6,7 @@ enum class FilterPeriodType { WEEKLY, WEEKLY_WEDNESDAY, WEEKLY_THURSDAY, + WEEKLY_FRIDAY, WEEKLY_SATURDAY, WEEKLY_SUNDAY, BI_WEEKLY, @@ -17,8 +18,11 @@ enum class FilterPeriodType { SIX_MONTHLY_APRIL, SIX_MONTHLY_NOV, YEARLY, + FINANCIAL_FEB, FINANCIAL_APRIL, FINANCIAL_JULY, + FINANCIAL_AUG, + FINANCIAL_SEP, FINANCIAL_OCT, FINANCIAL_NOV, } diff --git a/commons/src/main/java/org/dhis2/commons/locationprovider/LocationProviderImpl.kt b/commons/src/main/java/org/dhis2/commons/locationprovider/LocationProviderImpl.kt index 2959bc49df4..b924db56dde 100644 --- a/commons/src/main/java/org/dhis2/commons/locationprovider/LocationProviderImpl.kt +++ b/commons/src/main/java/org/dhis2/commons/locationprovider/LocationProviderImpl.kt @@ -10,7 +10,6 @@ import android.location.LocationListener import android.location.LocationManager import androidx.core.app.ActivityCompat import androidx.core.location.LocationListenerCompat -import okhttp3.internal.toImmutableList private const val FUSED_LOCATION_PROVIDER = "fused" @@ -69,7 +68,7 @@ open class LocationProviderImpl( onLocationProviderChanged() } } - val deviceProviders = locationManager.allProviders.toImmutableList() + val deviceProviders = locationManager.allProviders.toList() if (deviceProviders.contains(LocationManager.NETWORK_PROVIDER)) { locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, diff --git a/commons/src/main/java/org/dhis2/commons/periods/data/PeriodLabelProvider.kt b/commons/src/main/java/org/dhis2/commons/periods/data/PeriodLabelProvider.kt index cecd1dde871..a3b6aa7db02 100644 --- a/commons/src/main/java/org/dhis2/commons/periods/data/PeriodLabelProvider.kt +++ b/commons/src/main/java/org/dhis2/commons/periods/data/PeriodLabelProvider.kt @@ -57,6 +57,7 @@ class PeriodLabelProvider( PeriodType.Weekly, PeriodType.WeeklyWednesday, PeriodType.WeeklyThursday, + PeriodType.WeeklyFriday, PeriodType.WeeklySaturday, PeriodType.WeeklySunday, PeriodType.BiWeekly, @@ -80,9 +81,13 @@ class PeriodLabelProvider( PeriodType.BiMonthly, PeriodType.SixMonthly, PeriodType.SixMonthlyApril, PeriodType.Quarterly, PeriodType.QuarterlyNov, + PeriodType.FinancialFeb, PeriodType.FinancialApril, PeriodType.FinancialJuly, + PeriodType.FinancialAug, + PeriodType.FinancialSep, PeriodType.FinancialOct, + PeriodType.FinancialNov, -> if (periodBetweenYears) { FROM_TO_LABEL.format( @@ -116,6 +121,7 @@ class PeriodLabelProvider( PeriodType.Weekly, PeriodType.WeeklyWednesday, PeriodType.WeeklyThursday, + PeriodType.WeeklyFriday, PeriodType.WeeklySaturday, PeriodType.WeeklySunday, -> { @@ -181,9 +187,13 @@ class PeriodLabelProvider( ) } + PeriodType.FinancialFeb, PeriodType.FinancialApril, PeriodType.FinancialJuly, + PeriodType.FinancialAug, + PeriodType.FinancialSep, PeriodType.FinancialOct, + PeriodType.FinancialNov, -> FROM_TO_LABEL.format( SimpleDateFormat(MONTH_YEAR_FULL_FORMAT, locale).format(periodStartDate), diff --git a/commons/src/main/java/org/dhis2/commons/popupmenu/AppMenuHelper.kt b/commons/src/main/java/org/dhis2/commons/popupmenu/AppMenuHelper.kt index 4cec7237932..5f6a19cf9ff 100644 --- a/commons/src/main/java/org/dhis2/commons/popupmenu/AppMenuHelper.kt +++ b/commons/src/main/java/org/dhis2/commons/popupmenu/AppMenuHelper.kt @@ -1,7 +1,6 @@ package org.dhis2.commons.popupmenu import android.content.Context -import android.os.Build import android.view.ContextThemeWrapper import android.view.Gravity import android.view.View @@ -26,11 +25,7 @@ class AppMenuHelper private constructor( fun show() { val contextWrapper = ContextThemeWrapper(context, R.style.PopupMenuMarginStyle) popupMenu = - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) { - PopupMenu(contextWrapper, anchor, Gravity.END, 0, R.style.PopupMenuMarginStyle) - } else { - PopupMenu(contextWrapper, anchor, Gravity.END) - } + PopupMenu(contextWrapper, anchor, Gravity.END, 0, R.style.PopupMenuMarginStyle) try { val fields = popupMenu.javaClass.declaredFields for (field in fields) { diff --git a/commons/src/main/java/org/dhis2/commons/reporting/CrashReportModule.kt b/commons/src/main/java/org/dhis2/commons/reporting/CrashReportModule.kt index 31f48c6c5a1..c90bd0f6ce4 100644 --- a/commons/src/main/java/org/dhis2/commons/reporting/CrashReportModule.kt +++ b/commons/src/main/java/org/dhis2/commons/reporting/CrashReportModule.kt @@ -11,5 +11,8 @@ import javax.inject.Singleton class CrashReportModule internal constructor() { @Provides @Singleton - fun provideCrashReportController(context: Context): CrashReportController = CrashReportControllerImpl(context) + fun provideCrashReportController(context: Context): CrashReportController = CrashReportControllerImpl( + context = context, + sentryDsn = "", + ) } diff --git a/commons/src/main/java/org/dhis2/commons/resources/ColorUtils.kt b/commons/src/main/java/org/dhis2/commons/resources/ColorUtils.kt index cea91e1e319..0cf64b8f39a 100644 --- a/commons/src/main/java/org/dhis2/commons/resources/ColorUtils.kt +++ b/commons/src/main/java/org/dhis2/commons/resources/ColorUtils.kt @@ -8,8 +8,11 @@ import android.graphics.PorterDuff import android.graphics.drawable.Drawable import android.util.TypedValue import androidx.core.graphics.ColorUtils +import androidx.core.graphics.toColorInt import org.dhis2.commons.R import java.util.Objects +import kotlin.math.pow +import androidx.compose.ui.graphics.Color as ComposeColor class ColorUtils { companion object { @@ -24,16 +27,7 @@ class ColorUtils { val b = hexColor[3] newHexColor = "#$r$r$g$g$b$b" // formatted to #ffff } - return Color.parseColor(newHexColor) - } - - fun getPrimaryColorWithAlpha( - context: Context, - primaryLight: ColorType, - alpha: Float, - ): Int { - val primaryColor = getPrimaryColor(context, primaryLight) - return ColorUtils.setAlphaComponent(primaryColor, 155) + return newHexColor.toColorInt() } fun withAlpha(color: Int): Int = ColorUtils.setAlphaComponent(color, 155) @@ -67,27 +61,18 @@ class ColorUtils { return drawableToTint } - fun tintDrawableWithColor( - drawableToTint: Drawable, - tintColor: Int, - ): Drawable { - drawableToTint.setTint(tintColor) - drawableToTint.setTintMode(PorterDuff.Mode.SRC_IN) - return drawableToTint - } - fun getContrastColor(color: Int): Int = if (getContrast(color) > 0.179) { - Color.parseColor("#b3000000") + "#b3000000".toColorInt() } else { - Color.parseColor("#e6ffffff") + "#e6ffffff".toColorInt() } fun getAlphaContrastColor(color: Int): Int = if (getContrast(color) > 0.500) { - Color.parseColor("#b3000000") + "#b3000000".toColorInt() } else { - Color.parseColor("#e6ffffff") + "#e6ffffff".toColorInt() } private fun getContrast(color: Int): Double { @@ -99,7 +84,7 @@ class ColorUtils { var green: Double? = null var blue: Double? = null rgb.forEach { - if (it <= 0.03928) it / 12.92 else Math.pow((it + 0.055) / 1.055, 2.4) + if (it <= 0.03928) it / 12.92 else ((it + 0.055) / 1.055).pow(2.4) if (red == null) { red = it } else if (green == null) { @@ -111,80 +96,21 @@ class ColorUtils { return 0.2126 * red!! + 0.7152 * green!! + 0.0722 * blue!! } - fun getThemeFromColor(color: String?): Int = - when (color) { - "#ffcdd2" -> R.style.colorPrimary_Pink - "#e57373" -> R.style.colorPrimary_e57 - "#d32f2f" -> R.style.colorPrimary_d32 - "#f06292" -> R.style.colorPrimary_f06 - "#c2185b" -> R.style.colorPrimary_c21 - "#880e4f" -> R.style.colorPrimary_880 - "#f50057" -> R.style.colorPrimary_f50 - "#e1bee7" -> R.style.colorPrimary_e1b - "#ba68c8" -> R.style.colorPrimary_ba6 - "#8e24aa" -> R.style.colorPrimary_8e2 - "#aa00ff" -> R.style.colorPrimary_aa0 - "#7e57c2" -> R.style.colorPrimary_7e5 - "#4527a0" -> R.style.colorPrimary_452 - "#7c4dff" -> R.style.colorPrimary_7c4 - "#6200ea" -> R.style.colorPrimary_620 - "#c5cae9" -> R.style.colorPrimary_c5c - "#7986cb" -> R.style.colorPrimary_798 - "#3949ab" -> R.style.colorPrimary_394 - "#304ffe" -> R.style.colorPrimary_304 - "#e3f2fd" -> R.style.colorPrimary_e3f - "#64b5f6" -> R.style.colorPrimary_64b - "#1976d2" -> R.style.colorPrimary_197 - "#0288d1" -> R.style.colorPrimary_028 - "#40c4ff" -> R.style.colorPrimary_40c - "#00b0ff" -> R.style.colorPrimary_00b - "#80deea" -> R.style.colorPrimary_80d - "#00acc1" -> R.style.colorPrimary_00a - "#00838f" -> R.style.colorPrimary_008 - "#006064" -> R.style.colorPrimary_006 - "#e0f2f1" -> R.style.colorPrimary_e0f - "#80cbc4" -> R.style.colorPrimary_80c - "#00695c" -> R.style.colorPrimary_0069 - "#64ffda" -> R.style.colorPrimary_64f - "#c8e6c9" -> R.style.colorPrimary_c8e - "#66bb6a" -> R.style.colorPrimary_66b - "#2e7d32" -> R.style.colorPrimary_2e7 - "#60ad5e" -> R.style.colorPrimary_60a - "#00e676" -> R.style.colorPrimary_00e - "#aed581" -> R.style.colorPrimary_aed - "#689f38" -> R.style.colorPrimary_689 - "#33691e" -> R.style.colorPrimary_336 - "#76ff03" -> R.style.colorPrimary_76f - "#64dd17" -> R.style.colorPrimary_64d - "#cddc39" -> R.style.colorPrimary_cdd - "#9e9d24" -> R.style.colorPrimary_9e9 - "#827717" -> R.style.colorPrimary_827 - "#fff9c4" -> R.style.colorPrimary_fff - "#fbc02d" -> R.style.colorPrimary_fbc - "#f57f17" -> R.style.colorPrimary_f57 - "#ffff00" -> R.style.colorPrimary_ffff - "#ffcc80" -> R.style.colorPrimary_ffc - "#ffccbc" -> R.style.colorPrimary_ffcc - "#ffab91" -> R.style.colorPrimary_ffa - "#bcaaa4" -> R.style.colorPrimary_bca - "#8d6e63" -> R.style.colorPrimary_8d6 - "#4e342e" -> R.style.colorPrimary_4e3 - "#fafafa" -> R.style.colorPrimary_faf - "#bdbdbd" -> R.style.colorPrimary_bdb - "#757575" -> R.style.colorPrimary_757 - "#424242" -> R.style.colorPrimary_424 - "#cfd8dc" -> R.style.colorPrimary_cfd - "#b0bec5" -> R.style.colorPrimary_b0b - "#607d8b" -> R.style.colorPrimary_607 - "#37474f" -> R.style.colorPrimary_374 - else -> -1 - } + fun getThemeFromColor(color: String?): Int = paletteThemes[color] ?: -1 // fun getPrimaryColor( context: Context, colorType: ColorType, ): Int = context.getPrimaryColor(colorType) + + fun getThemePrimaryColor(context: Context): ComposeColor { + val typedValue = TypedValue() + val a = context.theme.obtainStyledAttributes(typedValue.data, intArrayOf(android.R.attr.colorPrimary)) + val color = a.getColor(0, 0) + a.recycle() + return ComposeColor(color) + } } enum class ColorType { diff --git a/commons/src/main/java/org/dhis2/commons/resources/DhisPeriodUtils.kt b/commons/src/main/java/org/dhis2/commons/resources/DhisPeriodUtils.kt index 834db2aa3f1..b8a90f020c3 100644 --- a/commons/src/main/java/org/dhis2/commons/resources/DhisPeriodUtils.kt +++ b/commons/src/main/java/org/dhis2/commons/resources/DhisPeriodUtils.kt @@ -34,6 +34,7 @@ class DhisPeriodUtils( PeriodType.Weekly, PeriodType.WeeklyWednesday, PeriodType.WeeklyThursday, + PeriodType.WeeklyFriday, PeriodType.WeeklySaturday, PeriodType.WeeklySunday, -> { @@ -73,9 +74,13 @@ class DhisPeriodUtils( PeriodType.QuarterlyNov, PeriodType.SixMonthly, PeriodType.SixMonthlyApril, + PeriodType.FinancialFeb, PeriodType.FinancialApril, PeriodType.FinancialJuly, + PeriodType.FinancialAug, + PeriodType.FinancialSep, PeriodType.FinancialOct, + PeriodType.FinancialNov, -> formattedDate = periodString.format( diff --git a/commons/src/main/java/org/dhis2/commons/resources/PaletteThemes.kt b/commons/src/main/java/org/dhis2/commons/resources/PaletteThemes.kt new file mode 100644 index 00000000000..a3a9c88ed45 --- /dev/null +++ b/commons/src/main/java/org/dhis2/commons/resources/PaletteThemes.kt @@ -0,0 +1,90 @@ +package org.dhis2.commons.resources + +import org.dhis2.commons.R + +/** + * Maps each hex color to its corresponding Android theme style resource. + */ +val paletteThemes: Map<String, Int> = + mapOf( + // Reds / Pinks + "#ffcdd2" to R.style.colorPrimary_Pink, + "#e57373" to R.style.colorPrimary_e57, + "#d32f2f" to R.style.colorPrimary_d32, + "#f06292" to R.style.colorPrimary_f06, + "#c2185b" to R.style.colorPrimary_c21, + "#880e4f" to R.style.colorPrimary_880, + "#f50057" to R.style.colorPrimary_f50, + // Purples + "#e1bee7" to R.style.colorPrimary_e1b, + "#ba68c8" to R.style.colorPrimary_ba6, + "#8e24aa" to R.style.colorPrimary_8e2, + "#aa00ff" to R.style.colorPrimary_aa0, + // Deep Purples / Indigos + "#7e57c2" to R.style.colorPrimary_7e5, + "#4527a0" to R.style.colorPrimary_452, + "#7c4dff" to R.style.colorPrimary_7c4, + "#6200ea" to R.style.colorPrimary_620, + "#c5cae9" to R.style.colorPrimary_c5c, + "#7986cb" to R.style.colorPrimary_798, + "#3949ab" to R.style.colorPrimary_394, + "#304ffe" to R.style.colorPrimary_304, + // Blues + "#e3f2fd" to R.style.colorPrimary_e3f, + "#64b5f6" to R.style.colorPrimary_64b, + "#1976d2" to R.style.colorPrimary_197, + "#0288d1" to R.style.colorPrimary_028, + "#40c4ff" to R.style.colorPrimary_40c, + "#00b0ff" to R.style.colorPrimary_00b, + // Cyans / Teals + "#80deea" to R.style.colorPrimary_80d, + "#00acc1" to R.style.colorPrimary_00a, + "#00838f" to R.style.colorPrimary_008, + "#006064" to R.style.colorPrimary_006, + "#e0f2f1" to R.style.colorPrimary_e0f, + "#80cbc4" to R.style.colorPrimary_80c, + "#00695c" to R.style.colorPrimary_0069, + "#64ffda" to R.style.colorPrimary_64f, + // Greens + "#c8e6c9" to R.style.colorPrimary_c8e, + "#66bb6a" to R.style.colorPrimary_66b, + "#2e7d32" to R.style.colorPrimary_2e7, + "#60ad5e" to R.style.colorPrimary_60a, + "#00e676" to R.style.colorPrimary_00e, + // Light Greens / Limes + "#aed581" to R.style.colorPrimary_aed, + "#689f38" to R.style.colorPrimary_689, + "#33691e" to R.style.colorPrimary_336, + "#76ff03" to R.style.colorPrimary_76f, + "#64dd17" to R.style.colorPrimary_64d, + "#cddc39" to R.style.colorPrimary_cdd, + "#9e9d24" to R.style.colorPrimary_9e9, + "#827717" to R.style.colorPrimary_827, + // Yellows + "#fff9c4" to R.style.colorPrimary_fff, + "#fbc02d" to R.style.colorPrimary_fbc, + "#f57f17" to R.style.colorPrimary_f57, + "#ffff00" to R.style.colorPrimary_ffff, + // Oranges / Browns + "#ffcc80" to R.style.colorPrimary_ffc, + "#ffccbc" to R.style.colorPrimary_ffcc, + "#ffab91" to R.style.colorPrimary_ffa, + "#bcaaa4" to R.style.colorPrimary_bca, + "#8d6e63" to R.style.colorPrimary_8d6, + "#4e342e" to R.style.colorPrimary_4e3, + // Greys + "#fafafa" to R.style.colorPrimary_faf, + "#bdbdbd" to R.style.colorPrimary_bdb, + "#757575" to R.style.colorPrimary_757, + "#424242" to R.style.colorPrimary_424, + // Blue Greys + "#cfd8dc" to R.style.colorPrimary_cfd, + "#b0bec5" to R.style.colorPrimary_b0b, + "#607d8b" to R.style.colorPrimary_607, + "#37474f" to R.style.colorPrimary_374, + // User settings old styles + "#ea5911" to R.style.OrangeTheme, + "#467e4a" to R.style.GreenTheme, + "#276696" to R.style.AppTheme, + "#b40303" to R.style.RedTheme, + ) diff --git a/commons/src/main/java/org/dhis2/commons/simprints/usecases/SimprintsOrderSearchResultsByIdentifyResponseUseCase.kt b/commons/src/main/java/org/dhis2/commons/simprints/usecases/SimprintsOrderSearchResultsByIdentifyResponseUseCase.kt index 33b712f230a..11d1f5a7823 100644 --- a/commons/src/main/java/org/dhis2/commons/simprints/usecases/SimprintsOrderSearchResultsByIdentifyResponseUseCase.kt +++ b/commons/src/main/java/org/dhis2/commons/simprints/usecases/SimprintsOrderSearchResultsByIdentifyResponseUseCase.kt @@ -19,11 +19,39 @@ class SimprintsOrderSearchResultsByIdentifyResponseUseCase( searchFields: Iterable<SimprintsSearchUtils.SearchField>, queryData: Map<String, List<String>?>?, searchTrackedEntities: suspend () -> List<TrackedEntitySearchItem>, - ): List<TrackedEntitySearchItem>? { + ): List<TrackedEntitySearchItem>? = + invoke( + searchFields = searchFields, + queryData = queryData, + searchTrackedEntities = searchTrackedEntities, + getUid = { trackedEntity -> + trackedEntity.uid() + }, + getAttributeValue = { trackedEntity, fieldUid -> + trackedEntity.attributeValues + ?.firstOrNull { attribute -> + attribute.attribute == fieldUid + }?.value + }, + ) + + suspend operator fun <T> invoke( + searchFields: Iterable<SimprintsSearchUtils.SearchField>, + queryData: Map<String, List<String>?>?, + searchTrackedEntities: suspend () -> List<T>, + getUid: (T) -> String, + getAttributeValue: (T, String) -> String?, + ): List<T>? { val order = getIdentifyResponseOrder(searchFields, queryData) ?: return null return searchTrackedEntities() .map { trackedEntity -> - trackedEntity to getMatchedGuid(trackedEntity, order) + trackedEntity to + getMatchedGuid( + searchItem = trackedEntity, + order = order, + getUid = getUid, + getAttributeValue = getAttributeValue, + ) }.sortedBy { (_, guid) -> guid?.let(order.orderByGuid::get) ?: Int.MAX_VALUE }.map { (trackedEntity, _) -> @@ -46,17 +74,18 @@ class SimprintsOrderSearchResultsByIdentifyResponseUseCase( } } - private suspend fun getMatchedGuid( - searchItem: TrackedEntitySearchItem, + private suspend fun <T> getMatchedGuid( + searchItem: T, order: IdentifyResponseOrder, + getUid: (T) -> String, + getAttributeValue: (T, String) -> String?, ): String? { - searchItem.attributeValues - ?.firstOrNull { attribute -> - attribute.attribute == order.fieldUid && attribute.value in order.orderByGuid - }?.run { return value } + getAttributeValue(searchItem, order.fieldUid) + ?.takeIf { it in order.orderByGuid } + ?.let { return it } return simprintsD2Repository - .getTrackedEntityAttributeValue(searchItem.uid(), order.fieldUid) + .getTrackedEntityAttributeValue(getUid(searchItem), order.fieldUid) ?.takeIf { it in order.orderByGuid } } } diff --git a/ui-components/src/main/res/drawable/ic_delete.xml b/commons/src/main/res/drawable/ic_delete.xml similarity index 100% rename from ui-components/src/main/res/drawable/ic_delete.xml rename to commons/src/main/res/drawable/ic_delete.xml diff --git a/ui-components/src/main/res/drawable/ic_error_outline.xml b/commons/src/main/res/drawable/ic_error_outline.xml similarity index 100% rename from ui-components/src/main/res/drawable/ic_error_outline.xml rename to commons/src/main/res/drawable/ic_error_outline.xml diff --git a/ui-components/src/main/res/drawable/ic_event_status_complete.xml b/commons/src/main/res/drawable/ic_event_status_complete.xml similarity index 100% rename from ui-components/src/main/res/drawable/ic_event_status_complete.xml rename to commons/src/main/res/drawable/ic_event_status_complete.xml diff --git a/ui-components/src/main/res/drawable/ic_file.xml b/commons/src/main/res/drawable/ic_file.xml similarity index 100% rename from ui-components/src/main/res/drawable/ic_file.xml rename to commons/src/main/res/drawable/ic_file.xml diff --git a/ui-components/src/main/res/drawable/ic_file_download.xml b/commons/src/main/res/drawable/ic_file_download.xml similarity index 100% rename from ui-components/src/main/res/drawable/ic_file_download.xml rename to commons/src/main/res/drawable/ic_file_download.xml diff --git a/ui-components/src/main/res/drawable/ic_home_negative.xml b/commons/src/main/res/drawable/ic_home_negative.xml similarity index 100% rename from ui-components/src/main/res/drawable/ic_home_negative.xml rename to commons/src/main/res/drawable/ic_home_negative.xml diff --git a/ui-components/src/main/res/drawable/ic_home_outline.xml b/commons/src/main/res/drawable/ic_home_outline.xml similarity index 100% rename from ui-components/src/main/res/drawable/ic_home_outline.xml rename to commons/src/main/res/drawable/ic_home_outline.xml diff --git a/ui-components/src/main/res/drawable/ic_home_positive.xml b/commons/src/main/res/drawable/ic_home_positive.xml similarity index 100% rename from ui-components/src/main/res/drawable/ic_home_positive.xml rename to commons/src/main/res/drawable/ic_home_positive.xml diff --git a/ui-components/src/main/res/drawable/ic_input_info.xml b/commons/src/main/res/drawable/ic_input_info.xml similarity index 100% rename from ui-components/src/main/res/drawable/ic_input_info.xml rename to commons/src/main/res/drawable/ic_input_info.xml diff --git a/ui-components/src/main/res/drawable/ic_saved_check.xml b/commons/src/main/res/drawable/ic_saved_check.xml similarity index 100% rename from ui-components/src/main/res/drawable/ic_saved_check.xml rename to commons/src/main/res/drawable/ic_saved_check.xml diff --git a/ui-components/src/main/res/drawable/ic_tree_node_close.xml b/commons/src/main/res/drawable/ic_tree_node_close.xml similarity index 100% rename from ui-components/src/main/res/drawable/ic_tree_node_close.xml rename to commons/src/main/res/drawable/ic_tree_node_close.xml diff --git a/ui-components/src/main/res/drawable/ic_tree_node_default.xml b/commons/src/main/res/drawable/ic_tree_node_default.xml similarity index 100% rename from ui-components/src/main/res/drawable/ic_tree_node_default.xml rename to commons/src/main/res/drawable/ic_tree_node_default.xml diff --git a/ui-components/src/main/res/drawable/ic_tree_node_open.xml b/commons/src/main/res/drawable/ic_tree_node_open.xml similarity index 100% rename from ui-components/src/main/res/drawable/ic_tree_node_open.xml rename to commons/src/main/res/drawable/ic_tree_node_open.xml diff --git a/ui-components/src/main/res/drawable/ic_warning_alert.xml b/commons/src/main/res/drawable/ic_warning_alert.xml similarity index 100% rename from ui-components/src/main/res/drawable/ic_warning_alert.xml rename to commons/src/main/res/drawable/ic_warning_alert.xml diff --git a/ui-components/src/main/res/drawable/image_not_supported.xml b/commons/src/main/res/drawable/image_not_supported.xml similarity index 100% rename from ui-components/src/main/res/drawable/image_not_supported.xml rename to commons/src/main/res/drawable/image_not_supported.xml diff --git a/commons/src/main/res/layout/calendar_picker_view.xml b/commons/src/main/res/layout/calendar_picker_view.xml index 9e0dae8fcbf..65fdbd8f1c5 100644 --- a/commons/src/main/res/layout/calendar_picker_view.xml +++ b/commons/src/main/res/layout/calendar_picker_view.xml @@ -31,7 +31,6 @@ </FrameLayout> <LinearLayout - app:versionCustomVisibility="@{true}" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> diff --git a/commons/src/main/res/layout/item_header_filter.xml b/commons/src/main/res/layout/item_header_filter.xml index 36920bd1b42..45f259dfdbb 100644 --- a/commons/src/main/res/layout/item_header_filter.xml +++ b/commons/src/main/res/layout/item_header_filter.xml @@ -41,7 +41,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - app:tint="@color/white" + app:tint="?onToolbarColor" tools:src="@drawable/ic_calendar_positive" /> <androidx.constraintlayout.widget.ConstraintLayout @@ -57,6 +57,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/ic_oval_shape_white" + android:backgroundTint="?onToolbarColor" android:gravity="center" android:includeFontPadding="false" android:text='@{""+filterCount}' @@ -78,7 +79,7 @@ android:maxLines="1" android:text="@{filterItem.filterLabel}" android:textAllCaps="true" - android:textColor="@color/white" + android:textColor="?onToolbarColor" android:textSize="12sp" app:layout_constraintBottom_toTopOf="@id/filterValues" app:layout_constraintEnd_toEndOf="parent" @@ -97,7 +98,7 @@ android:fontFamily="@font/rubik_light" android:maxLines="1" android:text="@{filterItem.observeCount() > 0 ? filterItem.getFilterValue(@string/filters_active) : @string/filters_disabled}" - android:textColor="@color/white" + android:textColor="?onToolbarColor" android:textSize="10sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -120,7 +121,8 @@ app:layout_constraintEnd_toStartOf="@id/filterArrow" app:layout_constraintStart_toEndOf="@id/filterTextLayout" app:sortingItem="@{filterItem.sortingItem}" - app:srcCompat="@drawable/ic_sort_deactivated" /> + app:srcCompat="@drawable/ic_sort_deactivated" + app:tint="?onToolbarColor" /> <ImageView @@ -138,7 +140,7 @@ app:layout_constraintStart_toEndOf="@id/sortingIcon" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/ic_arrow_down" - app:tint="@color/white" /> + app:tint="?onToolbarColor" /> </androidx.constraintlayout.widget.ConstraintLayout> diff --git a/commons/src/main/res/values-ar-rIQ/strings.xml b/commons/src/main/res/values-ar-rIQ/strings.xml index c34ec174a81..94cd7cf5951 100644 --- a/commons/src/main/res/values-ar-rIQ/strings.xml +++ b/commons/src/main/res/values-ar-rIQ/strings.xml @@ -8,13 +8,10 @@ <string name="navigation_programs">البرامج</string> <string name="navigation_relationships">علاقات</string> <string name="navigation_tei_data">التفاصيل</string> - <string name="event_overview">التفاصيل</string> <string name="search">البحث</string> <string name="data_sets">حزم البيانات</string> - <string name="filters_title_status">الحالة</string> <string name="filters_title_date">التاريخ</string> <string name="select_period">تحديد نوع الفترة الزمنية</string> - <string name="daily_period">يومي</string> <string name="weekly">أسبوعي</string> <string name="bi_weekly">كل اسبوعين</string> <string name="monthly">شهري</string> @@ -62,8 +59,6 @@ <string name="section_indicators">المؤشرات</string> <string name="section_charts">المخططات البيانية</string> <string name="complete">مكتمل</string> - <string name="default_table_header_label">القيمة</string> - <string name="default_empty_dataset_section_label">البيانات</string> <string name="overdue_today">اليوم</string> <string name="remove">إزالة</string> <string name="period_daily_title">يومي</string> diff --git a/commons/src/main/res/values-ar/strings.xml b/commons/src/main/res/values-ar/strings.xml index 3259c450693..24fd62e1b7f 100644 --- a/commons/src/main/res/values-ar/strings.xml +++ b/commons/src/main/res/values-ar/strings.xml @@ -8,7 +8,6 @@ <string name="cancel">إلغاء</string> <string name="yes">نعم</string> <string name="no">لا</string> - <string name="clear_all">الغاء التحديد</string> <string name="navigation_list_view">عرض قائمة</string> <string name="navigation_table_view">عرض جدول</string> <string name="navigation_map_view">عرض خريطة</string> @@ -19,7 +18,6 @@ <string name="navigation_notes">الملاحظات</string> <string name="navigation_data_entry">إدخال البيانات</string> <string name="navigation_tei_data">التفاصيل</string> - <string name="event_overview">التفاصيل</string> <string name="select_option">تحديد الخيار</string> <string name="search">بحث</string> <string name="events">الأحداث</string> @@ -33,14 +31,11 @@ <string name="filters_disabled">لم يتم تطبيق عوامل تصفية</string> <string name="filters_title_period">الفترة الزمنية</string> <string name="filters_title_org_unit">الوحدة التنظيمية</string> - <string name="filters_title_sorting">فرز</string> - <string name="filters_title_status">الحالة</string> <string name="filters_title_state">حالة التزامن</string> <string name="filters_title_assigned">تم تعيينه لي</string> <string name="filters_title_date">التاريخ</string> <string name="filter_follow_up_label">تمت متابعة %s</string> <string name="select_period">تحديد نوع الفترة الزمنية</string> - <string name="daily_period">يومي</string> <string name="weekly">أسبوعي</string> <string name="bi_weekly">كل اسبوعين</string> <string name="weekly_start_wednesday">أسبوعياً ابتداءً من يوم الأربعاء</string> @@ -59,13 +54,10 @@ <string name="financial_year_october">تبدأ السنة المالية في اكتوبر</string> <string name="financial_year_november">تبدأ السنة المالية في نوفمبر</string> - - <!-- State --> <string name="state_synced">حالة التزامن</string> <string name="state_to_post">للإرسال</string> <string name="state_to_update">للتحديث</string> - <string name="state_to_delete">للحذف</string> <string name="state_error">خطأ</string> <string name="state_warning">تحذير</string> <string name="state_uploading">رفع</string> @@ -158,7 +150,6 @@ <!--SDK error codes--> <string name="login_error_null_pass">كلمة المرور مفقودة. الرجاء إدخال كلمة المرور.</string> <string name="login_error_null_username">اسم المستخدم مفقود. الرجاء إدخال اسم المستخدم.</string> - <string name="login_error_dhis_version">يقوم هذا الخادم بتشغيل إصدار dhis مختلف عن 2.29. قم بتحديث إصدار الخادم الخاص بك أو استخدم بيئة الاختبار للمتابعة.</string> <string name="login_error_dhis_version_v2">يقوم هذا الخادم بتشغيل إصدار DHIS2 مختلف عن %s. قم بتحديث إصدار الخادم الخاص بك أو اتصل بالمسؤول.</string> <string name="login_error_unsuccessful_response">هناك خطأ ما. يرجى التحقق من صحة عنوان URL الخاص بالخادم واسم المستخدم وكلمة المرور وحاول مرة أخرى.</string> <string name="login_error_error_response">آسف! فشل شيء ما من جانب الخادم.</string> @@ -212,7 +203,6 @@ <string name="error_org_unit_scope">البحث على الإنترنت متاح فقط للوحدات التنظيمية المتاحة للمستخدم للبحث.</string> <string name="error_server_unavailable">الخادم غير متوفر حالياً. حاول مرة أخرى في وقت لاحق.</string> <string name="error_no_internet_connection">أنت غير متصل بالإنترنت. اتصل بالإنترنت وحاول مرة أخرى.</string> - <string name="unsupported_field_description">هذا الحقل غير متاح للإدخال بالموبايل</string> <string name="add_image">إضافة صورة</string> <string name="add_file">إضافة ملف</string> <string name="action_ok">موافق\!</string> @@ -221,9 +211,7 @@ <string name="not_now">ليس الان</string> <string name="review">المراجعة</string> <string name="complete">مكتمل</string> - <string name="default_table_header_label">القيمة</string> <string name="discard_changes">تجاهل التغييرات</string> - <string name="default_empty_dataset_section_label">بيانات</string> <string name="title_network_connection_unavailable">اتصال الشبكة غير متوفر</string> <string name="msg_network_connection_maps">يلزم الاتصال بالإنترنت لاستخدام الخرائط.</string> @@ -231,14 +219,11 @@ <string name="overdue_due_today">موعد استحقاقها اليوم</string> <string name="file_downloaded">تم تنزيل الملف بنجاح</string> - <string name="break_glass_dialog_description_V2">يجب عليك تقديم سبب للتحقق من %s في هذا البرنامج المحمي. سيتم تسجيل جميع الأنشطة.</string> <string name="edition_enrollment_is_no_open_V2">هذه البيانات غير قابلة للتحرير لأن %s اكتملت أو تم إلغاؤها</string> <string name="enrolling_ou">مسجل في:</string> <string name="delete_event_label">حذف %s</string> <string name="week_period_span_default_label">الأسابيع %d %s إلى %s</string> - <string name="enrollment_reopen">إعادة فتح</string> - <string name="sync_retry">إعادة محاولة المزامنة</string> <string name="syncing">مزامنة...</string> <string name="remove">إزلة</string> @@ -250,4 +235,5 @@ <string name="period_quarter_title">ربع السنة</string> <string name="period_six_monthly_title">ستة أشهر</string> <string name="period_yearly_title">سنة</string> - </resources> + <string name="action_clear_all">تنظيف الكل</string> +</resources> diff --git a/commons/src/main/res/values-bn/strings.xml b/commons/src/main/res/values-bn/strings.xml index b67f407d0cd..057ea8ec990 100644 --- a/commons/src/main/res/values-bn/strings.xml +++ b/commons/src/main/res/values-bn/strings.xml @@ -4,7 +4,6 @@ <string name="no">না</string> <string name="navigation_notes">মন্তব্য</string> <string name="navigation_data_entry">তথ্যের অন্তর্ভুক্তি</string> - <string name="filters_title_status">অবস্থা</string> <string name="filters_title_date">তারিখ</string> <string name="state_error">ভুল</string> <string name="filter_event_status_completed">সম্পন্ন</string> diff --git a/commons/src/main/res/values-ckb/strings.xml b/commons/src/main/res/values-ckb/strings.xml index e8c0ed47541..cbb8da8f4b8 100644 --- a/commons/src/main/res/values-ckb/strings.xml +++ b/commons/src/main/res/values-ckb/strings.xml @@ -11,7 +11,6 @@ <string name="done">تةواو كرا</string> <string name="filters_title_period">ماوة</string> - <string name="filters_title_status">پێگە</string> <string name="filters_title_date">بەروار</string> <string name="state_error">هەڵە</string> <string name="filter_event_status_completed">تەواوبوو</string> @@ -29,7 +28,6 @@ <string name="section_feedback">ڕاووبۆچون</string> <string name="section_indicators">نیشاندەر</string> <string name="complete">تەواوبکە</string> - <string name="default_table_header_label">بةها</string> <string name="overdue_today">ئەمڕۆ</string> <string name="remove">لابردن</string> </resources> diff --git a/commons/src/main/res/values-cs/strings.xml b/commons/src/main/res/values-cs/strings.xml index 16d1303beb7..3890fd67a7c 100644 --- a/commons/src/main/res/values-cs/strings.xml +++ b/commons/src/main/res/values-cs/strings.xml @@ -9,7 +9,6 @@ <string name="cancel">Zrušit</string> <string name="yes">Ano</string> <string name="no">Ne</string> - <string name="clear_all">vymazat výběr</string> <string name="navigation_list_view">Zobrazení seznamu</string> <string name="navigation_table_view">Zobrazení tabulky</string> <string name="navigation_map_view">Zobrazení mapy</string> @@ -21,7 +20,6 @@ <string name="navigation_notes">Poznámky</string> <string name="navigation_data_entry">Vstup dat</string> <string name="navigation_tei_data">Detaily</string> - <string name="event_overview">Detaily</string> <string name="select_option">Vybrat možnost</string> <string name="search">Hledat</string> <string name="events">události</string> @@ -35,8 +33,6 @@ <string name="filters_disabled">Nejsou použity žádné filtry</string> <string name="filters_title_period">Období</string> <string name="filters_title_org_unit">Org. jednotka</string> - <string name="filters_title_sorting">Třídění</string> - <string name="filters_title_status">Stav</string> <string name="filters_title_state">Synchronizace</string> <string name="filters_title_assigned">Přiděleno mně</string> <string name="filters_title_date">datum</string> @@ -45,7 +41,6 @@ <string name="filters_title_enrollment_status">@string/enrollment_status</string> <string name="filter_follow_up_label">Navázalo na %s</string> <string name="select_period">Vybrat typ období</string> - <string name="daily_period">Denně</string> <string name="weekly">Týdně</string> <string name="bi_weekly">po 14ti dnech</string> <string name="weekly_start_wednesday">Týdně od středy</string> @@ -58,7 +53,6 @@ <string name="quarterly_nov">Čtvrtletně od listopadu</string> <string name="six_monthly">Šestiměsíční</string> <string name="six_monthly_april">Od dubna každých šest měsíců</string> - <string name="six_monthly_july">Šestiměsíčně od července</string> <string name="six_monthly_nov">Počínaje listopadem šest měsíců</string> <string name="yearly">Ročně</string> <string name="financial_year_april">Finanční rok začínající v dubnu</string> @@ -66,13 +60,10 @@ <string name="financial_year_october">Finanční rok začínající v říjnu</string> <string name="financial_year_november">Finanční rok začínající v listopadu</string> - - <!-- State --> <string name="state_synced">Synchronizace</string> <string name="state_to_post">Poslat</string> <string name="state_to_update">Aktualizovat</string> - <string name="state_to_delete">Smazat</string> <string name="state_error">Chyba</string> <string name="state_warning">Varování</string> <string name="state_uploading">Nahrávám</string> @@ -165,7 +156,6 @@ <!--SDK error codes--> <string name="login_error_null_pass">Chybí heslo. Prosím vložte heslo.</string> <string name="login_error_null_username">Chybí uživatelské jméno. Zadejte uživatelské jméno.</string> - <string name="login_error_dhis_version">Tento server používá jinou verzi DHIS než 2.29. Aktualizujte verzi serveru nebo pokračujte testovacím prostředím.</string> <string name="login_error_dhis_version_v2">Tento server používá verzi DHIS2 odlišnou od %s. Aktualizujte verzi serveru nebo kontaktujte svého administrátora.</string> <string name="login_error_unsuccessful_response">Něco se pokazilo. Zkontrolujte prosím správnost adresy URL serveru, uživatelského jména a hesla a zkuste to znovu.</string> <string name="login_error_error_response">Promiňte! Něco selhalo na straně serveru.</string> @@ -225,9 +215,7 @@ <string name="error_invalid_characters">V dotazu jsou neplatné znaky. Požádejte správce o ověření konfigurace serveru (relaxedQueryChars,...).</string> <string name="error_server_unavailable">Server je momentálně nedostupný. Zkuste to později.</string> <string name="error_no_internet_connection">Jste offline. Připojte se k internetu a zkuste to znovu.</string> - <string name="unsupported_field_description">Toto pole není k dispozici pro mobilní zachycení</string> <string name="add_image">Přidat obrázek</string> - <string name="add_signature">Přidat podpis</string> <string name="add_file">Přidat soubor</string> <string name="action_ok">Ok</string> <string name="enable_location_message">Poloha vašeho zařízení je odpojena. Povolte jej k zachycení souřadnic</string> @@ -235,9 +223,7 @@ <string name="not_now">Teď ne</string> <string name="review">Posouzení</string> <string name="complete">Dokončit</string> - <string name="default_table_header_label">Hodnota</string> <string name="discard_changes">Zrušit změny</string> - <string name="default_empty_dataset_section_label">Data</string> <string name="title_network_connection_unavailable">Síťové připojení není k dispozici</string> <string name="msg_network_connection_maps">K používání map je nutné připojení k internetu.</string> @@ -272,12 +258,10 @@ <string name="file_downloaded">Soubor úspěšně stažen</string> - <string name="dialog_layer_enrollment_coordinates_v2">Zobrazit souřadnice %s </string> <string name="enrollment_data_section_label_V2">%s data</string> <string name="enrollment_coordinates_V2">%s souřadnice</string> <string name="enrollment_date_V2">%s datum</string> - <string name="enrollment_status">%s stav</string> <string name="break_glass_dialog_description_V2">V tomto chráněném programu musíte uvést důvod kontroly na %s. Veškerá činnost bude zaznamenána.</string> <string name="break_glass_reason_V2">Důvod pro kontrolu %s</string> <string name="edition_enrollment_is_no_open_V2">Tyto data nelze upravovat, protože %s je dokončen nebo zrušen</string> @@ -285,14 +269,12 @@ <string name="enrollment_cancelled_V2">%s zrušeno</string> <string name="new_enrollment">Nový %s</string> <string name="enrolling_ou">Zapsáno v:</string> - <string name="program_selector_V2">Program %s</string> <string name="more_enrollments">Více zápisů</string> <string name="remove_from">Odebrat z</string> <string name="refresh_this_record">Obnovit tento záznam</string> <string name="view_timeline">Zobrazit časovou osu</string> <string name="group_by_stage">Skupina podle etapy</string> - <string name="event_label_completed">%s dokončeno</string> <string name="event_label_created">%s vytvořeno</string> <string name="new_event_label">Nový %s</string> @@ -306,12 +288,9 @@ <string name="event_label_date_in_future_message">Tato stránka %s nemůže mít datum v budoucnosti. Změňte ho prosím.</string> <string name="failed_insert_event_label">Nepodařilo se vložit nový %s</string> <string name="week_period_span_default_label">Týden %d %s až %s</string> - <string name="group_event_label_by_stage">Skupina %s podle etapy</string> - <string name="show_event_label_timeline">Zobrazit časovou osu %s </string> <string name="empty_tei_event_label_add">Nejsou zaregistrovány žádné stránky %s, kliknutím na tlačítko \"+\" přidáte novou.</string> <string name="empty_tei_event_label_no_add">Nejsou registrovány žádné stránky %s.</string> <string name="enrollment_date_edition_warning_event_label">Na stránkách %s jsou plánovány akce, které nebudou přeplánovány.</string> - <string name="enrollment_reopen">znovu otevřít</string> <string name="sync_retry">Opakování synchronizace</string> <string name="syncing">Probíhá synchronizace ...</string> @@ -328,4 +307,8 @@ <string name="database_import_failed">Import databáze se nezdařil</string> <string name="invalid_file">Neplatný soubor</string> <string name="not_in_totp_2fa_enrollment_mode">Není v režimu registrace TOTP 2FA</string> + + <string name="action_clear_all">Vymazat vše</string> + + <string name="enrollment_status">%s stav</string> </resources> diff --git a/commons/src/main/res/values-da/strings.xml b/commons/src/main/res/values-da/strings.xml index 4cf9bb987b9..238317f52b3 100644 --- a/commons/src/main/res/values-da/strings.xml +++ b/commons/src/main/res/values-da/strings.xml @@ -6,11 +6,8 @@ <string name="no">No</string> <string name="navigation_programs">Programs</string> <string name="navigation_tei_data">Details</string> - <string name="event_overview">Details</string> <string name="data_sets">Data sets</string> - <string name="filters_title_status">Status</string> <string name="filters_title_date">Date</string> - <string name="daily_period">Daily</string> <string name="weekly">Weekly</string> <string name="monthly">Månedlige</string> <string name="bi_monthly">Bi-monthly</string> diff --git a/commons/src/main/res/values-en-rUS/strings.xml b/commons/src/main/res/values-en-rUS/strings.xml index a9cba0beec0..aa28fde5a0a 100644 --- a/commons/src/main/res/values-en-rUS/strings.xml +++ b/commons/src/main/res/values-en-rUS/strings.xml @@ -10,7 +10,6 @@ <!--SDK error codes--> <string name="login_error_null_pass">Password is missing. Please enter password.</string> <string name="login_error_null_username">Username is missing. Please enter username.</string> - <string name="login_error_dhis_version">This server is running a dhis version different than 2.29. Update your server version or use the testing environment to proceed.</string> <string name="login_error_dhis_version_v2">This server is running a DHIS2 version different than %s. Update your server version or contact your admin.</string> <string name="login_error_unsuccessful_response">Something went wrong. Please check that server URL, username and password are correct and try again.</string> <string name="login_error_error_response">Sorry! Something failed on the server side.</string> @@ -83,4 +82,5 @@ <string name="database_import_failed">Database import failed</string> <string name="invalid_file">Invalid file</string> <string name="not_in_totp_2fa_enrollment_mode">Not in TOTP 2FA enrollment mode</string> -</resources> + + </resources> diff --git a/commons/src/main/res/values-es-rES/strings.xml b/commons/src/main/res/values-es-rES/strings.xml index 7a24c9faab6..632edc9d7a9 100644 --- a/commons/src/main/res/values-es-rES/strings.xml +++ b/commons/src/main/res/values-es-rES/strings.xml @@ -9,7 +9,6 @@ <string name="cancel">Cancelar</string> <string name="yes">Sí</string> <string name="no">No</string> - <string name="clear_all">Borrar selección</string> <string name="navigation_list_view">Vista de lista</string> <string name="navigation_table_view">Vista de tabla</string> <string name="navigation_map_view">Vista del mapa</string> @@ -20,7 +19,6 @@ <string name="navigation_notes">Notas</string> <string name="navigation_data_entry">Introducción de datos</string> <string name="navigation_tei_data">Detalles</string> - <string name="event_overview">Detalles</string> <string name="select_option">Seleccionar opción</string> <string name="search">Buscar</string> <string name="events">Eventos</string> @@ -34,13 +32,10 @@ <string name="filters_disabled">Filtros desactivados</string> <string name="filters_title_period">Periodo</string> <string name="filters_title_org_unit">Unidad Org.</string> - <string name="filters_title_sorting">Orden</string> - <string name="filters_title_status">Estado</string> <string name="filters_title_state">Sincronizado</string> <string name="filters_title_assigned">Asignado a mí</string> <string name="filters_title_date">Fecha</string> <string name="filter_follow_up_label">Seguido %s</string> - <string name="daily_period">Diario</string> <string name="weekly">Semanal</string> <string name="monthly">Mensual</string> <string name="yearly">Anual</string> @@ -48,7 +43,6 @@ <string name="state_synced">Sincronizado</string> <string name="state_to_post">Por enviar</string> <string name="state_to_update">Para actualizar</string> - <string name="state_to_delete">Para borrar</string> <string name="state_error">Error</string> <string name="state_warning">Advertencia</string> <string name="state_uploading">Subiendo</string> @@ -138,7 +132,6 @@ <!--SDK error codes--> <string name="login_error_null_pass">La contraseña está vacía. Ingrese la contraseña.</string> <string name="login_error_null_username">El usuario está vacío. Ingrese el usuario.</string> - <string name="login_error_dhis_version">Este servidor trabaja sobre una versión de dhis distinta a 2.29. Actualice el servidor o utilize el entorno de pruebas para continuar.</string> <string name="login_error_dhis_version_v2">Este servidor tiene una version de DHIS2 diferente de %s. Actualice su servidor o contacte a su administrador.</string> <string name="login_error_unsuccessful_response">Algo ha ido mal. Por favor, compruebe que tanto la url del servidor como el usuario y contraseña son correctos y pruebe otra vez.</string> <string name="login_error_error_response">Disculpe, hubo un error del lado del servidor.</string> @@ -196,7 +189,6 @@ <string name="error_min_attributes">No hay suficientes atributos para realizar la búsqueda. Por favor redefina la búsqueda añadiendo más atributos.</string> <string name="error_org_unit_scope">La búsqueda online solo está disponible para las unidades organizativas de búsqueda.</string> <string name="error_invalid_characters">El query contiene caracteres invalidos. Por favor contacte a su administrador para verificar la configuración del servidor (relaxedQueryChars,...).</string> - <string name="unsupported_field_description">Este campo no está disponible para la captura por móvil.</string> <string name="add_image">Añadir imagen</string> <string name="add_file">Añadir archivo</string> <string name="action_ok">De acuerdo</string> @@ -205,15 +197,11 @@ <string name="not_now">Ahora no</string> <string name="review">Revisar</string> <string name="complete">Completar</string> - <string name="default_table_header_label">Valor</string> <string name="discard_changes">Descartar los cambios</string> - <string name="default_empty_dataset_section_label">Datos</string> <string name="overdue_today">Hoy</string> <string name="enrolling_ou">Inscrito en:</string> <string name="delete_event_label">Eliminar %s</string> <string name="week_period_span_default_label">Semana %d %s a %s</string> - <string name="enrollment_reopen">Reabrir</string> - <string name="syncing">Sincronizando...</string> <string name="remove">Eliminar</string> <string name="period_daily_title">Diario</string> diff --git a/commons/src/main/res/values-es/strings.xml b/commons/src/main/res/values-es/strings.xml index 608a9933e83..8bf422a50da 100644 --- a/commons/src/main/res/values-es/strings.xml +++ b/commons/src/main/res/values-es/strings.xml @@ -9,7 +9,6 @@ <string name="cancel">Cancelar</string> <string name="yes">Sí</string> <string name="no">No</string> - <string name="clear_all">Borrar selección</string> <string name="navigation_list_view">Vista de lista</string> <string name="navigation_table_view">Vista de tabla</string> <string name="navigation_map_view">Vista del mapa</string> @@ -21,7 +20,6 @@ <string name="navigation_notes">Notas</string> <string name="navigation_data_entry">Introducción de datos</string> <string name="navigation_tei_data">Detalles</string> - <string name="event_overview">Detalles</string> <string name="select_option">Seleccionar opción</string> <string name="search">Buscar</string> <string name="events">Eventos</string> @@ -35,8 +33,6 @@ <string name="filters_disabled">Filtros desactivados</string> <string name="filters_title_period">Periodo</string> <string name="filters_title_org_unit">Unidad Org.</string> - <string name="filters_title_sorting">Orden</string> - <string name="filters_title_status">Estado</string> <string name="filters_title_state">Sincronizado</string> <string name="filters_title_assigned">Asignado a mí</string> <string name="filters_title_date">Fecha</string> @@ -45,7 +41,6 @@ <string name="filters_title_enrollment_status">@string/enrollment_status</string> <string name="filter_follow_up_label">Seguido %s</string> <string name="select_period">Seleccionar tipo de periodo</string> - <string name="daily_period">Diario</string> <string name="weekly">Semanal</string> <string name="bi_weekly">Quincenal</string> <string name="weekly_start_wednesday">Semanal con inicio el miércoles</string> @@ -58,7 +53,6 @@ <string name="quarterly_nov">Trimestral con inicio en noviembre</string> <string name="six_monthly">Semestral</string> <string name="six_monthly_april">Semestral a partir de abril</string> - <string name="six_monthly_july">Semestral con inicio en julio</string> <string name="six_monthly_nov">Semestral con inicio en noviembre</string> <string name="yearly">Anual</string> <string name="financial_year_april">Año fiscal con inicio en abril</string> @@ -66,13 +60,10 @@ <string name="financial_year_october">Año fiscal con inicio en octubre</string> <string name="financial_year_november">Año fiscal con inicio en noviembre</string> - - <!-- State --> <string name="state_synced">Sincronizado</string> <string name="state_to_post">Por enviar</string> <string name="state_to_update">Para actualizar</string> - <string name="state_to_delete">Para borrar</string> <string name="state_error">Error</string> <string name="state_warning">Advertencia</string> <string name="state_uploading">Subiendo</string> @@ -165,7 +156,6 @@ <!--SDK error codes--> <string name="login_error_null_pass">La contraseña está vacía. Ingrese la contraseña.</string> <string name="login_error_null_username">El usuario está vacío. Ingrese el usuario.</string> - <string name="login_error_dhis_version">Este servidor trabaja sobre una versión de dhis distinta a 2.29. Actualice el servidor o utilize el entorno de pruebas para continuar.</string> <string name="login_error_dhis_version_v2">Este servidor tiene una version de DHIS2 diferente de %s. Actualice su servidor o contacte a su administrador.</string> <string name="login_error_unsuccessful_response">Algo ha ido mal. Por favor, compruebe que tanto la url del servidor como el usuario y contraseña son correctos y pruebe otra vez.</string> <string name="login_error_error_response">Disculpe, hubo un error del lado del servidor.</string> @@ -225,9 +215,7 @@ <string name="error_invalid_characters">La consulta contiene caracteres inválidos. Por favor contacte a su administrador para verificar la configuración del servidor (relaxedQueryChars,...).</string> <string name="error_server_unavailable">El servidor no está disponible actualmente. Vuelve a intentarlo más tarde.</string> <string name="error_no_internet_connection">Estas desconectado. Conéctese a Internet e inténtelo nuevamente.</string> - <string name="unsupported_field_description">Este campo no está disponible para la captura por móvil.</string> <string name="add_image">Añadir imagen</string> - <string name="add_signature">Añadir firma</string> <string name="add_file">Añadir archivo</string> <string name="action_ok">De acuerdo</string> <string name="enable_location_message">La ubicación de su dispositivo está desconectada. Por favor habilítela para capturar coordenadas. </string> @@ -235,9 +223,7 @@ <string name="not_now">Ahora no</string> <string name="review">Revisar</string> <string name="complete">Completar</string> - <string name="default_table_header_label">Valor</string> <string name="discard_changes">Descartar los cambios</string> - <string name="default_empty_dataset_section_label">Datos</string> <string name="title_network_connection_unavailable">Conexión de red no disponible.</string> <string name="msg_network_connection_maps">Se requiere una conexión a Internet para poder utilizar los mapas.</string> @@ -279,7 +265,6 @@ <string name="file_downloaded">Archivo descargado correctamente</string> - <!--Enrollment labels--> <plurals name="enrollment"> <item quantity="one">Registro</item> @@ -290,7 +275,6 @@ <string name="enrollment_data_section_label_V2">%s datos</string> <string name="enrollment_coordinates_V2">%s coordenadas</string> <string name="enrollment_date_V2">%s fecha</string> - <string name="enrollment_status">%s estado</string> <string name="break_glass_dialog_description_V2">Debes proporcionar un motivo para consultar %s en este programa protegido. Toda la actividad será registrada.</string> <string name="break_glass_reason_V2">Motivo para consultar %s</string> <string name="edition_enrollment_is_no_open_V2">Estos datos no se pueden editar porque %s está completado o cancelado.</string> @@ -298,14 +282,12 @@ <string name="enrollment_cancelled_V2">%s se ha cancelado</string> <string name="new_enrollment">Nuevo %s</string> <string name="enrolling_ou">Inscrito en:</string> - <string name="program_selector_V2">Programa %s</string> <string name="more_enrollments">Más inscripciones</string> <string name="remove_from">Eliminar de</string> <string name="refresh_this_record">Actualizar este registro</string> <string name="view_timeline">Ver como línea de tiempo</string> <string name="group_by_stage">Ver por etapa</string> - <!-- Event --> <plurals name="event_label"> <item quantity="one">evento</item> @@ -325,12 +307,9 @@ <string name="event_label_date_in_future_message">%s no puede tener una fecha en el futuro. Por favor, modifíquela.</string> <string name="failed_insert_event_label">No fue posible insertar %s</string> <string name="week_period_span_default_label">Semana %d %s a %s</string> - <string name="group_event_label_by_stage">Agrupar %s por etapa </string> - <string name="show_event_label_timeline">Mostrar línea de tiempo de %s</string> <string name="empty_tei_event_label_add">No hay %s registrados. Haz clic en “+” para agregar uno nuevo.</string> <string name="empty_tei_event_label_no_add">No hay %s registrados. </string> <string name="enrollment_date_edition_warning_event_label">Hay %s programados que no serán reprogramados</string> - <string name="enrollment_reopen">Reabrir</string> <string name="sync_retry">Reintentar sincronización</string> <string name="syncing">Sincronizando...</string> @@ -346,4 +325,7 @@ <string name="period_financial_year_title">Año fiscal</string> <string name="database_import_failed">Importación de la base de datos fallida</string> <string name="invalid_file">Archivo no válido</string> - </resources> + <string name="action_clear_all">Limpiar todo</string> + + <string name="enrollment_status">%s estado</string> +</resources> diff --git a/commons/src/main/res/values-fr/strings.xml b/commons/src/main/res/values-fr/strings.xml index 0007a893d5d..a8980102e90 100644 --- a/commons/src/main/res/values-fr/strings.xml +++ b/commons/src/main/res/values-fr/strings.xml @@ -8,7 +8,6 @@ <string name="cancel">Annuler</string> <string name="yes">Oui</string> <string name="no">Non</string> - <string name="clear_all">effacer la sélection</string> <string name="navigation_list_view">Vue de liste</string> <string name="navigation_table_view">Vue de tableau</string> <string name="navigation_map_view">Vue de la carte</string> @@ -19,7 +18,6 @@ <string name="navigation_notes">Notes</string> <string name="navigation_data_entry">Saisie de données</string> <string name="navigation_tei_data">Details</string> - <string name="event_overview">Details</string> <string name="select_option">Sélectionnez une option</string> <string name="search">Chercher</string> <string name="events">événements</string> @@ -33,13 +31,10 @@ <string name="filters_disabled">Aucun flitre n\'est appliqué</string> <string name="filters_title_period">Période</string> <string name="filters_title_org_unit">Unité d\'org.</string> - <string name="filters_title_sorting">Trier</string> - <string name="filters_title_status">Statut</string> <string name="filters_title_state">Synchronisation</string> <string name="filters_title_assigned">Assigné à moi</string> <string name="filters_title_date">Date</string> <string name="select_period">Sélectionner type de période</string> - <string name="daily_period">Quotidien</string> <string name="weekly">Hebdomadaire</string> <string name="bi_weekly">Bi-hebdomadaire</string> <string name="weekly_start_wednesday">Hebdomadaire débutant un mercredi</string> @@ -58,13 +53,10 @@ <string name="financial_year_october">Année financière débutant par octobre</string> <string name="financial_year_november">Année financière débutant par Novembre</string> - - <!-- State --> <string name="state_synced">Synchronisation</string> <string name="state_to_post">Envoyer</string> <string name="state_to_update">Prêts à actualiser</string> - <string name="state_to_delete">A supprimer</string> <string name="state_error">Erreur</string> <string name="state_warning">Attention</string> <string name="state_uploading">Téléchargement en cours</string> @@ -154,7 +146,6 @@ <!--SDK error codes--> <string name="login_error_null_pass">Le mot de passe est manquant. Veuillez entrer le mot de passe.</string> <string name="login_error_null_username">Le nom d\'utilisateur est manquant. Veuillez entrer le nom d\'utilisateur.</string> - <string name="login_error_dhis_version">Ce serveur a une version différente de 2.29. Mettre à jour la version ou utiliser un environnement d\'essai pour continuer</string> <string name="login_error_no_dhis_instance">L\'URL fournie n\'est pas un serveur DHIS2.</string> <string name="login_error_bad_credentials">Nom d\'utilisateur ou le mot de passe sont incorrects</string> <string name="login_error_unknown_host">Serveur inconnu</string> @@ -181,9 +172,7 @@ <string name="error_min_attributes">Il n\'y a pas assez d\'attributs pour effectuer la recherche. Veuillez affiner votre recherche avec plus d\'attributs.</string> <string name="error_org_unit_scope">La recherche en ligne n\'est disponible que pour vos unités organisationnelles de recherche d\'utilisateurs.</string> <string name="error_no_internet_connection">Vous n\'êtes pas connecté. Veuillez-vous connecter et réssayer.</string> - <string name="unsupported_field_description">Ce champ n\'est pas disponible pour la capture mobile</string> <string name="add_image">Ajouter une image</string> - <string name="add_signature">Ajouter une signature</string> <string name="add_file">Ajouter un fichier</string> <string name="action_ok">Ok</string> <string name="enable_location_message">L\'emplacement de votre appareil est déconnecté. Veuillez l\'activer pour capturer les coordonnées</string> @@ -191,9 +180,7 @@ <string name="not_now">Pas maintenant</string> <string name="review">Vérifier</string> <string name="complete">Terminer</string> - <string name="default_table_header_label">Valeur</string> <string name="discard_changes">Annuler les modifications</string> - <string name="default_empty_dataset_section_label">Données</string> <string name="title_network_connection_unavailable">Connexion réseau indisponible</string> <string name="msg_network_connection_maps">Une connexion Internet est nécessaire pour utiliser les cartes.</string> @@ -209,8 +196,6 @@ <string name="enrolling_ou">Inscrire à:</string> <string name="delete_event_label">Supprimer 1%s</string> <string name="week_period_span_default_label">Semaine %d %s à %s</string> - <string name="enrollment_reopen">rouvrir</string> - <string name="sync_retry">Réessayer la synchronisation</string> <string name="syncing">Synchronisation...</string> <string name="remove">Supprimer</string> @@ -220,4 +205,5 @@ <string name="period_monthly_title">Mois</string> <string name="period_quarter_title">Trimestre</string> <string name="period_yearly_title">Année</string> - </resources> + <string name="action_clear_all">Tout effacer</string> +</resources> diff --git a/commons/src/main/res/values-hi-rIN/strings.xml b/commons/src/main/res/values-hi-rIN/strings.xml index 45fa1a37cb9..49ff7d5a414 100644 --- a/commons/src/main/res/values-hi-rIN/strings.xml +++ b/commons/src/main/res/values-hi-rIN/strings.xml @@ -11,8 +11,8 @@ <string name="data_sets">डेटा सेट्स</string> <string name="done">पूरा हुआ</string> + <string name="filters_title_period">पीरियड</string> <string name="filters_title_date">तारीख</string> - <string name="daily_period">रोज़ाना</string> <string name="weekly">साप्ताहिक</string> <string name="monthly">मासिक</string> <string name="yearly">वार्षिक</string> @@ -32,9 +32,11 @@ <string name="filter_period_last_week">पिछला सप्ताह</string> <string name="filter_period_this_month">इस महीने</string> <string name="filter_period_last_month">पिछला महीना</string> + <string name="filter_period_other">दूसरा</string> <string name="filter_period_this_year">इस वर्ष</string> <string name="filter_period_last_quarter">पिछली तिमाही</string> <string name="filter_period_last_year">पिछला वर्ष</string> + <string name="period">पीरियड</string> <string name="DAILY">रोज़ाना</string> <string name="WEEKLY">साप्ताहिक</string> <string name="MONTHLY">मासिक</string> @@ -50,9 +52,7 @@ <string name="not_now">अभी नहीं</string> <string name="review">रिव्यू</string> <string name="complete">पूरा हुआ</string> - <string name="default_table_header_label">वैल्यू</string> <string name="discard_changes">बदलावों को छोड़ना है</string> - <string name="default_empty_dataset_section_label">डेटा</string> <string name="overdue_today">आज</string> <plurals name="overdue_days"> <item quantity="one">%d दिन बाकी है</item> @@ -60,7 +60,6 @@ </plurals> <string name="file_downloaded">फ़ाइल सफलतापूर्वक डाउनलोड हो गई</string> - <string name="enrollment_data_section_label_V2">%s डेटा</string> <string name="syncing">सिंक हो रहा है…</string> <string name="remove">हटाएं</string> diff --git a/commons/src/main/res/values-id/strings.xml b/commons/src/main/res/values-id/strings.xml index 03e4b6b5122..3520c397002 100644 --- a/commons/src/main/res/values-id/strings.xml +++ b/commons/src/main/res/values-id/strings.xml @@ -8,7 +8,6 @@ <string name="cancel">Batal</string> <string name="yes">Iya</string> <string name="no">Tidak</string> - <string name="clear_all">hapus pilihan</string> <string name="navigation_list_view">Tampilan daftar</string> <string name="navigation_table_view">Tampilan tabel</string> <string name="navigation_map_view">Tampilan peta</string> @@ -19,7 +18,6 @@ <string name="navigation_notes">Catatan</string> <string name="navigation_data_entry">Data entri</string> <string name="navigation_tei_data">Rincian</string> - <string name="event_overview">Rincian</string> <string name="select_option">Pilih opsi</string> <string name="search">Pencarian</string> <string name="events">Even</string> @@ -33,13 +31,10 @@ <string name="filters_disabled">Tidak ada filter yang diterapkan</string> <string name="filters_title_period">Periode</string> <string name="filters_title_org_unit">Organisasi Satuan</string> - <string name="filters_title_sorting">Penyortiran</string> - <string name="filters_title_status">Status</string> <string name="filters_title_state">Sinkronkan</string> <string name="filters_title_assigned">Ditugaskan kepada saya</string> <string name="filters_title_date">Tanggal</string> <string name="select_period">Pilih tipe periode</string> - <string name="daily_period">Harian</string> <string name="weekly">Mingguan</string> <string name="bi_weekly">Dwiwulanan</string> <string name="monthly">Bulanan</string> @@ -51,7 +46,6 @@ <string name="state_synced">Sinkronkan</string> <string name="state_to_post">Untuk dikirim</string> <string name="state_to_update">Untuk diperbarui</string> - <string name="state_to_delete">Untuk dihapus</string> <string name="state_error">Kesalahan</string> <string name="state_warning">Peringatan</string> <string name="state_uploading">Mengunggah</string> @@ -133,18 +127,13 @@ <string name="section_charts">Grafik</string> <string name="section_charts_indicators">Grafik dan indikator</string> - <string name="login_error_dhis_version">Server ini menjalankan versi dhis yang berbeda dari 2.29. Perbarui versi server Anda atau gunakan pengujian lingkungan untuk melanjutkan.</string> <string name="online_search_parsing_error">Kesalahan saat penguraian hasil</string> <string name="add_image">Tambahkan gambar</string> <string name="add_file">Tambahkan berkas</string> <string name="complete">Lengkap</string> - <string name="default_table_header_label">Nilai</string> <string name="discard_changes">Hapus perubahan</string> - <string name="default_empty_dataset_section_label">Data</string> <string name="overdue_today">Hari ini</string> <string name="week_period_span_default_label">Minggu %d %s hingga %s</string> - <string name="enrollment_reopen">Buka kembali</string> - <string name="syncing">Sedang sinkronisasi...</string> <string name="remove">Hapus</string> <string name="period_daily_title">Harian</string> diff --git a/commons/src/main/res/values-km/strings.xml b/commons/src/main/res/values-km/strings.xml index e162244a975..f534228c85d 100644 --- a/commons/src/main/res/values-km/strings.xml +++ b/commons/src/main/res/values-km/strings.xml @@ -10,7 +10,6 @@ <string name="navigation_relationships">ទំនាក់ទំនង</string> <string name="navigation_notes">ចំណាំ</string> <string name="navigation_tei_data">លម្អិត</string> - <string name="event_overview">លម្អិត</string> <string name="select_option">កំណត់​ជម្រើស</string> <string name="search">ស្វែងរក</string> <string name="events">ព្រឹត្តិការណ៏</string> @@ -18,10 +17,8 @@ <string name="done">Done</string> <string name="filters_title_period">កំឡុងពេល</string> - <string name="filters_title_status">ស្ថានភាព</string> <string name="filters_title_state">បញ្ចូន</string> <string name="filters_title_date">កាលបរិច្ឆេទ</string> - <string name="daily_period">រាល់​ថ្ងៃ</string> <string name="weekly">រាល់​សប្ដាហ៍</string> <string name="monthly">រាល់​ខែ</string> <string name="bi_monthly">រាល់ពីរសប្តាហ៍</string> @@ -31,7 +28,6 @@ <!-- State --> <string name="state_synced">បញ្ចូន</string> <string name="state_to_update">ដើម្បីធ្វើបច្ចុប្បន្នភាព</string> - <string name="state_to_delete">ដើម្បីលុប</string> <string name="state_error">កំហុសបច្ចេកទេស</string> <!-- Status --> <string name="filter_event_status_open">បើក</string> @@ -73,17 +69,12 @@ <string name="section_feedback">មតិ​ឆ្លើយតប</string> <string name="section_indicators">Indicators</string> <string name="section_charts">គំនូសតាង(ក្រាប)</string> - <string name="login_error_dhis_version">ម៉ាស៊ីនមេនេះកំពុងដំណើរការខុសពី DHIS ២.២៩។ សូមធ្វើបច្ចុប្បន្នភាពលើម៉ាស៊ីនមេរបស់អ្នក​</string> <string name="online_search_parsing_error">កំហុសខណៈពេលញែកលទ្ធផល</string> <string name="add_file">បញ្ចូលឯកសារ</string> <string name="keep_editing">រក្សាទុកការកែប្រែ</string> <string name="complete">បញ្ចប់</string> - <string name="default_table_header_label">តម្លៃ</string> <string name="discard_changes">លុបការកែប្រែ</string> - <string name="default_empty_dataset_section_label">Data</string> <string name="overdue_today">ថ្ងៃនេះ</string> - <string name="enrollment_reopen">បើកឡើងវិញ</string> - <string name="remove">លុបចេញ</string> <string name="period_daily_title">រាល់​ថ្ងៃ</string> <string name="period_yearly_title">ឆ្នាំ</string> diff --git a/commons/src/main/res/values-lo/strings.xml b/commons/src/main/res/values-lo/strings.xml index 1c3812c27c4..11cd8ae776d 100644 --- a/commons/src/main/res/values-lo/strings.xml +++ b/commons/src/main/res/values-lo/strings.xml @@ -9,7 +9,6 @@ <string name="cancel">Cancel</string> <string name="yes">ແມ່ນ</string> <string name="no">ບໍ່ມີ</string> - <string name="clear_all">ລຶບການເລືອກ</string> <string name="navigation_list_view">ສະແດງຮູບແບບລາຍການ</string> <string name="navigation_table_view">ເບີ່ງຕາຕະລາງ</string> <string name="navigation_map_view">ເບີ່ງແຜ່ນທີ່</string> @@ -20,7 +19,6 @@ <string name="navigation_notes">ຂໍ້ຄວາມ</string> <string name="navigation_data_entry">ປ້ອນຂໍ້ມູນ</string> <string name="navigation_tei_data">ລາຍລະອຽດ</string> - <string name="event_overview">ລາຍລະອຽດ</string> <string name="select_option">ເລືອກທາງເລືອກ</string> <string name="search">ຄົນຫາ</string> <string name="events">ເຫດການ</string> @@ -34,14 +32,11 @@ <string name="filters_disabled">ບໍ່ໄດ້ໃຊ້ຕົວກອງ</string> <string name="filters_title_period">ຊ່ວງເວລາ</string> <string name="filters_title_org_unit">ຫົວ​ໜ່ວຍ​ການ​ຈັດ​ຕັ້ງ</string> - <string name="filters_title_sorting">ການຈັດຮຽງ</string> - <string name="filters_title_status">ສະຖານະ</string> <string name="filters_title_state">ອັບເດດຂໍ້ມູນໃຫ້ຄືກັນ</string> <string name="filters_title_assigned">ມອບໝາຍໃຫ້ຂ້ອຍ</string> <string name="filters_title_date">ວັນທີ່</string> <string name="filter_follow_up_label">ຕິດຕາມ%s</string> <string name="select_period">​ເລືອກ​ໄລ​ຍະ​ເວ​ລາ​ປະ​ເພດ​ຕ່າງໆ</string> - <string name="daily_period">ທຸກໆມື້</string> <string name="weekly">ລາຍອາທິດ</string> <string name="bi_weekly">ສອງອາທິດຕໍ່ຄັ້ງ</string> <string name="monthly">ລາຍເດືອນ</string> @@ -53,7 +48,6 @@ <string name="state_synced">ອັບເດດຂໍ້ມູນໃຫ້ຄືກັນ</string> <string name="state_to_post">ສົ່ງ</string> <string name="state_to_update">ຕ້ອງການອັບເດດ</string> - <string name="state_to_delete">ເພື່ອລືບອອກ</string> <string name="state_error">ເກີດການຜິດພາດ</string> <string name="state_warning">ແຈ້ງເຕືອນ</string> <string name="state_uploading">ກຳລັງອັບໂຫຼດ</string> @@ -143,7 +137,6 @@ <!--SDK error codes--> <string name="login_error_null_pass">ບໍ່ມີລະຫັດຜ່ານ. ກະລຸນາໃສ່ລະຫັດຜ່ານ.</string> <string name="login_error_null_username">ບໍ່ມີຊື່ຜູ້ໃຊ້. ກະລຸນາປ້ອນຊື່ຜູ້ໃຊ້</string> - <string name="login_error_dhis_version">ຄອມພີວເຕີໜ່ວຍແມ່ກໍາລັງທໍາງານກັບລະບົບ DHIS2 ລຸ້ນສູງກ່ວາ 2.29. ກະລຸນາ ນໍາໃຊ້ລຸນທີ່ສູງກ່ວາ ຫຼື ນໍາໃຊ້ລະບົບທົດລອງແທນ</string> <string name="login_error_dhis_version_v2">ຄອມພິວເຕີໜ່ວຍແມ່ເຄື່ອງນີ້ກຳລັງໃຊ້ເວີຊັນ DHIS2 ທີ່ແຕກຕ່າງຈາກ%s . ອັບເດດລຸ່ນຂອງຄອມພິວເຕີເຄື່ອງແມ່ຂອງທ່ານ ຫຼື ຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ.</string> <string name="login_error_unsuccessful_response">ມີບາງສິ່ງບາງຢ່າງຜິດພາດ. ກະລຸນາກວດເບິ່ງທີ່ຢູ່ຂອງເຄື່ອງຄອມພິວເຕີໜ່ວຍແມ່, ຊື່ຜູ້ໃຊ້ ແລະ ລະຫັດຜ່ານວ່າຖືກຕ້ອງແລ້ວ ແລ້ວລອງໃໝ່ອີກຄັ້ງ.</string> <string name="login_error_error_response">ຂໍອາໄພ! ມີບາງຢ່າງລົ້ມເຫຼວໃນເຄື່ອງຄອມພິວເຕີໜ່ວຍແມ່.</string> @@ -199,9 +192,7 @@ <string name="error_min_attributes">ຄຸນລັກສະນະບໍ່ພຽງພໍທີ່ຈະດໍາເນີນການຄົ້ນຫາ. ກະລຸນາປັບປຸງການຄົ້ນຫາຂອງທ່ານດ້ວຍຄຸນລັກສະນະເພີ່ມເຕີມ.</string> <string name="error_org_unit_scope">ການຄົ້ນຫາອອນລາຍໃຊ້ໄດ້ກັບຫົວຫນ່ວຍການຈັດຕັ້ງທີ່ຄົ້ນຫາຜູ້ໃຊ້ຂອງທ່ານເທົ່ານັ້ນ.</string> <string name="error_no_internet_connection">ທ່ານອອຟລາຍຢູ່. ເຊື່ອມຕໍ່ອິນເຕີເນັດ ແລະ ລອງໃໝ່ອີກຄັ້ງ</string> - <string name="unsupported_field_description">ຫ້ອງນີ້ຂໍ້ມູນບໍ່ສາມາດໃຊ້ໄດ້ສໍາລັບການຈັບພາບມືຖື</string> <string name="add_image">ເພີ່ມຮູບພາບ</string> - <string name="add_signature">ເພີ່ມລາຍເຊັນ</string> <string name="add_file">ເອົາຟາຍຂໍ້ມູນເຂົ້າ</string> <string name="action_ok">ຕົກລົງ</string> <string name="enable_location_message">ສະຖານທີ່ອຸປະກອນຂອງທ່ານຖືກຕັດການເຊື່ອມຕໍ່. ກະລຸນາເປີດໃຊ້ມັນເພື່ອບັນທຶກພິກັດ</string> @@ -209,9 +200,7 @@ <string name="not_now">ບໍ່​ແມ່ນ​ຕອນ​ນີ້</string> <string name="review">ທົບທວນຄືນ</string> <string name="complete">ສຳເລັດແລ້ວ</string> - <string name="default_table_header_label">Value</string> <string name="discard_changes">ລຶບການປ່ຽນແປງ</string> - <string name="default_empty_dataset_section_label">ຂໍ້ມູນ</string> <string name="title_network_connection_unavailable">ການເຊື່ອມຕໍ່ເຄືອຂ່າຍບໍ່ສາມາດໃຊ້ໄດ້</string> <string name="msg_network_connection_maps">ຈຳເປັນຕ້ອງມີການເຊື່ອມຕໍ່ອິນເຕີເນັດເພື່ອໃຊ້ແຜນທີ່.</string> @@ -219,12 +208,11 @@ <string name="enrolling_ou">ລົງທະບຽນໃນ:</string> <string name="delete_event_label">ລົບ%s</string> <string name="week_period_span_default_label">ອາທິດ%d%sຫາ%s</string> - <string name="enrollment_reopen">ເປີດຄືນໃໝ່</string> - <string name="syncing">ກຳລັງຊິ້ງຂໍ້ມູນ</string> <string name="remove">ລົບອອກ</string> <string name="period_daily_title">ທຸກໆມື້</string> <string name="period_weekly_title">ອາທິດ</string> <string name="period_monthly_title">ເດືອນ</string> <string name="period_yearly_title">ປີ</string> - </resources> + <string name="action_clear_all">ລຶບທັງໝົດ</string> +</resources> diff --git a/commons/src/main/res/values-my/strings.xml b/commons/src/main/res/values-my/strings.xml index f21e2cf4b6c..0d5538640b4 100644 --- a/commons/src/main/res/values-my/strings.xml +++ b/commons/src/main/res/values-my/strings.xml @@ -8,14 +8,11 @@ <string name="navigation_programs">Programs</string> <string name="navigation_notes">မှတ်စု</string> <string name="navigation_tei_data">အသေးစိတ်များ</string> - <string name="event_overview">အသေးစိတ်များ</string> <string name="data_sets">စီမံချက်</string> <string name="done">Done</string> <string name="filters_title_period">အချိန်ကာလ</string> - <string name="filters_title_status">အခြေအနေ</string> <string name="filters_title_date">ရက်စွဲ</string> - <string name="daily_period">နေ့စဉ်</string> <string name="weekly">အပတ်စဉ်</string> <string name="monthly">လစဉ်</string> <string name="bi_monthly">နှစ်လတစ်ကြိမ်</string> @@ -47,8 +44,6 @@ <string name="section_indicators">အညွှန်းများ</string> <string name="section_charts">ဂရပ် ပုံစံများ</string> <string name="complete">ပြည့်စုံသည်။</string> - <string name="default_table_header_label">တန်ဖိုး</string> - <string name="default_empty_dataset_section_label">အချက်အလက်</string> <string name="remove">ဖယ်ရှားခြင်း</string> <string name="period_daily_title">နေ့စဉ်</string> <string name="period_yearly_title">ခုနှစ်</string> diff --git a/commons/src/main/res/values-nb/strings.xml b/commons/src/main/res/values-nb/strings.xml index ea9b4ffa21a..1b7a926bfb5 100644 --- a/commons/src/main/res/values-nb/strings.xml +++ b/commons/src/main/res/values-nb/strings.xml @@ -8,7 +8,6 @@ <string name="cancel">Avbryt</string> <string name="yes">Ja</string> <string name="no">Nei</string> - <string name="clear_all">tøm valg</string> <string name="navigation_list_view">Listevisning</string> <string name="navigation_table_view">Tabellvisning</string> <string name="navigation_map_view">Kartvisning</string> @@ -19,7 +18,6 @@ <string name="navigation_notes">Notater</string> <string name="navigation_data_entry">Dataregistrering</string> <string name="navigation_tei_data">Detaljer</string> - <string name="event_overview">Detaljer</string> <string name="select_option">Velg et alternativ</string> <string name="search">Søk</string> <string name="events">hendelser</string> @@ -33,13 +31,10 @@ <string name="filters_disabled">Ingen filter brukt</string> <string name="filters_title_period">Periode</string> <string name="filters_title_org_unit">Org. Enhet</string> - <string name="filters_title_sorting">Sorterer</string> - <string name="filters_title_status">Status</string> <string name="filters_title_state">Synk</string> <string name="filters_title_assigned">Tildelt til meg</string> <string name="filters_title_date">Dato</string> <string name="select_period">Velg periodetype</string> - <string name="daily_period">Daglig</string> <string name="weekly">Ukentlig</string> <string name="bi_weekly">Toukentlig</string> <string name="weekly_start_wednesday">Ukentlig, startes onsdag</string> @@ -58,13 +53,10 @@ <string name="financial_year_october">Regnskapsår med start oktober</string> <string name="financial_year_november">Regnskapsår med start november</string> - - <!-- State --> <string name="state_synced">Synk</string> <string name="state_to_post">Å sende</string> <string name="state_to_update">Å oppdatere</string> - <string name="state_to_delete">Å slette</string> <string name="state_error">Feil</string> <string name="state_warning">Advarsel</string> <string name="state_relationship">Relasjon</string> @@ -132,7 +124,6 @@ <string name="section_feedback">Tilbakemelding</string> <string name="section_indicators">Indikatorer</string> <string name="section_charts">Diagrammer</string> - <string name="login_error_dhis_version">Denne serveren kjører en dhis versjon som er forskjellig fra 2.29. Oppdater din serverversjon eller bruk testmiljøet for å fortsette.</string> <string name="online_search_parsing_error">Feil under analyse av resultater</string> <string name="add_image">Legg til bilde</string> <string name="add_file">Legg til fil</string> @@ -140,12 +131,8 @@ <string name="enable_location_message">Enhetsplasseringen din er koblet fra. Aktiver den for å registrere koordinater</string> <string name="keep_editing">Fortsett å rediger</string> <string name="complete">Fullfør</string> - <string name="default_table_header_label">Verdi</string> <string name="discard_changes">Forkast endringer</string> - <string name="default_empty_dataset_section_label">Data</string> <string name="overdue_today">I dag</string> - <string name="enrollment_reopen">Åpne igjen</string> - <string name="syncing">Synkroniserer...</string> <string name="remove">Fjern</string> <string name="period_daily_title">Daglig</string> @@ -154,4 +141,5 @@ <string name="period_monthly_title">Måned</string> <string name="period_quarter_title">Kvartal</string> <string name="period_yearly_title">År</string> - </resources> + <string name="action_clear_all">Fjern alt</string> +</resources> diff --git a/commons/src/main/res/values-ne/strings.xml b/commons/src/main/res/values-ne/strings.xml index 415407a4070..a10a804bf45 100644 --- a/commons/src/main/res/values-ne/strings.xml +++ b/commons/src/main/res/values-ne/strings.xml @@ -4,10 +4,8 @@ <string name="cancel">रद्द गर्नुहोस्</string> <string name="search">खोज</string> <string name="filters_title_period">अबधि</string> - <string name="filters_title_status">स्थिती</string> <string name="filters_title_assigned">मलाई निर्दिष्ट गरिएको </string> <string name="filters_title_date">मिति</string> - <string name="daily_period">दैनिक</string> <!-- Status --> <string name="filter_event_status_open">खोल्नुहोस्</string> <string name="enrollment_status_active">खोल्नुहोस्</string> diff --git a/commons/src/main/res/values-nl/strings.xml b/commons/src/main/res/values-nl/strings.xml index 72dc3cbe25c..57d5aa8fc73 100644 --- a/commons/src/main/res/values-nl/strings.xml +++ b/commons/src/main/res/values-nl/strings.xml @@ -9,7 +9,6 @@ <string name="cancel">Annuleren</string> <string name="yes">Ja</string> <string name="no">Nee</string> - <string name="clear_all">duidelijke selectie</string> <string name="navigation_list_view">Lijstweergave</string> <string name="navigation_table_view">Tabel weergave</string> <string name="navigation_map_view">Kaartweergave</string> @@ -20,7 +19,6 @@ <string name="navigation_notes">Notities</string> <string name="navigation_data_entry">Gegevensinvoer</string> <string name="navigation_tei_data">Details</string> - <string name="event_overview">Details</string> <string name="select_option">Selecteer optie</string> <string name="search">Zoek</string> <string name="events">evenementen</string> @@ -34,13 +32,10 @@ <string name="filters_disabled">Geen filters toegepast</string> <string name="filters_title_period">Periode</string> <string name="filters_title_org_unit">Org. Eenheid</string> - <string name="filters_title_sorting">Sorteren</string> - <string name="filters_title_status">status</string> <string name="filters_title_state">Synchroniseren</string> <string name="filters_title_assigned">Toegewezen aan mij</string> <string name="filters_title_date">Datum</string> <string name="filter_follow_up_label">Gevolgd %s</string> - <string name="daily_period">Dagelijks</string> <string name="weekly">Wekelijks</string> <string name="bi_weekly">Tweewekelijks</string> <string name="monthly">Maandelijks</string> @@ -52,7 +47,6 @@ <string name="state_synced">Synchroniseren</string> <string name="state_to_post">Versturen</string> <string name="state_to_update">Updaten</string> - <string name="state_to_delete">Verwijderen</string> <string name="state_error">Fout</string> <string name="state_warning">Waarschuwing</string> <string name="state_uploading">Uploaden</string> @@ -142,7 +136,6 @@ <!--SDK error codes--> <string name="login_error_null_pass">Wachtwoord ontbreekt. Voer wachtwoord in alstublieft.</string> <string name="login_error_null_username">Gebruikersnaam ontbreekt. Voer gebruikersnaam in.</string> - <string name="login_error_dhis_version">Deze server draait een andere versie dan 2.29. Werk uw serverversie bij of gebruik de testomgeving om verder te gaan.</string> <string name="login_error_dhis_version_v2">Deze server draait een andere DHIS2-versie dan %s. Werk uw serverversie bij of neem contact op met uw beheerder.</string> <string name="login_error_unsuccessful_response">Er is iets fout gegaan. Controleer of de server-URL, gebruikersnaam en wachtwoord juist zijn en probeer het opnieuw.</string> <string name="login_error_error_response">Sorry! Er is iets misgegaan aan de serverzijde.</string> @@ -200,7 +193,6 @@ <string name="error_min_attributes">Er zijn niet genoeg attributen om de zoekopdracht uit te voeren. Verfijn uw zoekopdracht met meer attributen.</string> <string name="error_org_unit_scope">Online zoeken is alleen beschikbaar voor uw organisatie-eenheden voor het zoeken van gebruikers.</string> <string name="error_invalid_characters">Er zijn ongeldige tekens in de vraag. Vraag de beheerder om de serverconfiguratie te verifiëren (relaxedQueryChars,...).</string> - <string name="unsupported_field_description">Dit veld is niet beschikbaar voor mobiel vastleggen</string> <string name="add_image">Voeg afbeelding toe</string> <string name="add_file">Bestand toevoegen</string> <string name="action_ok">OK</string> @@ -209,9 +201,7 @@ <string name="not_now">Niet nu</string> <string name="review">Beoordeling</string> <string name="complete">Compleet</string> - <string name="default_table_header_label">Waarde</string> <string name="discard_changes">Veranderingen ongedaan maken</string> - <string name="default_empty_dataset_section_label">Gegevens</string> <string name="title_network_connection_unavailable">Netwerkverbinding niet beschikbaar</string> <string name="msg_network_connection_maps">Voor het gebruik van maps is een internetverbinding vereist.</string> @@ -221,8 +211,6 @@ <string name="enrolling_ou">Ingeschreven in:</string> <string name="delete_event_label">Verwijder %s</string> <string name="week_period_span_default_label">Week %d %s tot %s</string> - <string name="enrollment_reopen">heropenen</string> - <string name="syncing">Synchroniseren...</string> <string name="remove">Verwijderen</string> <string name="period_daily_title">Dagelijks</string> diff --git a/commons/src/main/res/values-or/strings.xml b/commons/src/main/res/values-or/strings.xml index 95b5a47fea6..e34313ae89a 100644 --- a/commons/src/main/res/values-or/strings.xml +++ b/commons/src/main/res/values-or/strings.xml @@ -3,11 +3,9 @@ <string name="yes">ହଁ</string> <string name="no">ନାହିଁ</string> <string name="navigation_tei_data">ବିବରଣୀ</string> - <string name="event_overview">ବିବରଣୀ</string> <string name="info">ସୂଚନା</string> <string name="done">ହୋଇଗଲା</string> - <string name="filters_title_sorting">ସଜାଣି</string> <string name="weekly">ସାପ୍ତାହିକ</string> <string name="monthly">ମାସିକ</string> <string name="yearly">ବାର୍ଷିକ</string> diff --git a/commons/src/main/res/values-prs/strings.xml b/commons/src/main/res/values-prs/strings.xml index ea0ae3f4997..50efaaea1bc 100644 --- a/commons/src/main/res/values-prs/strings.xml +++ b/commons/src/main/res/values-prs/strings.xml @@ -12,18 +12,14 @@ <string name="navigation_notes">یاداشت ها</string> <string name="navigation_data_entry">وارد کردن معلومات</string> <string name="navigation_tei_data">جزئیات</string> - <string name="event_overview">جزئیات</string> <string name="select_option">انتخاب گزینه</string> <string name="search">جستجو</string> <string name="data_sets">دیتا سیت ها</string> <string name="done">انجام شد</string> <string name="filters_title_period">دوره</string> - <string name="filters_title_sorting">تنظیم کردن</string> - <string name="filters_title_status">وضعیت</string> <string name="filters_title_date">تاریخ</string> <string name="select_period">انتخاب نوع دوره</string> - <string name="daily_period">روزنه</string> <string name="weekly">هفته وار</string> <string name="monthly">ماهانه</string> <string name="bi_monthly">دوبار در- ماه</string> @@ -73,8 +69,6 @@ <string name="section_charts">چارت ها</string> <string name="action_ok">او کی\!</string> <string name="complete">تکمیل</string> - <string name="default_table_header_label">مقدار</string> - <string name="default_empty_dataset_section_label">دیتا</string> <string name="overdue_today">امروز</string> <string name="remove">حذف</string> <string name="period_daily_title">روزنه</string> diff --git a/commons/src/main/res/values-ps/strings.xml b/commons/src/main/res/values-ps/strings.xml index 7ec567f8d1e..516892c8eca 100644 --- a/commons/src/main/res/values-ps/strings.xml +++ b/commons/src/main/res/values-ps/strings.xml @@ -12,16 +12,13 @@ <string name="navigation_notes">یادداښتونه</string> <string name="navigation_data_entry">د ډاټا یا مالوماتو داخلول</string> <string name="navigation_tei_data">جزیات [ ژباړه ـ جزیات ]</string> - <string name="event_overview">جزیات [ ژباړه ـ جزیات ]</string> <string name="search">جستجو</string> <string name="data_sets">د مالوماتو یا ډاټا ټولګې</string> <string name="done">ترسره شو</string> <string name="filters_title_period">معیاد</string> - <string name="filters_title_status">وضعیت</string> <string name="filters_title_date">نېټه</string> <string name="select_period">د مودې ډول غوره کړئ.</string> - <string name="daily_period">ورځني [ د مودې ډول ]</string> <string name="weekly">اوونیز</string> <string name="monthly">میاشتنۍ</string> <string name="bi_monthly">دوه میاشتنۍ</string> @@ -73,8 +70,6 @@ <string name="section_indicators">شاخصونه</string> <string name="section_charts">چارټونه</string> <string name="complete">بشپړ یې کړئ</string> - <string name="default_table_header_label">ارزښت یا رقم</string> - <string name="default_empty_dataset_section_label">مالومات (ډاټا)</string> <string name="overdue_today">نن ورځ</string> <string name="remove">لرې کول</string> <string name="period_daily_title">ورځني [ د مودې ډول ]</string> diff --git a/commons/src/main/res/values-pt-rBR/strings.xml b/commons/src/main/res/values-pt-rBR/strings.xml index 8708140ea77..acaa0069821 100644 --- a/commons/src/main/res/values-pt-rBR/strings.xml +++ b/commons/src/main/res/values-pt-rBR/strings.xml @@ -10,16 +10,13 @@ <string name="navigation_notes">Notas</string> <string name="navigation_data_entry">Entrada de dados</string> <string name="navigation_tei_data">Detalhes</string> - <string name="event_overview">Detalhes</string> <string name="search">Pesquisar</string> <string name="data_sets">Agregação de Dados</string> <string name="done">Concluído</string> <string name="filters_title_period">Período</string> - <string name="filters_title_status">Estado</string> <string name="filters_title_date">Data</string> <string name="select_period">Seleccione o tipo de período</string> - <string name="daily_period">Diário</string> <string name="weekly">Semanal</string> <string name="monthly">Mensal</string> <string name="bi_monthly">Bimensal</string> @@ -66,12 +63,12 @@ <string name="section_indicators">Indicadores</string> <string name="action_ok">Esta bem</string> <string name="complete">Completo</string> - <string name="default_table_header_label">Valor</string> - <string name="default_empty_dataset_section_label">Dados</string> <string name="overdue_today">Hoje</string> <string name="remove">Remover</string> <string name="period_daily_title">Diário</string> <string name="period_weekly_title">Semana</string> <string name="period_monthly_title">Mês</string> <string name="period_yearly_title">Ano</string> + <string name="action_clear_all">Limpar tudo</string> + </resources> diff --git a/commons/src/main/res/values-pt/strings.xml b/commons/src/main/res/values-pt/strings.xml index df8ac8934cb..1d4f58714ce 100644 --- a/commons/src/main/res/values-pt/strings.xml +++ b/commons/src/main/res/values-pt/strings.xml @@ -9,7 +9,6 @@ <string name="cancel">Cancelar</string> <string name="yes">Sim</string> <string name="no">Não</string> - <string name="clear_all">seleção clara</string> <string name="navigation_list_view">Vista de lista</string> <string name="navigation_table_view">Vista de tabela</string> <string name="navigation_map_view">Vista de mapa</string> @@ -21,7 +20,6 @@ <string name="navigation_notes">Notas</string> <string name="navigation_data_entry">Entrada de dados</string> <string name="navigation_tei_data">Detalhes</string> - <string name="event_overview">Detalhes</string> <string name="select_option">Selecionar opção</string> <string name="search">Pesquisar</string> <string name="events">eventos</string> @@ -35,14 +33,11 @@ <string name="filters_disabled">Nenhum filtro aplicado</string> <string name="filters_title_period">Período</string> <string name="filters_title_org_unit">Unidade Org.</string> - <string name="filters_title_sorting">Ordem</string> - <string name="filters_title_status">Status</string> <string name="filters_title_state">Sincronizar</string> <string name="filters_title_assigned">Atribuído a mim</string> <string name="filters_title_date">Data</string> <string name="filter_follow_up_label">Acompanhado%s</string> <string name="select_period">Seleccionar tipo de período</string> - <string name="daily_period">Diário</string> <string name="weekly">Semanal</string> <string name="bi_weekly">Quinzenal</string> <string name="weekly_start_wednesday">Semanalmente começando na quarta-feira</string> @@ -61,13 +56,10 @@ <string name="financial_year_october">Ano financeiro começando em outubro</string> <string name="financial_year_november">Ano financeiro começando em novembro</string> - - <!-- State --> <string name="state_synced">Sincronizar</string> <string name="state_to_post">Para enviar</string> <string name="state_to_update">Atualizar</string> - <string name="state_to_delete">Suprimir</string> <string name="state_error">Erro</string> <string name="state_warning">Advertência</string> <string name="state_uploading">A carregar</string> @@ -160,7 +152,6 @@ <!--SDK error codes--> <string name="login_error_null_pass">A palavra-passe está em falta. Introduza a palavra-passe.</string> <string name="login_error_null_username">O nome de utilizador está em falta. Por favor, introduza o nome de utilizador.</string> - <string name="login_error_dhis_version">Este servidor está executando uma versão dhis diferente de 2.29. Atualize a versão do servidor ou use o ambiente de teste para continuar.</string> <string name="login_error_dhis_version_v2">Este servidor está a executar uma versão do DHIS2 diferente de %s. Actualize a versão do seu servidor ou contacte o seu administrador.</string> <string name="login_error_unsuccessful_response">Algo correu mal. Verifique se o URL do servidor, o nome de utilizador e a palavra-passe estão correctos e tente novamente.</string> <string name="login_error_error_response">Desculpe! Algo falhou no lado do servidor.</string> @@ -220,9 +211,7 @@ <string name="error_invalid_characters">Existem caracteres inválidos na consulta. Por favor, peça ao administrador para verificar a configuração do servidor (relaxedQueryChars,...).</string> <string name="error_server_unavailable">O servidor está indisponível do momento. Tente novamente mais tarde.</string> <string name="error_no_internet_connection">Está off-line. Ligue-se à Internet e tente novamente.</string> - <string name="unsupported_field_description">Este campo não está disponível para captura móvel</string> <string name="add_image">Adicionar imagem</string> - <string name="add_signature">Adicionar assinatura</string> <string name="add_file">Adicionar ficheiro</string> <string name="action_ok">Esta bem</string> <string name="enable_location_message">A localização do seu dispositivo está desconectada. Por favor ative-o para capturar coordenadas</string> @@ -230,9 +219,7 @@ <string name="not_now">Agora não</string> <string name="review">Revisão</string> <string name="complete">Completo</string> - <string name="default_table_header_label">Valor</string> <string name="discard_changes">Descartar mudanças</string> - <string name="default_empty_dataset_section_label">Dados</string> <string name="title_network_connection_unavailable">Ligação a rede indisponível</string> <string name="msg_network_connection_maps">É necessária uma ligação à Internet para utilizar mapas.</string> @@ -262,8 +249,6 @@ <string name="new_event_label">Novo %s</string> <string name="delete_event_label">Apagar%s</string> <string name="week_period_span_default_label">Semana %d %s a%s</string> - <string name="enrollment_reopen">reabrir</string> - <string name="sync_retry">Repetir a sincronização</string> <string name="syncing">Sincronizando...</string> <string name="remove">Remover</string> @@ -273,4 +258,5 @@ <string name="period_monthly_title">Mês</string> <string name="period_quarter_title">Trimestral</string> <string name="period_yearly_title">Ano</string> - </resources> + <string name="action_clear_all">Limpar tudo</string> +</resources> diff --git a/commons/src/main/res/values-ro/strings.xml b/commons/src/main/res/values-ro/strings.xml index 1a7483d1444..86688eb8b18 100644 --- a/commons/src/main/res/values-ro/strings.xml +++ b/commons/src/main/res/values-ro/strings.xml @@ -10,7 +10,6 @@ <string name="events">evenimente</string> <string name="done">Terminat</string> - <string name="filters_title_status">Stare</string> <string name="filters_title_date">Data</string> <string name="select_period">Selectați tipul perioadei</string> <string name="monthly">Lunar</string> diff --git a/commons/src/main/res/values-ru/strings.xml b/commons/src/main/res/values-ru/strings.xml index 091ced00e8e..29c75004f82 100644 --- a/commons/src/main/res/values-ru/strings.xml +++ b/commons/src/main/res/values-ru/strings.xml @@ -8,7 +8,6 @@ <string name="cancel">Отмена</string> <string name="yes">Да</string> <string name="no">Нет</string> - <string name="clear_all">очистить выбор</string> <string name="navigation_list_view">В виде списка</string> <string name="navigation_table_view">В виде таблицы</string> <string name="navigation_map_view">В виде карты</string> @@ -20,7 +19,6 @@ <string name="navigation_notes">Заметки</string> <string name="navigation_data_entry">Ввод данных</string> <string name="navigation_tei_data">Детали</string> - <string name="event_overview">Детали</string> <string name="select_option">Выберите опцию</string> <string name="search">Поиск</string> <string name="events">события/й</string> @@ -34,8 +32,6 @@ <string name="filters_disabled">Фильтры не применены</string> <string name="filters_title_period">Период</string> <string name="filters_title_org_unit">Орг. единица</string> - <string name="filters_title_sorting">Сортировка</string> - <string name="filters_title_status">Статус</string> <string name="filters_title_state">Синхронизация</string> <string name="filters_title_assigned">Назначен мне</string> <string name="filters_title_date">Дата</string> @@ -44,7 +40,6 @@ <string name="filters_title_enrollment_status">Cтатус регистрации</string> <string name="filter_follow_up_label">Отмеченные для последующего наблюдения %s</string> <string name="select_period">Выбрать тип периода</string> - <string name="daily_period">Ежедневно</string> <string name="weekly">Еженедельно</string> <string name="bi_weekly">Каждые две недели</string> <string name="weekly_start_wednesday">Еженедельно со среды</string> @@ -56,7 +51,6 @@ <string name="quarterly">Ежеквартально</string> <string name="six_monthly">Раз в полугодие</string> <string name="six_monthly_april">По шесть месяцев начиная с апреля</string> - <string name="six_monthly_july">Раз в полгода, начиная с июля</string> <string name="six_monthly_nov">Раз в полгода, начиная с ноября</string> <string name="yearly">Ежегодно</string> <string name="financial_year_april">Финансовый год начиная с апреля</string> @@ -64,13 +58,10 @@ <string name="financial_year_october">Финансовый год начиная с октября</string> <string name="financial_year_november">Финансовый год начиная с ноября</string> - - <!-- State --> <string name="state_synced">Синхронизация</string> <string name="state_to_post">Отправить</string> <string name="state_to_update">Обновить</string> - <string name="state_to_delete">Удалить</string> <string name="state_error">Ошибка</string> <string name="state_warning">Предупреждение</string> <string name="state_uploading">Загрузка</string> @@ -162,7 +153,6 @@ <!--SDK error codes--> <string name="login_error_null_pass">Пароль отсутствует. Пожалуйста, введите пароль.</string> <string name="login_error_null_username">Имя пользователя отсутствует. Пожалуйста, введите имя пользователя.</string> - <string name="login_error_dhis_version">На этом сервере установлена версия dhis, отличная от 2.29. Обновите версию своего сервера или используйте тестовую среду для продолжения работы.</string> <string name="login_error_dhis_version_v2">На этом сервере установлена версия DHIS2, отличная от %s. Обновите версию сервера или обратитесь к администратору.</string> <string name="login_error_unsuccessful_response">Что-то пошло не так. Пожалуйста, проверьте правильность URL-адреса сервера, имени пользователя и пароля и повторите попытку.</string> <string name="login_error_error_response">Извините! Что-то не получилось на стороне сервера.</string> @@ -209,9 +199,7 @@ <string name="error_org_unit_scope">Онлайн-поиск доступен только для подразделений вашей организации по поиску пользователей.</string> <string name="error_server_unavailable">Сервер в настоящее время недоступен. Повторите попытку позже.</string> <string name="error_no_internet_connection">Вы находитесь оффлайн. Подключитесь к Интернету и повторите попытку.</string> - <string name="unsupported_field_description">Это поле недоступно для мобильного заполнения</string> <string name="add_image">Добавить изображение</string> - <string name="add_signature">Добавить подпись</string> <string name="add_file">Добавить файл</string> <string name="action_ok">Ok</string> <string name="enable_location_message">Местоположение вашего устройства отключено. Пожалуйста, включите его для получения координат</string> @@ -219,9 +207,7 @@ <string name="not_now">Не сейчас</string> <string name="review">Просмотреть</string> <string name="complete">Завершенный</string> - <string name="default_table_header_label">Значение</string> <string name="discard_changes">Сбросить изменения</string> - <string name="default_empty_dataset_section_label">Данные</string> <string name="title_network_connection_unavailable">Сетевое подключение недоступно</string> <string name="msg_network_connection_maps">Для использования карт необходимо подключение к Интернету.</string> @@ -269,7 +255,6 @@ <string name="file_downloaded">Файл успешно загружен</string> - <!--Enrollment labels--> <plurals name="enrollment"> <item quantity="one">зачисление</item> @@ -279,7 +264,6 @@ </plurals> <string name="enrollment_data_section_label_V2">%s данных</string> <string name="enrollment_date_V2">%s дата</string> - <string name="enrollment_status">%s статус</string> <string name="break_glass_dialog_description_V2">Вы должны указать причину для проверки %s в этой защищенной программе. Все действия будут регистрироваться.</string> <string name="break_glass_reason_V2">Причина для проверки %s</string> <string name="edition_enrollment_is_no_open_V2">Эти данные нельзя редактировать, поскольку %s завершен или отменен.</string> @@ -287,14 +271,12 @@ <string name="enrollment_cancelled_V2">%s отменено</string> <string name="new_enrollment">Новый %s</string> <string name="enrolling_ou">Зарегистрирован в:</string> - <string name="program_selector_V2">Программа %s</string> <string name="more_enrollments">Больше регистраций</string> <string name="remove_from">Удалить из</string> <string name="refresh_this_record">Обновить эту запись</string> <string name="view_timeline">Просмотр хронологии</string> <string name="group_by_stage">Группировать по этапам</string> - <!-- Event --> <plurals name="event_label"> <item quantity="one">мероприятие</item> @@ -315,12 +297,9 @@ <string name="event_label_date_in_future_message">У этого %s не может быть даты в будущем. Пожалуйста, измените ее.</string> <string name="failed_insert_event_label">Не удалось вставить новый %s</string> <string name="week_period_span_default_label">Неделя %d %s до %s</string> - <string name="group_event_label_by_stage">Группировать %s по этапам</string> - <string name="show_event_label_timeline">Показать хронологию %s </string> <string name="empty_tei_event_label_add">Нет зарегистрированных %s, нажмите \"+\", чтобы добавить новый.</string> <string name="empty_tei_event_label_no_add">Нет зарегистрированных %s.</string> <string name="enrollment_date_edition_warning_event_label">Есть запланированные %s, которые не будут перенесены.</string> - <string name="enrollment_reopen">снова открыть</string> <string name="sync_retry">Повторить синхронизацию</string> <string name="syncing">Синхронизация...</string> @@ -331,4 +310,7 @@ <string name="period_monthly_title">Месяц</string> <string name="period_quarter_title">Квартал</string> <string name="period_yearly_title">Год</string> - </resources> + <string name="action_clear_all">Очистить все</string> + + <string name="enrollment_status">%s статус</string> +</resources> diff --git a/commons/src/main/res/values-si/strings.xml b/commons/src/main/res/values-si/strings.xml index 29628b9ac79..9ee4c5153cc 100644 --- a/commons/src/main/res/values-si/strings.xml +++ b/commons/src/main/res/values-si/strings.xml @@ -7,7 +7,6 @@ <string name="done">කළා</string> <string name="filters_title_date">දිනය</string> - <string name="daily_period">දිනපතා</string> <string name="weekly">සතිපතා</string> <string name="bi_weekly">දෙසතියකට වරක්</string> <string name="monthly">මාස්පතා</string> @@ -38,9 +37,7 @@ <string name="interval_yesterday">ඊයේ</string> <string name="section_charts">ප්‍රස්ථාර</string> - <string name="default_table_header_label">අගය</string> <string name="discard_changes">වෙනස් කිරීම් ඉවතලන්න</string> - <string name="default_empty_dataset_section_label">දත්ත</string> <string name="overdue_today">අද</string> <string name="remove">ඉවත් කරන්න</string> <string name="period_daily_title">දිනපතා</string> diff --git a/commons/src/main/res/values-sv/strings.xml b/commons/src/main/res/values-sv/strings.xml index 20f9a44f588..1d90835c3d3 100644 --- a/commons/src/main/res/values-sv/strings.xml +++ b/commons/src/main/res/values-sv/strings.xml @@ -9,17 +9,14 @@ <string name="navigation_programs">program</string> <string name="navigation_relationships">Relationer</string> <string name="navigation_tei_data">detaljer</string> - <string name="event_overview">detaljer</string> <string name="select_option">Välj alternativ</string> <string name="search">Sök</string> <string name="events">händelser</string> <string name="data_sets">dataset</string> <string name="tei">TEI</string> <string name="filters_title_period">Period</string> - <string name="filters_title_status">Status</string> <string name="filters_title_state">Synkronisera</string> <string name="filters_title_date">Datum</string> - <string name="daily_period">Dagligen</string> <string name="weekly">Varje vecka</string> <string name="monthly">En gång i månaden</string> <string name="bi_monthly">varannan månad</string> @@ -29,7 +26,6 @@ <!-- State --> <string name="state_synced">Synkronisera</string> <string name="state_to_update">Att uppdatera</string> - <string name="state_to_delete">Att radera</string> <string name="state_error">Fel</string> <string name="state_warning">Varning</string> <!-- Status --> @@ -65,17 +61,14 @@ <string name="section_feedback">Återkoppling</string> <string name="section_indicators">indikatorer</string> <string name="section_charts">diagram</string> - <string name="login_error_dhis_version">Den här servern kör en dhis-version som skiljer sig från 2.29. Uppdatera din serverversion eller använd testmiljön för att fortsätta.</string> <string name="online_search_parsing_error">Fel vid tolkning av resultat</string> <string name="add_file">Lägg till fil</string> <string name="keep_editing">Fortsätt redigera</string> <string name="complete">Färdigt</string> - <string name="default_table_header_label">Värde</string> <string name="discard_changes">Ignorera ändringar</string> - <string name="default_empty_dataset_section_label">Data</string> - <string name="enrollment_reopen">Öppna igen</string> - <string name="remove">Ta bort</string> <string name="period_daily_title">Dagligen</string> <string name="period_yearly_title">År</string> + <string name="action_clear_all">Rensa alla</string> + </resources> diff --git a/commons/src/main/res/values-tet/strings.xml b/commons/src/main/res/values-tet/strings.xml index f8fe5cc550a..893f89f78ee 100644 --- a/commons/src/main/res/values-tet/strings.xml +++ b/commons/src/main/res/values-tet/strings.xml @@ -6,14 +6,11 @@ <string name="yes">Sim</string> <string name="no">Lae</string> <string name="navigation_tei_data">Detalles</string> - <string name="event_overview">Detalles</string> <string name="select_option">Hili opsaun</string> <string name="data_sets">Pakote dadus</string> <string name="filters_title_period">Períodu</string> - <string name="filters_title_status">Estadu</string> <string name="filters_title_date">Data</string> <string name="select_period">Hili Tipu períodu</string> - <string name="daily_period">Diáriu</string> <string name="weekly">Semanal</string> <string name="monthly">Mensal</string> <string name="bi_monthly">Bimensal</string> @@ -45,8 +42,6 @@ <string name="section_feedback">Feedback</string> <string name="section_indicators">Indikadores</string> <string name="complete">Kompletu</string> - <string name="default_table_header_label">Valor</string> - <string name="default_empty_dataset_section_label">Dadus</string> <string name="remove">Hasai</string> <string name="period_daily_title">Diáriu</string> <string name="period_yearly_title">Tinan</string> diff --git a/commons/src/main/res/values-tg/strings.xml b/commons/src/main/res/values-tg/strings.xml index ecb8aa6339d..bc5064b3e92 100644 --- a/commons/src/main/res/values-tg/strings.xml +++ b/commons/src/main/res/values-tg/strings.xml @@ -8,16 +8,13 @@ <string name="navigation_programs">Барномаҳо</string> <string name="navigation_data_entry">Ворид кардани иттилоот</string> <string name="navigation_tei_data">Маълумоти муфассал</string> - <string name="event_overview">Маълумоти муфассал</string> <string name="search">Ҷустуҷӯ</string> <string name="data_sets">Маҷмӯъҳои иттилоот</string> <string name="done">Иҷро шуд</string> <string name="filters_title_period">Давра</string> - <string name="filters_title_status">Ҳолат</string> <string name="filters_title_date">Сана</string> <string name="select_period">Интихоби навъи давра</string> - <string name="daily_period">Ҳаррӯза</string> <string name="weekly">Ҳафтаина</string> <string name="monthly">Моҳона</string> <string name="bi_monthly">Ду маротиба дар як моҳ</string> @@ -55,8 +52,6 @@ <string name="section_feedback">Изҳори назар</string> <string name="section_indicators">Индикаторҳо</string> <string name="complete">Анҷом ёфт</string> - <string name="default_table_header_label">Қимат</string> - <string name="default_empty_dataset_section_label">Иттилоот</string> <string name="overdue_today">Имрӯз</string> <string name="remove">Тоза кардан</string> <string name="period_daily_title">Ҳаррӯза</string> diff --git a/commons/src/main/res/values-uk/strings.xml b/commons/src/main/res/values-uk/strings.xml index 9d3be7fc57f..b82b29502ef 100644 --- a/commons/src/main/res/values-uk/strings.xml +++ b/commons/src/main/res/values-uk/strings.xml @@ -9,7 +9,6 @@ <string name="cancel">Скасувати</string> <string name="yes">Так</string> <string name="no">Ні</string> - <string name="clear_all">очистити вибір</string> <string name="navigation_list_view">У вигляді списку</string> <string name="navigation_table_view">У вигляді таблиці</string> <string name="navigation_map_view">У вигляді карті</string> @@ -20,7 +19,6 @@ <string name="navigation_notes">Примітки</string> <string name="navigation_data_entry">Введення даних</string> <string name="navigation_tei_data">Деталі</string> - <string name="event_overview">Деталі</string> <string name="select_option">Обрати опцію</string> <string name="search">Пошук</string> <string name="events">випадки</string> @@ -34,15 +32,12 @@ <string name="filters_disabled">Фільтрів не застосовано</string> <string name="filters_title_period">Період</string> <string name="filters_title_org_unit">Орг. підрозділ</string> - <string name="filters_title_sorting">Сортування</string> - <string name="filters_title_status">Статус</string> <string name="filters_title_state">Синхронізувати</string> <string name="filters_title_assigned">Призначено мені</string> <string name="filters_title_date">Дата</string> <string name="filters_title_event_label_date">Дата %s </string> <string name="filter_follow_up_label">Для подальших дій %s</string> <string name="select_period">Обрати тип періоду</string> - <string name="daily_period">Щодня</string> <string name="weekly">Щотижня</string> <string name="bi_weekly">Щодва тижні</string> <string name="monthly">Щомісяця</string> @@ -54,7 +49,6 @@ <string name="state_synced">Синхронізувати</string> <string name="state_to_post">Надіслати</string> <string name="state_to_update">Оновити</string> - <string name="state_to_delete">Видалити</string> <string name="state_error">Помилка</string> <string name="state_warning">Попередження</string> <string name="state_uploading">Завантаження</string> @@ -147,7 +141,6 @@ <!--SDK error codes--> <string name="login_error_null_pass">Пароль відсутній. Будь ласка, введіть пароль.</string> <string name="login_error_null_username">Ім\'я користувача відсутнє. Будь ласка, введіть ім\'я користувача.</string> - <string name="login_error_dhis_version">На цьому сервері працює інша версія dhis, ніж 2.29. Щоб продовжити, оновіть версію серверу або скористайтеся середовищем тестування.</string> <string name="login_error_dhis_version_v2">На цьому сервері працює версія DHIS2, що відрізняється від %s. Оновіть версію серверу або сконтактуйте з системним адміністратором.</string> <string name="login_error_unsuccessful_response">Сталася помилка. Будь ласка, перевірте правильність URL-адреси серверу, імені користувача та пароля і повторіть спробу.</string> <string name="login_error_error_response">Вибачте! На сервері сталася помилка. </string> @@ -205,9 +198,7 @@ <string name="error_min_attributes">Недостатньо атрибутів для виконання пошуку. Уточніть пошук за допомогою додаткових атрибутів.</string> <string name="error_org_unit_scope">Онлайн-пошук доступний лише для організаційних підрозділів користувача.</string> <string name="error_invalid_characters">У запиті є недійсні символи. Попросіть адміністратора перевірити конфігурацію сервера (relaxedQueryChars,...).</string> - <string name="unsupported_field_description">Це поле недоступне в мобільній версії</string> <string name="add_image">Додати зображення</string> - <string name="add_signature">Додати підпис</string> <string name="add_file">Додати файл</string> <string name="action_ok">OK</string> <string name="enable_location_message">Розташування Вашого пристрою відключено. Будь ласка, увімкніть його для отримання координат</string> @@ -215,9 +206,7 @@ <string name="not_now">Не зараз</string> <string name="review">Перегляд</string> <string name="complete">Завершити</string> - <string name="default_table_header_label">Значення</string> <string name="discard_changes">Відхилити внесені зміни</string> - <string name="default_empty_dataset_section_label">Дані</string> <string name="overdue_today">Сьогодні</string> <plurals name="overdue_days"> <item quantity="one">%d день прострочення</item> @@ -257,11 +246,10 @@ <string name="event_label_was_deleted">%s успішно видалено</string> <string name="confirm_delete_event_label">Ви впевнені, що хочете видалити %s?</string> <string name="week_period_span_default_label">Тиждень %d %s до %s</string> - <string name="enrollment_reopen">повторно відкрити</string> - <string name="syncing">Синхронізація...</string> <string name="remove">Видалити</string> <string name="period_daily_title">Щодня</string> <string name="period_weekly_title">Тиждень</string> <string name="period_yearly_title">Рік</string> - </resources> + <string name="action_clear_all">Очистити все</string> +</resources> diff --git a/commons/src/main/res/values-ur/strings.xml b/commons/src/main/res/values-ur/strings.xml index a5a12904c62..28b6ff218fe 100644 --- a/commons/src/main/res/values-ur/strings.xml +++ b/commons/src/main/res/values-ur/strings.xml @@ -11,17 +11,13 @@ <string name="navigation_notes">نوٹس</string> <string name="navigation_data_entry">ڈیٹا انٹری</string> <string name="navigation_tei_data">تفصیلات</string> - <string name="event_overview">تفصیلات</string> <string name="search">تلاش کریں</string> <string name="data_sets">ڈیٹا سیٹس</string> <string name="done">ہو گیا</string> <string name="filters_title_period">مدت</string> - <string name="filters_title_sorting">ترتیب دیں</string> - <string name="filters_title_status">حالت</string> <string name="filters_title_date">تاریخ</string> <string name="select_period">مدت کی قسم منتخب کریں</string> - <string name="daily_period">روزانہ</string> <string name="weekly">ہفتہ وار</string> <string name="weekly_start_wednesday">ہفتہ وار شروع ہونے والا ہفتہ</string> <string name="weekly_start_thursday">جمعرات سے شروع ہونے والا ہفتہ</string> @@ -85,8 +81,6 @@ <string name="section_charts">چارٹس</string> <string name="action_ok">ٹھیک ہے\!</string> <string name="complete">مکمل</string> - <string name="default_table_header_label">قدر</string> - <string name="default_empty_dataset_section_label">ڈیٹا</string> <string name="overdue_today">آج</string> <string name="remove">حذف</string> <string name="period_daily_title">روزانہ</string> diff --git a/commons/src/main/res/values-uz-rUZ/strings.xml b/commons/src/main/res/values-uz-rUZ/strings.xml index a119ce757b7..1aa348770d0 100644 --- a/commons/src/main/res/values-uz-rUZ/strings.xml +++ b/commons/src/main/res/values-uz-rUZ/strings.xml @@ -8,7 +8,6 @@ <string name="cancel">Бекор қилиш</string> <string name="yes">Ҳа</string> <string name="no">Йўқ</string> - <string name="clear_all">aniq tanlov</string> <string name="navigation_list_view">Roʼyxat koʼrinishi</string> <string name="navigation_table_view">Jadval koʼrinishi</string> <string name="navigation_map_view">Xarita koʼrinishi</string> @@ -19,7 +18,6 @@ <string name="navigation_notes">Izohlar</string> <string name="navigation_data_entry">Maʼlumot kiritish</string> <string name="navigation_tei_data">Тафсилотлари</string> - <string name="event_overview">Тафсилотлари</string> <string name="select_option">Variant tanlang</string> <string name="search">Izlash</string> <string name="data_sets">Maʼlumotlar toʼplami</string> @@ -30,13 +28,10 @@ <string name="filters_disabled">Hech qanday filtr qoʼllanilmagan</string> <string name="filters_title_period">davr</string> <string name="filters_title_org_unit">Tashkiliy boʼlim</string> - <string name="filters_title_sorting">Tartiblash</string> - <string name="filters_title_status">Status</string> <string name="filters_title_state">Sinxronlash</string> <string name="filters_title_assigned">Menga berilgan vakolat</string> <string name="filters_title_date">Sana</string> <string name="select_period">Davr turini tanlash</string> - <string name="daily_period">Кунлик</string> <string name="weekly">Ҳафталик</string> <string name="bi_weekly">Juft hafta</string> <string name="monthly">Ойлик</string> @@ -48,7 +43,6 @@ <string name="state_synced">Sinxronlash</string> <string name="state_to_post">Yuborish uchun</string> <string name="state_to_update">Yangilash uchun</string> - <string name="state_to_delete">Oʼchirib tashlash uchun</string> <string name="state_error">Xatolik</string> <string name="state_warning">Ogohlantirish</string> <string name="state_relationship">Oʼzaro aloqa</string> @@ -116,7 +110,6 @@ <string name="section_feedback">Fikr-mulohaza</string> <string name="section_indicators">Koʼrsatgichlar</string> <string name="section_charts">Diagrammalar</string> - <string name="login_error_dhis_version">Ushbu server 2.29 dan farqli versiyani ishlatmoqda. Server versiyasini yangilang yoki davom etish uchun sinov muddatidan foydalaning.</string> <string name="login_error_unsuccessful_response">Nimadir notoʼgʼri bajarildi. Server URL manzili, foydalanuvchi nomi va parol toʼgʼri ekanligini tekshiring va qaytadan urining.</string> <string name="online_search_parsing_error">Natijalarni tahlil qilishda xatolik yuz berdi</string> <string name="add_image">Rasm qoʼshish</string> @@ -125,15 +118,12 @@ <string name="keep_editing">Tahrirni davom eting</string> <string name="review">Ko‘rib chiqish</string> <string name="complete">Bajarildi</string> - <string name="default_table_header_label">Қиймат</string> <string name="discard_changes">Oʼzgartirishlar bekor qilinsin</string> - <string name="default_empty_dataset_section_label">Маълумот</string> <string name="overdue_today">бугун</string> - <string name="enrollment_reopen">qayta ochish</string> - <string name="syncing">Sinxronizatsiyalanmoqda...</string> <string name="remove">Олиб ташлаш</string> <string name="period_daily_title">Кунлик</string> <string name="period_weekly_title">Hafta</string> <string name="period_yearly_title">Yil</string> - </resources> + <string name="action_clear_all">Barchasini tozalash</string> +</resources> diff --git a/commons/src/main/res/values-uz/strings.xml b/commons/src/main/res/values-uz/strings.xml index 3965897d0ef..971dfe7ab20 100644 --- a/commons/src/main/res/values-uz/strings.xml +++ b/commons/src/main/res/values-uz/strings.xml @@ -8,7 +8,6 @@ <string name="cancel">Бекор қилиш</string> <string name="yes">Ҳа</string> <string name="no">Йўқ</string> - <string name="clear_all">аниқ танлов</string> <string name="navigation_list_view">Рўйхат кўриниши</string> <string name="navigation_table_view">Жадвал кўриниши</string> <string name="navigation_map_view">Харита кўриниши</string> @@ -19,7 +18,6 @@ <string name="navigation_notes">Изоҳлар</string> <string name="navigation_data_entry">Маълумот киритиш</string> <string name="navigation_tei_data">Тафсилотлари</string> - <string name="event_overview">Тафсилотлари</string> <string name="select_option">Вариант танланг</string> <string name="search">Қидириш</string> <string name="events">ҳодиса/тадбирлар</string> @@ -33,13 +31,10 @@ <string name="filters_disabled">Ҳеч қандай фильтр қўлланилмаган</string> <string name="filters_title_period">Давр</string> <string name="filters_title_org_unit">Ташкилий бўлим</string> - <string name="filters_title_sorting">Тартиблаш</string> - <string name="filters_title_status">Статус</string> <string name="filters_title_state">Синхронлаш</string> <string name="filters_title_assigned">Менга берилган ваколат</string> <string name="filters_title_date">Сана</string> <string name="select_period">Давр турини танлаш</string> - <string name="daily_period">Кунлик</string> <string name="weekly">Ҳафталик</string> <string name="bi_weekly">Жуфт ҳафталик</string> <string name="weekly_start_wednesday">Чоршанба кунидан бошлаб ҳар ҳафта</string> @@ -58,13 +53,10 @@ <string name="financial_year_october">Молиявий йил Октябрдан бошлаб</string> <string name="financial_year_november">Молиявий йил Ноябрдан бошлаб</string> - - <!-- State --> <string name="state_synced">Синхронлаш</string> <string name="state_to_post">Юбориш учун</string> <string name="state_to_update">Янгилаш учун</string> - <string name="state_to_delete">Ўчириб ташлаш учун</string> <string name="state_error">Хатолик</string> <string name="state_warning">Огоҳлантириш</string> <string name="state_uploading">Юкланмоқда</string> @@ -141,11 +133,8 @@ <string name="section_charts">Диаграммалар</string> <string name="section_charts_indicators">Диаграммалар ва индикаторлар</string> - <string name="login_error_dhis_version">Ушбу сервер 2.29 дан фарқли версияни ишлатмоқда. Сервер версиясини янгиланг ёки давом этиш учун синов муддатидан фойдаланинг.</string> <string name="online_search_parsing_error">Натижаларни таҳлил қилишда хатолик юз берди</string> - <string name="unsupported_field_description">Ушбу сатр мобил назорат учун мавжуд эмас</string> <string name="add_image">Расм қўшиш</string> - <string name="add_signature">Имзо қўшинг</string> <string name="add_file">Файл қўшиш</string> <string name="action_ok">Яхши</string> <string name="enable_location_message">Сизнинг қўрилмангиз интернет алоқаси узилди. Илтимос, координаталарни олиш учун уни ёқинг</string> @@ -153,13 +142,9 @@ <string name="not_now">Hozir emas</string> <string name="review">Кўриб чиқиш</string> <string name="complete">Тўлдириш</string> - <string name="default_table_header_label">Қиймат</string> <string name="discard_changes">Ўзгартиришлар бекор қилинсин</string> - <string name="default_empty_dataset_section_label">Маълумот</string> <string name="overdue_today">Бугун</string> <string name="enrolling_ou">Қайд этилган:</string> - <string name="enrollment_reopen">қайта очиш</string> - <string name="syncing">Синхронизацияланмоқда...</string> <string name="remove">Олиб ташлаш</string> <string name="period_daily_title">Кунлик</string> @@ -168,4 +153,5 @@ <string name="period_monthly_title">Ой</string> <string name="period_quarter_title">Чорак</string> <string name="period_yearly_title">Йил</string> - </resources> + <string name="action_clear_all">Барчасини тозалаш</string> +</resources> diff --git a/commons/src/main/res/values-vi/strings.xml b/commons/src/main/res/values-vi/strings.xml index 5f6402a327a..400d463ffa7 100644 --- a/commons/src/main/res/values-vi/strings.xml +++ b/commons/src/main/res/values-vi/strings.xml @@ -9,7 +9,6 @@ <string name="cancel">Hủy</string> <string name="yes">Có</string> <string name="no">Không</string> - <string name="clear_all">Bỏ chọn</string> <string name="navigation_list_view">Xem danh sách</string> <string name="navigation_table_view">Xem bảng</string> <string name="navigation_map_view">Xem bản đồ</string> @@ -21,7 +20,6 @@ <string name="navigation_notes">Ghi Chú</string> <string name="navigation_data_entry">Nhập dữ liệu</string> <string name="navigation_tei_data">Chi tiết</string> - <string name="event_overview">Chi tiết</string> <string name="select_option">Chọn</string> <string name="search">Tìm kiếm</string> <string name="events">sự kiện</string> @@ -35,8 +33,6 @@ <string name="filters_disabled">Không có bộ lọc nào được áp dụng</string> <string name="filters_title_period">Thời điểm</string> <string name="filters_title_org_unit">Đơn vị</string> - <string name="filters_title_sorting">Sắp xếp thứ tự</string> - <string name="filters_title_status">Trạng thái</string> <string name="filters_title_state">Đồng bộ</string> <string name="filters_title_assigned">Gán cho tôi</string> <string name="filters_title_date">Ngày</string> @@ -45,7 +41,6 @@ <string name="filters_title_enrollment_status">@string/enrollment_status</string> <string name="filter_follow_up_label">Theo dõi %s</string> <string name="select_period">Chọn loại thời điểm</string> - <string name="daily_period">Hàng Ngày</string> <string name="weekly">Hàng Tuần</string> <string name="bi_weekly">Định kỳ 2 tuần</string> <string name="weekly_start_wednesday">Hàng tuần bắt đầu từ thứ Tư</string> @@ -63,7 +58,6 @@ <string name="state_synced">Đồng bộ</string> <string name="state_to_post">Gửi</string> <string name="state_to_update">Cập nhật</string> - <string name="state_to_delete">Xóa</string> <string name="state_error">Lỗi</string> <string name="state_warning">Cảnh báo</string> <string name="state_uploading">Đang tải lên</string> @@ -156,7 +150,6 @@ <!--SDK error codes--> <string name="login_error_null_pass">Thiếu mật khẩu. Xin vui lòng nhập mật khẩu</string> <string name="login_error_null_username">Thiếu tên đăng nhập. Xin vui lòng nhập tên đăng nhập.</string> - <string name="login_error_dhis_version">Máy chủ không chạy dhis phiên bản 2.29. Nâng cấp phiên bản máy chủ hoặc sử dụng môi trường thử nghiệm để thực hiện.</string> <string name="login_error_dhis_version_v2">Máy chủ này đang chạy phiên bản DHIS2 khác với %s. Vui lòng cập nhật phiên bản máy chủ của bạn hoặc liên hệ quản lý.</string> <string name="login_error_unsuccessful_response">Có gì đó không đúng. Vui lòng kiểm tra đường dẫn liên kết đến máy chủ, tên đăng nhập, mật khẩu và thử lại.</string> <string name="login_error_error_response">Rất tiếc! Có lỗi gì đó ở phía máy chủ</string> @@ -216,9 +209,7 @@ <string name="error_invalid_characters">Có các ký tự không hợp lệ trong yêu cầu. Vui lòng liên hệ quản lý để xác nhận cấu hình máy chủ (relaxQueryChars,...)</string> <string name="error_server_unavailable">Không thể truy cập máy chủ. Xin vui lòng thử lại sau.</string> <string name="error_no_internet_connection">Bạn đang ngoại tuyến. Vui lòng kết nối mạng và thử lại</string> - <string name="unsupported_field_description">Trường này không hiển thị để nhập dữ liệu bằng điện thoại</string> <string name="add_image">Thêm hình ảnh</string> - <string name="add_signature">Thêm chữ ký</string> <string name="add_file">Thêm tập tin</string> <string name="action_ok">Ok</string> <string name="enable_location_message">Tính năng chia sẻ vị trí thiết bị của bạn bị tắt. Vui lòng mở nó để thu thập tọa độ.</string> @@ -226,9 +217,7 @@ <string name="not_now">Không phải bây giờ</string> <string name="review">Xem xét</string> <string name="complete">Hoàn tất</string> - <string name="default_table_header_label">Giá trị</string> <string name="discard_changes">Hủy bỏ các thay đổi</string> - <string name="default_empty_dataset_section_label">Dữ liệu</string> <string name="title_network_connection_unavailable">Không có kết nối mạng</string> <string name="msg_network_connection_maps">Cần có kết nối mạng để sử dụng bản đồ</string> @@ -247,10 +236,8 @@ <string name="file_downloaded">Tệp đã tải xuống thành công</string> - <string name="enrollment_data_section_label_V2">Dữ liệu %s</string> <string name="enrollment_date_V2">%s ngày</string> - <string name="enrollment_status">%s trạng thái</string> <string name="enrollment_cancelled_V2">%s đã hủy</string> <string name="new_enrollment">%sMới</string> <string name="enrolling_ou">Đã đăng ký vào:</string> @@ -258,8 +245,6 @@ <string name="event_label_date">%s ngày</string> <string name="delete_event_label">Xóa %s</string> <string name="week_period_span_default_label">Tuần %d %s đến %s</string> - <string name="enrollment_reopen">mở lại</string> - <string name="sync_retry">Đồng bộ lại</string> <string name="syncing">Đang đồng bộ...</string> <string name="remove">Xóa</string> @@ -271,4 +256,8 @@ <string name="database_import_failed">Nhập cơ sở dữ liệu không thành công</string> <string name="invalid_file">Tệp không hợp lệ</string> <string name="not_in_totp_2fa_enrollment_mode">Không ở chế độ đăng ký TOTP 2FA</string> + + <string name="action_clear_all">Xóa tất cả</string> + + <string name="enrollment_status">%s trạng thái</string> </resources> diff --git a/commons/src/main/res/values-zh-rCN/strings.xml b/commons/src/main/res/values-zh-rCN/strings.xml index f7f33fdbf19..2bdfb30348e 100644 --- a/commons/src/main/res/values-zh-rCN/strings.xml +++ b/commons/src/main/res/values-zh-rCN/strings.xml @@ -9,7 +9,6 @@ <string name="cancel">取消</string> <string name="yes">是</string> <string name="no">否</string> - <string name="clear_all">清除选择</string> <string name="navigation_list_view">列表显示</string> <string name="navigation_table_view">表格检视</string> <string name="navigation_map_view">地图检视</string> @@ -21,7 +20,6 @@ <string name="navigation_notes">笔记</string> <string name="navigation_data_entry">数据输入</string> <string name="navigation_tei_data">详情</string> - <string name="event_overview">详情</string> <string name="select_option">选择选项</string> <string name="search">搜索</string> <string name="events">事件</string> @@ -35,8 +33,6 @@ <string name="filters_disabled">无过滤器</string> <string name="filters_title_period">周期</string> <string name="filters_title_org_unit">机构</string> - <string name="filters_title_sorting">排序</string> - <string name="filters_title_status">状态</string> <string name="filters_title_state">同步</string> <string name="filters_title_assigned">指派给我</string> <string name="filters_title_date">日期</string> @@ -45,7 +41,6 @@ <string name="filters_title_enrollment_status">@string/enrollment_status</string> <string name="filter_follow_up_label">跟进%s</string> <string name="select_period">请选择周期类型</string> - <string name="daily_period">每日</string> <string name="weekly">每周</string> <string name="bi_weekly">双周</string> <string name="weekly_start_wednesday">开始于周三的周报</string> @@ -58,7 +53,6 @@ <string name="quarterly_nov">每季度 11 月</string> <string name="six_monthly">六个月</string> <string name="six_monthly_april">开始于四月的每六个月</string> - <string name="six_monthly_july">从 7 月开始,每 6 个月一次</string> <string name="six_monthly_nov">开始于11月的半年</string> <string name="yearly">每年</string> <string name="financial_year_april">开始于四月的财政年</string> @@ -66,13 +60,10 @@ <string name="financial_year_october">开始于十月的财政年</string> <string name="financial_year_november">开始于11月的财政年</string> - - <!-- State --> <string name="state_synced">同步</string> <string name="state_to_post">发送</string> <string name="state_to_update">更新</string> - <string name="state_to_delete">删除</string> <string name="state_error">错误</string> <string name="state_warning">警告</string> <string name="state_uploading">上传</string> @@ -165,7 +156,6 @@ <!--SDK error codes--> <string name="login_error_null_pass">密码丢失。请输入密码。</string> <string name="login_error_null_username">缺少用户名。请输入用户名。</string> - <string name="login_error_dhis_version">服务器运行版本不是2.29,请更新服务器版本或使用测试环境继续</string> <string name="login_error_dhis_version_v2">此服务器正在运行与 %s 不同的 DHIS2 版本。更新您的服务器版本或联系您的管理员。</string> <string name="login_error_unsuccessful_response">出了些问题。请检查服务器 URL、用户名和密码是否正确,然后重试。</string> <string name="login_error_error_response">对不起!服务器端出现问题。</string> @@ -225,9 +215,7 @@ <string name="error_invalid_characters">查询中有无效字符。请让管理员验证服务器配置(relaxedQueryChars,...)。</string> <string name="error_server_unavailable">服务器当前不可用。稍后再试。</string> <string name="error_no_internet_connection">您已离线。连接到互联网并重试。</string> - <string name="unsupported_field_description">该字段不可用于移动采集</string> <string name="add_image">添加图片</string> - <string name="add_signature">添加签名</string> <string name="add_file">添加文件</string> <string name="action_ok">Ok!</string> <string name="enable_location_message">您的设备位置已断开。请启用它以捕获坐标</string> @@ -235,9 +223,7 @@ <string name="not_now">现在不要</string> <string name="review">审查</string> <string name="complete">完成</string> - <string name="default_table_header_label">值</string> <string name="discard_changes">忽略修改</string> - <string name="default_empty_dataset_section_label">数据</string> <string name="title_network_connection_unavailable">网络连接不可用</string> <string name="msg_network_connection_maps">需要互联网连接才能使用地图。</string> @@ -267,7 +253,6 @@ <string name="file_downloaded">文件下载成功</string> - <!--Enrollment labels--> <plurals name="enrollment"> <item quantity="other">注册人数</item> @@ -276,7 +261,6 @@ <string name="enrollment_data_section_label_V2">%s 数据</string> <string name="enrollment_coordinates_V2">%s 坐标</string> <string name="enrollment_date_V2">%s 日期</string> - <string name="enrollment_status">%s 地位</string> <string name="break_glass_dialog_description_V2">在这个受保护的程序中,您必须提供检查%s 的理由。所有活动都将记录在案。</string> <string name="break_glass_reason_V2">检查原因%s</string> <string name="edition_enrollment_is_no_open_V2">该数据不可编辑,因为%s 已完成或取消</string> @@ -284,14 +268,12 @@ <string name="enrollment_cancelled_V2">%s 已取消</string> <string name="new_enrollment">新%s</string> <string name="enrolling_ou">加入:</string> - <string name="program_selector_V2">计划%s</string> <string name="more_enrollments">更多注册人数</string> <string name="remove_from">从</string> <string name="refresh_this_record">刷新此记录</string> <string name="view_timeline">查看时间表</string> <string name="group_by_stage">按阶段分组</string> - <!-- Event --> <plurals name="event_label"> <item quantity="other">活动</item> @@ -309,12 +291,9 @@ <string name="event_label_date_in_future_message">%s 的日期不能是未来。请更改。</string> <string name="failed_insert_event_label">插入新%s</string> <string name="week_period_span_default_label">星期%d %s到%s</string> - <string name="group_event_label_by_stage">按阶段划分的组别%s </string> - <string name="show_event_label_timeline">显示%s 时间轴</string> <string name="empty_tei_event_label_add">没有注册%s ,点击 \"+\"可添加新的 。</string> <string name="empty_tei_event_label_no_add">%s 。</string> <string name="enrollment_date_edition_warning_event_label">计划中的%s 不会改期</string> - <string name="enrollment_reopen">重新打开</string> <string name="sync_retry">重试同步</string> <string name="syncing">同步</string> @@ -328,4 +307,7 @@ <string name="period_six_monthly_title">每月六次</string> <string name="period_yearly_title">年</string> <string name="period_financial_year_title">财政年度</string> - </resources> + <string name="action_clear_all">全清除</string> + + <string name="enrollment_status">%s 地位</string> +</resources> diff --git a/commons/src/main/res/values-zh/strings.xml b/commons/src/main/res/values-zh/strings.xml index f0a63a42cb1..4ddc1ffd3e2 100644 --- a/commons/src/main/res/values-zh/strings.xml +++ b/commons/src/main/res/values-zh/strings.xml @@ -9,7 +9,6 @@ <string name="cancel">取消</string> <string name="yes">是的</string> <string name="no">不</string> - <string name="clear_all">清除选择</string> <string name="navigation_list_view">列表显示</string> <string name="navigation_table_view">表格显示</string> <string name="navigation_map_view">地图显示</string> @@ -21,7 +20,6 @@ <string name="navigation_notes">笔记</string> <string name="navigation_data_entry">数据输入</string> <string name="navigation_tei_data">详情</string> - <string name="event_overview">详情</string> <string name="select_option">选择选项</string> <string name="search">搜索</string> <string name="events">事件</string> @@ -35,8 +33,6 @@ <string name="filters_disabled">无过滤器</string> <string name="filters_title_period">期间</string> <string name="filters_title_org_unit">机构</string> - <string name="filters_title_sorting">排序</string> - <string name="filters_title_status">状态</string> <string name="filters_title_state">同步</string> <string name="filters_title_assigned">指派给我</string> <string name="filters_title_date">日期</string> @@ -45,7 +41,6 @@ <string name="filters_title_enrollment_status">@string/enrollment_status</string> <string name="filter_follow_up_label">跟进%s</string> <string name="select_period">请选择周期类型</string> - <string name="daily_period">每日</string> <string name="weekly">每周</string> <string name="bi_weekly">两周</string> <string name="weekly_start_wednesday">开始于周三的周报</string> @@ -58,7 +53,6 @@ <string name="quarterly_nov">每季度 11 月</string> <string name="six_monthly">六个月</string> <string name="six_monthly_april">开始于四月的每六个月</string> - <string name="six_monthly_july">从 7 月开始,每 6 个月一次</string> <string name="six_monthly_nov">开始于11月的半年</string> <string name="yearly">每年</string> <string name="financial_year_april">开始于四月的财政年</string> @@ -66,13 +60,10 @@ <string name="financial_year_october">开始于十月的财政年</string> <string name="financial_year_november">开始于11月的财政年</string> - - <!-- State --> <string name="state_synced">同步</string> <string name="state_to_post">发送</string> <string name="state_to_update">更新</string> - <string name="state_to_delete">删除</string> <string name="state_error">错误</string> <string name="state_warning">警告</string> <string name="state_uploading">上传</string> @@ -165,7 +156,6 @@ <!--SDK error codes--> <string name="login_error_null_pass">密码丢失。请输入密码。</string> <string name="login_error_null_username">缺少用户名。请输入用户名。</string> - <string name="login_error_dhis_version">服务器运行版本不是2.29,请更新服务器版本或使用测试环境继续</string> <string name="login_error_dhis_version_v2">此服务器正在运行与 %s 不同的 DHIS2 版本。更新您的服务器版本或联系您的管理员。</string> <string name="login_error_unsuccessful_response">出了些问题。请检查服务器 URL、用户名和密码是否正确,然后重试。</string> <string name="login_error_error_response">对不起!服务器端出现问题。</string> @@ -225,9 +215,7 @@ <string name="error_invalid_characters">查询中有无效字符。请让管理员验证服务器配置(relaxedQueryChars,...)。</string> <string name="error_server_unavailable">服务器当前不可用。稍后再试。</string> <string name="error_no_internet_connection">您已离线。连接到互联网并重试。</string> - <string name="unsupported_field_description">该字段不可用于移动采集</string> <string name="add_image">添加图片</string> - <string name="add_signature">添加签名</string> <string name="add_file">添加文件</string> <string name="action_ok">Ok!</string> <string name="enable_location_message">您的设备定位已断开或关闭。请启用它以便捕获地理坐标</string> @@ -235,9 +223,7 @@ <string name="not_now">现在不要</string> <string name="review">审查</string> <string name="complete">完成</string> - <string name="default_table_header_label">值</string> <string name="discard_changes">忽略修改</string> - <string name="default_empty_dataset_section_label">数据</string> <string name="title_network_connection_unavailable">网络连接不可用</string> <string name="msg_network_connection_maps">需要互联网连接才能使用地图。</string> @@ -267,7 +253,6 @@ <string name="file_downloaded">文件下载成功</string> - <!--Enrollment labels--> <plurals name="enrollment"> <item quantity="other">注册人数</item> @@ -276,7 +261,6 @@ <string name="enrollment_data_section_label_V2">%s 数据</string> <string name="enrollment_coordinates_V2">%s 坐标</string> <string name="enrollment_date_V2">%s 日期</string> - <string name="enrollment_status">%s 地位</string> <string name="break_glass_dialog_description_V2">在这个受保护的程序中,您必须提供检查%s 的理由。所有活动都将记录在案。</string> <string name="break_glass_reason_V2">检查原因%s</string> <string name="edition_enrollment_is_no_open_V2">该数据不可编辑,因为%s 已完成或取消</string> @@ -284,14 +268,12 @@ <string name="enrollment_cancelled_V2">%s 已取消</string> <string name="new_enrollment">新%s</string> <string name="enrolling_ou">加入:</string> - <string name="program_selector_V2">计划%s</string> <string name="more_enrollments">更多注册人数</string> <string name="remove_from">从</string> <string name="refresh_this_record">刷新此记录</string> <string name="view_timeline">查看时间表</string> <string name="group_by_stage">按阶段分组</string> - <!-- Event --> <plurals name="event_label"> <item quantity="other">活动</item> @@ -309,12 +291,9 @@ <string name="event_label_date_in_future_message">%s 的日期不能是未来。请更改。</string> <string name="failed_insert_event_label">插入新%s</string> <string name="week_period_span_default_label">星期%d %s到%s</string> - <string name="group_event_label_by_stage">按阶段划分的组别%s </string> - <string name="show_event_label_timeline">显示%s 时间轴</string> <string name="empty_tei_event_label_add">没有注册%s ,点击 \"+\"可添加新的 。</string> <string name="empty_tei_event_label_no_add">%s 。</string> <string name="enrollment_date_edition_warning_event_label">计划中的%s 不会改期</string> - <string name="enrollment_reopen">重新打开</string> <string name="sync_retry">重试同步</string> <string name="syncing">同步</string> @@ -332,4 +311,8 @@ <string name="database_import_failed">数据库导入失败</string> <string name="invalid_file">无效文件</string> <string name="not_in_totp_2fa_enrollment_mode">未进入 TOTP 2FA 注册模式</string> + + <string name="action_clear_all">全清除</string> + + <string name="enrollment_status">%s 地位</string> </resources> diff --git a/commons/src/main/res/values/attrs.xml b/commons/src/main/res/values/attrs.xml index 33704780956..2f5e07a270d 100644 --- a/commons/src/main/res/values/attrs.xml +++ b/commons/src/main/res/values/attrs.xml @@ -15,7 +15,7 @@ <attr name="selector_button_round_20" format="reference" /> <attr name="selector_button_round_7" format="reference" /> <attr name="selector_button_round_2" format="reference" /> - + <attr name="onToolbarColor" format="color" /> <attr name="image_selector_bg" format="reference" /> <attr name="period_button" format="reference" /> diff --git a/commons/src/main/res/values/strings.xml b/commons/src/main/res/values/strings.xml index 0ff4f103756..9d34e6f518f 100644 --- a/commons/src/main/res/values/strings.xml +++ b/commons/src/main/res/values/strings.xml @@ -10,7 +10,6 @@ <string name="cancel">Cancel</string> <string name="yes">Yes</string> <string name="no">No</string> - <string name="clear_all">clear selection</string> <string name="navigation_list_view">List view</string> <string name="navigation_table_view">Table view</string> <string name="navigation_map_view">Map view</string> @@ -22,7 +21,6 @@ <string name="navigation_notes">Notes</string> <string name="navigation_data_entry">Data entry</string> <string name="navigation_tei_data">Details</string> - <string name="event_overview">Details</string> <string name="select_option">Select option</string> <string name="search">Search</string> <string name="events">events</string> @@ -36,8 +34,6 @@ <string name="filters_disabled">No filters applied</string> <string name="filters_title_period">Period</string> <string name="filters_title_org_unit">Org. Unit</string> - <string name="filters_title_sorting">Sorting</string> - <string name="filters_title_status">Status</string> <string name="filters_title_state">Sync</string> <string name="filters_title_assigned">Assigned to me</string> <string name="filters_title_date">Date</string> @@ -46,11 +42,11 @@ <string name="filters_title_enrollment_status">@string/enrollment_status</string> <string name="filter_follow_up_label">Followed up %s</string> <string name="select_period">Select period type</string> - <string name="daily_period">Daily</string> <string name="weekly">Weekly</string> <string name="bi_weekly">Bi-weekly</string> <string name="weekly_start_wednesday">Weekly starting Wednesday</string> <string name="weekly_start_thursday">Weekly starting Thursday</string> + <string name="weekly_start_friday">Weekly starting Friday</string> <string name="weekly_start_saturday">Weekly starting Saturday</string> <string name="weekly_start_sunday">Weekly starting Sunday</string> <string name="monthly">Monthly</string> @@ -59,21 +55,20 @@ <string name="quarterly_nov">Quarterly Nov</string> <string name="six_monthly">Six-monthly</string> <string name="six_monthly_april">Six-monthly starting April</string> - <string name="six_monthly_july">Six-monthly starting July</string> <string name="six_monthly_nov">Six-monthly starting November</string> <string name="yearly">Yearly</string> + <string name="financial_year_february">Financial year starting February</string> <string name="financial_year_april">Financial year starting April</string> <string name="financial_year_july">Financial year starting July</string> + <string name="financial_year_august">Financial year starting August</string> + <string name="financial_year_september">Financial year starting September</string> <string name="financial_year_october">Financial year starting October</string> <string name="financial_year_november">Financial year starting November</string> - - <!-- State --> <string name="state_synced">Sync</string> <string name="state_to_post">To send</string> <string name="state_to_update">To update</string> - <string name="state_to_delete">To delete</string> <string name="state_error">Error</string> <string name="state_warning">Warning</string> <string name="state_uploading">Uploading</string> @@ -167,7 +162,6 @@ <!--SDK error codes--> <string name="login_error_null_pass">Password is missing. Please enter password.</string> <string name="login_error_null_username">Username is missing. Please enter username.</string> - <string name="login_error_dhis_version">This server is running a dhis version different than 2.29. Update your server version or use the testing environment to proceed.</string> <string name="login_error_dhis_version_v2">This server is running a DHIS2 version different than %s. Update your server version or contact your admin.</string> <string name="login_error_unsuccessful_response">Something went wrong. Please check that server URL, username and password are correct and try again.</string> <string name="login_error_error_response">Sorry! Something failed on the server side.</string> @@ -227,9 +221,7 @@ <string name="error_invalid_characters">There are invalid characters in the query. Please ask the administrator to verify the server configuration (relaxedQueryChars,...).</string> <string name="error_server_unavailable">The server is currently unavailable. Try again later.</string> <string name="error_no_internet_connection">You are offline. Connect to the internet and try again.</string> - <string name="unsupported_field_description">This field is not available for mobile capture</string> <string name="add_image">Add Image</string> - <string name="add_signature">Add signature</string> <string name="add_file">Add file</string> <string name="action_ok">Ok</string> <string name="enable_location_message">Your device location is disconnected. Please enable it to capture coordinates</string> @@ -237,9 +229,7 @@ <string name="not_now">Not now</string> <string name="review">Review</string> <string name="complete">Complete</string> - <string name="default_table_header_label">Value</string> <string name="discard_changes">Discard changes</string> - <string name="default_empty_dataset_section_label">Data</string> <string name="title_network_connection_unavailable">Network connection unavailable</string> <string name="msg_network_connection_maps">An internet connection is required in order to use maps.</string> @@ -275,7 +265,6 @@ <string name="file_downloaded">File downloaded successfully</string> - <!--Enrollment labels--> <plurals name="enrollment"> <item quantity="one">enrollment</item> @@ -285,7 +274,6 @@ <string name="enrollment_data_section_label_V2">%s data</string> <string name="enrollment_coordinates_V2">%s coordinates</string> <string name="enrollment_date_V2">%s date</string> - <string name="enrollment_status">%s status</string> <string name="break_glass_dialog_description_V2">You must provide a reason to check for %s in this protected program. All activity will be logged.</string> <string name="break_glass_reason_V2">Reason to check for %s</string> <string name="edition_enrollment_is_no_open_V2">This data is not editable because the %s is completed or cancelled</string> @@ -293,14 +281,12 @@ <string name="enrollment_cancelled_V2">%s cancelled</string> <string name="new_enrollment">New %s</string> <string name="enrolling_ou">Enrolled in:</string> - <string name="program_selector_V2">Program %s</string> <string name="more_enrollments">More enrollments</string> <string name="remove_from">Remove from</string> <string name="refresh_this_record">Refresh this record</string> <string name="view_timeline">View timeline</string> <string name="group_by_stage">Group by stage</string> - <!-- Event --> <plurals name="event_label"> <item quantity="one">event</item> @@ -321,12 +307,9 @@ <string name="period_span_default_label" translatable="false">%s - %s</string> <string name="week_period_span_default_label">Week %d %s to %s</string> <string name="biweek_period_span_default_label" translatable="false">%d %s - %d %s</string> - <string name="group_event_label_by_stage">Group %s by stage</string> - <string name="show_event_label_timeline">Show %s timeline</string> <string name="empty_tei_event_label_add">There are no %s registered, click \"+\" to add a new one.</string> <string name="empty_tei_event_label_no_add">There are no %s registered.</string> <string name="enrollment_date_edition_warning_event_label">There are planned %s that won\'t be re-scheduled</string> - <string name="enrollment_reopen">re-open</string> <string name="sync_retry">Retry sync</string> <string name="syncing">Synchronizing...</string> @@ -344,4 +327,8 @@ <string name="database_import_failed">Database import failed</string> <string name="invalid_file">Invalid file</string> <string name="not_in_totp_2fa_enrollment_mode">Not in TOTP 2FA enrollment mode</string> + + <string name="action_clear_all">Clear all</string> + + <string name="enrollment_status">%s status</string> </resources> diff --git a/commons/src/main/res/values/styles.xml b/commons/src/main/res/values/styles.xml index 459deafba55..14aea64adc7 100644 --- a/commons/src/main/res/values/styles.xml +++ b/commons/src/main/res/values/styles.xml @@ -69,6 +69,14 @@ <item name="colorControlHighlight">?colorPrimary</item> </style> + <style name="CustomBottomSheetDialogTheme" parent="Theme.Design.Light.BottomSheetDialog"> + <item name="bottomSheetStyle">@style/CustomBottomSheetStyle</item> + </style> + + <style name="CustomBottomSheetStyle" parent="Widget.Design.BottomSheet.Modal"> + <item name="android:background">@android:color/transparent</item> + </style> + <style name="filterPeriodRadioButton" parent="Widget.AppCompat.CompoundButton.RadioButton"> <item name="android:textColor">@color/white</item> <item name="android:textSize">11sp</item> diff --git a/commons/src/main/res/values/themes.xml b/commons/src/main/res/values/themes.xml index e1a45162b6b..e0284d4cd05 100644 --- a/commons/src/main/res/values/themes.xml +++ b/commons/src/main/res/values/themes.xml @@ -43,6 +43,8 @@ <item name="chipGroupStyle">@style/Widget.MaterialComponents.ChipGroup</item> <item name="chipStyle">@style/Widget.MaterialComponents.Chip.Action</item> <item name="android:textDirection">locale</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="DhisBottomNavigationView" parent="Widget.MaterialComponents.BottomNavigationView"> @@ -88,6 +90,8 @@ <item name="period_button">@drawable/period_button_red</item> <item name="period_time_button">@drawable/period_time_button_red</item> <item name="toast_bg">@drawable/toast_bg_red</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="GreenTheme" parent="AppTheme"> @@ -108,6 +112,8 @@ <item name="period_button">@drawable/period_button_green</item> <item name="period_time_button">@drawable/period_time_button_green</item> <item name="toast_bg">@drawable/toast_bg_green</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="OrangeTheme" parent="AppTheme"> @@ -141,6 +147,8 @@ <item name="period_button">@drawable/period_button_orange</item> <item name="period_time_button">@drawable/period_time_button_orange</item> <item name="toast_bg">@drawable/toast_bg_orange</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <!--endregion--><!--region PALETTES--> @@ -154,6 +162,8 @@ <item name="colorAccent">@color/colorAccent</item> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_e57" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -164,6 +174,8 @@ <item name="colorAccent">@color/colorAccent</item> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_d32" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -174,6 +186,8 @@ <item name="colorAccent">@color/colorAccent</item> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_f06" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -184,6 +198,8 @@ <item name="colorAccent">@color/colorAccent</item> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_c21" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -194,6 +210,8 @@ <item name="colorAccent">@color/colorAccent</item> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_880" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -204,6 +222,8 @@ <item name="colorAccent">@color/colorAccent</item> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_f50" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -214,6 +234,8 @@ <item name="colorAccent">@color/colorAccent</item> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_e1b" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -226,6 +248,8 @@ <item name="colorAccent">@color/colorAccent</item> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_ba6" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -236,6 +260,8 @@ <item name="colorAccent">@color/colorAccent</item> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_8e2" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -246,6 +272,8 @@ <item name="colorAccent">@color/colorAccent</item> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_aa0" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -256,6 +284,8 @@ <item name="colorAccent">@color/colorAccent</item> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_7e5" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -266,6 +296,8 @@ <item name="colorAccent">@color/colorAccent</item> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_452" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -276,6 +308,8 @@ <item name="colorAccent">@color/colorAccent</item> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_7c4" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -286,6 +320,8 @@ <item name="colorAccent">@color/colorAccent</item> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_620" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -296,6 +332,8 @@ <item name="colorAccent">@color/colorAccent</item> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_c5c" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -308,6 +346,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_798" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -318,6 +358,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_394" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -328,6 +370,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_304" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -338,6 +382,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_e3f" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -350,6 +396,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_64b" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -360,6 +408,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_197" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -370,6 +420,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_028" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -380,6 +432,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_40c" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -391,6 +445,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_00b" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -401,6 +457,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_80d" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -413,6 +471,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_00a" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -423,6 +483,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_008" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -433,6 +495,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_006" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -443,6 +507,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_e0f" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -455,6 +521,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_80c" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -466,6 +534,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_0069" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -476,6 +546,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_64f" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -488,6 +560,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_c8e" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -500,6 +574,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_66b" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -510,6 +586,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_2e7" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -520,6 +598,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_60a" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -530,6 +610,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_00e" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -540,6 +622,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_aed" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -551,6 +635,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_689" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -561,6 +647,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_336" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -571,6 +659,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_76f" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -583,6 +673,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_64d" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -594,6 +686,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_cdd" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -605,6 +699,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_9e9" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -615,6 +711,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_827" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -625,6 +723,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_fff" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -637,6 +737,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_fbc" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -648,6 +750,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_f57" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -658,6 +762,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_ffff" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -670,6 +776,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_ffc" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -681,6 +789,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_ffcc" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -693,6 +803,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_ffa" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -704,6 +816,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_bca" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -714,6 +828,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_8d6" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -724,6 +840,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_4e3" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -734,6 +852,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_faf" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -746,6 +866,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_bdb" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -757,6 +879,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_757" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -767,6 +891,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_424" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -777,6 +903,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_cfd" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -787,6 +915,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_b0b" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -797,6 +927,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/black_de0</item> + <item name="android:windowLightStatusBar">true</item> </style> <style name="colorPrimary_607" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -807,6 +939,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <style name="colorPrimary_374" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> @@ -817,6 +951,8 @@ <item name="colorAccent">@color/colorAccent</item> <!--TODO: CHECK COLOR ACCENT--> <item name="android:datePickerDialogTheme">@style/DatePickerTheme</item><item name="android:windowContentTransitions">true</item> <item name="android:windowBackground">@color/white</item> + <item name="onToolbarColor">@color/white</item> + <item name="android:windowLightStatusBar">false</item> </style> <!--endregion--> </resources> \ No newline at end of file diff --git a/commons/src/test/kotlin/org/dhis2/commons/simprints/repository/SimprintsD2RepositoryTest.kt b/commons/src/test/kotlin/org/dhis2/commons/simprints/repository/SimprintsD2RepositoryTest.kt index 63e32d5dc14..3ffbccd74d9 100644 --- a/commons/src/test/kotlin/org/dhis2/commons/simprints/repository/SimprintsD2RepositoryTest.kt +++ b/commons/src/test/kotlin/org/dhis2/commons/simprints/repository/SimprintsD2RepositoryTest.kt @@ -42,6 +42,7 @@ class SimprintsD2RepositoryTest { .trackedEntityInstance("tei-uid") .program("program-uid") .organisationUnit("org-unit-uid") + .attributeOptionCombo("attribute-option-combo-uid") .build() val result = repository.getEnrollmentContext("enrollment-uid") @@ -85,6 +86,7 @@ class SimprintsD2RepositoryTest { .uid("enrollment-uid") .program("program-uid") .organisationUnit("org-unit-uid") + .attributeOptionCombo("attribute-option-combo-uid") .build() val result = repository.getEnrollmentContext("enrollment-uid") diff --git a/commonskmm/build.gradle.kts b/commonskmm/build.gradle.kts index 110b39f9280..be788975ab8 100644 --- a/commonskmm/build.gradle.kts +++ b/commonskmm/build.gradle.kts @@ -1,12 +1,9 @@ -@file:OptIn(ExperimentalKotlinGradlePluginApi::class) - -import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { - kotlin("multiplatform") + alias(libs.plugins.kotlin.multiplatform) alias(libs.plugins.compose) - id("com.android.library") + alias(libs.plugins.android.kotlin.multiplatform.library) alias(libs.plugins.kotlin.compose.compiler) alias(libs.plugins.kotlin.atomicfu) alias(libs.plugins.kotlin.serialization) @@ -15,30 +12,30 @@ plugins { kotlin { compilerOptions { freeCompilerArgs.add("-Xcontext-parameters") + freeCompilerArgs.add("-Xexpect-actual-classes") } - androidTarget { - compilations.all { - compileTaskProvider.configure { - compilerOptions { - jvmTarget.set(JvmTarget.JVM_17) - } - } + + androidLibrary { + namespace = "org.dhis2.mobile.commons" + compileSdk = libs.versions.sdk.get().toInt() + minSdk = libs.versions.minSdk.get().toInt() + compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } + androidResources { enable = true } + withHostTestBuilder {}.configure {} + withDeviceTestBuilder {}.configure { + instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } } - jvm("desktop") - @OptIn(ExperimentalKotlinGradlePluginApi::class) - compilerOptions { - freeCompilerArgs.add("-Xexpect-actual-classes") - } + jvm("desktop") sourceSets { commonMain.dependencies { - implementation(compose.runtime) - implementation(compose.foundation) - implementation(compose.ui) - implementation(compose.material3) - implementation(compose.components.resources) + implementation(libs.compose.runtime) + implementation(libs.compose.foundation) + implementation(libs.compose.ui) + implementation(libs.compose.material3) + implementation(libs.compose.components.resources) implementation(libs.compose.material3.window) implementation(libs.lifecycle.runtime.compose) @@ -77,13 +74,17 @@ kotlin { implementation(libs.androidx.browser) // Sentry api(libs.analytics.sentry) + implementation(libs.androidx.work) + compileOnly(libs.androidx.compose.preview) + compileOnly(libs.androidx.compose.uitooling) } - androidUnitTest.dependencies { - + getByName("androidHostTest") { + dependencies { + } } - androidInstrumentedTest.dependencies { + getByName("androidDeviceTest") { dependencies { implementation(libs.test.junit.ext) implementation(libs.test.espresso) @@ -93,7 +94,7 @@ kotlin { val desktopMain by getting { dependencies { - implementation(compose.desktop.common) + implementation(libs.compose.desktop.common) } } } @@ -101,36 +102,11 @@ kotlin { } compose.resources { - publicResClass = false + publicResClass = true packageOfResClass = "org.dhis2.mobile.commons.resources" generateResClass = always } -android { - namespace = "org.dhis2.mobile.commons" - compileSdk = libs.versions.sdk.get().toInt() - defaultConfig { - minSdk = libs.versions.minSdk.get().toInt() - val bitriseSentryDSN = System.getenv("SENTRY_DSN") ?: "" - buildConfigField("String", "SENTRY_DSN", "\"${bitriseSentryDSN}\"") - } - buildFeatures { - buildConfig = true - } - compileOptions { - isCoreLibraryDesugaringEnabled = true - - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - - dependencies { - coreLibraryDesugaring(libs.desugar) - } -} - dependencies { - debugImplementation(libs.androidx.compose.preview) - debugImplementation(libs.androidx.compose.uitooling) + coreLibraryDesugaring(libs.desugar) } - diff --git a/commonskmm/src/androidUnitTest/kotlin/org/dhis2/commons/validation/validators/FieldMaskValidatorTest.kt b/commonskmm/src/androidHostTest/kotlin/org/dhis2/commons/validation/validators/FieldMaskValidatorTest.kt similarity index 100% rename from commonskmm/src/androidUnitTest/kotlin/org/dhis2/commons/validation/validators/FieldMaskValidatorTest.kt rename to commonskmm/src/androidHostTest/kotlin/org/dhis2/commons/validation/validators/FieldMaskValidatorTest.kt diff --git a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/auth/OpenIdControllerImpl.kt b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/auth/OpenIdControllerImpl.kt deleted file mode 100644 index 7fb9d63220c..00000000000 --- a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/auth/OpenIdControllerImpl.kt +++ /dev/null @@ -1,53 +0,0 @@ -package org.dhis2.mobile.commons.auth - -import android.app.Activity.RESULT_OK -import androidx.activity.result.contract.ActivityResultContracts -import androidx.fragment.app.FragmentActivity -import androidx.lifecycle.lifecycleScope -import kotlinx.coroutines.launch -import org.dhis2.mobile.commons.resources.Res -import org.dhis2.mobile.commons.resources.openid_login_cancelled -import org.hisp.dhis.android.core.user.openid.IntentWithRequestCode -import org.jetbrains.compose.resources.getString - -class OpenIdControllerImpl( - context: FragmentActivity, -) : OpenIdController { - private var openIDRequestCode = -1 - private lateinit var onResultCallback: (suspend (Result<Any>) -> Unit) - - private val openIdLauncher = - context.activityResultRegistry.register( - key = "OPEN_ID_LAUNCHER", - contract = ActivityResultContracts.StartActivityForResult(), - ) { result -> - if (result.resultCode == RESULT_OK) { - result.data?.let { - val intentResult = - IntentWithRequestCode( - intent = it, - requestCode = openIDRequestCode, - ) - context.lifecycleScope.launch { - onResultCallback(Result.success(intentResult)) - } - } - } else { - context.lifecycleScope.launch { - onResultCallback( - Result.failure<IntentWithRequestCode>(Exception(getString(Res.string.openid_login_cancelled))), - ) - } - } - } - - override fun handleIntent( - intent: Any, - onResult: suspend (Result<Any>) -> Unit, - ) { - if (intent !is IntentWithRequestCode) return - onResultCallback = onResult - openIDRequestCode = intent.requestCode - openIdLauncher.launch(intent.intent) - } -} diff --git a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/customintents/CustomIntentRepositoryImpl.kt b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/customintents/CustomIntentRepositoryImpl.kt index daed91df555..91e426a87b7 100644 --- a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/customintents/CustomIntentRepositoryImpl.kt +++ b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/customintents/CustomIntentRepositoryImpl.kt @@ -108,8 +108,9 @@ class CustomIntentRepositoryImpl( if (customIntent.packageName() != simprintsIdentifyAction) { return this } - val orgUnitName = currentUserOrgUnitName() - ?: return this + val orgUnitName = + currentUserOrgUnitName() + ?: return this return this + (simprintsModuleIdKey to orgUnitName) } diff --git a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/di/CommonsModule.android.kt b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/di/CommonsModule.android.kt index 5f84b93b638..fecd0e199fa 100644 --- a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/di/CommonsModule.android.kt +++ b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/di/CommonsModule.android.kt @@ -14,6 +14,8 @@ import org.dhis2.mobile.commons.files.FileHandler import org.dhis2.mobile.commons.files.FileHandlerImpl import org.dhis2.mobile.commons.network.NetworkStatusProvider import org.dhis2.mobile.commons.network.NetworkStatusProviderImpl +import org.dhis2.mobile.commons.notifications.NotificationManager +import org.dhis2.mobile.commons.notifications.NotificationManagerImpl import org.dhis2.mobile.commons.providers.PreferenceProvider import org.dhis2.mobile.commons.providers.PreferenceProviderImpl import org.dhis2.mobile.commons.reporting.CrashReportController @@ -39,7 +41,7 @@ actual val commonsModule: Module FileHandlerImpl() } single<CrashReportController> { - CrashReportControllerImpl(get()) + CrashReportControllerImpl(get(), getProperty("sentryDsn", "")) } single<NetworkStatusProvider> { @@ -50,6 +52,10 @@ actual val commonsModule: Module PreferenceProviderImpl(get()) } + single<NotificationManager> { + NotificationManagerImpl(get()) + } + factory<D2ErrorMessageProvider> { D2ErrorMessageProviderImpl() } diff --git a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/error/DomainErrorMapper.kt b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/error/DomainErrorMapper.kt index 2a13641ed6c..3fbe1042a92 100644 --- a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/error/DomainErrorMapper.kt +++ b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/error/DomainErrorMapper.kt @@ -80,6 +80,7 @@ class DomainErrorMapper( D2ErrorCode.NO_DHIS2_SERVER, D2ErrorCode.SERVER_URL_NULL, D2ErrorCode.SERVER_URL_MALFORMED, + D2ErrorCode.INVALID_CONFIGURATION, D2ErrorCode.INVALID_DHIS_VERSION, -> DomainError.ConfigurationError(errorMessage) diff --git a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/network/NetworkStatusProviderImpl.kt b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/network/NetworkStatusProviderImpl.kt index ba9ed9bb433..e6d7b133e61 100644 --- a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/network/NetworkStatusProviderImpl.kt +++ b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/network/NetworkStatusProviderImpl.kt @@ -5,7 +5,6 @@ import android.net.ConnectivityManager import android.net.Network import android.net.NetworkCapabilities import android.net.NetworkRequest -import android.os.Build import androidx.annotation.RequiresPermission import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow @@ -24,11 +23,8 @@ class NetworkStatusProviderImpl( NetworkRequest .Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - .also { builder -> - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - builder.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) - } - }.build() + .addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) + .build() private val availableNetworks = mutableSetOf<Network>() @@ -46,7 +42,12 @@ class NetworkStatusProviderImpl( ) { super.onCapabilitiesChanged(network, networkCapabilities) val networkState = networkCapabilities.asNetworkState() - trySend(networkState) + if (networkState) { + availableNetworks.add(network) + } else { + availableNetworks.remove(network) + } + trySend(availableNetworks.isNotEmpty()) } override fun onUnavailable() { @@ -59,13 +60,16 @@ class NetworkStatusProviderImpl( val networkCapabilities = manager.getNetworkCapabilities(network) val networkState = networkCapabilities?.asNetworkState() ?: false - trySend(networkState) + if (networkState) { + availableNetworks.add(network) + } + trySend(availableNetworks.isNotEmpty()) } override fun onLost(network: Network) { super.onLost(network) availableNetworks.remove(network) - trySend(false) + trySend(availableNetworks.isNotEmpty()) } } @@ -77,14 +81,11 @@ class NetworkStatusProviderImpl( @RequiresPermission("android.permission.ACCESS_NETWORK_STATE") private fun ConnectivityManager.getCurrentNetworkState(): Boolean { - @Suppress("DEPRECATION") - return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { - activeNetworkInfo?.isConnected == true - } else { - val networkCapabilities = getNetworkCapabilities(activeNetwork) - networkCapabilities?.asNetworkState() ?: false - } + val networkCapabilities = getNetworkCapabilities(activeNetwork) + return networkCapabilities?.asNetworkState() ?: false } - private fun NetworkCapabilities.asNetworkState(): Boolean = hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + private fun NetworkCapabilities.asNetworkState(): Boolean = + hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && + hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) } diff --git a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationManagerImpl.kt b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationManagerImpl.kt new file mode 100644 index 00000000000..483d1a4b107 --- /dev/null +++ b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationManagerImpl.kt @@ -0,0 +1,215 @@ +package org.dhis2.mobile.commons.notifications + +import android.Manifest +import android.app.NotificationChannel +import android.content.Context +import android.content.pm.PackageManager +import android.content.pm.ServiceInfo +import android.os.Build +import androidx.annotation.RequiresApi +import androidx.core.app.NotificationCompat +import androidx.core.app.NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE +import androidx.work.ForegroundInfo + +private const val SYNC_METADATA_NOTIFICATION_ID = 26061987 +private const val SYNC_METADATA_CHANNEL_ID = "sync_metadata_notification" +private const val SYNC_METADATA_CHANNEL_NAME = "sync_metadata" + +private const val SYNC_DATA_NOTIFICATION_ID = 80071986 +private const val SYNC_DATA_CHANNEL_ID = "sync_data_notification" +private const val SYNC_DATA_CHANNEL_NAME = "sync_data" + +private const val SYNC_SETTINGS_NOTIFICATION_ID = 28042023 +private const val SYNC_SETTINGS_CHANNEL_ID = "sync_settings_notification" +private const val SYNC_SETTINGS_CHANNEL_NAME = "sync_settings" + +class NotificationManagerImpl( + private val context: Context, +) : NotificationManager { + private val notificationManager = + context.getSystemService(Context.NOTIFICATION_SERVICE) as android.app.NotificationManager + + override fun getDataSyncNotification( + smallIcon: Int, + contentTitle: String, + contentText: String, + progress: Int, + ) = WorkerNotificationInfo( + createForegroundInfo( + notificationId = SYNC_DATA_NOTIFICATION_ID, + channelId = SYNC_DATA_CHANNEL_ID, + channelName = SYNC_DATA_CHANNEL_NAME, + smallIcon = smallIcon, + contentTitle = contentTitle, + contentText = contentText, + progress = progress, + ), + ) + + override fun displayDataSyncNotification( + smallIcon: Int, + contentTitle: String, + contentText: String, + progress: Int, + ) { + val foregroundInfo = + createForegroundInfo( + notificationId = SYNC_DATA_NOTIFICATION_ID, + channelId = SYNC_DATA_CHANNEL_ID, + channelName = SYNC_DATA_CHANNEL_NAME, + smallIcon = smallIcon, + contentTitle = contentTitle, + contentText = contentText, + progress = progress, + ) + + notify(foregroundInfo) + } + + override fun getMetadataSyncNotification( + smallIcon: Int, + contentTitle: String, + contentText: String, + progress: Int, + ) = WorkerNotificationInfo( + createForegroundInfo( + notificationId = SYNC_METADATA_NOTIFICATION_ID, + channelId = SYNC_METADATA_CHANNEL_ID, + channelName = SYNC_METADATA_CHANNEL_NAME, + smallIcon = smallIcon, + contentTitle = contentTitle, + contentText = contentText, + progress = progress, + ), + ) + + override fun displayMetadataSyncNotification( + smallIcon: Int, + contentTitle: String, + contentText: String, + progress: Int, + ) { + val foregroundInfo = + createForegroundInfo( + notificationId = SYNC_METADATA_NOTIFICATION_ID, + channelId = SYNC_METADATA_CHANNEL_ID, + channelName = SYNC_METADATA_CHANNEL_NAME, + smallIcon = smallIcon, + contentTitle = contentTitle, + contentText = contentText, + progress = progress, + ) + + notify(foregroundInfo) + } + + override fun getSyncSettingsNotificationModel( + smallIcon: Int, + contentTitle: String, + contentText: String, + ) = WorkerNotificationInfo( + createForegroundInfo( + notificationId = SYNC_SETTINGS_NOTIFICATION_ID, + channelId = SYNC_SETTINGS_CHANNEL_ID, + channelName = SYNC_SETTINGS_CHANNEL_NAME, + smallIcon = smallIcon, + contentTitle = contentTitle, + contentText = contentText, + progress = -1, + ), + ) + + override fun displaySyncSettingsNotification( + smallIcon: Int, + contentTitle: String, + contentText: String, + ) { + val foregroundInfo = + createForegroundInfo( + notificationId = SYNC_SETTINGS_NOTIFICATION_ID, + channelId = SYNC_SETTINGS_CHANNEL_ID, + channelName = SYNC_SETTINGS_CHANNEL_NAME, + smallIcon = smallIcon, + contentTitle = contentTitle, + contentText = contentText, + progress = -1, + ) + notify(foregroundInfo) + } + + override fun cancelMetadataSyncNotification() { + notificationManager.cancel(SYNC_METADATA_NOTIFICATION_ID) + } + + override fun cancelSyncSettingsNotification() { + notificationManager.cancel(SYNC_SETTINGS_NOTIFICATION_ID) + } + + override fun cancelDataSyncNotification() { + notificationManager.cancel(SYNC_DATA_NOTIFICATION_ID) + } + + private fun createForegroundInfo( + notificationId: Int, + channelId: String, + channelName: String, + smallIcon: Int, + contentTitle: String, + contentText: String, + progress: Int = 0, + ): ForegroundInfo { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + createChannel(channelId, channelName) + } + val notification = + NotificationCompat + .Builder(context, channelId) + .setSmallIcon(smallIcon) + .setContentTitle(contentTitle) + .setContentText(contentText) + .setOngoing(true) + .setOnlyAlertOnce(true) + .setForegroundServiceBehavior(FOREGROUND_SERVICE_IMMEDIATE) + .setAutoCancel(false) + .setProgress(100, progress, progress == -1) + .build() + + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + ForegroundInfo( + notificationId, + notification, + ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC, + ) + } else { + ForegroundInfo( + notificationId, + notification, + ) + } + } + + private fun notify(foregroundInfo: ForegroundInfo) { + if ( + Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && + context.checkSelfPermission( + Manifest.permission.POST_NOTIFICATIONS, + ) == PackageManager.PERMISSION_GRANTED + ) { + notificationManager.notify(foregroundInfo.notificationId, foregroundInfo.notification) + } + } + + @RequiresApi(Build.VERSION_CODES.O) + private fun createChannel( + channelId: String, + channelName: String, + ) { + notificationManager.createNotificationChannel( + NotificationChannel( + channelId, + channelName, + android.app.NotificationManager.IMPORTANCE_HIGH, + ), + ) + } +} diff --git a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/notifications/WorkerNotificationInfo.kt b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/notifications/WorkerNotificationInfo.kt new file mode 100644 index 00000000000..e3e00856e49 --- /dev/null +++ b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/notifications/WorkerNotificationInfo.kt @@ -0,0 +1,7 @@ +package org.dhis2.mobile.commons.notifications + +import androidx.work.ForegroundInfo + +data class WorkerNotificationInfo( + val foregroundInfo: ForegroundInfo, +) : NotificationModel diff --git a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/reporting/CrashReportControllerImpl.kt b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/reporting/CrashReportControllerImpl.kt index ac505a6d64b..1979a81096f 100644 --- a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/reporting/CrashReportControllerImpl.kt +++ b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/reporting/CrashReportControllerImpl.kt @@ -1,13 +1,13 @@ package org.dhis2.mobile.commons.reporting import android.content.Context +import android.content.pm.ApplicationInfo import io.sentry.Breadcrumb import io.sentry.Sentry import io.sentry.SentryLevel import io.sentry.SentryOptions.BeforeSendCallback import io.sentry.android.core.SentryAndroid import io.sentry.android.core.SentryAndroidOptions -import org.dhis2.mobile.commons.BuildConfig import org.hisp.dhis.android.core.D2Manager import timber.log.Timber @@ -15,20 +15,27 @@ const val DATA_STORE_CRASH_PERMISSION_KEY = "analytics_permission" class CrashReportControllerImpl( private val context: Context, + private val sentryDsn: String, + private val isDebug: Boolean = context.applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE != 0, ) : CrashReportController { override fun init() { + val resolvedDsn = resolveSentryDsn() + if (resolvedDsn.isBlank()) { + Timber.w("Sentry DSN is empty. Skipping Sentry initialization.") + return + } SentryAndroid.init(context) { options: SentryAndroidOptions? -> - options!!.setDsn(BuildConfig.SENTRY_DSN) + options!!.setDsn(resolvedDsn) options.isAnrReportInDebug = true options.beforeSend = BeforeSendCallback { event, _ -> if (SentryLevel.DEBUG == event.level) null else event } - options.environment = if (BuildConfig.DEBUG) "debug" else "production" - options.isDebug = BuildConfig.DEBUG + options.environment = if (isDebug) "debug" else "production" + options.isDebug = isDebug options.isAttachViewHierarchy = true - options.setTracesSampleRate(if (BuildConfig.DEBUG) 1.0 else 0.1) - options.setProfilesSampleRate(if (BuildConfig.DEBUG) 1.0 else 0.1) + options.setTracesSampleRate(if (isDebug) 1.0 else 0.1) + options.setProfilesSampleRate(if (isDebug) 1.0 else 0.1) } } @@ -97,4 +104,23 @@ class CrashReportControllerImpl( Timber.d("Tracking is disabled") } } + + private fun resolveSentryDsn(): String { + if (sentryDsn.isNotBlank()) { + return sentryDsn + } + + return try { + val buildConfigClass = Class.forName("${context.packageName}.BuildConfig") + (buildConfigClass.getField("SENTRY_DSN")[null] as? String).orEmpty() + } catch (_: ClassNotFoundException) { + "" + } catch (_: NoSuchFieldException) { + "" + } catch (_: IllegalAccessException) { + "" + } catch (_: SecurityException) { + "" + } + } } diff --git a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/resources/D2ErrorMessageProviderImpl.kt b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/resources/D2ErrorMessageProviderImpl.kt index ec2d3bed3eb..47d10f04c7a 100644 --- a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/resources/D2ErrorMessageProviderImpl.kt +++ b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/resources/D2ErrorMessageProviderImpl.kt @@ -51,8 +51,13 @@ class D2ErrorMessageProviderImpl : D2ErrorMessageProvider { D2ErrorCode.BAD_CREDENTIALS -> getString(Res.string.login_error_bad_credentials) - D2ErrorCode.UNKNOWN_HOST -> - getString(Res.string.login_error_unknown_host) + D2ErrorCode.UNKNOWN_HOST -> { + if (isNetworkAvailable) { + getString(Res.string.login_error_unknown_host) + } else { + getString(Res.string.error_no_internet_connection) + } + } D2ErrorCode.UNEXPECTED -> getString(Res.string.error_unexpected) @@ -203,6 +208,8 @@ class D2ErrorMessageProviderImpl : D2ErrorMessageProvider { D2ErrorCode.ORGUNIT_NOT_IN_SEARCH_SCOPE -> getString(Res.string.error_org_unit_scope) + D2ErrorCode.INVALID_CONFIGURATION -> + getString(Res.string.invalid_configuration) D2ErrorCode.INVALID_CHARACTERS -> getString(Res.string.error_invalid_characters) diff --git a/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/resources/Resources.android.kt b/commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/resources/DrawableResourcesProvider.android.kt similarity index 100% rename from commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/resources/Resources.android.kt rename to commonskmm/src/androidMain/kotlin/org/dhis2/mobile/commons/resources/DrawableResourcesProvider.android.kt diff --git a/commonskmm/src/commonMain/composeResources/values-ar-rEG/strings.xml b/commonskmm/src/commonMain/composeResources/values-ar-rEG/strings.xml index ccf89c85128..d7e0718e1c0 100644 --- a/commonskmm/src/commonMain/composeResources/values-ar-rEG/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-ar-rEG/strings.xml @@ -7,8 +7,5 @@ <string name="input_action_cancel">إلغاء</string> <string name="no_results_found">لم يتم العثور على نتائج</string> <string name="search_to_find_more">ابحث للعثور على المزيد</string> - <!--*******************-> - END OF D2 Error Messages - **********************--> - -</resources> \ No newline at end of file + <string name="cancel">إلغاء</string> + </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-ar-rIQ/strings.xml b/commonskmm/src/commonMain/composeResources/values-ar-rIQ/strings.xml index 8e50096d019..7e901c6ffbb 100644 --- a/commonskmm/src/commonMain/composeResources/values-ar-rIQ/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-ar-rIQ/strings.xml @@ -1,21 +1,13 @@ <?xml version="1.0" encoding="utf-8"?> <resources> <string name="error">خطأ</string> - <string name="date">التاريخ</string> - <string name="hint_year">السنوات</string> - <string name="hint_month">الأشهر</string> - <string name="hint_day">‏‏الأيام</string> <string name="due_date">تاريخ الاستحقاق</string> <string name="complete">مكتمل</string> - <string name="save_anyway">حفظ على اية حال</string> <string name="share">مشاركة</string> <string name="action_close">إغلاق</string> <string name="incident_date">تاريخ الواقعة</string> <string name="download">تنزيل</string> <string name="input_action_accept">قبول</string> <string name="input_action_cancel">إلغاء</string> - <!--*******************-> - END OF D2 Error Messages - **********************--> - -</resources> \ No newline at end of file + <string name="cancel">إلغاء</string> + </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-ar/strings.xml b/commonskmm/src/commonMain/composeResources/values-ar/strings.xml index 76a47639a73..ac890848627 100644 --- a/commonskmm/src/commonMain/composeResources/values-ar/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-ar/strings.xml @@ -22,16 +22,9 @@ <string name="missing_warning_fields_completed_events">لديك بعض الرسائل التحذيرية.</string> <string name="missing_warning_fields_events">لديك بعض الرسائل التحذيرية.\nهل تريد وضع علامة \"مكتمل\" على هذا النموذج؟</string> <string name="required">مطلوب</string> - <string name="date">التاريخ</string> - <string name="hint_year">السنوات</string> - <string name="hint_month">الأشهر</string> - <string name="hint_day">‏‏الأيام</string> - <string name="wrong_date_format">لا يمكن تحليل %s كتاريخ</string> <string name="polygon">مضلع</string> <string name="latitude">خط العرض</string> <string name="longitude">خط الطول</string> - <string name="coordinates_error">قيم الإحداثيات غير صالحة</string> - <string name="polygon_captured">تم التقاط المضلع</string> <string name="enter_value">أدخل قيمة</string> <string name="enter_url">أدخل رابط url</string> <string name="enter_email">أدخل بريداً إلكترونياً</string> @@ -46,9 +39,6 @@ <string name="enter_long_text">أدخل نصًا طويلاً</string> <string name="enter_text">أدخل نصًا</string> <string name="due_date">تاريخ الاستحقاق</string> - <string name="mandatory_field">حقل الزامي</string> - <string name="form_latitude_prefix">خط العرض:</string> - <string name="form_longitude_prefix">خط الطول:</string> <string name="not_saved">لم يتم حفظه</string> <string name="review">المراجعة</string> <string name="complete">مكتمل</string> @@ -58,19 +48,13 @@ <string name="missing_error_fields_events">بعض الحقول بها أخطاء ولم يتم حفظها. \nهل تريد مراجعة النموذج؟</string> <string name="review_message">بعض الحقول تحتاج إلى انتباهك.\nهل تريد مراجعة النموذج؟</string> <string name="not_now">ليس الان</string> - <string name="save_anyway">حفظ على اية حال</string> <string name="keep_editing">استمر في التعديل</string> <string name="event_can_be_completed">هل تريد وضع علامة على هذا النموذج كمكتمل؟</string> <string name="discard_go_back">إذا قمت بالخروج الآن ، فسيتم تجاهل جميع المعلومات الموجودة في النموذج.</string> <string name="field_errors_not_saved_discard">تحتوي بعض الحقول على أخطاء ولا يتم حفظها. \nإذا قمت بالخروج الآن سيتم تجاهل التغييرات.</string> - <string name="field_errors_not_saved">بعض الحقول بها أخطاء ولم يتم حفظها.</string> - <string name="fields_mandatory_missing">بعض الحقول الإلزامية غير مدخله ولا يمكن حفظ النموذج.</string> - <string name="fields_mandatory_missing_discard">بعض الحقول الإلزامية مفقودة ولا يمكن حفظ النموذج. \nإذا قمت بالخروج الآن سيتم تجاهل التغييرات.</string> <string name="share">مشاركة</string> <string name="action_close">إغلاق</string> - <string name="program_rules_loop_warning_title">تحذير قواعد البرنامج</string> <string name="copied_text">تم النسخ</string> - <string name="empty_description">لا توجد معلومات عن هذا الحقل</string> <string name="take_photo">التقط صورة</string> <string name="warning_error_on_complete_title">تحقق من هذا!</string> <string name="action_do_not_show_again">لا تظهر مرة أخرى</string> @@ -94,7 +78,6 @@ <string name="incident_date">تاريخ الحدوث</string> <string name="download">تنزيل</string> <string name="scan">المسح الضوئي</string> - <string name="qr_code">رمز الاستجابة السريعة</string> <string name="add_location">إضافة موقع</string> <string name="org_unit">الوحدة التنظيمية</string> <string name="coordinates">الإحداثيات</string> @@ -119,12 +102,11 @@ <string name="search_to_find_more">ابحث للعثور على المزيد</string> <string name="action_done">تم</string> <string name="input_not_supported">غير مدعوم</string> - <!--*******************-> + <!--******************* D2 Error Messages **********************--> <string name="login_error_null_pass">كلمة المرور مفقودة. الرجاء إدخال كلمة المرور.</string> <string name="login_error_null_username">اسم المستخدم مفقود. الرجاء إدخال اسم المستخدم.</string> - <string name="login_error_dhis_version">يقوم هذا الخادم بتشغيل إصدار dhis مختلف عن 2.29. قم بتحديث إصدار الخادم الخاص بك أو استخدم بيئة الاختبار للمتابعة.</string> <string name="login_error_dhis_version_v2">يقوم هذا الخادم بتشغيل إصدار DHIS2 مختلف عن %s. قم بتحديث إصدار الخادم الخاص بك أو اتصل بالمسؤول.</string> <string name="login_error_unsuccessful_response">هناك خطأ ما. يرجى التحقق من صحة عنوان URL الخاص بالخادم واسم المستخدم وكلمة المرور وحاول مرة أخرى.</string> <string name="login_error_error_response">آسف! فشل شيء ما من جانب الخادم.</string> @@ -142,7 +124,6 @@ <string name="error_app_version_not_set">لم يتم تعيين إصدار التطبيق.</string> <string name="error_create_existing_error">الغاء الإنشاء. الكائن موجود مسبقًا.</string> <string name="error_delete_non_existing_object">احباط عملية الحذف، الكائن غير موجود.</string> - <string name="error_reserve_value_on_server">لم نتمكن من الاحتفاظ بقيم لهذه السجلات. يرجى الاتصال بالمسؤول الخاص بك.</string> <string name="error_export_login">الرجاء تسجيل الدخول لتصدير قاعدة البيانات.</string> <string name="error_export_encrypted">تصدير قاعدة بيانات مشفرة غير مدعوم.</string> <string name="error_import_exist">أنت تستورد قاعدة بيانات موجودة مسبقًا.</string> @@ -167,7 +148,6 @@ <string name="error_socket_timeout">استغرق الخادم وقتًا طويلاً للاستجابة. لقد ألغينا الطلب.</string> <string name="error_relationship_updated">لا يمكن تحديث العلاقة.</string> <string name="error_too_many_periods">هناك فترات كثيرة جدا.</string> - <string name="error_url_not_found">لم نتمكن من العثور على URL. الرجاء التحقق منه.</string> <string name="error_account_disabled">تم تعطيل حساب المستخدم الخاص بك. إذا كان هذا خطأ ، اتصل بالمسؤول.</string> <string name="error_account_locked">حساب المستخدم الخاص بك مغلق. إذا كان هذا خطأ ، اتصل بالمسؤول.</string> <string name="error_set_value">تعذر تعيين القيمة.</string> @@ -178,8 +158,11 @@ <string name="error_org_unit_scope">البحث على الإنترنت متاح فقط للوحدات التنظيمية المتاحة للمستخدم للبحث.</string> <string name="error_server_unavailable">الخادم غير متوفر حالياً. حاول مرة أخرى في وقت لاحق.</string> <string name="error_no_internet_connection">أنت غير متصل بالإنترنت. اتصل بالإنترنت وحاول مرة أخرى.</string> - <!--*******************-> + <!--******************* END OF D2 Error Messages **********************--> + <string name="age_or">أو</string> + <string name="cancel">إلغاء</string> + <string name="ok">موافق</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-bn/strings.xml b/commonskmm/src/commonMain/composeResources/values-bn/strings.xml index 926dfcf4f64..6edef692700 100644 --- a/commonskmm/src/commonMain/composeResources/values-bn/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-bn/strings.xml @@ -2,10 +2,5 @@ <resources> <string name="invalid_integer">অবশ্যই সংখ্যা হতে হবে</string> <string name="error">ভুল</string> - <string name="date">তারিখ</string> <string name="due_date">নির্ধারিত তারিখ</string> - <!--*******************-> - END OF D2 Error Messages - **********************--> - </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-ckb/strings.xml b/commonskmm/src/commonMain/composeResources/values-ckb/strings.xml index 3e62754b89b..3d623906113 100644 --- a/commonskmm/src/commonMain/composeResources/values-ckb/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-ckb/strings.xml @@ -2,12 +2,7 @@ <resources> <string name="error">هەڵە</string> <string name="required">ثيويست</string> - <string name="date">بەروار</string> - <string name="hint_year">ساڵەکان</string> - <string name="hint_month">مانگەکان</string> - <string name="hint_day">رۆژەکان</string> <string name="complete">تەواوبکە</string> - <string name="save_anyway">بەهەرحاڵ تۆماری بکە</string> <string name="action_close">داخستن</string> <string name="no_reserved_values">هیچ نرخێکی دیکەی تەرخانکراو نەما. پەیوەندی بە بەڕێوەبەری سیستەمەکەتەوە بکە</string> <string name="yes">بەڵێ</string> @@ -15,8 +10,7 @@ <string name="input_action_accept">پەسندکردن</string> <string name="input_action_cancel">لابردن</string> <string name="action_done">تةواو كرا</string> - <!--*******************-> - END OF D2 Error Messages - **********************--> + <string name="cancel">لابردن</string> + <string name="ok">تةواو</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-cs/strings.xml b/commonskmm/src/commonMain/composeResources/values-cs/strings.xml index 4d76373c0ea..6dad687abd7 100644 --- a/commonskmm/src/commonMain/composeResources/values-cs/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-cs/strings.xml @@ -25,16 +25,9 @@ <string name="missing_warning_fields_completed_events">Máte několik varovných hlášení.</string> <string name="missing_warning_fields_events">Máte několik varovných hlášení.\nChcete tento formulář označit jako dokončený\?</string> <string name="required">Vyžadováno</string> - <string name="date">datum</string> - <string name="hint_year">Let</string> - <string name="hint_month">Měsíce</string> - <string name="hint_day">Dnů</string> - <string name="wrong_date_format">%s nelze analyzovat jako datum</string> <string name="polygon">Polygon</string> <string name="latitude">Zeměpisná šířka</string> <string name="longitude">Zeměpisná délka</string> - <string name="coordinates_error">Hodnoty souřadnic nejsou platné</string> - <string name="polygon_captured">Polygon zaznamenán</string> <string name="enter_value">Zadejte hodnotu</string> <string name="enter_url">Zadejte url</string> <string name="enter_email">Zadejte e-mail</string> @@ -49,9 +42,6 @@ <string name="enter_long_text">Zadejte dlouhý text</string> <string name="enter_text">Zadejte text</string> <string name="due_date">Datum vypršení</string> - <string name="mandatory_field">Povinné pole</string> - <string name="form_latitude_prefix">Šířka:</string> - <string name="form_longitude_prefix">Délka:</string> <string name="not_saved">Neuloženo</string> <string name="review">Posouzení</string> <string name="complete">Dokončit</string> @@ -61,21 +51,14 @@ <string name="missing_error_fields_events">Některá pole obsahují chyby a neukládají se. \nChcete formulář zkontrolovat\?</string> <string name="review_message">Některé oblasti vyžadují vaši pozornost.\nChcete formulář zkontrolovat\?</string> <string name="not_now">Teď ne</string> - <string name="save_anyway">Přesto uložit</string> <string name="keep_editing">Pokračovat v úpravách</string> <string name="event_can_be_completed">Chcete tento formulář označit jako vyplněný?</string> <string name="discard_go_back">Pokud nyní odejdete, všechny informace ve formuláři budou zahozeny.</string> <string name="field_errors_not_saved_discard">Některá pole obsahují chyby a neukládají se. \nPokud je nyní ukončíte, změny budou zrušeny.</string> - <string name="field_errors_not_saved">Některá pole obsahují chyby a neuloží se.</string> - <string name="fields_mandatory_missing">Některá povinná pole chybí a formulář nelze uložit.</string> - <string name="fields_mandatory_missing_discard">Chybí některá povinná pole a formulář nelze uložit. \nPokud nyní formulář ukončíte, změny budou zrušeny.</string> <string name="share">Sdílet</string> <string name="camera_permission_denied">Povolení k použití kamery je zamítnuto.\nChcete-li tuto funkci používat, musíte ji povolit.</string> <string name="action_close">Zavřít</string> - <string name="program_rules_loop_warning_title">Upozornění na pravidla programu</string> - <string name="program_rules_loop_warning_message">Došlo k problému s konfigurací, který způsobuje smyčku v pravidlech. Kontaktujte svého správce.</string> <string name="copied_text">Zkopírováno</string> - <string name="empty_description">Žádné informace pro toto pole</string> <string name="take_photo">Vyfotit</string> <string name="from_gallery_v2">Z galerie</string> <string name="warning_error_on_complete_title">Zkontrolovat to!</string> @@ -101,13 +84,10 @@ <string name="tei_coordinates">Souřadnice pro</string> <string name="no_reserved_values">Neexistují žádné další rezervované hodnoty. Obraťte se na správce systému</string> <string name="incident_date">Datum incidentu</string> - <string name="location_permission_denied">Pro zachycení souřadnic je potřeba oprávnění k poloze. Povolte je prosím v nastavení aplikace</string> <string name="open_with">Otevřít s</string> <string name="no_option_found">Nenalezena žádná možnost</string> <string name="download">Stáhnout</string> <string name="scan">Skenování</string> - <string name="qr_code">QR kód</string> - <string name="bar_code">Čárový kód</string> <string name="add_location">Přidat umístění</string> <string name="form_without_fields">Tento formulář nemá nakonfigurovaná žádná pole</string> <string name="event_details_section_title">Podrobnosti %s</string> @@ -138,12 +118,11 @@ <string name="search_to_find_more">Hledat pro nalezení dalších</string> <string name="action_done">Hotovo</string> <string name="input_not_supported">Není podporováno</string> - <!--*******************-> + <!--******************* D2 Error Messages **********************--> <string name="login_error_null_pass">Chybí heslo. Prosím vložte heslo.</string> <string name="login_error_null_username">Chybí uživatelské jméno. Zadejte uživatelské jméno.</string> - <string name="login_error_dhis_version">Tento server používá jinou verzi DHIS než 2.29. Aktualizujte verzi serveru nebo pokračujte testovacím prostředím.</string> <string name="login_error_dhis_version_v2">Tento server používá verzi DHIS2 odlišnou od %s. Aktualizujte verzi serveru nebo kontaktujte svého administrátora.</string> <string name="login_error_unsuccessful_response">Něco se pokazilo. Zkontrolujte prosím správnost adresy URL serveru, uživatelského jména a hesla a zkuste to znovu.</string> <string name="login_error_error_response">Promiňte! Něco selhalo na straně serveru.</string> @@ -164,7 +143,6 @@ <string name="error_create_existing_error">Vytváření přerušeno. Objekt již existuje.</string> <string name="error_delete_non_existing_object">Mazání přerušeno. Objekt neexistuje.</string> <string name="error_instance_keystore">Nelze vytvořit instanci úložiště klíčů.</string> - <string name="error_reserve_value_on_server">Pro tyto záznamy jsme nemohli vyhradit hodnoty. Kontaktujte prosím svého administrátora.</string> <string name="error_export_login">Pro export databáze se prosím přihlaste.</string> <string name="error_export_encrypted">Export šifrované databáze není podporován.</string> <string name="error_import_exist">Importujete již existující databázi.</string> @@ -191,7 +169,6 @@ <string name="error_socket_timeout">Serveru trvalo příliš dlouho, než odpověděl. Žádost jsme zrušili.</string> <string name="error_relationship_updated">Vztah nelze aktualizovat.</string> <string name="error_too_many_periods">Období je příliš mnoho.</string> - <string name="error_url_not_found">Adresu URL jsme nenašli. Prosím ověřte to.</string> <string name="error_account_disabled">Váš uživatelský účet byl deaktivován. Pokud se jedná o chybu, kontaktujte svého správce.</string> <string name="error_account_locked">Váš uživatelský účet je uzamčen. Pokud se jedná o chybu, kontaktujte svého správce.</string> <string name="error_set_value">Hodnotu nelze nastavit.</string> @@ -207,8 +184,13 @@ <string name="invalid_file">Neplatný soubor</string> <string name="not_in_totp_2fa_enrollment_mode">Není v režimu registrace TOTP 2FA</string> <string name="openid_login_cancelled">Ověřování zrušeno</string> - <!--*******************-> + <!--******************* END OF D2 Error Messages **********************--> + <string name="age_or">OR</string> + <string name="age">VĚK</string> + <string name="date_of_birth">DATUM NAROZENÍ</string> + <string name="cancel">Zrušit</string> + <string name="ok">OK</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-da/strings.xml b/commonskmm/src/commonMain/composeResources/values-da/strings.xml index 1bf475e2ded..4204a6da923 100644 --- a/commonskmm/src/commonMain/composeResources/values-da/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-da/strings.xml @@ -2,14 +2,12 @@ <resources> <string name="invalid_integer">Value must be an integer</string> <string name="error">Error</string> - <string name="date">Date</string> <string name="due_date">Due date</string> <string name="action_close">Close</string> <string name="incident_date">Incident date</string> <string name="input_action_cancel">Cancel</string> <string name="no_results_found">No results found</string> - <!--*******************-> - END OF D2 Error Messages - **********************--> + <string name="cancel">Cancel</string> + <string name="ok">OK</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-en-rUS/strings.xml b/commonskmm/src/commonMain/composeResources/values-en-rUS/strings.xml index 451502a78b9..30a64044856 100644 --- a/commonskmm/src/commonMain/composeResources/values-en-rUS/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-en-rUS/strings.xml @@ -21,16 +21,9 @@ <string name="field_is_mandatory">This field is mandatory</string> <string name="missing_warning_fields_completed_events">You have some warning messages.</string> <string name="required">Required</string> - <string name="date">Date</string> - <string name="hint_year">Years</string> - <string name="hint_month">Months</string> - <string name="hint_day">Days</string> - <string name="wrong_date_format">%s can\'t be parsed as a date</string> <string name="polygon">Polygon</string> <string name="latitude">Latitude</string> <string name="longitude">Longitude</string> - <string name="coordinates_error">Coordinates values are not valid</string> - <string name="polygon_captured">Polygon captured</string> <string name="enter_value">Enter value</string> <string name="enter_url">Enter url</string> <string name="enter_email">Enter email</string> @@ -45,27 +38,18 @@ <string name="enter_long_text">Enter long text</string> <string name="enter_text">Enter text</string> <string name="due_date">Due date</string> - <string name="mandatory_field">Mandatory field</string> - <string name="form_latitude_prefix">Lat:</string> - <string name="form_longitude_prefix">Long:</string> <string name="not_saved">Not saved</string> <string name="review">Review</string> <string name="complete">Complete</string> <string name="discard_changes">Discard changes</string> <string name="saved">Saved!</string> <string name="not_now">Not now</string> - <string name="save_anyway">Save anyway</string> <string name="keep_editing">Keep editing</string> - <string name="event_can_be_completed">Do you want to mark this form as complete\?</string> + <string name="event_can_be_completed">Do you want to mark this form as complete?</string> <string name="discard_go_back">If you exit now all the information in the form will be discarded.</string> - <string name="field_errors_not_saved">Some fields have errors and they are not saved.</string> - <string name="fields_mandatory_missing">Some mandatory fields are missing and the form cannot be saved.</string> <string name="share">Share</string> <string name="action_close">Close</string> - <string name="program_rules_loop_warning_title">Program rules warning</string> - <string name="program_rules_loop_warning_message">There is a configuration issue causing a loop in the rules. Contact you administrator.</string> <string name="copied_text">Copied</string> - <string name="empty_description">No info for this field</string> <string name="take_photo">Take Photo</string> <string name="from_gallery_v2">From gallery</string> <string name="warning_error_on_complete_title">Check this!</string> @@ -77,13 +61,10 @@ <string name="tei_coordinates">Coordinates for the</string> <string name="no_reserved_values">There are no more reserved values. Contact your system administrator</string> <string name="incident_date">Incident date</string> - <string name="location_permission_denied">The location permission is needed for capturing coordinates. Please, enable them in the application settings</string> <string name="open_with">Open with</string> <string name="no_option_found">No option found</string> <string name="download">Download</string> <string name="scan">Scan</string> - <string name="qr_code">QR code</string> - <string name="bar_code">Bar code</string> <string name="add_location">Add location</string> <string name="form_without_fields">This form has no fields configured</string> <string name="event_details_section_title">%s details</string> @@ -110,12 +91,11 @@ <string name="search_to_find_more">Search to find more</string> <string name="action_done">Done</string> <string name="input_not_supported">Not supported</string> - <!--*******************-> + <!--******************* D2 Error Messages **********************--> <string name="login_error_null_pass">Password is missing. Please enter password.</string> <string name="login_error_null_username">Username is missing. Please enter username.</string> - <string name="login_error_dhis_version">This server is running a dhis version different than 2.29. Update your server version or use the testing environment to proceed.</string> <string name="login_error_dhis_version_v2">This server is running a DHIS2 version different than %s. Update your server version or contact your admin.</string> <string name="login_error_unsuccessful_response">Something went wrong. Please check that server URL, username and password are correct and try again.</string> <string name="login_error_error_response">Sorry! Something failed on the server side.</string> @@ -136,7 +116,6 @@ <string name="error_create_existing_error">Creation aborted. The object already exists.</string> <string name="error_delete_non_existing_object">Deletion aborted. The object does not exist.</string> <string name="error_instance_keystore">Unable to instantiate keystore.</string> - <string name="error_reserve_value_on_server">We couldn´t reserve values for these record. Please contact your admin.</string> <string name="error_export_login">Please login to export the database.</string> <string name="error_export_encrypted">Exporting an encrypted database is not supported.</string> <string name="error_import_exist">You are importing an already existing database.</string> @@ -163,7 +142,6 @@ <string name="error_socket_timeout">The server took too much time to respond. We canceled the request. </string> <string name="error_relationship_updated">The relationship can\'t be updated.</string> <string name="error_too_many_periods">There are too many periods.</string> - <string name="error_url_not_found">We couldn´t find the URL. Please verify it.</string> <string name="error_account_disabled">Your user account have been disabled. If this is an error, contact your administrator.</string> <string name="error_account_locked">Your user account is locked. If this is an error, contact your administrator.</string> <string name="error_set_value">The value could not be set.</string> @@ -178,8 +156,5 @@ <string name="database_import_failed">Database import failed</string> <string name="invalid_file">Invalid file</string> <string name="not_in_totp_2fa_enrollment_mode">Not in TOTP 2FA enrollment mode</string> - <!--*******************-> - END OF D2 Error Messages - **********************--> - -</resources> \ No newline at end of file + <string name="cancel">Cancel</string> + </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-es-rES/strings.xml b/commonskmm/src/commonMain/composeResources/values-es-rES/strings.xml index 8e63a0b0b46..63291f3482c 100644 --- a/commonskmm/src/commonMain/composeResources/values-es-rES/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-es-rES/strings.xml @@ -22,16 +22,9 @@ <string name="conf_error_value_to_assign_option_set">La regla de programa %s está intentando asignar el valor %s que no pertenece al conjunto de opciones %s</string> <string name="conf_error_value_option_set">El valor del campo %s no pertenece al conjunto de opciones en %s</string> <string name="field_is_mandatory">El campo es obligatorio</string> - <string name="date">Fecha</string> - <string name="hint_year">Años</string> - <string name="hint_month">Meses</string> - <string name="hint_day">Días</string> - <string name="wrong_date_format">%s no es una fecha válida</string> <string name="polygon">Polígono</string> <string name="latitude">Latitud</string> <string name="longitude">Longitud</string> - <string name="coordinates_error">El valor de las coordenadas no es válido</string> - <string name="polygon_captured">Polígono guardado</string> <string name="enter_value">Introduzca valor</string> <string name="enter_url">Introduzca url</string> <string name="enter_email">Introduzca email</string> @@ -46,27 +39,18 @@ <string name="enter_long_text">Introducir texto largo</string> <string name="enter_text">Introducir texto</string> <string name="due_date">Fecha de vencimiento</string> - <string name="mandatory_field">Campo obligatorio</string> - <string name="form_latitude_prefix">Lat:</string> - <string name="form_longitude_prefix">Long:</string> <string name="not_saved">No guardado</string> <string name="review">Revisar</string> <string name="complete">Completar</string> <string name="discard_changes">Descartar los cambios</string> <string name="saved">¡Guardado!</string> <string name="not_now">Ahora no</string> - <string name="save_anyway">Guardar de todos modos</string> <string name="keep_editing">Seguir editando</string> <string name="event_can_be_completed">¿Desea marcar este formulario como completo?</string> <string name="discard_go_back">Si sale toda la información del formulario será descartada.</string> - <string name="field_errors_not_saved">Algunos campos tienen errores y no serán guardados.</string> - <string name="fields_mandatory_missing">Algunos campos obligatorios faltan llenarse, el formulario no puede ser guardado</string> <string name="share">Compartir</string> <string name="action_close">Cerrar</string> - <string name="program_rules_loop_warning_title">Advertencia de reglas del programa</string> - <string name="program_rules_loop_warning_message">Hay un problema de configuración que provoca un bucle en las reglas. Póngase en contacto con su administrador.</string> <string name="copied_text">Copiado</string> - <string name="empty_description">No hay información para este campo</string> <string name="take_photo">Tomar foto</string> <string name="warning_error_on_complete_title">¡Importante!</string> <string name="action_do_not_show_again">No volver a mostrar</string> @@ -90,7 +74,6 @@ <string name="tei_coordinates">Coordenadas para</string> <string name="no_reserved_values">No quedan valores reservados. Contacte con el administrador del sistema.</string> <string name="incident_date">Fecha del incidente</string> - <string name="location_permission_denied">Se requiere el permiso de localización para obtener coordenadas. POR FAVOR, habilítelo desde los ajustes del dispositivo.</string> <string name="org_unit">Unidad Organizativa</string> <string name="cat_combo">Cat Combo</string> <string name="yes">sí</string> @@ -103,12 +86,11 @@ <string name="add_image">Añadir imagen</string> <string name="no_results_found">No se han encontrado resultados</string> <string name="action_done">Terminado</string> - <!--*******************-> + <!--******************* D2 Error Messages **********************--> <string name="login_error_null_pass">La contraseña está vacía. Ingrese la contraseña.</string> <string name="login_error_null_username">El usuario está vacío. Ingrese el usuario.</string> - <string name="login_error_dhis_version">Este servidor trabaja sobre una versión de dhis distinta a 2.29. Actualice el servidor o utilice el entorno de pruebas para continuar.</string> <string name="login_error_dhis_version_v2">Este servidor tiene una version de DHIS2 diferente de %s. Actualice su servidor o contacte a su administrador.</string> <string name="login_error_unsuccessful_response">Algo ha ido mal. Por favor, compruebe que tanto la url del servidor como el usuario y contraseña son correctos y pruebe otra vez.</string> <string name="login_error_error_response">Disculpe, hubo un error del lado del servidor.</string> @@ -129,7 +111,6 @@ <string name="error_create_existing_error">No se puede crear un objeto que ya existe.</string> <string name="error_delete_non_existing_object">No se puede eliminar un objeto que no existe.</string> <string name="error_instance_keystore">No se puede inicializar el almacén de llaves.</string> - <string name="error_reserve_value_on_server">No se pudo reservar los valores. Por favor contacte a su administrador</string> <string name="error_export_login">Inicie sesión para exportar la base de datos.</string> <string name="error_export_encrypted">Exportar una base de datos encriptada no está soportado.</string> <string name="error_import_exist">Está intentando importar una base de datos que ya existe.</string> @@ -156,7 +137,6 @@ <string name="error_socket_timeout">El servidor ha tardado mucho en responder. Se ha cancelado la petición.</string> <string name="error_relationship_updated">La relación no puede actualizarse.</string> <string name="error_too_many_periods">Hay demasiados periodos.</string> - <string name="error_url_not_found">No pudimos encontrar la URL. Por favor revísela.</string> <string name="error_account_disabled">Su cuenta de usuario ha sido desactivada. Si esto es un error, contacte con su administrador.</string> <string name="error_account_locked">Su cuenta de usuario ha sido bloqueada. Si es un error, contacte con su administrador.</string> <string name="error_set_value">No se ha podido cambiar el valor.</string> @@ -166,8 +146,7 @@ <string name="error_min_attributes">No hay suficientes atributos para realizar la búsqueda. Por favor redefina la búsqueda añadiendo más atributos.</string> <string name="error_org_unit_scope">La búsqueda online solo está disponible para las unidades organizativas de búsqueda.</string> <string name="error_invalid_characters">El query contiene caracteres invalidos. Por favor contacte a su administrador para verificar la configuración del servidor (relaxedQueryChars,...).</string> - <!--*******************-> - END OF D2 Error Messages - **********************--> + <string name="cancel">Cancelar</string> + <string name="ok">Correcto</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-es/strings.xml b/commonskmm/src/commonMain/composeResources/values-es/strings.xml index 3b04f677465..1d4def10b1d 100644 --- a/commonskmm/src/commonMain/composeResources/values-es/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-es/strings.xml @@ -25,16 +25,9 @@ <string name="missing_warning_fields_completed_events">Tienes algunos mensajes de aviso.</string> <string name="missing_warning_fields_events">Tiene algunos mensajes de advertencia.\n¿Deseas marcar este formulario como completo\?</string> <string name="required">Necesario</string> - <string name="date">Fecha</string> - <string name="hint_year">Años</string> - <string name="hint_month">Meses</string> - <string name="hint_day">Días</string> - <string name="wrong_date_format">%s no es una fecha válida</string> <string name="polygon">Polígono</string> <string name="latitude">Latitud</string> <string name="longitude">Longitud</string> - <string name="coordinates_error">El valor de las coordenadas no es válido</string> - <string name="polygon_captured">Polígono capturado</string> <string name="enter_value">Introduzca valor</string> <string name="enter_url">Introduzca url</string> <string name="enter_email">Introduzca email</string> @@ -49,9 +42,6 @@ <string name="enter_long_text">Introducir texto largo</string> <string name="enter_text">Introducir texto</string> <string name="due_date">Fecha de vencimiento</string> - <string name="mandatory_field">Campo obligatorio</string> - <string name="form_latitude_prefix">Lat:</string> - <string name="form_longitude_prefix">Long:</string> <string name="not_saved">No guardado</string> <string name="review">Revisar</string> <string name="complete">Completar</string> @@ -61,21 +51,14 @@ <string name="missing_error_fields_events">Algunos campos tienen errores y no se han guardado.\n¿Deseas revisar el formulario\?</string> <string name="review_message">Algunos campos necesitan tu atención.\n¿Deseas revisar el formulario\?</string> <string name="not_now">Ahora no</string> - <string name="save_anyway">Guardar de todos modos</string> <string name="keep_editing">Seguir editando</string> <string name="event_can_be_completed">¿Desea marcar este formulario como completo?</string> <string name="discard_go_back">Si sale toda la información del formulario será descartada.</string> <string name="field_errors_not_saved_discard">Algunos campos presentan errores y no se han guardado.\nSi sales ahora, los cambios se descartarán.</string> - <string name="field_errors_not_saved">Algunos campos tienen errores y no serán guardados.</string> - <string name="fields_mandatory_missing">Algunos campos obligatorios faltan llenarse, el formulario no puede ser guardado</string> - <string name="fields_mandatory_missing_discard">Faltan algunos campos obligatorios y el formulario no puede guardarse.\nSi sales ahora, los cambios se descartarán.</string> <string name="share">Compartir</string> <string name="camera_permission_denied">El permiso de cámara está denegado.\nDebes activarlo para usar esta función.</string> <string name="action_close">Cerrar</string> - <string name="program_rules_loop_warning_title">Advertencia de reglas del programa</string> - <string name="program_rules_loop_warning_message">Hay un problema de configuración que provoca un bucle en las reglas. Póngase en contacto con su administrador.</string> <string name="copied_text">Copiado</string> - <string name="empty_description">No hay información para este campo</string> <string name="take_photo">Tomar foto</string> <string name="from_gallery_v2">Desde la galería</string> <string name="warning_error_on_complete_title">¡Importante!</string> @@ -100,13 +83,10 @@ <string name="tei_coordinates">Coordenadas para</string> <string name="no_reserved_values">No quedan valores reservados. Contacte con el administrador del sistema.</string> <string name="incident_date">Fecha del incidente</string> - <string name="location_permission_denied">Se requiere el permiso de localización para obtener coordenadas. Por favor, habilítelo desde los ajustes del dispositivo.</string> <string name="open_with">Abrir con</string> <string name="no_option_found">No se ha encontrado opción</string> <string name="download">Descargar</string> <string name="scan">Escanear</string> - <string name="qr_code">Código QR</string> - <string name="bar_code">Código de barras</string> <string name="add_location">Agregar ubicación</string> <string name="form_without_fields">Este formulario no tiene campos configurados</string> <string name="event_details_section_title">%s detalles</string> @@ -137,12 +117,11 @@ <string name="search_to_find_more">Busca para ver más</string> <string name="action_done">Hecho</string> <string name="input_not_supported">No soportado</string> - <!--*******************-> + <!--******************* D2 Error Messages **********************--> <string name="login_error_null_pass">La contraseña está vacía. Ingrese la contraseña.</string> <string name="login_error_null_username">El usuario está vacío. Ingrese el usuario.</string> - <string name="login_error_dhis_version">Este servidor trabaja sobre una versión de dhis distinta a 2.29. Actualice el servidor o utilice el entorno de pruebas para continuar.</string> <string name="login_error_dhis_version_v2">Este servidor tiene una version de DHIS2 diferente de %s. Actualice su servidor o contacte a su administrador.</string> <string name="login_error_unsuccessful_response">Algo ha ido mal. Por favor, compruebe que tanto la url del servidor como el usuario y contraseña son correctos y pruebe otra vez.</string> <string name="login_error_error_response">Disculpe, hubo un error del lado del servidor.</string> @@ -163,7 +142,6 @@ <string name="error_create_existing_error">No se puede crear un objeto que ya existe.</string> <string name="error_delete_non_existing_object">No se puede eliminar un objeto que no existe.</string> <string name="error_instance_keystore">No se puede inicializar el almacén de llaves.</string> - <string name="error_reserve_value_on_server">No se pudo reservar los valores. Por favor contacte a su administrador</string> <string name="error_export_login">Inicie sesión para exportar la base de datos.</string> <string name="error_export_encrypted">Exportar una base de datos encriptada no está soportado.</string> <string name="error_import_exist">Está intentando importar una base de datos que ya existe.</string> @@ -190,7 +168,6 @@ <string name="error_socket_timeout">El servidor ha tardado mucho en responder. Se ha cancelado la petición.</string> <string name="error_relationship_updated">La relación no puede actualizarse.</string> <string name="error_too_many_periods">Hay demasiados periodos.</string> - <string name="error_url_not_found">No pudimos encontrar la URL. Por favor revísela.</string> <string name="error_account_disabled">Su cuenta de usuario ha sido desactivada. Si esto es un error, contacte con su administrador.</string> <string name="error_account_locked">Su cuenta de usuario ha sido bloqueada. Si es un error, contacte con su administrador.</string> <string name="error_set_value">No se ha podido cambiar el valor.</string> @@ -204,8 +181,9 @@ <string name="error_no_internet_connection">Estas desconectado. Conéctese a Internet e inténtelo nuevamente.</string> <string name="database_import_failed">Importación de la base de datos fallida</string> <string name="invalid_file">Archivo no válido</string> - <!--*******************-> - END OF D2 Error Messages - **********************--> + <string name="age">EDAD</string> + <string name="date_of_birth">FECHA DE NACIMIENTO</string> + <string name="cancel">Cancelar</string> + <string name="ok">Aceptar</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-fr/strings.xml b/commonskmm/src/commonMain/composeResources/values-fr/strings.xml index fb712fee77c..42fddb45f7d 100644 --- a/commonskmm/src/commonMain/composeResources/values-fr/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-fr/strings.xml @@ -24,16 +24,9 @@ <string name="field_is_mandatory">Ce champ est obligatoire</string> <string name="missing_warning_fields_completed_events">Vous avez des messages d\'avertissement.</string> <string name="required">Requis</string> - <string name="date">Date</string> - <string name="hint_year">Années</string> - <string name="hint_month">Mois</string> - <string name="hint_day">Jours</string> - <string name="wrong_date_format"> %s ne peut pas être analysé comme une date</string> <string name="polygon">Polygone</string> <string name="latitude">Latitude</string> <string name="longitude">Longitude</string> - <string name="coordinates_error">Les valeurs des coordonnées ne sont pas valides</string> - <string name="polygon_captured">Le polygône a été défini</string> <string name="enter_value">Entrez une valeur</string> <string name="enter_url">Entrez url</string> <string name="enter_email">Entrez e-mail</string> @@ -48,25 +41,18 @@ <string name="enter_long_text">Saisir texte long</string> <string name="enter_text">Saisir du texte</string> <string name="due_date">Date d\'échéance</string> - <string name="mandatory_field">Champ obligatoire</string> <string name="not_saved">Non enregistré!</string> <string name="review">Vérifier</string> <string name="complete">Terminer</string> <string name="discard_changes">Annuler les modifications</string> <string name="saved">Enregistré!</string> <string name="not_now">Pas maintenant</string> - <string name="save_anyway">Enregistrer quand même</string> <string name="keep_editing">Continuer l’édition</string> <string name="event_can_be_completed">Voulez-vous marquer ce formulaire comme complet?</string> <string name="discard_go_back">Si vous quittez maintenant, toutes les informations du formulaire seront supprimées.</string> - <string name="field_errors_not_saved">Certains champs contiennent des erreurs et ils ne sont pas enregistrés.</string> - <string name="fields_mandatory_missing">Certains champs obligatoires manquent et le formulaire ne peut pas être enregistré.</string> <string name="share">Partager</string> <string name="action_close">Fermer</string> - <string name="program_rules_loop_warning_title">Avertissement relatif aux règles du programme</string> - <string name="program_rules_loop_warning_message">Il y a un problème de configuration provoquant une boucle dans les règles. Contactez votre administrateur.</string> <string name="copied_text">Copié</string> - <string name="empty_description">Pas d\'information pour ce champ</string> <string name="take_photo">Prendre une photo</string> <string name="warning_error_on_complete_title">Attention. Vérifiez ceci!</string> <string name="action_do_not_show_again">Ne pas montrer de nouveau</string> @@ -90,13 +76,10 @@ <string name="tei_coordinates">Coordonnées pour</string> <string name="no_reserved_values">Il n\'y a plus de valeurs réservées. Veuillez contacter votre administrateur système.</string> <string name="incident_date">Date de l´incident</string> - <string name="location_permission_denied">L\'autorisation de localisation est nécessaire pour capturer les coordonnées. Veuillez les activer dans les paramètres de l\'application</string> <string name="open_with">Ouvrir avec</string> <string name="no_option_found">Aucune option trouvée</string> <string name="download">Télécharger</string> <string name="scan">Scanner</string> - <string name="qr_code">Code QR</string> - <string name="bar_code">Code-barre</string> <string name="add_location">Ajouter un lieu</string> <string name="form_without_fields">Ce formulaire n\'a pas de champs configurés</string> <string name="event_details_section_title">%s détails</string> @@ -121,12 +104,11 @@ <string name="no_results_found">Aucun résultat trouvé</string> <string name="action_done">Terminé</string> <string name="input_not_supported">Non supporté</string> - <!--*******************-> + <!--******************* D2 Error Messages **********************--> <string name="login_error_null_pass">Le mot de passe est manquant. Veuillez entrer le mot de passe.</string> <string name="login_error_null_username">Le nom d\'utilisateur est manquant. Veuillez entrer le nom d\'utilisateur.</string> - <string name="login_error_dhis_version">Ce serveur a une version différente de 2.29. Mettre à jour la version ou utiliser un environnement d\'essai pour continuer</string> <string name="login_error_no_dhis_instance">L\'URL fournie n\'est pas un serveur DHIS2.</string> <string name="login_error_bad_credentials">Nom d\'utilisateur ou le mot de passe sont incorrects</string> <string name="login_error_unknown_host">Serveur inconnu</string> @@ -136,7 +118,6 @@ <string name="error_many_requests">Le serveur est un peu occupé en ce moment. Veuillez essayer un peu plus tard.</string> <string name="error_already_authenticated">L\'utilisateur est déjà connecté</string> <string name="error_api_invalid_query">La requête du serveur n\'est pas valide.</string> - <string name="error_reserve_value_on_server">Nous ne pouvions pas réserver de valeurs pour ces enregistrements. Veuillez contacter votre administrateur.</string> <string name="error_import_logout">Veuillez vous déconnecter pour importer une nouvelle base de données.</string> <string name="error_low_on_available_values">Vous êtes peut-être à court de valeurs disponibles.</string> <string name="error_user_no_authenticated">Il n\'y a pas d\'utilisateur authentifié.</string> @@ -153,8 +134,13 @@ <string name="error_min_attributes">Il n\'y a pas assez d\'attributs pour effectuer la recherche. Veuillez affiner votre recherche avec plus d\'attributs.</string> <string name="error_org_unit_scope">La recherche en ligne n\'est disponible que pour vos unités organisationnelles de recherche d\'utilisateurs.</string> <string name="error_no_internet_connection">Vous n\'êtes pas connecté. Veuillez-vous connecter et réssayer.</string> - <!--*******************-> + <!--******************* END OF D2 Error Messages **********************--> + <string name="age_or">OR</string> + <string name="age">ÂGE</string> + <string name="date_of_birth">DATE DE NAISSANCE</string> + <string name="cancel">Annuler</string> + <string name="ok">Ok</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml b/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml index 1f52de81592..629e42f9920 100644 --- a/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-hi-rIN/strings.xml @@ -10,19 +10,14 @@ <string name="invalid_interval">केवल 0 से 1 के मान ही अनुमति हैं</string> <string name="validation_url">यह मान्य URL नहीं है</string> <string name="update_field_error">यह फ़ील्ड अपडेट नहीं हो सका। कृपया फिर से प्रयास करें</string> - <string name="error">त्रुटि</string> + <string name="error">एरर्स</string> <string name="unique_warning">मान अद्वितीय होना चाहिए। समान मान मिला है। इसे सहेजा नहीं गया। कृपया जाँच करें</string> <string name="select_time">समय चुनें</string> <string name="choose_date">दिन चुनें</string> <string name="field_is_mandatory">यह फ़ील्ड आवश्यक है</string> <string name="missing_warning_fields_completed_events">आपके पास कुछ चेतावनी संदेश हैं</string> - <string name="missing_warning_fields_events">आपके पास कुछ चेतावनी संदेश हैं\nक्या आप इस फ़ॉर्म को कम्प्लीट मार्क करना चाहते हैं\?</string> + <string name="missing_warning_fields_events">आपके पास कुछ चेतावनी संदेश हैं\nक्या आप इस फ़ॉर्म को कम्प्लीट मार्क करना चाहते हैं?</string> <string name="required">आवश्यकता है</string> - <string name="date">तारीख</string> - <string name="hint_year">वर्ष</string> - <string name="hint_month">महीने</string> - <string name="hint_day">दिन</string> - <string name="wrong_date_format">%s डेट के रूप में पढ़ा नहीं जा सकता</string> <string name="latitude">अक्षांश</string> <string name="longitude">देशांतर</string> <string name="enter_value">मान दर्ज करें</string> @@ -35,15 +30,12 @@ <string name="enter_letter">अक्षर दर्ज करें</string> <string name="enter_long_text">लंबा अक्षर दर्ज करें</string> <string name="enter_text">पाठ दर्ज करें</string> - <string name="form_latitude_prefix">अक्षांश</string> - <string name="form_longitude_prefix">देशांतर</string> <string name="not_saved">सेव नहीं</string> <string name="review">रिव्यू</string> <string name="complete">पूरा हुआ</string> <string name="discard_changes">बदलावों को छोड़ना है</string> <string name="saved">सेव</string> <string name="not_now">अभी नहीं</string> - <string name="save_anyway">सेव करें</string> <string name="keep_editing">संपादन करते रहें</string> <string name="share">साझा करें</string> <string name="action_close">बंद करें</string> @@ -68,8 +60,7 @@ <string name="search_to_find_more">खोजें और अधिक पाएं</string> <string name="action_done">पूरा हुआ</string> <string name="input_not_supported">सपोर्टेड नहीं है</string> - <!--*******************-> - END OF D2 Error Messages - **********************--> + <string name="cancel">रद्द करें</string> + <string name="ok">ठीक है</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-id/strings.xml b/commonskmm/src/commonMain/composeResources/values-id/strings.xml index ac6327ee130..7c91f0384ed 100644 --- a/commonskmm/src/commonMain/composeResources/values-id/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-id/strings.xml @@ -17,15 +17,9 @@ <string name="choose_ou">Pilih unit organisasi</string> <string name="field_is_mandatory">Bidang ini wajib</string> <string name="required">Wajib</string> - <string name="date">Tanggal</string> - <string name="hint_year">Tahun</string> - <string name="hint_month">Bulan</string> - <string name="hint_day">Hari</string> <string name="polygon">Poligon</string> <string name="latitude">Garis lintang</string> <string name="longitude">Garis bujur</string> - <string name="coordinates_error">Nilai koordinat tidak valid</string> - <string name="polygon_captured">Poligon ditangkap</string> <string name="enter_value">Masukkan nilai</string> <string name="enter_url">Masukkan URL</string> <string name="enter_email">Masukan email</string> @@ -43,12 +37,10 @@ <string name="complete">Lengkap</string> <string name="discard_changes">Hapus perubahan</string> <string name="saved">Tersimpan!</string> - <string name="save_anyway">Simpan bagaimanapun</string> <string name="share">Bagikan</string> <string name="camera_permission_denied">Izin kamera ditolak.\nAnda harus mengaktifkannya untuk menggunakan fitur ini.</string> <string name="action_close">Tutup</string> <string name="copied_text">Tersalin</string> - <string name="empty_description">Tidak ada info untuk bidang ini</string> <string name="take_photo">Ambil gambar</string> <string name="warning_error_on_complete_title">Periksa ini!</string> <string name="action_do_not_show_again">Jangan perlihatkan lagi</string> @@ -74,10 +66,8 @@ <string name="no_results_found">Tidak ada hasil ditemukan</string> <string name="action_done">Selesai</string> <string name="input_not_supported">Tidak didukung</string> - <string name="login_error_dhis_version">Server ini menjalankan versi dhis yang berbeda dari 2.29. Perbarui versi server Anda atau gunakan pengujian lingkungan untuk melanjutkan.</string> <string name="online_search_parsing_error">Kesalahan saat penguraian hasil</string> - <!--*******************-> - END OF D2 Error Messages - **********************--> + <string name="cancel">Batal</string> + <string name="ok">OK</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-km/strings.xml b/commonskmm/src/commonMain/composeResources/values-km/strings.xml index 5ba0a42556a..34cbb15a775 100644 --- a/commonskmm/src/commonMain/composeResources/values-km/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-km/strings.xml @@ -10,10 +10,6 @@ <string name="error">កំហុសបច្ចេកទេស</string> <string name="choose_date">ជ្រើសរើសថ្ងៃខែឆ្នាំ</string> <string name="required">ទាមទារ</string> - <string name="date">កាលបរិច្ឆេទ</string> - <string name="hint_year">ឆ្នាំ</string> - <string name="hint_month">ខែ</string> - <string name="hint_day">ថ្ងៃ</string> <string name="latitude">រយៈទទឹង</string> <string name="longitude">រយៈបណ្តោយ</string> <string name="enter_positive_integer_or_zero">បញ្ជូលទិន្នន័យជាលេខ (វិជ្ជមាន រឺ លេខ ០)</string> @@ -44,10 +40,8 @@ <string name="no_results_found">មិនមានលទ្ធផលបង្ហាញ</string> <string name="action_done">Done</string> <string name="input_not_supported">មិនគាំទ្រ​ / មិនអាចធ្វើឡើងបានទេ</string> - <string name="login_error_dhis_version">ម៉ាស៊ីនមេនេះកំពុងដំណើរការខុសពី DHIS ២.២៩។ សូមធ្វើបច្ចុប្បន្នភាពលើម៉ាស៊ីនមេរបស់អ្នក​</string> <string name="online_search_parsing_error">កំហុសខណៈពេលញែកលទ្ធផល</string> - <!--*******************-> - END OF D2 Error Messages - **********************--> + <string name="cancel">បោះបង់</string> + <string name="ok">យល់ព្រម</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-lo/strings.xml b/commonskmm/src/commonMain/composeResources/values-lo/strings.xml index 71109ab0dc3..50e290bb0f5 100644 --- a/commonskmm/src/commonMain/composeResources/values-lo/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-lo/strings.xml @@ -23,16 +23,9 @@ <string name="conf_error_value_option_set">ຄ່າຂອງຫ້ອງປ້ອນຂໍ້ມູນ%sບໍ່ໄດ້ຂຶ້ນກັບຕົວເລືອກທີ່ຕັ້ງໄວ້ໃນ%s</string> <string name="field_is_mandatory">ຊ່ອງປ້ອນຂໍ້ມູນນີ້ແມ່ນຈໍາເປັນຕ້ອງປ້ອນຂໍ້ມູນໃສ່</string> <string name="required">ຕ້ອງການ</string> - <string name="date">ວັນທີ່</string> - <string name="hint_year">ປີ</string> - <string name="hint_month">ເດືອນ</string> - <string name="hint_day">ມື້</string> - <string name="wrong_date_format">%sບໍ່ສາມາດວິເຄາະເປັນວັນທີໄດ້</string> <string name="polygon">Polygon</string> <string name="latitude">ເສັ້ນຂະໜານ</string> <string name="longitude">ເສັ້ນແວງ</string> - <string name="coordinates_error">ປະສານງານບໍ່ຖືກຕ້ອງ</string> - <string name="polygon_captured">ບັນທຶກຮູບຫຼາຍຫຼ່ຽມ</string> <string name="enter_value">ປ້ອນຄ່າ</string> <string name="enter_url">ປ້ອນ url</string> <string name="enter_email">ປ້ອນອີເມລ</string> @@ -47,23 +40,18 @@ <string name="enter_long_text">ປ້ອນຂໍ້ມູນເປັນຂໍ້ຄວາມຍາວ</string> <string name="enter_text">ຂຽນຄໍາຕອບ</string> <string name="due_date">ວັນທີຕ້ອງແລ້ວ</string> - <string name="mandatory_field">ຊ່ອງປ້ອນຂໍ້ມູນທີ່ບັງຄັບ</string> <string name="not_saved">ບໍ່ໄດ້ບັນທຶກ</string> <string name="review">ທົບທວນຄືນ</string> <string name="complete">ສຳເລັດແລ້ວ</string> <string name="discard_changes">ລຶບການປ່ຽນແປງ</string> <string name="saved">ບັນທຶກແລ້ວ!</string> <string name="not_now">ບໍ່​ແມ່ນ​ຕອນ​ນີ້</string> - <string name="save_anyway">ບັນທຶກ</string> <string name="keep_editing">ສຶບຕໍ່ແກ້ໄຂ</string> <string name="event_can_be_completed">ທ່ານຕ້ອງການໝາຍແບບຟອມນີ້ວ່າສຳເລັດແລ້ວຫຼືບໍ?</string> <string name="discard_go_back">ຖ້າທ່ານອອກດຽວນີ້ ຂໍ້ມູນທັງໝົດໃນແບບຟອມຈະຖືກຍົກເລີກ.</string> <string name="share">ເຜີຍແຜ່</string> <string name="action_close">ປິດ</string> - <string name="program_rules_loop_warning_title">ຂໍ້ຄວນລະວັງກົດຂອງສາຍງານ</string> - <string name="program_rules_loop_warning_message">ມີບັນຫາການກຳນົດຄ່າທີ່ເຮັດໃຫ້ເກີດມີຊ່ອງຫວ່າງໃນກົດລະບຽບ. ຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ.</string> <string name="copied_text">ສຳເນົາແລ້ວ</string> - <string name="empty_description">ບໍ່ມີຂໍ້ມູນສຳລັບຫ້ອງຂໍ້ມູນນີ້</string> <string name="take_photo">ຖ່າຍຮູບ</string> <string name="warning_error_on_complete_title">ກວດເບີ່ງອັນນີ້</string> <string name="action_do_not_show_again">ບໍ່ຕ້ອງສະແດງອີກ</string> @@ -103,12 +91,11 @@ <string name="no_results_found">ບໍ່ພົບຜົນການຊອກຫາ</string> <string name="action_done">ສຳເລັດ</string> <string name="input_not_supported">ບໍ່ຮອງຮັບ</string> - <!--*******************-> + <!--******************* D2 Error Messages **********************--> <string name="login_error_null_pass">ບໍ່ມີລະຫັດຜ່ານ. ກະລຸນາໃສ່ລະຫັດຜ່ານ.</string> <string name="login_error_null_username">ບໍ່ມີຊື່ຜູ້ໃຊ້. ກະລຸນາປ້ອນຊື່ຜູ້ໃຊ້</string> - <string name="login_error_dhis_version">ຄອມພີວເຕີໜ່ວຍແມ່ກໍາລັງທໍາງານກັບລະບົບ DHIS2 ລຸ້ນສູງກ່ວາ 2.29. ກະລຸນາ ນໍາໃຊ້ລຸນທີ່ສູງກ່ວາ ຫຼື ນໍາໃຊ້ລະບົບທົດລອງແທນ</string> <string name="login_error_dhis_version_v2">ຄອມພິວເຕີໜ່ວຍແມ່ເຄື່ອງນີ້ກຳລັງໃຊ້ເວີຊັນ DHIS2 ທີ່ແຕກຕ່າງຈາກ%s . ອັບເດດລຸ່ນຂອງຄອມພິວເຕີເຄື່ອງແມ່ຂອງທ່ານ ຫຼື ຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ.</string> <string name="login_error_unsuccessful_response">ມີບາງສິ່ງບາງຢ່າງຜິດພາດ. ກະລຸນາກວດເບິ່ງທີ່ຢູ່ຂອງເຄື່ອງຄອມພິວເຕີໜ່ວຍແມ່, ຊື່ຜູ້ໃຊ້ ແລະ ລະຫັດຜ່ານວ່າຖືກຕ້ອງແລ້ວ ແລ້ວລອງໃໝ່ອີກຄັ້ງ.</string> <string name="login_error_error_response">ຂໍອາໄພ! ມີບາງຢ່າງລົ້ມເຫຼວໃນເຄື່ອງຄອມພິວເຕີໜ່ວຍແມ່.</string> @@ -128,7 +115,6 @@ <string name="error_access_keystore">ບໍ່ສາມາດເຂົ້າເຖິງທີ່ເກັບຂອງອຸປະກອນໄດ້.</string> <string name="error_create_existing_error">ການສ້າງຖືກຍົກເລີກ. ມີວັດຖຸຢູ່ແລ້ວ.</string> <string name="error_delete_non_existing_object">ຍົກເລິກການລົບແລ້ວ. ບໍ່ມີວັດຖຸຢູ່</string> - <string name="error_reserve_value_on_server">ພວກເຮົາບໍ່ສາມາດຈອງຄ່າສໍາລັບບັນທຶກເຫຼົ່ານີ້. ກະລຸນາຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ.</string> <string name="error_export_login">ກະລຸນາເຂົ້າສູ່ລະບົບເພື່ອສົ່ງອອກຖານຂໍ້ມູນ.</string> <string name="error_export_encrypted">ບໍ່ຮອງຮັບການສົ່ງອອກຖານຂໍ້ມູນທີ່ຖືກເຂົ້າລະຫັດ.</string> <string name="error_import_exist">ທ່ານກໍາລັງນໍາເຂົ້າຖານຂໍ້ມູນທີ່ມີຢູ່ແລ້ວ.</string> @@ -154,7 +140,6 @@ <string name="error_socket_timeout">ເຄື່ອງຄອມພິວເຕີໜ່ວຍແມ່ໃຊ້ເວລາຕອບສະໜອງດົນເກີນໄປ. ພວກເຮົາຍົກເລິກການຮ້ອງຂໍ</string> <string name="error_relationship_updated">ບໍ່ສາມາດອັບເດດຄວາມສຳພັນໄດ້.</string> <string name="error_too_many_periods">ຊ່ວງເວລາມີຫຼາຍເກີນໄປ</string> - <string name="error_url_not_found">ພວກເຮົາບໍ່ສາມາດຊອກຫາ URL ໄດ້. ກະລຸນາກວດສອບມັນ.</string> <string name="error_account_disabled">ບັນຊີຂອງທ່ານຖືກປິດການນຳໃຊ້ແລ້ວ. ຖ້ານີ້ແມ່ນຄວາມຜິດພາດ, ກະລຸນາຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ.</string> <string name="error_account_locked">ບັນຊີຜູ້ໃຊ້ຂອງທ່ານຖືກລັອກ. ຖ້າຫາກນີ້ແມ່ນຂໍ້ຜິດພາດ, ຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ.</string> <string name="error_set_value">ບໍ່ສາມາດຕັ້ງຄ່າໄດ້.</string> @@ -164,8 +149,11 @@ <string name="error_min_attributes">ຄຸນລັກສະນະບໍ່ພຽງພໍທີ່ຈະດໍາເນີນການຄົ້ນຫາ. ກະລຸນາປັບປຸງການຄົ້ນຫາຂອງທ່ານດ້ວຍຄຸນລັກສະນະເພີ່ມເຕີມ.</string> <string name="error_org_unit_scope">ການຄົ້ນຫາອອນລາຍໃຊ້ໄດ້ກັບຫົວຫນ່ວຍການຈັດຕັ້ງທີ່ຄົ້ນຫາຜູ້ໃຊ້ຂອງທ່ານເທົ່ານັ້ນ.</string> <string name="error_no_internet_connection">ທ່ານອອຟລາຍຢູ່. ເຊື່ອມຕໍ່ອິນເຕີເນັດ ແລະ ລອງໃໝ່ອີກຄັ້ງ</string> - <!--*******************-> + <!--******************* END OF D2 Error Messages **********************--> + <string name="age_or">OR</string> + <string name="cancel">ຍົກເລີກ</string> + <string name="ok">​ຕົກ​ລົງ</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-my/strings.xml b/commonskmm/src/commonMain/composeResources/values-my/strings.xml index 3f240d322a6..e4d17d0f0bd 100644 --- a/commonskmm/src/commonMain/composeResources/values-my/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-my/strings.xml @@ -4,9 +4,6 @@ <string name="error">အမှား</string> <string name="choose_date">ရက်စွဲ ကိုရွေးချယ်ပါ</string> <string name="required">ဖြည့်သွင်းရန်လိုအပ်သည်</string> - <string name="date">ရက်စွဲ</string> - <string name="hint_year">နှစ်များ</string> - <string name="hint_month">လများ</string> <string name="due_date">Дата выполнения</string> <string name="complete">ပြည့်စုံသည်။</string> <string name="action_close">ပိတ်သည်</string> @@ -18,8 +15,7 @@ <string name="input_action_cancel">ပယ်ဖျက်သည်</string> <string name="no_results_found">No results found</string> <string name="action_done">Done</string> - <!--*******************-> - END OF D2 Error Messages - **********************--> + <string name="cancel">ပယ်ဖျက်သည်</string> + <string name="ok">လက်ခံသည်</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-nb/strings.xml b/commonskmm/src/commonMain/composeResources/values-nb/strings.xml index 368486d6897..fc34c808707 100644 --- a/commonskmm/src/commonMain/composeResources/values-nb/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-nb/strings.xml @@ -18,15 +18,9 @@ <string name="choose_ou">Velg organisasjonsenhet</string> <string name="field_is_mandatory">Dette feltet er obligatorisk</string> <string name="required">Påkrevd</string> - <string name="date">Dato</string> - <string name="hint_year">År</string> - <string name="hint_month">Måneder</string> - <string name="hint_day">Dager</string> <string name="polygon">Polygon</string> <string name="latitude">Breddegrad</string> <string name="longitude">Lengdegrad</string> - <string name="coordinates_error">Koordinatverdiene er ikke gyldige</string> - <string name="polygon_captured">Polygon oppfanget</string> <string name="enter_value">Legg inn verdi</string> <string name="enter_url">Legg inn URL</string> <string name="enter_email">Legg inn e-post</string> @@ -44,12 +38,10 @@ <string name="complete">Fullfør</string> <string name="discard_changes">Forkast endringer</string> <string name="saved">Lagret!</string> - <string name="save_anyway">Lagre likevel</string> <string name="keep_editing">Fortsett å rediger</string> <string name="share">Del</string> <string name="action_close">Lukk</string> <string name="copied_text">Kopiert</string> - <string name="empty_description">Ingen info for dette feltet</string> <string name="warning_error_on_complete_title">Sjekk dette!</string> <string name="enrollment_single_section_label">Attributter - %s</string> <string name="tei_coordinates">Koordinater for</string> @@ -75,10 +67,12 @@ <string name="no_results_found">Ingen resultater funnet</string> <string name="action_done">Fullfør</string> <string name="input_not_supported">Ikke støttet</string> - <string name="login_error_dhis_version">Denne serveren kjører en dhis versjon som er forskjellig fra 2.29. Oppdater din serverversjon eller bruk testmiljøet for å fortsette.</string> <string name="online_search_parsing_error">Feil under analyse av resultater</string> - <!--*******************-> + <!--******************* END OF D2 Error Messages **********************--> + <string name="age_or">ELLER</string> + <string name="cancel">Avbryt</string> + <string name="ok">OK</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-ne/strings.xml b/commonskmm/src/commonMain/composeResources/values-ne/strings.xml index 67d960618f7..2829599ac19 100644 --- a/commonskmm/src/commonMain/composeResources/values-ne/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-ne/strings.xml @@ -1,11 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <string name="date">मिति</string> <string name="input_action_accept">स्वीकार</string> <string name="input_action_cancel">रद्द गर्नुहोस्</string> <string name="no_results_found">कुनै पनि नतिजा भेटिएन</string> - <!--*******************-> - END OF D2 Error Messages - **********************--> - -</resources> \ No newline at end of file + <string name="cancel">रद्द गर्नुहोस्</string> + </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-nl/strings.xml b/commonskmm/src/commonMain/composeResources/values-nl/strings.xml index 206c502aa19..ef3fc47b3f1 100644 --- a/commonskmm/src/commonMain/composeResources/values-nl/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-nl/strings.xml @@ -23,16 +23,9 @@ <string name="conf_error_value_option_set">Waarde voor veld %s behoort niet tot de optieset in %s</string> <string name="field_is_mandatory">Dit veld is verplicht</string> <string name="required">Vereist</string> - <string name="date">Datum</string> - <string name="hint_year">Jaren</string> - <string name="hint_month">Maanden</string> - <string name="hint_day">Dagen</string> - <string name="wrong_date_format">%s kan niet worden verwerkt als een datum</string> <string name="polygon">Veelhoek</string> <string name="latitude">Breedtegraad</string> <string name="longitude">Lengtegraad</string> - <string name="coordinates_error">Coördinatenwaarden zijn niet geldig</string> - <string name="polygon_captured">Polygoon vastgelegd</string> <string name="enter_value">Voer waarde in</string> <string name="enter_url">URL invoeren</string> <string name="enter_email">Voer email in</string> @@ -47,27 +40,18 @@ <string name="enter_long_text">Voer lange tekst in</string> <string name="enter_text">Tekst invoeren</string> <string name="due_date">Deadline</string> - <string name="mandatory_field">Verplicht veld</string> - <string name="form_latitude_prefix">Breedte:</string> - <string name="form_longitude_prefix">Lang:</string> <string name="not_saved">Niet opgeslagen</string> <string name="review">Beoordeling</string> <string name="complete">Compleet</string> <string name="discard_changes">Veranderingen ongedaan maken</string> <string name="saved">Opgeslagen!</string> <string name="not_now">Niet nu</string> - <string name="save_anyway">Toch opslaan</string> <string name="keep_editing">Blijf bewerken</string> <string name="event_can_be_completed">Wilt u dit formulier als voltooid markeren?</string> <string name="discard_go_back">Als u nu afsluit, wordt alle informatie in het formulier weggegooid.</string> - <string name="field_errors_not_saved">Sommige velden bevatten fouten en worden niet opgeslagen.</string> - <string name="fields_mandatory_missing">Sommige verplichte velden ontbreken en het formulier kan niet worden opgeslagen.</string> <string name="share">Deel</string> <string name="action_close">Sluit</string> - <string name="program_rules_loop_warning_title">Waarschuwing programmaregels</string> - <string name="program_rules_loop_warning_message">Er is een configuratieprobleem dat een lus in de regels veroorzaakt. Neem contact op met uw beheerder.</string> <string name="copied_text">Gekopieerd</string> - <string name="empty_description">Geen info voor dit veld</string> <string name="take_photo">Neem foto</string> <string name="warning_error_on_complete_title">Check dit!</string> <string name="action_do_not_show_again">Niet meer laten zien</string> @@ -91,7 +75,6 @@ <string name="tei_coordinates">Coördinaten voor de</string> <string name="no_reserved_values">Er zijn geen gereserveerde waarden meer. Neem contact op met uw systeembeheerder</string> <string name="incident_date">Incident datum</string> - <string name="location_permission_denied">De locatietoestemming is nodig voor het vastleggen van coördinaten. Schakel ze alstublieft in de applicatie-instellingen in</string> <string name="open_with">Openen met</string> <string name="no_option_found">Geen optie gevonden</string> <string name="download">Downloaden</string> @@ -109,12 +92,11 @@ <string name="no_results_found">Geen resultaten gevonden</string> <string name="action_done">Klaar</string> <string name="input_not_supported">Niet ondersteund</string> - <!--*******************-> + <!--******************* D2 Error Messages **********************--> <string name="login_error_null_pass">Wachtwoord ontbreekt. Voer wachtwoord in alstublieft.</string> <string name="login_error_null_username">Gebruikersnaam ontbreekt. Voer gebruikersnaam in.</string> - <string name="login_error_dhis_version">Deze server draait een andere versie dan 2.29. Werk uw serverversie bij of gebruik de testomgeving om verder te gaan.</string> <string name="login_error_dhis_version_v2">Deze server draait een andere DHIS2-versie dan %s. Werk uw serverversie bij of neem contact op met uw beheerder.</string> <string name="login_error_unsuccessful_response">Er is iets fout gegaan. Controleer of de server-URL, gebruikersnaam en wachtwoord juist zijn en probeer het opnieuw.</string> <string name="login_error_error_response">Sorry! Er is iets misgegaan aan de serverzijde.</string> @@ -135,7 +117,6 @@ <string name="error_create_existing_error">Creatie afgebroken. Het object bestaat al.</string> <string name="error_delete_non_existing_object">Verwijdering afgebroken. Het voorwerp bestaat niet.</string> <string name="error_instance_keystore">Kan sleutelarchief niet instantiëren.</string> - <string name="error_reserve_value_on_server">We konden geen waarden voor deze plaat reserveren. Neem contact op met uw beheerder.</string> <string name="error_export_login">Log in om de database te exporteren.</string> <string name="error_export_encrypted">Het exporteren van een versleutelde database wordt niet ondersteund.</string> <string name="error_import_exist">U importeert een reeds bestaande database.</string> @@ -162,7 +143,6 @@ <string name="error_socket_timeout">De server nam te veel tijd om te reageren. We hebben het verzoek geannuleerd.</string> <string name="error_relationship_updated">De relatie kan niet worden bijgewerkt.</string> <string name="error_too_many_periods">Er zijn te veel periodes.</string> - <string name="error_url_not_found">We konden de URL niet vinden. Controleer het alstublieft.</string> <string name="error_account_disabled">Uw gebruikersaccount is uitgeschakeld. Neem contact op met uw beheerder als dit een fout is.</string> <string name="error_account_locked">Uw gebruikersaccount is vergrendeld. Neem contact op met uw beheerder als dit een fout is.</string> <string name="error_set_value">De waarde kon niet worden ingesteld.</string> @@ -172,8 +152,7 @@ <string name="error_min_attributes">Er zijn niet genoeg attributen om de zoekopdracht uit te voeren. Verfijn uw zoekopdracht met meer attributen.</string> <string name="error_org_unit_scope">Online zoeken is alleen beschikbaar voor uw organisatie-eenheden voor het zoeken van gebruikers.</string> <string name="error_invalid_characters">Er zijn ongeldige tekens in de vraag. Vraag de beheerder om de serverconfiguratie te verifiëren (relaxedQueryChars,...).</string> - <!--*******************-> - END OF D2 Error Messages - **********************--> + <string name="cancel">Annuleren</string> + <string name="ok">OK</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-or/strings.xml b/commonskmm/src/commonMain/composeResources/values-or/strings.xml index f6b29d4ee0f..f89310adafb 100644 --- a/commonskmm/src/commonMain/composeResources/values-or/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-or/strings.xml @@ -15,8 +15,4 @@ <string name="input_coordinate_latitude">ଅକ୍ଷାଂଶ</string> <string name="input_coordinate_longitude">ଦ୍ରାଘିମା</string> <string name="action_done">ହୋଇଗଲା</string> - <!--*******************-> - END OF D2 Error Messages - **********************--> - -</resources> \ No newline at end of file + </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-prs/strings.xml b/commonskmm/src/commonMain/composeResources/values-prs/strings.xml index 385fef3c969..e8ffe608337 100644 --- a/commonskmm/src/commonMain/composeResources/values-prs/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-prs/strings.xml @@ -3,10 +3,6 @@ <string name="invalid_integer">رقم باید کامل باشد</string> <string name="error">خطا</string> <string name="required">ضروری</string> - <string name="date">تاریخ</string> - <string name="hint_year">سالانه</string> - <string name="hint_month">ماه ها</string> - <string name="hint_day">روزها</string> <string name="polygon">چند ضلعی</string> <string name="latitude">عرض البلد</string> <string name="longitude">طول البلد</string> @@ -27,8 +23,11 @@ <string name="input_coordinate_longitude">طول البلد</string> <string name="no_results_found">هیج نتیجه ی یافت نشد</string> <string name="action_done">انجام شد</string> - <!--*******************-> + <!--******************* END OF D2 Error Messages **********************--> + <string name="age_or">یا</string> + <string name="cancel">انصراف</string> + <string name="ok">تأیید</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-ps/strings.xml b/commonskmm/src/commonMain/composeResources/values-ps/strings.xml index 2b86d6ececd..d33f57f12c1 100644 --- a/commonskmm/src/commonMain/composeResources/values-ps/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-ps/strings.xml @@ -3,10 +3,6 @@ <string name="invalid_integer">ارقام باید صحیح عدد وي</string> <string name="error">تېروته</string> <string name="required">اړین دي</string> - <string name="date">نېټه</string> - <string name="hint_year">کلونه</string> - <string name="hint_month">میاشت</string> - <string name="hint_day">ورځې</string> <string name="latitude">لېټېټيوډ</string> <string name="longitude">لانګېټيوډ</string> <string name="due_date">ټاکلې نېټه</string> @@ -24,8 +20,7 @@ <string name="input_coordinate_longitude">لانګېټيوډ</string> <string name="no_results_found">هېڅ پایله ترلاسه نه شوه</string> <string name="action_done">ترسره شو</string> - <!--*******************-> - END OF D2 Error Messages - **********************--> + <string name="cancel">رد یې کړئ [ ژباړه ـ ردول ]</string> + <string name="ok">سم دی</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-pt-rBR/strings.xml b/commonskmm/src/commonMain/composeResources/values-pt-rBR/strings.xml index 86e2dbfc597..95f522f9084 100644 --- a/commonskmm/src/commonMain/composeResources/values-pt-rBR/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-pt-rBR/strings.xml @@ -3,14 +3,9 @@ <string name="invalid_integer">Valor deve ser um número inteiro</string> <string name="error">Erro</string> <string name="required">Exigido</string> - <string name="date">Data</string> - <string name="hint_year">Anos</string> - <string name="hint_month">Meses</string> - <string name="hint_day">Dias</string> <string name="polygon">Poligono</string> <string name="latitude">Latitude</string> <string name="longitude">Longitude</string> - <string name="polygon_captured">Polígono capturado</string> <string name="due_date">Data de vencimento</string> <string name="complete">Completo</string> <string name="share">Partilhar</string> @@ -29,8 +24,7 @@ <string name="input_coordinate_longitude">Longitude</string> <string name="no_results_found">Nenhum resultado encontrado</string> <string name="action_done">Concluído</string> - <!--*******************-> - END OF D2 Error Messages - **********************--> + <string name="cancel">Cancelar</string> + <string name="ok">Aprovado</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-pt/strings.xml b/commonskmm/src/commonMain/composeResources/values-pt/strings.xml index b40e2d571b2..c2498ba2970 100644 --- a/commonskmm/src/commonMain/composeResources/values-pt/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-pt/strings.xml @@ -24,16 +24,9 @@ <string name="field_is_mandatory">Este campo é obrigatório</string> <string name="missing_warning_fields_completed_events">Tem algumas mensagens de aviso.</string> <string name="required">Obrigatório</string> - <string name="date">Encontro</string> - <string name="hint_year">Anos</string> - <string name="hint_month">Meses</string> - <string name="hint_day">Dias</string> - <string name="wrong_date_format">%s não pode ser analisado como uma data</string> <string name="polygon">Poligono</string> <string name="latitude">Latitude</string> <string name="longitude">Longitude</string> - <string name="coordinates_error">Os valores das coordenadas não são válidos</string> - <string name="polygon_captured">Polígono capturado</string> <string name="enter_value">Digite o valor</string> <string name="enter_url">Digite o URL</string> <string name="enter_email">Digite o email</string> @@ -48,27 +41,18 @@ <string name="enter_long_text">Inserir texto longo</string> <string name="enter_text">Inserir texto</string> <string name="due_date">Data de Vencimento</string> - <string name="mandatory_field">Campo obrigatório</string> - <string name="form_latitude_prefix">Latitude:</string> - <string name="form_longitude_prefix">Longitude:</string> <string name="not_saved"> Não guardado</string> <string name="review">Revisão</string> <string name="complete">Concluir</string> <string name="discard_changes">Descartar alterações</string> <string name="saved">Gravado!</string> <string name="not_now">Agora não</string> - <string name="save_anyway">Salve mesmo assim</string> <string name="keep_editing">Continue a editar</string> <string name="event_can_be_completed">Deseja marcar este formulário como completo?</string> <string name="discard_go_back">Se sair agora, todas as informações do formulário serão descartadas.</string> - <string name="field_errors_not_saved">Alguns campos apresentam erros e não são guardados.</string> - <string name="fields_mandatory_missing">Alguns campos obrigatórios estão em falta e o formulário não pode ser guardado.</string> <string name="share">Partilhar</string> <string name="action_close">Fechar</string> - <string name="program_rules_loop_warning_title">Aviso de regras do programa</string> - <string name="program_rules_loop_warning_message">Existe um problema de configuração que está a provocar um ciclo nas regras. Contacte o seu administrador.</string> <string name="copied_text">Copiado</string> - <string name="empty_description">Nenhuma informação para este campo</string> <string name="take_photo"> Tirar fotografia</string> <string name="warning_error_on_complete_title">Verifique isso!</string> <string name="action_do_not_show_again">Não mostrar novamente</string> @@ -92,13 +76,10 @@ <string name="tei_coordinates">Coordenadas para o</string> <string name="no_reserved_values">Não há mais valores reservados. Entre em contato com o administrador do sistema</string> <string name="incident_date">Data do incidente</string> - <string name="location_permission_denied">A permissão de localização é necessária para captar as coordenadas. Por favor, ative-a nas definições do aplicativo</string> <string name="open_with">Abrir com</string> <string name="no_option_found">Nenhuma opção encontrada</string> <string name="download">Baixar</string> <string name="scan">Digitalizar</string> - <string name="qr_code">Código QR</string> - <string name="bar_code">Código de barras</string> <string name="add_location">Adicionar localização</string> <string name="form_without_fields">Este formulário não tem campos configurados</string> <string name="event_details_section_title">%s detalhes</string> @@ -124,12 +105,11 @@ <string name="no_results_found">Nenhum resultado encontrado</string> <string name="action_done">Feito</string> <string name="input_not_supported">Não suportado</string> - <!--*******************-> + <!--******************* D2 Error Messages **********************--> <string name="login_error_null_pass">A palavra-passe está em falta. Introduza a palavra-passe.</string> <string name="login_error_null_username">O nome de utilizador está em falta. Por favor, introduza o nome de utilizador.</string> - <string name="login_error_dhis_version">Este servidor está executando uma versão dhis diferente de 2.29. Atualize a versão do servidor ou use o ambiente de teste para continuar.</string> <string name="login_error_dhis_version_v2">Este servidor está a executar uma versão do DHIS2 diferente de %s. Actualize a versão do seu servidor ou contacte o seu administrador.</string> <string name="login_error_unsuccessful_response">Algo correu mal. Verifique se o URL do servidor, o nome de utilizador e a palavra-passe estão correctos e tente novamente.</string> <string name="login_error_error_response">Desculpe! Algo falhou no lado do servidor.</string> @@ -150,7 +130,6 @@ <string name="error_create_existing_error">Criação abortada. O objeto já existe.</string> <string name="error_delete_non_existing_object">Eliminação abortada. O objeto não existe.</string> <string name="error_instance_keystore">Não foi possível instanciar o keystore.</string> - <string name="error_reserve_value_on_server">Não foi possível reservar valores para este registo. Por favor, contacte o seu administrador.</string> <string name="error_export_login">Inicie sessão para exportar a base de dados.</string> <string name="error_export_encrypted">A exportação de uma base de dados encriptada não é suportada.</string> <string name="error_import_exist">Está a importar uma base de dados já existente.</string> @@ -177,7 +156,6 @@ <string name="error_socket_timeout"> O servidor demorou demasiado tempo a responder. Cancelamos a requisição.</string> <string name="error_relationship_updated">O relacionamento não pode ser actualizado.</string> <string name="error_too_many_periods">Existem muitos períodos.</string> - <string name="error_url_not_found"> Não foi possível encontrar a URL. Por favor, verifique-o.</string> <string name="error_account_disabled"> A sua conta de utilizador foi desactivada. Se isto for um erro, contacte o seu administrador.</string> <string name="error_account_locked"> A sua conta de utilizador está bloqueada. Se isto for um erro, contacte o seu administrador.</string> <string name="error_set_value">O valor não pode ser definido.</string> @@ -189,8 +167,11 @@ <string name="error_invalid_characters">Existem caracteres inválidos na consulta. Por favor, peça ao administrador para verificar a configuração do servidor (relaxedQueryChars,...).</string> <string name="error_server_unavailable">O servidor está indisponível do momento. Tente novamente mais tarde.</string> <string name="error_no_internet_connection">Está off-line. Ligue-se à Internet e tente novamente.</string> - <!--*******************-> + <!--******************* END OF D2 Error Messages **********************--> + <string name="age_or">OR</string> + <string name="cancel">Cancelar</string> + <string name="ok">OK</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-ro/strings.xml b/commonskmm/src/commonMain/composeResources/values-ro/strings.xml index 8e2f5f540a6..349eb09ecb6 100644 --- a/commonskmm/src/commonMain/composeResources/values-ro/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-ro/strings.xml @@ -1,11 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <resources> <string name="error">Eroare</string> - <string name="date">Data</string> - <string name="hint_year">Ani</string> - <string name="hint_month">Luni</string> - <string name="hint_day">Zile</string> - <string name="save_anyway">Salvare oricum</string> <string name="share">Partajare</string> <string name="action_close">Închidere</string> <string name="incident_date">Data incidentului</string> @@ -13,8 +8,5 @@ <string name="input_action_cancel">Anulare</string> <string name="no_results_found">Nu au fost găsite rezultate</string> <string name="action_done">Terminat</string> - <!--*******************-> - END OF D2 Error Messages - **********************--> - -</resources> \ No newline at end of file + <string name="cancel">Anulare</string> + </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-ru/strings.xml b/commonskmm/src/commonMain/composeResources/values-ru/strings.xml index b27343b62c4..5f8be6e2bb1 100644 --- a/commonskmm/src/commonMain/composeResources/values-ru/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-ru/strings.xml @@ -23,15 +23,9 @@ <string name="missing_warning_fields_completed_events">У вас есть несколько предупреждающих сообщений.</string> <string name="missing_warning_fields_events">У Вас есть несколько предупреждающих сообщений.\nХотите ли Вы отметить эту форму как завершенную\?</string> <string name="required">Обязательный</string> - <string name="date">Дата</string> - <string name="hint_year">Годы</string> - <string name="hint_month">Месяцы</string> - <string name="hint_day">Дни</string> <string name="polygon">Полигон</string> <string name="latitude">Широта</string> <string name="longitude">Долгота</string> - <string name="coordinates_error">Значения координат не действительны</string> - <string name="polygon_captured">Полигон зафиксирован</string> <string name="enter_value">Введите значение</string> <string name="enter_url">Введите url</string> <string name="enter_email">Введите электронную почту</string> @@ -46,7 +40,6 @@ <string name="enter_long_text">Ввод длинного текста</string> <string name="enter_text">Введите текст</string> <string name="due_date">Дата выполнения</string> - <string name="mandatory_field">Обязательное поле</string> <string name="not_saved">Не сохранено</string> <string name="review">Просмотр</string> <string name="complete">Завершить</string> @@ -56,21 +49,14 @@ <string name="missing_error_fields_events">В некоторых полях есть ошибки, и они не сохраняются. \nВы хотите просмотреть форму\?</string> <string name="review_message">Некоторые поля требуют Вашего внимания.\nХотите просмотреть форму\?</string> <string name="not_now">Не сейчас</string> - <string name="save_anyway">Сохранить в любом случае</string> <string name="keep_editing">Продолжить редактирование</string> <string name="event_can_be_completed">Хотите ли Вы отметить эту форму как завершенную?</string> <string name="discard_go_back">Если Вы выйдете сейчас, вся информация в форме будет удалена.</string> <string name="field_errors_not_saved_discard">Некоторые поля содержат ошибки, и они не сохраняются. \nЕсли Вы выйдете сейчас, изменения будут отменены.</string> - <string name="field_errors_not_saved">Некоторые поля содержат ошибки, и они не сохраняются.</string> - <string name="fields_mandatory_missing">Некоторые обязательные поля отсутствуют, и форму невозможно сохранить.</string> - <string name="fields_mandatory_missing_discard">Некоторые обязательные поля отсутствуют, и форма не может быть сохранена. \nЕсли вы выйдете сейчас, изменения будут отменены.</string> <string name="share">Поделиться</string> <string name="camera_permission_denied">Разрешение камеры запрещено.\nЧтобы использовать эту функцию, ее необходимо разрешить.</string> <string name="action_close">Закрыть</string> - <string name="program_rules_loop_warning_title">Предупреждение о правилах программы</string> - <string name="program_rules_loop_warning_message">Существует проблема конфигурации, вызывающая зацикливание правил. Обратитесь к администратору.</string> <string name="copied_text">Скопировано</string> - <string name="empty_description">Нет информации для этого поля</string> <string name="take_photo">Сделать фото</string> <string name="from_gallery_v2">Из галереи</string> <string name="warning_error_on_complete_title">Проверьте это!</string> @@ -94,13 +80,10 @@ <string name="tei_coordinates">Координаты для</string> <string name="no_reserved_values">Больше нет зарезервированных значений. Обратитесь к системному администратору</string> <string name="incident_date">Дата происшествия</string> - <string name="location_permission_denied">Для захвата координат необходимо разрешение на определение местоположения. Пожалуйста, включите их в настройках приложения</string> <string name="open_with">Открыть с помощью</string> <string name="no_option_found">Опции не найдены</string> <string name="download">Скачать</string> <string name="scan">Сканировать</string> - <string name="qr_code">QR-код</string> - <string name="bar_code">Штрих-код</string> <string name="add_location">Добавить локацию</string> <string name="form_without_fields">В этой форме нет настроенных полей</string> <string name="event_details_section_title">%s деталей</string> @@ -128,12 +111,11 @@ <string name="search_to_find_more">Искать, чтобы найти больше</string> <string name="action_done">Готово</string> <string name="input_not_supported">Не поддерживается</string> - <!--*******************-> + <!--******************* D2 Error Messages **********************--> <string name="login_error_null_pass">Пароль отсутствует. Пожалуйста, введите пароль.</string> <string name="login_error_null_username">Имя пользователя отсутствует. Пожалуйста, введите имя пользователя.</string> - <string name="login_error_dhis_version">На этом сервере установлена версия dhis, отличная от 2.29. Обновите версию своего сервера или используйте тестовую среду для продолжения работы.</string> <string name="login_error_dhis_version_v2">На этом сервере установлена версия DHIS2, отличная от %s. Обновите версию сервера или обратитесь к администратору.</string> <string name="login_error_unsuccessful_response">Что-то пошло не так. Пожалуйста, проверьте правильность URL-адреса сервера, имени пользователя и пароля и повторите попытку.</string> <string name="login_error_error_response">Извините! Что-то не получилось на стороне сервера.</string> @@ -152,7 +134,6 @@ <string name="error_access_keystore">Невозможно получить доступ к хранилищу ключей устройства.</string> <string name="error_create_existing_error">Создание прервано. Объект уже существует.</string> <string name="error_delete_non_existing_object">Удаление прервано. Объект не существует.</string> - <string name="error_reserve_value_on_server">Мы не смогли зарезервировать значения для этих записей. Пожалуйста, свяжитесь с вашим администратором.</string> <string name="error_export_login">Пожалуйста, войдите в систему, чтобы экспортировать базу данных.</string> <string name="error_export_encrypted">Экспорт зашифрованной базы данных не поддерживается.</string> <string name="error_import_exist">Вы импортируете уже существующую базу данных.</string> @@ -171,7 +152,6 @@ <string name="error_socket_timeout">Серверу потребовалось слишком много времени для ответа. Мы отменили запрос. </string> <string name="error_relationship_updated">Связь не может быть обновлена.</string> <string name="error_too_many_periods">Слишком много периодов.</string> - <string name="error_url_not_found">Мы не смогли найти URL-адрес. Пожалуйста, проверьте его.</string> <string name="error_account_disabled">Ваша учетная запись пользователя была отключена. Если это ошибка, обратитесь к своему администратору.</string> <string name="error_account_locked">Ваша учетная запись заблокирована. Если это ошибка, обратитесь к своему администратору.</string> <string name="error_set_value">Значение не удалось установить.</string> @@ -180,8 +160,13 @@ <string name="error_org_unit_scope">Онлайн-поиск доступен только для подразделений вашей организации по поиску пользователей.</string> <string name="error_server_unavailable">Сервер в настоящее время недоступен. Повторите попытку позже.</string> <string name="error_no_internet_connection">Вы находитесь оффлайн. Подключитесь к Интернету и повторите попытку.</string> - <!--*******************-> + <!--******************* END OF D2 Error Messages **********************--> + <string name="age_or">ИЛИ</string> + <string name="age">ВОЗРАСТ</string> + <string name="date_of_birth">ДАТА РОЖДЕНИЯ</string> + <string name="cancel">Отменить</string> + <string name="ok">ОК</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-si/strings.xml b/commonskmm/src/commonMain/composeResources/values-si/strings.xml index fdbec3574f9..21aa1406a9e 100644 --- a/commonskmm/src/commonMain/composeResources/values-si/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-si/strings.xml @@ -1,18 +1,10 @@ <?xml version="1.0" encoding="utf-8"?> <resources> <string name="error">දෝෂය</string> - <string name="date">දිනය</string> - <string name="hint_year">අවුරුදු</string> - <string name="hint_month">මාස</string> - <string name="hint_day">දින</string> <string name="discard_changes">වෙනස් කිරීම් ඉවතලන්න</string> <string name="action_close">වසන්න</string> <string name="download">බාගත කරන්න</string> <string name="input_age_or">හෝ</string> <string name="input_action_accept">පිළිගන්න</string> <string name="action_done">නිම කළා</string> - <!--*******************-> - END OF D2 Error Messages - **********************--> - </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-sv/strings.xml b/commonskmm/src/commonMain/composeResources/values-sv/strings.xml index 7dfff1d44f2..798704fbceb 100644 --- a/commonskmm/src/commonMain/composeResources/values-sv/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-sv/strings.xml @@ -11,10 +11,6 @@ <string name="error">Fel</string> <string name="choose_date">Välj datum</string> <string name="required">Nödvändig</string> - <string name="date">Datum</string> - <string name="hint_year">År</string> - <string name="hint_month">Månader</string> - <string name="hint_day">Dagar</string> <string name="latitude">Latitud</string> <string name="longitude">Longitud</string> <string name="enter_positive_integer_or_zero">Ange ett positivt heltal eller noll.</string> @@ -43,10 +39,8 @@ <string name="input_coordinate_longitude">Longitud</string> <string name="add_file">Lägg till fil</string> <string name="no_results_found">Inga resultat hittades</string> - <string name="login_error_dhis_version">Den här servern kör en dhis-version som skiljer sig från 2.29. Uppdatera din serverversion eller använd testmiljön för att fortsätta.</string> <string name="online_search_parsing_error">Fel vid tolkning av resultat</string> - <!--*******************-> - END OF D2 Error Messages - **********************--> + <string name="cancel">Avbryt</string> + <string name="ok">ok</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-tet/strings.xml b/commonskmm/src/commonMain/composeResources/values-tet/strings.xml index 548c1951621..066de3d02bd 100644 --- a/commonskmm/src/commonMain/composeResources/values-tet/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-tet/strings.xml @@ -2,16 +2,12 @@ <resources> <string name="error">Erru</string> <string name="required">Nesesáriu</string> - <string name="date">Data</string> - <string name="hint_year">Tinan</string> - <string name="hint_month">Fulan</string> <string name="complete">Kompletu</string> <string name="share">Partilla</string> <string name="action_close">Taka</string> <string name="download">Hatun</string> <string name="input_action_cancel">Kansela</string> - <!--*******************-> - END OF D2 Error Messages - **********************--> + <string name="cancel">Kansela</string> + <string name="ok">OK</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-tg/strings.xml b/commonskmm/src/commonMain/composeResources/values-tg/strings.xml index f1ff83d2524..921720cdddd 100644 --- a/commonskmm/src/commonMain/composeResources/values-tg/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-tg/strings.xml @@ -3,9 +3,6 @@ <string name="invalid_integer">Қимат бояд адади бутун бошад</string> <string name="error">Хатогӣ</string> <string name="required">Ҳатмӣ</string> - <string name="date">Сана</string> - <string name="hint_year">Солҳо</string> - <string name="hint_month">Моҳҳо</string> <string name="polygon">Бисёркунҷа</string> <string name="latitude">Тӯл</string> <string name="longitude">Арз</string> @@ -22,8 +19,11 @@ <string name="input_coordinate_latitude">Тӯл</string> <string name="input_coordinate_longitude">Арз</string> <string name="action_done">Иҷро шуд</string> - <!--*******************-> + <!--******************* END OF D2 Error Messages **********************--> + <string name="age_or">Ё</string> + <string name="cancel">Бекор кардан</string> + <string name="ok">OK</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-uk/strings.xml b/commonskmm/src/commonMain/composeResources/values-uk/strings.xml index 542f620c9cf..63e2e009d39 100644 --- a/commonskmm/src/commonMain/composeResources/values-uk/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-uk/strings.xml @@ -23,16 +23,9 @@ <string name="conf_error_value_option_set">Значення для поля %s не належить параметру, встановленому в %s</string> <string name="field_is_mandatory">Це поле обов\'язкове для заповнення</string> <string name="required">Обов\'язкове поле</string> - <string name="date">Дата</string> - <string name="hint_year">Роки</string> - <string name="hint_month">Місяці</string> - <string name="hint_day">Дні</string> - <string name="wrong_date_format">%s не можна проаналізувати як дату</string> <string name="polygon">Багатокутник</string> <string name="latitude">Широта</string> <string name="longitude">Довгота</string> - <string name="coordinates_error">Значення координат недійсні</string> - <string name="polygon_captured">Зафіксовано багатокутник</string> <string name="enter_value">Введіть значення</string> <string name="enter_url">Введіть URL-адресу</string> <string name="enter_email">Введіть адресу електронної пошти</string> @@ -47,9 +40,6 @@ <string name="enter_long_text">Введіть довгий текст</string> <string name="enter_text">Введіть текст</string> <string name="due_date">Запланована дата</string> - <string name="mandatory_field">Обов\'язкове поле</string> - <string name="form_latitude_prefix">Широта:</string> - <string name="form_longitude_prefix">Довгота:</string> <string name="not_saved">Не збережено</string> <string name="review">Перегляд</string> <string name="complete">Завершити</string> @@ -59,14 +49,9 @@ <string name="keep_editing">Продовжити редагування</string> <string name="event_can_be_completed">Ви бажаєте позначити цю форму як завершену?</string> <string name="discard_go_back">Якщо Ви зараз вийдете, уся інформація у формі буде відхилена.</string> - <string name="field_errors_not_saved">Деякі поля містять помилки і не були збережені.</string> - <string name="fields_mandatory_missing">Деякі обов’язкові поля не заповнено, і форму неможливо зберегти.</string> <string name="share">Поділитися</string> <string name="action_close">Закрити</string> - <string name="program_rules_loop_warning_title">Попередження про правила програми</string> - <string name="program_rules_loop_warning_message">Існує проблема конфігурації, яка спричиняє помилку у правилах. Зверніться до адміністратора.</string> <string name="copied_text">Скопійовано</string> - <string name="empty_description">Немає інформації для цього поля</string> <string name="take_photo">Зробити фото</string> <string name="warning_error_on_complete_title">Перевірте це!</string> <string name="action_do_not_show_again">Не показувати знову</string> @@ -91,7 +76,6 @@ <string name="no_reserved_values">Більше немає зарезервованих значень. Зверніться до свого системного адміністратора</string> <string name="incident_date">Дата інциденту</string> <string name="download">Завантажити</string> - <string name="qr_code">QR-код</string> <string name="add_location">Додати місцезнаходження</string> <string name="event_details_section_title">%s Деталі</string> <string name="org_unit">Організаційний підрозділ</string> @@ -112,12 +96,11 @@ <string name="no_results_found">Результатів не знайдено</string> <string name="action_done">Зроблено</string> <string name="input_not_supported">Не підтримується</string> - <!--*******************-> + <!--******************* D2 Error Messages **********************--> <string name="login_error_null_pass">Пароль відсутній. Будь ласка, введіть пароль.</string> <string name="login_error_null_username">Ім\'я користувача відсутнє. Будь ласка, введіть ім\'я користувача.</string> - <string name="login_error_dhis_version">На цьому сервері працює інша версія dhis, ніж 2.29. Щоб продовжити, оновіть версію серверу або скористайтеся середовищем тестування.</string> <string name="login_error_dhis_version_v2">На цьому сервері працює версія DHIS2, що відрізняється від %s. Оновіть версію серверу або сконтактуйте з системним адміністратором.</string> <string name="login_error_unsuccessful_response">Сталася помилка. Будь ласка, перевірте правильність URL-адреси серверу, імені користувача та пароля і повторіть спробу.</string> <string name="login_error_error_response">Вибачте! На сервері сталася помилка. </string> @@ -138,7 +121,6 @@ <string name="error_create_existing_error">Створення перервано. Об\'єкт вже існує.</string> <string name="error_delete_non_existing_object">Видалення перервано. Об\'єкт не існує.</string> <string name="error_instance_keystore">Не вдалося створити екземпляр сховища ключів.</string> - <string name="error_reserve_value_on_server">Ми не змогли зарезервувати значення для цих записів. Будь ласка, зверніться до свого адміністратора.</string> <string name="error_export_login">Увійдіть в систему, щоб експортувати базу даних.</string> <string name="error_export_encrypted">Експорт зашифрованої бази даних не підтримується.</string> <string name="error_import_exist">Ви імпортуєте вже існуючу базу даних.</string> @@ -165,7 +147,6 @@ <string name="error_socket_timeout">Сервер надто довго відповідав. Ми скасували запит.</string> <string name="error_relationship_updated">Зв\'язки не можна оновити.</string> <string name="error_too_many_periods">Надто багато періодів.</string> - <string name="error_url_not_found">Не вдалося знайти URL-адресу. Будь ласка, перевірте це.</string> <string name="error_account_disabled">Ваш обліковий запис користувача вимкнено. Якщо це помилка, зверніться до адміністратора.</string> <string name="error_account_locked">Ваш обліковий запис користувача заблоковано. Якщо це помилка, зверніться до адміністратора.</string> <string name="error_set_value">Не вдалося встановити значення.</string> @@ -175,8 +156,9 @@ <string name="error_min_attributes">Недостатньо атрибутів для виконання пошуку. Уточніть пошук за допомогою додаткових атрибутів.</string> <string name="error_org_unit_scope">Онлайн-пошук доступний лише для організаційних підрозділів користувача.</string> <string name="error_invalid_characters">У запиті є недійсні символи. Попросіть адміністратора перевірити конфігурацію сервера (relaxedQueryChars,...).</string> - <!--*******************-> - END OF D2 Error Messages - **********************--> + <string name="age">ВІК</string> + <string name="date_of_birth">ДАТА НАРОДЖЕННЯ</string> + <string name="cancel">Скасувати</string> + <string name="ok">ОК</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-ur/strings.xml b/commonskmm/src/commonMain/composeResources/values-ur/strings.xml index 2732a5b0808..8505ea64dce 100644 --- a/commonskmm/src/commonMain/composeResources/values-ur/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-ur/strings.xml @@ -3,13 +3,10 @@ <string name="invalid_integer">ویلیو انٹیجر ہونی چاہیے</string> <string name="error">غلطی</string> <string name="required">لازمی</string> - <string name="date">تاریخ</string> - <string name="hint_year">سال</string> - <string name="hint_month">مہینے</string> - <string name="hint_day">دن</string> <string name="polygon">کثیر زبان</string> <string name="latitude">طول</string> <string name="longitude">لمبائی</string> + <string name="polygon_captured">کثیر الاضلاع (حدود) محفوظ کر لی گئیں</string> <string name="due_date">اخری تاریخ</string> <string name="complete">مکمل</string> <string name="share">بانٹیں</string> @@ -26,8 +23,11 @@ <string name="input_coordinate_longitude">لمبائی</string> <string name="no_results_found">کوئی نتیجہ نہیں ملا</string> <string name="action_done">ہو گیا</string> - <!--*******************-> + <!--******************* END OF D2 Error Messages **********************--> + <string name="age_or">یا</string> + <string name="cancel">منسوخ</string> + <string name="ok">ٹھیک</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-uz-rUZ/strings.xml b/commonskmm/src/commonMain/composeResources/values-uz-rUZ/strings.xml index d72ae5ff712..846df44e6d8 100644 --- a/commonskmm/src/commonMain/composeResources/values-uz-rUZ/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-uz-rUZ/strings.xml @@ -18,15 +18,9 @@ <string name="choose_ou">Tashkiliy boʼlimni tanlang</string> <string name="field_is_mandatory">Maydon toʼldirilishi majburiy</string> <string name="required">Majburiy</string> - <string name="date">Sana</string> - <string name="hint_year">Yillar</string> - <string name="hint_month">Oylar</string> - <string name="hint_day">Kunlar</string> <string name="polygon">Poligon</string> <string name="latitude">Kenglik</string> <string name="longitude">Kenglik</string> - <string name="coordinates_error">Koordinata qiymatlari yaroqsiz</string> - <string name="polygon_captured">Koʼpburchak ushlandi</string> <string name="enter_value">Qiymatni tanlang</string> <string name="enter_url">URL ni tanlang</string> <string name="enter_email">ye-pochta manzilini kiriting</string> @@ -45,12 +39,10 @@ <string name="complete">Bajarildi</string> <string name="discard_changes">Oʼzgartirishlar bekor qilinsin</string> <string name="saved">Saqlandi!</string> - <string name="save_anyway">Nima boʼlganda ham saqlash</string> <string name="keep_editing">Tahrirni davom eting</string> <string name="share">Улашиш</string> <string name="action_close">Yopmoq</string> <string name="copied_text">Nusxa olindi</string> - <string name="empty_description">Ushbu maydon uchun maʼlumot yoʼq</string> <string name="warning_error_on_complete_title">Buni tekshiring!</string> <string name="enrollment_single_section_label">Аtribatlar - %s</string> <string name="tei_coordinates">Uchun koordinatalar</string> @@ -71,11 +63,9 @@ <string name="add_file">Fayl qoʼshish</string> <string name="add_image">Rasm qoʼshish</string> <string name="no_results_found">Hech qanday natija topilmadi</string> - <string name="login_error_dhis_version">Ushbu server 2.29 dan farqli versiyani ishlatmoqda. Server versiyasini yangilang yoki davom etish uchun sinov muddatidan foydalaning.</string> <string name="login_error_unsuccessful_response">Nimadir notoʼgʼri bajarildi. Server URL manzili, foydalanuvchi nomi va parol toʼgʼri ekanligini tekshiring va qaytadan urining.</string> <string name="online_search_parsing_error">Natijalarni tahlil qilishda xatolik yuz berdi</string> - <!--*******************-> - END OF D2 Error Messages - **********************--> + <string name="cancel">Бекор қилиш</string> + <string name="ok">OK</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-uz/strings.xml b/commonskmm/src/commonMain/composeResources/values-uz/strings.xml index 8f26c0404fd..af1e7cadc1c 100644 --- a/commonskmm/src/commonMain/composeResources/values-uz/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-uz/strings.xml @@ -18,15 +18,9 @@ <string name="choose_ou">Ташкилий бўлимни танланг</string> <string name="field_is_mandatory">Майдон тўлдирилиши мажбурий</string> <string name="required">Мажбурий</string> - <string name="date">Сана</string> - <string name="hint_year">Йиллар</string> - <string name="hint_month">Ойлар</string> - <string name="hint_day">Кунлар</string> <string name="polygon">Полигон</string> <string name="latitude">Кенглик</string> <string name="longitude">Узунлик</string> - <string name="coordinates_error">Координата қийматлари яроқсиз</string> - <string name="polygon_captured">Полигон белгиланди</string> <string name="enter_value">Қийматни танланг</string> <string name="enter_url">URL ни танланг</string> <string name="enter_email">е-почта манзилини киритинг</string> @@ -46,12 +40,10 @@ <string name="discard_changes">Ўзгартиришлар бекор қилинсин</string> <string name="saved">Сақланди!</string> <string name="not_now">Hozir emas</string> - <string name="save_anyway">Нима бўлганда ҳам сақлаш</string> <string name="keep_editing">Таҳрирни давом этинг</string> <string name="share">Улашиш</string> <string name="action_close">Ёпмоқ</string> <string name="copied_text">Нусха олинди</string> - <string name="empty_description">Ушбу майдон учун маълумот йўқ</string> <string name="take_photo">Суратга олиш</string> <string name="warning_error_on_complete_title">Буни текширинг!</string> <string name="enrollment_single_section_label">Атрибатлар - %s</string> @@ -59,7 +51,6 @@ <string name="no_reserved_values">Сақланган бошқа қийматлар йўқ. Тизим администраторига мурожаат қилинг.</string> <string name="incident_date">Ҳодиса санаси</string> <string name="download">Юклаш</string> - <string name="qr_code">QR код</string> <string name="add_location">Локация қўшинг</string> <string name="org_unit">Ташкилий бўлим</string> <string name="coordinates">Координаталар</string> @@ -81,10 +72,14 @@ <string name="no_results_found">Натижа йўқ</string> <string name="action_done">Бўлди</string> <string name="input_not_supported">Қўллаб қувватланмайди</string> - <string name="login_error_dhis_version">Ушбу сервер 2.29 дан фарқли версияни ишлатмоқда. Сервер версиясини янгиланг ёки давом этиш учун синов муддатидан фойдаланинг.</string> <string name="online_search_parsing_error">Натижаларни таҳлил қилишда хатолик юз берди</string> - <!--*******************-> + <!--******************* END OF D2 Error Messages **********************--> + <string name="age_or">ЁКИ</string> + <string name="age">ЁШИ</string> + <string name="date_of_birth">ТУҒИЛГАН КУНИ</string> + <string name="cancel">Рад этиш</string> + <string name="ok">ЯХШИ</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-vi/strings.xml b/commonskmm/src/commonMain/composeResources/values-vi/strings.xml index 5310653b42c..14e75b53b2a 100644 --- a/commonskmm/src/commonMain/composeResources/values-vi/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-vi/strings.xml @@ -25,16 +25,9 @@ <string name="missing_warning_fields_completed_events">Bạn có một số tin nhắn cảnh báo.</string> <string name="missing_warning_fields_events">Bạn có một số tin nhắn cảnh báo..\nBạn có muốn đánh dấu biểu nhập này là hoàn tất không\?</string> <string name="required">Bắt buộc</string> - <string name="date">Ngày</string> - <string name="hint_year">Năm</string> - <string name="hint_month">Tháng</string> - <string name="hint_day">Ngày</string> - <string name="wrong_date_format">%s không thể chuyển đổi dữ liệu Ngày</string> <string name="polygon">Đa giác</string> <string name="latitude">Vĩ độ</string> <string name="longitude">Kinh độ</string> - <string name="coordinates_error">Giá trị tọa độ không hợp lệ</string> - <string name="polygon_captured">Đã thêm bản đồ ranh giới</string> <string name="enter_value">Nhập giá trị</string> <string name="enter_url">Nhập đường dẫn liên kết</string> <string name="enter_email">Nhập email</string> @@ -49,9 +42,6 @@ <string name="enter_long_text">Nhập văn bản dài</string> <string name="enter_text">Nhập văn bản</string> <string name="due_date">Ngày đến hạn</string> - <string name="mandatory_field">Trường bắt buộc</string> - <string name="form_latitude_prefix">Vĩ độ: </string> - <string name="form_longitude_prefix">Kinh độ: </string> <string name="not_saved">Chưa lưu</string> <string name="review">Xem lại</string> <string name="complete">Hoàn tất</string> @@ -61,21 +51,14 @@ <string name="missing_error_fields_events">Một số trường dữ liệu có lỗi và chưa được lưu. \nBạn có muốn xem lại biểu nhập không\?</string> <string name="review_message">Một số trường dữ liệu cần bạn chú ý.\nBạn có muốn xem xét biểu nhập không\?</string> <string name="not_now">Không phải bây giờ</string> - <string name="save_anyway">Tiếp tục Lưu</string> <string name="keep_editing">Tiếp tục chỉnh sửa</string> <string name="event_can_be_completed">Bạn có muốn đánh dấu biểu nhập này là hoàn tất không?</string> <string name="discard_go_back">Nếu bạn tắt bây giờ, tất cả thông tin trong biểu nhập sẽ bị hủy bỏ.</string> <string name="field_errors_not_saved_discard">Một số trường dữ liệu có lỗi và chưa được lưu.. \nNếu bạn tắt bây giờ, tất cả thay đổi sẽ bị hủy bỏ.</string> - <string name="field_errors_not_saved">Một số trường dữ liệu bị lỗi và chưa được lưu</string> - <string name="fields_mandatory_missing">Thiếu một số trường dữ liệu bắt buộc và Không thể lưu biểu nhập.</string> - <string name="fields_mandatory_missing_discard">hiếu một số trường dữ liệu bắt buộc và không thể lưu biểu nhập. \nNếu bạn tắt bây giờ, tất cả thay đổi sẽ bị hủy bỏ..</string> <string name="share">Chia sẻ</string> <string name="camera_permission_denied">Quyền mở máy ảnh bị từ chối..\nBạn cần bật tính năng máy ảnh để sử dụng chức năng này.</string> <string name="action_close">Đóng</string> - <string name="program_rules_loop_warning_title">Cảnh báo quy tắc chương trình</string> - <string name="program_rules_loop_warning_message">Có một vấn đề cấu hình gây ra một vòng lặp trong các quy tắc chương trình. Hãy liên lạc với quản lý của bạn.</string> <string name="copied_text">Đã sao chép</string> - <string name="empty_description">Không có thông tin cho trường dữ liệu này</string> <string name="take_photo">Chụp ảnh</string> <string name="from_gallery_v2">Từ thư viện ảnh</string> <string name="warning_error_on_complete_title">Kiểm tra cái này!</string> @@ -100,13 +83,10 @@ <string name="tei_coordinates">Tọa độ của </string> <string name="no_reserved_values">Không có giá trị dành riêng nào nữa. Liên hệ với quản lý của bạn</string> <string name="incident_date">Ngày xảy ra</string> - <string name="location_permission_denied">Cần quyền định vị để thu thập vị trí. Xin vui lòng mở chúng trong cài đặt ứng dụng</string> <string name="open_with">Mở với</string> <string name="no_option_found">Không tìm thấy tùy chọn</string> <string name="download">Tải về</string> <string name="scan">Quét</string> - <string name="qr_code">Mã QR</string> - <string name="bar_code">Mã vạch</string> <string name="add_location">Thêm vị trí</string> <string name="form_without_fields">Biểu này không có trường dữ liệu được cấu hình</string> <string name="event_details_section_title">Chi tiết %s</string> @@ -137,12 +117,11 @@ <string name="search_to_find_more">Tìm kiếm để tìm thêm</string> <string name="action_done">Hoàn thành</string> <string name="input_not_supported">Không được hỗ trợ</string> - <!--*******************-> + <!--******************* D2 Error Messages **********************--> <string name="login_error_null_pass">Thiếu mật khẩu. Xin vui lòng nhập mật khẩu</string> <string name="login_error_null_username">Thiếu tên đăng nhập. Xin vui lòng nhập tên đăng nhập.</string> - <string name="login_error_dhis_version">Máy chủ này đang chạy phiên bản dhis khác với phiên bản 2.29. Hãy cập nhật phiên bản máy chủ của bạn hoặc sử dụng môi trường thực nghiệm để tiếp tục.</string> <string name="login_error_dhis_version_v2">Máy chủ này đang chạy phiên bản DHIS2 khác với %s. Vui lòng cập nhật phiên bản máy chủ của bạn hoặc liên hệ quản lý.</string> <string name="login_error_unsuccessful_response">Có gì đó không đúng. Vui lòng kiểm tra đường dẫn liên kết đến máy chủ, tên đăng nhập, mật khẩu và thử lại.</string> <string name="login_error_error_response">Rất tiếc! Có lỗi gì đó ở phía máy chủ</string> @@ -163,7 +142,6 @@ <string name="error_create_existing_error">Không thể tạo. Đối tượng đang tồn tại.</string> <string name="error_delete_non_existing_object">Xóa bị từ chối. Đối tượng không tồn tại</string> <string name="error_instance_keystore">Không thể tạo kho khóa</string> - <string name="error_reserve_value_on_server">Chúng ta không thể đặt trước giá trị cho các dữ liệu này. Vui lòng liên hệ quản lý của bạn. </string> <string name="error_export_login">Vui lòng đăng nhập để xuất cơ sở dữ liệu.</string> <string name="error_export_encrypted">Xuất dữ liệu mã hóa không hỗ trợ</string> <string name="error_import_exist">Bạn đang nhập cơ sở dữ liệu đang tồn tại</string> @@ -190,7 +168,6 @@ <string name="error_socket_timeout">Máy chủ mất quá nhiều thời gian để trả lời. Chúng tôi đã hủy yêu cầu.</string> <string name="error_relationship_updated">Mối quan hệ không thể cập nhật.</string> <string name="error_too_many_periods">Có quá nhiều thời điểm</string> - <string name="error_url_not_found">Chúng tôi không thể tìm thấy đường dẫn liên kết. Vui lòng kiểm tra lại.</string> <string name="error_account_disabled">Tài khoảng của bạn đã bị vô hiệu hóa. Nếu đây là lỗi, vui lòng liên hệ quản lý của bạn.</string> <string name="error_account_locked">Tài khoảng của bạn đã bị khóa. Nếu đây là lỗi, vui lòng liên hệ quản lý của bạn.</string> <string name="error_set_value">Giá trị không thể được thiết lập</string> @@ -205,8 +182,11 @@ <string name="database_import_failed">Nhập cơ sở dữ liệu không thành công</string> <string name="invalid_file">Tệp không hợp lệ</string> <string name="not_in_totp_2fa_enrollment_mode">Không ở chế độ đăng ký TOTP 2FA</string> - <!--*******************-> + <!--******************* END OF D2 Error Messages **********************--> + <string name="age_or">HOẶC</string> + <string name="cancel">Hủy</string> + <string name="ok">OK</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-zh-rCN/strings.xml b/commonskmm/src/commonMain/composeResources/values-zh-rCN/strings.xml index 3013da7eafc..a83b6a4bc30 100644 --- a/commonskmm/src/commonMain/composeResources/values-zh-rCN/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-zh-rCN/strings.xml @@ -24,16 +24,9 @@ <string name="field_is_mandatory">此字段是必填字段</string> <string name="missing_warning_fields_completed_events">您收到了一些警告信息。</string> <string name="required">必须的</string> - <string name="date">日期</string> - <string name="hint_year">年</string> - <string name="hint_month">月</string> - <string name="hint_day">天</string> - <string name="wrong_date_format">%s 无法解析为日期</string> <string name="polygon">多边形</string> <string name="latitude">纬度</string> <string name="longitude">经度</string> - <string name="coordinates_error">坐标值无效</string> - <string name="polygon_captured">采集的多边形。</string> <string name="enter_value">输入值</string> <string name="enter_url">输入url</string> <string name="enter_email">输入电子邮件</string> @@ -48,27 +41,18 @@ <string name="enter_long_text">输入长文本</string> <string name="enter_text">输入文本</string> <string name="due_date">到期日期</string> - <string name="mandatory_field">强制字段</string> - <string name="form_latitude_prefix">纬度:</string> - <string name="form_longitude_prefix">经度:</string> <string name="not_saved">未保存</string> <string name="review">审查</string> <string name="complete">完成</string> <string name="discard_changes">忽略修改</string> <string name="saved">已经保存!</string> <string name="not_now">现在不要</string> - <string name="save_anyway">仍然保存</string> <string name="keep_editing">继续编辑</string> <string name="event_can_be_completed">您想将此表单标记为已完成吗?</string> <string name="discard_go_back">如果您现在退出,表单中的所有信息都将被丢弃。</string> - <string name="field_errors_not_saved">一些字段有错误并且它们没有被保存。</string> - <string name="fields_mandatory_missing">缺少一些必填字段,无法保存表单。</string> <string name="share">分享</string> <string name="action_close">关闭</string> - <string name="program_rules_loop_warning_title">项目规则警告</string> - <string name="program_rules_loop_warning_message">存在导致规则循环的配置问题。联系您的管理员。</string> <string name="copied_text">副本</string> - <string name="empty_description">该字段没有相关信息</string> <string name="take_photo">拍照</string> <string name="from_gallery_v2">来自画廊</string> <string name="warning_error_on_complete_title">检查</string> @@ -93,13 +77,10 @@ <string name="tei_coordinates">坐标</string> <string name="no_reserved_values">没有更多保留值,请联系管理员</string> <string name="incident_date">事件日期</string> - <string name="location_permission_denied">获取坐标需要位置权限。请在应用程序设置中启用它们</string> <string name="open_with">打开用</string> <string name="no_option_found">找不到选项</string> <string name="download">下载</string> <string name="scan">扫描</string> - <string name="qr_code">二维码</string> - <string name="bar_code">条码</string> <string name="add_location">添加位置</string> <string name="form_without_fields">该表单没有配置任何字段</string> <string name="event_details_section_title">%s详细信息</string> @@ -125,12 +106,11 @@ <string name="no_results_found">没有结果</string> <string name="action_done">完成</string> <string name="input_not_supported">不支持</string> - <!--*******************-> + <!--******************* D2 Error Messages **********************--> <string name="login_error_null_pass">密码丢失。请输入密码。</string> <string name="login_error_null_username">缺少用户名。请输入用户名。</string> - <string name="login_error_dhis_version">服务器运行版本不是2.29,请更新服务器版本或使用测试环境继续</string> <string name="login_error_dhis_version_v2">此服务器正在运行与 %s 不同的 DHIS2 版本。更新您的服务器版本或联系您的管理员。</string> <string name="login_error_unsuccessful_response">出了些问题。请检查服务器 URL、用户名和密码是否正确,然后重试。</string> <string name="login_error_error_response">对不起!服务器端出现问题。</string> @@ -151,7 +131,6 @@ <string name="error_create_existing_error">创作中止。对象已经存在。</string> <string name="error_delete_non_existing_object">删除已中止。对象不存在。</string> <string name="error_instance_keystore">无法实例化密钥库。</string> - <string name="error_reserve_value_on_server">我们无法为这些记录保留值。请联系您的管理员。</string> <string name="error_export_login">请登录以导出数据库。</string> <string name="error_export_encrypted">不支持导出加密数据库。</string> <string name="error_import_exist">您正在导入一个已经存在的数据库。</string> @@ -178,7 +157,6 @@ <string name="error_socket_timeout">服务器花费了太多时间来响应。我们取消了请求。</string> <string name="error_relationship_updated">关系无法更新。</string> <string name="error_too_many_periods">期间太多了。</string> - <string name="error_url_not_found">我们找不到 URL。请验证一下。</string> <string name="error_account_disabled">您的用户帐户已被禁用。如果这是错误,请联系您的管理员。</string> <string name="error_account_locked">您的用户帐户被锁定。如果这是错误,请联系您的管理员。</string> <string name="error_set_value">无法设置该值。</string> @@ -190,8 +168,11 @@ <string name="error_invalid_characters">查询中有无效字符。请让管理员验证服务器配置(relaxedQueryChars,...)。</string> <string name="error_server_unavailable">服务器当前不可用。稍后再试。</string> <string name="error_no_internet_connection">您已离线。连接到互联网并重试。</string> - <!--*******************-> + <!--******************* END OF D2 Error Messages **********************--> + <string name="age_or">OR</string> + <string name="cancel">取消</string> + <string name="ok">OK</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values-zh/strings.xml b/commonskmm/src/commonMain/composeResources/values-zh/strings.xml index e05bfefce3f..86d410771c6 100644 --- a/commonskmm/src/commonMain/composeResources/values-zh/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values-zh/strings.xml @@ -25,16 +25,9 @@ <string name="missing_warning_fields_completed_events">您收到了一些警告信息。</string> <string name="missing_warning_fields_events">您有一些警告消息。\n您想将此表单标记为完成吗?</string> <string name="required">必须的</string> - <string name="date">日期</string> - <string name="hint_year">岁</string> - <string name="hint_month">月</string> - <string name="hint_day">日</string> - <string name="wrong_date_format">%s 无法解析为日期</string> <string name="polygon">多边形</string> <string name="latitude">维度</string> <string name="longitude">经度</string> - <string name="coordinates_error">坐标值无效</string> - <string name="polygon_captured">采集的多边形。</string> <string name="enter_value">输入值</string> <string name="enter_url">输入url</string> <string name="enter_email">输入电子邮件</string> @@ -49,9 +42,6 @@ <string name="enter_long_text">输入长文本</string> <string name="enter_text">输入文本</string> <string name="due_date">到期日期</string> - <string name="mandatory_field">强制字段</string> - <string name="form_latitude_prefix">纬度:</string> - <string name="form_longitude_prefix">经度:</string> <string name="not_saved">未保存</string> <string name="review">审查</string> <string name="complete">完成</string> @@ -61,21 +51,14 @@ <string name="missing_error_fields_events">一些字段有错误并且它们没有被保存。 \n您要查看表单吗?</string> <string name="review_message">某些字段需要您注意。\n您要查看表单吗?</string> <string name="not_now">现在不要</string> - <string name="save_anyway">仍然保存</string> <string name="keep_editing">继续编辑</string> <string name="event_can_be_completed">您想将此表单标记为已完成吗?</string> <string name="discard_go_back">如果您现在退出,表单中的所有信息都将被丢弃。</string> <string name="field_errors_not_saved_discard">某些字段有错误,无法保存。 \n如果您现在退出,更改将被丢弃。</string> - <string name="field_errors_not_saved">一些字段有错误并且它们没有被保存。</string> - <string name="fields_mandatory_missing">缺少一些必填字段,无法保存表单。</string> - <string name="fields_mandatory_missing_discard">某些必填字段缺失,无法保存表格。 \n如果您现在退出,更改将被丢弃。</string> <string name="share">分享</string> <string name="camera_permission_denied">相机权限被拒绝。\n您需要启用它才能使用此功能。</string> <string name="action_close">关闭</string> - <string name="program_rules_loop_warning_title">项目规则警告</string> - <string name="program_rules_loop_warning_message">存在导致规则循环的配置问题。联系您的管理员。</string> <string name="copied_text">副本</string> - <string name="empty_description">该字段没有相关信息</string> <string name="take_photo">拍照</string> <string name="from_gallery_v2">来自画廊</string> <string name="warning_error_on_complete_title">检查</string> @@ -101,13 +84,10 @@ <string name="tei_coordinates">坐标</string> <string name="no_reserved_values">没有更多保留值,请联系管理员</string> <string name="incident_date">事件日期</string> - <string name="location_permission_denied">获取坐标需要位置权限。请在应用程序设置中启用它们</string> <string name="open_with">打开用</string> <string name="no_option_found">找不到选项</string> <string name="download">下载</string> <string name="scan">扫描</string> - <string name="qr_code">二维码</string> - <string name="bar_code">条码</string> <string name="add_location">添加位置</string> <string name="form_without_fields">该表单没有配置任何字段</string> <string name="event_details_section_title">%s详细信息</string> @@ -138,12 +118,11 @@ <string name="search_to_find_more">搜索查找更多信息</string> <string name="action_done">完成</string> <string name="input_not_supported">不支持</string> - <!--*******************-> + <!--******************* D2 Error Messages **********************--> <string name="login_error_null_pass">密码丢失。请输入密码。</string> <string name="login_error_null_username">缺少用户名。请输入用户名。</string> - <string name="login_error_dhis_version">服务器运行版本不是2.29,请更新服务器版本或使用测试环境继续</string> <string name="login_error_dhis_version_v2">此服务器正在运行与 %s 不同的 DHIS2 版本。更新您的服务器版本或联系您的管理员。</string> <string name="login_error_unsuccessful_response">出了些问题。请检查服务器 URL、用户名和密码是否正确,然后重试。</string> <string name="login_error_error_response">对不起!服务器端出现问题。</string> @@ -164,7 +143,6 @@ <string name="error_create_existing_error">创作中止。对象已经存在。</string> <string name="error_delete_non_existing_object">删除已中止。对象不存在。</string> <string name="error_instance_keystore">无法实例化密钥库。</string> - <string name="error_reserve_value_on_server">我们无法为这些记录保留值。请联系您的管理员。</string> <string name="error_export_login">请登录以导出数据库。</string> <string name="error_export_encrypted">不支持导出加密数据库。</string> <string name="error_import_exist">您正在导入一个已经存在的数据库。</string> @@ -191,7 +169,6 @@ <string name="error_socket_timeout">服务器花费了太多时间来响应。我们取消了请求。</string> <string name="error_relationship_updated">关系无法更新。</string> <string name="error_too_many_periods">期间太多了。</string> - <string name="error_url_not_found">我们找不到 URL。请验证一下。</string> <string name="error_account_disabled">您的用户帐户已被禁用。如果这是错误,请联系您的管理员。</string> <string name="error_account_locked">您的用户帐户被锁定。如果这是错误,请联系您的管理员。</string> <string name="error_set_value">无法设置该值。</string> @@ -207,8 +184,13 @@ <string name="invalid_file">无效文件</string> <string name="not_in_totp_2fa_enrollment_mode">未进入 TOTP 2FA 注册模式</string> <string name="openid_login_cancelled">认证取消</string> - <!--*******************-> + <!--******************* END OF D2 Error Messages **********************--> + <string name="age_or">OR</string> + <string name="age">年龄</string> + <string name="date_of_birth">出生日期</string> + <string name="cancel">取消</string> + <string name="ok">好</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/composeResources/values/strings.xml b/commonskmm/src/commonMain/composeResources/values/strings.xml index d8ce06638d2..a5ecad6faa6 100644 --- a/commonskmm/src/commonMain/composeResources/values/strings.xml +++ b/commonskmm/src/commonMain/composeResources/values/strings.xml @@ -26,16 +26,9 @@ <string name="missing_warning_fields_completed_events">You have some warning messages.</string> <string name="missing_warning_fields_events">You have some warning messages.\nDo you want to mark this form as complete?</string> <string name="required">Required</string> - <string name="date">Date</string> - <string name="hint_year">Years</string> - <string name="hint_month">Months</string> - <string name="hint_day">Days</string> - <string name="wrong_date_format">%s can't be parsed as a date</string> <string name="polygon">Polygon</string> <string name="latitude">Latitude</string> <string name="longitude">Longitude</string> - <string name="coordinates_error">Coordinates values are not valid</string> - <string name="polygon_captured">Polygon captured</string> <string name="enter_value">Enter value</string> <string name="enter_url">Enter url</string> <string name="enter_email">Enter email</string> @@ -50,9 +43,6 @@ <string name="enter_long_text">Enter long text</string> <string name="enter_text">Enter text</string> <string name="due_date">Due date</string> - <string name="mandatory_field">Mandatory field</string> - <string name="form_latitude_prefix">Lat:</string> - <string name="form_longitude_prefix">Long:</string> <string name="not_saved">Not saved</string> <string name="review">Review</string> <string name="complete">Complete</string> @@ -62,21 +52,14 @@ <string name="missing_error_fields_events">Some fields have errors and they are not saved. \nDo you want to review the form?</string> <string name="review_message">Some fields need your attention.\nDo you want to review the form?</string> <string name="not_now">Not now</string> - <string name="save_anyway">Save anyway</string> <string name="keep_editing">Keep editing</string> <string name="event_can_be_completed">Do you want to mark this form as complete?</string> <string name="discard_go_back">If you exit now all the information in the form will be discarded.</string> <string name="field_errors_not_saved_discard">Some fields have errors and they are not saved. \nIf you exit now the changes will be discarded.</string> - <string name="field_errors_not_saved">Some fields have errors and they are not saved.</string> - <string name="fields_mandatory_missing">Some mandatory fields are missing and the form cannot be saved.</string> - <string name="fields_mandatory_missing_discard">Some mandatory fields are missing and the form cannot be saved. \nIf you exit now the changes will be discarded.</string> <string name="share">Share</string> <string name="camera_permission_denied">Camera permission is denied.\nYou need to enable it to use this feature.</string> <string name="action_close">Close</string> - <string name="program_rules_loop_warning_title">Program rules warning</string> - <string name="program_rules_loop_warning_message">There is a configuration issue causing a loop in the rules. Contact you administrator.</string> <string name="copied_text">Copied</string> - <string name="empty_description">No info for this field</string> <string name="take_photo">Take Photo</string> <string name="from_gallery_v2">From gallery</string> <string name="warning_error_on_complete_title">Check this!</string> @@ -95,20 +78,17 @@ <string name="error_true_only_malformed">Value is neither true or false</string> <string name="error_true_only_false_not_valid">This field can only be true</string> <string name="error_true_only_one_is_not_true">Invalid character 1</string> - <string name="data_values_save_error">DataValues can't be saved using these arguments. Use the other one.</string> + <string name="data_values_save_error">DataValues can\'t be saved using these arguments. Use the other one.</string> <string name="leading_zero_error">Leading zero numbers are not allowed</string> - <string name="custom_intent_error">Couldn't retrieve data</string> + <string name="custom_intent_error">Couldn\'t retrieve data</string> <string name="enrollment_single_section_label">Attributes - %s</string> <string name="tei_coordinates">Coordinates for the</string> <string name="no_reserved_values">There are no more reserved values. Contact your system administrator</string> <string name="incident_date">Incident date</string> - <string name="location_permission_denied">The location permission is needed for capturing coordinates. Please, enable them in the application settings</string> <string name="open_with">Open with</string> <string name="no_option_found">No option found</string> <string name="download">Download</string> <string name="scan">Scan</string> - <string name="qr_code">QR code</string> - <string name="bar_code">Bar code</string> <string name="add_location">Add location</string> <string name="form_without_fields">This form has no fields configured</string> <string name="event_details_section_title">%s details</string> @@ -139,12 +119,11 @@ <string name="search_to_find_more">Search to find more</string> <string name="action_done">Done</string> <string name="input_not_supported">Not supported</string> - <!--*******************-> + <!--******************* D2 Error Messages **********************--> <string name="login_error_null_pass">Password is missing. Please enter password.</string> <string name="login_error_null_username">Username is missing. Please enter username.</string> - <string name="login_error_dhis_version">This server is running a dhis version different than 2.29. Update your server version or use the testing environment to proceed.</string> <string name="login_error_dhis_version_v2">This server is running a DHIS2 version different than %s. Update your server version or contact your admin.</string> <string name="login_error_unsuccessful_response">Something went wrong. Please check that server URL, username and password are correct and try again.</string> <string name="login_error_error_response">Sorry! Something failed on the server side.</string> @@ -165,7 +144,7 @@ <string name="error_create_existing_error">Creation aborted. The object already exists.</string> <string name="error_delete_non_existing_object">Deletion aborted. The object does not exist.</string> <string name="error_instance_keystore">Unable to instantiate keystore.</string> - <string name="error_reserve_value_on_server">We couldn´t reserve values for these record. Please contact your admin.</string> + <string name="error_reserve_value_on_server">We couldn\'t reserve values for these record. Please contact your admin.</string> <string name="error_export_login">Please login to export the database.</string> <string name="error_export_encrypted">Exporting an encrypted database is not supported.</string> <string name="error_import_exist">You are importing an already existing database.</string> @@ -184,15 +163,15 @@ <string name="error_no_reserved_values">There are no reserved values available. Go to settings and refill values when you have internet connection.</string> <string name="error_object_update">The object could not be updated.</string> <string name="error_object_insert">The object could not be inserted.</string> - <string name="error_ownership_access">You don't have access.</string> + <string name="error_ownership_access">You don\'t have access.</string> <string name="error_null_url">The server URL is missing. Please enter URL.</string> <string name="error_server_malformed">The server URL is not well formed. Please check it.</string> <string name="error_settings_app_not_supported">This version of the Settings Web App is not supported.</string> <string name="error_settings_app_not_intalled">The Settings Web App is not installed in the server.</string> <string name="error_socket_timeout">The server took too much time to respond. We canceled the request. </string> - <string name="error_relationship_updated">The relationship can't be updated.</string> + <string name="error_relationship_updated">The relationship can\'t be updated.</string> <string name="error_too_many_periods">There are too many periods.</string> - <string name="error_url_not_found">We couldn´t find the URL. Please verify it.</string> + <string name="error_url_not_found">We couldn\'t find the URL. Please verify it.</string> <string name="error_account_disabled">Your user account have been disabled. If this is an error, contact your administrator.</string> <string name="error_account_locked">Your user account is locked. If this is an error, contact your administrator.</string> <string name="error_set_value">The value could not be set.</string> @@ -201,15 +180,20 @@ <string name="error_sms_not_supported">SMS is not supported.</string> <string name="error_min_attributes">There are not enough attributes to perform the search. Please refine your search with more attributes.</string> <string name="error_org_unit_scope">Online search is only available for your user search organisation units.</string> + <string name="invalid_configuration">Invalid configuration</string> <string name="error_invalid_characters">There are invalid characters in the query. Please ask the administrator to verify the server configuration (relaxedQueryChars,...).</string> <string name="error_server_unavailable">The server is currently unavailable. Try again later.</string> <string name="error_no_internet_connection">You are offline. Connect to the internet and try again.</string> <string name="database_import_failed">Database import failed</string> <string name="invalid_file">Invalid file</string> <string name="not_in_totp_2fa_enrollment_mode">Not in TOTP 2FA enrollment mode</string> - <string name="openid_login_cancelled">Authentication cancelled</string> - <!--*******************-> + <!--******************* END OF D2 Error Messages **********************--> + <string name="age_or">OR</string> + <string name="age">AGE</string> + <string name="date_of_birth">DATE OF BIRTH</string> + <string name="cancel">Cancel</string> + <string name="ok">OK</string> </resources> \ No newline at end of file diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/auth/OpenIdController.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/auth/OpenIdController.kt deleted file mode 100644 index 587ab961235..00000000000 --- a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/auth/OpenIdController.kt +++ /dev/null @@ -1,8 +0,0 @@ -package org.dhis2.mobile.commons.auth - -fun interface OpenIdController { - fun handleIntent( - intent: Any, - onResult: suspend (Result<Any>) -> Unit, - ) -} diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/biometrics/CryptographicActions.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/biometrics/CryptographicActions.kt index 9146451a323..fa04f543535 100644 --- a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/biometrics/CryptographicActions.kt +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/biometrics/CryptographicActions.kt @@ -3,9 +3,9 @@ package org.dhis2.mobile.commons.biometrics import javax.crypto.Cipher interface CryptographicActions { - fun getInitializedCipherForEncryption(): Cipher? + fun getInitializedCipherForEncryption(): Cipher - fun getInitializedCipherForDecryption(initializationVector: ByteArray): Cipher? + fun getInitializedCipherForDecryption(initializationVector: ByteArray): Cipher fun encryptData( plaintext: String, diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/color/ColorMatcher.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/color/ColorMatcher.kt new file mode 100644 index 00000000000..4aafb3ea226 --- /dev/null +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/color/ColorMatcher.kt @@ -0,0 +1,88 @@ +package org.dhis2.mobile.commons.color + +import kotlin.math.pow +import kotlin.math.sqrt + +/** + * CIE L*a*b* color representation for perceptually uniform distance calculations. + */ +private data class Lab( + val l: Double, + val a: Double, + val b: Double, +) + +/** + * Finds the closest color from the palette to the given selected color + * using the CIE76 Delta E in L*a*b* color space, + * which is more perceptually accurate than simple RGB Euclidean distance. + */ +object ColorMatcher { + fun findClosest( + selectedR: Int, + selectedG: Int, + selectedB: Int, + palette: List<PaletteColor>, + ): PaletteColor? { + if (palette.isEmpty()) return null + val selectedLab = rgbToLab(selectedR, selectedG, selectedB) + return palette.minByOrNull { color -> + val lab = rgbToLab(color.r, color.g, color.b) + deltaE(selectedLab, lab) + } + } + + /** + * CIE76 Delta E — Euclidean distance in L*a*b* space. + */ + private fun deltaE( + c1: Lab, + c2: Lab, + ): Double = + sqrt( + (c1.l - c2.l).pow(2) + + (c1.a - c2.a).pow(2) + + (c1.b - c2.b).pow(2), + ) + + /** + * Convert sRGB to CIE L*a*b* via XYZ intermediate. + */ + private fun rgbToLab( + r: Int, + g: Int, + b: Int, + ): Lab { + // sRGB -> linear RGB + var rr = r / 255.0 + var gg = g / 255.0 + var bb = b / 255.0 + + rr = if (rr > 0.04045) ((rr + 0.055) / 1.055).pow(2.4) else rr / 12.92 + gg = if (gg > 0.04045) ((gg + 0.055) / 1.055).pow(2.4) else gg / 12.92 + bb = if (bb > 0.04045) ((bb + 0.055) / 1.055).pow(2.4) else bb / 12.92 + + // Linear RGB -> XYZ (D65 illuminant) + val x = (rr * 0.4124564 + gg * 0.3575761 + bb * 0.1804375) / 0.95047 + val y = (rr * 0.2126729 + gg * 0.7151522 + bb * 0.0721750) / 1.00000 + val z = (rr * 0.0193339 + gg * 0.1191920 + bb * 0.9503041) / 1.08883 + + // XYZ -> L*a*b* + val fx = labF(x) + val fy = labF(y) + val fz = labF(z) + + val l = 116.0 * fy - 16.0 + val a = 500.0 * (fx - fy) + val bLab = 200.0 * (fy - fz) + + return Lab(l, a, bLab) + } + + private fun labF(t: Double): Double = + if (t > 0.008856) { + t.pow(1.0 / 3.0) + } else { + (7.787 * t) + (16.0 / 116.0) + } +} diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/color/PaletteColor.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/color/PaletteColor.kt new file mode 100644 index 00000000000..cbdea388636 --- /dev/null +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/color/PaletteColor.kt @@ -0,0 +1,21 @@ +package org.dhis2.mobile.commons.color + +/** + * Represents a color in RGB space, parsed from a hex string. + */ +data class PaletteColor( + val hex: String, + val r: Int, + val g: Int, + val b: Int, +) { + companion object { + fun fromHex(hex: String): PaletteColor { + val clean = hex.removePrefix("#") + val r = clean.substring(0, 2).toInt(16) + val g = clean.substring(2, 4).toInt(16) + val b = clean.substring(4, 6).toInt(16) + return PaletteColor(hex = "#$clean", r = r, g = g, b = b) + } + } +} diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/coroutine/CoroutineTracker.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/coroutine/CoroutineTracker.kt index 0d05bcfa71e..e51ac96bca3 100644 --- a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/coroutine/CoroutineTracker.kt +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/coroutine/CoroutineTracker.kt @@ -1,24 +1,21 @@ package org.dhis2.mobile.commons.coroutine import kotlinx.atomicfu.atomic -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow object CoroutineTracker { private val activeTasks = atomic(0) - private val _isIdle = MutableStateFlow(true) - - val isIdle: StateFlow<Boolean> get() = _isIdle fun increment() { - val count = activeTasks.incrementAndGet() - _isIdle.value = false IdlingResourceProvider.idlingResource.increment() } fun decrement() { - val count = activeTasks.decrementAndGet() - _isIdle.value = (count == 0) + var current: Int + var next: Int + do { + current = activeTasks.value + next = (current - 1).coerceAtLeast(0) + } while (!activeTasks.compareAndSet(current, next)) IdlingResourceProvider.idlingResource.decrement() } } diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/dates/DateTimeInputsUtils.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/dates/DateTimeInputsUtils.kt new file mode 100644 index 00000000000..402504b738e --- /dev/null +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/dates/DateTimeInputsUtils.kt @@ -0,0 +1,94 @@ +package org.dhis2.mobile.commons.dates + +import kotlinx.datetime.DateTimeUnit +import kotlinx.datetime.LocalDate +import kotlinx.datetime.TimeZone +import kotlinx.datetime.daysUntil +import kotlinx.datetime.minus +import kotlinx.datetime.number +import kotlinx.datetime.periodUntil +import kotlinx.datetime.todayIn +import kotlin.time.Clock +import kotlin.time.ExperimentalTime + +/** + * Calculates a date from an age value and time unit + * Uses kotlinx.datetime for date arithmetic + * @param ageValue The age value as an integer + * @param timeUnit The time unit (years, months, or days) - expects string values: "YEARS", "MONTHS", "DAYS" + * @return The calculated date in yyyy-MM-dd format, or null if calculation fails + */ +@OptIn(ExperimentalTime::class) +fun calculateDateFromAge( + ageValue: String, + timeUnit: String, +): String? { + return try { + val today = + Clock.System + .todayIn(TimeZone.currentSystemDefault()) + + val calculatedDate = + when (timeUnit) { + "YEARS" -> today.minus(ageValue.toInt(), DateTimeUnit.YEAR) + "MONTHS" -> today.minus(ageValue.toInt(), DateTimeUnit.MONTH) + "DAYS" -> today.minus(ageValue.toInt(), DateTimeUnit.DAY) + else -> return null + } + + calculatedDate.toString() + } catch (_: Exception) { + null + } +} + +/** + * Calculates age from a date string based on the specified time unit + * Uses kotlinx.datetime for period calculations + * @param dateString The birth date in yyyy-MM-dd format + * @param timeUnit The time unit to calculate age in - expects string values: "YEARS", "MONTHS", "DAYS" + * @return The calculated age as a string, or null if calculation fails + */ +@OptIn(ExperimentalTime::class) +fun calculateAgeFromDate( + dateString: String, + timeUnit: String, +): String? = + try { + val birthDate = LocalDate.parse(dateString) + val today = + Clock.System + .todayIn(TimeZone.currentSystemDefault()) + + when (timeUnit) { + "YEARS" -> { + val period = birthDate.periodUntil(today) + period.years.toString() + } + "MONTHS" -> { + monthsBetween(birthDate, today).toString() + } + "DAYS" -> { + birthDate.daysUntil(today).toString() + } + else -> null + } + } catch (_: Exception) { + null + } + +/** + * Calculates the number of months between two dates + * Uses kotlinx.datetime for accurate month calculations + * @param startDate The start date + * @param endDate The end date + * @return The number of months between the two dates + */ +fun monthsBetween( + startDate: LocalDate, + endDate: LocalDate, +): Int { + val startDateTotalMonths = 12 * startDate.year + startDate.month.number + val endDateTotalMonths = 12 * endDate.year + endDate.month.number + return endDateTotalMonths - startDateTotalMonths +} diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/extensions/DateExtensions.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/extensions/DateExtensions.kt new file mode 100644 index 00000000000..9fa686dd94b --- /dev/null +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/extensions/DateExtensions.kt @@ -0,0 +1,14 @@ +package org.dhis2.mobile.commons.extensions + +import java.util.Date +import kotlin.time.Instant + +fun Date.toKtxInstant(): Instant = Instant.fromEpochMilliseconds(this.time) + +fun Instant.toJavaDate(): Date = Date(this.toEpochMilliseconds()) + +fun getTodayAsInstant(): Instant { + val nowMillis = System.currentTimeMillis() + + return Instant.fromEpochMilliseconds(nowMillis) +} diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/extensions/ViewModelExtensions.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/extensions/ViewModelExtensions.kt index ca4334259e2..27f2c919e50 100644 --- a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/extensions/ViewModelExtensions.kt +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/extensions/ViewModelExtensions.kt @@ -5,6 +5,8 @@ import androidx.lifecycle.viewModelScope import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import org.dhis2.mobile.commons.coroutine.CoroutineTracker +import kotlin.coroutines.CoroutineContext +import kotlin.coroutines.EmptyCoroutineContext /** * Launches a coroutine in the ViewModel's scope for executing a use case. @@ -13,12 +15,14 @@ import org.dhis2.mobile.commons.coroutine.CoroutineTracker * * @param block The suspend block of code to be executed within the coroutine. This is typically the use case logic. */ -fun ViewModel.launchUseCase(block: suspend CoroutineScope.() -> Unit) = - viewModelScope.launch { - CoroutineTracker.increment() - try { - block() - } finally { - CoroutineTracker.decrement() - } +fun ViewModel.launchUseCase( + dispatcher: CoroutineContext = EmptyCoroutineContext, + block: suspend CoroutineScope.() -> Unit, +) = viewModelScope.launch(dispatcher) { + CoroutineTracker.increment() + try { + block() + } finally { + CoroutineTracker.decrement() } +} diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationManager.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationManager.kt new file mode 100644 index 00000000000..7d6c4951ab7 --- /dev/null +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationManager.kt @@ -0,0 +1,49 @@ +package org.dhis2.mobile.commons.notifications + +interface NotificationManager { + fun getDataSyncNotification( + smallIcon: Int, + contentTitle: String, + contentText: String, + progress: Int, + ): NotificationModel + + fun displayDataSyncNotification( + smallIcon: Int, + contentTitle: String, + contentText: String, + progress: Int, + ) + + fun getMetadataSyncNotification( + smallIcon: Int, + contentTitle: String, + contentText: String, + progress: Int, + ): NotificationModel + + fun displayMetadataSyncNotification( + smallIcon: Int, + contentTitle: String, + contentText: String, + progress: Int, + ) + + fun getSyncSettingsNotificationModel( + smallIcon: Int, + contentTitle: String, + contentText: String, + ): NotificationModel + + fun displaySyncSettingsNotification( + smallIcon: Int, + contentTitle: String, + contentText: String, + ) + + fun cancelMetadataSyncNotification() + + fun cancelSyncSettingsNotification() + + fun cancelDataSyncNotification() +} diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationModel.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationModel.kt new file mode 100644 index 00000000000..831c2446f68 --- /dev/null +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/notifications/NotificationModel.kt @@ -0,0 +1,3 @@ +package org.dhis2.mobile.commons.notifications + +interface NotificationModel diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/providers/PreferenceConstants.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/providers/PreferenceConstants.kt index 03a9fd3f090..4b3694afcb3 100644 --- a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/providers/PreferenceConstants.kt +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/providers/PreferenceConstants.kt @@ -6,5 +6,17 @@ const val SECURE_USER_NAME = "SECURE_USER_NAME" const val SECURE_PASS = "SECURE_PASS" const val SHARE_PREFS = "org.dhis2" const val LAST_META_SYNC = "last_meta_sync" +const val TIME_META = "timeMeta" +const val LAST_META_SYNC_STATUS = "last_meta_sync_status" const val LAST_DATA_SYNC = "last_data_sync" +const val TIME_DATA = "timeData" +const val LAST_DATA_SYNC_STATUS = "last_data_sync_status" +const val SYNC_RESULT = "sync_result" const val BIOMETRIC_CREDENTIALS = "biometric_credentials" +const val EVENT_MAX = "EVENT_MAX" +const val EVENT_MAX_DEFAULT = 1000 +const val TEI_MAX = "TEI_MAX" +const val TEI_MAX_DEFAULT = 500 +const val LIMIT_BY_ORG_UNIT = "LIMIT_BY_ORG_UNIT" +const val LIMIT_BY_PROGRAM = "LIMIT_BY_PROGRAM" +const val MAX_RESERVED_VALUES = 100 diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/providers/PreferenceProvider.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/providers/PreferenceProvider.kt index 3c5d1d07892..5fb3b0eebb9 100644 --- a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/providers/PreferenceProvider.kt +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/providers/PreferenceProvider.kt @@ -1,6 +1,7 @@ package org.dhis2.mobile.commons.providers import org.dhis2.mobile.commons.biometrics.CiphertextWrapper +import kotlin.time.Duration.Companion.days interface PreferenceProvider { fun saveUserCredentials( @@ -91,4 +92,8 @@ interface PreferenceProvider { ): List<String> fun updateLoginServers(serverUrl: String) + + fun getMetadataSyncPeriod(): Int = getInt(TIME_META, 7.days.inWholeSeconds.toInt()) + + fun getDataSyncPeriod(): Int = getInt(TIME_DATA, 1.days.inWholeSeconds.toInt()) } diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/reporting/AnalyticActions.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/reporting/AnalyticActions.kt index 92da4053031..3877335781e 100644 --- a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/reporting/AnalyticActions.kt +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/reporting/AnalyticActions.kt @@ -16,7 +16,6 @@ interface AnalyticActions { fun updateMatomoSecondaryTracker( matomoUrl: String, matomoID: Int, - trackerName: String, ) fun clearMatomoSecondaryTracker() diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/resources/Resources.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/resources/DrawableResourcesProvider.kt similarity index 100% rename from commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/resources/Resources.kt rename to commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/resources/DrawableResourcesProvider.kt diff --git a/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/resources/StringResourceProvider.kt b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/resources/StringResourceProvider.kt new file mode 100644 index 00000000000..6003c0e8ae4 --- /dev/null +++ b/commonskmm/src/commonMain/kotlin/org/dhis2/mobile/commons/resources/StringResourceProvider.kt @@ -0,0 +1,11 @@ +package org.dhis2.mobile.commons.resources + +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.getString + +class StringResourceProvider { + suspend fun provideString( + resource: StringResource, + number: Int, + ): String = getString(resource, number) +} diff --git a/commonskmm/src/commonTest/kotlin/org/dhis2/mobile/commons/color/ColorMatcherTest.kt b/commonskmm/src/commonTest/kotlin/org/dhis2/mobile/commons/color/ColorMatcherTest.kt new file mode 100644 index 00000000000..2b8d91aa0ac --- /dev/null +++ b/commonskmm/src/commonTest/kotlin/org/dhis2/mobile/commons/color/ColorMatcherTest.kt @@ -0,0 +1,70 @@ +package org.dhis2.mobile.commons.color + +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNull + +class ColorMatcherTest { + // Palette sampled from PaletteThemes covering distinct hue regions + private val palette = + listOf( + PaletteColor.fromHex("#d32f2f"), // Red + PaletteColor.fromHex("#1976d2"), // Blue + PaletteColor.fromHex("#2e7d32"), // Green + PaletteColor.fromHex("#fbc02d"), // Amber/Yellow + PaletteColor.fromHex("#424242"), // Dark Grey + ) + + @Test + fun returnsNullWhenPaletteIsEmpty() { + assertNull(ColorMatcher.findClosest(128, 128, 128, emptyList())) + } + + @Test + fun returnsOnlyColorWhenPaletteHasSingleEntry() { + val single = PaletteColor.fromHex("#1976d2") + assertEquals(single, ColorMatcher.findClosest(255, 0, 0, listOf(single))) + } + + @Test + fun exactColorMatchReturnsItself() { + // #d32f2f = rgb(211, 47, 47) + val result = ColorMatcher.findClosest(211, 47, 47, palette) + assertEquals(PaletteColor.fromHex("#d32f2f"), result) + } + + @Test + fun pureRedIsMatchedToRedPaletteEntry() { + // rgb(255, 0, 0) should be perceptually closest to #d32f2f among the palette + val result = ColorMatcher.findClosest(255, 0, 0, palette) + assertEquals(PaletteColor.fromHex("#d32f2f"), result) + } + + @Test + fun pureBlueIsMatchedToBluePaletteEntry() { + // rgb(0, 0, 255) should be perceptually closest to #1976d2 among the palette + val result = ColorMatcher.findClosest(0, 0, 255, palette) + assertEquals(PaletteColor.fromHex("#1976d2"), result) + } + + @Test + fun pureGreenIsMatchedToGreenPaletteEntry() { + // rgb(0, 128, 0) should be perceptually closest to #2e7d32 among the palette + val result = ColorMatcher.findClosest(0, 128, 0, palette) + assertEquals(PaletteColor.fromHex("#2e7d32"), result) + } + + @Test + fun yellowIsMatchedToAmberPaletteEntry() { + // rgb(255, 200, 0) should be perceptually closest to #fbc02d among the palette + val result = ColorMatcher.findClosest(255, 200, 0, palette) + assertEquals(PaletteColor.fromHex("#fbc02d"), result) + } + + @Test + fun darkGreyIsMatchedToGreyPaletteEntry() { + // rgb(64, 64, 64) should be perceptually closest to #424242 among the palette + val result = ColorMatcher.findClosest(64, 64, 64, palette) + assertEquals(PaletteColor.fromHex("#424242"), result) + } +} diff --git a/commonskmm/src/desktopMain/java/org/dhis2/mobile/commons/resources/Resources.desktop.kt b/commonskmm/src/desktopMain/java/org/dhis2/mobile/commons/resources/DrawableResourcesProvider.desktop.kt similarity index 100% rename from commonskmm/src/desktopMain/java/org/dhis2/mobile/commons/resources/Resources.desktop.kt rename to commonskmm/src/desktopMain/java/org/dhis2/mobile/commons/resources/DrawableResourcesProvider.desktop.kt diff --git a/compose-table/build.gradle.kts b/compose-table/build.gradle.kts index 7e05c3b3414..215c0241340 100644 --- a/compose-table/build.gradle.kts +++ b/compose-table/build.gradle.kts @@ -2,7 +2,6 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { id("com.android.library") - kotlin("android") alias(libs.plugins.kotlin.serialization) alias(libs.plugins.kotlin.compose.compiler) } diff --git a/compose-table/src/main/java/org/dhis2/composetable/ui/TextInput.kt b/compose-table/src/main/java/org/dhis2/composetable/ui/TextInput.kt index 749d73e0856..c9d8d98657c 100644 --- a/compose-table/src/main/java/org/dhis2/composetable/ui/TextInput.kt +++ b/compose-table/src/main/java/org/dhis2/composetable/ui/TextInput.kt @@ -9,7 +9,6 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentHeight @@ -76,8 +75,7 @@ fun TextInput( .background( color = Color.White, shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp), - ).padding(start = 16.dp, end = 4.dp, top = 16.dp, bottom = 4.dp) - .imePadding(), + ).padding(start = 16.dp, end = 4.dp, top = 16.dp, bottom = 4.dp), verticalArrangement = spacedBy(8.dp), ) { InputTitle(textInputModel.mainLabel, textInputModel.secondaryLabels) diff --git a/dhis2-mobile-program-rules/build.gradle.kts b/dhis2-mobile-program-rules/build.gradle.kts index 470b75ce8f0..7f2f277ed4c 100644 --- a/dhis2-mobile-program-rules/build.gradle.kts +++ b/dhis2-mobile-program-rules/build.gradle.kts @@ -2,7 +2,6 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { id("com.android.library") - kotlin("android") } apply(from = "${project.rootDir}/jacoco/jacoco.gradle.kts") diff --git a/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RuleConstants.kt b/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RuleConstants.kt new file mode 100644 index 00000000000..43e5c34f347 --- /dev/null +++ b/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RuleConstants.kt @@ -0,0 +1,5 @@ +package org.dhis2.mobileProgramRules + +object RuleConstants { + const val LEGENDSET_LABEL = "legendSet" +} diff --git a/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RuleEngineExtensions.kt b/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RuleEngineExtensions.kt index 76d31368433..8b03888f94e 100644 --- a/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RuleEngineExtensions.kt +++ b/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RuleEngineExtensions.kt @@ -1,12 +1,9 @@ package org.dhis2.mobileProgramRules -import kotlinx.datetime.Instant -import kotlinx.datetime.LocalDateTime -import kotlinx.datetime.LocalTime import kotlinx.datetime.TimeZone -import kotlinx.datetime.toDeprecatedInstant -import kotlinx.datetime.toInstant +import kotlinx.datetime.number import kotlinx.datetime.toLocalDateTime +import org.dhis2.mobileProgramRules.RuleConstants.LEGENDSET_LABEL import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.android.core.dataelement.DataElementCollectionRepository @@ -25,6 +22,8 @@ import org.hisp.dhis.rules.models.Rule import org.hisp.dhis.rules.models.RuleAction import org.hisp.dhis.rules.models.RuleAttributeValue import org.hisp.dhis.rules.models.RuleDataValue +import org.hisp.dhis.rules.models.RuleInstant +import org.hisp.dhis.rules.models.RuleLocalDate import org.hisp.dhis.rules.models.RuleValueType import org.hisp.dhis.rules.models.RuleVariable import org.hisp.dhis.rules.models.RuleVariableAttribute @@ -36,22 +35,28 @@ import org.hisp.dhis.rules.models.RuleVariablePreviousEvent import timber.log.Timber import java.util.Date import kotlin.time.ExperimentalTime +import kotlin.time.Instant -fun Date.toRuleEngineInstant() = Instant.fromEpochMilliseconds(this.time) - -fun Date.toRuleEngineLocalDate() = toRuleEngineInstant().toLocalDateTime(TimeZone.currentSystemDefault()).date +@OptIn(ExperimentalTime::class) +private fun Date.toKtInstant() = Instant.fromEpochMilliseconds(this.time) @OptIn(ExperimentalTime::class) -fun Date.toRuleEngineInstantWithNoTime() = - LocalDateTime(toRuleEngineLocalDate(), LocalTime(0, 0, 0, 0)) - .toInstant(TimeZone.currentSystemDefault()) - .toDeprecatedInstant() +private fun Date.toKtLocalDateTime() = toKtInstant().toLocalDateTime(TimeZone.currentSystemDefault()) + +fun Date.toRuleEngineInstant() = RuleInstant(this.time) + +fun Date?.toRuleEngineInstantOrNow() = this?.toRuleEngineInstant() ?: RuleInstant.now() + +fun Date.toRuleEngineLocalDate() = + this.toKtLocalDateTime().let { + RuleLocalDate(it.year, it.month.number, it.day) + } fun List<Event>.sortForRuleEngine(): List<Event> = sortedWith( compareBy<Event>( - { it.eventDate()?.toRuleEngineInstantWithNoTime() }, - { it.created() }, + { it.eventDate()?.toRuleEngineLocalDate() }, + { it.createdAtClient() ?: it.created() }, ).reversed(), ) @@ -133,6 +138,7 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { ).also { map -> contentToDisplay?.let { map["content"] = it } }, + priority = priority(), ) ProgramRuleActionType.DISPLAYTEXT -> @@ -144,7 +150,9 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { Pair("location", location() ?: "indicators"), ).also { map -> contentToDisplay?.let { map["content"] = it } + legendSet()?.let { map[LEGENDSET_LABEL] = it.uid() } }, + priority = priority(), ) ProgramRuleActionType.DISPLAYKEYVALUEPAIR -> @@ -156,7 +164,9 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { Pair("location", location()!!), ).also { map -> contentToDisplay?.let { map["content"] = it } + legendSet()?.let { map[LEGENDSET_LABEL] = it.uid() } }, + priority = priority(), ) ProgramRuleActionType.HIDESECTION -> @@ -168,6 +178,7 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { mutableMapOf( Pair("programStageSection", it.uid()), ), + priority = priority(), ) } ?: RuleAction( "HIDE SECTION RULE IS MISSING PROGRAM STAGE SECTION", @@ -183,6 +194,7 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { mutableMapOf( Pair("programStage", it.uid()), ), + priority = priority(), ) } ?: RuleAction( "HIDE STAGE RULE IS MISSING PROGRAM STAGE", @@ -213,6 +225,7 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { ) } ?: emptyMap() }, + priority = priority(), ) } } @@ -227,6 +240,7 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { ).also { map -> contentToDisplay?.let { map["content"] = it } }, + priority = priority(), ) ProgramRuleActionType.WARNINGONCOMPLETE -> @@ -239,6 +253,7 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { ).also { map -> contentToDisplay?.let { map["content"] = it } }, + priority = priority(), ) ProgramRuleActionType.SHOWERROR -> @@ -251,6 +266,7 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { ).also { map -> contentToDisplay?.let { map["content"] = it } }, + priority = priority(), ) ProgramRuleActionType.ERRORONCOMPLETE -> @@ -263,6 +279,7 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { ).also { map -> contentToDisplay?.let { map["content"] = it } }, + priority = priority(), ) ProgramRuleActionType.CREATEEVENT -> @@ -276,6 +293,7 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { ).also { map -> contentToDisplay?.let { map["content"] = it } }, + priority = priority(), ) } ?: RuleAction( "CREATE EVENT RULE IS MISSING PROGRAM STAGE SECTION", @@ -292,6 +310,7 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { ).also { map -> contentToDisplay?.let { map["content"] = it } }, + priority = priority(), ) ProgramRuleActionType.HIDEOPTION -> @@ -306,6 +325,7 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { ).also { map -> contentToDisplay?.let { map["content"] = it } }, + priority = priority(), ) } ?: RuleAction( "HIDE OPTION RULE IS MISSING OPTION", @@ -324,6 +344,7 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { ).also { map -> contentToDisplay?.let { map["content"] = it } }, + priority = priority(), ) } ?: RuleAction( "SHOW OPTION GROUP RULE IS MISSING OPTION GROUP", @@ -342,6 +363,7 @@ fun ProgramRuleAction.toRuleEngineObject(): RuleAction { ).also { map -> contentToDisplay?.let { map["content"] = it } }, + priority = priority(), ) } ?: RuleAction( "HIDE OPTION GROUP RULE IS MISSING OPTION GROUP", diff --git a/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RuleEngineHelper.kt b/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RuleEngineHelper.kt index f992d0a131d..6777eedd337 100644 --- a/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RuleEngineHelper.kt +++ b/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RuleEngineHelper.kt @@ -84,7 +84,7 @@ class RuleEngineHelper( RuleEngineContext( rules = rules.await(), ruleVariables = ruleVariables.await(), - supplementaryData = supplData.await(), + ruleSupplementaryData = supplData.await(), constantsValues = constants.await(), ), ruleEnrollment = ruleEnrollment.await(), diff --git a/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RulesRepository.kt b/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RulesRepository.kt index 8971a8591a4..2274b85a44f 100644 --- a/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RulesRepository.kt +++ b/dhis2-mobile-program-rules/src/main/java/org/dhis2/mobileProgramRules/RulesRepository.kt @@ -1,22 +1,17 @@ package org.dhis2.mobileProgramRules -import android.os.Build import android.text.TextUtils.isEmpty -import kotlinx.datetime.Clock -import kotlinx.datetime.Instant -import kotlinx.datetime.TimeZone -import kotlinx.datetime.toLocalDateTime import org.dhis2.commons.bindings.enrollment import org.dhis2.commons.bindings.event import org.dhis2.commons.bindings.organisationUnit import org.dhis2.commons.bindings.program import org.dhis2.commons.bindings.programStage import org.hisp.dhis.android.core.D2 -import org.hisp.dhis.android.core.arch.repositories.scope.RepositoryScope import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.event.Event import org.hisp.dhis.android.core.event.EventStatus import org.hisp.dhis.android.core.program.ProgramRule +import org.hisp.dhis.rules.api.RuleSupplementaryData import org.hisp.dhis.rules.models.Rule import org.hisp.dhis.rules.models.RuleAttributeValue import org.hisp.dhis.rules.models.RuleDataValue @@ -33,8 +28,8 @@ class RulesRepository( ) { // ORG UNIT GROUPS // USER ROLES - suspend fun supplementaryData(orgUnitUid: String): Map<String, List<String>> { - val supData = HashMap<String, List<String>>() + suspend fun supplementaryData(orgUnitUid: String): RuleSupplementaryData { + val ouGroupMap = HashMap<String, List<String>>() d2 .organisationUnitModule() @@ -44,18 +39,19 @@ class RulesRepository( .blockingGet() .let { orgUnit -> orgUnit?.organisationUnitGroups()?.map { - it.code()?.let { code -> supData[code] = arrayListOf(orgUnit.uid()) } - supData[it.uid()] = arrayListOf(orgUnit.uid()) + it.code()?.let { code -> ouGroupMap[code] = arrayListOf(orgUnit.uid()) } + ouGroupMap[it.uid()] = arrayListOf(orgUnit.uid()) } } val userRoleUids = d2.userModule().userRoles().blockingGetUids() val userGroupUids = d2.userModule().userGroups().blockingGetUids() - supData["USER_ROLES"] = userRoleUids - supData["USER_GROUPS"] = userGroupUids - supData["android_version"] = listOf(Build.VERSION.SDK_INT.toString()) - return supData + return RuleSupplementaryData( + userGroups = userGroupUids, + userRoles = userRoleUids, + orgUnitGroups = ouGroupMap, + ) } suspend fun rules( @@ -72,9 +68,9 @@ class RulesRepository( ?.programStage() } - return queryRules(programUid).toRuleList().filter { - it.programStage == null || it.programStage == programStage - } + return queryRules(programUid) + .filter { it.programStage() == null || it.programStage()?.uid() == programStage } + .toRuleList() } suspend fun ruleVariables(programUid: String): List<RuleVariable> = @@ -133,21 +129,9 @@ class RulesRepository( } else { RuleEventStatus.valueOf(event.status()!!.name) }, - eventDate = event.eventDate()!!.toRuleEngineInstant(), - dueDate = - event.dueDate()?.let { - Instant - .fromEpochMilliseconds(it.time) - .toLocalDateTime(TimeZone.currentSystemDefault()) - .date - }, - completedDate = - event.completedDate()?.let { - Instant - .fromEpochMilliseconds(it.time) - .toLocalDateTime(TimeZone.currentSystemDefault()) - .date - }, + eventDate = event.eventDate()!!.toRuleEngineLocalDate(), + dueDate = event.dueDate()?.toRuleEngineLocalDate(), + completedDate = event.completedDate()?.toRuleEngineLocalDate(), organisationUnit = event.organisationUnit()!!, organisationUnitCode = d2 @@ -157,11 +141,8 @@ class RulesRepository( event.organisationUnit(), ).blockingGet() ?.code(), - createdDate = - event - .created() - ?.let { Instant.fromEpochMilliseconds(it.time) } - ?: Clock.System.now(), + createdDate = event.created().toRuleEngineInstantOrNow(), + createdAtClientDate = event.createdAtClient()?.toRuleEngineInstant(), dataValues = event.trackedEntityDataValues()?.toRuleDataValue() ?: emptyList(), ) @@ -186,8 +167,8 @@ class RulesRepository( .byDeleted() .isFalse .withTrackedEntityDataValues() - .orderByEventDate(RepositoryScope.OrderByDirection.DESC) .blockingGet() + .sortForRuleEngine() } else { d2 .eventModule() @@ -205,8 +186,8 @@ class RulesRepository( .byDeleted() .isFalse .withTrackedEntityDataValues() - .orderByEventDate(RepositoryScope.OrderByDirection.DESC) .blockingGet() + .sortForRuleEngine() .let { list -> val currentEventIndex = list.indexOfFirst { it.uid() == eventToEvaluate.uid() } @@ -269,7 +250,7 @@ class RulesRepository( } else { RuleEventStatus.valueOf(event.status()!!.name) }, - eventDate = event.eventDate()!!.toRuleEngineInstant(), + eventDate = event.eventDate()!!.toRuleEngineLocalDate(), dueDate = event.dueDate()?.toRuleEngineLocalDate(), completedDate = event.completedDate()?.toRuleEngineLocalDate(), organisationUnit = event.organisationUnit()!!, @@ -280,11 +261,8 @@ class RulesRepository( .uid(event.organisationUnit()) .blockingGet() ?.code(), - createdDate = - event - .created() - ?.let { Instant.fromEpochMilliseconds(it.time) } - ?: Clock.System.now(), + createdDate = event.created().toRuleEngineInstantOrNow(), + createdAtClientDate = event.createdAtClient()?.toRuleEngineInstant(), dataValues = event.trackedEntityDataValues()?.toRuleDataValue() ?: emptyList(), ) @@ -415,16 +393,13 @@ class RulesRepository( programStage = event.programStage()!!, programStageName = d2.programStage(event.programStage()!!)?.name()!!, status = RuleEventStatus.valueOf(event.status()!!.name), - eventDate = event.eventDate()!!.toRuleEngineInstant(), + eventDate = event.eventDate()!!.toRuleEngineLocalDate(), dueDate = event.dueDate()?.toRuleEngineLocalDate(), completedDate = event.completedDate()?.toRuleEngineLocalDate(), organisationUnit = event.organisationUnit()!!, organisationUnitCode = d2.organisationUnit(event.organisationUnit()!!)?.code(), - createdDate = - event - .created() - ?.let { Instant.fromEpochMilliseconds(it.time) } - ?: Clock.System.now(), + createdDate = event.created().toRuleEngineInstantOrNow(), + createdAtClientDate = event.createdAtClient()?.toRuleEngineInstant(), dataValues = emptyList(), ) } diff --git a/dhis2-mobile-program-rules/src/test/java/org/dhis2/mobileProgramRules/RuleEngineExtensionsTest.kt b/dhis2-mobile-program-rules/src/test/java/org/dhis2/mobileProgramRules/RuleEngineExtensionsTest.kt index 05ec4abc3d2..b34420f0829 100644 --- a/dhis2-mobile-program-rules/src/test/java/org/dhis2/mobileProgramRules/RuleEngineExtensionsTest.kt +++ b/dhis2-mobile-program-rules/src/test/java/org/dhis2/mobileProgramRules/RuleEngineExtensionsTest.kt @@ -52,14 +52,14 @@ class RuleEngineExtensionsTest { val date1 = DateUtils.DATE_FORMAT.parse("2025-09-25T11:43:32.431") val date2 = DateUtils.DATE_FORMAT.parse("2025-09-25T00:00:00.000") - assertEquals(date1.toRuleEngineInstantWithNoTime(), date2.toRuleEngineInstantWithNoTime()) + assertEquals(date1.toRuleEngineLocalDate(), date2.toRuleEngineLocalDate()) val date3 = DateUtils.DATE_FORMAT.parse("2025-09-25T11:43:32.431") val date4 = DateUtils.DATE_FORMAT.parse("2025-09-26T00:00:00.000") assertNotEquals( - date3.toRuleEngineInstantWithNoTime(), - date4.toRuleEngineInstantWithNoTime(), + date3.toRuleEngineLocalDate(), + date4.toRuleEngineLocalDate(), ) } diff --git a/dhis2-mobile-program-rules/src/test/java/org/dhis2/mobileProgramRules/RuleEngineHelperTest.kt b/dhis2-mobile-program-rules/src/test/java/org/dhis2/mobileProgramRules/RuleEngineHelperTest.kt index 8693a982723..840b8f886bf 100644 --- a/dhis2-mobile-program-rules/src/test/java/org/dhis2/mobileProgramRules/RuleEngineHelperTest.kt +++ b/dhis2-mobile-program-rules/src/test/java/org/dhis2/mobileProgramRules/RuleEngineHelperTest.kt @@ -1,7 +1,9 @@ package org.dhis2.mobileProgramRules import kotlinx.coroutines.test.runTest +import org.dhis2.mobileProgramRules.RuleConstants.LEGENDSET_LABEL import org.hisp.dhis.android.core.program.ProgramRuleActionType +import org.hisp.dhis.rules.api.RuleSupplementaryData import org.hisp.dhis.rules.models.Rule import org.hisp.dhis.rules.models.RuleAction import org.hisp.dhis.rules.models.RuleEnrollment @@ -22,12 +24,13 @@ class RuleEngineHelperTest { data: String, actionType: String, priority: Int?, + values: Map<String, String> = emptyMap(), ): Rule = Rule( condition = "true", actions = listOf( - RuleAction(data = "'$data'", type = actionType), + RuleAction(data = "'$data'", type = actionType, values = values), ), uid = data, name = "Rule 1", @@ -76,7 +79,7 @@ class RuleEngineHelperTest { whenever(rulesRepository.rules(any(), anyOrNull())) doReturn rules whenever(rulesRepository.ruleVariables(any())) doReturn emptyList() - whenever(rulesRepository.supplementaryData(any())) doReturn emptyMap() + whenever(rulesRepository.supplementaryData(any())) doReturn RuleSupplementaryData() whenever(rulesRepository.constants()) doReturn emptyMap() whenever(rulesRepository.enrollmentEvents(any())) doReturn emptyList() whenever(rulesRepository.getRuleEnrollment(any())) doReturn createEnrollment() @@ -93,4 +96,35 @@ class RuleEngineHelperTest { listOf("Rule1", "Rule4", "Rule2", "Rule3"), ) } + + @Test + fun `Should return values passed to ruleActions`() = + runTest { + val rules = + listOf( + createFeedbackRule( + data = "Rule1", + actionType = ProgramRuleActionType.DISPLAYKEYVALUEPAIR.name, + priority = 1, + values = mapOf(LEGENDSET_LABEL to "test_legend_set"), + ), + ) + + whenever(rulesRepository.rules(any(), anyOrNull())) doReturn rules + whenever(rulesRepository.ruleVariables(any())) doReturn emptyList() + whenever(rulesRepository.supplementaryData(any())) doReturn RuleSupplementaryData() + whenever(rulesRepository.constants()) doReturn emptyMap() + whenever(rulesRepository.enrollmentEvents(any())) doReturn emptyList() + whenever(rulesRepository.getRuleEnrollment(any())) doReturn createEnrollment() + whenever(rulesRepository.queryAttributeValues(any())) doReturn emptyList() + whenever(rulesRepository.enrollmentProgram(any())) doReturn Pair("program", "orgunit") + + val engineHelper = + RuleEngineHelper(EvaluationType.Enrollment("enrollment"), rulesRepository) + + val ruleEffects = engineHelper.evaluate() + + assertEquals(ruleEffects.size, 1) + assertEquals(ruleEffects.first().ruleAction.values, mapOf(LEGENDSET_LABEL to "test_legend_set")) + } } diff --git a/dhis2-mobile-program-rules/src/test/java/org/dhis2/mobileProgramRules/RulesRepositoryTest.kt b/dhis2-mobile-program-rules/src/test/java/org/dhis2/mobileProgramRules/RulesRepositoryTest.kt index 6bb1e5c5f4e..295016ffaf0 100644 --- a/dhis2-mobile-program-rules/src/test/java/org/dhis2/mobileProgramRules/RulesRepositoryTest.kt +++ b/dhis2-mobile-program-rules/src/test/java/org/dhis2/mobileProgramRules/RulesRepositoryTest.kt @@ -38,22 +38,21 @@ class RulesRepositoryTest { runBlocking { repository.supplementaryData("org_unit_test") } - assertTrue(supplData.isNotEmpty()) - assertTrue(supplData.containsKey("USER_ROLES")) - assertTrue(supplData.containsKey("USER_GROUPS")) - assertTrue(supplData.containsKey("org_unit_group_test_code")) - assertTrue(supplData.containsKey("org_unit_group_test")) - assertTrue(supplData["USER_ROLES"]?.contains("UtXToHNI0Cb") ?: false) - assertTrue(supplData["USER_ROLES"]?.contains("oPNOIj7zJ1m") ?: false) - assertTrue(supplData["USER_GROUPS"]?.contains("gVC8vCfNAx8") ?: false) - assertTrue(supplData["USER_GROUPS"]?.contains("Kk12LkEWtXp") ?: false) + assertTrue(supplData.userRoles.isNotEmpty()) + assertTrue(supplData.userGroups.isNotEmpty()) + assertTrue(supplData.orgUnitGroups.containsKey("org_unit_group_test_code")) + assertTrue(supplData.orgUnitGroups.containsKey("org_unit_group_test")) + assertTrue(supplData.userRoles.contains("UtXToHNI0Cb")) + assertTrue(supplData.userRoles.contains("oPNOIj7zJ1m")) + assertTrue(supplData.userGroups.contains("gVC8vCfNAx8")) + assertTrue(supplData.userGroups.contains("Kk12LkEWtXp")) assertTrue( - supplData + supplData.orgUnitGroups .getOrElse("org_unit_group_test") { arrayListOf() } .contains("org_unit_test"), ) assertTrue( - supplData + supplData.orgUnitGroups .getOrElse("org_unit_group_test_code") { arrayListOf() } .contains("org_unit_test"), ) @@ -77,19 +76,21 @@ class RulesRepositoryTest { repository.supplementaryData("org_unit_test") } - assertTrue(supplData.isNotEmpty()) - - assertTrue(supplData.containsKey("USER_ROLES")) - assertTrue(!supplData.containsKey("org_unit_group_test_code")) - assertTrue(supplData.containsKey("org_unit_group_test")) - assertTrue(supplData["USER_ROLES"]?.contains("UtXToHNI0Cb") ?: false) - assertTrue(supplData["USER_ROLES"]?.contains("oPNOIj7zJ1m") ?: false) + assertTrue(supplData.userRoles.isNotEmpty()) + assertTrue(!supplData.orgUnitGroups.containsKey("org_unit_group_test_code")) + assertTrue(supplData.orgUnitGroups.containsKey("org_unit_group_test")) + assertTrue(supplData.userRoles.contains("UtXToHNI0Cb")) + assertTrue(supplData.userRoles.contains("oPNOIj7zJ1m")) assertTrue( - supplData + supplData.orgUnitGroups .getOrElse("org_unit_group_test") { arrayListOf() } .contains("org_unit_test"), ) - assertTrue(supplData.getOrElse("org_unit_group_test_code") { arrayListOf() }.isEmpty()) + assertTrue( + supplData.orgUnitGroups + .getOrElse("org_unit_group_test_code") { arrayListOf() } + .isEmpty(), + ) } private fun getTestUserRoles(): List<String> = arrayListOf("UtXToHNI0Cb", "oPNOIj7zJ1m") diff --git a/dhis2_android_maps/build.gradle.kts b/dhis2_android_maps/build.gradle.kts index c5dc169b4bb..c39c2c4290a 100644 --- a/dhis2_android_maps/build.gradle.kts +++ b/dhis2_android_maps/build.gradle.kts @@ -2,7 +2,7 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { id("com.android.library") - kotlin("android") + alias(libs.plugins.legacy.kapt) id("com.google.devtools.ksp") alias(libs.plugins.kotlin.compose.compiler) alias(libs.plugins.kotlin.serialization) @@ -52,6 +52,10 @@ kotlin { } } +kapt { + correctErrorTypes = true +} + dependencies { implementation(project(":commons")) implementation(project(":commonskmm")) diff --git a/dhis2_android_maps/src/main/java/org/dhis2/maps/attribution/AttributionManager.kt b/dhis2_android_maps/src/main/java/org/dhis2/maps/attribution/AttributionManager.kt index 0caf0c55c9c..26101f2933e 100644 --- a/dhis2_android_maps/src/main/java/org/dhis2/maps/attribution/AttributionManager.kt +++ b/dhis2_android_maps/src/main/java/org/dhis2/maps/attribution/AttributionManager.kt @@ -22,7 +22,7 @@ class AttributionManager( ) : AttributionDialogManager(context, maplibreMap) { override fun showAttributionDialog(attributionTitles: Array<String>) { val attributions: Array<String> = - currentBaseMapStyle.sources.attribution + currentBaseMapStyle.attribution .split(", ") .map { HtmlCompat.fromHtml(it, HtmlCompat.FROM_HTML_MODE_LEGACY).toString() @@ -34,7 +34,7 @@ class AttributionManager( dialog: DialogInterface?, which: Int, ) { - val selectedAttribution = currentBaseMapStyle.sources.attribution.split(", ")[which] + val selectedAttribution = currentBaseMapStyle.attribution.split(", ")[which] val url = HtmlCompat .fromHtml(selectedAttribution, HtmlCompat.FROM_HTML_MODE_LEGACY) diff --git a/dhis2_android_maps/src/main/java/org/dhis2/maps/layer/basemaps/BaseMapStyle.kt b/dhis2_android_maps/src/main/java/org/dhis2/maps/layer/basemaps/BaseMapStyle.kt index 08fd2af2170..c89a1ed5192 100644 --- a/dhis2_android_maps/src/main/java/org/dhis2/maps/layer/basemaps/BaseMapStyle.kt +++ b/dhis2_android_maps/src/main/java/org/dhis2/maps/layer/basemaps/BaseMapStyle.kt @@ -1,25 +1,31 @@ package org.dhis2.maps.layer.basemaps -import com.google.gson.annotations.SerializedName - object BaseMapStyleBuilder { fun build( id: String, tileUrls: List<String>, attribution: String, + overlays: List<Overlay>, isDefault: Boolean, ) = BaseMapStyle( version = 8, sources = - StyleSources( - rasterTiles = + mapOf( + "raster-tiles" to RasterTiles( type = "raster", tiles = tileUrls, tileSize = 256, ), - attribution = attribution, - ), + ) + + overlays.associate { overlay -> + overlay.id to + RasterTiles( + type = "raster", + tiles = overlay.tiles, + tileSize = 256, + ) + }, layers = listOf( StyleLayers( @@ -29,10 +35,23 @@ object BaseMapStyleBuilder { minZoom = 0, maxZoom = 22, ), - ), + ) + + overlays.map { overlay -> + StyleLayers( + id = overlay.id, + type = "raster", + source = overlay.id, + minZoom = 0, + maxZoom = 22, + ) + }, id = id, glyphs = DEFAULT_GLYPH_URL, isDefault = isDefault, + attribution = + (listOf(attribution) + overlays.map { overlay -> overlay.attribution }).joinToString( + separator = ", ", + ), ) fun internalBaseMap(): BaseMapStyle = @@ -47,20 +66,23 @@ object BaseMapStyleBuilder { ), attribution = DEFAULT_ATTRIBUTION, isDefault = true, + overlays = emptyList(), ) } data class BaseMapStyle( val version: Int, - val sources: StyleSources, + val sources: Map<String, RasterTiles>, val layers: List<StyleLayers>, val id: String, var glyphs: String, val isDefault: Boolean, + val attribution: String, ) -data class StyleSources( - @SerializedName("raster-tiles") val rasterTiles: RasterTiles, +data class Overlay( + val id: String, + val tiles: List<String>, val attribution: String, ) diff --git a/dhis2_android_maps/src/main/java/org/dhis2/maps/managers/MapManager.kt b/dhis2_android_maps/src/main/java/org/dhis2/maps/managers/MapManager.kt index 16e88425ca3..4ed02238894 100644 --- a/dhis2_android_maps/src/main/java/org/dhis2/maps/managers/MapManager.kt +++ b/dhis2_android_maps/src/main/java/org/dhis2/maps/managers/MapManager.kt @@ -3,6 +3,7 @@ package org.dhis2.maps.managers import android.annotation.SuppressLint import android.app.Activity import android.os.Bundle +import android.view.Gravity import androidx.core.content.ContextCompat import androidx.core.location.LocationListenerCompat import androidx.lifecycle.Lifecycle @@ -143,6 +144,7 @@ abstract class MapManager( ), ) uiSettings.isLogoEnabled = false + uiSettings.attributionGravity = Gravity.TOP or Gravity.START uiSettings.setAttributionMargins( defaultUiIconLeftMargin, uiSettings.attributionMarginTop, @@ -265,7 +267,9 @@ abstract class MapManager( permissionsManager = PermissionsManager( object : PermissionsListener { - override fun onExplanationNeeded(permissionsToExplain: MutableList<String>?) {} + override fun onExplanationNeeded(permissionsToExplain: MutableList<String>?) { + // no-op + } override fun onPermissionResult(granted: Boolean) { if (granted) { @@ -320,7 +324,9 @@ abstract class MapManager( permissionsManager = PermissionsManager( object : PermissionsListener { - override fun onExplanationNeeded(permissionsToExplain: MutableList<String>?) {} + override fun onExplanationNeeded(permissionsToExplain: MutableList<String>?) { + // no-op + } override fun onPermissionResult(granted: Boolean) { if (granted) { diff --git a/dhis2_android_maps/src/main/java/org/dhis2/maps/managers/TeiMapManager.kt b/dhis2_android_maps/src/main/java/org/dhis2/maps/managers/TeiMapManager.kt index ce49e1481de..838c66bc95f 100644 --- a/dhis2_android_maps/src/main/java/org/dhis2/maps/managers/TeiMapManager.kt +++ b/dhis2_android_maps/src/main/java/org/dhis2/maps/managers/TeiMapManager.kt @@ -39,6 +39,7 @@ class TeiMapManager( private var fieldFeatureCollections: Map<String, FeatureCollection> = emptyMap() private var teiFeatureCollections: HashMap<String, FeatureCollection>? = null private var eventsFeatureCollection: Map<String, FeatureCollection>? = null + private var hasPerformedInitialAutoSelection = false var mapStyle: MapStyle? = null private var teiImages: HashMap<String, Bitmap> = hashMapOf() var teiFeatureType: FeatureType? = FeatureType.POINT @@ -300,6 +301,47 @@ class TeiMapManager( return wrappedDrawable } + fun autoSelectFirstLayerWithData(): Boolean { + if (hasPerformedInitialAutoSelection) return false + hasPerformedInitialAutoSelection = true + + val firstSource = findFirstSourceWithData() ?: return false + + mapLayerManager.mapLayers.keys.forEach { sourceId -> + mapLayerManager.handleLayer(sourceId, sourceId == firstSource) + } + return true + } + + private fun findFirstSourceWithData(): String? { + listOf(TEIS_SOURCE_ID, ENROLLMENT_SOURCE_ID).forEach { sourceId -> + if (teiFeatureCollections?.get(sourceId)?.features()?.isNotEmpty() == true && + mapLayerManager.mapLayers.containsKey(sourceId) + ) return sourceId + } + eventsFeatureCollection?.forEach { (sourceId, fc) -> + if (fc.features()?.isNotEmpty() == true && mapLayerManager.mapLayers.containsKey(sourceId)) { + return sourceId + } + } + fieldFeatureCollections.forEach { (sourceId, fc) -> + if (fc.features()?.isNotEmpty() == true && mapLayerManager.mapLayers.containsKey(sourceId)) { + return sourceId + } + } + teiFeatureCollections + ?.filterKeys { + it != TEIS_SOURCE_ID && + it != ENROLLMENT_SOURCE_ID && + eventsFeatureCollection?.containsKey(it) == false + }?.forEach { (sourceId, fc) -> + if (fc.features()?.isNotEmpty() == true && mapLayerManager.mapLayers.containsKey(sourceId)) { + return sourceId + } + } + return null + } + override fun findFeature( source: String, propertyName: String, diff --git a/dhis2_android_maps/src/main/java/org/dhis2/maps/model/RelationshipUiComponentModel.kt b/dhis2_android_maps/src/main/java/org/dhis2/maps/model/RelationshipUiComponentModel.kt index fa0a95f7286..ac597eb1f94 100644 --- a/dhis2_android_maps/src/main/java/org/dhis2/maps/model/RelationshipUiComponentModel.kt +++ b/dhis2_android_maps/src/main/java/org/dhis2/maps/model/RelationshipUiComponentModel.kt @@ -1,7 +1,5 @@ package org.dhis2.maps.model -import org.dhis2.commons.data.CarouselItemModel -import org.hisp.dhis.android.core.common.FeatureType import org.hisp.dhis.android.core.common.Geometry data class RelationshipUiComponentModel( @@ -13,11 +11,7 @@ data class RelationshipUiComponentModel( val from: TeiMap, val to: TeiMap, val canBeDeleted: Boolean? = true, -) : CarouselItemModel { - override fun uid(): String = relationshipUid - - fun shouldShowNavigationButton(): Boolean = to.geometry?.type() == FeatureType.POINT -} +) data class TeiMap( val teiUid: String?, diff --git a/dhis2_android_maps/src/main/java/org/dhis2/maps/usecases/MapStyleConfiguration.kt b/dhis2_android_maps/src/main/java/org/dhis2/maps/usecases/MapStyleConfiguration.kt index 344fa8d6dab..24cdbad8a33 100644 --- a/dhis2_android_maps/src/main/java/org/dhis2/maps/usecases/MapStyleConfiguration.kt +++ b/dhis2_android_maps/src/main/java/org/dhis2/maps/usecases/MapStyleConfiguration.kt @@ -3,9 +3,11 @@ package org.dhis2.maps.usecases import org.dhis2.commons.data.ProgramConfigurationRepository import org.dhis2.maps.layer.basemaps.BaseMapStyle import org.dhis2.maps.layer.basemaps.BaseMapStyleBuilder.build +import org.dhis2.maps.layer.basemaps.Overlay import org.dhis2.maps.model.MapScope import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.map.layer.MapLayerImageryProvider +import org.hisp.dhis.android.core.map.layer.MapLayerPosition const val DEFAULT_FORCED_LOCATION_ACCURACY = -1 @@ -61,6 +63,8 @@ class MapStyleConfiguration( .mapsModule() .mapLayers() .withImageryProviders() + .byMapLayerPosition() + .eq(MapLayerPosition.BASEMAP) .blockingGet() .map { mapLayer -> val id = mapLayer.displayName() @@ -71,7 +75,35 @@ class MapStyleConfiguration( mapLayer.subdomains(), ) val attribution = mapLayer.imageryProviders().mapAttribution() - build(id, tileUrls, attribution, defaultMap == mapLayer.uid()) + + val overlays = + d2 + .mapsModule() + .mapLayers() + .withImageryProviders() + .byLinkedLayerUid() + .eq(mapLayer.uid()) + .byMapLayerPosition() + .eq(MapLayerPosition.OVERLAY) + .blockingGet() + + val basemapOverlays = + overlays.map { overlay -> + val id = overlay.displayName() + val tileUrls = + overlay.imageUrl().mapTileUrls( + overlay.subdomainPlaceholder(), + overlay.subdomains(), + ) + val attribution = overlay.imageryProviders().mapAttribution() + Overlay( + id = id, + tiles = tileUrls, + attribution = attribution, + ) + } + + build(id, tileUrls, attribution, basemapOverlays, defaultMap == mapLayer.uid()) } } diff --git a/dhis2_android_maps/src/main/java/org/dhis2/maps/utils/CoordinateUtils.kt b/dhis2_android_maps/src/main/java/org/dhis2/maps/utils/CoordinateUtils.kt index 97c301ac38f..4d0769d1268 100644 --- a/dhis2_android_maps/src/main/java/org/dhis2/maps/utils/CoordinateUtils.kt +++ b/dhis2_android_maps/src/main/java/org/dhis2/maps/utils/CoordinateUtils.kt @@ -42,9 +42,13 @@ object CoordinateUtils { is Polygon -> { val value = geometry.coordinates().map { polygon -> - polygon.map { point -> + val polygonCoordinates = polygon.map { point -> point.coordinates().map { coordinate -> coordinate.truncate() } + }.toMutableList() + if (polygonCoordinates.first() != polygonCoordinates.last()) { + polygonCoordinates.add(polygonCoordinates.first()) } + polygonCoordinates } Gson().toJson(value) } diff --git a/dhis2_android_maps/src/main/res/values-ar/strings.xml b/dhis2_android_maps/src/main/res/values-ar/strings.xml index ccae4686fd0..46f22b2e4a1 100644 --- a/dhis2_android_maps/src/main/res/values-ar/strings.xml +++ b/dhis2_android_maps/src/main/res/values-ar/strings.xml @@ -8,7 +8,6 @@ <string name="dialog_layer_base_map_bing_dark">Bing داكن</string> <string name="dialog_layer_base_map_bing_aerial">Bing جوي</string> <string name="action_apply">تطبيق</string> - <string name="dialog_layer_satellite">إظهار عرض القمر الصناعي</string> <string name="dialog_layer_event">إظهار الأحداث</string> <string name="dialog_layer_tei_coordinates">إظهار إحداثيات tei</string> <string name="dialog_layer_heatmap">إظهار طبقة مخطط الحرارة</string> diff --git a/dhis2_android_maps/src/main/res/values-cs/strings.xml b/dhis2_android_maps/src/main/res/values-cs/strings.xml index d3f4de029f2..28c0d6f34db 100644 --- a/dhis2_android_maps/src/main/res/values-cs/strings.xml +++ b/dhis2_android_maps/src/main/res/values-cs/strings.xml @@ -13,7 +13,6 @@ <string name="dialog_layer_base_map_azure_aerial">Azure Aerial</string> <string name="dialog_layer_base_map_azure_aerial_label">Azure Aerial Labels</string> <string name="action_apply">Použít</string> - <string name="dialog_layer_satellite">Zobrazit satelitní pohled</string> <string name="dialog_layer_event">Zobrazit události</string> <string name="dialog_layer_tei_coordinates">Zobrazit TEI souřadnice</string> <string name="dialog_layer_heatmap">Zobrazit vrstvu teplotní mapy</string> diff --git a/dhis2_android_maps/src/main/res/values-es-rES/strings.xml b/dhis2_android_maps/src/main/res/values-es-rES/strings.xml index b28858e97a5..4cdeb71a5ca 100644 --- a/dhis2_android_maps/src/main/res/values-es-rES/strings.xml +++ b/dhis2_android_maps/src/main/res/values-es-rES/strings.xml @@ -3,7 +3,6 @@ <string name="select_location">Seleccione ubicación</string> <string name="map_layers">Capas del Mapa</string> <string name="action_apply">Aplicar</string> - <string name="dialog_layer_satellite">Mostrar vista satélite</string> <string name="dialog_layer_event">Mostrar eventos</string> <string name="dialog_layer_tei_coordinates">Mostrar coordenadas de la entidad</string> <string name="dialog_layer_heatmap">Mostrar mapa de calor</string> diff --git a/dhis2_android_maps/src/main/res/values-es/strings.xml b/dhis2_android_maps/src/main/res/values-es/strings.xml index 2f5e8d549f8..653d67fcd5b 100644 --- a/dhis2_android_maps/src/main/res/values-es/strings.xml +++ b/dhis2_android_maps/src/main/res/values-es/strings.xml @@ -13,7 +13,6 @@ <string name="dialog_layer_base_map_azure_aerial">Azure Vista Aérea</string> <string name="dialog_layer_base_map_azure_aerial_label">Azure Vista Aérea con Etiquetas</string> <string name="action_apply">Aplicar</string> - <string name="dialog_layer_satellite">Mostrar vista satélite</string> <string name="dialog_layer_event">Mostrar eventos</string> <string name="dialog_layer_tei_coordinates">Mostrar coordenadas de la entidad</string> <string name="dialog_layer_heatmap">Mostrar mapa de calor</string> diff --git a/dhis2_android_maps/src/main/res/values-fr/strings.xml b/dhis2_android_maps/src/main/res/values-fr/strings.xml index 6f9b664bd07..43fb4f3467e 100644 --- a/dhis2_android_maps/src/main/res/values-fr/strings.xml +++ b/dhis2_android_maps/src/main/res/values-fr/strings.xml @@ -13,7 +13,6 @@ <string name="dialog_layer_base_map_azure_aerial">Azure Vue Aérienne</string> <string name="dialog_layer_base_map_azure_aerial_label">Azure Vue Aérienne avec Étiquettes</string> <string name="action_apply">Appliquer</string> - <string name="dialog_layer_satellite">Afficher la vue satellite</string> <string name="dialog_layer_event">Afficher les événements</string> <string name="dialog_layer_tei_coordinates">Afficher les coordonnées tei</string> <string name="dialog_layer_heatmap">Afficher la couche de carte thermique</string> diff --git a/dhis2_android_maps/src/main/res/values-id/strings.xml b/dhis2_android_maps/src/main/res/values-id/strings.xml index 8c0622a1bf2..858c95d691e 100644 --- a/dhis2_android_maps/src/main/res/values-id/strings.xml +++ b/dhis2_android_maps/src/main/res/values-id/strings.xml @@ -3,7 +3,6 @@ <string name="select_location">Pilih lokasi</string> <string name="dialog_layer_base_map_bing_dark">Bing Dark</string> <string name="action_apply">Terapkan</string> - <string name="dialog_layer_satellite">Tampilkan citra satelit</string> <string name="dialog_layer_event">Tampilkan even</string> <string name="dialog_layer_tei_coordinates">Tampilkan koordinat tei</string> <string name="accuracy_low">Rendah</string> diff --git a/dhis2_android_maps/src/main/res/values-nb/strings.xml b/dhis2_android_maps/src/main/res/values-nb/strings.xml index dcfacaa3265..15209820af7 100644 --- a/dhis2_android_maps/src/main/res/values-nb/strings.xml +++ b/dhis2_android_maps/src/main/res/values-nb/strings.xml @@ -9,7 +9,6 @@ <string name="dialog_layer_base_map_bing_aerial">Bing Flyfoto</string> <string name="dialog_layer_base_map_bing_aerial_label">Bing Flyfoto Etiketter</string> <string name="action_apply">Bruk</string> - <string name="dialog_layer_satellite">Vis satelittvisning</string> <string name="dialog_layer_event">Vis hendelser</string> <string name="dialog_layer_tei_coordinates">Vis tei koordinater</string> <string name="dialog_layer_heatmap">Vis varmekartlag</string> diff --git a/dhis2_android_maps/src/main/res/values-nl/strings.xml b/dhis2_android_maps/src/main/res/values-nl/strings.xml index 354543d1e7a..125f4efbee9 100644 --- a/dhis2_android_maps/src/main/res/values-nl/strings.xml +++ b/dhis2_android_maps/src/main/res/values-nl/strings.xml @@ -9,7 +9,6 @@ <string name="dialog_layer_base_map_bing_aerial">Bing Aerial</string> <string name="dialog_layer_base_map_bing_aerial_label">Bing Aerial Labels</string> <string name="action_apply">Toepassen</string> - <string name="dialog_layer_satellite">Satellietweergave tonen</string> <string name="dialog_layer_event">Toon evenementen</string> <string name="dialog_layer_tei_coordinates">Toon tei-coördinaten</string> <string name="dialog_layer_heatmap">Warmtebeeld weergeven</string> diff --git a/dhis2_android_maps/src/main/res/values-pt/strings.xml b/dhis2_android_maps/src/main/res/values-pt/strings.xml index 2be6fdd4180..2c0b8f2a127 100644 --- a/dhis2_android_maps/src/main/res/values-pt/strings.xml +++ b/dhis2_android_maps/src/main/res/values-pt/strings.xml @@ -9,7 +9,6 @@ <string name="dialog_layer_base_map_bing_aerial">Bing Aerial</string> <string name="dialog_layer_base_map_bing_aerial_label">Etiquetas aéreas do Bing</string> <string name="action_apply">Aplicar</string> - <string name="dialog_layer_satellite">Mostrar vista de satélite</string> <string name="dialog_layer_event">Mostrar eventos</string> <string name="dialog_layer_tei_coordinates">Mostrar coordenadas tei</string> <string name="dialog_layer_heatmap">Mostrar camada do mapa de calor</string> diff --git a/dhis2_android_maps/src/main/res/values-uk/strings.xml b/dhis2_android_maps/src/main/res/values-uk/strings.xml index d4e032c7d59..c54dced58a5 100644 --- a/dhis2_android_maps/src/main/res/values-uk/strings.xml +++ b/dhis2_android_maps/src/main/res/values-uk/strings.xml @@ -8,7 +8,6 @@ <string name="dialog_layer_base_map_bing_aerial">Bing - супутник</string> <string name="dialog_layer_base_map_bing_aerial_label">Bing - супутник з мітками</string> <string name="action_apply">Застосувати</string> - <string name="dialog_layer_satellite">Показати як вид із супутника</string> <string name="dialog_layer_event">Показати випадки</string> <string name="dialog_layer_tei_coordinates">Показати координати об\'єкту, який відстежується</string> <string name="dialog_layer_heatmap">Показати шар теплової карти</string> diff --git a/dhis2_android_maps/src/main/res/values-uz-rUZ/strings.xml b/dhis2_android_maps/src/main/res/values-uz-rUZ/strings.xml index a8e4050f2d2..547d1374d8f 100644 --- a/dhis2_android_maps/src/main/res/values-uz-rUZ/strings.xml +++ b/dhis2_android_maps/src/main/res/values-uz-rUZ/strings.xml @@ -9,7 +9,6 @@ <string name="dialog_layer_base_map_bing_aerial">Gibrid koʼrinish</string> <string name="dialog_layer_base_map_bing_aerial_label">Belgilar</string> <string name="action_apply">Murojaat qilish</string> - <string name="dialog_layer_satellite">Suniy yoʼldosh koʼrinishini koʼrsatish</string> <string name="dialog_layer_event">Hodisa/tadbirlarni koʼrsatish</string> <string name="dialog_layer_tei_coordinates">TEI koordinatalarini koʼrsatish</string> <string name="dialog_layer_heatmap">Issiqlik xaritasi qatlamini koʼrsatish</string> diff --git a/dhis2_android_maps/src/main/res/values-uz/strings.xml b/dhis2_android_maps/src/main/res/values-uz/strings.xml index 08f61f883ae..af6486c4288 100644 --- a/dhis2_android_maps/src/main/res/values-uz/strings.xml +++ b/dhis2_android_maps/src/main/res/values-uz/strings.xml @@ -9,7 +9,6 @@ <string name="dialog_layer_base_map_bing_aerial">Гибрид кўриниш</string> <string name="dialog_layer_base_map_bing_aerial_label">Қатлам белгилари</string> <string name="action_apply">Мурожаат қилиш</string> - <string name="dialog_layer_satellite">Суньий йўлдош кўринишини кўрсатиш</string> <string name="dialog_layer_event">Ҳодиса/тадбирларни кўрсатиш</string> <string name="dialog_layer_tei_coordinates">TEI координаталарини кўрсатиш</string> <string name="dialog_layer_heatmap">Иссиқлик харитаси қатламини кўрсатиш</string> diff --git a/dhis2_android_maps/src/main/res/values-vi/strings.xml b/dhis2_android_maps/src/main/res/values-vi/strings.xml index f87647d0c88..c073b974087 100644 --- a/dhis2_android_maps/src/main/res/values-vi/strings.xml +++ b/dhis2_android_maps/src/main/res/values-vi/strings.xml @@ -13,7 +13,6 @@ <string name="dialog_layer_base_map_azure_aerial">Azure Aerial</string> <string name="dialog_layer_base_map_azure_aerial_label">Azure Aerial Labels</string> <string name="action_apply">Áp dụng</string> - <string name="dialog_layer_satellite">Xem Vệ Tinh</string> <string name="dialog_layer_event">Hiển thị sự kiện</string> <string name="dialog_layer_tei_coordinates">Hiển thị tọa độ đối tượng theo dõi</string> <string name="dialog_layer_heatmap">Hiển thị lớp bản đồ nhiệt độ</string> diff --git a/dhis2_android_maps/src/main/res/values-zh-rCN/strings.xml b/dhis2_android_maps/src/main/res/values-zh-rCN/strings.xml index 8cb78453585..f88f85ddd6e 100644 --- a/dhis2_android_maps/src/main/res/values-zh-rCN/strings.xml +++ b/dhis2_android_maps/src/main/res/values-zh-rCN/strings.xml @@ -9,7 +9,6 @@ <string name="dialog_layer_base_map_bing_aerial">Bing空间图</string> <string name="dialog_layer_base_map_bing_aerial_label">Bing空间标示图</string> <string name="action_apply">应用</string> - <string name="dialog_layer_satellite">显示卫星视图</string> <string name="dialog_layer_event">显示事件</string> <string name="dialog_layer_tei_coordinates">显示跟踪实体坐标</string> <string name="dialog_layer_heatmap">显示热力图</string> diff --git a/dhis2_android_maps/src/main/res/values-zh/strings.xml b/dhis2_android_maps/src/main/res/values-zh/strings.xml index 22b721b4b4a..ca7e398e6b0 100644 --- a/dhis2_android_maps/src/main/res/values-zh/strings.xml +++ b/dhis2_android_maps/src/main/res/values-zh/strings.xml @@ -13,7 +13,6 @@ <string name="dialog_layer_base_map_azure_aerial">Azure 卫星图</string> <string name="dialog_layer_base_map_azure_aerial_label">Azure 卫星带标签图</string> <string name="action_apply">应用</string> - <string name="dialog_layer_satellite">显示卫星视图</string> <string name="dialog_layer_event">显示事件</string> <string name="dialog_layer_tei_coordinates">显示跟踪实体坐标</string> <string name="dialog_layer_heatmap">显示热力图</string> diff --git a/dhis2_android_maps/src/main/res/values/strings.xml b/dhis2_android_maps/src/main/res/values/strings.xml index 55fa70bc72f..61b2027b56a 100644 --- a/dhis2_android_maps/src/main/res/values/strings.xml +++ b/dhis2_android_maps/src/main/res/values/strings.xml @@ -13,7 +13,6 @@ <string name="dialog_layer_base_map_azure_aerial">Azure Aerial</string> <string name="dialog_layer_base_map_azure_aerial_label">Azure Aerial Labels</string> <string name="action_apply">Apply</string> - <string name="dialog_layer_satellite">Show satellite view</string> <string name="dialog_layer_event">Show events</string> <string name="dialog_layer_tei_coordinates">Show tei coordinates</string> <string name="dialog_layer_heatmap">Show heatmap layer</string> diff --git a/dhis2_android_maps/src/test/java/org/dhis2/maps/usecases/MapMocks.kt b/dhis2_android_maps/src/test/java/org/dhis2/maps/usecases/MapMocks.kt new file mode 100644 index 00000000000..3982f0da4db --- /dev/null +++ b/dhis2_android_maps/src/test/java/org/dhis2/maps/usecases/MapMocks.kt @@ -0,0 +1,60 @@ +package org.dhis2.maps.usecases + +import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.arch.repositories.filters.internal.EnumFilterConnector +import org.hisp.dhis.android.core.arch.repositories.filters.internal.StringFilterConnector +import org.hisp.dhis.android.core.map.layer.MapLayer +import org.hisp.dhis.android.core.map.layer.MapLayerCollectionRepository +import org.hisp.dhis.android.core.map.layer.MapLayerPosition +import org.mockito.kotlin.any +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever + +private val stringFilterConnector: StringFilterConnector<MapLayerCollectionRepository> = mock() +private val enumFilterConnector: EnumFilterConnector<MapLayerCollectionRepository, MapLayerPosition> = + mock() + +fun mockBasemaps( + d2: D2, + mockedBasemap: List<MapLayer>, +) { + val mockedMapLayerCollectionRepository: MapLayerCollectionRepository = mock() + + whenever(d2.mapsModule().mapLayers()) doReturn mockedMapLayerCollectionRepository + whenever(mockedMapLayerCollectionRepository.withImageryProviders()) doReturn mockedMapLayerCollectionRepository + whenever( + mockedMapLayerCollectionRepository.byMapLayerPosition(), + ) doReturn enumFilterConnector + whenever( + enumFilterConnector.eq(MapLayerPosition.BASEMAP), + ) doReturn mockedMapLayerCollectionRepository + whenever( + mockedMapLayerCollectionRepository.blockingGet(), + ) doReturn mockedBasemap +} + +fun mockOverlays( + d2: D2, + mockedOverlays: List<MapLayer>, +) { + val mockedMapLayerCollectionRepository: MapLayerCollectionRepository = mock() + + whenever(d2.mapsModule().mapLayers()) doReturn mockedMapLayerCollectionRepository + whenever(mockedMapLayerCollectionRepository.withImageryProviders()) doReturn mockedMapLayerCollectionRepository + whenever( + mockedMapLayerCollectionRepository.byLinkedLayerUid(), + ) doReturn stringFilterConnector + whenever( + stringFilterConnector.eq(any()), + ) doReturn mockedMapLayerCollectionRepository + whenever( + mockedMapLayerCollectionRepository.byMapLayerPosition(), + ) doReturn enumFilterConnector + whenever( + enumFilterConnector.eq(MapLayerPosition.OVERLAY), + ) doReturn mockedMapLayerCollectionRepository + whenever( + mockedMapLayerCollectionRepository.blockingGet(), + ) doReturn mockedOverlays +} diff --git a/dhis2_android_maps/src/test/java/org/dhis2/maps/usecases/MapSelectorViewModelTest.kt b/dhis2_android_maps/src/test/java/org/dhis2/maps/usecases/MapSelectorViewModelTest.kt index 43c3d378d43..79385c218f8 100644 --- a/dhis2_android_maps/src/test/java/org/dhis2/maps/usecases/MapSelectorViewModelTest.kt +++ b/dhis2_android_maps/src/test/java/org/dhis2/maps/usecases/MapSelectorViewModelTest.kt @@ -25,7 +25,6 @@ import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.common.FeatureType import org.hisp.dhis.android.core.map.layer.MapLayer import org.hisp.dhis.android.core.map.layer.MapLayerPosition -import org.hisp.dhis.android.core.settings.SystemSetting import org.hisp.dhis.mobile.ui.designsystem.component.model.LocationItemModel import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue @@ -133,20 +132,8 @@ class MapSelectorViewModelTest { @Test fun shouldFetchBaseMaps() = runTest { - whenever( - d2 - .settingModule() - .systemSetting() - .defaultBaseMap() - .blockingGet(), - ) doReturn SystemSetting.builder().value("defaultBaseMapUid").build() - whenever( - d2 - .mapsModule() - .mapLayers() - .withImageryProviders() - .blockingGet(), - ) doReturn + mockBasemaps( + d2, listOf( MapLayer .builder() @@ -160,7 +147,9 @@ class MapSelectorViewModelTest { .external(false) .mapLayerPosition(MapLayerPosition.BASEMAP) .build(), - ) + ), + ) + mockOverlays(d2, emptyList()) val baseMaps = mapSelectorViewModel.fetchMapStyles() assertTrue(baseMaps.isNotEmpty()) } diff --git a/dhis2_android_maps/src/test/java/org/dhis2/maps/usecases/MapStyleConfigurationTest.kt b/dhis2_android_maps/src/test/java/org/dhis2/maps/usecases/MapStyleConfigurationTest.kt index e83d7e29b02..2dd2378f71c 100644 --- a/dhis2_android_maps/src/test/java/org/dhis2/maps/usecases/MapStyleConfigurationTest.kt +++ b/dhis2_android_maps/src/test/java/org/dhis2/maps/usecases/MapStyleConfigurationTest.kt @@ -3,7 +3,10 @@ package org.dhis2.maps.usecases import org.dhis2.commons.data.ProgramConfigurationRepository import org.dhis2.maps.model.MapScope import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.arch.repositories.filters.internal.EnumFilterConnector +import org.hisp.dhis.android.core.arch.repositories.filters.internal.StringFilterConnector import org.hisp.dhis.android.core.map.layer.MapLayer +import org.hisp.dhis.android.core.map.layer.MapLayerCollectionRepository import org.hisp.dhis.android.core.map.layer.MapLayerImageryProvider import org.hisp.dhis.android.core.map.layer.MapLayerPosition import org.hisp.dhis.android.core.settings.DataSetConfigurationSetting @@ -18,7 +21,7 @@ import org.mockito.kotlin.mock import org.mockito.kotlin.whenever class MapStyleConfigurationTest { - private val d2: D2 = Mockito.mock(D2::class.java, Mockito.RETURNS_DEEP_STUBS) + private val d2: D2 = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) private val uid = "uid" private val programConfigurationSetting: ProgramConfigurationSetting = mock() private val dataSetConfigurationSetting: DataSetConfigurationSetting = mock() @@ -35,17 +38,14 @@ class MapStyleConfigurationTest { programConfigurationRepository, ) + private val stringFilterConnector: StringFilterConnector<MapLayerCollectionRepository> = mock() + private val enumFilterConnector: EnumFilterConnector<MapLayerCollectionRepository, MapLayerPosition> = + mock() + @Test fun shouldFetchMapStyles() { - whenever(d2.mapsModule().mapLayers()) doReturn mock() - whenever(d2.mapsModule().mapLayers().withImageryProviders()) doReturn mock() - whenever( - d2 - .mapsModule() - .mapLayers() - .withImageryProviders() - .blockingGet(), - ) doReturn + mockBasemaps( + d2, listOf( mockMapLayer( displayName = "basemap 1", @@ -68,36 +68,46 @@ class MapStyleConfigurationTest { mockImaginaryProvider("© Carto"), ), ), - ) + ), + ) + + mockOverlays(d2, emptyList()) mapStyleConfiguration.fetchMapStyles().let { result -> assertTrue(result.size == 2) assertTrue( result[0] - .sources.rasterTiles.tiles.size == 2, + .sources.entries + .first() + .value.tiles.size == 2, + ) + assertTrue( + result[0] + .sources.entries + .first() + .value.tiles[0] == "http://a.test.test/x/y/z", + ) + assertTrue(result[0].attribution == "© Maplibre") + assertTrue( + result[0] + .sources.entries + .first() + .value.tiles[1] == "http://b.test.test/x/y/z", ) - assertTrue(result[0].sources.rasterTiles.tiles[0] == "http://a.test.test/x/y/z") - assertTrue(result[0].sources.attribution == "© Maplibre") - assertTrue(result[0].sources.rasterTiles.tiles[1] == "http://b.test.test/x/y/z") assertTrue( result[1] - .sources.rasterTiles.tiles.size == 1, + .sources.entries + .first() + .value.tiles.size == 1, ) - assertTrue(result[1].sources.attribution == "© Maplibre, © Carto") + assertTrue(result[1].attribution == "© Maplibre, © Carto") } } @Test fun shouldFetchCustomMaps() { - whenever(d2.mapsModule().mapLayers()) doReturn mock() - whenever(d2.mapsModule().mapLayers().withImageryProviders()) doReturn mock() - whenever( - d2 - .mapsModule() - .mapLayers() - .withImageryProviders() - .blockingGet(), - ) doReturn + mockBasemaps( + d2, listOf( mockMapLayer( displayName = "basemap 1", @@ -120,22 +130,85 @@ class MapStyleConfigurationTest { mockImaginaryProvider("© Carto"), ), ), - ) + ), + ) + + mockOverlays(d2, emptyList()) mapStyleConfiguration.fetchMapStyles().let { result -> assertTrue(result.size == 2) assertTrue( result[0] - .sources.rasterTiles.tiles.size == 4, + .sources.entries + .first() + .value.tiles.size == 4, + ) + assertTrue( + result[0] + .sources.entries + .first() + .value.tiles[0] == "http://a.test.test/x/y/z", + ) + assertTrue(result[0].attribution == "© Maplibre") + assertTrue( + result[0] + .sources.entries + .first() + .value.tiles[1] == "http://b.test.test/x/y/z", ) - assertTrue(result[0].sources.rasterTiles.tiles[0] == "http://a.test.test/x/y/z") - assertTrue(result[0].sources.attribution == "© Maplibre") - assertTrue(result[0].sources.rasterTiles.tiles[1] == "http://b.test.test/x/y/z") assertTrue( result[1] - .sources.rasterTiles.tiles.size == 4, + .sources.entries + .first() + .value.tiles.size == 4, + ) + assertTrue(result[1].attribution == "© Maplibre, © Carto") + } + } + + @Test + fun shouldFetchBasemapWithOverlay() { + mockBasemaps( + d2, + listOf( + mockMapLayer( + displayName = "basemap 1", + imageUrl = "http://{s}.test.test/x/y/z", + subDomainPlaceHolder = null, + subdomains = null, + imaginaryProviders = + listOf( + mockImaginaryProvider("© Maplibre"), + ), + ), + ), + ) + + mockOverlays( + d2, + listOf( + mockMapLayer( + displayName = "overlay 1", + imageUrl = "http://{s}.overlay.test/x/y/z", + subdomains = null, + subDomainPlaceHolder = null, + imaginaryProviders = + listOf( + mockImaginaryProvider("© Overlay"), + ), + ), + ), + ) + + mapStyleConfiguration.fetchMapStyles().let { result -> + assertTrue(result[0].sources.size == 2) + assertTrue( + result[0] + .sources.keys + .toList()[1] == "overlay 1", ) - assertTrue(result[1].sources.attribution == "© Maplibre, © Carto") + assertTrue(result[0].sources["overlay 1"]?.tiles[0] == "http://a.overlay.test/x/y/z") + assertEquals("© Maplibre, © Overlay", result[0].attribution) } } diff --git a/dhis2_android_maps/src/test/java/org/dhis2/maps/utils/CoordinateUtilsTest.kt b/dhis2_android_maps/src/test/java/org/dhis2/maps/utils/CoordinateUtilsTest.kt new file mode 100644 index 00000000000..20d50923108 --- /dev/null +++ b/dhis2_android_maps/src/test/java/org/dhis2/maps/utils/CoordinateUtilsTest.kt @@ -0,0 +1,71 @@ +package org.dhis2.maps.utils + +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull +import org.junit.Test +import org.maplibre.geojson.Point +import org.maplibre.geojson.Polygon + +class CoordinateUtilsTest { + + private val gson = Gson() + private val ringType = object : TypeToken<List<List<List<Double>>>>() {}.type + + @Test + fun `geometryCoordinates returns null when geometry is null`() { + assertNull(CoordinateUtils.geometryCoordinates(null)) + } + + @Test + fun `geometryCoordinates returns truncated JSON coordinates for Point`() { + val point = Point.fromLngLat(10.123456789, 20.987654321) + + val result = CoordinateUtils.geometryCoordinates(point) + + val coordinates: List<Double> = gson.fromJson( + result, + object : TypeToken<List<Double>>() {}.type, + ) + assertEquals(10.12345, coordinates[0], 0.0) + assertEquals(20.98765, coordinates[1], 0.0) + } + + @Test + fun `geometryCoordinates closes open polygon ring when first and last coordinates differ`() { + val pointA = Point.fromLngLat(0.0, 0.0) + val pointB = Point.fromLngLat(1.0, 0.0) + val pointC = Point.fromLngLat(0.0, 1.0) + val polygon = Polygon.fromLngLats(listOf(listOf(pointA, pointB, pointC))) + + val result = CoordinateUtils.geometryCoordinates(polygon) + + val rings: List<List<List<Double>>> = gson.fromJson(result, ringType) + val ring = rings[0] + assertEquals( + "Ring should start and end with the same coordinates", + ring.first(), + ring.last() + ) + } + + @Test + fun `geometryCoordinates does not duplicate closing coordinate when polygon ring is already closed`() { + val pointA = Point.fromLngLat(0.0, 0.0) + val pointB = Point.fromLngLat(1.0, 0.0) + val pointC = Point.fromLngLat(0.0, 1.0) + val polygon = Polygon.fromLngLats(listOf(listOf(pointA, pointB, pointC, pointA))) + + val result = CoordinateUtils.geometryCoordinates(polygon) + + val rings: List<List<List<Double>>> = gson.fromJson(result, ringType) + val ring = rings[0] + assertEquals( + "Ring should start and end with the same coordinates", + ring.first(), + ring.last() + ) + assertEquals("Closing coordinate must not be duplicated", 4, ring.size) + } +} diff --git a/dhis_android_analytics/build.gradle.kts b/dhis_android_analytics/build.gradle.kts index 6ebb32d5980..2c659157427 100644 --- a/dhis_android_analytics/build.gradle.kts +++ b/dhis_android_analytics/build.gradle.kts @@ -2,8 +2,7 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { id("com.android.library") - kotlin("android") - kotlin("kapt") + alias(libs.plugins.legacy.kapt) id("com.google.devtools.ksp") alias(libs.plugins.kotlin.compose.compiler) } @@ -53,6 +52,10 @@ kotlin { } } +kapt { + correctErrorTypes = true +} + dependencies { implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) implementation(project(":commons")) diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/Charts.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/Charts.kt index a579db69625..4d77861c022 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/Charts.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/Charts.kt @@ -16,7 +16,7 @@ interface Charts { fun getVisualizationGroups(uid: String?): List<AnalyticsDhisVisualizationsGroup> - fun geEnrollmentCharts(enrollmentUid: String): List<Graph> + suspend fun geEnrollmentCharts(enrollmentUid: String): List<Graph> fun getProgramVisualizations( groupUid: String?, diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ChartsRepository.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ChartsRepository.kt index fce0f75751f..0aa6577e4b7 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ChartsRepository.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ChartsRepository.kt @@ -7,7 +7,7 @@ import org.hisp.dhis.android.core.organisationunit.OrganisationUnit import org.hisp.dhis.android.core.settings.AnalyticsDhisVisualizationsGroup interface ChartsRepository { - fun getAnalyticsForEnrollment(enrollmentUid: String): List<Graph> + suspend fun getAnalyticsForEnrollment(enrollmentUid: String): List<Graph> fun getProgramVisualization( groupUid: String?, diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ChartsRepositoryImpl.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ChartsRepositoryImpl.kt index 596c9b30b91..e1ad5bc8641 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ChartsRepositoryImpl.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ChartsRepositoryImpl.kt @@ -40,7 +40,7 @@ class ChartsRepositoryImpl( ) : ChartsRepository { private val lineListHeaderCache: MutableMap<String, List<TrackerLineListItem>> = mutableMapOf() - override fun getAnalyticsForEnrollment(enrollmentUid: String): List<Graph> { + override suspend fun getAnalyticsForEnrollment(enrollmentUid: String): List<Graph> { val enrollment = getEnrollment(enrollmentUid) if (enrollment?.trackedEntityInstance() == null) return emptyList() @@ -403,51 +403,51 @@ class ChartsRepositoryImpl( lineListHeaderCache.putIfAbsent(visualisationUid, trackerLineListResponse.headers) } - private fun getSettingsAnalytics(enrollment: Enrollment): List<Graph> = - d2 + private suspend fun getSettingsAnalytics(enrollment: Enrollment): List<Graph> { + val analyticsSettings = d2 .settingModule() .analyticsSetting() .teis() .byProgram() .eq(enrollment.program()) .blockingGet() - .let { analyticsSettings -> - analyticsTeiSettingsToGraph.map( - enrollment.trackedEntityInstance()!!, - analyticsSettings, - analyticsFilterProvider::visualizationPeriod, - analyticsFilterProvider::visualizationOrgUnits, - { dataElementUid -> - d2 - .dataElementModule() - .dataElements() - .uid(dataElementUid) - .blockingGet() - ?.displayFormName() ?: dataElementUid - }, - { indicatorUid -> - d2 - .programModule() - .programIndicators() - .uid(indicatorUid) - .blockingGet() - ?.displayName() ?: indicatorUid - }, - { nutritionGenderData -> - val genderValue = - d2 - .trackedEntityModule() - .trackedEntityAttributeValues() - .value( - nutritionGenderData.attributeUid, - enrollment.trackedEntityInstance()!!, - ).blockingGet() - nutritionGenderData.isFemale(genderValue?.value()) - }, - ) - } ?: emptyList() + if (analyticsSettings.isEmpty()) return emptyList() + return analyticsTeiSettingsToGraph.map( + enrollment.trackedEntityInstance()!!, + analyticsSettings, + analyticsFilterProvider::visualizationPeriod, + analyticsFilterProvider::visualizationOrgUnits, + { dataElementUid -> + d2 + .dataElementModule() + .dataElements() + .uid(dataElementUid) + .blockingGet() + ?.displayFormName() ?: dataElementUid + }, + { indicatorUid -> + d2 + .programModule() + .programIndicators() + .uid(indicatorUid) + .blockingGet() + ?.displayName() ?: indicatorUid + }, + { nutritionGenderData -> + val genderValue = + d2 + .trackedEntityModule() + .trackedEntityAttributeValues() + .value( + nutritionGenderData.attributeUid, + enrollment.trackedEntityInstance()!!, + ).blockingGet() + nutritionGenderData.isFemale(genderValue?.value()) + }, + ) + } - private fun getDefaultAnalytics(enrollment: Enrollment): List<Graph> = + private suspend fun getDefaultAnalytics(enrollment: Enrollment): List<Graph> = getRepeatableProgramStages(enrollment.program()) .map { programStage -> @@ -458,14 +458,14 @@ class ChartsRepositoryImpl( val selectedRelativePeriod = analyticsFilterProvider.visualizationPeriod( enrollment.trackedEntityInstance()!! + - programStage.uid() + - dataElement.uid(), + programStage.uid() + + dataElement.uid(), ) val selectedOrgUnits = analyticsFilterProvider.visualizationOrgUnits( enrollment.trackedEntityInstance()!! + - programStage.uid() + - dataElement.uid(), + programStage.uid() + + dataElement.uid(), ) dataElementToGraph.map( dataElement, @@ -481,14 +481,14 @@ class ChartsRepositoryImpl( val selectedRelativePeriod = analyticsFilterProvider.visualizationPeriod( enrollment.trackedEntityInstance()!! + - programStage.uid() + - programIndicator.uid(), + programStage.uid() + + programIndicator.uid(), ) val selectedOrgUnits = analyticsFilterProvider.visualizationOrgUnits( enrollment.trackedEntityInstance()!! + - programStage.uid() + - programIndicator.uid(), + programStage.uid() + + programIndicator.uid(), ) programIndicatorToGraph.map( programIndicator, @@ -619,7 +619,7 @@ class ChartsRepositoryImpl( analyticsFilterProvider.addColumnFilter( trackerVisualizationUid, columnIndex, - filterValue!!, + filterValue, ) } else { analyticsFilterProvider.removeColumnFilter(trackerVisualizationUid, columnIndex) diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/DhisAnalyticCharts.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/DhisAnalyticCharts.kt index d6c561f5e00..76c7a8d0f1a 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/DhisAnalyticCharts.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/DhisAnalyticCharts.kt @@ -18,7 +18,7 @@ class DhisAnalyticCharts override fun getVisualizationGroups(uid: String?): List<AnalyticsDhisVisualizationsGroup> = chartsRepository.getVisualizationGroups(uid) - override fun geEnrollmentCharts(enrollmentUid: String): List<Graph> = chartsRepository.getAnalyticsForEnrollment(enrollmentUid) + override suspend fun geEnrollmentCharts(enrollmentUid: String): List<Graph> = chartsRepository.getAnalyticsForEnrollment(enrollmentUid) override fun getProgramVisualizations( groupUid: String?, diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/bindings/AnalyticsBindings.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/bindings/AnalyticsBindings.kt index 60bece0c4b5..d2616d6f567 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/bindings/AnalyticsBindings.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/bindings/AnalyticsBindings.kt @@ -35,10 +35,11 @@ fun PeriodType.datePattern(): String = when (this) { PeriodType.Daily, PeriodType.Weekly, + PeriodType.WeeklyWednesday, + PeriodType.WeeklyThursday, + PeriodType.WeeklyFriday, PeriodType.WeeklySaturday, PeriodType.WeeklySunday, - PeriodType.WeeklyThursday, - PeriodType.WeeklyWednesday, PeriodType.BiWeekly, PeriodType.Monthly, PeriodType.BiMonthly, @@ -52,8 +53,11 @@ fun PeriodType.datePattern(): String = } PeriodType.Yearly, + PeriodType.FinancialFeb, PeriodType.FinancialApril, PeriodType.FinancialJuly, + PeriodType.FinancialAug, + PeriodType.FinancialSep, PeriodType.FinancialOct, PeriodType.FinancialNov, -> { diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/bindings/DateToPosition.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/bindings/DateToPosition.kt index 60f5089c8f5..301a3c84bcc 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/bindings/DateToPosition.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/bindings/DateToPosition.kt @@ -26,10 +26,11 @@ class DateToPosition { when (eventPeriodType) { PeriodType.Daily, PeriodType.Weekly, + PeriodType.WeeklyWednesday, + PeriodType.WeeklyThursday, + PeriodType.WeeklyFriday, PeriodType.WeeklySaturday, PeriodType.WeeklySunday, - PeriodType.WeeklyThursday, - PeriodType.WeeklyWednesday, PeriodType.BiWeekly, PeriodType.Monthly, PeriodType.BiMonthly, @@ -48,8 +49,11 @@ class DateToPosition { monthDiff.toFloat() + (dayInMonth.toFloat() - 1f) / daysInMonth.toFloat() } PeriodType.Yearly, + PeriodType.FinancialFeb, PeriodType.FinancialApril, PeriodType.FinancialJuly, + PeriodType.FinancialAug, + PeriodType.FinancialSep, PeriodType.FinancialOct, PeriodType.FinancialNov, -> { diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/data/Graph.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/data/Graph.kt index cfa972b8430..d069766af30 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/data/Graph.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/data/Graph.kt @@ -48,10 +48,11 @@ data class Graph( return when (eventPeriodType) { PeriodType.Daily, PeriodType.Weekly, + PeriodType.WeeklyWednesday, + PeriodType.WeeklyThursday, + PeriodType.WeeklyFriday, PeriodType.WeeklySaturday, PeriodType.WeeklySunday, - PeriodType.WeeklyThursday, - PeriodType.WeeklyWednesday, PeriodType.BiWeekly, PeriodType.Monthly, PeriodType.BiMonthly, @@ -65,8 +66,11 @@ data class Graph( } PeriodType.Yearly, + PeriodType.FinancialFeb, PeriodType.FinancialApril, PeriodType.FinancialJuly, + PeriodType.FinancialAug, + PeriodType.FinancialSep, PeriodType.FinancialOct, PeriodType.FinancialNov, -> { @@ -126,10 +130,11 @@ data class Graph( when (eventPeriodType) { PeriodType.Daily, PeriodType.Weekly, + PeriodType.WeeklyWednesday, + PeriodType.WeeklyThursday, + PeriodType.WeeklyFriday, PeriodType.WeeklySaturday, PeriodType.WeeklySunday, - PeriodType.WeeklyThursday, - PeriodType.WeeklyWednesday, PeriodType.BiWeekly, PeriodType.Monthly, PeriodType.BiMonthly, @@ -144,8 +149,11 @@ data class Graph( } PeriodType.Yearly, + PeriodType.FinancialFeb, PeriodType.FinancialApril, PeriodType.FinancialJuly, + PeriodType.FinancialAug, + PeriodType.FinancialSep, PeriodType.FinancialOct, PeriodType.FinancialNov, -> { @@ -206,25 +214,31 @@ data class GraphPoint( ) { fun numericValue() = when (fieldValue) { - is GraphFieldValue.Numeric -> fieldValue.value is GraphFieldValue.Text -> 0f + is GraphFieldValue.Decimal -> fieldValue.value + is GraphFieldValue.Integer -> fieldValue.value.toFloat() } fun textValue() = when (fieldValue) { - is GraphFieldValue.Numeric -> fieldValue.value.toString() is GraphFieldValue.Text -> fieldValue.value + is GraphFieldValue.Decimal -> fieldValue.value.toString() + is GraphFieldValue.Integer -> fieldValue.value.toString() } } sealed class GraphFieldValue { - data class Numeric( + data class Decimal( val value: Float, ) : GraphFieldValue() data class Text( val value: String, ) : GraphFieldValue() + + data class Integer( + val value: Int, + ) : GraphFieldValue() } fun Graph.toChartBuilder(): Chart.ChartBuilder = Chart.ChartBuilder() diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/di/ChartsInjector.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/di/ChartsInjector.kt index 3fc36dd9474..9b365ed6e9b 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/di/ChartsInjector.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/di/ChartsInjector.kt @@ -8,6 +8,7 @@ import dhis2.org.analytics.charts.Charts import dhis2.org.analytics.charts.ChartsRepository import dhis2.org.analytics.charts.ChartsRepositoryImpl import dhis2.org.analytics.charts.DhisAnalyticCharts +import dhis2.org.analytics.charts.domain.GetEnrollmentAnalyticsUseCase import dhis2.org.analytics.charts.data.AnalyticResources import dhis2.org.analytics.charts.mappers.AnalyticDataElementToDataElementData import dhis2.org.analytics.charts.mappers.AnalyticIndicatorToIndicatorData @@ -36,6 +37,7 @@ import javax.inject.Singleton ) interface ChartsComponent { fun charts(): Charts + fun getEnrollmentAnalyticsUseCase(): GetEnrollmentAnalyticsUseCase } @Module @@ -138,4 +140,10 @@ class ChartsModule { @Provides internal fun bindStorageFeatureImpl(analyticsCharts: DhisAnalyticCharts): Charts = analyticsCharts + + @Provides + internal fun provideGetEnrollmentAnalyticsUseCase( + chartsRepository: ChartsRepository, + dispatcherProvider: DispatcherProvider, + ): GetEnrollmentAnalyticsUseCase = GetEnrollmentAnalyticsUseCase(chartsRepository, dispatcherProvider) } diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/di/ChartsModule.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/di/ChartsModule.kt new file mode 100644 index 00000000000..d57cbeb7018 --- /dev/null +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/di/ChartsModule.kt @@ -0,0 +1,114 @@ +package dhis2.org.analytics.charts.di + +import dhis2.org.analytics.charts.Charts +import dhis2.org.analytics.charts.ChartsRepository +import dhis2.org.analytics.charts.ChartsRepositoryImpl +import dhis2.org.analytics.charts.DhisAnalyticCharts +import dhis2.org.analytics.charts.data.AnalyticResources +import dhis2.org.analytics.charts.mappers.AnalyticDataElementToDataElementData +import dhis2.org.analytics.charts.mappers.AnalyticIndicatorToIndicatorData +import dhis2.org.analytics.charts.mappers.AnalyticTeiSettingsToSettingsAnalyticsModel +import dhis2.org.analytics.charts.mappers.AnalyticsTeiSettingsToGraph +import dhis2.org.analytics.charts.mappers.DataElementToGraph +import dhis2.org.analytics.charts.mappers.ProgramIndicatorToGraph +import dhis2.org.analytics.charts.mappers.VisualizationToGraph +import dhis2.org.analytics.charts.providers.AnalyticsFilterProvider +import dhis2.org.analytics.charts.providers.ChartCoordinatesProvider +import dhis2.org.analytics.charts.providers.ChartCoordinatesProviderImpl +import dhis2.org.analytics.charts.providers.NutritionDataProvider +import dhis2.org.analytics.charts.providers.PeriodStepProvider +import dhis2.org.analytics.charts.providers.PeriodStepProviderImpl +import dhis2.org.analytics.charts.providers.RuleEngineNutritionDataProviderImpl +import kotlinx.coroutines.Dispatchers +import org.dhis2.commons.viewmodel.DispatcherProvider +import org.koin.core.module.dsl.factoryOf +import org.koin.dsl.module + +val chartsModule = module { + + factory<PeriodStepProvider> { + PeriodStepProviderImpl( + d2 = get(), + dispatcherProvider = object : DispatcherProvider { + override fun io() = Dispatchers.IO + + override fun computation() = Dispatchers.Default + + override fun ui() = Dispatchers.Main + + } + ) + } + + factory<ChartCoordinatesProvider> { + ChartCoordinatesProviderImpl( + d2 = get(), + periodStepProvider = get(), + resourceManager = get() + ) + } + + factory { + VisualizationToGraph( + periodStepProvider = get(), + chartCoordinatesProvider = get() + ) + } + + factoryOf(::AnalyticDataElementToDataElementData) + factoryOf(::AnalyticIndicatorToIndicatorData) + factory { + AnalyticTeiSettingsToSettingsAnalyticsModel( + analyticDataElementMapper = get(), + analyticIndicatorMapper = get() + ) + } + + factory<NutritionDataProvider> { + RuleEngineNutritionDataProviderImpl() + } + + factory { + AnalyticsTeiSettingsToGraph( + analyticsSettingsMapper = get(), + nutritionDataProvider = get(), + periodStepProvider = get(), + chartCoordinatesProvider = get() + ) + } + + factory { + DataElementToGraph( + periodStepProvider = get(), + chartCoordinatesProvider = get() + ) + } + + factory { + ProgramIndicatorToGraph( + periodStepProvider = get(), + chartCoordinatesProvider = get() + ) + } + + factoryOf(::AnalyticResources) + + factoryOf(::AnalyticsFilterProvider) + + factory<ChartsRepository> { + ChartsRepositoryImpl( + d2 = get(), + visualizationToGraph = get(), + analyticsTeiSettingsToGraph = get(), + dataElementToGraph = get(), + programIndicatorToGraph = get(), + analyticsResources = get(), + analyticsFilterProvider = get() + ) + } + factory<Charts> { + DhisAnalyticCharts( + chartsRepository = get() + ) + } +} \ No newline at end of file diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/domain/GetEnrollmentAnalyticsUseCase.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/domain/GetEnrollmentAnalyticsUseCase.kt new file mode 100644 index 00000000000..bff08fe2811 --- /dev/null +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/domain/GetEnrollmentAnalyticsUseCase.kt @@ -0,0 +1,20 @@ +package dhis2.org.analytics.charts.domain + +import dhis2.org.analytics.charts.ChartsRepository +import dhis2.org.analytics.charts.data.Graph +import kotlinx.coroutines.withContext +import org.dhis2.commons.viewmodel.DispatcherProvider + +class GetEnrollmentAnalyticsUseCase( + private val chartsRepository: ChartsRepository, + private val dispatchers: DispatcherProvider, +) { + suspend operator fun invoke(enrollmentUid: String): Result<List<Graph>> = + withContext(dispatchers.io()) { + try { + Result.success(chartsRepository.getAnalyticsForEnrollment(enrollmentUid)) + } catch (e: Exception) { + Result.failure(e) + } + } +} diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/AnalyticsTeiSettingsToGraph.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/AnalyticsTeiSettingsToGraph.kt index 3b25e7a3fcd..cdd8ffd7285 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/AnalyticsTeiSettingsToGraph.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/AnalyticsTeiSettingsToGraph.kt @@ -20,16 +20,16 @@ class AnalyticsTeiSettingsToGraph( private val periodStepProvider: PeriodStepProvider, private val chartCoordinatesProvider: ChartCoordinatesProvider, ) { - fun map( + suspend fun map( teiUid: String, - analytycsTeiSettings: List<AnalyticsTeiSetting>, + analyticsTeiSettings: List<AnalyticsTeiSetting>, selectedRelativePeriodProvider: (String) -> List<RelativePeriod>?, selectedOrgUnitProvider: (String) -> List<String>?, dataElementNameProvider: (String) -> String, indicatorNameProvider: (String) -> String, teiGenderProvider: (NutritionGenderData) -> Boolean, ): List<Graph> = - analytycsTeiSettings.map { analyticsTeiSettings -> + analyticsTeiSettings.map { analyticsTeiSettings -> val analyticsSetting = analyticsSettingsMapper.map(analyticsTeiSettings) val selectedRelativePeriod = selectedRelativePeriodProvider(analyticsTeiSettings.uid()) val selectedOrgUnits = selectedOrgUnitProvider(analyticsTeiSettings.uid()) diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/DataElementToGraph.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/DataElementToGraph.kt index 14f5f6ae28a..ecd0098997e 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/DataElementToGraph.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/DataElementToGraph.kt @@ -13,7 +13,7 @@ class DataElementToGraph( private val periodStepProvider: PeriodStepProvider, private val chartCoordinatesProvider: ChartCoordinatesProvider, ) { - fun map( + suspend fun map( dataElement: DataElement, stageUid: String, teiUid: String, diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/DimensionalResponseToPieData.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/DimensionalResponseToPieData.kt index e7275532cb9..ec789bc577b 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/DimensionalResponseToPieData.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/DimensionalResponseToPieData.kt @@ -19,7 +19,9 @@ class DimensionalResponseToPieData { .map { entry -> GraphPoint( eventDate = GregorianCalendar(2021, 0, 1).time, - fieldValue = GraphFieldValue.Numeric(entry.value.sumByDouble { it.value?.toDouble() ?: 0.0 }.toFloat()), + fieldValue = GraphFieldValue.Decimal(entry.value.sumOf { + it.value?.toDouble() ?: 0.0 + }.toFloat()), legend = dimensionalResponse.metadata[entry.key]?.displayName, ) } diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/GraphToBarData.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/GraphToBarData.kt index 60cedf8f36e..2c49a231409 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/GraphToBarData.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/GraphToBarData.kt @@ -57,10 +57,11 @@ class GraphToBarData { PeriodType.Daily -> DAILY_BAR_WIDTH PeriodType.Weekly, + PeriodType.WeeklyWednesday, + PeriodType.WeeklyThursday, + PeriodType.WeeklyFriday, PeriodType.WeeklySaturday, PeriodType.WeeklySunday, - PeriodType.WeeklyThursday, - PeriodType.WeeklyWednesday, -> WEEKLY_BAR_WIDTH PeriodType.BiWeekly, @@ -77,8 +78,11 @@ class GraphToBarData { SIX_MONTHLY_BAR_WIDTH } PeriodType.Yearly, + PeriodType.FinancialFeb, PeriodType.FinancialApril, PeriodType.FinancialJuly, + PeriodType.FinancialAug, + PeriodType.FinancialSep, PeriodType.FinancialOct, PeriodType.FinancialNov, -> { diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/GraphToTable.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/GraphToTable.kt index 72abeccb105..2beb24c5974 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/GraphToTable.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/GraphToTable.kt @@ -199,7 +199,7 @@ class GraphToTable { color = TextColor.OnSurfaceLight, fontSize = 10.sp, fontWeight = FontWeight.Normal, - fontFamily = FontFamily(Font(org.dhis2.ui.R.font.roboto_regular)), + fontFamily = FontFamily(Font(R.font.roboto_regular)), lineHeight = 16.sp, letterSpacing = (0.4).sp, textAlign = TextAlign.End, diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/ProgramIndicatorToGraph.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/ProgramIndicatorToGraph.kt index 7078afdd9f4..fef93ad9439 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/ProgramIndicatorToGraph.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/mappers/ProgramIndicatorToGraph.kt @@ -13,7 +13,7 @@ class ProgramIndicatorToGraph( private val periodStepProvider: PeriodStepProvider, private val chartCoordinatesProvider: ChartCoordinatesProvider, ) { - fun map( + suspend fun map( programIndicator: ProgramIndicator, stageUid: String, teiUid: String, diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/ChartCoordinatesProvider.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/ChartCoordinatesProvider.kt index 798f54f3c3c..d90cfb42159 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/ChartCoordinatesProvider.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/ChartCoordinatesProvider.kt @@ -6,7 +6,7 @@ import org.hisp.dhis.android.core.analytics.aggregated.MetadataItem import org.hisp.dhis.android.core.common.RelativePeriod interface ChartCoordinatesProvider { - fun dataElementCoordinates( + suspend fun dataElementCoordinates( stageUid: String, teiUid: String, dataElementUid: String, @@ -15,7 +15,7 @@ interface ChartCoordinatesProvider { isDefault: Boolean = false, ): List<GraphPoint> - fun indicatorCoordinates( + suspend fun indicatorCoordinates( stageUid: String, teiUid: String, indicatorUid: String, @@ -24,7 +24,7 @@ interface ChartCoordinatesProvider { isDefault: Boolean = false, ): List<GraphPoint> - fun nutritionCoordinates( + suspend fun nutritionCoordinates( stageUid: String, teiUid: String, zScoreValueContainerUid: String, @@ -35,7 +35,7 @@ interface ChartCoordinatesProvider { selectedOrgUnits: List<String>?, ): List<GraphPoint> - fun pieChartCoordinates( + suspend fun pieChartCoordinates( stageUid: String, teiUid: String, dataElementUid: String, diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/ChartCoordinatesProviderImpl.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/ChartCoordinatesProviderImpl.kt index 6862fb6c474..3c59db6dcec 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/ChartCoordinatesProviderImpl.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/ChartCoordinatesProviderImpl.kt @@ -21,7 +21,7 @@ class ChartCoordinatesProviderImpl( val periodStepProvider: PeriodStepProvider, val resourceManager: ResourceManager, ) : ChartCoordinatesProvider { - override fun dataElementCoordinates( + override suspend fun dataElementCoordinates( stageUid: String, teiUid: String, dataElementUid: String, @@ -65,18 +65,18 @@ class ChartCoordinatesProviderImpl( } else { periodStepProvider .getPeriodDiff( - initialPeriod!!, + initialPeriod, lineListResponse.period, ).toFloat() }, - fieldValue = GraphFieldValue.Numeric(value.toFloatOrNull() ?: 0f), + fieldValue = formatToNumericFieldValue(value), legendValue = createLegendValue(legend), ) } } } - override fun indicatorCoordinates( + override suspend fun indicatorCoordinates( stageUid: String, teiUid: String, indicatorUid: String, @@ -112,7 +112,7 @@ class ChartCoordinatesProviderImpl( .value ?.toFloat() ?: Float.NaN ).isNaN() - } catch (e: java.lang.Exception) { + } catch (_: java.lang.Exception) { false } }.mapNotNull { lineListResponse -> @@ -122,7 +122,6 @@ class ChartCoordinatesProviderImpl( if (initialPeriod == null) initialPeriod = lineListResponse.period val legend = getLegend(lineListResponseValue.legend) - GraphPoint( eventDate = formattedDate(lineListResponse.date), position = @@ -131,18 +130,18 @@ class ChartCoordinatesProviderImpl( } else { periodStepProvider .getPeriodDiff( - initialPeriod!!, + initialPeriod, lineListResponse.period, ).toFloat() }, - fieldValue = GraphFieldValue.Numeric(value.toFloat()), + fieldValue = formatToNumericFieldValue(value), legendValue = createLegendValue(legend), ) } } } - override fun nutritionCoordinates( + override suspend fun nutritionCoordinates( stageUid: String, teiUid: String, zScoreValueContainerUid: String, @@ -199,13 +198,13 @@ class ChartCoordinatesProviderImpl( GraphPoint( eventDate = formattedDate(lineListResponse.date), position = xAxisValue.toFloat(), - fieldValue = GraphFieldValue.Numeric(zScoreValue.toFloat()), + fieldValue = formatToNumericFieldValue(zScoreValue), ) } } } - override fun pieChartCoordinates( + override suspend fun pieChartCoordinates( stageUid: String, teiUid: String, dataElementUid: String, @@ -235,7 +234,7 @@ class ChartCoordinatesProviderImpl( return eventList.groupBy { it.values.first().value }.mapNotNull { GraphPoint( eventDate = formattedDate(it.value.first().date), - fieldValue = GraphFieldValue.Numeric(it.value.size.toFloat()), + fieldValue = GraphFieldValue.Integer(it.value.size), legend = it.key, ) } @@ -283,7 +282,7 @@ class ChartCoordinatesProviderImpl( GraphPoint( eventDate = GregorianCalendar(2021, 0, 1).time, position = position.toFloat(), - fieldValue = GraphFieldValue.Numeric(gridResponseValue.value!!.toFloat()), + fieldValue = formatToNumericFieldValue(gridResponseValue.value), legend = columnLegend, legendValue = createLegendValue(legend?.item), ) @@ -294,11 +293,11 @@ class ChartCoordinatesProviderImpl( val formattedDateString = SimpleDateFormat("yyyy-MM-dd").format(date) val formattedDate = SimpleDateFormat("yyyy-MM-dd").parse(formattedDateString) formattedDate ?: date - } catch (e: Exception) { + } catch (_: Exception) { date } - private fun getLegend(legendUid: String?): Legend? = + private suspend fun getLegend(legendUid: String?): Legend? = legendUid?.let { d2 .legendSetModule() @@ -316,4 +315,11 @@ class ChartCoordinatesProviderImpl( it.displayName(), ) } + + private fun formatToNumericFieldValue(value: String?): GraphFieldValue = + if (value?.contains(".") == true || value?.contains(",") == true) { + GraphFieldValue.Decimal(value.toFloatOrNull() ?: 0f) + } else { + GraphFieldValue.Integer(value?.toIntOrNull() ?: 0) + } } diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/PeriodStepProviderImpl.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/PeriodStepProviderImpl.kt index a67a8637eb3..8a603334dd4 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/PeriodStepProviderImpl.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/PeriodStepProviderImpl.kt @@ -77,6 +77,7 @@ class PeriodStepProviderImpl( PeriodType.Weekly, PeriodType.WeeklyWednesday, PeriodType.WeeklyThursday, + PeriodType.WeeklyFriday, PeriodType.WeeklySaturday, PeriodType.WeeklySunday, -> { @@ -111,9 +112,13 @@ class PeriodStepProviderImpl( PeriodType.QuarterlyNov, PeriodType.SixMonthly, PeriodType.SixMonthlyApril, + PeriodType.FinancialFeb, PeriodType.FinancialApril, PeriodType.FinancialJuly, + PeriodType.FinancialAug, + PeriodType.FinancialSep, PeriodType.FinancialOct, + PeriodType.FinancialNov, -> formattedDate = periodString.format( @@ -173,6 +178,7 @@ class PeriodStepProviderImpl( PeriodType.Weekly, PeriodType.WeeklyWednesday, PeriodType.WeeklyThursday, + PeriodType.WeeklyFriday, PeriodType.WeeklySaturday, PeriodType.WeeklySunday, -> @@ -223,8 +229,11 @@ class PeriodStepProviderImpl( ).months / 6 PeriodType.Yearly, + PeriodType.FinancialFeb, PeriodType.FinancialApril, PeriodType.FinancialJuly, + PeriodType.FinancialAug, + PeriodType.FinancialSep, PeriodType.FinancialOct, PeriodType.FinancialNov, -> diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/RuleEngineNutritionDataProviderImpl.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/RuleEngineNutritionDataProviderImpl.kt index 67fe13d7975..b9a61f05911 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/RuleEngineNutritionDataProviderImpl.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/providers/RuleEngineNutritionDataProviderImpl.kt @@ -40,7 +40,7 @@ class RuleEngineNutritionDataProviderImpl : NutritionDataProvider { GraphPoint( eventDate = GregorianCalendar(2021, 0, 1).time, position = parameter, - fieldValue = GraphFieldValue.Numeric(values[dataIndex]), + fieldValue = GraphFieldValue.Decimal(values[dataIndex]), ), ) } diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/GroupAnalyticsFragment.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/GroupAnalyticsFragment.kt index a1cf66320a1..a15accfc803 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/GroupAnalyticsFragment.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/GroupAnalyticsFragment.kt @@ -8,6 +8,9 @@ import android.view.ViewGroup import androidx.core.view.ViewCompat import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import com.github.mikephil.charting.utils.Utils import dhis2.org.R import dhis2.org.analytics.charts.data.AnalyticGroup @@ -18,6 +21,7 @@ import dhis2.org.analytics.charts.ui.di.AnalyticsFragmentModule import dhis2.org.analytics.charts.ui.dialog.SearchColumnDialog import dhis2.org.databinding.AnalyticsGroupBinding import dhis2.org.databinding.AnalyticsItemBinding +import kotlinx.coroutines.launch import org.dhis2.commons.bindings.clipWithRoundedCorners import org.dhis2.commons.bindings.scrollToPosition import org.dhis2.commons.dialogs.AlertBottomDialog @@ -220,47 +224,57 @@ class GroupAnalyticsFragment : Fragment() { savedInstanceState: Bundle?, ) { super.onViewCreated(view, savedInstanceState) - groupViewModel.chipItems.observe(viewLifecycleOwner) { chipResult -> - when { - chipResult.isSuccess -> { - val chips = chipResult.getOrDefault(emptyList()) - if (chips.isEmpty() || chips.size < MIN_SIZE_TO_SHOW) { - binding?.analyticChipGroup?.visibility = View.GONE - } else { - binding?.analyticChipGroup?.visibility = View.VISIBLE - disableToolbarElevation?.invoke() - addChips(chips) - } - } + viewLifecycleOwner.lifecycleScope.launch { + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { + launch { + groupViewModel.chipItems.collect { chipResult -> + chipResult ?: return@collect + when { + chipResult.isSuccess -> { + val chips = chipResult.getOrDefault(emptyList()) + if (chips.isEmpty() || chips.size < MIN_SIZE_TO_SHOW) { + binding?.analyticChipGroup?.visibility = View.GONE + } else { + binding?.analyticChipGroup?.visibility = View.VISIBLE + disableToolbarElevation?.invoke() + addChips(chips) + } + } - chipResult.isFailure -> { - binding?.progressLayout?.visibility = View.GONE - binding?.emptyAnalytics?.apply { - visibility = View.VISIBLE - text = getString(R.string.visualization_groups_failure) + chipResult.isFailure -> { + binding?.progressLayout?.visibility = View.GONE + binding?.emptyAnalytics?.apply { + visibility = View.VISIBLE + text = getString(R.string.visualization_groups_failure) + } + } + } + startPostponedEnterTransition() } } - } - startPostponedEnterTransition() - } - groupViewModel.analytics.observe(viewLifecycleOwner) { analytics -> - try { - when { - analytics.isSuccess -> - adapter.submitList(analytics.getOrDefault(emptyList())) { - binding?.progressLayout?.visibility = View.GONE - } + launch { + groupViewModel.analytics.collect { analytics -> + analytics ?: return@collect + try { + when { + analytics.isSuccess -> + adapter.submitList(analytics.getOrDefault(emptyList())) { + binding?.progressLayout?.visibility = View.GONE + } - analytics.isFailure -> { - binding?.progressLayout?.visibility = View.GONE - binding?.emptyAnalytics?.apply { - visibility = View.VISIBLE - text = getString(R.string.visualization_failure) + analytics.isFailure -> { + binding?.progressLayout?.visibility = View.GONE + binding?.emptyAnalytics?.apply { + visibility = View.VISIBLE + text = getString(R.string.visualization_failure) + } + } + } + } finally { + AnalyticsCountingIdlingResource.decrement() } } } - } finally { - AnalyticsCountingIdlingResource.decrement() } } } diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/GroupAnalyticsViewModel.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/GroupAnalyticsViewModel.kt index 0fa595dcd15..fe1609a3b88 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/GroupAnalyticsViewModel.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/GroupAnalyticsViewModel.kt @@ -1,19 +1,20 @@ package dhis2.org.analytics.charts.ui -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dhis2.org.analytics.charts.Charts import dhis2.org.analytics.charts.data.AnalyticGroup +import dhis2.org.analytics.charts.domain.GetEnrollmentAnalyticsUseCase import dhis2.org.analytics.charts.idling.AnalyticsCountingIdlingResource -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.async +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import org.dhis2.commons.matomo.Actions import org.dhis2.commons.matomo.Categories import org.dhis2.commons.matomo.Labels import org.dhis2.commons.matomo.MatomoAnalyticsController +import org.dhis2.commons.viewmodel.DispatcherProvider import org.hisp.dhis.android.core.common.RelativePeriod import org.hisp.dhis.android.core.organisationunit.OrganisationUnit import timber.log.Timber @@ -25,11 +26,13 @@ class GroupAnalyticsViewModel( private val uid: String?, private val charts: Charts, private val matomoAnalyticsController: MatomoAnalyticsController, + private val getEnrollmentAnalyticsUseCase: GetEnrollmentAnalyticsUseCase, + private val dispatchers: DispatcherProvider, ) : ViewModel() { - private val _chipItems = MutableLiveData<Result<List<AnalyticGroup>>>() - val chipItems: LiveData<Result<List<AnalyticGroup>>> = _chipItems - private val _analytics = MutableLiveData<Result<List<AnalyticsModel>>>() - val analytics: LiveData<Result<List<AnalyticsModel>>> = _analytics + private val _chipItems = MutableStateFlow<Result<List<AnalyticGroup>>?>(null) + val chipItems: StateFlow<Result<List<AnalyticGroup>>?> = _chipItems.asStateFlow() + private val _analytics = MutableStateFlow<Result<List<AnalyticsModel>>?>(null) + val analytics: StateFlow<Result<List<AnalyticsModel>>?> = _analytics.asStateFlow() private var currentGroup: String? = null init { @@ -44,19 +47,20 @@ class GroupAnalyticsViewModel( } private fun fetchAnalyticsGroup(onSuccess: () -> Unit) { - viewModelScope.launch { - val result = - async(context = Dispatchers.IO) { - charts.getVisualizationGroups(uid).map { - AnalyticGroup(it.id(), it.name()) - } - } + AnalyticsCountingIdlingResource.increment() + viewModelScope.launch(dispatchers.io()) { try { - _chipItems.value = Result.success(result.await()) + val groups = charts.getVisualizationGroups(uid).map { + AnalyticGroup(it.id(), it.name()) + } + _chipItems.value = Result.success(groups) onSuccess() } catch (e: Exception) { _chipItems.value = Result.failure(e) } + finally { + AnalyticsCountingIdlingResource.decrement() + } } } @@ -138,50 +142,55 @@ class GroupAnalyticsViewModel( fun fetchAnalytics(groupUid: String?) { AnalyticsCountingIdlingResource.increment() currentGroup = groupUid - viewModelScope.launch { - val result = - async(context = Dispatchers.IO) { - when (mode) { - AnalyticMode.ENROLLMENT -> - uid?.let { - charts - .geEnrollmentCharts(uid) - .map { ChartModel(it) } - } ?: emptyList() - - AnalyticMode.TRACKER_PROGRAM -> - uid?.let { - charts - .getProgramVisualizations(groupUid, uid) - .map { ChartModel(it) } - } ?: emptyList() - - AnalyticMode.EVENT_PROGRAM -> - uid?.let { - charts - .getProgramVisualizations(groupUid, uid) - .map { ChartModel(it) } - } ?: emptyList() - - AnalyticMode.HOME -> - charts - .getHomeVisualizations(groupUid) - .map { ChartModel(it) } - - AnalyticMode.DATASET -> - uid?.let { - charts - .getDataSetVisualizations(groupUid, uid) - .map { ChartModel(it) } - } ?: emptyList() + when (mode) { + AnalyticMode.ENROLLMENT -> + viewModelScope.launch { + uid?.let { + getEnrollmentAnalyticsUseCase(uid) + .onSuccess { graphs -> + _analytics.value = Result.success(graphs.map { ChartModel(it) }) + }.onFailure { e -> + Timber.e(e) + _analytics.value = Result.failure(e) + } + } ?: run { + _analytics.value = Result.success(emptyList()) + } + } + + else -> + viewModelScope.launch(dispatchers.io()) { + try { + val result = when (mode) { + AnalyticMode.TRACKER_PROGRAM -> + uid?.let { + charts.getProgramVisualizations(groupUid, uid) + .map { ChartModel(it) } + } ?: emptyList() + + AnalyticMode.EVENT_PROGRAM -> + uid?.let { + charts.getProgramVisualizations(groupUid, uid) + .map { ChartModel(it) } + } ?: emptyList() + + AnalyticMode.HOME -> + charts.getHomeVisualizations(groupUid).map { ChartModel(it) } + + AnalyticMode.DATASET -> + uid?.let { + charts.getDataSetVisualizations(groupUid, uid) + .map { ChartModel(it) } + } ?: emptyList() + + AnalyticMode.ENROLLMENT -> emptyList() + } + _analytics.value = Result.success(result) + } catch (e: Exception) { + Timber.e(e) + _analytics.value = Result.failure(e) } } - try { - _analytics.value = Result.success(result.await()) - } catch (e: Exception) { - Timber.e(e) - _analytics.value = Result.failure(e) - } } } diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/GroupAnalyticsViewModelFactory.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/GroupAnalyticsViewModelFactory.kt index 8ff1cd01259..11f9157b0e6 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/GroupAnalyticsViewModelFactory.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/GroupAnalyticsViewModelFactory.kt @@ -3,13 +3,17 @@ package dhis2.org.analytics.charts.ui import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import dhis2.org.analytics.charts.Charts +import dhis2.org.analytics.charts.domain.GetEnrollmentAnalyticsUseCase import org.dhis2.commons.matomo.MatomoAnalyticsController +import org.dhis2.commons.viewmodel.DispatcherProvider class GroupAnalyticsViewModelFactory( private val mode: AnalyticMode, private val uid: String?, private val charts: Charts, private val matomoAnalyticsController: MatomoAnalyticsController, + private val getEnrollmentAnalyticsUseCase: GetEnrollmentAnalyticsUseCase, + private val dispatchers: DispatcherProvider, ) : ViewModelProvider.Factory { override fun <T : ViewModel> create(modelClass: Class<T>): T = GroupAnalyticsViewModel( @@ -17,5 +21,7 @@ class GroupAnalyticsViewModelFactory( uid, charts, matomoAnalyticsController, + getEnrollmentAnalyticsUseCase, + dispatchers, ) as T } diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/IndicatorViewHolder.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/IndicatorViewHolder.kt index 1d21a5552be..13b12ac6e41 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/IndicatorViewHolder.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/IndicatorViewHolder.kt @@ -54,7 +54,7 @@ class IndicatorViewHolder( if (!programIndicatorModel.color.isNullOrEmpty()) { Color(programIndicatorModel.color()) } else { - SurfaceColor.Container + SurfaceColor.ContainerHigh }, content = programIndicatorModel.value ?: "", modifier = @@ -69,6 +69,7 @@ class IndicatorViewHolder( Modifier }, ), + useMarkdown = true, ) Spacer(modifier = Modifier.size(16.dp)) } diff --git a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/di/AnalyticsFragmentInjector.kt b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/di/AnalyticsFragmentInjector.kt index 94b65a9a769..d581d40b8a7 100644 --- a/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/di/AnalyticsFragmentInjector.kt +++ b/dhis_android_analytics/src/main/java/dhis2/org/analytics/charts/ui/di/AnalyticsFragmentInjector.kt @@ -4,10 +4,12 @@ import dagger.Module import dagger.Provides import dagger.Subcomponent import dhis2.org.analytics.charts.Charts +import dhis2.org.analytics.charts.domain.GetEnrollmentAnalyticsUseCase import dhis2.org.analytics.charts.ui.AnalyticMode import dhis2.org.analytics.charts.ui.GroupAnalyticsFragment import dhis2.org.analytics.charts.ui.GroupAnalyticsViewModelFactory import org.dhis2.commons.matomo.MatomoAnalyticsController +import org.dhis2.commons.viewmodel.DispatcherProvider @Subcomponent(modules = [AnalyticsFragmentModule::class]) interface AnalyticsFragmentComponent { @@ -23,5 +25,15 @@ class AnalyticsFragmentModule( fun provideViewModelFactory( charts: Charts, matomoAnalyticsController: MatomoAnalyticsController, - ): GroupAnalyticsViewModelFactory = GroupAnalyticsViewModelFactory(mode, uid, charts, matomoAnalyticsController) + getEnrollmentAnalyticsUseCase: GetEnrollmentAnalyticsUseCase, + dispatcherProvider: DispatcherProvider, + ): GroupAnalyticsViewModelFactory = + GroupAnalyticsViewModelFactory( + mode, + uid, + charts, + matomoAnalyticsController, + getEnrollmentAnalyticsUseCase, + dispatcherProvider, + ) } diff --git a/dhis_android_analytics/src/main/res/values-ar-rIQ/strings.xml b/dhis_android_analytics/src/main/res/values-ar-rIQ/strings.xml index 38de9dcfe4a..39f8914a67b 100644 --- a/dhis_android_analytics/src/main/res/values-ar-rIQ/strings.xml +++ b/dhis_android_analytics/src/main/res/values-ar-rIQ/strings.xml @@ -2,7 +2,6 @@ <resources> <string name="show_table_graph">عرض كجدول</string> <string name="action_accept">قبول</string> - <string name="none">لا شيء</string> <string name="daily">يومي</string> <string name="today">اليوم</string> <string name="yesterday">الأمس</string> diff --git a/dhis_android_analytics/src/main/res/values-ar/strings.xml b/dhis_android_analytics/src/main/res/values-ar/strings.xml index bd90b0a6276..72fc5ea5af7 100644 --- a/dhis_android_analytics/src/main/res/values-ar/strings.xml +++ b/dhis_android_analytics/src/main/res/values-ar/strings.xml @@ -6,7 +6,6 @@ <string name="show_table_value">عرض كقيمة</string> <string name="action_accept">قبول</string> <string name="period">الفترة الزمنية</string> - <string name="none">لا شيء</string> <string name="daily">يومي</string> <string name="today">اليوم</string> <string name="other">أخرى</string> @@ -42,7 +41,6 @@ <string name="include_this_period_body">سيعرض الفترة الحالية في الرسم البياني.</string> <string name="no_data_for_selected_filters">لا تُرجع عوامل التصفية التي قمت بتطبيقها أية بيانات</string> <string name="no_data_to_display">ليس لديك أي بيانات ليتم عرضها</string> - <string name="visualization_error">هناك خطأ ما في هذا التصور</string> <string name="visualization_failure">هناك خطأ ما في التصورات</string> <string name="pie_chart_no_data">كل البيانات صفر</string> <string name="error_invalid_arguments">لم يتم تكوين هذا العرض البياني بشكل جيد ، يرجى الاتصال بالمسؤول.</string> diff --git a/dhis_android_analytics/src/main/res/values-ckb/strings.xml b/dhis_android_analytics/src/main/res/values-ckb/strings.xml index 5f9661cf0a1..c4d7dcac0d1 100644 --- a/dhis_android_analytics/src/main/res/values-ckb/strings.xml +++ b/dhis_android_analytics/src/main/res/values-ckb/strings.xml @@ -2,7 +2,6 @@ <resources> <string name="action_accept">پەسندکردن</string> <string name="period">ماوة</string> - <string name="none">هیچیان</string> <string name="today">ئەمڕۆ</string> <string name="thisyear">ئەم ساڵە</string> </resources> \ No newline at end of file diff --git a/dhis_android_analytics/src/main/res/values-cs/strings.xml b/dhis_android_analytics/src/main/res/values-cs/strings.xml index f754a77c112..d7efadff225 100644 --- a/dhis_android_analytics/src/main/res/values-cs/strings.xml +++ b/dhis_android_analytics/src/main/res/values-cs/strings.xml @@ -9,7 +9,6 @@ <string name="action_accept">Přijmout</string> <string name="period">Období</string> <string name="orgUnit">Org. Jednotka</string> - <string name="none">Žádný</string> <string name="daily">Denně</string> <string name="today">Dnes</string> <string name="other">jiný</string> @@ -45,7 +44,6 @@ <string name="include_this_period_body">V grafu se zobrazí aktuální období.</string> <string name="no_data_for_selected_filters">Použité filtry nevracejí žádná data</string> <string name="no_data_to_display">K zobrazení nemáte žádná data</string> - <string name="visualization_error">S touto vizualizací není něco v pořádku</string> <string name="visualization_failure">S vizualizacemi není něco v pořádku</string> <string name="visualization_groups_failure">Něco není v pořádku se skupinami vizualizace</string> <string name="pie_chart_no_data">Všechny údaje jsou nulové</string> @@ -61,7 +59,6 @@ <string name="error_invalid_program_indicator">Nemáte přístup k indikátoru programu %s</string> <string name="error_invalid_visualization">Chybí vizualizace %s</string> <string name="error_parsing_visualization">Tato vizualizace není dobře nakonfigurována, kontaktujte svého administrátora.</string> - <string name="error_invalid_custom_boundaries">Vlastní hranice nejsou podporovány pro programový indikátor %s</string> <string name="error_database">Nelze získat přístup k databázi. Kontaktujte prosím svého správce.</string> <string name="error_invalid_program">Nemáte přístup k programu %s</string> <string name="error_invalid_attribute">Nemáte přístup k atributu %s</string> diff --git a/dhis_android_analytics/src/main/res/values-da/strings.xml b/dhis_android_analytics/src/main/res/values-da/strings.xml index fcbe723511f..d6b540aa4d9 100644 --- a/dhis_android_analytics/src/main/res/values-da/strings.xml +++ b/dhis_android_analytics/src/main/res/values-da/strings.xml @@ -1,6 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <string name="none">None</string> <string name="daily">Daily</string> <string name="other">Other</string> <string name="weekly">Weekly</string> diff --git a/dhis_android_analytics/src/main/res/values-en-rUS/strings.xml b/dhis_android_analytics/src/main/res/values-en-rUS/strings.xml index 40df7fe8191..a508bacacfb 100644 --- a/dhis_android_analytics/src/main/res/values-en-rUS/strings.xml +++ b/dhis_android_analytics/src/main/res/values-en-rUS/strings.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8"?> <resources> <string name="action_accept">Accept</string> - </resources> \ No newline at end of file + </resources> diff --git a/dhis_android_analytics/src/main/res/values-es-rES/strings.xml b/dhis_android_analytics/src/main/res/values-es-rES/strings.xml index cce3fcb86fc..c81848ec9f1 100644 --- a/dhis_android_analytics/src/main/res/values-es-rES/strings.xml +++ b/dhis_android_analytics/src/main/res/values-es-rES/strings.xml @@ -9,7 +9,6 @@ <string name="action_accept">Aceptar</string> <string name="period">Periodo</string> <string name="orgUnit">Unid.Org.</string> - <string name="none">Ninguno</string> <string name="daily">Diario</string> <string name="today">Hoy</string> <string name="other">Otro</string> @@ -45,7 +44,6 @@ <string name="include_this_period_body">Se mostrará el periodo actual en el gráfico.</string> <string name="no_data_for_selected_filters">Los filtros que has aplicado no devolvieron datos</string> <string name="no_data_to_display">No tienes datos para mostrar</string> - <string name="visualization_error">Hay algo erróneo en esta visualización</string> <string name="visualization_failure">Hay algo erróneo con las visualizaciones</string> <string name="visualization_groups_failure">Hay algo erróneo con los grupos de visualizaciones</string> <string name="pie_chart_no_data">Todos los datos tienen valor cero</string> @@ -61,7 +59,6 @@ <string name="error_invalid_program_indicator">No tiene acceso indicador del programa %s</string> <string name="error_invalid_visualization">La visualización %s no se encuentra disponible</string> <string name="error_parsing_visualization">Esta visualización no se encuentra bien configurada, por favor contacte a su administrador.</string> - <string name="error_invalid_custom_boundaries">Los límites personalizados de indicadores de programa no son compatibles con los graficos de Android%s</string> <string name="error_database">No se puede acceder a la base de datos. Por favor, contacta con tu administrador.</string> <string name="error_invalid_program">No tiene permiso para acceder al programa %s</string> <string name="error_invalid_attribute">No tiene permiso para acceder al atributo %s</string> diff --git a/dhis_android_analytics/src/main/res/values-es/strings.xml b/dhis_android_analytics/src/main/res/values-es/strings.xml index 14e40b82ccb..a2f88ea0299 100644 --- a/dhis_android_analytics/src/main/res/values-es/strings.xml +++ b/dhis_android_analytics/src/main/res/values-es/strings.xml @@ -9,7 +9,6 @@ <string name="action_accept">Aceptar</string> <string name="period">Periodo</string> <string name="orgUnit">Unid.Org.</string> - <string name="none">Ninguno</string> <string name="daily">Diario</string> <string name="today">Hoy</string> <string name="other">Otro</string> @@ -45,7 +44,6 @@ <string name="include_this_period_body">Se mostrará el periodo actual en el gráfico.</string> <string name="no_data_for_selected_filters">Los filtros que has aplicado no devolvieron datos</string> <string name="no_data_to_display">No tienes datos para mostrar</string> - <string name="visualization_error">Hay algo erróneo en esta visualización</string> <string name="visualization_failure">Hay algo erróneo con las visualizaciones</string> <string name="visualization_groups_failure">Hay algo erróneo con los grupos de visualizaciones</string> <string name="pie_chart_no_data">Todos los datos tienen valor cero</string> @@ -61,7 +59,6 @@ <string name="error_invalid_program_indicator">No tiene acceso indicador del programa %s</string> <string name="error_invalid_visualization">La visualización %s no se encuentra disponible</string> <string name="error_parsing_visualization">Esta visualización no se encuentra bien configurada, por favor contacte a su administrador.</string> - <string name="error_invalid_custom_boundaries">Los límites personalizados de indicadores de programa no son compatibles con los graficos de Android%s</string> <string name="error_database">No se puede acceder a la base de datos. Por favor, contacta con tu administrador.</string> <string name="error_invalid_program">No tiene permiso para acceder al programa %s</string> <string name="error_invalid_attribute">No tiene permiso para acceder al atributo %s</string> diff --git a/dhis_android_analytics/src/main/res/values-fr/strings.xml b/dhis_android_analytics/src/main/res/values-fr/strings.xml index de182c6df8d..adca246f900 100644 --- a/dhis_android_analytics/src/main/res/values-fr/strings.xml +++ b/dhis_android_analytics/src/main/res/values-fr/strings.xml @@ -6,7 +6,6 @@ <string name="show_table_value">Afficher comme valeur</string> <string name="action_accept">Accepter</string> <string name="period">Période</string> - <string name="none">Aucun</string> <string name="daily">Quotidien</string> <string name="today">Aujourd\'hui</string> <string name="other">Autre</string> diff --git a/dhis_android_analytics/src/main/res/values-hi-rIN/strings.xml b/dhis_android_analytics/src/main/res/values-hi-rIN/strings.xml index a4e3d321508..38f6eba739a 100644 --- a/dhis_android_analytics/src/main/res/values-hi-rIN/strings.xml +++ b/dhis_android_analytics/src/main/res/values-hi-rIN/strings.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <resources> <string name="action_accept">स्वीकार करें</string> - <string name="none">कोई नहीं</string> <string name="daily">रोज़ाना</string> <string name="today">आज</string> <string name="yesterday">कल (बिता हुआ)</string> diff --git a/dhis_android_analytics/src/main/res/values-id/strings.xml b/dhis_android_analytics/src/main/res/values-id/strings.xml index fc1cb7776d6..adb45322a85 100644 --- a/dhis_android_analytics/src/main/res/values-id/strings.xml +++ b/dhis_android_analytics/src/main/res/values-id/strings.xml @@ -6,7 +6,6 @@ <string name="show_table_value">Lihat sebagai Nilai</string> <string name="action_accept">Terima</string> <string name="period">Periode</string> - <string name="none">Tidak ada</string> <string name="daily">Harian</string> <string name="today">Hari ini</string> <string name="other">Lainnya</string> diff --git a/dhis_android_analytics/src/main/res/values-km/strings.xml b/dhis_android_analytics/src/main/res/values-km/strings.xml index 940b38c9527..10115835d63 100644 --- a/dhis_android_analytics/src/main/res/values-km/strings.xml +++ b/dhis_android_analytics/src/main/res/values-km/strings.xml @@ -3,7 +3,6 @@ <string name="show_table_graph">បង្ហាញតារាង</string> <string name="action_accept">ទទួលយក</string> <string name="period">កំឡុងពេល</string> - <string name="none">គ្មាន</string> <string name="daily">រាល់​ថ្ងៃ</string> <string name="today">ថ្ងៃនេះ</string> <string name="other">ផ្សេង</string> diff --git a/dhis_android_analytics/src/main/res/values-lo/strings.xml b/dhis_android_analytics/src/main/res/values-lo/strings.xml index a673b780a1d..e8058a2aea4 100644 --- a/dhis_android_analytics/src/main/res/values-lo/strings.xml +++ b/dhis_android_analytics/src/main/res/values-lo/strings.xml @@ -8,7 +8,6 @@ <string name="action_accept">ຍອມຮັບ</string> <string name="period">ຊ່ວງເວລາ</string> <string name="orgUnit">ຫົວໜ່ວຍອົງກອນ</string> - <string name="none">ບໍ່ມີ</string> <string name="daily">ທຸກໆມື້</string> <string name="today">ມື້ນີ້</string> <string name="other">ອື່ນໆ</string> @@ -44,7 +43,6 @@ <string name="include_this_period_body">ມັນຈະສະແດງຊ່ວງເວລາປະຈຸບັນໃນແຜນວາດ</string> <string name="no_data_for_selected_filters">ຕົວກອງທີ່ທ່ານໃຊ້ບໍ່ໄດ້ສົ່ງຂໍ້ມູນຄືນໃດໆ</string> <string name="no_data_to_display">ທ່ານບໍ່ມີຂໍ້ມູນໃດໆທີ່ຈະສະແດງ</string> - <string name="visualization_error">ມີບາງຢ່າງຜິດພາດກັບການສະແດງພາບນີ້</string> <string name="visualization_failure">ມີບາງຢ່າງຜິດພາດກັບການເບິ່ງເຫັນ</string> <string name="visualization_groups_failure">ມີບາງຢ່າງຜິດພາດກັບກຸ່ມການເບິ່ງເຫັນ</string> <string name="pie_chart_no_data">ຂໍ້ມູນທັງໝົດເປັນສູນ</string> @@ -60,7 +58,6 @@ <string name="error_invalid_program_indicator">ທ່ານບໍ່ໄດ້ຮັບອານຸຍາດເຂົ້າເຖິງສາຍງານຕົວຊີ້ວັດ%s</string> <string name="error_invalid_visualization">ການສະແດງພາບ%sຂາດຫາຍໄປ</string> <string name="error_parsing_visualization">ການສະແດງພາບນີ້ບໍ່ໄດ້ຖືກຕັ້ງຄ່າໄດ້ດີ, ກະລຸນາຕິດຕໍ່ຜູ້ດູແລຂອງທ່ານ.</string> - <string name="error_invalid_custom_boundaries">ບໍ່ຮອງຮັບຂອບເຂດກຳນົດເອງສຳລັບຕົວຊີ້ວັດຂອງສາຍງານ%s</string> <string name="error_database">ບໍ່ສາມາດເຂົ້າເຖິງຖານຂໍ້ມູນໄດ້. ກະລຸນາຕິດຕໍ່ຜູ້ດູແລລະບົບ</string> <string name="error_invalid_program">ທ່ານບໍ່ໄດ້ຮັບອານຸຍາດເຂົ້າເຖີງໂປຣແກຣມ %s</string> <string name="error_unsupported_aggregation_type">ປະເພດການສັງລວມບໍ່ໄດ້ສະໜັບສະໜູນ %s</string> diff --git a/dhis_android_analytics/src/main/res/values-my/strings.xml b/dhis_android_analytics/src/main/res/values-my/strings.xml index cd195ba6d3a..19c9c50e83e 100644 --- a/dhis_android_analytics/src/main/res/values-my/strings.xml +++ b/dhis_android_analytics/src/main/res/values-my/strings.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <resources> <string name="period">အချိန်ကာလ</string> - <string name="none">တစ်ခုမှမဟုတ်</string> <string name="daily">နေ့စဉ်</string> <string name="other">အခြား</string> <string name="weekly">အပတ်စဉ်</string> diff --git a/dhis_android_analytics/src/main/res/values-nb/strings.xml b/dhis_android_analytics/src/main/res/values-nb/strings.xml index 134f679d4fc..dcd0cec2954 100644 --- a/dhis_android_analytics/src/main/res/values-nb/strings.xml +++ b/dhis_android_analytics/src/main/res/values-nb/strings.xml @@ -3,7 +3,6 @@ <string name="show_table_graph">Vis som tabell</string> <string name="action_accept">Aksepter</string> <string name="period">Periode</string> - <string name="none">Ingen</string> <string name="daily">Daglig</string> <string name="today">I dag</string> <string name="other">Annet</string> diff --git a/dhis_android_analytics/src/main/res/values-nl/strings.xml b/dhis_android_analytics/src/main/res/values-nl/strings.xml index 312d06a887b..e49e2d5310d 100644 --- a/dhis_android_analytics/src/main/res/values-nl/strings.xml +++ b/dhis_android_analytics/src/main/res/values-nl/strings.xml @@ -9,7 +9,6 @@ <string name="action_accept">Aanvaarden</string> <string name="period">Periode</string> <string name="orgUnit">Organisatie-eenheid</string> - <string name="none">Geen</string> <string name="daily">Dagelijks</string> <string name="today">Vandaag</string> <string name="other">Anders</string> @@ -45,7 +44,6 @@ <string name="include_this_period_body">Het zal de huidige periode in de grafiek weergeven.</string> <string name="no_data_for_selected_filters">De filters die u hebt toegepast, retourneren geen gegevens</string> <string name="no_data_to_display">U hoeft geen gegevens weer te geven</string> - <string name="visualization_error">Er is iets mis met deze visualisatie</string> <string name="visualization_failure">Er is iets mis met de visualisaties</string> <string name="visualization_groups_failure">Er is iets mis met de visualisatiegroepen</string> <string name="pie_chart_no_data">Alle gegevens zijn nul</string> @@ -61,7 +59,6 @@ <string name="error_invalid_program_indicator">U heeft geen toegang tot programma-indicator %s</string> <string name="error_invalid_visualization">De visualisatie %s ontbreekt</string> <string name="error_parsing_visualization">Deze visualisatie is niet goed geconfigureerd, neem contact op met uw beheerder.</string> - <string name="error_invalid_custom_boundaries">Aangepaste grenzen worden niet ondersteund voor programma-indicator %s</string> <string name="error_database">Geen toegang tot database. Neem contact op met uw beheerder.</string> <string name="error_invalid_program">U heeft geen toegang tot het programma %s</string> <string name="error_invalid_attribute">U heeft geen toegang tot attribuut %s</string> diff --git a/dhis_android_analytics/src/main/res/values-prs/strings.xml b/dhis_android_analytics/src/main/res/values-prs/strings.xml index 3362235275c..50fe14b4ab6 100644 --- a/dhis_android_analytics/src/main/res/values-prs/strings.xml +++ b/dhis_android_analytics/src/main/res/values-prs/strings.xml @@ -2,7 +2,6 @@ <resources> <string name="action_accept">پذیرش</string> <string name="period">دوره</string> - <string name="none">هیچ‌کدام</string> <string name="daily">روزنه</string> <string name="today">امروز</string> <string name="other">دیگر</string> diff --git a/dhis_android_analytics/src/main/res/values-ps/strings.xml b/dhis_android_analytics/src/main/res/values-ps/strings.xml index 4f1e5a6e269..8f32ebbc4a3 100644 --- a/dhis_android_analytics/src/main/res/values-ps/strings.xml +++ b/dhis_android_analytics/src/main/res/values-ps/strings.xml @@ -2,7 +2,6 @@ <resources> <string name="action_accept">د منلو وړ</string> <string name="period">معیاد</string> - <string name="none">هېڅ یو</string> <string name="daily">ورځني [ د مودې ډول ]</string> <string name="today">نن ورځ</string> <string name="other">نور</string> diff --git a/dhis_android_analytics/src/main/res/values-pt-rBR/strings.xml b/dhis_android_analytics/src/main/res/values-pt-rBR/strings.xml index 135b459054b..83c0c64c566 100644 --- a/dhis_android_analytics/src/main/res/values-pt-rBR/strings.xml +++ b/dhis_android_analytics/src/main/res/values-pt-rBR/strings.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <resources> <string name="period">Período</string> - <string name="none">Nenhum</string> <string name="daily">Diário</string> <string name="today">Hoje</string> <string name="other">Outro</string> diff --git a/dhis_android_analytics/src/main/res/values-pt/strings.xml b/dhis_android_analytics/src/main/res/values-pt/strings.xml index 4382d0c612a..7fee702c6aa 100644 --- a/dhis_android_analytics/src/main/res/values-pt/strings.xml +++ b/dhis_android_analytics/src/main/res/values-pt/strings.xml @@ -9,7 +9,6 @@ <string name="action_accept">Aceitar</string> <string name="period">Período</string> <string name="orgUnit">UnidOrg</string> - <string name="none">Nenhum</string> <string name="daily">Diário</string> <string name="today">Hoje</string> <string name="other">Outro</string> @@ -45,7 +44,6 @@ <string name="include_this_period_body">Inclui o período actual no gráfico</string> <string name="no_data_for_selected_filters">Não tem dados associados aos filtros aplicados</string> <string name="no_data_to_display">Não existem dados para mostrar</string> - <string name="visualization_error">Algo de errado existe com esta visualização</string> <string name="visualization_failure">Algo de errado existe com estas visualizações</string> <string name="visualization_groups_failure">Algo de errado existe com a visualização dos grupos</string> <string name="pie_chart_no_data">Todos os dados são zero</string> @@ -61,7 +59,6 @@ <string name="error_invalid_program_indicator">Não tem acesso ao indicador de programa %s</string> <string name="error_invalid_visualization">A visualização %s está em falta</string> <string name="error_parsing_visualization">A visualização não está bem configurada, contacte o seu admin</string> - <string name="error_invalid_custom_boundaries">Limites personalizados não são suportados para o indicador de programa %s</string> <string name="error_database">Não consegue aceder a base de dados. Favor contactar o seu administrador.</string> <string name="error_invalid_program">Não tem acesso ao programa%s</string> <string name="error_invalid_attribute">Não tem acesso ao atributo %s</string> diff --git a/dhis_android_analytics/src/main/res/values-ru/strings.xml b/dhis_android_analytics/src/main/res/values-ru/strings.xml index 23fc52b1c80..b0ed579152a 100644 --- a/dhis_android_analytics/src/main/res/values-ru/strings.xml +++ b/dhis_android_analytics/src/main/res/values-ru/strings.xml @@ -9,7 +9,6 @@ <string name="action_accept">Принять</string> <string name="period">Период</string> <string name="orgUnit">Орг.подразделение</string> - <string name="none">Не известное значение</string> <string name="daily">Ежедневно</string> <string name="today">Сегодня</string> <string name="other">Другое</string> @@ -45,7 +44,6 @@ <string name="include_this_period_body">Это отобразит на графике текущий период.</string> <string name="no_data_for_selected_filters">Примененные Вами фильтры не соотносятся ни с какими данными</string> <string name="no_data_to_display">У Вас нет данных для отображения</string> - <string name="visualization_error">Что-то не так с этой визуализацией</string> <string name="visualization_failure">Что-то не так с визуализациями</string> <string name="visualization_groups_failure">Что-то не так с группами визуализаций</string> <string name="pie_chart_no_data">Все данные равны нулю</string> diff --git a/dhis_android_analytics/src/main/res/values-sv/strings.xml b/dhis_android_analytics/src/main/res/values-sv/strings.xml index 5803cee0e7b..ae5b810081e 100644 --- a/dhis_android_analytics/src/main/res/values-sv/strings.xml +++ b/dhis_android_analytics/src/main/res/values-sv/strings.xml @@ -2,7 +2,6 @@ <resources> <string name="action_accept">Acceptera</string> <string name="period">Period</string> - <string name="none">Ingen</string> <string name="daily">Dagligen</string> <string name="other">Övrig</string> <string name="weekly">Varje vecka</string> diff --git a/dhis_android_analytics/src/main/res/values-tet/strings.xml b/dhis_android_analytics/src/main/res/values-tet/strings.xml index 634b6efb59f..41d0afc3288 100644 --- a/dhis_android_analytics/src/main/res/values-tet/strings.xml +++ b/dhis_android_analytics/src/main/res/values-tet/strings.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <resources> <string name="period">Períodu</string> - <string name="none">Nein ida</string> <string name="daily">Diáriu</string> <string name="other">Seluk</string> <string name="weekly">Semanal</string> diff --git a/dhis_android_analytics/src/main/res/values-tg/strings.xml b/dhis_android_analytics/src/main/res/values-tg/strings.xml index abe7678f943..7c80bd5ad07 100644 --- a/dhis_android_analytics/src/main/res/values-tg/strings.xml +++ b/dhis_android_analytics/src/main/res/values-tg/strings.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <resources> <string name="period">Давра</string> - <string name="none">Ягонто</string> <string name="daily">Ҳаррӯза</string> <string name="today">Имрӯз</string> <string name="other">Дигар</string> diff --git a/dhis_android_analytics/src/main/res/values-uk/strings.xml b/dhis_android_analytics/src/main/res/values-uk/strings.xml index 851d722453c..0eebc1b8847 100644 --- a/dhis_android_analytics/src/main/res/values-uk/strings.xml +++ b/dhis_android_analytics/src/main/res/values-uk/strings.xml @@ -9,7 +9,6 @@ <string name="action_accept">Прийняти</string> <string name="period">Період</string> <string name="orgUnit">Організаційний підрозділ</string> - <string name="none">Жодного</string> <string name="daily">Щодня</string> <string name="today">Сьогодні</string> <string name="other">Інше</string> @@ -45,7 +44,6 @@ <string name="include_this_period_body">Це відобразить поточний період на діаграмі.</string> <string name="no_data_for_selected_filters">Фільтри, які Ви застосували, не відповідають жодним даним</string> <string name="no_data_to_display">У Вас немає даних для відображення</string> - <string name="visualization_error">Помилка із цією візуалізацією</string> <string name="visualization_failure">Помилка із цими візуалізаціями</string> <string name="visualization_groups_failure">Помилка із групою візуалізацій</string> <string name="pie_chart_no_data">Усі значення нульові</string> @@ -61,7 +59,6 @@ <string name="error_invalid_program_indicator">Ви не маєте доступу до програмного індикатора %s</string> <string name="error_invalid_visualization">Візуалізація %s відсутня</string> <string name="error_parsing_visualization">Цю візуалізацію налаштовано неправильно. Зверніться до адміністратора.</string> - <string name="error_invalid_custom_boundaries">Спеціальні межі не підтримуються для програмного індикатора %s</string> <string name="error_database">Неможливо отримати доступ до бази даних. Будь ласка, зверніться до свого адміністратора.</string> <string name="error_invalid_program">Ви не маєте доступу до програми %s</string> <string name="error_invalid_attribute">Ви не маєте доступу до атрибуту %s</string> diff --git a/dhis_android_analytics/src/main/res/values-ur/strings.xml b/dhis_android_analytics/src/main/res/values-ur/strings.xml index 88d2be1923e..2fa15acbda4 100644 --- a/dhis_android_analytics/src/main/res/values-ur/strings.xml +++ b/dhis_android_analytics/src/main/res/values-ur/strings.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <resources> <string name="period">مدت</string> - <string name="none">کوئی نہں</string> <string name="daily">روزانہ</string> <string name="today">آج</string> <string name="other">دیگر</string> diff --git a/dhis_android_analytics/src/main/res/values-uz-rUZ/strings.xml b/dhis_android_analytics/src/main/res/values-uz-rUZ/strings.xml index 8250abcea48..5a5959ce2e9 100644 --- a/dhis_android_analytics/src/main/res/values-uz-rUZ/strings.xml +++ b/dhis_android_analytics/src/main/res/values-uz-rUZ/strings.xml @@ -3,7 +3,6 @@ <string name="show_table_graph">Jadval sifatida koʼrish</string> <string name="action_accept">Qabul qiling</string> <string name="period">davr</string> - <string name="none">Йўқ</string> <string name="daily">Кунлик</string> <string name="today">бугун</string> <string name="other">Boshqa</string> diff --git a/dhis_android_analytics/src/main/res/values-uz/strings.xml b/dhis_android_analytics/src/main/res/values-uz/strings.xml index 3d6cf787646..0e64911eea9 100644 --- a/dhis_android_analytics/src/main/res/values-uz/strings.xml +++ b/dhis_android_analytics/src/main/res/values-uz/strings.xml @@ -9,7 +9,6 @@ <string name="action_accept">Қабул қилинг</string> <string name="period">Давр</string> <string name="orgUnit">Ташкилий бирлик</string> - <string name="none">Йўқ</string> <string name="daily">Кунлик</string> <string name="today">Бугун</string> <string name="other">Бошқа</string> diff --git a/dhis_android_analytics/src/main/res/values-vi/strings.xml b/dhis_android_analytics/src/main/res/values-vi/strings.xml index c752921c92e..ee65b96dcfe 100644 --- a/dhis_android_analytics/src/main/res/values-vi/strings.xml +++ b/dhis_android_analytics/src/main/res/values-vi/strings.xml @@ -9,7 +9,6 @@ <string name="action_accept">Chấp nhận</string> <string name="period">Thời điểm</string> <string name="orgUnit">Đơn vị</string> - <string name="none">Không</string> <string name="daily">Hàng ngày</string> <string name="today">Hôm nay</string> <string name="other">Khác</string> @@ -45,7 +44,6 @@ <string name="include_this_period_body">Nó sẽ hiển thị thời điểm hiện tại trong biểu đồ</string> <string name="no_data_for_selected_filters">Các yếu tố lọc bạn đã chọn không trả về kết quả nào</string> <string name="no_data_to_display">Bạn không có dữ liệu nào để hiển thị</string> - <string name="visualization_error">Có gì đó không đúng với biểu đồ này</string> <string name="visualization_failure">Có gì đó không đúng với các biểu đồ này</string> <string name="visualization_groups_failure">Có gì đó không đúng với các nhóm biểu đồ này</string> <string name="pie_chart_no_data">Tất cả dữ liệu là 0</string> @@ -61,7 +59,6 @@ <string name="error_invalid_program_indicator">Bạn không được truy cập Chỉ Số Chương Trình %s</string> <string name="error_invalid_visualization">Biểu đồ %s không hiển thị</string> <string name="error_parsing_visualization">Biểu đồ này cấu hình chưa đúng, xin vui lòng liên hệ quản lý của bạn</string> - <string name="error_invalid_custom_boundaries">Phạm vi tự chọn không được hỗ trợ cho Chỉ Số Chương Trình %s</string> <string name="error_database">Không thể truy cập cơ sở dữ liệu. Xin vui lòng liên hệ quản lý của bạn. </string> <string name="error_invalid_program">Bạn không có quyền truy cập đến chương trình %s</string> <string name="error_invalid_attribute">Bạn không có quyền truy cập đến thuộc tính %s</string> diff --git a/dhis_android_analytics/src/main/res/values-zh-rCN/strings.xml b/dhis_android_analytics/src/main/res/values-zh-rCN/strings.xml index 028507b98d7..e761cd68890 100644 --- a/dhis_android_analytics/src/main/res/values-zh-rCN/strings.xml +++ b/dhis_android_analytics/src/main/res/values-zh-rCN/strings.xml @@ -8,7 +8,6 @@ <string name="show_pie_value">以饼图形式查看</string> <string name="action_accept">接受</string> <string name="period">周期</string> - <string name="none">无</string> <string name="daily">每日</string> <string name="today">今天</string> <string name="other">其它</string> diff --git a/dhis_android_analytics/src/main/res/values-zh/strings.xml b/dhis_android_analytics/src/main/res/values-zh/strings.xml index 73507351b45..c502c6760e0 100644 --- a/dhis_android_analytics/src/main/res/values-zh/strings.xml +++ b/dhis_android_analytics/src/main/res/values-zh/strings.xml @@ -9,7 +9,6 @@ <string name="action_accept">接受</string> <string name="period">期间</string> <string name="orgUnit">组织单位</string> - <string name="none">没有</string> <string name="daily">每日</string> <string name="today">今天</string> <string name="other">其它</string> @@ -45,7 +44,6 @@ <string name="include_this_period_body">它将在图表中显示当前周期。</string> <string name="no_data_for_selected_filters">您应用的过滤器不返回任何数据</string> <string name="no_data_to_display">您没有任何要显示的数据</string> - <string name="visualization_error">此可视化有问题</string> <string name="visualization_failure">可视化有问题</string> <string name="visualization_groups_failure">可视化组有问题</string> <string name="pie_chart_no_data">所有数据为零</string> @@ -61,7 +59,6 @@ <string name="error_invalid_program_indicator">您无权访问项目指标 %s</string> <string name="error_invalid_visualization">缺少可视化 %s</string> <string name="error_parsing_visualization">此可视化未正确配置,请联系您的管理员。</string> - <string name="error_invalid_custom_boundaries">项目指标 %s 不支持自定义边界</string> <string name="error_database">无法访问数据库。请联系您的管理员。</string> <string name="error_invalid_program">您无权访问项目%s</string> <string name="error_invalid_attribute">您无权访问属性 %s</string> diff --git a/dhis_android_analytics/src/main/res/values/strings.xml b/dhis_android_analytics/src/main/res/values/strings.xml index e002a7f92ce..ffc1de03d32 100644 --- a/dhis_android_analytics/src/main/res/values/strings.xml +++ b/dhis_android_analytics/src/main/res/values/strings.xml @@ -9,7 +9,6 @@ <string name="action_accept">Accept</string> <string name="period">Period</string> <string name="orgUnit">OrgUnit</string> - <string name="none">None</string> <string name="daily">Daily</string> <string name="today">Today</string> <string name="other">Other</string> @@ -45,7 +44,6 @@ <string name="include_this_period_body">It will display the current period in the chart.</string> <string name="no_data_for_selected_filters">The filters you applied do not return any data</string> <string name="no_data_to_display">You do not have any data to be displayed</string> - <string name="visualization_error">Something is wrong with this visualization</string> <string name="visualization_failure">Something is wrong with the visualizations</string> <string name="visualization_groups_failure">Something is wrong with the visualization groups</string> <string name="pie_chart_no_data">All data is zero</string> @@ -61,7 +59,6 @@ <string name="error_invalid_program_indicator">You don\'t have access to program indicator %s</string> <string name="error_invalid_visualization">The visualization %s is missing</string> <string name="error_parsing_visualization">This visualization is not well configured, please contact your admin.</string> - <string name="error_invalid_custom_boundaries">Custom boundaries are not supported for program indicator %s</string> <string name="error_database">Can\'t access database. Please contact your administrator.</string> <string name="error_invalid_program">You do not have access to program %s</string> <string name="error_invalid_attribute">You do not have access to attribute %s</string> diff --git a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ChartsRepositoryTest.kt b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ChartsRepositoryTest.kt index adf8c8f65be..9b0f7116197 100644 --- a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ChartsRepositoryTest.kt +++ b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ChartsRepositoryTest.kt @@ -16,6 +16,7 @@ import org.hisp.dhis.android.core.analytics.AnalyticsException import org.hisp.dhis.android.core.analytics.aggregated.DimensionItem import org.hisp.dhis.android.core.analytics.aggregated.GridAnalyticsResponse import org.hisp.dhis.android.core.arch.helpers.Result +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.common.RelativeOrganisationUnit import org.hisp.dhis.android.core.common.RelativePeriod import org.hisp.dhis.android.core.common.ValueType @@ -43,6 +44,7 @@ import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock import org.mockito.kotlin.verify import org.mockito.kotlin.whenever +import kotlinx.coroutines.test.runTest import java.util.Date class ChartsRepositoryTest { @@ -66,7 +68,7 @@ class ChartsRepositoryTest { ) @Test - fun `Should return empty list if enrollment teiUid is null`() { + fun `Should return empty list if enrollment teiUid is null`() = runTest { whenever( d2 .enrollmentModule() @@ -79,6 +81,7 @@ class ChartsRepositoryTest { .uid("enrollmentUid") .program("programUid") .trackedEntityInstance(null) + .attributeOptionCombo("attributeOptionComboUid") .build() val result = repository.getAnalyticsForEnrollment("enrollmentUid") assertTrue( @@ -87,7 +90,7 @@ class ChartsRepositoryTest { } @Test - fun `Should get analytics if settings is not null`() { + fun `Should get analytics if settings is not null`() = runTest { mockEnrollmentCall() mockAnalyticsSettingsCall(mockedAnalyticsSettings()) whenever( @@ -103,7 +106,7 @@ class ChartsRepositoryTest { } @Test - fun `Should get default analytics if settings is null`() { + fun `Should get default analytics if settings is null`() = runTest { mockEnrollmentCall() mockAnalyticsSettingsCall(null) mockRepeatableStagesCall() @@ -134,7 +137,7 @@ class ChartsRepositoryTest { } @Test - fun `Should get default analytics if settings is null and return only dataElement graphs`() { + fun `Should get default analytics if settings is null and return only dataElement graphs`() = runTest { mockEnrollmentCall() mockAnalyticsSettingsCall(null) mockRepeatableStagesCall() @@ -152,7 +155,7 @@ class ChartsRepositoryTest { } @Test - fun `Should get default analytics if settings is null and return only indicator graphs`() { + fun `Should get default analytics if settings is null and return only indicator graphs`() = runTest { mockEnrollmentCall() mockAnalyticsSettingsCall(null) mockRepeatableStagesCall() @@ -178,7 +181,7 @@ class ChartsRepositoryTest { } @Test - fun `Should get default analytics if settings is null and return empty list`() { + fun `Should get default analytics if settings is null and return empty list`() = runTest { mockEnrollmentCall() mockAnalyticsSettingsCall(null) mockRepeatableStagesCall() @@ -538,6 +541,7 @@ class ChartsRepositoryTest { .uid("enrollmentUid") .program("programUid") .trackedEntityInstance("teiUid") + .attributeOptionCombo("attributeOptionComboUid") .build() } @@ -676,6 +680,7 @@ class ChartsRepositoryTest { .builder() .uid("de_1") .valueType(ValueType.NUMBER) + .categoryCombo(ObjectWithUid.create("categoryOptionComboUid")) .build() whenever( d2 @@ -706,7 +711,7 @@ class ChartsRepositoryTest { ProgramStageDataElement .builder() .uid("psde_uid_1") - .dataElement(DataElement.builder().uid("de_1").build()) + .dataElement(ObjectWithUid.create("de_1")) .build(), ) } @@ -756,7 +761,7 @@ class ChartsRepositoryTest { listOf( SerieData( "de_field", - listOf(GraphPoint(Date(), null, GraphFieldValue.Numeric(30f))), + listOf(GraphPoint(Date(), null, GraphFieldValue.Decimal(30f))), ), ), periodToDisplayDefault = null, @@ -771,7 +776,7 @@ class ChartsRepositoryTest { listOf( SerieData( "indicator_field", - listOf(GraphPoint(Date(), null, GraphFieldValue.Numeric(30f))), + listOf(GraphPoint(Date(), null, GraphFieldValue.Decimal(30f))), ), ), null, diff --git a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/bindings/DateToPositionTest.kt b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/bindings/DateToPositionTest.kt index 3a7bc105ff8..05205d9a1ed 100644 --- a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/bindings/DateToPositionTest.kt +++ b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/bindings/DateToPositionTest.kt @@ -32,10 +32,11 @@ class DateToPositionTest { listOf( PeriodType.Daily, PeriodType.Weekly, + PeriodType.WeeklyWednesday, + PeriodType.WeeklyThursday, + PeriodType.WeeklyFriday, PeriodType.WeeklySaturday, PeriodType.WeeklySunday, - PeriodType.WeeklyThursday, - PeriodType.WeeklyWednesday, PeriodType.BiWeekly, PeriodType.Monthly, PeriodType.BiMonthly, @@ -86,8 +87,11 @@ class DateToPositionTest { listOf( PeriodType.Yearly, + PeriodType.FinancialFeb, PeriodType.FinancialApril, PeriodType.FinancialJuly, + PeriodType.FinancialAug, + PeriodType.FinancialSep, PeriodType.FinancialOct, PeriodType.FinancialNov, ).forEach { period -> diff --git a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/data/GraphTest.kt b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/data/GraphTest.kt index 06a96a9f2d7..b9142d34cd3 100644 --- a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/data/GraphTest.kt +++ b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/data/GraphTest.kt @@ -96,9 +96,9 @@ class GraphTest { private fun mockedCoordinates(): List<GraphPoint> = arrayListOf( - GraphPoint(Date.from(Instant.parse("2020-01-01T00:00:00.00Z")), fieldValue = GraphFieldValue.Numeric(10f)), - GraphPoint(Date.from(Instant.parse("2020-01-02T00:00:00.00Z")), fieldValue = GraphFieldValue.Numeric(20f)), - GraphPoint(Date.from(Instant.parse("2020-01-04T00:00:00.00Z")), fieldValue = GraphFieldValue.Numeric(50f)), - GraphPoint(Date.from(Instant.parse("2020-01-07T00:00:00.00Z")), fieldValue = GraphFieldValue.Numeric(30f)), + GraphPoint(Date.from(Instant.parse("2020-01-01T00:00:00.00Z")), fieldValue = GraphFieldValue.Decimal(10f)), + GraphPoint(Date.from(Instant.parse("2020-01-02T00:00:00.00Z")), fieldValue = GraphFieldValue.Decimal(20f)), + GraphPoint(Date.from(Instant.parse("2020-01-04T00:00:00.00Z")), fieldValue = GraphFieldValue.Decimal(50f)), + GraphPoint(Date.from(Instant.parse("2020-01-07T00:00:00.00Z")), fieldValue = GraphFieldValue.Decimal(30f)), ) } diff --git a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/domain/GetEnrollmentAnalyticsUseCaseTest.kt b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/domain/GetEnrollmentAnalyticsUseCaseTest.kt new file mode 100644 index 00000000000..ae0c5364e57 --- /dev/null +++ b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/domain/GetEnrollmentAnalyticsUseCaseTest.kt @@ -0,0 +1,74 @@ +package dhis2.org.analytics.charts.domain + +import dhis2.org.analytics.charts.ChartsRepository +import dhis2.org.analytics.charts.data.Graph +import dhis2.org.analytics.charts.data.ChartType +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.runTest +import org.dhis2.commons.viewmodel.DispatcherProvider +import org.hisp.dhis.android.core.period.PeriodType +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Test +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.doThrow +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever + +@OptIn(ExperimentalCoroutinesApi::class) +class GetEnrollmentAnalyticsUseCaseTest { + + private val testDispatcher = UnconfinedTestDispatcher() + + private val dispatcherProvider: DispatcherProvider = mock { + on { io() } doReturn testDispatcher + on { computation() } doReturn testDispatcher + on { ui() } doReturn testDispatcher + } + + private val chartsRepository: ChartsRepository = mock() + + private val useCase = GetEnrollmentAnalyticsUseCase(chartsRepository, dispatcherProvider) + + @Test + fun `Should return success result with graph list when repository succeeds`() = runTest { + val expectedGraphs = listOf( + Graph( + title = "graph_1", + series = emptyList(), + periodToDisplayDefault = null, + eventPeriodType = PeriodType.Daily, + periodStep = 0L, + chartType = ChartType.LINE_CHART, + ), + ) + whenever(chartsRepository.getAnalyticsForEnrollment("enrollmentUid")) doReturn expectedGraphs + + val result = useCase("enrollmentUid") + + assertTrue(result.isSuccess) + assertEquals(expectedGraphs, result.getOrNull()) + } + + @Test + fun `Should return failure result when repository throws exception`() = runTest { + val exception = RuntimeException("Repository error") + whenever(chartsRepository.getAnalyticsForEnrollment("enrollmentUid")) doThrow exception + + val result = useCase("enrollmentUid") + + assertTrue(result.isFailure) + assertEquals(exception, result.exceptionOrNull()) + } + + @Test + fun `Should execute on io dispatcher`() = runTest { + whenever(chartsRepository.getAnalyticsForEnrollment("enrollmentUid")) doReturn emptyList() + + useCase("enrollmentUid") + + // Verifying io() was called means the use case used the injected dispatcher + org.mockito.kotlin.verify(dispatcherProvider).io() + } +} diff --git a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/mappers/GraphCoordinatesToEntryTest.kt b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/mappers/GraphCoordinatesToEntryTest.kt index 118b71e0547..43225ac288f 100644 --- a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/mappers/GraphCoordinatesToEntryTest.kt +++ b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/mappers/GraphCoordinatesToEntryTest.kt @@ -46,9 +46,9 @@ class GraphCoordinatesToEntryTest { private fun mockedCoordinates(): List<GraphPoint> = arrayListOf( - GraphPoint(Date.from(Instant.parse("2020-01-01T00:00:00.00Z")), null, GraphFieldValue.Numeric(10f)), - GraphPoint(Date.from(Instant.parse("2020-01-02T00:00:00.00Z")), null, GraphFieldValue.Numeric(20f)), - GraphPoint(Date.from(Instant.parse("2020-01-04T00:00:00.00Z")), null, GraphFieldValue.Numeric(50f)), - GraphPoint(Date.from(Instant.parse("2020-01-07T00:00:00.00Z")), null, GraphFieldValue.Numeric(30f)), + GraphPoint(Date.from(Instant.parse("2020-01-01T00:00:00.00Z")), null, GraphFieldValue.Decimal(10f)), + GraphPoint(Date.from(Instant.parse("2020-01-02T00:00:00.00Z")), null, GraphFieldValue.Decimal(20f)), + GraphPoint(Date.from(Instant.parse("2020-01-04T00:00:00.00Z")), null, GraphFieldValue.Decimal(50f)), + GraphPoint(Date.from(Instant.parse("2020-01-07T00:00:00.00Z")), null, GraphFieldValue.Decimal(30f)), ) } diff --git a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/providers/ChartCoordinatesProviderImplTest.kt b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/providers/ChartCoordinatesProviderImplTest.kt index 8522e0f6747..75bd4006f54 100644 --- a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/providers/ChartCoordinatesProviderImplTest.kt +++ b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/providers/ChartCoordinatesProviderImplTest.kt @@ -12,6 +12,7 @@ import org.mockito.Mockito import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock import org.mockito.kotlin.whenever +import kotlinx.coroutines.test.runTest import java.util.Date class ChartCoordinatesProviderImplTest { @@ -22,7 +23,7 @@ class ChartCoordinatesProviderImplTest { ChartCoordinatesProviderImpl(d2, periodStepProvider, resourceManager) @Test - fun `Should get coordinates for data elements`() { + fun `Should get coordinates for data elements`() = runTest { mockedLineListResponse(false) val result = coordinatesProvider.dataElementCoordinates( @@ -38,7 +39,7 @@ class ChartCoordinatesProviderImplTest { } @Test - fun `Should return empty coordinates for data elements`() { + fun `Should return empty coordinates for data elements`() = runTest { mockedLineListResponse(true) val result = coordinatesProvider.dataElementCoordinates( @@ -54,7 +55,7 @@ class ChartCoordinatesProviderImplTest { } @Test - fun `Should get coordinates for indicators`() { + fun `Should get coordinates for indicators`() = runTest { mockedIndicatorLineListResponse(false) val result = coordinatesProvider.indicatorCoordinates( @@ -70,7 +71,7 @@ class ChartCoordinatesProviderImplTest { } @Test - fun `Should return empty coordinates for indicator`() { + fun `Should return empty coordinates for indicator`() = runTest { mockedIndicatorLineListResponse(true) val result = coordinatesProvider.indicatorCoordinates( diff --git a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ui/AnalyticsModelTest.kt b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ui/AnalyticsModelTest.kt index 9555fddb172..8238c9407e8 100644 --- a/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ui/AnalyticsModelTest.kt +++ b/dhis_android_analytics/src/test/java/dhis2/org/analytics/charts/ui/AnalyticsModelTest.kt @@ -77,13 +77,13 @@ class AnalyticsModelTest { GraphPoint( GregorianCalendar(2021, 0, 1).time, 0f, - GraphFieldValue.Numeric(0f), + GraphFieldValue.Decimal(0f), null, ), GraphPoint( GregorianCalendar(2021, 0, 1).time, 1f, - GraphFieldValue.Numeric(0f), + GraphFieldValue.Decimal(0f), null, ), ), diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index fbcac6a5156..00000000000 --- a/docs/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# DHIS 2 Android Capture App - Documentation - -This folder used to contain the the documentation of the DHIS 2 Android App and other technical docs. Since January 2022 it has been moved to [dhis2-android-docs](https://github.com/dhis2-android-docs). diff --git a/docs/compilation-distribution.md b/docs/compilation-distribution.md new file mode 100644 index 00000000000..88827893d71 --- /dev/null +++ b/docs/compilation-distribution.md @@ -0,0 +1,38 @@ +--- +id: compilation-distribution +title: Compiling and distributing +sidebar_position: 4 +--- + +## Compiling APKs + +Run the following gradle commands to build and generate the available APK types: + +- Release apk (both with and without play services) + ```bash + gradlew assembleRelease + ``` +- Training apk + ```bash + gradlew assembleDhis2Training + ``` +- Debug apk + ```bash + gradlew assembleDebug + ``` + +You can also go to the right side of the screen and click on the “gradle” icon, then click on +“dhis2-capture-app” > “app” > “build” > “assembleDebug” (or any other). +After building the APK will be generated in the path project/app/build/outputs/apk + +When it comes to building release APK, “assembleRelease” you will generate a release +APK but it will not be signed, so in this case we recommend you go to “Build” that can easily be +found on top of the screen, then “Generate signed/bundle APK” and you will be asked to load a +keystore and type your password. Finally, after filling the passwords and clicking next the APK will +be generated in the same path mentioned previously project/app/build/outputs/apk. + +## Distribution via MDM + +At this moment you should have the DHIS2 Mobile App compiled with a different applicationId and +signed with your certificates. So it can be distributed via your Mobile Device Management under the +Enterprise Application (or similar) section. diff --git a/docs/configure-openid-oauth.md b/docs/configure-openid-oauth.md new file mode 100644 index 00000000000..4eff1798811 --- /dev/null +++ b/docs/configure-openid-oauth.md @@ -0,0 +1,138 @@ +--- +id: configure-openid-oauth +title: Configure OpenID / Oauth +sidebar_position: 3 +--- + +## Configure OpenID / OAuth + +Since version 2.4, the DHIS2 Android app supports login with an OpenID Connect or OAuth 2.0 +provider. This feature is not available by default — you need to supply the configuration described +below and distribute your own APK. OpenID Connect must also be enabled on the DHIS2 web server and +the user's OpenID parameter must be configured. + +### Configuration + +All OpenID configuration is supplied via **environment variables** (or `local.properties` for local +development). The build script reads these values and embeds them in `BuildConfig` at compile time. + +#### Environment variables + +| Variable | Required | Description | +|---|---|---| +| `OPEN_ID_TYPE` | Yes | Mode: `discovery` (recommended) or `token` | +| `OPEN_ID_SERVER` | Yes | Your DHIS2 server URL | +| `OPEN_ID_CLIENT` | Yes | Client ID from the auth provider | +| `OPEN_ID_REDIRECT_URI` | Yes | Redirect URI registered with the auth provider | +| `OPEN_ID_AUTH_SCHEME` | Yes | URI scheme of the redirect URI (e.g. `com.googleusercontent.apps.CLIENT_ID_PREFIX`) | +| `OPEN_ID_DISCOVERY_URI` | Discovery mode | OpenID discovery endpoint (e.g. `https://provider/.well-known/openid-configuration`) | +| `OPEN_ID_AUTHORIZATION_URL` | Token mode | Authorization endpoint URL | +| `OPEN_ID_TOKEN_URL` | Token mode | Token endpoint URL | +| `OPEN_ID_BUTTON_TEXT` | No | Custom label for the OpenID login button | +| `OPEN_ID_PROMPT` | No | OpenID `prompt` parameter (e.g. `login`, `consent`, `select_account`) | + +For local development you can place the same key-value pairs in `local.properties` at the project +root instead of setting environment variables. The build script checks environment variables first +and falls back to `local.properties`. + +#### Discovery mode vs Token mode + +Set `OPEN_ID_TYPE` to choose how the app locates the provider endpoints: + +- **`discovery`** (recommended) — supply `OPEN_ID_DISCOVERY_URI`. The app fetches the provider's + metadata document at startup and resolves the authorization and token endpoints automatically. +- **`token`** — supply `OPEN_ID_AUTHORIZATION_URL` and `OPEN_ID_TOKEN_URL` directly, without a + discovery document. + +Use `discovery` whenever the provider publishes a `.well-known/openid-configuration` endpoint. + +#### Google example (discovery mode) + +```properties +# local.properties or environment variables +OPEN_ID_TYPE=discovery +OPEN_ID_SERVER=https://play.dhis2.org/android-current +OPEN_ID_CLIENT=CLIENT_ID_PREFIX.apps.googleusercontent.com +OPEN_ID_REDIRECT_URI=com.googleusercontent.apps.CLIENT_ID_PREFIX:/oauth2 +OPEN_ID_AUTH_SCHEME=com.googleusercontent.apps.CLIENT_ID_PREFIX +OPEN_ID_DISCOVERY_URI=https://accounts.google.com/.well-known/openid-configuration +OPEN_ID_BUTTON_TEXT=Login with Google +``` + +### AndroidManifest.xml + +The app's `AndroidManifest.xml` already contains the `RedirectUriReceiverActivity` declaration. +The redirect URI scheme is injected automatically from `OPEN_ID_AUTH_SCHEME` — **no manual editing +of the manifest is required**. + +For reference, the relevant activity entry looks like: + +```xml +<activity android:name="net.openid.appauth.RedirectUriReceiverActivity" android:exported="true" + tools:node="replace"> + <intent-filter> + <action android:name="android.intent.action.VIEW" /> + <category android:name="android.intent.category.DEFAULT" /> + <category android:name="android.intent.category.BROWSABLE" /> + <data android:scheme="${openIdAuthScheme}" /> + </intent-filter> +</activity> +``` + +#### Advanced: hardcoding OidcInfo in source code + +As an alternative to environment variables, you can hardcode the provider configuration directly in +`login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/LoginScreen.kt` by replacing +the body of `fixedOpenIdProvider`: + +```kotlin +// Discovery mode +private fun fixedOpenIdProvider(oidcInfo: OidcInfo): OidcInfo = + OidcInfo.Discovery( + server = "https://play.dhis2.org/android-current", + loginButtonText = "Login with Google", + clientId = "CLIENT_ID_PREFIX.apps.googleusercontent.com", + redirectUri = "com.googleusercontent.apps.CLIENT_ID_PREFIX:/oauth2", + discoveryUri = "https://accounts.google.com/.well-known/openid-configuration", + prompt = null, + ) + +// Token mode +private fun fixedOpenIdProvider(oidcInfo: OidcInfo): OidcInfo = + OidcInfo.Token( + server = "https://your.dhis2.server", + loginLabel = "Login with MyProvider", + clientId = "your-client-id", + redirectUri = "your.app.scheme:/oauth2", + authorizationUrl = "https://provider/oauth2/authorize", + tokenUrl = "https://provider/oauth2/token", + prompt = null, + ) +``` + +You still need to set `OPEN_ID_AUTH_SCHEME` (or the `manifestPlaceholders["openIdAuthScheme"]` +value in `app/build.gradle.kts`) to match the URI scheme in `redirectUri`, so the OS can redirect +back to the app after a successful login. + +> **This approach is not recommended.** It embeds credentials in source code, complicates +> multi-environment builds, and requires a code change to rotate any value. Prefer environment +> variables for all production and CI/CD builds. + +### Login screen + +When the configuration is present, a new button is displayed on the login screen. + +![](resources/open_id_login.png) + +### OpenID providers and configuration guidelines + +Here you will find a list of available providers and how to obtain the values needed for the +configuration variables above. + +* [Google](https://github.com/openid/AppAuth-Android/blob/master/app/README-Google.md) +* [GitHub](https://docs.github.com/en/developers/apps/authorizing-oauth-apps) +* [ID-porten](https://docs.digdir.no/oidc_protocol_authorize.html) +* [OKTA](https://github.com/openid/AppAuth-Android/blob/master/app/README-Okta.md) +* [KeyCloak](https://www.keycloak.org/docs/latest/authorization_services/index.html#_service_authorization_api) +* [Azure AD](https://learn.microsoft.com/en-us/azure/active-directory-b2c/configure-authentication-sample-android-app?tabs=kotlin) +* [WS02](https://medium.com/@maduranga.siriwardena/configuring-appauth-android-with-wso2-identity-server-8d378835c10a) diff --git a/docs/contributions.md b/docs/contributions.md new file mode 100644 index 00000000000..8aa757f0334 --- /dev/null +++ b/docs/contributions.md @@ -0,0 +1,23 @@ +--- +id: contributions +title: Contributions +sidebar_position: 5 +--- + +# Open an issue + +Open a Jira issue +in [Android app for DHIS2 project](https://dhis2.atlassian.net/jira/software/c/projects/ANDROAPP/boards/118). + +# Open a pull request + +* Fork the repository. Pull changes from the upstream periodically in order to stay up to date when + you submit a pull request. +* Create a branch from **develop** to implement your solution of the issue. +* Your production code should be covered by unit or integration tests. +* Test your changes and make sure they don't break the rest of the project. +* Open a pull request from your **working branch** to **upstream:develop**. +* The pull request title must be descriptive and reference the issue (ANDROAPP-XXX - Description). +* Fill the pull request template with the link to the issue and the rest of checks. +* All the checks in the pull request needs to pass in order to maintain the Continuous Integration. +* The pull request needs to be **reviewed** and approved by the **core team**. \ No newline at end of file diff --git a/docs/creating-custom-usecases.md b/docs/creating-custom-usecases.md new file mode 100644 index 00000000000..0dca6aa5330 --- /dev/null +++ b/docs/creating-custom-usecases.md @@ -0,0 +1,100 @@ +--- +id: creating-custom-usecases +title: Creating Custom Use Cases +sidebar_position: 6 +--- + +To create custom use cases in our DHIS2 Android Capture App, follow the steps below: + +## Step 1: Create a New Module + +The best way to implement a new use case is by creating a new Multiplatform library module. This +module will encapsulate the functionality and can be easily maintained and tested. + +1. **Open your project in Android Studio.** +2. **Go to `File` -> `New` -> `New Module`.** +3. **Select `Kotlin Multiplatform shared module` and click `Next`.** +4. **Name your module according to the pattern `customcase-usecase` (e.g., `stock-usecase`).** +5. **Click `Finish`.** + +## Step 2: Add Dependencies + +In your newly created module, add the `commonskmm` module as a dependency to access the **design +system**, and `commons` for the **DHIS2 SDK**, and other common tools. + +1. **Open `build.gradle.kts` file of your new module.** +2. **Add the following line to the dependencies sections:** + + ```kotlin + commonMain { + dependencies { + implementation(project(":commonskmm")) + } + } + androidMain.dependencies { + implementation(project(":commons")) + } + ``` + +### Configuration Adjustments + +Depending on your Gradle version, you might need to make some configuration adjustments in the +`build.gradle` file. Additionally, if you are using the version catalog, you will need to adjust the +configuration accordingly. + +This allows you to use resources and tools provided in the `commons` modules. + +## Step 3: Implement the Use Case + +Now, you can start implementing your use case within the new module. Structure your code following +the best practices and utilize the resources from the `commons` module. + +### Recommended Architecture + +We recommend using the MVVM (Model-View-ViewModel) architecture with Kotlin language and Jetpack +Compose. This approach ensures a clean separation of concerns and enhances code maintainability. For +more details, refer to the +official [Android Architecture Guidelines](https://developer.android.com/topic/architecture). + +### Example Module Structure + +Here is an example of the module structure: + +- `src/androidMain`: Contains Java/Kotlin source files that needs the android framework as well as + the AndroidManifest and android resources +- `src/commonMain`: Contains Kotlin source files that can be shared between platforms. +- `src/desktopMain`: Contains source files that needs the desktop framework + +It is recommended to include the kotlin multiplatform resource library to share resources. + +## Step 4: Using the Custom Use Case + +To use your custom use case, add your new module as a dependency in the `app` module and call the +entry point (which can be an Activity or a Composable) from where you would like to start using it. + +1. **Open `build.gradle.kts` file of the `app` module.** +2. **Add the following line to the dependencies section:** + + ```kotlin + dependencies { + implementation(project(":usecase-module")) + } + ``` + +3. **Call the entry point in your code:** + + ```kotlin + // Example: Calling an Activity + startActivity(Intent(this, YourUseCaseActivity::class.java)) + + // Example: Calling a Composable + setContent { + YourUseCaseComposable() + } + ``` + +## Benefits + +This modular approach helps to avoid conflicts when updating your project with our new developments. +By isolating custom use cases in separate modules, you can independently maintain and update your +custom functionalities without interfering with the main project components. \ No newline at end of file diff --git a/docs/modifying-apk.md b/docs/modifying-apk.md new file mode 100644 index 00000000000..4341280f908 --- /dev/null +++ b/docs/modifying-apk.md @@ -0,0 +1,84 @@ +--- +id: modifying-apk +title: Modifying the APK +sidebar_position: 2 +--- + +## Change the App logo + +For changing the training logo go to the path **project/app/src/debug/res/mipmap-X/ic_launcher** and +copy/paste your own ic_launcher.png in all mipmap-X directories. + +mipmap-X, where is X, is a specific screen density. + +For the production logo, the process is the same but instead, you will find the logos in the path * +*project/app/src/main/res/mipmap-X/ic_launcher** copy/paste your own ic_launcher.png in all mipmap-X +directories + +You should be able to visualize your icons in Android Studio here too. + +![](resources/launcher_directory.png) + +## Change package name + +Applications are identified in the app stores by their _applicationId _string which must be unique +per store. The official string is com.dhis2. If you try to upload the application to the Google Play +store you will get an error message about that. This can also happen in case you are using Mobile +Device Management tools that allow you to upload your specific applications. If these applications +are going to be stored in the Google Play store as most of them do, you will need to change the +_applicationId_. +If you would like to change the _applicationId_ go to the file build.gradle (Module:app) and scroll +down until you see _defaultConfig_ + +![](resources/applicationId.png) + +Change “com.dhis2” to the new ID that you want. + +You can read more about the applicationId in the official +Android [page](https://developer.android.com/studio/build/application-id) + +## How to generate a Keystore and sign the APK + +By default, the Android system requires that all installed applications be digitally signed by a +certificate whose private is held by the application developer. Android uses the certificate as a +means of identifying the author of an application and establishing trust relationships between +applications. If you try to install an APK without being signed Android will prompt an alert dialog +telling you that the APK is not secure, if you proceed and click “Accept” the apk will be installed. + +Be aware that If you want to upload the APK to the Google Play Store or some other stores you will +be forced to sign the APK, for Github you do not need to sign the APK. In any case, we do recommend +you sign your APK for security reasons. + +For signing the APK you first need a **keystore** that can be easily generated with Android Studio. +Go to top menu “Build” > “Generated Signed Bundle / APK” + +![](resources/build_apk_step_1.png) + +Click on “APK” and ”Next”. Then click on “Create new …” + +![](resources/build_apk_step_2.png) + +After you click on “create new…” you will be asked to fill the following form. +**Key store path**: Choose a path where you want the Keystore to be generated. +**Password and Alias Password**: Choose two secure passwords (they do not need to be the same). The +remaining fields are direct. + +![](resources/build_apk_step_3.png) + +Now clicks “OK” and then you will have to choose a build variant, “release” is fine, after some time +the APKs should be generated and you can find them signed in the path project/app/build/outputs/apk. + +**Important: Once you have generated your Keystore please do not upload it to any public website, +also you will need to sign always with this Keystore for future updates.** + +You can read more about the signing process in the official Android +documentation [page](https://developer.android.com/studio/publish/app-signing) + +## Version name, code and chaning library versions + +Everytime you want to provide your userbase with a new apk you will need to increase the version +code, for doing so go to the directory /gradle/libs.version.toml + +![](resources/version_name_code.png) + +Then you should increase vCode and change vName to the one you want. \ No newline at end of file diff --git a/docs/overview.md b/docs/overview.md new file mode 100644 index 00000000000..0889af22f70 --- /dev/null +++ b/docs/overview.md @@ -0,0 +1,23 @@ +--- +id: overview +title: Overview +sidebar_position: 1 +--- + +# What is the DHIS2 Android app? + +The DHIS2 Android Capture App is a mobile application designed to function seamlessly with your +DHIS2 instance. Our Android app supports data capture across all DHIS2 data models, including +aggregate and individual-level data for Tracker and Event programs. It also includes instant +analysis of data collected in the device. + +The app functions in both online and offline mode, meaning that data and metadata are automatically +synchronized whenever there is internet access, which makes it an effective mobile data entry +solution for locations where internet connectivity is limited. The app is developed and maintained +by the DHIS2 development team, which ensures that the latest versions of the Android app are fully +compatible with all supported DHIS2 core software versions. The app can be downloaded for free +from [Google Play](https://play.google.com/store/apps/details?id=com.dhis2) +or [Github](https://github.com/dhis2/dhis2-android-capture-app/releases). + +To learn more about how the DHIS2 Android app is used to make an impact on health programs around +the world, visit the [Android In Action page](https://dhis2.org/android-in-action/). \ No newline at end of file diff --git a/docs/resources/applicationId.png b/docs/resources/applicationId.png new file mode 100644 index 0000000000000000000000000000000000000000..8fcda894470d85a2c81b6bd1fd1ea33b6d2dc7ff GIT binary patch literal 23284 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 literal 0 HcmV?d00001 diff --git a/docs/resources/build_apk_step_1.png b/docs/resources/build_apk_step_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b3b0dc966ab33153a36226f46591c263b1a8f125 GIT binary patch literal 25567 zcmd43XH=8nwl0cYKtTaPL_m>_fYLikZz0k<k#49`Lq|nKsz4|bI)p&zy%&{EfB>Oa zrH7JGLT@Lowb$KemwWG@eeSqpFo5LC_vS5g&S%bNK1tXcP35~}kH|<!NbahtC}@+A zTy-HKxe|H%D)E_Xj>FC*BvuGjh1a^?=9{yJAQP}9|Hbh$T)&HGsY^wVvq&RS5K#d6 zyr$@JC0kU-@y<h?NT)kDt=?w^10Dcwk3M?|#R^I;avf|&b{$kL*@`aPLN}e=@aXx~ zd{^D*A2Jhl{@%?XLBmyXpk(OYA91Q-p5uDtR1quj?Z19#&;3Am?tVB9s%yO%KHoRM zl^VEJLMsJ@iC6Dk2}4;&o!QBrCd<CLHmsZSpy?V3$q#aVHY2Vi(i>+JM|JPyy1zZW z)BxyzNhCaRO-?SkNIvE9@HtV_S7ITN${CJ_T@RDv0#eQr;5UTQVv49xxpJOrDlb2* zzA-LPV+~i2-!3&+_8-(ae_s~+WZty2?<r+?$PN}sn&o$&9!wf^u^KdBn(liwK~pEL ziiE#NNH1I|7Dl@(Mu!vt&y-sYm50M)0HHj3vH7YzNbx{KwHSa)ot$@j>ADcFsxFdz zLz8fqAYvO%9VbtAP0An+y3}-(?_iVMN-uE%O0o|MD&IY%>jl&C^vDJY&b+UF9!#U6 z8W)O7NiW!igV%Nm4~Xv@`b4oLuDz@4vE;#2VQKS$v4=*{tLK_(q+AC=Y!OGU+3k^$ zeXKre_T6LWa1M2wPv5`ik9U8FR#fcRIaZ6}ex}HNf0<HpuJtftSr98#&+c6+A72s~ zQJUg+)K52$O9y<TW4+<1$9ZFDNQ>aus<v`!sO#w8q>EIcL@w=I7hyz4VCI|r4nuF1 zep~JgAN?7Uk!k(%@*(~2!XY`Z@elTpPjn9yzojwB1bBE$CHD&Y*9#>E3TYO+Ptpam zzVu)$RaB?a{kh+U;^0;6iHMj2cOTD&?9Lz1oYhFm8UlafPf)cCRd7T53IUHpSx8Wb zjNb{Fsxe6kRfv>@TH6o!em|t80kS$>Ds#4kA4~ee;HGB@P*eGn7p#CR3p__P%FfJ- zCq3o?+~K;X1ylNAfE_?PH$hGhL=R<8PcY+YJn|eB9csBxWO6t5PeEtf+t7a7`=FBB zvxjAHu7|O-94b@OtOmD7ibb7TkB-_(@w3MlKkW`>{q}e<ORoTNZ&(53$kms`z4(qG zC9Xf7^*&I)HE<P2IX_b`owZ2L+LG0?{HdLyjREBEvwG@+3k<r%_+>P;G|G&bBtE$p z#_GyN2a&z}lY)l$QTtFK<GRqyFJ}FYIu1d`B{X4dq`klOf3rQK>Wq4TysWI<mX#2= z%#nW96s@8C7XFHts{O`RI;`jj3k-VXMKp2aaIz27QQtZEQ+)TJ_}1fvTVL=pk9d|l zI9Q<q;n!9DO@)jqT4*0o^ThRNH=Xt_olQ)vS!s36q-0xt_Df;eWHSg~Sg^`ov!S1) zK^buHP`AG%TqAJr8fr)Zv-A;cVMp1ECWkGV7@?kKu`p`(EuBhWg>E~F(eG5ySAh~A z2)P_Mq*RqY_(?DfGtNp>+11<!ZI!ChMF?4Y^rTNU6)ShOZ|7EwbTOxK^QyAbwGZwS zZTImrfUw_buYa=ZVG94;DIo_Eq`FFmU2jzPr21(3x^p0hg9CO(@w%7eHueuQwaNir z?+8J3|M)V{<+US@(5eSK@v4)QmfJ01+211rH)<)d?$}dMNfnpn@*^~&`A^W{sB&wQ z`)Nuj1S>!}XX2vY*}j<zc62ng@7iUg$~~N~Gb;Q_jgoJ;#ZMPy4C9PE&cjT$if0`I z)Gb*#gj#Wf?6)n2?CC4N#Iw4<zVHD-PkD?;D3-|5>u_U!OZFG%tDS{Wlcd=b-^H?w zO}r|&&A5|tSy6B)BUe1@{slkNT;ut13XdpEM^VmItwNVw1OHvHX=lI$g7e?)AFstX zHH(bGp3<tuVeKam;<(y-x|D5;T$+wMk}?AP@HxOVy6}ag+~5uT*+Ot>>&4k0I^r$j zGpX$NctWIru#@3)2KN+h^O$zyy}3;7_@;?Zf2Ju_K1r0&lIEBP2#06Hl%iD=)u3_h zS8c2Et*O$ps~|H61E+_r7n>Jp5SbY>6A379;#VdIk6zs<L(bmK?^8$Hd%)J?-89Ht zAYRf1zC(TJ%emjtV<(x%+7->{$7?*-M36Dc4`_ZvPsfaBtn<_2``txj=C{%4f}2Yl z=^(ov>)SEqVfqSIz;Yl<!o|+J-eTc*7<}tc#pFv*&2v&<Jk7zA-D6VK$N*@&e_&5v z7o@e-Zc-$+a${in8rD?~*+_c1jqPTA&B!)p{^I;o>c@GBM(u-PA@OpH^_){kYtS}M z-_Nb-71gk`H&&&+2{kz!<e+*cyD#v~capi)oM!Pj-CzC!JFgIa*RBU{DO34{2q5T- zO|)E6o(C)re#6_}{t9r+@?;%HN$HX@{b0yn%Q9Qa=$Ve{F-!TIG)@E3qmXCOq1FNK z@xkBb{8l$^!Iv6Q`%CuEm;6eGDDg5)dpNs{0J+jjrY3Qt$NX=)DJtlU5(5sfTc-zt zsxOBc9Ej$Z=Mq4eo1b-^KR-R_-!rawvGcjN4Tx*O`(8SYPw(C3Zh7_7xYE((4Y#?! z@w^FPYlhM>saN~D*2|q8%P>QE5wOA>MO{t^9Y0@+_qmDh{@%~f#+5^v<9JgHbIHi= z!XmSS2bE7#lg<9M69ee2TD<?+&+}V^0u&Un-V9C(rw5-*6?QGajRKUYI3O~QhdN2U zuYh~4;9ME#IUX)QjO$LHke-qlB2ru<uJH4xY^`vb(?5S!LG#Do&240wwj`1UsBxZF z_$Qrv)by(fN{@J)8umxq8bK~1Y&3Vy7p?>p%A+H6?7z3=Vd5Wuzy3PD!C`~p#H;%& z-&iGffM25!KmQEi{}$KtyNew9FriI70v!=(#($b*|EE=VS87fooips>njLPwDfY5< zDP??P^a22%a7IQlGq)8z<<g=R0rZUXu!65JnZ&WAKVOtVB)KM%bCp{@@OgvK=Nfi* z+uf^9wl_~*Xdg(j4zZ9*qS{+8?20c|KkUw(87W}pNjJO{mRPUmT*huqv)-0%HovD_ zvG&1_QIfWenvFHCgADmppH+v|x(dn|bmUtp`IOrhujw*Uo}d3P{mIMMKg<PXU0qBC zZh%ZhY#UeW`@QjLvmqDM#;Q$kQd2n>@Saa3jAv~*k~VL-4CsB0W{gn7*9L5;W4h=W zjYc^<8(LaU+s<cqEPs}dn?DfZJ#wzyr8;Qf*y-q*>rH9dIK>&(bHc3m&0*{vyVr)} zyXFe(yvGn$i-!l{_j@TsLahrDIQo~yi*C8_3Ug+gN2uC^F4#zaqw^d>hFmQuSoWIY zR2Hawi!uT)x7!kYwLCOB2U8${-bdtZt}lVyR(CQqG5J>Iaq$%|*F~B|sv+z?<A`+e z`n{ei^LzbPkBz*M9UV-kru;{F!}&qnKK+Xs4hk;9dAFm_DSwt<9{XDDwvL3Kr>K;p z37_gFIBoAfsvdzNE?&*5|ILNIMajsL^EJAJ#|cH<=dw|?e=4gldQNII>EB>X$6z9J zkt+%P-r|SXW-^i#C>dJH&IssHRUUHl^mp`_`FTLaZT+ZPq0>P34ucHKI3(!LY2rov zJ0)0Wcmi&&*K*P!+Ti9L0C&VUy%pg*8Vqx-^0GX~=jV_yVE!VTztR)ME`1GuMXCj8 zVeZRvZHqhVFeY!0ms;fypagYW87AK7FsQmEJ^zgb<iQC$?Qy!;*{&J1&3-0ev7a9g z^_)mU>wn{j%ViY=EYgE}BSv@*5Z5re9+~3syoOJFE6I-)KRwZW)2ey7Qtqe7@PN_( z-ZeCjqQ9xq{Pbb#(FLZ*p6NW*Wy)uxc7CSWMFJVVTzL3}dGI41-`cFpu_x`~d-$gr z-I8a3E=jpd>Uy=D{rB%*>fs8Dc?}aFy7T^0^2=U))LH9&rOS^`)+zI6K6I&;Pd7ZI z`qB4@ikemSxCi(hrE{s1R~obT@b?bav1_kBPk?%VKwc7uZsFBop-%Uxi{2U`kHB|> z8``xpijUDvN_*asoZ&lWlZVslPm<WwtZwK*L4y%Yi$~ao#s1&}e%vq^_K5MB;{;s3 z!(T>RX{p5;`fF2|ocih)b}g09Zd@Q5X2uS6XA_^$K&qXsK&Quo136Yav(>Xq&ptk- zeevZUU5v>sM#gzMbcQ*9L{vi9Aqy{WV&2q7is4dohUz>viUozsw>ldx|F$*{?tYt- zb7P-@@WbgE_NCN;&|T~U6U-Gb_dTX}6g|3ra^p~h+XDw!T<}8=ZLXu2H*#G3=^iF} zm<IyBX~MTDFL8&&^lN)r86sN+ElK5z-@6WnwAgICvgz7QApnm229N@(sVY<>WKEyF zcZMjo%0Uk<mP>boaDUV;%URch8rDZ$n1HPF6FNbgL`aDJWld*$*Iw^E>?A3#l$BlO zir77M%jMz?=6X;_m9TLNceKye=)>8*ymX<c2sJ4{0H7oVUsRjBy=L&C<<T>JHkBJ> zxgYj>nHZ=G#Rtu=ChM|AjuIR(l8=Dh(am1Zrx=%TLQ&DYpeH>i+vgpRewJI65;O1w zGA4)qf)B5I6vJ}&*^<MLI8RC$a}%gbp%JHt%w}BCQ5Fbr)yka!2;pZ6c^CD9725;R zHA~`9R_A6<f2}PwiFq~#UyLp_S5uR|jHDYw#M;c8A1bu;Z8wo&tF5{$g*jGa^FZE? z>llTu_J-BVKU-TmZUWA>u!=)&k;H0n9D>a~BNjk}4$^E@M#pozfvit-c~U>?FbruU zEgGR4Y018?bsc}dz9W{SD`(#1d}1{`vkD4Sk^QrEaIy*-4&vU!y;XWHC@@<pCqet* z0RtUJV)&?^pu9_XGypf_(JF%*Fovi-m(73bef%|Khi<g=!s;jJ%xVBAz21JgvHxha zbbqLoFN$S;B<ymqHH@Y)Gf<B;(rzp!lco~EMa=Xymv&rXN^Qy+e$G|Ih=zkuN{gD! zI$$2UE{`za3^Hc|ybqftAu`7Ye{Q*-JWT(LZmQ_&5~TBzQa$^4u%OOH8fTd9OgOkU zjO$|7a$wI{);Z~sjYF^=EEO~0zF(fuWdt7Kl3Xa3Iy%D*9c&|2Xz7whFLCGmYoq93 zbZfwGrhzueS`PKkA3xI2J##ShUTyp_ot_2u{XG<xyOX_3ibkMY8qUY;AZx9|J8-0> z%Rop=U)|~Uz%+Bv(by^k+X!3AXq|CXja&>{JYLpu!R%cAKA8PBcd={$za$<f<(mJS z(utJl#V#az3L6v{gx|uF#WfMnBmJQz{Wp;R=>A=^%{@Pej91WJ4+EW`&qsF^Vxad> zyVtc{$c~SjIbYDPJenxaw;Iw~lGU2Bpu?_1@WYT(pUCb=>aPzQPwhIJ!<gwfhNCb+ zSdYU$4Cg*)50eEldA%n&m*i|_<^!RJbeATl(95)QtAz{`svx~x*s9;|-Q&DfKkeTZ zb0AJjkY4w9j_(S&_g-S+k4Lb7F}N<Sy`#rXveS91<?v!0gb8|cIl47F+t1)+w8MgY zbuaI^w4}4&Y4hnJR@Cdr8{$)@z#6}8Sh`s*m9YEDZ-));85_^hCmqnXgS&Nz_e%*3 zaLCtuz!AIaO=|OuVI+-T_VQqkU#21*L%Lv1Rs&PK_>*rfrE0vKE8b?p9C-BmViw<W zakN)kn|PBOdQ|S_^ENf&hEz+#?&kNObr#d9X4SC?gR`gP39cW}!bBv1QxXsr?oiyH znd1W#rEGv-mv=79N3;PBQ1^zW)Y&Xk=KR<B$nQ4E`Lo^gZ(ar~0|xNhmT)rHPoL0q zHdR1p|LsYRd6}cLpTunWJ^hNY&avEq(EdKRBZe%liXI@CI39G&=4r&xZzqlLb6;b> z*V&_fib!QXTljMhZ1ILz;WVP3C+5AmKJYZ)-nqhpw?*4<sP!X!@mScR_nemcqGcuD zVC%e;w|f(3`mu7Z>(!@LkgO+9-i2_hYWVBVGY}jGWc?tl2JO`OSAB2uGs^HIKs)1? zndd#S))$;qTfhOX3m6T>lo=P@2}WowM5Q#J#`1&w6YATGIXT$FKYLBn4CgX8S;FiJ z-~2jkQp`97?&stjTi!nxQ)NHNvXX+lq|az6JTZO_#1`+p@~e;SK1d*lF!Ch&_;#!| z&TkHy$*1ZvmD}FTjqmyv;nm6(+^BZwH{K)NC@7H`PpTKjtwkvGsQ=zBs8m7IvWLr! zG;|vcY#Iu2%yzNbJqrJUixtQ=L{F3Xc4~~@Lm%$P;8;~FI6;iKVmXU9tA|?;D#2{W z((GSa3VXl#YXsLv)aS*H(DL8&zD2e2<Rq-U9A}K3v612n%Q;o^x{nzp%f<#N?9B#~ zIlg=c)uy7`O3&v^{~@a3?GszgE)J!m3cNU^mpwVHy5w()WbWrUlj1vg$o06Qal1?Q z!gY;2c1=jHSCM4f@bfQ2)s&q|e9Or;hVlZ3X~g+uwa%;q!e~|G$glkne61vF;ZX!U z*(=q#TninMh3B5}!%qEn-<EE!mcP^zKtAyR)$9I%A&9Q=yL>yO2~MrUfcHPTX!e6J z1?~(qPLDT`vl7Uj*RhgF$*XAZE?Uu)2TgNaAXSf*@dcMLPv%n}oX1ObM|^vVq;H^W z&iRanA>5KlNSNq=_vn@bL*LHd1>Tp1-yxBTfLo@2V5X*{d%)lx`D8vODDIZLI&O>Q z&-oBD@#k`f`Lg?bpCf3OBj_YA=)~%9oJW9*naG|Uu-)(S8y=y~CjxH5_7xJ6w;;>= zelWFmDdNS6B$bDBFhu&RfDl$*;^R$q&aXCrziAx_Ng4kY*)PI?<ED4S2V%F!gqBG= zi2uF6r=mmrQxbz9{x*FIAdXlk2P2Y*??Z%ckdXW)0~0C69}k9UNJu{Lz`2MoGWZ|6 z!SfxsmrgZK2NMyl&dtN);NZ{`)N{CWf7konAC8aw!2Y3ek<@%Ox?3*3j=<~zJLMm1 z3XhyTQAk`mOauH*mB=)1z8}^tc!Ndts_&mv6*=l@R|vfZT&TBje2eMo85=aCNPBWQ z)8GIZcP&<<Z2~h_e2SiQDs)9i1MgR1cQ*W)u19KWd-ZHid2ZcF?3Gi$O7hA&GzP)? zoQJzmph}!oK|Yo^&iOUH66Oh(qyw{44Tm^R>y0Z?Ub{P(sns;Njs1nLgzS6Fg{K=% zgh$J5e|xvHrbDydlrOKX!l};Z++RI*ciZ?iaZ4Z5mi%3B_b!xI?fj!!uR_x@kE&yG z%~nIJ=|(`vZp_uwY1v~#WaYO*f+sUt|E9}S>45wianw#^ibuC(F`~b}*oj9m^q|BF zDG8!6J}Q4gJTD6JaUp;vfPZvDo?7TOm%Q2+9FDCA|56NM#;~}^vlNtAxKDP;?&{Sx zI8r<c@Qq!87p0Krr1@4~8fnzm9Q+ztkDkT8C@prL#MZgm1#>nx*;%`}T7}N_)HM6n zb8G#gW?QMbqgevmjBl%Obzjm@jBCgEzKtmxJ$^Sk#?&g+Tvp@cDmKgbok>bB?l;!! zGeBcb$dfO1AlslX`}3JQ524k-uTsTA@m%=UahEZ$B>uDSFfxV4$P`^Yw6WNgQa&j3 z0KBVt2T-~t#u@4paN*`xr+Jm+1H-rw?=W__qC##_@ZVPUl$ZHsy;qvLoq!HdQ_{<9 zq<>6kUT(}ifkVqem>wYFTVCUkA&#wQD?~n=WS=(W3+<>{oTQDpYYlCyu&NQS;m5Lu z&!n^6GW!J<G<i%=S{+lVR->U|-Sl+Zs&Nk}OO2kso$~$aur7<PjUJ^-%&a3dfHeCn z_z~jb8hXMUHjGiM7*k9Zy~AJ|&R6TrZtzfml;|Og>4*e9y<Rwc@aT?QZ%kZPBSxX8 zi^HkJ%)TbUbVt}zwEM86x<w8jBKey;<BfzhtHrDS)Hf0BXYo3fOWb&Y=n+=(&z7;c z1$I<``bS+p6~{-lvA-lmVFI7!!YVeY0-%`snPgrY+GyR?MTklIlvIoSh2pG40$*4a zS7snS&3q*ZCFRb7N%J~IaMjW;La`P2hE$X^&cIex{iaG>W8}4v^ig7%xV`{G2n!1f zcv`;mzxmWgrDt%KG|;z;*M8h4Ln2+FE3C=4PY$#l8orFX`q9A02165eZB-4JX!v}D zGDTH&`dxiIAN{e>D+}yBM&p`tG9X_#`RQ5$lkm{@ZabQ2U5-%aJ-AJh*IIa|eSECQ z%am;d5>-?FLQqiB&%tvVmyM!7@hk|=!&(h|w`=&+n%{Hs`L_=-vM?PAEjNiI*!$i6 zss7>wC7_>!aM8SJzHGC<=pj;cVCz@$(Xkv<s6D8s*nN}f8GuI`%)w^~(5aCS_ekO3 z!sg-2Bud7<z`5M1E5kBZ0jhS|!2Usq>6Vo+cX|_!TUBR#rT$mIFk#2GFQrklZM0I_ zY*xnZQN^cKV%U3UiizLYLk!1}6F}eViaLdZ@eY^;R?10^6fDQ>$;yuz{+8i^EF%)L zhy;bco1aRvT+DDMc*43g#MfZp-8DQxDSywk!HJ2_Af^hMbf;*jr`wTlhTWF>CzxAr zeSml9iZeqoORTBe&wyKy7HM_w-$GGB5~|n_VHaJx?gHTG3=LUo4GHm4t<3kWM=F^r z7*+*uJrR;0>QN3bH-A8>f~*FuEuTG3VSO&aSPRnDu;CXY&EWm(^Dpw7zST7wRmqV` zm8ZFi&%wRa+<OCjw_3=0Y#tYqlR6$qFy~AYb_Z&jZ7S+pt2NTzwy1ITv9By$zX*w} z<zN*UzZH&cUDBdCzyN(4yclhtom)PWFg{ersN_)RR`(5GdWb_xgkxR-2KP(r)#I`y z*(;-1uH|GrrPw5PeCk{QI?h2Zus5zD6trE0Fa@Q=ZM|wM{SyIAeiVyM@OKVPZYg1@ zW_uPozq~ekV^BK1WNyNBj_@QE=)8nfqpg=1*T&ewX!<(MAtv-^$mF_zq%&T-b5t)U zD!V8}RC#Jw3Mip8(ax$?Qr}czlXck_?=gTaduXuQIZ(aC=9^UJUtd!aWIt*RX-JKC zva_<eFir}@3%7lfu#zk1%(?hQn2Mei%0C>Cf4!00^WcQvtmiZR-Myqo0<lEkvmnlY z&Z3!an4H})72ino=X4+u1)A&@1AH@h@3RR0VkaT-mSNO{?WTW3$N1DJeC@lPLPW=7 zk9U9ZaeMgxE6Dtx2W9>jHu?b&^v>hg+lxTCPY2#W11DP9qn);24<k5{OMTsMD-V#7 z5h?Pxb&OQz5B8^dJB|>u18P~aKIm!;5Z<;64_eO<RMC-Dv@}oVGdXWZ-*Gix&GxY> zlcR0Gz7Nwjw&mJbCbL*W$aD0Hc|xaJ3{T)wmeGoE>1G9|RDOxI1jR%%(HDQMAnjl) z49b-qa}_v{<0V|NeTx82tNn)m>gz4mB@N$u4BQVs4ENc6yb$K`b(}d`$MyYdD7yv4 z(<Ktdv}XVvu(9iOZrCy}c`{q5jf0Qxk%o`uXUs+z72Sc;8+E(%Gnb(3zD0wTE+AdF zyeMPIHr+hOqUxoobRbMk5dB<ILnm#tL)=F(q#g+@2(^$lHaMg{_#jigcTmm<prpjs zg?go9kQbcIzH(q+;si8_6L<>kd@Q$iMM6S339;K$V^oQ130(9yak5b~0$8DvKMw5) z7YxP$yDB|&DU>H7@YKZpDq)fYDE0sZqtnz+I7Z96nUIC2WPYzQ&i4*fe7z03q^tH! zHTRX*N2%2?^6fU<6nwkz5T?u=cU>?y3TKp+pCH4CA~TEEoe&Xlcrp1{WO1PyliP#q z8D2X@(2mt$tDoCUo3{*^rT2=V+Hi4(BR)<8Wlp&+RNq%5+-}H)Ap+YgnQHJ45qu+g zYO{?P<&Nr&^XwI1E{2gDl*g>D=SPFxzlI?&k`0@+S^K4*-g>r1qwA1zEAI}wBt3Mr zszq$l1mTMAvAUz*2ZduBOZgu;(b!DZi3_(b-)T9jI55)j^>VZ5R{+KbZ%U3CrSt9L zs4SqZvV=@W9zh)*cFE-zrTr8_t3EDlH_~u%1@{?*Cp|vAtcYS;>-{D2z>m@WgrX27 zxs}~MLoF}3RQE<?aX2cyKx6*B9GVs+eP8*fgzQf<8;7K=%rc<dt1daTNzIqD31e$! zbvPjKkLHo`hDDwHy^DLH4k-MKZ+>rAXY(4`-WduTGiGr(9hJ!Fm$JaYM`qTF*QN)m zTOOC^X?S(9RJ#r|Mm%ZsOBOhwLtQPEy&ptk#1H8EQ+76jF=^9OY^QC*QAvRNo_=P^ ze9v(cWEAMyU-42m_wB)D8KV|VP3<&_Z(~%#XN?_ZI$do&pNx0l?C%*Dy<0lrRLKjb zLjSDP@WQIAk*RM;l(<N2Rq`U^0wCp@hq^QyyXxE?$=q%tUj_Fc_?l^&Te$8G#?8JA z;trNkoJmrb57JYz_42i?QDU<xh7OHx>m6?kN;r%6VWdZWrXD-FditcFn%)shv7z4* zbsAZTD)~Z{R+69XFf2Fgh$hhaRsAGOI9|OIAK(cu*3ZKj)R;Gby>5W~Cr>uP&IN@< zaJUL+-pi(AW#&=I%*Oj8Kp;+F<iy*+9pI{}*j7&u#YoM?uVhSYi_?H3H?2tPD#`$g zue!XHQUqp0g%xvtliMUS);dO4mq#0$xhl3D*E8n1!X<j<GcqeXOwcVkw<Tq-nAx}x zPfX$a=O58G(raTM?UK)1!pqBCc1eSN$!b%!J^r*ED&}tz80tH7O#;s)1!<{is>*~T zwx(`YUsA3t?uYXNj3BZ4QAWsPC~jbzI)#I=ab$)o>a<=^4-?<!mTQXJ3g+*Ac1BVG zf?W-zzQ{{=;%2FS2u}K-YV|izgh;<UDhU7Rxe<|!ID<n4<M(V$UL9;|jhL2CaHK$+ zO>CBvybc0+2&L;s>j=_Ne7IMcnOweoiR9z)b=F@oD4Wj`!91kMUgbC57Eoh6zwOz3 zvTJBtpXKdn%=?n=)5l-n@cD-^h;Jf>He30l^%GbIxe12gD-Q!GV4PZNZJ!g2*EFaV zXO>F2z0*e%tZY}^AP6yQOL;fW&4<sTLVRp2Qpm=lhui}vH%+nqd(zp+7JK${bxKAq z%tz(>VxEyDO7BE7i<^U~z*J{)=;>e)8brreD~tK1LhdutOBLxm($}Ad8a}MyZ5{Mw zLTa@R4&2J9idsCqcw4dA2r4xkjt`(~5cE3TKT#OYhP#b8zBF+ZwbzA57Fdp0GRT(P zS(o27d`OpkJBhvZ_n#Mm>yro;xrkfSY<06S*Jv(S{kfw#0Z<dW{NL7by5@5;4f>_A zx7~aV(i-_VmM`758rB54-Whi^?3s)#U>&u4UPH2agiZvXRq~`r>KB4B?_9MOqX_)Z zvy?-M2LcLrq1M9Y^VyF(>ru1SH+ota#Qe-y07YVeYit4_pD`in?zf8db_U3;z_iku zGCEL=%q?I%>(0{S<vMdl0?KiaJ*fJr%?O7rRv<hkEGkC6@1@d1^2NVl#Bp3E-HuM% zy}Z;mi#5vz<~EbB_l2uz^>@zg?+rgnDymU#Z&(0VO}Y-i-TeL$_q%?z^njcus4rrD zAI^}SKBbsW1Wou-%&euy4BVoV`9aCP(Q-=Q_J=9Wu;qfMESQjSx0e;KnK;l*@fW3h zK_y5b1K&>5>GsJeJSHb58vNd3ezN;TI`_*vu5D3`IImp^_qUW%RfZy@z>~R*Nj~tn z`Z(x_IpmFCzbcj6{g-0>IZ;z11dUeKYN?~&FIRRl8wW*mrdGFVI)2)km5A_~jLSGd zjxZk5+ji-HH;*iHa1GW_T5M=~kZ`e^Ie+&?eZb9L@1H^Sk@1LA%CP_mXAt4?dq^WO zCX0J#cT;voic&mt+#P?cZHw3D;afAy(QgPqD=KzBU3vH{@~`zJlO05tn?-gWHWn~> z(_GQ1#Vf`*|Mgnf=jP~;)Y{Fv$A^{<FBc3aL|>j#`~LOYV3RQaukus7<i)F6k7lWd zkAMHVb@bDJ##~w(<{Mqgiu4>P4?r4fd3!l+SgL+<9(?zhGlAB8q6}RFuXD*4IK2mc zzWEPp+dLns)KrAiQr4)yY0SFywKMSVe#Il?Y=$}jc}^{6h1;@gKppg5zP9@8-yoie zZ|$!k_rn$StkU&oF5|KMCIMjBboD}z?Wa!T)fT;wr|RI8yvNYH>mT@bs2`O~)7S1& zBqE9!b#y`HVg{%Fr2&+X9h)upZ3QHca)784%iq1xRf?Z^;hak=4Y`d04(N;(dd?+r zC=j=(H2HofOE1naTZDg&1rP#yzlwz^s~q~d1$<-GHxt%D&C**a^%kxE_-kOzL`O~9 zCq}#LtucEda`G3=h9;3hv<H9-#Ni7fLakf8=eZ@;-dA%*`DJ8JB??EnC3ULW7-S&N z5I(}w+2dYD9d-uI7?!Y_XIkF`2~#9>x5w??$E*xuBNz^_&^cKd>w~Ai3|UNJXA?o| zMtOg|bcSs$cJNvi$4uA`E2ADP{CK^BypSTv#s^+lpIrqngJ&Ns#9>aUOS-qryxydU z`aat4X!tY?TjX6<%>uf-;BUD#6H=ApX&YO?Ybs?Pp9D=d8<fC;-W2qfeovc*GA6Ly zIBA$#(3LSsJ2hD5iP4^$Fig%!fhOd+G*sY(KwRV(jG)}cx<6H=6t()aH1WEr4HfGX zvH+u7Jn?p(a}`=9)Xh=35@vzm#muKiY?(y?UZTpy^K146e0+SRvXaePL9btb{tG{e zNIq$BEga$LJ-I&9V7lyM@s+juJTcgqc_W`^>;YZk;lN1-SD28}LHXA>hP=lk+Chp4 z-+3#Vnd^YW(fYTw3?-=re9yTHH&TSfYn2`3oIl-|wxjv8%8^-Ev{k_re;ZoHL1?mZ z>TacTh=}d{-@Je2-e=kN=T66;k*l$f_Q|pSaHxpC0duWEBy{yHM_gmr(jwF=oP~Tu z;3VmVPe)8xHs`c=4&LS+(e)pZpAubv7$}X>Rj}WA+jt!!c|=0`EA1ga!NGU-sCQ;+ zuDo6t8s#R=IJUK)i!I08NI%uehJVsYvK#Z7;U5s;16J9EUXanhXQiki2gJ_3cwsZ) zTBnjzlg8WTpJBc}$Et#q5v{byN{zR1FHu*{h_Kj@dZowo>kI=eWN*YQvk3E<N}D~x zDI36yJe@6FF$?d%kFTugJB~E1b{KtoY3K_zo|bx1zMih#Xyf1+NVvYZd~yF|(|O?3 z5<+CIWF#lz@MfWk6IIH@M9%)BOgv6DqfXfC%ke68TvbISHDL}8K-K&iQ^;Etz8c%r zEkj#h;$Yd|B(19{`cvY8Um9i0n{c7y;-poP=M=rp#>rwP&}Eae5S~psR~pAX>IuC> zuSp8BC{L=hUum_DcaO`f9$GxVFLL}@_75{M)PnMLoqXR|qDxZQzLZ*y%+IuM{=;83 z)~yb>x0l2x!j|R=efu_N*7*<S?u_4kl(sTNb{P<8%gpjEWNWyJV*wa2f&4nN@Y*Yj z*iWGH_+b4<Gm`FDxcOdsw%3S#t2ugCv<|4d#^o0Sc;a8a!a;N*$4_)~_swDH%qo~1 zHdQWJBM=geMq$?Nr%FmB`^Fup=z}s3MilDwl_swLqH_pjiDdi5?tMjCFbT1GYnbp3 z8SZPVF9LClhgLZA11W@-8HZeg?w2Io7x}o|0n4~;6;?)S{tDffi#`7MKTNHfBZMBX zC8W~RJ9-5P@a~<;XZ97~apLLjD%IuQOs989w%xpu!@7RHVN+tDB~6{q!<m08%fdNM zE%cN}?f$)DBNo3i=|e&ZwxX#Fpt*`Sn!V0*rm%-%>FgAId)+Yzja&Fi&b_0A;~h-M z!XSWH1bYdAr)K@Urq2~y?yFh9HaRXR_~Vr1<Wsfit)~jM(Q_XUDdA4wtcz3rB4pz$ z5pa{lTl_Hqh7)M<^+n%wdO)-9A^`}_{mF%*wkHJWkULD%hGG<rL{~#i7^e9(pSu`w z^)?90j(mT*M+1GguH5}=?2pG3<c<#Ax=t>x>lqx$i7a!n9(!9M?%3Jkkf#ov{l-D- zX`UkJXo3ybaA&N)@{(N@0|9}ArZ{_v45ob`sy<2MpOuA!?JXNYzS%WoFU`<5RQS!B zG=~83bj2FZMyuE<vDK{)|EdPQTX|^LY%Md)E+bnsZ|;jb@@%$!o3Z0p^gaI}goHXz zznDy4O)rep5k+oA<ig=^AVX`GOw#MV0ar8lsJ*UUAu*>_&Oj(FdJXCa_J(max(C3Y z0`Ax4oK`p|uRR~a?(PHV=(hM)Peup6Xq%~mQOgf*RS(7jK$9Vsu80=7QdAGmb7v;w z3dt3qO<n1cBba;Ki+2*Ta{5TkU8T8=$7|YA9oCLX^=!z?HcSF(XQ6a`xFI?#8G>&P zMq_J?(=<VozF5TMvO2qwZ5MBfl~YlUzJck``#|R|@MEMV%c)vnXVJ)6k1nZnXZwn3 z7oRXhZPDDl5Qcc1$g}J=|B$1Rz{VDm>&ZASnszWrd&u`Oz}6|m^C<RYvje?WxBLQl zsJjYwuj&|G_IY&Jw3W*RN{o+7PSdnbNKda8t5xEGvKCQy=hKt??l^dk-~w_23f413 z#nV<27|xw+jO^#_9q|>K7hK3k)!LQ3J?Vut4bC&K0U|uXh1#R05V4X`)wNlpVO=fv z4$BNj&4VwwMQ6hl!a>|=%oC5PK}M4Ho_t;>=H{p-2kz1)N3RmX%JIRlE=X8M-ELUX zvZcXw#<|rzL*-GNZZwS7HeyRDDja9sk>4Q_n2Pg%o8#|^xlXSS<rsY!VCxd%^mk#; zIGf5;ix24pgIsRo;!@(zepz`vKcsC?uK+x$q$2r1H#L+8UQ09Q2Wxu~O=AOPn`g6Q zS*`Tg--vGMuvn|mOk5k{WAw8A^ZdF>)}jJpD1$!PY;vaD7?7eA5%I`H_qGv6HwM$V zKI19Qb(!QauINGrWikIWQ&~9T)j9y-hsA1mI9XE%pvQC!;|2u);?5)7SW5tgVoxPO zfs_BygmL3wpvA0^X~~l6{<Y~AAu@a2BFR=o-gK|h`rwnkF*4NlGlGxHySSpx4U_mb zF-U!5&67#L4KZsb1#vs)sUpF=isoCNoUSGdUn6N6jAjQsYbE1~(KQpa_b^s+7<nC` z=yo5JHRkKq3^w*~O)(ZrQ%n3nzqRKzz3{e@&mbkS*de1vk|hs}GYZB?P2~dsXo9*n zN?xZOoyI&(cWzM=1dDET*NhvHSe<CmE#j1Ftnn;oeJ%P<h$3E%oZoT6&O}?P);)N* zs>~(0NL)JTS)&VVxVY@DtX#%5<-Gqr#T{H004B~?FHI!B)7)+Dg?U~Lb|6L+3q}A; zhU&zbV;MefcS~JIYxH|C42;M?=P-|hYEFiQ8m+>nnljxvFms3LCYfK{6<Z8;j>_`5 zfLZ|^3#MCp=R>yzlW9hu5z8@PiA!mFL7}aEy<}UO^jZ8E{prCQyUPOCItBK`_;24u zLN!4%Wxxy#!VEkr9uav_S^G=k>~;W!eB!VOP@J7%<h5CxgI^*eVxxNQWH#6`<rT?? zq|VCkh^t%3tgN}j1~oI+u#)VZzNovs^>YRfn+&bhbppqd6?<#m?|5sOYub9f-hc-= z!DhskGZRmE1bPILcADSBPB(65intJj)+0P`<O+A0^g<P${-k}CKI(%~asm)U64yPB zbEAT9UT#>~7^RVWHU8;EuK&ueXlOBly8Bgi9;Rk<9v{Kevb(QVM`{ZHUunzX4TYak zH{o2B=%V5>3R&%p<|D4<sHlYFdT}G469mtO=3at;;;W?V$&8{~(H$+jchC;80+rBF z>vEL9$4D44wmG6LVQLi&1LkR<*&1y=IvYWH+tO4%VBWYi@ib1*QjcyT?nqK3p|E9J zj`S<11nomUH?#3}n2%q+Db0~IFkbil`feYQrNzRFI+w!^He>R@^7+;M*Qg8G8J69q zcuflTaya~h<em*L)taYImx*yUf^8NY0knGoluM(;GFm^Vd{rr5PV}7zOqplx^hbKY zBu1zX?fB0n&3-=4<1hetaU?@fE5AlDxvzoCYH^zVI(;0?khB&!rRcvegxLO+0{uUC zL`PAHh~A<TT>7Fox-(@?S|{xa$%n4PxLmA^3kktPdU>F`V&kSQmeRz1s+L2uVSex^ zmXm6)*JIMYDM^~-Rlc1VAQ#->l*FD`Lrjn?g!zDXs}phs=WqUTm0Bi=*hG3M!F+5d zEnw?Kd;>i^+<kz6C8cZg%EY;SCwk~%z_?#aQ>N9xLPd$W^t7>#mX`kbl;7-IccYa7 znxna~)pDs(l4&$%Gm^6&+*$6fdU@pZx4k<-bQFR46uudbiXQiY5{az{v*SL>Dc$9L zKJnB-X`l4NCCoorL|%$KXoVC1{2Fm;L0L)vk>%^~b~o12wwUfN`f2Sx5g9SAnZ(}c zFi|-9-vjr^^P!P%&s~PLrvDAM)4QH|J(sg<GA!hkmaH$ct%$ozQGqwiTb-pnoLrJ` zmCVG5F7x3f>Ao<_sNY%>@;tVGALI{y)1p?O<k<4f@&Wrl5gub!k+LE&g9klq5&s7i z2V8?`BwAER^Pj!GPU2m|7y$cnT=iZROWf*XHP1nT_|l?!OIIh##FP2Tae>KPelD)( z#T#`k*eYTziVG+U`zCOi`mv%kx@vUY<D_>?U9_JM^r5HPO#LA3xaG@ms(%1xJA77T zI*xs3Olrs|8xtGK&o^Z@uwR&VH@6{fI1$A|VV~7@4$hG)7t;Y{jV~`fpcSR$on+k0 z6F9@$qlU|Gr%h5Lr;sHTad9jG0n-T&QrsQthWEG@HdD@KZ2rNhx#(qNYi&<{L62R5 zcs)8Pl)^(wwN!%*3j2gSMeWjXNY1h4B;7RuJ;(l?|3m|tzpcGOl1@!@$XzIK;LV7s zgYkBVUi_Q{P^+?-5SnzOMN;Y<=|q9gHGQI|nm{Tbmvyf}_PJv@2GT)!v?dhS--2Fa zw<gkHGwLNjU~GCh`t~(!lhmQ>4X(o)g6GJLE4sqtjL{CBR1KtK(LOTu&;9LwSrsR4 zPQS3orIo<QAz0o*TMGsu+ja~W<{KXwZ#QEaK`<t`xW%6kfPHi8cOUAj#O8@R0sP1} zk0=+c{1%6hD#xACDhAywc!OY=*_n%l+Zy){3}+M+lkeT1!~xNB|3b$gTFBe}PiHN{ z_SHOHr>epotk<1A>p=H-Fl*?@z7j{AVKD-b)1l}idl*%0MaZ+S^!)O&FIbN!o;5u+ z=ka*q@_o_cLLz@4<6lGZUR`Hwh1Do(yp}W673T(VdhND-*Pi6VYWolzD^n^L7f<2X z*!N8DC%;&>EPkq5I-l~~Lu4hvED@Gr@+Mw+$*yp(N74V(()ByZvq{_cFlB~nBsMuv zb^TgUxV_S8(`=2{L=kEfVY4xncb<{mJM|Kh{TUw_6nU#ypHnO2d)70-?LFmS(PIY+ zzBUQ}F^ZUvMYnRnuknwnhqq2OYP-R`!>N9Saybs`Ej5;|lLjX!`LS~n67<I$Rm^#} z`{^Cc(_hI_Y>Th;G||~@V6hZ@%k|1o{a1P(B$5WFWX(awZMR>b0}TGsCHsRvhjn#@ zS2As3P$|d<n-kR7c6rz4LqEH-V&*F2tOmD{O;g;!ojviQNWcXw7*$4*QGIP;rsP3y zv-kdZa-ds!g?Ta5=YswvU=n5(lUvoV6Ww#ubB&$kgWYUpGQzSYyUcx#7?L9Qt8^0+ z67*|5KxWkqMWT)2P2^*@vmX36ScQ7`puQPJVZWyY%xN(+cw_9|lq<!x#3Wz>+pQdU zu3Zxn(G{`lCQwOk%wa?udxbG#kiN8gRC`0T0ag$Zf!aW8x=8jf0&ppRh~;BQJHzz0 zk>nHI1kg*O>`#(gos8gF-GTJa`Y+5u`qRMAE84vb3_N@8?iITPfWcVW3Xe@6n=r`_ z_XT=@4(xezm6f-B$2(7Ad-9;SPeoa=bFNWTfvot6z0=;0_JSUz`cyB}*!tNT>3qMc zmiA91O3*>liv#?tPHHHfv0}uE2z@}w{|tQ|!+6Zgg8^^Fg0UI_!D`D2Nyfze$)Ab- z`0N+I*jr!hbP5nnGY0t|YkX#MRpZG?(gq{#F`}?UcnIqwJ@he!dL<*>H1`k^t43Fn z&bQyJK}zzwe)mou*Nc$;ya3TFBtLXM3I%BXt6_<J1(V@mQLz0?EZnwr|H?=Hv)sp5 zMM0I#PU&V!+eO#_6!FhOvJ!|<o|GphyECX{M0k6XfLYDSi_0o4VhfMvNdGkuP<N<H zws_m`HpzCjUkyfAf2tMh_UOco^=V4o?Lg&_w)dZn{<bc~?1|LpY12k?lESQzjj)T0 zWS>=a=t+6fUrmviF7aZlY;3=J+<5c4;o5U<hAFQZiT<N1&A*YI0Gs>+cbxvxb07tg z`Wz4wSW)&Lt3GTOR%k!)-89a5Ez~!znaUk_r$1(jGsP9F1k^*|o2P_NT96^tP7!UY zwUz!kjZ&lIF|vg;Z1U`Re~QKq5qrBQ3<n=X-RBG2|6357u4N#YoczaLmtX6=N=6** zcZ7xA7pF&8NS<Wp05O9=^23<5(5RISVf*qYjVbUS^>XMuNZ2twW9{P=Z2G#CQ*=#T zgB1Gw^~@ipCDP@o61LL;e~>&_v!w;>-Qk?#qzd(B=^6wj#3rYuCl_n^%mt4F6DM6! zD~1dk`J)dEgi<r6T^}hIK+jxc9g;VPlj3O-$2?8vJ*J46^el7juWoMe==Tugcj|}! zcOpzh-|Ysl7Nq3Gg$+=pMSH9-WX~>}woXmHDd6F9s&87zq?K5sl#d#@oAqD7uS8h` zvn|*r5Ji-beX|n*K-as9O@e(-iboZZ0L(!ekFeVz`|E$i_4z&Ax{L+$5|@36;U=`d zMN~T}0W{@WsvwUekiof;0<V=gY2<vCZ7SV!MbVH&U7dhY4Yj;b|E4>jS)uYnB$uC2 zhry^>^@+@uY3g*f8olq{A+68H1eF3M)yYI_AfaHRQ#GoeVCP=}Y1_lvMx?b|2;vD$ zF91fiN)Nq=`~Oy!SYun@3A;pb*4E8=j@qxw#ME$l$u&yS?LUP1io+GVx?8gu1I-(5 z+86xeB@xlk-$Du4n~)|*ATpWud{WQ8asD!SPEJ)0CA3_pRd|O&F5M6k7-1~6Wv+I! z=!}Y6nKyb;|L%F1RdHo>@t$Jj>X&Og_y4Wtn?vVwv6ruycMqr8VZS^XpOrVO12W1Q z!YT$d>cH1YJ_Hc+Fx(+GD_A6;n(`#uxyJ5fOoJ?{1bI3Y-eCj6^5+@2{b6E7TKzkw z*o!lYZ(MQEF|rSIeyzn6n^8PK$zZkkXE^@8*+;aRTJM)yMo|-;+}=g%nl1GX?asAN z!|}`1^TdV^?u#UOE&qw=4fwyHC0?{f$R>r}xAZr7W<#8KxMDD&+0ZI@M$z#}Z)JtM zK=bZ;siRI|Gmi2%0s1%6U*X>-^&WIr9(iBF=^e#3uw`r!<XM>Q+fKxcp8Z)%Kv9D| zBC%0WPUb}D1)x$gF~6T&0u(ufteG)0hRoU%W=anv4Pi>_U$RfaJL;zl)`}C85!nRj zUi`j&+TkAH+OS7yXpvwg$L0)Chv)sbqChEY_?0f~P$iiQNQk00md@gLJ3D*NW>Sl! z0x$`ldB<wWa*q#QSM>G%S2mka_)&M+pl@KSC%QN8YJi!OtNm}x=Zd0%8;!H?mvucY zw2aK=i+bv%jTZyMUuwhHMK#6qb1%X*&?#~%+M4~-0233h#SSXPA0(9D5%(LO{ulQ8 z=ON7ezu*c^x)QZ%ag=P4tVC2~b_sq*tgjc+uIq<NYCVMK(nV=v-iJtC5|#>ja31xX z|Extke%x-8R>8BWaf^BS*gAFLJhb%}cNH4#JbC^F0`Mc#B)+#>D)`(Umu9J23)eSZ znBMkD*z<Yr7->L=<-h1xoYD4<-e?klZ+xnLCbKqO>>aEE5{wuVq0}gXImV;FwT{ID z-_p0|X8}BtlI3#1FBpqSkr~(;p}BxFGxU$`7tephF}oK45KVSbjY&<)meFliV(e!c zCJgpaSGr*Y$P3Z)0;PA?-sjPf{AT+gB<;A68hs;$NPPBDjM#e5yAq2ObI1QNo#_9( z=;i;M)>SzL@kkNxQoS1bIr}d=N`k)oPt`2i9u_VD7p|#7wT@|?`;Fy}kNPCzy4bR{ zO*%(|Fau}ie&-fbJ(ZSWdH&&57yATMYj64q|JG6|W~0~pmypk%ANJW&?EI?6rQg_K zO4tqYv)^OMHi1x2SB|VrW9@kZBkER+=9#>&U#sCdULzdd8}GFY!Vbg~gp&p6h18(N z+=(KlSm_jSLHy&(+=EVzM*)?rd!Gvy9k$w)3s|`(+kxUw(GD@zBfY%<dT1-4lq(Yz zK}K~mFe4z)JY9#s9}LZ9^<@?p<wb+zSN041F3cs5%hlw^%er(BE^>(Cq?Nm@W+&fL zv3TuubWc@O1(|y12!41Ye3or_p#fd3GmjYYM7d4Hb2!@pFRd#0p7}R!O5Y;d)`Va( zVpouB@iJLIefd0(pgX)jpKGvs13$fI;sl{=)`075L5%WX2l^SWzj5*-G|%~}rKB^z z{17-};r3g%N-$oSgB3}gnmEmWi1Fv&P-)pYjYOz{mcik;piy%eRm3NUOve0GV%C%G z!;TR;w_WMG>`%T(^XgqZ6tBEY^U03pkB`{Ri#u%{Xt;2h9KV!tIBTu8JH7GiJ(8C2 zweGdxL1UyZ+E~z^K5#{QWhA)WBiXOebnJqE>LUZo{n_M5EQoEnJ3vzH^8;r4ygA+O zV27_0dq1vRCHWDtoUDO~G)cx>!nE~S)c9s{ba&%Q^MDtAO4A>n=P0BaXS~0VrA$Rs z!-nQ<gyL^jQR%V=$XKnXwBK=osR7T`B*k9yzfyhmMHN%~E04<roxDXHmV7l?L&pcw zdlY0-bDbZ1q{z2LP;N;nCp*T@OGODKK!zc{45)yFJnn`IJxL*yTb`&t`pRGK^$r}% z7R-{Ty8cXcc>6PH9Kvr3$*j$Ax-5QoxJj@#T!#P{A3;VUgMcp0Px?8j^Yl0f=Uo^T zoh&)iAZ5wp7xf4oSb+BAnbsJgR6BgObmXp6Qt@h^7jg6uVp#_hJiUB)Az4`uqu@Bf zYdi-(yDUn(;NLouwM}hizYpCdT^Nq4iVYeXIGayJ2BDe!zR$TW^yG1IC9@aTz`tEE zZxMp5@3y8Hnl8<<RhgaqEc=I<Ob#Kqh+^9alK+FM^#5N)8;L5R<p|auBv!G5Eg>PH zy1II)b;)n{wvSZRi@zJO^#7uNCk7z%hyQnicDF4YZpzLWsu0<w$mMCZ!QKdUbg$=} z9#|PBB;dYCh2%wYE{*^=CM(7ao@Am>aSSC+LzLe;f!4Q(g$2pB^?QI$i;7%ghNIRx zrLH#n0xw9_5>@3ie!gss=ZVKV?XE1Bpe%$_iYX-C_as>@o0faH6mkIANFT`G3_n9j z%<HMR5I<z#&0U88yV?69&6#1DuT|)^1w0`9s)65r)^AKbWClIGtTZh)I1;^4B6GYO zS@7qsZ<>9xajvy9uLh@ht92e-tvVe+ZDpO7*oz`vgdr3q%#8IDWrcMFD!=f9%nc2n zT(ZrdGIRVx=`0Oje#Smt;*Qm@UGD*Rl|(d5!d6VWZ_cA0kfW4~ScQnXA|%!2*w$pv z4IWaX)7_5n>k34hlQJ{KR8<tHCC4uT`?LO_3S0Phn=f6pzr^2}O=DM+kpa7JX;&6w z{j(6bo5$(q4rI+H^k8n{cQkl%xHw`QbWrc=E%7pCt0;-d?AP%`@73uN1~}N;Tdykw z+0PjpZs&0w&s~cBL%*-NjgfTLYUDc|*<tmS<}PKbj42bMcz~L{admI_(8gqq@19_d zHpL0OUJ^=ZGVz<82GQ@hh)Yi$M`$~hJ{97HKzOZ$?OS4YxLN6z%S`%}+WL30qV0?O zDjQvv8v?UR?B9n3PK{Ixx@z-~Isg5j2Psh%Zki#QkZ78D`J&TCxP;yxltO!gw;*Qn z1i{Rw=#-nc>nKxAWvY}~;p6o(h9z0hhs67kzlrT35Qb-n(xs6o$DausX>QHX8u?$% zd}mx!Pq!`#s00C#CS7{(5K1UYZ=ofCfS^c+fOG^6pa@8pDj^hUq4y2~3L?EoZvp8| zKp=p$c!K&r?|bgK=fnAOfA`z|WoGu?v$AHd=UMBSL6`5GGRZzmi3`xIG)47!O6_Vh z=q6sHxrY0@MeA__^;Su6e!XI7hSjMu>(ZFg3&ZU@7nSB~Z5#Ypwp^YmV~FIYe`1_h zqeT6sqsM=e0Q-g>TBu(})Dk6i2-9314bHb+LUB@>7a=$C@IHJd6}Y6c7N-9b?ntC! zz8Lu^esR!hV3X&?dfAz@5Ljn^wyAsWa9TA1pgXiOZy38A9vIZqwJAt*-XA0Da7v+n ze?i^YXuLw9J<S5whVRt9B^aK$dl)BtLF^APHZeY$#}W)8FSEw4zRV_#ww}j=z`wLp zWQXF*BF;oCf(dYoh1;|`w@tyT6|kX;<rVSB2k~8$U22c<VsfOVSIU~pHZBVIgNwmh zivh1L%frto4@I#VKe39dYZVgPHtk#n)!}z|F8ASld+%AH;1OD|CS>hT&6b}pQ14m0 zN%yDa$8QV$Ki<dlzxZPMrH?=ppzgNT<tBVL(Ckp#F`r|GL87`1#34UM`meS)_GrQ0 z4FrfC=(Z!Ni@kd9{h9!{!#6ErHR=<9_Qc|^ZW!PpeJi)R&tSZls%;1y6F#*_;q?YC z&;3V++<&aV`j6U}8-Al;x#7zmx3Ux$^Ct+xK#&dYs6dG~7?Z6DvFQ$`%I;X0Mtey! zCT-UsC(h^(D2`iSyb+CggkV-M=SH>KwYs}C7!X+2{!~`ksVc4x7+Dd=tf(i)@EyL3 z^j;H`i%NjodHA~j)K&=@mWv{)kz^Rfgb~Enm1q5&&FUBRLAmY%xCOt@yiXbsrZ$L) zMP(++POvfu!&RiX$aXfgdEUj!*DwPD*E;ocdEg~JbDMnqLR|v<V-q!GbD~W!T-Az$ zg=0#k{_;H-64l{J`AAgp>b7&JZ?RGP&$M>AsED;*z`6tfp?0<nio={P0R=Fh7bvo6 zG2^l`qW2q9O;MErT)(xDDqEi?mdl_9z<U`j3NGlj&D|xx?|oc3;#Om%@k?yok+p!X zLO&k7LuqNT6IA*zP8@!GsDe}B^V3V_t=6To7z1$PVQb&sMOT?^P)GssVZrcw3!dSv z>!^u7QZAbrpmy!rSBdM_BXRN)DI4LbG@Txt-aqxbz`<vv>bzu4c`bNC=je|%S-l{q ztv1#qsC%`XmZmIC5G?PSA=k0rXv|2QredQs6K$3^@}jqYh>#nX9@ud$^<2Ag1k_02 zSff_VhOQ&*DvJ+a=pW<_pX_{+i3~B!9wV0pBux>Qd^WSt7qxb$8*uEHTU|bs{Eo{} zN+6<sD~YYsdHyDZ?8_ARJLLjp@`4#&F@jdgVFDz$9sX0N)F<zMsz?DAaBvLseYq{A zTeHyXt@#(3-jQad8!}w&F$r*6+2_G&!#@l~D!^CUv!lf8GgvRm!%Sg=Z(n2eUNgj& zQ-xrze<R%I&nbXrb(b(bs5L{S7~pn2-!L{D7dQNG6?v)@?L}>Pu*JK0;|H^{)z&_J z89k3J3jWW0kx-6GCV%z?Dr)+}*D<}U5h_DZuxUPW8-ab2)GY|t(6Dqc?>q$O!D~Cj z7&8BF0^~USBg8+MsZ$?P(M6A7_j%Me@f9A&P8d!Gef3dF`e@Rz(3H2W46Wp|i`fI% zdRb3bpUz<4cz#a0{)4rFiKKVb38U5KGw+X7KZ!oiO#Hd|4kyRW4+idDTx)O{Qbup8 zlXr`PT&5VDtQcz=7sEpiJU}{2>RxfJg+DssG5py}sQwDKD27*y!*MBJZu_we4A-e& z?+|L!e=O~q?wHruqp2B=IdnEQf(?``Xbw)b$#R*f^@xhK2nHhz#tW0Jh!ltzRC!D2 za?cP88+qc#vobZ)NCDE5%o`rcZN_(`4)BB$vb7<&qz=~o*R>sY#1~!1X5Dt>`ohW_ zo_|yV-c!E>lL}WG+ucfZ+MenCRr4AVJ`740=-~_XNyXKO=lnG_Pou6lZ2odiD<<b+ zXp!gpliS*PG)ZJ~lFNAfYUw>(r;xeMg=7=0OO*!%&-j#%{xm|&b!jK42aDFoXwAEK zd~<b4o#6Q(2Ac!w4~!jj41beBEADb%i^+1ERS3t6y!6@7vce|ETwAk|Sq;RW)ED7? zPp|Eo=F{}2$tjyfwv_>m+&P8i4x91>y>eKzlE^8wEW?-kdtsiGlcW!adbAUUf0ti2 zo?q(|w_$epiP$^l_0*gydU7+Br*Gpzip_8gC!3a5RY14q2jgrd&&rSUQ;KgLZV3*W z{XQ#pvGXl8Q^6~T%@DH$n^SA*iz>Q>!k#$PUnzplYKg)N(f_XG1=wEEFj_hk=&?*~ z!ks|$_Is00-9*;iJf98+I_|xiw)8)>otkGd$lW=ov4-CXw|ysqjoS5laO#80OkGI& z!`&2J3pv|bF!tAW+KK7(!=_L&+g+#DdD<7w^QN~LT=A@-wglwlwAOE&OT0?0%t~s; z#xn=1?m}++xj*N)a+83ax`vx<;zEt2n{`m=Ei$o25x(6w@q+iucaHm*yA)gss98GG zBh1^)ubYcT3EE73hehG*q0h$!%~iTF^-&K;79U10As>MDLm6g13!(Z+pmh0;PPL9N z^ErOTe{5|)N`tAYc<ekvZl8HWq^GWFF$Wu5-!Z&jbyeT&S;R+U^Qe>E?lyB9LsNdl zmb+B!+$1#mHp?>INs#7OfB&#0`UN119CZ+LjOcFrIT_*cn*_(V&7^p;BG^K($r4J4 zuw>^ckLZY+NOZ=n(CkK5yD<Y`u6%Rs)T~-#GGY^|uGQUq5~wm!Fl0J+uDw7A%(Zu{ zyBX~-7nuhM6(e;#p5!7$FN?UHu=vO~cB3Y^ls&0IoL0Tq0n%KV(CV7lLHSn7H#MWa z1>a)fU;C^}iHdac#_gxgkS3bF76jDYu#x9P`|c9S+ox;yK)!xe;Ibla1XCS3byj)| z`8mxvi_1|72OF`G$nkRTn+1^b$Z)3|F{AB5L(_6gqTpKNr(w0s(U*KMqq~kI&U!%S z#SdIszl{-&GsY~XQunRNsM%VB`^}Sk(&0~omq}8-DxH684yRS>KhvX>W|b7bfv1~T zSW%$IG<mlxO>%TSR*!a$^EMwoBC{n9IM#yZ8c=wUAFmVd#G}Imw$1xaBNku2ORNJU z$k8q<{e<Pw??c@r*`JtEw(aRV<QuPfW(+BIvN?zKJhTL*i_+-OFH{T)b)d!aK@uB7 z_D!R-nDktA+n?be7eA7-f}~O(q=@MLSXqyUMf1*uC6-`x*f2pmX66PxIY(EJ{>(?m z#khtC=;c!eHnK0CQ=&7cMo;WXHpSuXZi8*FeT7qIQnP-W!jBB+9C6o6hfpO0Hqhbx z6ke8HIg?6*`xVyiu58T>JSlN3<#Y{Rxi>1jPH)cB?&+rI0NXJfj~va$L$fBy8w&2@ zJ<B==BjcLlz2i-u)=r%&?Y1&-j#Sj(iLpUP_iV3o>9l@eEH^FY?EGo#QqMPt68%M% zI+?LyST{~YC$Z~|JKABoe%`j?4h(y;)OJ$gl@cq*+5p-T+lq~kob+3GcP!J;zUxEh zX-?M+cil*c6gbptCOImAJVD5@LDZN<^1e=@LDinG-_`MK?rwe|b6q^2NuGD9x#N7% z@?J?(qx4)JA{Vr^!Ara8O#E*7q&hdY4oqJ1C9Ij<UmV?!1>=QT5ovf|lvK^wGrO9B z0BQtN^F*4cP6zg<lFIv;+fd9RtC#c)T3N_p=)(*+H~L-3Lr#yukIS|Rk^IME_^{lV zGYPP{)paTV+S56^st4LfFXiJgh6QjwbJC(u^wEl8_-c|`ss7Iu)+<dJ)59{zMUUWb zf#A94`yrYUobf^Q8~tGY1o?YZP)#`wqbP=31yJ6W&4GTI0pi*&@`9#IE2o?bAb~!E z3~Cev7h5FCqJFh?SciID4><?LoOQ$lP$WwIw39K~XM9d1K4^b1CMxOJiL0V3D+mji zou*AT1BG*ji6g=vF*pl_R!-a$6X$96P>3%3A?_&d>*e-A&cRN1ko-=_L`?oWZHm1E zbfP7_*jI&Lk^Dx-;F9gMPB&Ta${Md^_S#2}beRQw7pXO)lrn%irR!&of@I@!Lvp>9 zXS188VHBXJAb^h2lbP=vv=@_nyiiX10mva>_n1#~KUYX>RdY{sCuLeHf`Yy9*;aEd z7R9THGM-e&rjKeo%*finbSDTNH&L{C;~zO}@kdh>tS?L}D~JtgK{o5F$ZNBOC3Q>J z&F<?2=t+tuPSzoNEFq`dlya_~Ro(4T%%jnZdn5fP?^z^mWOn6zm2y?$yA9Zf>5*AH z<cdsn#R>j}I&=?pbA?v7CzuCcJ&s_AMbZ%ja&^yFZp6RuZcbG%@!L6}`NjlN?B7aT zE|W~ji#J$EoKslY;K0X|xH*Y2db1o|-svE@ewdboo#4xR2CHc$*~#M5v_h)p=^-DE zfGXmpwJ3ao)wFVf@WyVudnEY4W~$o<lV2824CC&GDK9^UyXcWIj@%ygX-0#yk_Uim zvxRvQh$=;-{DL*!`;aS_1P$+AZr~;H!+US=@sfPu>G3?iJpTYMpRyds^6~JXfJq$1 z!o%Ywgk7GkikEm5h$CZoftvr{50`zi$qvYL(X*zfITm<xM(q?y2$kYx4*m$fhR1XV zH#=D)0)QD<Goklt_$wqCo-F%g$otKFig0U2Kv1`Jt*O(kzx_k{`NCf5J0PE`kXt}3 zw<K=xG9(V(I5ccv;thx9Zi}1nC++Oe5l}_<2%WXOD(0{2<GnsfnJ;4v$epu?B~;HI zq0b5Kab&mYpKufGRKZ?1-nWkR&KVx^$%OA9{Lfn(D^ji|Mgr7U>P8e*Ub;e_w6EVU z*ht`o;vSV6OCU)r_?GHdv3nr+Wg))Tz+3(LUZ?9&dBDr2)Tl1`mz1w$><;BT9*&HX z=D(o48h(|q4IBm**n0W$zYcAO)r>zbOCY(lf%$;y_f#c-zU9{7O^FFUo1h*w7CoBh zX&$o)lMfo38o2sR@o|<4A-3jNNi!rZ=h5>@pwbY~0}|L?CB02#EL@}d1qF}5^$ujo z`9N~TM8nrE5g!JCGTNvZ5GRmafu&?~!V1NG<%<QQq?Tv%T<~?3pvFc%&@<-+#6LIe z#%F;|kP*Pq0G8u|vpm?1m|oOiBqR<?7}nr=lBP!w^wMS`r-|4BM753F8cQ5w9P>AO zX8X^B+OqDC%iU=U8NzRGyVBa}AlAb{k~)UHVHwfbi7t8vsMkd+*eKNtAvf0)LpSDI zyDwHa^t~5629K_UC8@N*1H@IGEX==rU9C8tQ<(n1K;{hbI{x_iUH_8(tGnIM@8^$~ zmRvK!o2Jq3YN`tkZ$Q1gWO7IGcm10uc*<yc7^^z1Urga@<$a6Mj;#W+RXtaLgoV+S ztd?Kje<!iRr}k~CR^feDfHCs9Mch~&r=}2A0K0Jv8<}q%`58k-EVL1vI6Yd~s3=Q? zbTnTAg?Vm1Sz02X2AnEBRa-S`(ZTq*PJA%i>Ef0pag#Km!mYf((A;A62SY$FuW)xQ zx@!BEos&jf_Ap7z(R2Jv;V~z#jhU^Xsx}nRJSM{Q4jse#ST}Nu;7Nf%pl|<eOH{D2 zJLdQv&3;9B?no4g>B?vbWt2c#t^6b5$l5~;U4lSa@`_?XcMQp$Y0;uFK4+G`0_QAA za!Fih01NX|{*d;<$p6U3&A|n-3=x$FiC;uIK`yGj-2*OU6Ir{9dV4z%gCy6gx9dGm zS?`zBJgv=A;PUDfSsq$n^$AO?bvU|jv14CwxEp!Bx}etX==EKl)$5qlywQ+}`Diw1 z098zyGu+Slt8i~rOK?fhK@ovYRyqvx%<5WmZfTvUlxkAl;1j8rT&!wZmQ~vKNhlgQ zjeK;<;*@#aF;+cxsPR^|>>uKv&8<6vL&3chE|>v`FQ@*H^5T;KXTS2Z^p>6<f0t%Y z_-n#W6sw``jRQokS2eMcVEjW)r$n9^GrG4k?5eul>%an#=`=_j_*81N%$b^qGWu?| zZXuz5#1!*U3U|Zm6m+!MC$z1FskxCc?FawG71&T|PNK;)%IkJBh~c|fp{d!7sWq=J zef9&31d@doXSxXX#f|xmpBsT5vh%3;ln#49L()gx!6lKn{iU7rMdIob%YnL}>?oa9 zL9MGGwdGyRSZsUxHWI7T$y$+pF!^a9WHELcx_w3o<{B54IOYk~bU40#o<1jk{IMx9 zo3aJul09ZmKf^^~CMI7tvGQE*<RDIaJNm&GhBIZS`-0uALjGWUY0tOZG6t+f^n8_@ zYToSGl1Ke{`y<^Sqog(1k&2CE{p@W$J3X1T2f!75Q2g3a<owq5aVzaF?>KfgJ{F3# znjO4!lNCJVRYNtC*z(7)X%6b}%}x3a0Y=j%p~#bd1CcyCjj(a1o1mJ0gu)gT`bu%D z*1kcp>Q(Q|fE)P;wQE9~1)3Yt{6&PZ!_=Q;QAgSV&>>~M$w_66x@vH)k-}<S7uK4g z?)OT;d|IqL<Qr?yW`Y%-PXOVzzpx}~=<y=*d3MuBx28cV*bmbqUthhLYpPB8nWmG+ zy5}jAmK*@~a?a>Wv_LpuXf$@fLn$AK%ztu4myziQ6^u@0yb(MRz2ItZB1xTOKn-H2 zhcr`V)3<uJOue4W-~KrcYK#vbB53*i2EFGp1*zCLln9??ORM3@m?qwbn$E#E!`dB) zi&~!>|GO{QKpaU8R$m6c5R5NObZ6>Bd6jSq0bg4_kV?IBu_D>KNf5;-_et15v?ls1 z#S!iFx<79bq2ElPinkmC-*97jIfSRB8zmH6vN`w3_1Tb(B<~EeigQ(E>edb#MI0f7 zJH(nS4D)pV+r$a2gjiVRM#K-S;i{(a*8S8YA3IZfCb>*w^^6ihVgxWF65Maqg+l1q zvCswmYTw-Hw&6!anyXScENhp%@;EZ~rDj`S-n}Q#m3F|jJjSIv_m;)<S@<c2Jr@3U zy$Qe(m-hs+|M=6^rVqwu9p3Dow2j;^Y`&`-Y^u<x^-V$1bf?!4F!(1NWnX@d;E+0# z>G8SQ;pw3vS2V@Sbanstj#qLiwW=Cg(IMAF{4|Fw$zGq;fLX)7(jVPHB1E8bK#5b~ z7!eR>ilj^UElKs7YoU^Fg5``<;By1>%2T(PKB5M_tb|U-CvKbA3<ED{KyUPw3M+&% zYC~zN`T`)y$<(Nu7*`&@oanl-J^_){F(HC6LfS()7o_G`P;Z6jx!D^~kg+XtwjC1M z%Z9HLIwm5#7qR)0x~kwg_LbD>5Z_=In`s{^Y`2}Xsz1FwfA@u=v7c5nZmMZcBgY_u zJ+aYlc!TD@f)x?*K)nNLG#J6xXi-(H&Rk*PaukZbR?<x~@Ni$i{$-<Pp8@K9Y~wI; zuQaEMnOJ%hF=IgN+;i7)w4uT^qwwXyFb6k%Tl*xYwQ(<Luj<YStxYLLW;{U8@$-b8 z!nl~Rk3dx%tP^^E`i;TMmMt%XOfL@zuRb>kOrme?gJ^OZsVT^22N1t?IT?5+h2(9V z)p}>`7*JXFLlQ=nDUmwsYxm@ua!t#awFy$QDWrv~dui&NuNl);rBcV*3jf0Wj`@0e zIoNm1!XBdZ?KwlRJ;d!%slmU+(?uYV>W!Ipy6fb;(`b)%C9pxW#86xqt@kp2>f5Kb z1-)`(1ce2bpFPa~F6Gfw6V!Q_G#8N`obx2)F%Klm_BqC}06I5k=^k9QgaQL<RHw$r zIUTl!CgJ&3{4{PyRRlIl&$y9U9946Sul5~msfQC5v{1(yIR>!=_j5*&BUK5UO~%w& zU72Afu+3nP3$^eRDp{(O7bv8+%Qt8?J9!wp)gIef8aA>We;UdmK_H*8xbb;!vrpZ1 zX!j_zydroo-okJ&REgE=hi`rBpo0e{#wBqVsY#XA?9nOZwr90k;`4E7pNtS~OKU0> zpm^(@!deKNDW*5HnU?5Itbf94-3);n#&@Vx$U6-o^e6Bd44_^(=Gn23)6g@|1z(qa znR)Wa*!qdpq^SmH?zjI$Gei+)Q`PB>N~qqQeL|%>s_3=F(KVMy->J!sn^r++#);N3 zy-7ug)4S$*=9^Xvft?82wEkkASY&GYy=1xs5>h`j+|O_IYms-*2>lI9rS*<;eA3ep zh5`Si_plpeb`bPr1U3r1xkgjz({)GQ6TDrP#z{dS(dFgqFLLa^BkiT7oqB!&sy!*u zkEu=3<5!OL46Aakar@o?-{`l+h$eDsEbd#+e{J_g1D@$2d7+i1@-TnrW7#Cu5eHUs z>8TT$l`W{Z={&!4M#r9b4?9&v>bAhoh(5)hs)F!F7VGn^0bd3#4O#ydiLYutxU5<0 zfZiE<Y$VfDoueT}q5hA3Uwl~`Z|5(E+)59rFDl;Wae^?_i~zxD=hHG_3+%B{^X7DJ zRB2DlrT>MN3J7~bTpt19uVu@@%o4IB`pqU(78}iK|MJVffD#|p!<-(HKUd6@2>uo0 zk3++)swT0cS8bH=kgIse{m?v?Ldl}Sx{Y5$WH`V|mAnu@9QsQjRq{t`@H`+rB(ON= z!yk-B8q__??XVzN#;A9R$lZagX9NasSU(uei*<TwZwKPQ@Oy5(yEt^4%uk(*`Z17% z!{;%I-#FU|D;G2Vpw})+&E~IfA`OD%piog9A;2}u_p0X8D+3&kOSl#1gO3{QPE)or zv*Pp@{sqgU3`z=YG=%-`vAD)BTs7Gn<W(C${nAqSi268xomOQ$^In=*)tG6}dmLA= zY1Q};$Nd>j+{Nmwp1&YLRcnF!ea1d9>(9G=$ba6U-ZqRj5Be|n(??<t1{H8DF5jB~ zK+iUsVs}O5Q-2<wr~3=+;yfMBN_UIaaE8#w9Q|fNr2o*QGK~_!%jbHn_~lA-Yn-3O zJ)bKk!oq#|<n9^GYP($f%K#0835ot()`fuV0e|@53=aGL=7l_d2%5jGfoKuJ-z4*6 zhThOWmnA&YA{T=JSp47p@meUilVAO2px>xnL8wUZFXo$OTI~li!qJy>Q$s~Zxm5A- GtN#E)1sCoB literal 0 HcmV?d00001 diff --git a/docs/resources/build_apk_step_2.png b/docs/resources/build_apk_step_2.png new file mode 100644 index 0000000000000000000000000000000000000000..7e0dbeaaf05b9044c33586209a8b3732a5e75c56 GIT binary patch literal 21945 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 literal 0 HcmV?d00001 diff --git a/docs/resources/build_apk_step_3.png b/docs/resources/build_apk_step_3.png new file mode 100644 index 0000000000000000000000000000000000000000..59035c1301a5893988e72a0244ab7f2256cd2486 GIT binary patch literal 28060 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 L73qR!uYLau*0pTs literal 0 HcmV?d00001 diff --git a/docs/resources/launcher_directory.png b/docs/resources/launcher_directory.png new file mode 100644 index 0000000000000000000000000000000000000000..224976c56528bac58d486b8867bf8fa7c2c6fd8f GIT binary patch literal 29852 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 OL2}Z{QpJx91O5*ZhYaxm literal 0 HcmV?d00001 diff --git a/docs/resources/open_id_login.png b/docs/resources/open_id_login.png new file mode 100644 index 0000000000000000000000000000000000000000..10e07c0d9d2abe0facf14a360ab49039aacc29d5 GIT binary patch literal 88956 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 C>nO|s literal 0 HcmV?d00001 diff --git a/docs/resources/version_name_code.png b/docs/resources/version_name_code.png new file mode 100644 index 0000000000000000000000000000000000000000..0ccca8a0f38bdb22de2e73b530ebdcf6aa2feb4f GIT binary patch literal 20546 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 bnyn?d`4EBux;CiTfEpnIVg5CKgo}Rz&&>Dw literal 0 HcmV?d00001 diff --git a/docs/src/commonmark/en/content/capture-app/local-analytics-features.md b/docs/src/commonmark/en/content/capture-app/local-analytics-features.md deleted file mode 100644 index 934532ecdab..00000000000 --- a/docs/src/commonmark/en/content/capture-app/local-analytics-features.md +++ /dev/null @@ -1,82 +0,0 @@ -# Local Analytics { #capture_app_local_analytics } - -## Local Analytics (NEW 2.5) { #capture_app_local_analytics } - -The DHIS2 Android App can now render analytics that have been created in the Data Visualizer app in DHIS2. Analytics to be displayed require to be configured using the Android Settings WebApp where administrators will be able to decide the charts and tables to be displayed for end users. - -To configure analytics open the Android Settings WebApp on your DHIS2 server and follow the steps below: - - 1. Select Home, Program or Data set from the Analytics menu - 2. Click on the "Add Visualization" button - 3. Search by typing the name of the visualization and select it by clicking on it - 4. Add an alternative title, otherwise, the app will display the name of the visualization - -![](resources/images/capture-app-image162.png){ width=25%} -![](resources/images/capture-app-image164.png){ width=25%} - -Analytics are created and configured using the web tools, however, the data aggregation happens offline using only data stored in the device. - -![](resources/images/capture-app-image165.png){ width=25%} -![](resources/images/capture-app-image166.png){ width=25%} -![](resources/images/capture-app-image167.png){ width=25%} - -### Analytics Types and Filters { #capture_app_local_analytics_types } - -The analytics supported in the Android App are: - - - Pivot Tables - - Column Chart - - Line Chart - - Pie Chart - - Radar chart - - Single Value - -For each visualization object, the user will be able to filter in the app by: - - * Period: Daily, Weekly, Monthly, Yearly, This Quarter, Last Quarter, Last 4 Quarters and Quarter this year. - * OrgUnit: Select "All" to display all the org units available to the user or "Selection" to specify one or multiple org units. - -![](resources/images/capture-app-image180.png){ width=25%} -![](resources/images/capture-app-image168.png){ width=25%} -![](resources/images/capture-app-image169.png){ width=25%} - -A reset button will be displayed if a filter is applied. Select Reset to display the default visualization. - -![](resources/images/capture-app-image170.png){ width=25%} - -Users can also change The anlytics type between chart, table or single value. - -![](resources/images/capture-app-image166.png){ width=25%} -![](resources/images/capture-app-image171.png){ width=25%} - -### Groups { #capture_app_local_analytics_groups } - -All these visualizations can be organised and displayed in groups. Groups are also configured using the Android Settings Webapp following the steps below: - - 1. Open the Android Settings App - 2. Click to Add a new visualization in the Analytics Menu (Home, Program or Data set) - 3. Select a visualization - 4. Mark the "Use a group visualization" checkbox - 5. Create or select a created group - 6. Save the visualization - -You can name your different groups, they will be displayed as a button in the top bar of the analytics screen. - -![](resources/images/capture-app-image173.png){ width=25%} - -### Limitations { #capture_app_local_analytics_limitations } - -Android uses tables and charts created using the web Visualizer app, however only the configuration parameters of the object are used by the Android App: data elements, indicators, chart type, title, periods...; all the aggregations are calculated offline by the android application. The results will be based on the data stored in the device at that exact moment. - -Since the aggregations and calculations displayed are calculated in the device, the implementation of analytics is limited compared to web. In summary the compatible and suported objects and features are: - - - Well formed analytic objects (series, categories, filters) - - User has view access - - Limitations for Pivot Tables - - Number of header lines: 1 - - Number of header columns: 1 - - Limitations for Charts - - Number of Series: No limit (but remember you are rendering in a small screen) - - Number of Categories (doesn’t apply for pie chart): No limit - -There are many more restrictions which apply to Android Analytics regarding the many configuration options available in the Web Visualizer as well as the supported functions and calculations related to indicators and program indicators. [This table](https://docs.google.com/spreadsheets/d/1127cz7M0K4fux5CU0V54V2Z77NZWCr0BTrZ6jcCec4Q) summarises all supported features. diff --git a/docs/src/commonmark/en/content/capture-app/resources/images/capture-app-matomo-instance.png b/docs/src/commonmark/en/content/capture-app/resources/images/capture-app-matomo-instance.png deleted file mode 100644 index 18c23295eb42831e733c1b658b57799e068e610d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69085 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 diff --git a/docs/src/commonmark/en/content/capture-app/resources/images/capture-app-matomo-settings.png b/docs/src/commonmark/en/content/capture-app/resources/images/capture-app-matomo-settings.png deleted file mode 100644 index d114318abe7782143be251ad4fb0210df76e5ed1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41361 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 diff --git a/docs/src/commonmark/en/content/capture-app/resources/images/capture-app-sync-status.png b/docs/src/commonmark/en/content/capture-app/resources/images/capture-app-sync-status.png deleted file mode 100644 index 142218968d0847b526c270c670ce224080b99cab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17680 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 Kq)H?W{r*4M<8&hc diff --git a/docs/src/commonmark/en/content/capture-app/settings.md b/docs/src/commonmark/en/content/capture-app/settings.md deleted file mode 100644 index bc2c8fa840f..00000000000 --- a/docs/src/commonmark/en/content/capture-app/settings.md +++ /dev/null @@ -1,45 +0,0 @@ -# Settings { #capture_app_settings } - -![Settings window](resources/images/capture-app-image17.jpg){ width=25%} - -Sync data -: User is able to choose from a drop-down list if the data entered in the app is uploaded to the server manually or scheduled every 15 min, 1 hour or 1 Day. By default the app will sync every 24h. This kind of Syncing includes new and updated events and TEI’s. - -Sync configuration (also known as sync metadata) -: User is able to choose from a drop-down list if the data entered in the app is uploaded to the server manually or scheduled every day or week. By default the app will sync every 24h. This sync will update changes in programs or configurations in web. - -Sync parameters -: These parameters allow the user to specify the maximum number of TEI’s and events that can be stored in the local device. The user can also specify if limits apply per organisation unit or in total. Values can be set to default by clicking on “Reset to default”. - -> **Note** -> -> Sync data, Sync configuration and Sync parameters can be overwritten using the Android Settings Web App as described [in the specific section][#capture_app_andoid_settings_webapp_synchronization] -> -> - -Reserved values -: This will specify the number of reserved Id's available in your device and will allow you to refill them. - -Open sync errors log -: The sync error log gives details about the error and is prepared to be shared with admins. - -Delete local data -: This action will delete local data without having to log out. - -> **Warning** -> -> Using this functionality might lead to data loss if changes have not been previously synced to the server. -> -> - -Reset app data & configuration -: This action will log out the user and delete all data and metadata, this means user and server information is also deleted. It is similar to resetting the App. - -> **Warning** -> -> Using this functionality might lead to data loss if changes have not been previously synced to the server. -> -> - -SMS Settings -: This sections allows to check or edit the parameters related to the sms gateway. diff --git a/form/build.gradle.kts b/form/build.gradle.kts index 6e7ba7aabee..11c3aee6b15 100644 --- a/form/build.gradle.kts +++ b/form/build.gradle.kts @@ -2,7 +2,6 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { id("com.android.library") - kotlin("android") id("com.google.devtools.ksp") alias(libs.plugins.kotlin.compose.compiler) } @@ -69,10 +68,11 @@ dependencies { implementation(libs.androidx.activity.compose) testImplementation(libs.bundles.form.test) testImplementation(libs.test.junit) + testImplementation(libs.test.turbine) androidTestImplementation(libs.test.compose.ui.test) - androidTestApi(libs.test.mockitoCore) - androidTestApi(libs.test.mockitoKotlin) - androidTestApi(libs.test.dexmaker.mockitoInline) + androidTestImplementation(libs.test.mockitoCore) + androidTestImplementation(libs.test.mockitoKotlin) + androidTestImplementation(libs.test.dexmaker.mockitoInline) debugImplementation(libs.androidx.compose.uitooling) debugImplementation(libs.test.ui.test.manifest) diff --git a/form/src/androidTest/kotlin/org/dhis2/form/ui/FormTest.kt b/form/src/androidTest/kotlin/org/dhis2/form/ui/FormTest.kt index 5153e9dfe2c..aa44b59425c 100644 --- a/form/src/androidTest/kotlin/org/dhis2/form/ui/FormTest.kt +++ b/form/src/androidTest/kotlin/org/dhis2/form/ui/FormTest.kt @@ -10,7 +10,6 @@ import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.mobile.ui.designsystem.component.SectionState import org.junit.Rule import org.junit.Test -import org.mockito.Mockito.mock class FormTest { @@ -75,7 +74,6 @@ class FormTest { sections = sections, intentHandler = {}, uiEventHandler = {}, - resources = mock(), ) } composeTestRule.onNodeWithTag(FORM_VIEW).assertIsDisplayed() diff --git a/form/src/androidTest/kotlin/org/dhis2/form/ui/provider/inputfield/AgeProviderTest.kt b/form/src/androidTest/kotlin/org/dhis2/form/ui/provider/inputfield/AgeProviderTest.kt index 8ca5bc97189..b7ff3d891b8 100644 --- a/form/src/androidTest/kotlin/org/dhis2/form/ui/provider/inputfield/AgeProviderTest.kt +++ b/form/src/androidTest/kotlin/org/dhis2/form/ui/provider/inputfield/AgeProviderTest.kt @@ -10,8 +10,6 @@ import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performTextInput import androidx.compose.ui.test.printToLog -import androidx.test.platform.app.InstrumentationRegistry -import org.dhis2.form.di.Injector import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.mobile.ui.designsystem.component.InputStyle import org.junit.Rule @@ -19,8 +17,6 @@ import org.junit.Test class AgeProviderTest { - private val resourceManager = - Injector.provideResourcesManager(InstrumentationRegistry.getInstrumentation().getContext()) companion object { @@ -53,10 +49,9 @@ class AgeProviderTest { composeTestRule.setContent { ProvideInputAge( modifier = Modifier.testTag(INPUT_AGE_TEST_TAG), - inputStyle = InputStyle.DataInputStyle(), + inputStyle = InputStyle.DarkInputStyle(), fieldUiModel = dateValueTypeFieldUiModel, intentHandler = {}, - resources = resourceManager, onNextClicked = {}, ) } @@ -72,10 +67,9 @@ class AgeProviderTest { composeTestRule.setContent { ProvideInputAge( modifier = Modifier.testTag(INPUT_AGE_TEST_TAG), - inputStyle = InputStyle.DataInputStyle(), + inputStyle = InputStyle.DarkInputStyle(), fieldUiModel = dateValueTypeFieldUiModel, intentHandler = {}, - resources = resourceManager, onNextClicked = { }, ) } @@ -91,11 +85,9 @@ class AgeProviderTest { composeTestRule.setContent { ProvideInputAge( modifier = Modifier.testTag(INPUT_AGE_TEST_TAG), - - inputStyle = InputStyle.DataInputStyle(), + inputStyle = InputStyle.DarkInputStyle(), fieldUiModel = dateValueTypeFieldUiModel, intentHandler = {}, - resources = resourceManager, onNextClicked = {}, ) } @@ -113,10 +105,9 @@ class AgeProviderTest { composeTestRule.setContent { ProvideInputAge( modifier = Modifier.testTag(INPUT_AGE_TEST_TAG), - inputStyle = InputStyle.DataInputStyle(), + inputStyle = InputStyle.DarkInputStyle(), fieldUiModel = dateValueTypeFieldUiModel, intentHandler = {}, - resources = resourceManager, onNextClicked = {}, ) @@ -135,10 +126,9 @@ class AgeProviderTest { composeTestRule.setContent { ProvideInputAge( modifier = Modifier.testTag(INPUT_AGE_TEST_TAG), - inputStyle = InputStyle.DataInputStyle(), + inputStyle = InputStyle.DarkInputStyle(), fieldUiModel = dateValueTypeFieldUiModel, intentHandler = {}, - resources = resourceManager, onNextClicked = {}, ) } @@ -162,10 +152,9 @@ class AgeProviderTest { composeTestRule.setContent { ProvideInputAge( modifier = Modifier.testTag(INPUT_AGE_TEST_TAG), - inputStyle = InputStyle.DataInputStyle(), + inputStyle = InputStyle.DarkInputStyle(), fieldUiModel = dateValueTypeFieldUiModel, intentHandler = {}, - resources = resourceManager, onNextClicked = {}, ) } @@ -183,10 +172,9 @@ class AgeProviderTest { composeTestRule.setContent { ProvideInputAge( modifier = Modifier.testTag(INPUT_AGE_TEST_TAG), - inputStyle = InputStyle.DataInputStyle(), + inputStyle = InputStyle.DarkInputStyle(), fieldUiModel = dateValueTypeFieldUiModel, intentHandler = {}, - resources = resourceManager, onNextClicked = {}, ) } diff --git a/form/src/androidTest/kotlin/org/dhis2/form/ui/provider/inputfield/CategorySelectorProviderTest.kt b/form/src/androidTest/kotlin/org/dhis2/form/ui/provider/inputfield/CategorySelectorProviderTest.kt index f9523db29c0..a95b10169b4 100644 --- a/form/src/androidTest/kotlin/org/dhis2/form/ui/provider/inputfield/CategorySelectorProviderTest.kt +++ b/form/src/androidTest/kotlin/org/dhis2/form/ui/provider/inputfield/CategorySelectorProviderTest.kt @@ -63,7 +63,7 @@ class CategorySelectorProviderTest { composeTestRule.setContent { ProvideCategorySelectorInput( fieldUiModel = uiModel, - inputStyle = InputStyle.DataInputStyle(), + inputStyle = InputStyle.DarkInputStyle(), ) } @@ -115,7 +115,7 @@ class CategorySelectorProviderTest { Column { ProvideCategorySelectorInput( fieldUiModel = uiModel, - inputStyle = InputStyle.DataInputStyle(), + inputStyle = InputStyle.DarkInputStyle(), ) } } diff --git a/form/src/androidTest/kotlin/org/dhis2/form/ui/provider/inputfield/DateProviderTest.kt b/form/src/androidTest/kotlin/org/dhis2/form/ui/provider/inputfield/DateProviderTest.kt index a01ca035fd3..f43b1eb108b 100644 --- a/form/src/androidTest/kotlin/org/dhis2/form/ui/provider/inputfield/DateProviderTest.kt +++ b/form/src/androidTest/kotlin/org/dhis2/form/ui/provider/inputfield/DateProviderTest.kt @@ -40,7 +40,7 @@ class DateProviderTest { generateFieldUiModel(FIELD_UI_MODEL_UID, DATE_VALUE, DATE_VALUE, ValueType.DATE) composeTestRule.setContent { ProvideInputDate( - inputStyle = InputStyle.DataInputStyle(), + inputStyle = InputStyle.DarkInputStyle(), modifier = Modifier.testTag(INPUT_DATE_TEST_TAG), fieldUiModel = dateValueTypeFieldUiModel, intentHandler = {}, @@ -65,7 +65,7 @@ class DateProviderTest { ) composeTestRule.setContent { ProvideInputDate( - inputStyle = InputStyle.DataInputStyle(), + inputStyle = InputStyle.DarkInputStyle(), modifier = Modifier.testTag(INPUT_DATE_TEST_TAG), fieldUiModel = dateValueTypeFieldUiModel, intentHandler = {}, @@ -88,7 +88,7 @@ class DateProviderTest { composeTestRule.setContent { ProvideInputDate( modifier = Modifier.testTag(INPUT_DATE_TEST_TAG), - inputStyle = InputStyle.DataInputStyle(), + inputStyle = InputStyle.DarkInputStyle(), fieldUiModel = dateValueTypeFieldUiModel, intentHandler = {}, onNextClicked = {}, diff --git a/form/src/main/java/org/dhis2/form/data/EnrollmentRepository.kt b/form/src/main/java/org/dhis2/form/data/EnrollmentRepository.kt index 31b1193d6a2..67c4625061f 100644 --- a/form/src/main/java/org/dhis2/form/data/EnrollmentRepository.kt +++ b/form/src/main/java/org/dhis2/form/data/EnrollmentRepository.kt @@ -351,7 +351,7 @@ class EnrollmentRepository( enrollmentDataList.add( getEnrollmentDateField( - conf.program()?.displayEnrollmentLabel() + conf.program()?.displayEnrollmentDateLabel() ?: enrollmentFormLabelsProvider.provideEnrollmentDateDefaultLabel(programUid!!), conf.program()?.selectEnrollmentDatesInFuture(), ), diff --git a/form/src/main/java/org/dhis2/form/data/EventRepository.kt b/form/src/main/java/org/dhis2/form/data/EventRepository.kt index 3640303b860..1c1b79f55a7 100644 --- a/form/src/main/java/org/dhis2/form/data/EventRepository.kt +++ b/form/src/main/java/org/dhis2/form/data/EventRepository.kt @@ -152,6 +152,7 @@ class EventRepository( .byProgramStageUid() .eq(event?.programStage()) .withDataElements() + .orderBySortOrder(RepositoryScope.OrderByDirection.ASC) .blockingGet() .associateBy { section -> section.uid() } } @@ -176,6 +177,7 @@ class EventRepository( .byProgramStageUid() .eq(programStage?.uid()) .withDataElements() + .orderBySortOrder(RepositoryScope.OrderByDirection.ASC) .get() .flatMap { programStageSection -> if (programStageSection.isEmpty()) { diff --git a/form/src/main/java/org/dhis2/form/data/FormRepository.kt b/form/src/main/java/org/dhis2/form/data/FormRepository.kt index 02965016481..5cd1c2b5251 100644 --- a/form/src/main/java/org/dhis2/form/data/FormRepository.kt +++ b/form/src/main/java/org/dhis2/form/data/FormRepository.kt @@ -21,9 +21,6 @@ interface FormRepository { suspend fun runDataIntegrityCheck(backPressed: Boolean): DataIntegrityCheckResult fun completedFieldsPercentage(value: List<FieldUiModel>): Float - - fun calculationLoopOverLimit(): Boolean - fun backupOfChangedItems(): List<FieldUiModel> fun updateErrorList(action: RowAction) diff --git a/form/src/main/java/org/dhis2/form/data/FormRepositoryImpl.kt b/form/src/main/java/org/dhis2/form/data/FormRepositoryImpl.kt index ebb1be71115..d4780496606 100644 --- a/form/src/main/java/org/dhis2/form/data/FormRepositoryImpl.kt +++ b/form/src/main/java/org/dhis2/form/data/FormRepositoryImpl.kt @@ -27,8 +27,6 @@ import org.hisp.dhis.android.core.common.ValueType.LONG_TEXT import org.hisp.dhis.android.core.event.EventStatus import org.hisp.dhis.rules.models.RuleEffect -private const val LOOP_THRESHOLD = 5 - class FormRepositoryImpl( private val formValueStore: FormValueStore, private val fieldErrorMessageProvider: FieldErrorMessageProvider, @@ -49,7 +47,6 @@ class FormRepositoryImpl( private var ruleEffects: List<RuleEffect> = emptyList() private var ruleEffectsResult: RuleUtilsProviderResult? = null private var runDataIntegrity: Boolean = false - private var calculationLoop: Int = 0 private var backupList: List<FieldUiModel> = emptyList() private val fieldsWithOptionEffects = mutableListOf<FieldUiModel>() @@ -86,7 +83,6 @@ class FormRepositoryImpl( } override suspend fun composeList(skipProgramRules: Boolean): List<FieldUiModel> { - calculationLoop = 0 return itemList .applyRuleEffects(skipProgramRules) .mergeListWithErrorFields(itemsWithError) @@ -461,9 +457,6 @@ class FormRepositoryImpl( ) override fun completedFieldsPercentage(value: List<FieldUiModel>): Float = completionPercentage - - override fun calculationLoopOverLimit(): Boolean = calculationLoop == LOOP_THRESHOLD - override fun backupOfChangedItems() = backupList.minus(itemList.applyRuleEffects()) private suspend fun getFieldsWithError() = @@ -540,14 +533,7 @@ class FormRepositoryImpl( } } - return if (ruleEffectsResult?.fieldsToUpdate?.isNotEmpty() == true && - calculationLoop < LOOP_THRESHOLD - ) { - calculationLoop += 1 - ArrayList(fieldMap.values).applyRuleEffects(skipProgramRules) - } else { - ArrayList(fieldMap.values) - } + return ArrayList(fieldMap.values) } private fun List<FieldUiModel>.setFocusedItem(): List<FieldUiModel> = diff --git a/form/src/main/java/org/dhis2/form/data/RulesUtilsProviderImpl.kt b/form/src/main/java/org/dhis2/form/data/RulesUtilsProviderImpl.kt index ef9f7a06b87..5dd8314f01a 100644 --- a/form/src/main/java/org/dhis2/form/data/RulesUtilsProviderImpl.kt +++ b/form/src/main/java/org/dhis2/form/data/RulesUtilsProviderImpl.kt @@ -4,6 +4,7 @@ import org.dhis2.commons.bindings.formatData import org.dhis2.form.model.FieldUiModel import org.dhis2.form.model.ValueStoreResult import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.android.core.maintenance.D2Error import org.hisp.dhis.android.core.program.ProgramRuleActionType import org.hisp.dhis.android.core.program.ProgramStage @@ -287,6 +288,7 @@ class RulesUtilsProviderImpl( ruleEffect: RuleEffect, fieldViewModels: MutableMap<String, FieldUiModel>, ) { + // Not implemented } private fun displayKeyValuePair( @@ -294,6 +296,7 @@ class RulesUtilsProviderImpl( ruleEffect: RuleEffect, fieldViewModels: MutableMap<String, FieldUiModel>, ) { + // Not implemented } private fun hideSection( @@ -317,7 +320,11 @@ class RulesUtilsProviderImpl( val fieldUid = assign.field() ?: "" fieldViewModels[fieldUid]?.let { field -> val value = - if (field.optionSet != null && field.displayName != null) { + if ( + field.optionSet != null && + field.displayName != null && + field.valueType != ValueType.MULTI_TEXT + ) { val valueOption = optionsRepository.getOptionByDisplayName( optionSet = field.optionSet!!, @@ -343,38 +350,19 @@ class RulesUtilsProviderImpl( valuesToChange[fieldUid] = it } } - val valueToShow = - if (field.optionSet != null && ruleEffect.data?.isNotEmpty() == true) { - val effectOption = - optionsRepository.getOptionByCode( - optionSet = field.optionSet!!, - code = ruleEffect.data!!, - ) - if (effectOption == null) { - configurationErrors.add( - RulesUtilsProviderConfigurationError( - currentRuleUid, - ActionType.ASSIGN, - ConfigurationError.VALUE_TO_ASSIGN_NOT_IN_OPTION_SET, - listOf( - currentRuleUid ?: "", - ruleEffect.data ?: "", - field.optionSet ?: "", - ), - ), - ) - } - effectOption?.displayName() - } else { - ruleEffect.data - } + val valueToShow = getDisplayValue(field.optionSet, field.valueType, ruleEffect.data) ruleEffect.data?.formatData(field.valueType)?.let { formattedValue -> val updatedField = fieldViewModels[assign.field()] ?.setValue(formattedValue) - ?.setDisplayName(valueToShow?.formatData(field.valueType)) - ?.setEditable(false) + ?.setDisplayName( + formatDisplayName( + valueToShow, + field.valueType, + field.optionSet, + ), + )?.setEditable(false) updatedField?.let { fieldViewModels[fieldUid] = it @@ -387,6 +375,56 @@ class RulesUtilsProviderImpl( } } + private fun formatDisplayName( + value: String?, + valueType: ValueType?, + optionSetUid: String?, + ): String? = if (optionSetUid != null) value else value?.formatData(valueType) + + private fun getDisplayValue( + optionSetUid: String?, + valueType: ValueType?, + ruleEffectData: String?, + ): String? = + if (optionSetUid != null && ruleEffectData?.isNotEmpty() == true) { + if (valueType != ValueType.MULTI_TEXT) { + getOptionName(optionSetUid, ruleEffectData) + } else { + val valueCodes = ruleEffectData.split(",") + valueCodes.joinToString(",") { + getOptionName(optionSetUid, it) ?: "" + } + } + } else { + ruleEffectData + } + + private fun getOptionName( + optionSetUid: String, + code: String, + ): String? { + val effectOption = + optionsRepository.getOptionByCode( + optionSet = optionSetUid, + code = code, + ) + if (effectOption == null) { + configurationErrors.add( + RulesUtilsProviderConfigurationError( + currentRuleUid, + ActionType.ASSIGN, + ConfigurationError.VALUE_TO_ASSIGN_NOT_IN_OPTION_SET, + listOf( + currentRuleUid ?: "", + code, + optionSetUid, + ), + ), + ) + } + return effectOption?.displayName() + } + private fun createEvent( createEvent: RuleAction, fieldViewModels: MutableMap<String, FieldUiModel>, diff --git a/form/src/main/java/org/dhis2/form/data/metadata/EnrollmentConfiguration.kt b/form/src/main/java/org/dhis2/form/data/metadata/EnrollmentConfiguration.kt index 6143bd41d88..5d9b754a887 100644 --- a/form/src/main/java/org/dhis2/form/data/metadata/EnrollmentConfiguration.kt +++ b/form/src/main/java/org/dhis2/form/data/metadata/EnrollmentConfiguration.kt @@ -46,6 +46,7 @@ class EnrollmentConfiguration( .withAttributes() .byProgramUid() .eq(enrollment()?.program()) + .orderBySortOrder(RepositoryScope.OrderByDirection.ASC) .blockingGet() fun orgUnit(orgUnitUid: String) = diff --git a/form/src/main/java/org/dhis2/form/di/Injector.kt b/form/src/main/java/org/dhis2/form/di/Injector.kt index 440fab6314c..8ee62b4dc02 100644 --- a/form/src/main/java/org/dhis2/form/di/Injector.kt +++ b/form/src/main/java/org/dhis2/form/di/Injector.kt @@ -35,6 +35,7 @@ import org.dhis2.form.simprints.ramp.data.GetFormHistoryChartUseCase as GetSimpr import org.dhis2.form.ui.FieldViewModelFactory import org.dhis2.form.ui.FieldViewModelFactoryImpl import org.dhis2.form.ui.FormViewModelFactory +import org.dhis2.form.ui.mapper.FormSectionMapper import org.dhis2.form.ui.provider.AutoCompleteProviderImpl import org.dhis2.form.ui.provider.DisplayNameProviderImpl import org.dhis2.form.ui.provider.EnrollmentFormLabelsProvider @@ -71,6 +72,7 @@ object Injector { provideDispatchers(), openErrorLocation, provideFormResultDialogProvider(context), + FormSectionMapper(), ) private fun provideFormResultDialogProvider(context: Context) = @@ -249,11 +251,11 @@ object Injector { private fun provideEnrollmentObjectRepository(enrollmentUid: String): EnrollmentObjectRepository = provideD2().enrollmentModule().enrollments().uid(enrollmentUid) - private fun provideCrashReportController(context: Context) = CrashReportControllerImpl(context) + private fun provideCrashReportController(context: Context) = CrashReportControllerImpl(context, sentryDsn = "") private fun provideNetworkUtils(context: Context) = NetworkUtils(context) - fun provideResourcesManager(context: Context) = + private fun provideResourcesManager(context: Context) = ResourceManager( context, provideColorUtils(), diff --git a/form/src/main/java/org/dhis2/form/model/FormSection.kt b/form/src/main/java/org/dhis2/form/model/FormSection.kt index 093db60ac6a..6543f3045ab 100644 --- a/form/src/main/java/org/dhis2/form/model/FormSection.kt +++ b/form/src/main/java/org/dhis2/form/model/FormSection.kt @@ -8,7 +8,7 @@ data class FormSection( val description: String? = null, val state: SectionState, val fields: List<FieldUiModel>, - var warningMessage: Int? = null, + val warningMessage: Int? = null, val completeFields: Int = 0, val totalFields: Int = 0, val warnings: Int = 0, diff --git a/form/src/main/java/org/dhis2/form/simprints/SimprintsRememberCustomIntentFormPresenter.kt b/form/src/main/java/org/dhis2/form/simprints/SimprintsRememberCustomIntentFormPresenter.kt index 25e87df6809..59675407f53 100644 --- a/form/src/main/java/org/dhis2/form/simprints/SimprintsRememberCustomIntentFormPresenter.kt +++ b/form/src/main/java/org/dhis2/form/simprints/SimprintsRememberCustomIntentFormPresenter.kt @@ -2,7 +2,7 @@ package org.dhis2.form.simprints import androidx.compose.runtime.Composable import androidx.compose.runtime.remember -import org.dhis2.commons.resources.ResourceManager +import androidx.compose.ui.res.stringResource import org.dhis2.commons.simprints.repository.SimprintsSessionRepository import org.dhis2.commons.simprints.utils.SimprintsIntentUtils import org.dhis2.form.R @@ -12,7 +12,6 @@ import org.dhis2.form.ui.customintent.CustomIntentActivityResultContract @Composable fun rememberSimprintsCustomIntentFormPresenter( fieldUiModel: FieldUiModel, - resources: ResourceManager, sessionRepository: SimprintsSessionRepository, ): SimprintsCustomIntentFormPresenter { val customIntent = fieldUiModel.customIntent @@ -30,9 +29,9 @@ fun rememberSimprintsCustomIntentFormPresenter( } val placeholderValue = if (sessionRepository.hasPendingEnrollmentFromPossibleDuplicates()) { - resources.getString(R.string.simprints_using_last_biometrics) + stringResource(R.string.simprints_using_last_biometrics) } else { - resources.getString(R.string.simprints_from_last_biometric_search) + stringResource(R.string.simprints_from_last_biometric_search) } return remember( diff --git a/form/src/main/java/org/dhis2/form/simprints/ramp/ui/FormHistoryChartView.kt b/form/src/main/java/org/dhis2/form/simprints/ramp/ui/FormHistoryChartView.kt index 823bf757525..83342056275 100644 --- a/form/src/main/java/org/dhis2/form/simprints/ramp/ui/FormHistoryChartView.kt +++ b/form/src/main/java/org/dhis2/form/simprints/ramp/ui/FormHistoryChartView.kt @@ -224,7 +224,7 @@ private fun FormHistoryChart.toAnalyticsGraph(): Graph = GraphPoint( eventDate = Date(index.toLong()), position = index.toFloat(), - fieldValue = GraphFieldValue.Numeric(value), + fieldValue = GraphFieldValue.Decimal(value), ) } }, diff --git a/form/src/main/java/org/dhis2/form/ui/Form.kt b/form/src/main/java/org/dhis2/form/ui/Form.kt index cedc99d03b9..d9cc15a9ff3 100644 --- a/form/src/main/java/org/dhis2/form/ui/Form.kt +++ b/form/src/main/java/org/dhis2/form/ui/Form.kt @@ -26,8 +26,8 @@ import androidx.compose.ui.focus.FocusManager import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.testTag +import androidx.compose.ui.res.stringResource import kotlinx.coroutines.launch -import org.dhis2.commons.resources.ResourceManager import org.dhis2.form.R import org.dhis2.form.model.FieldUiModel import org.dhis2.form.model.FormSection @@ -46,7 +46,6 @@ fun Form( sections: List<FormSection> = emptyList(), intentHandler: (FormIntent) -> Unit, uiEventHandler: (RecyclerViewUiEvents) -> Unit, - resources: ResourceManager, ) { val scrollState = rememberLazyListState() val focusManager = LocalFocusManager.current @@ -77,7 +76,8 @@ fun Form( bottomStart = Spacing.Spacing0, bottomEnd = Spacing.Spacing0, ), - ).clickable( + ) + .clickable( interactionSource = remember { MutableInteractionSource() @@ -118,7 +118,7 @@ fun Form( state = section.state, errorCount = section.errors, warningCount = section.warnings, - warningMessage = section.warningMessage?.let { resources.getString(it) }, + warningMessage = section.warningMessage?.let { stringResource(it) }, onNextSection = onNextSection, onSectionClick = { intentHandler.invoke(FormIntent.OnSection(section.uid)) @@ -132,7 +132,6 @@ fun Form( fieldUiModel = fieldUiModel, uiEventHandler = uiEventHandler, intentHandler = intentHandler, - resources = resources, focusManager = focusManager, onNextClicked = { manageOnNextEvent( @@ -164,7 +163,7 @@ fun Form( } } if (shouldDisplayNoFieldsWarning(sections)) { - NoFieldsWarning(resources) + NoFieldsWarning() } } @@ -190,7 +189,7 @@ fun shouldDisplayNoFieldsWarning(sections: List<FormSection>): Boolean = } @Composable -fun NoFieldsWarning(resources: ResourceManager) { +fun NoFieldsWarning() { Column( modifier = Modifier @@ -201,7 +200,7 @@ fun NoFieldsWarning(resources: ResourceManager) { Modifier .clip(shape = RoundedCornerShape(Radius.Full)) .background(SurfaceColor.WarningContainer), - text = resources.getString(R.string.form_without_fields), + text = stringResource(R.string.form_without_fields), icon = { Icon( imageVector = Icons.Outlined.ErrorOutline, diff --git a/form/src/main/java/org/dhis2/form/ui/FormView.kt b/form/src/main/java/org/dhis2/form/ui/FormView.kt index fa5c4a4e82d..e3dc8c2ef91 100644 --- a/form/src/main/java/org/dhis2/form/ui/FormView.kt +++ b/form/src/main/java/org/dhis2/form/ui/FormView.kt @@ -13,8 +13,8 @@ import android.view.ViewGroup import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue -import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue @@ -48,8 +48,8 @@ import org.dhis2.form.data.RulesUtilsProviderConfigurationError import org.dhis2.form.data.scan.ScanContract import org.dhis2.form.data.toMessage import org.dhis2.form.di.Injector -import org.dhis2.form.model.FieldUiModel import org.dhis2.form.model.FormRepositoryRecords +import org.dhis2.form.model.FormSection import org.dhis2.form.model.InfoUiModel import org.dhis2.form.model.RowAction import org.dhis2.form.model.UiRenderType @@ -178,12 +178,7 @@ class FormView : Fragment() { ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed, ) setContent { - val items by viewModel.items.observeAsState() - val sections = - items?.let { - formSectionMapper.mapFromFieldUiModelList(it) - } ?: emptyList() - + val items by viewModel.items.collectAsState(emptyList()) var resultDialogData: FormViewModel.FormActions.ShowResultDialog? by remember { mutableStateOf(null) } @@ -201,12 +196,14 @@ class FormView : Fragment() { } Form( - sections = sections, + sections = items, intentHandler = ::intentHandler, uiEventHandler = ::uiEventHandler, - resources = Injector.provideResourcesManager(context), ) + LaunchedEffect(items) { + render(items) + } resultDialogData?.let { DataEntryBottomSheet( model = it.model, @@ -252,12 +249,6 @@ class FormView : Fragment() { onItemChangeListener?.let { it(rowAction) } } - viewModel.items.observe( - viewLifecycleOwner, - ) { items -> - render(items) - } - viewModel.loading.observe( viewLifecycleOwner, ) { loading -> @@ -293,14 +284,6 @@ class FormView : Fragment() { ) { percentage -> completionListener?.invoke(percentage) } - - viewModel.calculationLoop.observe( - viewLifecycleOwner, - ) { displayLoopWarning -> - if (displayLoopWarning) { - showLoopWarning() - } - } } private fun showInfoDialog(infoUiModel: InfoUiModel) { @@ -315,15 +298,6 @@ class FormView : Fragment() { ).show() } - private fun showLoopWarning() { - MaterialAlertDialogBuilder(requireContext(), R.style.DhisMaterialDialog) - .setTitle(getString(R.string.program_rules_loop_warning_title)) - .setMessage(getString(R.string.program_rules_loop_warning_message)) - .setPositiveButton(R.string.action_accept) { _, _ -> } - .setCancelable(false) - .show() - } - private fun uiEventHandler(uiEvent: RecyclerViewUiEvents) { when (uiEvent) { is RecyclerViewUiEvents.RequestLocationByMap -> requestLocationByMap(uiEvent) @@ -458,10 +432,9 @@ class FormView : Fragment() { } } - private fun render(items: List<FieldUiModel>) { + private fun render(items: List<FormSection>) { viewModel.calculateCompletedFields() viewModel.updateConfigurationErrors() - viewModel.displayLoopWarningIfNeeded() viewModel.onItemsRendered() onFieldItemsRendered?.invoke(items.isEmpty()) } diff --git a/form/src/main/java/org/dhis2/form/ui/FormViewModel.kt b/form/src/main/java/org/dhis2/form/ui/FormViewModel.kt index e1eb21e6108..3c92166b131 100644 --- a/form/src/main/java/org/dhis2/form/ui/FormViewModel.kt +++ b/form/src/main/java/org/dhis2/form/ui/FormViewModel.kt @@ -13,11 +13,15 @@ import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.channels.consumeEach import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.receiveAsFlow +import kotlinx.coroutines.flow.shareIn import kotlinx.coroutines.launch import org.dhis2.commons.date.DateUtils import org.dhis2.commons.dialogs.bottomsheet.BottomSheetDialogUiModel @@ -49,6 +53,7 @@ import org.dhis2.form.model.ValueStoreResult import org.dhis2.form.ui.event.RecyclerViewUiEvents import org.dhis2.form.ui.idling.FormCountingIdlingResource import org.dhis2.form.ui.intent.FormIntent +import org.dhis2.form.ui.mapper.FormSectionMapper import org.dhis2.form.ui.provider.FormResultDialogProvider import org.dhis2.mobile.commons.model.CustomIntentRequestArgumentModel import org.dhis2.mobile.commons.providers.CustomIntentFailure @@ -74,6 +79,7 @@ class FormViewModel( private val geometryController: GeometryController = GeometryController(GeometryParserImpl()), private val openErrorLocation: Boolean = false, private val resultDialogUiProvider: FormResultDialogProvider, + private val formSectionMapper: FormSectionMapper, ) : ViewModel() { val loading = MutableLiveData(true) val showToast = MutableLiveData<Int>() @@ -81,8 +87,12 @@ class FormViewModel( val showInfo = MutableLiveData<InfoUiModel>() val confError = MutableLiveData<List<RulesUtilsProviderConfigurationError>>() var dateFormatConfig: String = "ddMMyyyy" - private val _items = MutableLiveData<List<FieldUiModel>>() - val items: LiveData<List<FieldUiModel>> = _items + + private val _items = MutableSharedFlow<List<FieldUiModel>>() + + val items = _items.map { items -> + formSectionMapper.mapFromFieldUiModelList(items) + }.shareIn(viewModelScope, SharingStarted.Eagerly, 0) var previousActionItem: RowAction? = null @@ -107,9 +117,6 @@ class FormViewModel( private val _completionPercentage = MutableLiveData<Float>() val completionPercentage = _completionPercentage - private val _calculationLoop = MutableLiveData(false) - val calculationLoop = _calculationLoop - private val pendingIntents = MutableSharedFlow<FormIntent>() private val fieldListChannel = @@ -119,6 +126,7 @@ class FormViewModel( ) private val handler = Handler(Looper.getMainLooper()) + private var textChangeDebounceRunnable: Runnable? = null var filePath: String? = null @@ -143,7 +151,7 @@ class FormViewModel( fieldListChannel.consumeEach { fieldListConfiguration -> FormCountingIdlingResource.increment() val result = repository.composeList(fieldListConfiguration.skipProgramRules) - _items.postValue(result) + _items.emit(result) if (fieldListConfiguration.finish) { runDataIntegrityCheck() } @@ -154,6 +162,11 @@ class FormViewModel( loadData() } + override fun onCleared() { + textChangeDebounceRunnable?.let { handler.removeCallbacks(it) } + super.onCleared() + } + private fun displayResult(result: Pair<RowAction, StoreResult>) { result.second.valueStoreResult?.let { when (it) { @@ -302,6 +315,18 @@ class FormViewModel( private fun handleOnTextChangeAction(action: RowAction): StoreResult { repository.updateValueOnList(action.id, action.value, action.valueType) + textChangeDebounceRunnable?.let { handler.removeCallbacks(it) } + textChangeDebounceRunnable = Runnable { + viewModelScope.launch { + pendingIntents.emit( + FormIntent.OnSave( + uid = action.id, + value = action.value, + valueType = action.valueType, + ), + ) + } + }.also { handler.postDelayed(it, 1_000L) } return StoreResult( action.id, ValueStoreResult.TEXT_CHANGING, @@ -436,26 +461,26 @@ class FormViewModel( false } else { valueType.isNumeric || - valueType.isText && - renderType?.isPolygon() != true || - valueType == ValueType.URL || - valueType == ValueType.EMAIL || - valueType == ValueType.PHONE_NUMBER + valueType.isText && + renderType?.isPolygon() != true || + valueType == ValueType.URL || + valueType == ValueType.EMAIL || + valueType == ValueType.PHONE_NUMBER } private fun getLastFocusedTextItem() = repository.currentFocusedItem()?.takeIf { it.optionSet == null && - ( - valueTypeIsTextField( - it.valueType, - it.renderingType, - ) || - it.valueType == ValueType.AGE || - it.valueType == ValueType.DATETIME || - it.valueType == ValueType.DATE || - it.valueType == ValueType.TIME - ) + ( + valueTypeIsTextField( + it.valueType, + it.renderingType, + ) || + it.valueType == ValueType.AGE || + it.valueType == ValueType.DATETIME || + it.valueType == ValueType.DATE || + it.valueType == ValueType.TIME + ) } private fun rowActionFromIntent(intent: FormIntent): RowAction = @@ -833,7 +858,7 @@ class FormViewModel( Timber.e(e) } finally { val list = repository.composeList() - _items.postValue(list) + _items.emit(list) FormCountingIdlingResource.decrement() } } @@ -874,7 +899,7 @@ class FormViewModel( EventStatus.SCHEDULE, EventStatus.VISITED, EventStatus.OVERDUE, - -> FormActions.OnFinish + -> FormActions.OnFinish } private fun provideShowResultDialog(result: DataIntegrityCheckResult): FormActions.ShowResultDialog? = @@ -941,7 +966,9 @@ class FormViewModel( viewModelScope.launch { val result = async(dispatcher.io()) { - repository.completedFieldsPercentage(_items.value ?: emptyList()) + repository.completedFieldsPercentage( + value = _items.firstOrNull() ?: emptyList() + ) } try { _completionPercentage.postValue(result.await()) @@ -969,20 +996,6 @@ class FormViewModel( } } - fun displayLoopWarningIfNeeded() { - viewModelScope.launch { - val result = - async(dispatcher.io()) { - repository.calculationLoopOverLimit() - } - try { - _calculationLoop.postValue(result.await()) - } catch (e: Exception) { - Timber.e(e) - } - } - } - fun discardChanges() { repository.backupOfChangedItems().forEach { submitIntent( @@ -1022,10 +1035,10 @@ class FormViewModel( repository.getDateFormatConfiguration() }.await() try { - _items.postValue(result) + _items.emit(result) } catch (e: Exception) { Timber.e(e) - _items.postValue(emptyList()) + _items.emit(emptyList()) } finally { FormCountingIdlingResource.decrement() } diff --git a/form/src/main/java/org/dhis2/form/ui/FormViewModelFactory.kt b/form/src/main/java/org/dhis2/form/ui/FormViewModelFactory.kt index aecfa9def13..ec0773d9b5e 100644 --- a/form/src/main/java/org/dhis2/form/ui/FormViewModelFactory.kt +++ b/form/src/main/java/org/dhis2/form/ui/FormViewModelFactory.kt @@ -4,6 +4,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import org.dhis2.commons.viewmodel.DispatcherProvider import org.dhis2.form.data.FormRepository +import org.dhis2.form.ui.mapper.FormSectionMapper import org.dhis2.form.ui.provider.FormResultDialogProvider class FormViewModelFactory( @@ -11,6 +12,7 @@ class FormViewModelFactory( private val dispatcher: DispatcherProvider, private val openErrorLocation: Boolean, private val resultDialogUiProvider: FormResultDialogProvider, + private val formSectionMapper: FormSectionMapper, ) : ViewModelProvider.Factory { override fun <T : ViewModel> create(modelClass: Class<T>): T = FormViewModel( @@ -18,5 +20,6 @@ class FormViewModelFactory( dispatcher = dispatcher, openErrorLocation = openErrorLocation, resultDialogUiProvider = resultDialogUiProvider, + formSectionMapper = formSectionMapper, ) as T } diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/AgeProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/AgeProvider.kt index a7414fa1c45..f7bae8c565b 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/AgeProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/AgeProvider.kt @@ -7,9 +7,9 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.input.TextFieldValue -import org.dhis2.commons.resources.ResourceManager import org.dhis2.form.R import org.dhis2.form.extensions.inputState import org.dhis2.form.extensions.legend @@ -34,7 +34,6 @@ fun ProvideInputAge( inputStyle: InputStyle, fieldUiModel: FieldUiModel, intentHandler: (FormIntent) -> Unit, - resources: ResourceManager, onNextClicked: () -> Unit, ) { var inputType by remember { @@ -96,11 +95,11 @@ fun ProvideInputAge( title = fieldUiModel.label, inputStyle = inputStyle, isRequired = fieldUiModel.mandatory, - dateOfBirthLabel = resources.getString(R.string.date_birth), - orLabel = resources.getString(R.string.or), - ageLabel = resources.getString(R.string.age), - cancelText = resources.getString(R.string.cancel), - acceptText = resources.getString(R.string.ok), + dateOfBirthLabel = stringResource(R.string.date_birth), + orLabel = stringResource(R.string.or), + ageLabel = stringResource(R.string.age), + cancelText = stringResource(R.string.cancel), + acceptText = stringResource(R.string.ok), selectableDates = fieldUiModel.selectableDates, ), inputType = inputType, @@ -151,7 +150,7 @@ fun ProvideInputAge( } } }, - onNextClicked = onNextClicked, + onImeActionClick = { onNextClicked() }, modifier = modifier, ) } diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/CheckBoxProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/CheckBoxProvider.kt index 5d90a72c3ed..2e920ed081a 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/CheckBoxProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/CheckBoxProvider.kt @@ -2,8 +2,8 @@ package org.dhis2.form.ui.provider.inputfield import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource import androidx.paging.compose.collectAsLazyPagingItems -import org.dhis2.commons.resources.ResourceManager import org.dhis2.form.R import org.dhis2.form.extensions.inputState import org.dhis2.form.extensions.legend @@ -77,7 +77,6 @@ internal fun ProvideYesNoCheckBoxInput( inputStyle: InputStyle, fieldUiModel: FieldUiModel, intentHandler: (FormIntent) -> Unit, - resources: ResourceManager, ) { val data = listOf( @@ -85,13 +84,13 @@ internal fun ProvideYesNoCheckBoxInput( uid = "true", checked = fieldUiModel.isAffirmativeChecked, enabled = true, - textInput = resources.getString(R.string.yes), + textInput = stringResource(R.string.yes), ), CheckBoxData( uid = "false", checked = fieldUiModel.isNegativeChecked, enabled = true, - textInput = resources.getString(R.string.no), + textInput = stringResource(R.string.no), ), ) diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/CoordinatesProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/CoordinatesProvider.kt index 7b7a677e104..8b07c757062 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/CoordinatesProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/CoordinatesProvider.kt @@ -2,7 +2,7 @@ package org.dhis2.form.ui.provider.inputfield import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import org.dhis2.commons.resources.ResourceManager +import androidx.compose.ui.res.stringResource import org.dhis2.form.R import org.dhis2.form.extensions.inputState import org.dhis2.form.extensions.legend @@ -42,7 +42,6 @@ fun ProvideInputCoordinate( fieldUiModel: FieldUiModel, intentHandler: (FormIntent) -> Unit, uiEventHandler: (RecyclerViewUiEvents) -> Unit, - resources: ResourceManager, ) { InputCoordinate( title = fieldUiModel.label, @@ -50,9 +49,9 @@ fun ProvideInputCoordinate( supportingText = fieldUiModel.supportingText(), legendData = fieldUiModel.legend(), coordinates = mapGeometry(fieldUiModel.value, FeatureType.POINT), - latitudeText = resources.getString(R.string.latitude), - longitudeText = resources.getString(R.string.longitude), - addLocationBtnText = resources.getString(R.string.add_location), + latitudeText = stringResource(R.string.latitude), + longitudeText = stringResource(R.string.longitude), + addLocationBtnText = stringResource(R.string.add_location), isRequired = fieldUiModel.mandatory, modifier = modifier, onResetButtonClicked = { diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/CustomIntentProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/CustomIntentProvider.kt index fa534c50f1b..58b45e85ac2 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/CustomIntentProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/CustomIntentProvider.kt @@ -12,11 +12,11 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshots.SnapshotStateList import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource import androidx.compose.ui.platform.LocalContext import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.compose.LocalLifecycleOwner -import org.dhis2.commons.resources.ResourceManager import org.dhis2.form.R import org.dhis2.form.di.Injector import org.dhis2.form.extensions.inputState @@ -38,7 +38,6 @@ import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextState @Composable fun ProvideCustomIntentInput( fieldUiModel: FieldUiModel, - resources: ResourceManager, intentHandler: (FormIntent) -> Unit, uiEventHandler: (RecyclerViewUiEvents) -> Unit, inputStyle: InputStyle, @@ -58,7 +57,7 @@ fun ProvideCustomIntentInput( val errorGettingDataMessage = SupportingTextData( state = SupportingTextState.ERROR, - text = resources.getString(R.string.custom_intent_error), + text = stringResource(R.string.custom_intent_error), ) val fieldErrorMessage = SupportingTextData( @@ -79,7 +78,6 @@ fun ProvideCustomIntentInput( val simprintsCustomIntentFormPresenter = rememberSimprintsCustomIntentFormPresenter( fieldUiModel = fieldUiModel, - resources = resources, sessionRepository = simprintsSessionRepository, ) @@ -144,9 +142,10 @@ fun ProvideCustomIntentInput( } } } + val defaultLauncherTitle = stringResource(R.string.select_app_intent) InputCustomIntent( title = fieldUiModel.label, - buttonText = resources.getString(R.string.custom_intent_launch), + buttonText = stringResource(R.string.custom_intent_launch), supportingText = supportingTextList.toList(), inputShellState = inputShellState, inputStyle = inputStyle, @@ -182,12 +181,12 @@ fun ProvideCustomIntentInput( if (supportingTextList.contains(errorGettingDataMessage)) { supportingTextList.remove(errorGettingDataMessage) } - fieldUiModel.customIntent?.let { + fieldUiModel.customIntent?.let { customIntent -> launcher.launch( CustomIntentInput( fieldUid = fieldUiModel.uid, - customIntent = it, - defaultTitle = fieldUiModel.customIntent?.name ?: resources.getString(R.string.select_app_intent), + customIntent = customIntent, + defaultTitle = customIntent.name ?: defaultLauncherTitle, ), ) } diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/DateProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/DateProvider.kt index 868804d8474..f9a65c4df6d 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/DateProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/DateProvider.kt @@ -105,7 +105,7 @@ fun ProvideInputDate( } intentHandler.invoke(formIntent) }, - onNextClicked = onNextClicked, + onImeActionClick = { onNextClicked() }, ) } diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/FieldProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/FieldProvider.kt index 9c3bd975e6a..16787e13cf8 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/FieldProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/FieldProvider.kt @@ -27,7 +27,6 @@ import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.TextFieldValue import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import org.dhis2.commons.resources.ResourceManager import org.dhis2.form.data.EventRepository.Companion.EVENT_ORG_UNIT_UID import org.dhis2.form.extensions.autocompleteList import org.dhis2.form.extensions.inputState @@ -61,11 +60,10 @@ import org.hisp.dhis.mobile.ui.designsystem.component.model.RegExValidations @Composable fun FieldProvider( modifier: Modifier, - inputStyle: InputStyle = InputStyle.DataInputStyle(), + inputStyle: InputStyle = InputStyle.DarkInputStyle(), fieldUiModel: FieldUiModel, uiEventHandler: (RecyclerViewUiEvents) -> Unit, intentHandler: (FormIntent) -> Unit, - resources: ResourceManager, focusManager: FocusManager, onNextClicked: () -> Unit, onFileSelected: (String) -> Unit, @@ -142,15 +140,14 @@ fun FieldProvider( value = fieldUiModel.value, ), ) - }, - ) + }, + ) fieldUiModel.customIntent != null -> { ProvideCustomIntentInput( fieldUiModel = fieldUiModel, intentHandler = fieldIntentHandler, uiEventHandler = uiEventHandler, - resources = resources, inputStyle = inputStyle, reEvaluateRequestParams = reEvaluateCustomIntentRequestParameters, modifier = modifierWithFocus, @@ -171,7 +168,6 @@ fun FieldProvider( fieldUiModel = fieldUiModel, intentHandler = fieldIntentHandler, uiEventHandler = uiEventHandler, - resources = resources, focusRequester = focusRequester, onNextClicked = onNextClicked, focusManager = focusManager, @@ -189,7 +185,6 @@ fun ProvideByValueType( fieldUiModel: FieldUiModel, intentHandler: (FormIntent) -> Unit, uiEventHandler: (RecyclerViewUiEvents) -> Unit, - resources: ResourceManager, focusRequester: FocusRequester, onNextClicked: () -> Unit, focusManager: FocusManager, @@ -332,7 +327,6 @@ fun ProvideByValueType( ProvideInputFileResource( modifier = modifier, fieldUiModel = fieldUiModel, - resources = resources, onFileSelected = onFileSelected, uiEventHandler = uiEventHandler, ) @@ -360,7 +354,6 @@ fun ProvideByValueType( inputStyle = inputStyle, fieldUiModel = fieldUiModel, intentHandler = intentHandler, - resources = resources, ) } @@ -370,7 +363,6 @@ fun ProvideByValueType( inputStyle = inputStyle, fieldUiModel = fieldUiModel, intentHandler = intentHandler, - resources = resources, ) } } @@ -452,7 +444,6 @@ fun ProvideByValueType( fieldUiModel = fieldUiModel, intentHandler = intentHandler, uiEventHandler = uiEventHandler, - resources = resources, onFileSelected = onFileSelected, ) } @@ -474,7 +465,6 @@ fun ProvideByValueType( fieldUiModel = fieldUiModel, intentHandler = intentHandler, uiEventHandler = uiEventHandler, - resources = resources, ) } } @@ -486,7 +476,6 @@ fun ProvideByValueType( inputStyle = inputStyle, fieldUiModel = fieldUiModel, intentHandler = intentHandler, - resources = resources, onNextClicked = onNextClicked, ) } @@ -607,7 +596,7 @@ private fun ProvideIntegerPositive( legendData = fieldUiModel.legend(), inputTextFieldValue = value, isRequiredField = fieldUiModel.mandatory, - onNextClicked = { + onImeActionClick = { clickedOnNext = true onNextClicked() }, @@ -676,7 +665,7 @@ private fun ProvideIntegerPositiveOrZero( legendData = fieldUiModel.legend(), inputTextFieldValue = value, isRequiredField = fieldUiModel.mandatory, - onNextClicked = { + onImeActionClick = { clickedOnNext = true onNextClicked() }, @@ -745,7 +734,7 @@ private fun ProvidePercentage( legendData = fieldUiModel.legend(), inputTextFieldValue = value, isRequiredField = fieldUiModel.mandatory, - onNextClicked = { + onImeActionClick = { clickedOnNext = true onNextClicked() }, @@ -814,7 +803,7 @@ private fun ProvideNumber( legendData = fieldUiModel.legend(), inputTextFieldValue = value, isRequiredField = fieldUiModel.mandatory, - onNextClicked = { + onImeActionClick = { clickedOnNext = true onNextClicked() }, @@ -888,7 +877,7 @@ private fun ProvideIntegerNegative( legendData = fieldUiModel.legend(), inputTextFieldValue = value, isRequiredField = fieldUiModel.mandatory, - onNextClicked = { + onImeActionClick = { clickedOnNext = true onNextClicked() }, @@ -957,9 +946,13 @@ private fun ProvideLongText( legendData = fieldUiModel.legend(), inputTextFieldValue = value, isRequiredField = fieldUiModel.mandatory, - onNextClicked = { - clickedOnNext = true - onNextClicked() + onImeActionClick = { imeAction -> + when (imeAction) { + ImeAction.Next -> { + clickedOnNext = true + onNextClicked() + } + } }, onValueChanged = { value = it ?: TextFieldValue() @@ -1027,7 +1020,7 @@ private fun ProvideLetter( legendData = fieldUiModel.legend(), inputTextFieldValue = value, isRequiredField = fieldUiModel.mandatory, - onNextClicked = { + onImeActionClick = { clickedOnNext = true onNextClicked() }, @@ -1096,7 +1089,7 @@ private fun ProvideInteger( legendData = fieldUiModel.legend(), inputTextFieldValue = value, isRequiredField = fieldUiModel.mandatory, - onNextClicked = { + onImeActionClick = { clickedOnNext = true onNextClicked() }, @@ -1166,7 +1159,7 @@ private fun ProvideEmail( legendData = fieldUiModel.legend(), inputTextFieldValue = value, isRequiredField = fieldUiModel.mandatory, - onNextClicked = { + onImeActionClick = { clickedOnNext = true onNextClicked() }, @@ -1245,7 +1238,7 @@ private fun ProvideInputPhoneNumber( legendData = fieldUiModel.legend(), inputTextFieldValue = value, isRequiredField = fieldUiModel.mandatory, - onNextClicked = { + onImeActionClick = { clickedOnNext = true onNextClicked() }, @@ -1324,7 +1317,7 @@ private fun ProvideInputLink( legendData = fieldUiModel.legend(), inputTextFieldValue = value, isRequiredField = fieldUiModel.mandatory, - onNextClicked = { + onImeActionClick = { clickedOnNext = true onNextClicked() }, diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/ImageInputProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/ImageInputProvider.kt index b419091e208..713c1cc5d66 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/ImageInputProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/ImageInputProvider.kt @@ -12,8 +12,8 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.painter.BitmapPainter import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource import androidx.core.content.ContextCompat -import org.dhis2.commons.resources.ResourceManager import org.dhis2.form.R import org.dhis2.form.extensions.inputState import org.dhis2.form.extensions.legend @@ -32,7 +32,6 @@ import org.hisp.dhis.mobile.ui.designsystem.component.UploadState internal fun ProvideInputImage( modifier: Modifier, fieldUiModel: FieldUiModel, - resources: ResourceManager, intentHandler: (FormIntent) -> Unit, uiEventHandler: (RecyclerViewUiEvents) -> Unit, onFileSelected: (filePath: String) -> Unit, @@ -75,7 +74,7 @@ internal fun ProvideInputImage( state = fieldUiModel.inputState(), supportingText = fieldUiModel.supportingText(), legendData = fieldUiModel.legend(), - addImageBtnText = resources.getString(R.string.add_image), + addImageBtnText = stringResource(R.string.add_image), isRequired = fieldUiModel.mandatory, uploadState = uploadState, painterFor = { remember { it!! } }, @@ -113,8 +112,8 @@ internal fun ProvideInputImage( ImagePickerOptionsDialog( title = fieldUiModel.label, showImageOptions = showImageOptions, - cameraButtonLabel = resources.getString(R.string.take_photo), - galleryButtonLabel = resources.getString(R.string.from_gallery_v2), + cameraButtonLabel = stringResource(R.string.take_photo), + galleryButtonLabel = stringResource(R.string.from_gallery_v2), onDismiss = { showImageOptions = false }, onTakePicture = { if (ContextCompat.checkSelfPermission( diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/InputFileProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/InputFileProvider.kt index 87dc4266e68..7e20ff9d99d 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/InputFileProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/InputFileProvider.kt @@ -7,7 +7,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier -import org.dhis2.commons.resources.ResourceManager +import androidx.compose.ui.res.stringResource import org.dhis2.form.R import org.dhis2.form.extensions.inputState import org.dhis2.form.extensions.legend @@ -24,7 +24,6 @@ import java.text.DecimalFormat internal fun ProvideInputFileResource( modifier: Modifier, fieldUiModel: FieldUiModel, - resources: ResourceManager, onFileSelected: (filePath: String) -> Unit, uiEventHandler: (RecyclerViewUiEvents) -> Unit, ) { @@ -45,7 +44,7 @@ internal fun ProvideInputFileResource( title = fieldUiModel.label, inputShellState = fieldUiModel.inputState(), supportingText = fieldUiModel.supportingText(), - buttonText = resources.getString(R.string.add_file), + buttonText = stringResource(R.string.add_file), uploadFileState = uploadState, fileName = file?.name, fileWeight = file?.length()?.let { fileSizeLabel(it) }, diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/InputsForTextValueTypeProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/InputsForTextValueTypeProvider.kt index 4cb4471e7ea..5fae08416fc 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/InputsForTextValueTypeProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/InputsForTextValueTypeProvider.kt @@ -102,7 +102,7 @@ private fun ProvideQRInput( inputTextFieldValue = value, inputStyle = inputStyle, isRequiredField = fieldUiModel.mandatory, - onNextClicked = { + onImeActionClick = { clickedOnNext = true onNextClicked() }, @@ -159,7 +159,7 @@ private fun ProvideQRInput( @Composable private fun ProvideDefaultTextInput( modifier: Modifier, - inputStyle: InputStyle = InputStyle.DataInputStyle(), + inputStyle: InputStyle = InputStyle.DarkInputStyle(), fieldUiModel: FieldUiModel, intentHandler: (FormIntent) -> Unit, focusManager: FocusManager, @@ -187,7 +187,7 @@ private fun ProvideDefaultTextInput( inputTextFieldValue = value, inputStyle = inputStyle, isRequiredField = fieldUiModel.mandatory, - onNextClicked = { + onImeActionClick = { clickedOnNext = true onNextClicked() }, @@ -252,7 +252,7 @@ private fun ProvideBarcodeInput( legendData = fieldUiModel.legend(), inputTextFieldValue = value, isRequiredField = fieldUiModel.mandatory, - onNextClicked = { + onImeActionClick = { clickedOnNext = true onNextClicked() }, diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/RadioButtonProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/RadioButtonProvider.kt index 5769e35abc8..d0cb1b28b11 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/RadioButtonProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/RadioButtonProvider.kt @@ -2,8 +2,8 @@ package org.dhis2.form.ui.provider.inputfield import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource import androidx.paging.compose.collectAsLazyPagingItems -import org.dhis2.commons.resources.ResourceManager import org.dhis2.form.R import org.dhis2.form.extensions.inputState import org.dhis2.form.extensions.legend @@ -76,7 +76,6 @@ internal fun ProvideYesNoRadioButtonInput( inputStyle: InputStyle, fieldUiModel: FieldUiModel, intentHandler: (FormIntent) -> Unit, - resources: ResourceManager, ) { val data = listOf( @@ -84,13 +83,13 @@ internal fun ProvideYesNoRadioButtonInput( uid = "true", selected = fieldUiModel.isAffirmativeChecked, enabled = true, - textInput = resources.getString(R.string.yes), + textInput = stringResource(R.string.yes), ), RadioButtonData( uid = "false", selected = fieldUiModel.isNegativeChecked, enabled = true, - textInput = resources.getString(R.string.no), + textInput = stringResource(R.string.no), ), ) diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/UnitIntervalInputProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/UnitIntervalInputProvider.kt index b2e317aa419..b9331718646 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/UnitIntervalInputProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/UnitIntervalInputProvider.kt @@ -39,7 +39,7 @@ fun ProvideUnitIntervalInput( legendData = fieldUiModel.legend(), inputTextFieldValue = value, isRequiredField = fieldUiModel.mandatory, - onNextClicked = onNextClicked, + onImeActionClick = { onNextClicked() }, onValueChanged = { value = it ?: TextFieldValue() intentHandler( diff --git a/form/src/main/res/values-ar-rIQ/strings.xml b/form/src/main/res/values-ar-rIQ/strings.xml index 9b49034757a..db4300cab91 100644 --- a/form/src/main/res/values-ar-rIQ/strings.xml +++ b/form/src/main/res/values-ar-rIQ/strings.xml @@ -1,13 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <resources> <string name="error">خطأ</string> - <string name="date">التاريخ</string> - <string name="hint_year">السنوات</string> - <string name="hint_month">الأشهر</string> - <string name="hint_day">‏‏الأيام</string> <string name="due_date">تاريخ الاستحقاق</string> <string name="complete">مكتمل</string> - <string name="save_anyway">حفظ على اية حال</string> <string name="share">مشاركة</string> <string name="action_close">إغلاق</string> <string name="incident_date">تاريخ الواقعة</string> diff --git a/form/src/main/res/values-ar/strings.xml b/form/src/main/res/values-ar/strings.xml index f2a7b265f59..dea6bedbd9c 100644 --- a/form/src/main/res/values-ar/strings.xml +++ b/form/src/main/res/values-ar/strings.xml @@ -10,16 +10,9 @@ <string name="missing_warning_fields_completed_events">لديك بعض الرسائل التحذيرية.</string> <string name="missing_warning_fields_events">لديك بعض الرسائل التحذيرية.\nهل تريد وضع علامة \"مكتمل\" على هذا النموذج؟</string> <string name="required">مطلوب</string> - <string name="date">التاريخ</string> - <string name="hint_year">السنوات</string> - <string name="hint_month">الأشهر</string> - <string name="hint_day">‏‏الأيام</string> - <string name="wrong_date_format">لا يمكن تحليل %s كتاريخ</string> <string name="polygon">مضلع</string> <string name="latitude">خط العرض</string> <string name="longitude">خط الطول</string> - <string name="coordinates_error">قيم الإحداثيات غير صالحة</string> - <string name="polygon_captured">تم التقاط المضلع</string> <string name="enter_value">أدخل قيمة</string> <string name="enter_url">أدخل رابط url</string> <string name="enter_email">أدخل بريداً إلكترونياً</string> @@ -34,9 +27,6 @@ <string name="enter_long_text">أدخل نصًا طويلاً</string> <string name="enter_text">أدخل نصًا</string> <string name="due_date">تاريخ الاستحقاق</string> - <string name="mandatory_field">حقل الزامي</string> - <string name="form_latitude_prefix">خط العرض:</string> - <string name="form_longitude_prefix">خط الطول:</string> <string name="not_saved">لم يتم حفظه</string> <string name="review">المراجعة</string> <string name="complete">مكتمل</string> @@ -46,19 +36,16 @@ <string name="missing_error_fields_events">بعض الحقول بها أخطاء ولم يتم حفظها. \nهل تريد مراجعة النموذج؟</string> <string name="review_message">بعض الحقول تحتاج إلى انتباهك.\nهل تريد مراجعة النموذج؟</string> <string name="not_now">ليس الان</string> - <string name="save_anyway">حفظ على اية حال</string> <string name="keep_editing">استمر في التعديل</string> <string name="event_can_be_completed">هل تريد وضع علامة على هذا النموذج كمكتمل؟</string> <string name="discard_go_back">إذا قمت بالخروج الآن ، فسيتم تجاهل جميع المعلومات الموجودة في النموذج.</string> - <string name="field_errors_not_saved_discard">تحتوي بعض الحقول على أخطاء ولا يتم حفظها. \nإذا قمت بالخروج الآن سيتم تجاهل التغييرات.</string> <string name="field_errors_not_saved">بعض الحقول بها أخطاء ولم يتم حفظها.</string> <string name="fields_mandatory_missing">بعض الحقول الإلزامية غير مدخله ولا يمكن حفظ النموذج.</string> <string name="fields_mandatory_missing_discard">بعض الحقول الإلزامية مفقودة ولا يمكن حفظ النموذج. \nإذا قمت بالخروج الآن سيتم تجاهل التغييرات.</string> + <string name="field_errors_not_saved_discard">بعض الحقول بها أخطاء ولم يتم حفظها. \n إذا قمت بالخروج الآن ، فسيتم تجاهل التغييرات.</string> <string name="share">مشاركة</string> <string name="action_close">إغلاق</string> - <string name="program_rules_loop_warning_title">تحذير قواعد البرنامج</string> <string name="copied_text">تم النسخ</string> - <string name="empty_description">لا توجد معلومات عن هذا الحقل</string> <string name="take_photo">التقط صورة</string> <string name="warning_error_on_complete_title">تحقق من هذا!</string> <string name="action_do_not_show_again">لا تظهر مرة أخرى</string> @@ -69,7 +56,6 @@ <string name="incident_date">تاريخ الحدوث</string> <string name="download">تنزيل</string> <string name="scan">المسح الضوئي</string> - <string name="qr_code">رمز الاستجابة السريعة</string> <string name="add_location">إضافة موقع</string> <string name="org_unit">الوحدة التنظيمية</string> <string name="coordinates">الإحداثيات</string> diff --git a/form/src/main/res/values-bn/strings.xml b/form/src/main/res/values-bn/strings.xml index cf7928a2412..4d5737571b2 100644 --- a/form/src/main/res/values-bn/strings.xml +++ b/form/src/main/res/values-bn/strings.xml @@ -1,6 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <resources> <string name="error">ভুল</string> - <string name="date">তারিখ</string> <string name="due_date">নির্ধারিত তারিখ</string> </resources> \ No newline at end of file diff --git a/form/src/main/res/values-ckb/strings.xml b/form/src/main/res/values-ckb/strings.xml index a3b258aaab8..c6769fb51fd 100644 --- a/form/src/main/res/values-ckb/strings.xml +++ b/form/src/main/res/values-ckb/strings.xml @@ -2,12 +2,7 @@ <resources> <string name="error">هەڵە</string> <string name="required">ثيويست</string> - <string name="date">بەروار</string> - <string name="hint_year">ساڵەکان</string> - <string name="hint_month">مانگەکان</string> - <string name="hint_day">رۆژەکان</string> <string name="complete">تەواوبکە</string> - <string name="save_anyway">بەهەرحاڵ تۆماری بکە</string> <string name="action_close">داخستن</string> <string name="no_reserved_values">هیچ نرخێکی دیکەی تەرخانکراو نەما. پەیوەندی بە بەڕێوەبەری سیستەمەکەتەوە بکە</string> </resources> \ No newline at end of file diff --git a/form/src/main/res/values-cs/strings.xml b/form/src/main/res/values-cs/strings.xml index 797b1fe99b8..959afd7d3a0 100644 --- a/form/src/main/res/values-cs/strings.xml +++ b/form/src/main/res/values-cs/strings.xml @@ -12,16 +12,9 @@ <string name="missing_warning_fields_completed_events">Máte několik varovných hlášení.</string> <string name="missing_warning_fields_events">Máte několik varovných hlášení.\nChcete tento formulář označit jako dokončený\?</string> <string name="required">Vyžadováno</string> - <string name="date">datum</string> - <string name="hint_year">Let</string> - <string name="hint_month">Měsíce</string> - <string name="hint_day">Dnů</string> - <string name="wrong_date_format">%s nelze analyzovat jako datum</string> <string name="polygon">Polygon</string> <string name="latitude">Zeměpisná šířka</string> <string name="longitude">Zeměpisná délka</string> - <string name="coordinates_error">Hodnoty souřadnic nejsou platné</string> - <string name="polygon_captured">Polygon zaznamenán</string> <string name="enter_value">Zadejte hodnotu</string> <string name="enter_url">Zadejte url</string> <string name="enter_email">Zadejte e-mail</string> @@ -36,9 +29,6 @@ <string name="enter_long_text">Zadejte dlouhý text</string> <string name="enter_text">Zadejte text</string> <string name="due_date">Datum vypršení</string> - <string name="mandatory_field">Povinné pole</string> - <string name="form_latitude_prefix">Šířka:</string> - <string name="form_longitude_prefix">Délka:</string> <string name="not_saved">Neuloženo</string> <string name="review">Posouzení</string> <string name="complete">Dokončit</string> @@ -48,21 +38,17 @@ <string name="missing_error_fields_events">Některá pole obsahují chyby a neukládají se. \nChcete formulář zkontrolovat\?</string> <string name="review_message">Některé oblasti vyžadují vaši pozornost.\nChcete formulář zkontrolovat\?</string> <string name="not_now">Teď ne</string> - <string name="save_anyway">Přesto uložit</string> <string name="keep_editing">Pokračovat v úpravách</string> <string name="event_can_be_completed">Chcete tento formulář označit jako vyplněný?</string> <string name="discard_go_back">Pokud nyní odejdete, všechny informace ve formuláři budou zahozeny.</string> - <string name="field_errors_not_saved_discard">Některá pole obsahují chyby a neukládají se. \nPokud je nyní ukončíte, změny budou zrušeny.</string> <string name="field_errors_not_saved">Některá pole obsahují chyby a neuloží se.</string> <string name="fields_mandatory_missing">Některá povinná pole chybí a formulář nelze uložit.</string> <string name="fields_mandatory_missing_discard">Chybí některá povinná pole a formulář nelze uložit. \nPokud nyní formulář ukončíte, změny budou zrušeny.</string> + <string name="field_errors_not_saved_discard">Některá pole obsahují chyby a neuloží se. \nPokud nyní skončíte, změny budou zahozeny.</string> <string name="share">Sdílet</string> <string name="camera_permission_denied">Povolení k použití kamery je zamítnuto.\nChcete-li tuto funkci používat, musíte ji povolit.</string> <string name="action_close">Zavřít</string> - <string name="program_rules_loop_warning_title">Upozornění na pravidla programu</string> - <string name="program_rules_loop_warning_message">Došlo k problému s konfigurací, který způsobuje smyčku v pravidlech. Kontaktujte svého správce.</string> <string name="copied_text">Zkopírováno</string> - <string name="empty_description">Žádné informace pro toto pole</string> <string name="take_photo">Vyfotit</string> <string name="from_gallery_v2">Z galerie</string> <string name="warning_error_on_complete_title">Zkontrolovat to!</string> @@ -72,13 +58,10 @@ <string name="tei_coordinates">Souřadnice pro</string> <string name="no_reserved_values">Neexistují žádné další rezervované hodnoty. Obraťte se na správce systému</string> <string name="incident_date">Datum incidentu</string> - <string name="location_permission_denied">Pro zachycení souřadnic je potřeba oprávnění k poloze. Povolte je prosím v nastavení aplikace</string> <string name="open_with">Otevřít s</string> <string name="no_option_found">Nenalezena žádná možnost</string> <string name="download">Stáhnout</string> <string name="scan">Skenování</string> - <string name="qr_code">QR kód</string> - <string name="bar_code">Čárový kód</string> <string name="add_location">Přidat umístění</string> <string name="form_without_fields">Tento formulář nemá nakonfigurovaná žádná pole</string> <string name="event_details_section_title">Podrobnosti %s</string> diff --git a/form/src/main/res/values-da/strings.xml b/form/src/main/res/values-da/strings.xml index 7945b4308bb..dfc69377b92 100644 --- a/form/src/main/res/values-da/strings.xml +++ b/form/src/main/res/values-da/strings.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <resources> <string name="error">Error</string> - <string name="date">Date</string> <string name="due_date">Due date</string> <string name="action_close">Close</string> <string name="incident_date">Incident date</string> diff --git a/form/src/main/res/values-en-rUS/strings.xml b/form/src/main/res/values-en-rUS/strings.xml index 4f419438db0..b6b3ecf89fe 100644 --- a/form/src/main/res/values-en-rUS/strings.xml +++ b/form/src/main/res/values-en-rUS/strings.xml @@ -11,16 +11,9 @@ <string name="field_is_mandatory">This field is mandatory</string> <string name="missing_warning_fields_completed_events">You have some warning messages.</string> <string name="required">Required</string> - <string name="date">Date</string> - <string name="hint_year">Years</string> - <string name="hint_month">Months</string> - <string name="hint_day">Days</string> - <string name="wrong_date_format">%s can\'t be parsed as a date</string> <string name="polygon">Polygon</string> <string name="latitude">Latitude</string> <string name="longitude">Longitude</string> - <string name="coordinates_error">Coordinates values are not valid</string> - <string name="polygon_captured">Polygon captured</string> <string name="enter_value">Enter value</string> <string name="enter_url">Enter url</string> <string name="enter_email">Enter email</string> @@ -35,27 +28,18 @@ <string name="enter_long_text">Enter long text</string> <string name="enter_text">Enter text</string> <string name="due_date">Due date</string> - <string name="mandatory_field">Mandatory field</string> - <string name="form_latitude_prefix">Lat:</string> - <string name="form_longitude_prefix">Long:</string> <string name="not_saved">Not saved</string> <string name="review">Review</string> <string name="complete">Complete</string> <string name="discard_changes">Discard changes</string> <string name="saved">Saved!</string> <string name="not_now">Not now</string> - <string name="save_anyway">Save anyway</string> <string name="keep_editing">Keep editing</string> <string name="event_can_be_completed">Do you want to mark this form as complete?</string> <string name="discard_go_back">If you exit now all the information in the form will be discarded.</string> - <string name="field_errors_not_saved">Some fields have errors and they are not saved.</string> - <string name="fields_mandatory_missing">Some mandatory fields are missing and the form cannot be saved.</string> <string name="share">Share</string> <string name="action_close">Close</string> - <string name="program_rules_loop_warning_title">Program rules warning</string> - <string name="program_rules_loop_warning_message">There is a configuration issue causing a loop in the rules. Contact you administrator.</string> <string name="copied_text">Copied</string> - <string name="empty_description">No info for this field</string> <string name="take_photo">Take Photo</string> <string name="from_gallery_v2">From gallery</string> <string name="warning_error_on_complete_title">Check this!</string> @@ -65,13 +49,10 @@ <string name="tei_coordinates">Coordinates for the</string> <string name="no_reserved_values">There are no more reserved values. Contact your system administrator</string> <string name="incident_date">Incident date</string> - <string name="location_permission_denied">The location permission is needed for capturing coordinates. Please, enable them in the application settings</string> <string name="open_with">Open with</string> <string name="no_option_found">No option found</string> <string name="download">Download</string> <string name="scan">Scan</string> - <string name="qr_code">QR code</string> - <string name="bar_code">Bar code</string> <string name="add_location">Add location</string> <string name="form_without_fields">This form has no fields configured</string> <string name="event_details_section_title">%s details</string> diff --git a/form/src/main/res/values-es-rES/strings.xml b/form/src/main/res/values-es-rES/strings.xml index 7bc7a7d781f..88b07f7aa21 100644 --- a/form/src/main/res/values-es-rES/strings.xml +++ b/form/src/main/res/values-es-rES/strings.xml @@ -14,11 +14,10 @@ <string name="hint_month">Meses</string> <string name="hint_day">Días</string> <string name="wrong_date_format">%s no es una fecha válida</string> + <string name="missing_warning_fields_events">Tienes algunos mensajes de alerta.\n¿Desea marcar el formulario como Completo?</string> <string name="polygon">Polígono</string> <string name="latitude">Latitud</string> <string name="longitude">Longitud</string> - <string name="coordinates_error">El valor de las coordenadas no es válido</string> - <string name="polygon_captured">Polígono guardado</string> <string name="enter_value">Introduzca valor</string> <string name="enter_url">Introduzca url</string> <string name="enter_email">Introduzca email</string> @@ -33,27 +32,21 @@ <string name="enter_long_text">Introducir texto largo</string> <string name="enter_text">Introducir texto</string> <string name="due_date">Fecha de vencimiento</string> - <string name="mandatory_field">Campo obligatorio</string> - <string name="form_latitude_prefix">Lat:</string> - <string name="form_longitude_prefix">Long:</string> <string name="not_saved">No guardado</string> <string name="review">Revisar</string> <string name="complete">Completar</string> <string name="discard_changes">Descartar los cambios</string> <string name="saved">¡Guardado!</string> <string name="not_now">Ahora no</string> - <string name="save_anyway">Guardar de todos modos</string> <string name="keep_editing">Seguir editando</string> <string name="event_can_be_completed">¿Desea marcar este formulario como completo?</string> <string name="discard_go_back">Si sale toda la información del formulario será descartada.</string> <string name="field_errors_not_saved">Algunos campos tienen errores y no serán guardados.</string> <string name="fields_mandatory_missing">Algunos campos obligatorios faltan llenarse, el formulario no puede ser guardado</string> + <string name="field_errors_not_saved_discard">Algunos campos tienen errores y no serán guardados. \nSi sale, los cambios serán descartados.</string> <string name="share">Compartir</string> <string name="action_close">Cerrar</string> - <string name="program_rules_loop_warning_title">Advertencia de reglas del programa</string> - <string name="program_rules_loop_warning_message">Hay un problema de configuración que provoca un bucle en las reglas. Póngase en contacto con su administrador.</string> <string name="copied_text">Copiado</string> - <string name="empty_description">No hay información para este campo</string> <string name="take_photo">Tomar foto</string> <string name="warning_error_on_complete_title">¡Importante!</string> <string name="action_do_not_show_again">No volver a mostrar</string> @@ -62,7 +55,6 @@ <string name="tei_coordinates">Coordenadas para</string> <string name="no_reserved_values">No quedan valores reservados. Contacte con el administrador del sistema.</string> <string name="incident_date">Fecha del incidente</string> - <string name="location_permission_denied">Se requiere el permiso de localización para obtener coordenadas. POR FAVOR, habilítelo desde los ajustes del dispositivo.</string> <string name="org_unit">Unidad Organizativa</string> <string name="cat_combo">Cat Combo</string> </resources> \ No newline at end of file diff --git a/form/src/main/res/values-es/strings.xml b/form/src/main/res/values-es/strings.xml index 1e2d4d6e2dd..e10b858837f 100644 --- a/form/src/main/res/values-es/strings.xml +++ b/form/src/main/res/values-es/strings.xml @@ -12,16 +12,9 @@ <string name="missing_warning_fields_completed_events">Tienes algunos mensajes de aviso.</string> <string name="missing_warning_fields_events">Tiene algunos mensajes de advertencia.\n¿Deseas marcar este formulario como completo\?</string> <string name="required">Necesario</string> - <string name="date">Fecha</string> - <string name="hint_year">Años</string> - <string name="hint_month">Meses</string> - <string name="hint_day">Días</string> - <string name="wrong_date_format">%s no es una fecha válida</string> <string name="polygon">Polígono</string> <string name="latitude">Latitud</string> <string name="longitude">Longitud</string> - <string name="coordinates_error">El valor de las coordenadas no es válido</string> - <string name="polygon_captured">Polígono guardado</string> <string name="enter_value">Introduzca valor</string> <string name="enter_url">Introduzca url</string> <string name="enter_email">Introduzca email</string> @@ -36,9 +29,6 @@ <string name="enter_long_text">Introducir texto largo</string> <string name="enter_text">Introducir texto</string> <string name="due_date">Fecha de vencimiento</string> - <string name="mandatory_field">Campo obligatorio</string> - <string name="form_latitude_prefix">Lat:</string> - <string name="form_longitude_prefix">Long:</string> <string name="not_saved">No guardado</string> <string name="review">Revisar</string> <string name="complete">Completar</string> @@ -48,21 +38,17 @@ <string name="missing_error_fields_events">Algunos campos tienen errores y no se han guardado.\n¿Deseas revisar el formulario\?</string> <string name="review_message">Algunos campos necesitan tu atención.\n¿Deseas revisar el formulario\?</string> <string name="not_now">Ahora no</string> - <string name="save_anyway">Guardar de todos modos</string> <string name="keep_editing">Seguir editando</string> <string name="event_can_be_completed">¿Desea marcar este formulario como completo?</string> <string name="discard_go_back">Si sale toda la información del formulario será descartada.</string> - <string name="field_errors_not_saved_discard">Algunos campos presentan errores y no se han guardado.\nSi sales ahora, los cambios se descartarán.</string> <string name="field_errors_not_saved">Algunos campos tienen errores y no serán guardados.</string> <string name="fields_mandatory_missing">Algunos campos obligatorios faltan llenarse, el formulario no puede ser guardado</string> <string name="fields_mandatory_missing_discard">Faltan algunos campos obligatorios y el formulario no puede guardarse.\nSi sales ahora, los cambios se descartarán.</string> + <string name="field_errors_not_saved_discard">Algunos campos tienen errores y no serán guardados. \nSi sale, los cambios serán descartados.</string> <string name="share">Compartir</string> <string name="camera_permission_denied">El permiso de cámara está denegado.\nDebes activarlo para usar esta función.</string> <string name="action_close">Cerrar</string> - <string name="program_rules_loop_warning_title">Advertencia de reglas del programa</string> - <string name="program_rules_loop_warning_message">Hay un problema de configuración que provoca un bucle en las reglas. Póngase en contacto con su administrador.</string> <string name="copied_text">Copiado</string> - <string name="empty_description">No hay información para este campo</string> <string name="take_photo">Tomar foto</string> <string name="from_gallery_v2">Desde la galería</string> <string name="warning_error_on_complete_title">¡Importante!</string> @@ -72,13 +58,10 @@ <string name="tei_coordinates">Coordenadas para</string> <string name="no_reserved_values">No quedan valores reservados. Contacte con el administrador del sistema.</string> <string name="incident_date">Fecha del incidente</string> - <string name="location_permission_denied">Se requiere el permiso de localización para obtener coordenadas. Por favor, habilítelo desde los ajustes del dispositivo.</string> <string name="open_with">Abrir con</string> <string name="no_option_found">No se ha encontrado opción</string> <string name="download">Descargar</string> <string name="scan">Escanear</string> - <string name="qr_code">Código QR</string> - <string name="bar_code">Código de barras</string> <string name="add_location">Añadir ubicación</string> <string name="form_without_fields">Este formulario no tiene campos configurados</string> <string name="event_details_section_title">%s detalles</string> diff --git a/form/src/main/res/values-fr/strings.xml b/form/src/main/res/values-fr/strings.xml index ed4c603d9f2..d3c8bd3f860 100644 --- a/form/src/main/res/values-fr/strings.xml +++ b/form/src/main/res/values-fr/strings.xml @@ -11,16 +11,9 @@ <string name="field_is_mandatory">Ce champ est obligatoire</string> <string name="missing_warning_fields_completed_events">Vous avez des messages d\'avertissement.</string> <string name="required">Requis</string> - <string name="date">Date</string> - <string name="hint_year">Années</string> - <string name="hint_month">Mois</string> - <string name="hint_day">Jours</string> - <string name="wrong_date_format"> %s ne peut pas être analysé comme une date</string> <string name="polygon">Polygone</string> <string name="latitude">Latitude</string> <string name="longitude">Longitude</string> - <string name="coordinates_error">Les valeurs des coordonnées ne sont pas valides</string> - <string name="polygon_captured">Le polygône a été défini</string> <string name="enter_value">Entrez une valeur</string> <string name="enter_url">Entrez url</string> <string name="enter_email">Entrez e-mail</string> @@ -35,25 +28,21 @@ <string name="enter_long_text">Saisir texte long</string> <string name="enter_text">Saisir du texte</string> <string name="due_date">Date d\'échéance</string> - <string name="mandatory_field">Champ obligatoire</string> <string name="not_saved">Non enregistré!</string> <string name="review">Vérifier</string> <string name="complete">Terminer</string> <string name="discard_changes">Annuler les modifications</string> <string name="saved">Enregistré!</string> <string name="not_now">Pas maintenant</string> - <string name="save_anyway">Enregistrer quand même</string> <string name="keep_editing">Continuer l’édition</string> <string name="event_can_be_completed">Voulez-vous marquer ce formulaire comme complet?</string> <string name="discard_go_back">Si vous quittez maintenant, toutes les informations du formulaire seront supprimées.</string> <string name="field_errors_not_saved">Certains champs contiennent des erreurs et ils ne sont pas enregistrés.</string> <string name="fields_mandatory_missing">Certains champs obligatoires manquent et le formulaire ne peut pas être enregistré.</string> + <string name="field_errors_not_saved_discard">Certains champs contiennent des erreurs et ils ne sont pas enregistrés. \ nSi vous quittez maintenant, les modifications seront ignorées.</string> <string name="share">Partager</string> <string name="action_close">Fermer</string> - <string name="program_rules_loop_warning_title">Avertissement relatif aux règles du programme</string> - <string name="program_rules_loop_warning_message">Il y a un problème de configuration provoquant une boucle dans les règles. Contactez votre administrateur.</string> <string name="copied_text">Copié</string> - <string name="empty_description">Pas d\'information pour ce champ</string> <string name="take_photo">Prendre une photo</string> <string name="warning_error_on_complete_title">Attention. Vérifiez ceci!</string> <string name="action_do_not_show_again">Ne pas montrer de nouveau</string> @@ -62,13 +51,10 @@ <string name="tei_coordinates">Coordonnées pour</string> <string name="no_reserved_values">Il n\'y a plus de valeurs réservées. Veuillez contacter votre administrateur système.</string> <string name="incident_date">Date de l´incident</string> - <string name="location_permission_denied">L\'autorisation de localisation est nécessaire pour capturer les coordonnées. Veuillez les activer dans les paramètres de l\'application</string> <string name="open_with">Ouvrir avec</string> <string name="no_option_found">Aucune option trouvée</string> <string name="download">Télécharger</string> <string name="scan">Scanner</string> - <string name="qr_code">Code QR</string> - <string name="bar_code">Code-barre</string> <string name="add_location">Ajouter un lieu</string> <string name="form_without_fields">Ce formulaire n\'a pas de champs configurés</string> <string name="event_details_section_title">%s détails</string> diff --git a/form/src/main/res/values-hi-rIN/strings.xml b/form/src/main/res/values-hi-rIN/strings.xml index 3fc9d264536..4393d506f2d 100644 --- a/form/src/main/res/values-hi-rIN/strings.xml +++ b/form/src/main/res/values-hi-rIN/strings.xml @@ -9,11 +9,6 @@ <string name="missing_warning_fields_completed_events">आपके पास कुछ चेतावनी संदेश हैं</string> <string name="missing_warning_fields_events">आपके पास कुछ चेतावनी संदेश हैं\nक्या आप इस फ़ॉर्म को कम्प्लीट मार्क करना चाहते हैं\?</string> <string name="required">आवश्यकता है</string> - <string name="date">तारीख</string> - <string name="hint_year">वर्ष</string> - <string name="hint_month">महीने</string> - <string name="hint_day">दिन</string> - <string name="wrong_date_format">%s डेट के रूप में पढ़ा नहीं जा सकता</string> <string name="latitude">अक्षांश</string> <string name="longitude">देशांतर</string> <string name="enter_value">मान दर्ज करें</string> @@ -26,15 +21,12 @@ <string name="enter_letter">अक्षर दर्ज करें</string> <string name="enter_long_text">लंबा अक्षर दर्ज करें</string> <string name="enter_text">पाठ दर्ज करें</string> - <string name="form_latitude_prefix">अक्षांश</string> - <string name="form_longitude_prefix">देशांतर</string> <string name="not_saved">सेव नहीं</string> <string name="review">रिव्यू</string> <string name="complete">पूरा हुआ</string> <string name="discard_changes">बदलावों को छोड़ना है</string> <string name="saved">सेव</string> <string name="not_now">अभी नहीं</string> - <string name="save_anyway">सेव करें</string> <string name="keep_editing">संपादन करते रहें</string> <string name="share">साझा करें</string> <string name="action_close">बंद करें</string> diff --git a/form/src/main/res/values-id/strings.xml b/form/src/main/res/values-id/strings.xml index f823e81bae7..2bdafe0001a 100644 --- a/form/src/main/res/values-id/strings.xml +++ b/form/src/main/res/values-id/strings.xml @@ -7,15 +7,9 @@ <string name="choose_ou">Pilih unit organisasi</string> <string name="field_is_mandatory">Bidang ini wajib</string> <string name="required">Wajib</string> - <string name="date">Tanggal</string> - <string name="hint_year">Tahun</string> - <string name="hint_month">Bulan</string> - <string name="hint_day">Hari</string> <string name="polygon">Poligon</string> <string name="latitude">Garis lintang</string> <string name="longitude">Garis bujur</string> - <string name="coordinates_error">Nilai koordinat tidak valid</string> - <string name="polygon_captured">Poligon ditangkap</string> <string name="enter_value">Masukkan nilai</string> <string name="enter_url">Masukkan URL</string> <string name="enter_email">Masukan email</string> @@ -33,12 +27,10 @@ <string name="complete">Lengkap</string> <string name="discard_changes">Hapus perubahan</string> <string name="saved">Tersimpan!</string> - <string name="save_anyway">Simpan bagaimanapun</string> <string name="share">Bagikan</string> <string name="camera_permission_denied">Izin kamera ditolak.\nAnda harus mengaktifkannya untuk menggunakan fitur ini.</string> <string name="action_close">Tutup</string> <string name="copied_text">Tersalin</string> - <string name="empty_description">Tidak ada info untuk bidang ini</string> <string name="take_photo">Ambil gambar</string> <string name="warning_error_on_complete_title">Periksa ini!</string> <string name="action_do_not_show_again">Jangan perlihatkan lagi</string> diff --git a/form/src/main/res/values-km/strings.xml b/form/src/main/res/values-km/strings.xml index 4c7c0e6d5cc..cbd574eee1a 100644 --- a/form/src/main/res/values-km/strings.xml +++ b/form/src/main/res/values-km/strings.xml @@ -3,10 +3,6 @@ <string name="error">កំហុសបច្ចេកទេស</string> <string name="choose_date">ជ្រើសរើសថ្ងៃខែឆ្នាំ</string> <string name="required">ទាមទារ</string> - <string name="date">កាលបរិច្ឆេទ</string> - <string name="hint_year">ឆ្នាំ</string> - <string name="hint_month">ខែ</string> - <string name="hint_day">ថ្ងៃ</string> <string name="latitude">រយៈទទឹង</string> <string name="longitude">រយៈបណ្តោយ</string> <string name="enter_positive_integer_or_zero">បញ្ជូលទិន្នន័យជាលេខ (វិជ្ជមាន រឺ លេខ ០)</string> diff --git a/form/src/main/res/values-lo/strings.xml b/form/src/main/res/values-lo/strings.xml index 29222df2b69..c641b7d3496 100644 --- a/form/src/main/res/values-lo/strings.xml +++ b/form/src/main/res/values-lo/strings.xml @@ -10,16 +10,9 @@ <string name="conf_error_value_option_set">ຄ່າຂອງຫ້ອງປ້ອນຂໍ້ມູນ%sບໍ່ໄດ້ຂຶ້ນກັບຕົວເລືອກທີ່ຕັ້ງໄວ້ໃນ%s</string> <string name="field_is_mandatory">ຊ່ອງປ້ອນຂໍ້ມູນນີ້ແມ່ນຈໍາເປັນຕ້ອງປ້ອນຂໍ້ມູນໃສ່</string> <string name="required">ຕ້ອງການ</string> - <string name="date">ວັນທີ່</string> - <string name="hint_year">ປີ</string> - <string name="hint_month">ເດືອນ</string> - <string name="hint_day">ມື້</string> - <string name="wrong_date_format">%sບໍ່ສາມາດວິເຄາະເປັນວັນທີໄດ້</string> <string name="polygon">Polygon</string> <string name="latitude">ເສັ້ນຂະໜານ</string> <string name="longitude">ເສັ້ນແວງ</string> - <string name="coordinates_error">ປະສານງານບໍ່ຖືກຕ້ອງ</string> - <string name="polygon_captured">ບັນທຶກຮູບຫຼາຍຫຼ່ຽມ</string> <string name="enter_value">ປ້ອນຄ່າ</string> <string name="enter_url">ປ້ອນ url</string> <string name="enter_email">ປ້ອນອີເມລ</string> @@ -34,23 +27,18 @@ <string name="enter_long_text">ປ້ອນຂໍ້ມູນເປັນຂໍ້ຄວາມຍາວ</string> <string name="enter_text">ຂຽນຄໍາຕອບ</string> <string name="due_date">ວັນທີຕ້ອງແລ້ວ</string> - <string name="mandatory_field">ຊ່ອງປ້ອນຂໍ້ມູນທີ່ບັງຄັບ</string> <string name="not_saved">ບໍ່ໄດ້ບັນທຶກ</string> <string name="review">ທົບທວນຄືນ</string> <string name="complete">ສຳເລັດແລ້ວ</string> <string name="discard_changes">ລຶບການປ່ຽນແປງ</string> <string name="saved">ບັນທຶກແລ້ວ!</string> <string name="not_now">ບໍ່​ແມ່ນ​ຕອນ​ນີ້</string> - <string name="save_anyway">ບັນທຶກ</string> <string name="keep_editing">ສຶບຕໍ່ແກ້ໄຂ</string> <string name="event_can_be_completed">ທ່ານຕ້ອງການໝາຍແບບຟອມນີ້ວ່າສຳເລັດແລ້ວຫຼືບໍ?</string> <string name="discard_go_back">ຖ້າທ່ານອອກດຽວນີ້ ຂໍ້ມູນທັງໝົດໃນແບບຟອມຈະຖືກຍົກເລີກ.</string> <string name="share">ເຜີຍແຜ່</string> <string name="action_close">ປິດ</string> - <string name="program_rules_loop_warning_title">ຂໍ້ຄວນລະວັງກົດຂອງສາຍງານ</string> - <string name="program_rules_loop_warning_message">ມີບັນຫາການກຳນົດຄ່າທີ່ເຮັດໃຫ້ເກີດມີຊ່ອງຫວ່າງໃນກົດລະບຽບ. ຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ.</string> <string name="copied_text">ສຳເນົາແລ້ວ</string> - <string name="empty_description">ບໍ່ມີຂໍ້ມູນສຳລັບຫ້ອງຂໍ້ມູນນີ້</string> <string name="take_photo">ຖ່າຍຮູບ</string> <string name="warning_error_on_complete_title">ກວດເບີ່ງອັນນີ້</string> <string name="action_do_not_show_again">ບໍ່ຕ້ອງສະແດງອີກ</string> diff --git a/form/src/main/res/values-my/strings.xml b/form/src/main/res/values-my/strings.xml index 6f007af625e..c6b413b6074 100644 --- a/form/src/main/res/values-my/strings.xml +++ b/form/src/main/res/values-my/strings.xml @@ -3,9 +3,6 @@ <string name="error">အမှား</string> <string name="choose_date">ရက်စွဲ ကိုရွေးချယ်ပါ</string> <string name="required">ဖြည့်သွင်းရန်လိုအပ်သည်</string> - <string name="date">ရက်စွဲ</string> - <string name="hint_year">နှစ်များ</string> - <string name="hint_month">လများ</string> <string name="due_date">Дата выполнения</string> <string name="complete">ပြည့်စုံသည်။</string> <string name="action_close">ပိတ်သည်</string> diff --git a/form/src/main/res/values-nb/strings.xml b/form/src/main/res/values-nb/strings.xml index b5b0f8fb3cb..240d55b56b9 100644 --- a/form/src/main/res/values-nb/strings.xml +++ b/form/src/main/res/values-nb/strings.xml @@ -7,15 +7,9 @@ <string name="choose_ou">Velg organisasjonsenhet</string> <string name="field_is_mandatory">Dette feltet er obligatorisk</string> <string name="required">Påkrevd</string> - <string name="date">Dato</string> - <string name="hint_year">År</string> - <string name="hint_month">Måneder</string> - <string name="hint_day">Dager</string> <string name="polygon">Polygon</string> <string name="latitude">Breddegrad</string> <string name="longitude">Lengdegrad</string> - <string name="coordinates_error">Koordinatverdiene er ikke gyldige</string> - <string name="polygon_captured">Polygon oppfanget</string> <string name="enter_value">Legg inn verdi</string> <string name="enter_url">Legg inn URL</string> <string name="enter_email">Legg inn e-post</string> @@ -33,12 +27,10 @@ <string name="complete">Fullfør</string> <string name="discard_changes">Forkast endringer</string> <string name="saved">Lagret!</string> - <string name="save_anyway">Lagre likevel</string> <string name="keep_editing">Fortsett å rediger</string> <string name="share">Del</string> <string name="action_close">Lukk</string> <string name="copied_text">Kopiert</string> - <string name="empty_description">Ingen info for dette feltet</string> <string name="warning_error_on_complete_title">Sjekk dette!</string> <string name="enrollment_single_section_label">Attributter - %s</string> <string name="tei_coordinates">Koordinater for</string> diff --git a/form/src/main/res/values-ne/strings.xml b/form/src/main/res/values-ne/strings.xml index 39f97f62bf6..efe0a1d8ee1 100644 --- a/form/src/main/res/values-ne/strings.xml +++ b/form/src/main/res/values-ne/strings.xml @@ -1,4 +1,3 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <string name="date">मिति</string> </resources> \ No newline at end of file diff --git a/form/src/main/res/values-nl/strings.xml b/form/src/main/res/values-nl/strings.xml index cee4ecf9223..36972853645 100644 --- a/form/src/main/res/values-nl/strings.xml +++ b/form/src/main/res/values-nl/strings.xml @@ -10,16 +10,9 @@ <string name="conf_error_value_option_set">Waarde voor veld %s behoort niet tot de optieset in %s</string> <string name="field_is_mandatory">Dit veld is verplicht</string> <string name="required">Vereist</string> - <string name="date">Datum</string> - <string name="hint_year">Jaren</string> - <string name="hint_month">Maanden</string> - <string name="hint_day">Dagen</string> - <string name="wrong_date_format">%s kan niet worden verwerkt als een datum</string> <string name="polygon">Veelhoek</string> <string name="latitude">Breedtegraad</string> <string name="longitude">Lengtegraad</string> - <string name="coordinates_error">Coördinatenwaarden zijn niet geldig</string> - <string name="polygon_captured">Polygoon vastgelegd</string> <string name="enter_value">Voer waarde in</string> <string name="enter_url">URL invoeren</string> <string name="enter_email">Voer email in</string> @@ -34,27 +27,21 @@ <string name="enter_long_text">Voer lange tekst in</string> <string name="enter_text">Tekst invoeren</string> <string name="due_date">Deadline</string> - <string name="mandatory_field">Verplicht veld</string> - <string name="form_latitude_prefix">Breedte:</string> - <string name="form_longitude_prefix">Lang:</string> <string name="not_saved">Niet opgeslagen</string> <string name="review">Beoordeling</string> <string name="complete">Compleet</string> <string name="discard_changes">Veranderingen ongedaan maken</string> <string name="saved">Opgeslagen!</string> <string name="not_now">Niet nu</string> - <string name="save_anyway">Toch opslaan</string> <string name="keep_editing">Blijf bewerken</string> <string name="event_can_be_completed">Wilt u dit formulier als voltooid markeren?</string> <string name="discard_go_back">Als u nu afsluit, wordt alle informatie in het formulier weggegooid.</string> <string name="field_errors_not_saved">Sommige velden bevatten fouten en worden niet opgeslagen.</string> <string name="fields_mandatory_missing">Sommige verplichte velden ontbreken en het formulier kan niet worden opgeslagen.</string> + <string name="field_errors_not_saved_discard">Sommige velden bevatten fouten en worden niet opgeslagen. \Als u nu afsluit, worden de wijzigingen verwijderd.</string> <string name="share">Deel</string> <string name="action_close">Sluit</string> - <string name="program_rules_loop_warning_title">Waarschuwing programmaregels</string> - <string name="program_rules_loop_warning_message">Er is een configuratieprobleem dat een lus in de regels veroorzaakt. Neem contact op met uw beheerder.</string> <string name="copied_text">Gekopieerd</string> - <string name="empty_description">Geen info voor dit veld</string> <string name="take_photo">Neem foto</string> <string name="warning_error_on_complete_title">Check dit!</string> <string name="action_do_not_show_again">Niet meer laten zien</string> @@ -63,7 +50,6 @@ <string name="tei_coordinates">Coördinaten voor de</string> <string name="no_reserved_values">Er zijn geen gereserveerde waarden meer. Neem contact op met uw systeembeheerder</string> <string name="incident_date">Incident datum</string> - <string name="location_permission_denied">De locatietoestemming is nodig voor het vastleggen van coördinaten. Schakel ze alstublieft in de applicatie-instellingen in</string> <string name="open_with">Openen met</string> <string name="no_option_found">Geen optie gevonden</string> <string name="download">Downloaden</string> diff --git a/form/src/main/res/values-prs/strings.xml b/form/src/main/res/values-prs/strings.xml index fe9eae69f5d..7a2e0d64a6d 100644 --- a/form/src/main/res/values-prs/strings.xml +++ b/form/src/main/res/values-prs/strings.xml @@ -2,10 +2,6 @@ <resources> <string name="error">خطا</string> <string name="required">ضروری</string> - <string name="date">تاریخ</string> - <string name="hint_year">سالانه</string> - <string name="hint_month">ماه ها</string> - <string name="hint_day">روزها</string> <string name="polygon">چند ضلعی</string> <string name="latitude">عرض البلد</string> <string name="longitude">طول البلد</string> diff --git a/form/src/main/res/values-ps/strings.xml b/form/src/main/res/values-ps/strings.xml index 03d9781ed48..f2f7e61f1e9 100644 --- a/form/src/main/res/values-ps/strings.xml +++ b/form/src/main/res/values-ps/strings.xml @@ -2,10 +2,6 @@ <resources> <string name="error">تېروته</string> <string name="required">اړین دي</string> - <string name="date">نېټه</string> - <string name="hint_year">کلونه</string> - <string name="hint_month">میاشت</string> - <string name="hint_day">ورځې</string> <string name="latitude">لېټېټيوډ</string> <string name="longitude">لانګېټيوډ</string> <string name="due_date">ټاکلې نېټه</string> diff --git a/form/src/main/res/values-pt-rBR/strings.xml b/form/src/main/res/values-pt-rBR/strings.xml index 022afde4550..2c2d2e33f43 100644 --- a/form/src/main/res/values-pt-rBR/strings.xml +++ b/form/src/main/res/values-pt-rBR/strings.xml @@ -2,14 +2,9 @@ <resources> <string name="error">Erro</string> <string name="required">Exigido</string> - <string name="date">Data</string> - <string name="hint_year">Anos</string> - <string name="hint_month">Meses</string> - <string name="hint_day">Dias</string> <string name="polygon">Poligono</string> <string name="latitude">Latitude</string> <string name="longitude">Longitude</string> - <string name="polygon_captured">Polígono capturado</string> <string name="due_date">Data de vencimento</string> <string name="complete">Completo</string> <string name="share">Partilhar</string> diff --git a/form/src/main/res/values-pt/strings.xml b/form/src/main/res/values-pt/strings.xml index e23cbc70f87..a50a97fea74 100644 --- a/form/src/main/res/values-pt/strings.xml +++ b/form/src/main/res/values-pt/strings.xml @@ -11,16 +11,9 @@ <string name="field_is_mandatory">Este campo é obrigatório</string> <string name="missing_warning_fields_completed_events">Tem algumas mensagens de aviso.</string> <string name="required">Obrigatório</string> - <string name="date">Data</string> - <string name="hint_year">Anos</string> - <string name="hint_month">Meses</string> - <string name="hint_day">Dias</string> - <string name="wrong_date_format">%s não pode ser analisado como uma data</string> <string name="polygon">Poligono</string> <string name="latitude">Latitude</string> <string name="longitude">Longitude</string> - <string name="coordinates_error">Os valores das coordenadas não são válidos</string> - <string name="polygon_captured">Polígono capturado</string> <string name="enter_value">Digite o valor</string> <string name="enter_url">Digite o URL</string> <string name="enter_email">Digite o email</string> @@ -35,27 +28,21 @@ <string name="enter_long_text">Inserir texto longo</string> <string name="enter_text">Inserir texto</string> <string name="due_date">Data de Vencimento</string> - <string name="mandatory_field">Campo obrigatório</string> - <string name="form_latitude_prefix">Latitude:</string> - <string name="form_longitude_prefix">Longitude:</string> <string name="not_saved"> Não guardado</string> <string name="review">Revisão</string> <string name="complete">Completo</string> <string name="discard_changes">Descartar mudanças</string> <string name="saved">Gravado!</string> <string name="not_now">Não agora</string> - <string name="save_anyway">Gravar assim mesmo</string> <string name="keep_editing">Continue editando</string> <string name="event_can_be_completed">Deseja marcar este formulário como completo?</string> <string name="discard_go_back">Se sair agora, todas as informações do formulário serão descartadas.</string> <string name="field_errors_not_saved">Alguns campos apresentam erros e não são guardados.</string> <string name="fields_mandatory_missing">Alguns campos obrigatórios estão em falta e o formulário não pode ser guardado.</string> + <string name="field_errors_not_saved_discard">Alguns campos têm erros e não são guardados. \Se sair agora, as suas alterações serão descartadas.</string> <string name="share">Partilha</string> <string name="action_close">Fechar</string> - <string name="program_rules_loop_warning_title">Aviso de regras do programa</string> - <string name="program_rules_loop_warning_message">Existe um problema de configuração que está a provocar um ciclo nas regras. Contacte o seu administrador.</string> <string name="copied_text">Copiado</string> - <string name="empty_description">Nenhuma informação para este campo</string> <string name="take_photo"> Tirar fotografia</string> <string name="warning_error_on_complete_title">Verifique isso!</string> <string name="action_do_not_show_again">Não mostrar novamente</string> @@ -64,13 +51,10 @@ <string name="tei_coordinates">Coordenadas para o</string> <string name="no_reserved_values">Não há mais valores reservados. Entre em contato com o administrador do sistema</string> <string name="incident_date">Data do incidente</string> - <string name="location_permission_denied">A permissão de localização é necessária para captar as coordenadas. Por favor, ative-a nas definições do aplicativo</string> <string name="open_with">Abrir com</string> <string name="no_option_found">Nenhuma opção encontrada</string> <string name="download">Descarregar</string> <string name="scan">Digitalizar</string> - <string name="qr_code">Código QR</string> - <string name="bar_code">Código de barras</string> <string name="add_location">Adicionar localização</string> <string name="form_without_fields">Este formulário não tem campos configurados</string> <string name="event_details_section_title">%s detalhes</string> diff --git a/form/src/main/res/values-ro/strings.xml b/form/src/main/res/values-ro/strings.xml index be206b05e5b..a6299e631c1 100644 --- a/form/src/main/res/values-ro/strings.xml +++ b/form/src/main/res/values-ro/strings.xml @@ -1,11 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <resources> <string name="error">Eroare</string> - <string name="date">Data</string> - <string name="hint_year">Ani</string> - <string name="hint_month">Luni</string> - <string name="hint_day">Zile</string> - <string name="save_anyway">Salvare oricum</string> <string name="share">Partajare</string> <string name="action_close">Închidere</string> <string name="incident_date">Data incidentului</string> diff --git a/form/src/main/res/values-ru/strings.xml b/form/src/main/res/values-ru/strings.xml index 833482f8d39..d43ba453726 100644 --- a/form/src/main/res/values-ru/strings.xml +++ b/form/src/main/res/values-ru/strings.xml @@ -11,15 +11,9 @@ <string name="missing_warning_fields_completed_events">У Вас есть несколько предупреждающих сообщений.</string> <string name="missing_warning_fields_events">У Вас есть несколько предупреждающих сообщений.\nХотите ли Вы отметить эту форму как завершенную\?</string> <string name="required">Обязательный</string> - <string name="date">Дата</string> - <string name="hint_year">Годы</string> - <string name="hint_month">Месяцы</string> - <string name="hint_day">Дни</string> <string name="polygon">Полигон</string> <string name="latitude">Широта</string> <string name="longitude">Долгота</string> - <string name="coordinates_error">Значения координат не действительны</string> - <string name="polygon_captured">Полигон зафиксирован</string> <string name="enter_value">Введите значение</string> <string name="enter_url">Введите url</string> <string name="enter_email">Введите электронную почту</string> @@ -34,7 +28,6 @@ <string name="enter_long_text">Ввод длинного текста</string> <string name="enter_text">Введите текст</string> <string name="due_date">Дата выполнения</string> - <string name="mandatory_field">Обязательное поле</string> <string name="not_saved">Не сохранено</string> <string name="review">Просмотр</string> <string name="complete">Завершенный</string> @@ -44,21 +37,17 @@ <string name="missing_error_fields_events">В некоторых полях есть ошибки, и они не сохраняются. \nВы хотите просмотреть форму\?</string> <string name="review_message">Некоторые поля требуют Вашего внимания.\nХотите просмотреть форму\?</string> <string name="not_now">Не сейчас</string> - <string name="save_anyway">Сохранить в любом случае</string> <string name="keep_editing">Продолжить редактировать</string> <string name="event_can_be_completed">Хотите ли Вы отметить эту форму как завершенную?</string> <string name="discard_go_back">Если Вы выйдете сейчас, вся информация в форме будет удалена.</string> - <string name="field_errors_not_saved_discard">Некоторые поля содержат ошибки, и они не сохраняются. \nЕсли Вы выйдете сейчас, изменения будут отменены.</string> <string name="field_errors_not_saved">Некоторые поля содержат ошибки, и они не сохранены.</string> <string name="fields_mandatory_missing">Некоторые обязательные поля не заполнены, и форму невозможно сохранить.</string> <string name="fields_mandatory_missing_discard">Некоторые обязательные поля отсутствуют, и форма не может быть сохранена. \nЕсли вы выйдете сейчас, изменения будут отменены.</string> + <string name="field_errors_not_saved_discard">Некоторые поля содержат ошибки, и они не сохраняются. Если Вы выйдете сейчас, изменения будут отменены.</string> <string name="share">Поделиться</string> <string name="camera_permission_denied">Разрешение камеры запрещено.\nЧтобы использовать эту функцию, ее необходимо разрешить.</string> <string name="action_close">Закрыть</string> - <string name="program_rules_loop_warning_title">Предупреждение о правилах программы</string> - <string name="program_rules_loop_warning_message">Существует проблема конфигурации, вызывающая зацикливание правил. Обратитесь к администратору.</string> <string name="copied_text">Скопировано</string> - <string name="empty_description">Нет информации для этого поля</string> <string name="take_photo">Сделать фото</string> <string name="from_gallery_v2">Из галереи</string> <string name="warning_error_on_complete_title">Проверьте это!</string> @@ -68,13 +57,10 @@ <string name="tei_coordinates">Координаты для</string> <string name="no_reserved_values">Больше нет зарезервированных значений. Обратитесь к системному администратору</string> <string name="incident_date">Дата происшествия</string> - <string name="location_permission_denied">Для захвата координат необходимо разрешение на определение местоположения. Пожалуйста, включите их в настройках приложения</string> <string name="open_with">Открыть с помощью</string> <string name="no_option_found">Опции не найдены</string> <string name="download">Скачать</string> <string name="scan">Сканировать</string> - <string name="qr_code">QR-код</string> - <string name="bar_code">Штрих-код</string> <string name="add_location">Добавить локацию</string> <string name="form_without_fields">В этой форме нет настроенных полей</string> <string name="event_details_section_title">%s деталей</string> diff --git a/form/src/main/res/values-si/strings.xml b/form/src/main/res/values-si/strings.xml index 1e933248190..4aaa0fc8c4b 100644 --- a/form/src/main/res/values-si/strings.xml +++ b/form/src/main/res/values-si/strings.xml @@ -1,10 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <resources> <string name="error">දෝෂය</string> - <string name="date">දිනය</string> - <string name="hint_year">අවුරුදු</string> - <string name="hint_month">මාස</string> - <string name="hint_day">දින</string> <string name="discard_changes">වෙනස් කිරීම් ඉවතලන්න</string> <string name="action_close">වසන්න</string> <string name="download">බාගත කරන්න</string> diff --git a/form/src/main/res/values-sv/strings.xml b/form/src/main/res/values-sv/strings.xml index 502e2849be2..55ab9a3b71b 100644 --- a/form/src/main/res/values-sv/strings.xml +++ b/form/src/main/res/values-sv/strings.xml @@ -3,10 +3,6 @@ <string name="error">Fel</string> <string name="choose_date">Välj datum</string> <string name="required">Nödvändig</string> - <string name="date">Datum</string> - <string name="hint_year">År</string> - <string name="hint_month">Månader</string> - <string name="hint_day">Dagar</string> <string name="latitude">Latitud</string> <string name="longitude">Longitud</string> <string name="enter_positive_integer_or_zero">Ange ett positivt heltal eller noll.</string> diff --git a/form/src/main/res/values-tet/strings.xml b/form/src/main/res/values-tet/strings.xml index c127ca9ac6f..00e97d80005 100644 --- a/form/src/main/res/values-tet/strings.xml +++ b/form/src/main/res/values-tet/strings.xml @@ -2,9 +2,6 @@ <resources> <string name="error">Erru</string> <string name="required">Nesesáriu</string> - <string name="date">Data</string> - <string name="hint_year">Tinan</string> - <string name="hint_month">Fulan</string> <string name="complete">Kompletu</string> <string name="share">Partilla</string> <string name="action_close">Taka</string> diff --git a/form/src/main/res/values-tg/strings.xml b/form/src/main/res/values-tg/strings.xml index d2575c6d443..184beac6486 100644 --- a/form/src/main/res/values-tg/strings.xml +++ b/form/src/main/res/values-tg/strings.xml @@ -2,9 +2,6 @@ <resources> <string name="error">Хатогӣ</string> <string name="required">Ҳатмӣ</string> - <string name="date">Сана</string> - <string name="hint_year">Солҳо</string> - <string name="hint_month">Моҳҳо</string> <string name="polygon">Бисёркунҷа</string> <string name="latitude">Тӯл</string> <string name="longitude">Арз</string> diff --git a/form/src/main/res/values-uk/strings.xml b/form/src/main/res/values-uk/strings.xml index a54098a1157..b905503413a 100644 --- a/form/src/main/res/values-uk/strings.xml +++ b/form/src/main/res/values-uk/strings.xml @@ -10,16 +10,9 @@ <string name="conf_error_value_option_set">Значення для поля %s не належить параметру, встановленому в %s</string> <string name="field_is_mandatory">Це поле обов\'язкове для заповнення</string> <string name="required">Обов\'язкове поле</string> - <string name="date">Дата</string> - <string name="hint_year">Роки</string> - <string name="hint_month">Місяці</string> - <string name="hint_day">Дні</string> - <string name="wrong_date_format">%s не можна проаналізувати як дату</string> <string name="polygon">Багатокутник</string> <string name="latitude">Широта</string> <string name="longitude">Довгота</string> - <string name="coordinates_error">Значення координат недійсні</string> - <string name="polygon_captured">Зафіксовано багатокутник</string> <string name="enter_value">Введіть значення</string> <string name="enter_url">Введіть URL-адресу</string> <string name="enter_email">Введіть адресу електронної пошти</string> @@ -34,9 +27,6 @@ <string name="enter_long_text">Введіть довгий текст</string> <string name="enter_text">Введіть текст</string> <string name="due_date">Запланована дата</string> - <string name="mandatory_field">Обов\'язкове поле</string> - <string name="form_latitude_prefix">Широта:</string> - <string name="form_longitude_prefix">Довгота:</string> <string name="not_saved">Не збережено</string> <string name="review">Перегляд</string> <string name="complete">Завершити</string> @@ -48,12 +38,10 @@ <string name="discard_go_back">Якщо Ви зараз вийдете, уся інформація у формі буде відхилена.</string> <string name="field_errors_not_saved">Деякі поля містять помилки і не були збережені.</string> <string name="fields_mandatory_missing">Деякі обов’язкові поля не заповнено, і форму неможливо зберегти.</string> + <string name="field_errors_not_saved_discard">Деякі поля містять помилки і не були збережені. Якщо Ви вийдете зараз, внесені зміни буде скасовано.</string> <string name="share">Поділитися</string> <string name="action_close">Закрити</string> - <string name="program_rules_loop_warning_title">Попередження про правила програми</string> - <string name="program_rules_loop_warning_message">Існує проблема конфігурації, яка спричиняє помилку у правилах. Зверніться до адміністратора.</string> <string name="copied_text">Скопійовано</string> - <string name="empty_description">Немає інформації для цього поля</string> <string name="take_photo">Зробити фото</string> <string name="warning_error_on_complete_title">Перевірте це!</string> <string name="action_do_not_show_again">Не показувати знову</string> @@ -63,7 +51,6 @@ <string name="no_reserved_values">Більше немає зарезервованих значень. Зверніться до свого системного адміністратора</string> <string name="incident_date">Дата інциденту</string> <string name="download">Завантажити</string> - <string name="qr_code">QR-код</string> <string name="add_location">Додати місцезнаходження</string> <string name="event_details_section_title">%s Деталі</string> <string name="org_unit">Організаційний підрозділ</string> diff --git a/form/src/main/res/values-ur/strings.xml b/form/src/main/res/values-ur/strings.xml index 54ef83f7f58..25ed7a141d5 100644 --- a/form/src/main/res/values-ur/strings.xml +++ b/form/src/main/res/values-ur/strings.xml @@ -2,13 +2,10 @@ <resources> <string name="error">غلطی</string> <string name="required">لازمی</string> - <string name="date">تاریخ</string> - <string name="hint_year">سال</string> - <string name="hint_month">مہینے</string> - <string name="hint_day">دن</string> <string name="polygon">کثیر زبان</string> <string name="latitude">طول</string> <string name="longitude">لمبائی</string> + <string name="polygon_captured">کثیر الاضلاع (حدود) محفوظ کر لی گئیں</string> <string name="due_date">اخری تاریخ</string> <string name="complete">مکمل</string> <string name="share">بانٹیں</string> diff --git a/form/src/main/res/values-uz-rUZ/strings.xml b/form/src/main/res/values-uz-rUZ/strings.xml index 9abebe48ea0..e02469217ec 100644 --- a/form/src/main/res/values-uz-rUZ/strings.xml +++ b/form/src/main/res/values-uz-rUZ/strings.xml @@ -7,15 +7,9 @@ <string name="choose_ou">Tashkiliy boʼlimni tanlang</string> <string name="field_is_mandatory">Maydon toʼldirilishi majburiy</string> <string name="required">Majburiy</string> - <string name="date">Sana</string> - <string name="hint_year">Yillar</string> - <string name="hint_month">Oylar</string> - <string name="hint_day">Kunlar</string> <string name="polygon">Poligon</string> <string name="latitude">Kenglik</string> <string name="longitude">Kenglik</string> - <string name="coordinates_error">Koordinata qiymatlari yaroqsiz</string> - <string name="polygon_captured">Koʼpburchak ushlandi</string> <string name="enter_value">Qiymatni tanlang</string> <string name="enter_url">URL ni tanlang</string> <string name="enter_email">ye-pochta manzilini kiriting</string> @@ -34,12 +28,10 @@ <string name="complete">Bajarildi</string> <string name="discard_changes">Oʼzgartirishlar bekor qilinsin</string> <string name="saved">Saqlandi!</string> - <string name="save_anyway">Nima boʼlganda ham saqlash</string> <string name="keep_editing">Tahrirni davom eting</string> <string name="share">Улашиш</string> <string name="action_close">Yopmoq</string> <string name="copied_text">Nusxa olindi</string> - <string name="empty_description">Ushbu maydon uchun maʼlumot yoʼq</string> <string name="warning_error_on_complete_title">Buni tekshiring!</string> <string name="enrollment_single_section_label">Аtribatlar - %s</string> <string name="tei_coordinates">Uchun koordinatalar</string> diff --git a/form/src/main/res/values-uz/strings.xml b/form/src/main/res/values-uz/strings.xml index 8326314f01a..ba47049049a 100644 --- a/form/src/main/res/values-uz/strings.xml +++ b/form/src/main/res/values-uz/strings.xml @@ -7,15 +7,9 @@ <string name="choose_ou">Ташкилий бўлимни танланг</string> <string name="field_is_mandatory">Майдон тўлдирилиши мажбурий</string> <string name="required">Мажбурий</string> - <string name="date">Сана</string> - <string name="hint_year">Йиллар</string> - <string name="hint_month">Ойлар</string> - <string name="hint_day">Кунлар</string> <string name="polygon">Полигон</string> <string name="latitude">Кенглик</string> <string name="longitude">Узунлик</string> - <string name="coordinates_error">Координата қийматлари яроқсиз</string> - <string name="polygon_captured">Кўпбурчак ушланди</string> <string name="enter_value">Қийматни танланг</string> <string name="enter_url">URL ни танланг</string> <string name="enter_email">е-почта манзилини киритинг</string> @@ -35,12 +29,10 @@ <string name="discard_changes">Ўзгартиришлар бекор қилинсин</string> <string name="saved">Сақланди!</string> <string name="not_now">Hozir emas</string> - <string name="save_anyway">Нима бўлганда ҳам сақлаш</string> <string name="keep_editing">Таҳрирни давом этинг</string> <string name="share">Улашиш</string> <string name="action_close">Ёпиш</string> <string name="copied_text">Нусха олинди</string> - <string name="empty_description">Ушбу майдон учун маълумот йўқ</string> <string name="take_photo">Суратга олиш</string> <string name="warning_error_on_complete_title">Буни текширинг!</string> <string name="enrollment_single_section_label">Атрибатлар - %s</string> @@ -48,7 +40,6 @@ <string name="no_reserved_values">Сақланган бошқа қийматлар йўқ. Тизим администраторига мурожаат қилинг.</string> <string name="incident_date">Ҳодиса санаси</string> <string name="download">Юклаш</string> - <string name="qr_code">QR код</string> <string name="add_location">Локация қўшинг</string> <string name="org_unit">Ташкилий бўлим</string> <string name="coordinates">Координаталар</string> diff --git a/form/src/main/res/values-vi/strings.xml b/form/src/main/res/values-vi/strings.xml index 3787bb48c40..bb8a52b73b6 100644 --- a/form/src/main/res/values-vi/strings.xml +++ b/form/src/main/res/values-vi/strings.xml @@ -12,16 +12,9 @@ <string name="missing_warning_fields_completed_events">Bạn có một số tin nhắn cảnh báo.</string> <string name="missing_warning_fields_events">Bạn có một số tin nhắn cảnh báo..\nBạn có muốn đánh dấu biểu nhập này là hoàn tất không\?</string> <string name="required">Bắt buộc</string> - <string name="date">Ngày</string> - <string name="hint_year">Năm</string> - <string name="hint_month">Tháng</string> - <string name="hint_day">Ngày</string> - <string name="wrong_date_format">%s không thể chuyển đổi thành Ngày</string> <string name="polygon">Bản đồ</string> <string name="latitude">Vĩ độ</string> <string name="longitude">Kinh độ</string> - <string name="coordinates_error">Giá trị tọa độ không đúng</string> - <string name="polygon_captured">Thêm bản đồ</string> <string name="enter_value">Nhập dữ liệu</string> <string name="enter_url">Nhập đường dẫn liên kết</string> <string name="enter_email">Nhập email</string> @@ -36,9 +29,6 @@ <string name="enter_long_text">Nhập văn bản dài</string> <string name="enter_text">Nhập văn bản</string> <string name="due_date">Ngày đến hạn</string> - <string name="mandatory_field">Trường bắt buộc</string> - <string name="form_latitude_prefix">Vĩ độ: </string> - <string name="form_longitude_prefix">Kinh độ: </string> <string name="not_saved">Chưa lưu</string> <string name="review">Xem xét</string> <string name="complete">Hoàn tất</string> @@ -48,21 +38,17 @@ <string name="missing_error_fields_events">Một số trường dữ liệu có lỗi và chưa được lưu. \nBạn có muốn xem lại biểu nhập không\?</string> <string name="review_message">Một số trường dữ liệu cần bạn chú ý.\nBạn có muốn xem xét biểu nhập không\?</string> <string name="not_now">Không phải bây giờ</string> - <string name="save_anyway">Tiếp tục Lưu</string> <string name="keep_editing">Tiếp tục chỉnh sửa</string> <string name="event_can_be_completed">Bạn có muốn đánh dấu biểu nhập này là hoàn tất không?</string> <string name="discard_go_back">Nếu bạn tắt bây giờ, tất cả thông tin trong biểu nhập sẽ bị hủy bỏ.</string> - <string name="field_errors_not_saved_discard">Một số trường dữ liệu có lỗi và chưa được lưu.. \nNếu bạn tắt bây giờ, tất cả thay đổi sẽ bị hủy bỏ.</string> <string name="field_errors_not_saved">Một số trường dữ liệu bị lỗi và chưa được lưu</string> <string name="fields_mandatory_missing">Thiếu một số trường dữ liệu bắt buộc và Không thể lưu biểu nhập.</string> <string name="fields_mandatory_missing_discard">hiếu một số trường dữ liệu bắt buộc và không thể lưu biểu nhập. \nNếu bạn tắt bây giờ, tất cả thay đổi sẽ bị hủy bỏ..</string> + <string name="field_errors_not_saved_discard">Một số trường dữ liệu có lỗi và chưa được lưu.\n Nếu bạn tắt bây giờ, tất cả thay đổi sẽ bị hủy bỏ.</string> <string name="share">Chia sẻ</string> <string name="camera_permission_denied">Quyền mở máy ảnh bị từ chối..\nBạn cần bật tính năng máy ảnh để sử dụng chức năng này.</string> <string name="action_close">Đóng</string> - <string name="program_rules_loop_warning_title">Cảnh báo quy tắc chương trình</string> - <string name="program_rules_loop_warning_message">Có một vấn đề cấu hình gây ra một vòng lặp trong các quy tắc chương trình. Hãy liên lạc với quản lý của bạn.</string> <string name="copied_text">Đã sao chép</string> - <string name="empty_description">Không có thông tin cho trường dữ liệu này</string> <string name="take_photo">Chụp ảnh</string> <string name="from_gallery_v2">Từ thư viện ảnh</string> <string name="warning_error_on_complete_title">Kiểm tra cái này!</string> @@ -72,13 +58,10 @@ <string name="tei_coordinates">Tọa độ của </string> <string name="no_reserved_values">Không có giá trị dành riêng nào nữa. Liên hệ với quản lý của bạn</string> <string name="incident_date">Ngày khởi phát</string> - <string name="location_permission_denied">Cần quyền định vị để thu thập vị trí. Xin vui lòng mở chúng trong cài đặt ứng dụng</string> <string name="open_with">Mở với</string> <string name="no_option_found">Không tìm thấy tùy chọn</string> <string name="download">Tải về</string> <string name="scan">Quét</string> - <string name="qr_code">Mã QR</string> - <string name="bar_code">Mã vạch</string> <string name="add_location">Thêm vị trí</string> <string name="form_without_fields">Biểu này không có trường dữ liệu được cấu hình</string> <string name="event_details_section_title">Chi tiết %s</string> diff --git a/form/src/main/res/values-zh-rCN/strings.xml b/form/src/main/res/values-zh-rCN/strings.xml index 58632b0adfc..990a2f02c74 100644 --- a/form/src/main/res/values-zh-rCN/strings.xml +++ b/form/src/main/res/values-zh-rCN/strings.xml @@ -11,16 +11,9 @@ <string name="field_is_mandatory">此字段是必填字段</string> <string name="missing_warning_fields_completed_events">您收到了一些警告信息。</string> <string name="required">必须的</string> - <string name="date">日期</string> - <string name="hint_year">年</string> - <string name="hint_month">月</string> - <string name="hint_day">天</string> - <string name="wrong_date_format">%s 无法解析为日期</string> <string name="polygon">多边形</string> <string name="latitude">纬度</string> <string name="longitude">经度</string> - <string name="coordinates_error">坐标值无效</string> - <string name="polygon_captured">采集的多边形。</string> <string name="enter_value">输入值</string> <string name="enter_url">输入url</string> <string name="enter_email">输入电子邮件</string> @@ -35,16 +28,12 @@ <string name="enter_long_text">输入长文本</string> <string name="enter_text">输入文本</string> <string name="due_date">到期日</string> - <string name="mandatory_field">强制字段</string> - <string name="form_latitude_prefix">纬度:</string> - <string name="form_longitude_prefix">经度:</string> <string name="not_saved">未保存</string> <string name="review">审查</string> <string name="complete">完成</string> <string name="discard_changes">忽略修改</string> <string name="saved">已经保存!</string> <string name="not_now">现在不要</string> - <string name="save_anyway">仍然保存</string> <string name="keep_editing">继续编辑</string> <string name="event_can_be_completed">您想将此表单标记为已完成吗?</string> <string name="discard_go_back">如果您现在退出,表单中的所有信息都将被丢弃。</string> @@ -52,10 +41,7 @@ <string name="fields_mandatory_missing">缺少一些必填字段,无法保存表单。</string> <string name="share">分享</string> <string name="action_close">关闭</string> - <string name="program_rules_loop_warning_title">项目规则警告</string> - <string name="program_rules_loop_warning_message">存在导致规则循环的配置问题。联系您的管理员。</string> <string name="copied_text">副本</string> - <string name="empty_description">该字段没有相关信息</string> <string name="take_photo">拍照</string> <string name="from_gallery_v2">来自画廊</string> <string name="warning_error_on_complete_title">检查</string> @@ -65,13 +51,10 @@ <string name="tei_coordinates">坐标</string> <string name="no_reserved_values">没有更多保留值,请联系管理员</string> <string name="incident_date">事件日期</string> - <string name="location_permission_denied">获取坐标需要位置权限。请在应用程序设置中启用它们</string> <string name="open_with">打开用</string> <string name="no_option_found">找不到选项</string> <string name="download">下载</string> <string name="scan">扫描</string> - <string name="qr_code">二维码</string> - <string name="bar_code">条码</string> <string name="add_location">添加位置</string> <string name="form_without_fields">该表单没有配置任何字段</string> <string name="event_details_section_title">%s详细信息</string> diff --git a/form/src/main/res/values-zh/strings.xml b/form/src/main/res/values-zh/strings.xml index 1edf001267b..681caec1189 100644 --- a/form/src/main/res/values-zh/strings.xml +++ b/form/src/main/res/values-zh/strings.xml @@ -12,16 +12,9 @@ <string name="missing_warning_fields_completed_events">您收到了一些警告信息。</string> <string name="missing_warning_fields_events">您有一些警告消息。\n您想将此表单标记为完成吗?</string> <string name="required">必须的</string> - <string name="date">日期</string> - <string name="hint_year">年</string> - <string name="hint_month">月</string> - <string name="hint_day">日</string> - <string name="wrong_date_format">%s 无法解析为日期</string> <string name="polygon">多边形</string> <string name="latitude">维度</string> <string name="longitude">经度</string> - <string name="coordinates_error">坐标值无效</string> - <string name="polygon_captured">采集的多边形。</string> <string name="enter_value">输入值</string> <string name="enter_url">输入url</string> <string name="enter_email">输入电子邮件</string> @@ -36,9 +29,6 @@ <string name="enter_long_text">输入长文本</string> <string name="enter_text">输入文本</string> <string name="due_date">到期日期</string> - <string name="mandatory_field">强制字段</string> - <string name="form_latitude_prefix">纬度:</string> - <string name="form_longitude_prefix">经度:</string> <string name="not_saved">未保存</string> <string name="review">审查</string> <string name="complete">完成</string> @@ -48,7 +38,6 @@ <string name="missing_error_fields_events">一些字段有错误并且它们没有被保存。 \n您要查看表单吗?</string> <string name="review_message">某些字段需要您注意。\n您要查看表单吗?</string> <string name="not_now">现在不要</string> - <string name="save_anyway">仍然保存</string> <string name="keep_editing">继续编辑</string> <string name="event_can_be_completed">您想将此表单标记为已完成吗?</string> <string name="discard_go_back">如果您现在退出,表单中的所有信息都将被丢弃。</string> @@ -59,10 +48,7 @@ <string name="share">分享</string> <string name="camera_permission_denied">相机权限被拒绝。\n您需要启用它才能使用此功能。</string> <string name="action_close">关闭</string> - <string name="program_rules_loop_warning_title">项目规则警告</string> - <string name="program_rules_loop_warning_message">存在导致规则循环的配置问题。联系您的管理员。</string> <string name="copied_text">副本</string> - <string name="empty_description">该字段没有相关信息</string> <string name="take_photo">拍照</string> <string name="from_gallery_v2">来自画廊</string> <string name="warning_error_on_complete_title">检查</string> @@ -72,13 +58,10 @@ <string name="tei_coordinates">坐标</string> <string name="no_reserved_values">没有更多保留值,请联系管理员</string> <string name="incident_date">事件日期</string> - <string name="location_permission_denied">获取坐标需要位置权限。请在应用程序设置中启用它们</string> <string name="open_with">打开用</string> <string name="no_option_found">找不到选项</string> <string name="download">下载</string> <string name="scan">扫描</string> - <string name="qr_code">二维码</string> - <string name="bar_code">条码</string> <string name="add_location">添加位置</string> <string name="form_without_fields">该表单没有配置任何字段</string> <string name="event_details_section_title">%s详细信息</string> diff --git a/form/src/main/res/values/strings.xml b/form/src/main/res/values/strings.xml index 7170b91146b..c336695b847 100644 --- a/form/src/main/res/values/strings.xml +++ b/form/src/main/res/values/strings.xml @@ -13,16 +13,9 @@ <string name="missing_warning_fields_completed_events">You have some warning messages.</string> <string name="missing_warning_fields_events">You have some warning messages.\nDo you want to mark this form as complete?</string> <string name="required">Required</string> - <string name="date">Date</string> - <string name="hint_year">Years</string> - <string name="hint_month">Months</string> - <string name="hint_day">Days</string> - <string name="wrong_date_format">%s can\'t be parsed as a date</string> <string name="polygon">Polygon</string> <string name="latitude">Latitude</string> <string name="longitude">Longitude</string> - <string name="coordinates_error">Coordinates values are not valid</string> - <string name="polygon_captured">Polygon captured</string> <string name="enter_value">Enter value</string> <string name="enter_url">Enter url</string> <string name="enter_email">Enter email</string> @@ -37,9 +30,6 @@ <string name="enter_long_text">Enter long text</string> <string name="enter_text">Enter text</string> <string name="due_date">Due date</string> - <string name="mandatory_field">Mandatory field</string> - <string name="form_latitude_prefix">Lat:</string> - <string name="form_longitude_prefix">Long:</string> <string name="not_saved">Not saved</string> <string name="review">Review</string> <string name="complete">Complete</string> @@ -49,21 +39,14 @@ <string name="missing_error_fields_events">Some fields have errors and they are not saved. \nDo you want to review the form?</string> <string name="review_message">Some fields need your attention.\nDo you want to review the form?</string> <string name="not_now">Not now</string> - <string name="save_anyway">Save anyway</string> <string name="keep_editing">Keep editing</string> <string name="event_can_be_completed">Do you want to mark this form as complete?</string> <string name="discard_go_back">If you exit now all the information in the form will be discarded.</string> <string name="field_errors_not_saved_discard">Some fields have errors and they are not saved. \nIf you exit now the changes will be discarded.</string> - <string name="field_errors_not_saved">Some fields have errors and they are not saved.</string> - <string name="fields_mandatory_missing">Some mandatory fields are missing and the form cannot be saved.</string> - <string name="fields_mandatory_missing_discard">Some mandatory fields are missing and the form cannot be saved. \nIf you exit now the changes will be discarded.</string> <string name="share">Share</string> <string name="camera_permission_denied">Camera permission is denied.\nYou need to enable it to use this feature.</string> <string name="action_close">Close</string> - <string name="program_rules_loop_warning_title">Program rules warning</string> - <string name="program_rules_loop_warning_message">There is a configuration issue causing a loop in the rules. Contact you administrator.</string> <string name="copied_text">Copied</string> - <string name="empty_description">No info for this field</string> <string name="take_photo">Take Photo</string> <string name="from_gallery_v2">From gallery</string> <string name="warning_error_on_complete_title">Check this!</string> @@ -73,13 +56,10 @@ <string name="tei_coordinates">Coordinates for the</string> <string name="no_reserved_values">There are no more reserved values. Contact your system administrator</string> <string name="incident_date">Incident date</string> - <string name="location_permission_denied">The location permission is needed for capturing coordinates. Please, enable them in the application settings</string> <string name="open_with">Open with</string> <string name="no_option_found">No option found</string> <string name="download">Download</string> <string name="scan">Scan</string> - <string name="qr_code">QR code</string> - <string name="bar_code">Bar code</string> <string name="add_location">Add location</string> <string name="form_without_fields">This form has no fields configured</string> <string name="event_details_section_title">%s details</string> diff --git a/form/src/test/java/org/dhis2/form/data/EnrollmentRepositoryTest.kt b/form/src/test/java/org/dhis2/form/data/EnrollmentRepositoryTest.kt index e356e9ac561..1d66933b4a1 100644 --- a/form/src/test/java/org/dhis2/form/data/EnrollmentRepositoryTest.kt +++ b/form/src/test/java/org/dhis2/form/data/EnrollmentRepositoryTest.kt @@ -58,7 +58,7 @@ class EnrollmentRepositoryTest { whenever(conf.program()?.selectIncidentDatesInFuture()) doReturn true whenever(conf.captureOrgUnitsCount()) doReturn 10 - whenever(conf.program()?.enrollmentDateLabel()) doReturn "Enrollment Date" + whenever(conf.program()?.displayEnrollmentDateLabel()) doReturn "Enrollment Date" whenever(enrolmentFormLabelsProvider.provideEnrollmentDateDefaultLabel("Program_UID")) doReturn "Enrollment Date" whenever( diff --git a/form/src/test/java/org/dhis2/form/data/EventRepositoryTest.kt b/form/src/test/java/org/dhis2/form/data/EventRepositoryTest.kt index 5333cb0d583..6775278ad4e 100644 --- a/form/src/test/java/org/dhis2/form/data/EventRepositoryTest.kt +++ b/form/src/test/java/org/dhis2/form/data/EventRepositoryTest.kt @@ -11,6 +11,7 @@ import org.dhis2.form.simprints.ramp.data.GetFormHistoryChartUseCase as GetSimpr import org.dhis2.form.ui.FieldViewModelFactory import org.dhis2.mobile.commons.customintents.CustomIntentRepository import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.arch.repositories.scope.RepositoryScope import org.hisp.dhis.android.core.category.CategoryCombo import org.hisp.dhis.android.core.common.Geometry import org.hisp.dhis.android.core.event.Event @@ -261,6 +262,16 @@ class EventRepositoryTest { .byProgramStageUid() .eq(anyOrNull()) .withDataElements() + .orderBySortOrder(RepositoryScope.OrderByDirection.ASC), + ) doReturn mock() + whenever( + d2 + .programModule() + .programStageSections() + .byProgramStageUid() + .eq(anyOrNull()) + .withDataElements() + .orderBySortOrder(RepositoryScope.OrderByDirection.ASC) .blockingGet(), ) doReturn listOf(mockedFirstSection, mockedSecondSection) } diff --git a/form/src/test/java/org/dhis2/form/data/FormValueStoreTest.kt b/form/src/test/java/org/dhis2/form/data/FormValueStoreTest.kt index 2e91e0324c4..5899c327e98 100644 --- a/form/src/test/java/org/dhis2/form/data/FormValueStoreTest.kt +++ b/form/src/test/java/org/dhis2/form/data/FormValueStoreTest.kt @@ -731,6 +731,7 @@ class FormValueStoreTest { .builder() .uid("fieldUid") .valueType(ValueType.TEXT) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build() val storeResult = deValueStore.deleteOptionValueIfSelected( @@ -1178,6 +1179,7 @@ class FormValueStoreTest { .builder() .uid(testingUid) .valueType(ValueType.TEXT) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build() whenever( d2 @@ -1386,6 +1388,7 @@ class FormValueStoreTest { .builder() .uid("uid") .valueType(ValueType.TEXT) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build() private fun mockedUniqueAttribute(): TrackedEntityAttribute = diff --git a/form/src/test/java/org/dhis2/form/integration/ProgramRulesTest.kt b/form/src/test/java/org/dhis2/form/integration/ProgramRulesTest.kt index e82111ac419..252ec89ee86 100644 --- a/form/src/test/java/org/dhis2/form/integration/ProgramRulesTest.kt +++ b/form/src/test/java/org/dhis2/form/integration/ProgramRulesTest.kt @@ -2,6 +2,7 @@ package org.dhis2.form.integration import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.databinding.ObservableField +import app.cash.turbine.test import io.reactivex.Flowable import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers @@ -31,6 +32,7 @@ import org.dhis2.form.model.StoreResult import org.dhis2.form.model.ValueStoreResult import org.dhis2.form.ui.FormViewModel import org.dhis2.form.ui.intent.FormIntent +import org.dhis2.form.ui.mapper.FormSectionMapper import org.dhis2.form.ui.provider.FormResultDialogProvider import org.dhis2.mobileProgramRules.RuleEngineHelper import org.hisp.dhis.android.core.D2 @@ -110,10 +112,10 @@ class ProgramRulesTest { } whenever(formValueStore.save(any(), anyOrNull(), anyOrNull())) doReturn - StoreResult( - "", - ValueStoreResult.VALUE_CHANGED, - ) + StoreResult( + "", + ValueStoreResult.VALUE_CHANGED, + ) repository = FormRepositoryImpl( @@ -142,6 +144,7 @@ class ProgramRulesTest { }, geometryController, resultDialogUiProvider = resultDialogUiProvider, + formSectionMapper = FormSectionMapper(), ) testingDispatcher.scheduler.advanceUntilIdle() @@ -158,17 +161,17 @@ class ProgramRulesTest { fun `Should assign a value`() = runTest { whenever(ruleEngineHelper.evaluate()) doReturn - listOf( - RuleEffect( - "", - RuleAction( - "assignedValue", - ProgramRuleActionType.ASSIGN.name, - mutableMapOf(Pair("field", "uid001")), + listOf( + RuleEffect( + "", + RuleAction( + "assignedValue", + ProgramRuleActionType.ASSIGN.name, + mutableMapOf(Pair("field", "uid001")), + ), + "newValue", ), - "newValue", - ), - ) + ) val intent = FormIntent.OnSave( @@ -177,12 +180,13 @@ class ProgramRulesTest { valueType = ValueType.TEXT, ) - formViewModel.submitIntent(intent) - advanceUntilIdle() + formViewModel.items.test { + formViewModel.submitIntent(intent) + val items = awaitItem() - val items = formViewModel.items.value ?: emptyList() + assert(items.find { it -> it.fields.find { field -> field.uid == "uid001" }?.value == "newValue" } != null) + } - assert(items.find { it.uid == "uid001" }?.value == "newValue") } @OptIn(ExperimentalCoroutinesApi::class) @@ -190,19 +194,19 @@ class ProgramRulesTest { fun `Should hide field`() = runTest { whenever(ruleEngineHelper.evaluate()) doReturn - listOf( - RuleEffect( - "ruleUid", - RuleAction( - "data", - ProgramRuleActionType.HIDEFIELD.name, - mutableMapOf( - "content" to "content", - "field" to "uid001", + listOf( + RuleEffect( + "ruleUid", + RuleAction( + "data", + ProgramRuleActionType.HIDEFIELD.name, + mutableMapOf( + "content" to "content", + "field" to "uid001", + ), ), ), - ), - ) + ) val intent = FormIntent.OnSave( @@ -211,15 +215,17 @@ class ProgramRulesTest { valueType = ValueType.TEXT, ) - formViewModel.submitIntent(intent) - advanceUntilIdle() - - val items = formViewModel.items.value ?: emptyList() + formViewModel.items.test { + formViewModel.submitIntent(intent) + val sections = awaitItem() - items.forEach { - assert(it.uid != "uid001") + sections.forEach { + assert(it.fields.size == 6) + it.fields.forEach { field -> + assert(field.uid != "uid001") + } + } } - assert(items.size == 6) } @OptIn(ExperimentalCoroutinesApi::class) @@ -227,20 +233,20 @@ class ProgramRulesTest { fun `Should hide section`() = runTest { whenever(ruleEngineHelper.evaluate()) doReturn - listOf( - RuleEffect( - "ruleUid", - RuleAction( - "data", - ProgramRuleActionType.HIDESECTION.name, - mutableMapOf( - "content" to "content", - "programStageSection" to "section1", + listOf( + RuleEffect( + "ruleUid", + RuleAction( + "data", + ProgramRuleActionType.HIDESECTION.name, + mutableMapOf( + "content" to "content", + "programStageSection" to "section1", + ), ), + "data", ), - "data", - ), - ) + ) val intent = FormIntent.OnSave( @@ -249,16 +255,18 @@ class ProgramRulesTest { valueType = ValueType.TEXT, ) - formViewModel.submitIntent(intent) - advanceUntilIdle() + formViewModel.items.test { + formViewModel.submitIntent(intent) + val sections = awaitItem() - val items = formViewModel.items.value ?: emptyList() + assert(sections.size == 1) + assertTrue(sections.first().fields.size == 4) + assertTrue(sections.first().fields[0].uid == "uid004") + assertTrue(sections.first().fields[1].uid == "uid005") + assertTrue(sections.first().fields[2].uid == "uid006") + assertTrue(sections.first().fields[3].uid == "uid007") + } - assertTrue(items.size == 4) - assertTrue(items[0].uid == "uid004") - assertTrue(items[1].uid == "uid005") - assertTrue(items[2].uid == "uid006") - assertTrue(items[3].uid == "uid007") } @OptIn(ExperimentalCoroutinesApi::class) @@ -266,32 +274,32 @@ class ProgramRulesTest { fun `Should show warning and error message`() = runTest { whenever(ruleEngineHelper.evaluate()) doReturn - listOf( - RuleEffect( - "ruleUid", - RuleAction( - "data", - ProgramRuleActionType.SHOWWARNING.name, - mutableMapOf( - "content" to "content", - "field" to "uid002", + listOf( + RuleEffect( + "ruleUid", + RuleAction( + "data", + ProgramRuleActionType.SHOWWARNING.name, + mutableMapOf( + "content" to "content", + "field" to "uid002", + ), ), + "warning message", ), - "warning message", - ), - RuleEffect( - "ruleUid2", - RuleAction( - "data", - ProgramRuleActionType.SHOWERROR.name, - mutableMapOf( - "content" to "content", - "field" to "uid005", + RuleEffect( + "ruleUid2", + RuleAction( + "data", + ProgramRuleActionType.SHOWERROR.name, + mutableMapOf( + "content" to "content", + "field" to "uid005", + ), ), + "error message", ), - "error message", - ), - ) + ) val intent = FormIntent.OnSave( @@ -300,19 +308,21 @@ class ProgramRulesTest { valueType = ValueType.TEXT, ) - formViewModel.submitIntent(intent) - advanceUntilIdle() - - val items = formViewModel.items.value ?: emptyList() - - items.forEach { - if (it.uid == "uid002") { - assertNotNull(it.warning) - assertEquals(it.warning, "content warning message") - } - if (it.uid == "uid005") { - assertNotNull(it.error) - assertEquals(it.error, "content error message") + formViewModel.items.test { + formViewModel.submitIntent(intent) + + val sections = awaitItem() + assertTrue(sections.size == 1) + + sections.first().fields.forEach { + if (it.uid == "uid002") { + assertNotNull(it.warning) + assertEquals(it.warning, "content warning message") + } + if (it.uid == "uid005") { + assertNotNull(it.error) + assertEquals(it.error, "content error message") + } } } } @@ -322,20 +332,20 @@ class ProgramRulesTest { fun `Should set mandatory field`() = runTest { whenever(ruleEngineHelper.evaluate()) doReturn - listOf( - RuleEffect( - "ruleUid", - RuleAction( - "data", - ProgramRuleActionType.SETMANDATORYFIELD.name, - mutableMapOf( - "content" to "content", - "field" to "uid003", + listOf( + RuleEffect( + "ruleUid", + RuleAction( + "data", + ProgramRuleActionType.SETMANDATORYFIELD.name, + mutableMapOf( + "content" to "content", + "field" to "uid003", + ), ), + "data", ), - "data", - ), - ) + ) val intent = FormIntent.OnSave( @@ -344,16 +354,17 @@ class ProgramRulesTest { valueType = ValueType.TEXT, ) - formViewModel.submitIntent(intent) - advanceUntilIdle() - - val items = formViewModel.items.value ?: emptyList() - - items.forEach { - if (it.uid == "uid003") { - assertTrue(it.mandatory) + formViewModel.items.test { + formViewModel.submitIntent(intent) + val sections = awaitItem() + assertTrue(sections.size == 1) + sections.first().fields.forEach { + if (it.uid == "uid003") { + assertTrue(it.mandatory) + } } } + } @OptIn(ExperimentalCoroutinesApi::class) @@ -361,21 +372,21 @@ class ProgramRulesTest { fun `Should show option`() = runTest { whenever(ruleEngineHelper.evaluate()) doReturn - listOf( - RuleEffect( - "ruleUid", - RuleAction( - "data", - ProgramRuleActionType.SHOWOPTIONGROUP.name, - mutableMapOf( - "content" to "content", - "field" to "uid006", - "optionGroup" to "optionGroupId", + listOf( + RuleEffect( + "ruleUid", + RuleAction( + "data", + ProgramRuleActionType.SHOWOPTIONGROUP.name, + mutableMapOf( + "content" to "content", + "field" to "uid006", + "optionGroup" to "optionGroupId", + ), ), + "data", ), - "data", - ), - ) + ) whenever( dataEntryRepository.options( @@ -394,10 +405,10 @@ class ProgramRulesTest { ) whenever(formValueStore.deleteOptionValueIfSelected(any(), any())) doReturn - StoreResult( - "uid006", - ValueStoreResult.VALUE_CHANGED, - ) + StoreResult( + "uid006", + ValueStoreResult.VALUE_CHANGED, + ) formViewModel.submitIntent(intent) advanceUntilIdle() @@ -415,21 +426,21 @@ class ProgramRulesTest { fun `Should hide option`() = runTest { whenever(ruleEngineHelper.evaluate()) doReturn - listOf( - RuleEffect( - "ruleUid", - RuleAction( - "data", - ProgramRuleActionType.HIDEOPTION.name, - mutableMapOf( - "content" to "content", - "field" to "uid007", - "option" to "Option2", + listOf( + RuleEffect( + "ruleUid", + RuleAction( + "data", + ProgramRuleActionType.HIDEOPTION.name, + mutableMapOf( + "content" to "content", + "field" to "uid007", + "option" to "Option2", + ), ), + "data", ), - "data", - ), - ) + ) whenever( dataEntryRepository.options( @@ -448,10 +459,10 @@ class ProgramRulesTest { ) whenever(formValueStore.deleteOptionValueIfSelected(any(), any())) doReturn - StoreResult( - "uid007", - ValueStoreResult.VALUE_HAS_NOT_CHANGED, - ) + StoreResult( + "uid007", + ValueStoreResult.VALUE_HAS_NOT_CHANGED, + ) formViewModel.submitIntent(intent) advanceUntilIdle() diff --git a/form/src/test/java/org/dhis2/form/ui/DataEntryIntegrationTest.kt b/form/src/test/java/org/dhis2/form/ui/DataEntryIntegrationTest.kt index a2baa1d88c9..88b11944b12 100644 --- a/form/src/test/java/org/dhis2/form/ui/DataEntryIntegrationTest.kt +++ b/form/src/test/java/org/dhis2/form/ui/DataEntryIntegrationTest.kt @@ -2,8 +2,8 @@ package org.dhis2.form.ui import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.databinding.ObservableField -import androidx.lifecycle.Observer import androidx.paging.PagingData +import app.cash.turbine.test import io.reactivex.Flowable import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -30,6 +30,7 @@ import org.dhis2.form.model.SectionUiModelImpl import org.dhis2.form.model.StoreResult import org.dhis2.form.model.ValueStoreResult import org.dhis2.form.ui.intent.FormIntent +import org.dhis2.form.ui.mapper.FormSectionMapper import org.dhis2.form.ui.provider.DisplayNameProvider import org.dhis2.form.ui.provider.FormResultDialogProvider import org.dhis2.form.ui.provider.LegendValueProvider @@ -164,140 +165,143 @@ class DataEntryIntegrationTest { geometryController = geometryController, openErrorLocation = false, resultDialogUiProvider = resultDialogUiProvider, + formSectionMapper = FormSectionMapper(), ) } @Test fun shouldAllowDataEntryCorrectly() = runTest { - val observedItems = mutableListOf<List<FieldUiModel>>() - val observer = - Observer<List<FieldUiModel>> { items -> - observedItems.add(items) - } - - formViewModel.items.observeForever(observer) - - val focusOnReportDateIntent = - FormIntent.OnFocus( - uid = "EVENT_REPORT_DATE_UID", - value = "", + formViewModel.items.test { + + val focusOnReportDateIntent = + FormIntent.OnFocus( + uid = "EVENT_REPORT_DATE_UID", + value = "", + ) + formViewModel.submitIntent(focusOnReportDateIntent) + + assert( + awaitItem().first().fields + .find { it.uid == "EVENT_REPORT_DATE_UID" } + ?.value + .isNullOrEmpty(), ) - formViewModel.submitIntent(focusOnReportDateIntent) - - assert( - observedItems - .last() - .find { it.uid == "EVENT_REPORT_DATE_UID" } - ?.value - .isNullOrEmpty(), - ) - - val enterReportDateIntent = - FormIntent.OnTextChange( - uid = "EVENT_REPORT_DATE_UID", - value = "2024-03-20", - valueType = ValueType.DATE, - ) - formViewModel.submitIntent(enterReportDateIntent) - - val focusOnOrgUnitIntent = - FormIntent.OnFocus( - uid = "EVENT_ORG_UNIT_UID", - value = "", - ) - formViewModel.submitIntent(focusOnOrgUnitIntent) - val enterOrgUnitIntent = - FormIntent.OnTextChange( - uid = "EVENT_ORG_UNIT_UID", - value = "g8upMTyEZGZ", - valueType = ValueType.ORGANISATION_UNIT, + val enterReportDateIntent = + FormIntent.OnTextChange( + uid = "EVENT_REPORT_DATE_UID", + value = "2024-03-20", + valueType = ValueType.DATE, + ) + formViewModel.submitIntent(enterReportDateIntent) + + val focusOnOrgUnitIntent = + FormIntent.OnFocus( + uid = "EVENT_ORG_UNIT_UID", + value = "", + ) + formViewModel.submitIntent(focusOnOrgUnitIntent) + + assert( + awaitItem().first().fields + .find { it.uid == "EVENT_REPORT_DATE_UID" }?.value == "2024-03-20", ) - formViewModel.submitIntent(enterOrgUnitIntent) - val focusOnCoordinatesIntent = - FormIntent.OnFocus( - uid = "EVENT_COORDINATE_UID", - value = "", + val enterOrgUnitIntent = + FormIntent.OnTextChange( + uid = "EVENT_ORG_UNIT_UID", + value = "g8upMTyEZGZ", + valueType = ValueType.ORGANISATION_UNIT, + ) + formViewModel.submitIntent(enterOrgUnitIntent) + + val focusOnCoordinatesIntent = + FormIntent.OnFocus( + uid = "EVENT_COORDINATE_UID", + value = "", + ) + formViewModel.submitIntent(focusOnCoordinatesIntent) + + assert( + awaitItem().first().fields + .find { it.uid == "EVENT_ORG_UNIT_UID" }?.value == "g8upMTyEZGZ", ) - formViewModel.submitIntent(focusOnCoordinatesIntent) - // Change section - formViewModel.submitIntent(FormIntent.OnSection(sectionUid = "EVENT_DATA_SECTION_UID")) - - // Focus on age - val focusOnAgeIntent = - FormIntent.OnFocus( - uid = "qrur9Dvnyt5", - value = "", - ) - formViewModel.submitIntent(focusOnAgeIntent) - - // Enter age - val enterAgeIntent = - FormIntent.OnTextChange( - uid = "qrur9Dvnyt5", - value = "20", - valueType = ValueType.AGE, + // Change section + formViewModel.submitIntent(FormIntent.OnSection(sectionUid = "EVENT_DATA_SECTION_UID")) + + awaitItem() + + // Focus on age + val focusOnAgeIntent = + FormIntent.OnFocus( + uid = "qrur9Dvnyt5", + value = "", + ) + formViewModel.submitIntent(focusOnAgeIntent) + + // Enter age + val enterAgeIntent = + FormIntent.OnTextChange( + uid = "qrur9Dvnyt5", + value = "20", + valueType = ValueType.AGE, + ) + formViewModel.submitIntent(enterAgeIntent) + + awaitItem() + + // focus on input field with legend + val focusOnLegendFieldIntent = + FormIntent.OnFocus( + uid = "INPUT_NUMBER_WITH_LEGEND_UID", + value = "", + ) + formViewModel.submitIntent(focusOnLegendFieldIntent) + + assert( + awaitItem()[1].fields + .find { it.uid == "qrur9Dvnyt5" }?.value == "20", ) - formViewModel.submitIntent(enterAgeIntent) - // focus on input field with legend - val focusOnLegendFieldIntent = - FormIntent.OnFocus( - uid = "INPUT_NUMBER_WITH_LEGEND_UID", - value = "", - ) - formViewModel.submitIntent(focusOnLegendFieldIntent) - - // enter value on input field with legend - val enterValueOnLegendFieldIntent = - FormIntent.OnTextChange( - uid = "INPUT_NUMBER_WITH_LEGEND_UID", - value = "25", - valueType = ValueType.NUMBER, + // enter value on input field with legend + val enterValueOnLegendFieldIntent = + FormIntent.OnTextChange( + uid = "INPUT_NUMBER_WITH_LEGEND_UID", + value = "25", + valueType = ValueType.NUMBER, + ) + + formViewModel.submitIntent(enterValueOnLegendFieldIntent) + + // Focus on gender + val focusOnGenderIntent = + FormIntent.OnFocus( + uid = "oZg33kd9taw", + value = "", + ) + formViewModel.submitIntent(focusOnGenderIntent) + + assert( + awaitItem()[1].fields + .find { it.uid == "INPUT_NUMBER_WITH_LEGEND_UID" } + ?.legend == legendValueItem, ) - formViewModel.submitIntent(enterValueOnLegendFieldIntent) - - // Focus on gender - val focusOnGenderIntent = - FormIntent.OnFocus( - uid = "oZg33kd9taw", - value = "", + val enterGenderIntent = + FormIntent.OnSave( + uid = "oZg33kd9taw", + value = "Female", + valueType = ValueType.MULTI_TEXT, + ) + formViewModel.submitIntent(enterGenderIntent) + + assert( + awaitItem()[1].fields + .find { it.uid == "oZg33kd9taw" }?.value == "Female", ) - formViewModel.submitIntent(focusOnGenderIntent) - - val enterGenderIntent = - FormIntent.OnSave( - uid = "oZg33kd9taw", - value = "Female", - valueType = ValueType.MULTI_TEXT, - ) - formViewModel.submitIntent(enterGenderIntent) - - assert( - observedItems.last().find { it.uid == "EVENT_REPORT_DATE_UID" }?.value == "2024-03-20", - ) - assert( - observedItems.last().find { it.uid == "EVENT_ORG_UNIT_UID" }?.value == "g8upMTyEZGZ", - ) - assert( - observedItems - .last() - .find { it.uid == "INPUT_NUMBER_WITH_LEGEND_UID" } - ?.legend == legendValueItem, - ) - assert( - observedItems.last().find { it.uid == "qrur9Dvnyt5" }?.value == "20", - ) - assert( - observedItems.last().find { it.uid == "oZg33kd9taw" }?.value == "Female", - ) - - // Clean up - formViewModel.items.removeObserver(observer) + } } private fun provideMalariaCaseRegistrationEventItems(): List<FieldUiModel> { diff --git a/form/src/test/java/org/dhis2/form/ui/FormViewModelTest.kt b/form/src/test/java/org/dhis2/form/ui/FormViewModelTest.kt index eca5c6396ca..3337d43c2a9 100644 --- a/form/src/test/java/org/dhis2/form/ui/FormViewModelTest.kt +++ b/form/src/test/java/org/dhis2/form/ui/FormViewModelTest.kt @@ -5,6 +5,7 @@ import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.lifecycle.Observer import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest @@ -19,6 +20,7 @@ import org.dhis2.form.model.RowAction import org.dhis2.form.simprints.ramp.model.FormHistoryChart import org.dhis2.form.ui.event.RecyclerViewUiEvents import org.dhis2.form.ui.intent.FormIntent +import org.dhis2.form.ui.mapper.FormSectionMapper import org.dhis2.form.ui.provider.FormResultDialogProvider import org.dhis2.mobile.commons.model.CustomIntentRequestArgumentModel import org.hisp.dhis.android.core.common.ValueType @@ -40,7 +42,10 @@ class FormViewModelTest { @get:Rule val instantExecutorRule = InstantTaskExecutorRule() - private val repository: FormRepository = mock() + private val repository: FormRepository = mock { + on { runBlocking { fetchFormItems(any()) } } doReturn emptyList() + on { runBlocking { composeList(any()) } } doReturn emptyList() + } private val testingDispatcher = StandardTestDispatcher() private val dispatcher: DispatcherProvider = mock { @@ -49,6 +54,8 @@ class FormViewModelTest { private val geometryController: GeometryController = mock() private val resultDialogUiProvider: FormResultDialogProvider = mock() + private val formSectionMapper = FormSectionMapper() + private lateinit var viewModel: FormViewModel @Before @@ -61,6 +68,7 @@ class FormViewModelTest { dispatcher, geometryController, resultDialogUiProvider = resultDialogUiProvider, + formSectionMapper = formSectionMapper, ) whenever(repository.getDateFormatConfiguration()) doReturn "ddMMyyyy" } diff --git a/gradle.properties b/gradle.properties index f4bd86ad56c..9dde98c3fd5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,7 +16,10 @@ org.gradle.jvmargs=-Xmx4096M -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true android.useAndroidX=true -android.enableJetifier=true +# TODO: Remove when SonarQube Gradle plugin supports AGP 9.x new DSL (AppExtension removal) +# NOTE: AGP 9.1.0 also removed getCDirectories() from SourceProvider, breaking sonar-scanner-gradle +# 7.2.3.7755. Pinned to AGP 9.0.1 until SonarQube Gradle plugin 7.3 adds AGP 9.1+ support. +android.newDsl=false #disable firebase performance. Should be enabled for release firebasePerformanceInstrumentationEnabled=false @@ -35,10 +38,15 @@ org.gradle.caching=true android.suppressUnsupportedCompileSdk=32 android.nonTransitiveRClass=false -android.nonFinalResIds=false - -android.enableR8.fullMode=false # Kotlin compiler flags -kotlin.daemon.jvmargs=-Xmx2048M -kotlin.incremental=true \ No newline at end of file +kotlin.daemon.jvmargs=-Xmx4096M +kotlin.incremental=true + +# Dependency verification is disabled for local development and CI to avoid +# noise from unverified artifacts. Release pipelines run with strict +# dependency verification enabled (e.g. --dependency-verification strict) using +# existing verification metadata. +org.gradle.dependency.verification=off +android.r8.strictFullModeForKeepRules=false +kotlinx.atomicfu.enableJvmIrTransformation=true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d5efc12114d..579a4e2234d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,24 +1,23 @@ [versions] kotlinxDatetime = "0.7.1-0.6.x-compat" #Needs to be compatible with the Rule engine, update when it's updated -lifecycleRuntimeCompose = "2.9.5" -navigationCompose = "2.9.1" +lifecycleRuntimeCompose = "2.9.6" +navigationCompose = "2.9.2" sdk = "36" -minSdk = "21" -vCode = "151" -vName = "3.3.1" -gradle = "8.13.2" -kotlin = '2.2.21' +minSdk = "23" +vCode = "155" +vName = "3.4.1-RC" +gradle = "9.0.1" +kotlin = '2.3.20' dagger = '2.57.2' jacoco = '0.8.14' -designSystem = "0.6.1" -dhis2sdk = "1.13.1" -ruleEngine = "3.3.11" -expressionParser = "1.2.2" +designSystem = "0.7.1-SNAPSHOT" +dhis2sdk = "1.14.1-SNAPSHOT" +ruleEngine = "3.7.2" +expressionParser = "1.4.1" appcompat = "1.7.1" annotation = "1.9.1" cardview = "1.0.0" legacysupport = "1.0.0" -multidex = "2.0.1" constraintlayout = "2.2.1" lifecycle = "2.9.4" work = "2.10.5" @@ -26,17 +25,15 @@ exif = "1.4.2" corektx = "1.17.0" fragmentktx = "1.8.9" recyclerview = "1.4.0" -compose = "1.9.3" -composePluginVersion = "1.9.1" -composePaging = "3.3.6" -pagingTesting = "3.3.6" +compose = "1.10.6" +composePluginVersion = "1.10.3" +composePaging = "3.4.2" +pagingTesting = "3.4.2" composeConstraintLayout = "1.1.1" activityCompose = "1.11.0" viewModelCompose = "2.9.4" material = "1.13.0" material3 = "1.4.0" -themeAdapter = "0.36.0" -pinlock = "2.1.0" fancyshowcase = "1.4.0" lottie = "6.6.10" rxjava = "2.2.21" @@ -44,19 +41,19 @@ rxandroid = "2.1.1" maplibremarkerview = "3.0.2" maplibreannotation = "3.0.2" matomo = "4.4" -sentry = "8.29.0" -sentryPlugin = "5.12.2" +sentry = "8.33.0" +sentryPlugin = "6.1.0" timber = "5.0.1" rxlint = "1.7.8" crashactivity = "2.4.0" zxing = "3.5.4" zxingandroid = "4.3.0" -root = "0.1.1" +root = "0.1.2" openid = "0.11.1" conscrypt = "2.5.3" gson = "2.13.2" okhttp = "4.12.0" -jodatime = "2.14.0" +jodatime = "2.14.1" glide = "5.0.5" guava = "33.5.0-android" mockito = "5.20.0" @@ -84,19 +81,21 @@ material3WindowSize = "1.4.0" material3WindowSizeCompose = "1.8.2" material3AdaptiveAndroid = "1.1.0" koin = "4.1.1" -junitJupiter = "6.0.1" +junitJupiter = "6.0.3" ktxml = "1.0.0" atomicfu = "0.29.0" playservicesauth = "21.4.0" -playservicesphone = "18.0.1" #Can not be updated to latest due minSDK requirement of 23 -ksp = "2.2.20-2.0.4" +playservicesphone = "18.0.2" #Can not be updated to latest due minSDK requirement of 23 +ksp = "2.3.6" commonsText = "1.14.0" ktlint = "13.1.0" -sonarqube = "7.0.0.6105" +sonarqube = "7.2.3.7755" browser = "1.9.0" biometric = "1.1.0" coil = "3.3.0" cyclonedx = "2.1.0" +jetbrains-material3="1.9.0" +materialIconsExtended = "1.7.3" [libraries] gradlePlugin = { group = "com.android.tools.build", name = "gradle", version.ref = "gradle" } @@ -129,7 +128,6 @@ androidx-activity-compose = { group = "androidx.activity", name = "activity-comp androidx-annotation = { group = "androidx.annotation", name = "annotation", version.ref = "annotation" } androidx-cardview = { group = "androidx.cardview", name = "cardview", version.ref = "cardview" } androidx-legacy-support-v4 = { group = "androidx.legacy", name = "legacy-support-v4", version.ref = "legacysupport" } -androidx-multidex = { group = "androidx.multidex", name = "multidex", version.ref = "multidex" } androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" } androidx-work = { group = "androidx.work", name = "work-runtime", version.ref = "work" } androidx-workrx = { group = "androidx.work", name = "work-rxjava2", version.ref = "work" } @@ -146,7 +144,6 @@ google-guava = { group = "com.google.guava", name = "guava", version.ref = "guav google-auth = { group = "com.google.android.gms", name = "play-services-auth", version.ref = "playservicesauth" } google-auth-apiphone = { group = "com.google.android.gms", name = "play-services-auth-api-phone", version.ref = "playservicesphone" } google-material = { group = "com.google.android.material", name = "material", version.ref = "material" } -google-material3-themeadapter = { group = "com.google.accompanist", name = "accompanist-themeadapter-material3", version.ref = "themeAdapter" } google-gson = { group = "com.google.code.gson", name = "gson", version.ref = "gson" } kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "kotlinxDatetime" } network-okhttp = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhttp" } @@ -156,7 +153,6 @@ dagger-compiler = { group = "com.google.dagger", name = "dagger-compiler", versi rx-java = { group = "io.reactivex.rxjava2", name = "rxjava", version.ref = "rxjava" } rx-android = { group = "io.reactivex.rxjava2", name = "rxandroid", version.ref = "rxandroid" } rx-relay = { group = "com.jakewharton.rxrelay2", name = "rxrelay", version.ref = "rxrelay" } -github-pinlock = { group = "com.github.aritraroy", name = "PinLockView", version.ref = "pinlock" } github-fancyshowcase = { group = "com.github.faruktoptas", name = "FancyShowCaseView", version.ref = "fancyshowcase" } github-glide = { group = "com.github.bumptech.glide", name = "glide", version.ref = "glide" } github-glide-compiler = { group = "com.github.bumptech.glide", name = "compiler", version.ref = "glide" } @@ -211,6 +207,7 @@ koin-android = { group = "io.insert-koin", name = "koin-android", version.ref = koin-androidx-compose = { module = "io.insert-koin:koin-androidx-compose", version.ref = "koin" } koin-compose = { module = "io.insert-koin:koin-compose", version.ref = "koin" } koin-composeVM = { module = "io.insert-koin:koin-compose-viewmodel", version.ref = "koin" } +koin-work = { module = "io.insert-koin:koin-androidx-workmanager", version.ref = "koin" } koin-test = { module = "io.insert-koin:koin-test", version.ref = "koin" } koin-test-junit5 = { module = "io.insert-koin:koin-test-junit5", version.ref = "koin" } koin-test-junit4 = { module = "io.insert-koin:koin-test-junit4", version.ref = "koin" } @@ -220,23 +217,30 @@ ktxml = { module = "org.kobjects.ktxml:core", version.ref = "ktxml" } commons-text = { module = "org.apache.commons:commons-text", version.ref = "commonsText" } coil = { module = "io.coil-kt.coil3:coil-compose", version.ref = "coil"} coil-network = { module = "io.coil-kt.coil3:coil-network-okhttp", version.ref = "coil"} +compose-runtime = { group = "org.jetbrains.compose.runtime", name = "runtime", version.ref = "composePluginVersion" } +compose-foundation = { group = "org.jetbrains.compose.foundation", name = "foundation", version.ref = "composePluginVersion" } +compose-ui = { group = "org.jetbrains.compose.ui", name = "ui", version.ref = "composePluginVersion" } +compose-ui-uiToolingPreview = { group = "org.jetbrains.compose.ui", name = "ui-tooling-preview", version.ref = "composePluginVersion" } +compose-material3 = { group = "org.jetbrains.compose.material3", name = "material3", version.ref = "jetbrains-material3" } +compose-components-resources = { group = "org.jetbrains.compose.components", name = "components-resources", version.ref = "composePluginVersion" } +compose-desktop-common = { group = "org.jetbrains.compose.desktop", name = "desktop", version.ref = "composePluginVersion" } +compose-material3-iconsExtendend = { group = "org.jetbrains.compose.material", name = "material-icons-extended", version.ref = "materialIconsExtended" } [plugins] +kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } +android-kotlin-multiplatform-library = { id = "com.android.kotlin.multiplatform.library", version.ref = "gradle" } kotlin-compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } kotlin-serialization = { id = "kotlinx-serialization" } compose = { id = "org.jetbrains.compose", version.ref = "composePluginVersion" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } kotlin-atomicfu = { id = "org.jetbrains.kotlinx.atomicfu", version.ref = "atomicfu" } +legacy-kapt = { id = "com.android.legacy-kapt", version.ref = "gradle" } ktlint = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlint" } sonarqube = { id = "org.sonarqube", version.ref = "sonarqube" } sentry = { id = "io.sentry.android.gradle", version.ref = "sentryPlugin" } cyclonedx = { id = "org.cyclonedx.bom", version.ref = "cyclonedx" } [bundles] -uicomponents-implementation = ["androidx-coreKtx", "androidx-material3", "androidx-material3-window", "androidx-material3-adaptative-android", "google-material", "lottie-compose", "dhis2-mobile-designsystem"] -uicomponents-api = ["dhis2-mobile-designsystem", "androidx-compose-constraintlayout", "androidx-compose-preview", "androidx-compose-ui", "google-material3-themeadapter"] -uicomponents-debugapi = ["androidx-compose-uitooling"] -uicomponents-androidtest = ["test-junit-ext"] analytics-implementation = ["androidx-cardview", "androidx-constraintlayout"] analytics-api = ["github-charts"] analytics-test = ["test-mockitoCore", "test-mockitoInline", "test-mockitoKotlin", "test-kotlinCoroutines", "test-archCoreTesting"] @@ -249,5 +253,3 @@ table-androidTest = ["test-compose-ui-test", "test-uiautomator", "test-junitKtx" stock-implementation = ["androidx-activity-compose", "androidx-annotation", "rx-relay", "security-openId", "androidx-preferenceKtx", "androidx-work", "androidx-activityKtx", "androidx-lifecycle-viewmodel-compose", "analytics-customactivityoncrash"] stock-core = ["desugar"] stock-test = ["test-mockitoKotlin", "test-mockitoInline", "test-archCoreTesting", "test-javafaker", "test-kotlinCoroutines"] -tracker-implementation = ["androidx-lifecycle-viewmodel-compose", "androidx-activity-compose"] -tracker-test = ["test-mockitoCore", "test-mockitoInline", "test-mockitoKotlin", "test-testCore", "test-archCoreTesting", "test-kotlinCoroutines"] diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml new file mode 100644 index 00000000000..2e930a4cd2f --- /dev/null +++ b/gradle/verification-metadata.xml @@ -0,0 +1,5750 @@ +<?xml version="1.0" encoding="UTF-8"?> +<verification-metadata xmlns="https://schema.gradle.org/dependency-verification" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://schema.gradle.org/dependency-verification https://schema.gradle.org/dependency-verification/dependency-verification-1.3.xsd"> + <configuration> + <verify-metadata>true</verify-metadata> + <verify-signatures>false</verify-signatures> + <trusted-artifacts> + <trust group="com.google.devtools.ksp" name="symbol-processing-aa-embeddable"/> + <trust group="org.hisp.dhis.mobile" name="designsystem"/> + <trust group="org.jetbrains.intellij.deps.kotlinx"/> + <trust file=".*-javadoc\.jar" regex="true"/> + <trust file=".*-sources\.jar" regex="true"/> + <trust file=".*\.module" regex="true"/> + <trust file=".*\.pom" regex="true"/> + <trust file="gradle-.*-src\.zip" regex="true"/> + <trust group="com.android.tools.build" name="aapt2" regex="true"/> + <trust group="org.hisp.dhis" name="android-core" version=".*" regex="true"/> + <trust group="org.hisp.dhis" name="android-core" version=".*-SNAPSHOT" regex="true"/> + <trust group="org.hisp.dhis.mobile" name=".*" version=".*-SNAPSHOT" regex="true"/> + </trusted-artifacts> + <ignored-keys> + <ignored-key id="0AA3E5C3D232E79B" reason="Key couldn't be downloaded from any key server"/> + <ignored-key id="164779204E106A76" reason="Key couldn't be downloaded from any key server"/> + <ignored-key id="1A2A1C94BDE89688" reason="Key couldn't be downloaded from any key server"/> + <ignored-key id="2A742740E08E7F8D" reason="Key couldn't be downloaded from any key server"/> + <ignored-key id="340B090F727518D8" reason="Key couldn't be downloaded from any key server"/> + <ignored-key id="3AD93C3C677A106E" reason="Key couldn't be downloaded from any key server"/> + <ignored-key id="3EFD9D223D715E9A" reason="Key couldn't be downloaded from any key server"/> + <ignored-key id="5E1F79A7C298661E" reason="Key couldn't be downloaded from any key server"/> + <ignored-key id="5E975CB00C643DBF" reason="Key couldn't be downloaded from any key server"/> + <ignored-key id="5F69AD087600B22C" reason="Key couldn't be downloaded from any key server"/> + <ignored-key id="6FD54E1F311B47E9" reason="Key couldn't be downloaded from any key server"/> + <ignored-key id="771FE1992AC2ED7C" reason="Key couldn't be downloaded from any key server"/> + <ignored-key id="7905DE25C78AD456" reason="Key couldn't be downloaded from any key server"/> + <ignored-key id="79752DB6C966F0B8" reason="Key couldn't be downloaded from any key server"/> + <ignored-key id="80C08B1C29100955" reason="Key couldn't be downloaded from any key server"/> + <ignored-key id="830004571BB06CFF" reason="Key couldn't be downloaded from any key server"/> + <ignored-key id="94B291AEF984A085" reason="Key couldn't be downloaded from any key server"/> + <ignored-key id="9DAADC1C9FCC82D0" reason="Key couldn't be downloaded from any key server"/> + <ignored-key id="A7764F502A938C99" reason="Key couldn't be downloaded from any key server"/> + <ignored-key id="BAC30622339994C4" reason="Key couldn't be downloaded from any key server"/> + <ignored-key id="C020E96222A31FB3" reason="Key couldn't be downloaded from any key server"/> + <ignored-key id="C2148900BCD3C2AF" reason="Key couldn't be downloaded from any key server"/> + <ignored-key id="CDF00D9076B9AD01" reason="Key couldn't be downloaded from any key server"/> + <ignored-key id="CFAE163B64AC9189" reason="Key couldn't be downloaded from any key server"/> + <ignored-key id="D45C2659D37F5C87" reason="Key couldn't be downloaded from any key server"/> + <ignored-key id="EE92349AD86DE446" reason="Key couldn't be downloaded from any key server"/> + </ignored-keys> + <trusted-keys> + <trusted-key id="03C123038C20AAE9E286C857479D601F3A7B5C1A" group="com.github.ajalt.clikt"/> + <trusted-key id="042B29E928995B9DB963C636C7CA19B7B620D787" group="com.github.stephenc.jcip" name="jcip-annotations" version="1.0-1"/> + <trusted-key id="04543577D6A9CC626239C50C7ECBD740FF06AEB5"> + <trusting group="org.glassfish.jaxb"/> + <trusting group="org.jvnet.staxex"/> + <trusting group="^com[.]sun($|([.].*))" regex="true"/> + </trusted-key> + <trusted-key id="0785B3EFF60B1B1BEA94E0BB7C25280EAE63EBE5" group="org.apache.httpcomponents"/> + <trusted-key id="07D8B5E643C857162A97C253A994DB3584B8E387" group="nl.littlerobots.rxlint" name="rxlint" version="1.7.8"/> + <trusted-key id="09939C73246B4BA7444CAA453D002DBC5EA9615F" group="dev.drewhamilton.poko"/> + <trusted-key id="0CC641C3A62453AB390066C4A41F13C999945293" group="commons-logging" name="commons-logging" version="1.2"/> + <trusted-key id="0D35D3F60078655126908E8AF3D1600878E85A3D" group="io.netty"/> + <trusted-key id="0E225917414670F4442C250DFD533C07C264648F"> + <trusting group="androidx.databinding"/> + <trusting group="androidx.paging"/> + <trusting group="^androidx[.]compose($|([.].*))" regex="true"/> + <trusting group="^com[.]android($|([.].*))" regex="true"/> + </trusted-key> + <trusted-key id="0F06FF86BEEAF4E71866EE5232EE5355A6BC6E42"> + <trusting group="androidx.activity"/> + <trusting group="androidx.annotation"/> + <trusting group="androidx.appcompat"/> + <trusting group="androidx.browser"/> + <trusting group="androidx.collection"/> + <trusting group="androidx.constraintlayout"/> + <trusting group="androidx.core"/> + <trusting group="androidx.databinding"/> + <trusting group="androidx.dynamicanimation"/> + <trusting group="androidx.exifinterface"/> + <trusting group="androidx.fragment"/> + <trusting group="androidx.lifecycle"/> + <trusting group="androidx.navigation"/> + <trusting group="androidx.navigationevent"/> + <trusting group="androidx.paging"/> + <trusting group="androidx.room"/> + <trusting group="androidx.savedstate"/> + <trusting group="androidx.sqlite"/> + <trusting group="androidx.transition"/> + <trusting group="androidx.window"/> + <trusting group="androidx.work"/> + <trusting group="^androidx[.]compose($|([.].*))" regex="true"/> + <trusting group="^androidx[.]test($|([.].*))" regex="true"/> + </trusted-key> + <trusted-key id="120D6F34E627ED3A772EBBFE55C7E5E701832382" group="org.yaml" name="snakeyaml" version="1.23"/> + <trusted-key id="147B691A19097624902F4EA9689CBE64F4BC997F" group="^org[.]mockito($|([.].*))" regex="true"/> + <trusted-key id="1597AB231B7ADD7E14B1D9C43F00DB67AE236E2E" group="org.conscrypt" name="conscrypt-android" version="2.5.3"/> + <trusted-key id="19BEAB2D799C020F17C69126B16698A4ADF4D638" group="org.checkerframework"/> + <trusted-key id="1D0A8B5E77C678A7C724445ABF984B4145EA13F7" group="com.squareup" name="javapoet" version="1.13.0"/> + <trusted-key id="1D217F8475EEE9F19AB8DD6B793FD5751A0F0780"> + <trusting group="app.cash.turbine"/> + <trusting group="^com[.]squareup($|([.].*))" regex="true"/> + </trusted-key> + <trusted-key id="23A865613F5DC1299BA308E28651DC7B152E94CA" group="io.sentry" name="sentry" version="7.0.0"/> + <trusted-key id="24D04176586361FDA94EE0315F7786DF73E61F56" group="com.google.devtools.ksp"/> + <trusted-key id="28118C070CB22A0175A2E8D43D12CA2AC19F3181"> + <trusting group="org.codehaus.woodstox"/> + <trusting group="^com[.]fasterxml($|([.].*))" regex="true"/> + </trusted-key> + <trusted-key id="29BEA2A645F2D6CED7FB12E02B172E3E156466E8" group="org.apache.maven.resolver"/> + <trusted-key id="2DB4F1EF0FA761ECC4EA935C86FDC7E2A11262CB"> + <trusting group="commons-codec"/> + <trusting group="commons-io"/> + <trusting group="org.apache.commons"/> + </trusted-key> + <trusted-key id="2E3A1AFFE42B5F53AF19F780BCF4173966770193" group="org.jetbrains" name="annotations" version="13.0"/> + <trusted-key id="2E92113263FC31C74CCBAAB20E91C2DE43B72BB1" group="org.ec4j.core"/> + <trusted-key id="2FC53E6B1F681184F4CCD637F5C81DE10A0B8ECC" group="org.yaml" name="snakeyaml" version="2.3"/> + <trusted-key id="3051D45031E13516A6E8FAFF280D66A55F5316C5" group="org.bitbucket.b_c" name="jose4j" version="0.9.5"/> + <trusted-key id="30F60E14D079473BCD0320BBB31C235033EEFAC5" group="org.hisp.dhis.parser" name="dhis-antlr-expression-parser" version="1.0.39"/> + <trusted-key id="31BAE2E51D95E0F8AD9B7BCC40A3C4432BD7308C" group="com.googlecode.juniversalchardet" name="juniversalchardet" version="1.0.3"/> + <trusted-key id="32118CF76C9EC5D918E54967CA80D1F0EB6CA4BA" group="^org[.]codehaus($|([.].*))" regex="true"/> + <trusted-key id="36F4C680FC3E50E14C90FCBFA0B475EFD9448513" group="net.lingala.zip4j" name="zip4j" version="2.11.5"/> + <trusted-key id="3D3E000146F343EAAC5EBF1EDAE4616DE6926F70" group="com.journeyapps" name="zxing-android-embedded" version="4.3.0"/> + <trusted-key id="47504B76CF89C15C0512D9AFE16AB52D79FD224F" group="com.google.api.grpc" name="proto-google-common-protos"/> + <trusted-key id="475F3B8E59E6E63AA78067482C7B12F2A511E325" group="org.slf4j"/> + <trusted-key id="4791825BDEA86EB9286A2ACE88BB19A33A18445F" group="net.ltgt.gradle.incap" name="incap" version="0.2"/> + <trusted-key id="47BF592261CD1A8A69B703B4E0CB7823CFD00FBF" group="^com[.]jakewharton($|([.].*))" regex="true"/> + <trusted-key id="47EB6836245D2D40E89DFB4136D4E9618F3ADAB5" group="io.github.oshai"/> + <trusted-key id="4880ADC91C17426D0B061C89E8EBCFC35DF57B34" group="io.insert-koin"/> + <trusted-key id="4BF79B8259007B566D2FCE82296CD27F60EED12C" group="com.google.crypto.tink" name="tink" version="1.7.0"/> + <trusted-key id="4DB1A49729B053CAF015CEE9A6ADFC93EF34893E" group="org.hamcrest"/> + <trusted-key id="4F7E32D440EF90A83011A8FC6425559C47CC79C4" group="javax.annotation" name="javax.annotation-api" version="1.3.2"/> + <trusted-key id="4F8FEC6785F611D9A712EA2734918B7D3969D2F5" group="com.google.dagger" name="dagger" version="2.28.3"/> + <trusted-key id="517B94F8D0A46317A28D8AB30DA8A5EC02D11EAD" group="net.sf.jopt-simple" name="jopt-simple" version="4.9"/> + <trusted-key id="54A26BFDC7ECDD39BA4C123AC3BAB45F4AF71FAB" group="io.opencensus" name="opencensus-proto" version="0.2.0"/> + <trusted-key id="55CAF4EA640A582783DD400947A94C58C7DDE4C8" group="com.scottyab" name="rootbeer-lib" version="0.1.2"/> + <trusted-key id="5897253BEA3046AEEA95A067E93671C7272B7B3F" group="org.jdom" name="jdom2" version="2.0.6"/> + <trusted-key id="5D283C23D9D9DC2D9C2130E6AADF2C18DCF95764" group="com.github.package-url" name="packageurl-java" version="1.5.0"/> + <trusted-key id="5FF31904EDB5FA70567E9C1425ECEFD55FCEB2F9" group="dk.brics.automaton" name="automaton" version="1.11-8"/> + <trusted-key id="600EA202B1EC682F4A788E5AAC7A514BC9F9BB70" group="io.opencensus" name="opencensus-api" version="0.31.0"/> + <trusted-key id="60200AC4AE761F1614D6C46766D68DAA073BE985"> + <trusting group="ch.qos.logback"/> + <trusting group="org.slf4j"/> + </trusted-key> + <trusted-key id="61DEBD732F3F07771269972E2F87304808D40CEC" group="net.zetetic" name="sqlcipher-android" version="4.9.0"/> + <trusted-key id="64B9B09F164AA0BF88742EB61188B69F6D6259CA" group="com.google.accompanist" name="accompanist-drawablepainter" version="0.37.3"/> + <trusted-key id="67FEE84A26D31DEE2DB2E2CDEA5E1E4C5F72DD79" group="com.github.javafaker" name="javafaker" version="1.0.2"/> + <trusted-key id="694621A7227D8D5289699830ABE9F3126BB741C1" group="^com[.]google($|([.].*))" regex="true"/> + <trusted-key id="696B6199A2A9D8C29CE78CC0D041CAD2E452550F" group="com.google.protobuf"/> + <trusted-key id="6DD3B8C64EF75253BEB2C53AD908A43FB7EC07AC" group="jakarta.activation"/> + <trusted-key id="6F538074CCEBF35F28AF9B066A0975F8B1127B83" group="^org[.]jetbrains[.]kotlin($|([.].*))" regex="true"/> + <trusted-key id="7440F1F7D27BAC115F953D55EB095DA7D2F6AC0E" group="org.tensorflow" name="tensorflow-lite-metadata" version="0.2.0"/> + <trusted-key id="7616EB882DAF57A11477AAF559A252FB1199D873" group="com.google.code.findbugs" name="jsr305" version="3.0.2"/> + <trusted-key id="7A468635B9B8D04C4408B7BE4D21AC964B4DD57B" group="com.github.bumptech.glide"/> + <trusted-key id="7B121B76A7ED6CE6E60AD51784E913A8E3A748C0" group="org.bouncycastle"/> + <trusted-key id="7CEA1BE22FB2423EAC1A4CBC90F76D4A6BCC07D1" group="org.maplibre.gl"/> + <trusted-key id="7E22D50A7EBD9D2CD269B2D4056ACA74D46000BF" group="io.netty"/> + <trusted-key id="7F36E793AE3252E5D9E9B98FEE9E7DC9D92FC896" group="com.google.errorprone"/> + <trusted-key id="8461EFA0E74ABAE010DE66994EB27DB2A3B88B8B"> + <trusting group="androidx.activity"/> + <trusting group="androidx.annotation"/> + <trusting group="androidx.compose.runtime"/> + <trusting group="androidx.core"/> + <trusting group="androidx.emoji2"/> + <trusting group="androidx.lifecycle"/> + <trusting group="androidx.preference"/> + <trusting group="androidx.room"/> + <trusting group="androidx.test.uiautomator"/> + <trusting group="androidx.tracing"/> + </trusted-key> + <trusted-key id="84789D24DF77A32433CE1F079EB80E92EB2135B1"> + <trusting group="^org[.]apache($|([.].*))" regex="true"/> + <trusting group="^org[.]codehaus($|([.].*))" regex="true"/> + </trusted-key> + <trusted-key id="8569C95CADC508B09FE90F3002216ED811210DAA" group="io.github.detekt.sarif4k"/> + <trusted-key id="8756C4F765C9AC3CB6B85D62379CE192D401AB61" group="^org[.]jetbrains($|([.].*))" regex="true"/> + <trusted-key id="88BE34F94BDB2B5357044E2E3A387D43964143E3"> + <trusting group="org.apache.maven"/> + <trusting group="org.eclipse.sisu"/> + </trusted-key> + <trusted-key id="890A711ECEFC9F46E7DC9A004083A52B1E69FF28" group="com.github.mifmif" name="generex" version="1.0.2"/> + <trusted-key id="8B22A34D7812A3E5BB496362F4030798D861A159" group="org.jetbrains.compose.hot-reload"/> + <trusted-key id="8D8B239D34DB29FEF9D8E07836CCDFDCDC3CE7F0" group="com.airbnb.android"/> + <trusted-key id="8DF3B0AA23ED78BE5233F6C2DEA3D207428EF16D" group="com.linkedin.dexmaker"/> + <trusted-key id="8E3A02905A1AE67E7B0F9ACD3967D4EDA591B991" group="io.ktor"/> + <trusted-key id="8E68968CE7C85B314DF175FD9CC6720FBB1B27BA" group="com.ethlo.time" name="itu" version="1.10.2"/> + <trusted-key id="9034C495FFC63750824524D1150F7C41005CC185" group="org.kobjects.ktxml"/> + <trusted-key id="95115197C5227C0887299D000F9FE62F88E938D8" group="com.google.dagger"/> + <trusted-key id="9E447565D3DF06750BB9015E6D96877FAE0D34A4" group="^org[.]hisp[.]dhis($|([.].*))" regex="true"/> + <trusted-key id="A33A0B49A4C1AB590B0A4DDC1364C5E2DF3E99C5" group="org.reactivestreams" name="reactive-streams" version="1.0.3"/> + <trusted-key id="A413F67D71BEEC23ADD0CE0ACB43338E060CF9FA"> + <trusting group="com.google.code.findbugs"/> + <trusting group="org.jacoco"/> + </trusted-key> + <trusted-key id="A5F483CD733A4EBAEA378B2AE88979FB9B30ACF2"> + <trusting group="androidx.annotation"/> + <trusting group="androidx.collection"/> + <trusting group="androidx.concurrent"/> + <trusting group="androidx.core"/> + <trusting group="androidx.graphics"/> + <trusting group="androidx.lifecycle"/> + <trusting group="androidx.profileinstaller"/> + <trusting group="androidx.recyclerview"/> + <trusting group="androidx.startup"/> + <trusting group="androidx.transition"/> + <trusting group="androidx.window"/> + <trusting group="^androidx[.]compose($|([.].*))" regex="true"/> + </trusted-key> + <trusted-key id="A6D6C97108B8585F91B158748671A8DF71296252" group="com.squareup.okio"/> + <trusted-key id="A7892505CF1A58076453E52D7999BEFBA1039E8B" group="net.bytebuddy"/> + <trusted-key id="AA70C7C433D501636392EC02153E7A3C2B4E5118" group="org.eclipse.ee4j" name="project"/> + <trusted-key id="ADBC987D1A7B91DB6B0AAA81995EFBF4A3D20BEB" group="com.pinterest.ktlint"/> + <trusted-key id="AEB1E1AEC035C66FA39589D13EFC46EE83C40224" group="com.networknt" name="json-schema-validator" version="1.5.4"/> + <trusted-key id="AFCC4C7594D09E2182C60E0F7A01B0F236E5430F" group="com.google.code.gson"/> + <trusted-key id="B02335AA54CCF21E52BBF9ABD9C565AA72BA2FDD" group="io.grpc"/> + <trusted-key id="B2F967B67DADC1F07172DBDADE453E55DC86FC9B" group="co.touchlab"/> + <trusted-key id="B41089A2DA79B0FA5810252872385FF0AF338D52" group="joda-time" name="joda-time"/> + <trusted-key id="BCC135FC7ED8214F823D73E97FE9900F412D622E" group="com.google.flatbuffers" name="flatbuffers-java" version="1.12.0"/> + <trusted-key id="BDB5FA4FE719D787FB3D3197F6D4A1D411E9D1AE" group="^com[.]google($|([.].*))" regex="true"/> + <trusted-key id="C37EDB6DB4369618DBD842533CE545DEFBD228AF" group="io.sellmair"/> + <trusted-key id="C5AA57F4A38EBA7B7F9156DDAB2DA4527F6FFC0B" group="com.squareup" name="kotlinpoet" version="1.11.0"/> + <trusted-key id="C7A0B8FBBD1CC349D54DE64ADC1E0346C12779BC" group="se.warting.signature"/> + <trusted-key id="C7BE5BCC9FEC15518CFDA882B0F3710FA64900E7"> + <trusting group="com.google.code.gson"/> + <trusting group="^com[.]google[.]auto($|([.].*))" regex="true"/> + </trusted-key> + <trusted-key id="CB9A3ECF68EFC2235510789F88C36BE872C7E1B0" group="^io[.]sentry($|([.].*))" regex="true"/> + <trusted-key id="CE3285F320685193D11FEA01F6CE9695C9318406" group="com.google.zxing"/> + <trusted-key id="CFBE6E7934FB211224EE1C2B0C0A9468268C79AE" group="org.jetbrains"/> + <trusted-key id="D1436C0DBACEA48702AF97C363F1DD7753B8B315" group="^org[.]sonarsource($|([.].*))" regex="true"/> + <trusted-key id="D477D51812E692011DB11E66A6EA2E2BF22E0543" group="io.github.java-diff-utils"/> + <trusted-key id="DBD744ACE7ADE6AA50DD591F66B50994442D2D40" group="^com[.]squareup($|([.].*))" regex="true"/> + <trusted-key id="DF25D3C4868FEC177182FAD64D176DC503FB4267" group="io.coil-kt.coil3"/> + <trusted-key id="E04FCA076C716DA6773565EAC0E2EB10E7B60FAD" group="com.mikepenz"/> + <trusted-key id="E3A9F95079E84CE201F7CF60BEDE11EAF1164480" group="org.hamcrest"/> + <trusted-key id="E5138A8E9F2E7E42D38B14D99AEE152CDCCEBFCB" group="io.github.hakky54"/> + <trusted-key id="E77417AC194160A3FABD04969A259C7EE636C5ED" group="^com[.]google($|([.].*))" regex="true"/> + <trusted-key id="E7DC75FC24FB3C8DFE8086AD3D5839A2262CBBFB" group="^org[.]jetbrains[.]kotlinx($|([.].*))" regex="true"/> + <trusted-key id="E85AED155021AF8A6C6B7A4A7C7D8456294423BA" group="org.objenesis"/> + <trusted-key id="EA0B70B5050192C98CFA7E4F3F36885C24DF4B75" group="org.mozilla" name="rhino" version="1.7.10"/> + <trusted-key id="EE0CA873074092F806F59B65D364ABAA39A47320" group="com.google.errorprone"/> + <trusted-key id="F254B35617DC255D9344BCFA873A8E86B4372146" group="org.codehaus.plexus"/> + <trusted-key id="F3184BCD55F4D016E30D4C9BF42E87F9665015C9" group="org.jsoup" name="jsoup" version="1.12.2"/> + <trusted-key id="F3D15B8FF9902805DE4BE6B18DC6F3D0ABDBD017" group="org.codehaus.plexus" name="plexus-sec-dispatcher" version="2.0"/> + <trusted-key id="FA77DCFEF2EE6EB2DEBEDD2C012579464D01C06A" group="org.codehaus.plexus"/> + <trusted-key id="FA7929F83AD44C4590F6CC6815C71C0A4E0B8EDD" group="net.java.dev.jna"/> + <trusted-key id="FC411CD3CB7DCB0ABC9801058118B3BCDB1A5000" group="jakarta.xml.bind"/> + <trusted-key id="FF6E2C001948C5F2F38B0CC385911F425EC61B51"> + <trusting group="junit"/> + <trusting group="org.apiguardian"/> + <trusting group="org.junit"/> + <trusting group="org.junit.jupiter"/> + <trusting group="org.junit.platform"/> + <trusting group="org.opentest4j"/> + </trusted-key> + </trusted-keys> + </configuration> + <components> + <component group="androidx.activity" name="activity" version="1.10.1"> + <artifact name="activity-1.10.1.aar"> + <sha256 value="b62b528c917de9be497eb6f88830197c20e9d21267c3916c613492e5ee837d4d" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.activity" name="activity" version="1.11.0"> + <artifact name="activity-1.11.0.aar"> + <sha256 value="26726186b34f90b0fe55bbf0ebbf640ade99915bc35f4cb0153ddcf751499bd3" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.activity" name="activity-compose" version="1.10.1"> + <artifact name="activity-compose-1.10.1.aar"> + <sha256 value="f89af1b26ccc834634387c857c2dd4f4654d37650890039c527c2fed07db6a61" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.activity" name="activity-compose" version="1.11.0"> + <artifact name="activity-compose-1.11.0.aar"> + <sha256 value="03d5232a9371338475a3d9e40cabeb072faab16dd01d94b481c1ebf13535c59a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.activity" name="activity-ktx" version="1.10.1"> + <artifact name="activity-ktx-1.10.1.aar"> + <sha256 value="f396f58dbd772c065b873696b74a3d4d087554b3766280e63b49b25dbb53ab16" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.activity" name="activity-ktx" version="1.11.0"> + <artifact name="activity-ktx-1.11.0.aar"> + <sha256 value="3663f6811a3c6c0c28f8ba82ba5e9f363f4bc12ee53155794f456d3c5b2acae3" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.annotation" name="annotation" version="1.9.1"> + <artifact name="annotation-metadata-1.9.1.jar"> + <sha256 value="38322afa7345c37e29c65ec8852178ae1c26e23096a0634d07a4a3893931f58c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.annotation" name="annotation-experimental" version="1.4.1"> + <artifact name="annotation-experimental-1.4.1.aar"> + <sha256 value="6bd4c7c7476f8260cd3bdbb81183583e93fc9f790c27dea7dc314181cbf87aa0" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.annotation" name="annotation-experimental" version="1.5.0"> + <artifact name="annotation-experimental-1.5.0.aar"> + <sha256 value="02b0a4256618f85386c92e5cec166dc7f300820888a290227a3c0c65b82cbb36" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.annotation" name="annotation-jvm" version="1.9.1"> + <artifact name="annotation-jvm-1.9.1.jar"> + <sha256 value="1e343917ebf27ba96fe4dc52b1cad7fd32b738fbc6355bb6cd5b3b305d7212d0" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.appcompat" name="appcompat" version="1.7.1"> + <artifact name="appcompat-1.7.1.aar"> + <sha256 value="2ad334a323b28046e89b738c77d184cb3dcca32a551ab048851b2fda23a3ba26" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.appcompat" name="appcompat-resources" version="1.7.1"> + <artifact name="appcompat-resources-1.7.1.aar"> + <sha256 value="8e2db31224ca53b108c784da2b361959062716d416b210cfef3d5a3828306df0" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.arch.core" name="core-common" version="2.2.0"> + <artifact name="core-common-2.2.0.jar"> + <sha256 value="65308a06b1c00ee186cb9e19321383f043b993813f1522c47f4a3e3303bdba41" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.arch.core" name="core-runtime" version="2.2.0"> + <artifact name="core-runtime-2.2.0.aar"> + <sha256 value="a1be5e0caa2b07623862af6ae21b3ab0718123245184d0e30dea81b53f990a47" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.arch.core" name="core-testing" version="2.2.0"> + <artifact name="core-testing-2.2.0.aar"> + <sha256 value="85e1fe770ed673ecb8552eaadc23b96d8db0a14a10eaa7789518496e5d99362c" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.asynclayoutinflater" name="asynclayoutinflater" version="1.0.0"> + <artifact name="asynclayoutinflater-1.0.0.aar"> + <sha256 value="f7eab60c57addd94bb06275832fe7600611beaaae1a1ec597c231956faf96c8b" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.autofill" name="autofill" version="1.0.0"> + <artifact name="autofill-1.0.0.aar"> + <sha256 value="c9468f56e05006ea151a426c54957cd0799b8b83a579d2846dd22061f33e5ecd" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.biometric" name="biometric" version="1.1.0"> + <artifact name="biometric-1.1.0.aar"> + <sha256 value="270c7b7d99942d5ec1dd88594e4648feb33d8e31d8c3c2ab2321d49d9abdfc1f" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.browser" name="browser" version="1.3.0"> + <artifact name="browser-1.3.0.aar"> + <sha256 value="e740b1beeac82303415d68bee9d5c1f259716f560a829ca07c7ce97e60850e1b" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.browser" name="browser" version="1.9.0"> + <artifact name="browser-1.9.0.aar"> + <sha256 value="b6aa2d575d27252233aee98fd93575e8327715f2ebd1dc14ad7ea4a7d2ec4592" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.cardview" name="cardview" version="1.0.0"> + <artifact name="cardview-1.0.0.aar"> + <sha256 value="1193c04c22a3d6b5946dae9f4e8c59d6adde6a71b6bd5d87fb99d82dda1afec7" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.collection" name="collection" version="1.5.0"> + <artifact name="collection-metadata-1.5.0.jar"> + <sha256 value="f5ffb8f461c4b5d6f2883a2c7047977773b31d5b23ef030c057514c0c9eceb47" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.collection" name="collection-jvm" version="1.5.0"> + <artifact name="collection-jvm-1.5.0.jar"> + <sha256 value="70b35924e4babcdffa37d0e575ee039c56a2d97123342624c48b603233704341" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.collection" name="collection-ktx" version="1.5.0"> + <artifact name="collection-ktx-1.5.0.jar"> + <sha256 value="939b4a8697640e77d83e4e8b4c4a9d18f8130198c5961194af8dd9db9dc7c353" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.animation" name="animation" version="1.8.1"> + <artifact name="animation-metadata-1.8.1.jar"> + <sha256 value="724af7c866353ff3879cb9795eafa2d9890bd3ec9b9cc343e05facd98ffdc727" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.animation" name="animation-android" version="1.10.5"> + <artifact name="animation.aar"> + <sha256 value="07acf0914030402924fcf1f698983e2e3220485ec636da7773421c150f765a7b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.animation" name="animation-android" version="1.10.6"> + <artifact name="animation.aar"> + <sha256 value="543635ec33c67bae335c54228e9573db47912b4a04f559f67b18e532cc39ef33" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.animation" name="animation-android" version="1.8.2"> + <artifact name="animation-release.aar"> + <sha256 value="407ab5ea6518c6fef659146bf0a507471ded63c5d6528dc95187220027e1f417" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.animation" name="animation-core" version="1.8.1"> + <artifact name="animation-core-metadata-1.8.1.jar"> + <sha256 value="22581989eeb4c6b7a1b66916047c24f1bc01372f29295f170c379406aaca1a99" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.animation" name="animation-core-android" version="1.10.5"> + <artifact name="animation-core.aar"> + <sha256 value="a2ad085d080b05dd80c85646a015edfc278c03b9d096cc8c80fa3cc8fd9f8902" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.animation" name="animation-core-android" version="1.10.6"> + <artifact name="animation-core.aar"> + <sha256 value="72a59e1ed74b4d1693f0311350ea885985d00830fb340e2578c8df01a4e808de" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.animation" name="animation-core-android" version="1.8.2"> + <artifact name="animation-core-release.aar"> + <sha256 value="49af9201eeaf590d889e742bb43dd8e01efa3fbe478cb812f5887f978f400261" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.foundation" name="foundation" version="1.8.1"> + <artifact name="foundation-metadata-1.8.1.jar"> + <sha256 value="1547d35e817f9f8668f657475fa3a170381294fbfbc56949091eed46f3fd60d5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.foundation" name="foundation-android" version="1.10.5"> + <artifact name="foundation.aar"> + <sha256 value="7fd9f592d9b2e37fd7bbd3b07b35fe3869ce0391603f651e6bfc1caf6d13a693" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.foundation" name="foundation-android" version="1.10.6"> + <artifact name="foundation.aar"> + <sha256 value="7135bd5f1cd36d2320028a8a5737f930e1df3bdf81d8c1e0babc9b160d826741" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.foundation" name="foundation-android" version="1.8.2"> + <artifact name="foundation-release.aar"> + <sha256 value="96acc3363c121dfbfddc5cab946f7e45705c1cce98424b50e28edf16d55a3c9e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.foundation" name="foundation-layout" version="1.8.1"> + <artifact name="foundation-layout-metadata-1.8.1.jar"> + <sha256 value="261826b42b2de8d6f9b5afa8f3c5476bbdf1e39fe640a2f278a4ae0ce9d9641b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.foundation" name="foundation-layout-android" version="1.10.5"> + <artifact name="foundation-layout.aar"> + <sha256 value="b11250c899e65f73bb1f68643ebc37d9c6d9ddd014b4b86ce1e17e502a2fca59" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.foundation" name="foundation-layout-android" version="1.10.6"> + <artifact name="foundation-layout.aar"> + <sha256 value="872c0a93f962517dcc974a63e05f3f43a696b155e08e94411fe4137511c467fd" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.foundation" name="foundation-layout-android" version="1.8.2"> + <artifact name="foundation-layout-release.aar"> + <sha256 value="97d474baf35fe803a086489c32df0eb35154448e091bc6543b34ff17aa529477" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.material" name="material-android" version="1.10.5"> + <artifact name="material.aar"> + <sha256 value="636bb053b873ebb0c5be55c8ffb38c725e3aff4cfa58508a32505f3c24082c29" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.material" name="material-android" version="1.10.6"> + <artifact name="material.aar"> + <sha256 value="2b7911ed559f77ea2f1e98249aa2d3bad5a8f712924278c80725eefa9646f9c5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.material" name="material-android" version="1.8.3"> + <artifact name="material-release.aar"> + <sha256 value="330619c338cbe3aa4dca94097ff194343d65932b3cf391b7e60a315fa5b2dafd" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.material" name="material-icons-core-android" version="1.7.6"> + <artifact name="material-icons-core-release.aar"> + <sha256 value="48d182051236b1dfec829b33bf4d3fd06d03c2876d532208e3f7490159d65c46" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.material" name="material-icons-core-android" version="1.7.8"> + <artifact name="material-icons-core-release.aar"> + <sha256 value="332c06b25e662cc417fb087e76b8faa5cb249f4992ffa3360084a3d4ab882284" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.material" name="material-icons-core-desktop" version="1.7.8"> + <artifact name="material-icons-core-desktop-1.7.8.jar"> + <sha256 value="b5729220e242132b22b0c0317a304ff167a05cc685c3e9e6483d5dfca3495f56" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.material" name="material-icons-extended-android" version="1.7.6"> + <artifact name="material-icons-extended-release.aar"> + <sha256 value="07e97e52f35d789ef475d9c687e5ca46cc54f9a0d4af8e1dca92ac25fb21450c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.material" name="material-icons-extended-android" version="1.7.8"> + <artifact name="material-icons-extended-release.aar"> + <sha256 value="64e86269f1106848981dd76f0046f81b46f3bd92efb22645de8fd044c0402b61" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.material" name="material-icons-extended-desktop" version="1.7.8"> + <artifact name="material-icons-extended-desktop-1.7.8.jar"> + <sha256 value="0ade0b7d55cb008136d7b58b71100ce017dedb84be20af6da2e76b58b090f699" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.material" name="material-ripple" version="1.8.1"> + <artifact name="material-ripple-metadata-1.8.1.jar"> + <sha256 value="ba6e5494f8ea91ea325b9d19ee1b7551af76e9fb7e17f605e0936897e4c70d5a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.material" name="material-ripple-android" version="1.8.1"> + <artifact name="material-ripple-release.aar"> + <sha256 value="a6bc5eb03cd1d714e06339b8e48944462d9994a9e88eb7519af4cf3ec20e3afa" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.material" name="material-ripple-android" version="1.8.2"> + <artifact name="material-ripple-release.aar"> + <sha256 value="eff3802ab6a9c4f2ad6dd15539fc9f47e385dfae656efdca89b8716d744140a1" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.material" name="material-ripple-android" version="1.8.3"> + <artifact name="material-ripple-release.aar"> + <sha256 value="5709ee08c1236f0a0575bf015cf18c302c2b55ba2bf3e0cbdd157cee7cb076bb" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.material" name="material-ripple-android" version="1.9.3"> + <artifact name="material-ripple.aar"> + <sha256 value="8161fe3ebef7ecf3f40a53b7b69308507bb10b023b3fdc7b58efb31713688479" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.material3" name="material3" version="1.4.0"> + <artifact name="material3-metadata-1.4.0.jar"> + <sha256 value="99f229e3030f7d11504177f1c15f9dbebc15b413fd910c6f18bfc12824600167" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.material3" name="material3-android" version="1.4.0"> + <artifact name="material3.aar"> + <sha256 value="3a37e8b36df3822fe1e6059f0f9fafda8800388860477624ac1b9422c418a36e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.material3" name="material3-window-size-class-android" version="1.3.2"> + <artifact name="material3-window-size-class-release.aar"> + <sha256 value="f4f44a2841318b6cef325d16ad6522f0dd489f50f4f4cfc0faf4cd0ddc06c523" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.material3" name="material3-window-size-class-android" version="1.4.0"> + <artifact name="material3-window-size-class.aar"> + <sha256 value="97b32a3a7d09c68ccb729ec5dc5b780e4c0f4f5e81d82c64557c6daec2aceb35" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.material3.adaptive" name="adaptive-android" version="1.1.0"> + <artifact name="adaptive-release.aar"> + <sha256 value="79bd119c61f2457dfac9e4d51c1a2bdfc73081945e4c1d28aeb0d485a6c2f409" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.runtime" name="runtime" version="1.10.5"> + <artifact name="runtime-metadata-1.10.5.jar"> + <sha256 value="393451f535d2194da58ea4b3bbda0da09bbc0de1d0415176abe01d56764a0ce3" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.runtime" name="runtime" version="1.10.6"> + <artifact name="runtime-metadata-1.10.6.jar"> + <sha256 value="393451f535d2194da58ea4b3bbda0da09bbc0de1d0415176abe01d56764a0ce3" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.runtime" name="runtime-android" version="1.10.5"> + <artifact name="runtime.aar"> + <sha256 value="fd57586cf86d8b89f070d05cf5f0a2afcd15dd57411e767decc9e6b929764d43" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.runtime" name="runtime-android" version="1.10.6"> + <artifact name="runtime.aar"> + <sha256 value="e3313cd94834e8088d5301f1dfd6ccb000174498d3c867434fb25e4425b37c04" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.runtime" name="runtime-annotation" version="1.10.5"> + <artifact name="runtime-annotation-metadata-1.10.5.jar"> + <sha256 value="5d4ce82699f501a0c8e1e672658f1f8089534e06989bf253bdfab11e2c730595" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.runtime" name="runtime-annotation" version="1.10.6"> + <artifact name="runtime-annotation-metadata-1.10.6.jar"> + <sha256 value="5d4ce82699f501a0c8e1e672658f1f8089534e06989bf253bdfab11e2c730595" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.runtime" name="runtime-annotation-android" version="1.10.5"> + <artifact name="runtime-annotation.aar"> + <sha256 value="6cb10d3d205c68969f6ad4f589a52650707aca3d23ab880197f1e30d50ec9527" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.runtime" name="runtime-annotation-android" version="1.10.6"> + <artifact name="runtime-annotation.aar"> + <sha256 value="41a0758b5cb7d9418aa87d8ce60b0cf0e59689938fa4efd0a4ae0a919ec3392c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.runtime" name="runtime-annotation-jvm" version="1.10.5"> + <artifact name="runtime-annotation-jvm-1.10.5.jar"> + <sha256 value="f89dda8bcd73876d0fc16568844b2bd79443ee7ca62810874d25c7dcaa394bd6" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.runtime" name="runtime-annotation-jvm" version="1.9.0"> + <artifact name="runtime-annotation-jvm-1.9.0.jar"> + <sha256 value="989b2da28bf5ba7966c08ca2db3f48a607e684e4ab4ff0de80e9cd5ec663c076" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.runtime" name="runtime-desktop" version="1.10.5"> + <artifact name="runtime-desktop-1.10.5.jar"> + <sha256 value="b195860542f612de0512b54a75353e0f6d58815f0c9530a03bc5b0e734474829" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.runtime" name="runtime-desktop" version="1.9.0"> + <artifact name="runtime-desktop-1.9.0.jar"> + <sha256 value="ae657e4332fb72fa1b437ce5caa486c6b4a5e17588aaef0267aa92918bba7458" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.runtime" name="runtime-livedata" version="1.10.5"> + <artifact name="runtime-livedata-1.10.5.aar"> + <sha256 value="2ad632865ea285d3c424ac6d4eabfc49fc8ad82abfd986c26d0ca19239475511" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.runtime" name="runtime-livedata" version="1.10.6"> + <artifact name="runtime-livedata-1.10.6.aar"> + <sha256 value="6230e5567e07fd37bf6c82a561c32360a337c3e517c1dbd09567b74db08c533e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.runtime" name="runtime-retain" version="1.10.5"> + <artifact name="runtime-retain-metadata-1.10.5.jar"> + <sha256 value="af1635d56e849fcaee002d9da9e1de66ccb71542cba1d196764441194dc15443" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.runtime" name="runtime-retain" version="1.10.6"> + <artifact name="runtime-retain-metadata-1.10.6.jar"> + <sha256 value="af1635d56e849fcaee002d9da9e1de66ccb71542cba1d196764441194dc15443" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.runtime" name="runtime-retain-android" version="1.10.5"> + <artifact name="runtime-retain.aar"> + <sha256 value="7be3cf36cef2b57cbb5db122f70435ad00ae331dcde0c3a048580c800f44cf4a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.runtime" name="runtime-retain-android" version="1.10.6"> + <artifact name="runtime-retain.aar"> + <sha256 value="80048c6d2eacfa6b5745eee68cc3c8001aeb783a78bb56e8cbe77e297f3427f3" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.runtime" name="runtime-retain-desktop" version="1.10.5"> + <artifact name="runtime-retain-desktop-1.10.5.jar"> + <sha256 value="463ee9c1e93d1b913458bfecc96d128a3574a802f41c8c9781d7320c3b55ed8b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.runtime" name="runtime-saveable" version="1.10.5"> + <artifact name="runtime-saveable-metadata-1.10.5.jar"> + <sha256 value="fa2be3ec83c4b129bcb7a9b15ce1fcb0d1d76334e7eddb7b8f35ce9adf7b0811" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.runtime" name="runtime-saveable" version="1.10.6"> + <artifact name="runtime-saveable-metadata-1.10.6.jar"> + <sha256 value="fa2be3ec83c4b129bcb7a9b15ce1fcb0d1d76334e7eddb7b8f35ce9adf7b0811" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.runtime" name="runtime-saveable-android" version="1.10.5"> + <artifact name="runtime-saveable.aar"> + <sha256 value="0b51cc6a3fdfa26c4cc0669dfd959d02772612cca12fd61e9a0030e9c2ecd213" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.runtime" name="runtime-saveable-android" version="1.10.6"> + <artifact name="runtime-saveable.aar"> + <sha256 value="b848c4a8c6cedaf031003030e0eafd9d079b375e087b052affb73ef72d566502" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.runtime" name="runtime-saveable-desktop" version="1.10.5"> + <artifact name="runtime-saveable-desktop-1.10.5.jar"> + <sha256 value="ef24e24cc8c9c3b9871007fbdf589ed9aaaecf95979a66b7484806f9f0e24d91" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui" version="1.10.5"> + <artifact name="ui-metadata-1.10.5.jar"> + <sha256 value="1d3de76ca7982665e31055561d3c723c32f5110175b60c426f0dbff2a4cf91e1" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui" version="1.10.6"> + <artifact name="ui-metadata-1.10.6.jar"> + <sha256 value="1d3de76ca7982665e31055561d3c723c32f5110175b60c426f0dbff2a4cf91e1" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-android" version="1.10.5"> + <artifact name="ui.aar"> + <sha256 value="6bc88fc41214aa2eb4a7b980dea2e55e002abdc4cd448ade52b3fd150a9299ea" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-android" version="1.10.6"> + <artifact name="ui.aar"> + <sha256 value="85c9c973c9f720340e138d376f6e8c0a27e54d023b9fbaaf281ed407c56d98b7" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-geometry" version="1.10.5"> + <artifact name="ui-geometry-metadata-1.10.5.jar"> + <sha256 value="e29f3c194db2dd9fffa0b6dd304f7f7df7ba17b341b08e8f1655a889f624e58e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-geometry" version="1.10.6"> + <artifact name="ui-geometry-metadata-1.10.6.jar"> + <sha256 value="e29f3c194db2dd9fffa0b6dd304f7f7df7ba17b341b08e8f1655a889f624e58e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-geometry-android" version="1.10.5"> + <artifact name="ui-geometry.aar"> + <sha256 value="fdf23c8cfd8157f5ecc8920234b164bc9a0a5d35bc7a88cf9e0fbe7f183a0fcd" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-geometry-android" version="1.10.6"> + <artifact name="ui-geometry.aar"> + <sha256 value="ac56aa1659ffd92e5a2b2214d0c39a8c1261f0196c19cb9d7fb4695849af73fe" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-graphics" version="1.10.5"> + <artifact name="ui-graphics-metadata-1.10.5.jar"> + <sha256 value="0cae0912c5d4d2009dd59d4064ae8786b34b5724be433d5d5138d6ec8aa12609" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-graphics" version="1.10.6"> + <artifact name="ui-graphics-metadata-1.10.6.jar"> + <sha256 value="0cae0912c5d4d2009dd59d4064ae8786b34b5724be433d5d5138d6ec8aa12609" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-graphics-android" version="1.10.5"> + <artifact name="ui-graphics.aar"> + <sha256 value="e42cfe175036fbdbdfa851feb24cb1ffce39ea6e3bf2acebfa160453e71c3afb" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-graphics-android" version="1.10.6"> + <artifact name="ui-graphics.aar"> + <sha256 value="926bb0e8b5aacb51deba00c874ec285644b616a96cdb0c7e53f29aed257f5a2b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-test" version="1.10.5"> + <artifact name="ui-test-metadata-1.10.5.jar"> + <sha256 value="2ebfc7ff8de9bae422f35da284cec8186ce070fbe9612fd3b83a00bac6d5103e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-test" version="1.10.6"> + <artifact name="ui-test-metadata-1.10.6.jar"> + <sha256 value="2ebfc7ff8de9bae422f35da284cec8186ce070fbe9612fd3b83a00bac6d5103e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-test-android" version="1.10.5"> + <artifact name="ui-test.aar"> + <sha256 value="e26d8331bccc81e87e947840041f4e15aa975d6f62cb340bbccf73df0cab95b2" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-test-android" version="1.10.6"> + <artifact name="ui-test.aar"> + <sha256 value="60857a9ffbf94d0040fcd6156a22415cce0dbaddaa31de043bb3292acc4b9a5a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-test-junit4-android" version="1.10.5"> + <artifact name="ui-test-junit4.aar"> + <sha256 value="a9ecb747104fc5da2db6286989167d8ebda9a558f693684b37154857b856e12f" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-test-junit4-android" version="1.10.6"> + <artifact name="ui-test-junit4.aar"> + <sha256 value="bc4a3ecb25986b646fcb8d30e32f9c560727c1ed2fd88f5be7a8a4b821bbb1c5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-test-manifest" version="1.10.5"> + <artifact name="ui-test-manifest-1.10.5.aar"> + <sha256 value="e0325fb6db31d3e496e81e94552b1b114683f988dcbc5069ecfdc5051de8480f" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-test-manifest" version="1.10.6"> + <artifact name="ui-test-manifest-1.10.6.aar"> + <sha256 value="69251085ca9853c8acca064cb02f629badaf513faa67e6f958e4b528f03daee8" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-text" version="1.10.5"> + <artifact name="ui-text-metadata-1.10.5.jar"> + <sha256 value="383c7e6aeee37b896071e7c22f3f54db49332d43cd44b4f8e19576c3143c74dd" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-text" version="1.10.6"> + <artifact name="ui-text-metadata-1.10.6.jar"> + <sha256 value="383c7e6aeee37b896071e7c22f3f54db49332d43cd44b4f8e19576c3143c74dd" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-text-android" version="1.10.5"> + <artifact name="ui-text.aar"> + <sha256 value="f833f923b7bfbf196284fe6e709969e940c58c29d81b7193063da2d34367063e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-text-android" version="1.10.6"> + <artifact name="ui-text.aar"> + <sha256 value="b66e9680d080e8afd46e876ca3cf73db48e773965e7d6406bfc521832a06dec9" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-tooling" version="1.10.5"> + <artifact name="ui-tooling-metadata-1.10.5.jar"> + <sha256 value="9eec83f5d46914ff0b8021166e11c0a8dbc53039aa2c2fedb85e550e9dd1d1c5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-tooling" version="1.10.6"> + <artifact name="ui-tooling-metadata-1.10.6.jar"> + <sha256 value="9eec83f5d46914ff0b8021166e11c0a8dbc53039aa2c2fedb85e550e9dd1d1c5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-tooling-android" version="1.10.5"> + <artifact name="ui-tooling.aar"> + <sha256 value="8e42aa5621399e0bced9acbab6c17125ae4d979f1f39475453e1d6d72bd129ae" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-tooling-android" version="1.10.6"> + <artifact name="ui-tooling.aar"> + <sha256 value="b2208ef1a4c1af3fdbfb8ee851298b3fbc7da7d851970a1f581e6cf620d4d621" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-tooling-data" version="1.10.5"> + <artifact name="ui-tooling-data-metadata-1.10.5.jar"> + <sha256 value="ae2f6c690e7ca045942b8e31af6f4fab29f7b24843388a7073741838bceefe94" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-tooling-data" version="1.10.6"> + <artifact name="ui-tooling-data-metadata-1.10.6.jar"> + <sha256 value="ae2f6c690e7ca045942b8e31af6f4fab29f7b24843388a7073741838bceefe94" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-tooling-data-android" version="1.10.5"> + <artifact name="ui-tooling-data.aar"> + <sha256 value="42b288b763de4c2a729fba8f0d02e12f0094acbba92bb5bc293cd74f6c18361b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-tooling-data-android" version="1.10.6"> + <artifact name="ui-tooling-data.aar"> + <sha256 value="f3d495c66d3a95b182ea98a3075c1f9fe50e1028b577b0afc2d9858f85a59753" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-tooling-preview" version="1.10.5"> + <artifact name="ui-tooling-preview-metadata-1.10.5.jar"> + <sha256 value="fafcf1088d2f65b51f65a9806a79b6ec97289dcb3938c34211d13599e5dd0d10" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-tooling-preview" version="1.10.6"> + <artifact name="ui-tooling-preview-metadata-1.10.6.jar"> + <sha256 value="fafcf1088d2f65b51f65a9806a79b6ec97289dcb3938c34211d13599e5dd0d10" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-tooling-preview-android" version="1.10.5"> + <artifact name="ui-tooling-preview.aar"> + <sha256 value="bd2d83f99d180f09422a57ce2f0efefaf9bdd098ec7c555495dfd57f03f9d4af" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-tooling-preview-android" version="1.10.6"> + <artifact name="ui-tooling-preview.aar"> + <sha256 value="009d5d06dd18c713b5937a50291b648d6f027fcfb52abaac22661643a5204793" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-unit" version="1.10.5"> + <artifact name="ui-unit-metadata-1.10.5.jar"> + <sha256 value="54e052bdd08ce99266917ef427070221ff067c2b10b2299518ed337185f36da8" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-unit" version="1.10.6"> + <artifact name="ui-unit-metadata-1.10.6.jar"> + <sha256 value="54e052bdd08ce99266917ef427070221ff067c2b10b2299518ed337185f36da8" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-unit-android" version="1.10.5"> + <artifact name="ui-unit.aar"> + <sha256 value="b4a2d86d8d9199faed4b116bde350c4c106ce59d11231b56e48b05219a25d115" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-unit-android" version="1.10.6"> + <artifact name="ui-unit.aar"> + <sha256 value="5639769ead88bff570bee0f02d88f3889d0e0b0f5c049c0fa4da569ce6f2b5f4" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-util" version="1.10.5"> + <artifact name="ui-util-metadata-1.10.5.jar"> + <sha256 value="f9672bfc0ebcbc8d2a613dd1b2363acf48ef50ad02ae321f8d96a76158a0bc19" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-util" version="1.10.6"> + <artifact name="ui-util-metadata-1.10.6.jar"> + <sha256 value="f9672bfc0ebcbc8d2a613dd1b2363acf48ef50ad02ae321f8d96a76158a0bc19" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-util-android" version="1.10.5"> + <artifact name="ui-util.aar"> + <sha256 value="f586c45c91fe10fffa2073b3913d8f2a676b0896a36b32b4896abbdcbbfdc4dc" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.ui" name="ui-util-android" version="1.10.6"> + <artifact name="ui-util.aar"> + <sha256 value="30b6d04f212edf39ef4fa7b8e27e42f53133d2bbad7f05eae6f97b32773f25f3" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.concurrent" name="concurrent-futures" version="1.1.0"> + <artifact name="concurrent-futures-1.1.0.jar"> + <sha256 value="0ce067c514a0d1049d1bebdf709e344ed3266fe9744275682937cdcb13334e9e" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.concurrent" name="concurrent-futures" version="1.2.0"> + <artifact name="concurrent-futures-1.2.0.jar"> + <sha256 value="4810315a798690b5d3bb40c92bcd41c045fd2c36bbfc50b27cbac3d6a0eda190" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.concurrent" name="concurrent-futures-ktx" version="1.1.0"> + <artifact name="concurrent-futures-ktx-1.1.0.jar"> + <sha256 value="1968bf52039e38636aa6f114cd17d7256919d1e8997417716fef9d1da1f24d85" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.concurrent" name="concurrent-futures-ktx" version="1.2.0"> + <artifact name="concurrent-futures-ktx-1.2.0.jar"> + <sha256 value="e1f3e17bb4358ccd6c77ca45f70635c9aba237261f19eaa4f64a0218c00e2a3e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.constraintlayout" name="constraintlayout" version="2.1.0"> + <artifact name="constraintlayout-2.1.0.aar"> + <sha256 value="a458a7562363bd59c209a7dea847326a0e2b26b37a883dc3e29065a79a1c788b" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.constraintlayout" name="constraintlayout" version="2.2.1"> + <artifact name="constraintlayout-2.2.1.aar"> + <sha256 value="30f8d79b782d283a90f0b6f7369169d9cf560091537fdd6056d1daa9f3033763" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.constraintlayout" name="constraintlayout-compose-android" version="1.1.1"> + <artifact name="constraintlayout-compose-release.aar"> + <sha256 value="08f8d883041a10d32e65f938fc4cc198b15fd219bb082142038981c97aaebfd4" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.constraintlayout" name="constraintlayout-core" version="1.0.0"> + <artifact name="constraintlayout-core-1.0.0.jar"> + <sha256 value="496c8c79664bd970c6a6be7a960a20dd157dfc5aa2f18e5b8333767ffbc59911" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.constraintlayout" name="constraintlayout-core" version="1.1.1"> + <artifact name="constraintlayout-core-1.1.1.jar"> + <sha256 value="3c2054328328831eb6e69b4014f6ef9faa117fd4b811929f3a91d3db375f2c02" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.coordinatorlayout" name="coordinatorlayout" version="1.1.0"> + <artifact name="coordinatorlayout-1.1.0.aar"> + <sha256 value="44a9e30abf56af1025c52a0af506fee9c4131aa55efda52f9fd9451211c5e8cb" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.core" name="core" version="1.12.0"> + <artifact name="core-1.12.0.aar"> + <sha256 value="42ffa7ca47d7ba8fe1d874c57ef9c7111bc41a2b0c0c21518a39e07d222ded8b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.core" name="core" version="1.13.0"> + <artifact name="core-1.13.0.aar"> + <sha256 value="1b96c8eb10c4b40283fdd6e9aa74ffff05fae4f15d54f61ba69d517fcd144695" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.core" name="core" version="1.16.0"> + <artifact name="core-1.16.0.aar"> + <sha256 value="6bf03d39dbe3744acce227d3b697374c3625aae1025fbec8ad9fd7bd58bce431" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.core" name="core" version="1.17.0"> + <artifact name="core-1.17.0.aar"> + <sha256 value="e1bd22bbcf5cee3a992dedb7d2d3c3b31c9f761c01e56d00ea443c8aaa981182" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.core" name="core-ktx" version="1.13.0"> + <artifact name="core-ktx-1.13.0.aar"> + <sha256 value="59c54e6129e9261c6d810f8eea4a6ee2f4994d8162b1cd9fc88c9c84c92accfc" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.core" name="core-ktx" version="1.16.0"> + <artifact name="core-ktx-1.16.0.aar"> + <sha256 value="1766dbd82f64a12dcd359ecb6f15f3cf35db4d66d22961a7c51b2ffc6468314c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.core" name="core-ktx" version="1.17.0"> + <artifact name="core-ktx-1.17.0.aar"> + <sha256 value="4d23190b8623b8abb3c5247a0a7727eca347062d026335c427a09e82711b15f8" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.core" name="core-viewtree" version="1.0.0"> + <artifact name="core-viewtree-1.0.0.aar"> + <sha256 value="dc1b678d58ebcf2bfa1587be68ff826694ce3d221251b9ef30d4d4b36297e6de" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.cursoradapter" name="cursoradapter" version="1.0.0"> + <artifact name="cursoradapter-1.0.0.aar"> + <sha256 value="a81c8fe78815fa47df5b749deb52727ad11f9397da58b16017f4eb2c11e28564" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.customview" name="customview" version="1.0.0"> + <artifact name="customview-1.0.0.aar"> + <sha256 value="20e5b8f6526a34595a604f56718da81167c0b40a7a94a57daa355663f2594df2" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.customview" name="customview" version="1.1.0"> + <artifact name="customview-1.1.0.aar"> + <sha256 value="01f76ab043770a97b054046f9815717b82ce0355c02967d16c61981359dc189a" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.customview" name="customview-poolingcontainer" version="1.0.0"> + <artifact name="customview-poolingcontainer-1.0.0.aar"> + <sha256 value="3584102fc49bf399c56e3b7be4bfe12000c46112320cd8cf85cc0a8f93f3e752" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.databinding" name="databinding-adapters" version="8.11.0"> + <artifact name="databinding-adapters-8.11.0.aar"> + <sha256 value="81ea91c38b86081e706d8bc2ab213f456e043c58f8d11751f120be1ba918bc8d" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.databinding" name="databinding-adapters" version="9.0.1"> + <artifact name="databinding-adapters-9.0.1.aar"> + <sha256 value="b574fec81240e699f0edc3f50d03d81770a83bb0d4ab839a55a5e02f283e6453" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.databinding" name="databinding-common" version="8.11.0"> + <artifact name="databinding-common-8.11.0.jar"> + <sha256 value="66cab82639dac0f6c2433464c093b074d608c4bb887ec38a9b8bc4ac98126732" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.databinding" name="databinding-common" version="9.0.1"> + <artifact name="databinding-common-9.0.1.jar"> + <sha256 value="66cab82639dac0f6c2433464c093b074d608c4bb887ec38a9b8bc4ac98126732" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.databinding" name="databinding-compiler" version="9.0.1"> + <artifact name="databinding-compiler-9.0.1.jar"> + <sha256 value="fc516ba6671b39acecc7bf5a01fc96dfbd863559896f9555211f5c49ea3c1e1c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.databinding" name="databinding-compiler-common" version="9.0.1"> + <artifact name="databinding-compiler-common-9.0.1.jar"> + <sha256 value="df9cde52bdb7f3b655372ec13fe2d057ba7336a4ec54f0c7b6c67da7a7521c36" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.databinding" name="databinding-ktx" version="8.11.0"> + <artifact name="databinding-ktx-8.11.0.aar"> + <sha256 value="edae3007cf349012772a6baec45dd3af6e8b3779e1a4ccca55ce0452ea4fec67" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.databinding" name="databinding-ktx" version="9.0.1"> + <artifact name="databinding-ktx-9.0.1.aar"> + <sha256 value="6abda9919fbe139282711c71580175a9625bbea28f1b4deb5921fa288a5b13f9" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.databinding" name="databinding-runtime" version="8.11.0"> + <artifact name="databinding-runtime-8.11.0.aar"> + <sha256 value="fb6a7b9c0f834ee3586a21a9d6fa258a9e2d675a6958c86102a3fdaea2e85d5f" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.databinding" name="databinding-runtime" version="9.0.1"> + <artifact name="databinding-runtime-9.0.1.aar"> + <sha256 value="f4ebd9af14a6a9f267908c54c1ba180aafc22155f9048bc38492324c53f449eb" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.databinding" name="viewbinding" version="8.11.0"> + <artifact name="viewbinding-8.11.0.aar"> + <sha256 value="ce93d287dccdaccf731b89371b0bade5db8679fd79b559332fdaf4454eb3371b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.databinding" name="viewbinding" version="9.0.1"> + <artifact name="viewbinding-9.0.1.aar"> + <sha256 value="9c6875bea4e43027209a3a7ef3d99524aca7c16797a2e6794afc62fbfbab7e28" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.documentfile" name="documentfile" version="1.0.0"> + <artifact name="documentfile-1.0.0.aar"> + <sha256 value="865a061ef2fad16522f8433536b8d47208c46ff7c7745197dfa1eeb481869487" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.drawerlayout" name="drawerlayout" version="1.0.0"> + <artifact name="drawerlayout-1.0.0.aar"> + <sha256 value="9402442cdc5a43cf62fb14f8cf98c63342d4d9d9b805c8033c6cf7e802749ac1" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.drawerlayout" name="drawerlayout" version="1.1.1"> + <artifact name="drawerlayout-1.1.1.aar"> + <sha256 value="2c5f0dca378eb78ca2c4403f9889c77daa3059302260f26a07fe9f63c08926fe" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.dynamicanimation" name="dynamicanimation" version="1.0.0"> + <artifact name="dynamicanimation-1.0.0.aar"> + <sha256 value="ce005162c229bf308d2d5b12fb6cad0874069cbbeaccee63a8193bd08d40de04" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.dynamicanimation" name="dynamicanimation" version="1.1.0"> + <artifact name="dynamicanimation-1.1.0.aar"> + <sha256 value="9062cc6637136a49ad17f8603c72519052ff9a569e617fc1b6db7086304da88f" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.emoji2" name="emoji2" version="1.4.0"> + <artifact name="emoji2-1.4.0.aar"> + <sha256 value="433febd3434a45667176c76a64f3f205ca6335a6b544c5b5d57f25a38a375242" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.emoji2" name="emoji2-views-helper" version="1.4.0"> + <artifact name="emoji2-views-helper-1.4.0.aar"> + <sha256 value="ed5d3ed772a5fbf0d570f7526f585cd61a180e60f9372584c328a68e2cff3375" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.exifinterface" name="exifinterface" version="1.3.6"> + <artifact name="exifinterface-1.3.6.aar"> + <sha256 value="1804105e9e05fdd8f760413bad5de498c381aa329f4f9d94c851bc891ac654c6" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.exifinterface" name="exifinterface" version="1.4.1"> + <artifact name="exifinterface-1.4.1.aar"> + <sha256 value="17e17a6b86bb54074d3a7ecfa695ab920eaff4cf667a8371ed82e377580cfcf6" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.exifinterface" name="exifinterface" version="1.4.2"> + <artifact name="exifinterface-1.4.2.aar"> + <sha256 value="6bb2b68682a2023c55f35f941444ffea0157947b061e4fd7606ba935e2e77425" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.fragment" name="fragment" version="1.5.4"> + <artifact name="fragment-1.5.4.aar"> + <sha256 value="bc3c2431dda42e94bb9511c587eae890d276e4aafe393a8da7b00169186dafde" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.fragment" name="fragment" version="1.8.9"> + <artifact name="fragment-1.8.9.aar"> + <sha256 value="12de5b89ab6641c1d8da82b63dc816652622b06d2781b949b6fbd2dff9fac492" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.fragment" name="fragment-ktx" version="1.8.9"> + <artifact name="fragment-ktx-1.8.9.aar"> + <sha256 value="078ad5877b04f4bf7350198579d81f9c8796fa20e46b4ade3f231a370456c5ad" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.graphics" name="graphics-path" version="1.0.1"> + <artifact name="graphics-path-1.0.1.aar"> + <sha256 value="8ca4032b6d79b351f0b59ad4b580eddbb9423e1652f7c958830687f1eee2ec03" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.graphics" name="graphics-shapes" version="1.0.1"> + <artifact name="graphics-shapes-metadata-1.0.1.jar"> + <sha256 value="0f73b1ddaea78908c5dae31a8de3d76777e583d232bb86caea6f4e0d9c0f28e9" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.graphics" name="graphics-shapes-android" version="1.0.1"> + <artifact name="graphics-shapes-release.aar"> + <sha256 value="7171269a4122feabb071768df46d10b362e47ac75fd0aa8dbcafa1f44f61b40c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.graphics" name="graphics-shapes-desktop" version="1.0.1"> + <artifact name="graphics-shapes-desktop-1.0.1.jar"> + <sha256 value="f305c1e1ac3eb7d20e54550f48e07b56a96951473dd3fe7bb8913ed0cd3a5e91" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.interpolator" name="interpolator" version="1.0.0"> + <artifact name="interpolator-1.0.0.aar"> + <sha256 value="33193135a64fe21fa2c35eec6688f1a76e512606c0fc83dc1b689e37add7732a" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.legacy" name="legacy-support-core-ui" version="1.0.0"> + <artifact name="legacy-support-core-ui-1.0.0.aar"> + <sha256 value="0d1260c6e7e6a337f875df71b516931e703f716e90889817cd3a20fa5ac3d947" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.legacy" name="legacy-support-core-utils" version="1.0.0"> + <artifact name="legacy-support-core-utils-1.0.0.aar"> + <sha256 value="a7edcf01d5b52b3034073027bc4775b78a4764bb6202bb91d61c829add8dd1c7" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.legacy" name="legacy-support-v4" version="1.0.0"> + <artifact name="legacy-support-v4-1.0.0.aar"> + <sha256 value="78fec1485f0f388a4749022dd51416857127cd2544ae1c3fd0b16589055480b0" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-common" version="2.9.4"> + <artifact name="lifecycle-common-metadata-2.9.4.jar"> + <sha256 value="c7a6e835da0712d15efeae0d72df91e6631042df4fcf0f9c20ceca740638c685" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-common-java8" version="2.9.4"> + <artifact name="lifecycle-common-java8-2.9.4.jar"> + <sha256 value="497dd84de9f2fd46324f25f9a3af032d3a23d087e87af515c4b19435f6d6a651" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-common-jvm" version="2.8.7"> + <artifact name="lifecycle-common-jvm-2.8.7.jar"> + <sha256 value="61c873a7327c946ec033c310bb98f3f92eeabcede0e1a5200ab8a1896483c7bf" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-common-jvm" version="2.9.2"> + <artifact name="lifecycle-common-jvm-2.9.2.jar"> + <sha256 value="37d89b2101f074ac6c260917dabb185607645ee200aa3018c7c5bde70edcf184" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-common-jvm" version="2.9.4"> + <artifact name="lifecycle-common-jvm-2.9.4.jar"> + <sha256 value="37d89b2101f074ac6c260917dabb185607645ee200aa3018c7c5bde70edcf184" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-livedata" version="2.8.7"> + <artifact name="lifecycle-livedata-2.8.7.aar"> + <sha256 value="703634525a67b1c6beaaab4f980dfa0bacdf7e143d0b5d51f5ac0d9404400290" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-livedata" version="2.9.4"> + <artifact name="lifecycle-livedata-2.9.4.aar"> + <sha256 value="f240c2c94a96d4a5eae5d379c2a8589d426a33b989d83ae9f0e01f69502c0181" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-livedata-core" version="2.8.7"> + <artifact name="lifecycle-livedata-core-2.8.7.aar"> + <sha256 value="d786e5e6f79b8fab026f09a2d4ae3de1d72875f7645a6b7be48f1d9ab384734b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-livedata-core" version="2.9.4"> + <artifact name="lifecycle-livedata-core-2.9.4.aar"> + <sha256 value="ea866f0c379d1f92837994010ab5ac0a5d5499dbab521efc71b3bc2b497d6ba4" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-livedata-core-ktx" version="2.8.7"> + <artifact name="lifecycle-livedata-core-ktx-2.8.7.aar"> + <sha256 value="b6e785e8532b155921310563a90fd262b5dacf6964aeea6cbbe412ac1da59460" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-livedata-core-ktx" version="2.9.4"> + <artifact name="lifecycle-livedata-core-ktx-2.9.4.aar"> + <sha256 value="f55b7a8d433e9b8163154ccaa42fa2be55c70cd1ede5eeea521a4b4b884dd4fe" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-livedata-ktx" version="2.9.4"> + <artifact name="lifecycle-livedata-ktx-2.9.4.aar"> + <sha256 value="a7fe5ceaf1a20d6049b85ac834ac13179158dbd79be26ee4ee05f364d8d895b6" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-process" version="2.9.4"> + <artifact name="lifecycle-process-2.9.4.aar"> + <sha256 value="4784b8d083c211e076d9115bfa1737f7e0f62b553e801cf50caa4400e34a95d6" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-runtime" version="2.9.4"> + <artifact name="lifecycle-runtime-metadata-2.9.4.jar"> + <sha256 value="ba566d0f46dc01c2169778d27238789ecebaa00655642e02c24e4e83e7dc5905" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-runtime-android" version="2.8.7"> + <artifact name="lifecycle-runtime-release.aar"> + <sha256 value="b8eb997dd434d70eb97cbd6d1395b6337c6771717c7acd59f11c0853f3860284" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-runtime-android" version="2.9.4"> + <artifact name="lifecycle-runtime-release.aar"> + <sha256 value="86f16a1330eb23600ba90d0334b3e1db38d3a30c8b1efcd92ca21aa85afa8173" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-runtime-compose" version="2.9.4"> + <artifact name="lifecycle-runtime-compose-metadata-2.9.4.jar"> + <sha256 value="8835416ac59a23f7152eb0f217bdab742a377e985462307639c12bafc1408e41" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-runtime-compose-android" version="2.8.7"> + <artifact name="lifecycle-runtime-compose-release.aar"> + <sha256 value="80bf0a8fe9a79b93a318832bc36900f3ab8bd5931ff9ca0ecd3087100e1f07d8" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-runtime-compose-android" version="2.9.4"> + <artifact name="lifecycle-runtime-compose-release.aar"> + <sha256 value="b6803f906a89fd85c77df343dd4aeeb349125ca79e12d55d68d4cf42f42231f6" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-runtime-compose-desktop" version="2.9.4"> + <artifact name="lifecycle-runtime-compose-desktop-2.9.4.jar"> + <sha256 value="d25c083df93da718a1876a3293bd15f7dc7a811e998735943bce590683a57835" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-runtime-desktop" version="2.9.2"> + <artifact name="lifecycle-runtime-desktop-2.9.2.jar"> + <sha256 value="2fb49f76d1021792fb359e0a9246c1509f2f5b555f0a46591d24d58deb68bd5c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-runtime-desktop" version="2.9.4"> + <artifact name="lifecycle-runtime-desktop-2.9.4.jar"> + <sha256 value="2fb49f76d1021792fb359e0a9246c1509f2f5b555f0a46591d24d58deb68bd5c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-runtime-ktx" version="2.9.4"> + <artifact name="lifecycle-runtime-ktx-metadata-2.9.4.jar"> + <sha256 value="5d74d1e9c45d538aafc48b2313e598eff9b4a13bfee9f2f3d776f5274d5cde22" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-runtime-ktx-android" version="2.8.7"> + <artifact name="lifecycle-runtime-ktx-release.aar"> + <sha256 value="b3d39c5dba5e207ef4c79d491a76500194c5ea6874157f05a15f01792c0cc4e7" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-runtime-ktx-android" version="2.9.4"> + <artifact name="lifecycle-runtime-ktx.aar"> + <sha256 value="970199c9ed1ac13d620aa8de7f8abbc28ce80653c3ce328d0ac2f15272b56e1b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-service" version="2.9.4"> + <artifact name="lifecycle-service-2.9.4.aar"> + <sha256 value="674155d592d5de18175ef0727442f7827a86cf8fe68d9927ba6a4140b69a5bc9" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-viewmodel" version="2.8.7"> + <artifact name="lifecycle-viewmodel-2.8.7.aar"> + <sha256 value="43d28a6c6da9c1cb72bfb5cc1b511a7937b2db8b79d52f37d0b7f14c79b090dd" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-viewmodel" version="2.9.4"> + <artifact name="lifecycle-viewmodel-2.9.4.aar"> + <sha256 value="cab404b05d5faed209104a2aef14c0cbb316ab9fabe4a8f037b043e5d2f43435" origin="Generated by Gradle"/> + </artifact> + <artifact name="lifecycle-viewmodel-metadata-2.9.4.jar"> + <sha256 value="5410cdfdc3f25bccb5a4dbd8121a5d376b1379041cec6b1da25f9967ca09f019" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-viewmodel-android" version="2.8.7"> + <artifact name="lifecycle-viewmodel-release.aar"> + <sha256 value="e7e7043f66b077637563ff564a7fc6cee461d284a0f2485c050a2143abbd8920" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-viewmodel-android" version="2.9.4"> + <artifact name="lifecycle-viewmodel-release.aar"> + <sha256 value="4b236b2e504db5ca5d09334fef05aa8cdc31ee35a433c3aa4d0420efa9613332" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-viewmodel-compose-android" version="2.9.4"> + <artifact name="lifecycle-viewmodel-compose-release.aar"> + <sha256 value="f7825a08ca661de84044b6891293084bea8fbcc84aa08d8c13a3c558fc5956c9" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-viewmodel-desktop" version="2.9.2"> + <artifact name="lifecycle-viewmodel-desktop-2.9.2.jar"> + <sha256 value="98f816be6869407c87d46058756f97780fa6c6cf61acdba97216f413731af15d" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-viewmodel-desktop" version="2.9.4"> + <artifact name="lifecycle-viewmodel-desktop-2.9.4.jar"> + <sha256 value="98f816be6869407c87d46058756f97780fa6c6cf61acdba97216f413731af15d" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-viewmodel-ktx" version="2.9.4"> + <artifact name="lifecycle-viewmodel-ktx-2.9.4.aar"> + <sha256 value="b7d58bb86bb8e2ccc607d1f8570e714810f7cfb3feba37d375ff1646383435a1" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-viewmodel-savedstate" version="2.8.7"> + <artifact name="lifecycle-viewmodel-savedstate-2.8.7.aar"> + <sha256 value="646f2a42d2884b02308fb19837089e2669835fe21ca6a5b60666d5eb94d081dd" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-viewmodel-savedstate" version="2.9.4"> + <artifact name="lifecycle-viewmodel-savedstate-metadata-2.9.4.jar"> + <sha256 value="c0cc3e31fc358486d96f0270dfe2b0f44f985f0cab0efa773a2a567d55f761a5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-viewmodel-savedstate-android" version="2.9.4"> + <artifact name="lifecycle-viewmodel-savedstate-release.aar"> + <sha256 value="079441c43fa3ff8ea7a02df3b12eec483c3e57583f832cfaff663750527c1421" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-viewmodel-savedstate-desktop" version="2.9.2"> + <artifact name="lifecycle-viewmodel-savedstate-desktop-2.9.2.jar"> + <sha256 value="3e0b44e2514eafdd6938d5457d9f46e4785077c45d3b4364b5c23c4dcb93efd3" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-viewmodel-savedstate-desktop" version="2.9.4"> + <artifact name="lifecycle-viewmodel-savedstate-desktop-2.9.4.jar"> + <sha256 value="3e0b44e2514eafdd6938d5457d9f46e4785077c45d3b4364b5c23c4dcb93efd3" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.loader" name="loader" version="1.0.0"> + <artifact name="loader-1.0.0.aar"> + <sha256 value="11f735cb3b55c458d470bed9e25254375b518b4b1bad6926783a7026db0f5025" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.loader" name="loader" version="1.1.0"> + <artifact name="loader-1.1.0.aar"> + <sha256 value="a83b597cd2409dc177f7f932f7c4082ef7b5508b69b6c4ba71607e75dbd99971" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.localbroadcastmanager" name="localbroadcastmanager" version="1.0.0"> + <artifact name="localbroadcastmanager-1.0.0.aar"> + <sha256 value="e71c328ceef5c4a7d76f2d86df1b65d65fe2acf868b1a4efd84a3f34336186d8" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.media" name="media" version="1.0.0"> + <artifact name="media-1.0.0.aar"> + <sha256 value="b23b527b2bac870c4a7451e6982d7132e413e88d7f27dbeb1fc7640a720cd9ee" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.navigation" name="navigation-common-android" version="2.9.7"> + <artifact name="navigation-common-release.aar"> + <sha256 value="214244224271a71527744453f22636d5d1efa8333fc6606ed9d69cafd32c4ccf" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.navigation" name="navigation-compose-android" version="2.9.7"> + <artifact name="navigation-compose-release.aar"> + <sha256 value="90509814bb38ee9928d0129c7c5f0f679a49e90b01119233b844c9ab91ac9095" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.navigation" name="navigation-runtime-android" version="2.9.7"> + <artifact name="navigation-runtime-release.aar"> + <sha256 value="d41d2a72192600622c18c2949f904d9db8819c0e7a772559c7b4227a067b0f20" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.navigationevent" name="navigationevent" version="1.0.2"> + <artifact name="navigationevent-metadata-1.0.2.jar"> + <sha256 value="3d706844dc49606cb1aa3cd7d6b27f47f180dfc4c6d4b7b80ea478ff88dcbd93" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.navigationevent" name="navigationevent-desktop" version="1.0.2"> + <artifact name="navigationevent-desktop-1.0.2.jar"> + <sha256 value="43deeb5774fd737fa945e09a47f93b6f1a508d17fac8f3b65f1c863e7f7d0660" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.paging" name="paging-common" version="3.3.6"> + <artifact name="paging-common-metadata-3.3.6.jar"> + <sha256 value="a8099c7437bbf96bf5f4331dd425db9755b3d1818bdfa8eec07421430b7305f5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.paging" name="paging-common" version="3.4.2"> + <artifact name="paging-common-metadata-3.4.2.jar"> + <sha256 value="f30a96baf14f04b27240b5e1b525658679a7b490fbacb1b1b8d69f1263d0cd8e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.paging" name="paging-common-android" version="3.3.6"> + <artifact name="paging-common-release.aar"> + <sha256 value="792a0dd40a6d0c51f4935482d8aeb740136b80e60ae15cda7db2a24d37b669ce" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.paging" name="paging-common-android" version="3.4.2"> + <artifact name="paging-common.aar"> + <sha256 value="09bdfbd37cbe096dc695f6c11c62d195c6dd8d23f32adc534782a4fbff1770ee" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.paging" name="paging-common-desktop" version="3.4.2"> + <artifact name="paging-common-desktop-3.4.2.jar"> + <sha256 value="283f4e33011dcd5f14ae6089b51b78374393029588cfe8c1a37302778be163e5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.paging" name="paging-common-ktx" version="3.3.6"> + <artifact name="paging-common-ktx-3.3.6.jar"> + <sha256 value="c6deada2fac53b8ea6523dbda77597b128006674616f140f04df23264c6d1aa3" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.paging" name="paging-common-ktx" version="3.4.2"> + <artifact name="paging-common-ktx-3.4.2.jar"> + <sha256 value="ac718f213d512f7cf9b6252e88d43e370073ec7ac51d6cb86f21d8a99ec7a863" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.paging" name="paging-compose" version="3.4.2"> + <artifact name="paging-compose-metadata-3.4.2.jar"> + <sha256 value="eaffc853da7fe7151e763a74dfa2b0f39de4c04ce70ac77882dd8ea60454c354" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.paging" name="paging-compose-android" version="3.4.2"> + <artifact name="paging-compose.aar"> + <sha256 value="9b5f6e22bd20c30c8e62a1c159cfc114ff28784a6970c83168d03027985f342a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.paging" name="paging-compose-desktop" version="3.4.2"> + <artifact name="paging-compose-desktop-3.4.2.jar"> + <sha256 value="1eda9e0435867e4592a6a390e1b92aa34d9ce2bf84556c8b342fa1d82fa1e283" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.paging" name="paging-runtime" version="3.3.6"> + <artifact name="paging-runtime-3.3.6.aar"> + <sha256 value="1f7c0dbf894f8623ad0716c45964340dd1913f3321958b1fc1a06b12bacee271" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.paging" name="paging-runtime" version="3.4.2"> + <artifact name="paging-runtime-3.4.2.aar"> + <sha256 value="fe4b9f9898ed99114751c1bc01a8d2dd44b2854b039b0472402cf9162e3eca7b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.paging" name="paging-testing-android" version="3.4.2"> + <artifact name="paging-testing.aar"> + <sha256 value="82715cf36ca769fed8fe9892d9e58c5e967228dc70690f121a43c4c06002b90d" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.preference" name="preference" version="1.2.1"> + <artifact name="preference-1.2.1.aar"> + <sha256 value="40ca8adfdb7effb61facb39bd9ca2e2f3a40d106743b0cd6dc9e21e8bedd4f85" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.preference" name="preference-ktx" version="1.2.1"> + <artifact name="preference-ktx-1.2.1.aar"> + <sha256 value="872a5e3e07c0b8d21cb77769ab2f468b209ab6ec08231874401aecfea304a81c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.print" name="print" version="1.0.0"> + <artifact name="print-1.0.0.aar"> + <sha256 value="1d5c7f3135a1bba661fc373fd72e11eb0a4adbb3396787826dd8e4190d5d9edd" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.profileinstaller" name="profileinstaller" version="1.4.1"> + <artifact name="profileinstaller-1.4.1.aar"> + <sha256 value="b519f9317ded1e2c1c2993038c0692e30da326ca99097d9331ff2d3a5861a428" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.recyclerview" name="recyclerview" version="1.2.1"> + <artifact name="recyclerview-1.2.1.aar"> + <sha256 value="a1ea0329ee6d938305dfd0f8ce5c48dea2aac14e5606d23e7fb60afcfb655d6e" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.recyclerview" name="recyclerview" version="1.4.0"> + <artifact name="recyclerview-1.4.0.aar"> + <sha256 value="0f32ccaffcda74c3f87f0b4cfe6ae78e8aa4eb3ad7dda4f2edf06eedc947a5cf" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.resourceinspection" name="resourceinspection-annotation" version="1.0.1"> + <artifact name="resourceinspection-annotation-1.0.1.jar"> + <sha256 value="8cff870ec6fb31db48a52f4a792335b4bf8de07e03bd37823181526433ccd5cb" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.room" name="room-common-jvm" version="2.8.4"> + <artifact name="room-common-jvm-2.8.4.jar"> + <sha256 value="dc7b4e1a75a790f29c97afd5516b8bf8002d9b6e83e295bc569b33566f3b1ec0" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.room" name="room-ktx" version="2.8.4"> + <artifact name="room-ktx-2.8.4.aar"> + <sha256 value="f604fde53e259759633467c11bd3d8a36cc24d6ddb88894c96cddc5a0cf1f83d" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.room" name="room-paging-android" version="2.8.4"> + <artifact name="room-paging.aar"> + <sha256 value="a459735434922d92eec7808054393a5b1e7950e04f0d77d027b43be9021b51d5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.room" name="room-runtime-android" version="2.8.4"> + <artifact name="room-runtime.aar"> + <sha256 value="3293575082024fa0a92b081c4e2d0609f14b5c109635ec227bc509db141a4e20" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.savedstate" name="savedstate" version="1.3.3"> + <artifact name="savedstate-metadata-1.3.3.jar"> + <sha256 value="84a7b7c75a3bed96f5b1345247a7a07bebefb50168e4ced654bf290d990e17b7" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.savedstate" name="savedstate-android" version="1.3.2"> + <artifact name="savedstate-release.aar"> + <sha256 value="1e26f137705596d09d3f4f52559a29026d9a1a6688be7f1a948316a4f1e39b20" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.savedstate" name="savedstate-android" version="1.3.3"> + <artifact name="savedstate-release.aar"> + <sha256 value="3d40baf742e6bdc90ada4650502e1d08c55cb5d8c045870d2c7c6d89f237d064" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.savedstate" name="savedstate-compose" version="1.3.3"> + <artifact name="savedstate-compose-metadata-1.3.3.jar"> + <sha256 value="9a8d6197b3eb23452add1aa1e6d2c3dc7711f07e32d72199906de12cdb553e50" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.savedstate" name="savedstate-compose-android" version="1.3.2"> + <artifact name="savedstate-compose.aar"> + <sha256 value="93426691f25441cc3179494b25f401a8a468aabbee4c40b90c0327413fd65523" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.savedstate" name="savedstate-compose-android" version="1.3.3"> + <artifact name="savedstate-compose.aar"> + <sha256 value="ec3c09338a005136697824e8ca52ebb4a51b055258e670d4bd2e1f992e32945e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.savedstate" name="savedstate-compose-desktop" version="1.3.3"> + <artifact name="savedstate-compose-desktop-1.3.3.jar"> + <sha256 value="4a94787a6e5bcfe143390a4f2737d4425d2ea867f2b34a847de6cda3c6ccc58a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.savedstate" name="savedstate-desktop" version="1.3.1"> + <artifact name="savedstate-desktop-1.3.1.jar"> + <sha256 value="c5c89062ba8402b8f8657efd54db1ff192f91ca95fae59c3b418fbc477c3e3ea" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.savedstate" name="savedstate-desktop" version="1.3.3"> + <artifact name="savedstate-desktop-1.3.3.jar"> + <sha256 value="c5c89062ba8402b8f8657efd54db1ff192f91ca95fae59c3b418fbc477c3e3ea" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.savedstate" name="savedstate-ktx" version="1.3.2"> + <artifact name="savedstate-ktx-1.3.2.aar"> + <sha256 value="1c300732ece8e9d0001fb19cc693b0f77f19e77cdf90ca5c4cd56d5e6951d02b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.savedstate" name="savedstate-ktx" version="1.3.3"> + <artifact name="savedstate-ktx-1.3.3.aar"> + <sha256 value="c4df27ba3fef3674da4c5cae64f43ff251f8f9b7507c6597e95a5b7f64860c6c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.slidingpanelayout" name="slidingpanelayout" version="1.0.0"> + <artifact name="slidingpanelayout-1.0.0.aar"> + <sha256 value="76bffb7cefbf780794d8817002dad1562f3e27c0a9f746d62401c8edb30aeede" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.slidingpanelayout" name="slidingpanelayout" version="1.2.0"> + <artifact name="slidingpanelayout-1.2.0.aar"> + <sha256 value="5f53339be2a4f90a9abea3571dd59e70a8a49e7f15dd82974a3898b4652e8714" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.sqlite" name="sqlite-android" version="2.6.2"> + <artifact name="sqlite.aar"> + <sha256 value="514f8de4f7bdba2fa8d748d2b22fdcdfb623bd3770a667bf0adc0ad259f03ed2" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.sqlite" name="sqlite-bundled-android" version="2.6.2"> + <artifact name="sqlite-bundled.aar"> + <sha256 value="156a1fb3a89a18620c5aacc57b340897e5a5d7efed202eda7b0972ddc551a9df" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.sqlite" name="sqlite-framework-android" version="2.6.2"> + <artifact name="sqlite-framework.aar"> + <sha256 value="b19125c7fff34222e0f380361fc179ab214e4d82e1a50b0c068ca26c851a6231" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.startup" name="startup-runtime" version="1.1.1"> + <artifact name="startup-runtime-1.1.1.aar"> + <sha256 value="e0a6329a371262fe4c450372b70fdaf33b769ef6917094723787cfce896b1dd3" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.startup" name="startup-runtime" version="1.2.0"> + <artifact name="startup-runtime-1.2.0.aar"> + <sha256 value="f51d361d17b30b09cfb9e2aebf301d113f99437cbf462a066092795fb60eddd2" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.swiperefreshlayout" name="swiperefreshlayout" version="1.0.0"> + <artifact name="swiperefreshlayout-1.0.0.aar"> + <sha256 value="9761b3a809c9b093fd06a3c4bbc645756dec0e95b5c9da419bc9f2a3f3026e8d" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.test" name="annotation" version="1.0.1"> + <artifact name="annotation-1.0.1.aar"> + <sha256 value="c0754928effe1968c3a9a7b55d1dfc7ceb1e1e7c9f3f09f98afd42431f712492" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.test" name="core" version="1.5.0"> + <artifact name="core-1.5.0.aar"> + <sha256 value="2c06715c0d0843cee2143ab8bb322bb3f34d5247630402fc8c1b6a0eafa15b9f" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.test" name="core" version="1.7.0"> + <artifact name="core-1.7.0.aar"> + <sha256 value="f4dacd8edceeec48e0c76ecf28339b28f4b4f6b74f8e34e9e59b472c27d9eb81" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.test" name="monitor" version="1.6.1"> + <artifact name="monitor-1.6.1.aar"> + <sha256 value="2985ce8556989baf7c84342e7f687713c037a39a922e614d1a3ddf1ca3777079" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.test" name="monitor" version="1.8.0"> + <artifact name="monitor-1.8.0.aar"> + <sha256 value="56cb7496a06d9f2dca7d3ff76c50a8a30bd18e00a24a3b267d5a31437b278e67" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.test" name="orchestrator" version="1.6.1"> + <artifact name="orchestrator-1.6.1.apk"> + <sha256 value="0a8aa1f18da0613d863be7be26e2a5c8de2f6892660b86577848a122ff7df6c5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.test" name="rules" version="1.7.0"> + <artifact name="rules-1.7.0.aar"> + <sha256 value="f5ae82d9b8b20864dcaaad69dcd0b5e4112b666850599865a58e8badb5fb4d0e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.test" name="runner" version="1.5.0"> + <artifact name="runner-1.5.0.aar"> + <sha256 value="b3c5aabd545b6c260528c8f4e7c98f73628614ea3d5df3a7a44af2136fd8720b" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.test" name="runner" version="1.7.0"> + <artifact name="runner-1.7.0.aar"> + <sha256 value="970311c47119928a2e406a88892a3d270387cc5a49a181a1c44511105b41b818" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.test.espresso" name="espresso-contrib" version="3.7.0"> + <artifact name="espresso-contrib-3.7.0.aar"> + <sha256 value="9ebf9370c8e3d0f80ba15b72b6719b8128f7036096e6c47c6c49a5fa8e9c1faf" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.test.espresso" name="espresso-core" version="3.5.0"> + <artifact name="espresso-core-3.5.0.aar"> + <sha256 value="34b0493f4e002f205d961e562add0c0c31bb0acc657e89d89d4b188ac13f242c" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.test.espresso" name="espresso-core" version="3.7.0"> + <artifact name="espresso-core-3.7.0.aar"> + <sha256 value="5dd90e366838bf044cb52eae06474debd285df18a7a77c40441ac8e8951bb00f" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.test.espresso" name="espresso-idling-resource" version="3.7.0"> + <artifact name="espresso-idling-resource-3.7.0.aar"> + <sha256 value="5ff62326b49c308c1d060466ae3cf4aa0e3deaf9295f077a6886048dda3e9b14" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.test.espresso" name="espresso-intents" version="3.7.0"> + <artifact name="espresso-intents-3.7.0.aar"> + <sha256 value="cc757d59a440e36da54fb97e1455cdfd55f666a48484f11f47b16fe31e246be1" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.test.espresso.idling" name="idling-concurrent" version="3.7.0"> + <artifact name="idling-concurrent-3.7.0.aar"> + <sha256 value="85850f4489c3ca04e4e598fb7f8966adf6e639c3ed7346ccc82cf5de99f70803" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.test.ext" name="junit" version="1.1.5"> + <artifact name="junit-1.1.5.aar"> + <sha256 value="4307c0e60f5d701db9c59bcd9115af705113c36a9132fa3dbad58db1294e9bfd" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.test.ext" name="junit" version="1.3.0"> + <artifact name="junit-1.3.0.aar"> + <sha256 value="3363df84da4540ba8daff02c3f7cd65471037a6a5370591a7e6deba377b36e7f" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.test.ext" name="junit-ktx" version="1.3.0"> + <artifact name="junit-ktx-1.3.0.aar"> + <sha256 value="c4f7def1ac7b197b2e3c0819979f686590e8337e4e8c0880705fe00251bc10b9" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.test.services" name="storage" version="1.4.2"> + <artifact name="storage-1.4.2.aar"> + <sha256 value="b34861f0cd920cb1089f08c3f27e5865b7f920284cc45f4ed12ef8d6980dac48" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.test.services" name="storage" version="1.6.0"> + <artifact name="storage-1.6.0.aar"> + <sha256 value="f97e3cf6aaf4e3fb97ef219d37a9c0a0720183c1f6db87b37642521e26fb6d30" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.test.services" name="test-services" version="1.6.0"> + <artifact name="test-services-1.6.0.apk"> + <sha256 value="3369693a0d79965888e674f0d05a3474d647ff46c4a62a5c8ea410a0126a20bf" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.test.uiautomator" name="uiautomator" version="2.3.0"> + <artifact name="uiautomator-2.3.0.aar"> + <sha256 value="884c675c336b663f53a1d0de440642ee80d2bdf9d0049abdae2a3ecd5e6320fc" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.tracing" name="tracing" version="1.0.0"> + <artifact name="tracing-1.0.0.aar"> + <sha256 value="07b8b6139665b884a162eccf97891ca50f7f56831233bf25168ae04f7b568612" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.tracing" name="tracing" version="1.1.0"> + <artifact name="tracing-1.1.0.aar"> + <sha256 value="5b78e2c618fc10b3d14decc01df76158f15954ad746aacf0607766721da081f6" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.tracing" name="tracing" version="1.2.0"> + <artifact name="tracing-1.2.0.aar"> + <sha256 value="6faa90390d1fdbf0adb9a99bf99de67b94c6c6f35aea9510593a9d17973736a2" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.tracing" name="tracing-ktx" version="1.2.0"> + <artifact name="tracing-ktx-1.2.0.aar"> + <sha256 value="c33f9cbd931e6190ca38aa09bf8a7a8a19391d4b0fb7a7605a6b59f2d42580d1" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.transition" name="transition" version="1.5.0"> + <artifact name="transition-1.5.0.aar"> + <sha256 value="0aa66a0ea406d25a1091f96a3b753b4b12e44fdc43b91ec52c17831e9c31f54b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.transition" name="transition" version="1.6.0"> + <artifact name="transition-1.6.0.aar"> + <sha256 value="248c45e1254d31181d2047b0b01394f09a2e539a5d9e89b773d53c62c96860f6" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.vectordrawable" name="vectordrawable" version="1.1.0"> + <artifact name="vectordrawable-1.1.0.aar"> + <sha256 value="46fd633ac01b49b7fcabc263bf098c5a8b9e9a69774d234edcca04fb02df8e26" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.vectordrawable" name="vectordrawable-animated" version="1.1.0"> + <artifact name="vectordrawable-animated-1.1.0.aar"> + <sha256 value="76da2c502371d9c38054df5e2b248d00da87809ed058f3363eae87ce5e2403f8" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.versionedparcelable" name="versionedparcelable" version="1.1.1"> + <artifact name="versionedparcelable-1.1.1.aar"> + <sha256 value="57e8d93260d18d5b9007c9eed3c64ad159de90c8609ebfc74a347cbd514535a4" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.viewpager" name="viewpager" version="1.0.0"> + <artifact name="viewpager-1.0.0.aar"> + <sha256 value="147af4e14a1984010d8f155e5e19d781f03c1d70dfed02a8e0d18428b8fc8682" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.viewpager2" name="viewpager2" version="1.0.0"> + <artifact name="viewpager2-1.0.0.aar"> + <sha256 value="e95c0031d4cc247cd48196c6287e58d2cee54d9c79b85afea7c90920330275af" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.viewpager2" name="viewpager2" version="1.1.0-beta02"> + <artifact name="viewpager2-1.1.0-beta02.aar"> + <sha256 value="bafac3ca991ed68a2c7ca6ff352966d200b12e66a342d10f497cb8168f59054a" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="androidx.window" name="window" version="1.3.0"> + <artifact name="window-1.3.0.aar"> + <sha256 value="4aef04a1390b91869abef45164e915ea3407d2e03b159c44d003cb9443c27e93" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.window" name="window" version="1.5.0"> + <artifact name="window-1.5.0.aar"> + <sha256 value="5de2d48aa578402f46deb5294a955cee62f0c7d8c1840ef626fc7afb8abe22f9" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.window" name="window-core" version="1.3.0"> + <artifact name="window-core-metadata-1.3.0.jar"> + <sha256 value="3cc622558f9fe0dce8af12224f3ec921df332f67a416714bb66aea7faa6b21dc" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.window" name="window-core-android" version="1.3.0"> + <artifact name="window-core-release.aar"> + <sha256 value="7e0a44287cc647b2c8580d4ed72a9a511adddd9dc8387fd202127a9ea6862bf7" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.window" name="window-core-android" version="1.5.0"> + <artifact name="window-core.aar"> + <sha256 value="d0d50db0756194a6d49a66ad8dafd17b24b4c5fbd8379375056e2eb9bdfeaf22" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.work" name="work-runtime" version="2.10.5"> + <artifact name="work-runtime-2.10.5.aar"> + <sha256 value="6c72e877bfed9fa8382b13856af9bf2086b886210f4c6ed5810880831bc85bc7" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.work" name="work-runtime-ktx" version="2.10.5"> + <artifact name="work-runtime-ktx-2.10.5.aar"> + <sha256 value="229f2c58cc511766519cadfa2ede5b000f8f7f4e14eaa19d483a15c5d210d461" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.work" name="work-rxjava2" version="2.10.5"> + <artifact name="work-rxjava2-2.10.5.aar"> + <sha256 value="27bc36ad241d256ea82ad8a6f4aa71a7f084ce87266b350621e09cf95ea75f05" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="aopalliance" name="aopalliance" version="1.0"> + <artifact name="aopalliance-1.0.jar"> + <sha256 value="0addec670fedcd3f113c5c8091d783280d23f75e3acb841b61a9cdb079376a08" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="app.cash.turbine" name="turbine" version="1.2.1"> + <artifact name="Turbine-metadata.jar"> + <sha256 value="3a5b990fade2c74a5c04bb992213c5efedce31bfa93f412cfadc379d5390979d" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="app.cash.turbine" name="turbine-jvm" version="1.2.1"> + <artifact name="Turbine-jvm.jar"> + <sha256 value="d1a853be08d6c3562fdfef98ac25b7048e669d9cb1203a42fc36c56d17c037d5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="cat.ereza" name="customactivityoncrash" version="2.4.0"> + <artifact name="customactivityoncrash-2.4.0.aar"> + <sha256 value="6c7e6467194e540d7c48590770033eab091808f1bba31dc58eb8302aae6e6488" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="ch.qos.logback" name="logback-classic" version="1.3.15"> + <artifact name="logback-classic-1.3.15.jar"> + <sha256 value="06c68fb7468143c3c6512d13bb8eb6676724b019330de3a5ab493e267dde2084" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="ch.qos.logback" name="logback-core" version="1.3.15"> + <artifact name="logback-core-1.3.15.jar"> + <sha256 value="90b72ec457f30f8f42a280a409ab2bc4499fec16983005d1d91015199be7047b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="co.touchlab" name="stately-concurrency" version="2.1.0"> + <artifact name="stately-concurrency-metadata-2.1.0.jar"> + <sha256 value="17e7322040da7bbe69be0d5d857df355665cb655b5508795591c6b70cfea7a90" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="co.touchlab" name="stately-concurrency-jvm" version="2.1.0"> + <artifact name="stately-concurrency-jvm-2.1.0.jar"> + <sha256 value="86739675892fb1c17d6bd36d05347e89ff313957421bb01a45a743ce774e8e29" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="co.touchlab" name="stately-concurrent-collections" version="2.1.0"> + <artifact name="stately-concurrent-collections-metadata-2.1.0.jar"> + <sha256 value="501a024be7377c2a853a775a2054a347fb47e0f999d20f63c3e42e2dc10172fa" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="co.touchlab" name="stately-concurrent-collections-jvm" version="2.1.0"> + <artifact name="stately-concurrent-collections-jvm-2.1.0.jar"> + <sha256 value="0e0d9e7f20eaee18f7862309064c8db58ce6a3a861d8871f561546af63df1893" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="co.touchlab" name="stately-strict" version="2.1.0"> + <artifact name="stately-strict-metadata-2.1.0.jar"> + <sha256 value="d25c300fbeba1aaae35b0b8170990b4d62befd834b2ed839d81419dad42b0d2d" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="co.touchlab" name="stately-strict-jvm" version="2.1.0"> + <artifact name="stately-strict-jvm-2.1.0.jar"> + <sha256 value="581070db2802cbad81f6e6e2d9d2494835443153b314458d53aa43c68260c9fa" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.airbnb.android" name="lottie" version="6.6.10"> + <artifact name="lottie-6.6.10.aar"> + <sha256 value="5a4704749eb1c301869c194fd3d8a01131e28df9f684612d16563b651f4b49ff" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.airbnb.android" name="lottie-compose" version="6.6.10"> + <artifact name="lottie-compose-6.6.10.aar"> + <sha256 value="81afc4348473741aa61d35495f6a5e08cc9fda9a0fd84a573ed463d10a6f8ac8" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android" name="signflinger" version="9.0.1"> + <artifact name="signflinger-9.0.1.jar"> + <sha256 value="bde5760f4ae032cf02851b3725e22ac391fc55792826c0258c9361378672692c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android" name="zipflinger" version="9.0.1"> + <artifact name="zipflinger-9.0.1.jar"> + <sha256 value="d2ad6ddec6da2ae142a8fe3af2f2529f3fbf77852e2db7ff261ad7b924b119fa" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.databinding" name="baseLibrary" version="9.0.1"> + <artifact name="baseLibrary-9.0.1.jar"> + <sha256 value="794113709dab21b06c262b3795e73cb708fbacae61715f34361e1af6237a1870" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.support" name="support-annotations" version="28.0.0"> + <artifact name="support-annotations-28.0.0.jar"> + <sha256 value="5d5b9414f02d3fa0ee7526b8d5ddae0da67c8ecc8c4d63ffa6cf91488a93b927" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="com.android.tools" name="annotations" version="32.0.1"> + <artifact name="annotations-32.0.1.jar"> + <sha256 value="3b4bb9620c17d19e5bd91ac1988080553573b4c3b739fdd92416f42f2daf3e78" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools" name="common" version="32.0.1"> + <artifact name="common-32.0.1.jar"> + <sha256 value="2867635adf3709fd658d4af7d4632185cac298086e9209462be29dee0c724672" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools" name="desugar_jdk_libs" version="2.1.5"> + <artifact name="desugar_jdk_libs-2.1.5.jar"> + <sha256 value="d8044befae095781b9a80bf1faa92edc30382d75d437476784c1bf991598a976" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="com.android.tools" name="desugar_jdk_libs_configuration" version="2.1.5"> + <artifact name="desugar_jdk_libs_configuration-2.1.5.jar"> + <sha256 value="7bc9051b3a1ec19806311dcb6aa9b9ba7ef9c22caa6f4810da55bde285fb7770" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="com.android.tools" name="dvlib" version="32.0.1"> + <artifact name="dvlib-32.0.1.jar"> + <sha256 value="2449554f04eee2d47120089ee1bd49154a7c1e0dd7384acfc5b5db9ceba50e28" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools" name="repository" version="32.0.1"> + <artifact name="repository-32.0.1.jar"> + <sha256 value="a7a21557650dd695cb2f612ee3fafdba822d816dbe3418d0ed5aa90fc992b08a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools" name="sdk-common" version="32.0.1"> + <artifact name="sdk-common-32.0.1.jar"> + <sha256 value="87023b13be78618d08ce3615bd7b8c98af8c2eb5e1ad7912bc305e4f516c00a4" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools" name="sdklib" version="32.0.1"> + <artifact name="sdklib-32.0.1.jar"> + <sha256 value="e0374dde0b08d80c92ce1fc223e661d2d165b83324babe4f3368b71f654f4cd6" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.analytics-library" name="crash" version="32.0.1"> + <artifact name="crash-32.0.1.jar"> + <sha256 value="1589c55563c8f595858cb478708d9d3043969c18b784170bb0fbdfffdb44c7bc" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.analytics-library" name="protos" version="32.0.1"> + <artifact name="protos-32.0.1.jar"> + <sha256 value="a108eb689d8dd056e5b218436aafd97234b976a0943a446ac36751c6ab9e1da1" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.analytics-library" name="shared" version="32.0.1"> + <artifact name="shared-32.0.1.jar"> + <sha256 value="bb78407f373fd94d617fd2c6513c5f3c03583a0f380437742a5e75c0b6c56b46" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.analytics-library" name="tracker" version="32.0.1"> + <artifact name="tracker-32.0.1.jar"> + <sha256 value="4032259dcc31f98734d50fdc7d6ce63d799205ff2a1ba05a31959af3301d2a52" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.build" name="aapt2-proto" version="9.0.1-14304508"> + <artifact name="aapt2-proto-9.0.1-14304508.jar"> + <sha256 value="2335bab7fd8269ee98d3843410c4a5553d31dd71f9a22f49b21a676d3139c882" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.build" name="aaptcompiler" version="9.0.1"> + <artifact name="aaptcompiler-9.0.1.jar"> + <sha256 value="833410cedb07d6467702a43f877bc8278960e3973a2d743ed4615ac50aa2e7e8" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.build" name="apksig" version="9.0.1"> + <artifact name="apksig-9.0.1.jar"> + <sha256 value="562cd0a88890960d2ece48e116c61f12872222f1dcc306890799382bc019b201" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.build" name="apkzlib" version="9.0.1"> + <artifact name="apkzlib-9.0.1.jar"> + <sha256 value="dd9c4a5f8df807e6e23a11f61722e35335275e6dd92df10ecee4b42074a93f84" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.build" name="builder" version="9.0.1"> + <artifact name="builder-9.0.1.jar"> + <sha256 value="cdbad6d56863995a2564c8534108ed0e5d4581a4c12c614df2b6cca570d7e6b2" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.build" name="builder-model" version="9.0.1"> + <artifact name="builder-model-9.0.1.jar"> + <sha256 value="c99bcc1b0922173510cb19d3f960df0f5de203ce2e29c5705cfa659fbdffcd69" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.build" name="builder-test-api" version="9.0.1"> + <artifact name="builder-test-api-9.0.1.jar"> + <sha256 value="b29491ec6d11a8012989fdbb548f16c664fbdd93b3399f13e670aee82419f0fc" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.build" name="bundletool" version="1.18.3"> + <artifact name="bundletool-1.18.3.jar"> + <sha256 value="ccad18514fd97db010856b2bbed40f481f8ba9349368c97ae54d72e3567d0171" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="com.android.tools.build" name="gradle" version="9.0.1"> + <artifact name="gradle-9.0.1.jar"> + <sha256 value="b212aa992a9a2ff4c374ba323e8d49d113f2c55ce1dbc153d3a6f38f18ff3086" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.build" name="gradle-api" version="9.0.1"> + <artifact name="gradle-api-9.0.1.jar"> + <sha256 value="4fb70676b7afa6922a02a4cd14a472b3122c369bd5595006fdaf0357b0e1bd47" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.build" name="gradle-common-api" version="9.0.1"> + <artifact name="gradle-common-api-9.0.1.jar"> + <sha256 value="fbc8e90c270cfcab9cb4de6e948180870435971201f487c0355d589c64b1fb36" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.build" name="gradle-kotlin" version="9.0.1"> + <artifact name="gradle-kotlin-9.0.1.jar"> + <sha256 value="5c056f5fbfa5dc8576486342aaed599bd4f0c3d3f0e78c3db401c48dc3cf238d" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.build" name="gradle-settings-api" version="9.0.1"> + <artifact name="gradle-settings-api-9.0.1.jar"> + <sha256 value="7b1cb2709737656e21e50d2e1b64258a0f2f1c5c49710c521a83e8c9163f2b63" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.build" name="manifest-merger" version="32.0.1"> + <artifact name="manifest-merger-32.0.1.jar"> + <sha256 value="4a5b42b4d2fc36f2dbf95e366672821e8bceecf34fecf11a3d70a99792e10857" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.build.jetifier" name="jetifier-core" version="1.0.0-beta10"> + <artifact name="jetifier-core-1.0.0-beta10.jar"> + <sha256 value="26abb4a13927d9062169c504c9e94fe80e9ae3a4f7b5ab8875ab007536a91f5e" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="com.android.tools.build.jetifier" name="jetifier-processor" version="1.0.0-beta10"> + <artifact name="jetifier-processor-1.0.0-beta10.jar"> + <sha256 value="c5067a7b928237a1271a5e9cb5710e9f80b4973293945bc51e3a4c864ea4bfed" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="com.android.tools.ddms" name="ddmlib" version="32.0.1"> + <artifact name="ddmlib-32.0.1.jar"> + <sha256 value="e207999e9b6074d0dd99687c89b56517514a062d319bc1fea427ddae876d7773" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.emulator" name="proto" version="32.0.1"> + <artifact name="proto-32.0.1.jar"> + <sha256 value="8fd117c678f2cba06c531677b2a2555efc2fbace9cdeaed386b7c8a25463b67e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.layoutlib" name="layoutlib-api" version="32.0.1"> + <artifact name="layoutlib-api-32.0.1.jar"> + <sha256 value="00d18f9511c00adbc785801b4def8af527dbd047bb2ac73d2d720ed5c5c577ee" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.lint" name="lint-model" version="32.0.1"> + <artifact name="lint-model-32.0.1.jar"> + <sha256 value="c8a3aefbeaa9e046afada13c657dc89f2873cdf60e2dfa3034ff9e616b6a7b4e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.lint" name="lint-typedef-remover" version="32.0.1"> + <artifact name="lint-typedef-remover-32.0.1.jar"> + <sha256 value="0710eba41387b5d9fbdaaf061e52cb9a56e40cdda5a01db37d1497fee019aa78" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.utp" name="android-device-provider-ddmlib" version="32.0.1"> + <artifact name="android-device-provider-ddmlib-32.0.1.jar"> + <sha256 value="964f9103adb2b0445facdade142c57b2cea12f556708f256affbfa1f86684ecd" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.utp" name="android-device-provider-ddmlib-proto" version="32.0.1"> + <artifact name="android-device-provider-ddmlib-proto-32.0.1.jar"> + <sha256 value="047aecdd66e106137f77a52c442f1b83db7d6e8496899800251f206c7f39de65" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.utp" name="android-test-plugin-host-additional-test-output" version="32.0.1"> + <artifact name="android-test-plugin-host-additional-test-output-32.0.1.jar"> + <sha256 value="399a19f5c56d2ecc2bb264cd1a73b3d44684ca07e047362a6e8d01f4f74cf095" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.utp" name="android-test-plugin-host-additional-test-output-proto" version="32.0.1"> + <artifact name="android-test-plugin-host-additional-test-output-proto-32.0.1.jar"> + <sha256 value="6ba7e6ac2208d74c1bb5f1d1464abafc6a45d8710b20455a2dc02adf8726bc83" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.utp" name="android-test-plugin-host-apk-installer" version="32.0.1"> + <artifact name="android-test-plugin-host-apk-installer-32.0.1.jar"> + <sha256 value="9eeeb2ec15e0fdb26a7178ebbc35e2714df0d20d37c2727aaca8795da8b08926" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.utp" name="android-test-plugin-host-apk-installer-proto" version="32.0.1"> + <artifact name="android-test-plugin-host-apk-installer-proto-32.0.1.jar"> + <sha256 value="c00d382ba4dac722f6ac99e79f7ae5ee14aa11b92949ed626c39400992d815ca" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.utp" name="android-test-plugin-host-coverage" version="32.0.1"> + <artifact name="android-test-plugin-host-coverage-32.0.1.jar"> + <sha256 value="d8919a8498bdcb300fb85bbe420e177e7239dd959bd6e946c16028fc3e1243c2" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.utp" name="android-test-plugin-host-coverage-proto" version="32.0.1"> + <artifact name="android-test-plugin-host-coverage-proto-32.0.1.jar"> + <sha256 value="6ba6353e453f1f50ff014571274a661f27ae3801a2c9084379bd20c4cc60511a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.utp" name="android-test-plugin-host-device-info" version="32.0.1"> + <artifact name="android-test-plugin-host-device-info-32.0.1.jar"> + <sha256 value="a30da9dcc497724e0ccee0542fcce8b26937d863c8181db9a4c84faa81c9205b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.utp" name="android-test-plugin-host-device-info-proto" version="32.0.1"> + <artifact name="android-test-plugin-host-device-info-proto-32.0.1.jar"> + <sha256 value="28f658d2f0e9a4c75f80b75d1909ca5020136bc4f4543e4ba6722bf803743b00" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.utp" name="android-test-plugin-host-emulator-control" version="32.0.1"> + <artifact name="android-test-plugin-host-emulator-control-32.0.1.jar"> + <sha256 value="866f2c37b3a62d57a3707640737c6a488e3ee55ff049daa0b073ccc2976b680d" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.utp" name="android-test-plugin-host-emulator-control-proto" version="32.0.1"> + <artifact name="android-test-plugin-host-emulator-control-proto-32.0.1.jar"> + <sha256 value="f03456be04699c84ea166d0bf71d2f47d0d444eebbab16a553bd3ae08202916c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.utp" name="android-test-plugin-host-logcat" version="32.0.1"> + <artifact name="android-test-plugin-host-logcat-32.0.1.jar"> + <sha256 value="c6cf3225b10419198c28d880a8f8f38c6d63205aa8f2bbb244f7b3ad97d72298" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.utp" name="android-test-plugin-host-logcat-proto" version="32.0.1"> + <artifact name="android-test-plugin-host-logcat-proto-32.0.1.jar"> + <sha256 value="c1f6ebbacdad559b6efe4eaa29561552b33156395f069cd9703fda09c462dea6" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.utp" name="android-test-plugin-result-listener-gradle" version="32.0.1"> + <artifact name="android-test-plugin-result-listener-gradle-32.0.1.jar"> + <sha256 value="073ea5eab9536f9b661e2ed59f9e5c455724beae41323e89a3ec19e10e89f376" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.utp" name="android-test-plugin-result-listener-gradle-proto" version="32.0.1"> + <artifact name="android-test-plugin-result-listener-gradle-proto-32.0.1.jar"> + <sha256 value="1301efa4095a7324f31e7947ced6611188fa5d563b2bee560dc50bd138231300" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.utp" name="gradle-work-action" version="32.0.1"> + <artifact name="gradle-work-action-32.0.1.jar"> + <sha256 value="906d650361a4dc11bca461864aa08196218f2b649acbb56336d1576576f7f678" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.utp" name="gradle-work-action-api" version="32.0.1"> + <artifact name="gradle-work-action-api-32.0.1.jar"> + <sha256 value="98c07e3f1ac8eafdb85ec391ea7ab2be3189f358745010c530db72d831864816" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.android.tools.utp" name="utp-common" version="32.0.1"> + <artifact name="utp-common-32.0.1.jar"> + <sha256 value="98fd89fa490f9341fef549bf49f934e2a696f1c83a62d60361a030040d3f0039" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.ethlo.time" name="itu" version="1.10.2"> + <artifact name="itu-1.10.2.jar"> + <sha256 value="0424b2ff0c20265a084a32a4907521b28e7b86af25d131987a6b31ef63b9687c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.fasterxml.jackson.core" name="jackson-annotations" version="2.18.2"> + <artifact name="jackson-annotations-2.18.2.jar"> + <sha256 value="581bd61000ef7648943f781ca05689e56d03f6052748365a8e2b3a9b5d3fa32f" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.fasterxml.jackson.core" name="jackson-core" version="2.18.2"> + <artifact name="jackson-core-2.18.2.jar"> + <sha256 value="d8054ae7c0d1c2d2f55d28e46026ebe5892881f3fab5f439233184381c3b4a1f" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.fasterxml.jackson.core" name="jackson-databind" version="2.18.2"> + <artifact name="jackson-databind-2.18.2.jar"> + <sha256 value="4b364e6850dc89172fcf1d4dd26b8ff5488eda44ff4657e22dd265203dd5ab3c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.fasterxml.jackson.dataformat" name="jackson-dataformat-xml" version="2.18.2"> + <artifact name="jackson-dataformat-xml-2.18.2.jar"> + <sha256 value="3a5c26f070b9974617f4b103b9561d4f5e3f4f8cc60162d4e0cd3e172c776af5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.fasterxml.jackson.dataformat" name="jackson-dataformat-yaml" version="2.18.2"> + <artifact name="jackson-dataformat-yaml-2.18.2.jar"> + <sha256 value="381a1c0711e4bb88561a6c0008b5a945465628ca07764ccd66a0d97ee07ad612" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.fasterxml.woodstox" name="woodstox-core" version="7.0.0"> + <artifact name="woodstox-core-7.0.0.jar"> + <sha256 value="eeb3853282c24964a93a6eb4c1bbcb60c8d09fd8e0ffc75ab64ad21045a1fa78" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.github.AppDevNext.Logcat" name="LogcatCoreLib" version="3.4"> + <artifact name="LogcatCoreLib-3.4.aar"> + <sha256 value="3a8c5a6464445b97b61dfe8d3f26f0450417819587b0bd05bb3cdf1100e008b1" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="com.github.PhilJay" name="MPAndroidChart" version="v3.1.0"> + <artifact name="MPAndroidChart-v3.1.0.aar"> + <sha256 value="56cd113c319b301c65078ec8a26f2f8f67aa4eec8d6913c9f00ad62c35430bd1" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="com.github.bumptech.glide" name="annotations" version="5.0.5"> + <artifact name="annotations-5.0.5.jar"> + <sha256 value="fb3e596a60c182f3251170bd1e2dfe32ca1d1f0d79763408d1bf168c81d61ae1" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.github.bumptech.glide" name="compiler" version="5.0.5"> + <artifact name="compiler-5.0.5.jar"> + <sha256 value="3d775bf51873ec3c3c28672e784f76b94850f874076cbe147d47bced48e6a865" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.github.bumptech.glide" name="disklrucache" version="5.0.5"> + <artifact name="disklrucache-5.0.5.aar"> + <sha256 value="509f94cbe85e3aa393c019b026ac904e2eece355a52795e355d82e3e774b2419" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.github.bumptech.glide" name="gifdecoder" version="5.0.5"> + <artifact name="gifdecoder-5.0.5.aar"> + <sha256 value="df9e4620e87b68b719ef8af3d100324a144bfc88f43518af9a013674109fe078" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.github.bumptech.glide" name="glide" version="5.0.5"> + <artifact name="glide-5.0.5.aar"> + <sha256 value="73ed8af676087d46400f7b6b9e940e433c3f2a9fd9387b361726a4db2d6d277c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.github.dhis2" name="sms-compression" version="0.2.0"> + <artifact name="sms-compression-0.2.0.jar"> + <sha256 value="2d3b9a5f7c71a7a16ee611219bcbf777d33a52d2f6da4dcaf773079249d80317" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="com.github.faruktoptas" name="FancyShowCaseView" version="1.4.0"> + <artifact name="FancyShowCaseView-1.4.0.aar"> + <sha256 value="0706c0e86623c6d250dfbf7d06c824f9ee6f2237e2d890e633e45d8518f81a04" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="com.github.javafaker" name="javafaker" version="1.0.2"> + <artifact name="javafaker-1.0.2.jar"> + <sha256 value="ef95ae468097f378880be69a8c6756f8d15180e0f07547fb0a99617ff421b2ac" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.github.matomo-org" name="matomo-sdk-android" version="4.4"> + <artifact name="matomo-sdk-android-4.4.aar"> + <sha256 value="1260bfa19a8ead93cdb66b1fb4f4e132628404d214cf0f21fa6ecced1bc7a7cb" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="com.github.mifmif" name="generex" version="1.0.2"> + <artifact name="generex-1.0.2.jar"> + <sha256 value="8f8ce233c335e08e113a3f9579de1046fb19927e82468b1bbebcd6cba8760b81" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.github.package-url" name="packageurl-java" version="1.5.0"> + <artifact name="packageurl-java-1.5.0.jar"> + <sha256 value="e45551727707acc0c56ac62d56964332ea0f138d6cc3656d988b9369150f5247" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.github.stephenc.jcip" name="jcip-annotations" version="1.0-1"> + <artifact name="jcip-annotations-1.0-1.jar"> + <sha256 value="4fccff8382aafc589962c4edb262f6aa595e34f1e11e61057d1c6a96e8fc7323" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.accompanist" name="accompanist-drawablepainter" version="0.37.3"> + <artifact name="accompanist-drawablepainter-0.37.3.aar"> + <sha256 value="0453c4c54ec3ef13ae18b83300f1d2a078b1ca92d3a3781437516630e3b850df" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.android" name="annotations" version="4.1.1.4"> + <artifact name="annotations-4.1.1.4.jar"> + <sha256 value="ba734e1e84c09d615af6a09d33034b4f0442f8772dec120efb376d86a565ae15" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="com.google.android.apps.common.testing.accessibility.framework" name="accessibility-test-framework" version="3.1.2"> + <artifact name="accessibility-test-framework-3.1.2.aar"> + <sha256 value="9b586dc8eeeb4f601038e23ef8ffd6a1deeca1163276d02797b0d2b8f9764b62" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="com.google.android.gms" name="play-services-auth" version="21.4.0"> + <artifact name="play-services-auth-21.4.0.aar"> + <sha256 value="4938f0163fa4d652367afacdf5989632e515944fc3354e0cfc4a1d407893d2a1" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="com.google.android.gms" name="play-services-auth-api-phone" version="18.0.2"> + <artifact name="play-services-auth-api-phone-18.0.2.aar"> + <sha256 value="bfdf380e7400a9d950cba4dedc152b1bce614a87353009e851087428927cc240" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="com.google.android.gms" name="play-services-auth-base" version="18.0.10"> + <artifact name="play-services-auth-base-18.0.10.aar"> + <sha256 value="d8bff2c98d239633fb550229e527779425bfb51ff04b96ac0f12d3acba0b1f42" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="com.google.android.gms" name="play-services-base" version="18.5.0"> + <artifact name="play-services-base-18.5.0.aar"> + <sha256 value="59a5c0c2da12311d75d965ce1f419498536b1a167fb28ff7dfc2dfd9cefa4157" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="com.google.android.gms" name="play-services-basement" version="18.5.0"> + <artifact name="play-services-basement-18.5.0.aar"> + <sha256 value="a3df6efb29beb2ff78fb7cde712ac773bd6cdcdfc9833c901895804f609c995e" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="com.google.android.gms" name="play-services-fido" version="20.0.1"> + <artifact name="play-services-fido-20.0.1.aar"> + <sha256 value="b3526f0caedaa96c526cc4c9ba94b229dad5afe31f32f46f6cd668a03624fd42" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="com.google.android.gms" name="play-services-tasks" version="18.2.0"> + <artifact name="play-services-tasks-18.2.0.aar"> + <sha256 value="7f2aaa8f502068eaf54356ca92aec04271d6e7c416c52c45c0d23440fcbd1654" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="com.google.android.material" name="material" version="1.13.0"> + <artifact name="material-1.13.0.aar"> + <sha256 value="6d5e1cbb67c05bcdcbbf84005787dafd354a155f59a4d3800fd45fa7eb3689f5" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="com.google.api.grpc" name="proto-google-common-protos" version="2.17.0"> + <artifact name="proto-google-common-protos-2.17.0.jar"> + <sha256 value="4ef1fe0c327fc1521d1d753b0b1c4a875a54bd14ebded3afff0ca395320b6ea9" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.api.grpc" name="proto-google-common-protos" version="2.48.0"> + <artifact name="proto-google-common-protos-2.48.0.jar"> + <sha256 value="43ec7807459aaa4012e838a1be4ef2d590cf233305da60af5b54f08ec8cf2302" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.auto" name="auto-common" version="1.2.1"> + <artifact name="auto-common-1.2.1.jar"> + <sha256 value="f43f29fe2a6ebaf04b2598cdeec32a4e346d49a9404e990f5fc19c19f3a28d0e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.auto.service" name="auto-service" version="1.1.1"> + <artifact name="auto-service-1.1.1.jar"> + <sha256 value="1f48f451503e623daba7d9ed368cca0f81e1e3815653a4560113e12c0129ebd5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.auto.service" name="auto-service-annotations" version="1.1.1"> + <artifact name="auto-service-annotations-1.1.1.jar"> + <sha256 value="16a76dd00a2650568447f5d6e3a9e2c809d9a42367d56b45215cfb89731f4d24" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.auto.value" name="auto-value-annotations" version="1.11.0"> + <artifact name="auto-value-annotations-1.11.0.jar"> + <sha256 value="5a055ce4255333b3346e1a8703da5bf8ff049532286fdcd31712d624abe111dd" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.auto.value" name="auto-value-annotations" version="1.6.2"> + <artifact name="auto-value-annotations-1.6.2.jar"> + <sha256 value="b48b04ddba40e8ac33bf036f06fc43995fc5084bd94bdaace807ce27d3bea3fb" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.code.findbugs" name="jsr305" version="2.0.2"> + <artifact name="jsr305-2.0.2.jar"> + <sha256 value="1e7f53fa5b8b5c807e986ba335665da03f18d660802d8bf061823089d1bee468" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.code.findbugs" name="jsr305" version="3.0.2"> + <artifact name="jsr305-3.0.2.jar"> + <sha256 value="766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.code.gson" name="gson" version="2.10.1"> + <artifact name="gson-2.10.1.jar"> + <sha256 value="4241c14a7727c34feea6507ec801318a3d4a90f070e4525681079fb94ee4c593" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.code.gson" name="gson" version="2.11.0"> + <artifact name="gson-2.11.0.jar"> + <sha256 value="57928d6e5a6edeb2abd3770a8f95ba44dce45f3b23b7a9dc2b309c581552a78b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.code.gson" name="gson" version="2.13.2"> + <artifact name="gson-2.13.2.jar"> + <sha256 value="dd0ce1b55a3ed2080cb70f9c655850cda86c206862310009dcb5e5c95265a5e0" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.code.gson" name="gson" version="2.8.2"> + <artifact name="gson-2.8.2.jar"> + <sha256 value="b7134929f7cc7c04021ec1cc27ef63ab907e410cf0588e397b8851181eb91092" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.code.gson" name="gson" version="2.8.9"> + <artifact name="gson-2.8.9.jar"> + <sha256 value="d3999291855de495c94c743761b8ab5176cfeabe281a5ab0d8e8d45326fd703e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.crypto.tink" name="tink" version="1.7.0"> + <artifact name="tink-1.7.0.jar"> + <sha256 value="88970a456a08ba4c66b01b23e5846ca1095cc14e54cb48363e5d2e15a1307308" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.dagger" name="dagger" version="2.28.3"> + <artifact name="dagger-2.28.3.jar"> + <sha256 value="f1dd23f8ae34a8e91366723991ead0d6499d1a3e9163ce550c200b02d76a872b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.dagger" name="dagger" version="2.48"> + <artifact name="dagger-2.48.jar"> + <sha256 value="1fa226d2b4a02cc80950fa4d49a4a235cc8eced499b581fc358a55446a83f579" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.dagger" name="dagger" version="2.57.2"> + <artifact name="dagger-2.57.2.jar"> + <sha256 value="f0becd6b5e98d56e6ec43f52de3288e1c560847cb81ec170ae44a1c02c0600f0" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.dagger" name="dagger-compiler" version="2.57.2"> + <artifact name="dagger-compiler-2.57.2.jar"> + <sha256 value="80712a62e4c1ba6a81e193bd29778b059950b6c2d81378b9cdf39b524226f9bc" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.dagger" name="dagger-spi" version="2.57.2"> + <artifact name="dagger-spi-2.57.2.jar"> + <sha256 value="ce2779a7c287ee33b1bbd198f5e0de8cc26ba268f607061eafdb068b720494ac" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.devtools.ksp" name="symbol-processing-api" version="2.1.21-2.0.2"> + <artifact name="symbol-processing-api-2.1.21-2.0.2.jar"> + <sha256 value="588d17c4ea982b11028c2c82cb1d7300d269023a8068009f9ae9fb2c9c20c6d9" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.devtools.ksp" name="symbol-processing-api" version="2.3.6"> + <artifact name="symbol-processing-api-2.3.6.jar"> + <sha256 value="55df837d54b1bfdd7cdbe53bd84deeae374677ec4a729a9af154d3fee3c00230" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.devtools.ksp" name="symbol-processing-common-deps" version="2.3.6"> + <artifact name="symbol-processing-common-deps-2.3.6.jar"> + <sha256 value="f75ece6d1d4a8978fc9cfe2c895c3232347ddbab5c084b04d0ce876b1d7c9604" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.devtools.ksp" name="symbol-processing-gradle-plugin" version="2.3.6"> + <artifact name="symbol-processing-gradle-plugin-2.3.6.jar"> + <sha256 value="156c7c85c2f13b84d9f1fc03b61fd659237ebe59dc12d14ae4c6f4eb3ddb6b45" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.errorprone" name="error_prone_annotations" version="2.23.0"> + <artifact name="error_prone_annotations-2.23.0.jar"> + <sha256 value="ec6f39f068b6ff9ac323c68e28b9299f8c0a80ca512dccb1d4a70f40ac3ec054" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.errorprone" name="error_prone_annotations" version="2.27.0"> + <artifact name="error_prone_annotations-2.27.0.jar"> + <sha256 value="24c923372c58e35d0b9f16a028929bb9aedc77521867c274f2bd0735df5ba1f5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.errorprone" name="error_prone_annotations" version="2.28.0"> + <artifact name="error_prone_annotations-2.28.0.jar"> + <sha256 value="f3fc8a3a0a4020706a373b00e7f57c2512dd26d1f83d28c7d38768f8682b231e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.errorprone" name="error_prone_annotations" version="2.30.0"> + <artifact name="error_prone_annotations-2.30.0.jar"> + <sha256 value="144f3aefbd6e27daec55d3753b2c6b13c1afdaf0cf04816cdb564588ed92f1bd" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.errorprone" name="error_prone_annotations" version="2.41.0"> + <artifact name="error_prone_annotations-2.41.0.jar"> + <sha256 value="a56e782b5b50811ac204073a355a21d915a2107fce13ec711331ad036f660fcc" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.errorprone" name="javac-shaded" version="9-dev-r4023-3"> + <artifact name="javac-shaded-9-dev-r4023-3.jar"> + <sha256 value="65bfccf60986c47fbc17c9ebab0be626afc41741e0a6ec7109e0768817a36f30" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.flatbuffers" name="flatbuffers-java" version="1.12.0"> + <artifact name="flatbuffers-java-1.12.0.jar"> + <sha256 value="3f8c088b4dd04a9858721f2e162508c94db0dd86f961e306ee63ef2eda871bf7" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.googlejavaformat" name="google-java-format" version="1.5"> + <artifact name="google-java-format-1.5.jar"> + <sha256 value="aa19ad7850fb85178aa22f2fddb163b84d6ce4d0035872f30d4408195ca1144e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.guava" name="failureaccess" version="1.0.1"> + <artifact name="failureaccess-1.0.1.jar"> + <sha256 value="a171ee4c734dd2da837e4b16be9df4661afab72a41adaf31eb84dfdaf936ca26" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.guava" name="failureaccess" version="1.0.2"> + <artifact name="failureaccess-1.0.2.jar"> + <sha256 value="8a8f81cf9b359e3f6dfa691a1e776985c061ef2f223c9b2c80753e1b458e8064" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.guava" name="failureaccess" version="1.0.3"> + <artifact name="failureaccess-1.0.3.jar"> + <sha256 value="cbfc3906b19b8f55dd7cfd6dfe0aa4532e834250d7f080bd8d211a3e246b59cb" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.guava" name="guava" version="19.0"> + <artifact name="guava-19.0.jar"> + <sha256 value="58d4cc2e05ebb012bbac568b032f75623be1cb6fb096f3c60c72a86f7f057de4" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.guava" name="guava" version="32.0.1-jre"> + <artifact name="guava-32.0.1-jre.jar"> + <sha256 value="bd7fa227591fb8509677d0d1122cf95158f3b8a9f45653f58281d879f6dc48c5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.guava" name="guava" version="33.0.0-jre"> + <artifact name="guava-33.0.0-jre.jar"> + <sha256 value="f4d85c3e4d411694337cb873abea09b242b664bb013320be6105327c45991537" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.guava" name="guava" version="33.3.1-jre"> + <artifact name="guava-33.3.1-jre.jar"> + <sha256 value="4bf0e2c5af8e4525c96e8fde17a4f7307f97f8478f11c4c8e35a0e3298ae4e90" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.guava" name="guava" version="33.5.0-android"> + <artifact name="guava-33.5.0-android.jar"> + <sha256 value="e380b435404653753e894be80ee6fdd5252d55b07f663d8a004b4e5898ecfaa0" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.guava" name="listenablefuture" version="1.0"> + <artifact name="listenablefuture-1.0.jar"> + <sha256 value="e4ad7607e5c0477c6f890ef26a49cb8d1bb4dffb650bab4502afee64644e3069" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.guava" name="listenablefuture" version="9999.0-empty-to-avoid-conflict-with-guava"> + <artifact name="listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar"> + <sha256 value="b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.inject" name="guice" version="5.1.0"> + <artifact name="guice-5.1.0.jar"> + <sha256 value="4130e50bfac48099c860f0d903b91860c81a249c90f38245f8fed58fc817bc26" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="com.google.j2objc" name="j2objc-annotations" version="2.8"> + <artifact name="j2objc-annotations-2.8.jar"> + <sha256 value="f02a95fa1a5e95edb3ed859fd0fb7df709d121a35290eff8b74dce2ab7f4d6ed" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="com.google.j2objc" name="j2objc-annotations" version="3.0.0"> + <artifact name="j2objc-annotations-3.0.0.jar"> + <sha256 value="88241573467ddca44ffd4d74aa04c2bbfd11bf7c17e0c342c94c9de7a70a7c64" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.j2objc" name="j2objc-annotations" version="3.1"> + <artifact name="j2objc-annotations-3.1.jar"> + <sha256 value="84d3a150518485f8140ea99b8a985656749629f6433c92b80c75b36aba3b099b" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="com.google.jimfs" name="jimfs" version="1.1"> + <artifact name="jimfs-1.1.jar"> + <sha256 value="c4828e28d7c0a930af9387510b3bada7daa5c04d7c25a75c7b8b081f1c257ddd" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.protobuf" name="protobuf-java" version="3.24.4"> + <artifact name="protobuf-java-3.24.4.jar"> + <sha256 value="e5655522be1aa5cc1f2f092aa036b0445157f294928eedf1332ac938c7b69686" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="com.google.protobuf" name="protobuf-java" version="3.25.5"> + <artifact name="protobuf-java-3.25.5.jar"> + <sha256 value="8540247fad9e06baefa8fb45eb313802d019f485f14300e0f9d6b556ed88e753" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="com.google.protobuf" name="protobuf-java-util" version="3.22.3"> + <artifact name="protobuf-java-util-3.22.3.jar"> + <sha256 value="c615f76879dc5c303e4df5b94a6afa39534058c7545db2d483fd95d9f63c8bfe" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.protobuf" name="protobuf-java-util" version="3.24.4"> + <artifact name="protobuf-java-util-3.24.4.jar"> + <sha256 value="133c929e2cfe3990a105d18eaccc49122b2d2fb492b420ef02d5d9f937eaebb8" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="com.google.protobuf" name="protobuf-java-util" version="3.25.5"> + <artifact name="protobuf-java-util-3.25.5.jar"> + <sha256 value="dacc58b2c3d2fa8d4bddc1acb881e78d6cf7c137dd78bc1d67f6aca732436a8d" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="com.google.protobuf" name="protobuf-javalite" version="3.25.8"> + <artifact name="protobuf-javalite-3.25.8.jar"> + <sha256 value="918bcc959cc0f5cb58798cec347a15d41cee9a1b8101c352954fd18d44e2e1c7" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="com.google.protobuf" name="protobuf-kotlin" version="3.24.4"> + <artifact name="protobuf-kotlin-3.24.4.jar"> + <sha256 value="508ca13d97b50f5404eaa37eb4493cb07884162eb7971bf924d8f803d4c21bb4" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="com.google.protobuf" name="protobuf-lite" version="3.0.1"> + <artifact name="protobuf-lite-3.0.1.jar"> + <sha256 value="1413393db84e4adef79b2997d9dfeb4793d8f93d196f8347808d15711f0bc69c" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="com.google.testing.platform" name="android-device-provider-local" version="0.0.9-alpha03"> + <artifact name="android-device-provider-local-0.0.9-alpha03.jar"> + <sha256 value="667a4d35bbba87d3c86f5180dfa521fdbd7a4ef5c60d949154b0301f3e232e1b" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="com.google.testing.platform" name="android-driver-instrumentation" version="0.0.9-alpha03"> + <artifact name="android-driver-instrumentation-0.0.9-alpha03.jar"> + <sha256 value="507c632ec7db77bcb299b5519d59b14cc6243aac541767c632fdbeddc6226b07" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="com.google.testing.platform" name="android-test-plugin" version="0.0.9-alpha03"> + <artifact name="android-test-plugin-0.0.9-alpha03.jar"> + <sha256 value="d6cb7e126f433037190bcd3c3b904b19ba842d46b17b0fd27c38cc4ccecbec90" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="com.google.testing.platform" name="core" version="0.0.9-alpha03"> + <artifact name="core-0.0.9-alpha03.jar"> + <sha256 value="6e1806d015c416596f53a45a3100e25743c313a6e3fc4f52f24e8b257f2c82ce" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="com.google.testing.platform" name="core-proto" version="0.0.9-alpha03"> + <artifact name="core-proto-0.0.9-alpha03.jar"> + <sha256 value="d001eb0ccbbfc8cb9eaa193a358e63712974639775647be949ab232c2b29b407" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="com.google.testing.platform" name="launcher" version="0.0.9-alpha03"> + <artifact name="launcher-0.0.9-alpha03.jar"> + <sha256 value="0012f980a059a0c4c216d0f1d0016867ab31eb8079e3f8f879f1f02b7be3a6e7" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="com.google.truth" name="truth" version="1.4.5"> + <artifact name="truth-1.4.5.jar"> + <sha256 value="a6409e90fdd6b31f239b0c02065c43b53e1b09c72f2e08c3a86d04fe5910cf4b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.google.zxing" name="core" version="3.5.4"> + <artifact name="core-3.5.4.jar"> + <sha256 value="71de5d89341b5fcf5dd89da7f44e84d825d0e084cdf3ec77c9abe26b0f0ceb13" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.googlecode.juniversalchardet" name="juniversalchardet" version="1.0.3"> + <artifact name="juniversalchardet-1.0.3.jar"> + <sha256 value="757bfe906193b8b651e79dc26cd67d6b55d0770a2cdfb0381591504f779d4a76" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.ionspin.kotlin" name="bignum-jvm" version="0.3.10"> + <artifact name="bignum-jvm-0.3.10.jar"> + <sha256 value="c5c718466ef822290ed6ea2013dee788c468a993fa53f34d0e07acc8d6ef087d" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="com.jakewharton.android.repackaged" name="dalvik-dx" version="9.0.0_r3"> + <artifact name="dalvik-dx-9.0.0_r3.jar"> + <sha256 value="b29c1c21e52ed6238cd3fed39d880a17ecf2360118604548cea8821be6801e1c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.jakewharton.rxrelay2" name="rxrelay" version="2.1.1"> + <artifact name="rxrelay-2.1.1.jar"> + <sha256 value="ba4bed60bf5e3056d450184aaf7116024788f51146b57e55a396838cf8a4627b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.jakewharton.timber" name="timber" version="5.0.1"> + <artifact name="timber-5.0.1.aar"> + <sha256 value="c6edddfcc8eff42a1604c8577fcfa4b4ffd9f252122c52ea36cfe7967f512f71" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.journeyapps" name="zxing-android-embedded" version="4.3.0"> + <artifact name="zxing-android-embedded-4.3.0.aar"> + <sha256 value="4ab03353127c34e55cbb80fbc9a34031decbcfb1ec5e8f991944d2d494621a33" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.linkedin.dexmaker" name="dexmaker" version="2.28.6"> + <artifact name="dexmaker-2.28.6.jar"> + <sha256 value="fdb1d3632c66694ed4cd3445cd86da70286f93b55d613e30361abec6d23404ac" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.linkedin.dexmaker" name="dexmaker-mockito-inline" version="2.28.6"> + <artifact name="dexmaker-mockito-inline-2.28.6.aar"> + <sha256 value="ff0c8c914510dce091238448236ad44e4dae803ab7c4da9a520df4bee3cce429" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.mikepenz" name="multiplatform-markdown-renderer" version="0.38.1"> + <artifact name="multiplatform-markdown-renderer-metadata-0.38.1.jar"> + <sha256 value="48f4bb2a3d41dda16be0c1f1d2336c3cf17b886e267964459a6f85d55b91ddb5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.mikepenz" name="multiplatform-markdown-renderer-android" version="0.38.1"> + <artifact name="multiplatform-markdown-renderer-release.aar"> + <sha256 value="fbaa99e6a751691868b0632786af0a94124d8c572366929f75dc3061bf62b1fe" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.mikepenz" name="multiplatform-markdown-renderer-coil3" version="0.38.1"> + <artifact name="multiplatform-markdown-renderer-coil3-metadata-0.38.1.jar"> + <sha256 value="08d66f7e0bdc8ae00073d6b04e049a4588351287448512e44f84cdc134cc133f" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.mikepenz" name="multiplatform-markdown-renderer-coil3-android" version="0.38.1"> + <artifact name="multiplatform-markdown-renderer-coil3-release.aar"> + <sha256 value="2ad5d8ea0e815ec88abf9b11d0c100bae8580d8de30b9a65ae65cf7a4bc248c1" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.mikepenz" name="multiplatform-markdown-renderer-coil3-jvm" version="0.38.1"> + <artifact name="multiplatform-markdown-renderer-coil3-jvm-0.38.1.jar"> + <sha256 value="e9a3c43e995b7aaf25c84acaf2a4294d9e2610c36b4a98db7ce36496ccbe757d" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.mikepenz" name="multiplatform-markdown-renderer-jvm" version="0.38.1"> + <artifact name="multiplatform-markdown-renderer-jvm-0.38.1.jar"> + <sha256 value="47caa1c2982c0fba2738ac1ba540a5c9ec42f6e885fd3d9b13a8365ce528e044" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.mikepenz" name="multiplatform-markdown-renderer-m3" version="0.38.1"> + <artifact name="multiplatform-markdown-renderer-m3-metadata-0.38.1.jar"> + <sha256 value="34f01443ef68c1128e81979b0849213e01ddc1be63299bcb7f3638c4a23409ea" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.mikepenz" name="multiplatform-markdown-renderer-m3-android" version="0.38.1"> + <artifact name="multiplatform-markdown-renderer-m3-release.aar"> + <sha256 value="910e9a3518fc3ad69a676eee87c4bb80d63e75c18f53cec79e77a55decd9e254" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.mikepenz" name="multiplatform-markdown-renderer-m3-jvm" version="0.38.1"> + <artifact name="multiplatform-markdown-renderer-m3-jvm-0.38.1.jar"> + <sha256 value="19825ef2c00cf9057e5d241328362dfe6bc509fd0404f74b0ba6d726169e0a06" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.networknt" name="json-schema-validator" version="1.5.4"> + <artifact name="json-schema-validator-1.5.4.jar"> + <sha256 value="fbbf8940c1a4c210dd58d1b7250420b32fa164bdbf31c3b077641327bd37faf6" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.nimbusds" name="nimbus-jose-jwt" version="9.37.3"> + <artifact name="nimbus-jose-jwt-9.37.3.jar"> + <sha256 value="12ae4a3a260095d7aeba2adea7ae396e8b9570db8b7b409e09a824c219cc0444" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="com.pinterest.ktlint" name="ktlint-cli" version="1.7.1"> + <artifact name="ktlint-cli-1.7.1.jar"> + <sha256 value="0fdc292998b27ec8d2fba70d45a07dac8177af7e7c7615e76be79b1762c66d20" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.pinterest.ktlint" name="ktlint-cli-reporter-baseline" version="1.7.1"> + <artifact name="ktlint-cli-reporter-baseline-1.7.1.jar"> + <sha256 value="40d77e03af8c55e9d403995ad978ee15122d80b7a625f350cd6957fe9eab6d9b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.pinterest.ktlint" name="ktlint-cli-reporter-checkstyle" version="1.7.1"> + <artifact name="ktlint-cli-reporter-checkstyle-1.7.1.jar"> + <sha256 value="666e7290a40de7723177b2ce5fd5f55f56ae2392bb9aaa21aa10322227fa790b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.pinterest.ktlint" name="ktlint-cli-reporter-core" version="1.7.1"> + <artifact name="ktlint-cli-reporter-core-1.7.1.jar"> + <sha256 value="9a124608f6e6891f1af1852299ba4f206fde99202edd98ec94a11e987fbd45a4" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.pinterest.ktlint" name="ktlint-cli-reporter-format" version="1.7.1"> + <artifact name="ktlint-cli-reporter-format-1.7.1.jar"> + <sha256 value="c5f3cf682064dd3081b84518d2a3c6b2914bf182931ec058491aff8e69b9cf00" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.pinterest.ktlint" name="ktlint-cli-reporter-html" version="1.7.1"> + <artifact name="ktlint-cli-reporter-html-1.7.1.jar"> + <sha256 value="45d05c849fe8b733cd9b3e1b76cf237027eaa1636ecc478b9a1469be5bca88f6" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.pinterest.ktlint" name="ktlint-cli-reporter-json" version="1.7.1"> + <artifact name="ktlint-cli-reporter-json-1.7.1.jar"> + <sha256 value="bd5e71b579cf926c4508072e8f997aa772c820846d2642180e664b2544f29d9a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.pinterest.ktlint" name="ktlint-cli-reporter-plain" version="1.7.1"> + <artifact name="ktlint-cli-reporter-plain-1.7.1.jar"> + <sha256 value="c82b496ab9a5ebd59f61d45bb94f36fdac58f3c63dce529eca52d5a5eb13bc70" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.pinterest.ktlint" name="ktlint-cli-reporter-plain-summary" version="1.7.1"> + <artifact name="ktlint-cli-reporter-plain-summary-1.7.1.jar"> + <sha256 value="71fb8e7fee532a49142b5bc8f3ada4ae463501d8a41c1e6ebe301106c47360e4" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.pinterest.ktlint" name="ktlint-cli-reporter-sarif" version="1.7.1"> + <artifact name="ktlint-cli-reporter-sarif-1.7.1.jar"> + <sha256 value="15293506cf81667340aaa5a832cfdd9920aee704c0d53d8ae539a003a2724580" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.pinterest.ktlint" name="ktlint-cli-ruleset-core" version="1.7.1"> + <artifact name="ktlint-cli-ruleset-core-1.7.1.jar"> + <sha256 value="6921353cdd5ba475d80a739dabc7111be0356c263bd62533388cad2e191a2f1f" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.pinterest.ktlint" name="ktlint-logger" version="1.7.1"> + <artifact name="ktlint-logger-1.7.1.jar"> + <sha256 value="9d018334caa5b4e312bc2ac107f1d77ed448853b2dec4e7c15dfc450eab985a3" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.pinterest.ktlint" name="ktlint-rule-engine" version="1.7.1"> + <artifact name="ktlint-rule-engine-1.7.1.jar"> + <sha256 value="26b4362b9e3ac5f67cac5b31711fbbe6cf383f4e50d2e907ad8decf90490593f" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.pinterest.ktlint" name="ktlint-rule-engine-core" version="1.7.1"> + <artifact name="ktlint-rule-engine-core-1.7.1.jar"> + <sha256 value="ed2643db7d8c6e7b45263fc404d4a9b05ae19db4c9f601e33f46143ce5eabfa0" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.pinterest.ktlint" name="ktlint-ruleset-standard" version="1.7.1"> + <artifact name="ktlint-ruleset-standard-1.7.1.jar"> + <sha256 value="6609686bacde24d693b3c2136c151297f03f857aeb52feb8afdc1e1dad2778f1" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.scottyab" name="rootbeer-lib" version="0.1.2"> + <artifact name="rootbeer-lib-0.1.2.aar"> + <sha256 value="0980126fccc8343448d2989a49fc3a54357d43f7453b9182be30f4141c9f10c0" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.squareup" name="javapoet" version="1.13.0"> + <artifact name="javapoet-1.13.0.jar"> + <sha256 value="4c7517e848a71b36d069d12bb3bf46a70fd4cda3105d822b0ed2e19c00b69291" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.squareup" name="javawriter" version="2.1.1"> + <artifact name="javawriter-2.1.1.jar"> + <sha256 value="f699823d0081f69cbb676c1845ea222e0ada79bc88a53e5d22d8bd02d328f57e" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="com.squareup" name="javawriter" version="2.5.0"> + <artifact name="javawriter-2.5.0.jar"> + <sha256 value="fcfb09fb0ea0aa97d3cfe7ea792398081348e468f126b3603cb3803f240197f0" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="com.squareup" name="kotlinpoet" version="1.11.0"> + <artifact name="kotlinpoet-1.11.0.jar"> + <sha256 value="2887ada1ca03dd83baa2758640d87e840d1907564db0ef88d2289c868a980492" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.squareup.okhttp3" name="mockwebserver" version="4.12.0"> + <artifact name="mockwebserver-4.12.0.jar"> + <sha256 value="6784673687f4ac8f21679b9d4bc7cdb46e1a1ce1be9d3133b36bede59a741561" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.squareup.okhttp3" name="mockwebserver" version="5.3.2"> + <artifact name="mockwebserver-5.3.2.jar"> + <sha256 value="6164a5783acb87278f42ef0581d2de222bd6bcc00a2e833611b2eddf0c7b8669" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.squareup.okhttp3" name="mockwebserver3" version="5.3.2"> + <artifact name="mockwebserver3-5.3.2.jar"> + <sha256 value="53a6e024ecc2b3f45d04d085161c6c10526a344b80bf3f0d4e6a13c33c183998" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.squareup.okhttp3" name="okhttp" version="4.12.0"> + <artifact name="okhttp-4.12.0.jar"> + <sha256 value="b1050081b14bb7a3a7e55a4d3ef01b5dcfabc453b4573a4fc019767191d5f4e0" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.squareup.okhttp3" name="okhttp" version="5.3.2"> + <artifact name="okhttp-metadata-5.3.2.jar"> + <sha256 value="e720a383fdc3eb1df4aac77a085e61b7730837364151de867093fdbcafcb44aa" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.squareup.okhttp3" name="okhttp-android" version="5.3.2"> + <artifact name="okhttp-release.aar"> + <sha256 value="f1a78812ebeef4d45eee0dbeb4f27347210f564d2b8ee411f012ce8573b0a658" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.squareup.okio" name="okio" version="3.15.0"> + <artifact name="okio-metadata-3.15.0.jar"> + <sha256 value="0ed4125e048c86af7ece446d654f2ba8bcc5e74d0ae1f4de3c5dc0ad9a975e2d" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.squareup.okio" name="okio" version="3.16.4"> + <artifact name="okio-metadata-3.16.4.jar"> + <sha256 value="c9964f394c4cd32b79bf338afbfa2f2297221eee08311787061cea55f87dd60e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.squareup.okio" name="okio-jvm" version="3.15.0"> + <artifact name="okio-jvm-3.15.0.jar"> + <sha256 value="483dc383b1049d220892322a0d6a4308425f09bb05b48c43d4eaa9ff82b1cd16" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.squareup.okio" name="okio-jvm" version="3.16.4"> + <artifact name="okio-jvm-3.16.4.jar"> + <sha256 value="2196b993cd34dbbd919e7e01f57a4781b58bee80f86106163e287c20343a96a7" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.squareup.rx.idler" name="rx2-idler" version="0.11.0"> + <artifact name="rx2-idler-0.11.0.aar"> + <sha256 value="079dcaad90fb3da22be1545f406665e02dcd6bbaa2dfaadd04808e95e1552e3c" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="com.sun.istack" name="istack-commons-runtime" version="3.0.8"> + <artifact name="istack-commons-runtime-3.0.8.jar"> + <sha256 value="4ffabb06be454a05e4398e20c77fa2b6308d4b88dfbef7ca30a76b5b7d5505ef" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="com.sun.xml.fastinfoset" name="FastInfoset" version="1.2.16"> + <artifact name="FastInfoset-1.2.16.jar"> + <sha256 value="056f3a1e144409f21ed16afc26805f58e9a21f3fce1543c42d400719d250c511" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="commons-codec" name="commons-codec" version="1.17.1"> + <artifact name="commons-codec-1.17.1.jar"> + <sha256 value="f9f6cb103f2ddc3c99a9d80ada2ae7bf0685111fd6bffccb72033d1da4e6ff23" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="commons-codec" name="commons-codec" version="1.19.0"> + <artifact name="commons-codec-1.19.0.jar"> + <sha256 value="5c3881e4f556855e9c532927ee0c9dfde94cc66760d5805c031a59887070af5f" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="commons-io" name="commons-io" version="2.16.1"> + <artifact name="commons-io-2.16.1.jar"> + <sha256 value="f41f7baacd716896447ace9758621f62c1c6b0a91d89acee488da26fc477c84f" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="commons-io" name="commons-io" version="2.20.0"> + <artifact name="commons-io-2.20.0.jar"> + <sha256 value="df90bba0fe3cb586b7f164e78fe8f8f4da3f2dd5c27fa645f888100ccc25dd72" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="commons-io" name="commons-io" version="2.6"> + <artifact name="commons-io-2.6.jar"> + <sha256 value="f877d304660ac2a142f3865badfc971dec7ed73c747c7f8d5d2f5139ca736513" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="commons-logging" name="commons-logging" version="1.2"> + <artifact name="commons-logging-1.2.jar"> + <sha256 value="daddea1ea0be0f56978ab3006b8ac92834afeefbd9b7e4e6316fca57df0fa636" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="dev.drewhamilton.poko" name="poko-annotations-jvm" version="0.19.1"> + <artifact name="poko-annotations-jvm-0.19.1.jar"> + <sha256 value="71d8a83b3d5834b8e726a381ee6fda2d119d8f67ea83dd5bb36e59d6449d2599" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="dk.brics.automaton" name="automaton" version="1.11-8"> + <artifact name="automaton-1.11-8.jar"> + <sha256 value="a24475f6ccfe1cc7a4fe9e34e05ce687b0ce0c6e8cb781e0eced3b186482c61e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.coil-kt.coil3" name="coil" version="3.3.0"> + <artifact name="coil-metadata-3.3.0.jar"> + <sha256 value="2ad25d8c042d911747a486085886e14371834cf2afcf0287a423d795c91a6250" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.coil-kt.coil3" name="coil-android" version="3.3.0"> + <artifact name="coil-release.aar"> + <sha256 value="1acd5a6598c51c46659296fbed7ab2615fc9e6f54fa37ca7b31a08d226296c13" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.coil-kt.coil3" name="coil-compose" version="3.3.0"> + <artifact name="coil-compose-metadata-3.3.0.jar"> + <sha256 value="4111872d0faa8827ff46a3d213154c07c7e2e15589e25a1b55914fb4c73e0c2b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.coil-kt.coil3" name="coil-compose-android" version="3.3.0"> + <artifact name="coil-compose-release.aar"> + <sha256 value="487beefb453c6d4057652819f3366424ba9cd95075acc146a78f3781c7dc6a31" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.coil-kt.coil3" name="coil-compose-core" version="3.3.0"> + <artifact name="coil-compose-core-metadata-3.3.0.jar"> + <sha256 value="143fd3c66a8d14bb9f5677c6a4632a7ea5aa48795f7e34c169cf6b92ad1a9a25" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.coil-kt.coil3" name="coil-compose-core-android" version="3.3.0"> + <artifact name="coil-compose-core-release.aar"> + <sha256 value="e2090a3e00e7278cc6245f9bf2a5613af392f0e30fc8b4477d2f594da5fded3e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.coil-kt.coil3" name="coil-compose-core-jvm" version="3.3.0"> + <artifact name="coil-compose-core-jvm-3.3.0.jar"> + <sha256 value="d981c08fdaa4fbca975499299423f950058666b411eae2e03c79151483dcc61e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.coil-kt.coil3" name="coil-compose-jvm" version="3.3.0"> + <artifact name="coil-compose-jvm-3.3.0.jar"> + <sha256 value="fe2c3f7bd6d6e45ab2582bd23ef3a21328d4f8af26d1e73cedeedc1f55af908a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.coil-kt.coil3" name="coil-core" version="3.3.0"> + <artifact name="coil-core-metadata-3.3.0.jar"> + <sha256 value="b1474de0af6c32f015d342b3050eb083451cb082b73e80e75ab1e60d785ffc30" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.coil-kt.coil3" name="coil-core-android" version="3.3.0"> + <artifact name="coil-core-release.aar"> + <sha256 value="b57fcf001178db5ff84683e7d11818bcda6c115d9d530443d382b3a8b3f6806b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.coil-kt.coil3" name="coil-core-jvm" version="3.3.0"> + <artifact name="coil-core-jvm-3.3.0.jar"> + <sha256 value="454c825ef52a3cebcd4ec3473e6b53323ea2a346086abd58e1ba1f76511a48da" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.coil-kt.coil3" name="coil-jvm" version="3.3.0"> + <artifact name="coil-jvm-3.3.0.jar"> + <sha256 value="bca4623e4368dffdf7136d1236cfbb107055d157b3c4c6d890909765518ebcb4" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.coil-kt.coil3" name="coil-network-core" version="3.3.0"> + <artifact name="coil-network-core-metadata-3.3.0.jar"> + <sha256 value="dfb9f24545811e22c7eeb8bbc549aa65ef569ec90328ada85780c68dc0ad50cc" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.coil-kt.coil3" name="coil-network-core-android" version="3.3.0"> + <artifact name="coil-network-core-release.aar"> + <sha256 value="e9a59268071fd6c657f913caf5dc6e109f7b1591b2c079a2ee6686268c77d479" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.coil-kt.coil3" name="coil-network-core-jvm" version="3.3.0"> + <artifact name="coil-network-core-jvm-3.3.0.jar"> + <sha256 value="853e300503d49d7df2d1d8fa8daed19a282ef986f32ff9de17cf9e736e9c443e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.coil-kt.coil3" name="coil-network-okhttp" version="3.3.0"> + <artifact name="coil-network-okhttp-metadata-3.3.0.jar"> + <sha256 value="913d5d15fd71ce163e4c69855aa398fb290ee56d067946ad52aa557d808af8de" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.coil-kt.coil3" name="coil-network-okhttp-jvm" version="3.3.0"> + <artifact name="coil-network-okhttp-jvm-3.3.0.jar"> + <sha256 value="32750ffbf599612ab090e77d114a96a8e3034b1d9842c17effec662e5ca20def" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.github.detekt.sarif4k" name="sarif4k-jvm" version="0.6.0"> + <artifact name="sarif4k-jvm-0.6.0.jar"> + <sha256 value="b3ac96dd97acba8318dbe26f6a432d6c6db91c46c780805e8928b8103e5763dc" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.github.hakky54" name="ayza" version="10.0.2"> + <artifact name="ayza-10.0.2.jar"> + <sha256 value="9aa06304993aff5677dba769c677e578364f5793cbaf1569b2b5f39b71119a7b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.github.hakky54" name="sude" version="2.0.2"> + <artifact name="sude-2.0.2.jar"> + <sha256 value="f88e3d031dbbd2fea1b98481df0646a25b8d63d92796d6f30f907d5187595b39" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.github.java-diff-utils" name="java-diff-utils" version="4.12"> + <artifact name="java-diff-utils-4.12.jar"> + <sha256 value="9990a2039778f6b4cc94790141c2868864eacee0620c6c459451121a901cd5b5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.github.oshai" name="kotlin-logging-jvm" version="7.0.7"> + <artifact name="kotlin-logging-jvm-7.0.7.jar"> + <sha256 value="c373f7f4c9efc85c4f70f11519f2a1b7878bc0ed75a325364d034af3fa21f776" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.grpc" name="grpc-api" version="1.57.2"> + <artifact name="grpc-api-1.57.2.jar"> + <sha256 value="42b72e6572c084055ac3ce03e6efe433eb05ef620b3daf5136a4359fc72cc3e1" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.grpc" name="grpc-api" version="1.69.1"> + <artifact name="grpc-api-1.69.1.jar"> + <sha256 value="a8d3d6dcc71f3ab613d668842282b488bdd93d3e99a0ef5dca7eee6fa734c283" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.grpc" name="grpc-context" version="1.57.2"> + <artifact name="grpc-context-1.57.2.jar"> + <sha256 value="9b8ac88d9cef2819daffed7bdbd2f22680237d482c6c671fe02d36da3f08cf00" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.grpc" name="grpc-context" version="1.69.1"> + <artifact name="grpc-context-1.69.1.jar"> + <sha256 value="45ef95b8c158a8b5bdd3acb67b9e682ef25414bb148f488ec847438ab64715d4" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.grpc" name="grpc-core" version="1.57.2"> + <artifact name="grpc-core-1.57.2.jar"> + <sha256 value="5a10070abfeb4966ec4d580961dcc4e7f69fa83ab25242f92c1765efb07b8606" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.grpc" name="grpc-core" version="1.69.1"> + <artifact name="grpc-core-1.69.1.jar"> + <sha256 value="51352cadaecbf9a4a4aa42d93f6f1fc728f1fd01b051680383ed09e5631ffbd0" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.grpc" name="grpc-inprocess" version="1.69.1"> + <artifact name="grpc-inprocess-1.69.1.jar"> + <sha256 value="b7c6ac0e3abf4b8d582610d632d79417bc3da81254e1a4bcf7f01e8db7bd55ef" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.grpc" name="grpc-netty" version="1.57.2"> + <artifact name="grpc-netty-1.57.2.jar"> + <sha256 value="9809d4c10c94d11e7b2946cdeb5b2884be20a09510289544f37569f02c877a21" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.grpc" name="grpc-netty" version="1.69.1"> + <artifact name="grpc-netty-1.69.1.jar"> + <sha256 value="52a86ed66f78933e83d1a3fb7162ad1667489564c4556366b7a3579c7024a447" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.grpc" name="grpc-protobuf" version="1.57.2"> + <artifact name="grpc-protobuf-1.57.2.jar"> + <sha256 value="31630d8a9e9f08a959862015e30a4863908be3680c3a686f4c1f08d2ffeaf706" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.grpc" name="grpc-protobuf" version="1.69.1"> + <artifact name="grpc-protobuf-1.69.1.jar"> + <sha256 value="4c52ef948fb8987a3baa7d46ba362b7bf307dd3c51f29241cd5c598398a010df" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.grpc" name="grpc-protobuf-lite" version="1.57.2"> + <artifact name="grpc-protobuf-lite-1.57.2.jar"> + <sha256 value="fc4917dc5d419ac810fb3f27523c14e75e1fe50372154fab29324215ee6a955a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.grpc" name="grpc-protobuf-lite" version="1.69.1"> + <artifact name="grpc-protobuf-lite-1.69.1.jar"> + <sha256 value="c29f90fadf3c7620f9359a243c067dd85b73bd765b28f3d95df910ac2d331555" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.grpc" name="grpc-services" version="1.57.2"> + <artifact name="grpc-services-1.57.2.jar"> + <sha256 value="057a43ba647833756ab2f851bac80a3b9f8dce026fc1ac1f17d4f315648f4172" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.grpc" name="grpc-stub" version="1.57.2"> + <artifact name="grpc-stub-1.57.2.jar"> + <sha256 value="84d2af12719168f76375f2afdfd6eb5133a865edba9244d40e6b968e3adde1d3" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.grpc" name="grpc-stub" version="1.69.1"> + <artifact name="grpc-stub-1.69.1.jar"> + <sha256 value="e39c63273d53052ebe9f638d8ae98176735ec567328d9a17092cddb6f239b8c2" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.grpc" name="grpc-util" version="1.69.1"> + <artifact name="grpc-util-1.69.1.jar"> + <sha256 value="dd597bd675eaa042f3e3578648d9050c813c4595c5de6869ef9ddbb449006031" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.insert-koin" name="koin-android" version="4.1.1"> + <artifact name="koin-android-4.1.1.aar"> + <sha256 value="7c757df91199d105444509d8aff9cc9e048e64c3eead3205e8530d562534a33d" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.insert-koin" name="koin-androidx-compose" version="4.1.1"> + <artifact name="koin-androidx-compose-4.1.1.aar"> + <sha256 value="e2e86f3d8c09a5b6927c8f76c3443f3698cf35cb9e010b4db9c1ebe218296aad" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.insert-koin" name="koin-androidx-workmanager" version="4.1.1"> + <artifact name="koin-androidx-workmanager-4.1.1.aar"> + <sha256 value="99100f5880539c1eab23a7a8518d150c4ba644ab0098a3a000f3927f36624f50" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.insert-koin" name="koin-annotations-jvm" version="1.3.1"> + <artifact name="koin-annotations-jvm-1.3.1.jar"> + <sha256 value="d42fb142240a393d337f3c87d1f616fe6aebce5fe9341941bbb2dd6062f53063" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.insert-koin" name="koin-compose" version="4.1.1"> + <artifact name="koin-compose-metadata-4.1.1.jar"> + <sha256 value="42e4adbfe9a3a9d8116706b2b594ec16b12cb28ff890b7241002499379c3644f" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.insert-koin" name="koin-compose-android" version="4.1.1"> + <artifact name="koin-compose-release.aar"> + <sha256 value="97f370101070aecaf346e077e73c8d252ecaebde9bd816c2688ae92f7ee2884c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.insert-koin" name="koin-compose-jvm" version="4.1.1"> + <artifact name="koin-compose-jvm-4.1.1.jar"> + <sha256 value="0163801509f51abe5d98ef19f3098caf2b59fcf6f4ea24bf3c3f89b0f26c207b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.insert-koin" name="koin-compose-viewmodel" version="4.1.1"> + <artifact name="koin-compose-viewmodel-metadata-4.1.1.jar"> + <sha256 value="53ff696fa67249759910c8c33e3cbf615b4887ed9a29e2d09577d31b3badb5a9" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.insert-koin" name="koin-compose-viewmodel-android" version="4.1.1"> + <artifact name="koin-compose-viewmodel-release.aar"> + <sha256 value="f5a2108572fce0f5421aee0d0faae8e5b244c10f91d3d3b3b665700e5e6cde8b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.insert-koin" name="koin-compose-viewmodel-jvm" version="4.1.1"> + <artifact name="koin-compose-viewmodel-jvm-4.1.1.jar"> + <sha256 value="7624ecef2361256258cc774add26263696d43d444a5a9e171603794c57ce5daa" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.insert-koin" name="koin-core" version="4.1.1"> + <artifact name="koin-core-metadata-4.1.1.jar"> + <sha256 value="df195ed534729ef41a30e10321ebb777fb59dd71fb833b0a6269b7e60e7e5f75" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.insert-koin" name="koin-core-annotations" version="4.1.1"> + <artifact name="koin-core-annotations-metadata-4.1.1.jar"> + <sha256 value="18b33c34509e0c62aca55ac51d0c410b09f4193c3397041f1883d39c1177e858" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.insert-koin" name="koin-core-annotations-jvm" version="4.1.1"> + <artifact name="koin-core-annotations-jvm-4.1.1.jar"> + <sha256 value="b1e47a6320dce1749fde8429887f19d12a452bee749a5c0590ab528b32063be2" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.insert-koin" name="koin-core-jvm" version="4.1.1"> + <artifact name="koin-core-jvm-4.1.1.jar"> + <sha256 value="90a8e98c0de5351325804db39a2154ab283503a6d92981609da3dcc16b0d15ca" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.insert-koin" name="koin-core-viewmodel" version="4.1.1"> + <artifact name="koin-core-viewmodel-metadata-4.1.1.jar"> + <sha256 value="a9a4c9330288bf92efa0e4d50c3f6015ebc51643f8bac036ab8f7d816f850ff5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.insert-koin" name="koin-core-viewmodel-android" version="4.1.1"> + <artifact name="koin-core-viewmodel-release.aar"> + <sha256 value="5006ac0d3ba21ff4efdc3077d4706a0882155b4c0bd2155fd01993dae27a93a2" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.insert-koin" name="koin-core-viewmodel-jvm" version="4.1.1"> + <artifact name="koin-core-viewmodel-jvm-4.1.1.jar"> + <sha256 value="8bc91b2dac230c658a3516d631e5247ea04ff6b5b82798cbddcd859f1321f3af" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.insert-koin" name="koin-test" version="4.1.1"> + <artifact name="koin-test-metadata-4.1.1.jar"> + <sha256 value="bab1e49147440f87ac4d1e0865f4810ba7022c92bb2e74a5b5ec89ebdc61e4f7" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.insert-koin" name="koin-test-junit4" version="4.1.1"> + <artifact name="koin-test-junit4-4.1.1.jar"> + <sha256 value="382daa1c5d82c07ebba95b116d032fef2f5192cbf69fe2b3fa96efe997f99d38" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.insert-koin" name="koin-test-junit5" version="4.1.1"> + <artifact name="koin-test-junit5-4.1.1.jar"> + <sha256 value="d7869768ce595e60ee29d300f5fcd38241f605e4dba59d78fe1e88e71b362c74" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.insert-koin" name="koin-test-jvm" version="4.1.1"> + <artifact name="koin-test-jvm-4.1.1.jar"> + <sha256 value="02e1c9fc1cb7c07590dfb87c3ed4532573ad9ba3f00524250250fce38b199280" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-client-content-negotiation" version="3.4.0"> + <artifact name="ktor-client-content-negotiation-metadata-3.4.0.jar"> + <sha256 value="a0af80bfe1e8ae0ca2babf7cc37920f2f5673f4d6885c06b86b28a58d72470dc" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-client-content-negotiation-jvm" version="3.4.0"> + <artifact name="ktor-client-content-negotiation-jvm-3.4.0.jar"> + <sha256 value="077adbf36b75afcf9a30c767cdc564c344a2ce721cc985bb8f6a1bdf4738a831" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-client-core" version="3.4.0"> + <artifact name="ktor-client-core-metadata-3.4.0.jar"> + <sha256 value="ef5f21750cb2547df2dee98f83682d372259f6c30e3be4f447f67bc2d8f41b9d" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-client-core-jvm" version="3.4.0"> + <artifact name="ktor-client-core-jvm-3.4.0.jar"> + <sha256 value="9c1106853d820ff28154e12be10124fa3727ff7bf4c7b79535b6307cd8d7f7bd" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-client-mock" version="3.4.0"> + <artifact name="ktor-client-mock-metadata-3.4.0.jar"> + <sha256 value="561dc639cb0d72ffa67ef25122ec81dd9cce8ddc60aeef6ea8058143badf81f8" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-client-mock-jvm" version="3.4.0"> + <artifact name="ktor-client-mock-jvm-3.4.0.jar"> + <sha256 value="7b88aa2f0e1b576c0a86322f3cd8adb86433d523397529c955750c88f079cce4" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-client-okhttp" version="3.4.0"> + <artifact name="ktor-client-okhttp-metadata-3.4.0.jar"> + <sha256 value="089e24417bf9f6c34eec5720eebb2cbcc82ea2855ecef90133eb17e1079d5868" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-client-okhttp-jvm" version="3.4.0"> + <artifact name="ktor-client-okhttp-jvm-3.4.0.jar"> + <sha256 value="172f1af30dce96d642214029683c0636acb0a88952500491d9422185fcb81005" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-events" version="3.4.0"> + <artifact name="ktor-events-metadata-3.4.0.jar"> + <sha256 value="0171fc63e23ecf8ecbb14727e36a218ed090d7702621a4066630e645afc32a70" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-events-jvm" version="3.4.0"> + <artifact name="ktor-events-jvm-3.4.0.jar"> + <sha256 value="d0d5a6c98d5c830783425170c92a13d3925904e8c8ac5086535e952253cb8f4e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-http" version="3.4.0"> + <artifact name="ktor-http-metadata-3.4.0.jar"> + <sha256 value="7442c707908f82ce25664cfa077098c7a97ea9eb936cc2a2be14fa929d1789e1" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-http-cio" version="3.4.0"> + <artifact name="ktor-http-cio-metadata-3.4.0.jar"> + <sha256 value="4693341f4229ecfb9911e4cc4b12d1d82298f868f9b6b0b9f5375f50b0c20015" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-http-cio-jvm" version="3.4.0"> + <artifact name="ktor-http-cio-jvm-3.4.0.jar"> + <sha256 value="b50412077d8e6db16ef0f48f3156a87669210ac7e2481cce84f75362bca66c0f" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-http-jvm" version="3.4.0"> + <artifact name="ktor-http-jvm-3.4.0.jar"> + <sha256 value="b38d22888453819236dbb27fc09587e749aa2d46fdfe879e42dbfd9a138d4484" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-io" version="3.4.0"> + <artifact name="ktor-io-metadata-3.4.0.jar"> + <sha256 value="426aad27eef6d456a7f517cbdf52d1134a6b52e2027caa5ab6cd71107a2b347e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-io-jvm" version="3.4.0"> + <artifact name="ktor-io-jvm-3.4.0.jar"> + <sha256 value="c6a3aa8bc6bf52aa40f6d0c2ea22d4c30546636ded618322dd961dffeab97e6f" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-network-jvm" version="3.4.0"> + <artifact name="ktor-network-jvm-3.4.0.jar"> + <sha256 value="40099ca4c7504a9cf7ea852404b9565d7952506842839e341eb020ee8bb7f290" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-serialization" version="3.4.0"> + <artifact name="ktor-serialization-metadata-3.4.0.jar"> + <sha256 value="b606352ba7e22ab99b4598c7dd41ab93ae0ff1886f0f8ffddd99a7981b32540d" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-serialization-jvm" version="3.4.0"> + <artifact name="ktor-serialization-jvm-3.4.0.jar"> + <sha256 value="8edd0a7b23486cf202f224de7c9cf8b132bb99a8268c360680efb000e38807f2" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-serialization-kotlinx" version="3.4.0"> + <artifact name="ktor-serialization-kotlinx-metadata-3.4.0.jar"> + <sha256 value="6c7391e36fc7ce6caf489563323314f5326fe29155fae9039a862140ab21013e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-serialization-kotlinx-json" version="3.4.0"> + <artifact name="ktor-serialization-kotlinx-json-metadata-3.4.0.jar"> + <sha256 value="cb5122f17df0a8bf2a0f1ab9e5adbcbc7c786f180eee9d3cf4153145d8cf03bc" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-serialization-kotlinx-json-jvm" version="3.4.0"> + <artifact name="ktor-serialization-kotlinx-json-jvm-3.4.0.jar"> + <sha256 value="a748d3112c0bcca9946c1ae64ca683ff99768af09f9dae2e52e603db56b1685c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-serialization-kotlinx-jvm" version="3.4.0"> + <artifact name="ktor-serialization-kotlinx-jvm-3.4.0.jar"> + <sha256 value="b1f8213eaada1621c06ea58a035cf50183bd32556fd76c3abbe5b8146bf8e600" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-sse" version="3.4.0"> + <artifact name="ktor-sse-metadata-3.4.0.jar"> + <sha256 value="0b2266c07e210e17eb240b2db563e7be9a9c9c2f7a58574eaaa6593a0b655fed" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-sse-jvm" version="3.4.0"> + <artifact name="ktor-sse-jvm-3.4.0.jar"> + <sha256 value="6a21c6bd61cdc97b589321c339566577869b99d1aaaf09e0c6be4bce33b36a3a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-utils" version="3.4.0"> + <artifact name="ktor-utils-metadata-3.4.0.jar"> + <sha256 value="5f5e695c8176bd6ec52996323f9faccee52c57d4701eb55541300ea2932bfdcb" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-utils-jvm" version="3.4.0"> + <artifact name="ktor-utils-jvm-3.4.0.jar"> + <sha256 value="6da64c8dad2a470c56129b8143faf0b889923807f862a7f278f5ffb4f7b375c6" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-websocket-serialization" version="3.4.0"> + <artifact name="ktor-websocket-serialization-metadata-3.4.0.jar"> + <sha256 value="3d152ce024cc26316e2445371cf84fafe26210241cd77bc5e7c843d7bfe7d33f" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-websocket-serialization-jvm" version="3.4.0"> + <artifact name="ktor-websocket-serialization-jvm-3.4.0.jar"> + <sha256 value="b4e18cd836f76d8f1576985fef6fb225d4f255880de869d49712d930103ff806" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-websockets" version="3.4.0"> + <artifact name="ktor-websockets-metadata-3.4.0.jar"> + <sha256 value="b7a04ca1415ea73036ecd0980a7ef8a1987255230cb8245606ee6f56e2ab4eb1" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.ktor" name="ktor-websockets-jvm" version="3.4.0"> + <artifact name="ktor-websockets-jvm-3.4.0.jar"> + <sha256 value="485164591c34d2a24ba2354f3dea12346e2aa5d2f473571e13aa514f2fd5eb30" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-buffer" version="4.1.110.Final"> + <artifact name="netty-buffer-4.1.110.Final.jar"> + <sha256 value="46d74e79125aacc055c31f18152fdc5d4a569aa8d60091203d0baa833973ac3c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-buffer" version="4.1.93.Final"> + <artifact name="netty-buffer-4.1.93.Final.jar"> + <sha256 value="007c7d9c378df02d390567d0d7ddf542ffddb021b7313dbf502392113ffabb08" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-codec" version="4.1.110.Final"> + <artifact name="netty-codec-4.1.110.Final.jar"> + <sha256 value="9eccce9a8d827bb8ce84f9c3183fec58bd1c96a51010cf711297746034af3701" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-codec" version="4.1.93.Final"> + <artifact name="netty-codec-4.1.93.Final.jar"> + <sha256 value="990c378168dc6364c6ff569701f4f2f122fffe8998b3e189eba4c4d868ed1084" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-codec-http" version="4.1.110.Final"> + <artifact name="netty-codec-http-4.1.110.Final.jar"> + <sha256 value="dc0d6af5054630a70ff0ef354f20aa7a6e46738c9fc5636ed3d4fe77e38bd48d" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-codec-http" version="4.1.93.Final"> + <artifact name="netty-codec-http-4.1.93.Final.jar"> + <sha256 value="dacf78ce78ab2d29570325db4cd2451ea589639807de95881a0fa7155a9e6b55" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-codec-http2" version="4.1.110.Final"> + <artifact name="netty-codec-http2-4.1.110.Final.jar"> + <sha256 value="b546c75445a487bb7bcd5a94779caecce33582cf7be31b8b39fc0e65b1ee26fc" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-codec-http2" version="4.1.93.Final"> + <artifact name="netty-codec-http2-4.1.93.Final.jar"> + <sha256 value="d96cc09045a1341c6d47494352aa263b87b72fb1d2ea9eca161aa73820bfe8bb" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-codec-socks" version="4.1.110.Final"> + <artifact name="netty-codec-socks-4.1.110.Final.jar"> + <sha256 value="976052a3c9bb280bc6d99f3a29e6404677cf958c3de05b205093d38c006b880c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-codec-socks" version="4.1.93.Final"> + <artifact name="netty-codec-socks-4.1.93.Final.jar"> + <sha256 value="0ea47b5ba23ca1da8eb9146c8fc755c1271414633b1e2be2ce1df764ba0fff2a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-common" version="4.1.110.Final"> + <artifact name="netty-common-4.1.110.Final.jar"> + <sha256 value="9851ec66548b9e0d41164ce98943cdd4bbe305f68ddbd24eae52e4501a0d7b1a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-common" version="4.1.93.Final"> + <artifact name="netty-common-4.1.93.Final.jar"> + <sha256 value="443bb316599fb16e3baeba2fb58881814d7ff0b7af176fe76e38071a6e86f8c0" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-handler" version="4.1.110.Final"> + <artifact name="netty-handler-4.1.110.Final.jar"> + <sha256 value="d5a08d7de364912e4285968de4d4cce3f01da4bb048d5c6937e5f2af1f8e148a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-handler" version="4.1.93.Final"> + <artifact name="netty-handler-4.1.93.Final.jar"> + <sha256 value="4e5f563ae14ed713381816d582f5fcfd0615aefb29203486cdfb782d8a00a02b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-handler-proxy" version="4.1.110.Final"> + <artifact name="netty-handler-proxy-4.1.110.Final.jar"> + <sha256 value="ad54ab4fe9c47ef3e723d71251126db53e8db543871adb9eafc94446539eff52" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-handler-proxy" version="4.1.93.Final"> + <artifact name="netty-handler-proxy-4.1.93.Final.jar"> + <sha256 value="2ac5f7fbefa0b73ef783889069344d5515505a14b2303be693c5002c486df2b4" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-resolver" version="4.1.110.Final"> + <artifact name="netty-resolver-4.1.110.Final.jar"> + <sha256 value="a2e9b4ae7caa92fc5bd747e11d1dec20d81b18fc00959554302244ac5c56ce70" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-resolver" version="4.1.93.Final"> + <artifact name="netty-resolver-4.1.93.Final.jar"> + <sha256 value="e59770b66e81822e5d111ac4e544d7eb0c543e0a285f52628e53941acd8ed759" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-transport" version="4.1.110.Final"> + <artifact name="netty-transport-4.1.110.Final.jar"> + <sha256 value="a42dd68390ca14b4ff2d40628a096c76485b4adb7c19602d5289321a0669e704" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-transport" version="4.1.93.Final"> + <artifact name="netty-transport-4.1.93.Final.jar"> + <sha256 value="a5a78019bc1cd43dbc3c7b7cdd3801912ca26d1f498fb560514fee497864ba96" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-transport-native-unix-common" version="4.1.110.Final"> + <artifact name="netty-transport-native-unix-common-4.1.110.Final.jar"> + <sha256 value="51717bb7471141950390c6713a449fdb1054d07e60737ee7dda7083796cdee48" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.netty" name="netty-transport-native-unix-common" version="4.1.93.Final"> + <artifact name="netty-transport-native-unix-common-4.1.93.Final.jar"> + <sha256 value="774165a1c4dbaacb17f9c1ad666b3569a6a59715ae828e7c3d47703f479a53e7" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.opencensus" name="opencensus-api" version="0.31.0"> + <artifact name="opencensus-api-0.31.0.jar"> + <sha256 value="702ba55d78f39d55195dcf041fdfaab7a7490a9ac45013542487ed9e4d3a4d23" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.opencensus" name="opencensus-proto" version="0.2.0"> + <artifact name="opencensus-proto-0.2.0.jar"> + <sha256 value="0c192d451e9dd74e98721b27d02f0e2b6bca44b51563b5dabf2e211f7a3ebf13" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.perfmark" name="perfmark-api" version="0.26.0"> + <artifact name="perfmark-api-0.26.0.jar"> + <sha256 value="b7d23e93a34537ce332708269a0d1404788a5b5e1949e82f5535fce51b3ea95b" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="io.perfmark" name="perfmark-api" version="0.27.0"> + <artifact name="perfmark-api-0.27.0.jar"> + <sha256 value="c7b478503ec524e55df19b424d46d27c8a68aeb801664fadd4f069b71f52d0f6" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="io.reactivex.rxjava2" name="rxandroid" version="2.1.1"> + <artifact name="rxandroid-2.1.1.aar"> + <sha256 value="bf5150a95f0f6f18df92757e0a69acf69e7c87788b276b8c23f9697464d9ed81" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="io.reactivex.rxjava2" name="rxjava" version="2.2.21"> + <artifact name="rxjava-2.2.21.jar"> + <sha256 value="59df6541a840018f0f4c899aae4f4c1f4383f4c16feb5268615fbe384d28501c" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="io.sellmair" name="evas-compose-jvm" version="1.3.0"> + <artifact name="evas-compose-jvm-1.3.0.jar"> + <sha256 value="cf400d0da909645f86d7352bafc165977b9cc99d0ab0f866dca8f6d71f43ea80" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.sellmair" name="evas-jvm" version="1.3.0"> + <artifact name="evas-jvm-1.3.0.jar"> + <sha256 value="b63833a98f42414162b674df3c38bd1b700788726e61733dd4ccfd8006fdc3b4" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.sentry" name="sentry" version="7.0.0"> + <artifact name="sentry-7.0.0.jar"> + <sha256 value="73ed0be0450942b81015d9501fca7d6d3c3fbeab0aaf4021871eb653691d85bc" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.sentry" name="sentry" version="8.33.0"> + <artifact name="sentry-8.33.0.jar"> + <sha256 value="2699281b94fbdf8e109406f8f3a73fd6577d8d05c2c711eece8c76c0b04ce99a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.sentry" name="sentry-android" version="8.33.0"> + <artifact name="sentry-android-8.33.0.aar"> + <sha256 value="058229bfda961bb909896ebcd982cc6c539795e505bd4a4f31c22bf255c7207b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.sentry" name="sentry-android-core" version="8.33.0"> + <artifact name="sentry-android-core-8.33.0.aar"> + <sha256 value="e5d7f2434cc8a2915ea1a85ce4c2589ec709033759bb467e8a2fa6f7eef873e2" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.sentry" name="sentry-android-gradle-plugin" version="6.1.0"> + <artifact name="sentry-android-gradle-plugin-6.1.0.jar"> + <sha256 value="aa4eea5d8778f85281b355cfebf9bb01e2fc28054ce3725dfb8de189e091aa41" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.sentry" name="sentry-android-navigation" version="8.33.0"> + <artifact name="sentry-android-navigation-8.33.0.aar"> + <sha256 value="da0ef541d78f250061bba9ddd1e97f68efd641747d57cea3d98f4062a7d42c1a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.sentry" name="sentry-android-ndk" version="8.33.0"> + <artifact name="sentry-android-ndk-8.33.0.aar"> + <sha256 value="df56353312ba5be7140f35854175d248b6ad795b0684bbe119a4fd884c0ac46a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.sentry" name="sentry-android-replay" version="8.33.0"> + <artifact name="sentry-android-replay-8.33.0.aar"> + <sha256 value="714102a0b73a3340b97467b2156c0c28f026a946ea58cdc5a0a843e9e71057a7" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.sentry" name="sentry-compose-android" version="8.33.0"> + <artifact name="sentry-compose-release.aar"> + <sha256 value="6cc7af82b7798477f88902a2fafffa5f1f7a3ab2b4f91658c3476d056ec52c7c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="io.sentry" name="sentry-native-ndk" version="0.12.7"> + <artifact name="sentry-native-ndk-0.12.7.aar"> + <sha256 value="576375b2d5a6e758bc6ff4cf0be4966178f55cb512a5a0aa32be6cc3e71b0b06" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="jakarta.activation" name="jakarta.activation-api" version="1.2.1"> + <artifact name="jakarta.activation-api-1.2.1.jar"> + <sha256 value="8b0a0f52fa8b05c5431921a063ed866efaa41dadf2e3a7ee3e1961f2b0d9645b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="jakarta.inject" name="jakarta.inject-api" version="2.0.1"> + <artifact name="jakarta.inject-api-2.0.1.jar"> + <sha256 value="f7dc98062fccf14126abb751b64fab12c312566e8cbdc8483598bffcea93af7c" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="jakarta.xml.bind" name="jakarta.xml.bind-api" version="2.3.2"> + <artifact name="jakarta.xml.bind-api-2.3.2.jar"> + <sha256 value="69156304079bdeed9fc0ae3b39389f19b3cc4ba4443bc80508995394ead742ea" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="javax.annotation" name="javax.annotation-api" version="1.3.2"> + <artifact name="javax.annotation-api-1.3.2.jar"> + <sha256 value="e04ba5195bcd555dc95650f7cc614d151e4bcd52d29a10b8aa2197f3ab89ab9b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="javax.inject" name="javax.inject" version="1"> + <artifact name="javax.inject-1.jar"> + <sha256 value="91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="joda-time" name="joda-time" version="2.14.1"> + <artifact name="joda-time-2.14.1.jar"> + <sha256 value="656721d9456d5ec7e7bfcf02665202ea5a375ff22136b8f23473cf7eae8fa0c6" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="joda-time" name="joda-time" version="2.9.9"> + <artifact name="joda-time-2.9.9.jar"> + <sha256 value="b049a43c1057942e6acfbece008e4949b2e35d1658d0c8e06f4485397e2fa4e7" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="junit" name="junit" version="4.13.2"> + <artifact name="junit-4.13.2.jar"> + <sha256 value="8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="net.bytebuddy" name="byte-buddy" version="1.17.7"> + <artifact name="byte-buddy-1.17.7.jar"> + <sha256 value="3575dcb8a98faf943d3c1595c47a16047c4fce8a83ebbb26262f1a2f67546357" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="net.bytebuddy" name="byte-buddy-agent" version="1.17.7"> + <artifact name="byte-buddy-agent-1.17.7.jar"> + <sha256 value="a9ba887dca252ad61b7d5153294f34e6f3bdf4b2736b04373d13615a695fc0ff" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="net.java.dev.jna" name="jna" version="5.6.0"> + <artifact name="jna-5.6.0.jar"> + <sha256 value="5557e235a8aa2f9766d5dc609d67948f2a8832c2d796cea9ef1d6cbe0b3b7eaf" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="net.java.dev.jna" name="jna-platform" version="5.6.0"> + <artifact name="jna-platform-5.6.0.jar"> + <sha256 value="9ecea8bf2b1b39963939d18b70464eef60c508fed8820f9dcaba0c35518eabf7" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="net.lingala.zip4j" name="zip4j" version="2.11.5"> + <artifact name="zip4j-2.11.5.jar"> + <sha256 value="fee9a941f286166d4a19719d818f20e9f3addb3cbd7291c08b67f0e0ce75a9fd" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="net.ltgt.gradle.incap" name="incap" version="0.2"> + <artifact name="incap-0.2.jar"> + <sha256 value="b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="net.openid" name="appauth" version="0.11.1"> + <artifact name="appauth-0.11.1.aar"> + <sha256 value="d9ff43b14f7ee8e81bc802148190ad808beb5389953e6e6ffa53cd5575ea611e" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="net.sf.jopt-simple" name="jopt-simple" version="4.9"> + <artifact name="jopt-simple-4.9.jar"> + <sha256 value="26c5856e954b5f864db76f13b86919b59c6eecf9fd930b96baa8884626baf2f5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="net.sf.kxml" name="kxml2" version="2.3.0"> + <artifact name="kxml2-2.3.0.jar"> + <sha256 value="f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="net.swiftzer.semver" name="semver" version="1.1.1"> + <artifact name="semver-1.1.1.jar"> + <sha256 value="f028546d70326b93314a4f448cfd217b50b801ec20313cd46028a94604f46d66" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="net.zetetic" name="sqlcipher-android" version="4.9.0"> + <artifact name="sqlcipher-android-4.9.0.aar"> + <sha256 value="54654692913a00047c6536845d5085ebf3bc7d29a2f9f6e351e1675b7fd5c0cc" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="nl.littlerobots.rxlint" name="rxlint" version="1.7.8"> + <artifact name="rxlint-1.7.8.aar"> + <sha256 value="bf3e289502d3ff881aae9d0a2a7f5959dff533570367f5cb85a67a59da48aac0" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.antlr" name="antlr4-runtime" version="4.13.2"> + <artifact name="antlr4-runtime-4.13.2.jar"> + <sha256 value="dd3e8a13a2d669bf84fb8d834de35ce4875f27157698d206241ec8488aadcaf7" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.apache.commons" name="commons-collections4" version="4.4"> + <artifact name="commons-collections4-4.4.jar"> + <sha256 value="1df8b9430b5c8ed143d7815e403e33ef5371b2400aadbe9bda0883762e0846d1" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apache.commons" name="commons-compress" version="1.27.1"> + <artifact name="commons-compress-1.27.1.jar"> + <sha256 value="293d80f54b536b74095dcd7ea3cf0a29bbfc3402519281332495f4420d370d16" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apache.commons" name="commons-compress" version="1.28.0"> + <artifact name="commons-compress-1.28.0.jar"> + <sha256 value="e1522945218456f3649a39bc4afd70ce4bd466221519dba7d378f2141a4642ca" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apache.commons" name="commons-lang3" version="3.14.0"> + <artifact name="commons-lang3-3.14.0.jar"> + <sha256 value="7b96bf3ee68949abb5bc465559ac270e0551596fa34523fddf890ec418dde13c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apache.commons" name="commons-lang3" version="3.16.0"> + <artifact name="commons-lang3-3.16.0.jar"> + <sha256 value="08709dd74d602b705ce4017d26544210056a4ba583d5b20c09373406fe7a00f8" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apache.commons" name="commons-lang3" version="3.18.0"> + <artifact name="commons-lang3-3.18.0.jar"> + <sha256 value="4eeeae8d20c078abb64b015ec158add383ac581571cddc45c68f0c9ae0230720" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apache.commons" name="commons-lang3" version="3.20.0"> + <artifact name="commons-lang3-3.20.0.jar"> + <sha256 value="69e5c9fa35da7a51a5fd2099dfe56a2d8d32cf233e2f6d770e796146440263f4" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apache.commons" name="commons-text" version="1.12.0"> + <artifact name="commons-text-1.12.0.jar"> + <sha256 value="de023257ff166044a56bd1aa9124e843cd05dac5806cc705a9311f3556d5a15f" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apache.commons" name="commons-text" version="1.14.0"> + <artifact name="commons-text-1.14.0.jar"> + <sha256 value="121fce2282910c8f0c3ba793a5436b31beb710423cbe2d574a3fb7a73c508e92" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apache.httpcomponents" name="httpclient" version="4.5.14"> + <artifact name="httpclient-4.5.14.jar"> + <sha256 value="c8bc7e1c51a6d4ce72f40d2ebbabf1c4b68bfe76e732104b04381b493478e9d6" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apache.httpcomponents" name="httpclient" version="4.5.6"> + <artifact name="httpclient-4.5.6.jar"> + <sha256 value="c03f813195e7a80e3608d0ddd8da80b21696a4c92a6a2298865bf149071551c7" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apache.httpcomponents" name="httpcore" version="4.4.16"> + <artifact name="httpcore-4.4.16.jar"> + <sha256 value="6c9b3dd142a09dc468e23ad39aad6f75a0f2b85125104469f026e52a474e464f" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apache.httpcomponents" name="httpmime" version="4.5.6"> + <artifact name="httpmime-4.5.6.jar"> + <sha256 value="0b2b1102c18d3c7e05a77214b9b7501a6f6056174ae5604e0e256776eda7553e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apache.maven" name="maven-artifact" version="3.9.9"> + <artifact name="maven-artifact-3.9.9.jar"> + <sha256 value="30f015d1c1a393e19c18cd4f43532089c36d4ca328608ce3dda78b74d3d31515" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apache.maven" name="maven-builder-support" version="3.9.9"> + <artifact name="maven-builder-support-3.9.9.jar"> + <sha256 value="2ca4a967bdd12a9e85d40e012374f86e63d4a1030c199da4832e3d0a1c6770d8" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apache.maven" name="maven-core" version="3.9.9"> + <artifact name="maven-core-3.9.9.jar"> + <sha256 value="7fab37fc6044f20ae004376ab8414373636cf51e26ad0b1efa6b3f1cd2bec503" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apache.maven" name="maven-model" version="3.9.9"> + <artifact name="maven-model-3.9.9.jar"> + <sha256 value="8f59b0a16fe9c933be749a60ae0705a0cb337bb5abaf38801b40b740ff775727" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apache.maven" name="maven-model-builder" version="3.9.9"> + <artifact name="maven-model-builder-3.9.9.jar"> + <sha256 value="a4377182ac2e5adfe16be3b3c81981a5ecddab014184de72ae1e522f04a77602" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apache.maven" name="maven-plugin-api" version="3.9.9"> + <artifact name="maven-plugin-api-3.9.9.jar"> + <sha256 value="2b491d38db45b0e8eef522e8f7889a3366e546e58b376b07fcb56e34c424e932" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apache.maven" name="maven-repository-metadata" version="3.9.9"> + <artifact name="maven-repository-metadata-3.9.9.jar"> + <sha256 value="137c297e6a52d489b76663c82324d54e40f5d498a8fc015c0203fd91df8623b0" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apache.maven" name="maven-resolver-provider" version="3.9.9"> + <artifact name="maven-resolver-provider-3.9.9.jar"> + <sha256 value="5dea05049c94f952f48ce2bfe0111afdf986acc591fcc11d23fe3b8dcb70291e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apache.maven" name="maven-settings" version="3.9.9"> + <artifact name="maven-settings-3.9.9.jar"> + <sha256 value="68edf1b510e0d759ec501271a5d05e3a6e425462fbb84126c16e8a6f89abdada" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apache.maven" name="maven-settings-builder" version="3.9.9"> + <artifact name="maven-settings-builder-3.9.9.jar"> + <sha256 value="094640f3fdce47250cb06968a143f40c4e2f1c22be979c73caac2f49f3c38373" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apache.maven.resolver" name="maven-resolver-api" version="1.9.22"> + <artifact name="maven-resolver-api-1.9.22.jar"> + <sha256 value="63f5f665e44a09ef55463b3b91fda0b78ff07dd24b1060d56e79c10b6e32cbfb" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apache.maven.resolver" name="maven-resolver-impl" version="1.9.22"> + <artifact name="maven-resolver-impl-1.9.22.jar"> + <sha256 value="e4dafb8acc13d736377c02d2170d869438dd74b98b860745909d238726babcbb" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apache.maven.resolver" name="maven-resolver-named-locks" version="1.9.22"> + <artifact name="maven-resolver-named-locks-1.9.22.jar"> + <sha256 value="0685f29ec3b548d9b6917c527f13c667685a3394b955aaa5b25d0559818b7fc5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apache.maven.resolver" name="maven-resolver-spi" version="1.9.22"> + <artifact name="maven-resolver-spi-1.9.22.jar"> + <sha256 value="99ad721e4631d9bd0c4f9e29c869672577c66f2a674a5723ce38eff13c75cbfd" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apache.maven.resolver" name="maven-resolver-util" version="1.9.22"> + <artifact name="maven-resolver-util-1.9.22.jar"> + <sha256 value="4aaea1584c39294ca926fc474723d9684473609ef4490c4eb169d6ea7daca6b5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apache.maven.shared" name="maven-shared-utils" version="3.4.2"> + <artifact name="maven-shared-utils-3.4.2.jar"> + <sha256 value="b613357e1bad4dfc1dead801691c9460f9585fe7c6b466bc25186212d7d18487" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.apiguardian" name="apiguardian-api" version="1.1.2"> + <artifact name="apiguardian-api-1.1.2.jar"> + <sha256 value="b509448ac506d607319f182537f0b35d71007582ec741832a1f111e5b5b70b38" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.bitbucket.b_c" name="jose4j" version="0.9.5"> + <artifact name="jose4j-0.9.5.jar"> + <sha256 value="808fb3166f3e67dad9811c331029ab1681242fd52b735bc3f33f281167fcc72e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.bouncycastle" name="bcpkix-jdk18on" version="1.79"> + <artifact name="bcpkix-jdk18on-1.79.jar"> + <sha256 value="3639a24ddf9ba4b7eba0659b44770e91eba816421888e571f285aadefe532cd6" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.bouncycastle" name="bcprov-jdk18on" version="1.79"> + <artifact name="bcprov-jdk18on-1.79.jar"> + <sha256 value="0d81ecc3124536b539bce9aa3fe9621b7f84c9cee371b635a5b31c78b79ab1da" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.bouncycastle" name="bcprov-jdk18on" version="1.83"> + <artifact name="bcprov-jdk18on-1.83.jar"> + <sha256 value="82cf3a2af766c3bc874f6d36b9f20a8b99a8f09762dc776e8a227a45d8daaafb" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.bouncycastle" name="bcutil-jdk18on" version="1.79"> + <artifact name="bcutil-jdk18on-1.79.jar"> + <sha256 value="c70b88ada58938cbc2f005d40329054078bcfa1149e6ffc03e9242eb6ab21836" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.cache2k" name="cache2k-api" version="1.2.4.Final"> + <artifact name="cache2k-api-1.2.4.Final.jar"> + <sha256 value="a50c4675c2b8cbaa6a9ff7a68864229b13e0117429dcb91e45afdec0ef4464b2" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.cache2k" name="cache2k-core" version="1.2.4.Final"> + <artifact name="cache2k-core-1.2.4.Final.jar"> + <sha256 value="ca1a0b7551f9b0abd1e49b31a81892bbccb78ee212f09ebad9ee4e375b542000" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.checkerframework" name="checker-compat-qual" version="2.5.3"> + <artifact name="checker-compat-qual-2.5.3.jar"> + <sha256 value="d76b9afea61c7c082908023f0cbc1427fab9abd2df915c8b8a3e7a509bccbc6d" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.checkerframework" name="checker-qual" version="2.5.5"> + <artifact name="checker-qual-2.5.5.jar"> + <sha256 value="164fe9728cf95a2cdea93e257d0dc3d5e29f29256b3cca900a8e619bc94d5b1f" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.checkerframework" name="checker-qual" version="3.33.0"> + <artifact name="checker-qual-3.33.0.jar"> + <sha256 value="e316255bbfcd9fe50d165314b85abb2b33cb2a66a93c491db648e498a82c2de1" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.checkerframework" name="checker-qual" version="3.41.0"> + <artifact name="checker-qual-3.41.0.jar"> + <sha256 value="2f9f245bf68e4259d610894f2406dc1f6363dc639302bd566e8272e4f4541172" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.checkerframework" name="checker-qual" version="3.43.0"> + <artifact name="checker-qual-3.43.0.jar"> + <sha256 value="3fbc2e98f05854c3df16df9abaa955b91b15b3ecac33623208ed6424640ef0f6" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.codehaus.mojo" name="animal-sniffer-annotations" version="1.23"> + <artifact name="animal-sniffer-annotations-1.23.jar"> + <sha256 value="9ffe526bf43a6348e9d8b33b9cd6f580a7f5eed0cf055913007eda263de974d0" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.codehaus.mojo" name="animal-sniffer-annotations" version="1.24"> + <artifact name="animal-sniffer-annotations-1.24.jar"> + <sha256 value="c720e6e5bcbe6b2f48ded75a47bccdb763eede79d14330102e0d352e3d89ed92" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.codehaus.plexus" name="plexus-cipher" version="2.0"> + <artifact name="plexus-cipher-2.0.jar"> + <sha256 value="9a7f1b5c5a9effd61eadfd8731452a2f76a8e79111fac391ef75ea801bea203a" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.codehaus.plexus" name="plexus-classworlds" version="2.8.0"> + <artifact name="plexus-classworlds-2.8.0.jar"> + <sha256 value="081b40e0eab033cd5ac72d2501bfff4f5fd2a3eef827051111730ea152681c72" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.codehaus.plexus" name="plexus-component-annotations" version="2.1.0"> + <artifact name="plexus-component-annotations-2.1.0.jar"> + <sha256 value="bde3617ce9b5bcf9584126046080043af6a4b3baea40a3b153f02e7bbc32acac" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.codehaus.plexus" name="plexus-interpolation" version="1.27"> + <artifact name="plexus-interpolation-1.27.jar"> + <sha256 value="3fb4fb6143fdf964024c3cb738551524b9ea84e5c211cd660c559ad0703e5230" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.codehaus.plexus" name="plexus-sec-dispatcher" version="2.0"> + <artifact name="plexus-sec-dispatcher-2.0.jar"> + <sha256 value="873139960c4c780176dda580b003a2c4bf82188bdce5bb99234e224ef7acfceb" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.codehaus.plexus" name="plexus-utils" version="3.5.1"> + <artifact name="plexus-utils-3.5.1.jar"> + <sha256 value="86e0255d4c879c61b4833ed7f13124e8bb679df47debb127326e7db7dd49a07b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.codehaus.plexus" name="plexus-xml" version="3.0.0"> + <artifact name="plexus-xml-3.0.0.jar"> + <sha256 value="d2622dc9339b16f5b8c9cad2add440e965831d0e16f19ae1de24e1202b0de536" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.codehaus.woodstox" name="stax2-api" version="4.2.2"> + <artifact name="stax2-api-4.2.2.jar"> + <sha256 value="a61c48d553efad78bc01fffc4ac528bebbae64cbaec170b2a5e39cf61eb51abe" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.conscrypt" name="conscrypt-android" version="2.5.3"> + <artifact name="conscrypt-android-2.5.3.aar"> + <sha256 value="551ae4e301c571760d1791e647db6ed1dcb10d34dcae7aa12b67f220f2ce98d1" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.cyclonedx" name="cyclonedx-core-java" version="10.1.0"> + <artifact name="cyclonedx-core-java-10.1.0.jar"> + <sha256 value="4931d0aed28763ae9fa1c574e26b7636879abdc101ff81ce3c63ad905c99937c" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.cyclonedx" name="cyclonedx-gradle-plugin" version="2.1.0"> + <artifact name="cyclonedx-gradle-plugin-2.1.0.jar"> + <sha256 value="7aba9714f7ead83a9d7b5bf6fd68f54605be4203ec9b61395d0662d462c0abd4" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="org.ec4j.core" name="ec4j-core" version="1.1.1"> + <artifact name="ec4j-core-1.1.1.jar"> + <sha256 value="d73dee44fefb725dfc658267465fe5a768a666313d8acd701209f5836f1431d8" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.eclipse.sisu" name="org.eclipse.sisu.inject" version="0.9.0.M3"> + <artifact name="org.eclipse.sisu.inject-0.9.0.M3.jar"> + <sha256 value="15335c4dcf082f599fb8eddcfb58d6a7e9a9c97de2883c257089a479b9b24522" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.eclipse.sisu" name="org.eclipse.sisu.plexus" version="0.9.0.M3"> + <artifact name="org.eclipse.sisu.plexus-0.9.0.M3.jar"> + <sha256 value="c99674d3773e26154885661711f0b6d63aa5008f5cc99227a236756d4ad9de5e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.glassfish.jaxb" name="jaxb-runtime" version="2.3.2"> + <artifact name="jaxb-runtime-2.3.2.jar"> + <sha256 value="e6e0a1e89fb6ff786279e6a0082d5cef52dc2ebe67053d041800737652b4fd1b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.glassfish.jaxb" name="txw2" version="2.3.2"> + <artifact name="txw2-2.3.2.jar"> + <sha256 value="4a6a9f483388d461b81aa9a28c685b8b74c0597993bf1884b04eddbca95f48fe" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.hamcrest" name="hamcrest" version="3.0"> + <artifact name="hamcrest-3.0.jar"> + <sha256 value="5d66b6a4a680755cb6ed7cb104fa7835ef644667586ff0737adeb977c39ecdbc" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.hamcrest" name="hamcrest-core" version="1.3"> + <artifact name="hamcrest-core-1.3.jar"> + <sha256 value="66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.hamcrest" name="hamcrest-core" version="2.2"> + <artifact name="hamcrest-core-2.2.jar"> + <sha256 value="094f5d92b4b7d9c8a2bf53cc69d356243ae89c3499457bcb4b92f7ed3bf95879" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.hamcrest" name="hamcrest-integration" version="1.3"> + <artifact name="hamcrest-integration-1.3.jar"> + <sha256 value="70f418efbb506c5155da5f9a5a33262ea08a9e4d7fea186aa9015c41a7224ac2" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.hamcrest" name="hamcrest-library" version="1.3"> + <artifact name="hamcrest-library-1.3.jar"> + <sha256 value="711d64522f9ec410983bd310934296da134be4254a125080a0416ec178dfad1c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.hamcrest" name="hamcrest-library" version="2.2"> + <artifact name="hamcrest-library-2.2.jar"> + <sha256 value="3851523a201a0d4825c25a61a6edc50712825a39bd3d03391b98c48ca3cb396c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.hisp.dhis.lib.expression" name="expression-parser-jvm" version="1.3.1"> + <artifact name="expression-parser-jvm-1.3.1.jar"> + <sha256 value="1997d32af036e9f863b37c84b1a8d8ee33661a36277d9e4237aa69644f37b0c1" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.hisp.dhis.lib.expression" name="expression-parser-jvm" version="1.4.0"> + <artifact name="expression-parser-jvm-1.4.0.jar"> + <sha256 value="ff2e564b15bc6d10f5284bb9bcc08123a9f627b94e754062910070cdd3bd6d82" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.hisp.dhis.lib.expression" name="expression-parser-jvm" version="1.4.1"> + <artifact name="expression-parser-jvm-1.4.1.jar"> + <sha256 value="3c77089a35108ef47cebc72e4baab3f3b686b217322399624087483b3efeffe0" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.hisp.dhis.parser" name="dhis-antlr-expression-parser" version="1.0.39"> + <artifact name="dhis-antlr-expression-parser-1.0.39.jar"> + <sha256 value="67f0b36e92f7b81bca82e5274befaeed5e684d15f884c27589905b67ab7a1de5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.hisp.dhis.rules" name="rule-engine-jvm" version="3.7.1"> + <artifact name="rule-engine-jvm-3.7.1.jar"> + <sha256 value="f882a347a320087c897494d45666a6df72cbfd2049d04497cf1c7ff68617e3fa" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.hisp.dhis.rules" name="rule-engine-jvm" version="3.7.2"> + <artifact name="rule-engine-jvm-3.7.2.jar"> + <sha256 value="8e67a8f870acefdf3dcb2a268a12bcd3ce1c0bdebe4fe249f9e4bdcd5a29501e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jacoco" name="org.jacoco.agent" version="0.8.10"> + <artifact name="org.jacoco.agent-0.8.10.jar"> + <sha256 value="32d62211c0a323f50822a750a647c122b2b1b559f63533ea2e324c0324381370" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jacoco" name="org.jacoco.ant" version="0.8.10"> + <artifact name="org.jacoco.ant-0.8.10.jar"> + <sha256 value="a7c8dd6741acb337cc0771a9bf176aa67c09a52a6de011eb7a0f5e78c9bd5872" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jacoco" name="org.jacoco.core" version="0.8.10"> + <artifact name="org.jacoco.core-0.8.10.jar"> + <sha256 value="e789667d93a7503938ee978ae4fbbc9a1bccda3b546299b24d8550d816d80e08" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jacoco" name="org.jacoco.core" version="0.8.14"> + <artifact name="org.jacoco.core-0.8.14.jar"> + <sha256 value="28abbf0eea5a08e4f24097f2fbac663ca17c341c25c3a04d90d6cd325943c995" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jacoco" name="org.jacoco.report" version="0.8.10"> + <artifact name="org.jacoco.report-0.8.10.jar"> + <sha256 value="3e35c14f7853c7c88dbe04cf086ee053a5739f419e98009909bbedecddddd50c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.javassist" name="javassist" version="3.30.2-GA"> + <artifact name="javassist-3.30.2-GA.jar"> + <sha256 value="eba37290994b5e4868f3af98ff113f6244a6b099385d9ad46881307d3cb01aaf" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jdom" name="jdom2" version="2.0.6"> + <artifact name="jdom2-2.0.6.jar"> + <sha256 value="1345f11ba606d15603d6740551a8c21947c0215640770ec67271fe78bea97cf5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains" name="annotations" version="13.0"> + <artifact name="annotations-13.0.jar"> + <sha256 value="ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains" name="annotations" version="23.0.0"> + <artifact name="annotations-23.0.0.jar"> + <sha256 value="7b0f19724082cbfcbc66e5abea2b9bc92cf08a1ea11e191933ed43801eb3cd05" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains" name="markdown" version="0.7.3"> + <artifact name="markdown-metadata-0.7.3.jar"> + <sha256 value="f87a7ee400daae739a5fd6f319d31bfba306f04d6a5757406b019df1bf2bf6a9" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains" name="markdown-jvm" version="0.7.3"> + <artifact name="markdown-jvm-0.7.3.jar"> + <sha256 value="893abb31f15b6216f74dc704c0c6bf1e567dcf2b62cca29cf42e4f53153637ac" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.androidx.lifecycle" name="lifecycle-common" version="2.9.6"> + <artifact name="lifecycle-common-2.9.6.jar"> + <sha256 value="b21a149fe28cccc7ece37b55098d10027aba3d2e0db31d12d3cdc907ded2368a" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.androidx.lifecycle" name="lifecycle-runtime" version="2.9.6"> + <artifact name="lifecycle-runtime-2.9.6.jar"> + <sha256 value="9dd583b709136e0aafe60e1b90249bf63bc80cd7ba6e0641ce74a1ab3613c64f" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.androidx.lifecycle" name="lifecycle-runtime-compose" version="2.9.6"> + <artifact name="lifecycle-runtime-compose-2.9.6.jar"> + <sha256 value="adb75b2b89d68f338d9420b8b24dd9ba5368872a4fc70e32282c2fa0f193a0fc" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.androidx.lifecycle" name="lifecycle-runtime-compose-desktop" version="2.9.4"> + <artifact name="lifecycle-runtime-compose-desktop-2.9.4.jar"> + <sha256 value="a078b441457ec0e10007dcd163ff9f2c0437f9b35fbc9ec6cead82f8e985894d" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.androidx.lifecycle" name="lifecycle-runtime-compose-desktop" version="2.9.6"> + <artifact name="lifecycle-runtime-compose-desktop-2.9.6.jar"> + <sha256 value="31c3c4b6dea38f078c46829dee2c43abba2bf8757b7ee8a0f660f31217364898" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.androidx.lifecycle" name="lifecycle-viewmodel" version="2.9.6"> + <artifact name="lifecycle-viewmodel-2.9.6.jar"> + <sha256 value="9ecd2bc61365fb4fa3f6f284aba92148dbfd3d1aca38662ad54bcecac2ab5546" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.androidx.lifecycle" name="lifecycle-viewmodel-compose" version="2.9.3"> + <artifact name="lifecycle-viewmodel-compose-2.9.3.jar"> + <sha256 value="8173b469236f3d28dda0c9aa0a03085490268a8b5c602233b5374527ec2bca24" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.androidx.lifecycle" name="lifecycle-viewmodel-compose" version="2.9.6"> + <artifact name="lifecycle-viewmodel-compose-2.9.6.jar"> + <sha256 value="8173b469236f3d28dda0c9aa0a03085490268a8b5c602233b5374527ec2bca24" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.androidx.lifecycle" name="lifecycle-viewmodel-compose-desktop" version="2.9.3"> + <artifact name="lifecycle-viewmodel-compose-desktop-2.9.3.jar"> + <sha256 value="2db996ebf95a0bb6e2e0578e28a6ba472ebfec59ed1d5d32d513ef3ec01dfc1b" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.androidx.lifecycle" name="lifecycle-viewmodel-compose-desktop" version="2.9.6"> + <artifact name="lifecycle-viewmodel-compose-desktop-2.9.6.jar"> + <sha256 value="a136c371cd748f06be3a846e5069f9837fd759c4d13f7c11952937bdbd7b255a" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.androidx.lifecycle" name="lifecycle-viewmodel-savedstate" version="2.9.6"> + <artifact name="lifecycle-viewmodel-savedstate-2.9.6.jar"> + <sha256 value="74239398cb1f20a8113b37b93d309f1f57494a14f70d6578648e8bb083f80f5d" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.androidx.navigation" name="navigation-common" version="2.9.2"> + <artifact name="navigation-common-2.9.2.jar"> + <sha256 value="248b66550f7895fba848af935153feeace42fa459cefc9c800a810df3cf24e8a" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.androidx.navigation" name="navigation-common-desktop" version="2.9.2"> + <artifact name="navigation-common-desktop-2.9.2.jar"> + <sha256 value="ef8c28001ef12e20dac10718ffa0562392b1b5f234f1f8564ae516a9e25a807f" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.androidx.navigation" name="navigation-compose" version="2.9.2"> + <artifact name="navigation-compose-2.9.2.jar"> + <sha256 value="25ba56da1d963b02b9c251b4bea54ecb0acd5759b04e2d1774a7302e6db41337" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.androidx.navigation" name="navigation-compose-desktop" version="2.9.2"> + <artifact name="navigation-compose-desktop-2.9.2.jar"> + <sha256 value="d8cd8a9f7973d107b3082f74a8f3cd24735b20d222cc78743034ce8153eb77d8" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.androidx.navigation" name="navigation-runtime" version="2.9.2"> + <artifact name="navigation-runtime-2.9.2.jar"> + <sha256 value="1537a5a5965880f7fa647f73d20584554127c0328b40373ce1df0c3c11a67a31" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.androidx.navigation" name="navigation-runtime-desktop" version="2.9.2"> + <artifact name="navigation-runtime-desktop-2.9.2.jar"> + <sha256 value="4d0620cc3f9b1a19349d40c9d167ba955e1feb880d1beb5377c45f36c6369aec" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.androidx.savedstate" name="savedstate" version="1.3.6"> + <artifact name="savedstate-1.3.6.jar"> + <sha256 value="0741a750940978c7e8b1605f117be62e399fd57a7625ab1ae80a28a2ca0f3415" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.androidx.savedstate" name="savedstate-compose" version="1.3.6"> + <artifact name="savedstate-compose-1.3.6.jar"> + <sha256 value="61b8b51d04b4d992e8e1b618ad4cf117324301e492ad06a058fc96cdf861b780" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.androidx.savedstate" name="savedstate-compose-desktop" version="1.3.4"> + <artifact name="savedstate-compose-desktop-1.3.4.jar"> + <sha256 value="5228d0732128011747c8d56f65156505a0b2d29b000d398c6f1979bc0ef42113" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.androidx.savedstate" name="savedstate-compose-desktop" version="1.3.6"> + <artifact name="savedstate-compose-desktop-1.3.6.jar"> + <sha256 value="0f3d045c5fd7e1301ab6c38cd0778067b0484cf39acac1233be71a723a6a8075" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose" name="compose-gradle-plugin" version="1.10.3"> + <artifact name="compose-gradle-plugin-1.10.3.jar"> + <sha256 value="778f268133333488560d81bccda555035b882efd9e2827d691c9c694968f2f6b" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.animation" name="animation" version="1.10.3"> + <artifact name="animation-1.10.3.jar"> + <sha256 value="c24d85a90247b7ae31ee6e5dbbec62715ed046812a48886142afd88d5683f464" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.animation" name="animation-core" version="1.10.3"> + <artifact name="animation-core-1.10.3.jar"> + <sha256 value="bfc4f43d664575ac10db61649212f45392f968247f96ae91e1a73e4bd0a204f3" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.animation" name="animation-core-desktop" version="1.10.3"> + <artifact name="animation-core-desktop-1.10.3.jar"> + <sha256 value="41c0220ddbc55cb897feb0d5816b748f9c11162171f12743c04b50d0d84db628" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.animation" name="animation-core-desktop" version="1.9.0"> + <artifact name="animation-core-desktop-1.9.0.jar"> + <sha256 value="76cf4d09b5312f9a9e46e80a270c76a7157a93819493feb7076f9c8c98610605" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.animation" name="animation-desktop" version="1.10.3"> + <artifact name="animation-desktop-1.10.3.jar"> + <sha256 value="1881c5575440055d54a679418f7ad7e86c0349743389360bed0f6a36af16ba34" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.animation" name="animation-desktop" version="1.9.0"> + <artifact name="animation-desktop-1.9.0.jar"> + <sha256 value="f8b90b591d1f8c2c8b547cdddaea370a9989b0b2c71b42038b67fdb28f120b7d" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.annotation-internal" name="annotation" version="1.10.3"> + <artifact name="annotation-1.10.3.jar"> + <sha256 value="59a0e9b77b3e1f61d3e3f0df8f99ed2a12b168ded809ea39e6fd75eeff94be12" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.collection-internal" name="collection" version="1.10.3"> + <artifact name="collection-1.10.3.jar"> + <sha256 value="367b8ea28496dc024531a0fe97576dd76864bb066ffa09ba2141f73c79bf3c3d" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.components" name="components-resources" version="1.10.3"> + <artifact name="library-metadata-1.10.3.jar"> + <sha256 value="c3ca5594781ca05c9d6ab0596d7f4ebdc64a744eb74d7bc2c10e58c68d44eb94" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.components" name="components-resources-android" version="1.10.3"> + <artifact name="library-release.aar"> + <sha256 value="4107142270206273f4051842fcc2a2463c7a95bfdb18ac2c6f77704c909509a8" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.components" name="components-resources-desktop" version="1.10.3"> + <artifact name="library-desktop-1.10.3.jar"> + <sha256 value="7dbbe06683befa8110b4ac926a7432b7e2ee446ed156adf55ad17e9c868ae0e2" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.components" name="components-resources-desktop" version="1.9.0"> + <artifact name="library-desktop-1.9.0.jar"> + <sha256 value="f3b8f331b6bb4312a74ed16d7bb3654427cfa73728a5817addbff64c6e77dfec" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.components" name="components-ui-tooling-preview" version="1.10.3"> + <artifact name="library-metadata-1.10.3.jar"> + <sha256 value="155ff009d276e227c1a5a59a7cd728d4eb589d0be4669a0b971702899ea6d7ec" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.compose.components" name="components-ui-tooling-preview-android" version="1.10.3"> + <artifact name="library-release.aar"> + <sha256 value="5f0028182b6d789a95e1b68f32534c2a77582184791cb68cd8d1b541d85e1ab6" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.compose.components" name="components-ui-tooling-preview-desktop" version="1.10.3"> + <artifact name="library-desktop-1.10.3.jar"> + <sha256 value="6d2ffffc51ce48d39b4708fb520a60b170f9fb399938d3092e2e09e7dc3a20c7" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.compose.desktop" name="desktop" version="1.10.3"> + <artifact name="desktop-metadata-1.10.3.jar"> + <sha256 value="089e24417bf9f6c34eec5720eebb2cbcc82ea2855ecef90133eb17e1079d5868" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.desktop" name="desktop-jvm" version="1.10.3"> + <artifact name="desktop-jvm-1.10.3.jar"> + <sha256 value="fdb63de4c9bdc6570c5355eeb0f013d4635effda42907c2d084acc77e08d4f8a" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.desktop" name="desktop-jvm" version="1.9.0"> + <artifact name="desktop-jvm-1.9.0.jar"> + <sha256 value="c229c52c95b4c4d73984c88f40f8475c07d13d2908d34df029e424b6ba1a99b2" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.foundation" name="foundation" version="1.10.3"> + <artifact name="foundation-1.10.3.jar"> + <sha256 value="e1922ed2a810b419e53f3b621a09d22783a1bb853d6f427da9f3201209712b1f" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.foundation" name="foundation-desktop" version="1.10.3"> + <artifact name="foundation-desktop-1.10.3.jar"> + <sha256 value="3a9b7bfae72f1a92a8123d3290bb7d7f61d92e5cde877af5373c3e5c2caceb2b" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.foundation" name="foundation-desktop" version="1.9.0"> + <artifact name="foundation-desktop-1.9.0.jar"> + <sha256 value="0b3a1b5f085be6c0ce95354a4739b35e9ea82e00f790497c1f53c72ea51342f9" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.foundation" name="foundation-layout" version="1.10.3"> + <artifact name="foundation-layout-1.10.3.jar"> + <sha256 value="5c29ad93f0557c478abd3fcdff9c195c5e84bda8c97f022ef7c58f4923321475" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.foundation" name="foundation-layout-desktop" version="1.10.3"> + <artifact name="foundation-layout-desktop-1.10.3.jar"> + <sha256 value="8d8e00062a83a147409f42f91798394c3c221d22877953eff7d0a81767b5d0fc" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.foundation" name="foundation-layout-desktop" version="1.9.0"> + <artifact name="foundation-layout-desktop-1.9.0.jar"> + <sha256 value="5950ce1e10259ae2198a46e1681d959f16bcd64d8b5d0289e17c50863af3f8ed" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.hot-reload" name="hot-reload-agent" version="1.0.0"> + <artifact name="hot-reload-agent-1.0.0.jar"> + <sha256 value="326b40d2f7c7e341b807684603b8e2f5750c39d8f9c9f67a4a18c224c8c3197d" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.compose.hot-reload" name="hot-reload-analysis" version="1.0.0"> + <artifact name="hot-reload-analysis-1.0.0.jar"> + <sha256 value="b9b6d1d92c82db9fa654081d74aeb9eae3656e1f14f93fc4bcca1bd6058ced15" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.compose.hot-reload" name="hot-reload-annotations" version="1.0.0"> + <artifact name="hot-reload-annotations-metadata-1.0.0.jar"> + <sha256 value="dc3831830947e306cfec3b7f10a4b97cdf95acc8e7b4a30b9d050e6a2388ea95" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.compose.hot-reload" name="hot-reload-annotations-jvm" version="1.0.0"> + <artifact name="hot-reload-annotations-jvm-1.0.0.jar"> + <sha256 value="f506e3980c67f876c9514be02095bcad3beff7af4fdedbbf597943d86df070f3" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.compose.hot-reload" name="hot-reload-core" version="1.0.0"> + <artifact name="hot-reload-core-1.0.0.jar"> + <sha256 value="534fbb15222f57594b0330cf193af443a720ed8a2e857cc558713022b1b491e0" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.compose.hot-reload" name="hot-reload-devtools" version="1.0.0"> + <artifact name="hot-reload-devtools-1.0.0.jar"> + <sha256 value="697961232ee93a5456ab61054f0c35d979d7b0c9e37202b9ea450cb7ab28d4af" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.compose.hot-reload" name="hot-reload-devtools-api" version="1.0.0"> + <artifact name="hot-reload-devtools-api-1.0.0.jar"> + <sha256 value="b575ba799db29d8d4de4b2b4685847c6d291e09a647d5b2d4cce43d6ff1ce5c6" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.compose.hot-reload" name="hot-reload-gradle-plugin" version="1.0.0"> + <artifact name="hot-reload-gradle-plugin-1.0.0.jar"> + <sha256 value="3551b2a31d84ecf95ad140cfdc5b04b3b6b506bf1566187adef9b91a05c66b04" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.compose.hot-reload" name="hot-reload-orchestration" version="1.0.0"> + <artifact name="hot-reload-orchestration-1.0.0.jar"> + <sha256 value="9eec3567bea0f61236027e8038e003f01200b0e89f132c9d1fa7c3901cb34bb2" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.compose.hot-reload" name="hot-reload-runtime-api" version="1.0.0"> + <artifact name="hot-reload-runtime-api-metadata-1.0.0.jar"> + <sha256 value="e4ce8d8c1072c9236d5249aef4368f84a33592bf706f5cc3064ec734e6c16adc" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.compose.hot-reload" name="hot-reload-runtime-api-jvm" version="1.0.0"> + <artifact name="hot-reload-runtime-api-jvm-1.0.0.jar"> + <sha256 value="e39e923a9c230e2e49c969a7bb1b35338b37dbed5eacb2c0388920b68e6ebc34" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.compose.hot-reload" name="hot-reload-runtime-jvm" version="1.0.0"> + <artifact name="hot-reload-runtime-jvm-1.0.0.jar"> + <sha256 value="7a10e6af2b33072b4c7de3e38c8f8fab6542afc515cfef242e53878fec7e1002" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.compose.material" name="material" version="1.10.3"> + <artifact name="material-1.10.3.jar"> + <sha256 value="2d2118f77ba789b8fa179803856a7ae1ec753f9ff9928ef48f2077540ab83205" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.material" name="material-desktop" version="1.10.3"> + <artifact name="material-desktop-1.10.3.jar"> + <sha256 value="ee4afa33a2411e06cf1bec689667767ffb991ff02269e040a4ef64e76e392119" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.material" name="material-desktop" version="1.9.0"> + <artifact name="material-desktop-1.9.0.jar"> + <sha256 value="5a04d1e29596023fdd5cafdedb4510a4a6fa65122e8419b5a204a516dc894787" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.material" name="material-icons-core" version="1.7.3"> + <artifact name="material-icons-core-1.7.3.jar"> + <sha256 value="de5a0c277e1598c121d2c4606cc03bdffebd059e32b3494ddfb84c08d51da701" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.material" name="material-icons-core-desktop" version="1.7.3"> + <artifact name="material-icons-core-desktop-1.7.3.jar"> + <sha256 value="bcf6c853b6db2ff148d2d3aad3b7a7ea54d93fc7b42e0afd840eb6daf1a1c681" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.material" name="material-icons-extended" version="1.7.3"> + <artifact name="material-icons-extended-1.7.3.jar"> + <sha256 value="9e75179964627320ff1b1b73026925474d465feb7a89d6295f8d2f64dc4d43a6" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.material" name="material-icons-extended-desktop" version="1.7.3"> + <artifact name="material-icons-extended-desktop-1.7.3.jar"> + <sha256 value="dc55d383dca8279e353917e5c5a93d192a95e7ca4f926ee55ee0b4627f99d860" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.material" name="material-ripple" version="1.10.3"> + <artifact name="material-ripple-1.10.3.jar"> + <sha256 value="71eeb6cea9e5fcf3e93e8463e188ceb1e44887183a02021dd0c2f424a5ab1c4a" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.material" name="material-ripple" version="1.9.1"> + <artifact name="material-ripple-1.9.1.jar"> + <sha256 value="292d2b3fbbbcc24bb326f3f642dac9a8cd55e18d5b518365bac6daca23a5cf74" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.material" name="material-ripple-desktop" version="1.10.3"> + <artifact name="material-ripple-desktop-1.10.3.jar"> + <sha256 value="3257697a1a58188ec3dc31f31867f1c38209900b87df1261ebac9e6a1387db83" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.material" name="material-ripple-desktop" version="1.9.0"> + <artifact name="material-ripple-desktop-1.9.0.jar"> + <sha256 value="2407d9e83c6fd84b90b123cc7ae6291fa7a18bb40938ad210f675e4c86425c8b" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.material3" name="material3" version="1.9.0"> + <artifact name="material3-1.9.0.jar"> + <sha256 value="0be26b1746e5baae437dbf820daefef7e107b648846f97e7b411dcd1de4f6433" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.material3" name="material3-desktop" version="1.8.2"> + <artifact name="material3-desktop-1.8.2.jar"> + <sha256 value="3e0168b5af7bacdbacc41e9d36ff4f6d39a8b989fd63b68e3b305fb6a4d2ab58" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.material3" name="material3-desktop" version="1.9.0"> + <artifact name="material3-desktop-1.9.0.jar"> + <sha256 value="78f0787a1c6d20f9b2460a387f51ecf554e211d3c874b22d66530a540390b811" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.material3" name="material3-window-size-class" version="1.8.2"> + <artifact name="material3-window-size-class-1.8.2.jar"> + <sha256 value="09c5bad6bd2cc6335cf7cf71ac3f68e8db7acd92dd1009b06cec2e6f91a2183f" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.material3" name="material3-window-size-class-desktop" version="1.8.2"> + <artifact name="material3-window-size-class-desktop-1.8.2.jar"> + <sha256 value="41ae5d2e960a07bc645c1a4c619089e35b063b94c728f4b5b3f7f0912acd693a" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.runtime" name="runtime" version="1.10.3"> + <artifact name="runtime-1.10.3.jar"> + <sha256 value="ba3e7e915b19bce05a1e74335a54628ebcee46cb238a1bb6847ad3fb045a56bd" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.runtime" name="runtime-desktop" version="1.10.3"> + <artifact name="runtime-desktop-1.10.3.jar"> + <sha256 value="05f5570c0a7ea8addd6fe9507a70f293efa7f1450d8b9b16dc3c8fee21cc6127" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.runtime" name="runtime-desktop" version="1.9.0"> + <artifact name="runtime-desktop-1.9.0.jar"> + <sha256 value="05f5570c0a7ea8addd6fe9507a70f293efa7f1450d8b9b16dc3c8fee21cc6127" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.runtime" name="runtime-saveable" version="1.10.3"> + <artifact name="runtime-saveable-1.10.3.jar"> + <sha256 value="dd1f459519c3d3440eb578ec412ad06919c9d36b9c17e5cdb398d6bfb08c22fb" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.runtime" name="runtime-saveable-desktop" version="1.10.3"> + <artifact name="runtime-saveable-desktop-1.10.3.jar"> + <sha256 value="eb7132b55de2b0913736fdff4705022803e455810f018efecc9eb3230936520a" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.runtime" name="runtime-saveable-desktop" version="1.9.0"> + <artifact name="runtime-saveable-desktop-1.9.0.jar"> + <sha256 value="960a622fd875edc3c598f2692101e6f924ef78fbafbe9411e749d184afb8f62f" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.ui" name="ui" version="1.10.3"> + <artifact name="ui-1.10.3.jar"> + <sha256 value="aca32b05689bb4116ac10eeeb283a57d0cb7ea1efcd97621d4643f5cb44fec6c" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.ui" name="ui-backhandler" version="1.10.3"> + <artifact name="ui-backhandler-metadata-1.10.3.jar"> + <sha256 value="a32331b48694e76791cf41b1e161947ecd73b1cc36f6292c1bbbc73cc411776b" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.ui" name="ui-backhandler-android" version="1.9.1"> + <artifact name="ui-backhandler-release.aar"> + <sha256 value="8f8f37d0eb33f597608bc20f875021b1d80db6f835c138cd7cef9093c7ad4c24" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.ui" name="ui-backhandler-android-debug" version="1.9.1"> + <artifact name="ui-backhandler-debug.aar"> + <sha256 value="dbbcd638c9ebb9e97f61f2bf130408e56c6ce5d001dc5f5e70845ce09357c929" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.ui" name="ui-backhandler-desktop" version="1.10.3"> + <artifact name="ui-backhandler-desktop-1.10.3.jar"> + <sha256 value="1babf68f5a05cbe1ba8cf934f0e575bb0d0b184444514e6aa7ec1f8004c9ce33" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.ui" name="ui-backhandler-desktop" version="1.9.0"> + <artifact name="ui-backhandler-desktop-1.9.0.jar"> + <sha256 value="37d369737c68efbd27b14b835ce288ccae45693cc1502cb5eb5831a34f44a3d0" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.ui" name="ui-desktop" version="1.10.3"> + <artifact name="ui-desktop-1.10.3.jar"> + <sha256 value="ec8887c03a333fa374d0b4c46bb9fb700937857f4088eaea4c4cc0ec835f7498" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.ui" name="ui-desktop" version="1.9.0"> + <artifact name="ui-desktop-1.9.0.jar"> + <sha256 value="7397253993e8d512c613b77239e20e5052da8218f6b0b64ccde2c37b14b540dc" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.ui" name="ui-geometry" version="1.10.3"> + <artifact name="ui-geometry-1.10.3.jar"> + <sha256 value="16ee911b8b3e51d69cc08981d95723a1682d578fefaf7f8e8a54d5555bf85925" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.ui" name="ui-geometry-desktop" version="1.10.3"> + <artifact name="ui-geometry-desktop-1.10.3.jar"> + <sha256 value="cdbfdabccac8abef2d9bc0420ec0c4be7a880f6d26b2d1cc4e2317c0d252ee27" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.ui" name="ui-geometry-desktop" version="1.9.0"> + <artifact name="ui-geometry-desktop-1.9.0.jar"> + <sha256 value="dea0f67524e4349637c985e0fa2204ff354922f38c65cc8f810649d0d8e9faea" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.ui" name="ui-graphics" version="1.10.3"> + <artifact name="ui-graphics-1.10.3.jar"> + <sha256 value="17d42a50b1cedd3bcedf7b5de796583edf73fd29cdc20795c5e580db1f7f6e0c" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.ui" name="ui-graphics-desktop" version="1.10.3"> + <artifact name="ui-graphics-desktop-1.10.3.jar"> + <sha256 value="9fa604364dc4de23d3f8101f2f5968afa742d847105a5e2c41b6a0aa9123f11b" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.ui" name="ui-graphics-desktop" version="1.9.0"> + <artifact name="ui-graphics-desktop-1.9.0.jar"> + <sha256 value="0f8be5263684dd3ae03c23e8221a1e8e6972a508ec9aecd777f8984798f151f8" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.ui" name="ui-text" version="1.10.3"> + <artifact name="ui-text-1.10.3.jar"> + <sha256 value="b537d0b3bb23ec795a1b35627deaa93703cfd0733bc7b2dc346415df06243a91" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.ui" name="ui-text-desktop" version="1.10.3"> + <artifact name="ui-text-desktop-1.10.3.jar"> + <sha256 value="fbca4db945be286b84f75c0c9c784218470bebefa831f73f08edfb3294b6c8e8" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.ui" name="ui-text-desktop" version="1.9.0"> + <artifact name="ui-text-desktop-1.9.0.jar"> + <sha256 value="3377200710146a353584eb73ebfeadd7d64100d356baf5bf860876e118228f42" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.ui" name="ui-tooling-preview" version="1.10.3"> + <artifact name="ui-tooling-preview-1.10.3.jar"> + <sha256 value="625c9e0ff93b928e5860f11c5108a2cd511797b9b43a6dccbb39d7c9da305233" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.ui" name="ui-tooling-preview-desktop" version="1.10.3"> + <artifact name="ui-tooling-preview-desktop-1.10.3.jar"> + <sha256 value="b5fa6fbbeea5f896ad2a8e7703bd7eb574d3a1b5ab6d44dbe0a07536bd6af6c4" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.ui" name="ui-tooling-preview-desktop" version="1.9.0"> + <artifact name="ui-tooling-preview-desktop-1.9.0.jar"> + <sha256 value="ab28211150cb87c46d6737e2c86c9bf44dac642a95ed26db2c200a0e2daf250d" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.ui" name="ui-uikit" version="1.10.3"> + <artifact name="ui-uikit-metadata-1.10.3.jar"> + <sha256 value="1a13b39adf3ad2767f967f764ba0a0d2ed2a2d09eef310f22d2c0304d7bda6cb" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.ui" name="ui-unit" version="1.10.3"> + <artifact name="ui-unit-1.10.3.jar"> + <sha256 value="92107f897d6d868fc33e7e4eddc3e874ca9aeb22d87127646ac8ed2b676bc47a" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.ui" name="ui-unit-desktop" version="1.10.3"> + <artifact name="ui-unit-desktop-1.10.3.jar"> + <sha256 value="f0f3439928b3d9132f07cb2d7a86091696372ebc8354d16b48830b6ce15e8161" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.ui" name="ui-unit-desktop" version="1.9.0"> + <artifact name="ui-unit-desktop-1.9.0.jar"> + <sha256 value="115f7d01367fe1d757f46f3e588257cc12d39a2222a6b3975487ca0eea8616e6" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.ui" name="ui-util" version="1.10.3"> + <artifact name="ui-util-1.10.3.jar"> + <sha256 value="f0adcb93a17f27b5548314207db8aaf98faed62e3db2d22ca98c499ea2bc23ed" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.ui" name="ui-util-desktop" version="1.10.3"> + <artifact name="ui-util-desktop-1.10.3.jar"> + <sha256 value="7bfc93a8cad2974cdfd5a2c817e3083e0e3c48ef99e4dbba51eb98a14c92ed2d" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.compose.ui" name="ui-util-desktop" version="1.9.0"> + <artifact name="ui-util-desktop-1.9.0.jar"> + <sha256 value="9cb002b892372fa203097ea11d2173df3e2710f640ccf78ad8d05f3e9af1f716" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="abi-tools" version="2.3.20"> + <artifact name="abi-tools-2.3.20.jar"> + <sha256 value="47d7c18113d98585065ab524cba1c470b4c369307697ca9d1c810e50b93d0bd1" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="abi-tools-api" version="2.2.10"> + <artifact name="abi-tools-api-2.2.10.jar"> + <sha256 value="de9b34e9bacda1d0f6857d3e01dcd2852c9498f6611a832c5807fbacc7c1ccdc" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="abi-tools-api" version="2.3.20"> + <artifact name="abi-tools-api-2.3.20.jar"> + <sha256 value="53685f5783b0490683898d755abae4d418b6e83ba06134858afddcb5945899e9" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="compose-compiler-gradle-plugin" version="2.3.20"> + <artifact name="compose-compiler-gradle-plugin-2.3.20-gradle813.jar"> + <sha256 value="ba8adc34e77818eead592f45d0723ae7044b889ddd291335b8ce56973273f8c5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="compose-group-mapping" version="2.3.20"> + <artifact name="compose-group-mapping-2.3.20.jar"> + <sha256 value="4e40eb403fff770c7bcc2690a9851a5fe2047dac6c8ae3d06858835a18c06a87" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="fus-statistics-gradle-plugin" version="2.2.10"> + <artifact name="fus-statistics-gradle-plugin-2.2.10-gradle813.jar"> + <sha256 value="5b6e2c379cb83f3eed18094f3de5e1e168f71be73f26b6618efcd39cd90324c3" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="fus-statistics-gradle-plugin" version="2.3.20"> + <artifact name="fus-statistics-gradle-plugin-2.3.20-gradle813.jar"> + <sha256 value="a4f10a3f0ea5ddd1f555a4f706e09ea7f552b3c8522bb1006361dd306e35e76a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-android-extensions-runtime" version="2.2.0"> + <artifact name="kotlin-android-extensions-runtime-2.2.0.jar"> + <sha256 value="b43fa546caf93a17c76ca22ffae8d3cbc3bd615a5daf81588d0472d7932cbed2" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-annotation-processing-gradle" version="2.3.20"> + <artifact name="kotlin-annotation-processing-gradle-2.3.20.jar"> + <sha256 value="0be28c39e03f910cd07d9cea264bf1e6e734e999ba3af90f924c9a1dcd49a0d3" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-atomicfu-compiler-plugin-embeddable" version="2.3.20"> + <artifact name="kotlin-atomicfu-compiler-plugin-embeddable-2.3.20.jar"> + <sha256 value="3bc47407d41f875132729f0a4be874b5677d7d19f83e7976b198a8b2b37e56c6" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-build-statistics" version="2.2.10"> + <artifact name="kotlin-build-statistics-2.2.10.jar"> + <sha256 value="4650ac8d0d3bd1563343d66f03570b437887c8209434dfb261ee3baab2201780" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-build-statistics" version="2.3.20"> + <artifact name="kotlin-build-statistics-2.3.20.jar"> + <sha256 value="a6d27b3c83617652dd065606f98cf59cfbe263f8c20ebe4ebd5a6f2689eb0d4f" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-build-tools-api" version="2.2.10"> + <artifact name="kotlin-build-tools-api-2.2.10.jar"> + <sha256 value="6f5ca321fcc74e0f8b0c73228aabb5e2f3e22badd07eb214209247d5cbf3e13f" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-build-tools-api" version="2.3.20"> + <artifact name="kotlin-build-tools-api-2.3.20.jar"> + <sha256 value="22f1ab223854b949099f6b259cef541d5b58a3643df9a49c4577c63c416e843b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-build-tools-compat" version="2.3.20"> + <artifact name="kotlin-build-tools-compat-2.3.20.jar"> + <sha256 value="44c307b4edd4cac51f960a8134112d664c93076700cda5e866e94d9a4296340e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-build-tools-cri-impl" version="2.3.20"> + <artifact name="kotlin-build-tools-cri-impl-2.3.20.jar"> + <sha256 value="54eced630f28124ccfe2e464e6cacc281e528a8a50a89725721554c9693548fe" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-build-tools-impl" version="2.3.20"> + <artifact name="kotlin-build-tools-impl-2.3.20.jar"> + <sha256 value="9681bc2164a8bd9f6ddf4c085cf4a836b92d27506667d73bab9f6d855336c910" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-compiler-embeddable" version="2.2.0"> + <artifact name="kotlin-compiler-embeddable-2.2.0.jar"> + <sha256 value="b2f743ea5ba12f69e0f35e5d8d46069d74c8e2861087548a7e0e14a784bc4cf1" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-compiler-embeddable" version="2.3.20"> + <artifact name="kotlin-compiler-embeddable-2.3.20.jar"> + <sha256 value="976f989d0b5f5d80e8e8a8ad4b73da0bfc27fdd965b9fa38362b2be79ecc1337" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-compiler-runner" version="2.2.10"> + <artifact name="kotlin-compiler-runner-2.2.10.jar"> + <sha256 value="6ac159f175510bf81989a87b03cf7bb1e790e961f48ad0e0848b58c87785e52c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-compiler-runner" version="2.3.20"> + <artifact name="kotlin-compiler-runner-2.3.20.jar"> + <sha256 value="c069f30a403be70c8152f8aa9f25eccba188eead54263ae02af14421437a2208" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-compose-compiler-plugin-embeddable" version="2.3.20"> + <artifact name="kotlin-compose-compiler-plugin-embeddable-2.3.20.jar"> + <sha256 value="e1024c542f1d021e170cd040e4e1730f2fd76ce8ed76fc9e3496988ca643a2e0" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-daemon-client" version="2.2.10"> + <artifact name="kotlin-daemon-client-2.2.10.jar"> + <sha256 value="2e18ccb9ae8388a32c16c9fee68093d7a204ff714fd3717423824b8b8537f0df" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-daemon-client" version="2.3.20"> + <artifact name="kotlin-daemon-client-2.3.20.jar"> + <sha256 value="c71a7c1be8fbff04e0af45c9ee8cb7a61d8953bca6b8bf225a5719c725a90b44" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-daemon-embeddable" version="2.2.0"> + <artifact name="kotlin-daemon-embeddable-2.2.0.jar"> + <sha256 value="a26cc8e2d8619197cc4d115bea7766e9aa8e0f1e7876ea044ee1b9f305654601" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-daemon-embeddable" version="2.3.20"> + <artifact name="kotlin-daemon-embeddable-2.3.20.jar"> + <sha256 value="8870bab840b8087c96c4ddc06088b4aedf5131c408af3674306304f1f96af3f4" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-gradle-plugin" version="2.2.10"> + <artifact name="kotlin-gradle-plugin-2.2.10-gradle813.jar"> + <sha256 value="bd6b97bd9e563bb57db55a98eaad4306e3f0b39c8a0f9be76e476b22ad51f3b8" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-gradle-plugin" version="2.3.20"> + <artifact name="kotlin-gradle-plugin-2.3.20-gradle813.jar"> + <sha256 value="46e16ee26594f480fecb92c96daae37530e835026b78e37ef3251e957f03f6fb" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-gradle-plugin-annotations" version="2.2.10"> + <artifact name="kotlin-gradle-plugin-annotations-2.2.10.jar"> + <sha256 value="bb84505ddf5f3d6788f0300de99f365c62c98a5cecf2a058278451aa10300036" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-gradle-plugin-annotations" version="2.3.20"> + <artifact name="kotlin-gradle-plugin-annotations-2.3.20.jar"> + <sha256 value="e1662ed747322b63f61d4fadd99ab78104c45eaf09c11a789862415e81c18dc4" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-gradle-plugin-api" version="2.2.10"> + <artifact name="kotlin-gradle-plugin-api-2.2.10-gradle813.jar"> + <sha256 value="9411be7345c4161a97d39796041d3b4c5e9d70cea744404f181199256265bfb5" origin="Generated by Gradle"/> + </artifact> + <artifact name="kotlin-gradle-plugin-api-2.2.10.jar"> + <sha256 value="9411be7345c4161a97d39796041d3b4c5e9d70cea744404f181199256265bfb5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-gradle-plugin-api" version="2.3.20"> + <artifact name="kotlin-gradle-plugin-api-2.3.20-gradle813.jar"> + <sha256 value="c9bc17df69bf39907c597c1e19bec4b479c75aac75fbfd6321e3445b49712e88" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-gradle-plugin-idea" version="2.2.10"> + <artifact name="kotlin-gradle-plugin-idea-2.2.10.jar"> + <sha256 value="ec969c5f0b099f823846232238f9bd64f3d3741e62ea9050ad2e432fad79d0a0" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-gradle-plugin-idea" version="2.3.20"> + <artifact name="kotlin-gradle-plugin-idea-2.3.20.jar"> + <sha256 value="952e73948e2a20d398c26b87a6bb70ccf66418fbaf1527c3515b188ea9d4bd60" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-gradle-plugin-idea-proto" version="2.2.10"> + <artifact name="kotlin-gradle-plugin-idea-proto-2.2.10.jar"> + <sha256 value="efa9a91c17f464d7973de2273b7af8571cd334200baac107b91fc84effc54c1f" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-gradle-plugin-idea-proto" version="2.3.20"> + <artifact name="kotlin-gradle-plugin-idea-proto-2.3.20.jar"> + <sha256 value="e4289cbf9ff49407f041ddc6336e1b577a6ca4cf2be1d2a31338271c13eed3ed" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-gradle-plugin-model" version="2.2.10"> + <artifact name="kotlin-gradle-plugin-model-2.2.10.jar"> + <sha256 value="90be3a572be6cee45e5cd65f216d446b26942b0e4c5aa7b6cb8733a79fd5a84c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-klib-abi-reader" version="2.3.20"> + <artifact name="kotlin-klib-abi-reader-2.3.20.jar"> + <sha256 value="5c0a3aa720408dd2f63e760875dd3f67db7ed16b3f000280e0881c6070ce4f63" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-klib-commonizer-api" version="2.2.10"> + <artifact name="kotlin-klib-commonizer-api-2.2.10.jar"> + <sha256 value="cc6b3278a16df1ea6f7720cdc1126ea216b4ae642f3454dea7a36b7d903aea41" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-klib-commonizer-api" version="2.3.20"> + <artifact name="kotlin-klib-commonizer-api-2.3.20.jar"> + <sha256 value="be9377485412d00f01e78299cb30be4802591c2730342b6ebdafc0894f752743" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-klib-commonizer-embeddable" version="2.3.20"> + <artifact name="kotlin-klib-commonizer-embeddable-2.3.20.jar"> + <sha256 value="e0579663051c6da2b23d95fc2c3a412a76279db83a7901ee86a7e3acf6e71e34" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-metadata-jvm" version="2.1.21"> + <artifact name="kotlin-metadata-jvm-2.1.21.jar"> + <sha256 value="5da27249dd65a3218af2826a30804380a5c02c09f063ce7a0258736388783fc4" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-metadata-jvm" version="2.2.0"> + <artifact name="kotlin-metadata-jvm-2.2.0.jar"> + <sha256 value="501222ae7d63527e55f2e5e645f18d4eff2c19074c85b9bc055866e3ed2b17bf" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-metadata-jvm" version="2.3.20"> + <artifact name="kotlin-metadata-jvm-2.3.20.jar"> + <sha256 value="17264b9690feed34aa8b8e7d556fb2e7951f6800462f117243fba96201014f7d" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-native-utils" version="2.2.10"> + <artifact name="kotlin-native-utils-2.2.10.jar"> + <sha256 value="98c7231c8561fe7befb35500f270b150e1ee0e833bfb0309163384f14878dde6" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-native-utils" version="2.3.20"> + <artifact name="kotlin-native-utils-2.3.20.jar"> + <sha256 value="4319c2764795efbdff2b78ee95455157d7af0b9155698baa1ba52a6abe3abf2d" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-parcelize-compiler" version="2.3.20"> + <artifact name="kotlin-parcelize-compiler-2.3.20.jar"> + <sha256 value="abfeabf066cf8b2cd51986ca3b660a38bf174562b59c5e97ee7b4ccf8dc72ce6" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-parcelize-runtime" version="2.2.0"> + <artifact name="kotlin-parcelize-runtime-2.2.0.jar"> + <sha256 value="ffd266a80d58ea089f8ae78cfcc81f19f276ef491fb05c0777bdc99f22ae84a1" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-parcelize-runtime" version="2.3.20"> + <artifact name="kotlin-parcelize-runtime-2.3.20.jar"> + <sha256 value="ca84154e2701ebe146c832163d708d1d703159b910b9f611a10fb25c5ba90279" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-reflect" version="1.6.10"> + <artifact name="kotlin-reflect-1.6.10.jar"> + <sha256 value="3277ac102ae17aad10a55abec75ff5696c8d109790396434b496e75087854203" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-reflect" version="1.8.21"> + <artifact name="kotlin-reflect-1.8.21.jar"> + <sha256 value="8a6cd5a3cf092acee274ce2c444dc36eefdb631579859dd4d857b3309a529c91" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-reflect" version="2.1.20"> + <artifact name="kotlin-reflect-2.1.20.jar"> + <sha256 value="419778f2b7a826bad6ee2ca1e4bdebe639ab306d2904fa3ef2a308ecfaab3811" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-reflect" version="2.1.21"> + <artifact name="kotlin-reflect-2.1.21.jar"> + <sha256 value="bcd75a36ca4ad8e06117214ed807f8dea2fe61a71e07f91ca14f4335024b8463" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-reflect" version="2.2.10"> + <artifact name="kotlin-reflect-2.2.10.jar"> + <sha256 value="c48db4f8cd1bfd67f72d59255065fb41bfda43ca2942dac4d9deb897aa126ba4" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-reflect" version="2.2.21"> + <artifact name="kotlin-reflect-2.2.21.jar"> + <sha256 value="44380abf37d245ce5c0f294f43512d1c39a59642bfa463922c74e96877cf49f8" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-script-runtime" version="2.2.0"> + <artifact name="kotlin-script-runtime-2.2.0.jar"> + <sha256 value="4ed97fd1e0c9bb1d0948ed5e63cc91456313a59518295b92b2c1514aef556150" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-script-runtime" version="2.3.20"> + <artifact name="kotlin-script-runtime-2.3.20.jar"> + <sha256 value="6fcdb7da6e65cf8cc43e5aabab94bdcc48825e7933686f8a1bf694eb88f8e00e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-scripting-common" version="2.3.20"> + <artifact name="kotlin-scripting-common-2.3.20.jar"> + <sha256 value="b4c239d87b23be182f05bf57cf5e81f95d70bf7ef4a989eb98b73389c6ebc89f" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-scripting-compiler-embeddable" version="2.3.20"> + <artifact name="kotlin-scripting-compiler-embeddable-2.3.20.jar"> + <sha256 value="bd55f8f61bd41cec529656c2d47784bcba5ac260e94f4156c272c314966eef59" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-scripting-compiler-impl-embeddable" version="2.3.20"> + <artifact name="kotlin-scripting-compiler-impl-embeddable-2.3.20.jar"> + <sha256 value="806fd63b3bcec5e6b5eeb1a0843d6ab094d55786a8465e474a2439295a1c0a25" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-scripting-jvm" version="2.3.20"> + <artifact name="kotlin-scripting-jvm-2.3.20.jar"> + <sha256 value="7047ce0353f49125c3c746792d4f76c3265d7b72fe62694b7eec075bba02528c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-serialization" version="2.3.20"> + <artifact name="kotlin-serialization-2.3.20-gradle813.jar"> + <sha256 value="fb84eef558f1e4dc628b58009c290a254d5cd34c11cc46da9764c6e18d33cedb" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-serialization-compiler-plugin-embeddable" version="2.3.20"> + <artifact name="kotlin-serialization-compiler-plugin-embeddable-2.3.20.jar"> + <sha256 value="178edb62cda3e255fc80e270656f2848b6e0752f7b4b4c27e4a88cc537bea674" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-stdlib" version="1.8.21"> + <artifact name="kotlin-stdlib-1.8.21.jar"> + <sha256 value="042a1cd1ac976cdcfe5eb63f1d8e0b0b892c9248e15a69c8cfba495d546ea52a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-stdlib" version="1.9.0"> + <artifact name="kotlin-stdlib-1.9.0.jar"> + <sha256 value="35aeffbe2db5aa446072cee50fcee48b7fa9e2fc51ca37c0cc7d7d0bc39d952e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-stdlib" version="2.1.21"> + <artifact name="kotlin-stdlib-2.1.21.jar"> + <sha256 value="263bdc679e1f62012db7b091796279b6d71cf36f4797a98ff1ace05835f201c8" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-stdlib" version="2.2.0"> + <artifact name="kotlin-stdlib-2.2.0.jar"> + <sha256 value="65d12d85a3b865c160db9147851712a64b10dadd68b22eea22a95bf8a8670dca" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-stdlib" version="2.2.10"> + <artifact name="kotlin-stdlib-2.2.10.jar"> + <sha256 value="9c67cc79efd6b9215b49d2a4308f5f3433537376c7c88e89bdd6729bd096e61a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-stdlib" version="2.2.21"> + <artifact name="kotlin-stdlib-2.2.21.jar"> + <sha256 value="6558a3d233da56a20934b32159f9db5f86ed5816ef098f78a2c223dc6abb79dd" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-stdlib" version="2.3.0"> + <artifact name="kotlin-stdlib-2.3.0.jar"> + <sha256 value="887587c91713250ad52fe14ad9166d042c33835049890e9437f355ffc5a195b1" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-stdlib" version="2.3.20"> + <artifact name="kotlin-stdlib-2.3.20-all.jar"> + <sha256 value="2197ae07788b09d03d5f3f2a2d52073859e352481bb6feb4335e391093116270" origin="Generated by Gradle"/> + </artifact> + <artifact name="kotlin-stdlib-2.3.20.jar"> + <sha256 value="0ae12504a5040ebaf37703908483420d1a5624dd1d93f357665f8c77c848a01e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-stdlib-common" version="1.8.21"> + <artifact name="kotlin-stdlib-common-1.8.21.jar"> + <sha256 value="6a44c9ecc9d7754d9e943fb1e3588c74d4a3f1785be51074f49d6c5723682a73" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-stdlib-common" version="1.9.0"> + <artifact name="kotlin-stdlib-common-1.9.0.jar"> + <sha256 value="283274204bd7c020789ec46f8f8e72af4244d7f550b3392a57e5ca006ad7aa2c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-stdlib-jdk7" version="1.8.0"> + <artifact name="kotlin-stdlib-jdk7-1.8.0.jar"> + <sha256 value="4c889d1d9803f5f2eb6c1592a6b7e62369ac7660c9eee15aba16fec059163666" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-stdlib-jdk7" version="1.8.20"> + <artifact name="kotlin-stdlib-jdk7-1.8.20.jar"> + <sha256 value="af1ec40c3b951afdcc0c2a0173c7b81763c5281c2d5bafbf0a8544a24c5dcc0c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-stdlib-jdk7" version="1.8.21"> + <artifact name="kotlin-stdlib-jdk7-1.8.21.jar"> + <sha256 value="33d148db0e11debd0d90677d28242bced907f9c77730000fd597867089039d86" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-stdlib-jdk7" version="2.0.0"> + <artifact name="kotlin-stdlib-jdk7-2.0.0.jar"> + <sha256 value="dd958064f946b01f745365c2efa11e4c5812a22e26b6caa4433f207fb5b4a5c5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-stdlib-jdk7" version="2.1.21"> + <artifact name="kotlin-stdlib-jdk7-2.1.21.jar"> + <sha256 value="966846172e1052cb5b34d7b34647a64799b33f6da816509f7825c56f55895234" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-stdlib-jdk7" version="2.2.10"> + <artifact name="kotlin-stdlib-jdk7-2.2.10.jar"> + <sha256 value="cf95eccc6cc784dff479dee0b8834f3584b93292cc5d91972e82f5d7b9e13e3b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-stdlib-jdk7" version="2.2.20"> + <artifact name="kotlin-stdlib-jdk7-2.2.20.jar"> + <sha256 value="3bd26ecb6d12978c5c4e0b41f76c9ff551fac2a5e6268427a9d2a0cdf8a5ad91" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-stdlib-jdk8" version="1.8.0"> + <artifact name="kotlin-stdlib-jdk8-1.8.0.jar"> + <sha256 value="05b62804441b0c9a1920b6b7d5cf7329a4e24b6258478e32b1f046ca01900946" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-stdlib-jdk8" version="1.8.20"> + <artifact name="kotlin-stdlib-jdk8-1.8.20.jar"> + <sha256 value="e398b67977622718bf18ff99b739c7d9da060f33fb458a2e25203221c16af010" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-stdlib-jdk8" version="1.8.21"> + <artifact name="kotlin-stdlib-jdk8-1.8.21.jar"> + <sha256 value="3db752a30074f06ee6c57984aa6f27da44f4d2bbc7f5442651f6988f1cb2b7d7" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-stdlib-jdk8" version="2.0.0"> + <artifact name="kotlin-stdlib-jdk8-2.0.0.jar"> + <sha256 value="92035a0fa8b97a97bb430d30ba03e5ad51f4cfa839cf1559e55245cba735aa94" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-stdlib-jdk8" version="2.1.21"> + <artifact name="kotlin-stdlib-jdk8-2.1.21.jar"> + <sha256 value="87b4f956de27401446227e474ac7a31acff0d0a8087160c54288c1e6f46a67e6" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-stdlib-jdk8" version="2.2.10"> + <artifact name="kotlin-stdlib-jdk8-2.2.10.jar"> + <sha256 value="8974bfdd08b1d81843fe8d11f0729ab6e5b3c1f88d671ebe0c006358129ce149" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-stdlib-jdk8" version="2.2.20"> + <artifact name="kotlin-stdlib-jdk8-2.2.20.jar"> + <sha256 value="c314177935d8dc2eda879507117f25d6de56f6c57ede99416b14cd622bb9e09d" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-test" version="2.1.21"> + <artifact name="kotlin-test-2.1.21.jar"> + <sha256 value="0177d6d1ffdb2fa0d76c26c2228c991de537dbd89f1766624b43ab09d3da7643" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-test" version="2.3.20"> + <artifact name="kotlin-test-2.3.20-all.jar"> + <sha256 value="51c1158027ab9663f8420cfcc8939b3aeb05407b9082fce7c2e3f2d7813ed2b4" origin="Generated by Gradle"/> + </artifact> + <artifact name="kotlin-test-2.3.20.jar"> + <sha256 value="d6c9ccf82f67e6cf7fdaf9e0cea419dac4dfa58620a1653d3dba45f544a289ac" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-test-junit" version="2.3.20"> + <artifact name="kotlin-test-junit-2.3.20.jar"> + <sha256 value="a1c7f029c044553f1d425ec5810ca7997325e8c181fe92cce0cf0d4a2b0be727" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-tooling-core" version="2.2.10"> + <artifact name="kotlin-tooling-core-2.2.10.jar"> + <sha256 value="74014ec4f3ef78ce7da7e3e6964f2c526a3121d5c58fef8ca2979e5f344582f4" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-tooling-core" version="2.3.20"> + <artifact name="kotlin-tooling-core-2.3.20.jar"> + <sha256 value="367142781299bc0f9120c1deec0e62934a1af9ea7f01aaa9c5a5354dc5d8d7d9" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-util-io" version="2.2.10"> + <artifact name="kotlin-util-io-2.2.10.jar"> + <sha256 value="682be217196dd053860f5bea804a0a11fcb777e55eb8a79512659424808d65d3" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-util-io" version="2.3.20"> + <artifact name="kotlin-util-io-2.3.20.jar"> + <sha256 value="0e76e7471e91c53ea68d2d24ef1f29fb592ac5fbb0d1d10faa916430eff3daca" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-util-klib" version="2.2.10"> + <artifact name="kotlin-util-klib-2.2.10.jar"> + <sha256 value="9e6d04a60e9b63a51741293c2ec181ddb78b92104d4a10647d4371045a037041" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-util-klib" version="2.3.20"> + <artifact name="kotlin-util-klib-2.3.20.jar"> + <sha256 value="9562b8d3b7a04beba2b14c05671e713859ea54bbc0a2107e65b2bcf273fa8448" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-util-klib-metadata" version="2.2.10"> + <artifact name="kotlin-util-klib-metadata-2.2.10.jar"> + <sha256 value="2a07067dcc13481bad4f45e0858123ab930ee04329f86192b9b2f9989f814560" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlin" name="kotlin-util-klib-metadata" version="2.3.20"> + <artifact name="kotlin-util-klib-metadata-2.3.20.jar"> + <sha256 value="a8994e0bca6846dfb19f458c4cc15d7b13779ca1b0d9f34880b5ff2c2a2b73b3" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="atomicfu" version="0.27.0"> + <artifact name="atomicfu-metadata-0.27.0.jar"> + <sha256 value="a2237ad91a3d36494ffb2556f4c59889c81f7ae3b5efb445d12ecd090b37c6e9" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="atomicfu" version="0.29.0"> + <artifact name="atomicfu-metadata-0.29.0.jar"> + <sha256 value="518a8ba8a35973e7b1c5c91bd04bd78724adb2bf4df1169262241f18dcbf2fe3" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="atomicfu-gradle-plugin" version="0.29.0"> + <artifact name="atomicfu-gradle-plugin-0.29.0.jar"> + <sha256 value="7a1adf0467727ef61b6ac1602185eceeb7a94251cc2f7001ffac6720a80c9f4e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="atomicfu-jvm" version="0.22.0"> + <artifact name="atomicfu-jvm-0.22.0.jar"> + <sha256 value="2da073727f3ab5e5584e74c12e11519c908ae2dfaf6aeb25ded42b6682297882" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="atomicfu-jvm" version="0.23.2"> + <artifact name="atomicfu-jvm-0.23.2.jar"> + <sha256 value="101ff43ff563fca167af5ade98c3b69bf569010eab745013b84d8955034d3b3c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="atomicfu-jvm" version="0.29.0"> + <artifact name="atomicfu-jvm-0.29.0.jar"> + <sha256 value="97cd462f8e8ab92571ab8805070e4450c52cb1ad63c224208f71a10943a01e46" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="atomicfu-transformer" version="0.29.0"> + <artifact name="atomicfu-transformer-0.29.0.jar"> + <sha256 value="1d242d18fbdf4dcdfd2fc8969ca0d7e4edacf15bf8bd8364bc63b93b069cbe45" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-collections-immutable" version="0.4.0"> + <artifact name="kotlinx-collections-immutable-metadata-0.4.0.jar"> + <sha256 value="3d84dbd523df46ba71d8130d47e22573a903d398cf740c4ac531487a329f7706" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-collections-immutable-jvm" version="0.4.0"> + <artifact name="kotlinx-collections-immutable-jvm-0.4.0.jar"> + <sha256 value="d767014ad0c9a27d27d26fd38e7afa030aee0d141338f108781ff02ecf2fdab5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-android" version="1.10.2"> + <artifact name="kotlinx-coroutines-android-1.10.2.jar"> + <sha256 value="e713f1f874244115a07571065cffa0f24f5e78300e9720fea16de3af1d75fd41" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-android" version="1.9.0"> + <artifact name="kotlinx-coroutines-android-1.9.0.jar"> + <sha256 value="bd783acd2f9738845d58380f46f45b5cde95d0cb03027d56725338b26bfc4d72" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-core" version="1.10.2"> + <artifact name="kotlinx-coroutines-core-metadata-1.10.2.jar"> + <sha256 value="319b653009d49c70982f98df29cc84fc7025b092cb0571c8e7532e3ad4366dae" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-core-jvm" version="1.10.2"> + <artifact name="kotlinx-coroutines-core-jvm-1.10.2.jar"> + <sha256 value="5ca175b38df331fd64155b35cd8cae1251fa9ee369709b36d42e0a288ccce3fd" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-core-jvm" version="1.7.3"> + <artifact name="kotlinx-coroutines-core-jvm-1.7.3.jar"> + <sha256 value="1ab3acc38f3e7355c4f9d1ec62107a46fa73c899f3070d055e5d4373dfe67e12" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-core-jvm" version="1.8.0"> + <artifact name="kotlinx-coroutines-core-jvm-1.8.0.jar"> + <sha256 value="9860906a1937490bf5f3b06d2f0e10ef451e65b95b269f22daf68a3d1f5065c5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-core-jvm" version="1.9.0"> + <artifact name="kotlinx-coroutines-core-jvm-1.9.0.jar"> + <sha256 value="ad89c2892235e670f222d819cb3d81188143cb19a05b59df9889ae4269f5c70a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-reactive" version="1.10.2"> + <artifact name="kotlinx-coroutines-reactive-1.10.2.jar"> + <sha256 value="12a7bd4fb4e6a1a5a55f9a32ce4beffda543036cf14fd10a077285381a9dfafe" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-rx2" version="1.10.2"> + <artifact name="kotlinx-coroutines-rx2-1.10.2.jar"> + <sha256 value="36e5fa6eec00059d52dab944d60fed9a00fa040ae2067accff223e489d96e418" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-slf4j" version="1.10.2"> + <artifact name="kotlinx-coroutines-slf4j-1.10.2.jar"> + <sha256 value="d65dee3cafa6f7bfaefedb493fc68b5c63abe750734fb8af92fac7a0d3101457" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-swing" version="1.10.2"> + <artifact name="kotlinx-coroutines-swing-1.10.2.jar"> + <sha256 value="02bdb85f20ec08004429abf6887e8d0e40f3ab637d7462f817f0f8abbe7d1eb5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-test" version="1.10.2"> + <artifact name="kotlinx-coroutines-test-metadata-1.10.2.jar"> + <sha256 value="fadbe04fbda7a27728770d8eaecbdec0a9b0b29693c20cbea77655d783d8bd78" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-test-jvm" version="1.10.2"> + <artifact name="kotlinx-coroutines-test-jvm-1.10.2.jar"> + <sha256 value="590a549f8c1db590c9d98a8a20424a1f581a34162a369e6a6bd884ce7d36d3d7" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-test-jvm" version="1.9.0"> + <artifact name="kotlinx-coroutines-test-jvm-1.9.0.jar"> + <sha256 value="68b87fa90db3dab1e794ff6078364087c07f87e5e4a4d0c8d3272a222ee8fe7e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-datetime" version="0.7.1"> + <artifact name="kotlinx-datetime-metadata-0.7.1.jar"> + <sha256 value="b3d809d21a41b72ae9de0b32dc5aa194857b17b3f1ee4107bfce33484fa05d05" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-datetime" version="0.7.1-0.6.x-compat"> + <artifact name="kotlinx-datetime-metadata-0.7.1-0.6.x-compat.jar"> + <sha256 value="329ff2c68b384ea1a0c4d40d49c75f333bb4a4222d690117e63ea3402bb67488" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-datetime-jvm" version="0.7.1"> + <artifact name="kotlinx-datetime-jvm-0.7.1.jar"> + <sha256 value="3b8b98657c9aff3be7f6b4b575e9f3fb9a3a1f452a801da0f438901734acdade" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-datetime-jvm" version="0.7.1-0.6.x-compat"> + <artifact name="kotlinx-datetime-jvm-0.7.1-0.6.x-compat.jar"> + <sha256 value="cf9cdf7b3074044657a1a80bc1bb5280b58545a967ac7fe42b1aa3cf93305714" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-io-bytestring" version="0.8.2"> + <artifact name="kotlinx-io-bytestring-metadata-0.8.2.jar"> + <sha256 value="8349804cf59bb0e855399d02f7bdbea1104a428e33777e971bf31d1bbd250d3f" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-io-bytestring-jvm" version="0.8.2"> + <artifact name="kotlinx-io-bytestring-jvm-0.8.2.jar"> + <sha256 value="3da805e9da2ff3cb119f744dcd11de6a18e32a5b933518f17418ba5795cfa775" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-io-core" version="0.8.2"> + <artifact name="kotlinx-io-core-metadata-0.8.2.jar"> + <sha256 value="28003ebe5f7c6d0ac65b9dfea34473887e3df29f7dd5f904a45d96c4210b67c2" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-io-core-jvm" version="0.8.2"> + <artifact name="kotlinx-io-core-jvm-0.8.2.jar"> + <sha256 value="610770cc855edf1c57d9fcd7c69fd040af57adaf8834505f91805de680783d13" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-serialization-core" version="1.10.0"> + <artifact name="kotlinx-serialization-core-metadata-1.10.0.jar"> + <sha256 value="1aeb2fccba0b5389fd6dec815a68d598f96a3d12bc994b74b7fb27a33976dac9" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-serialization-core" version="1.7.3"> + <artifact name="kotlinx-serialization-core-metadata-1.7.3.jar"> + <sha256 value="4850682e0e5976862695330d84eb8699f1dc5d50849f625263995cc88bc6f37b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-serialization-core" version="1.9.0"> + <artifact name="kotlinx-serialization-core-metadata-1.9.0.jar"> + <sha256 value="79ca59dee563f9cfc05e6673bd40c3c940209fc6b050067ef7e6d9da3eebb256" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-serialization-core-jvm" version="1.10.0"> + <artifact name="kotlinx-serialization-core-jvm-1.10.0.jar"> + <sha256 value="14d6f27ce28f61ebc4a516d562f911b7bc01cfbe5397fb884c45ea0db044c635" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-serialization-core-jvm" version="1.4.1"> + <artifact name="kotlinx-serialization-core-jvm-1.4.1.jar"> + <sha256 value="eba7f1c854296e4ce1418fb01360f8f10c5683e7c45aa3472018417a067636f3" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-serialization-core-jvm" version="1.7.3"> + <artifact name="kotlinx-serialization-core-jvm-1.7.3.jar"> + <sha256 value="f0adde45864144475385cf4aa7e0b7feb27f61fcf9472665ed98cc971b06b1eb" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-serialization-core-jvm" version="1.9.0"> + <artifact name="kotlinx-serialization-core-jvm-1.9.0.jar"> + <sha256 value="1f0afa172110e45a7231ef1b44ae8fd84c1ebaff96f3fc3ad68ef8c48120b59c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-serialization-json" version="1.10.0"> + <artifact name="kotlinx-serialization-json-metadata-1.10.0.jar"> + <sha256 value="cb3f264c04f7ed056897f861f7a5959f9bdaa431e4614d9bb67e28326c0afc48" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-serialization-json" version="1.9.0"> + <artifact name="kotlinx-serialization-json-metadata-1.9.0.jar"> + <sha256 value="f0d4643605362ab158c11b20f6c8be1726023bb931b9ead5ffa5a14e2338dfde" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-serialization-json-io" version="1.9.0"> + <artifact name="kotlinx-serialization-json-io-metadata-1.9.0.jar"> + <sha256 value="904a1aa536ee644e63f31957b16459137b9e1506b040e999a65298e8641e7cad" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-serialization-json-io-jvm" version="1.10.0"> + <artifact name="kotlinx-serialization-json-io-jvm-1.10.0.jar"> + <sha256 value="6fc1a9f0e2bbc2d48c6602ce5ad2d83ef6ed6cf3a349c90f5691e824cf0b4821" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-serialization-json-jvm" version="1.10.0"> + <artifact name="kotlinx-serialization-json-jvm-1.10.0.jar"> + <sha256 value="af1e3e1e8ee3176468e1ec729df853b2066071de94a84c412ad9fa135cb37f3a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-serialization-json-jvm" version="1.4.1"> + <artifact name="kotlinx-serialization-json-jvm-1.4.1.jar"> + <sha256 value="af604c46737121d4225fdb60ef0e17766a3c94b7c1c9ef76b4e3a5c7733d557e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-serialization-json-jvm" version="1.9.0"> + <artifact name="kotlinx-serialization-json-jvm-1.9.0.jar"> + <sha256 value="d94cc34cae39246a1af74fda63f9c4812ce12216ef641d5fa3bbbb539a6922d8" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.runtime" name="jbr-api" version="1.5.0"> + <artifact name="jbr-api-1.5.0.jar"> + <sha256 value="657ede7d7f8e175c909b23caa10fcd4d4a511304fd938aa9cc8457b4378950d5" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.skiko" name="skiko" version="0.9.37.4"> + <artifact name="skiko-metadata-0.9.37.4.jar"> + <sha256 value="7273db2b088435a30aa6d3cf465f1c82d091e1c538debd7717a3978ab3f897da" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.skiko" name="skiko-awt" version="0.9.22.2"> + <artifact name="skiko-awt-0.9.22.2.jar"> + <sha256 value="8cc7ed6c4ae2934cddf6502d17df30f3d1c235898c820b5062b930fea4b9d63c" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.skiko" name="skiko-awt" version="0.9.37.4"> + <artifact name="skiko-awt-0.9.37.4.jar"> + <sha256 value="9e859aeb982623fab156ba6671c78255f7f5e1b73334f3de7932440fed6455df" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.skiko" name="skiko-awt-runtime-linux-x64" version="0.9.22.2"> + <artifact name="skiko-awt-runtime-linux-x64-0.9.22.2.jar"> + <sha256 value="4b3c75f6c8aa60b88362c3dfd8d73f85d923735f3b15bf675c4981c26efe85d4" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.skiko" name="skiko-awt-runtime-linux-x64" version="0.9.37.4"> + <artifact name="skiko-awt-runtime-linux-x64-0.9.37.4.jar"> + <sha256 value="ec796df135d980bbb1740e789fe8668a8184df243e4d1c39997750303c76f13b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jetbrains.skiko" name="skiko-awt-runtime-macos-arm64" version="0.9.22.2"> + <artifact name="skiko-awt-runtime-macos-arm64-0.9.22.2.jar"> + <sha256 value="89a31521faf9985bbd4858c863283d1c38ea5d78d177bdb39aa3203285f2fd04" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jetbrains.skiko" name="skiko-awt-runtime-macos-arm64" version="0.9.37.4"> + <artifact name="skiko-awt-runtime-macos-arm64-0.9.37.4.jar"> + <sha256 value="5d4d47555313d387d742e5225b3f9daffcffd61cb9c3f1db56fc10963cf4280b" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.jlleitschuh.gradle" name="ktlint-gradle" version="13.1.0"> + <artifact name="ktlint-gradle-13.1.0.jar"> + <sha256 value="0802df585bb7c28f166bf2023687081b2c601ada35ead3ac3ded247a30899efd" origin="Generated by Gradle" reason="Artifact is not signed"/> + </artifact> + </component> + <component group="org.jsoup" name="jsoup" version="1.12.2"> + <artifact name="jsoup-1.12.2.jar"> + <sha256 value="1f9b6f110f498bb5796cbe2cdd36a83ae242619c816821db23ed088a30347b4a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jspecify" name="jspecify" version="1.0.0"> + <artifact name="jspecify-1.0.0.jar"> + <sha256 value="1fad6e6be7557781e4d33729d49ae1cdc8fdda6fe477bb0cc68ce351eafdfbab" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.junit.jupiter" name="junit-jupiter" version="6.0.3"> + <artifact name="junit-jupiter-6.0.3.jar"> + <sha256 value="784b65815f479a0c99a9d3a573b142e2a525efb6025d97f751b19e72f90aeda3" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.junit.jupiter" name="junit-jupiter-api" version="5.11.2"> + <artifact name="junit-jupiter-api-5.11.2.jar"> + <sha256 value="0a68106f390138230c1639b87f1ff854c680113ba4876997cb0483f53457fb5c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.junit.jupiter" name="junit-jupiter-api" version="6.0.3"> + <artifact name="junit-jupiter-api-6.0.3.jar"> + <sha256 value="d655d7e6f0c7ae07f10a2f3bbaaebb6d30e9b26204a068ad9e9b3950aa28792c" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.junit.jupiter" name="junit-jupiter-engine" version="5.11.2"> + <artifact name="junit-jupiter-engine-5.11.2.jar"> + <sha256 value="d1e5647ce985c5d70d53e04cf23437e4ee8ecabb118c9fda85d0b08b7f9f5f15" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.junit.jupiter" name="junit-jupiter-engine" version="6.0.3"> + <artifact name="junit-jupiter-engine-6.0.3.jar"> + <sha256 value="1e2fab61ad27ea08fc7c70dd9677cf8c6d1ae5434d42dcfdd633b12c7e7c04d0" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.junit.jupiter" name="junit-jupiter-params" version="6.0.3"> + <artifact name="junit-jupiter-params-6.0.3.jar"> + <sha256 value="cf2947e2302b9f8c8a059259a277881c1cadae8fbc2514c16a925cfeb7beb2e5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.junit.platform" name="junit-platform-commons" version="1.11.2"> + <artifact name="junit-platform-commons-1.11.2.jar"> + <sha256 value="03ce3c6054c011a26953a065da6a48489d1fbc1995e4ca3c6d700293e71b5800" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.junit.platform" name="junit-platform-commons" version="6.0.3"> + <artifact name="junit-platform-commons-6.0.3.jar"> + <sha256 value="39f262d09c3d52719fe0b77f080e90a3695e285d779a41b232e17963ae5da200" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.junit.platform" name="junit-platform-engine" version="1.11.2"> + <artifact name="junit-platform-engine-1.11.2.jar"> + <sha256 value="4e625500397631304726da32f7ae599ce3bfc71d4ea11947de69dbbdf0fc4409" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.junit.platform" name="junit-platform-engine" version="6.0.3"> + <artifact name="junit-platform-engine-6.0.3.jar"> + <sha256 value="491e9e4f745f161b8a8e4186a1a7c6a450ea12c70930c9aedae427215301d947" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.jvnet.staxex" name="stax-ex" version="1.8.1"> + <artifact name="stax-ex-1.8.1.jar"> + <sha256 value="20522549056e9e50aa35ef0b445a2e47a53d06be0b0a9467d704e2483ffb049a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.kobjects.ktxml" name="core" version="1.0.0"> + <artifact name="core-metadata-1.0.0.jar"> + <sha256 value="3537a45f36f02a77a89abb693ccfc878d1076752c6d11dc2be6dbd7c642099f9" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.kobjects.ktxml" name="core-jvm" version="1.0.0"> + <artifact name="core-jvm-1.0.0.jar"> + <sha256 value="7dc65cdbb95ba220a392ecbb9570dd5232bff42a283ec9cf123f66fa5bcf9f8b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.maplibre.gl" name="android-plugin-annotation-v9" version="3.0.2"> + <artifact name="android-plugin-annotation-v9-3.0.2.aar"> + <sha256 value="6b848482def1815f2b01ed5740c934838f167028846c5451a72ebc92bdb4031e" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.maplibre.gl" name="android-plugin-markerview-v9" version="3.0.2"> + <artifact name="android-plugin-markerview-v9-3.0.2.aar"> + <sha256 value="58e6f94f33a6419e018b2edcc70224751df8d31731587f733d172f300d5b7100" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.maplibre.gl" name="android-sdk" version="11.13.5"> + <artifact name="android-sdk-11.13.5.aar"> + <sha256 value="ee2eac05c1560e9281127190ddb65e4029180a8c923bd8587daff9b9447ac771" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.maplibre.gl" name="android-sdk-geojson" version="6.0.1"> + <artifact name="android-sdk-geojson-6.0.1.jar"> + <sha256 value="0c4e4258ce258da9740c17c76f3ae90f89fcfa5822a797f5d466b35410571363" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.maplibre.gl" name="android-sdk-turf" version="6.0.1"> + <artifact name="android-sdk-turf-6.0.1.jar"> + <sha256 value="c0fd543d17fbd3b7c2e946515caf2d53b602f0eac1438ad4dca731d9a508af79" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.maplibre.gl" name="maplibre-android-gestures" version="0.0.4"> + <artifact name="maplibre-android-gestures-0.0.4.aar"> + <sha256 value="44ff4fc2dd8bfbcf54a06f219e7ab40a2062eb6b4a10dcbf1f4e02b4a30c61af" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.mockito" name="mockito-core" version="5.20.0"> + <artifact name="mockito-core-5.20.0.jar"> + <sha256 value="d1a96d252128d3a4247cfd8a2e76412efa3cc103977be17933c942117a24f374" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.mockito" name="mockito-inline" version="5.2.0"> + <artifact name="mockito-inline-5.2.0.jar"> + <sha256 value="ee52e1c299a632184fba274a9370993e09140429f5e516e6c5570fd6574b297f" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.mockito.kotlin" name="mockito-kotlin" version="6.1.0"> + <artifact name="mockito-kotlin-6.1.0.jar"> + <sha256 value="efd8f8febafdccb63ee44fc9c7bca22fa642a03b1153f8c7a3391ddc64cdd6ac" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.mozilla" name="rhino" version="1.7.10"> + <artifact name="rhino-1.7.10.jar"> + <sha256 value="38eb3000cf56b8c7559ee558866a768eebcbf254174522d6404b7f078f75c2d4" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.objenesis" name="objenesis" version="3.3"> + <artifact name="objenesis-3.3.jar"> + <sha256 value="02dfd0b0439a5591e35b708ed2f5474eb0948f53abf74637e959b8e4ef69bfeb" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.opentest4j" name="opentest4j" version="1.3.0"> + <artifact name="opentest4j-1.3.0.jar"> + <sha256 value="48e2df636cab6563ced64dcdff8abb2355627cb236ef0bf37598682ddf742f1b" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.ow2.asm" name="asm" version="9.4"> + <artifact name="asm-9.4.jar"> + <sha256 value="39d0e2b3dc45af65a09b097945750a94a126e052e124f93468443a1d0e15f381" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.ow2.asm" name="asm" version="9.5"> + <artifact name="asm-9.5.jar"> + <sha256 value="b62e84b5980729751b0458c534cf1366f727542bb8d158621335682a460f0353" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.ow2.asm" name="asm" version="9.8"> + <artifact name="asm-9.8.jar"> + <sha256 value="876eab6a83daecad5ca67eb9fcabb063c97b5aeb8cf1fca7a989ecde17522051" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.ow2.asm" name="asm" version="9.9"> + <artifact name="asm-9.9.jar"> + <sha256 value="03d99a74ad1ee5c71334ef67437f4ef4fe3488caa7c96d8645abc73c8e2017d4" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.ow2.asm" name="asm" version="9.9.1"> + <artifact name="asm-9.9.1.jar"> + <sha256 value="6f3828a215c920059a5efa2fb55c233d6c54ec5cadca99ce1b1bdd10077c7ddd" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.ow2.asm" name="asm-analysis" version="9.4"> + <artifact name="asm-analysis-9.4.jar"> + <sha256 value="7b5f8c5e3bf341b5bb570d26f379e3fdebdc32732187159c42479164053f373d" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.ow2.asm" name="asm-analysis" version="9.8"> + <artifact name="asm-analysis-9.8.jar"> + <sha256 value="e640732fbcd3c6271925a504f125e38384688f4dfbbf92c8622dfcee0d09edb9" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.ow2.asm" name="asm-commons" version="9.4"> + <artifact name="asm-commons-9.4.jar"> + <sha256 value="0c128a9ec3f33c98959272f6d16cf14247b508f58951574bcdbd2b56d6326364" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.ow2.asm" name="asm-commons" version="9.5"> + <artifact name="asm-commons-9.5.jar"> + <sha256 value="72eee9fbafb9de8d9463f20dd584a48ceeb7e5152ad4c987bfbe17dd4811c9ae" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.ow2.asm" name="asm-commons" version="9.8"> + <artifact name="asm-commons-9.8.jar"> + <sha256 value="3301a1c1cb4c59fcc5292648dac1d7c5aed4c0f067dfbe88873b8cdfe77404f4" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.ow2.asm" name="asm-commons" version="9.9"> + <artifact name="asm-commons-9.9.jar"> + <sha256 value="db2f6f26150bbe7c126606b4a1151836bcc22a1e05a423b3585698bece995ff8" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.ow2.asm" name="asm-tree" version="9.4"> + <artifact name="asm-tree-9.4.jar"> + <sha256 value="c42d479cf24566a21eb20af7eeaeef4e86bdb4a886306cf72f483b65e75b2acf" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.ow2.asm" name="asm-tree" version="9.5"> + <artifact name="asm-tree-9.5.jar"> + <sha256 value="3c33a648191079aeaeaeb7c19a49b153952f9e40fe86fbac5205554ddd9acd94" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.ow2.asm" name="asm-tree" version="9.8"> + <artifact name="asm-tree-9.8.jar"> + <sha256 value="14b7880cb7c85eed101e2710432fc3ffb83275532a6a894dc4c4095d49ad59f1" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.ow2.asm" name="asm-tree" version="9.9"> + <artifact name="asm-tree-9.9.jar"> + <sha256 value="42178f3775c9c63f9e5e1446747d29b4eca4d91bd6e75e5c43cfa372a47d38c6" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.ow2.asm" name="asm-tree" version="9.9.1"> + <artifact name="asm-tree-9.9.1.jar"> + <sha256 value="0f3555096b720b820bbacab0b515589bee0200bee099bda14c561738ae837ba1" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.ow2.asm" name="asm-util" version="9.4"> + <artifact name="asm-util-9.4.jar"> + <sha256 value="3d7932b93ff55056641e7cfb601f96bcd5cd071e1b0503c78a5014232297a23e" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.ow2.asm" name="asm-util" version="9.8"> + <artifact name="asm-util-9.8.jar"> + <sha256 value="8ba0460ecb28fd0e2980e5f3ef3433a513a457bc077f81a53bdc75b587a08d15" origin="Generated by Gradle" reason="A key couldn't be downloaded"/> + </artifact> + </component> + <component group="org.reactivestreams" name="reactive-streams" version="1.0.3"> + <artifact name="reactive-streams-1.0.3.jar"> + <sha256 value="1dee0481072d19c929b623e155e14d2f6085dc011529a0a0dbefc84cf571d865" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.slf4j" name="slf4j-api" version="1.7.36"> + <artifact name="slf4j-api-1.7.36.jar"> + <sha256 value="d3ef575e3e4979678dc01bf1dcce51021493b4d11fb7f1be8ad982877c16a1c0" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.slf4j" name="slf4j-api" version="1.8.0-alpha2"> + <artifact name="slf4j-api-1.8.0-alpha2.jar"> + <sha256 value="09c301f88086adf705fd13aabd20ccb2148d8ea64dfa3c7e482b5c909046c792" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.slf4j" name="slf4j-api" version="2.0.16"> + <artifact name="slf4j-api-2.0.16.jar"> + <sha256 value="a12578dde1ba00bd9b816d388a0b879928d00bab3c83c240f7013bf4196c579a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.slf4j" name="slf4j-api" version="2.0.17"> + <artifact name="slf4j-api-2.0.17.jar"> + <sha256 value="7b751d952061954d5abfed7181c1f645d336091b679891591d63329c622eb832" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.slf4j" name="slf4j-api" version="2.0.7"> + <artifact name="slf4j-api-2.0.7.jar"> + <sha256 value="5d6298b93a1905c32cda6478808ac14c2d4a47e91535e53c41f7feeb85d946f4" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.slf4j" name="slf4j-simple" version="1.8.0-alpha2"> + <artifact name="slf4j-simple-1.8.0-alpha2.jar"> + <sha256 value="39b24e2974d47737a7dbcc102948b2cce71bd3035410a9d16f9811850860b5c2" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.sonarsource.scanner.gradle" name="sonarqube-gradle-plugin" version="7.2.3.7755"> + <artifact name="sonarqube-gradle-plugin-7.2.3.7755.jar"> + <sha256 value="6244b08edc9f86b3fafa5f383a12fd295dee03ca3fad13c4453dd6922bafd452" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.sonarsource.scanner.lib" name="sonar-scanner-download-cache" version="4.0.1.1587"> + <artifact name="sonar-scanner-download-cache-4.0.1.1587.jar"> + <sha256 value="d64cc2cee46c48fffac89ee68a9be3c93484b00b01c721d11cb709aa59a01c01" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.sonarsource.scanner.lib" name="sonar-scanner-java-library" version="4.0.1.1587"> + <artifact name="sonar-scanner-java-library-4.0.1.1587.jar"> + <sha256 value="218b882440a8d0dd11687aadbcf4f9b0a327d12111832000a395a2f496e8e90a" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.sonarsource.scanner.lib" name="sonar-scanner-java-library-batch-interface" version="4.0.1.1587"> + <artifact name="sonar-scanner-java-library-batch-interface-4.0.1.1587.jar"> + <sha256 value="096426e2198cdad65014390ba4ec7b9c802e7d2747108da6905bc857637dd3a4" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.tensorflow" name="tensorflow-lite-metadata" version="0.2.0"> + <artifact name="tensorflow-lite-metadata-0.2.0.jar"> + <sha256 value="e9f18b8a41f017e9033cb0ed85c8a2ba2307292cdfe25eae365923e7a31d2a70" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.yaml" name="snakeyaml" version="1.23"> + <artifact name="snakeyaml-1.23-android.jar"> + <sha256 value="c0f7a90628172970d3ff6d7eaa7a04f73b57290b3b8dba916c8281a76f2214ca" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="org.yaml" name="snakeyaml" version="2.3"> + <artifact name="snakeyaml-2.3.jar"> + <sha256 value="63a76fe66b652360bd4c2c107e6f0258daa7d4bb492008ba8c26fcd230ff9146" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="se.warting.signature" name="signature-core" version="0.1.4"> + <artifact name="signature-core-0.1.4.aar"> + <sha256 value="508d6499146ae43462271e7608ac15fe174888a14bee1d21202171042df28514" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="se.warting.signature" name="signature-pad" version="0.1.4"> + <artifact name="signature-pad-0.1.4.aar"> + <sha256 value="5597f63f7e6701df7f55b01fdb222248e740be0c3a11561354a92ed216c0223d" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="se.warting.signature" name="signature-view" version="0.1.4"> + <artifact name="signature-view-0.1.4.aar"> + <sha256 value="d70a9dab35649a94a74d88c96aaa4d1404216508ca74e777e28d574379fe0713" origin="Generated by Gradle"/> + </artifact> + </component> + </components> +</verification-metadata> diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ff96c38feaf..ac6cfd349c9 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Tue Jul 22 10:02:18 CEST 2025 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/login/build.gradle.kts b/login/build.gradle.kts index b142ac086d9..380aa71c941 100644 --- a/login/build.gradle.kts +++ b/login/build.gradle.kts @@ -1,10 +1,7 @@ -import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi -import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetTree - plugins { - kotlin("multiplatform") + alias(libs.plugins.kotlin.multiplatform) alias(libs.plugins.compose) - id("com.android.library") + alias(libs.plugins.android.kotlin.multiplatform.library) alias(libs.plugins.kotlin.compose.compiler) alias(libs.plugins.kotlin.serialization) } @@ -14,12 +11,23 @@ kotlin { compilerOptions { freeCompilerArgs.add("-Xcontext-parameters") } - androidTarget { - compilerOptions { - jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17) + + androidLibrary { + namespace = "org.dhis2.mobile.login" + compileSdk = libs.versions.sdk.get().toInt() + minSdk = libs.versions.minSdk.get().toInt() + enableCoreLibraryDesugaring = true + compilerOptions { jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17) } + androidResources { enable = true } + packaging { + resources { + pickFirsts.add("values*/**") + } + } + withHostTestBuilder {}.configure {} + withDeviceTestBuilder { sourceSetTreeName = "test" }.configure { + instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } - @OptIn(ExperimentalKotlinGradlePluginApi::class) - instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) } jvm("desktop") @@ -33,20 +41,20 @@ kotlin { resources.srcDirs("src/commonMain/composeResources") dependencies { - implementation(compose.runtime) - implementation(compose.foundation) - implementation(compose.ui) - implementation(compose.material3) - api(compose.materialIconsExtended) + implementation(libs.compose.runtime) + implementation(libs.compose.foundation) + implementation(libs.compose.ui) + implementation(libs.compose.material3) + api(libs.compose.material3.iconsExtendend) val designSystem = libs.dhis2.mobile.designsystem implementation("${designSystem.get().group}:${designSystem.get().name}:${designSystem.get().version}") { isChanging = true } implementation(libs.compose.material3.window) - implementation(compose.components.resources) + implementation(libs.compose.components.resources) implementation(project(":commonskmm")) implementation(libs.navigation.compose) - implementation(compose.components.uiToolingPreview) + implementation(libs.compose.ui.uiToolingPreview) // Koin api(libs.koin.core) @@ -58,14 +66,10 @@ kotlin { commonTest { dependencies { implementation(kotlin("test")) - // Koin Test features - implementation(libs.koin.test) - implementation(libs.koin.test.junit5) - implementation(libs.koin.test.junit4) implementation(libs.test.turbine) implementation(libs.test.kotlinCoroutines) implementation(libs.test.mockitoKotlin) - implementation(compose.components.resources) + implementation(libs.compose.components.resources) } } @@ -78,12 +82,26 @@ kotlin { implementation(libs.koin.androidx.compose) implementation(libs.androidx.activity.compose) implementation(libs.androidx.browser) + implementation(libs.androidx.compose.uitooling) + } + } + + getByName("androidHostTest") { + dependencies { + implementation(libs.junit.jupiter) + } + } + + getByName("androidDeviceTest") { + dependencies { + implementation(libs.test.compose.ui.test.junit4.android) + implementation(libs.test.ui.test.manifest) } } val desktopMain by getting { dependencies { - implementation(compose.desktop.common) + implementation(libs.compose.desktop.common) } } } @@ -96,57 +114,6 @@ compose.resources { generateResClass = always } -android { - namespace = "org.dhis2.mobile.login" - compileSdk = libs.versions.sdk.get().toInt() - - sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml") - sourceSets["main"].res.srcDirs("src/androidMain/res") - - defaultConfig { - minSdk = libs.versions.minSdk.get().toInt() - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } - compileOptions { - isCoreLibraryDesugaringEnabled = true - - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - - buildTypes { - getByName("debug") { - - } - getByName("release") { - - } - } - buildFeatures.buildConfig = true - - flavorDimensions += listOf("default") - productFlavors { - create("dhis2") { - buildConfigField("String", "LOGIN_TEST", "\"test\"") - } - create("dhis2PlayServices") { - buildConfigField("String", "LOGIN_TEST", "\"test\"") - - } - create("dhis2Training") { - buildConfigField("String", "LOGIN_TEST", "\"test\"") - } - } -} - dependencies { coreLibraryDesugaring(libs.desugar) } - -dependencies { - testImplementation(libs.junit.jupiter) - debugImplementation(libs.androidx.compose.preview) - debugImplementation(libs.androidx.compose.uitooling) - androidTestImplementation(libs.test.compose.ui.test.junit4.android) - debugImplementation(libs.test.ui.test.manifest) -} \ No newline at end of file diff --git a/login/src/androidInstrumentedTest/kotlin/screen/TwoFAToEnableScreenTest.kt b/login/src/androidInstrumentedTest/kotlin/screen/TwoFAToEnableScreenTest.kt deleted file mode 100644 index 51b89b75804..00000000000 --- a/login/src/androidInstrumentedTest/kotlin/screen/TwoFAToEnableScreenTest.kt +++ /dev/null @@ -1,74 +0,0 @@ -package screen - -import androidx.compose.ui.test.ExperimentalTestApi -import androidx.compose.ui.test.assertIsDisplayed -import androidx.compose.ui.test.assertIsNotEnabled -import androidx.compose.ui.test.hasTestTag -import androidx.compose.ui.test.hasText -import androidx.compose.ui.test.junit4.createComposeRule -import androidx.compose.ui.test.onNodeWithTag -import androidx.compose.ui.test.runComposeUiTest -import org.dhis2.mobile.login.authentication.ui.screen.TURN_ON_BUTTON_TEST_TAG -import org.dhis2.mobile.login.authentication.ui.screen.TwoFAToEnableScreen -import org.dhis2.mobile.login.authentication.ui.state.TwoFAUiState -import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme -import org.junit.Rule -import kotlin.test.Test - -@OptIn(ExperimentalTestApi::class) -class TwoFAToEnableScreenTest { - @get:Rule - val composeTestRule = createComposeRule() - - private val secretCode = "secret_code" - - @Test - fun should_init_with_disabled_button() { - with(composeTestRule) { - setContent { - DHIS2Theme { - TwoFAToEnableScreen( - enableUiState = - TwoFAUiState.Enable( - secretCode = secretCode, - isEnabling = false, - enableErrorMessage = null, - ), - onAuthenticatorButtonClicked = {}, - onCopyCodeButtonClicked = {}, - onEnableButtonClicked = {}, - ) - } - } - - onNodeWithTag(TURN_ON_BUTTON_TEST_TAG).assertIsNotEnabled() - } - } - - @Test - fun should_set_error_if_code_is_wrong() = - runComposeUiTest { - with(composeTestRule) { - setContent { - DHIS2Theme { - TwoFAToEnableScreen( - enableUiState = - TwoFAUiState.Enable( - secretCode = secretCode, - isEnabling = false, - enableErrorMessage = "Error code", - ), - onAuthenticatorButtonClicked = {}, - onCopyCodeButtonClicked = {}, - onEnableButtonClicked = {}, - ) - } - } - - onNode( - hasTestTag("INPUT_TEXT_SUPPORTING_TEXT") and - hasText("two_fa_failed_to_turn_on"), - ).assertIsDisplayed() - } - } -} diff --git a/login/src/androidMain/kotlin/org/dhis2/mobile/login/accounts/data/repository/AccountRepositoryImpl.kt b/login/src/androidMain/kotlin/org/dhis2/mobile/login/accounts/data/repository/AccountRepositoryImpl.kt index 173dafcd054..4b6f786a65d 100644 --- a/login/src/androidMain/kotlin/org/dhis2/mobile/login/accounts/data/repository/AccountRepositoryImpl.kt +++ b/login/src/androidMain/kotlin/org/dhis2/mobile/login/accounts/data/repository/AccountRepositoryImpl.kt @@ -1,7 +1,6 @@ package org.dhis2.mobile.login.accounts.data.repository import org.dhis2.mobile.commons.providers.PreferenceProvider -import org.dhis2.mobile.login.BuildConfig import org.dhis2.mobile.login.accounts.data.credentials.defaultTestingCredentials import org.dhis2.mobile.login.accounts.data.credentials.trainingTestingCredentials import org.dhis2.mobile.login.accounts.domain.model.AccountModel @@ -12,6 +11,8 @@ import org.hisp.dhis.android.core.configuration.internal.DatabaseAccount class AccountRepositoryImpl( private val d2: D2, private val preferenceProvider: PreferenceProvider, + private val isDebug: Boolean, + private val isTrainingFlavor: Boolean, ) : AccountRepository { override suspend fun getLoggedInAccounts(): List<AccountModel> = d2.userModule().accountManager().getAccounts().map { @@ -20,9 +21,9 @@ class AccountRepositoryImpl( override suspend fun availableServers(): List<String> { val providedServers = - if (BuildConfig.DEBUG) { + if (isDebug) { defaultTestingCredentials - } else if (BuildConfig.FLAVOR == "dhis2Training") { + } else if (isTrainingFlavor) { trainingTestingCredentials } else { emptyList() diff --git a/login/src/androidMain/kotlin/org/dhis2/mobile/login/authentication/OpenIdControllerImpl.kt b/login/src/androidMain/kotlin/org/dhis2/mobile/login/authentication/OpenIdControllerImpl.kt new file mode 100644 index 00000000000..70e10603007 --- /dev/null +++ b/login/src/androidMain/kotlin/org/dhis2/mobile/login/authentication/OpenIdControllerImpl.kt @@ -0,0 +1,99 @@ +package org.dhis2.mobile.login.authentication + +import android.app.Activity.RESULT_OK +import android.content.Intent +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts +import androidx.fragment.app.FragmentActivity +import androidx.lifecycle.LifecycleCoroutineScope +import androidx.lifecycle.lifecycleScope +import kotlinx.coroutines.launch +import org.dhis2.mobile.login.resources.Res +import org.dhis2.mobile.login.resources.openid_error_controller_not_bounded +import org.dhis2.mobile.login.resources.openid_error_expected_intent +import org.dhis2.mobile.login.resources.openid_login_cancelled +import org.hisp.dhis.android.core.user.openid.IntentWithRequestCode +import org.jetbrains.compose.resources.getString + +class OpenIdControllerImpl : OpenIdController { + private var openIDRequestCode = -1 + private var onResultCallback: (suspend (Result<Any>) -> Unit)? = null + private var openIdLauncher: ActivityResultLauncher<Intent>? = null + private var lifecycleScope: LifecycleCoroutineScope? = null + + override fun bind(context: Any) { + if (context !is FragmentActivity) { + unbind() + throw IllegalArgumentException( + "Context must be an instance of FragmentActivity", + ) + } + + openIdLauncher?.unregister() + lifecycleScope = context.lifecycleScope + openIdLauncher = + context.activityResultRegistry.register( + key = "OPEN_ID_LAUNCHER", + contract = ActivityResultContracts.StartActivityForResult(), + ) { result -> + val scope = lifecycleScope ?: return@register + if (result.resultCode == RESULT_OK && result.data != null) { + val intentResult = + IntentWithRequestCode( + intent = result.data!!, + requestCode = openIDRequestCode, + ) + scope.launch { + onResultCallback?.invoke(Result.success(intentResult)) + } + } else { + scope.launch { + onResultCallback?.invoke( + Result.failure<IntentWithRequestCode>( + Exception(getString(Res.string.openid_login_cancelled)), + ), + ) + } + } + } + } + + override fun unbind() { + openIdLauncher?.unregister() + openIdLauncher = null + lifecycleScope = null + onResultCallback = null + } + + override fun handleIntent( + intent: Any, + onResult: suspend (Result<Any>) -> Unit, + ) { + if (intent !is IntentWithRequestCode) { + lifecycleScope?.launch { + onResult( + Result.failure<IntentWithRequestCode>( + IllegalArgumentException(getString(Res.string.openid_error_expected_intent)), + ), + ) + } ?: throw IllegalStateException() + return + } + + val launcher = openIdLauncher + if (launcher == null) { + lifecycleScope?.launch { + onResult( + Result.failure( + IllegalStateException(getString(Res.string.openid_error_controller_not_bounded)), + ), + ) + } ?: throw IllegalStateException() + return + } + + onResultCallback = onResult + openIDRequestCode = intent.requestCode + launcher.launch(intent.intent) + } +} diff --git a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt index 1d8a923ad3a..375aaa33f2f 100644 --- a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt +++ b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepositoryImpl.kt @@ -2,12 +2,14 @@ package org.dhis2.mobile.login.main.data import androidx.core.net.toUri import coil3.PlatformContext +import kotlinx.coroutines.CancellableContinuation import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.withContext -import org.dhis2.mobile.commons.auth.OpenIdController import org.dhis2.mobile.commons.biometrics.BiometricActions import org.dhis2.mobile.commons.biometrics.CryptographicActions import org.dhis2.mobile.commons.coroutine.Dispatcher +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.mobile.commons.error.DomainErrorMapper import org.dhis2.mobile.commons.providers.BIOMETRIC_CREDENTIALS import org.dhis2.mobile.commons.providers.PreferenceProvider import org.dhis2.mobile.commons.providers.SECURE_PASS @@ -15,13 +17,18 @@ import org.dhis2.mobile.commons.providers.SECURE_SERVER_URL import org.dhis2.mobile.commons.reporting.AnalyticActions import org.dhis2.mobile.commons.reporting.CrashReportController import org.dhis2.mobile.commons.resources.D2ErrorMessageProvider +import org.dhis2.mobile.login.authentication.OpenIdController +import org.dhis2.mobile.login.main.domain.model.OpenIdLoginConfiguration import org.dhis2.mobile.login.main.domain.model.ServerValidationResult import org.dhis2.mobile.login.resources.Res +import org.dhis2.mobile.login.resources.error_device_not_registered import org.dhis2.mobile.login.resources.openid_invalid_auth_result import org.dhis2.mobile.login.resources.openid_process_cancelled import org.dhis2.mobile.login.resources.server_url_error import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.arch.helpers.Result +import org.hisp.dhis.android.core.maintenance.D2Error +import org.hisp.dhis.android.core.user.oauth2.OAuth2Config import org.hisp.dhis.android.core.user.openid.IntentWithRequestCode import org.hisp.dhis.android.core.user.openid.OpenIDConnectConfig import org.jetbrains.compose.resources.getString @@ -47,6 +54,7 @@ class LoginRepositoryImpl( private val analyticActions: AnalyticActions, private val openIdController: OpenIdController, private val dispatcher: Dispatcher, + private val domainErrorMapper: DomainErrorMapper, ) : LoginRepository { override suspend fun validateServer( server: String, @@ -55,26 +63,24 @@ class LoginRepositoryImpl( withContext(dispatcher.io) { when (val result = d2.serverModule().blockingCheckServerUrl(server)) { is Result.Success -> { - if (result.value.isOauthEnabled()) { - ServerValidationResult.Oauth - } else { - val oidcProvider = result.value.oidcProviders.firstOrNull() - val serverName = - result.value.applicationTitle ?: try { - server.substringAfter("://").substringBefore("/") - } catch (_: Exception) { - server - } - ServerValidationResult.Legacy( - serverName = serverName, - serverDescription = result.value.applicationDescription, - countryFlag = result.value.countryFlag, - allowRecovery = result.value.allowAccountRecovery, - oidcIcon = oidcProvider?.icon, - oidcLoginText = oidcProvider?.loginText, - oidcUrl = oidcProvider?.url, - ) - } + val serverName = + result.value.applicationTitle ?: try { + server.substringAfter("://").substringBefore("/") + } catch (_: Exception) { + server + } + + val oidcProvider = result.value.oidcProviders.firstOrNull() + ServerValidationResult.Success( + serverName = serverName.ifEmpty { "DHIS2" }, + serverDescription = result.value.applicationDescription, + countryFlag = result.value.countryFlag, + allowRecovery = result.value.allowAccountRecovery, + oidcIcon = oidcProvider?.icon, + oidcLoginText = oidcProvider?.loginText, + oidcUrl = oidcProvider?.url, + oAuthEnabled = result.value.isOauthEnabled(), + ) } is Result.Failure -> { @@ -123,6 +129,51 @@ class LoginRepositoryImpl( } } + override suspend fun getDeviceEnrollmentUrl(serverUrl: String) = + withContext(dispatcher.io) { + try { + d2.userModule().oauth2Handler().blockingBuildEnrollmentUrl(serverUrl) + } catch (d2Error: D2Error) { + throw domainErrorMapper.mapToDomainError(d2Error) + } + } + + override suspend fun enrollDevice( + iat: String, + serverURL: String, + ) = withContext(dispatcher.io) { + try { + d2.userModule().oauth2Handler().blockingHandleEnrollmentResponse( + serverUrl = serverURL, + iat = iat, + ) + + if (!d2.userModule().oauth2Handler().isDeviceRegistered()) { + throw DomainError.AuthenticationError(getString(Res.string.error_device_not_registered)) + } + + val config = OAuth2Config(serverUrl = serverURL) + // Return the authorization URL + d2.userModule().oauth2Handler().blockingLogIn(config) + } catch (d2Error: D2Error) { + throw domainErrorMapper.mapToDomainError(d2Error) + } + } + + override suspend fun loginUserWithOAuth( + serverUrl: String, + code: String, + ) = withContext(dispatcher.io) { + try { + val user = + d2.userModule().oauth2Handler().blockingHandleLogInResponse(serverUrl, code) + kotlin.Result.success(user.username()) + } catch (d2Error: D2Error) { + val mappedError = domainErrorMapper.mapToDomainError(d2Error) + kotlin.Result.failure(mappedError) + } + } + override suspend fun getAvailableLoginUsernames(): List<String> = withContext(dispatcher.io) { preferences.getSet(PREF_USERS, HashSet())?.toList() ?: emptyList() @@ -157,12 +208,16 @@ class LoginRepositoryImpl( override suspend fun displayTrackingMessage(): Boolean = withContext(dispatcher.io) { - d2 - .dataStoreModule() - .localDataStore() - .value(DATA_STORE_ANALYTICS_PERMISSION_KEY) - .blockingGet() - ?.value() == null + try { + d2 + .dataStoreModule() + .localDataStore() + .value(DATA_STORE_ANALYTICS_PERMISSION_KEY) + .blockingGet() + ?.value() == null + } catch (_: Exception) { + false + } } private fun hasEnabledBiometricsPermission(): Boolean = @@ -175,7 +230,10 @@ class LoginRepositoryImpl( override suspend fun initialSyncDone( serverUrl: String, username: String, - ): Boolean = withContext(dispatcher.io) { isImportedDatabase(serverUrl, username) or entryExists() } + ): Boolean = + withContext(dispatcher.io) { + isImportedDatabase(serverUrl, username) or entryExists() + } override suspend fun canLoginWithBiometrics(serverUrl: String): Boolean = withContext(dispatcher.io) { @@ -260,7 +318,7 @@ class LoginRepositoryImpl( preferences.getBiometricCredentials()?.let { ciphertextWrapper -> cryptographyManager .getInitializedCipherForDecryption(ciphertextWrapper.initializationVector) - ?.let { cipher -> + .let { cipher -> suspendCancellableCoroutine { continuation -> authenticator.authenticate(cipher) { cipher -> val pass = @@ -285,15 +343,7 @@ class LoginRepositoryImpl( } } - override suspend fun loginWithOpenId( - serverUrl: String, - isNetworkAvailable: Boolean, - clientId: String, - redirectUri: String, - discoveryUri: String?, - authorizationUri: String?, - tokenUrl: String?, - ): kotlin.Result<Unit> = + override suspend fun loginWithOpenId(openIdLoginConfiguration: OpenIdLoginConfiguration): kotlin.Result<Unit> = withContext(dispatcher.io) { suspendCancellableCoroutine { continuation -> val intent = @@ -302,54 +352,16 @@ class LoginRepositoryImpl( .openIdHandler() .blockingLogIn( OpenIDConnectConfig( - clientId = clientId, - redirectUri = redirectUri.toUri(), - discoveryUri = discoveryUri?.toUri(), - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, + clientId = openIdLoginConfiguration.clientId, + redirectUri = openIdLoginConfiguration.redirectUri.toUri(), + discoveryUri = openIdLoginConfiguration.discoveryUri?.toUri(), + authorizationUri = openIdLoginConfiguration.authorizationUri, + tokenUrl = openIdLoginConfiguration.tokenUrl, + prompt = openIdLoginConfiguration.prompt, ), ) openIdController.handleIntent(intent) { resultIntent -> - val result = - when { - resultIntent.isFailure -> { - kotlin.Result.failure( - resultIntent.exceptionOrNull() - ?: Exception(getString(Res.string.openid_process_cancelled)), - ) - } - - resultIntent.isSuccess and (resultIntent.getOrNull() !is IntentWithRequestCode) -> { - kotlin.Result.failure(Exception(getString(Res.string.openid_invalid_auth_result))) - } - - else -> { - try { - val intent = resultIntent.getOrNull() as IntentWithRequestCode - d2 - .userModule() - .openIdHandler() - .blockingHandleLogInResponse( - serverUrl = serverUrl, - intent = intent.intent, - requestCode = intent.requestCode, - ) - - kotlin.Result.success(Unit) - } catch (e: Exception) { - kotlin.Result.failure( - Exception( - d2ErrorMessageProvider.getErrorMessage( - e, - isNetworkAvailable, - ), - ), - ) - } - } - } - - continuation.resume(value = result) { _, _, _ -> } + manageIntentResult(resultIntent, openIdLoginConfiguration, continuation) } continuation.invokeOnCancellation { kotlin.Result.failure<Unit>(Exception("")) @@ -357,6 +369,61 @@ class LoginRepositoryImpl( } } + private suspend fun manageIntentResult( + resultIntent: kotlin.Result<Any>, + openIdLoginConfiguration: OpenIdLoginConfiguration, + continuation: CancellableContinuation<kotlin.Result<Unit>>, + ) { + withContext(dispatcher.io) { + val result = + when { + resultIntent.isFailure -> { + kotlin.Result.failure( + resultIntent.exceptionOrNull() + ?: Exception(getString(Res.string.openid_process_cancelled)), + ) + } + + resultIntent.isSuccess and (resultIntent.getOrNull() !is IntentWithRequestCode) -> { + kotlin.Result.failure(Exception(getString(Res.string.openid_invalid_auth_result))) + } + + else -> { + try { + val intent = + resultIntent.getOrNull() as IntentWithRequestCode + + d2 + .userModule() + .openIdHandler() + .blockingHandleLogInResponse( + serverUrl = openIdLoginConfiguration.serverUrl, + intent = intent.intent, + requestCode = intent.requestCode, + ) + + kotlin.Result.success(Unit) + } catch (d2Error: D2Error) { + kotlin.Result.failure( + Exception( + d2ErrorMessageProvider.getErrorMessage( + d2Error, + openIdLoginConfiguration.isNetworkAvailable, + ), + ), + ) + } catch (_: Exception) { + kotlin.Result.failure( + resultIntent.exceptionOrNull() + ?: Exception(getString(Res.string.openid_process_cancelled)), + ) + } + } + } + continuation.resume(value = result) { _, _, _ -> } + } + } + override suspend fun getUsername(): String = withContext(dispatcher.io) { d2 diff --git a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.android.kt b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.android.kt index 89064cbbbbe..096c46a6409 100644 --- a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.android.kt +++ b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.android.kt @@ -1,12 +1,15 @@ package org.dhis2.mobile.login.main.di -import org.dhis2.mobile.commons.auth.OpenIdController -import org.dhis2.mobile.commons.auth.OpenIdControllerImpl +import android.content.Context +import android.content.pm.ApplicationInfo import org.dhis2.mobile.login.accounts.data.repository.AccountRepository import org.dhis2.mobile.login.accounts.data.repository.AccountRepositoryImpl import org.dhis2.mobile.login.accounts.ui.viewmodel.AccountsViewModel +import org.dhis2.mobile.login.authentication.OpenIdController +import org.dhis2.mobile.login.authentication.OpenIdControllerImpl import org.dhis2.mobile.login.main.data.LoginRepository import org.dhis2.mobile.login.main.data.LoginRepositoryImpl +import org.dhis2.mobile.login.main.ui.state.OidcInfo import org.koin.core.module.dsl.viewModel import org.koin.core.parameter.parametersOf import org.koin.dsl.module @@ -14,27 +17,55 @@ import org.koin.dsl.module internal actual val accountModule = module { factory<AccountRepository> { + val context = get<Context>() + val isDebug = context.applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE != 0 AccountRepositoryImpl( get(), get(), + isDebug = isDebug, + isTrainingFlavor = getProperty("isTrainingFlavor", false), ) } - single<OpenIdController> { params -> - OpenIdControllerImpl(params.get()) + single<OpenIdController> { OpenIdControllerImpl() } + + single { + when (getProperty("openIdType", "")) { + "token" -> + OidcInfo.Token( + server = getProperty("openIdServer", ""), + loginLabel = getPropertyOrNull("openIdButtonText"), + clientId = getProperty("openIdClient", ""), + redirectUri = getProperty("openIdRedirectUri", ""), + authorizationUrl = getProperty("openIdAuthorizationUrl", ""), + tokenUrl = getProperty("openIdTokenUrl", ""), + prompt = getPropertyOrNull<String>("openIdPrompt")?.takeIf { it.isNotEmpty() }, + ) + + else -> + OidcInfo.Discovery( + server = getProperty("openIdServer", ""), + loginButtonText = getPropertyOrNull("openIdButtonText"), + clientId = getProperty("openIdClient", ""), + redirectUri = getProperty("openIdRedirectUri", ""), + discoveryUri = getProperty("openIdDiscoveryUri", ""), + prompt = getPropertyOrNull<String>("openIdPrompt")?.takeIf { it.isNotEmpty() }, + ) + } } - factory<LoginRepository> { params -> + factory<LoginRepository> { _ -> LoginRepositoryImpl( - get(), - get(), - get(), - get(), - get(), - get(), - get(), - get { parametersOf(params.get()) }, - get(), + d2 = get(), + authenticator = get(), + cryptographyManager = get(), + preferences = get(), + d2ErrorMessageProvider = get(), + crashReportController = get(), + analyticActions = get(), + openIdController = get(), + dispatcher = get(), + domainErrorMapper = get(), ) } diff --git a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/ui/screen/WebAuthenticator.android.kt b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/ui/screen/WebAuthenticator.android.kt index e9999983252..8c4e18dfa78 100644 --- a/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/ui/screen/WebAuthenticator.android.kt +++ b/login/src/androidMain/kotlin/org/dhis2/mobile/login/main/ui/screen/WebAuthenticator.android.kt @@ -14,17 +14,6 @@ actual fun WebAuthenticator( url: String, onDismiss: () -> Unit, ) { - // TODO Use the url parameter when the backend supports dynamic redirect URIs - val redirectUri = "https://vgarciabnz.github.io" - val oauthAuthUrl = - "https://dev.im.dhis2.org/oauth2-android-test/oauth2/authorize?" + - "response_type=code" + - "&client_id=dhis2-client" + - "&redirect_uri=$redirectUri" + - "&scope=openid%20email" + - "&state=abc123" - - // Custom Tab launcher will handle the result of the Custom Tab to detect if the user closed it val customTabLauncher = rememberLauncherForActivityResult( contract = ActivityResultContracts.StartActivityForResult(), @@ -41,11 +30,13 @@ actual fun WebAuthenticator( .setShowTitle(false) .setUrlBarHidingEnabled(true) .build() + // Custom Tab is not kept in the activity history stack and it's removed from memory. + // It won't appear in the "Recent Apps" list customTabsIntent.intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) val intent = customTabsIntent.intent.apply { - data = oauthAuthUrl.toUri() + data = url.toUri() } customTabLauncher.launch(intent) diff --git a/login/src/androidMain/kotlin/org/dhis2/mobile/login/pin/PinBottomSheetLauncher.kt b/login/src/androidMain/kotlin/org/dhis2/mobile/login/pin/PinBottomSheetLauncher.kt new file mode 100644 index 00000000000..8a2da1bea2c --- /dev/null +++ b/login/src/androidMain/kotlin/org/dhis2/mobile/login/pin/PinBottomSheetLauncher.kt @@ -0,0 +1,45 @@ +package org.dhis2.mobile.login.pin + +import android.view.ViewGroup +import android.view.ViewGroup.LayoutParams.MATCH_PARENT +import androidx.compose.ui.platform.ComposeView +import androidx.compose.ui.platform.ViewCompositionStrategy +import androidx.fragment.app.FragmentActivity +import org.dhis2.mobile.login.pin.domain.model.PinMode +import org.dhis2.mobile.login.pin.ui.components.PinDialog +import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme + +/** + * Adds a [PinDialog] composable as an overlay on the Activity's decor view. + * + * Returns the [ComposeView] that was added, so the caller can remove it if needed + * (e.g., on Activity stop). The [PinDialog] is displayed via [FullScreenDialog] internally, + * which creates its own dialog window on top of the Activity. + * + * @param mode PIN mode: SET (create PIN) or ASK (verify PIN). + * @param onSuccess Invoked when the PIN operation completes successfully. + * @param onDismiss Invoked when the dialog is dismissed (back press, forgot PIN, too many attempts). + * @return The [ComposeView] added to the window, or null if the decor view is unavailable. + */ +fun FragmentActivity.addPinBottomSheet( + mode: PinMode, + onSuccess: () -> Unit, + onDismiss: () -> Unit, +): ComposeView? { + val decorView = window?.decorView as? ViewGroup ?: return null + return ComposeView(this).apply { + setViewCompositionStrategy( + ViewCompositionStrategy.DisposeOnDetachedFromWindowOrReleasedFromPool, + ) + setContent { + DHIS2Theme { + PinDialog( + mode = mode, + onSuccess = onSuccess, + onDismiss = onDismiss, + ) + } + } + decorView.addView(this, MATCH_PARENT, MATCH_PARENT) + } +} diff --git a/login/src/commonMain/composeResources/values-ar-rIQ/strings.xml b/login/src/commonMain/composeResources/values-ar-rIQ/strings.xml index 9bd139301f0..54c20417320 100644 --- a/login/src/commonMain/composeResources/values-ar-rIQ/strings.xml +++ b/login/src/commonMain/composeResources/values-ar-rIQ/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="action_next">التالي</string> <string name="username_hint">اسم المستخدم</string> diff --git a/login/src/commonMain/composeResources/values-ar/strings.xml b/login/src/commonMain/composeResources/values-ar/strings.xml index aff9209a9cc..4aabf6b8e45 100644 --- a/login/src/commonMain/composeResources/values-ar/strings.xml +++ b/login/src/commonMain/composeResources/values-ar/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="action_next">التالي</string> <string name="biometrics_login_title">تسجيل الدخول السريع</string> diff --git a/login/src/commonMain/composeResources/values-bn/strings.xml b/login/src/commonMain/composeResources/values-bn/strings.xml index 7713f637a38..b413e40faef 100644 --- a/login/src/commonMain/composeResources/values-bn/strings.xml +++ b/login/src/commonMain/composeResources/values-bn/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="action_yes">হ্যাঁ</string> </resources> \ No newline at end of file diff --git a/login/src/commonMain/composeResources/values-ckb/strings.xml b/login/src/commonMain/composeResources/values-ckb/strings.xml index 8a027b413b2..c7e2cab6921 100644 --- a/login/src/commonMain/composeResources/values-ckb/strings.xml +++ b/login/src/commonMain/composeResources/values-ckb/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="action_next">داهاتوو</string> <string name="action_yes">بەڵێ</string> diff --git a/login/src/commonMain/composeResources/values-cs/strings.xml b/login/src/commonMain/composeResources/values-cs/strings.xml index ff617a7b78c..4035c4a7221 100644 --- a/login/src/commonMain/composeResources/values-cs/strings.xml +++ b/login/src/commonMain/composeResources/values-cs/strings.xml @@ -22,13 +22,12 @@ <string name="back_to_settings">Zpět na nastavení</string> <string name="action_next">Další</string> <string name="server_verification_running">Navázání spojení...</string> - <string name="server_verification_title">Ke kterému serveru se chcete připojit\?</string> + <string name="server_verification_title">Ke kterému serveru se chcete připojit?</string> <string name="server_url_title">URL serveru</string> <string name="two_fa_is_on">Je zapnuté dvoufaktorové ověřování.</string> <string name="two_fa_disable_title">Vypnutí dvoufaktorového ověřování</string> <string name="two_fa_disable_desc_1">Chcete-li vypnout dvoufaktorové ověřování, otevřete aplikaci Authenticator.</string> <string name="two_fa_disable_desc_2">Níže zadejte kód z aplikace autentizátoru.</string> - <string name="two_fa_code">Ověřovací kód</string> <string name="two_fa_disable_button">Vypnout</string> <string name="two_fa_disabling_button">Vypnutí...</string> <string name="two_fa_disable_error">Nepodařilo se vypnout dvoufaktorové ověřování.</string> @@ -57,7 +56,7 @@ <string name="enter_pin">Zadejte svůj kód PIN</string> <string name="enter_pin_description">Pro přístup k účtu zadejte čtyřmístný kód PIN.</string> <string name="enter_pin_button">Odemknout</string> - <string name="forgot_pin_button">Zapomněli jste kód PIN\?</string> + <string name="forgot_pin_button">Zapomněli jste kód PIN?</string> <string name="pin_error_incorrect">Nesprávný kód PIN</string> <string name="pin_error_no_pin">Není nakonfigurován žádný kód PIN</string> <string name="pin_error_save_failed">Nepodařilo se uložit kód PIN</string> diff --git a/login/src/commonMain/composeResources/values-da/strings.xml b/login/src/commonMain/composeResources/values-da/strings.xml index e48cd4774df..9ae14a93640 100644 --- a/login/src/commonMain/composeResources/values-da/strings.xml +++ b/login/src/commonMain/composeResources/values-da/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="action_next">Next</string> <string name="username_hint">Username</string> diff --git a/login/src/commonMain/composeResources/values-es-rES/strings.xml b/login/src/commonMain/composeResources/values-es-rES/strings.xml index bda435c5146..4d9ff87946b 100644 --- a/login/src/commonMain/composeResources/values-es-rES/strings.xml +++ b/login/src/commonMain/composeResources/values-es-rES/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="action_next">Siguiente</string> <string name="username_hint">Nombre de usuario</string> diff --git a/login/src/commonMain/composeResources/values-fr/strings.xml b/login/src/commonMain/composeResources/values-fr/strings.xml index 3651f95b7bd..fa6f5ed9804 100644 --- a/login/src/commonMain/composeResources/values-fr/strings.xml +++ b/login/src/commonMain/composeResources/values-fr/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="two_fa_screen_title">Authentification à deux facteurs</string> <string name="two_fa_authentication_code">Code d\'authentification</string> @@ -16,4 +16,4 @@ <string name="action_no_now">Pas maintenant</string> <string name="action_yes">Oui</string> <string name="enter_pin_button">Déverrouiller</string> - </resources> \ No newline at end of file +</resources> \ No newline at end of file diff --git a/login/src/commonMain/composeResources/values-hi-rIN/strings.xml b/login/src/commonMain/composeResources/values-hi-rIN/strings.xml index af04834da4e..8f7f33d0552 100644 --- a/login/src/commonMain/composeResources/values-hi-rIN/strings.xml +++ b/login/src/commonMain/composeResources/values-hi-rIN/strings.xml @@ -1,8 +1,7 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="two_fa_authentication_code">ऑथेंटिकेशन कोड</string> <string name="action_next">आगे</string> - <string name="two_fa_code">ऑथेंटिकेशन कोड</string> <string name="username_hint">यूज़रनेम</string> <string name="password_hint">पासवर्ड</string> <string name="logging_in">लॉग इन हो रहा है…</string> diff --git a/login/src/commonMain/composeResources/values-id/strings.xml b/login/src/commonMain/composeResources/values-id/strings.xml index 0337aae27b2..4c0f15d42d9 100644 --- a/login/src/commonMain/composeResources/values-id/strings.xml +++ b/login/src/commonMain/composeResources/values-id/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="action_next">Selanjutnya</string> <string name="username_hint">Nama pengguna</string> diff --git a/login/src/commonMain/composeResources/values-km/strings.xml b/login/src/commonMain/composeResources/values-km/strings.xml index 8b653396bbe..1fa4a3e05f6 100644 --- a/login/src/commonMain/composeResources/values-km/strings.xml +++ b/login/src/commonMain/composeResources/values-km/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="action_next">បន្ទាប់</string> <string name="username_hint">ឈ្មោះ​គណនី</string> diff --git a/login/src/commonMain/composeResources/values-lo/strings.xml b/login/src/commonMain/composeResources/values-lo/strings.xml index 1667abe1268..10e147b8737 100644 --- a/login/src/commonMain/composeResources/values-lo/strings.xml +++ b/login/src/commonMain/composeResources/values-lo/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="two_fa_screen_title">ກວດສອບຄວາມຖືກຕ້ອງແບບ 2 ຂັ້ນ</string> <string name="action_next">ຕໍ່ໄປ</string> diff --git a/login/src/commonMain/composeResources/values-my/strings.xml b/login/src/commonMain/composeResources/values-my/strings.xml index c3b11bebb24..27b9d88841a 100644 --- a/login/src/commonMain/composeResources/values-my/strings.xml +++ b/login/src/commonMain/composeResources/values-my/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="action_next">ရှေ့သို့</string> <string name="username_hint">အသုံးပြုသူအမည်</string> diff --git a/login/src/commonMain/composeResources/values-nb/strings.xml b/login/src/commonMain/composeResources/values-nb/strings.xml index 0696e46c4da..90b1cbf0a1f 100644 --- a/login/src/commonMain/composeResources/values-nb/strings.xml +++ b/login/src/commonMain/composeResources/values-nb/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="action_next">Neste</string> <string name="username_hint">Brukernavn</string> diff --git a/login/src/commonMain/composeResources/values-nl/strings.xml b/login/src/commonMain/composeResources/values-nl/strings.xml index 4e8b53798d0..82c082e57a9 100644 --- a/login/src/commonMain/composeResources/values-nl/strings.xml +++ b/login/src/commonMain/composeResources/values-nl/strings.xml @@ -1,10 +1,9 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="two_fa_screen_title">Twee-factor-authenticatie</string> <string name="two_fa_authentication_code">Authenticatiecode</string> <string name="action_next">Volgende</string> <string name="two_fa_is_on">Twee-factor-authenticatie staat aan.</string> - <string name="two_fa_code">Authenticatiecode</string> <string name="username_hint">Gebruikersnaam</string> <string name="password_hint">Wachtwoord</string> <string name="logging_in">Aan het inloggen...</string> @@ -13,4 +12,4 @@ <string name="privacy_policy">privacybeleid</string> <string name="action_no_now">Niet nu</string> <string name="action_yes">Ja</string> - </resources> \ No newline at end of file +</resources> \ No newline at end of file diff --git a/login/src/commonMain/composeResources/values-or/strings.xml b/login/src/commonMain/composeResources/values-or/strings.xml index d367006546e..1c06fa0a994 100644 --- a/login/src/commonMain/composeResources/values-or/strings.xml +++ b/login/src/commonMain/composeResources/values-or/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="action_yes">ହଁ</string> </resources> \ No newline at end of file diff --git a/login/src/commonMain/composeResources/values-prs/strings.xml b/login/src/commonMain/composeResources/values-prs/strings.xml index 5ade5633f41..9e8b90fdcca 100644 --- a/login/src/commonMain/composeResources/values-prs/strings.xml +++ b/login/src/commonMain/composeResources/values-prs/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="action_next">بعدی</string> <string name="username_hint">نام کاربر</string> diff --git a/login/src/commonMain/composeResources/values-ps/strings.xml b/login/src/commonMain/composeResources/values-ps/strings.xml index 90974f871eb..f2bcae60ce4 100644 --- a/login/src/commonMain/composeResources/values-ps/strings.xml +++ b/login/src/commonMain/composeResources/values-ps/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="action_next">راتلونکی</string> <string name="username_hint">کارېدونکی نوم</string> diff --git a/login/src/commonMain/composeResources/values-pt-rBR/strings.xml b/login/src/commonMain/composeResources/values-pt-rBR/strings.xml index ca68c9dc9c7..166a5d8ac0a 100644 --- a/login/src/commonMain/composeResources/values-pt-rBR/strings.xml +++ b/login/src/commonMain/composeResources/values-pt-rBR/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="two_fa_screen_title">Autenticação de dois fatores</string> <string name="action_next">Próximo</string> diff --git a/login/src/commonMain/composeResources/values-pt/strings.xml b/login/src/commonMain/composeResources/values-pt/strings.xml index 81c95c67961..127c1bdec91 100644 --- a/login/src/commonMain/composeResources/values-pt/strings.xml +++ b/login/src/commonMain/composeResources/values-pt/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="two_fa_screen_title">Autenticação de dois factores</string> <string name="action_next">Próximo</string> diff --git a/login/src/commonMain/composeResources/values-ro/strings.xml b/login/src/commonMain/composeResources/values-ro/strings.xml index 65017cbfb6b..0b73c7adfd0 100644 --- a/login/src/commonMain/composeResources/values-ro/strings.xml +++ b/login/src/commonMain/composeResources/values-ro/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="action_next">Următorul</string> <string name="action_yes">Da</string> diff --git a/login/src/commonMain/composeResources/values-ru/strings.xml b/login/src/commonMain/composeResources/values-ru/strings.xml index c4c5aafffa4..ddf5b074af7 100644 --- a/login/src/commonMain/composeResources/values-ru/strings.xml +++ b/login/src/commonMain/composeResources/values-ru/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="action_next">Далее</string> <string name="biometrics_login_title">Быстрый вход в систему</string> diff --git a/login/src/commonMain/composeResources/values-si/strings.xml b/login/src/commonMain/composeResources/values-si/strings.xml index 0b5cc8a3adf..7b6f94ddda7 100644 --- a/login/src/commonMain/composeResources/values-si/strings.xml +++ b/login/src/commonMain/composeResources/values-si/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="password_hint">රහස්‍ය පදය</string> <string name="action_yes">ඔව්</string> diff --git a/login/src/commonMain/composeResources/values-sv/strings.xml b/login/src/commonMain/composeResources/values-sv/strings.xml index 79e10deb0e0..63cc6c99538 100644 --- a/login/src/commonMain/composeResources/values-sv/strings.xml +++ b/login/src/commonMain/composeResources/values-sv/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="action_next">Nästa</string> <string name="username_hint">Användarnamn</string> diff --git a/login/src/commonMain/composeResources/values-tet/strings.xml b/login/src/commonMain/composeResources/values-tet/strings.xml index 6156f69b5c4..722b475abe2 100644 --- a/login/src/commonMain/composeResources/values-tet/strings.xml +++ b/login/src/commonMain/composeResources/values-tet/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="action_next">Próximu</string> <string name="username_hint">Utilizador nia Naran</string> diff --git a/login/src/commonMain/composeResources/values-tg/strings.xml b/login/src/commonMain/composeResources/values-tg/strings.xml index cc2ba39fd04..e25c4e713a5 100644 --- a/login/src/commonMain/composeResources/values-tg/strings.xml +++ b/login/src/commonMain/composeResources/values-tg/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="action_next">Навбатӣ</string> <string name="username_hint">Номи корбар</string> diff --git a/login/src/commonMain/composeResources/values-ur/strings.xml b/login/src/commonMain/composeResources/values-ur/strings.xml index c6cb378cc79..654509a9567 100644 --- a/login/src/commonMain/composeResources/values-ur/strings.xml +++ b/login/src/commonMain/composeResources/values-ur/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="action_next">اگلہ</string> <string name="username_hint">صارف کا ناÙ</string> diff --git a/login/src/commonMain/composeResources/values-uz-rUZ/strings.xml b/login/src/commonMain/composeResources/values-uz-rUZ/strings.xml index 30f62d9def1..35a442dcafd 100644 --- a/login/src/commonMain/composeResources/values-uz-rUZ/strings.xml +++ b/login/src/commonMain/composeResources/values-uz-rUZ/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="action_next">Кейинги</string> <string name="username_hint">Фойдаланувчи исми</string> diff --git a/login/src/commonMain/composeResources/values-uz/strings.xml b/login/src/commonMain/composeResources/values-uz/strings.xml index 2418950d2c2..8859dd53bec 100644 --- a/login/src/commonMain/composeResources/values-uz/strings.xml +++ b/login/src/commonMain/composeResources/values-uz/strings.xml @@ -1,8 +1,7 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="two_fa_authentication_code">Аутентификация коди</string> <string name="action_next">Кейинги</string> - <string name="two_fa_code">Аутентификация коди</string> <string name="username_hint">Фойдаланувчи исми</string> <string name="password_hint">Пароль</string> <string name="logging_in">Кириш...</string> diff --git a/login/src/commonMain/composeResources/values-vi/strings.xml b/login/src/commonMain/composeResources/values-vi/strings.xml index d3175d53cad..e121c25b9f4 100644 --- a/login/src/commonMain/composeResources/values-vi/strings.xml +++ b/login/src/commonMain/composeResources/values-vi/strings.xml @@ -1,10 +1,9 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="two_fa_screen_title">Xác thực hai yếu tố</string> <string name="two_fa_authentication_code">Mã xác thực</string> <string name="action_next">Tiếp tục</string> <string name="two_fa_is_on">Xác thực hai yếu tố đang được bật.</string> - <string name="two_fa_code">Mã xác thực</string> <string name="biometrics_login_title">Đăng nhập nhanh</string> <string name="biometrics_login_text">Bạn có muốn sử dụng dấu vân tay của bạn hoặc phương thức sinh học khác để đăng nhập không?</string> <string name="username_hint">Tên đăng nhập</string> @@ -18,4 +17,4 @@ <string name="action_yes">Có</string> <string name="enter_pin_button">Mở khoá</string> <string name="importing_successful">Nhập thành công</string> - </resources> \ No newline at end of file +</resources> \ No newline at end of file diff --git a/login/src/commonMain/composeResources/values-zh-rCN/strings.xml b/login/src/commonMain/composeResources/values-zh-rCN/strings.xml index 5a8748d3738..0945cbb1170 100644 --- a/login/src/commonMain/composeResources/values-zh-rCN/strings.xml +++ b/login/src/commonMain/composeResources/values-zh-rCN/strings.xml @@ -1,8 +1,7 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="two_fa_authentication_code">验证码</string> <string name="action_next">下一个</string> - <string name="two_fa_code">验证码</string> <string name="biometrics_login_title">快速登录</string> <string name="biometrics_login_text">您想使用指纹或其他生物识别方法登录吗?</string> <string name="username_hint">用户名</string> diff --git a/login/src/commonMain/composeResources/values-zh/strings.xml b/login/src/commonMain/composeResources/values-zh/strings.xml index 034612438d4..691cf81d86c 100644 --- a/login/src/commonMain/composeResources/values-zh/strings.xml +++ b/login/src/commonMain/composeResources/values-zh/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="add_account">添加新账户</string> <string name="two_fa_screen_title">双重身份验证</string> @@ -28,7 +28,6 @@ <string name="two_fa_disable_title">关闭双因素身份验证</string> <string name="two_fa_disable_desc_1">要禁用双因素身份验证,请打开身份验证程序。</string> <string name="two_fa_disable_desc_2">在下方输入验证程序中的代码。</string> - <string name="two_fa_code">验证码</string> <string name="two_fa_disable_button">关闭</string> <string name="two_fa_disabling_button">关闭...</string> <string name="two_fa_disable_error">未关闭双因素身份验证。</string> @@ -67,4 +66,4 @@ <string name="importing_successful">导入成功</string> <string name="openid_process_cancelled">登录被取消</string> <string name="openid_invalid_auth_result">授权结果无效</string> -</resources> \ No newline at end of file + </resources> \ No newline at end of file diff --git a/login/src/commonMain/composeResources/values/strings.xml b/login/src/commonMain/composeResources/values/strings.xml index a257953321e..7d42b2b0719 100644 --- a/login/src/commonMain/composeResources/values/strings.xml +++ b/login/src/commonMain/composeResources/values/strings.xml @@ -1,8 +1,8 @@ -<?xml version="1.0" encoding="UTF-8" ?> +<?xml version="1.0" encoding="utf-8"?> <resources> <string name="add_account">Add new account</string> <string name="two_fa_screen_title">Two factor authentication</string> - <string name="two_fa_no_connection_title">Can't connect to network</string> + <string name="two_fa_no_connection_title">Can\'t connect to network</string> <string name="two_fa_no_connection_description">You need an internet connection to turn two-factor authentication on or off.</string> <string name="two_fa_no_connection_button">Try to reconnect</string> <string name="two_fa_checking_status">Checking status...</string> @@ -28,7 +28,6 @@ <string name="two_fa_disable_title">Turning off two-factor authentication</string> <string name="two_fa_disable_desc_1">To disable two-factor authentication open your authenticator app.</string> <string name="two_fa_disable_desc_2">Enter the code from your authenticator app below.</string> - <string name="two_fa_code">Authentication code</string> <string name="two_fa_disable_button">Turn off</string> <string name="two_fa_disabling_button">Turning off...</string> <string name="two_fa_disable_error">Fail to turn two factor authentication off.</string> @@ -67,4 +66,9 @@ <string name="importing_successful">Import successful</string> <string name="openid_process_cancelled">The login was cancelled</string> <string name="openid_invalid_auth_result">Invalid authorization result</string> + <string name="openid_error_expected_intent">Expected IntentWithRequestCode</string> + <string name="openid_error_controller_not_bounded">OpenIdController is not bound to a lifecycle scope</string> + <string name="openid_login_cancelled">Authentication cancelled</string> + <string name="error_device_not_registered">Device not registered</string> + <string name="missing_username_from_oauth_login_response">Missing username from OAuth login response</string> </resources> \ No newline at end of file diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/accounts/ui/screen/AccountItem.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/accounts/ui/screen/AccountItem.kt index af7a132c5e1..7ee54e2e0e5 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/accounts/ui/screen/AccountItem.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/accounts/ui/screen/AccountItem.kt @@ -9,6 +9,7 @@ import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag import org.dhis2.mobile.commons.resources.getDrawableResource import org.dhis2.mobile.login.accounts.domain.model.AccountModel import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItem @@ -20,6 +21,8 @@ import org.hisp.dhis.mobile.ui.designsystem.component.ListCardTitleModel import org.hisp.dhis.mobile.ui.designsystem.component.state.rememberAdditionalInfoColumnState import org.hisp.dhis.mobile.ui.designsystem.component.state.rememberListCardState +const val ACCOUNT_ITEM_TAG = "account_item" + @OptIn(ExperimentalMaterial3Api::class, ExperimentalSharedTransitionApi::class) @Composable fun AccountItem( @@ -61,7 +64,8 @@ fun AccountItem( ListCard( modifier = modifier - .fillMaxWidth(), + .fillMaxWidth() + .testTag("${ACCOUNT_ITEM_TAG}_${account.serverUrl}_${account.name}"), listCardState = listCardState, onCardClick = { onItemClicked(account) }, listAvatar = { diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/accounts/ui/viewmodel/AccountsViewModel.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/accounts/ui/viewmodel/AccountsViewModel.kt index 65acf2dbe6b..f751d0ec19c 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/accounts/ui/viewmodel/AccountsViewModel.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/accounts/ui/viewmodel/AccountsViewModel.kt @@ -36,12 +36,13 @@ class AccountsViewModel( fun onAccountClicked(account: AccountModel) { viewModelScope.launch { navigator.navigate( - LoginScreenState.LegacyLogin( + LoginScreenState.LoginCredentials( selectedServer = account.serverUrl, selectedUsername = account.name, serverName = account.serverName, selectedServerFlag = account.serverFlag, allowRecovery = account.allowRecovery, + oAuthEnabled = account.isOauthEnabled, ), ) } diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/OpenIdController.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/OpenIdController.kt new file mode 100644 index 00000000000..9af4d7672b0 --- /dev/null +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/OpenIdController.kt @@ -0,0 +1,12 @@ +package org.dhis2.mobile.login.authentication + +interface OpenIdController { + fun handleIntent( + intent: Any, + onResult: suspend (Result<Any>) -> Unit, + ) + + fun bind(context: Any) + + fun unbind() +} diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/ui/screen/TwoFADisableScreen.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/ui/screen/TwoFADisableScreen.kt index ad17df82cf1..171f81c9a22 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/ui/screen/TwoFADisableScreen.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/ui/screen/TwoFADisableScreen.kt @@ -19,11 +19,10 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier -import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.unit.dp import org.dhis2.mobile.login.authentication.ui.state.TwoFAUiState import org.dhis2.mobile.login.resources.Res -import org.dhis2.mobile.login.resources.two_fa_code +import org.dhis2.mobile.login.resources.two_fa_authentication_code import org.dhis2.mobile.login.resources.two_fa_disable_button import org.dhis2.mobile.login.resources.two_fa_disable_desc_1 import org.dhis2.mobile.login.resources.two_fa_disable_desc_2 @@ -35,8 +34,9 @@ import org.hisp.dhis.mobile.ui.designsystem.component.Button import org.hisp.dhis.mobile.ui.designsystem.component.ButtonStyle import org.hisp.dhis.mobile.ui.designsystem.component.ColorStyle import org.hisp.dhis.mobile.ui.designsystem.component.InfoBar +import org.hisp.dhis.mobile.ui.designsystem.component.InputSegmentedShell import org.hisp.dhis.mobile.ui.designsystem.component.InputShellState -import org.hisp.dhis.mobile.ui.designsystem.component.InputText +import org.hisp.dhis.mobile.ui.designsystem.component.InputStyle import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextData import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextState import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor @@ -49,7 +49,7 @@ fun TwoFADisableScreen( onAuthCodeUpdated: (String) -> Unit, onDisable: (String) -> Unit, ) { - var authCode: TextFieldValue by remember(twoFADisableUiState) { mutableStateOf(TextFieldValue("")) } + var authCode by remember(twoFADisableUiState) { mutableStateOf("") } Column(verticalArrangement = Arrangement.spacedBy(16.dp)) { InfoBar( @@ -77,27 +77,28 @@ fun TwoFADisableScreen( stepNumber = "2.", text = stringResource(Res.string.two_fa_disable_desc_2), ) { - InputText( - inputTextFieldValue = authCode, - onValueChanged = { - it?.let { - authCode = it - onAuthCodeUpdated(it.text) - } - }, - title = stringResource(Res.string.two_fa_code), - state = twoFADisableUiState.state, - supportingText = + Text( + text = stringResource(Res.string.two_fa_authentication_code), + style = MaterialTheme.typography.bodyMedium, + ) + InputSegmentedShell( + segmentCount = 6, + inputStyle = InputStyle.BrightInputStyle(), + enabled = !twoFADisableUiState.isDisabling, + supportingTextData = if (twoFADisableUiState.state == InputShellState.ERROR) { - listOf( - SupportingTextData( - text = stringResource(Res.string.two_fa_disable_error), - state = SupportingTextState.ERROR, - ), + SupportingTextData( + text = stringResource(Res.string.two_fa_disable_error), + state = SupportingTextState.ERROR, ) } else { null }, + initialValue = authCode, + onValueChanged = { + authCode = it.replace("-", "") + onAuthCodeUpdated(authCode) + }, ) Button( modifier = Modifier.fillMaxWidth().padding(top = 8.dp), @@ -108,8 +109,8 @@ fun TwoFADisableScreen( }, colorStyle = ColorStyle.ERROR, style = ButtonStyle.FILLED, - enabled = authCode.text.length >= 6 && twoFADisableUiState.isDisabling.not(), - onClick = { onDisable(authCode.text) }, + enabled = authCode.length >= 6 && twoFADisableUiState.isDisabling.not(), + onClick = { onDisable(authCode) }, icon = { Icon( imageVector = Icons.Outlined.KeyOff, diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/ui/screen/TwoFASettingsScreen.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/ui/screen/TwoFASettingsScreen.kt index e6cba2a36bb..2a776b6db93 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/ui/screen/TwoFASettingsScreen.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/ui/screen/TwoFASettingsScreen.kt @@ -110,8 +110,6 @@ fun TwoFASettingsScreen( Snackbar( modifier = Modifier.dropShadow(shape = SnackbarDefaults.shape), snackbarData = data, - containerColor = SurfaceColor.SurfaceBright, - contentColor = TextColor.OnSurface, ) } }, diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/ui/screen/TwoFAToEnableScreen.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/ui/screen/TwoFAToEnableScreen.kt index 47f548a0a78..9846e3b312c 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/ui/screen/TwoFAToEnableScreen.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/authentication/ui/screen/TwoFAToEnableScreen.kt @@ -26,7 +26,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.testTag import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.input.TextFieldValue +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import org.dhis2.mobile.login.authentication.ui.state.TwoFAUiState @@ -51,8 +51,8 @@ import org.hisp.dhis.mobile.ui.designsystem.component.ButtonStyle import org.hisp.dhis.mobile.ui.designsystem.component.IconButton import org.hisp.dhis.mobile.ui.designsystem.component.IconButtonStyle import org.hisp.dhis.mobile.ui.designsystem.component.InfoBar -import org.hisp.dhis.mobile.ui.designsystem.component.InputShellState -import org.hisp.dhis.mobile.ui.designsystem.component.InputText +import org.hisp.dhis.mobile.ui.designsystem.component.InputSegmentedShell +import org.hisp.dhis.mobile.ui.designsystem.component.InputStyle import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextData import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextState import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme @@ -62,7 +62,6 @@ import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor import org.hisp.dhis.mobile.ui.designsystem.theme.TextColor import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.stringResource -import org.jetbrains.compose.ui.tooling.preview.Preview const val TURN_ON_BUTTON_TEST_TAG = "turn_on_button_test_tag" @@ -215,8 +214,8 @@ fun TwoFAAuthStepThree( enableUiState: TwoFAUiState.Enable, onEnableButtonClicked: (String) -> Unit, ) { - var textValue by rememberSaveable(stateSaver = TextFieldValue.Saver) { - mutableStateOf(TextFieldValue("")) + var textValue by rememberSaveable { + mutableStateOf("") } Column( @@ -247,24 +246,25 @@ fun TwoFAAuthStepThree( .padding(top = 16.dp), verticalArrangement = spacedBy(12.dp), ) { - InputText( - title = stringResource(Res.string.two_fa_authentication_code), - supportingText = + Text( + text = stringResource(Res.string.two_fa_authentication_code), + style = MaterialTheme.typography.bodyMedium, + ) + InputSegmentedShell( + segmentCount = 6, + inputStyle = InputStyle.BrightInputStyle(), + enabled = !enableUiState.isEnabling, + supportingTextData = enableUiState.enableErrorMessage?.let { - listOf( - SupportingTextData( - text = stringResource(Res.string.two_fa_failed_to_turn_on), - state = SupportingTextState.ERROR, - ), + SupportingTextData( + text = stringResource(Res.string.two_fa_failed_to_turn_on), + state = SupportingTextState.ERROR, ) }, - inputTextFieldValue = textValue, + initialValue = textValue, onValueChanged = { - if (it != null) { - textValue = it - } + textValue = it.replace("-", "") }, - state = InputShellState.FOCUSED, ) Button( @@ -272,7 +272,7 @@ fun TwoFAAuthStepThree( when (enableUiState.isEnabling) { true -> false else -> { - textValue.text.length == 6 + textValue.length == 6 } }, modifier = @@ -297,7 +297,7 @@ fun TwoFAAuthStepThree( contentDescription = "Status Icon", ) }, - onClick = { onEnableButtonClicked(textValue.text) }, + onClick = { onEnableButtonClicked(textValue) }, ) } } diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepository.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepository.kt index 9da51f7fbfc..0a825ab87fa 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepository.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/data/LoginRepository.kt @@ -1,7 +1,9 @@ package org.dhis2.mobile.login.main.data import coil3.PlatformContext +import org.dhis2.mobile.login.main.domain.model.OpenIdLoginConfiguration import org.dhis2.mobile.login.main.domain.model.ServerValidationResult + typealias UserPassword = String interface LoginRepository { @@ -51,17 +53,21 @@ interface LoginRepository { suspend fun importDatabase(path: String): Result<Unit> - suspend fun loginWithOpenId( - serverUrl: String, - isNetworkAvailable: Boolean, - clientId: String, - redirectUri: String, - discoveryUri: String?, - authorizationUri: String?, - tokenUrl: String?, - ): Result<Unit> + suspend fun loginWithOpenId(openIdLoginConfiguration: OpenIdLoginConfiguration): Result<Unit> suspend fun getUsername(): String suspend fun logoutUser(): Result<Unit> + + suspend fun getDeviceEnrollmentUrl(serverUrl: String): String + + suspend fun enrollDevice( + iat: String, + serverURL: String, + ): String + + suspend fun loginUserWithOAuth( + serverUrl: String, + code: String, + ): Result<String?> } diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.kt index 895d4a6c236..ad3a8473672 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.kt @@ -5,12 +5,15 @@ import org.dhis2.mobile.login.authentication.di.twoFAModule import org.dhis2.mobile.login.main.domain.usecase.BiometricLogin import org.dhis2.mobile.login.main.domain.usecase.GetAvailableUsernames import org.dhis2.mobile.login.main.domain.usecase.GetBiometricInfo +import org.dhis2.mobile.login.main.domain.usecase.GetDeviceEnrollmentUrl import org.dhis2.mobile.login.main.domain.usecase.GetHasOtherAccounts import org.dhis2.mobile.login.main.domain.usecase.GetInitialScreen import org.dhis2.mobile.login.main.domain.usecase.ImportDatabase import org.dhis2.mobile.login.main.domain.usecase.LogOutUser import org.dhis2.mobile.login.main.domain.usecase.LoginUser +import org.dhis2.mobile.login.main.domain.usecase.LoginUserWithOAuth import org.dhis2.mobile.login.main.domain.usecase.OpenIdLogin +import org.dhis2.mobile.login.main.domain.usecase.ProcessDeviceEnrollment import org.dhis2.mobile.login.main.domain.usecase.UpdateBiometricPermission import org.dhis2.mobile.login.main.domain.usecase.UpdateTrackingPermission import org.dhis2.mobile.login.main.domain.usecase.ValidateServer @@ -71,15 +74,27 @@ internal val mainLoginModule = factory { params -> OpenIdLogin(get { parametersOf(params.get()) }) } + + factory { params -> + GetDeviceEnrollmentUrl(get { parametersOf(params.get()) }) + } + + factory { params -> + ProcessDeviceEnrollment(get { parametersOf(params.get()) }) + } + + factory { params -> + LoginUserWithOAuth(get { parametersOf(params.get()) }) + } + viewModel { parameters -> val context = parameters.get<PlatformContext>() LoginViewModel( - get(), - get(), - get { parametersOf(context) }, - get { parametersOf(context) }, - get(), - get(), + navigator = get(), + getInitialScreen = get(), + importDatabase = get { parametersOf(context) }, + validateServer = get { parametersOf(context) }, + networkStatusProvider = get(), ) } viewModel { parameters -> @@ -90,6 +105,7 @@ internal val mainLoginModule = val oidcInfo = parameters[4] as OidcInfo? val context = parameters[5] as PlatformContext val fromHome = parameters[6] as Boolean + val oAuthEnable = parameters[7] as Boolean CredentialsViewModel( navigator = get(), getAvailableUsernames = get { parametersOf(context) }, @@ -99,8 +115,12 @@ internal val mainLoginModule = logOutUser = get { parametersOf(context) }, openIdLogin = get { parametersOf(context) }, biometricLogin = get { parametersOf(context) }, + loginUserWithOAuth = get { parametersOf(context) }, + getDeviceEnrollmentUrl = get { parametersOf(context) }, + processDeviceEnrollment = get { parametersOf(context) }, updateTrackingPermission = get { parametersOf(context) }, updateBiometricPermission = get { parametersOf(context) }, + appLinkNavigation = get(), networkStatusProvider = get(), serverName = serverName, serverUrl = serverUrl, @@ -110,6 +130,7 @@ internal val mainLoginModule = oidcInfo = oidcInfo, forgotPinUseCase = get(), fromHome = fromHome, + oAuthEnable = oAuthEnable, ) } } diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/DeviceEnrollmentInfo.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/DeviceEnrollmentInfo.kt new file mode 100644 index 00000000000..6b5031cdf17 --- /dev/null +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/DeviceEnrollmentInfo.kt @@ -0,0 +1,6 @@ +package org.dhis2.mobile.login.main.domain.model + +data class DeviceEnrollmentInfo( + val iat: String, + val serverURL: String, +) diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/LoginScreenState.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/LoginScreenState.kt index 7e2050a2434..2a11b406016 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/LoginScreenState.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/LoginScreenState.kt @@ -16,16 +16,17 @@ sealed interface LoginScreenState { ) : LoginScreenState @Serializable - data class LegacyLogin( + data class LoginCredentials( val selectedServer: String, val selectedUsername: String?, val serverName: String?, val selectedServerFlag: String?, val allowRecovery: Boolean, + val oAuthEnabled: Boolean, ) : LoginScreenState @Serializable - data class OauthLogin( + data class OauthAuthentication( val selectedServer: String, ) : LoginScreenState diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/OpenIdLoginConfiguration.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/OpenIdLoginConfiguration.kt new file mode 100644 index 00000000000..6cbf7a50ad7 --- /dev/null +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/OpenIdLoginConfiguration.kt @@ -0,0 +1,12 @@ +package org.dhis2.mobile.login.main.domain.model + +data class OpenIdLoginConfiguration( + val serverUrl: String, + val isNetworkAvailable: Boolean, + val clientId: String, + val redirectUri: String, + val discoveryUri: String?, + val authorizationUri: String?, + val tokenUrl: String?, + val prompt: String?, +) diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/ServerValidationResult.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/ServerValidationResult.kt index 527f18a6c64..d870f7b880f 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/ServerValidationResult.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/model/ServerValidationResult.kt @@ -1,7 +1,7 @@ package org.dhis2.mobile.login.main.domain.model sealed interface ServerValidationResult { - data class Legacy( + data class Success( val serverName: String?, val serverDescription: String?, val countryFlag: String?, @@ -9,10 +9,9 @@ sealed interface ServerValidationResult { val oidcIcon: String?, val oidcLoginText: String?, val oidcUrl: String?, + val oAuthEnabled: Boolean, ) : ServerValidationResult - object Oauth : ServerValidationResult - data class Error( val message: String, ) : ServerValidationResult diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/GetDeviceEnrollmentUrl.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/GetDeviceEnrollmentUrl.kt new file mode 100644 index 00000000000..fc3d1d5c854 --- /dev/null +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/GetDeviceEnrollmentUrl.kt @@ -0,0 +1,16 @@ +package org.dhis2.mobile.login.main.domain.usecase + +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.mobile.login.main.data.LoginRepository + +class GetDeviceEnrollmentUrl( + private val repository: LoginRepository, +) : UseCase<String, String> { + override suspend fun invoke(input: String): Result<String> = + try { + Result.success(repository.getDeviceEnrollmentUrl(input)) + } catch (e: DomainError) { + Result.failure(e) + } +} diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/GetInitialScreen.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/GetInitialScreen.kt index 31af22fa7d8..0d8f56985ce 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/GetInitialScreen.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/GetInitialScreen.kt @@ -27,28 +27,24 @@ class GetInitialScreen( } private fun handleSingleAccount(account: AccountModel): LoginScreenState = - if (account.isOauthEnabled) { - LoginScreenState.OauthLogin(selectedServer = account.serverUrl) - } else { - account.toLegacyLoginState() - } + LoginScreenState.LoginCredentials( + selectedServer = account.serverUrl, + selectedUsername = account.name, + serverName = account.serverName, + selectedServerFlag = account.serverFlag, + allowRecovery = account.allowRecovery, + oAuthEnabled = account.isOauthEnabled, + ) private suspend fun handleLockedSession(): LoginScreenState { val activeAccount = accountRepository.getActiveAccount() ?: return LoginScreenState.Accounts - - return if (activeAccount.isOauthEnabled) { - LoginScreenState.OauthLogin(selectedServer = activeAccount.serverUrl) - } else { - activeAccount.toLegacyLoginState() - } - } - - private fun AccountModel.toLegacyLoginState(): LoginScreenState.LegacyLogin = - LoginScreenState.LegacyLogin( - selectedServer = serverUrl, - selectedUsername = name, - serverName = serverName, - selectedServerFlag = serverFlag, - allowRecovery = allowRecovery, + return LoginScreenState.LoginCredentials( + selectedServer = activeAccount.serverUrl, + selectedUsername = activeAccount.name, + serverName = activeAccount.serverName, + selectedServerFlag = activeAccount.serverFlag, + allowRecovery = activeAccount.allowRecovery, + oAuthEnabled = activeAccount.isOauthEnabled, ) + } } diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/LoginUser.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/LoginUser.kt index 4565d7956e9..fcf376d5dc5 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/LoginUser.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/LoginUser.kt @@ -12,7 +12,8 @@ class LoginUser( password: String, isNetworkAvailable: Boolean, ): LoginResult { - val result = repository.loginUser(serverUrl, username, password, isNetworkAvailable) - return handleResult(result, serverUrl, username) + val trimmedUsername = username.trim() + val result = repository.loginUser(serverUrl, trimmedUsername, password, isNetworkAvailable) + return handleResult(result, serverUrl, trimmedUsername) } } diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/LoginUserWithOAuth.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/LoginUserWithOAuth.kt new file mode 100644 index 00000000000..87ea9e47967 --- /dev/null +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/LoginUserWithOAuth.kt @@ -0,0 +1,32 @@ +package org.dhis2.mobile.login.main.domain.usecase + +import org.dhis2.mobile.login.main.data.LoginRepository +import org.dhis2.mobile.login.main.domain.model.LoginResult +import org.dhis2.mobile.login.resources.Res +import org.dhis2.mobile.login.resources.missing_username_from_oauth_login_response +import org.jetbrains.compose.resources.getString + +class LoginUserWithOAuth( + repository: LoginRepository, +) : BaseLogin(repository) { + suspend operator fun invoke( + serverUrl: String, + code: String, + ): LoginResult { + val result = repository.loginUserWithOAuth(serverUrl, code) + return when { + result.isSuccess -> { + val username = result.getOrNull() + if (username != null) { + handleResult(Result.success(Unit), serverUrl, username) + } else { + LoginResult.Error(getString(Res.string.missing_username_from_oauth_login_response)) + } + } + + else -> { + LoginResult.Error(result.exceptionOrNull()?.message) + } + } + } +} diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/OpenIdLogin.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/OpenIdLogin.kt index 3ec5ccda6e4..8ab72e4d9a3 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/OpenIdLogin.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/OpenIdLogin.kt @@ -2,30 +2,14 @@ package org.dhis2.mobile.login.main.domain.usecase import org.dhis2.mobile.login.main.data.LoginRepository import org.dhis2.mobile.login.main.domain.model.LoginResult +import org.dhis2.mobile.login.main.domain.model.OpenIdLoginConfiguration class OpenIdLogin( repository: LoginRepository, ) : BaseLogin(repository) { - suspend operator fun invoke( - serverUrl: String, - isNetworkAvailable: Boolean, - clientId: String, - redirectUri: String, - discoveryUri: String?, - authorizationUri: String?, - tokenUrl: String?, - ): LoginResult { - val result = - repository.loginWithOpenId( - serverUrl = serverUrl, - isNetworkAvailable = isNetworkAvailable, - clientId = clientId, - redirectUri = redirectUri, - discoveryUri = discoveryUri, - authorizationUri = authorizationUri, - tokenUrl = tokenUrl, - ) + suspend operator fun invoke(openIdLoginConfiguration: OpenIdLoginConfiguration): LoginResult { + val result = repository.loginWithOpenId(openIdLoginConfiguration) val username = if (result.isSuccess) repository.getUsername() else "" - return handleResult(result, serverUrl, username) + return handleResult(result, openIdLoginConfiguration.serverUrl, username) } } diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/ProcessDeviceEnrollment.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/ProcessDeviceEnrollment.kt new file mode 100644 index 00000000000..36af353f0f2 --- /dev/null +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/ProcessDeviceEnrollment.kt @@ -0,0 +1,22 @@ +package org.dhis2.mobile.login.main.domain.usecase + +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.mobile.login.main.data.LoginRepository +import org.dhis2.mobile.login.main.domain.model.DeviceEnrollmentInfo + +class ProcessDeviceEnrollment( + private val repository: LoginRepository, +) : UseCase<DeviceEnrollmentInfo, String> { + override suspend fun invoke(input: DeviceEnrollmentInfo): Result<String> = + try { + Result.success( + repository.enrollDevice( + iat = input.iat, + serverURL = input.serverURL, + ), + ) + } catch (e: DomainError) { + Result.failure(e) + } +} diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/UpdateBiometricPermission.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/UpdateBiometricPermission.kt index 71aa7cb3eaf..b9cf84f5d14 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/UpdateBiometricPermission.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/domain/usecase/UpdateBiometricPermission.kt @@ -32,20 +32,19 @@ class UpdateBiometricPermission( val cancellationMessage = getString(Res.string.biometrics_permission_cancelled) suspendCancellableCoroutine { continuation -> val scope = CoroutineScope(continuation.context) - cryptographics.getInitializedCipherForEncryption()?.let { - biometrics.authenticate(it) { cryptoObjectCipher -> - scope.launch { - val ciphertextWrapper = - cryptographics.encryptData(password, cryptoObjectCipher) - preferences.saveUserCredentialsAndCipher( - serverUrl, - username, - ciphertextWrapper, - ) - loginRepository.updateBiometricsPermissions(granted) - if (continuation.isActive) { - continuation.resume(Result.success(Unit)) - } + val cipher = cryptographics.getInitializedCipherForEncryption() + biometrics.authenticate(cipher) { cryptoObjectCipher -> + scope.launch { + val ciphertextWrapper = + cryptographics.encryptData(password, cryptoObjectCipher) + preferences.saveUserCredentialsAndCipher( + serverUrl, + username, + ciphertextWrapper, + ) + loginRepository.updateBiometricsPermissions(granted) + if (continuation.isActive) { + continuation.resume(Result.success(Unit)) } } } diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/CredentialsScreen.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/CredentialsScreen.kt index 8bd562f811c..09e10afd240 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/CredentialsScreen.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/CredentialsScreen.kt @@ -3,6 +3,7 @@ package org.dhis2.mobile.login.main.ui.screen import androidx.compose.animation.AnimatedVisibilityScope import androidx.compose.animation.ExperimentalSharedTransitionApi import androidx.compose.animation.SharedTransitionScope +import androidx.compose.foundation.background import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement.spacedBy import androidx.compose.foundation.layout.Box @@ -12,6 +13,7 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.Login import androidx.compose.material.icons.automirrored.outlined.ShowChart @@ -37,6 +39,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusDirection import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.platform.testTag import androidx.compose.ui.text.LinkAnnotation import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.TextLinkStyles @@ -57,8 +60,8 @@ import org.dhis2.mobile.login.main.ui.state.CredentialsUpdate import org.dhis2.mobile.login.main.ui.state.LoginState import org.dhis2.mobile.login.main.ui.state.OidcInfo import org.dhis2.mobile.login.main.ui.viewmodel.CredentialsViewModel -import org.dhis2.mobile.login.pin.ui.components.PinBottomSheet -import org.dhis2.mobile.login.pin.ui.components.PinMode +import org.dhis2.mobile.login.pin.domain.model.PinMode +import org.dhis2.mobile.login.pin.ui.components.PinDialog import org.dhis2.mobile.login.resources.Res import org.dhis2.mobile.login.resources.action_log_in import org.dhis2.mobile.login.resources.action_manage_account @@ -97,11 +100,18 @@ import org.hisp.dhis.mobile.ui.designsystem.component.state.BottomSheetShellUISt import org.hisp.dhis.mobile.ui.designsystem.component.state.rememberAdditionalInfoColumnState import org.hisp.dhis.mobile.ui.designsystem.component.state.rememberListCardState import org.hisp.dhis.mobile.ui.designsystem.theme.Spacing +import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor import org.hisp.dhis.mobile.ui.designsystem.theme.TextColor import org.jetbrains.compose.resources.stringResource import org.koin.compose.viewmodel.koinViewModel import org.koin.core.parameter.parametersOf +const val CREDENTIALS_USERNAME_INPUT_TAG = "credentials_username_input" +const val CREDENTIALS_PASSWORD_INPUT_TAG = "credentials_password_input" +const val CREDENTIALS_LOGIN_BUTTON_TAG = "credentials_login_button" +const val CREDENTIALS_ERROR_INFO_BAR_TAG = "credentials_error_info_bar" +const val CREDENTIALS_MANAGE_ACCOUNTS_BUTTON_TAG = "credentials_manage_accounts_button" + @OptIn(ExperimentalSharedTransitionApi::class) @Composable context(sharedTransitionScope: SharedTransitionScope, animatedVisibilityScope: AnimatedVisibilityScope) @@ -113,6 +123,7 @@ fun CredentialsScreen( allowRecovery: Boolean, oidcInfo: OidcInfo?, fromHome: Boolean, + oAuthEnable: Boolean, ) { val context = LocalPlatformContext.current @@ -126,6 +137,7 @@ fun CredentialsScreen( oidcInfo, context, fromHome, + oAuthEnable, ) } @@ -183,25 +195,28 @@ fun CredentialsScreen( serverImageUrl = selectedServerFlag, ) } - CredentialsContainer( - availableUsernames = screenState.credentialsInfo.availableUsernames, - username = screenState.credentialsInfo.username, - password = screenState.credentialsInfo.password, - isUsernameEditable = screenState.credentialsInfo.usernameCanBeEdited, - isLoggingIn = isLoggingIn, - onCredentialsUpdate = { credentialsUpdate -> - when (credentialsUpdate) { - CredentialsUpdate.Complete -> - viewModel.onLoginClicked() - is CredentialsUpdate.Password -> - viewModel.updatePassword(credentialsUpdate.password) + if (!oAuthEnable) { + CredentialsContainer( + availableUsernames = screenState.credentialsInfo.availableUsernames, + username = screenState.credentialsInfo.username, + password = screenState.credentialsInfo.password, + isUsernameEditable = screenState.credentialsInfo.usernameCanBeEdited, + isLoggingIn = isLoggingIn, + onCredentialsUpdate = { credentialsUpdate -> + when (credentialsUpdate) { + CredentialsUpdate.Complete -> + viewModel.onLoginClicked() - is CredentialsUpdate.Username -> - viewModel.updateUsername(credentialsUpdate.username) - } - }, - ) + is CredentialsUpdate.Password -> + viewModel.updatePassword(credentialsUpdate.password) + + is CredentialsUpdate.Username -> + viewModel.updateUsername(credentialsUpdate.username) + } + }, + ) + } LoginStatus( isLoggingIn = isLoggingIn, loginErrorMessage = screenState.errorMessage, @@ -237,7 +252,7 @@ fun CredentialsScreen( } if (screenState.isSessionLocked) { - PinBottomSheet( + PinDialog( mode = PinMode.ASK, onSuccess = { viewModel.onPinUnlocked() @@ -262,11 +277,13 @@ private fun handleCredentialAction( CredentialsAction.OnLoginClicked -> viewModel.onLoginClicked() + CredentialsAction.OnManageAccounts -> viewModel.onManageAccountsClicked() CredentialsAction.OnOpenIdLogin -> viewModel.onOpenIdLogin() + CredentialsAction.OnRecoverAccount -> viewModel.onRecoverAccountClicked() } @@ -319,6 +336,11 @@ private fun ServerInfo( ), listAvatar = { Avatar( + modifier = + Modifier.background( + color = SurfaceColor.PrimaryContainer, + shape = CircleShape, + ), style = flag?.let { painter -> AvatarStyleData.Image(painter) @@ -384,7 +406,7 @@ private fun CredentialsContainer( ) { if (isUsernameEditable) { InputUser( - modifier = Modifier.fillMaxWidth(), + modifier = Modifier.fillMaxWidth().testTag(CREDENTIALS_USERNAME_INPUT_TAG), uiModel = InputUserModel( title = stringResource(Res.string.username_hint), @@ -417,7 +439,7 @@ private fun CredentialsContainer( ) } InputPassword( - modifier = Modifier.fillMaxWidth(), + modifier = Modifier.fillMaxWidth().testTag(CREDENTIALS_PASSWORD_INPUT_TAG), uiModel = InputPasswordModel( title = stringResource(Res.string.password_hint), @@ -471,7 +493,7 @@ private fun LoginStatus( ) } else if (loginErrorMessage != null) { InfoBar( - modifier = Modifier, + modifier = Modifier.testTag(CREDENTIALS_ERROR_INFO_BAR_TAG), text = loginErrorMessage, textColor = MaterialTheme.colorScheme.onErrorContainer, backgroundColor = MaterialTheme.colorScheme.errorContainer, @@ -501,7 +523,7 @@ private fun CredentialActions( verticalArrangement = spacedBy(Spacing.Spacing0), ) { Button( - modifier = Modifier.fillMaxWidth(), + modifier = Modifier.fillMaxWidth().testTag(CREDENTIALS_LOGIN_BUTTON_TAG), enabled = canLogin, text = stringResource(Res.string.action_log_in), style = ButtonStyle.FILLED, @@ -568,7 +590,9 @@ private fun CredentialActions( } Button( modifier = Modifier.fillMaxWidth(), - text = oidcInfo.buttonText ?: stringResource(Res.string.action_openid_log_in), + text = + oidcInfo.buttonText.takeIf { !it.isNullOrEmpty() } + ?: stringResource(Res.string.action_openid_log_in), icon = { Icon( imageVector = Icons.AutoMirrored.Outlined.Login, @@ -591,7 +615,10 @@ private fun CredentialActions( contentAlignment = Alignment.BottomCenter, ) { Button( - modifier = Modifier.fillMaxWidth(), + modifier = + Modifier + .fillMaxWidth() + .testTag(CREDENTIALS_MANAGE_ACCOUNTS_BUTTON_TAG), text = stringResource(Res.string.action_manage_account), style = ButtonStyle.OUTLINED, onClick = { diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/LoginScreen.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/LoginScreen.kt index 7c8d14f739d..c5de1106f2a 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/LoginScreen.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/LoginScreen.kt @@ -46,6 +46,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalLayoutDirection +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost @@ -70,13 +71,11 @@ import org.hisp.dhis.mobile.ui.designsystem.component.menu.DropDownMenu import org.hisp.dhis.mobile.ui.designsystem.component.menu.MenuItemData import org.hisp.dhis.mobile.ui.designsystem.component.menu.MenuLeadingElement import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme -import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor -import org.hisp.dhis.mobile.ui.designsystem.theme.TextColor import org.hisp.dhis.mobile.ui.designsystem.theme.dropShadow import org.jetbrains.compose.resources.getString import org.jetbrains.compose.resources.stringResource import org.jetbrains.compose.resources.vectorResource -import org.jetbrains.compose.ui.tooling.preview.Preview +import org.koin.compose.koinInject import org.koin.compose.viewmodel.koinViewModel import org.koin.core.parameter.parametersOf @@ -93,6 +92,7 @@ fun LoginScreen( ) { val context = LocalPlatformContext.current val viewModel = koinViewModel<LoginViewModel> { parametersOf(context) } + val fixedOidcInfo = koinInject<OidcInfo>() var displayMoreActions by remember { mutableStateOf(false) } var displayBackArrow by remember { mutableStateOf(false) } val snackBarHostState = remember { SnackbarHostState() } @@ -137,8 +137,6 @@ fun LoginScreen( Snackbar( modifier = Modifier.dropShadow(shape = SnackbarDefaults.shape), snackbarData = data, - containerColor = SurfaceColor.SurfaceBright, - contentColor = TextColor.OnSurface, ) } }, @@ -201,8 +199,8 @@ fun LoginScreen( onManageAccounts = viewModel::onBackToManageAccounts, ) } - composable<LoginScreenState.LegacyLogin> { - val arg = it.toRoute<LoginScreenState.LegacyLogin>() + composable<LoginScreenState.LoginCredentials> { + val arg = it.toRoute<LoginScreenState.LoginCredentials>() displayMoreActions = arg.selectedServer.isEmpty() displayBackArrow = true CredentialsScreen( @@ -212,17 +210,21 @@ fun LoginScreen( selectedServerFlag = arg.selectedServerFlag, allowRecovery = arg.allowRecovery, oidcInfo = - fixedOpenIdProvider()?.takeIf { info -> + fixedOpenIdProvider(fixedOidcInfo).takeIf { info -> info.serverUrl == arg.selectedServer }, fromHome = fromHome, + oAuthEnable = arg.oAuthEnabled, ) } - composable<LoginScreenState.OauthLogin> { - val args = it.toRoute<LoginScreenState.OauthLogin>() - WebAuthenticator(url = args.selectedServer) { - viewModel.onOauthLoginCancelled() - } + composable<LoginScreenState.OauthAuthentication> { + val args = it.toRoute<LoginScreenState.OauthAuthentication>() + WebAuthenticator( + url = args.selectedServer, + onDismiss = { + viewModel.onOauthLoginCancelled() + }, + ) } composable<LoginScreenState.Accounts> { displayMoreActions = true @@ -245,14 +247,12 @@ fun LoginScreen( /** * OpenId Configuration - * Return either OidcInfo.Token or OidcInfo.Discovery classes to configure the login screen. - * Don't forget to add the RedirectUriReceiverActivity in the android manifest. Check the - * documentation for more info. + * Returns oidcInfo setup by environment variables, if you want to configure manually, + * replace it by either OidcInfo.Token or OidcInfo.Discovery classes. + * Don't forget to add the auth scheme in RedirectUriReceiverActivity in the android manifest. + * Check the documentation for more info. * */ -private fun fixedOpenIdProvider(): OidcInfo? { - // Change to the correct provider - return null -} +private fun fixedOpenIdProvider(oidcInfo: OidcInfo): OidcInfo = oidcInfo @Composable fun LoginTopBar( diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/ServerValidationContent.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/ServerValidationContent.kt index f8a34e422b3..31446065e0b 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/ServerValidationContent.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/screen/ServerValidationContent.kt @@ -131,7 +131,7 @@ internal fun ServerValidationContent( server = it ?: TextFieldValue() }, imeAction = ImeAction.Done, - onNextClicked = { + onImeActionClick = { onValidate(server.text) inputFocusState = InputShellState.UNFOCUSED }, diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/state/CredentialsUiState.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/state/CredentialsUiState.kt index b6e2c17fc2c..40602a77f60 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/state/CredentialsUiState.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/state/CredentialsUiState.kt @@ -14,6 +14,7 @@ data class CredentialsUiState( val displayBiometricsDialog: Boolean, val hasOtherAccounts: Boolean, val isSessionLocked: Boolean, + val oAuthEnable: Boolean, ) { fun username() = serverInfo.username ?: credentialsInfo.username } @@ -37,6 +38,7 @@ sealed class OidcInfo( val buttonText: String?, val oidcClientId: String, val oidcRedirectUri: String, + val userPrompt: String?, ) { @Serializable data class Discovery( @@ -45,7 +47,14 @@ sealed class OidcInfo( val clientId: String, val redirectUri: String, val discoveryUri: String, - ) : OidcInfo(server, loginButtonText, clientId, redirectUri) + val prompt: String?, + ) : OidcInfo( + serverUrl = server, + buttonText = loginButtonText, + oidcClientId = clientId, + oidcRedirectUri = redirectUri, + userPrompt = prompt, + ) @Serializable data class Token( @@ -55,7 +64,14 @@ sealed class OidcInfo( val redirectUri: String, val authorizationUrl: String, val tokenUrl: String, - ) : OidcInfo(server, loginLabel, clientId, redirectUri) + val prompt: String?, + ) : OidcInfo( + serverUrl = server, + buttonText = loginLabel, + oidcClientId = clientId, + oidcRedirectUri = redirectUri, + userPrompt = prompt, + ) fun discoveryUri() = when (this) { diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModel.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModel.kt index e61bb6a1f27..1b528d92bf2 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModel.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModel.kt @@ -13,17 +13,23 @@ import org.dhis2.mobile.commons.domain.invoke import org.dhis2.mobile.commons.extensions.launchUseCase import org.dhis2.mobile.commons.extensions.withMinimumDuration import org.dhis2.mobile.commons.network.NetworkStatusProvider +import org.dhis2.mobile.login.main.domain.model.DeviceEnrollmentInfo import org.dhis2.mobile.login.main.domain.model.LoginResult import org.dhis2.mobile.login.main.domain.model.LoginScreenState +import org.dhis2.mobile.login.main.domain.model.OpenIdLoginConfiguration import org.dhis2.mobile.login.main.domain.usecase.BiometricLogin import org.dhis2.mobile.login.main.domain.usecase.GetAvailableUsernames import org.dhis2.mobile.login.main.domain.usecase.GetBiometricInfo +import org.dhis2.mobile.login.main.domain.usecase.GetDeviceEnrollmentUrl import org.dhis2.mobile.login.main.domain.usecase.GetHasOtherAccounts import org.dhis2.mobile.login.main.domain.usecase.LogOutUser import org.dhis2.mobile.login.main.domain.usecase.LoginUser +import org.dhis2.mobile.login.main.domain.usecase.LoginUserWithOAuth import org.dhis2.mobile.login.main.domain.usecase.OpenIdLogin +import org.dhis2.mobile.login.main.domain.usecase.ProcessDeviceEnrollment import org.dhis2.mobile.login.main.domain.usecase.UpdateBiometricPermission import org.dhis2.mobile.login.main.domain.usecase.UpdateTrackingPermission +import org.dhis2.mobile.login.main.ui.navigation.AppLinkNavigation import org.dhis2.mobile.login.main.ui.navigation.Navigator import org.dhis2.mobile.login.main.ui.state.AfterLoginAction import org.dhis2.mobile.login.main.ui.state.CredentialsInfo @@ -43,8 +49,12 @@ class CredentialsViewModel( private val logOutUser: LogOutUser, private val biometricLogin: BiometricLogin, private val openIdLogin: OpenIdLogin, + private val loginUserWithOAuth: LoginUserWithOAuth, + private val getDeviceEnrollmentUrl: GetDeviceEnrollmentUrl, + private val processDeviceEnrollment: ProcessDeviceEnrollment, private val updateTrackingPermission: UpdateTrackingPermission, private val updateBiometricPermission: UpdateBiometricPermission, + private val appLinkNavigation: AppLinkNavigation, networkStatusProvider: NetworkStatusProvider, private val serverName: String?, private val serverUrl: String, @@ -54,6 +64,7 @@ class CredentialsViewModel( private val forgotPinUseCase: ForgotPinUseCase, private val oidcInfo: OidcInfo?, private val fromHome: Boolean, + private val oAuthEnable: Boolean, ) : ViewModel() { private val isNetworkOnline = networkStatusProvider.connectionStatus @@ -87,6 +98,7 @@ class CredentialsViewModel( hasOtherAccounts = false, isSessionLocked = false, displayBiometricsDialog = false, + oAuthEnable = oAuthEnable, ) private var loginJob: Job? = null @@ -102,6 +114,16 @@ class CredentialsViewModel( initialValue = initialState, ) + init { + launchUseCase { + appLinkNavigation.appLink.collect { urlString -> + if (credentialsScreenState.value.loginState is LoginState.Running) { + handleOAuthCallbacks(urlString) + } + } + } + } + private fun loadData() { launchUseCase { val biometricInfo = getBiometricInfo(serverUrl) @@ -121,7 +143,7 @@ class CredentialsViewModel( availableUsernames = getAvailableUsernames(), usernameCanBeEdited = username == null, ), - loginState = LoginState.Disabled, + loginState = if (oAuthEnable) LoginState.Enabled else LoginState.Disabled, errorMessage = null, allowRecovery = allowRecovery, canUseBiometrics = getBiometricInfo(serverUrl).canUseBiometrics, @@ -130,8 +152,116 @@ class CredentialsViewModel( hasOtherAccounts = getHasOtherAccounts(), isSessionLocked = getIsSessionLockedUseCase(), displayBiometricsDialog = biometricInfo.canUseBiometrics && !fromHome, + oAuthEnable = oAuthEnable, ), ) + + if (_credentialsScreenState.value.oAuthEnable && !fromHome) { + fetchOAuthEnrollmentUrl() + } + } + } + + private fun fetchOAuthEnrollmentUrl() { + _credentialsScreenState.update { + it.copy( + loginState = LoginState.Running, + ) + } + launchUseCase { + getDeviceEnrollmentUrl(serverUrl).fold( + onSuccess = { enrollmentURL -> + // First OAuth call (enrollment) - clear any previous OAuth sessions + navigator.navigate( + LoginScreenState.OauthAuthentication( + selectedServer = enrollmentURL, + ), + ) + }, + onFailure = { error -> + _credentialsScreenState.update { + it.copy( + loginState = LoginState.Enabled, + errorMessage = error.message, + ) + } + }, + ) + } + } + + private fun handleOAuthCallbacks(urlString: String) { + // First check if there is any error + val error = urlString.substringAfter("error=", "").substringBefore('&') + if (error.isNotEmpty()) { + _credentialsScreenState.update { + it.copy( + errorMessage = error, + loginState = LoginState.Enabled, + ) + } + return + } + + // Check if there is a device enrollment callback + val iat = urlString.substringAfter("iat=", "").substringBefore('&') + if (iat.isNotEmpty()) { + registerDevice(iat) + return + } + + // Check if there is a login callback with the authorization code + val code = urlString.substringAfter("code=", "").substringBefore('&') + if (code.isNotEmpty()) { + loginWithOAuthCode(code) + return + } + + _credentialsScreenState.update { + it.copy( + loginState = LoginState.Enabled, + ) + } + } + + private fun loginWithOAuthCode(code: String) { + startLoginJob { + loginUserWithOAuth( + serverUrl = serverUrl, + code = code, + ) + } + } + + private fun registerDevice(enrollmentIat: String) { + launchUseCase { + _credentialsScreenState.update { + it.copy(loginState = LoginState.Running) + } + + processDeviceEnrollment( + DeviceEnrollmentInfo( + iat = enrollmentIat, + serverURL = serverUrl, + ), + ).fold( + onSuccess = { consentUrl -> + // Second OAuth call (consent) - keep session from enrollment + navigator.navigate( + LoginScreenState.OauthAuthentication( + selectedServer = consentUrl, + ), + ) + }, + onFailure = { error -> + _credentialsScreenState.update { + it.copy( + errorMessage = error.message, + loginState = LoginState.Enabled, + ) + } + }, + ) } } @@ -176,26 +306,33 @@ class CredentialsViewModel( } fun onLoginClicked() { - startLoginJob { - loginUser( - serverUrl = _credentialsScreenState.value.serverInfo.serverUrl, - username = _credentialsScreenState.value.credentialsInfo.username, - password = _credentialsScreenState.value.credentialsInfo.password, - isNetworkAvailable = isNetworkOnline.value, - ) + if (_credentialsScreenState.value.oAuthEnable) { + fetchOAuthEnrollmentUrl() + } else { + startLoginJob { + loginUser( + serverUrl = _credentialsScreenState.value.serverInfo.serverUrl, + username = _credentialsScreenState.value.credentialsInfo.username, + password = _credentialsScreenState.value.credentialsInfo.password, + isNetworkAvailable = isNetworkOnline.value, + ) + } } } fun onOpenIdLogin() { startLoginJob { openIdLogin( - serverUrl = _credentialsScreenState.value.serverInfo.serverUrl, - isNetworkAvailable = isNetworkOnline.value, - clientId = _credentialsScreenState.value.oidcInfo?.oidcClientId ?: "", - redirectUri = _credentialsScreenState.value.oidcInfo?.oidcRedirectUri ?: "", - discoveryUri = _credentialsScreenState.value.oidcInfo?.discoveryUri(), - authorizationUri = _credentialsScreenState.value.oidcInfo?.authorizationUri(), - tokenUrl = _credentialsScreenState.value.oidcInfo?.tokenUrl(), + OpenIdLoginConfiguration( + serverUrl = _credentialsScreenState.value.serverInfo.serverUrl, + isNetworkAvailable = isNetworkOnline.value, + clientId = _credentialsScreenState.value.oidcInfo?.oidcClientId ?: "", + redirectUri = _credentialsScreenState.value.oidcInfo?.oidcRedirectUri ?: "", + discoveryUri = _credentialsScreenState.value.oidcInfo?.discoveryUri(), + authorizationUri = _credentialsScreenState.value.oidcInfo?.authorizationUri(), + tokenUrl = _credentialsScreenState.value.oidcInfo?.tokenUrl(), + prompt = _credentialsScreenState.value.oidcInfo?.userPrompt, + ), ) } } @@ -204,6 +341,7 @@ class CredentialsViewModel( _credentialsScreenState.update { it.copy( loginState = LoginState.Running, + errorMessage = null, ) } loginJob = diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/LoginViewModel.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/LoginViewModel.kt index b3295c1633c..dd3b7b90e67 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/LoginViewModel.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/LoginViewModel.kt @@ -1,24 +1,20 @@ package org.dhis2.mobile.login.main.ui.viewmodel import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope import kotlinx.coroutines.Job import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.update import org.dhis2.mobile.commons.extensions.launchUseCase import org.dhis2.mobile.commons.extensions.withMinimumDuration import org.dhis2.mobile.commons.network.NetworkStatusProvider import org.dhis2.mobile.login.main.domain.model.LoginScreenState -import org.dhis2.mobile.login.main.domain.model.LoginScreenState.LegacyLogin -import org.dhis2.mobile.login.main.domain.model.LoginScreenState.OauthLogin +import org.dhis2.mobile.login.main.domain.model.LoginScreenState.LoginCredentials import org.dhis2.mobile.login.main.domain.model.ServerValidationResult import org.dhis2.mobile.login.main.domain.usecase.GetInitialScreen import org.dhis2.mobile.login.main.domain.usecase.ImportDatabase import org.dhis2.mobile.login.main.domain.usecase.ValidateServer -import org.dhis2.mobile.login.main.ui.navigation.AppLinkNavigation import org.dhis2.mobile.login.main.ui.navigation.Navigator import org.dhis2.mobile.login.main.ui.state.DatabaseImportState import org.dhis2.mobile.login.main.ui.state.ServerValidationUiState @@ -28,17 +24,8 @@ class LoginViewModel( private val getInitialScreen: GetInitialScreen, private val importDatabase: ImportDatabase, private val validateServer: ValidateServer, - private val appLinkNavigation: AppLinkNavigation, - networkStatusProvider: NetworkStatusProvider, + private val networkStatusProvider: NetworkStatusProvider, ) : ViewModel() { - private val isNetworkOnline = - networkStatusProvider.connectionStatus - .stateIn( - viewModelScope, - SharingStarted.Eagerly, - false, - ) - private val _serverValidationState = MutableStateFlow(ServerValidationUiState()) val serverValidationState = _serverValidationState.asStateFlow() @@ -46,14 +33,8 @@ class LoginViewModel( val importDatabaseState = _importDatabaseState.asStateFlow() private var serverValidationJob: Job? = null - private val redirectUri = "https://vgarciabnz.github.io" init { - launchUseCase { - appLinkNavigation.appLink.collect { urlString -> - handleAppLink(urlString) - } - } goToInitialScreen() } @@ -81,8 +62,11 @@ class LoginViewModel( } serverValidationJob = launchUseCase { + val isOnline = networkStatusProvider.connectionStatus.firstOrNull() ?: false val result = - withMinimumDuration { validateServer(serverUrl, isNetworkOnline.value) } + withMinimumDuration { + validateServer(serverUrl, isOnline) + } when (result) { is ServerValidationResult.Error -> { _serverValidationState.update { @@ -94,24 +78,20 @@ class LoginViewModel( } } - is ServerValidationResult.Legacy -> { + is ServerValidationResult.Success -> { navigator.navigate( destination = - LegacyLogin( + LoginCredentials( serverName = result.serverName, allowRecovery = result.allowRecovery, selectedServer = serverUrl, selectedServerFlag = result.countryFlag, selectedUsername = null, + oAuthEnabled = result.oAuthEnabled, ), ) stopValidation() } - - ServerValidationResult.Oauth -> { - navigator.navigate(OauthLogin(serverUrl)) - stopValidation() - } } } } @@ -125,23 +105,6 @@ class LoginViewModel( _serverValidationState.update { it.copy(validationRunning = false) } } - private fun handleAppLink(urlString: String) { - if (urlString.startsWith(redirectUri)) { - val code = urlString.substringAfter("code=").substringBefore('&') - if (code.isNotEmpty()) { - // TODO "Use the authorization code to get a token and log in, then show statistics screen" - } else { - val error = urlString.substringAfter("error=").substringBefore('&') - _serverValidationState.update { - it.copy( - error = error, - validationRunning = false, - ) - } - } - } - } - fun onOauthLoginCancelled() { navigateUp() } diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/di/PinModule.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/di/PinModule.kt index f5bcb514cb0..5f9529f4db6 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/di/PinModule.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/di/PinModule.kt @@ -1,15 +1,16 @@ package org.dhis2.mobile.login.pin.di +import org.dhis2.mobile.login.pin.domain.model.PinMode import org.dhis2.mobile.login.pin.domain.usecase.ForgotPinUseCase import org.dhis2.mobile.login.pin.domain.usecase.GetIsSessionLockedUseCase import org.dhis2.mobile.login.pin.domain.usecase.SavePinUseCase import org.dhis2.mobile.login.pin.domain.usecase.ValidatePinUseCase import org.dhis2.mobile.login.pin.ui.provider.PinResourceProvider +import org.dhis2.mobile.login.pin.ui.provider.PinResourceProviderImpl import org.dhis2.mobile.login.pin.ui.viewmodel.PinViewModel import org.koin.core.module.Module import org.koin.core.module.dsl.factoryOf -import org.koin.core.module.dsl.singleOf -import org.koin.core.module.dsl.viewModelOf +import org.koin.core.module.dsl.viewModel import org.koin.dsl.module /** @@ -24,10 +25,10 @@ internal val pinModule = factoryOf(::GetIsSessionLockedUseCase) // PIN resource provider - singleOf(::PinResourceProvider) + single<PinResourceProvider> { PinResourceProviderImpl() } - // PIN ViewModel - viewModelOf(::PinViewModel) + // PIN ViewModel — receives PinMode as a runtime parameter via Koin parametersOf + viewModel { params -> PinViewModel(params.get<PinMode>(), get(), get(), get(), get()) } } /** diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/domain/model/PinMode.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/domain/model/PinMode.kt new file mode 100644 index 00000000000..e7b48108cf3 --- /dev/null +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/domain/model/PinMode.kt @@ -0,0 +1,16 @@ +package org.dhis2.mobile.login.pin.domain.model + +/** + * PIN mode enumeration for different bottom sheet behaviors. + */ +enum class PinMode { + /** + * SET mode - Used when creating/setting a new PIN. + */ + SET, + + /** + * ASK mode - Used when verifying/entering an existing PIN. + */ + ASK, +} diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/domain/model/PinState.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/domain/model/PinState.kt deleted file mode 100644 index 57c49ff0cb2..00000000000 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/domain/model/PinState.kt +++ /dev/null @@ -1,41 +0,0 @@ -package org.dhis2.mobile.login.pin.domain.model - -/** - * Represents the different states of PIN operations in the UI. - */ -sealed class PinState { - /** - * Initial/Idle state - waiting for user interaction. - */ - data object Idle : PinState() - - /** - * PIN operation in progress. - */ - data object Loading : PinState() - - /** - * PIN validation or save was successful. - */ - data object Success : PinState() - - /** - * The PIN entry UI was dismissed. - */ - data object Dismissed : PinState() - - /** - * PIN validation failed with an error message. - * @param message The error message to display. - * @param remainingAttempts Number of remaining attempts before forced logout (null if not applicable). - */ - data class Error( - val message: String, - val remainingAttempts: Int? = null, - ) : PinState() - - /** - * Too many failed attempts - will trigger forgot PIN flow. - */ - data object TooManyAttempts : PinState() -} diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/components/PinBottomSheet.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/components/PinBottomSheet.kt deleted file mode 100644 index 24f56f4246a..00000000000 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/components/PinBottomSheet.kt +++ /dev/null @@ -1,363 +0,0 @@ -package org.dhis2.mobile.login.pin.ui.components - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.RowScope -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi -import androidx.compose.material3.windowsizeclass.WindowSizeClass -import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.focus.FocusRequester -import androidx.compose.ui.focus.focusRequester -import androidx.compose.ui.text.style.TextAlign -import org.dhis2.mobile.commons.extensions.getWindowSizeClass -import org.dhis2.mobile.login.pin.domain.model.PinState -import org.dhis2.mobile.login.pin.ui.viewmodel.PinViewModel -import org.dhis2.mobile.login.resources.Res -import org.dhis2.mobile.login.resources.create_pin -import org.dhis2.mobile.login.resources.create_pin_button -import org.dhis2.mobile.login.resources.create_pin_description -import org.dhis2.mobile.login.resources.enter_pin -import org.dhis2.mobile.login.resources.enter_pin_button -import org.dhis2.mobile.login.resources.enter_pin_description -import org.dhis2.mobile.login.resources.forgot_pin_button -import org.dhis2.mobile.login.resources.pin_error_remaining_attempts -import org.hisp.dhis.mobile.ui.designsystem.component.BottomSheetShell -import org.hisp.dhis.mobile.ui.designsystem.component.Button -import org.hisp.dhis.mobile.ui.designsystem.component.ButtonStyle -import org.hisp.dhis.mobile.ui.designsystem.component.InputSegmentedShell -import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextData -import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextState -import org.hisp.dhis.mobile.ui.designsystem.component.model.SegmentedShellType -import org.hisp.dhis.mobile.ui.designsystem.component.state.BottomSheetShellDefaults -import org.hisp.dhis.mobile.ui.designsystem.component.state.BottomSheetShellUIState -import org.hisp.dhis.mobile.ui.designsystem.theme.Spacing -import org.jetbrains.compose.resources.stringResource -import org.koin.compose.viewmodel.koinViewModel - -/** - * PIN mode enumeration for different bottom sheet behaviors. - */ -enum class PinMode { - /** - * SET mode - Used when creating/setting a new PIN. - */ - SET, - - /** - * ASK mode - Used when verifying/entering an existing PIN. - */ - ASK, -} - -/** - * DHIS2 PIN Bottom Sheet component with integrated ViewModel. - * - * A modal bottom sheet that displays a PIN input interface using DHIS2 Mobile UI components. - * Supports both SET (creating PIN) and ASK (verifying PIN) modes. - * Uses [BottomSheetShell] as container and [InputSegmentedShell] for PIN input. - * - * State management is handled internally by [PinViewModel], automatically injected via Koin, - * including PIN validation, attempt tracking, and error messages. - * - * @param mode The PIN mode (SET for creation, ASK for verification). - * @param onSuccess Callback invoked when PIN operation succeeds. - * @param onDismiss Callback invoked when the bottom sheet is dismissed. - * @param modifier Optional modifier for customization. - * @param windowSizeClass Window size class for layout adjustments. - */ -@OptIn(ExperimentalMaterial3WindowSizeClassApi::class) -@Composable -fun PinBottomSheet( - mode: PinMode, - onSuccess: () -> Unit, - onDismiss: () -> Unit, - modifier: Modifier = Modifier, - windowSizeClass: WindowSizeClass = getWindowSizeClass(), -) { - val viewModel: PinViewModel = koinViewModel() - val uiState by viewModel.uiState.collectAsState() - var currentPin by remember { mutableStateOf("") } - val focusRequester = remember { FocusRequester() } - - // Handle state changes from ViewModel - LaunchedEffect(uiState) { - when (uiState) { - is PinState.Success -> { - onSuccess() - } - - is PinState.TooManyAttempts -> { - viewModel.onForgotPin() - } - - is PinState.Dismissed -> { - viewModel.resetAttempts() - viewModel.resetState() - onDismiss() - } - - else -> { // Do nothing for Idle, Loading, Error - } - } - } - - // Reset attempts when dismissed - LaunchedEffect(Unit) { - return@LaunchedEffect - } - - LaunchedEffect(Unit) { - focusRequester.requestFocus() - } - - val (title, subtitle) = - when (mode) { - PinMode.SET -> stringResource(Res.string.create_pin) to stringResource(Res.string.create_pin_description) - PinMode.ASK -> stringResource(Res.string.enter_pin) to stringResource(Res.string.enter_pin_description) - } - - val primaryButtonText = - when (mode) { - PinMode.SET -> stringResource(Res.string.create_pin_button) - PinMode.ASK -> stringResource(Res.string.enter_pin_button) - } - - val secondaryButtonText = - when (mode) { - PinMode.SET -> null - PinMode.ASK -> stringResource(Res.string.forgot_pin_button) - } - - // Get error message from ViewModel state - val errorMessage = - when (val state = uiState) { - is PinState.Error -> { - state.remainingAttempts?.let { attempts -> - "${state.message}. ${ - stringResource( - Res.string.pin_error_remaining_attempts, - attempts, - ) - }" - } ?: state.message - } - - else -> null - } - - val pinLength = 4 - val isLoading = uiState is PinState.Loading - - fun onPrimaryClick() { - viewModel.onPinComplete( - pin = currentPin.replace("-", ""), - mode = mode, - ) - } - - fun onSecondaryClick() { - viewModel.onForgotPin() - } - - val primaryButtonIsEnabled = - currentPin - .replace( - "-", - "", - ).length == pinLength && !isLoading - - val secondaryButtonIsEnabled = !isLoading - - BottomSheetShell( - uiState = - BottomSheetShellUIState( - title = title, - subtitle = null, - description = subtitle, - showTopSectionDivider = false, - showBottomSectionDivider = false, - headerTextAlignment = TextAlign.Center, - animateHeaderOnKeyboardAppearance = false, - scrollableContainerMinHeight = Spacing.Spacing40, - scrollableContainerMaxHeight = Spacing.Spacing840, - contentPadding = - PaddingValues( - horizontal = Spacing.Spacing24, - vertical = Spacing.Spacing0, - ), - ), - modifier = modifier, - content = { - Column( - modifier = Modifier.fillMaxWidth(), - verticalArrangement = Arrangement.spacedBy(Spacing.Spacing16), - ) { - Spacer(modifier = Modifier.height(Spacing.Spacing8)) - - // PIN Input using InputSegmentedShell - InputSegmentedShell( - modifier = - Modifier - .fillMaxWidth() - .focusRequester(focusRequester), - segmentCount = pinLength, - initialValue = null, - supportingTextData = - errorMessage?.let { - SupportingTextData( - text = it, - state = SupportingTextState.ERROR, - ) - }, - segmentedShellType = SegmentedShellType.Numeric, - onValueChanged = { newPin -> - currentPin = newPin - // Clear error when user starts typing - if (uiState is PinState.Error) { - viewModel.resetState() - } - }, - ) - - Spacer(modifier = Modifier.height(Spacing.Spacing8)) - } - }, - buttonBlock = { - when (windowSizeClass.widthSizeClass) { - WindowWidthSizeClass.Compact -> - VerticalButtonBlock( - primaryButton = { - PinPrimaryButton( - modifier = Modifier.fillMaxWidth(), - enabled = primaryButtonIsEnabled, - buttonText = primaryButtonText, - onClick = ::onPrimaryClick, - ) - }, - secondaryButton = - secondaryButtonText?.let { buttonText -> - { - PinSecondaryButton( - modifier = Modifier.fillMaxWidth(), - enabled = secondaryButtonIsEnabled, - buttonText = buttonText, - onClick = ::onSecondaryClick, - ) - } - }, - ) - - else -> - HorizontalButtonBlock( - primaryButton = { - PinPrimaryButton( - modifier = Modifier.weight(1f), - enabled = primaryButtonIsEnabled, - buttonText = primaryButtonText, - onClick = ::onPrimaryClick, - ) - }, - secondaryButton = - secondaryButtonText?.let { buttonText -> - { - PinSecondaryButton( - modifier = Modifier.weight(1f), - enabled = secondaryButtonIsEnabled, - buttonText = buttonText, - onClick = ::onSecondaryClick, - ) - } - }, - ) - } - }, - onDismiss = { - viewModel.resetAttempts() - viewModel.resetState() - onDismiss() - }, - ) -} - -@Composable -private fun VerticalButtonBlock( - primaryButton: @Composable () -> Unit, - secondaryButton: (@Composable () -> Unit)?, -) { - Column( - modifier = - Modifier - .fillMaxWidth() - .padding(BottomSheetShellDefaults.buttonBlockPaddings()), - verticalArrangement = Arrangement.spacedBy(Spacing.Spacing8), - horizontalAlignment = Alignment.CenterHorizontally, - ) { - primaryButton() - secondaryButton?.invoke() - } -} - -@Composable -private fun HorizontalButtonBlock( - primaryButton: @Composable RowScope.() -> Unit, - secondaryButton: (@Composable RowScope.() -> Unit)?, -) { - Row( - modifier = - Modifier - .fillMaxWidth() - .padding(BottomSheetShellDefaults.buttonBlockPaddings()), - horizontalArrangement = Arrangement.spacedBy(Spacing.Spacing8), - verticalAlignment = Alignment.CenterVertically, - ) { - secondaryButton?.invoke(this) - primaryButton() - } -} - -@Composable -private fun PinPrimaryButton( - modifier: Modifier, - enabled: Boolean, - buttonText: String, - onClick: () -> Unit, -) { - Button( - modifier = modifier, - enabled = enabled, - style = ButtonStyle.FILLED, - text = buttonText, - onClick = onClick, - ) -} - -@Composable -private fun PinSecondaryButton( - modifier: Modifier, - enabled: Boolean, - buttonText: String, - onClick: () -> Unit, -) { - Button( - modifier = modifier, - enabled = enabled, - style = ButtonStyle.OUTLINED, - text = buttonText, - onClick = onClick, - ) -} diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/components/PinDialog.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/components/PinDialog.kt new file mode 100644 index 00000000000..666ebd05609 --- /dev/null +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/components/PinDialog.kt @@ -0,0 +1,511 @@ +package org.dhis2.mobile.login.pin.ui.components + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Key +import androidx.compose.material.icons.outlined.Pin +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.VerticalDivider +import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi +import androidx.compose.material3.windowsizeclass.WindowSizeClass +import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.DpSize +import androidx.compose.ui.unit.dp +import org.dhis2.mobile.commons.extensions.deviceIsInLandscapeMode +import org.dhis2.mobile.commons.extensions.getWindowSizeClass +import org.dhis2.mobile.login.pin.domain.model.PinMode +import org.dhis2.mobile.login.pin.ui.state.PinUiState +import org.dhis2.mobile.login.pin.ui.viewmodel.PinViewModel +import org.hisp.dhis.mobile.ui.designsystem.component.Button +import org.hisp.dhis.mobile.ui.designsystem.component.ButtonStyle +import org.hisp.dhis.mobile.ui.designsystem.component.FullScreenDialog +import org.hisp.dhis.mobile.ui.designsystem.component.InputSegmentedShell +import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextData +import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextState +import org.hisp.dhis.mobile.ui.designsystem.component.model.SegmentedShellType +import org.hisp.dhis.mobile.ui.designsystem.component.state.BottomSheetShellDefaults +import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme +import org.hisp.dhis.mobile.ui.designsystem.theme.Spacing +import org.koin.compose.viewmodel.koinViewModel +import org.koin.core.parameter.parametersOf + +/** + * DHIS2 PIN Bottom Sheet component with integrated ViewModel. + * + * A modal bottom sheet that displays a PIN input interface using DHIS2 Mobile UI components. + * Supports both SET (creating PIN) and ASK (verifying PIN) modes. + * Uses [FullScreenDialog] as container and [InputSegmentedShell] for PIN input. + * + * State management is handled internally by [PinViewModel], automatically injected via Koin, + * including PIN validation, attempt tracking, and error messages. + * + * @param mode The PIN mode (SET for creation, ASK for verification). + * @param onSuccess Callback invoked when PIN operation succeeds. + * @param onDismiss Callback invoked when the bottom sheet is dismissed. + * @param modifier Optional modifier for customization. + * @param windowSizeClass Window size class for layout adjustments. + */ +@OptIn(ExperimentalMaterial3WindowSizeClassApi::class) +@Composable +fun PinDialog( + mode: PinMode, + onSuccess: () -> Unit, + onDismiss: () -> Unit, + modifier: Modifier = Modifier, + windowSizeClass: WindowSizeClass = getWindowSizeClass(), +) { + val viewModel: PinViewModel = koinViewModel { parametersOf(mode) } + val uiState by viewModel.uiState.collectAsState() + val isLandscape = deviceIsInLandscapeMode() + + LaunchedEffect(uiState.isSuccess, uiState.isDismissed, uiState.isTooManyAttempts) { + when { + uiState.isSuccess -> onSuccess() + uiState.isTooManyAttempts -> viewModel.onForgotPin() + uiState.isDismissed -> { + viewModel.resetAttempts() + viewModel.resetState() + onDismiss() + } + } + } + + PinContent( + uiState = uiState, + mode = mode, + isLandscape = isLandscape, + windowSizeClass = windowSizeClass, + onPinChanged = viewModel::onPinChanged, + onPrimaryClick = viewModel::onPinComplete, + onSecondaryClick = viewModel::onForgotPin, + onDismiss = { + viewModel.resetAttempts() + viewModel.resetState() + onDismiss() + }, + modifier = modifier, + ) +} + +/** + * Stateless UI content for the PIN bottom sheet. + * + * Renders the [FullScreenDialog] with either a portrait (stacked) or landscape (side-by-side) + * layout depending on [isLandscape]. This composable holds no business logic and is safe + * to use in Compose Previews. + * + * @param uiState The current UI state containing display content and button states. + * @param isLandscape Whether the device is in landscape orientation. + * @param windowSizeClass Window size class used to choose the button layout. + * @param onPinChanged Callback invoked on every PIN value change. + * @param onPrimaryClick Callback for the primary button click. + * @param onSecondaryClick Callback for the secondary button click. + * @param onDismiss Callback invoked when the dialog is dismissed. + * @param modifier Optional modifier for customization. + */ +@OptIn(ExperimentalMaterial3WindowSizeClassApi::class) +@Composable +internal fun PinContent( + uiState: PinUiState, + mode: PinMode, + isLandscape: Boolean, + windowSizeClass: WindowSizeClass, + onPinChanged: (String) -> Unit, + onPrimaryClick: () -> Unit, + onSecondaryClick: () -> Unit, + onDismiss: () -> Unit, + modifier: Modifier = Modifier, +) { + val focusRequester = remember { FocusRequester() } + + FullScreenDialog( + onDismiss = onDismiss, + content = { + if (!isLandscape) { + Column( + modifier = + Modifier + .fillMaxSize() + .imePadding() + .verticalScroll(rememberScrollState()), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Top, + ) { + PinHeader( + title = uiState.title, + subtitle = uiState.subtitle, + ) + + PinInputBlock( + uiState = uiState, + focusRequester = focusRequester, + windowSizeClass = windowSizeClass, + showPrimaryButtonIcon = mode == PinMode.SET, + onPinChanged = onPinChanged, + onPrimaryClick = onPrimaryClick, + onSecondaryClick = onSecondaryClick, + ) + } + } else { + Row( + modifier = + Modifier + .fillMaxSize() + .imePadding() + .padding(horizontal = Spacing.Spacing56), + horizontalArrangement = Arrangement.spacedBy(Spacing.Spacing56), + verticalAlignment = Alignment.CenterVertically, + ) { + Column( + modifier = + Modifier + .weight(1f) + .fillMaxHeight() + .verticalScroll(rememberScrollState()) + .padding(vertical = Spacing.Spacing32), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + ) { + PinHeader( + title = uiState.title, + subtitle = uiState.subtitle, + ) + } + + VerticalDivider( + modifier = Modifier.padding(vertical = Spacing.Spacing32), + thickness = Spacing.Spacing1, + color = MaterialTheme.colorScheme.outlineVariant, + ) + + Column( + modifier = + Modifier + .weight(1f) + .fillMaxHeight() + .verticalScroll(rememberScrollState()) + .padding(vertical = Spacing.Spacing32), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + ) { + PinInputBlock( + uiState = uiState, + focusRequester = focusRequester, + windowSizeClass = windowSizeClass, + showPrimaryButtonIcon = mode == PinMode.SET, + onPinChanged = onPinChanged, + onPrimaryClick = onPrimaryClick, + onSecondaryClick = onSecondaryClick, + ) + } + } + } + }, + ) +} + +/** + * Displays the PIN screen header: a PIN icon, a title, and a subtitle. + * + * @param title The main heading text. + * @param subtitle The descriptive text shown below the title. + * @param modifier Optional modifier for customization. + */ +@Composable +private fun PinHeader( + title: String, + subtitle: String, + modifier: Modifier = Modifier, +) { + Column( + modifier = modifier, + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Icon( + imageVector = Icons.Outlined.Pin, + contentDescription = null, + tint = MaterialTheme.colorScheme.primary, + ) + + Text( + text = title, + style = MaterialTheme.typography.headlineSmall, + color = MaterialTheme.colorScheme.onSurface, + modifier = Modifier.padding(vertical = Spacing.Spacing16), + ) + + Text( + text = subtitle, + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(bottom = Spacing.Spacing16), + ) + } +} + +/** + * Displays the PIN input field and action buttons. + * + * Renders [InputSegmentedShell] for PIN entry and adapts the button layout + * (vertical vs horizontal) based on [windowSizeClass]. + * + * @param focusRequester Focus requester to autofocus the input field. + * @param windowSizeClass Window size class used to choose the button layout. + * @param onPinChanged Callback invoked on every PIN value change. + * @param onPrimaryClick Callback for the primary button click. + * @param onSecondaryClick Callback for the secondary button click. + * @param modifier Optional modifier for customization. + */ +@OptIn(ExperimentalMaterial3WindowSizeClassApi::class) +@Composable +private fun PinInputBlock( + uiState: PinUiState, + focusRequester: FocusRequester, + windowSizeClass: WindowSizeClass, + showPrimaryButtonIcon: Boolean, + onPinChanged: (String) -> Unit, + onPrimaryClick: () -> Unit, + onSecondaryClick: () -> Unit, + modifier: Modifier = Modifier, +) { + // Stabilize supportingTextData to prevent recomposition issues + val supportingTextData = + remember(uiState.errorMessage) { + uiState.errorMessage?.let { + SupportingTextData( + text = it, + state = SupportingTextState.ERROR, + ) + } + } + + // Request focus on initial composition only + LaunchedEffect(Unit) { + focusRequester.requestFocus() + } + + Column( + modifier = modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + ) { + InputSegmentedShell( + modifier = + Modifier + .fillMaxWidth() + .padding(horizontal = Spacing.Spacing16) + .focusRequester(focusRequester), + segmentCount = uiState.pinLength, + initialValue = null, + supportingTextData = supportingTextData, + segmentedShellType = SegmentedShellType.Numeric, + onValueChanged = onPinChanged, + ) + + Spacer(modifier = Modifier.height(Spacing.Spacing32)) + + when (windowSizeClass.widthSizeClass) { + WindowWidthSizeClass.Compact -> + VerticalButtonBlock( + primaryButton = { + PinPrimaryButton( + modifier = Modifier.fillMaxWidth(), + enabled = uiState.primaryButtonIsEnabled, + buttonText = uiState.primaryButtonText, + showIcon = showPrimaryButtonIcon, + onClick = onPrimaryClick, + ) + }, + secondaryButton = + uiState.secondaryButtonText?.let { buttonText -> + { + PinSecondaryButton( + modifier = Modifier.fillMaxWidth(), + enabled = !uiState.isLoading, + buttonText = buttonText, + onClick = onSecondaryClick, + ) + } + }, + ) + + else -> + HorizontalButtonBlock( + primaryButton = { + PinPrimaryButton( + modifier = Modifier.weight(1f), + enabled = uiState.primaryButtonIsEnabled, + buttonText = uiState.primaryButtonText, + showIcon = showPrimaryButtonIcon, + onClick = onPrimaryClick, + ) + }, + secondaryButton = + uiState.secondaryButtonText?.let { buttonText -> + { + PinSecondaryButton( + modifier = Modifier.weight(1f), + enabled = !uiState.isLoading, + buttonText = buttonText, + onClick = onSecondaryClick, + ) + } + }, + ) + } + } +} + +@Composable +private fun VerticalButtonBlock( + primaryButton: @Composable () -> Unit, + secondaryButton: (@Composable () -> Unit)?, +) { + Column( + modifier = + Modifier + .fillMaxWidth() + .padding(BottomSheetShellDefaults.buttonBlockPaddings()), + verticalArrangement = Arrangement.spacedBy(Spacing.Spacing8), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + primaryButton() + secondaryButton?.invoke() + } +} + +@Composable +private fun HorizontalButtonBlock( + primaryButton: @Composable RowScope.() -> Unit, + secondaryButton: (@Composable RowScope.() -> Unit)?, +) { + Row( + modifier = + Modifier + .fillMaxWidth() + .padding(BottomSheetShellDefaults.buttonBlockPaddings()), + horizontalArrangement = Arrangement.spacedBy(Spacing.Spacing8), + verticalAlignment = Alignment.CenterVertically, + ) { + secondaryButton?.invoke(this) + primaryButton() + } +} + +@Composable +private fun PinPrimaryButton( + modifier: Modifier, + enabled: Boolean, + buttonText: String, + showIcon: Boolean, + onClick: () -> Unit, +) { + Button( + modifier = modifier, + enabled = enabled, + style = ButtonStyle.FILLED, + text = buttonText, + icon = + if (showIcon) { + { + Icon( + imageVector = Icons.Outlined.Key, + contentDescription = null, + ) + } + } else { + null + }, + onClick = onClick, + ) +} + +@Composable +private fun PinSecondaryButton( + modifier: Modifier, + enabled: Boolean, + buttonText: String, + onClick: () -> Unit, +) { + Button( + modifier = modifier, + enabled = enabled, + style = ButtonStyle.OUTLINED, + text = buttonText, + onClick = onClick, + ) +} + +@OptIn(ExperimentalMaterial3WindowSizeClassApi::class) +@Preview(showBackground = true, widthDp = 360, heightDp = 800) +@Composable +fun PinAskPortraitPreview() { + val windowSizeClass = WindowSizeClass.calculateFromSize(DpSize(360.dp, 800.dp)) + DHIS2Theme { + PinContent( + uiState = + PinUiState( + title = "Enter your PIN", + subtitle = "Enter your 4-digit PIN to access your account.", + primaryButtonText = "Unlock", + secondaryButtonText = "Forgot your PIN?", + ), + mode = PinMode.ASK, + isLandscape = false, + windowSizeClass = windowSizeClass, + onPinChanged = {}, + onPrimaryClick = {}, + onSecondaryClick = {}, + onDismiss = {}, + ) + } +} + +@OptIn(ExperimentalMaterial3WindowSizeClassApi::class) +@Preview(showBackground = true, widthDp = 1280, heightDp = 800) +@Composable +fun PinAskLandscapePreview() { + val windowSizeClass = WindowSizeClass.calculateFromSize(DpSize(1280.dp, 800.dp)) + DHIS2Theme { + PinContent( + uiState = + PinUiState( + title = "Enter your PIN", + subtitle = "Enter your 4-digit PIN to access your account.", + primaryButtonText = "Unlock", + secondaryButtonText = "Forgot your PIN?", + ), + mode = PinMode.ASK, + isLandscape = true, + windowSizeClass = windowSizeClass, + onPinChanged = {}, + onPrimaryClick = {}, + onSecondaryClick = {}, + onDismiss = {}, + ) + } +} diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/provider/PinResourceProvider.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/provider/PinResourceProvider.kt index d31006d250c..4dd47b49af4 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/provider/PinResourceProvider.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/provider/PinResourceProvider.kt @@ -1,34 +1,86 @@ package org.dhis2.mobile.login.pin.ui.provider +import org.dhis2.mobile.login.pin.domain.model.PinMode import org.dhis2.mobile.login.resources.Res +import org.dhis2.mobile.login.resources.create_pin +import org.dhis2.mobile.login.resources.create_pin_button +import org.dhis2.mobile.login.resources.create_pin_description +import org.dhis2.mobile.login.resources.enter_pin +import org.dhis2.mobile.login.resources.enter_pin_button +import org.dhis2.mobile.login.resources.enter_pin_description +import org.dhis2.mobile.login.resources.forgot_pin_button import org.dhis2.mobile.login.resources.pin_error_incorrect import org.dhis2.mobile.login.resources.pin_error_no_pin +import org.dhis2.mobile.login.resources.pin_error_remaining_attempts import org.dhis2.mobile.login.resources.pin_error_reset_failed import org.dhis2.mobile.login.resources.pin_error_save_failed import org.jetbrains.compose.resources.getString /** * Provides string resources for PIN feature. - * This class decouples resource access from ViewModels, making testing easier. + * Extracted as an interface to allow test-friendly mocking. */ -class PinResourceProvider { - /** - * Returns the error message for incorrect PIN. - */ - suspend fun getPinErrorIncorrect(): String = getString(Res.string.pin_error_incorrect) - - /** - * Returns the error message when no PIN is stored. - */ - suspend fun getPinErrorNoPinStored(): String = getString(Res.string.pin_error_no_pin) - - /** - * Returns the error message when PIN save fails. - */ - suspend fun getPinErrorSaveFailed(): String = getString(Res.string.pin_error_save_failed) - - /** - * Returns the error message when PIN reset fails. - */ - suspend fun getPinErrorResetFailed(): String = getString(Res.string.pin_error_reset_failed) +interface PinResourceProvider { + suspend fun getPinTitle(mode: PinMode): String + + suspend fun getPinSubtitle(mode: PinMode): String + + suspend fun getPrimaryButtonText(mode: PinMode): String + + suspend fun getSecondaryButtonText(mode: PinMode): String? + + suspend fun getPinErrorIncorrect(): String + + suspend fun getPinErrorWithAttempts( + message: String, + attempts: Int, + ): String + + suspend fun getPinErrorNoPinStored(): String + + suspend fun getPinErrorSaveFailed(): String + + suspend fun getPinErrorResetFailed(): String +} + +/** + * Default implementation of [PinResourceProvider] using Compose Multiplatform string resources. + */ +class PinResourceProviderImpl : PinResourceProvider { + override suspend fun getPinTitle(mode: PinMode): String = + when (mode) { + PinMode.SET -> getString(Res.string.create_pin) + PinMode.ASK -> getString(Res.string.enter_pin) + } + + override suspend fun getPinSubtitle(mode: PinMode): String = + when (mode) { + PinMode.SET -> getString(Res.string.create_pin_description) + PinMode.ASK -> getString(Res.string.enter_pin_description) + } + + override suspend fun getPrimaryButtonText(mode: PinMode): String = + when (mode) { + PinMode.SET -> getString(Res.string.create_pin_button) + PinMode.ASK -> getString(Res.string.enter_pin_button) + } + + override suspend fun getSecondaryButtonText(mode: PinMode): String? = + when (mode) { + PinMode.SET -> null + PinMode.ASK -> getString(Res.string.forgot_pin_button) + } + + override suspend fun getPinErrorIncorrect(): String = getString(Res.string.pin_error_incorrect) + + override suspend fun getPinErrorWithAttempts( + message: String, + attempts: Int, + ): String = "$message. ${getString(Res.string.pin_error_remaining_attempts, attempts)}" + + override suspend fun getPinErrorNoPinStored(): String = getString(Res.string.pin_error_no_pin) + + override suspend fun getPinErrorSaveFailed(): String = getString(Res.string.pin_error_save_failed) + + override suspend fun getPinErrorResetFailed(): String = getString(Res.string.pin_error_reset_failed) } diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/state/PinUiState.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/state/PinUiState.kt new file mode 100644 index 00000000000..b35c311ab8a --- /dev/null +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/state/PinUiState.kt @@ -0,0 +1,31 @@ +package org.dhis2.mobile.login.pin.ui.state + +/** + * UI state for the PIN dialog content. + * Exposed by [org.dhis2.mobile.login.pin.ui.viewmodel.PinViewModel] and consumed by composables. + * + * @param title The main heading text. + * @param subtitle The descriptive text shown below the title. + * @param primaryButtonText Label for the primary action button. + * @param secondaryButtonText Optional label for the secondary action button. + * @param errorMessage Optional error message shown below the PIN input field. + * @param primaryButtonIsEnabled Whether the primary action button is enabled. + * @param isLoading Whether a PIN operation is in progress. + * @param isSuccess Whether the PIN operation completed successfully. + * @param isDismissed Whether the PIN dialog was dismissed (e.g. after forgot-PIN flow). + * @param isTooManyAttempts Whether the user exceeded the maximum number of PIN attempts. + * @param pinLength Number of PIN digits. + */ +data class PinUiState( + val title: String = "", + val subtitle: String = "", + val primaryButtonText: String = "", + val secondaryButtonText: String? = null, + val errorMessage: String? = null, + val primaryButtonIsEnabled: Boolean = false, + val isLoading: Boolean = false, + val isSuccess: Boolean = false, + val isDismissed: Boolean = false, + val isTooManyAttempts: Boolean = false, + val pinLength: Int = 4, +) diff --git a/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/viewmodel/PinViewModel.kt b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/viewmodel/PinViewModel.kt index 6b848e02497..adc127c3872 100644 --- a/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/viewmodel/PinViewModel.kt +++ b/login/src/commonMain/kotlin/org/dhis2/mobile/login/pin/ui/viewmodel/PinViewModel.kt @@ -8,101 +8,131 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import org.dhis2.mobile.commons.domain.invoke import org.dhis2.mobile.login.pin.domain.model.PinError -import org.dhis2.mobile.login.pin.domain.model.PinState +import org.dhis2.mobile.login.pin.domain.model.PinMode import org.dhis2.mobile.login.pin.domain.model.ValidatePinInput import org.dhis2.mobile.login.pin.domain.usecase.ForgotPinUseCase import org.dhis2.mobile.login.pin.domain.usecase.SavePinUseCase import org.dhis2.mobile.login.pin.domain.usecase.ValidatePinUseCase -import org.dhis2.mobile.login.pin.ui.components.PinMode import org.dhis2.mobile.login.pin.ui.provider.PinResourceProvider +import org.dhis2.mobile.login.pin.ui.state.PinUiState /** * ViewModel for managing PIN operations. * Coordinates between the UI and use cases for PIN creation, validation, and recovery. + * + * @param mode The PIN mode (SET for creation, ASK for verification). */ class PinViewModel( + private val mode: PinMode, private val savePinUseCase: SavePinUseCase, private val validatePinUseCase: ValidatePinUseCase, private val forgotPinUseCase: ForgotPinUseCase, private val resourceProvider: PinResourceProvider, ) : ViewModel() { - private val _uiState = MutableStateFlow<PinState>(PinState.Idle) - val uiState: StateFlow<PinState> = _uiState.asStateFlow() + private val _uiState = MutableStateFlow(PinUiState()) + val uiState: StateFlow<PinUiState> = _uiState.asStateFlow() private var pinAttempts = 0 + private var currentPin = "" + + init { + viewModelScope.launch { + _uiState.value = + _uiState.value.copy( + title = resourceProvider.getPinTitle(mode), + subtitle = resourceProvider.getPinSubtitle(mode), + primaryButtonText = resourceProvider.getPrimaryButtonText(mode), + secondaryButtonText = resourceProvider.getSecondaryButtonText(mode), + ) + } + } + + /** + * Updates the current PIN value and recomputes button enablement. + * Clears any existing error message when the user starts typing. + * + * @param pin The current PIN value from the input field. + */ + fun onPinChanged(pin: String) { + currentPin = pin + _uiState.value = + _uiState.value.copy( + errorMessage = null, + primaryButtonIsEnabled = pin.replace("-", "").length == _uiState.value.pinLength, + ) + } /** * Handles PIN completion based on the current mode. - * @param pin The PIN entered by the user. - * @param mode The current PIN mode (SET or ASK). */ - fun onPinComplete( - pin: String, - mode: PinMode, - ) { + fun onPinComplete() { + val pin = currentPin.replace("-", "") when (mode) { PinMode.SET -> savePin(pin) PinMode.ASK -> validatePin(pin) } } - /** - * Saves a new PIN. - * @param pin The PIN to save. - */ private fun savePin(pin: String) { viewModelScope.launch { - _uiState.value = PinState.Loading + _uiState.value = _uiState.value.copy(isLoading = true, primaryButtonIsEnabled = false) savePinUseCase(pin) .onSuccess { - _uiState.value = PinState.Success + _uiState.value = _uiState.value.copy(isLoading = false, isSuccess = true) }.onFailure { error -> _uiState.value = - PinState.Error( - message = error.message ?: resourceProvider.getPinErrorSaveFailed(), + _uiState.value.copy( + isLoading = false, + errorMessage = error.message ?: resourceProvider.getPinErrorSaveFailed(), + primaryButtonIsEnabled = currentPin.replace("-", "").length == _uiState.value.pinLength, ) } } } - /** - * Validates the entered PIN against the stored PIN. - * @param pin The PIN to validate. - */ private fun validatePin(pin: String) { viewModelScope.launch { - _uiState.value = PinState.Loading + _uiState.value = _uiState.value.copy(isLoading = true, primaryButtonIsEnabled = false) validatePinUseCase(ValidatePinInput(pin, pinAttempts)).fold( onSuccess = { - _uiState.value = PinState.Success + _uiState.value = _uiState.value.copy(isLoading = false, isSuccess = true) pinAttempts = 0 }, - onFailure = { failure: Throwable -> + onFailure = { failure -> when (failure) { is PinError.Failed -> { pinAttempts++ + val message = resourceProvider.getPinErrorIncorrect() + val fullMessage = + resourceProvider.getPinErrorWithAttempts(message, failure.attemptsLeft) _uiState.value = - PinState.Error( - message = resourceProvider.getPinErrorIncorrect(), - remainingAttempts = failure.attemptsLeft, + _uiState.value.copy( + isLoading = false, + errorMessage = fullMessage, + primaryButtonIsEnabled = currentPin.replace("-", "").length == _uiState.value.pinLength, ) } is PinError.TooManyAttempts -> { - _uiState.value = PinState.TooManyAttempts + _uiState.value = + _uiState.value.copy(isLoading = false, isTooManyAttempts = true) } is PinError.NoPinStored -> { _uiState.value = - PinState.Error( - message = resourceProvider.getPinErrorNoPinStored(), + _uiState.value.copy( + isLoading = false, + errorMessage = resourceProvider.getPinErrorNoPinStored(), + primaryButtonIsEnabled = currentPin.replace("-", "").length == _uiState.value.pinLength, ) } else -> { _uiState.value = - PinState.Error( - message = failure.message ?: "Unknown error occurred", + _uiState.value.copy( + isLoading = false, + errorMessage = failure.message ?: "Unknown error occurred", + primaryButtonIsEnabled = currentPin.replace("-", "").length == _uiState.value.pinLength, ) } } @@ -116,26 +146,40 @@ class PinViewModel( * This will log out the user and clear the PIN. */ fun onForgotPin() { + if (_uiState.value.isLoading) return viewModelScope.launch { - _uiState.value = PinState.Loading + _uiState.value = _uiState.value.copy(isLoading = true, primaryButtonIsEnabled = false) forgotPinUseCase() .onSuccess { - _uiState.value = PinState.Dismissed + _uiState.value = + _uiState.value.copy( + isLoading = false, + isDismissed = true, + isTooManyAttempts = false, + ) }.onFailure { error -> _uiState.value = - PinState.Error( - message = error.message ?: resourceProvider.getPinErrorResetFailed(), + _uiState.value.copy( + isLoading = false, + errorMessage = error.message ?: resourceProvider.getPinErrorResetFailed(), + primaryButtonIsEnabled = currentPin.replace("-", "").length == _uiState.value.pinLength, ) } } } /** - * Resets the UI state to idle. - * Useful for clearing error messages. + * Resets transient UI state flags (error, success, dismissed, tooManyAttempts). + * Useful when the dialog is dismissed or re-shown. */ fun resetState() { - _uiState.value = PinState.Idle + _uiState.value = + _uiState.value.copy( + errorMessage = null, + isSuccess = false, + isDismissed = false, + isTooManyAttempts = false, + ) } /** diff --git a/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/LoginScreenIntegrationTest.kt b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/LoginScreenIntegrationTest.kt index 207a88957b0..0093f82cd53 100644 --- a/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/LoginScreenIntegrationTest.kt +++ b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/LoginScreenIntegrationTest.kt @@ -2,7 +2,6 @@ package org.dhis2.mobile.login.main import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.resetMain @@ -15,8 +14,8 @@ import org.dhis2.mobile.login.main.data.LoginRepository import org.dhis2.mobile.login.main.domain.model.LoginScreenState import org.dhis2.mobile.login.main.domain.usecase.GetInitialScreen import org.dhis2.mobile.login.main.domain.usecase.ImportDatabase +import org.dhis2.mobile.login.main.domain.usecase.ProcessDeviceEnrollment import org.dhis2.mobile.login.main.domain.usecase.ValidateServer -import org.dhis2.mobile.login.main.ui.navigation.AppLinkNavigation import org.dhis2.mobile.login.main.ui.navigation.Navigator import org.dhis2.mobile.login.main.ui.viewmodel.LoginViewModel import org.dhis2.mobile.login.pin.data.SessionRepository @@ -35,30 +34,24 @@ class LoginScreenIntegrationTest { private val navigator: Navigator = mock() private val accountRepository: AccountRepository = mock() private val sessionRepository: SessionRepository = mock() - private val loginRepository: LoginRepository = mock() - private val appLinkNavigation: AppLinkNavigation = mock() private val networkStatusProvider: NetworkStatusProvider = mock() - private val testDispatcher = UnconfinedTestDispatcher() - private val mockAppLinkFlow = MutableSharedFlow<String>() private val mockNetworkStatusFlow = MutableStateFlow(true) - private lateinit var getInitialScreen: GetInitialScreen - private lateinit var importDatabase: ImportDatabase - private lateinit var validateServer: ValidateServer + private lateinit var processDeviceEnrollment: ProcessDeviceEnrollment @BeforeTest fun setUp() { Dispatchers.setMain(testDispatcher) - whenever(appLinkNavigation.appLink).thenReturn(mockAppLinkFlow) whenever(networkStatusProvider.connectionStatus).thenReturn(mockNetworkStatusFlow) importDatabase = ImportDatabase(repository = loginRepository) validateServer = ValidateServer(repository = loginRepository) getInitialScreen = GetInitialScreen(accountRepository, sessionRepository) + processDeviceEnrollment = ProcessDeviceEnrollment(repository = loginRepository) } @AfterTest @@ -70,6 +63,16 @@ class LoginScreenIntegrationTest { * * Test case: ANDROAPP-7220 * Scenario: Manage accounts screen + * Given the user is logged out + * And has <number_of_accounts> accounts stored + * When opens the app + * Then goes to <destination_screen> + * + * Examples: + * |number_of_accounts |destination_screen | + * | none |server configuration screen| + * | one |existing account screen | + * | two or more |manage accounts screen | * */ @@ -117,12 +120,13 @@ class LoginScreenIntegrationTest { // Then goes to existing account screen (LegacyLogin) verify(navigator).navigate( eq( - LoginScreenState.LegacyLogin( + LoginScreenState.LoginCredentials( selectedServer = singleAccount.serverUrl, selectedUsername = singleAccount.name, serverName = singleAccount.serverName, selectedServerFlag = singleAccount.serverFlag, allowRecovery = singleAccount.allowRecovery, + oAuthEnabled = false, ), ), any(), @@ -145,9 +149,18 @@ class LoginScreenIntegrationTest { // When opening the app initViewModel() - // Then goes to OAuth login screen + // Then goes to login screen with OAuth verify(navigator).navigate( - eq(LoginScreenState.OauthLogin(selectedServer = oauthAccount.serverUrl)), + eq( + LoginScreenState.LoginCredentials( + selectedServer = oauthAccount.serverUrl, + selectedUsername = oauthAccount.name, + serverName = oauthAccount.serverName, + selectedServerFlag = oauthAccount.serverFlag, + allowRecovery = false, + oAuthEnabled = true, + ), + ), any(), ) } @@ -213,7 +226,6 @@ class LoginScreenIntegrationTest { getInitialScreen = getInitialScreen, importDatabase = importDatabase, validateServer = validateServer, - appLinkNavigation = appLinkNavigation, networkStatusProvider = networkStatusProvider, ) } diff --git a/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/domain/usecase/LoginUserTest.kt b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/domain/usecase/LoginUserTest.kt index 5c23f58cb05..f4c67f554a4 100644 --- a/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/domain/usecase/LoginUserTest.kt +++ b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/domain/usecase/LoginUserTest.kt @@ -5,6 +5,7 @@ import org.dhis2.mobile.login.main.data.LoginRepository import org.dhis2.mobile.login.main.domain.model.LoginResult import org.junit.Before import org.junit.Test +import org.mockito.Mockito.reset import org.mockito.kotlin.any import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock @@ -335,4 +336,29 @@ class LoginUserTest { assertIs<LoginResult.Success>(result) assertEquals(false, result.initialSyncDone) } + + @Test + fun `GIVEN username with surrounding whitespace WHEN user logs in THEN trimmed username is passed to repository`() = + runTest { + // GIVEN - Usernames with various whitespace patterns and their expected trimmed values + val usernameVariants = listOf(" testUser" to "testUser", "testUser " to "testUser", " testUser " to "testUser", " " to "") + + for ((input, trimmed) in usernameVariants) { + reset(repository) + whenever(repository.loginUser(serverUrl, trimmed, password, isNetworkAvailable)) doReturn + Result.success(Unit) + whenever(repository.numberOfAccounts()) doReturn 0 + whenever(repository.displayTrackingMessage()) doReturn false + whenever(repository.initialSyncDone(serverUrl, trimmed)) doReturn true + + // WHEN - User logs in with whitespace in username + val result = loginUser(serverUrl, input, password, isNetworkAvailable) + + // THEN - Repository receives the trimmed username + assertIs<LoginResult.Success>(result) + verify(repository).loginUser(serverUrl, trimmed, password, isNetworkAvailable) + verify(repository).updateAvailableUsers(trimmed) + verify(repository).initialSyncDone(serverUrl, trimmed) + } + } } diff --git a/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/domain/usecase/OpenIdLoginTest.kt b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/domain/usecase/OpenIdLoginTest.kt new file mode 100644 index 00000000000..5fcaae840af --- /dev/null +++ b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/domain/usecase/OpenIdLoginTest.kt @@ -0,0 +1,324 @@ +package org.dhis2.mobile.login.main.domain.usecase + +import kotlinx.coroutines.test.runTest +import org.dhis2.mobile.login.main.data.LoginRepository +import org.dhis2.mobile.login.main.domain.model.LoginResult +import org.dhis2.mobile.login.main.domain.model.OpenIdLoginConfiguration +import org.junit.Before +import org.junit.Test +import org.mockito.kotlin.any +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock +import org.mockito.kotlin.never +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever +import kotlin.test.assertEquals +import kotlin.test.assertIs + +class OpenIdLoginTest { + private val repository: LoginRepository = mock() + private lateinit var openIdLogin: OpenIdLogin + + private val serverUrl = "https://test.server.org" + private val isNetworkAvailable = true + private val clientId = "test-client-id" + private val redirectUri = "dhis2://oauth" + private val discoveryUri = "https://test.server.org/.well-known/openid-configuration" + private val authorizationUri = "https://test.server.org/oauth/authorize" + private val tokenUrl = "https://test.server.org/oauth/token" + private val username = "openIdUser" + private val prompt = "select_account" + + private val defaultConfig + get() = + OpenIdLoginConfiguration( + serverUrl = serverUrl, + isNetworkAvailable = isNetworkAvailable, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = authorizationUri, + tokenUrl = tokenUrl, + prompt = prompt, + ) + + @Before + fun setUp() { + openIdLogin = OpenIdLogin(repository) + } + + @Test + fun `GIVEN successful OpenID login with no existing accounts WHEN user logs in THEN biometric credentials are NOT deleted`() = + runTest { + // GIVEN - User has no other accounts (numberOfAccounts = 0) + whenever(repository.loginWithOpenId(defaultConfig)) doReturn Result.success(Unit) + whenever(repository.getUsername()) doReturn username + whenever(repository.numberOfAccounts()) doReturn 0 + whenever(repository.displayTrackingMessage()) doReturn false + whenever(repository.initialSyncDone(serverUrl, username)) doReturn true + + // WHEN - User logs in successfully with OpenID + val result = openIdLogin(defaultConfig) + + // THEN - Login is successful + assertIs<LoginResult.Success>(result) + verify(repository).unlockSession() + verify(repository).updateAvailableUsers(username) + verify(repository).updateServerUrls(serverUrl) + verify(repository).numberOfAccounts() + // Biometric credentials should NOT be deleted when numberOfAccounts < 1 + verify(repository, never()).deleteBiometricCredentials() + } + + @Test + fun `GIVEN successful OpenID login with multiple existing accounts WHEN user logs in THEN biometric credentials are deleted`() = + runTest { + // GIVEN - User has multiple existing accounts (numberOfAccounts = 3) + whenever(repository.loginWithOpenId(defaultConfig)) doReturn Result.success(Unit) + whenever(repository.getUsername()) doReturn username + whenever(repository.numberOfAccounts()) doReturn 3 + whenever(repository.displayTrackingMessage()) doReturn false + whenever(repository.initialSyncDone(serverUrl, username)) doReturn true + + // WHEN - User logs in successfully with OpenID + val result = openIdLogin(defaultConfig) + + // THEN - Login is successful and biometric credentials are deleted + assertIs<LoginResult.Success>(result) + verify(repository).unlockSession() + verify(repository).updateAvailableUsers(username) + verify(repository).updateServerUrls(serverUrl) + verify(repository).numberOfAccounts() + verify(repository).deleteBiometricCredentials() + } + + @Test + fun `GIVEN failed OpenID login WHEN user attempts to log in THEN biometric credentials are NOT deleted`() = + runTest { + // GIVEN - OpenID login will fail + val errorMessage = "OpenID authentication failed" + whenever(repository.loginWithOpenId(defaultConfig)) doReturn Result.failure(Exception(errorMessage)) + + // WHEN - User attempts to log in with OpenID + val result = openIdLogin(defaultConfig) + + // THEN - Login fails and biometric credentials are NOT deleted + assertIs<LoginResult.Error>(result) + assertEquals(errorMessage, result.message) + verify(repository, never()).getUsername() + verify(repository, never()).unlockSession() + verify(repository, never()).updateAvailableUsers(any()) + verify(repository, never()).updateServerUrls(any()) + verify(repository, never()).numberOfAccounts() + verify(repository, never()).deleteBiometricCredentials() + } + + @Test + fun `GIVEN successful OpenID login WHEN repository operations are executed THEN they are called in correct order`() = + runTest { + // GIVEN + whenever(repository.loginWithOpenId(defaultConfig)) doReturn Result.success(Unit) + whenever(repository.getUsername()) doReturn username + whenever(repository.numberOfAccounts()) doReturn 2 + whenever(repository.displayTrackingMessage()) doReturn false + whenever(repository.initialSyncDone(serverUrl, username)) doReturn true + + // WHEN + openIdLogin(defaultConfig) + + // THEN - Verify the order of operations + val inOrder = org.mockito.kotlin.inOrder(repository) + inOrder.verify(repository).loginWithOpenId(defaultConfig) + inOrder.verify(repository).getUsername() + inOrder.verify(repository).unlockSession() + inOrder.verify(repository).updateAvailableUsers(username) + inOrder.verify(repository).updateServerUrls(serverUrl) + inOrder.verify(repository).numberOfAccounts() + inOrder.verify(repository).deleteBiometricCredentials() + inOrder.verify(repository).displayTrackingMessage() + inOrder.verify(repository).initialSyncDone(serverUrl, username) + } + + @Test + fun `GIVEN network is offline WHEN user logs in with OpenID THEN login is attempted with offline flag`() = + runTest { + // GIVEN - Network is unavailable + val isOffline = false + val offlineConfig = defaultConfig.copy(isNetworkAvailable = isOffline) + whenever(repository.loginWithOpenId(offlineConfig)) doReturn Result.success(Unit) + whenever(repository.getUsername()) doReturn username + whenever(repository.numberOfAccounts()) doReturn 0 + whenever(repository.displayTrackingMessage()) doReturn false + whenever(repository.initialSyncDone(serverUrl, username)) doReturn true + + // WHEN - User attempts to log in offline + val result = openIdLogin(offlineConfig) + + // THEN - Login is successful with offline flag + assertIs<LoginResult.Success>(result) + verify(repository).loginWithOpenId(offlineConfig) + } + + @Test + fun `GIVEN all success flags are true WHEN OpenID login succeeds THEN all flags are reflected in result`() = + runTest { + // GIVEN - Both tracking message and initial sync are required + whenever(repository.loginWithOpenId(defaultConfig)) doReturn Result.success(Unit) + whenever(repository.getUsername()) doReturn username + whenever(repository.numberOfAccounts()) doReturn 0 + whenever(repository.displayTrackingMessage()) doReturn true + whenever(repository.initialSyncDone(serverUrl, username)) doReturn true + + // WHEN - User logs in successfully + val result = openIdLogin(defaultConfig) + + // THEN - Both flags are true + assertIs<LoginResult.Success>(result) + assertEquals(true, result.displayTrackingMessage) + assertEquals(true, result.initialSyncDone) + } + + @Test + fun `GIVEN all success flags are false WHEN OpenID login succeeds THEN all flags are false in result`() = + runTest { + // GIVEN - Neither tracking message nor initial sync are required + whenever(repository.loginWithOpenId(defaultConfig)) doReturn Result.success(Unit) + whenever(repository.getUsername()) doReturn username + whenever(repository.numberOfAccounts()) doReturn 0 + whenever(repository.displayTrackingMessage()) doReturn false + whenever(repository.initialSyncDone(serverUrl, username)) doReturn false + + // WHEN - User logs in successfully + val result = openIdLogin(defaultConfig) + + // THEN - Both flags are false + assertIs<LoginResult.Success>(result) + assertEquals(false, result.displayTrackingMessage) + assertEquals(false, result.initialSyncDone) + } + + @Test + fun `GIVEN custom redirect URI scheme WHEN OpenID login succeeds THEN custom scheme is handled`() = + runTest { + // GIVEN - Custom app redirect URI + val customRedirectUri = "myapp://oauth/callback" + val customConfig = defaultConfig.copy(redirectUri = customRedirectUri) + whenever(repository.loginWithOpenId(customConfig)) doReturn Result.success(Unit) + whenever(repository.getUsername()) doReturn username + whenever(repository.numberOfAccounts()) doReturn 0 + whenever(repository.displayTrackingMessage()) doReturn false + whenever(repository.initialSyncDone(serverUrl, username)) doReturn true + + // WHEN - User logs in with custom redirect URI + val result = openIdLogin(customConfig) + + // THEN - Login succeeds with custom redirect URI + assertIs<LoginResult.Success>(result) + verify(repository).loginWithOpenId(customConfig) + } + + @Test + fun `GIVEN different server URL formats WHEN OpenID login succeeds THEN server URL is used correctly`() = + runTest { + // GIVEN - Server URL with path + val serverWithPath = "https://test.server.org/dhis" + val configWithPath = defaultConfig.copy(serverUrl = serverWithPath) + whenever(repository.loginWithOpenId(configWithPath)) doReturn Result.success(Unit) + whenever(repository.getUsername()) doReturn username + whenever(repository.numberOfAccounts()) doReturn 0 + whenever(repository.displayTrackingMessage()) doReturn false + whenever(repository.initialSyncDone(serverWithPath, username)) doReturn true + + // WHEN - User logs in with server URL containing path + val result = openIdLogin(configWithPath) + + // THEN - Server URL is passed correctly + assertIs<LoginResult.Success>(result) + verify(repository).updateServerUrls(serverWithPath) + verify(repository).initialSyncDone(serverWithPath, username) + } + + @Test + fun `GIVEN repository throws runtime exception WHEN OpenID login fails THEN exception message is returned`() = + runTest { + // GIVEN - Repository throws RuntimeException + val runtimeError = "OpenID provider unavailable" + whenever(repository.loginWithOpenId(defaultConfig)) doReturn Result.failure(RuntimeException(runtimeError)) + + // WHEN - User attempts to log in + val result = openIdLogin(defaultConfig) + + // THEN - Error message is propagated + assertIs<LoginResult.Error>(result) + assertEquals(runtimeError, result.message) + } + + @Test + fun `GIVEN successful OpenID login WHEN unlockSession is called THEN it is always executed`() = + runTest { + // GIVEN - Successful OpenID login + whenever(repository.loginWithOpenId(defaultConfig)) doReturn Result.success(Unit) + whenever(repository.getUsername()) doReturn username + whenever(repository.numberOfAccounts()) doReturn 0 + whenever(repository.displayTrackingMessage()) doReturn false + whenever(repository.initialSyncDone(serverUrl, username)) doReturn true + + // WHEN - User logs in + openIdLogin(defaultConfig) + + // THEN - Session is always unlocked on success + verify(repository).unlockSession() + } + + @Test + fun `GIVEN failed OpenID login WHEN unlockSession would be called THEN it is never executed`() = + runTest { + // GIVEN - Failed OpenID login + whenever(repository.loginWithOpenId(defaultConfig)) doReturn Result.failure(Exception("OpenID failed")) + + // WHEN - User attempts to log in + openIdLogin(defaultConfig) + + // THEN - Session is never unlocked on failure + verify(repository, never()).unlockSession() + } + + @Test + fun `GIVEN null prompt WHEN OpenID login succeeds THEN null prompt is passed to repository`() = + runTest { + // GIVEN - No prompt configured (SDK will use its default) + val configNullPrompt = defaultConfig.copy(prompt = null) + whenever(repository.loginWithOpenId(configNullPrompt)) doReturn Result.success(Unit) + whenever(repository.getUsername()) doReturn username + whenever(repository.numberOfAccounts()) doReturn 0 + whenever(repository.displayTrackingMessage()) doReturn false + whenever(repository.initialSyncDone(serverUrl, username)) doReturn true + + // WHEN - User logs in without a prompt override + val result = openIdLogin(configNullPrompt) + + // THEN - Login succeeds and null prompt is forwarded to the repository + assertIs<LoginResult.Success>(result) + verify(repository).loginWithOpenId(configNullPrompt) + } + + @Test + fun `GIVEN username with special characters WHEN OpenID login succeeds THEN username is handled correctly`() = + runTest { + // GIVEN - Username contains special characters + val specialUsername = "user@example.com" + whenever(repository.loginWithOpenId(defaultConfig)) doReturn Result.success(Unit) + whenever(repository.getUsername()) doReturn specialUsername + whenever(repository.numberOfAccounts()) doReturn 0 + whenever(repository.displayTrackingMessage()) doReturn false + whenever(repository.initialSyncDone(serverUrl, specialUsername)) doReturn true + + // WHEN - User logs in successfully + val result = openIdLogin(defaultConfig) + + // THEN - Special username is used correctly + assertIs<LoginResult.Success>(result) + verify(repository).updateAvailableUsers(specialUsername) + verify(repository).initialSyncDone(serverUrl, specialUsername) + } +} diff --git a/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModelTest.kt b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModelTest.kt index 5952605f521..c3bb5547f57 100644 --- a/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModelTest.kt +++ b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/CredentialsViewModelTest.kt @@ -4,6 +4,7 @@ import app.cash.turbine.test import coil3.PlatformContext import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.resetMain @@ -13,29 +14,36 @@ import org.dhis2.mobile.commons.network.NetworkStatusProvider import org.dhis2.mobile.login.main.domain.model.BiometricsInfo import org.dhis2.mobile.login.main.domain.model.LoginResult import org.dhis2.mobile.login.main.domain.model.LoginScreenState +import org.dhis2.mobile.login.main.domain.model.OpenIdLoginConfiguration import org.dhis2.mobile.login.main.domain.usecase.BiometricLogin import org.dhis2.mobile.login.main.domain.usecase.GetAvailableUsernames import org.dhis2.mobile.login.main.domain.usecase.GetBiometricInfo +import org.dhis2.mobile.login.main.domain.usecase.GetDeviceEnrollmentUrl import org.dhis2.mobile.login.main.domain.usecase.GetHasOtherAccounts import org.dhis2.mobile.login.main.domain.usecase.LogOutUser import org.dhis2.mobile.login.main.domain.usecase.LoginUser +import org.dhis2.mobile.login.main.domain.usecase.LoginUserWithOAuth import org.dhis2.mobile.login.main.domain.usecase.OpenIdLogin +import org.dhis2.mobile.login.main.domain.usecase.ProcessDeviceEnrollment import org.dhis2.mobile.login.main.domain.usecase.UpdateBiometricPermission import org.dhis2.mobile.login.main.domain.usecase.UpdateTrackingPermission +import org.dhis2.mobile.login.main.ui.navigation.AppLinkNavigation import org.dhis2.mobile.login.main.ui.navigation.Navigator import org.dhis2.mobile.login.main.ui.state.LoginState +import org.dhis2.mobile.login.main.ui.state.OidcInfo import org.dhis2.mobile.login.pin.domain.usecase.ForgotPinUseCase import org.dhis2.mobile.login.pin.domain.usecase.GetIsSessionLockedUseCase -import org.junit.After -import org.junit.Before -import org.junit.Test import org.mockito.kotlin.any import org.mockito.kotlin.doReturn import org.mockito.kotlin.eq import org.mockito.kotlin.mock import org.mockito.kotlin.never +import org.mockito.kotlin.times import org.mockito.kotlin.verify import org.mockito.kotlin.whenever +import kotlin.test.AfterTest +import kotlin.test.BeforeTest +import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertFalse import kotlin.test.assertTrue @@ -53,8 +61,12 @@ class CredentialsViewModelTest { private val loginOutUser: LogOutUser = mock() private val biometricLogin: BiometricLogin = mock() private val openIdLogin: OpenIdLogin = mock() + private val loginUserWithOAuth: LoginUserWithOAuth = mock() + private val getDeviceEnrollmentUrl: GetDeviceEnrollmentUrl = mock() + private val processDeviceEnrollment: ProcessDeviceEnrollment = mock() private val updateTrackingPermission: UpdateTrackingPermission = mock() private val updateBiometricPermission: UpdateBiometricPermission = mock() + private val appLinkNavigation: AppLinkNavigation = mock() private val networkStatusProvider: NetworkStatusProvider = mock() private val getIsSessionLockedUseCase: GetIsSessionLockedUseCase = mock() private val forgotPinUseCase: ForgotPinUseCase = mock() @@ -63,13 +75,14 @@ class CredentialsViewModelTest { private val turbineTimeout = 10.seconds - @Before + @BeforeTest fun setUp() { Dispatchers.setMain(testDispatcher) whenever(networkStatusProvider.connectionStatus) doReturn flowOf(true) + whenever(appLinkNavigation.appLink) doReturn MutableSharedFlow() } - @After + @AfterTest fun tearDown() { Dispatchers.resetMain() } @@ -532,11 +545,325 @@ class CredentialsViewModelTest { } } + @Test + fun `GIVEN app link with authorization code WHEN link arrives THEN OAuth login is triggered`() = + runTest { + // GIVEN + val serverUrl = "https://test.server.org" + val authCode = "auth_code_123" + val appLinkUrl = "https://vgarciabnz.github.io?code=$authCode&state=test" + val mockAppLinkFlow = MutableSharedFlow<String>() + val enrollmentUrl = "https://test.server.org/oauth2/enrollment" + + whenever(getAvailableUsernames()) doReturn emptyList() + whenever(getBiometricInfo(any())) doReturn BiometricsInfo(false, false) + whenever(getHasOtherAccounts.invoke()) doReturn false + whenever(getIsSessionLockedUseCase()) doReturn false + whenever(appLinkNavigation.appLink) doReturn mockAppLinkFlow + whenever(getDeviceEnrollmentUrl(any())) doReturn Result.success(enrollmentUrl) + whenever( + loginUserWithOAuth.invoke(any(), any()), + ) doReturn LoginResult.Success(initialSyncDone = true, displayTrackingMessage = false) + + // Use oAuthEnable=true and fromHome=true to avoid auto-launch but enable OAuth flow + initViewModel(serverUrl = serverUrl, username = "testuser", oAuthEnable = true, fromHome = true) + + viewModel.credentialsScreenState.test(timeout = turbineTimeout) { + awaitItem() + awaitItem() + + // Trigger OAuth flow by clicking login + viewModel.onLoginClicked() + testDispatcher.scheduler.advanceUntilIdle() + + // Login state should be running after clicking login + val runningState = awaitItem() + assertEquals(LoginState.Running, runningState.loginState) + + // WHEN - Send app link with authorization code (simulates OAuth callback) + mockAppLinkFlow.emit(appLinkUrl) + testDispatcher.scheduler.advanceUntilIdle() + + // Advance time for login to complete + testDispatcher.scheduler.advanceTimeBy(4.seconds) + + // Login should succeed and show after login actions + val finalState = awaitItem() + assertEquals(LoginState.Enabled, finalState.loginState) + assertTrue(finalState.afterLoginActions.isNotEmpty()) + + // Verify OAuth login was called with the correct code + verify(loginUserWithOAuth).invoke( + serverUrl = serverUrl, + code = authCode, + ) + + cancelAndIgnoreRemainingEvents() + } + } + + @Test + fun `GIVEN app link with IAT token WHEN link arrives THEN device enrollment is processed`() = + runTest { + // GIVEN + val serverUrl = "https://test.server.org" + val iat = "enrollment_iat_token" + val consentUrl = "https://test.server.org/oauth2/consent" + val enrollmentUrl = "https://test.server.org/oauth2/enrollment" + val appLinkUrl = "https://vgarciabnz.github.io?iat=$iat&state=test" + val mockAppLinkFlow = MutableSharedFlow<String>() + + whenever(getAvailableUsernames()) doReturn emptyList() + whenever(getBiometricInfo(any())) doReturn BiometricsInfo(false, false) + whenever(getHasOtherAccounts.invoke()) doReturn false + whenever(getIsSessionLockedUseCase()) doReturn false + whenever(appLinkNavigation.appLink) doReturn mockAppLinkFlow + whenever(getDeviceEnrollmentUrl(any())) doReturn Result.success(enrollmentUrl) + whenever( + processDeviceEnrollment.invoke(any()), + ) doReturn Result.success(consentUrl) + + // Use oAuthEnable=true and fromHome=true to avoid auto-launch but enable OAuth flow + initViewModel(serverUrl = serverUrl, username = "testuser", oAuthEnable = true, fromHome = true) + + viewModel.credentialsScreenState.test(timeout = turbineTimeout) { + awaitItem() + awaitItem() + + // Trigger OAuth flow by clicking login + viewModel.onLoginClicked() + testDispatcher.scheduler.advanceUntilIdle() + + // Login state should be running after clicking login + val runningState = awaitItem() + assertEquals(LoginState.Running, runningState.loginState) + + // WHEN - Send app link with IAT token (simulates enrollment callback) + mockAppLinkFlow.emit(appLinkUrl) + testDispatcher.scheduler.advanceUntilIdle() + + // Verify device enrollment was called with the correct IAT + verify(processDeviceEnrollment).invoke(any()) + + // Verify navigation happened twice: once for enrollment URL, once for consent URL + verify(navigator, times(2)).navigate(any<LoginScreenState>(), any()) + + cancelAndIgnoreRemainingEvents() + } + } + + @Test + fun `GIVEN app link with error WHEN link arrives THEN error message is displayed`() = + runTest { + // GIVEN + val serverUrl = "https://test.server.org" + val appLinkUrl = "https://vgarciabnz.github.io?error=access_denied&state=test" + val mockAppLinkFlow = MutableSharedFlow<String>() + val enrollmentUrl = "https://test.server.org/oauth2/enrollment" + + whenever(getAvailableUsernames()) doReturn emptyList() + whenever(getBiometricInfo(any())) doReturn BiometricsInfo(false, false) + whenever(getHasOtherAccounts.invoke()) doReturn false + whenever(getIsSessionLockedUseCase()) doReturn false + whenever(appLinkNavigation.appLink) doReturn mockAppLinkFlow + whenever(getDeviceEnrollmentUrl(any())) doReturn Result.success(enrollmentUrl) + + // Use oAuthEnable=true and fromHome=true to avoid auto-launch but enable OAuth flow + initViewModel(serverUrl = serverUrl, username = "testuser", oAuthEnable = true, fromHome = true) + + viewModel.credentialsScreenState.test(timeout = turbineTimeout) { + awaitItem() + awaitItem() + + // Trigger OAuth flow by clicking login + viewModel.onLoginClicked() + testDispatcher.scheduler.advanceUntilIdle() + + // Login state should be running after clicking login + val runningState = awaitItem() + assertEquals(LoginState.Running, runningState.loginState) + + // WHEN - Send app link with error (simulates OAuth error callback) + mockAppLinkFlow.emit(appLinkUrl) + testDispatcher.scheduler.advanceUntilIdle() + + // THEN - Error message should be shown + val errorState = awaitItem() + assertEquals("access_denied", errorState.errorMessage) + assertEquals(LoginState.Enabled, errorState.loginState) + + cancelAndIgnoreRemainingEvents() + } + } + + @Test + fun `GIVEN oidcInfo is Discovery with prompt WHEN onOpenIdLogin is called THEN discoveryUri and prompt are forwarded`() = + runTest { + val serverUrl = "https://test.server.org" + val prompt = "select_account" + val discoveryUri = "https://test.server.org/.well-known/openid-configuration" + val clientId = "client-123" + val redirectUri = "dhis2://oauth" + val oidcInfo = + OidcInfo.Discovery( + server = serverUrl, + loginButtonText = null, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + prompt = prompt, + ) + + whenever(getAvailableUsernames()) doReturn emptyList() + whenever(getBiometricInfo(any())) doReturn BiometricsInfo(false, false) + whenever(getHasOtherAccounts.invoke()) doReturn false + whenever(getIsSessionLockedUseCase()) doReturn false + whenever(openIdLogin.invoke(any())) doReturn LoginResult.Success(initialSyncDone = true, displayTrackingMessage = false) + + initViewModel(serverUrl = serverUrl, oidcInfo = oidcInfo) + + viewModel.credentialsScreenState.test(timeout = turbineTimeout) { + awaitItem() + awaitItem() + + viewModel.onOpenIdLogin() + + val runningState = awaitItem() + assertEquals(LoginState.Running, runningState.loginState) + + testDispatcher.scheduler.advanceUntilIdle() + + verify(openIdLogin).invoke( + OpenIdLoginConfiguration( + serverUrl = serverUrl, + isNetworkAvailable = true, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = discoveryUri, + authorizationUri = null, + tokenUrl = null, + prompt = prompt, + ), + ) + + cancelAndIgnoreRemainingEvents() + } + } + + @Test + fun `GIVEN oidcInfo is Token with prompt WHEN onOpenIdLogin is called THEN tokenUrl, authorizationUri and prompt are forwarded`() = + runTest { + val serverUrl = "https://test.server.org" + val prompt = "login" + val authorizationUrl = "https://test.server.org/oauth/authorize" + val tokenUrl = "https://test.server.org/oauth/token" + val clientId = "client-456" + val redirectUri = "dhis2://oauth" + val oidcInfo = + OidcInfo.Token( + server = serverUrl, + loginLabel = null, + clientId = clientId, + redirectUri = redirectUri, + authorizationUrl = authorizationUrl, + tokenUrl = tokenUrl, + prompt = prompt, + ) + + whenever(getAvailableUsernames()) doReturn emptyList() + whenever(getBiometricInfo(any())) doReturn BiometricsInfo(false, false) + whenever(getHasOtherAccounts.invoke()) doReturn false + whenever(getIsSessionLockedUseCase()) doReturn false + whenever(openIdLogin.invoke(any())) doReturn LoginResult.Success(initialSyncDone = true, displayTrackingMessage = false) + + initViewModel(serverUrl = serverUrl, oidcInfo = oidcInfo) + + viewModel.credentialsScreenState.test(timeout = turbineTimeout) { + awaitItem() + awaitItem() + + viewModel.onOpenIdLogin() + + val runningState = awaitItem() + assertEquals(LoginState.Running, runningState.loginState) + + testDispatcher.scheduler.advanceUntilIdle() + + verify(openIdLogin).invoke( + OpenIdLoginConfiguration( + serverUrl = serverUrl, + isNetworkAvailable = true, + clientId = clientId, + redirectUri = redirectUri, + discoveryUri = null, + authorizationUri = authorizationUrl, + tokenUrl = tokenUrl, + prompt = prompt, + ), + ) + + cancelAndIgnoreRemainingEvents() + } + } + + @Test + fun `GIVEN oidcInfo with null prompt WHEN onOpenIdLogin is called THEN null prompt is forwarded`() = + runTest { + val serverUrl = "https://test.server.org" + val oidcInfo = + OidcInfo.Discovery( + server = serverUrl, + loginButtonText = null, + clientId = "client-789", + redirectUri = "dhis2://oauth", + discoveryUri = "https://test.server.org/.well-known/openid-configuration", + prompt = null, + ) + + whenever(getAvailableUsernames()) doReturn emptyList() + whenever(getBiometricInfo(any())) doReturn BiometricsInfo(false, false) + whenever(getHasOtherAccounts.invoke()) doReturn false + whenever(getIsSessionLockedUseCase()) doReturn false + whenever(openIdLogin.invoke(any())) doReturn LoginResult.Success(initialSyncDone = true, displayTrackingMessage = false) + + initViewModel(serverUrl = serverUrl, oidcInfo = oidcInfo) + + viewModel.credentialsScreenState.test(timeout = turbineTimeout) { + awaitItem() + awaitItem() + + viewModel.onOpenIdLogin() + + val runningState = awaitItem() + assertEquals(LoginState.Running, runningState.loginState) + + testDispatcher.scheduler.advanceUntilIdle() + + verify(openIdLogin).invoke( + OpenIdLoginConfiguration( + serverUrl = serverUrl, + isNetworkAvailable = true, + clientId = "client-789", + redirectUri = "dhis2://oauth", + discoveryUri = "https://test.server.org/.well-known/openid-configuration", + authorizationUri = null, + tokenUrl = null, + prompt = null, + ), + ) + + cancelAndIgnoreRemainingEvents() + } + } + private fun initViewModel( serverName: String? = "Test Server", serverUrl: String = "https://test.server.org", username: String? = null, allowRecovery: Boolean = true, + oAuthEnable: Boolean = false, + fromHome: Boolean = false, + oidcInfo: OidcInfo? = null, ) { viewModel = CredentialsViewModel( @@ -548,8 +875,12 @@ class CredentialsViewModelTest { loginOutUser, biometricLogin, openIdLogin, + loginUserWithOAuth, + getDeviceEnrollmentUrl, + processDeviceEnrollment, updateTrackingPermission, updateBiometricPermission, + appLinkNavigation, networkStatusProvider, serverName, serverUrl, @@ -557,8 +888,9 @@ class CredentialsViewModelTest { allowRecovery, getIsSessionLockedUseCase, forgotPinUseCase, - oidcInfo = null, - false, + oidcInfo = oidcInfo, + fromHome = fromHome, + oAuthEnable = oAuthEnable, ) } } diff --git a/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/LoginViewModelTest.kt b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/LoginViewModelTest.kt index 8a7c39020c7..1e7d20baacb 100644 --- a/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/LoginViewModelTest.kt +++ b/login/src/commonTest/kotlin/org/dhis2/mobile/login/main/ui/viewmodel/LoginViewModelTest.kt @@ -3,7 +3,6 @@ package org.dhis2.mobile.login.main.ui.viewmodel import app.cash.turbine.test import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runTest @@ -14,16 +13,15 @@ import org.dhis2.mobile.login.main.domain.model.ServerValidationResult import org.dhis2.mobile.login.main.domain.usecase.GetInitialScreen import org.dhis2.mobile.login.main.domain.usecase.ImportDatabase import org.dhis2.mobile.login.main.domain.usecase.ValidateServer -import org.dhis2.mobile.login.main.ui.navigation.AppLinkNavigation import org.dhis2.mobile.login.main.ui.navigation.Navigator import org.dhis2.mobile.login.main.ui.state.DatabaseImportState import org.dhis2.mobile.login.main.ui.state.ServerValidationUiState -import org.junit.Before import org.mockito.kotlin.any import org.mockito.kotlin.eq import org.mockito.kotlin.mock import org.mockito.kotlin.verify import org.mockito.kotlin.whenever +import kotlin.test.BeforeTest import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertNull @@ -36,16 +34,13 @@ class LoginViewModelTest { private val getInitialScreen: GetInitialScreen = mock() private val importDatabase: ImportDatabase = mock() private val validateServer: ValidateServer = mock() - private val appLinkNavigation: AppLinkNavigation = mock() private val testDispatcher = UnconfinedTestDispatcher() - private val mockAppLinkFlow = MutableSharedFlow<String>() private val networkStatusProvider: NetworkStatusProvider = mock() private val mockNetworkStatusFlow = MutableStateFlow(true) - @Before + @BeforeTest fun setUp() { Dispatchers.setMain(testDispatcher) - whenever(appLinkNavigation.appLink).thenReturn(mockAppLinkFlow) whenever(networkStatusProvider.connectionStatus).thenReturn(mockNetworkStatusFlow) } @@ -67,7 +62,6 @@ class LoginViewModelTest { getInitialScreen = getInitialScreen, importDatabase = importDatabase, validateServer = validateServer, - appLinkNavigation = appLinkNavigation, networkStatusProvider = networkStatusProvider, ) @@ -102,7 +96,6 @@ class LoginViewModelTest { getInitialScreen = getInitialScreen, importDatabase = importDatabase, validateServer = validateServer, - appLinkNavigation = appLinkNavigation, networkStatusProvider = networkStatusProvider, ) @@ -146,7 +139,6 @@ class LoginViewModelTest { getInitialScreen = getInitialScreen, importDatabase = importDatabase, validateServer = validateServer, - appLinkNavigation = appLinkNavigation, networkStatusProvider = networkStatusProvider, ) @@ -167,44 +159,6 @@ class LoginViewModelTest { } } - @Test - fun `app link with valid code is handled correctly`() = - runTest { - val redirectUri = "https://vgarciabnz.github.io" - val code = "auth_code_123" - val appLinkUrl = "$redirectUri?code=$code&state=test" - - whenever(getInitialScreen()).thenReturn( - LoginScreenState.ServerValidation( - currentServer = "https://test.dhis2.org", - availableServers = listOf("https://test.dhis2.org"), - hasAccounts = false, - ), - ) - - viewModel = - LoginViewModel( - navigator = navigator, - getInitialScreen = getInitialScreen, - importDatabase = importDatabase, - validateServer = validateServer, - appLinkNavigation = appLinkNavigation, - networkStatusProvider = networkStatusProvider, - ) - - viewModel.serverValidationState.test { - assertEquals(ServerValidationUiState(), awaitItem()) - - // Send app link - mockAppLinkFlow.emit(appLinkUrl) - - // TODO: Verify that the code is processed correctly - // Currently the LoginViewModel has a TODO comment for this functionality - - expectNoEvents() - } - } - @Test fun `successfully import database`() = runTest { @@ -218,7 +172,6 @@ class LoginViewModelTest { getInitialScreen = getInitialScreen, importDatabase = importDatabase, validateServer = validateServer, - appLinkNavigation = appLinkNavigation, networkStatusProvider = networkStatusProvider, ) @@ -245,7 +198,6 @@ class LoginViewModelTest { getInitialScreen = getInitialScreen, importDatabase = importDatabase, validateServer = validateServer, - appLinkNavigation = appLinkNavigation, networkStatusProvider = networkStatusProvider, ) diff --git a/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/ForgotPinUseCaseTest.kt b/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/ForgotPinUseCaseTest.kt index 27c27f93ed1..d631a0d9c0a 100644 --- a/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/ForgotPinUseCaseTest.kt +++ b/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/ForgotPinUseCaseTest.kt @@ -2,10 +2,10 @@ package org.dhis2.mobile.login.pin.domain.usecase import kotlinx.coroutines.test.runTest import org.dhis2.mobile.login.pin.data.SessionRepository -import org.junit.Before import org.mockito.kotlin.mock import org.mockito.kotlin.verify import org.mockito.kotlin.whenever +import kotlin.test.BeforeTest import kotlin.test.Test import kotlin.test.assertTrue @@ -13,7 +13,7 @@ class ForgotPinUseCaseTest { private lateinit var useCase: ForgotPinUseCase private val repository: SessionRepository = mock() - @Before + @BeforeTest fun setUp() { useCase = ForgotPinUseCase(repository) } diff --git a/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/GetInitialScreenUseCaseTest.kt b/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/GetInitialScreenUseCaseTest.kt index 953ed6bd72a..9acf4a84562 100644 --- a/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/GetInitialScreenUseCaseTest.kt +++ b/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/GetInitialScreenUseCaseTest.kt @@ -6,12 +6,12 @@ import org.dhis2.mobile.login.accounts.domain.model.AccountModel import org.dhis2.mobile.login.main.domain.model.LoginScreenState import org.dhis2.mobile.login.main.domain.usecase.GetInitialScreen import org.dhis2.mobile.login.pin.data.SessionRepository -import org.junit.Assert.assertEquals -import org.junit.Before import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock import org.mockito.kotlin.whenever +import kotlin.test.BeforeTest import kotlin.test.Test +import kotlin.test.assertEquals import kotlin.test.assertIs import kotlin.test.assertTrue @@ -20,7 +20,7 @@ class GetInitialScreenUseCaseTest { private val accountRepository: AccountRepository = mock() private val sessionRepository: SessionRepository = mock() - @Before + @BeforeTest fun setUp() { useCase = GetInitialScreen(accountRepository, sessionRepository) } @@ -50,11 +50,11 @@ class GetInitialScreenUseCaseTest { val result = useCase() // Then - assertTrue(result is LoginScreenState.LegacyLogin) + assertTrue(result is LoginScreenState.LoginCredentials) } @Test - fun `go to oauth if there is 1 logged account with oauth`() = + fun `go to credentials screen with logout if there is 1 logged account with oauth`() = runTest { // Given whenever(accountRepository.getLoggedInAccounts()) doReturn @@ -64,7 +64,8 @@ class GetInitialScreenUseCaseTest { val result = useCase() // Then - assertTrue(result is LoginScreenState.OauthLogin) + assertTrue(result is LoginScreenState.LoginCredentials) + assertEquals(true, result.oAuthEnabled) // OAuth enabled, enrollment URL will be fetched by CredentialsViewModel } @Test @@ -83,7 +84,7 @@ class GetInitialScreenUseCaseTest { } @Test - fun `invoke returns OauthLogin when multiple accounts and session locked with OAuth account`() = + fun `invoke returns LegacyLogin when multiple accounts and session locked with OAuth account`() = runTest { // Given val activeAccount = @@ -105,8 +106,10 @@ class GetInitialScreenUseCaseTest { val result = useCase() // Then - assertIs<LoginScreenState.OauthLogin>(result) + assertIs<LoginScreenState.LoginCredentials>(result) assertEquals("https://active.com", result.selectedServer) + assertEquals("active_user", result.selectedUsername) + assertEquals(true, result.oAuthEnabled) // OAuth enabled, enrollment URL will be fetched by CredentialsViewModel } @Test @@ -133,7 +136,7 @@ class GetInitialScreenUseCaseTest { val result = useCase() // Then - assertIs<LoginScreenState.LegacyLogin>(result) + assertIs<LoginScreenState.LoginCredentials>(result) assertEquals("https://active.com", result.selectedServer) assertEquals("active_user", result.selectedUsername) } @@ -182,7 +185,7 @@ class GetInitialScreenUseCaseTest { val result = useCase() // Then - assertIs<LoginScreenState.LegacyLogin>(result) + assertIs<LoginScreenState.LoginCredentials>(result) assertEquals("locked_user", result.selectedUsername) } diff --git a/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/SavePinUseCaseTest.kt b/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/SavePinUseCaseTest.kt index ac82cc1f900..4fff47af996 100644 --- a/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/SavePinUseCaseTest.kt +++ b/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/SavePinUseCaseTest.kt @@ -2,10 +2,10 @@ package org.dhis2.mobile.login.pin.domain.usecase import kotlinx.coroutines.test.runTest import org.dhis2.mobile.login.pin.data.SessionRepository -import org.junit.Before import org.mockito.kotlin.mock import org.mockito.kotlin.verify import org.mockito.kotlin.whenever +import kotlin.test.BeforeTest import kotlin.test.Test import kotlin.test.assertTrue @@ -13,7 +13,7 @@ class SavePinUseCaseTest { private lateinit var useCase: SavePinUseCase private val repository: SessionRepository = mock() - @Before + @BeforeTest fun setUp() { useCase = SavePinUseCase(repository) } diff --git a/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/ValidatePinUseCaseTest.kt b/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/ValidatePinUseCaseTest.kt index d2cdf525284..e140b293109 100644 --- a/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/ValidatePinUseCaseTest.kt +++ b/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/domain/usecase/ValidatePinUseCaseTest.kt @@ -4,9 +4,9 @@ import kotlinx.coroutines.test.runTest import org.dhis2.mobile.login.pin.data.SessionRepository import org.dhis2.mobile.login.pin.domain.model.PinError import org.dhis2.mobile.login.pin.domain.model.ValidatePinInput -import org.junit.Before import org.mockito.kotlin.mock import org.mockito.kotlin.whenever +import kotlin.test.BeforeTest import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertTrue @@ -15,7 +15,7 @@ class ValidatePinUseCaseTest { private lateinit var useCase: ValidatePinUseCase private val repository: SessionRepository = mock() - @Before + @BeforeTest fun setUp() { useCase = ValidatePinUseCase(repository) } diff --git a/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/ui/viewmodel/PinViewModelTest.kt b/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/ui/viewmodel/PinViewModelTest.kt index ec708e71a05..1ef3fb35d45 100644 --- a/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/ui/viewmodel/PinViewModelTest.kt +++ b/login/src/commonTest/kotlin/org/dhis2/mobile/login/pin/ui/viewmodel/PinViewModelTest.kt @@ -1,25 +1,29 @@ package org.dhis2.mobile.login.pin.ui.viewmodel -import app.cash.turbine.test import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.setMain import org.dhis2.mobile.login.pin.domain.model.PinError -import org.dhis2.mobile.login.pin.domain.model.PinState +import org.dhis2.mobile.login.pin.domain.model.PinMode import org.dhis2.mobile.login.pin.domain.model.ValidatePinInput import org.dhis2.mobile.login.pin.domain.usecase.ForgotPinUseCase import org.dhis2.mobile.login.pin.domain.usecase.SavePinUseCase import org.dhis2.mobile.login.pin.domain.usecase.ValidatePinUseCase -import org.dhis2.mobile.login.pin.ui.components.PinMode import org.dhis2.mobile.login.pin.ui.provider.PinResourceProvider -import org.junit.Before +import org.mockito.kotlin.any import org.mockito.kotlin.mock import org.mockito.kotlin.whenever +import kotlin.test.AfterTest +import kotlin.test.BeforeTest import kotlin.test.Test import kotlin.test.assertEquals +import kotlin.test.assertFalse +import kotlin.test.assertNull import kotlin.test.assertTrue @OptIn(ExperimentalCoroutinesApi::class) @@ -31,283 +35,269 @@ class PinViewModelTest { private val resourceProvider: PinResourceProvider = mock() private val testDispatcher = StandardTestDispatcher() - @Before + @BeforeTest fun setUp() { Dispatchers.setMain(testDispatcher) + runBlocking { + whenever(resourceProvider.getPinTitle(any())).thenReturn("") + whenever(resourceProvider.getPinSubtitle(any())).thenReturn("") + whenever(resourceProvider.getPrimaryButtonText(any())).thenReturn("") + whenever(resourceProvider.getSecondaryButtonText(any())).thenReturn(null) + } + } + + @AfterTest + fun tearDown() { + Dispatchers.resetMain() } @Test - fun `initial state is Idle`() = + fun `initial state has no error and no active flags`() = runTest { - // Given viewModel = createViewModel() - // Then - assertEquals(PinState.Idle, viewModel.uiState.value) + val state = viewModel.uiState.value + assertNull(state.errorMessage) + assertFalse(state.isLoading) + assertFalse(state.isSuccess) + assertFalse(state.isDismissed) + assertFalse(state.isTooManyAttempts) } @Test fun `onPinComplete with SET mode saves PIN successfully`() = runTest { - // Given - viewModel = createViewModel() + viewModel = createViewModel(PinMode.SET) val pin = "1234" whenever(savePinUseCase(pin)).thenReturn(Result.success(Unit)) - // When - viewModel.onPinComplete(pin, PinMode.SET) + viewModel.onPinChanged(pin) + viewModel.onPinComplete() advanceUntilIdle() - // Then - assertTrue(viewModel.uiState.value is PinState.Success) + assertTrue(viewModel.uiState.value.isSuccess) } @Test fun `onPinComplete with SET mode shows error when save fails`() = runTest { - // Given - viewModel = createViewModel() + viewModel = createViewModel(PinMode.SET) val pin = "1234" - val error = Exception("Save failed") - whenever(savePinUseCase(pin)).thenReturn(Result.failure(error)) + whenever(savePinUseCase(pin)).thenReturn(Result.failure(Exception("Save failed"))) - // When - viewModel.onPinComplete(pin, PinMode.SET) + viewModel.onPinChanged(pin) + viewModel.onPinComplete() advanceUntilIdle() - // Then - val state = viewModel.uiState.value - assertTrue(state is PinState.Error) - assertEquals("Save failed", state.message) + assertEquals("Save failed", viewModel.uiState.value.errorMessage) } @Test fun `onPinComplete with SET mode uses resource provider when error message is null`() = runTest { - // Given - viewModel = createViewModel() + viewModel = createViewModel(PinMode.SET) val pin = "1234" - val error = Exception() - whenever(savePinUseCase(pin)).thenReturn(Result.failure(error)) + whenever(savePinUseCase(pin)).thenReturn(Result.failure(Exception())) whenever(resourceProvider.getPinErrorSaveFailed()).thenReturn("Failed to save PIN") - // When - viewModel.onPinComplete(pin, PinMode.SET) + viewModel.onPinChanged(pin) + viewModel.onPinComplete() advanceUntilIdle() - // Then - val state = viewModel.uiState.value - assertTrue(state is PinState.Error) - assertEquals("Failed to save PIN", state.message) + assertEquals("Failed to save PIN", viewModel.uiState.value.errorMessage) } @Test fun `onPinComplete with ASK mode validates PIN successfully`() = runTest { - // Given - viewModel = createViewModel() + viewModel = createViewModel(PinMode.ASK) val pin = "1234" whenever(validatePinUseCase(ValidatePinInput(pin, 0))).thenReturn(Result.success(Unit)) - // When - viewModel.onPinComplete(pin, PinMode.ASK) + viewModel.onPinChanged(pin) + viewModel.onPinComplete() advanceUntilIdle() - // Then - assertTrue(viewModel.uiState.value is PinState.Success) + assertTrue(viewModel.uiState.value.isSuccess) } @Test fun `onPinComplete with ASK mode shows error when PIN is incorrect`() = runTest { - // Given - viewModel = createViewModel() + viewModel = createViewModel(PinMode.ASK) val pin = "0000" - whenever(validatePinUseCase(ValidatePinInput(pin, 0))).thenReturn(Result.failure(PinError.Failed(attemptsLeft = 2))) + whenever(validatePinUseCase(ValidatePinInput(pin, 0))).thenReturn( + Result.failure(PinError.Failed(attemptsLeft = 2)), + ) whenever(resourceProvider.getPinErrorIncorrect()).thenReturn("Incorrect PIN") + whenever(resourceProvider.getPinErrorWithAttempts("Incorrect PIN", 2)) + .thenReturn("Incorrect PIN. 2 attempts remaining") - // When - viewModel.onPinComplete(pin, PinMode.ASK) + viewModel.onPinChanged(pin) + viewModel.onPinComplete() advanceUntilIdle() - // Then - val state = viewModel.uiState.value - assertTrue(state is PinState.Error) - assertEquals("Incorrect PIN", state.message) - assertEquals(2, state.remainingAttempts) + assertEquals("Incorrect PIN. 2 attempts remaining", viewModel.uiState.value.errorMessage) } @Test fun `onPinComplete with ASK mode shows TooManyAttempts after 3 failed attempts`() = runTest { - // Given - viewModel = createViewModel() + viewModel = createViewModel(PinMode.ASK) val pin = "0000" whenever(resourceProvider.getPinErrorIncorrect()).thenReturn("Incorrect PIN") - // First attempt - whenever(validatePinUseCase(ValidatePinInput(pin, 0))).thenReturn(Result.failure(PinError.Failed(attemptsLeft = 2))) - viewModel.onPinComplete(pin, PinMode.ASK) + whenever(validatePinUseCase(ValidatePinInput(pin, 0))).thenReturn( + Result.failure(PinError.Failed(attemptsLeft = 2)), + ) + viewModel.onPinChanged(pin) + viewModel.onPinComplete() advanceUntilIdle() - // Second attempt - whenever(validatePinUseCase(ValidatePinInput(pin, 1))).thenReturn(Result.failure(PinError.Failed(attemptsLeft = 1))) - viewModel.onPinComplete(pin, PinMode.ASK) + whenever(validatePinUseCase(ValidatePinInput(pin, 1))).thenReturn( + Result.failure(PinError.Failed(attemptsLeft = 1)), + ) + viewModel.onPinChanged(pin) + viewModel.onPinComplete() advanceUntilIdle() - // Third attempt - whenever(validatePinUseCase(ValidatePinInput(pin, 2))).thenReturn(Result.failure(PinError.TooManyAttempts)) - viewModel.onPinComplete(pin, PinMode.ASK) + whenever(validatePinUseCase(ValidatePinInput(pin, 2))).thenReturn( + Result.failure(PinError.TooManyAttempts), + ) + viewModel.onPinChanged(pin) + viewModel.onPinComplete() advanceUntilIdle() - // Then - assertTrue(viewModel.uiState.value is PinState.TooManyAttempts) + assertTrue(viewModel.uiState.value.isTooManyAttempts) } @Test fun `onPinComplete with ASK mode shows error when no PIN is stored`() = runTest { - // Given - viewModel = createViewModel() + viewModel = createViewModel(PinMode.ASK) val pin = "1234" - whenever(validatePinUseCase(ValidatePinInput(pin, 0))).thenReturn(Result.failure(PinError.NoPinStored)) + whenever(validatePinUseCase(ValidatePinInput(pin, 0))).thenReturn( + Result.failure(PinError.NoPinStored), + ) whenever(resourceProvider.getPinErrorNoPinStored()).thenReturn("No PIN stored") - // When - viewModel.onPinComplete(pin, PinMode.ASK) + viewModel.onPinChanged(pin) + viewModel.onPinComplete() advanceUntilIdle() - // Then - val state = viewModel.uiState.value - assertTrue(state is PinState.Error) - assertEquals("No PIN stored", state.message) + assertEquals("No PIN stored", viewModel.uiState.value.errorMessage) } @Test fun `onForgotPin executes successfully`() = runTest { - // Given viewModel = createViewModel() whenever(forgotPinUseCase(Unit)).thenReturn(Result.success(Unit)) - // When viewModel.onForgotPin() advanceUntilIdle() - // Then - assertTrue(viewModel.uiState.value is PinState.Dismissed) + assertTrue(viewModel.uiState.value.isDismissed) } @Test fun `onForgotPin shows error when it fails`() = runTest { - // Given viewModel = createViewModel() - val error = Exception("Logout failed") - whenever(forgotPinUseCase(Unit)).thenReturn(Result.failure(error)) + whenever(forgotPinUseCase(Unit)).thenReturn(Result.failure(Exception("Logout failed"))) - // When viewModel.onForgotPin() advanceUntilIdle() - // Then - val state = viewModel.uiState.value - assertTrue(state is PinState.Error) - assertEquals("Logout failed", state.message) + assertEquals("Logout failed", viewModel.uiState.value.errorMessage) } @Test fun `onForgotPin uses resource provider when error message is null`() = runTest { - // Given viewModel = createViewModel() - val error = Exception() - whenever(forgotPinUseCase(Unit)).thenReturn(Result.failure(error)) + whenever(forgotPinUseCase(Unit)).thenReturn(Result.failure(Exception())) whenever(resourceProvider.getPinErrorResetFailed()).thenReturn("Failed to reset PIN") - // When viewModel.onForgotPin() advanceUntilIdle() - // Then - val state = viewModel.uiState.value - assertTrue(state is PinState.Error) - assertEquals("Failed to reset PIN", state.message) + assertEquals("Failed to reset PIN", viewModel.uiState.value.errorMessage) } @Test - fun `resetState changes state to Idle`() = + fun `resetState clears error and active flags`() = runTest { - // Given - viewModel = createViewModel() + viewModel = createViewModel(PinMode.ASK) val pin = "0000" - whenever(validatePinUseCase(ValidatePinInput(pin, 0))).thenReturn(Result.failure(PinError.Failed(attemptsLeft = 2))) + whenever(validatePinUseCase(ValidatePinInput(pin, 0))).thenReturn( + Result.failure(PinError.Failed(attemptsLeft = 2)), + ) whenever(resourceProvider.getPinErrorIncorrect()).thenReturn("Incorrect PIN") - viewModel.onPinComplete(pin, PinMode.ASK) + viewModel.onPinChanged(pin) + viewModel.onPinComplete() advanceUntilIdle() - // When viewModel.resetState() - // Then - assertEquals(PinState.Idle, viewModel.uiState.value) + val state = viewModel.uiState.value + assertNull(state.errorMessage) + assertFalse(state.isLoading) + assertFalse(state.isSuccess) + assertFalse(state.isDismissed) + assertFalse(state.isTooManyAttempts) } @Test fun `resetAttempts resets the attempt counter`() = runTest { - // Given - viewModel = createViewModel() + viewModel = createViewModel(PinMode.ASK) val pin = "0000" whenever(resourceProvider.getPinErrorIncorrect()).thenReturn("Incorrect PIN") - - // Make a failed attempt - whenever(validatePinUseCase(ValidatePinInput(pin, 0))).thenReturn(Result.failure(PinError.Failed(attemptsLeft = 2))) - viewModel.onPinComplete(pin, PinMode.ASK) + whenever(resourceProvider.getPinErrorWithAttempts("Incorrect PIN", 2)) + .thenReturn("Incorrect PIN. 2 attempts remaining") + + // First failed attempt (attempt index 0) + whenever(validatePinUseCase(ValidatePinInput(pin, 0))).thenReturn( + Result.failure(PinError.Failed(attemptsLeft = 2)), + ) + viewModel.onPinChanged(pin) + viewModel.onPinComplete() advanceUntilIdle() - // When + // Reset attempt counter viewModel.resetAttempts() - // Try again - should use attempts = 0 - whenever(validatePinUseCase(ValidatePinInput(pin, 0))).thenReturn(Result.failure(PinError.Failed(attemptsLeft = 2))) - viewModel.onPinComplete(pin, PinMode.ASK) + // Second attempt should restart from index 0 + whenever(validatePinUseCase(ValidatePinInput(pin, 0))).thenReturn( + Result.failure(PinError.Failed(attemptsLeft = 2)), + ) + viewModel.onPinChanged(pin) + viewModel.onPinComplete() advanceUntilIdle() - // Then - should still have 2 attempts left - val state = viewModel.uiState.value - assertTrue(state is PinState.Error) - assertEquals(2, state.remainingAttempts) + assertEquals("Incorrect PIN. 2 attempts remaining", viewModel.uiState.value.errorMessage) } @Test - fun `state changes are emitted correctly`() = + fun `state transitions through loading to success`() = runTest { - // Given - viewModel = createViewModel() + viewModel = createViewModel(PinMode.SET) val pin = "1234" whenever(savePinUseCase(pin)).thenReturn(Result.success(Unit)) - // When/Then - viewModel.uiState.test { - // Initial state - assertEquals(PinState.Idle, awaitItem()) - - // Trigger save - viewModel.onPinComplete(pin, PinMode.SET) - - // Loading state - assertEquals(PinState.Loading, awaitItem()) - - advanceUntilIdle() + viewModel.onPinChanged(pin) + viewModel.onPinComplete() + advanceUntilIdle() - // Success state - assertEquals(PinState.Success, awaitItem()) - } + val state = viewModel.uiState.value + assertFalse(state.isLoading) + assertTrue(state.isSuccess) } - private fun createViewModel() = + private fun createViewModel(mode: PinMode = PinMode.ASK) = PinViewModel( + mode = mode, savePinUseCase = savePinUseCase, validatePinUseCase = validatePinUseCase, forgotPinUseCase = forgotPinUseCase, diff --git a/login/src/desktopMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.desktop.kt b/login/src/desktopMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.desktop.kt index 2a0dba63de3..ed7aa425c62 100644 --- a/login/src/desktopMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.desktop.kt +++ b/login/src/desktopMain/kotlin/org/dhis2/mobile/login/main/di/LoginModule.desktop.kt @@ -4,4 +4,6 @@ import org.koin.core.module.Module import org.koin.dsl.module internal actual val accountModule: Module - get() = module { } + get() = + module { + } diff --git a/run_tests.sh b/run_tests.sh index 1aaa083608d..1907444367b 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -6,6 +6,6 @@ echo "Running Ktlint check..." ./gradlew ktlintCheck echo "Running Unit Tests..." -./gradlew testDebugUnitTest testDhis2DebugUnitTest +./gradlew testDebugUnitTest testDhis2DebugUnitTest testAndroidHostTest echo "All tasks completed!" diff --git a/scripts/check_pr_size.sh b/scripts/check_pr_size.sh index d5a9f161367..f0b15e54fee 100644 --- a/scripts/check_pr_size.sh +++ b/scripts/check_pr_size.sh @@ -40,12 +40,15 @@ fi echo "Merge base: $MERGE_BASE" +# Define the files to exclude +EXCLUDE_PATTERN="**/verification-metadata.xml" + # Print the diff statistics from merge base to HEAD (only your changes) -echo "Diff statistics from merge base to HEAD (PR changes only):" -git diff --stat "$MERGE_BASE"..HEAD +echo "Diff statistics from merge base to HEAD (PR changes only), excluding $EXCLUDE_PATTERN:" +git diff --stat "$MERGE_BASE"..HEAD -- . ":(exclude)$EXCLUDE_PATTERN" # Get the total number of lines changed in the PR from the merge base -CHANGED_LINES=$(git diff --stat "$MERGE_BASE"..HEAD | tail -n1 | awk '{print $4 + $6}') +CHANGED_LINES=$(git diff --numstat "$MERGE_BASE"..HEAD -- . ":(exclude)$EXCLUDE_PATTERN" | awk '{s+=$1; s+=$2} END {print s}') # Handle cases where no changes are detected if [[ -z "$CHANGED_LINES" ]]; then @@ -59,4 +62,4 @@ if [[ "$CHANGED_LINES" -gt "$MAX_LINES" ]]; then fi echo "PR size is acceptable: $CHANGED_LINES lines changed." -exit 0 \ No newline at end of file +exit 0 diff --git a/settings.gradle.kts b/settings.gradle.kts index de9c03925ea..b2e05f67018 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -26,7 +26,7 @@ dependencyResolutionManagement { include( ":app", ":dhis_android_analytics", ":form", ":commons", - ":dhis2_android_maps", ":compose-table", ":ui-components", + ":dhis2_android_maps", ":compose-table", ":stock-usecase" ) include(":dhis2-mobile-program-rules") diff --git a/stock-usecase/build.gradle.kts b/stock-usecase/build.gradle.kts index 01555229985..bc413a81117 100644 --- a/stock-usecase/build.gradle.kts +++ b/stock-usecase/build.gradle.kts @@ -2,7 +2,6 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { id("com.android.library") - kotlin("android") id("kotlin-parcelize") alias(libs.plugins.kotlin.serialization) alias(libs.plugins.kotlin.compose.compiler) @@ -20,7 +19,6 @@ android { defaultConfig { minSdk = libs.versions.minSdk.get().toInt() testOptions.targetSdk = libs.versions.sdk.get().toInt() - multiDexEnabled = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") @@ -86,6 +84,8 @@ dependencies { implementation(libs.koin.androidx.compose) implementation(libs.bundles.stock.implementation) implementation(libs.androidx.compose) + implementation(libs.androidx.compose.constraintlayout) + testImplementation(project(":dhis_android_analytics")) coreLibraryDesugaring(libs.bundles.stock.core) testImplementation(libs.bundles.stock.test) diff --git a/stock-usecase/src/main/AndroidManifest.xml b/stock-usecase/src/main/AndroidManifest.xml index d4fd3a53e7c..3078b27ec3e 100644 --- a/stock-usecase/src/main/AndroidManifest.xml +++ b/stock-usecase/src/main/AndroidManifest.xml @@ -3,31 +3,10 @@ <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> - - <queries> - <intent> - <action android:name="android.speech.RecognitionService" /> - </intent> - <intent> - <action android:name="android.intent.action.VIEW" /> - - <category android:name="android.intent.category.BROWSABLE" /> - - <data - android:host="org.icrc.dhis2.psmadvanced_test" - android:path="/J4CFTTod1TjeYgl9zsMgdcEaXnY=" - android:scheme="msauth" /> - </intent> - <intent> - <action android:name="android.support.customtabs.action.CustomTabsService" /> - </intent> - </queries> - <application android:allowBackup="false"> <activity android:name=".ui.home.HomeActivity" - android:configChanges="keyboardHidden|orientation|screenSize" android:windowSoftInputMode="adjustResize" /> <activity android:name=".ui.scanner.ScannerActivity" diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/services/StockManagerImpl.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/services/StockManagerImpl.kt index 3b15f359383..589d3a5bf1e 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/services/StockManagerImpl.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/services/StockManagerImpl.kt @@ -18,6 +18,7 @@ import org.dhis2.android.rtsm.utils.AttributeHelper import org.dhis2.android.rtsm.utils.ConfigUtils.getTransactionDataElement import org.dhis2.commons.bindings.distributedTo import org.dhis2.commons.bindings.stockUseCase +import org.dhis2.mobileProgramRules.sortForRuleEngine import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.arch.repositories.scope.RepositoryScope import org.hisp.dhis.android.core.enrollment.Enrollment @@ -32,7 +33,6 @@ import org.hisp.dhis.android.core.trackedentity.TrackedEntityInstance import org.hisp.dhis.android.core.usecase.stock.StockUseCase import org.hisp.dhis.rules.models.RuleEffect import timber.log.Timber -import java.util.Collections class StockManagerImpl( val d2: D2, @@ -66,14 +66,14 @@ class StockManagerImpl( if (!query.name.isNullOrEmpty()) { teiRepository - .byQuery() + .byFilter(config.itemDescription) .like(query.name) .also { teiRepository = it } } if (!query.code.isNullOrEmpty()) { teiRepository - .byQuery() + .byFilter(config.itemCode) .eq(query.code) .also { teiRepository = it } } @@ -133,37 +133,29 @@ class StockManagerImpl( tei: TrackedEntityInstance, stockOnHandUid: String, ): String? { + + val activeEnrollments = + d2.enrollmentModule().enrollments().byTrackedEntityInstance().eq(tei.uid()).byStatus() + .eq(EnrollmentStatus.ACTIVE) + .blockingGetUids() + val events = d2 .eventModule() .events() - .byTrackedEntityInstanceUids(Collections.singletonList(tei.uid())) - .byDataValue(stockOnHandUid) - .like("") + .byEnrollmentUid().`in`(activeEnrollments) .byDeleted() .isFalse - .withTrackedEntityDataValues() - .orderByEventDate(RepositoryScope.OrderByDirection.DESC) .blockingGet() + .sortForRuleEngine() - events - .filter { - d2 - .enrollmentModule() - .enrollments() - .uid(it.enrollment()) - .blockingGet() - ?.status() == EnrollmentStatus.ACTIVE - }.forEach { event -> - event.trackedEntityDataValues()?.forEach { dataValue -> - dataValue.dataElement().let { dv -> - if (dv.equals(stockOnHandUid)) { - return dataValue.value() - } - } - } + events.forEach { event -> + val dataValue = d2.trackedEntityModule().trackedEntityDataValues() + .value(event.uid(), stockOnHandUid).blockingGet() + dataValue?.let { + return it.value() } - + } return null } @@ -175,9 +167,9 @@ class StockManagerImpl( ): String { Timber.tag("EVENT_CREATION").i( "Enrollment: ${enrollment.uid()}\n" + - "Program: ${programUid}\n" + - "Stage: ${programStage.uid()}\n" + - "OU: ${facility.uid}\n", + "Program: ${programUid}\n" + + "Stage: ${programStage.uid()}\n" + + "OU: ${facility.uid}\n", ) return d2.eventModule().events().blockingAdd( EventCreateProjection @@ -209,7 +201,14 @@ class StockManagerImpl( items.forEach { entry -> getEnrollment(entry.item.id)?.let { enrollment -> - createEvent(entry, programStage, enrollment, transaction, stockUseCase, hasErrorOnComplete) + createEvent( + entry, + programStage, + enrollment, + transaction, + stockUseCase, + hasErrorOnComplete + ) } } return Single.just(Unit) @@ -309,7 +308,14 @@ class StockManagerImpl( try { Timber.i("event:$eventUid") - Timber.i("de:${getTransactionDataElement(transaction.transactionType, stockUseCase)}") + Timber.i( + "de:${ + getTransactionDataElement( + transaction.transactionType, + stockUseCase + ) + }" + ) Timber.i("data to save:${item.qty}") d2 .trackedEntityModule() @@ -354,7 +360,13 @@ class StockManagerImpl( } try { - updateStockOnHand(item, stockUseCase.programUid, transaction, eventUid, stockUseCase) + updateStockOnHand( + item, + stockUseCase.programUid, + transaction, + eventUid, + stockUseCase + ) } catch (e: Exception) { if (e is D2Error) { Timber.e(e.originalException()) diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/services/rules/RuleValidationHelperImpl.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/services/rules/RuleValidationHelperImpl.kt index 5d2d9e75df6..ea3b5721372 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/services/rules/RuleValidationHelperImpl.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/services/rules/RuleValidationHelperImpl.kt @@ -2,8 +2,6 @@ package org.dhis2.android.rtsm.services.rules import io.reactivex.Flowable import io.reactivex.Single -import kotlinx.datetime.Clock -import kotlinx.datetime.Instant import org.apache.commons.lang3.math.NumberUtils import org.dhis2.android.rtsm.data.TransactionType import org.dhis2.android.rtsm.data.models.StockEntry @@ -15,6 +13,7 @@ import org.dhis2.commons.bindings.distributedTo import org.dhis2.commons.rules.RuleEngineContextData import org.dhis2.mobileProgramRules.toRuleDataValue import org.dhis2.mobileProgramRules.toRuleEngineInstant +import org.dhis2.mobileProgramRules.toRuleEngineInstantOrNow import org.dhis2.mobileProgramRules.toRuleEngineLocalDate import org.dhis2.mobileProgramRules.toRuleList import org.dhis2.mobileProgramRules.toRuleVariableList @@ -27,6 +26,7 @@ import org.hisp.dhis.android.core.program.ProgramRuleActionType import org.hisp.dhis.android.core.program.ProgramStage import org.hisp.dhis.android.core.usecase.stock.StockUseCase import org.hisp.dhis.rules.api.RuleEngine +import org.hisp.dhis.rules.api.RuleSupplementaryData import org.hisp.dhis.rules.models.RuleDataValue import org.hisp.dhis.rules.models.RuleEffect import org.hisp.dhis.rules.models.RuleEvent @@ -131,6 +131,7 @@ class RuleValidationHelperImpl( programStage.uid(), programStage.name()!!, RuleEventStatus.ACTIVE, + period.toRuleEngineLocalDate(), period.toRuleEngineInstant(), period.toRuleEngineInstant(), period.toRuleEngineLocalDate(), @@ -178,7 +179,7 @@ class RuleValidationHelperImpl( constantsMap } - private fun supplementaryData(): Single<Map<String, List<String>>> = Single.just(hashMapOf()) + private fun supplementaryData(): Single<RuleSupplementaryData> = Single.just(RuleSupplementaryData()) private fun ruleEngineData( teiUid: String, @@ -272,12 +273,9 @@ class RuleValidationHelperImpl( } else { RuleEventStatus.valueOf(event.status()!!.name) }, - eventDate = (event.eventDate() ?: Date()).toRuleEngineInstant(), - createdDate = - event - .created() - ?.let { Instant.fromEpochMilliseconds(it.time) } - ?: Clock.System.now(), + eventDate = (event.eventDate() ?: Date()).toRuleEngineLocalDate(), + createdDate = event.created().toRuleEngineInstantOrNow(), + createdAtClientDate = event.createdAtClient()?.toRuleEngineInstant(), dueDate = event.dueDate()?.toRuleEngineLocalDate(), completedDate = event.completedDate()?.toRuleEngineLocalDate(), organisationUnit = event.organisationUnit()!!, diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/HomeActivity.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/HomeActivity.kt index c5814e344b9..f40ae195be6 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/HomeActivity.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/HomeActivity.kt @@ -4,22 +4,18 @@ import android.content.Intent import android.os.Bundle import android.util.TypedValue import android.view.WindowManager -import android.widget.Toast import androidx.activity.compose.setContent -import androidx.activity.result.ActivityResultLauncher +import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material.ScaffoldState -import androidx.compose.material.Surface +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.compositionLocalOf +import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue -import androidx.compose.ui.Modifier +import androidx.compose.runtime.remember import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.toArgb -import androidx.compose.ui.res.colorResource -import com.journeyapps.barcodescanner.ScanContract -import com.journeyapps.barcodescanner.ScanIntentResult -import com.journeyapps.barcodescanner.ScanOptions +import androidx.core.content.ContextCompat import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import org.dhis2.android.rtsm.R @@ -28,22 +24,18 @@ import org.dhis2.android.rtsm.ui.home.screens.HomeScreen import org.dhis2.android.rtsm.ui.managestock.ManageStockViewModel import org.dhis2.android.rtsm.utils.NetworkUtils import org.dhis2.commons.Constants -import org.dhis2.commons.filters.FilterManager import org.dhis2.commons.sync.OnDismissListener import org.dhis2.commons.sync.OnSyncNavigationListener import org.dhis2.commons.sync.SyncContext import org.dhis2.commons.sync.SyncDialog import org.dhis2.commons.sync.SyncStatusItem -import org.dhis2.commons.ui.extensions.handleInsets +import org.dhis2.mobile.commons.extensions.toColor import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme import org.koin.androidx.viewmodel.ext.android.viewModel class HomeActivity : AppCompatActivity() { private val viewModel: HomeViewModel by viewModel() private val manageStockViewModel: ManageStockViewModel by viewModel() - private var themeColor = R.color.colorPrimary - private lateinit var filterManager: FilterManager - private lateinit var barcodeLauncher: ActivityResultLauncher<ScanOptions> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -53,46 +45,46 @@ class HomeActivity : AppCompatActivity() { onBackPressedDispatcher.onBackPressed() } - filterManager = FilterManager.getInstance() intent .getStringExtra(Constants.PROGRAM_UID) ?.let { manageStockViewModel.setConfig(it) } - handleInsets() + enableEdgeToEdge() setContent { val settingsUiState by viewModel.settingsUiState.collectAsState() + val themeColor by remember { + derivedStateOf { + updateTheme(settingsUiState.selectedTransactionItem.type) + } + } val helperText by viewModel.helperText.collectAsState() manageStockViewModel.setHelperText(helperText) - updateTheme(settingsUiState.selectedTransactionItem.type) - manageStockViewModel.setThemeColor(Color(colorResource(themeColor).toArgb())) DHIS2Theme { - Surface( - modifier = Modifier.fillMaxSize(), - color = Color(colorResource(themeColor).toArgb()), + CompositionLocalProvider( + LocalThemeColor provides themeColor ) { HomeScreen( - this, - viewModel, - manageStockViewModel, - Color(colorResource(themeColor).toArgb()), - supportFragmentManager, - barcodeLauncher, - { _, _ -> manageStockViewModel.onButtonClick() }, - ) { scope, scaffold -> - synchronizeData( - scope, - scaffold, - settingsUiState.programUid, - ) - } + viewModel = viewModel, + manageStockViewModel = manageStockViewModel, + supportFragmentManager = supportFragmentManager, + proceedAction = { _, _ -> manageStockViewModel.onButtonClick() }, + onFinish = { + finish() + }, + syncAction = { scope, scaffold -> + synchronizeData( + scope, + scaffold, + settingsUiState.programUid, + ) + } + ) } } } - - configureScanner() } - private fun updateTheme(type: TransactionType) { + private fun updateTheme(type: TransactionType): Color { val color: Int val theme: Int @@ -112,7 +104,7 @@ class HomeActivity : AppCompatActivity() { theme = R.style.correction } } - if (color != -1) { + return if (color != -1) { this.theme.applyStyle(theme, true) val window = window @@ -122,7 +114,9 @@ class HomeActivity : AppCompatActivity() { val colorToReturn = a.getColor(0, 0) a.recycle() window.statusBarColor = colorToReturn - themeColor = color + Color(ContextCompat.getColor(this, color)) + } else { + Color(ContextCompat.getColor(this, R.color.colorPrimary)) } } @@ -169,25 +163,6 @@ class HomeActivity : AppCompatActivity() { scaffoldState.snackbarHostState.showSnackbar(message) } } - - private fun configureScanner() { - val barcodeLauncher: ActivityResultLauncher<ScanOptions> = - registerForActivityResult( - ScanContract(), - ) { scanIntentResult -> - if (scanIntentResult.contents == null) { - Toast.makeText(this, "Scan cancelled!", Toast.LENGTH_SHORT).show() - } else { - onScanCompleted( - scanIntentResult, - ) - } - } - this.barcodeLauncher = barcodeLauncher - } - - private fun onScanCompleted(result: ScanIntentResult) { - val data = result.contents - manageStockViewModel.onSearchQueryChanged(data) - } } + +val LocalThemeColor = compositionLocalOf { "#FF007DEB".toColor() } diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/model/ButtonUiState.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/model/ButtonUiState.kt index ea8f8ab34d0..63f672067b9 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/model/ButtonUiState.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/model/ButtonUiState.kt @@ -1,13 +1,9 @@ package org.dhis2.android.rtsm.ui.home.model -import androidx.compose.ui.graphics.Color import org.dhis2.android.rtsm.R data class ButtonUiState( val text: Int = R.string.review, val icon: Int = R.drawable.proceed_icon, - val color: Color = Color.White, - val contentColor: Color = Color.White, - val containerColor: Color = Color.Blue, val visible: Boolean = false, ) diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/AnalyticsScreen.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/AnalyticsScreen.kt index 6b07f1ec2f0..2aeba8ad77d 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/AnalyticsScreen.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/AnalyticsScreen.kt @@ -20,6 +20,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel import dhis2.org.analytics.charts.ui.GroupAnalyticsFragment import kotlinx.coroutines.CoroutineScope import org.dhis2.android.rtsm.ui.home.HomeViewModel +import org.dhis2.android.rtsm.ui.home.LocalThemeColor import org.dhis2.android.rtsm.ui.home.screens.components.AnalyticsTopBar @OptIn(ExperimentalMaterialApi::class) @@ -28,7 +29,6 @@ fun AnalyticsScreen( modifier: Modifier = Modifier, viewModel: HomeViewModel = viewModel(), backAction: () -> Unit, - themeColor: Color, scaffoldState: ScaffoldState, syncAction: (scope: CoroutineScope, scaffoldState: ScaffoldState) -> Unit = { _, _ -> }, supportFragmentManager: FragmentManager, @@ -40,7 +40,7 @@ fun AnalyticsScreen( appBar = { AnalyticsTopBar( title = settingsUiState.programName, - themeColor = themeColor, + themeColor = LocalThemeColor.current, backAction = { backAction.invoke() }, @@ -48,7 +48,7 @@ fun AnalyticsScreen( syncAction = syncAction, ) }, - backLayerBackgroundColor = themeColor, + backLayerBackgroundColor = LocalThemeColor.current, backLayerContent = { }, frontLayerElevation = 0.dp, diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/HomeScreen.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/HomeScreen.kt index e976a0bbf0e..416570f4db5 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/HomeScreen.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/HomeScreen.kt @@ -1,12 +1,13 @@ package org.dhis2.android.rtsm.ui.home.screens -import android.app.Activity -import androidx.activity.result.ActivityResultLauncher import androidx.compose.animation.AnimatedContent import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing import androidx.compose.material.Icon import androidx.compose.material.Scaffold import androidx.compose.material.ScaffoldState @@ -25,7 +26,6 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.fragment.app.FragmentManager import androidx.lifecycle.viewmodel.compose.viewModel -import com.journeyapps.barcodescanner.ScanOptions import kotlinx.coroutines.CoroutineScope import org.dhis2.android.rtsm.R import org.dhis2.android.rtsm.ui.home.HomeViewModel @@ -35,18 +35,15 @@ import org.dhis2.android.rtsm.ui.managestock.ManageStockViewModel import org.hisp.dhis.mobile.ui.designsystem.component.ExtendedFAB import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBar import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarItem -import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme @Composable fun HomeScreen( - activity: Activity, viewModel: HomeViewModel = viewModel(), manageStockViewModel: ManageStockViewModel = viewModel(), - themeColor: Color, supportFragmentManager: FragmentManager, - barcodeLauncher: ActivityResultLauncher<ScanOptions>, proceedAction: (scope: CoroutineScope, scaffoldState: ScaffoldState) -> Unit = { _, _ -> }, syncAction: (scope: CoroutineScope, scaffoldState: ScaffoldState) -> Unit = { _, _ -> }, + onFinish: () -> Unit, ) { val scaffoldState = rememberScaffoldState() @@ -58,15 +55,17 @@ fun HomeScreen( NavigationBarItem( id = BottomNavigation.DATA_ENTRY.id, icon = Icons.AutoMirrored.Outlined.List, - label = activity.getString(R.string.navigation_data_entry), + label = stringResource(R.string.navigation_data_entry), ), NavigationBarItem( id = BottomNavigation.ANALYTICS.id, icon = Icons.Outlined.BarChart, - label = activity.getString(R.string.section_charts), + label = stringResource(R.string.section_charts), ), ) Scaffold( + modifier = Modifier.fillMaxSize(), + contentWindowInsets = WindowInsets.safeDrawing, scaffoldState = scaffoldState, floatingActionButton = { AnimatedVisibility( @@ -80,7 +79,7 @@ fun HomeScreen( Icon( painter = painterResource(id = dataEntryUiState.button.icon), contentDescription = stringResource(dataEntryUiState.button.text), - tint = dataEntryUiState.button.contentColor, + tint = Color.White, ) }, onClick = { @@ -112,31 +111,25 @@ fun HomeScreen( ) { targetIndex -> when (targetIndex) { BottomNavigation.ANALYTICS.id -> { - DHIS2Theme { - AnalyticsScreen( - viewModel = viewModel, - backAction = { manageStockViewModel.onHandleBackNavigation() }, - themeColor = themeColor, - modifier = Modifier.padding(paddingValues), - scaffoldState = scaffoldState, - supportFragmentManager = supportFragmentManager, - ) - } + AnalyticsScreen( + viewModel = viewModel, + backAction = { manageStockViewModel.onHandleBackNavigation() }, + modifier = Modifier.padding(paddingValues), + scaffoldState = scaffoldState, + supportFragmentManager = supportFragmentManager, + ) } BottomNavigation.DATA_ENTRY.id -> { Backdrop( - activity = activity, viewModel = viewModel, manageStockViewModel = manageStockViewModel, modifier = Modifier.padding(paddingValues), - themeColor = themeColor, supportFragmentManager = supportFragmentManager, - barcodeLauncher = barcodeLauncher, scaffoldState = scaffoldState, - ) { coroutineScope, scaffold -> - syncAction(coroutineScope, scaffold) - } + onFinish = onFinish, + syncAction = syncAction, + ) } } } diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/BackdropComponent.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/BackdropComponent.kt index 2753ed3c2bf..15f6cfaa8eb 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/BackdropComponent.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/BackdropComponent.kt @@ -1,9 +1,7 @@ package org.dhis2.android.rtsm.ui.home.screens.components import android.annotation.SuppressLint -import android.app.Activity import androidx.activity.compose.BackHandler -import androidx.activity.result.ActivityResultLauncher import androidx.compose.material.BackdropScaffold import androidx.compose.material.BackdropValue import androidx.compose.material.ExperimentalMaterialApi @@ -22,15 +20,17 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.fragment.app.FragmentManager -import com.journeyapps.barcodescanner.ScanOptions import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import org.dhis2.android.rtsm.R import org.dhis2.android.rtsm.data.TransactionType import org.dhis2.android.rtsm.ui.home.HomeViewModel +import org.dhis2.android.rtsm.ui.home.LocalThemeColor import org.dhis2.android.rtsm.ui.home.model.DataEntryStep import org.dhis2.android.rtsm.ui.home.model.EditionDialogResult import org.dhis2.android.rtsm.ui.home.model.SettingsUiState @@ -43,16 +43,16 @@ import org.dhis2.commons.dialogs.bottomsheet.DialogButtonStyle @OptIn(ExperimentalMaterialApi::class) @Composable fun Backdrop( - activity: Activity, viewModel: HomeViewModel, manageStockViewModel: ManageStockViewModel, modifier: Modifier = Modifier, - themeColor: Color, supportFragmentManager: FragmentManager, - barcodeLauncher: ActivityResultLauncher<ScanOptions>, scaffoldState: ScaffoldState, syncAction: (scope: CoroutineScope, scaffoldState: ScaffoldState) -> Unit = { _, _ -> }, + onFinish: () -> Unit ) { + val context = LocalContext.current + val backdropState = rememberBackdropScaffoldState(BackdropValue.Revealed) var isFrontLayerDisabled by remember { mutableStateOf<Boolean?>(null) } val settingsUiState by viewModel.settingsUiState.collectAsState() @@ -61,15 +61,15 @@ fun Backdrop( val bottomSheetState = manageStockViewModel.bottomSheetState.collectAsState() if (bottomSheetState.value) { launchBottomSheet( - activity.getString(R.string.not_saved), - activity.getString(R.string.transaction_not_confirmed), + stringResource(R.string.not_saved), + stringResource(R.string.transaction_not_confirmed), supportFragmentManager, onKeepEdition = { manageStockViewModel.onBottomSheetClosed() }, onDiscard = { manageStockViewModel.onBottomSheetClosed() - activity.finish() + onFinish() }, ) } @@ -87,7 +87,7 @@ fun Backdrop( settingsUiState.selectedTransactionItem.label, settingsUiState.fromFacilitiesLabel().asString(), settingsUiState.deliverToLabel()?.asString(), - themeColor, + LocalThemeColor.current, launchBottomSheet = { manageStockViewModel.onHandleBackNavigation() }, @@ -98,17 +98,16 @@ fun Backdrop( settingsUiState.hasDestinationSelected(), ) }, - backLayerBackgroundColor = themeColor, + backLayerBackgroundColor = LocalThemeColor.current, backLayerContent = { FilterList( viewModel, dataEntryUiState, - themeColor, supportFragmentManager, launchDialog = { msg, result -> launchBottomSheet( - activity.getString(R.string.not_saved), - activity.getString(msg), + context.getString(R.string.not_saved), + context.getString(msg), supportFragmentManager, onKeepEdition = { result.invoke(EditionDialogResult.KEEP) @@ -135,10 +134,8 @@ fun Backdrop( MainContent( backdropState, isFrontLayerDisabled, - themeColor, viewModel, manageStockViewModel, - barcodeLauncher, ) }, scaffoldState = backdropState, diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/DropdownComponents.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/DropdownComponents.kt index 5c690877b36..24d5a3cbf72 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/DropdownComponents.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/DropdownComponents.kt @@ -45,6 +45,7 @@ import androidx.compose.ui.zIndex import androidx.fragment.app.FragmentManager import org.dhis2.android.rtsm.R import org.dhis2.android.rtsm.data.models.TransactionItem +import org.dhis2.android.rtsm.ui.home.LocalThemeColor import org.dhis2.android.rtsm.ui.home.model.DataEntryStep import org.dhis2.android.rtsm.ui.home.model.DataEntryUiState import org.dhis2.android.rtsm.ui.home.model.EditionDialogResult @@ -61,7 +62,6 @@ fun DropdownComponentTransactions( settingsUiState: SettingsUiState, onTransitionSelected: (transition: TransactionItem) -> Unit, hasUnsavedData: Boolean, - themeColor: Color = colorResource(R.color.colorPrimary), launchDialog: (msg: Int, (result: EditionDialogResult) -> Unit) -> Unit, ) { var isExpanded by remember { mutableStateOf(false) } @@ -99,12 +99,14 @@ fun DropdownComponentTransactions( .fillMaxWidth() .onGloballyPositioned { coordinates -> textFieldSize = coordinates.size.toSize() - }.shadow( + } + .shadow( elevation = 8.dp, ambientColor = Color.Black.copy(alpha = 0.1f), shape = RoundedCornerShape(30.dp), clip = false, - ).offset(0.dp, 0.dp) + ) + .offset(0.dp, 0.dp) .background(color = Color.White, shape = RoundedCornerShape(30.dp)), readOnly = true, singleLine = true, @@ -115,7 +117,7 @@ fun DropdownComponentTransactions( Modifier .align(Alignment.CenterHorizontally) .padding(16.dp), - tint = themeColor, + tint = LocalThemeColor.current, ) }, trailingIcon = { @@ -124,7 +126,7 @@ fun DropdownComponentTransactions( isExpanded = !isExpanded }, icon = { - Icon(icon, contentDescription = null, tint = themeColor) + Icon(icon, contentDescription = null, tint = LocalThemeColor.current) }, ) }, @@ -188,7 +190,8 @@ fun DropdownComponentTransactions( Color.White }, shape = RoundedCornerShape(16.dp), - ).padding(paddingValue), + ) + .padding(paddingValue), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Start, ) { @@ -196,7 +199,7 @@ fun DropdownComponentTransactions( painter = painterResource(item.icon), contentDescription = null, Modifier.padding(6.dp), - tint = themeColor, + tint = LocalThemeColor.current, ) Text(text = capitalizeText(item.label)) } @@ -212,7 +215,6 @@ fun DropdownComponentFacilities( settingsUiState: SettingsUiState, onFacilitySelected: (facility: OrganisationUnit) -> Unit, hasUnsavedData: Boolean, - themeColor: Color = colorResource(R.color.colorPrimary), supportFragmentManager: FragmentManager, data: List<OrganisationUnit>, launchDialog: (msg: Int, (result: EditionDialogResult) -> Unit) -> Unit, @@ -245,12 +247,14 @@ fun DropdownComponentFacilities( .fillMaxWidth() .onGloballyPositioned { coordinates -> textFieldSize = coordinates.size.toSize() - }.shadow( + } + .shadow( elevation = 8.dp, ambientColor = Color.Black.copy(alpha = 0.1f), shape = RoundedCornerShape(30.dp), clip = false, - ).offset(0.dp, 0.dp) + ) + .offset(0.dp, 0.dp) .background(color = Color.White, shape = RoundedCornerShape(30.dp)), readOnly = true, singleLine = true, @@ -261,7 +265,7 @@ fun DropdownComponentFacilities( Modifier .align(Alignment.CenterHorizontally) .padding(16.dp), - tint = themeColor, + tint = LocalThemeColor.current, ) }, trailingIcon = { @@ -279,7 +283,7 @@ fun DropdownComponentFacilities( Icon( painterResource(id = R.drawable.ic_arrow_drop_down), contentDescription = null, - tint = themeColor, + tint = LocalThemeColor.current, ) }, ) @@ -303,7 +307,6 @@ fun DropdownComponentFacilities( fun DropdownComponentDistributedTo( onDestinationSelected: (destination: Option) -> Unit, dataEntryUiState: DataEntryUiState, - themeColor: Color = colorResource(R.color.colorPrimary), data: List<Option>, isDestinationSelected: (value: String) -> Unit = { }, deliverToLabel: String? = null, @@ -355,13 +358,15 @@ fun DropdownComponentDistributedTo( .fillMaxWidth() .onGloballyPositioned { coordinates -> textFieldSize = coordinates.size.toSize() - }.zIndex(1f) + } + .zIndex(1f) .shadow( elevation = 8.dp, ambientColor = Color.Black.copy(alpha = 0.1f), shape = RoundedCornerShape(30.dp), clip = false, - ).offset(0.dp, 1.dp) + ) + .offset(0.dp, 1.dp) .background(color = Color.White, shape = RoundedCornerShape(30.dp)), readOnly = true, singleLine = true, @@ -372,7 +377,7 @@ fun DropdownComponentDistributedTo( Modifier .align(Alignment.CenterHorizontally) .padding(16.dp), - tint = themeColor, + tint = LocalThemeColor.current, ) }, trailingIcon = { @@ -381,7 +386,7 @@ fun DropdownComponentDistributedTo( isExpanded = !isExpanded }, icon = { - Icon(icon, contentDescription = null, tint = themeColor) + Icon(icon, contentDescription = null, tint = LocalThemeColor.current) }, ) }, @@ -448,7 +453,8 @@ fun DropdownComponentDistributedTo( Color.White }, shape = RoundedCornerShape(16.dp), - ).padding( + ) + .padding( start = 8.dp, top = paddingValue, end = 8.dp, diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/FilterComponents.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/FilterComponents.kt index ca8cfad6d5f..8d2c90fce45 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/FilterComponents.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/FilterComponents.kt @@ -10,7 +10,6 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import androidx.fragment.app.FragmentManager import org.dhis2.android.rtsm.data.OperationState @@ -26,7 +25,6 @@ import org.hisp.dhis.android.core.organisationunit.OrganisationUnit fun FilterList( viewModel: HomeViewModel, dataEntryUiState: DataEntryUiState, - themeColor: Color, supportFragmentManager: FragmentManager, launchDialog: (msg: Int, (result: EditionDialogResult) -> Unit) -> Unit, onTransitionSelected: (transition: TransactionItem) -> Unit, @@ -55,7 +53,6 @@ fun FilterList( settingsUiState, onTransitionSelected, dataEntryUiState.hasUnsavedData, - themeColor, launchDialog, ) } @@ -65,7 +62,6 @@ fun FilterList( settingsUiState, onFacilitySelected, dataEntryUiState.hasUnsavedData, - themeColor, supportFragmentManager, getFacilities(facilities), launchDialog, @@ -78,7 +74,6 @@ fun FilterList( DropdownComponentDistributedTo( onDestinationSelected, dataEntryUiState, - themeColor, result, launchDialog = launchDialog, deliverToLabel = settingsUiState.deliverToLabel.ifEmpty { settingsUiState.deliverToLabel()?.asString() }, diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/MainContent.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/MainContent.kt index 127195531c1..5873d128d7e 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/MainContent.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/home/screens/components/MainContent.kt @@ -1,5 +1,7 @@ package org.dhis2.android.rtsm.ui.home.screens.components +import android.widget.Toast +import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.ActivityResultLauncher import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.background @@ -8,8 +10,8 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.absolutePadding +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size @@ -38,9 +40,7 @@ import androidx.compose.ui.draw.shadow import androidx.compose.ui.focus.onFocusChanged import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.FirstBaseline -import androidx.compose.ui.layout.onGloballyPositioned -import androidx.compose.ui.layout.onSizeChanged -import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -49,11 +49,13 @@ import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import com.journeyapps.barcodescanner.ScanContract import com.journeyapps.barcodescanner.ScanOptions import kotlinx.coroutines.launch import org.dhis2.android.rtsm.R import org.dhis2.android.rtsm.data.TransactionType import org.dhis2.android.rtsm.ui.home.HomeViewModel +import org.dhis2.android.rtsm.ui.home.LocalThemeColor import org.dhis2.android.rtsm.ui.home.model.DataEntryStep import org.dhis2.android.rtsm.ui.home.model.SettingsUiState import org.dhis2.android.rtsm.ui.managestock.ManageStockViewModel @@ -71,11 +73,10 @@ import org.hisp.dhis.mobile.ui.designsystem.theme.Spacing fun MainContent( backdropState: BackdropScaffoldState, isFrontLayerDisabled: Boolean?, - themeColor: Color, viewModel: HomeViewModel, manageStockViewModel: ManageStockViewModel, - barcodeLauncher: ActivityResultLauncher<ScanOptions>, ) { + val context = LocalContext.current val scope = rememberCoroutineScope() val resource = painterResource(R.drawable.ic_arrow_up) val qrcodeResource = painterResource(R.drawable.ic_qr_code_scanner) @@ -89,22 +90,23 @@ fun MainContent( val focusManager = LocalFocusManager.current val search by manageStockViewModel.scanText.collectAsState() val settingsUiState by viewModel.settingsUiState.collectAsState() - var columnHeightDp by remember { mutableStateOf(0.dp) } - val localDensity = LocalDensity.current val tablePadding = getTablePadding(backdropState.isRevealed) var tableResizeActions by remember { mutableStateOf<TableResizeActions?>(null) } + val barcodeLauncher = rememberLauncherForActivityResult( + contract = ScanContract(), + ) { scanIntentResult -> + scanIntentResult.contents?.let { data -> + manageStockViewModel.onSearchQueryChanged(data) + } ?: Toast.makeText(context, "Scan cancelled!", Toast.LENGTH_SHORT).show() + } + Column( modifier = Modifier - .fillMaxWidth() - .onGloballyPositioned { coordinates -> - columnHeightDp = with(localDensity) { coordinates.size.height.toDp() } - }.onSizeChanged { coordinates -> - columnHeightDp = with(localDensity) { coordinates.height.toDp() } - }, + .fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally, ) { Row( @@ -114,7 +116,8 @@ fun MainContent( left = 16.dp, top = 16.dp, right = 16.dp, - ).fillMaxWidth() + ) + .fillMaxWidth() .size(60.dp), horizontalArrangement = Arrangement.Center, verticalAlignment = Alignment.Top, @@ -130,7 +133,8 @@ fun MainContent( elevation = 3.dp, shape = RoundedCornerShape(30.dp), clip = false, - ).offset(0.dp, 0.dp) + ) + .offset(0.dp, 0.dp) .background(color = Color.White, shape = RoundedCornerShape(30.dp)) .weight(1 - (weightValue + weightValueArrow)) .alignBy(FirstBaseline) @@ -147,7 +151,7 @@ fun MainContent( TextFieldDefaults.outlinedTextFieldColors( focusedBorderColor = Color.White, unfocusedBorderColor = Color.White, - cursorColor = themeColor, + cursorColor = LocalThemeColor.current, ), textStyle = LocalTextStyle.current.copy(fontSize = 14.sp), enabled = isFrontLayerDisabled != true, @@ -155,7 +159,7 @@ fun MainContent( Icon( painter = searchResource, contentDescription = "", - tint = themeColor, + tint = LocalThemeColor.current, ) }, trailingIcon = { @@ -208,7 +212,7 @@ fun MainContent( Icon( painter = qrcodeResource, contentDescription = "", - tint = themeColor, + tint = LocalThemeColor.current, ) }, ) @@ -227,7 +231,7 @@ fun MainContent( Icon( painter = resetResize, contentDescription = "", - tint = themeColor, + tint = LocalThemeColor.current, ) }, ) @@ -249,7 +253,7 @@ fun MainContent( Icon( resource, contentDescription = null, - tint = themeColor, + tint = LocalThemeColor.current, ) }, ) @@ -265,18 +269,18 @@ fun MainContent( modifier = Modifier .padding(bottom = tablePadding) - .height(columnHeightDp), + .fillMaxHeight(), ) { if (( - manageStockViewModel.dataEntryUiState - .collectAsState() - .value.step - != DataEntryStep.COMPLETED || manageStockViewModel.dataEntryUiState .collectAsState() .value.step - != DataEntryStep.START - ) && + != DataEntryStep.COMPLETED || + manageStockViewModel.dataEntryUiState + .collectAsState() + .value.step + != DataEntryStep.START + ) && shouldDisplayTable(settingsUiState) ) { manageStockViewModel.setup(viewModel.getData()) @@ -322,6 +326,7 @@ private fun shouldDisplayTable(settingsUiState: SettingsUiState): Boolean = when (settingsUiState.selectedTransactionItem.type) { TransactionType.DISTRIBUTION -> settingsUiState.hasFacilitySelected() && settingsUiState.hasDestinationSelected() + else -> settingsUiState.hasFacilitySelected() } diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/managestock/ManageStockViewModel.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/managestock/ManageStockViewModel.kt index 99707a11e64..50d3148746b 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/managestock/ManageStockViewModel.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/managestock/ManageStockViewModel.kt @@ -1,6 +1,5 @@ package org.dhis2.android.rtsm.ui.managestock -import androidx.compose.ui.graphics.Color import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.SavedStateHandle @@ -106,10 +105,6 @@ class ManageStockViewModel( private val _dataEntryUiState = MutableStateFlow(DataEntryUiState()) val dataEntryUiState: StateFlow<DataEntryUiState> = _dataEntryUiState - - private val _themeColor = MutableStateFlow(Color.White) - val themeColor: StateFlow<Color> = _themeColor - private val _scanText = MutableStateFlow("") val scanText = _scanText.asStateFlow() @@ -193,10 +188,6 @@ class ManageStockViewModel( } } - fun setThemeColor(themeColor: Color) { - _themeColor.value = themeColor - } - private fun loadStockItems() { search.value = transaction.value?.facility?.uid?.let { @@ -547,8 +538,6 @@ class ManageStockViewModel( ButtonUiState( text = R.string.review, icon = R.drawable.proceed_icon, - contentColor = Color.White, - containerColor = _themeColor.value, visible = buttonVisibility, ) } @@ -558,8 +547,6 @@ class ManageStockViewModel( ButtonUiState( text = R.string.confirm_transaction_label, icon = R.drawable.confirm_review, - contentColor = Color.White, - containerColor = _themeColor.value, visible = buttonVisibility, ) } diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/managestock/components/ManageStockTable.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/managestock/components/ManageStockTable.kt index b4195abacd0..a4708426766 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/managestock/components/ManageStockTable.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/ui/managestock/components/ManageStockTable.kt @@ -22,6 +22,7 @@ import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import org.dhis2.android.rtsm.R +import org.dhis2.android.rtsm.ui.home.LocalThemeColor import org.dhis2.android.rtsm.ui.home.model.DataEntryStep import org.dhis2.android.rtsm.ui.managestock.ManageStockViewModel import org.dhis2.composetable.TableScreenState @@ -32,7 +33,6 @@ import org.dhis2.composetable.ui.TableConfiguration import org.dhis2.composetable.ui.TableDimensions import org.dhis2.composetable.ui.TableTheme import org.dhis2.composetable.ui.semantics.MAX_CELL_WIDTH_SPACE -import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2Theme import kotlin.math.roundToInt @Composable @@ -48,169 +48,167 @@ fun ManageStockTable( ), ) - DHIS2Theme { - if (viewModel.hasData.collectAsState().value) { - val localDensity = LocalDensity.current - val conf = LocalConfiguration.current - val tableConfState by viewModel.tableConfigurationState.collectAsState() - val themeColor = viewModel.themeColor.collectAsState() + if (viewModel.hasData.collectAsState().value) { + val localDensity = LocalDensity.current + val conf = LocalConfiguration.current + val tableConfState by viewModel.tableConfigurationState.collectAsState() - var dimensions by remember { - mutableStateOf( - TableDimensions( - cellVerticalPadding = 11.dp, - maxRowHeaderWidth = - with(localDensity) { - (conf.screenWidthDp.dp.toPx() - MAX_CELL_WIDTH_SPACE.toPx()) - .roundToInt() - }, - extraWidths = - with(localDensity) { - tableConfState.overwrittenTableWidth?.mapValues { (_, width) -> + var dimensions by remember { + mutableStateOf( + TableDimensions( + cellVerticalPadding = 11.dp, + maxRowHeaderWidth = + with(localDensity) { + (conf.screenWidthDp.dp.toPx() - MAX_CELL_WIDTH_SPACE.toPx()) + .roundToInt() + }, + extraWidths = + with(localDensity) { + tableConfState.overwrittenTableWidth?.mapValues { (_, width) -> + width.dp.roundToPx() + } + } ?: emptyMap(), + rowHeaderWidths = + with(localDensity) { + tableConfState.overwrittenRowHeaderWidth + ?.mapValues { (_, width) -> width.dp.roundToPx() } - } ?: emptyMap(), - rowHeaderWidths = - with(localDensity) { - tableConfState.overwrittenRowHeaderWidth - ?.mapValues { (_, width) -> - width.dp.roundToPx() - } - } ?: emptyMap(), - columnWidth = - with(localDensity) { - tableConfState.overwrittenColumnWidth?.mapValues { (_, value) -> - value.mapValues { (_, width) -> - width.dp.roundToPx() - } + } ?: emptyMap(), + columnWidth = + with(localDensity) { + tableConfState.overwrittenColumnWidth?.mapValues { (_, value) -> + value.mapValues { (_, width) -> + width.dp.roundToPx() } - } ?: emptyMap(), - defaultRowHeaderWidth = with(localDensity) { 200.dp.toPx() }.toInt(), - tableBottomPadding = 100.dp, - ), - ) - } - - val tableResizeActions = - object : TableResizeActions { - override fun onTableWidthChanged(width: Int) { - dimensions = dimensions.copy(totalWidth = width) - } - - override fun onRowHeaderResize( - tableId: String, - newValue: Float, - ) { - dimensions = dimensions.updateHeaderWidth(tableId, newValue) - val widthDpValue = - with(localDensity) { - dimensions.getRowHeaderWidth(tableId).toDp().value } - viewModel.tableDimensionStore.saveWidthForSection(tableId, widthDpValue) - onResized(this) - } + } ?: emptyMap(), + defaultRowHeaderWidth = with(localDensity) { 200.dp.toPx() }.toInt(), + tableBottomPadding = 100.dp, + ), + ) + } - override fun onColumnHeaderResize( - tableId: String, - column: Int, - newValue: Float, - ) { - dimensions = - dimensions.updateColumnWidth(tableId, column, newValue) - val widthDpValue = - with(localDensity) { - dimensions.getColumnWidth(tableId, column).toDp().value - } - viewModel.tableDimensionStore.saveColumnWidthForSection( - tableId, - column, - widthDpValue, - ) - onResized(this) - } + val tableResizeActions = + object : TableResizeActions { + override fun onTableWidthChanged(width: Int) { + dimensions = dimensions.copy(totalWidth = width) + } - override fun onTableDimensionResize( - tableId: String, - newValue: Float, - ) { - dimensions = dimensions.updateAllWidthBy(tableId, newValue) - val widthDpValue = - with(localDensity) { - dimensions.getExtraWidths(tableId).toDp().value - } - viewModel.tableDimensionStore.saveTableWidth(tableId, widthDpValue) - onResized(this) - } + override fun onRowHeaderResize( + tableId: String, + newValue: Float, + ) { + dimensions = dimensions.updateHeaderWidth(tableId, newValue) + val widthDpValue = + with(localDensity) { + dimensions.getRowHeaderWidth(tableId).toDp().value + } + viewModel.tableDimensionStore.saveWidthForSection(tableId, widthDpValue) + onResized(this) + } - override fun onTableDimensionReset(tableId: String) { - dimensions = dimensions.resetWidth(tableId) - viewModel.tableDimensionStore.resetTable(tableId) - onResized(null) - } + override fun onColumnHeaderResize( + tableId: String, + column: Int, + newValue: Float, + ) { + dimensions = + dimensions.updateColumnWidth(tableId, column, newValue) + val widthDpValue = + with(localDensity) { + dimensions.getColumnWidth(tableId, column).toDp().value + } + viewModel.tableDimensionStore.saveColumnWidthForSection( + tableId, + column, + widthDpValue, + ) + onResized(this) + } + + override fun onTableDimensionResize( + tableId: String, + newValue: Float, + ) { + dimensions = dimensions.updateAllWidthBy(tableId, newValue) + val widthDpValue = + with(localDensity) { + dimensions.getExtraWidths(tableId).toDp().value + } + viewModel.tableDimensionStore.saveTableWidth(tableId, widthDpValue) + onResized(this) } - LaunchedEffect(key1 = tableConfState) { - if (tableConfState.isResized()) { - onResized(tableResizeActions) - } else { + override fun onTableDimensionReset(tableId: String) { + dimensions = dimensions.resetWidth(tableId) + viewModel.tableDimensionStore.resetTable(tableId) onResized(null) } } - TableTheme( - tableColors = - TableColors( - primary = themeColor.value, - primaryLight = themeColor.value.copy(alpha = 0.2f), - ), - tableDimensions = dimensions, - tableConfiguration = - TableConfiguration( - headerActionsEnabled = false, - textInputViewMode = false, - ), - tableValidator = viewModel, - tableResizeActions = tableResizeActions, - ) { - DataSetTableScreen( - tableScreenState = screenState, - onCellClick = { _, cell, _ -> - concealBackdropState.invoke() - viewModel.onCellClick( - cell = cell, - ) - }, - onEdition = { isEditing -> - viewModel.onEditingCell(isEditing, concealBackdropState) - }, - onSaveValue = viewModel::onSaveValueChange, - bottomContent = { - if (viewModel.dataEntryUiState - .collectAsState() - .value.step - == DataEntryStep.REVIEWING + LaunchedEffect(key1 = tableConfState) { + if (tableConfState.isResized()) { + onResized(tableResizeActions) + } else { + onResized(null) + } + } + + TableTheme( + tableColors = + TableColors( + primary = LocalThemeColor.current, + primaryLight = LocalThemeColor.current.copy(alpha = 0.2f), + ), + tableDimensions = dimensions, + tableConfiguration = + TableConfiguration( + headerActionsEnabled = false, + textInputViewMode = false, + ), + tableValidator = viewModel, + tableResizeActions = tableResizeActions, + ) { + DataSetTableScreen( + tableScreenState = screenState, + onCellClick = { _, cell, _ -> + concealBackdropState.invoke() + viewModel.onCellClick( + cell = cell, + ) + }, + onEdition = { isEditing -> + viewModel.onEditingCell(isEditing, concealBackdropState) + }, + onSaveValue = viewModel::onSaveValueChange, + bottomContent = { + if (viewModel.dataEntryUiState + .collectAsState() + .value.step + == DataEntryStep.REVIEWING + ) { + Box( + modifier = Modifier.fillMaxWidth(), + contentAlignment = Alignment.Center, ) { - Box( - modifier = Modifier.fillMaxWidth(), - contentAlignment = Alignment.Center, - ) { - Text( - text = stringResource(id = R.string.under_review), - color = colorResource(id = R.color.text_color), - fontSize = 14.sp, - fontStyle = FontStyle.Normal, - lineHeight = 20.sp, - ) - } + Text( + text = stringResource(id = R.string.under_review), + color = colorResource(id = R.color.text_color), + fontSize = 14.sp, + fontStyle = FontStyle.Normal, + lineHeight = 20.sp, + ) } - }, - ) - } - } else { - Text( - text = stringResource(id = R.string.no_data), - modifier = Modifier.padding(16.dp), + } + }, ) } + } else { + Text( + text = stringResource(id = R.string.no_data), + modifier = Modifier.padding(16.dp), + ) } + } diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/utils/LocaleManager.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/utils/LocaleManager.kt index a3765cacb0a..1a15c9646c2 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/utils/LocaleManager.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/utils/LocaleManager.kt @@ -28,11 +28,7 @@ class LocaleManager { ): Context { val config = updateConfiguration(context, language) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - return context.createConfigurationContext(config) - } else { - return context - } + return context.createConfigurationContext(config) } @JvmStatic @@ -44,7 +40,7 @@ class LocaleManager { val resources = context.resources val config = Configuration(resources.configuration) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { val localeList = LocaleList(newLocale) LocaleList.setDefault(localeList) config.setLocales(localeList) // additionally sets the layout direction diff --git a/stock-usecase/src/main/java/org/dhis2/android/rtsm/utils/RuleEngineHelper.kt b/stock-usecase/src/main/java/org/dhis2/android/rtsm/utils/RuleEngineHelper.kt index 1cacfde8e01..81de23ba072 100644 --- a/stock-usecase/src/main/java/org/dhis2/android/rtsm/utils/RuleEngineHelper.kt +++ b/stock-usecase/src/main/java/org/dhis2/android/rtsm/utils/RuleEngineHelper.kt @@ -2,6 +2,7 @@ package org.dhis2.android.rtsm.utils import org.dhis2.commons.rules.RuleEngineContextData import org.hisp.dhis.rules.api.RuleEngineContext +import org.hisp.dhis.rules.api.RuleSupplementaryData import org.hisp.dhis.rules.models.Rule import org.hisp.dhis.rules.models.RuleEvent import org.hisp.dhis.rules.models.RuleVariable @@ -13,7 +14,7 @@ class RuleEngineHelper { rules: List<Rule>, ruleVariables: List<RuleVariable>, constants: Map<String, String>, - supplementaryData: Map<String, List<String>>, + supplementaryData: RuleSupplementaryData, events: List<RuleEvent>, ): RuleEngineContextData { debugRuleEngine(rules, ruleVariables, events) diff --git a/stock-usecase/src/main/res/values-ar-rEG/strings.xml b/stock-usecase/src/main/res/values-ar-rEG/strings.xml new file mode 100644 index 00000000000..cba52c3f66d --- /dev/null +++ b/stock-usecase/src/main/res/values-ar-rEG/strings.xml @@ -0,0 +1,4 @@ +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="cancel">إلغاء</string> + + </resources> \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-ar-rIQ/strings.xml b/stock-usecase/src/main/res/values-ar-rIQ/strings.xml index 81132242e3c..93fef6284eb 100644 --- a/stock-usecase/src/main/res/values-ar-rIQ/strings.xml +++ b/stock-usecase/src/main/res/values-ar-rIQ/strings.xml @@ -1,11 +1,17 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="title_activity_home">الرئيسية</string> + + <!-- Sign in --> <string name="username">اسم المستخدم</string> + <string name="delete">حذف</string> <string name="cancel">إلغاء</string> + <string name="from">من</string> - <string name="content_desc_search">البحث</string> + <!-- Content descriptions for accessibility --> + <string name="confirm_transaction_label">تأكيد</string> + <string name="done_task">الرئيسية</string> <string name="count">العدد</string> </resources> \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-ar/strings.xml b/stock-usecase/src/main/res/values-ar/strings.xml index 3c33d1c6dbb..ac93bc2b53e 100644 --- a/stock-usecase/src/main/res/values-ar/strings.xml +++ b/stock-usecase/src/main/res/values-ar/strings.xml @@ -1,90 +1,35 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="title_activity_home">الرئيسية</string> - <string name="title_activity_review">المراجعة</string> - <string name="action_settings">الإعدادات</string> <string name="discard">تجاهل</string> - <string name="recent_activity">أحدث الأنشطة</string> - <string name="last_synced">آخر مزامنة</string> - <string name="select_one">اختر واحدة</string> - <!-- Sign in --> - <string name="server">الخادم:</string> - <string name="sign_in">تسجيل دخول</string> - <string name="sign_in_to_your_account">تسجيل الدخول إلى حسابك</string> <string name="username">اسم المستخدم</string> - <string name="password">كلمة المرور</string> - <string name="forgot_password">نسيت كلمة المرور؟</string> - - <string name="recent_activities_loading_message">تحميل الأنشطة الأخيرة...</string> - <string name="recent_activities_empty_message">لم تقم بأي نشاط بعد</string> <!-- Sync --> - <string name="metadata_sync_in_progress">مزامنة البيانات الوصفية...</string> <string name="metadata_sync_error">تعذر إكمال مزامنة بيانات التعريف</string> - <string name="data_sync_in_progress">مزامنة البيانات...</string> - <string name="data_sync_error">تعذر إكمال مزامنة البيانات</string> - <string name="metadata_sync_completed">اكتملت مزامنة البيانات الوصفية!</string> - <string name="sync_completed">اكتملت المزامنة!</string> <!-- FloatingActionButtons --> - <string name="proceed">متابعة</string> <string name="review">المراجعة</string> - <string name="scan_barcode">مسح الرمز الشريطي ضوئيًا</string> - <string name="scanning">المسح الضوئي...</string> <string name="search">عنصر البحث</string> <string name="search_placeholder">بحث...</string> <string name="delete">حذف</string> <string name="ok">موافق</string> <string name="cancel">إلغاء</string> - <string name="from">من</string> - <!-- Languages --> - <string name="language_english">اللغة الإنجليزية</string> - <string name="language_french">الفرنسية</string> - <string name="language_spanish">الإسبانية</string> - <string name="language_arabic">اللغة العربية</string> - <string name="language_russian">الروسية</string> - - <string name="language">اللغة</string> - <string name="logout">تسجيل الخروج</string> - - <!-- Stock table --> - <string name="item">العنصر</string> - <string name="prompt_email">بريد إلكتروني</string> - <string name="prompt_password">كلمة المرور</string> - <string name="action_sign_in">تسجيل الدخول أو التسجيل</string> - <string name="action_sign_in_short">تسجيل دخول</string> - <string name="welcome">أهلاً وسهلاً بك!</string> - <string name="invalid_username">ليس اسم مستخدم صالحاً</string> - <string name="invalid_password">يجب أن تكون كلمة المرور > 5 أحرف</string> - <string name="login_failed">فشل تسجيل الدخول</string> - <string name="resync">إعادة المزامنة</string> - - <!-- Errors --> - <string name="login_error">تعذر تسجيل الدخول</string> + <string name="from">من</string> <!-- Content descriptions for accessibility --> - <string name="content_desc_sync_info">معلومات المزامنة</string> - <string name="content_desc_search">بحث</string> - <string name="content_desc_last_sync">آخر مزامنة</string> + <string name="confirm_transaction_label">تأكيد</string> - <string name="language_change_dialog_title">تأكيد إعادة التشغيل</string> - <string name="scan_canceled">تم إلغاء الفحص</string> - <string name="logout_error_message"> - حدث خطأ أثناء تسجيل الخروج. يرجى المحاولة مرة أخرى لاحقاً. - </string> - <string name="logout_success_message">تم تسجيل الخروج بنجاح</string> - <string name="invalid_quantity">غير صالح</string> <string name="speech_network_error">خطأ في الشبكة</string> <string name="speech_network_timeout_error">انتهت مهلة تشغيل الشبكة</string> <string name="speech_server_error">حدث خطأ في خادم الكلام</string> <string name="unknown_speech_error">حدث خطأ غير معروف.</string> - <string name="no_network_available">لا يتوفر اتصال بالشبكة</string> <string name="unable_to_sync_data_no_network_available"> غير قادر على مزامنة البيانات لعدم توفر اتصال بالشبكة </string> + <!--SDK error codes--> <string name="login_error_unsuccessful_response">هناك خطأ ما. يرجى التحقق من صحة عنوان URL الخاص بالخادم واسم المستخدم وكلمة المرور وحاول مرة أخرى.</string> <string name="login_error_error_response">عفوًا! حدث خطأ ما على جانب الخادم.</string> @@ -121,8 +66,6 @@ <string name="error_ssl">هناك مشكلة في شهادات الخادم. من فضلك ، اتصل بالمسؤول الخاص بك.</string> <string name="done_task">الرئيسية</string> <string name="back">الخلف</string> - <string name="no_conflicts_message">لا توجد أي تعارضات لهذا البرنامج</string> - <string name="action_sync">إرسال</string> <string name="not_saved">لم يتم حفظه</string> <string name="count">العدد</string> <string name="formatting_error">خطأ في التنسيق</string> diff --git a/stock-usecase/src/main/res/values-ckb/strings.xml b/stock-usecase/src/main/res/values-ckb/strings.xml index 14d87de103c..e64f0d59ff3 100644 --- a/stock-usecase/src/main/res/values-ckb/strings.xml +++ b/stock-usecase/src/main/res/values-ckb/strings.xml @@ -1,16 +1,16 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="title_activity_home">ماڵةوة</string> - <string name="action_settings">ريكخستن</string> <string name="discard">فري دان</string> - <!-- FloatingActionButtons --> - <string name="proceed">ئةنجام دان</string> <string name="delete">سڕینەوە</string> <string name="ok">تةواو</string> <string name="cancel">لابردن</string> + <string name="from">لە</string> - <string name="content_desc_search">گەڕان</string> + <!-- Content descriptions for accessibility --> + <string name="confirm_transaction_label">دووپاتکردنەوە</string> + <string name="done_task">ماڵةوة</string> <string name="back">كةرانةوة</string> </resources> \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-cs/strings.xml b/stock-usecase/src/main/res/values-cs/strings.xml index 0d8b81a837a..ee25d57614a 100644 --- a/stock-usecase/src/main/res/values-cs/strings.xml +++ b/stock-usecase/src/main/res/values-cs/strings.xml @@ -1,110 +1,56 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name">Správa zásob lékáren</string> <string name="title_activity_home">Domovská strana</string> - <string name="title_activity_review">Posouzení</string> - <string name="action_settings">Nastavení</string> <string name="distribution">Rozdělení</string> <string name="discard">Vyřadit</string> <string name="correction">Oprava</string> - <string name="select_transaction">Vyberte transakci</string> - <string name="transaction_date">Datum transakce</string> - <string name="recent_activity">Poslední aktivita</string> - <string name="last_synced">Poslední synchronizace:</string> - <string name="select_facility">Vyberte Zařízení</string> - <string name="distributed_to">Distribuováno do</string> - <string name="select_one">Vyber jeden</string> <!-- Sign in --> - <string name="server">Server:</string> - <string name="sign_in">Přihlásit se</string> - <string name="sign_in_to_your_account">Přihlaste se ke svému účtu</string> - <string name="sign_in_to_with_oidc">Přihlaste se pomocí účtu ICRC</string> - <string name="non_icrc_staff_members">Pouze pro zaměstnance, kteří nejsou členy ICRC </string> - <string name="icrc_staff_members">Pouze pro zaměstnance ICRC</string> <string name="username">Uživatelské jméno</string> - <string name="password">Heslo</string> - <string name="forgot_password">Zapomenuté heslo?</string> - - <string name="recent_activities_loading_message">Načítání nedávných aktivit&#8230;</string> - <string name="recent_activities_empty_message">Ještě jste nevykonali žádnou činnost</string> <!-- Sync --> - <string name="metadata_sync_in_progress">Synchronizace metadat&#8230;</string> <string name="metadata_sync_error">Synchronizaci metadat nelze dokončit</string> - <string name="data_sync_in_progress">Synchronizace dat&#8230;</string> - <string name="data_sync_error">Synchronizaci dat nelze dokončit</string> - <string name="metadata_sync_completed">Synchronizace metadat dokončena!</string> - <string name="sync_completed">Synchronizace dokončena!</string> <!-- FloatingActionButtons --> - <string name="proceed">Pokračovat</string> <string name="review">Posouzení</string> - <string name="scan_barcode">Skenování čárového kódu</string> - <string name="scanning">Skenování&#8230;</string> <string name="search">Vyhledat položku</string> <string name="search_placeholder">Vyhledávání…</string> <string name="delete">Smazat</string> <string name="ok">OK</string> <string name="cancel">Zrušit</string> - <string name="confirmation">potvrzení</string> <string name="from">Od</string> <string name="to">Doručit…</string> <string name="subtitle">%s</string> - <string name="to_arg">Komu %s</string> <!-- Languages --> - <string name="language_english">Angličtina</string> - <string name="language_french">Francouzština</string> - <string name="language_spanish">Španělština</string> - <string name="language_arabic">Arabština</string> - <string name="language_russian">Ruština</string> <!-- Settings --> - <string name="use_microphone_for_data_entry">Pro zadávání dat použijte mikrofon</string> - <string name="language">Jazyk</string> - <string name="force_data_sync">Vynutit synchronizaci dat</string> - <string name="logout">Odhlásit</string> - <!-- Stock table --> - <string name="item">Položka</string> - <string name="stock_on_hand">Zásoby na skladě</string> <string name="quantity">Množství</string> - <string name="items_available">položky k dispozici</string> - <string name="positive_value"> - <b> Kladná hodnota </b> = \"chybějící množství\" ( <i> fyzické zásoby menší než vypočítaná hodnota </i> ) - </string> - <string name="negative_value"> - <b> <span style="color: #C81818"> Záporná hodnota </span> </b> = \"nalezeno na skladě\" ( <i> vypočítaná hodnota fyzické zásoby je více než 800</i>) - </string> <!-- Messages --> - <string name="mandatory_transaction_selection"> - Než budete moci pokračovat, musíte vybrat typ transakce a vyplnit všechna pole - </string> <string name="mandatory_facility_selection"> Než budete moci pokračovat, musí být vyplněno pole zařízení </string> <string name="mandatory_distributed_to_selection">\\n Před pokračováním je třeba vyplnit pole \"Distribuováno do\".</string> - <string name="mandatory_transaction_date_selection"> - Než budete moci pokračovat, musí být vyplněno pole „Distribuováno do“. - </string> - <string name="previous_page_lose_data_warning">\\n Opravdu se chcete vrátit na předchozí obrazovku?\\n Pokud se rozhodnete pokračovat, ztratíte právě zadané údaje.\\n </string> + <string name="mandatory_transaction_date_selection">\n Než budete moci pokračovat, musí být vyplněno pole „Distribuováno do“.\n </string> + <string name="previous_page_lose_data_warning">\\n Opravdu se chcete vrátit na předchozí obrazovku\?\\n Pokud se rozhodnete pokračovat, ztratíte právě zadané údaje.\\n </string> <string name="transaction_completed"> Transakce byla úspěšně dokončena! </string> <string name="transaction_cancelled"> Transakce byla úspěšně zrušena! </string> - <string name="force_sync_confirmation_message">\\n Opravdu chcete vynutit synchronizaci?\\n </string> - <string name="logout_confirmation_message">Opravdu se chcete odhlásit?</string> + <string name="force_sync_confirmation_message">\\n Opravdu chcete vynutit synchronizaci\?\\n </string> + <string name="logout_confirmation_message">Opravdu se chcete odhlásit\?</string> - <string name="remove_correction_item_confirmation_message">\\n Opravdu chcete trvale odstranit záznam pro opravu \"%1$s\"?\\n Tuto akci nelze vzít zpět.\\n </string> - <string name="remove_distribution_item_confirmation_message">\\n Opravdu chcete trvale odstranit položku pro distribuci \"%1$s\"?\\n Tuto akci nelze vzít zpět.\\n </string> - <string name="remove_discard_item_confirmation_message">\\n Opravdu chcete trvale odstranit položku pro vyřazení \"%1$s\"?\\n Tuto akci nelze vrátit zpět.\\n </string> + <string name="remove_correction_item_confirmation_message">\\n Opravdu chcete trvale odstranit záznam pro opravu \"%1$s\"\?\\\n Tuto akci nelze vzít zpět.\\n </string> + <string name="remove_distribution_item_confirmation_message">\\n Opravdu chcete trvale odstranit položku pro distribuci \"%1$s\"\?\\\n Tuto akci nelze vzít zpět.\\n </string> + <string name="remove_discard_item_confirmation_message">\\n Opravdu chcete trvale odstranit položku pro vyřazení \"%1$s\"\?\\\n Tuto akci nelze vrátit zpět.\\n </string> <plurals name="items_found"> <item quantity="one">%d položka</item> @@ -125,47 +71,17 @@ <string name="resync">Znovu synchronizovat</string> <!-- Errors --> - <string name="login_error">Nelze se přihlásit</string> - <string name="config_file_error">Nelze načíst konfigurační soubor</string> - <string name="config_file_program_error"> - ID skladového programu nebylo v konfiguračním souboru nastaveno - </string> - <string name="recent_activities_load_error">Nelze načíst vaše nedávné aktivity</string> <string name="facilities_load_error">Nelze načíst seznam dostupných zařízení</string> <string name="destinations_load_error"> Nelze načíst seznam dostupných cílů </string> - <string name="distribution_data_element_load_error"> - Nelze načíst distribuční datový prvek - </string> - <string name="correction_data_element_load_error"> - Nelze načíst opravný datový prvek - </string> - <string name="discard_data_element_load_error"> - Nelze načíst datový prvek discard - </string> <!-- Content descriptions for accessibility --> - <string name="content_desc_sync_info">Synchronizovat informace</string> - <string name="content_desc_search">Hledat</string> - <string name="content_desc_clear_text">Jasný text</string> - <string name="content_desc_transaction_date">Zobrazit nástroj pro výběr dat</string> - <string name="content_desc_distributed_to">Distribuováno do</string> - <string name="content_desc_last_sync">Naposledy synchronizováno</string> - <string name="content_desc_quantity_info">Více informací o množství</string> - <string name="content_desc_remove">Odebrat položku</string> - <string name="content_desc_recent_activity">Směrová šipka</string> - <string name="content_desc_recent_activity_status">Stav nedávné aktivity</string> - <string name="content_desc_close_info_guide">Informační průvodce</string> <string name="confirm_transaction_label">Potvrdit</string> - <string name="missing_configuration"> - V konfiguračním souboru chybí jedno nebo více požadovaných polí. - </string> - <string name="select_language">Vyberte požadovaný jazyk</string> <string name="restart_later">Restartovat později</string> - <string name="confirm_app_restart_message">\\n Aby se však změny projevily, je třeba aplikaci restartovat,\\n všechny neuložené změny budou ztraceny.\\n\\nChcete pokračovat v restartu?\\n </string> + <string name="confirm_app_restart_message">\\n Aby se však změny projevily, je třeba aplikaci restartovat,\\n všechny neuložené změny budou ztraceny.\\n\\nChcete pokračovat v restartu\?\\n </string> <string name="language_change_dialog_title">Potvrdit restart</string> <string name="scan_canceled">Skenování zrušeno!</string> <string name="logout_error_message"> @@ -177,9 +93,6 @@ <string name="stock_on_hand_exceeded_message"> Dostupné skladové zásoby nelze překročit </string> - <string name="reviewed_item_cannot_be_empty_message"> - Akcie pod kontrolou nemohou být prázdné. Pokud si to nepřejete, můžete položku odstranit - </string> <string name="permission_granted">Přístup udělen</string> <string name="permission_denied">Přístup odepřen</string> @@ -200,25 +113,11 @@ <string name="speech_timeout_error">Nebyl zjištěn žádný hlasový vstup</string> <string name="unknown_speech_error">Nastala neznámá chyba.</string> <string name="non_numeric_speech_input_error">Nenumerický vstup není povolen: \"%s\"</string> - <string name="negative_number_speech_input_error"> - Zadání záporného čísla není povoleno: \"%s\" - </string> + <string name="negative_number_speech_input_error">\n Zadání záporného čísla není povoleno: \"%s\"\n </string> - <string name="openid_config_load_error">Nelze načíst konfiguraci OpenID</string> - <string name="unexpected_openid_authentication_error"> - Při ověřování pomocí OpenID došlo k neočekávané chybě - </string> - <string name="no_network_available">Není k dispozici připojení k síti</string> <string name="unable_to_sync_data_no_network_available"> Nelze synchronizovat data, protože není k dispozici připojení k síti </string> - <string name="openid_authentication_not_successful"> - Nelze se ověřit pomocí vašeho účtu ICRC - </string> - - <string name="contact_service_desk_message"> - V případě problémů \nkontaktujte prosím servis ICRC - </string> <!--SDK error codes--> <string name="login_error_unsuccessful_response">Něco se pokazilo. Zkontrolujte prosím správnost adresy URL serveru, uživatelského jména a hesla a zkuste to znovu.</string> @@ -256,8 +155,6 @@ <string name="error_ssl">Došlo k problému s certifikáty serveru. Kontaktujte prosím svého správce.</string> <string name="done_task">Domovská strana</string> <string name="back">Zpět</string> - <string name="no_conflicts_message">U tohoto programu nejsou žádné konflikty</string> - <string name="action_sync">Odeslat</string> <string name="from_facility">Ze zařízení</string> <string name="to_facility">Do zařízení</string> <string name="stock">Sklad</string> diff --git a/stock-usecase/src/main/res/values-da/strings.xml b/stock-usecase/src/main/res/values-da/strings.xml index 3617e789403..9fbbe5ea726 100644 --- a/stock-usecase/src/main/res/values-da/strings.xml +++ b/stock-usecase/src/main/res/values-da/strings.xml @@ -1,11 +1,10 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="action_settings">Settings</string> - + <!-- Sign in --> <string name="username">Username</string> - <string name="password">Password</string> + <string name="delete">Delete</string> <string name="ok">OK</string> <string name="cancel">Cancel</string> - <string name="prompt_password">Password</string> + <string name="back">Back</string> </resources> \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-en-rUS/strings.xml b/stock-usecase/src/main/res/values-en-rUS/strings.xml index 1765a6d8fde..757f206455f 100644 --- a/stock-usecase/src/main/res/values-en-rUS/strings.xml +++ b/stock-usecase/src/main/res/values-en-rUS/strings.xml @@ -1,8 +1,9 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="title_activity_review">Review</string> + <!-- FloatingActionButtons --> <string name="review">Review</string> <string name="cancel">Cancel</string> + <!--SDK error codes--> <string name="login_error_unsuccessful_response">Something went wrong. Please check that server URL, username and password are correct and try again.</string> <string name="login_error_unknown_host">Unknown server</string> diff --git a/stock-usecase/src/main/res/values-es-rES/strings.xml b/stock-usecase/src/main/res/values-es-rES/strings.xml index 7b2cabd62c1..6474710022e 100644 --- a/stock-usecase/src/main/res/values-es-rES/strings.xml +++ b/stock-usecase/src/main/res/values-es-rES/strings.xml @@ -1,23 +1,17 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="title_activity_home">Inicio</string> - <string name="title_activity_review">Revisar</string> - <string name="action_settings">Configuración</string> + <!-- Sign in --> <string name="username">Nombre de usuario</string> - <string name="password">Contraseña</string> + + <!-- FloatingActionButtons --> <string name="review">Revisar</string> <string name="delete">Borrar</string> <string name="ok">Correcto</string> <string name="cancel">Cancelar</string> - <string name="from">De</string> - <string name="language">Idioma</string> - <string name="logout">Cerrar sesión</string> - - <string name="prompt_password">Contraseña</string> - <string name="content_desc_search">Buscar</string> - <string name="content_desc_remove">Quitar elemento</string> + <string name="from">De</string> <!--SDK error codes--> <string name="login_error_unsuccessful_response">Algo ha ido mal. Por favor, compruebe que tanto la url del servidor como el usuario y contraseña son correctos y pruebe otra vez.</string> <string name="login_error_unknown_host">Servidor desconocido</string> @@ -49,7 +43,6 @@ <string name="error_ssl">Hay un problema con los certificados del servidor. Por favor contacte con su administrador.</string> <string name="done_task">Inicio</string> <string name="back">Atrás</string> - <string name="no_conflicts_message">Este programa no tiene conflictos</string> <string name="not_saved">No guardado</string> <string name="formatting_error">Error de formato</string> <string name="invalid_possitive_zero">Solo se permiten números positivos o cero</string> diff --git a/stock-usecase/src/main/res/values-es/strings.xml b/stock-usecase/src/main/res/values-es/strings.xml index 2159037a0c9..c60a5bcb340 100644 --- a/stock-usecase/src/main/res/values-es/strings.xml +++ b/stock-usecase/src/main/res/values-es/strings.xml @@ -1,174 +1,58 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name">Gestión de Inventarios en Farmacias</string> <string name="title_activity_home">Inicio</string> - <string name="title_activity_review">Revisar</string> - <string name="action_settings">Configuración</string> <string name="distribution">Distribución</string> <string name="discard">Descartar</string> <string name="correction">Corrección</string> - <string name="select_transaction">Seleccione transacción</string> - <string name="transaction_date">Fecha de la Transacción</string> - <string name="recent_activity">Actividad reciente</string> - <string name="last_synced">Última sincronización:</string> - <string name="select_facility">Seleccione establecimiento</string> - <string name="distributed_to">Distribuido a</string> - <string name="select_one">Seleccione un</string> <!-- Sign in --> - <string name="server">Servidor:</string> - <string name="sign_in">Iniciar sesión</string> - <string name="sign_in_to_your_account">Inicia sesión en tu cuenta</string> - <string name="sign_in_to_with_oidc">Iniciar sesión con la cuenta del CICR</string> - <string name="non_icrc_staff_members">Solo para miembros del personal que no pertenecen al CICR</string> - <string name="icrc_staff_members">Solo para miembros del personal del CICR</string> <string name="username">Nombre de usuario</string> - <string name="password">Contraseña</string> - <string name="forgot_password">¿Has olvidado tu contraseña?</string> - - <string name="recent_activities_loading_message">Cargando actividades recientes&#8230;</string> - <string name="recent_activities_empty_message">Aún no has realizado ninguna actividad</string> <!-- Sync --> - <string name="metadata_sync_in_progress">Sincronizando metadatos&#8230;</string> <string name="metadata_sync_error">No se pudo completar la sincronización de metadatos</string> - <string name="data_sync_in_progress">Sincronizando datos&#8230;</string> - <string name="data_sync_error">No se pudo completar la sincronización de datos</string> - <string name="metadata_sync_completed">¡Sincronización de metadatos completada!</string> - <string name="sync_completed">¡Sincronizacion completa!</string> <!-- FloatingActionButtons --> - <string name="proceed">Proceder</string> <string name="review">Revisar</string> - <string name="scan_barcode">Escanear código de barras</string> - <string name="scanning">Escaneando&#8230;</string> <string name="search">Buscar elemento</string> <string name="search_placeholder">Buscar...</string> <string name="delete">Eliminar</string> <string name="ok">Correcto</string> <string name="cancel">Cancelar</string> - <string name="confirmation">Confirmación</string> <string name="from">De</string> <string name="to">Entregar a...</string> <string name="subtitle">%s</string> - <string name="to_arg">A %s</string> <!-- Languages --> - <string name="language_english">Inglés</string> - <string name="language_french">Francés</string> - <string name="language_spanish">Español</string> - <string name="language_arabic">Arabe</string> - <string name="language_russian">Ruso</string> <!-- Settings --> - <string name="use_microphone_for_data_entry">Utilice el micrófono para la entrada de datos</string> - <string name="language">Idioma</string> - <string name="force_data_sync">Forzar la sincronización de datos</string> - <string name="logout">Cerrar sesión</string> - <!-- Stock table --> - <string name="item">Elemento</string> - <string name="stock_on_hand">Inventario disponible</string> <string name="quantity">Cantidad</string> - <string name="items_available">Elementos disponibles</string> - <string name="positive_value"> - <b>Valor positivo</b> = \"cantidad faltante\" (<i>existencias físicas menor al valor calculado</i>) - </string> - <string name="negative_value"> - <b><span style="color: #C81818">Valor negativo</span></b> = \"encontrado en existencias\" (<i>existencias físicas mayores al valor calculado</i>) - </string> <!-- Messages --> - <string name="mandatory_transaction_selection"> - Se debe seleccionar un tipo de transacción y completar todos los campos antes de poder continuar - </string> <string name="mandatory_facility_selection"> Debe seleccionar el establecimiento antes de poder continuar </string> - <string name="mandatory_transaction_date_selection"> - Se debe completar el campo \"Distribuido a\" antes de poder continuar - </string> <string name="transaction_completed"> ¡La transacción se completó exitosamente! </string> - <string name="transaction_cancelled"> - ¡La cancelación de la transacción se realizó con éxito! - </string> - <plurals name="items_found"> - <item quantity="one">%d artículo</item> - <item quantity="many">%d artículos</item> - <item quantity="other">%d artículos</item> - </plurals> - <string name="no_items_found">No se encontraron elementos</string> - <string name="loading_items_message">Cargando artículos en stock &#8230;</string> - <string name="prompt_email">Correo-e</string> - <string name="prompt_password">Contraseña</string> - <string name="action_sign_in">Iniciar sesión o registrarse</string> - <string name="action_sign_in_short">Iniciar sesión</string> - <string name="welcome">¡Bienvenido!</string> - <string name="invalid_username">Nombre de usuario no válido</string> - <string name="invalid_password">La contraseña debe tener >5 caracteres</string> - <string name="login_failed">Fallo al iniciar sesión</string> - <string name="resync">Sincronizar de nuevo</string> <!-- Errors --> - <string name="login_error">No se pudo iniciar sesión</string> - <string name="config_file_error">No se puede cargar el archivo de configuración</string> - <string name="config_file_program_error"> - El identificador del programa de inventario no ha sido establecido en el archivo de configuración - </string> - <string name="recent_activities_load_error">No se pueden cargar tus actividades recientes</string> <string name="facilities_load_error">No se pueden cargar la lista de establecimientos disponibles</string> <string name="destinations_load_error"> No se puede cargar la lista de destinos disponibles </string> - <string name="distribution_data_element_load_error"> - No se ha podido cargar el elemento de datos de distribución - </string> - <string name="correction_data_element_load_error"> - No se ha podido cargar el elemento de datos de corrección - </string> - <string name="discard_data_element_load_error"> - No se puede cargar el elemento de datos de descarte - </string> <!-- Content descriptions for accessibility --> - <string name="content_desc_sync_info">Sincronizar información</string> - <string name="content_desc_search">Buscar</string> - <string name="content_desc_clear_text">Limpiar texto</string> - <string name="content_desc_transaction_date">Mostrar selector de fecha</string> - <string name="content_desc_distributed_to">Distribuido a</string> - <string name="content_desc_last_sync">Última sincronización</string> - <string name="content_desc_quantity_info">Más información sobre cantidad</string> - <string name="content_desc_remove">Quitar elemento</string> - <string name="content_desc_recent_activity">Flecha direccional</string> - <string name="content_desc_recent_activity_status">Estado de actividades recientes</string> - <string name="content_desc_close_info_guide">Cerrar guía de información</string> <string name="confirm_transaction_label">Confirmar</string> - <string name="missing_configuration"> - Falta completar uno o más campos obligatorios en el archivo de configuración - </string> - <string name="select_language">Seleccione el idioma deseado</string> - <string name="restart_later">Reiniciar más tarde</string> - <string name="language_change_dialog_title">Confirmar reinicio</string> - <string name="scan_canceled">¡Escaneo cancelado!</string> - <string name="logout_error_message"> - Se produjo un error durante el cierre de sesión. Por favor, inténtelo de nuevo más tarde. - </string> - <string name="logout_success_message">Sesión cerrada exitosamente</string> - - <string name="invalid_quantity">No válido</string> <string name="stock_on_hand_exceeded_message"> No se puede superar el inventario disponible </string> - <string name="reviewed_item_cannot_be_empty_message"> - Un inventario en revisión no puede estar vacío. Puedes eliminar el ítem si no es deseado - </string> <string name="permission_granted">Permiso concedido</string> <string name="permission_denied">Permiso denegado</string> @@ -190,25 +74,11 @@ android.permission.RECORD_AUDIO <string name="speech_timeout_error">No se detectó entrada de voz</string> <string name="unknown_speech_error">Se ha producido un error desconocido.</string> <string name="non_numeric_speech_input_error">No se permiten entradas no numéricas: \"%s\"</string> - <string name="negative_number_speech_input_error"> - No se permite la entrada de números negativos: \"%s\" - </string> + <string name="negative_number_speech_input_error">\n No se permite la entrada de números negativos: \"%s\"\n </string> - <string name="openid_config_load_error">No se puede cargar la configuración de OpenID</string> - <string name="unexpected_openid_authentication_error"> - Se produjo un error inesperado al autenticar con OpenID - </string> - <string name="no_network_available">No se encontró conexión de red disponible.</string> <string name="unable_to_sync_data_no_network_available"> No se puede sincronizar los datos porque no hay conexión de red disponible </string> - <string name="openid_authentication_not_successful"> - No se puede autenticar con su cuenta del CICR - </string> - - <string name="contact_service_desk_message"> - En caso de problemas, \ncomuníquese con el servicio de atención al cliente del CICR - </string> <!--SDK error codes--> <string name="login_error_unsuccessful_response">Algo ha ido mal. Por favor, compruebe que tanto la url del servidor como el usuario y contraseña son correctos y pruebe otra vez.</string> @@ -246,8 +116,6 @@ android.permission.RECORD_AUDIO <string name="error_ssl">Hay un problema con los certificados del servidor. Por favor contacte con su administrador.</string> <string name="done_task">Inicio</string> <string name="back">Atrás</string> - <string name="no_conflicts_message">Este programa no tiene conflictos</string> - <string name="action_sync">Enviar</string> <string name="from_facility">Desde el establecimiento</string> <string name="to_facility">Al establecimiento</string> <string name="stock">Inventario</string> diff --git a/stock-usecase/src/main/res/values-fr/strings.xml b/stock-usecase/src/main/res/values-fr/strings.xml index f7498a6be64..97812705d1f 100644 --- a/stock-usecase/src/main/res/values-fr/strings.xml +++ b/stock-usecase/src/main/res/values-fr/strings.xml @@ -1,17 +1,11 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="title_activity_home">Accueil</string> - <string name="title_activity_review">Vérifier</string> - <string name="action_settings">Paramètres</string> <string name="distribution">Distribution</string> <string name="discard">Abandonner</string> <string name="correction">Correction</string> - <string name="select_transaction">Sélectionner une transaction</string> - <string name="transaction_date">Date de la transaction</string> - <string name="last_synced">Dernière synchronisation</string> - <string name="select_facility">Séléctionner la structure</string> - <string name="distributed_to">Distribuer à</string> - <string name="sign_in">Entrer</string> + + <!-- Sign in --> <string name="username">Nom d\'utilisateur</string> <string name="password">Mot de passe</string> <string name="forgot_password">Mot de passe oublié?</string> @@ -19,42 +13,32 @@ <string name="sync_completed">Synchronisation terminée</string> <!-- FloatingActionButtons --> - <string name="proceed">Continuer</string> <string name="review">Vérifier</string> - <string name="scan_barcode">Scanner le code-barre</string> <string name="search">Rechercher un produit</string> <string name="delete">Supprimer</string> <string name="ok">Ok</string> <string name="cancel">Annuler</string> + <string name="from">A partir de</string> <string name="to">Livrer à</string> - <string name="language">Langue</string> - <string name="logout">Déconnexion</string> + <!-- Languages --> + <!-- Settings --> <!-- Stock table --> - <string name="item">Élément</string> - <string name="stock_on_hand">Stock disponible</string> <string name="quantity">Quantité</string> + <string name="transaction_completed"> La transaction a été effectuée avec succès.</string> - <string name="transaction_cancelled"> -La transaction a été annulée avec succès.</string> - <string name="no_items_found">Aucun produit trouvé</string> - <string name="prompt_email">Adresse e-mail</string> - <string name="prompt_password">Mot de passe</string> - <string name="action_sign_in_short">Entrer</string> - <string name="login_failed">Connexion échouée</string> - <!-- Errors --> - <string name="login_error">Impossible de se connecter</string> - <string name="content_desc_search">Rechercher</string> - <string name="content_desc_distributed_to">Distribué à</string> - <string name="content_desc_remove">Retirer l\'élément</string> + + <!-- Content descriptions for accessibility --> + <string name="confirm_transaction_label">Confirmer</string> - <string name="invalid_quantity">Invalide</string> + <string name="stock_on_hand_exceeded_message"> Stock disponible ne peut être dépassé</string> + <string name="speech_network_error">Erreur réseau</string> <string name="unknown_speech_error">Une erreur inconnue s\'est produite.</string> <string name="login_error_bad_credentials">Le nom d\'utilisatuer et/ou mot de passe est incorrect</string> @@ -74,8 +58,6 @@ Stock disponible ne peut être dépassé</string> <string name="error_ssl">Il y a un problème avec les certificats du serveur. Veuillez contacter votre administrateur.</string> <string name="done_task">Accueil</string> <string name="back">Précédent</string> - <string name="no_conflicts_message">Il n\'y a pas de conflits pour ce programme</string> - <string name="action_sync">Envoyer</string> <string name="not_saved">Non enregistré!</string> <string name="count">Décompte</string> <string name="under_review">Revoir</string> diff --git a/stock-usecase/src/main/res/values-hi-rIN/strings.xml b/stock-usecase/src/main/res/values-hi-rIN/strings.xml index 75300e27444..cc95d404b88 100644 --- a/stock-usecase/src/main/res/values-hi-rIN/strings.xml +++ b/stock-usecase/src/main/res/values-hi-rIN/strings.xml @@ -1,25 +1,16 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="title_activity_review">रिव्यू</string> - <string name="action_settings">सेटिंग्स</string> - <string name="discard">छोड़ें</string> + <!-- Sign in --> <string name="username">यूज़रनेम</string> - <string name="password">पासवर्ड</string> - <string name="forgot_password">पासवर्ड भूल गए\?</string> + <!-- FloatingActionButtons --> <string name="review">रिव्यू</string> <string name="delete">हटाएं</string> <string name="ok">ठीक है</string> <string name="cancel">रद्द करें</string> - <string name="from">से</string> - <string name="language">भाषा</string> - <string name="logout">लॉग आउट</string> - - <string name="prompt_email">ईमेल</string> - <string name="prompt_password">पासवर्ड</string> - <string name="content_desc_search">सर्च करें / खोजें</string> + <string name="from">से</string> <string name="back">वापस जाएँ</string> <string name="not_saved">सेव नहीं</string> <string name="invalid_possitive_zero">केवल शून्य या पॉजिटिव संख्या ही अनुमति है</string> diff --git a/stock-usecase/src/main/res/values-id/strings.xml b/stock-usecase/src/main/res/values-id/strings.xml index c27a202ac42..b6d9c974035 100644 --- a/stock-usecase/src/main/res/values-id/strings.xml +++ b/stock-usecase/src/main/res/values-id/strings.xml @@ -1,30 +1,22 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="title_activity_home">Beranda</string> - <string name="action_settings">Setting</string> <string name="discard">Buang</string> + <!-- Sign in --> <string name="username">Nama pengguna</string> - <string name="password">Sandi</string> - <!-- FloatingActionButtons --> - <string name="proceed">Lanjutkan</string> + <string name="delete">Hapus</string> <string name="ok">OK</string> <string name="cancel">Batal</string> - <string name="from">Dari</string> - <string name="language">Bahasa</string> - <string name="logout">Keluar</string> + <string name="from">Dari</string> + <!-- Content descriptions for accessibility --> - <string name="prompt_email">Email</string> - <string name="prompt_password">Sandi</string> - <string name="content_desc_search">Pencarian</string> <string name="confirm_transaction_label">Konfirmasi</string> - <string name="invalid_quantity">Tidak valid</string> + <string name="online_search_parsing_error">Kesalahan saat penguraian hasil</string> <string name="done_task">Beranda</string> <string name="back">Kembali</string> - <string name="no_conflicts_message">Tidak ada konflik untuk program ini</string> - <string name="action_sync">Kirim</string> <string name="count">Hitung</string> <string name="formatting_error">Memformat kesalahan</string> <string name="invalid_possitive_zero">Hanya angka positif atau nol yang diperbolehkan</string> diff --git a/stock-usecase/src/main/res/values-km/strings.xml b/stock-usecase/src/main/res/values-km/strings.xml index a2cd6f4f905..0aacb2a8874 100644 --- a/stock-usecase/src/main/res/values-km/strings.xml +++ b/stock-usecase/src/main/res/values-km/strings.xml @@ -1,20 +1,21 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="title_activity_home">ផ្ទាំងដើម</string> - <string name="action_settings">ការ​កំណត់</string> + <!-- Sign in --> <string name="username">ឈ្មោះ​គណនី</string> - <string name="password">ពាក្យ​សម្ងាត់</string> + <string name="delete">​លុប​</string> <string name="ok">យល់ព្រម</string> <string name="cancel">បោះបង់</string> - <string name="prompt_password">ពាក្យ​សម្ងាត់</string> - <string name="content_desc_search">ស្វែងរក</string> + + <!-- Content descriptions for accessibility --> + <string name="confirm_transaction_label">បញ្ជាក់</string> + <string name="speech_network_error">បណ្ដាញមានបញ្ហា</string> <string name="online_search_parsing_error">កំហុសខណៈពេលញែកលទ្ធផល</string> <string name="done_task">ផ្ទាំងដើម</string> <string name="back">ថយក្រោយ</string> - <string name="action_sync">ផ្ញើទៅ</string> <string name="count">ផលរាប់</string> <string name="invalid_possitive_zero">លេខវិជ្ជមាន រឺ លេខ ០ តែមួយគត់ដែលត្រូវបានអនុញ្ញាត</string> </resources> \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-lo/strings.xml b/stock-usecase/src/main/res/values-lo/strings.xml index 9abac5c86e1..d3085495a52 100644 --- a/stock-usecase/src/main/res/values-lo/strings.xml +++ b/stock-usecase/src/main/res/values-lo/strings.xml @@ -1,24 +1,11 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="title_activity_home">ໜ້າຫຼັກ</string> - <string name="title_activity_review">ທົບທວນຄືນ</string> - <string name="action_settings">ຕັ້ງຄ່າ</string> <string name="discard">ຍົົກເລິກ</string> - <string name="select_transaction">ເລືອກທຸລະກຳ</string> - <string name="recent_activity">ກິດຈະກຳທີ່ຜ່ານມາ</string> - <string name="last_synced">ອັບເດດຂໍ້ມູນຄັ້ງສຸດທ້າຍ:</string> - <string name="select_facility">ເລືອກສະຖານທີ່ບໍລິການ</string> <!-- Sign in --> - <string name="server">ເຄື່ອງຄອມພິວເຕີໜ່ວຍແມ່:</string> - <string name="sign_in">ເຂົ້າສູ່ລະບົບ</string> - <string name="sign_in_to_your_account">ເຂົ້າສູ່ລະບົບດ້ວຍບັນຊີຂອງທ່ານ</string> - <string name="sign_in_to_with_oidc">ເຂົ້າສູ່ລະບົບດ້ວຍບັນຊີ ICRC</string> <string name="username">ຊື່ຜູ້ໃຊ້</string> - <string name="password">ລະຫັດຜ່ານ</string> - <string name="forgot_password">ລຶມລະຫັດຜ່ານ?</string> <!-- FloatingActionButtons --> - <string name="proceed">ດຳເນີນ</string> <string name="review">ທົບທວນຄືນ</string> <string name="search">ຄົ້ນຫາລາຍການ</string> @@ -26,50 +13,28 @@ <string name="delete">ລົບ</string> <string name="ok">​ຕົກ​ລົງ</string> <string name="cancel">ຍົກເລີກ</string> + <string name="from">ຈາກ</string> - <string name="language">ພາສາ</string> - <string name="logout">ອອກຈາກລະບົບ</string> + <!-- Languages --> + <!-- Settings --> <!-- Stock table --> - <string name="item">ລາຍການ</string> <string name="quantity">ປະລິມານ</string> - <string name="items_available">ລາຍການທີ່ມີຢູ່</string> - <plurals name="items_found"> - <item quantity="other">%d ລາຍການ</item> - </plurals> - <string name="no_items_found">ບໍ່ພົບລາຍການໃດໆ</string> - <string name="prompt_email">ອີເມວ</string> - <string name="prompt_password">ລະຫັດຜ່ານ</string> - <string name="action_sign_in">ເຂົ້າສູ່ລະບົບ ຫຼື ລົງທະບຽນ</string> - <string name="action_sign_in_short">ເຂົ້າສູ່ລະບົບ</string> - <string name="welcome">ຍິນດີຕ້ອນຮັບ !</string> - <string name="invalid_username">ບໍ່ແມ່ນຊື່ຜູ້ໃຊ້ທີ່ຖືກຕ້ອງ</string> - <string name="invalid_password">ລະຫັດຜ່ານຕ້ອງມີ >5 ຕົວອັກສອນ</string> - <string name="login_failed">ການເຂົ້າສູ່ລະບົບຜິດພາດ</string> - <string name="resync">ອັບເດດຂໍ້ມູນຄືນໃໝ່</string> <!-- Errors --> - <string name="login_error">ບໍ່ສາມາດເຂົ້າສູ່ລະບົບໄດ້</string> <string name="facilities_load_error">ບໍ່ສາມາດໂຫຼດລາຍຊື່ສະຖານທີ່ບໍລິການທີ່ມີຢູ່ໄດ້</string> - <string name="content_desc_search">ຄົ້ນຫາ</string> - <string name="content_desc_clear_text">ລ້າງຂໍ້ຄວາມ</string> - <string name="content_desc_last_sync">ອັບເດດຂໍ້ມູນຄັ້ງສຸດທ້າຍ</string> - <string name="content_desc_quantity_info">ຂໍ້ມູນເພີ່ມເຕີມກ່ຽວກັບປະລິມານ</string> - <string name="content_desc_remove">ລົບລາຍການ</string> + <!-- Content descriptions for accessibility --> + <string name="confirm_transaction_label">ຢືນຢັນ</string> - <string name="restart_later">ເລີ່ມຕົ້ນໃໝ່ໃນພາຍຫຼັງ</string> - <string name="logout_success_message">ອອກຈາກລະບົບສຳເລັດແລ້ວ</string> - <string name="invalid_quantity">ບໍ່ຖືກຕ້ອງ</string> <string name="speech_network_error">ຂໍ້ຜິດພາດທາງເຄື່ອຂ່າຍ</string> <string name="speech_network_timeout_error">ການເຮັດວຽກຂອງອິນເຕີເນັດໝົດເວລາແລ້ວ</string> - <string name="negative_number_speech_input_error"> -ບໍ່ອະນຸຍາດໃຫ້ປ້ອນຕົວເລກລົບ:\"%s\" </string> + <string name="negative_number_speech_input_error">\nບໍ່ອະນຸຍາດໃຫ້ປ້ອນຕົວເລກລົບ:\"%s\" </string> - <string name="no_network_available">ບໍ່ມີການເຊື່ອມຕໍ່ອິນເຕີເນັດ</string> <string name="unable_to_sync_data_no_network_available"> ບໍ່ສາມາດ ອັບເດດຂໍ້ມູນໃຫ້ຄືກັນຂໍ້ມູນໄດ້ເນື່ອງຈາກບໍ່ມີການເຊື່ອມຕໍ່ອິນເຕີເນັດ</string> + <!--SDK error codes--> <string name="login_error_unsuccessful_response">ມີບາງສິ່ງບາງຢ່າງຜິດພາດ. ກະລຸນາກວດເບິ່ງທີ່ຢູ່ຂອງເຄື່ອງຄອມພິວເຕີໜ່ວຍແມ່, ຊື່ຜູ້ໃຊ້ ແລະ ລະຫັດຜ່ານວ່າຖືກຕ້ອງແລ້ວ ແລ້ວລອງໃໝ່ອີກຄັ້ງ.</string> <string name="login_error_error_response">Oops! ມີບາງສິ່ງບາງຢ່າງຜິດພາດທາງດ້ານຄອມພິວເຕີໜ່ວຍແມ່</string> @@ -106,8 +71,6 @@ <string name="error_ssl">ມີບັນຫາກັບໃບຮັບຮອງເຄື່ອງຄອມພິວເຕິ້ໜ່ວຍແມ່. ກະລຸນາຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ.</string> <string name="done_task">ໜ້າຫຼັກ</string> <string name="back">​ກັບ​ຄືນ</string> - <string name="no_conflicts_message">ສາຍງານນີ້ບໍມີຂໍ້ຂັດແຍ້ງ</string> - <string name="action_sync">ສົ່ງ</string> <string name="from_facility">ຈາກ ສະຖານທີ່ບໍລິການ</string> <string name="to_facility">ຫາ ສະຖານທີ່ບໍລິການ</string> <string name="stock">ສາງ</string> diff --git a/stock-usecase/src/main/res/values-my/strings.xml b/stock-usecase/src/main/res/values-my/strings.xml index f01a1568adf..421d472175a 100644 --- a/stock-usecase/src/main/res/values-my/strings.xml +++ b/stock-usecase/src/main/res/values-my/strings.xml @@ -1,17 +1,14 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="title_activity_home">ပင်မစာမျက်နှာ</string> - <string name="action_settings">တည်ဆောက်ထားသည့်အနေအထား</string> + <!-- Sign in --> <string name="username">အသုံးပြုသူအမည်</string> - <string name="password">လျှို့ဝှက်နံပါတ်</string> - <string name="forgot_password">လျှို့ဝှက်နံပါတ်မေ့သွားသည်</string> <string name="delete">ဖျက်ဆီးသည်</string> <string name="ok">လက်ခံသည်</string> <string name="cancel">ပယ်ဖျက်သည်</string> - <string name="prompt_password">လျှို့ဝှက်နံပါတ်</string> + <string name="done_task">ပင်မစာမျက်နှာ</string> <string name="back">‌နောက်သို့ပြန်သွားသည်</string> - <string name="action_sync">ပို့သည်</string> <string name="count">အရေအတွက်</string> </resources> \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-nb/strings.xml b/stock-usecase/src/main/res/values-nb/strings.xml index f620f8e4315..650b127c221 100644 --- a/stock-usecase/src/main/res/values-nb/strings.xml +++ b/stock-usecase/src/main/res/values-nb/strings.xml @@ -1,36 +1,22 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="title_activity_home">Hjem</string> - <string name="action_settings">Innstillinger</string> <string name="discard">Forkast</string> - <string name="sign_in">Logg inn</string> + <!-- Sign in --> <string name="username">Brukernavn</string> - <string name="password">Passord</string> - <string name="forgot_password">Glemt passord?</string> - <!-- FloatingActionButtons --> - <string name="proceed">Fortsett</string> <string name="delete">Slett</string> <string name="ok">OK</string> <string name="cancel">Avbryt</string> - <string name="from">Fra</string> - <string name="language">Språk</string> - <string name="logout">Logg ut</string> + <string name="from">Fra</string> + <!-- Content descriptions for accessibility --> - <!-- Stock table --> - <string name="item">Element</string> - <string name="prompt_email">E-post</string> - <string name="prompt_password">Passord</string> - <string name="action_sign_in_short">Logg inn</string> - <string name="content_desc_search">Søk</string> <string name="confirm_transaction_label">Bekreft</string> - <string name="invalid_quantity">Ugyldig</string> + <string name="online_search_parsing_error">Feil under analyse av resultater</string> <string name="done_task">Hjem</string> <string name="back">Tilbake</string> - <string name="no_conflicts_message">Det er ingen konflikter for dette programmet</string> - <string name="action_sync">Send</string> <string name="count">Antall</string> <string name="formatting_error">Formateringsfeil</string> <string name="invalid_possitive_zero">Bare positive siffer eller null er tillatt</string> diff --git a/stock-usecase/src/main/res/values-ne/strings.xml b/stock-usecase/src/main/res/values-ne/strings.xml index 22478dfd7d8..8020b60ebe8 100644 --- a/stock-usecase/src/main/res/values-ne/strings.xml +++ b/stock-usecase/src/main/res/values-ne/strings.xml @@ -1,7 +1,5 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="discard">त्याग गर्नुहोस्</string> <string name="cancel">रद्द गर्नुहोस्</string> - <string name="content_desc_search">खोज</string> - <string name="invalid_quantity">अमान्य</string> - <string name="action_sync">पठाउनुहोस्</string> + </resources> \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-nl/strings.xml b/stock-usecase/src/main/res/values-nl/strings.xml index 79918c5445e..a55981525e2 100644 --- a/stock-usecase/src/main/res/values-nl/strings.xml +++ b/stock-usecase/src/main/res/values-nl/strings.xml @@ -1,138 +1,51 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name">Voorraadbeheer apotheek</string> <string name="title_activity_home">Thuis</string> - <string name="title_activity_review">Beoordeling</string> - <string name="action_settings">Instellingen</string> <string name="distribution">Verdeling</string> <string name="discard">Weggooien</string> <string name="correction">Correctie</string> - <string name="select_transaction">Selecteer transactie</string> - <string name="transaction_date">Datum van transactie</string> - <string name="recent_activity">Recente activiteit</string> - <string name="last_synced">Laatst gesynchroniseerd:</string> - <string name="select_facility">Selecteer Faciliteit</string> - <string name="distributed_to">Gedistribueerd naar</string> - <string name="select_one">Kies een</string> <!-- Sign in --> - <string name="server">Server:</string> - <string name="sign_in">Aanmelden</string> - <string name="sign_in_to_your_account">Meld u aan bij uw account</string> - <string name="sign_in_to_with_oidc">Log in met ICRC-account</string> - <string name="non_icrc_staff_members">Alleen voor niet-ICRC-personeelsleden</string> - <string name="icrc_staff_members">Alleen voor ICRC-personeelsleden</string> <string name="username">Gebruikersnaam</string> - <string name="password">Wachtwoord</string> - <string name="forgot_password">Wachtwoord vergeten?</string> - - <string name="recent_activities_loading_message">Recente activiteiten laden&#8230;</string> - <string name="recent_activities_empty_message">U moet nog enige activiteit uitvoeren</string> <!-- Sync --> - <string name="metadata_sync_in_progress">Metagegevens synchroniseren&#8230;</string> <string name="metadata_sync_error">Kan metadatasynchronisatie niet voltooien</string> - <string name="data_sync_in_progress">Gegevens synchroniseren&#8230;</string> - <string name="data_sync_error">Gegevenssynchronisatie kan niet worden voltooid</string> - <string name="metadata_sync_completed">Metadatasynchronisatie voltooid!</string> - <string name="sync_completed">Synchronisatie voltooid!</string> <!-- FloatingActionButtons --> - <string name="proceed">Ga door</string> <string name="review">Beoordeling</string> - <string name="scan_barcode">Streepjescode scannen</string> - <string name="scanning">Scannen&#8230;</string> <string name="search">Zoek item</string> <string name="search_placeholder">Zoekopdracht…</string> <string name="delete">Verwijder</string> <string name="ok">OK</string> <string name="cancel">Annuleren</string> - <string name="confirmation">Bevestiging</string> <string name="from">Van</string> <string name="to">Leveren aan…</string> <string name="subtitle">%s</string> - <string name="to_arg">Naar %s</string> <!-- Languages --> - <string name="language_english">Engels</string> - <string name="language_french">Frans</string> - <string name="language_spanish">Spaans</string> - <string name="language_arabic">Arabisch</string> - <string name="language_russian">Russisch</string> <!-- Settings --> - <string name="use_microphone_for_data_entry">Gebruik microfoon voor gegevensinvoer</string> - <string name="language">Taal</string> - <string name="force_data_sync">Forceer gegevenssynchronisatie</string> - <string name="logout">Uitloggen</string> - <!-- Stock table --> - <string name="item">Item</string> - <string name="stock_on_hand">Voorraad bij de hand</string> <string name="quantity">Hoeveelheid</string> - <string name="items_available">artikelen beschikbaar</string> - <string name="positive_value"> <b> Positieve waarde </b> = \"ontbrekende hoeveelheid\" ( <i> fysieke voorraad kleiner dan de berekende waarde </i> ) </string> - <string name="negative_value"> <b> <span style="color: #C81818"> Negatieve waarde </span> </b> = \"op voorraad gevonden\" ( <i> fysieke voorraad is meer dan de berekende waarde </i> ) </string> <!-- Messages --> - <string name="mandatory_transaction_selection"> Er moet een transactietype worden geselecteerd en alle velden moeten zijn ingevuld voordat u verder kunt gaan </string> <string name="mandatory_facility_selection"> Het faciliteitsveld moet worden ingevuld voordat u verder kunt gaan </string> - <string name="mandatory_transaction_date_selection"> Het veld \"Gedistribueerd naar\" moet zijn ingevuld voordat u verder kunt gaan </string> - <string name="previous_page_lose_data_warning"> Weet u zeker dat u terug wilt naar het vorige scherm? U verliest de zojuist ingevoerde gegevens als u besluit door te gaan. </string> <string name="transaction_completed"> De transactie is succesvol afgerond! </string> - <string name="transaction_cancelled"> De transactie is succesvol geannuleerd! </string> - <string name="force_sync_confirmation_message"> Weet u zeker dat u synchronisatie wilt forceren? </string> - <string name="logout_confirmation_message">Weet u zeker dat u wilt uitloggen?</string> - - <string name="remove_correction_item_confirmation_message"> Weet u zeker dat u de invoer voor de correctie van \"%1$s permanent wilt verwijderen\"? Deze actie kan niet ongedaan gemaakt worden. </string> - <string name="remove_distribution_item_confirmation_message"> Weet u zeker dat u het item voor de distributie van \"%1$s permanent wilt verwijderen\"? Deze actie kan niet ongedaan gemaakt worden. </string> - <string name="remove_discard_item_confirmation_message"> Weet u zeker dat u de invoer voor het weggooien van \"%1$s permanent wilt verwijderen\"? Deze actie kan niet ongedaan gemaakt worden. </string> - - <plurals name="items_found"> - <item quantity="one">%d item</item> - <item quantity="other">%d artikelen</item> - </plurals> - <string name="no_items_found">Geen items gevonden</string> - <string name="loading_items_message">Voorraadartikelen laden &#8230;</string> - <string name="prompt_email">Emailadres</string> - <string name="prompt_password">Wachtwoord</string> - <string name="action_sign_in">Log in of registreer</string> - <string name="action_sign_in_short">Aanmelden</string> - <string name="welcome">Welkom !</string> - <string name="invalid_username">Geen geldige gebruikersnaam</string> - <string name="invalid_password">Wachtwoord moet >5 tekens zijn</string> - <string name="login_failed">Aanmelden mislukt</string> - <string name="resync">Opnieuw synchroniseren</string> <!-- Errors --> - <string name="login_error">Niet mogelijk om in te loggen</string> - <string name="config_file_error">Kan het configuratiebestand niet laden</string> - <string name="config_file_program_error"> Stock-programma-ID is niet ingesteld in het configuratiebestand </string> - <string name="recent_activities_load_error">Kan uw recente activiteiten niet laden</string> <string name="facilities_load_error">Kan de lijst met beschikbare faciliteiten niet laden</string> <string name="destinations_load_error"> Kan de lijst met beschikbare bestemmingen niet laden </string> + <!-- Content descriptions for accessibility --> - <string name="content_desc_sync_info">Synchroniseer informatie</string> - <string name="content_desc_search">Zoek</string> - <string name="content_desc_clear_text">Duidelijke tekst</string> - <string name="content_desc_transaction_date">Toon datumkiezer</string> - <string name="content_desc_distributed_to">Gedistribueerd naar</string> - <string name="content_desc_last_sync">Laatst gesynchroniseerd</string> - <string name="content_desc_quantity_info">Meer informatie over hoeveelheid</string> - <string name="content_desc_remove">Verwijder voorwerp</string> - <string name="content_desc_recent_activity">Richtingspijl</string> - <string name="content_desc_recent_activity_status">Recente activiteitsstatus</string> - <string name="content_desc_close_info_guide">Informatiegids sluiten</string> <string name="confirm_transaction_label">Bevestigen</string> - <string name="missing_configuration"> Een of meer verplichte velden ontbreken in het configuratiebestand </string> - <string name="select_language">Selecteer uw gewenste taal</string> <string name="restart_later">Later opnieuw opstarten</string> - <string name="confirm_app_restart_message"> De toepassing moet opnieuw worden gestart om de wijzigingen door te voeren, maar alle niet-opgeslagen wijzigingen gaan verloren.\\n\\nWilt u doorgaan met de herstart? </string> + <string name="confirm_app_restart_message"> De toepassing moet opnieuw worden gestart om de wijzigingen door te voeren, maar alle niet-opgeslagen wijzigingen gaan verloren.\\n\\nWilt u doorgaan met de herstart\? </string> <string name="language_change_dialog_title">Bevestig opnieuw opstarten</string> <string name="scan_canceled">Scan geannuleerd!</string> <string name="logout_error_message"> Er is een fout opgetreden tijdens het uitloggen. Probeer het later opnieuw. </string> @@ -140,7 +53,6 @@ <string name="invalid_quantity">Ongeldig</string> <string name="stock_on_hand_exceeded_message"> De beschikbare voorraad kan niet worden overschreden </string> - <string name="reviewed_item_cannot_be_empty_message"> Een voorraad die wordt beoordeeld, kan niet leeg zijn. U kunt het item verwijderen als u dit niet wilt </string> <string name="permission_granted">Toestemming verleend</string> <string name="permission_denied">Geen toestemming</string> @@ -159,9 +71,6 @@ <string name="non_numeric_speech_input_error">Niet-numerieke invoer is niet toegestaan: \"%s\"</string> <string name="negative_number_speech_input_error"> Negatieve getalinvoer is niet toegestaan: \"%s\" </string> - <string name="openid_config_load_error">Kan OpenID-configuratie niet laden</string> - <string name="unexpected_openid_authentication_error"> Er is een onverwachte fout opgetreden tijdens het verifiëren met OpenID </string> - <string name="no_network_available">Geen netwerkverbinding beschikbaar</string> <string name="unable_to_sync_data_no_network_available"> Kan gegevens niet synchroniseren omdat er geen netwerkverbinding beschikbaar is </string> <string name="openid_authentication_not_successful"> Kan niet verifiëren met uw ICRC-account </string> @@ -203,8 +112,6 @@ <string name="error_ssl">Er is een probleem met de servercertificaten. Neem contact op met uw beheerder.</string> <string name="done_task">Thuis</string> <string name="back">Terug</string> - <string name="no_conflicts_message">Er zijn geen conflicten voor dit programma</string> - <string name="action_sync">Versturen</string> <string name="from_facility">Van faciliteit</string> <string name="to_facility">Naar faciliteit</string> <string name="stock">Voorraad</string> diff --git a/stock-usecase/src/main/res/values-or/strings.xml b/stock-usecase/src/main/res/values-or/strings.xml index 73cd7ef15f9..ea423cc3410 100644 --- a/stock-usecase/src/main/res/values-or/strings.xml +++ b/stock-usecase/src/main/res/values-or/strings.xml @@ -1,5 +1,6 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="title_activity_home">ଗୃହ</string> + <string name="done_task">ଗୃହ</string> <string name="invalid_possitive_zero">କେବଳ ଧନାତ୍ମକ ସଂଖ୍ୟା କିମ୍ବା ଶୂନ ଅନୁମୋଦିତ</string> </resources> \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-prs/strings.xml b/stock-usecase/src/main/res/values-prs/strings.xml index 0df4da408d6..1f94b8913d3 100644 --- a/stock-usecase/src/main/res/values-prs/strings.xml +++ b/stock-usecase/src/main/res/values-prs/strings.xml @@ -1,30 +1,20 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="title_activity_home">صفحه اصلی</string> - <string name="action_settings">تنظیمات</string> <string name="discard">ازبین بردن</string> - <string name="sign_in">ورود به سیستم</string> + <!-- Sign in --> <string name="username">نام کاربر</string> - <string name="password">کلید رمز</string> - <string name="forgot_password">آیا کلید رمز را فراموش نه موده اید؟</string> - <!-- FloatingActionButtons --> - <string name="proceed">ادامه دادن</string> <string name="delete">حذف</string> <string name="ok">تأیید</string> <string name="cancel">انصراف</string> + <string name="from">از جانب</string> - <string name="language">زبان</string> - <!-- Stock table --> - <string name="item">مورد</string> - <string name="prompt_email">برېښنالیک</string> - <string name="prompt_password">کلید رمز</string> - <string name="action_sign_in_short">ورود به سیستم</string> - <string name="content_desc_search">جستجو</string> + <!-- Content descriptions for accessibility --> + <string name="confirm_transaction_label">تائید</string> - <string name="invalid_quantity">نامعتبر</string> + <string name="done_task">صفحه اصلی</string> <string name="back">عقب</string> - <string name="action_sync">فرستادن</string> <string name="count">تعداد</string> </resources> \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-ps/strings.xml b/stock-usecase/src/main/res/values-ps/strings.xml index 3ad1c0f779c..77dc787f1ba 100644 --- a/stock-usecase/src/main/res/values-ps/strings.xml +++ b/stock-usecase/src/main/res/values-ps/strings.xml @@ -1,28 +1,16 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="title_activity_home">کور پاڼه</string> - <string name="action_settings">تنظیمات</string> <string name="discard">رد یې کړئ</string> - <string name="sign_in">سیسټم ته داخلېدل</string> + <!-- Sign in --> <string name="username">کارېدونکی نوم</string> - <string name="password">پټنوم</string> - <string name="forgot_password">پټ نوم هېر شوی دی؟</string> - <!-- FloatingActionButtons --> - <string name="proceed">دوام ورکول</string> <string name="delete">خذف یې کړئ</string> <string name="ok">سم دی</string> <string name="cancel">رد یې کړئ [ ژباړه ـ ردول ]</string> + <string name="from">څخه</string> - <!-- Stock table --> - <string name="item">مورد</string> - <string name="prompt_email">ایمیل</string> - <string name="prompt_password">پټنوم</string> - <string name="action_sign_in_short">سیسټم ته داخلېدل</string> - <string name="content_desc_search">جستجو</string> - <string name="invalid_quantity">د اعتبار وړ نه دي</string> <string name="done_task">کور پاڼه</string> <string name="back">شا ته کېدل</string> - <string name="action_sync">لېږل</string> <string name="count">شمېرل</string> </resources> \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-pt-rBR/strings.xml b/stock-usecase/src/main/res/values-pt-rBR/strings.xml index 85a833fe33b..927743b9223 100644 --- a/stock-usecase/src/main/res/values-pt-rBR/strings.xml +++ b/stock-usecase/src/main/res/values-pt-rBR/strings.xml @@ -1,21 +1,20 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="title_activity_home">Origem</string> - <string name="action_settings">Configurações</string> + <!-- Sign in --> <string name="username">Utilizador</string> - <string name="password">Password</string> + <string name="delete">Apagar</string> <string name="ok">Aprovado</string> <string name="cancel">Cancelar</string> + <string name="from">A partir de</string> - <string name="prompt_email">E-mail</string> - <string name="prompt_password">Password</string> - <string name="content_desc_search">Pesquisar</string> + <!-- Content descriptions for accessibility --> + <string name="confirm_transaction_label">Confirmar</string> - <string name="invalid_quantity">Inválido</string> + <string name="speech_network_error">Erro de rede</string> <string name="done_task">Origem</string> <string name="back">Voltar</string> - <string name="action_sync">Enviar</string> <string name="count">Contagem</string> </resources> \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-pt/strings.xml b/stock-usecase/src/main/res/values-pt/strings.xml index e6acc163129..32e11c7c7c8 100644 --- a/stock-usecase/src/main/res/values-pt/strings.xml +++ b/stock-usecase/src/main/res/values-pt/strings.xml @@ -1,171 +1,56 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name"> Gestão de stocks de farmácia</string> <string name="title_activity_home">Início</string> - <string name="title_activity_review">Revisão</string> - <string name="action_settings">Configurações</string> <string name="distribution">Distribuição</string> <string name="discard">Descartar</string> <string name="correction">Correção</string> - <string name="select_transaction">Selecionar transação</string> - <string name="transaction_date">Data da transação</string> - <string name="recent_activity">Actividade recente</string> - <string name="last_synced">Data da última sincronização</string> - <string name="select_facility">Selecionar unidade sanitária</string> - <string name="distributed_to">Distribuído para</string> - <string name="select_one">Selecione um</string> <!-- Sign in --> - <string name="server">Servidor:</string> - <string name="sign_in">Entrar </string> - <string name="sign_in_to_your_account"> Iniciar sessão na sua conta</string> - <string name="sign_in_to_with_oidc"> Iniciar sessão com a conta do ICRC</string> - <string name="non_icrc_staff_members">Apenas para membros do pessoal não pertencentes ao ICRC </string> - <string name="icrc_staff_members"> Apenas para membros do ICRC </string> <string name="username">Nome de utilizador</string> - <string name="password">Senha</string> - <string name="forgot_password">Esqueceu a password?</string> - - <string name="recent_activities_loading_message"> Carregar actividades recentes&#8230;</string> - <string name="recent_activities_empty_message"> Ainda não realizou nenhuma atividade</string> <!-- Sync --> - <string name="metadata_sync_in_progress"> Sincronização de metadados&#8230;</string> <string name="metadata_sync_error">Não foi possível concluir a sincronização de metadados</string> - <string name="data_sync_in_progress"> Sincronização de dados&#8230;</string> - <string name="data_sync_error"> Não é possível concluir a sincronização de dados</string> - <string name="metadata_sync_completed"> Sincronização de metadados concluída!</string> - <string name="sync_completed">Sincronização concluída!</string> <!-- FloatingActionButtons --> - <string name="proceed">Prosseguir</string> <string name="review">Revisão</string> - <string name="scan_barcode"> Ler código de barras</string> - <string name="scanning"> Digitalização&#8230;</string> <string name="search"> Procurar item</string> <string name="search_placeholder">Pesquisar...</string> <string name="delete">Apagar</string> <string name="ok">OK</string> <string name="cancel">Cancelar</string> - <string name="confirmation">Confirmação</string> <string name="from">A partir de</string> <string name="to"> Entrega para...</string> <string name="subtitle">%s</string> - <string name="to_arg">Para %s</string> <!-- Languages --> - <string name="language_english"> Inglês</string> - <string name="language_french">Francês</string> - <string name="language_spanish">Espanhol</string> - <string name="language_arabic">Árabe</string> - <string name="language_russian">Russo</string> <!-- Settings --> - <string name="use_microphone_for_data_entry">Use microfone para introdução de dados</string> - <string name="language">Idioma</string> - <string name="force_data_sync">Forçar a sincronização de dados</string> - <string name="logout"> Terminar sessão</string> - <!-- Stock table --> - <string name="item">Item</string> - <string name="stock_on_hand"> Existências</string> <string name="quantity">Quantidade</string> - <string name="items_available"> artigos disponíveis</string> - <string name="positive_value"> - <b>Valor positivo</b> = \"quantidade em falta\" (<i>estoque físico inferior ao número calculado</i>) - </string> - <string name="negative_value"> - <b><span style="color: #C81818">Valor negativo</span></b> = \"encontrado em stock\" (<i>estoque físico é superior ao valor calculado</i>)</string> <!-- Messages --> - <string name="mandatory_transaction_selection"> - Deve ser selecionado um tipo de transação e todos os campos devem ser preenchidos antes de poder prosseguir - </string> <string name="mandatory_facility_selection"> O campo da instalação deve ser preenchido antes de prosseguir </string> - <string name="mandatory_transaction_date_selection"> - The ‘Distributed to’ field must be filled in before proceeding - </string> <string name="transaction_completed"> A transação foi concluída com êxito! </string> - <string name="transaction_cancelled"> - A transação foi cancelada com sucesso! - </string> - <plurals name="items_found"> - <item quantity="one">%d item</item> - <item quantity="many">%d artigos</item> - <item quantity="other">%d itens</item> - </plurals> - <string name="no_items_found"> Nenhum item encontrado</string> - <string name="loading_items_message">Carregar itens em stock &#8230;</string> - <string name="prompt_email">E-mail</string> - <string name="prompt_password">Palavra-passe</string> - <string name="action_sign_in"> Iniciar sessão ou registar-se</string> - <string name="action_sign_in_short">Entrar </string> - <string name="welcome">Bem-vindo!</string> - <string name="invalid_username"> Não é um nome de utilizador válido</string> - <string name="invalid_password">A palavra-passe deve ter >5 caracteres</string> - <string name="login_failed">O início de sessão falhou</string> - <string name="resync">Voltar a sincronizar</string> <!-- Errors --> - <string name="login_error"> Não é possível iniciar sessão</string> - <string name="config_file_error"> Não é possível carregar o ficheiro de configuração</string> - <string name="config_file_program_error"> - O ID do programa de stock não foi definido no ficheiro de configuração - </string> - <string name="recent_activities_load_error"> Não é possível carregar as suas actividades recentes</string> <string name="facilities_load_error"> Não é possível carregar a lista de unidades sanitárias disponíveis</string> <string name="destinations_load_error"> Não foi possível carregar a lista de destinos disponíveis </string> - <string name="distribution_data_element_load_error"> - Não foi possível carregar o elemento de dados de distribuição - </string> - <string name="correction_data_element_load_error"> - Não foi possível carregar o elemento de dados de correção - </string> - <string name="discard_data_element_load_error"> - Não foi possível carregar o elemento de dados descartados - </string> <!-- Content descriptions for accessibility --> - <string name="content_desc_sync_info"> Informações de sincronização</string> - <string name="content_desc_search">Pesquisar</string> - <string name="content_desc_clear_text">Limpar texto</string> - <string name="content_desc_transaction_date"> Mostrar selector de datas</string> - <string name="content_desc_distributed_to">Distribuído para</string> - <string name="content_desc_last_sync"> Última sincronização</string> - <string name="content_desc_quantity_info"> Mais informações sobre a quantidade</string> - <string name="content_desc_remove"> Remover item</string> - <string name="content_desc_recent_activity"> Seta direcional</string> - <string name="content_desc_recent_activity_status"> Estado da atividade recente</string> - <string name="content_desc_close_info_guide">Fechar guia de informação</string> <string name="confirm_transaction_label">Confirme</string> - <string name="missing_configuration"> - Um ou mais campos obrigatórios estão em falta no ficheiro de configuração - </string> - <string name="select_language"> Selecione a língua pretendida</string> - - <string name="restart_later"> Reiniciar mais tarde</string> - <string name="language_change_dialog_title"> Confirmar o reinício</string> - <string name="scan_canceled"> Scan cancelado!</string> - <string name="logout_error_message"> - Ocorreu um erro durante o logout. Por favor, tente mais tarde. - </string> - <string name="logout_success_message"> Sair da sessão com sucesso</string> - <string name="invalid_quantity">Inválido</string> <string name="stock_on_hand_exceeded_message">As existências disponíveis não podem ser excedidas</string> - <string name="reviewed_item_cannot_be_empty_message"> - Um stock em revisão não pode estar vazio. Pode remover o item se não desejar - </string> <string name="permission_granted"> Autorização concedida</string> <string name="permission_denied"> Autorização recusada</string> @@ -186,25 +71,11 @@ <string name="speech_timeout_error"> Não foi detectada qualquer entrada de voz</string> <string name="unknown_speech_error"> Ocorreu um erro desconhecido.</string> <string name="non_numeric_speech_input_error"> Não é permitida a introdução de dados não numéricos: \"%s\"</string> - <string name="negative_number_speech_input_error"> - A introdução de números negativos não é permitida:\"%s\" - </string> + <string name="negative_number_speech_input_error">\n A introdução de números negativos não é permitida:\"%s\"\n </string> - <string name="openid_config_load_error"> Não é possível carregar a configuração do OpenID</string> - <string name="unexpected_openid_authentication_error"> - Ocorreu um erro inesperado ao autenticar com OpenID - </string> - <string name="no_network_available"> Não há ligação de rede disponível</string> <string name="unable_to_sync_data_no_network_available"> Não é possível sincronizar dados porque não existe uma ligação de rede disponível </string> - <string name="openid_authentication_not_successful"> - Não é possível autenticar com a sua conta ICRC - </string> - - <string name="contact_service_desk_message"> - Em caso de problemas, \ncontacte o serviço de atendimento do ICRC - </string> <!--SDK error codes--> <string name="login_error_unsuccessful_response">Algo correu mal. Verifique se o URL do servidor, o nome de utilizador e a palavra-passe estão correctos e tente novamente.</string> @@ -242,8 +113,6 @@ <string name="error_ssl">Existe um problema com os certificados do servidor. Por favor, contacte o seu administrador.</string> <string name="done_task">Início</string> <string name="back">Voltar</string> - <string name="no_conflicts_message">Não há conflitos para este programa</string> - <string name="action_sync">Enviar</string> <string name="from_facility"> Da unidade sanitária</string> <string name="to_facility"> Para a unidade sanitária</string> <string name="stock">Stock</string> diff --git a/stock-usecase/src/main/res/values-ro/strings.xml b/stock-usecase/src/main/res/values-ro/strings.xml index c708e2b5904..7d2a86fc3fc 100644 --- a/stock-usecase/src/main/res/values-ro/strings.xml +++ b/stock-usecase/src/main/res/values-ro/strings.xml @@ -1,10 +1,14 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="title_activity_home">Acasă</string> + <string name="delete">Lichidare</string> <string name="cancel">Anulare</string> + <string name="from">Din</string> - <string name="content_desc_search">Căutare</string> + <!-- Content descriptions for accessibility --> + <string name="confirm_transaction_label">Confirmare</string> + <string name="done_task">Acasă</string> <string name="back">Înapoi</string> </resources> \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-ru/strings.xml b/stock-usecase/src/main/res/values-ru/strings.xml index 21f222fa8d0..da7bf782bc3 100644 --- a/stock-usecase/src/main/res/values-ru/strings.xml +++ b/stock-usecase/src/main/res/values-ru/strings.xml @@ -1,107 +1,37 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="title_activity_home">Главная</string> - <string name="title_activity_review">Просмотр</string> - <string name="action_settings">Настройки</string> <string name="discard">Отмена</string> - <string name="select_transaction">Выберите транзакцию</string> - <string name="transaction_date">Дата транзакции</string> - <string name="recent_activity">Последняя активность</string> - <string name="last_synced">Последняя синхронизация:</string> - <string name="select_one">Выберите один</string> - <!-- Sign in --> - <string name="server">Сервер:</string> - <string name="sign_in">Войти в систему</string> - <string name="sign_in_to_your_account">Войдите в свою учетную запись</string> <string name="username">Имя пользователя</string> - <string name="password">Пароль</string> - <string name="forgot_password">Забыли пароль?</string> - <string name="recent_activities_loading_message">Загрузка последних действий...</string> <!-- Sync --> - <string name="metadata_sync_in_progress">Синхронизация метаданных...</string> <string name="metadata_sync_error">Невозможно завершить синхронизацию метаданных</string> - <string name="data_sync_in_progress">Синхронизация данных...</string> - <string name="data_sync_error">Невозможно завершить синхронизацию данных</string> - <string name="metadata_sync_completed">Синхронизация метаданных завершена!</string> - <string name="sync_completed">Синхронизация завершена!</string> <!-- FloatingActionButtons --> - <string name="proceed">Продолжить</string> <string name="review">Просмотр</string> - <string name="scan_barcode">Сканировать штрих-код</string> - <string name="scanning">Сканирование...</string> <string name="search_placeholder">Поиск...</string> <string name="delete">Удалить</string> <string name="ok">ОК</string> <string name="cancel">Отмена</string> - <string name="confirmation">Подтверждение</string> <string name="from">От</string> <string name="to">Доставка к...</string> - <!-- Languages --> - <string name="language_english">Английский язык</string> - <string name="language_french">Французский</string> - <string name="language_spanish">Испанский</string> - <string name="language_arabic">Арабский язык</string> - <string name="language_russian">Русский</string> - - <string name="language">Язык</string> - <string name="force_data_sync">Принудительная синхронизация данных</string> - <string name="logout">Выход из системы</string> - - - <!-- Stock table --> - <string name="item">Пункт</string> - <string name="prompt_email">адрес электронной почты</string> - <string name="prompt_password">Пароль</string> - <string name="action_sign_in">Войдите или зарегистрируйтесь</string> - <string name="action_sign_in_short">Войти в систему</string> - <string name="welcome">Добро пожаловать!</string> - <string name="invalid_username">Неверное имя пользователя</string> - <string name="invalid_password">Пароль должен состоять из более, чем 5 символов</string> - <string name="login_failed">Вход в систему не удался</string> - <string name="resync">Ресинхронизация</string> - - <!-- Errors --> - <string name="login_error">Невозможно войти в систему</string> - <string name="config_file_error">Невозможно загрузить файл конфигурации</string> - <string name="recent_activities_load_error">Невозможно загрузить последние действия</string> <!-- Content descriptions for accessibility --> - <string name="content_desc_sync_info">Информация о синхронизации</string> - <string name="content_desc_search">Поиск</string> - <string name="content_desc_clear_text">Очистить текст</string> - <string name="content_desc_last_sync">Последняя синхронизация</string> - <string name="content_desc_remove">Удалить элемент</string> - <string name="content_desc_recent_activity_status">Статус последней активности</string> - <string name="content_desc_close_info_guide">Закрыть информационный справочник</string> <string name="confirm_transaction_label">Подтвердить</string> - <string name="missing_configuration"> - В файле конфигурации отсутствует одно или несколько обязательных полей - </string> - <string name="select_language">Выберите желаемый язык</string> - - <string name="restart_later">Перезапустить позже</string> - <string name="language_change_dialog_title">Подтвердите перезапуск</string> - <string name="logout_error_message"> - Во время выхода из системы произошла ошибка. Пожалуйста, повторите попытку позже. - </string> - <string name="logout_success_message">Успешный выход из системы</string> - <string name="invalid_quantity">Недействительный</string> <string name="permission_granted">Разрешение получено</string> <string name="permission_denied">Разрешение отклонено</string> <string name="speech_network_error">Ошибка сети</string> <string name="speech_network_timeout_error">Время работы сети истекло</string> <string name="unknown_speech_error">Произошла неизвестная ошибка.</string> - <string name="no_network_available">Отсутствует сетевое подключение</string> <string name="unable_to_sync_data_no_network_available"> Невозможно синхронизировать данные из-за отсутствия сетевого подключения </string> + <!--SDK error codes--> <string name="login_error_unsuccessful_response">Что-то пошло не так. Пожалуйста, проверьте правильность URL-адреса сервера, имени пользователя и пароля и повторите попытку.</string> <string name="login_error_error_response">Упс! Что-то пошло не так на стороне сервера.</string> @@ -136,8 +66,6 @@ <string name="error_ssl">Возникла проблема с сертификатами сервера. Пожалуйста, свяжитесь с вашим администратором.</string> <string name="done_task">Главная</string> <string name="back">Назад</string> - <string name="no_conflicts_message">Для этой программы нет конфликтов</string> - <string name="action_sync">Отправить</string> <string name="not_saved">Не сохранено</string> <string name="count">Количество</string> <string name="under_review">На проверке</string> diff --git a/stock-usecase/src/main/res/values-si/strings.xml b/stock-usecase/src/main/res/values-si/strings.xml index 91b6b19be5d..4e53c4d4218 100644 --- a/stock-usecase/src/main/res/values-si/strings.xml +++ b/stock-usecase/src/main/res/values-si/strings.xml @@ -1,11 +1,9 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="discard">ඉවත ලන්න</string> - <string name="password">රහස්‍ය පදය</string> <string name="delete">ඉවත් කරන්න</string> - <string name="prompt_password">රහස්‍ය පදය</string> - <string name="content_desc_search">සොයන්න</string> + <!-- Content descriptions for accessibility --> + <string name="confirm_transaction_label">තහවුරු කරන්න</string> - <string name="invalid_quantity">අවලංගු</string> - <string name="action_sync">යවන්න</string> + <string name="count">ගණන</string> </resources> \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-sv/strings.xml b/stock-usecase/src/main/res/values-sv/strings.xml index c682b0fb798..c2e6ee78a34 100644 --- a/stock-usecase/src/main/res/values-sv/strings.xml +++ b/stock-usecase/src/main/res/values-sv/strings.xml @@ -1,27 +1,21 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="title_activity_home">Hem</string> - <string name="action_settings">Inställningar</string> <string name="discard">Kassera</string> - <string name="sign_in">Logga in</string> + <!-- Sign in --> <string name="username">Användarnamn</string> - <string name="password">Lösenord</string> - <string name="forgot_password">Glömt ditt lösenord?</string> - <!-- FloatingActionButtons --> - <string name="proceed">Fortsätta</string> <string name="delete">Radera</string> <string name="ok">ok</string> <string name="cancel">Avbryt</string> - <string name="prompt_email">E-post</string> - <string name="prompt_password">Lösenord</string> - <string name="action_sign_in_short">Logga in</string> - <string name="content_desc_search">Sök</string> + + <!-- Content descriptions for accessibility --> + <string name="confirm_transaction_label">Bekräfta</string> + <string name="online_search_parsing_error">Fel vid tolkning av resultat</string> <string name="done_task">Hem</string> <string name="back">Tillbaka</string> - <string name="action_sync">Skicka</string> <string name="count">Räkna</string> <string name="invalid_possitive_zero">Endast positiva tal eller noll tillåts</string> </resources> \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-tet/strings.xml b/stock-usecase/src/main/res/values-tet/strings.xml index f11e5d2fca1..ad03ceeeee1 100644 --- a/stock-usecase/src/main/res/values-tet/strings.xml +++ b/stock-usecase/src/main/res/values-tet/strings.xml @@ -1,20 +1,15 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="title_activity_home">Pájina inisial</string> - <string name="action_settings">Konfigurasaun</string> <string name="discard">Soe</string> - <string name="sign_in">Tama</string> + <!-- Sign in --> <string name="username">Utilizador nia Naran</string> - <string name="password">Seña</string> - <string name="forgot_password">Haluha seña?</string> <string name="delete">Soe</string> <string name="ok">OK</string> <string name="cancel">Kansela</string> - <string name="prompt_password">Seña</string> - <string name="action_sign_in_short">Tama</string> + <string name="done_task">Pájina inisial</string> <string name="back">Ba kotuk</string> - <string name="action_sync">Haruka</string> <string name="count">Konta</string> </resources> \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-tg/strings.xml b/stock-usecase/src/main/res/values-tg/strings.xml index 45193944048..52453d4d5bc 100644 --- a/stock-usecase/src/main/res/values-tg/strings.xml +++ b/stock-usecase/src/main/res/values-tg/strings.xml @@ -1,20 +1,18 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="title_activity_home">Саҳифаи асосӣ</string> - <string name="action_settings">Танзимот</string> + <!-- Sign in --> <string name="username">Номи корбар</string> - <string name="password">Парол</string> - <string name="forgot_password">Паролро фаромӯш кардед?</string> <string name="delete">Нест кардан</string> <string name="ok">OK</string> <string name="cancel">Бекор кардан</string> - <string name="prompt_email">Почтаи электронӣ</string> - <string name="prompt_password">Парол</string> - <string name="content_desc_search">Ҷустуҷӯ</string> + + <!-- Content descriptions for accessibility --> + <string name="confirm_transaction_label">Тасдиқ</string> + <string name="done_task">Саҳифаи асосӣ</string> <string name="back">Ба қафо</string> - <string name="action_sync">Фиристодан</string> <string name="count">Шумора</string> </resources> \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-uk/strings.xml b/stock-usecase/src/main/res/values-uk/strings.xml index 881a7e66631..9b5a949f2cc 100644 --- a/stock-usecase/src/main/res/values-uk/strings.xml +++ b/stock-usecase/src/main/res/values-uk/strings.xml @@ -1,16 +1,11 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="title_activity_home">Головна</string> - <string name="title_activity_review">Перегляд</string> - <string name="action_settings">Налаштування</string> <string name="discard">Ігнорувати</string> - <string name="sign_in">Увійти</string> + <!-- Sign in --> <string name="username">Ім\'я користувача</string> - <string name="password">Пароль</string> - <string name="forgot_password">Забули пароль?</string> <!-- FloatingActionButtons --> - <string name="proceed">Продовжити</string> <string name="review">Перегляд</string> <string name="search">Пошуковий елемент</string> @@ -18,19 +13,12 @@ <string name="delete">Видалити</string> <string name="ok">ОК</string> <string name="cancel">Скасувати</string> - <string name="from">Від</string> - <string name="language">Мова</string> - <string name="logout">Вийти</string> + <string name="from">Від</string> + <!-- Content descriptions for accessibility --> - <!-- Stock table --> - <string name="item">Елемент</string> - <string name="prompt_email">Електронна пошта</string> - <string name="prompt_password">Пароль</string> - <string name="action_sign_in_short">Увійти</string> - <string name="content_desc_search">Пошук</string> <string name="confirm_transaction_label">Підтвердити</string> - <string name="invalid_quantity">Невірне</string> + <!--SDK error codes--> <string name="login_error_unsuccessful_response">Сталася помилка. Будь ласка, перевірте правильність URL-адреси серверу, імені користувача та пароля і повторіть спробу.</string> <string name="login_error_unknown_host">Невідомий сервер</string> @@ -62,8 +50,6 @@ <string name="error_ssl">Виникла проблема із сертифікатами сервера. Будь ласка, зверніться до свого адміністратора.</string> <string name="done_task">Головна</string> <string name="back">Назад</string> - <string name="no_conflicts_message">Для цієї програми немає конфліктів</string> - <string name="action_sync">Надіслати</string> <string name="not_saved">Не збережено</string> <string name="count">Підрахунок</string> <string name="formatting_error">Помилка форматування</string> diff --git a/stock-usecase/src/main/res/values-ur/strings.xml b/stock-usecase/src/main/res/values-ur/strings.xml index d93e663e7dd..1fe5c9a7c5f 100644 --- a/stock-usecase/src/main/res/values-ur/strings.xml +++ b/stock-usecase/src/main/res/values-ur/strings.xml @@ -1,30 +1,20 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="title_activity_home">گھر</string> - <string name="action_settings">ترتیبات</string> <string name="discard">ذائل</string> - <string name="sign_in">داخلہ</string> + <!-- Sign in --> <string name="username">صارف کا ناÙ</string> - <string name="password">پاسورڈ</string> - <string name="forgot_password">پاسورڈ بھول گے؟</string> - <!-- FloatingActionButtons --> - <string name="proceed">آگے بڑھو</string> <string name="delete">حذف</string> <string name="ok">ٹھیک</string> <string name="cancel">منسوخ</string> + <string name="from">سے</string> - <string name="language">زبان</string> - <!-- Stock table --> - <string name="item">شے</string> - <string name="prompt_email">ای میل</string> - <string name="prompt_password">پاسورڈ</string> - <string name="action_sign_in_short">داخلہ</string> - <string name="content_desc_search">تلاش کریں</string> + <!-- Content descriptions for accessibility --> + <string name="confirm_transaction_label">تصدیق کریں</string> - <string name="invalid_quantity">غلط</string> + <string name="done_task">گھر</string> <string name="back">واپس</string> - <string name="action_sync">بھیجو</string> <string name="count">شمار</string> </resources> \ No newline at end of file diff --git a/stock-usecase/src/main/res/values-uz-rUZ/strings.xml b/stock-usecase/src/main/res/values-uz-rUZ/strings.xml index 01b684dd40a..7d8f6704aa4 100644 --- a/stock-usecase/src/main/res/values-uz-rUZ/strings.xml +++ b/stock-usecase/src/main/res/values-uz-rUZ/strings.xml @@ -1,146 +1,50 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name">Dorixona fondini boshqarish</string> <string name="title_activity_home">Бош саҳифа</string> - <string name="title_activity_review">Ko‘rib chiqish</string> - <string name="action_settings">Sozlamalar</string> <string name="distribution">Tarqatish</string> <string name="discard">Bekor qilish</string> <string name="correction">Tuzatish</string> - <string name="select_transaction">Tranzaksiyani tanlang</string> - <string name="transaction_date">Tranzaksiya sanasi</string> - <string name="recent_activity">Oxirgi faoliyat</string> - <string name="last_synced">Oxirgi sinxronlangan:</string> - <string name="select_facility">Tashkilotni tanlang</string> - <string name="distributed_to">ga tarqatiladi</string> - <string name="select_one">Birini tanlang</string> <!-- Sign in --> - <string name="server">Server:</string> - <string name="sign_in">Tizimga kirish</string> - <string name="sign_in_to_your_account">Akkauntingizga kiring</string> - <string name="sign_in_to_with_oidc">ICRC akkaunti orqali bilan tizimga kiring</string> - <string name="non_icrc_staff_members">Faqat ICRC bo\'lmagan xodimlar uchun</string> - <string name="icrc_staff_members">Faqat ICRC xodimlar uchun</string> <string name="username">Фойдаланувчи исми</string> - <string name="password">Parol</string> - <string name="forgot_password">Parolni unutdingizmi?</string> - - <string name="recent_activities_loading_message">Oxirgi harakatlar yuklanmoqda &amp; # 8230;</string> - <string name="recent_activities_empty_message">Siz hali hech qanday faoliyatni amalga oshirmayapsiz</string> <!-- Sync --> - <string name="metadata_sync_in_progress">Metadata sinxronlanmoqda &amp; # 8230;</string> <string name="metadata_sync_error">Meta-maʼlumotlarni sinxronlash tugallanmadi</string> - <string name="data_sync_in_progress">Ma\'lumotlarni sinxronlash &amp; # 8230;</string> - <string name="data_sync_error">Maʼlumotlarni sinxronlash tugallanmadi</string> - <string name="metadata_sync_completed">Metadata sinxronlash tugallandi!</string> - <string name="sync_completed">Sinxronlash tugallandi!</string> <!-- FloatingActionButtons --> - <string name="proceed">Davom eting</string> <string name="review">Ko‘rib chiqish</string> - <string name="scan_barcode">Shtrix-kodni skanerlash</string> - <string name="scanning">Skanerlash &amp; # 8230;</string> <string name="search">Elementni qidirish</string> <string name="search_placeholder">Излаш...</string> <string name="delete">Oʼchirib tashlash</string> <string name="ok">OK</string> <string name="cancel">Бекор қилиш</string> - <string name="confirmation">Тасдиқлаш</string> <string name="from">Dan</string> <string name="to">Етказиб бериш ... га</string> <string name="subtitle">%s</string> - <string name="to_arg"> %s ga</string> <!-- Languages --> - <string name="language_english">Inglizcha</string> - <string name="language_french">Fransuzcha</string> - <string name="language_spanish">Ispancha</string> - <string name="language_arabic">Arabcha</string> - <string name="language_russian">Ruscha</string> <!-- Settings --> - <string name="use_microphone_for_data_entry">Ma\'lumotlarni kiritish uchun mikrofondan foydalaning</string> - <string name="language">Til</string> - <string name="force_data_sync">Маълумотларни мажбурий синхронлаш</string> - <string name="logout">Chiqib ketish</string> - <!-- Stock table --> - <string name="item">Element</string> - <string name="stock_on_hand">Захирада бор</string> <string name="quantity">Миқдори</string> - <string name="items_available">мавжуд нарсалар</string> - <string name="positive_value"> - <b>Позитив қиймат</b> = \"етмаган қиймат\" (<i>жисмоний захира ҳисобдаги қийматдан кам</i>) - </string> - <string name="negative_value"> - <b><span style="color: #C81818">Манфий қиймат</span></b> = \"захирада мавжуд\" (<i>жисмоний захирада ҳисобдаги қийматдан кўп</i>) - </string> <!-- Messages --> - <string name="mandatory_transaction_selection"> -Жараён давом этишидан олдин, Транзакция тури танланган бўлиши ва барча катаклар тўлдирилган бўлиши шарт -</string> <string name="mandatory_facility_selection">Davom etishdan oldin tashkilot maydoni to\'ldirilishi kerak</string> - <string name="mandatory_transaction_date_selection">Davom etishdan oldin “Tarqatilgan” maydoni to‘ldirilishi kerak</string> <string name="transaction_completed">Tranzaksiya muvaffaqiyatli yakunlandi!</string> - <string name="transaction_cancelled">Tranzaksiya muvaffaqiyatli bekor qilindi!</string> - <plurals name="items_found"> - <item quantity="other">%d нарсалар</item> - </plurals> - <string name="no_items_found">Бирор нарса топилмади</string> - <string name="loading_items_message">Нарсалар захираси юкланмоқда &#8230;</string> - <string name="prompt_email">ye-Pochta</string> - <string name="prompt_password">Parol</string> - <string name="action_sign_in">Киринг ёки рўйхатдан ўтинг</string> - <string name="action_sign_in_short">Tizimga kirish</string> - <string name="welcome">Хуш келибсиз!</string> - <string name="invalid_username">Яроқсиз исм</string> - <string name="invalid_password">Пароль 5 та белгидан кўп бўлиши керак</string> - <string name="login_failed">Логин хато</string> - <string name="resync">Қайта синхронлаш</string> <!-- Errors --> - <string name="login_error">Мавжуд бўлмаган логин</string> - <string name="config_file_error">Konfiguratsiya faylini yuklab bo‘lmadi</string> - <string name="config_file_program_error">Birja dasturi identifikatori konfiguratsiya faylida o\'rnatilmagan</string> - <string name="recent_activities_load_error">Oxirgi harakatlaringiz yuklanmadi</string> <string name="facilities_load_error">Mavjud imkoniyatlar roʻyxatini yuklab boʻlmadi</string> <string name="destinations_load_error">Mavjud manzillar roʻyxatini yuklab boʻlmadi</string> - <string name="distribution_data_element_load_error">Tarqatish maʼlumotlari elementini yuklab boʻlmadi</string> - <string name="correction_data_element_load_error">Tuzatish maʼlumotlari elementini yuklab boʻlmadi</string> - <string name="discard_data_element_load_error">Yo‘qotilgan ma’lumotlar elementini yuklab bo‘lmadi</string> <!-- Content descriptions for accessibility --> - <string name="content_desc_sync_info">Ma\'lumotni sinxronlash</string> - <string name="content_desc_search">Izlash</string> - <string name="content_desc_clear_text">Matnni tozalash</string> - <string name="content_desc_transaction_date">Sana tanlagichni ko\'rsatish</string> - <string name="content_desc_distributed_to">ga tarqatiladi</string> - <string name="content_desc_last_sync">Oxirgi sinxronlangan</string> - <string name="content_desc_quantity_info">Miqdori haqida ko\'proq ma\'lumot</string> - <string name="content_desc_remove">Elementni olib tashlang</string> - <string name="content_desc_recent_activity">Yo\'nalish o\'qi</string> - <string name="content_desc_recent_activity_status">Oxirgi faoliyat holati</string> - <string name="content_desc_close_info_guide">Ma\'lumot yo\'riqnomasini yoping</string> <string name="confirm_transaction_label">Tasdiqlang</string> - <string name="missing_configuration">Konfiguratsiya faylida bir yoki bir nechta talab qilinadigan maydonlar mavjud emas</string> - <string name="select_language">O\'zingiz xohlagan tilni tanlang</string> - - <string name="restart_later">Keyinroq qayta ishga tushirish</string> - <string name="language_change_dialog_title">Qayta ishga tushirishni tasdiqlang</string> - <string name="scan_canceled">Skanerlash bekor qilindi!</string> - <string name="logout_error_message">Chiqish paytida xatolik yuz berdi. Keyinroq qayta urinib ko‘ring.</string> - <string name="logout_success_message">Akkauntdan muvaffaqiyatli chiqdi</string> - <string name="invalid_quantity">Yaroqsiz</string> <string name="stock_on_hand_exceeded_message">Qo\'ldagi mavjud zaxiradan oshib bo\'lmaydi</string> - <string name="reviewed_item_cannot_be_empty_message">Ko\'rib chiqilayotgan aktsiya bo\'sh bo\'lishi mumkin emas. Agar xohlamasangiz, elementni olib tashlashingiz mumkin</string> <string name="permission_granted">Ruxsat berilgan</string> <string name="permission_denied">Ruxsat berilmadi</string> @@ -157,12 +61,8 @@ <string name="speech_timeout_error">Ovozli matn aniqlanmadi</string> <string name="unknown_speech_error">Номаълум хатолик юз берди</string> <string name="non_numeric_speech_input_error">Raqamsiz kiritishga ruxsat berilmagan: \"%s\"</string> - <string name="negative_number_speech_input_error">Raqamni salbiy kiritish mumkin emas: \"%s\" - </string> + <string name="negative_number_speech_input_error">Raqamni salbiy kiritish mumkin emas: \"%s\"\n </string> - <string name="openid_config_load_error">OpenID konfiguratsiyasini yuklab boʻlmadi</string> - <string name="unexpected_openid_authentication_error">OpenID bilan autentifikatsiya qilishda kutilmagan xatolik yuz berdi</string> - <string name="no_network_available">Tarmoq ulanishi mavjud emas</string> <string name="unable_to_sync_data_no_network_available">Maʼlumotlarni sinxronlash imkonsiz, chunki tarmoq ulanishi mavjud emas</string> <string name="openid_authentication_not_successful">ICRC akkauntingiz bilan autentifikatsiya qilish imkonsiz</string> @@ -175,8 +75,6 @@ <string name="online_search_parsing_error">Natijalarni tahlil qilishda xatolik yuz berdi</string> <string name="done_task">Бош саҳифа</string> <string name="back">Orqaga</string> - <string name="no_conflicts_message">Ushbu dastur uchun hech qanday nizolar mavjud emas</string> - <string name="action_sync">Yuborish</string> <string name="count">Ҳисоблаш</string> <string name="formatting_error">Formatlashda xatolik</string> <string name="invalid_possitive_zero">Faqat musbat raqamlar yoki nolga ruxsat beriladi</string> diff --git a/stock-usecase/src/main/res/values-uz/strings.xml b/stock-usecase/src/main/res/values-uz/strings.xml index da5cf96b3f9..25dd38ef719 100644 --- a/stock-usecase/src/main/res/values-uz/strings.xml +++ b/stock-usecase/src/main/res/values-uz/strings.xml @@ -1,117 +1,45 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name">Дорихона фондини бошқариш</string> <string name="title_activity_home">Бош саҳифа</string> - <string name="title_activity_review">Кўриб чиқиш</string> - <string name="action_settings">Созламалар</string> <string name="distribution">Тарқатиш</string> <string name="discard">Бекор қилиш</string> <string name="correction">Тузатиш</string> - <string name="select_transaction">Транзакцияни танлаш</string> - <string name="transaction_date">Транзакция санаси</string> - <string name="recent_activity">Охирги фаолият</string> - <string name="last_synced">Охирги марта синхронланган:</string> - <string name="select_facility">Ташкилотни танлаш</string> - <string name="distributed_to">... га тарқатиш</string> - <string name="select_one">Биртасини танлаш</string> <!-- Sign in --> - <string name="server">Сервер:</string> - <string name="sign_in">Тизимга кириш</string> - <string name="sign_in_to_your_account">Ўз аккаунтингизга киринг</string> - <string name="sign_in_to_with_oidc">CRC аккаунти орқали киринг</string> - <string name="non_icrc_staff_members">ICRC ходимлари бўлмаганлар учун</string> - <string name="icrc_staff_members">ICRC ходимлари учун</string> <string name="username">Фойдаланувчи исми</string> - <string name="password">Пароль</string> - <string name="forgot_password">Паролни унутдингизми?</string> - - <string name="recent_activities_loading_message">Охирги фаоллик юкланмоқда &#8230;</string> - <string name="recent_activities_empty_message">Ҳозирда ҳеч қандай фаоллик амалга оширилмаган</string> <!-- Sync --> - <string name="metadata_sync_in_progress">Метамаълумотлар синхронизацияси&#8230;</string> <string name="metadata_sync_error">Метамаълумотлар синхронизациясини якунлаш имконсиз</string> - <string name="data_sync_in_progress">Маълумотлар синхронизацияси&#8230;</string> - <string name="data_sync_error">Маълумотлар синхронизациясини якунлаш имконсиз</string> - <string name="metadata_sync_completed">Метамаълумотлар синхронизацияси якунланди</string> - <string name="sync_completed">Синхронлаш якунланди!</string> <!-- FloatingActionButtons --> - <string name="proceed">Давом этинг</string> <string name="review">Кўриб чиқиш</string> - <string name="scan_barcode">Баркодни сканерлаш</string> - <string name="scanning">Сканерлаш&#8230;</string> <string name="search">Элементни излаш</string> <string name="search_placeholder">Излаш...</string> <string name="delete">Ўчириб ташлаш</string> <string name="ok">ОК</string> <string name="cancel">Бекор қилиш</string> - <string name="confirmation">Тасдиқлаш</string> <string name="from">Кимдан</string> <string name="to">Етказиб бериш ... га</string> <string name="subtitle">%s</string> - <string name="to_arg"> %s га</string> <!-- Languages --> - <string name="language_english">Инглиз</string> - <string name="language_french">Француз</string> - <string name="language_spanish">Испан</string> - <string name="language_arabic">Арабча</string> - <string name="language_russian">Русча</string> <!-- Settings --> - <string name="use_microphone_for_data_entry">Маълумотларни киритиш учун микрофондан фойдаланиш</string> - <string name="language">Тил</string> - <string name="force_data_sync">Маълумотларни мажбурий синхронлаш</string> - <string name="logout">Чиқиб кетиш</string> - <!-- Stock table --> - <string name="item">Элемент</string> - <string name="stock_on_hand">Захирада бор</string> <string name="quantity">Миқдори</string> - <string name="items_available">мавжуд нарсалар</string> - <string name="positive_value"> - <b>Позитив қиймат</b> = \"етмаган қиймат\" (<i>жисмоний захира ҳисобдаги қийматдан кам</i>) - </string> - <string name="negative_value"> - <b><span style="color: #C81818">Манфий қиймат</span></b> = \"захирада мавжуд\" (<i>жисмоний захирада ҳисобдаги қийматдан кўп</i>) - </string> - <!-- Messages --> - <string name="mandatory_transaction_selection"> -Жараён давом этишидан олдин, Транзакция тури танланган бўлиши ва барча катаклар тўлдирилган бўлиши шарт -</string> - <plurals name="items_found"> - <item quantity="other">%d нарсалар</item> - </plurals> - <string name="no_items_found">Бирор нарса топилмади</string> - <string name="loading_items_message">Нарсалар захираси юкланмоқда &#8230;</string> - <string name="prompt_email">е-Почта</string> - <string name="prompt_password">Пароль</string> - <string name="action_sign_in">Киринг ёки рўйхатдан ўтинг</string> - <string name="action_sign_in_short">Тизимга кириш</string> - <string name="welcome">Хуш келибсиз!</string> - <string name="invalid_username">Яроқсиз исм</string> - <string name="invalid_password">Пароль 5 та белгидан кўп бўлиши керак</string> - <string name="login_failed">Логин хато</string> - <string name="resync">Қайта синхронлаш</string> + <!-- Content descriptions for accessibility --> - <!-- Errors --> - <string name="login_error">Мавжуд бўлмаган логин</string> - <string name="content_desc_search">Қидириш</string> - <string name="content_desc_distributed_to">... га тарқатиш</string> <string name="confirm_transaction_label">Тасдиқланг</string> - <string name="invalid_quantity">Яроқсиз</string> + <string name="speech_network_error">Тармоқда хатолик</string> <string name="online_search_parsing_error">Натижаларни таҳлил қилишда хатолик юз берди</string> <string name="done_task">Бош саҳифа</string> <string name="back">Орқага</string> - <string name="no_conflicts_message">Ушбу дастур учун ҳеч қандай низолар мавжуд эмас</string> - <string name="action_sync">Юбориш</string> <string name="count">Ҳисоблаш</string> <string name="formatting_error">Форматлашда хатолик</string> <string name="invalid_possitive_zero">Фақат мусбат рақамлар ёки нолга рухсат берилади</string> diff --git a/stock-usecase/src/main/res/values-vi/strings.xml b/stock-usecase/src/main/res/values-vi/strings.xml index 1939695e9d3..1d4e2869417 100644 --- a/stock-usecase/src/main/res/values-vi/strings.xml +++ b/stock-usecase/src/main/res/values-vi/strings.xml @@ -1,172 +1,58 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name">Quản lý kho dược phẩm</string> <string name="title_activity_home">Trang chủ</string> - <string name="title_activity_review">Xem xét</string> - <string name="action_settings">Cài đặt</string> <string name="distribution">Phân bổ</string> <string name="discard">Hủy bỏ</string> <string name="correction">Điểu chỉnh</string> - <string name="select_transaction">Chọn giao dịch</string> - <string name="transaction_date">Ngày giao dịch</string> - <string name="recent_activity">Hoạt động gần đây</string> - <string name="last_synced">Đồng bộ lần cuối :</string> - <string name="select_facility">Chọn cơ sở</string> - <string name="distributed_to">Phân bổ đến</string> - <string name="select_one">Chọn một</string> <!-- Sign in --> - <string name="server">Máy chủ : </string> - <string name="sign_in">Đăng nhập</string> - <string name="sign_in_to_your_account">Đăng nhập vào tài khoản của bạn</string> - <string name="sign_in_to_with_oidc">Đăng nhập với tài khoản ICRC</string> - <string name="non_icrc_staff_members">Chỉ dành cho nhân viên ngoài ICRC</string> - <string name="icrc_staff_members">Chỉ dành cho nhân viên ICRC</string> <string name="username">Tên đăng nhập</string> - <string name="password">Mật khẩu</string> - <string name="forgot_password">Quên mật khẩu?</string> - - <string name="recent_activities_loading_message">Đang tải các hoạt động gần đây&#8230;</string> - <string name="recent_activities_empty_message">Bạn chưa thực hiện bất kỳ hoạt động nào</string> <!-- Sync --> - <string name="metadata_sync_in_progress">Đang đồng bộ siêu dữ liệu&#8230;</string> <string name="metadata_sync_error">Không thể hoàn thành đồng bộ siêu dữ liệu</string> - <string name="data_sync_in_progress">Đang đồng bộ dữ liệu&#3230;</string> - <string name="data_sync_error">Không thể hoàn thành đồng bộ dữ liệu</string> - <string name="metadata_sync_completed">Đồng bộ siêu dữ liệu đã hoàn tất!</string> - <string name="sync_completed">Đồng bộ đã hoàn tất!</string> <!-- FloatingActionButtons --> - <string name="proceed">Tiến hành</string> <string name="review">Xem xét</string> - <string name="scan_barcode">Quét mã vạch</string> - <string name="scanning">Đang quét&#8230;</string> <string name="search">Tìm kiếm</string> <string name="search_placeholder">Tìm kiếm...</string> <string name="delete">Xóa</string> <string name="ok">OK</string> <string name="cancel">Hủy</string> - <string name="confirmation">Xác nhận</string> <string name="from">Từ</string> <string name="to">Gửi đến...</string> <string name="subtitle">%s</string> - <string name="to_arg">Đến %s</string> <!-- Languages --> - <string name="language_english">Tiếng Anh</string> - <string name="language_french">Tiếng Pháp</string> - <string name="language_spanish">Tiếng Tây Ban Nha</string> - <string name="language_arabic">Tiếng Ả Rập</string> - <string name="language_russian">Tiếng Nga</string> <!-- Settings --> - <string name="use_microphone_for_data_entry">Dùng micro để nhập dữ liệu</string> - <string name="language">Ngôn ngữ</string> - <string name="force_data_sync">Buộc đồng bộ dữ liệu</string> - <string name="logout">Đăng xuất</string> - <!-- Stock table --> - <string name="item">Mặt hàng</string> - <string name="stock_on_hand">Hàng có sẵn</string> <string name="quantity">Số lượng</string> - <string name="items_available">Các mặt hàng có sẵn</string> - <string name="positive_value"> - <b>Giá trị dương</b>= \"số lượng thiếu\" (<i>số lượng thực tế ít hơn giá trị được tính toán</i>) - </string> - <string name="negative_value"> - <b><span style="color: #C81818">Giá trị âm</span></b>= \"đang có trong kho\" (<i>số lượng thực tế nhiều hơn giá trị được tính toán</i>) - </string> <!-- Messages --> - <string name="mandatory_transaction_selection"> - Chọn Kiểu giao dịch và điền đầy đủ tất cả các trường trước khi bạn có thể tiếp tục - </string> <string name="mandatory_facility_selection"> Điền đầy đủ các trường dữ liệu cơ sở trước khi bạn có thể tiếp tục </string> - <string name="mandatory_transaction_date_selection"> - Trường \"Phân bổ đến\" phải được điền đầy đủ trước khi tiếp tục - </string> <string name="transaction_completed"> Giao dịch vưa được hoàn thành! </string> - <string name="transaction_cancelled"> - Giao dịch đã được hủy bỏ - </string> - <plurals name="items_found"> - <item quantity="other">%d mặt hàng</item> - </plurals> - <string name="no_items_found">Không tìm thấy mặt hàng nào</string> - <string name="loading_items_message">Đang tải các mặt hàng trong kho &#8230;</string> - <string name="prompt_email">Thư điện tử</string> - <string name="prompt_password">Mật khẩu</string> - <string name="action_sign_in">Đặng nhập hoặc đăng ký</string> - <string name="action_sign_in_short">Đăng nhập</string> - <string name="welcome">Xin chào !</string> - <string name="invalid_username">Tên đăng nhập không đúng</string> - <string name="invalid_password">Mật khẩu phải có >5 ký tự</string> - <string name="login_failed">Đăng nhập không thành công</string> - <string name="resync">Đồng bộ lại</string> <!-- Errors --> - <string name="login_error">Không thể đăng nhập</string> - <string name="config_file_error">Không thể tải tập tin cấu hình</string> - <string name="config_file_program_error"> - Mã chương trình Kho lưu trữ chưa được cài trong tập tin cấu hình - </string> - <string name="recent_activities_load_error">Không thể tải các hoạt động gần đây của bạn</string> <string name="facilities_load_error">Không thể tải danh sách các cơ sở hiện có</string> <string name="destinations_load_error"> Không thể tải danh sách các điểm đến hiện có </string> - <string name="distribution_data_element_load_error"> - Không thể tải phần tử dữ liệu phân bổ - </string> - <string name="correction_data_element_load_error"> - Không thể tải phần tử dữ liệu chỉnh sửa - </string> - <string name="discard_data_element_load_error"> - Không thể tải phần tử dữ liệu loại bỏ - </string> <!-- Content descriptions for accessibility --> - <string name="content_desc_sync_info">Thông tin đồng bộ</string> - <string name="content_desc_search">Tìm kiếm</string> - <string name="content_desc_clear_text">Xóa văn bản</string> - <string name="content_desc_transaction_date">Hiển thị bộ chọn ngày</string> - <string name="content_desc_distributed_to">Phân bổ đến</string> - <string name="content_desc_last_sync">Đồng bộ lần cuối</string> - <string name="content_desc_quantity_info">Thêm thông tin về số lượng</string> - <string name="content_desc_remove">Bỏ mặt hàng</string> - <string name="content_desc_recent_activity">Mũi tên chỉ hướng</string> - <string name="content_desc_recent_activity_status">Trạng thái hoạt động gần đây</string> - <string name="content_desc_close_info_guide">Đóng thông tin hướng dẫn</string> <string name="confirm_transaction_label">Xác nhận</string> - <string name="missing_configuration"> - Một hoặc nhiều trường bị thiếu trong tập tinh cấu hình - </string> - <string name="select_language">Chọn ngôn ngữ yêu thích</string> - <string name="restart_later">Khởi động lại sau</string> - <string name="language_change_dialog_title">Xác nhận Khởi động lại</string> - <string name="scan_canceled">Đã hủy quét!</string> - <string name="logout_error_message"> - Có một lỗi xuất hiện trong khi đăng xuất. Xin vui lòng thử lại sau. - </string> - <string name="logout_success_message">Đăng xuất thành công</string> - - <string name="invalid_quantity">Không hợp lệ</string> <string name="stock_on_hand_exceeded_message"> Số lượng hàng có sẵn không thể vượt quá </string> - <string name="reviewed_item_cannot_be_empty_message"> - Một kho đang được kiểm tra không thể để trống. Bạn có thể gỡ bỏ các mặt hàng nếu không muốn - </string> <string name="permission_granted">Đã được cho phép</string> <string name="permission_denied">Quyền bị tự chối</string> @@ -187,25 +73,11 @@ <string name="speech_timeout_error">Không nhận được đầu vào bằng giọng nói</string> <string name="unknown_speech_error">Một lỗi không xác định đã xuất hiện.</string> <string name="non_numeric_speech_input_error">Không chấp nhận đầu vào không phải là số: \"%s\"</string> - <string name="negative_number_speech_input_error"> - Không chấp nhận đầu vào là số âm: \"%s\" - </string> + <string name="negative_number_speech_input_error">\n Không chấp nhận đầu vào là số âm: \"%s\"\n </string> - <string name="openid_config_load_error">Không thể tải cấu hình OpenID</string> - <string name="unexpected_openid_authentication_error"> - Một lỗi không mong muốn đã xuất hiện trong khi đang xác thực bằng OpenID - </string> - <string name="no_network_available">Không có kết nối internet</string> <string name="unable_to_sync_data_no_network_available"> Không thể đồng bộ hóa dữ liệu bởi vì không có kết nối internet </string> - <string name="openid_authentication_not_successful"> - Không thể xác thực bằng tài khoảng ICRC của bạn - </string> - - <string name="contact_service_desk_message"> - Trong trường hợp có vấn đề, \nxin vui lòng liên hệ bàn hướng dẫn ICRC - </string> <!--SDK error codes--> <string name="login_error_unsuccessful_response">Có gì đó không đúng. Vui lòng kiểm tra đường dẫn liên kết đến máy chủ, tên đăng nhập, mật khẩu và thử lại.</string> @@ -243,8 +115,6 @@ <string name="error_ssl">Có vấn đề với chứng nhận máy chủ. Vui lòng liên hệ với quản lý của bạn.</string> <string name="done_task">Trang chủ</string> <string name="back">Quay lại</string> - <string name="no_conflicts_message">Không có xung đột trong trường trình này</string> - <string name="action_sync">Gửi đi</string> <string name="from_facility">Từ cơ sở</string> <string name="to_facility">Đến cơ sở</string> <string name="stock">Kho</string> diff --git a/stock-usecase/src/main/res/values-zh-rCN/strings.xml b/stock-usecase/src/main/res/values-zh-rCN/strings.xml index 1739d270056..885c57be8ac 100644 --- a/stock-usecase/src/main/res/values-zh-rCN/strings.xml +++ b/stock-usecase/src/main/res/values-zh-rCN/strings.xml @@ -1,35 +1,22 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="title_activity_home">Home</string> - <string name="title_activity_review">审查</string> - <string name="action_settings">设置</string> <string name="discard">放弃</string> - <string name="sign_in">登记</string> + <!-- Sign in --> <string name="username">用户名</string> - <string name="password">口令</string> - <string name="forgot_password">忘记口令</string> <!-- FloatingActionButtons --> - <string name="proceed">处理</string> <string name="review">审查</string> <string name="delete">删除</string> <string name="ok">OK</string> <string name="cancel">取消</string> - <string name="from">从</string> - <string name="language">语言</string> - <string name="logout">退出</string> + <string name="from">从</string> + <!-- Content descriptions for accessibility --> - <!-- Stock table --> - <string name="item">条目</string> - <string name="prompt_email">邮件</string> - <string name="prompt_password">口令</string> - <string name="action_sign_in">注册</string> - <string name="action_sign_in_short">登记</string> - <string name="content_desc_search">搜索</string> <string name="confirm_transaction_label">确认</string> - <string name="invalid_quantity">无效</string> + <string name="speech_network_error">网络错误</string> <string name="unknown_speech_error">出现未知错误。</string> <!--SDK error codes--> @@ -63,8 +50,6 @@ <string name="error_ssl">服务器证书有问题。请联系您的管理员。</string> <string name="done_task">Home</string> <string name="back">后退</string> - <string name="no_conflicts_message">该项目没有冲突。</string> - <string name="action_sync">发送</string> <string name="not_saved">未保存</string> <string name="count">计数</string> <string name="formatting_error">格式化错误</string> diff --git a/stock-usecase/src/main/res/values-zh/strings.xml b/stock-usecase/src/main/res/values-zh/strings.xml index 0369fa09606..df018ade13f 100644 --- a/stock-usecase/src/main/res/values-zh/strings.xml +++ b/stock-usecase/src/main/res/values-zh/strings.xml @@ -1,97 +1,43 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name">药房库存管理</string> <string name="title_activity_home">首页</string> - <string name="title_activity_review">审查</string> - <string name="action_settings">设置</string> <string name="distribution">分配</string> <string name="discard">放弃</string> <string name="correction">更正</string> - <string name="select_transaction">选择交易</string> - <string name="transaction_date">交易日期</string> - <string name="recent_activity">近期活动</string> - <string name="last_synced">上次同步:</string> - <string name="select_facility">选择机构设施</string> - <string name="distributed_to">分发给</string> - <string name="select_one">选择一个</string> <!-- Sign in --> - <string name="server">服务器:</string> - <string name="sign_in">登录</string> - <string name="sign_in_to_your_account">登录到您的帐户</string> - <string name="sign_in_to_with_oidc">使用红十字国际委员会账户登录</string> - <string name="non_icrc_staff_members">仅适用于非红十字国际委员会工作人员</string> - <string name="icrc_staff_members">仅适用于红十字国际委员会工作人员</string> <string name="username">用户名</string> - <string name="password">口令</string> - <string name="forgot_password">忘记密码\?</string> - - <string name="recent_activities_loading_message">正在加载最近的活动&#8230;</string> - <string name="recent_activities_empty_message">您尚未执行任何活动</string> <!-- Sync --> - <string name="metadata_sync_in_progress">同步元数据&#8230;</string> <string name="metadata_sync_error">无法完成元数据同步</string> - <string name="data_sync_in_progress">同步数据&#8230;</string> - <string name="data_sync_error">无法完成数据同步</string> - <string name="metadata_sync_completed">元数据同步完成!</string> - <string name="sync_completed">同步完成!</string> <!-- FloatingActionButtons --> - <string name="proceed">处理</string> <string name="review">审查</string> - <string name="scan_barcode">扫描条码</string> - <string name="scanning">扫描&#8230;</string> <string name="search">搜索项目</string> <string name="search_placeholder">搜索…</string> <string name="delete">删除</string> <string name="ok">好</string> <string name="cancel">取消</string> - <string name="confirmation">确认</string> <string name="from">从</string> <string name="to">送货至……</string> <string name="subtitle">%s</string> - <string name="to_arg">至 %s</string> <!-- Languages --> - <string name="language_english">英语</string> - <string name="language_french">法语</string> - <string name="language_spanish">西班牙语</string> - <string name="language_arabic">阿拉伯</string> - <string name="language_russian">俄语</string> <!-- Settings --> - <string name="use_microphone_for_data_entry">使用麦克风输入数据</string> - <string name="language">语言</string> - <string name="force_data_sync">强制数据同步</string> - <string name="logout">退出</string> - <!-- Stock table --> - <string name="item">条目</string> - <string name="stock_on_hand">现货</string> <string name="quantity">数量</string> - <string name="items_available">可用项目</string> - <string name="positive_value"> - <b> 正值 </b> = \"缺失数量\" ( <i> 实物库存小于计算值 </i> ) - </string> - <string name="negative_value"> - <b> <span style="color: #C81818"> 负值 </span> </b> = \"found in stock\" (<i> 实物库存大于计算值 </i> ) - </string> <!-- Messages --> - <string name="mandatory_transaction_selection"> - 必须选择交易类型并且必须填写所有字段才能继续 - </string> <string name="mandatory_facility_selection"> 必须先填写设施字段,然后才能继续 </string> <string name="mandatory_distributed_to_selection">\\n 必须填写 \"分发至 \"字段后才能继续操作</string> - <string name="mandatory_transaction_date_selection"> - 必须填写“分发给”字段才能继续 - </string> + <string name="mandatory_transaction_date_selection">\n 必须填写“分发给”字段才能继续\n </string> <string name="previous_page_lose_data_warning">\\n 您确定要返回上一屏幕吗?\\n 如果您决定继续,您将丢失刚刚输入的数据。\\n </string> <string name="transaction_completed"> 交易成功完成! @@ -122,42 +68,14 @@ <string name="resync">重新同步</string> <!-- Errors --> - <string name="login_error">无法登入</string> - <string name="config_file_error">无法加载配置文件</string> - <string name="config_file_program_error"> - 配置文件中没有设置股票节目id - </string> - <string name="recent_activities_load_error">无法加载您最近的活动</string> <string name="facilities_load_error">无法加载可用设施列表</string> <string name="destinations_load_error"> 无法加载可用目的地列表 </string> - <string name="distribution_data_element_load_error"> - 无法加载分布数据元素 - </string> - <string name="correction_data_element_load_error"> - 无法加载校正数据元素 - </string> - <string name="discard_data_element_load_error">无法加载丢弃的数据元素</string> <!-- Content descriptions for accessibility --> - <string name="content_desc_sync_info">同步信息</string> - <string name="content_desc_search">搜索</string> - <string name="content_desc_clear_text">明文</string> - <string name="content_desc_transaction_date">显示日期选择器</string> - <string name="content_desc_distributed_to">分发给</string> - <string name="content_desc_last_sync">上次同步</string> - <string name="content_desc_quantity_info">有关数量的更多信息</string> - <string name="content_desc_remove">除去项目</string> - <string name="content_desc_recent_activity">方向箭头</string> - <string name="content_desc_recent_activity_status">近期活动状态</string> - <string name="content_desc_close_info_guide">关闭信息指南</string> <string name="confirm_transaction_label">确认</string> - <string name="missing_configuration"> - 配置文件中缺少一个或多个必填字段 - </string> - <string name="select_language">选择您想要的语言</string> <string name="restart_later">稍后重启</string> <string name="confirm_app_restart_message">\\n 需要重新启动应用程序才能使更改生效,但是,\\n 任何未保存的更改都将丢失。\\n\\n您要继续重启\吗?\\n </string> @@ -172,9 +90,6 @@ <string name="stock_on_hand_exceeded_message"> 手头的可用库存不能超过 </string> - <string name="reviewed_item_cannot_be_empty_message"> - 审核中的股票不能为空。如果不需要,您可以删除该项目 - </string> <string name="permission_granted">许可授予</string> <string name="permission_denied">没有权限</string> @@ -195,25 +110,11 @@ <string name="speech_timeout_error">未检测到语音输入</string> <string name="unknown_speech_error">出现未知错误。</string> <string name="non_numeric_speech_input_error">不允许非数字输入:“%s”</string> - <string name="negative_number_speech_input_error"> - 不允许输入负数:“%s” - </string> + <string name="negative_number_speech_input_error">\n 不允许输入负数:“%s”\n </string> - <string name="openid_config_load_error">无法加载 OpenID 配置</string> - <string name="unexpected_openid_authentication_error"> - 使用 OpenID 进行身份验证时发生意外错误 - </string> - <string name="no_network_available">没有可用的网络连接</string> <string name="unable_to_sync_data_no_network_available"> 无法同步数据,因为没有可用的网络连接 </string> - <string name="openid_authentication_not_successful"> - 无法使用您的红十字国际委员会账户进行身份验证 - </string> - - <string name="contact_service_desk_message"> - 如有问题,\n请联系红十字国际委员会服务台 - </string> <!--SDK error codes--> <string name="login_error_unsuccessful_response">出了些问题。请检查服务器 URL、用户名和密码是否正确,然后重试。</string> @@ -251,8 +152,6 @@ <string name="error_ssl">服务器证书有问题。请联系您的管理员。</string> <string name="done_task">首页</string> <string name="back">后退</string> - <string name="no_conflicts_message">该项目没有冲突。</string> - <string name="action_sync">发送</string> <string name="from_facility">从设施</string> <string name="to_facility">到设施</string> <string name="stock">库存</string> diff --git a/stock-usecase/src/main/res/values/strings.xml b/stock-usecase/src/main/res/values/strings.xml index 67f97da9f9e..692c739076f 100644 --- a/stock-usecase/src/main/res/values/strings.xml +++ b/stock-usecase/src/main/res/values/strings.xml @@ -1,216 +1,69 @@ <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name">Pharmacy Stock Management</string> <string name="title_activity_home">Home</string> - <string name="title_activity_review">Review</string> - <string name="action_settings">Settings</string> <string name="distribution">Distribution</string> <string name="discard">Discard</string> <string name="correction">Correction</string> - <string name="select_transaction">Select transaction</string> - <string name="transaction_date">Date of Transaction</string> - <string name="recent_activity">Recent Activity</string> - <string name="last_synced">Last synced:</string> - <string name="select_facility">Select Facility</string> - <string name="distributed_to">Distributed to</string> - <string name="select_one">Select one</string> <!-- Sign in --> - <string name="server">Server:</string> - <string name="sign_in">Sign in</string> - <string name="sign_in_to_your_account">Sign in to your account</string> - <string name="sign_in_to_with_oidc">Sign in with ICRC account</string> - <string name="non_icrc_staff_members">For non-ICRC staff members only</string> - <string name="icrc_staff_members">For ICRC staff members only</string> <string name="username">Username</string> - <string name="password">Password</string> - <string name="forgot_password">Forgot password?</string> - - <string name="recent_activities_loading_message">Loading recent activities&#8230;</string> - <string name="recent_activities_empty_message">You are yet to perform any activity</string> <!-- Sync --> - <string name="metadata_sync_in_progress">Syncing metadata&#8230;</string> <string name="metadata_sync_error">Unable to complete metadata sync</string> - <string name="data_sync_in_progress">Syncing data&#8230;</string> - <string name="data_sync_error">Unable to complete data sync</string> - <string name="metadata_sync_completed">Metadata sync completed!</string> - <string name="sync_completed">Syncing completed!</string> <!-- FloatingActionButtons --> - <string name="proceed">Proceed</string> <string name="review">Review</string> - <string name="scan_barcode">Scan barcode</string> - <string name="scanning">Scanning&#8230;</string> <string name="search">Search item</string> <string name="search_placeholder">Search…</string> <string name="delete">Delete</string> <string name="ok">OK</string> <string name="cancel">Cancel</string> - <string name="confirmation">Confirmation</string> <string name="from">From</string> <string name="to">Delivery to…</string> <string name="subtitle">%s</string> - <string name="to_arg">To %s</string> <!-- Languages --> - <string name="language_english">English</string> - <string name="language_french">French</string> - <string name="language_spanish">Spanish</string> - <string name="language_arabic">Arabic</string> - <string name="language_russian">Russian</string> <!-- Settings --> - <string name="use_microphone_for_data_entry">Use microphone for data entry</string> - <string name="language">Language</string> - <string name="force_data_sync">Force data synchronization</string> - <string name="logout">Logout</string> - <!-- Stock table --> - <string name="item">Item</string> - <string name="stock_on_hand">Stock on hand</string> <string name="quantity">Quantity</string> - <string name="items_available">items available</string> - <string name="positive_value"> - <b>Positive value</b> = \"missing quantity\" (<i>physical stock less than the calculated value</i>) - </string> - <string name="negative_value"> - <b><span style="color: #C81818">Negative value</span></b> = \"found in stock\" (<i>physical stock is more than the calculated value</i>) - </string> <!-- Messages --> - <string name="mandatory_transaction_selection"> - A transaction type must be selected and all fields must be filled before you can proceed - </string> <string name="mandatory_facility_selection"> The facility field must be filled before you can proceed </string> <string name="mandatory_distributed_to_selection"> The \"Distributed to\" field must be filled before you can proceed</string> - <string name="mandatory_transaction_date_selection"> - The \"Distributed to\" field must be filled before you can proceed - </string> - <string name="previous_page_lose_data_warning"> - Are you sure you want to go back to the previous screen? - You will lose the data just entered if you decide to proceed. - </string> <string name="transaction_completed"> The transaction was successfully completed! </string> - <string name="transaction_cancelled"> - The transaction was successfully cancelled! - </string> - <string name="force_sync_confirmation_message"> - Are you sure you want to force synchronization? - </string> - <string name="logout_confirmation_message">Are you sure you want to log out?</string> - - <string name="remove_correction_item_confirmation_message"> - Are you sure you want to permanently delete the entry for the correction of \"%1$s\"? - This action cannot be undone. - </string> - <string name="remove_distribution_item_confirmation_message"> - Are you sure you want to permanently delete the entry for the distribution of \"%1$s\"? - This action cannot be undone. - </string> - <string name="remove_discard_item_confirmation_message"> - Are you sure you want to permanently delete the entry for the discard of \"%1$s\"? - This action cannot be undone. - </string> - - <plurals name="items_found"> - <item quantity="one">%d item</item> - <item quantity="other">%d items</item> - </plurals> - <string name="no_items_found">No items found</string> - <string name="loading_items_message">Loading stock items &#8230;</string> - <string name="prompt_email">Email</string> - <string name="prompt_password">Password</string> - <string name="action_sign_in">Sign in or register</string> - <string name="action_sign_in_short">Sign in</string> - <string name="welcome">Welcome !</string> - <string name="invalid_username">Not a valid username</string> - <string name="invalid_password">Password must be >5 characters</string> - <string name="login_failed">Login failed</string> - <string name="resync">Resync</string> <!-- Errors --> - <string name="login_error">Unable to login</string> - <string name="config_file_error">Unable to load configuration file</string> - <string name="config_file_program_error"> - Stock program id has not been set in the configuration file - </string> - <string name="recent_activities_load_error">Unable to load your recent activities</string> <string name="facilities_load_error">Unable to load the list of available facilities</string> <string name="destinations_load_error"> Unable to load the list of available destinations </string> - <string name="distribution_data_element_load_error"> - Unable to load the distribution data element - </string> - <string name="correction_data_element_load_error"> - Unable to load correction data element - </string> - <string name="discard_data_element_load_error"> - Unable to load discard data element - </string> <!-- Content descriptions for accessibility --> - <string name="content_desc_sync_info">Sync information</string> - <string name="content_desc_search">Search</string> - <string name="content_desc_clear_text">Clear text</string> - <string name="content_desc_transaction_date">Show date picker</string> - <string name="content_desc_distributed_to">Distributed to</string> - <string name="content_desc_last_sync">Last Synced</string> - <string name="content_desc_quantity_info">More information on quantity</string> - <string name="content_desc_remove">Remove item</string> - <string name="content_desc_recent_activity">Directional arrow</string> - <string name="content_desc_recent_activity_status">Recent activity status</string> - <string name="content_desc_close_info_guide">Close information guide</string> <string name="confirm_transaction_label">Confirm</string> - <string name="missing_configuration"> - One or more required fields are missing in the configuration file - </string> - <string name="select_language">Select your desired language</string> <!-- Preferences --> - <string name="username_pref_key" translatable="false">logged_in_user</string> <string name="language_pref_key" translatable="false">language_preference</string> - <string name="logout_pref_key" translatable="false">logout</string> - <string name="force_sync_pref_key" translatable="false">force_sync</string> <string name="use_mic_pref_key" translatable="false">use_mic</string> <string name="language_pref_default" translatable="false">en</string> - <string name="restart_later">Restart Later</string> - <string name="confirm_app_restart_message"> - The application needs to be restarted for the changes to be effected, however, - any unsaved changes will be lost.\n\nWill you like to proceed with the restart? - </string> - <string name="language_change_dialog_title">Confirm Restart</string> - <string name="scan_canceled">Scan cancelled!</string> - <string name="logout_error_message"> - An error occurred during logout. Please try again later. - </string> - <string name="logout_success_message">Successfully logged out</string> - - <string name="invalid_quantity">Invalid</string> <string name="stock_on_hand_exceeded_message"> Available stock on hand cannot be exceeded </string> - <string name="reviewed_item_cannot_be_empty_message"> - A stock under review cannot be empty. You can remove the item if not desired - </string> <string name="permission_granted">Permission Granted</string> <string name="permission_denied">Permission Denied</string> - <string name="default_language" translatable="false">en</string> - <string name="content_desc_splash" translatable="false">Splash screen image</string> - <!-- Speech error messages --> <string name="insufficient_speech_permissions_error"> Insufficient permissions. Request android.permission.RECORD_AUDIO @@ -231,21 +84,9 @@ Negative number input is not allowed: \"%s\" </string> - <string name="openid_config_load_error">Unable to load OpenID configuration</string> - <string name="unexpected_openid_authentication_error"> - An unexpected error occurred while authenticating with OpenID - </string> - <string name="no_network_available">No network connection available</string> <string name="unable_to_sync_data_no_network_available"> Unable to synchronize data because there is no network connection available </string> - <string name="openid_authentication_not_successful"> - Unable to authenticate with your ICRC account - </string> - - <string name="contact_service_desk_message"> - In case of problems, \nplease contact ICRC service desk - </string> <!--SDK error codes--> <string name="login_error_unsuccessful_response">Something went wrong. Please check that server URL, username and password are correct and try again.</string> @@ -283,8 +124,6 @@ <string name="error_ssl">There is a problem with the server certificates. Please, contact your administrator.</string> <string name="done_task">Home</string> <string name="back">Back</string> - <string name="no_conflicts_message">There are no conflicts for this program</string> - <string name="action_sync">Send</string> <string name="from_facility">From facility</string> <string name="to_facility">To facility</string> <string name="stock">Stock</string> diff --git a/stock-usecase/src/test/java/org/dhis2/android/rtsm/data/DataElementFactory.kt b/stock-usecase/src/test/java/org/dhis2/android/rtsm/data/DataElementFactory.kt index ada2b8e52fd..c41a2dd92bf 100644 --- a/stock-usecase/src/test/java/org/dhis2/android/rtsm/data/DataElementFactory.kt +++ b/stock-usecase/src/test/java/org/dhis2/android/rtsm/data/DataElementFactory.kt @@ -1,5 +1,6 @@ package org.dhis2.android.rtsm.data +import org.hisp.dhis.android.core.common.ObjectWithUid import org.hisp.dhis.android.core.dataelement.DataElement object DataElementFactory { @@ -12,5 +13,6 @@ object DataElementFactory { .uid(uid) .name(name) .displayName(name) + .categoryCombo(ObjectWithUid.create("categoryComboUid")) .build() } diff --git a/stock-usecase/src/test/java/org/dhis2/android/rtsm/services/ProgramRuleTests.kt b/stock-usecase/src/test/java/org/dhis2/android/rtsm/services/ProgramRuleTests.kt index 62d3c2b0da1..16f62c8f4b8 100644 --- a/stock-usecase/src/test/java/org/dhis2/android/rtsm/services/ProgramRuleTests.kt +++ b/stock-usecase/src/test/java/org/dhis2/android/rtsm/services/ProgramRuleTests.kt @@ -2,12 +2,12 @@ package org.dhis2.android.rtsm.services import com.google.common.collect.Lists import org.dhis2.mobileProgramRules.toRuleEngineInstant -import org.dhis2.mobileProgramRules.toRuleEngineInstantWithNoTime import org.dhis2.mobileProgramRules.toRuleEngineLocalDate import org.hisp.dhis.android.core.arch.helpers.DateUtils import org.hisp.dhis.android.core.program.ProgramRuleActionType import org.hisp.dhis.rules.api.RuleEngine import org.hisp.dhis.rules.api.RuleEngineContext +import org.hisp.dhis.rules.api.RuleSupplementaryData import org.hisp.dhis.rules.models.Rule import org.hisp.dhis.rules.models.RuleAction import org.hisp.dhis.rules.models.RuleDataValue @@ -80,7 +80,7 @@ class ProgramRuleTests { return RuleEngineContext( rules, rulesVariables, - emptyMap(), + RuleSupplementaryData(), emptyMap(), ) } @@ -133,7 +133,8 @@ class ProgramRuleTests { "test_program_stage", "", RuleEventStatus.ACTIVE, - Date().toRuleEngineInstantWithNoTime(), + Date().toRuleEngineLocalDate(), + Date().toRuleEngineInstant(), Date().toRuleEngineInstant(), Date().toRuleEngineLocalDate(), null, @@ -185,8 +186,9 @@ class ProgramRuleTests { val ruleEventAndroid = getRuleEvent( uid = "event_android", - eventDate = "2025-09-25T13:04:13.783", + eventDate = "2025-09-25T11:04:13.783", created = "2025-09-25T13:04:13.783", + createdAtClient = "2025-09-25T11:04:13.783", dataValues = listOf( RuleDataValue( @@ -195,11 +197,26 @@ class ProgramRuleTests { ), ), ) + val ruleEventAndroidSameCreated = + getRuleEvent( + uid = "event_android", + eventDate = "2025-09-25T12:02:13.783", + created = "2025-09-25T13:04:13.783", + createdAtClient = "2025-09-25T12:02:13.783", + dataValues = + listOf( + RuleDataValue( + dataElement1, + "5", + ), + ), + ) val ruleEventWeb = getRuleEvent( uid = "event_web", eventDate = "2025-09-25T00:00:00.000", created = "2025-09-25T15:06:41.483", + createdAtClient = null, dataValues = listOf( RuleDataValue( @@ -213,6 +230,7 @@ class ProgramRuleTests { uid = "event_new", eventDate = "2025-09-25T18:06:41.483", created = "2025-09-25T18:06:41.483", + createdAtClient = "2025-09-25T18:06:41.483", dataValues = listOf(), ) @@ -247,24 +265,40 @@ class ProgramRuleTests { ), ) - val ruleEffects = - RuleEngine.getInstance().evaluate( + // Evaluate the Android and Web events + RuleEngine + .getInstance() + .evaluate( ruleEventNew, getEmptyRuleEnrollment(), listOf(ruleEventAndroid, ruleEventWeb), ruleEngineContext, - ) + ).let { ruleEffects -> + // The rule effect must assign the value coming from event_web because its created date + // is most recent compared to event_android. + assertEquals(ruleEffects.size, 1) + assertEquals(ruleEffects.first().data, "10") + } - // The rule effect must assigned the value coming from event_web because its created date - // is most recent compared to event_android. - assertEquals(ruleEffects.size, 1) - assertEquals(ruleEffects.first().data, "10") + // Evaluate Android events with the same creation date + RuleEngine + .getInstance() + .evaluate( + ruleEventNew, + getEmptyRuleEnrollment(), + listOf(ruleEventAndroid, ruleEventAndroidSameCreated), + ruleEngineContext, + ).let { ruleEffects -> + assertEquals(ruleEffects.size, 1) + assertEquals(ruleEffects.first().data, "5") + } } private fun getRuleEvent( uid: String, eventDate: String, created: String, + createdAtClient: String?, dataValues: List<RuleDataValue>, ): RuleEvent = RuleEvent( @@ -272,8 +306,9 @@ class ProgramRuleTests { "test_program_stage", "", RuleEventStatus.ACTIVE, - DateUtils.DATE_FORMAT.parse(eventDate).toRuleEngineInstantWithNoTime(), + DateUtils.DATE_FORMAT.parse(eventDate).toRuleEngineLocalDate(), DateUtils.DATE_FORMAT.parse(created).toRuleEngineInstant(), + createdAtClient?.let { DateUtils.DATE_FORMAT.parse(it).toRuleEngineInstant() }, null, null, "", diff --git a/stock-usecase/src/test/java/org/dhis2/android/rtsm/services/StockManagerTest.kt b/stock-usecase/src/test/java/org/dhis2/android/rtsm/services/StockManagerTest.kt index 7bac851da6c..bd36314e0c3 100644 --- a/stock-usecase/src/test/java/org/dhis2/android/rtsm/services/StockManagerTest.kt +++ b/stock-usecase/src/test/java/org/dhis2/android/rtsm/services/StockManagerTest.kt @@ -15,14 +15,15 @@ import org.dhis2.android.rtsm.data.models.StockEntry import org.dhis2.android.rtsm.data.models.Transaction import org.hisp.dhis.android.core.D2 import org.hisp.dhis.android.core.arch.repositories.filters.internal.BooleanFilterConnector +import org.hisp.dhis.android.core.arch.repositories.filters.internal.EnumFilterConnector import org.hisp.dhis.android.core.arch.repositories.filters.internal.StringFilterConnector import org.hisp.dhis.android.core.arch.repositories.`object`.ReadOnlyOneObjectRepositoryFinalImpl import org.hisp.dhis.android.core.arch.repositories.scope.RepositoryScope import org.hisp.dhis.android.core.common.ObjectWithUid -import org.hisp.dhis.android.core.dataelement.DataElement import org.hisp.dhis.android.core.enrollment.Enrollment import org.hisp.dhis.android.core.enrollment.EnrollmentCollectionRepository import org.hisp.dhis.android.core.enrollment.EnrollmentStatus +import org.hisp.dhis.android.core.event.EventCollectionRepository import org.hisp.dhis.android.core.event.EventObjectRepository import org.hisp.dhis.android.core.event.EventStatus import org.hisp.dhis.android.core.option.Option @@ -47,7 +48,6 @@ import org.mockito.kotlin.mock import org.mockito.kotlin.times import org.mockito.kotlin.verify import org.mockito.kotlin.whenever -import java.util.Collections @OptIn(ExperimentalCoroutinesApi::class) class StockManagerTest { @@ -228,19 +228,32 @@ class StockManagerTest { } private fun mockStockOnHand() { - whenever( - d2 - .eventModule() - .events() - .byTrackedEntityInstanceUids(Collections.singletonList(any())) - .byDataValue(any()) - .like("") - .byDeleted() - .isFalse - .withTrackedEntityDataValues() - .orderByEventDate(RepositoryScope.OrderByDirection.DESC) - .blockingGet(), - ) doReturn emptyList() + // Mock enrollment chain for getStockOnHand + val enrollmentRepo1: EnrollmentCollectionRepository = mock() + val enrollmentRepo2: EnrollmentCollectionRepository = mock() + val enrollmentStatusFilter: EnumFilterConnector<EnrollmentCollectionRepository, EnrollmentStatus> = mock() + val enrollmentTeiFilter: StringFilterConnector<EnrollmentCollectionRepository> = mock() + + whenever(d2.enrollmentModule().enrollments()) doReturn enrollmentRepo1 + whenever(enrollmentRepo1.byTrackedEntityInstance()) doReturn enrollmentTeiFilter + whenever(enrollmentTeiFilter.eq("teiUid")) doReturn enrollmentRepo2 + whenever(enrollmentRepo2.byStatus()) doReturn enrollmentStatusFilter + whenever(enrollmentStatusFilter.eq(EnrollmentStatus.ACTIVE)) doReturn enrollmentRepo2 + whenever(enrollmentRepo2.blockingGetUids()) doReturn listOf("enrollmentUid") + + // Mock event chain for getStockOnHand + val eventRepo1 = mock<EventCollectionRepository>() + val eventRepo2 = mock<EventCollectionRepository>() + val eventRepo3 = mock<EventCollectionRepository>() + val eventUidFilter = mock<StringFilterConnector<EventCollectionRepository>>() + val eventDeletedFilter = mock<BooleanFilterConnector<EventCollectionRepository>>() + + whenever(d2.eventModule().events()) doReturn eventRepo1 + whenever(eventRepo1.byEnrollmentUid()) doReturn eventUidFilter + whenever(eventUidFilter.`in`(listOf("enrollmentUid"))) doReturn eventRepo2 + whenever(eventRepo2.byDeleted()) doReturn eventDeletedFilter + whenever(eventDeletedFilter.isFalse) doReturn eventRepo3 + whenever(eventRepo3.blockingGet()) doReturn emptyList() } @Test @@ -270,7 +283,7 @@ class StockManagerTest { // Mock mandatory field check to pass val dataElement = - mock<DataElement> { + mock<ObjectWithUid> { on { uid() } doReturn "de_uid" } val mandatoryDataElement = @@ -343,7 +356,7 @@ class StockManagerTest { // Mock mandatory field check to fail val dataElement = - mock<DataElement> { + mock<ObjectWithUid> { on { uid() } doReturn "de_uid" } val mandatoryDataElement = diff --git a/sync/build.gradle.kts b/sync/build.gradle.kts index e5b4a06bdd8..0e2025e8e77 100644 --- a/sync/build.gradle.kts +++ b/sync/build.gradle.kts @@ -1,10 +1,9 @@ -import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { - kotlin("multiplatform") + alias(libs.plugins.kotlin.multiplatform) alias(libs.plugins.compose) - id("com.android.library") + alias(libs.plugins.android.kotlin.multiplatform.library) alias(libs.plugins.kotlin.compose.compiler) alias(libs.plugins.kotlin.serialization) } @@ -13,22 +12,22 @@ kotlin { compilerOptions { freeCompilerArgs.add("-Xcontext-parameters") - @OptIn(ExperimentalKotlinGradlePluginApi::class) freeCompilerArgs.add("-Xexpect-actual-classes") } - androidTarget { - compilations.all { - compileTaskProvider.configure { - compilerOptions { - jvmTarget.set(JvmTarget.JVM_17) - } - } + androidLibrary { + namespace = "org.dhis2.mobile.sync" + compileSdk = libs.versions.sdk.get().toInt() + minSdk = libs.versions.minSdk.get().toInt() + compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } + androidResources { enable = true } + withHostTestBuilder {}.configure {} + withDeviceTestBuilder {}.configure { + instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } } - jvm("desktop") - + jvm("desktop") sourceSets { @@ -36,12 +35,13 @@ kotlin { resources.srcDirs("src/commonMain/composeResources") dependencies { + implementation(project(":commonskmm")) - implementation(compose.runtime) - implementation(compose.foundation) - implementation(compose.ui) - implementation(compose.material3) - implementation(compose.components.resources) + implementation(libs.compose.runtime) + implementation(libs.compose.foundation) + implementation(libs.compose.ui) + implementation(libs.compose.material3) + implementation(libs.compose.components.resources) implementation(libs.compose.material3.window) implementation(libs.lifecycle.runtime.compose) @@ -60,25 +60,34 @@ kotlin { } androidMain.dependencies { + implementation(project(":commons")) implementation(libs.dhis2.android.sdk) api(libs.analytics.timber) - + implementation(libs.androidx.work) + compileOnly(libs.androidx.compose.preview) + compileOnly(libs.androidx.compose.uitooling) + api(libs.koin.work) } - androidUnitTest.dependencies { - + getByName("androidHostTest") { + dependencies { + implementation(kotlin("test")) + implementation(libs.junit.jupiter) + implementation(libs.test.turbine) + implementation(libs.test.kotlinCoroutines) + implementation(libs.test.mockitoKotlin) + } } - androidInstrumentedTest.dependencies { + getByName("androidDeviceTest") { dependencies { implementation(libs.test.junit.ext) - } } val desktopMain by getting { dependencies { - implementation(compose.desktop.common) + implementation(libs.compose.desktop.common) } } } @@ -90,30 +99,6 @@ compose.resources { generateResClass = always } -android { - namespace = "org.dhis2.mobile.sync" - compileSdk = libs.versions.sdk.get().toInt() - defaultConfig { - minSdk = libs.versions.minSdk.get().toInt() - val bitriseSentryDSN = System.getenv("SENTRY_DSN") ?: "" - buildConfigField("String", "SENTRY_DSN", "\"${bitriseSentryDSN}\"") - } - buildFeatures { - buildConfig = true - } - compileOptions { - isCoreLibraryDesugaringEnabled = true - - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - - dependencies { - coreLibraryDesugaring(libs.desugar) - } -} - dependencies { - debugImplementation(libs.androidx.compose.preview) - debugImplementation(libs.androidx.compose.uitooling) + coreLibraryDesugaring(libs.desugar) } diff --git a/sync/src/androidDeviceTest/kotlin/org/dhis2/mobile/sync/ExampleInstrumentedTest.kt b/sync/src/androidDeviceTest/kotlin/org/dhis2/mobile/sync/ExampleInstrumentedTest.kt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/sync/src/androidHostTest/kotlin/org/dhis2/mobile/sync/ExampleUnitTest.kt b/sync/src/androidHostTest/kotlin/org/dhis2/mobile/sync/ExampleUnitTest.kt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/sync/src/androidHostTest/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepositoryTest.kt b/sync/src/androidHostTest/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepositoryTest.kt new file mode 100644 index 00000000000..cadb8269801 --- /dev/null +++ b/sync/src/androidHostTest/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepositoryTest.kt @@ -0,0 +1,207 @@ +package org.dhis2.mobile.sync.data + +import io.reactivex.Completable +import io.reactivex.Observable +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.resetMain +import kotlinx.coroutines.test.runTest +import kotlinx.coroutines.test.setMain +import org.dhis2.commons.simprints.ramp.repository.RampDatastoreRepository +import org.dhis2.mobile.commons.coroutine.Dispatcher +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.mobile.commons.error.DomainErrorMapper +import org.dhis2.mobile.commons.providers.PreferenceProvider +import org.dhis2.mobile.commons.reporting.AnalyticActions +import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.arch.call.BaseD2Progress +import org.hisp.dhis.android.core.fileresource.FileResourceDomainType +import org.hisp.dhis.android.core.maintenance.D2Error +import org.hisp.dhis.android.core.settings.GeneralSettings +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.mockito.Mockito +import org.mockito.Mockito.mock +import org.mockito.kotlin.any +import org.mockito.kotlin.doAnswer +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.times +import org.mockito.kotlin.verify +import org.mockito.kotlin.verifyNoMoreInteractions +import org.mockito.kotlin.whenever +import kotlin.test.assertEquals +import kotlin.test.assertTrue + +class AndroidSyncRepositoryTest { + private val d2: D2 = Mockito.mock(D2::class.java, Mockito.RETURNS_DEEP_STUBS) + private val preferences: PreferenceProvider = mock() + private val analyticsHelper: AnalyticActions = mock() + private val domainErrorMapper: DomainErrorMapper = mock() + private val rampDatastoreRepository: RampDatastoreRepository = mock() + + private val testDispatcher = StandardTestDispatcher() + + val repository = + AndroidSyncRepository( + d2 = d2, + preferences = preferences, + analyticsHelper = analyticsHelper, + domainErrorMapper = domainErrorMapper, + dispatcher = + Dispatcher( + testDispatcher, + testDispatcher, + testDispatcher, + ), + rampDatastoreRepository = rampDatastoreRepository, + ) + + @OptIn(ExperimentalCoroutinesApi::class) + @Before + fun setUp() { + Dispatchers.setMain(testDispatcher) + } + + @OptIn(ExperimentalCoroutinesApi::class) + @After + fun tearDown() { + Dispatchers.resetMain() + } + + @Test + fun `Should configure secondary tracker if configuration exists`() = + runTest { + whenever( + d2.settingModule().generalSetting().blockingGet(), + ) doReturn + GeneralSettings + .builder() + .encryptDB(false) + .matomoID(11111) + .matomoURL("MatomoURL") + .build() + whenever( + d2.mapsModule().mapLayersDownloader().downloadMetadata(), + ) doReturn Completable.complete() + + whenever( + d2 + .fileResourceModule() + .fileResourceDownloader() + .byDomainType() + .eq(FileResourceDomainType.ICON) + .download(), + ) doReturn Observable.just(BaseD2Progress.empty(1)) + + repository.updateProjectAnalytics() + + verify(analyticsHelper, times(1)).updateMatomoSecondaryTracker(any(), any()) + } + + @Test + fun `Should not configure secondary tracker if matomo settings is missing`() = + runTest { + whenever( + d2.settingModule().generalSetting().blockingGet(), + ) doReturn + GeneralSettings + .builder() + .encryptDB(false) + .build() + whenever( + d2.mapsModule().mapLayersDownloader().downloadMetadata(), + ) doReturn Completable.complete() + whenever( + d2 + .fileResourceModule() + .fileResourceDownloader() + .byDomainType() + .eq(FileResourceDomainType.ICON) + .download(), + ) doReturn Observable.just(BaseD2Progress.empty(1)) + + repository.updateProjectAnalytics() + + verifyNoMoreInteractions(analyticsHelper) + } + + @Test + fun `Should not configure secondary tracker if no configuration exists`() = + runTest { + whenever( + d2.settingModule().generalSetting().blockingGet(), + ) doReturn null + whenever( + d2.mapsModule().mapLayersDownloader().downloadMetadata(), + ) doReturn Completable.complete() + whenever( + d2.mapsModule().mapLayersDownloader().downloadMetadata(), + ) doReturn Completable.complete() + whenever( + d2 + .fileResourceModule() + .fileResourceDownloader() + .byDomainType() + .eq(FileResourceDomainType.ICON) + .download(), + ) doReturn Observable.just(BaseD2Progress.empty(1)) + repository.updateProjectAnalytics() + + verify(analyticsHelper, times(0)).updateMatomoSecondaryTracker(any(), any()) + } + + @Test + fun `Should clear secondary tracker`() = + runTest { + whenever( + d2.settingModule().generalSetting().blockingGet(), + ) doReturn null + whenever( + d2.mapsModule().mapLayersDownloader().downloadMetadata(), + ) doReturn Completable.complete() + whenever( + d2 + .fileResourceModule() + .fileResourceDownloader() + .byDomainType() + .eq(FileResourceDomainType.ICON) + .download(), + ) doReturn Observable.just(BaseD2Progress.empty(1)) + repository.updateProjectAnalytics() + + verify(analyticsHelper, times(0)).updateMatomoSecondaryTracker(any(), any()) + verify(analyticsHelper).clearMatomoSecondaryTracker() + } + + @Test + fun `Should sync RAMP datastore after metadata sync`() = + runTest { + whenever( + d2.metadataModule().download(), + ) doReturn Observable.just(BaseD2Progress.empty(1)) + + val result = repository.syncMetadata {} + + assertTrue(result.isSuccess) + verify(rampDatastoreRepository).sync() + } + + @Test + fun `Should fail metadata sync when RAMP datastore sync fails`() = + runTest { + val d2Error: D2Error = mock() + val domainError = DomainError.ApiError("RAMP datastore sync failed") + whenever( + d2.metadataModule().download(), + ) doReturn Observable.just(BaseD2Progress.empty(1)) + doAnswer { throw d2Error }.whenever(rampDatastoreRepository).sync() + whenever(domainErrorMapper.mapToDomainError(d2Error)) doReturn domainError + + val result = repository.syncMetadata {} + + assertTrue(result.isFailure) + assertEquals(domainError, result.exceptionOrNull()) + } +} diff --git a/sync/src/androidMain/AndroidManifest.xml b/sync/src/androidMain/AndroidManifest.xml index a5918e68abc..628b10ec008 100644 --- a/sync/src/androidMain/AndroidManifest.xml +++ b/sync/src/androidMain/AndroidManifest.xml @@ -1,4 +1,17 @@ <?xml version="1.0" encoding="utf-8"?> -<manifest xmlns:android="http://schemas.android.com/apk/res/android"> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools"> + <application> + <provider + android:name="androidx.startup.InitializationProvider" + android:authorities="${applicationId}.androidx-startup" + android:exported="false" + tools:node="merge"> + <meta-data + android:name="androidx.work.WorkManagerInitializer" + android:value="androidx.startup" + tools:node="remove" /> + </provider> + </application> </manifest> \ No newline at end of file diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncBackgroundJobAction.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncBackgroundJobAction.kt new file mode 100644 index 00000000000..14f3092d944 --- /dev/null +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncBackgroundJobAction.kt @@ -0,0 +1,213 @@ +package org.dhis2.mobile.sync.data + +import androidx.work.ExistingPeriodicWorkPolicy +import androidx.work.ExistingWorkPolicy +import androidx.work.OneTimeWorkRequest +import androidx.work.PeriodicWorkRequest +import androidx.work.WorkInfo +import androidx.work.WorkManager +import androidx.work.WorkQuery +import androidx.work.await +import androidx.work.workDataOf +import kotlinx.coroutines.flow.map +import org.dhis2.mobile.sync.model.SyncJobStatus +import org.dhis2.mobile.sync.model.SyncStatus +import java.util.concurrent.TimeUnit +import kotlin.time.Duration.Companion.hours + +const val IS_PERIODIC = "IS_PERIODIC" +const val METADATA_SYNC = "METADATA_SYNC" +const val METADATA_SYNC_NOW = "METADATA_SYNC_NOW" +const val DATA_SYNC = "DATA_SYNC" +const val DATA_SYNC_NOW = "DATA_SYNC_NOW" +const val SYNC_SETTINGS = "SYNC_SETTINGS" + +class AndroidSyncBackgroundJobAction( + private val workManager: WorkManager, +) : SyncBackgroundJobAction { + override fun launchMetadataSync(syncingPeriod: Long) { + if (syncingPeriod == 0L) { + val request = + OneTimeWorkRequest + .Builder( + workerClass = SyncMetadataWorker::class.java, + ).addTag( + METADATA_SYNC_NOW, + ).build() + workManager.enqueueUniqueWork( + uniqueWorkName = METADATA_SYNC_NOW, + existingWorkPolicy = ExistingWorkPolicy.KEEP, + request = request, + ) + } else { + val request = + PeriodicWorkRequest + .Builder( + workerClass = SyncMetadataWorker::class.java, + repeatInterval = syncingPeriod, + repeatIntervalTimeUnit = TimeUnit.SECONDS, + ).addTag( + METADATA_SYNC, + ).setInitialDelay( + syncingPeriod, + TimeUnit.SECONDS, + ).setInputData(workDataOf(IS_PERIODIC to true)) + .build() + + workManager.enqueueUniquePeriodicWork( + uniqueWorkName = METADATA_SYNC, + existingPeriodicWorkPolicy = ExistingPeriodicWorkPolicy.UPDATE, + request = request, + ) + } + } + + override fun launchDataSync(syncingPeriod: Long) { + if (syncingPeriod == 0L) { + val request = + OneTimeWorkRequest + .Builder( + workerClass = SyncDataWorker::class.java, + ).addTag( + DATA_SYNC_NOW, + ).build() + workManager.enqueueUniqueWork( + uniqueWorkName = DATA_SYNC_NOW, + existingWorkPolicy = ExistingWorkPolicy.KEEP, + request = request, + ) + } else { + val request = + PeriodicWorkRequest + .Builder( + workerClass = SyncDataWorker::class.java, + repeatInterval = syncingPeriod, + repeatIntervalTimeUnit = TimeUnit.SECONDS, + ).addTag( + DATA_SYNC, + ).setInitialDelay( + syncingPeriod, + TimeUnit.SECONDS, + ).setInputData(workDataOf(IS_PERIODIC to true)) + .build() + + workManager.enqueueUniquePeriodicWork( + uniqueWorkName = DATA_SYNC, + existingPeriodicWorkPolicy = ExistingPeriodicWorkPolicy.UPDATE, + request = request, + ) + } + } + + override fun launchSyncSettings() { + val request = + PeriodicWorkRequest + .Builder( + workerClass = SyncSettingsWorker::class.java, + repeatInterval = 1.hours.inWholeSeconds, + repeatIntervalTimeUnit = TimeUnit.SECONDS, + ).setInitialDelay( + 1, + TimeUnit.HOURS, + ).addTag( + SYNC_SETTINGS, + ).build() + + workManager.enqueueUniquePeriodicWork( + SYNC_SETTINGS, + ExistingPeriodicWorkPolicy.UPDATE, + request, + ) + } + + override fun observeMetadataJob() = + workManager + .getWorkInfosFlow( + WorkQuery.fromUniqueWorkNames( + METADATA_SYNC, + METADATA_SYNC_NOW, + ), + ).map { workInfos -> + workInfos.map { workInfo -> + SyncJobStatus( + tags = workInfo.tags.toList(), + status = + when (workInfo.state) { + WorkInfo.State.ENQUEUED -> SyncStatus.Enqueue + WorkInfo.State.RUNNING -> SyncStatus.Running + WorkInfo.State.SUCCEEDED -> SyncStatus.Succeed + WorkInfo.State.FAILED -> SyncStatus.Failed + WorkInfo.State.BLOCKED -> SyncStatus.Blocked + WorkInfo.State.CANCELLED -> SyncStatus.Cancelled + }, + message = workInfo.outputData.getString(METADATA_MESSAGE), + ) + } + } + + override fun getNextMetadataSync() = + workManager + .getWorkInfosForUniqueWork(METADATA_SYNC) + .get() + .firstOrNull() + ?.takeIf { it.state == WorkInfo.State.ENQUEUED } + ?.nextScheduleTimeMillis + + override fun getNextDataSync() = + workManager + .getWorkInfosForUniqueWork(DATA_SYNC) + .get() + .firstOrNull() + ?.takeIf { it.state == WorkInfo.State.ENQUEUED } + ?.nextScheduleTimeMillis + + override fun getNextSettingsSync(): Long? = + workManager + .getWorkInfosForUniqueWork(SYNC_SETTINGS) + .get() + .firstOrNull() + ?.takeIf { it.state == WorkInfo.State.ENQUEUED } + ?.nextScheduleTimeMillis + + override fun observeDataJob() = + workManager + .getWorkInfosFlow( + WorkQuery.fromUniqueWorkNames( + DATA_SYNC, + DATA_SYNC_NOW, + ), + ).map { workInfos -> + workInfos.map { workInfo -> + SyncJobStatus( + tags = workInfo.tags.toList(), + status = + when (workInfo.state) { + WorkInfo.State.ENQUEUED -> SyncStatus.Enqueue + WorkInfo.State.RUNNING -> SyncStatus.Running + WorkInfo.State.SUCCEEDED -> SyncStatus.Succeed + WorkInfo.State.FAILED -> SyncStatus.Failed + WorkInfo.State.BLOCKED -> SyncStatus.Blocked + WorkInfo.State.CANCELLED -> SyncStatus.Cancelled + }, + message = null, + ) + } + } + + override suspend fun cancelSyncSettings() { + workManager.cancelUniqueWork(SYNC_SETTINGS).await() + } + + override suspend fun cancelMetadataSync() { + workManager.cancelUniqueWork(METADATA_SYNC).await() + } + + override suspend fun cancelDataSync() { + workManager.cancelUniqueWork(DATA_SYNC).await() + } + + override suspend fun cancelAll() { + val operation = workManager.cancelAllWork() + operation.await() + } +} diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt new file mode 100644 index 00000000000..0e680e5462f --- /dev/null +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/AndroidSyncRepository.kt @@ -0,0 +1,563 @@ +package org.dhis2.mobile.sync.data + +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withContext +import kotlinx.datetime.TimeZone +import kotlinx.datetime.format +import kotlinx.datetime.toLocalDateTime +import org.dhis2.commons.simprints.ramp.repository.RampDatastoreRepository +import org.dhis2.mobile.commons.coroutine.Dispatcher +import org.dhis2.mobile.commons.dates.dateTimeFormat +import org.dhis2.mobile.commons.error.DomainErrorMapper +import org.dhis2.mobile.commons.providers.EVENT_MAX +import org.dhis2.mobile.commons.providers.EVENT_MAX_DEFAULT +import org.dhis2.mobile.commons.providers.LAST_DATA_SYNC +import org.dhis2.mobile.commons.providers.LAST_DATA_SYNC_STATUS +import org.dhis2.mobile.commons.providers.LAST_META_SYNC +import org.dhis2.mobile.commons.providers.LAST_META_SYNC_STATUS +import org.dhis2.mobile.commons.providers.LIMIT_BY_ORG_UNIT +import org.dhis2.mobile.commons.providers.LIMIT_BY_PROGRAM +import org.dhis2.mobile.commons.providers.MAX_RESERVED_VALUES +import org.dhis2.mobile.commons.providers.PreferenceProvider +import org.dhis2.mobile.commons.providers.SYNC_RESULT +import org.dhis2.mobile.commons.providers.TEI_MAX +import org.dhis2.mobile.commons.providers.TEI_MAX_DEFAULT +import org.dhis2.mobile.commons.reporting.AnalyticActions +import org.dhis2.mobile.sync.model.DataSyncProgressStatus +import org.dhis2.mobile.sync.model.SMSConfigResult +import org.dhis2.mobile.sync.model.SyncResult +import org.dhis2.mobile.sync.model.toSyncPeriod +import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.arch.call.D2ProgressStatus +import org.hisp.dhis.android.core.arch.call.D2ProgressSyncStatus +import org.hisp.dhis.android.core.common.State +import org.hisp.dhis.android.core.fileresource.FileResourceDomainType +import org.hisp.dhis.android.core.maintenance.D2Error +import org.hisp.dhis.android.core.program.ProgramType +import org.hisp.dhis.android.core.settings.LimitScope +import kotlin.math.ceil +import kotlin.time.Clock +import kotlin.time.ExperimentalTime + +class AndroidSyncRepository( + private val d2: D2, + private val preferences: PreferenceProvider, + private val analyticsHelper: AnalyticActions, + private val domainErrorMapper: DomainErrorMapper, + private val dispatcher: Dispatcher, + private val rampDatastoreRepository: RampDatastoreRepository, +) : SyncRepository { + private suspend fun <T> execute(block: suspend () -> Result<T>): Result<T> = + withContext(dispatcher.io) { + try { + block() + } catch (d2Error: D2Error) { + Result.failure(domainErrorMapper.mapToDomainError(d2Error)) + } + } + + private suspend fun <T> run(block: suspend () -> Result<T>): Result<T> = + try { + block() + } catch (d2Error: D2Error) { + Result.failure(domainErrorMapper.mapToDomainError(d2Error)) + } + + override suspend fun currentMetadataSyncPeriod() = + withContext(dispatcher.io) { + d2 + .settingModule() + .synchronizationSettings() + .blockingGet() + ?.metadataSync() + ?.toSyncPeriod() + ?: preferences + .getMetadataSyncPeriod() + .toLong() + .toSyncPeriod() + } + + override suspend fun currentDataSyncPeriod() = + withContext(dispatcher.io) { + d2 + .settingModule() + .synchronizationSettings() + .blockingGet() + ?.dataSync() + ?.toSyncPeriod() + ?: preferences + .getDataSyncPeriod() + .toLong() + .toSyncPeriod() + } + + override suspend fun downloadFileResources(): Result<Unit> = + execute { + d2 + .fileResourceModule() + .fileResourceDownloader() + .byDomainType() + .eq(FileResourceDomainType.ICON) + .blockingDownload() + Result.success(Unit) + } + + @OptIn(ExperimentalTime::class) + override suspend fun saveMetadataSyncState(isSuccess: Boolean) { + preferences.setValue( + LAST_META_SYNC, + Clock.System + .now() + .toLocalDateTime(TimeZone.currentSystemDefault()) + .format(dateTimeFormat), + ) + preferences.setValue(LAST_META_SYNC_STATUS, isSuccess) + } + + @OptIn(ExperimentalTime::class) + override suspend fun saveDataSyncState(isSuccess: Boolean) = + run { + preferences.setValue( + LAST_DATA_SYNC, + Clock.System + .now() + .toLocalDateTime(TimeZone.currentSystemDefault()) + .format(dateTimeFormat), + ) + val syncResult = syncResult() + preferences.setValue( + LAST_DATA_SYNC_STATUS, + isSuccess && syncResult == SyncResult.Sync, + ) + preferences.setValue( + SYNC_RESULT, + syncResult.name, + ) + Result.success(Unit) + } + + override suspend fun getAllProgramsInitialStatus() = + run { + val programMap = + d2 + .programModule() + .programs() + .blockingGetUids() + .associateWith { + DataSyncProgressStatus.None + } + val aggregateMap = + d2.dataSetModule().dataSets().blockingGetUids().associateWith { + DataSyncProgressStatus.None + } + + Result.success(programMap + aggregateMap) + } + + override suspend fun getAllEventPrograms() = + run { + val uids = + d2 + .programModule() + .programs() + .byProgramType() + .eq(ProgramType.WITHOUT_REGISTRATION) + .blockingGetUids() + Result.success(uids) + } + + override suspend fun getAllTrackerPrograms() = + run { + val uids = + d2 + .programModule() + .programs() + .byProgramType() + .eq(ProgramType.WITH_REGISTRATION) + .blockingGetUids() + Result.success(uids) + } + + override suspend fun getAllDataSets() = + run { + val uids = + d2 + .dataSetModule() + .dataSets() + .blockingGetUids() + Result.success(uids) + } + + override suspend fun saveDataSyncError(stackTrace: String) { + d2 + .dataStoreModule() + .localDataStore() + .value("DATASYNCERROR") + .blockingSet(stackTrace) + } + + private suspend fun syncResult(): SyncResult { + val eventsOk = + d2 + .eventModule() + .events() + .byAggregatedSyncState() + .notIn(State.SYNCED) + .blockingGet() + .isEmpty() + val teiOk = + d2 + .trackedEntityModule() + .trackedEntityInstances() + .byAggregatedSyncState() + .notIn( + State.SYNCED, + State.RELATIONSHIP, + ).blockingGet() + .isEmpty() + + if (eventsOk && teiOk) { + return SyncResult.Sync + } + + val anyEventsToPostOrToUpdate = + d2 + .eventModule() + .events() + .byAggregatedSyncState() + .`in`( + State.TO_POST, + State.TO_UPDATE, + ).blockingGet() + .isNotEmpty() + val anyTeiToPostOrToUpdate = + d2 + .trackedEntityModule() + .trackedEntityInstances() + .byAggregatedSyncState() + .`in`(State.TO_POST, State.TO_UPDATE) + .blockingGet() + .isNotEmpty() + + if (anyEventsToPostOrToUpdate || anyTeiToPostOrToUpdate) { + return SyncResult.Incomplete + } + + return SyncResult.Error + } + + override suspend fun downloadMapMetadata(): Result<Unit> = + execute { + d2 + .mapsModule() + .mapLayersDownloader() + .downloadMetadata() + .blockingAwait() + Result.success(Unit) + } + + override suspend fun refreshSyncSettings() = + execute { + d2.settingModule().synchronizationSettings().blockingDownload() + Result.success(Unit) + } + + override suspend fun syncMetadata(onProgressUpdate: (Int) -> Unit) = + execute { + d2.metadataModule().download().blockingForEach { progress -> + onProgressUpdate(ceil(progress.percentage() ?: 0.0).toInt()) + } + rampDatastoreRepository.sync() + Result.success(Unit) + } + + override suspend fun updateProjectAnalytics(): Result<Unit> = + execute { + d2.settingModule().generalSetting().blockingGet()?.let { globalSettings -> + if (globalSettings.matomoID() != null && globalSettings.matomoURL() != null) { + analyticsHelper.updateMatomoSecondaryTracker( + globalSettings.matomoURL()!!, + globalSettings.matomoID()!!, + ) + } + } ?: analyticsHelper.clearMatomoSecondaryTracker() + Result.success(Unit) + } + + override suspend fun setUpSMS(): Result<SMSConfigResult> = + execute { + val smsConfig = + d2 + .smsModule() + .configCase() + .getSmsModuleConfig() + .blockingGet() + val isEnabled = smsConfig.isModuleEnabled + + var result: SMSConfigResult = SMSConfigResult.DoNothing + d2.settingModule().generalSetting().blockingGet()?.let { globalSettings -> + val gateway = globalSettings.smsGateway() + + if (gateway.isNullOrEmpty().not()) { + d2 + .smsModule() + .configCase() + .setGatewayNumber(gateway) + .blockingAwait() + if (!isEnabled) { + result = SMSConfigResult.EnableModule + } + } else { + d2 + .smsModule() + .configCase() + .deleteGatewayNumber() + .blockingAwait() + if (isEnabled) { + result = SMSConfigResult.DisableModule + } + } + + d2 + .smsModule() + .configCase() + .setConfirmationSenderNumber(globalSettings.smsResultSender()) + .blockingAwait() + } + Result.success(result) + } + + override suspend fun toggleSMS(enable: Boolean): Result<Unit> = + execute { + val currentStatus = + d2 + .smsModule() + .configCase() + .getSmsModuleConfig() + .blockingGet() + .isModuleEnabled + if (currentStatus != enable) { + d2 + .smsModule() + .configCase() + .setModuleEnabled(enable) + .blockingAwait() + } + + if (currentStatus.not() && enable) { + d2 + .smsModule() + .configCase() + .refreshMetadataIds() + .blockingAwait() + } + + Result.success(Unit) + } + + override suspend fun uploadEvents(): Result<Unit> = + run { + d2.eventModule().events().blockingUpload() + Result.success(Unit) + } + + override suspend fun uploadTEIs(): Result<Unit> = + run { + d2.trackedEntityModule().trackedEntityInstances().blockingUpload() + Result.success(Unit) + } + + override suspend fun uploadDataValues(): Result<Unit> = + run { + d2.dataValueModule().dataValues().blockingUpload() + d2.dataSetModule().dataSetCompleteRegistrations().blockingUpload() + Result.success(Unit) + } + + override suspend fun downloadEvents( + onProgressUpdate: suspend (progressData: Map<String, DataSyncProgressStatus>) -> Unit, + ): Result<Unit> = + run { + val eventProgramUids = + d2 + .programModule() + .programs() + .byProgramType() + .eq(ProgramType.WITHOUT_REGISTRATION) + .blockingGetUids() + + val globalSettings = + d2 + .settingModule() + .synchronizationSettings() + .blockingGet() + ?.programSettings() + ?.globalSettings() + + val eventLimit = + globalSettings?.eventsDownload() ?: preferences.getInt( + EVENT_MAX, + EVENT_MAX_DEFAULT, + ) + + val limitByOrgUnit = + globalSettings?.settingDownload()?.let { + it == LimitScope.PER_ORG_UNIT || it == LimitScope.PER_OU_AND_PROGRAM + } ?: preferences.getBoolean( + LIMIT_BY_ORG_UNIT, + false, + ) + + val limitByProgram = + globalSettings?.settingDownload()?.let { + it == LimitScope.PER_PROGRAM || it == LimitScope.PER_OU_AND_PROGRAM + } ?: preferences.getBoolean( + LIMIT_BY_PROGRAM, + false, + ) + + d2 + .eventModule() + .eventDownloader() + .limit(eventLimit) + .limitByOrgunit(limitByOrgUnit) + .limitByProgram(limitByProgram) + .download() + .blockingForEach { progress -> + val progressData = + progress + .programs() + .filter { entry -> + eventProgramUids.contains(entry.key) + }.mapValues { (_, programProgress) -> + programProgress.toSycStatus() + } + runBlocking { + onProgressUpdate(progressData) + } + } + + Result.success(Unit) + } + + override suspend fun downloadTEIs(onProgressUpdate: suspend (progressData: Map<String, DataSyncProgressStatus>) -> Unit): Result<Unit> = + run { + val trackerProgramUids = + d2 + .programModule() + .programs() + .byProgramType() + .eq(ProgramType.WITH_REGISTRATION) + .blockingGetUids() + + val globalSettings = + d2 + .settingModule() + .synchronizationSettings() + .blockingGet() + ?.programSettings() + ?.globalSettings() + + val teiLimit = + globalSettings?.teiDownload() ?: preferences.getInt( + TEI_MAX, + TEI_MAX_DEFAULT, + ) + + val limitByOrgUnit = + globalSettings?.settingDownload()?.let { + it == LimitScope.PER_ORG_UNIT || it == LimitScope.PER_OU_AND_PROGRAM + } ?: preferences.getBoolean( + LIMIT_BY_ORG_UNIT, + false, + ) + + val limitByProgram = + globalSettings?.settingDownload()?.let { + it == LimitScope.PER_PROGRAM || it == LimitScope.PER_OU_AND_PROGRAM + } ?: preferences.getBoolean( + LIMIT_BY_PROGRAM, + false, + ) + + d2 + .trackedEntityModule() + .trackedEntityInstanceDownloader() + .limit(teiLimit) + .limitByOrgunit(limitByOrgUnit) + .limitByProgram(limitByProgram) + .download() + .blockingForEach { progress -> + val progressData = + progress + .programs() + .filter { entry -> + trackerProgramUids.contains(entry.key) + }.mapValues { (_, programProgress) -> + programProgress.toSycStatus() + } + runBlocking { + onProgressUpdate(progressData) + } + } + Result.success(Unit) + } + + override suspend fun downloadDataValues(onProgressUpdate: (progressData: Map<String, DataSyncProgressStatus>) -> Unit): Result<Unit> = + run { + d2 + .aggregatedModule() + .data() + .download() + .blockingForEach { progress -> + val progressData = + progress.dataSets().mapValues { (_, dataSetProgress) -> + dataSetProgress.toSycStatus() + } + onProgressUpdate(progressData) + } + Result.success(Unit) + } + + override suspend fun downloadDataFileResources(onProgressUpdate: (progress: Double?) -> Unit): Result<Unit> = + run { + d2 + .fileResourceModule() + .fileResourceDownloader() + .byDomainType() + .eq(FileResourceDomainType.DATA_VALUE) + .download() + .blockingForEach { progress -> + onProgressUpdate(progress.percentage()) + } + Result.success(Unit) + } + + override suspend fun downloadReservedValues(onProgressUpdate: (progress: Double?) -> Unit): Result<Unit> = + run { + val maxNumberOfValuesToFillUp = + d2 + .settingModule() + .generalSetting() + .blockingGet() + ?.reservedValues() ?: MAX_RESERVED_VALUES + + d2 + .trackedEntityModule() + .reservedValueManager() + .downloadAllReservedValues(maxNumberOfValuesToFillUp) + .blockingForEach { progress -> + onProgressUpdate(progress.percentage()) + } + Result.success(Unit) + } + + private fun D2ProgressStatus.toSycStatus() = + when { + isComplete.not() -> DataSyncProgressStatus.InProgress + syncStatus == D2ProgressSyncStatus.SUCCESS -> DataSyncProgressStatus.Success + syncStatus == D2ProgressSyncStatus.ERROR -> DataSyncProgressStatus.Failed + syncStatus == D2ProgressSyncStatus.PARTIAL_ERROR -> DataSyncProgressStatus.PartiallyFailed + else -> DataSyncProgressStatus.None + } +} diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SdkSyncPeriodToSyncPeriod.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SdkSyncPeriodToSyncPeriod.kt new file mode 100644 index 00000000000..318b956f0c9 --- /dev/null +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SdkSyncPeriodToSyncPeriod.kt @@ -0,0 +1,25 @@ +package org.dhis2.mobile.sync.data + +import org.dhis2.mobile.sync.model.SyncPeriod +import org.hisp.dhis.android.core.settings.DataSyncPeriod +import org.hisp.dhis.android.core.settings.MetadataSyncPeriod + +internal fun MetadataSyncPeriod.toSyncPeriod() = + when (this) { + MetadataSyncPeriod.EVERY_HOUR -> SyncPeriod.EveryHour + MetadataSyncPeriod.EVERY_6_HOURS -> SyncPeriod.Every6Hour + MetadataSyncPeriod.EVERY_12_HOURS -> SyncPeriod.Every12Hour + MetadataSyncPeriod.EVERY_24_HOURS -> SyncPeriod.Every24Hour + MetadataSyncPeriod.EVERY_7_DAYS -> SyncPeriod.Every7Days + MetadataSyncPeriod.MANUAL -> SyncPeriod.Manual + } + +internal fun DataSyncPeriod.toSyncPeriod() = + when (this) { + DataSyncPeriod.EVERY_30_MIN -> SyncPeriod.Every30Min + DataSyncPeriod.EVERY_HOUR -> SyncPeriod.EveryHour + DataSyncPeriod.EVERY_6_HOURS -> SyncPeriod.Every6Hour + DataSyncPeriod.EVERY_12_HOURS -> SyncPeriod.Every12Hour + DataSyncPeriod.EVERY_24_HOURS -> SyncPeriod.Every24Hour + DataSyncPeriod.MANUAL -> SyncPeriod.Manual + } diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncDataWorker.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncDataWorker.kt new file mode 100644 index 00000000000..1c45e0d1bbf --- /dev/null +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncDataWorker.kt @@ -0,0 +1,87 @@ +package org.dhis2.mobile.sync.data + +import android.content.Context +import androidx.work.CoroutineWorker +import androidx.work.ForegroundInfo +import androidx.work.WorkerParameters +import org.dhis2.mobile.commons.notifications.NotificationManager +import org.dhis2.mobile.commons.notifications.WorkerNotificationInfo +import org.dhis2.mobile.sync.R +import org.dhis2.mobile.sync.domain.SyncData +import org.dhis2.mobile.sync.model.DataSyncTask +import org.dhis2.mobile.sync.resources.Res +import org.dhis2.mobile.sync.resources.app_name +import org.dhis2.mobile.sync.resources.syncing_data +import org.jetbrains.compose.resources.getString + +class SyncDataWorker( + context: Context, + workerParams: WorkerParameters, + private val syncData: SyncData, + private val notificationManager: NotificationManager, +) : CoroutineWorker(context, workerParams) { + private lateinit var notificationTitle: String + private lateinit var notificationText: String + + override suspend fun doWork(): Result { + val isPeriodic = inputData.getBoolean(IS_PERIODIC, false) + + if (!isPeriodic) { + setForeground(getForegroundInfo()) + } + + notificationTitle = getString(Res.string.app_name) + notificationText = getString(Res.string.syncing_data) + notificationManager.displayDataSyncNotification( + smallIcon = R.drawable.ic_sync, + contentTitle = notificationTitle, + contentText = notificationText, + 0, + ) + + val result = + syncData { progressData -> + notificationManager.displayDataSyncNotification( + smallIcon = R.drawable.ic_sync, + contentTitle = notificationTitle, + contentText = + when (progressData.dataSyncTask) { + DataSyncTask.DownloadDataValue -> "Downloading data values" + DataSyncTask.DownloadEvent -> "Downloading events" + DataSyncTask.DownloadFileResource -> "Downloading file resources" + DataSyncTask.DownloadTEI -> "Downloading TEIs" + DataSyncTask.SyncReservedValues -> "Downloading reserved values" + DataSyncTask.UploadDataValue -> "Uploading data values" + DataSyncTask.UploadEvent -> "Uploading events" + DataSyncTask.UploadTEI -> "Uploading TEIs" + }, + progress = progressData.progress?.toInt() ?: -1, + ) + } + + if (!isPeriodic) { + notificationManager.cancelDataSyncNotification() + } + + return when { + result.isSuccess -> Result.success() + else -> Result.failure() + } + } + + override suspend fun getForegroundInfo(): ForegroundInfo { + val notificationModel = + notificationManager.getDataSyncNotification( + smallIcon = R.drawable.ic_sync, + contentTitle = getString(Res.string.app_name), + contentText = getString(Res.string.syncing_data), + progress = -1, + ) + val notificationInfo = + notificationModel as? WorkerNotificationInfo + ?: throw IllegalStateException( + "Expected WorkerNotificationInfo but got ${notificationModel::class.qualifiedName}", + ) + return notificationInfo.foregroundInfo + } +} diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncMetadataWorker.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncMetadataWorker.kt new file mode 100644 index 00000000000..d6fc7f871e9 --- /dev/null +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncMetadataWorker.kt @@ -0,0 +1,91 @@ +package org.dhis2.mobile.sync.data + +import android.content.Context +import androidx.work.CoroutineWorker +import androidx.work.Data +import androidx.work.ForegroundInfo +import androidx.work.WorkerParameters +import org.dhis2.mobile.commons.notifications.NotificationManager +import org.dhis2.mobile.commons.notifications.WorkerNotificationInfo +import org.dhis2.mobile.sync.R +import org.dhis2.mobile.sync.domain.SyncMetadata +import org.dhis2.mobile.sync.resources.Res +import org.dhis2.mobile.sync.resources.app_name +import org.dhis2.mobile.sync.resources.syncing_configuration +import org.jetbrains.compose.resources.getString + +const val METADATA_MESSAGE = "METADATA_MESSAGE" + +class SyncMetadataWorker( + context: Context, + workerParams: WorkerParameters, + private val syncMetadata: SyncMetadata, + private val notificationManager: NotificationManager, +) : CoroutineWorker(context, workerParams) { + private lateinit var notificationTitle: String + private lateinit var notificationText: String + + private val isPeriodic by lazy { inputData.getBoolean(IS_PERIODIC, false) } + + override suspend fun doWork(): Result { + if (!isPeriodic) { + setForeground(getForegroundInfo()) + } + + notificationTitle = getString(Res.string.app_name) + notificationText = getString(Res.string.syncing_configuration) + + notificationManager.displayMetadataSyncNotification( + smallIcon = R.drawable.ic_sync, + contentTitle = notificationTitle, + contentText = notificationText, + progress = 0, + ) + + val result = + syncMetadata { progress -> + notificationManager.displayMetadataSyncNotification( + smallIcon = R.drawable.ic_sync, + contentTitle = notificationTitle, + contentText = notificationText, + progress = progress, + ) + } + + if (!isPeriodic) { + notificationManager.cancelMetadataSyncNotification() + } + + return when { + result.isSuccess -> Result.success() + else -> + Result.failure( + createOutputData( + result.exceptionOrNull()?.message ?: "Unknown error", + ), + ) + } + } + + override suspend fun getForegroundInfo(): ForegroundInfo { + val notificationModel = + notificationManager.getMetadataSyncNotification( + smallIcon = R.drawable.ic_sync, + contentTitle = getString(Res.string.app_name), + contentText = getString(Res.string.syncing_configuration), + progress = -1, + ) + val notificationInfo = + notificationModel as? WorkerNotificationInfo + ?: throw IllegalStateException( + "Expected WorkerNotificationInfo but got ${notificationModel::class.qualifiedName}", + ) + return notificationInfo.foregroundInfo + } + + private fun createOutputData(message: String) = + Data + .Builder() + .putString(METADATA_MESSAGE, message) + .build() +} diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncSettingsWorker.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncSettingsWorker.kt new file mode 100644 index 00000000000..e7ac7f2f1bd --- /dev/null +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/data/SyncSettingsWorker.kt @@ -0,0 +1,34 @@ +package org.dhis2.mobile.sync.data + +import android.content.Context +import androidx.work.CoroutineWorker +import androidx.work.WorkerParameters +import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.commons.notifications.NotificationManager +import org.dhis2.mobile.sync.R +import org.dhis2.mobile.sync.domain.SyncSettings +import org.dhis2.mobile.sync.resources.Res +import org.dhis2.mobile.sync.resources.app_name +import org.dhis2.mobile.sync.resources.syncing_settings +import org.jetbrains.compose.resources.getString + +class SyncSettingsWorker( + context: Context, + workerParams: WorkerParameters, + private val syncSettings: SyncSettings, + private val notificationManager: NotificationManager, +) : CoroutineWorker(context, workerParams) { + override suspend fun doWork(): Result { + notificationManager.displaySyncSettingsNotification( + smallIcon = R.drawable.ic_sync, + contentTitle = getString(Res.string.app_name), + contentText = getString(Res.string.syncing_settings), + ) + val result = syncSettings() + notificationManager.cancelSyncSettingsNotification() + return when { + result.isSuccess -> Result.success() + else -> Result.failure() + } + } +} diff --git a/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.android.kt b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.android.kt new file mode 100644 index 00000000000..5119fa50b3f --- /dev/null +++ b/sync/src/androidMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.android.kt @@ -0,0 +1,50 @@ +package org.dhis2.mobile.sync.di + +import androidx.work.WorkManager +import org.dhis2.commons.simprints.ramp.repository.RampDatastoreRepository +import org.dhis2.mobile.sync.data.AndroidSyncBackgroundJobAction +import org.dhis2.mobile.sync.data.AndroidSyncRepository +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.data.SyncDataWorker +import org.dhis2.mobile.sync.data.SyncMetadataWorker +import org.dhis2.mobile.sync.data.SyncRepository +import org.dhis2.mobile.sync.data.SyncSettingsWorker +import org.dhis2.mobile.sync.domain.SyncData +import org.dhis2.mobile.sync.domain.SyncMetadata +import org.dhis2.mobile.sync.domain.SyncSettings +import org.dhis2.mobile.sync.domain.SyncStatusController +import org.koin.androidx.workmanager.dsl.workerOf +import org.koin.core.module.dsl.factoryOf +import org.koin.core.module.dsl.singleOf +import org.koin.dsl.module + +actual val syncModule = + module { + + singleOf(::SyncStatusController) + + factory { + WorkManager.getInstance(get()) + } + factory<SyncBackgroundJobAction> { + AndroidSyncBackgroundJobAction( + workManager = get(), + ) + } + + factory<SyncRepository> { + AndroidSyncRepository(get(), get(), get(), get(), get(), get()) + } + + factory { RampDatastoreRepository(get()) } + + factoryOf(::SyncMetadata) + + factoryOf(::SyncData) + + factoryOf(::SyncSettings) + + workerOf(::SyncDataWorker) + workerOf(::SyncMetadataWorker) + workerOf(::SyncSettingsWorker) + } diff --git a/sync/src/androidMain/res/drawable/ic_sync.xml b/sync/src/androidMain/res/drawable/ic_sync.xml new file mode 100644 index 00000000000..26c0b192b0f --- /dev/null +++ b/sync/src/androidMain/res/drawable/ic_sync.xml @@ -0,0 +1,10 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24" + android:tint="#7ED321"> + <path + android:fillColor="#FF000000" + android:pathData="M12,4L12,1L8,5l4,4L12,6c3.31,0 6,2.69 6,6 0,1.01 -0.25,1.97 -0.7,2.8l1.46,1.46C19.54,15.03 20,13.57 20,12c0,-4.42 -3.58,-8 -8,-8zM12,18c-3.31,0 -6,-2.69 -6,-6 0,-1.01 0.25,-1.97 0.7,-2.8L5.24,7.74C4.46,8.97 4,10.43 4,12c0,4.42 3.58,8 8,8v3l4,-4 -4,-4v3z" /> +</vector> diff --git a/sync/src/commonMain/composeResources/values-ar/strings.xml b/sync/src/commonMain/composeResources/values-ar/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-ar/strings.xml +++ b/sync/src/commonMain/composeResources/values-ar/strings.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8" ?> <resources> <!-- Add sync module strings here --> -</resources> + <string name="app_name">Dhis2</string> + </resources> diff --git a/sync/src/commonMain/composeResources/values-ckb/strings.xml b/sync/src/commonMain/composeResources/values-ckb/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-ckb/strings.xml +++ b/sync/src/commonMain/composeResources/values-ckb/strings.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8" ?> <resources> <!-- Add sync module strings here --> -</resources> + <string name="app_name">Dhis2</string> + </resources> diff --git a/sync/src/commonMain/composeResources/values-cnr/strings.xml b/sync/src/commonMain/composeResources/values-cnr/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-cnr/strings.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<resources> + <!-- Add sync module strings here --> +</resources> + diff --git a/sync/src/commonMain/composeResources/values-cs/strings.xml b/sync/src/commonMain/composeResources/values-cs/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-cs/strings.xml +++ b/sync/src/commonMain/composeResources/values-cs/strings.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8" ?> <resources> <!-- Add sync module strings here --> -</resources> + <string name="app_name">Dhis2</string> + </resources> diff --git a/sync/src/commonMain/composeResources/values-de/strings.xml b/sync/src/commonMain/composeResources/values-de/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-de/strings.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<resources> + <!-- Add sync module strings here --> +</resources> + diff --git a/sync/src/commonMain/composeResources/values-el/strings.xml b/sync/src/commonMain/composeResources/values-el/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-el/strings.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<resources> + <!-- Add sync module strings here --> +</resources> + diff --git a/sync/src/commonMain/composeResources/values-es-rES/strings.xml b/sync/src/commonMain/composeResources/values-es-rES/strings.xml index 4c1c46011bd..fbe849a24c8 100644 --- a/sync/src/commonMain/composeResources/values-es-rES/strings.xml +++ b/sync/src/commonMain/composeResources/values-es-rES/strings.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8" ?> <resources> <!-- Add sync module strings here --> -</resources> + <string name="app_name">DHIS 2</string> + </resources> diff --git a/sync/src/commonMain/composeResources/values-es/strings.xml b/sync/src/commonMain/composeResources/values-es/strings.xml index 4c1c46011bd..fbe849a24c8 100644 --- a/sync/src/commonMain/composeResources/values-es/strings.xml +++ b/sync/src/commonMain/composeResources/values-es/strings.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8" ?> <resources> <!-- Add sync module strings here --> -</resources> + <string name="app_name">DHIS 2</string> + </resources> diff --git a/sync/src/commonMain/composeResources/values-fr/strings.xml b/sync/src/commonMain/composeResources/values-fr/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-fr/strings.xml +++ b/sync/src/commonMain/composeResources/values-fr/strings.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8" ?> <resources> <!-- Add sync module strings here --> -</resources> + <string name="app_name">Dhis2</string> + </resources> diff --git a/sync/src/commonMain/composeResources/values-ga/strings.xml b/sync/src/commonMain/composeResources/values-ga/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-ga/strings.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<resources> + <!-- Add sync module strings here --> +</resources> + diff --git a/sync/src/commonMain/composeResources/values-hr/strings.xml b/sync/src/commonMain/composeResources/values-hr/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-hr/strings.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<resources> + <!-- Add sync module strings here --> +</resources> + diff --git a/sync/src/commonMain/composeResources/values-id/strings.xml b/sync/src/commonMain/composeResources/values-id/strings.xml index 4c1c46011bd..91e4338bcb7 100644 --- a/sync/src/commonMain/composeResources/values-id/strings.xml +++ b/sync/src/commonMain/composeResources/values-id/strings.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8" ?> <resources> <!-- Add sync module strings here --> -</resources> + <string name="app_name">DHIS2</string> + </resources> diff --git a/sync/src/commonMain/composeResources/values-km/strings.xml b/sync/src/commonMain/composeResources/values-km/strings.xml index 4c1c46011bd..f568a46e86f 100644 --- a/sync/src/commonMain/composeResources/values-km/strings.xml +++ b/sync/src/commonMain/composeResources/values-km/strings.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8" ?> <resources> <!-- Add sync module strings here --> -</resources> + <string name="app_name">ឌីអេចអាយអេសធូ (DHIS 2)</string> + </resources> diff --git a/sync/src/commonMain/composeResources/values-lb/strings.xml b/sync/src/commonMain/composeResources/values-lb/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-lb/strings.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<resources> + <!-- Add sync module strings here --> +</resources> + diff --git a/sync/src/commonMain/composeResources/values-lo/strings.xml b/sync/src/commonMain/composeResources/values-lo/strings.xml index 4c1c46011bd..5276a519bfc 100644 --- a/sync/src/commonMain/composeResources/values-lo/strings.xml +++ b/sync/src/commonMain/composeResources/values-lo/strings.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8" ?> <resources> <!-- Add sync module strings here --> -</resources> + <string name="app_name">ລະບົບ DHIS2</string> + </resources> diff --git a/sync/src/commonMain/composeResources/values-mt/strings.xml b/sync/src/commonMain/composeResources/values-mt/strings.xml new file mode 100644 index 00000000000..4c1c46011bd --- /dev/null +++ b/sync/src/commonMain/composeResources/values-mt/strings.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<resources> + <!-- Add sync module strings here --> +</resources> + diff --git a/sync/src/commonMain/composeResources/values-nb/strings.xml b/sync/src/commonMain/composeResources/values-nb/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-nb/strings.xml +++ b/sync/src/commonMain/composeResources/values-nb/strings.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8" ?> <resources> <!-- Add sync module strings here --> -</resources> + <string name="app_name">Dhis2</string> + </resources> diff --git a/sync/src/commonMain/composeResources/values-nl/strings.xml b/sync/src/commonMain/composeResources/values-nl/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-nl/strings.xml +++ b/sync/src/commonMain/composeResources/values-nl/strings.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8" ?> <resources> <!-- Add sync module strings here --> -</resources> + <string name="app_name">Dhis2</string> + </resources> diff --git a/sync/src/commonMain/composeResources/values-pt/strings.xml b/sync/src/commonMain/composeResources/values-pt/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-pt/strings.xml +++ b/sync/src/commonMain/composeResources/values-pt/strings.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8" ?> <resources> <!-- Add sync module strings here --> -</resources> + <string name="app_name">Dhis2</string> + </resources> diff --git a/sync/src/commonMain/composeResources/values-ru/strings.xml b/sync/src/commonMain/composeResources/values-ru/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-ru/strings.xml +++ b/sync/src/commonMain/composeResources/values-ru/strings.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8" ?> <resources> <!-- Add sync module strings here --> -</resources> + <string name="app_name">Dhis2</string> + </resources> diff --git a/sync/src/commonMain/composeResources/values-sv/strings.xml b/sync/src/commonMain/composeResources/values-sv/strings.xml index 4c1c46011bd..91e4338bcb7 100644 --- a/sync/src/commonMain/composeResources/values-sv/strings.xml +++ b/sync/src/commonMain/composeResources/values-sv/strings.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8" ?> <resources> <!-- Add sync module strings here --> -</resources> + <string name="app_name">DHIS2</string> + </resources> diff --git a/sync/src/commonMain/composeResources/values-uk/strings.xml b/sync/src/commonMain/composeResources/values-uk/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-uk/strings.xml +++ b/sync/src/commonMain/composeResources/values-uk/strings.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8" ?> <resources> <!-- Add sync module strings here --> -</resources> + <string name="app_name">Dhis2</string> + </resources> diff --git a/sync/src/commonMain/composeResources/values-uz-rUZ/strings.xml b/sync/src/commonMain/composeResources/values-uz-rUZ/strings.xml index 4c1c46011bd..91e4338bcb7 100644 --- a/sync/src/commonMain/composeResources/values-uz-rUZ/strings.xml +++ b/sync/src/commonMain/composeResources/values-uz-rUZ/strings.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8" ?> <resources> <!-- Add sync module strings here --> -</resources> + <string name="app_name">DHIS2</string> + </resources> diff --git a/sync/src/commonMain/composeResources/values-uz/strings.xml b/sync/src/commonMain/composeResources/values-uz/strings.xml index 4c1c46011bd..91e4338bcb7 100644 --- a/sync/src/commonMain/composeResources/values-uz/strings.xml +++ b/sync/src/commonMain/composeResources/values-uz/strings.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8" ?> <resources> <!-- Add sync module strings here --> -</resources> + <string name="app_name">DHIS2</string> + </resources> diff --git a/sync/src/commonMain/composeResources/values-vi/strings.xml b/sync/src/commonMain/composeResources/values-vi/strings.xml index 4c1c46011bd..05ec9b7e48c 100644 --- a/sync/src/commonMain/composeResources/values-vi/strings.xml +++ b/sync/src/commonMain/composeResources/values-vi/strings.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8" ?> <resources> <!-- Add sync module strings here --> -</resources> + <string name="app_name">Dhis2</string> + </resources> diff --git a/sync/src/commonMain/composeResources/values-zh-rCN/strings.xml b/sync/src/commonMain/composeResources/values-zh-rCN/strings.xml index 4c1c46011bd..91e4338bcb7 100644 --- a/sync/src/commonMain/composeResources/values-zh-rCN/strings.xml +++ b/sync/src/commonMain/composeResources/values-zh-rCN/strings.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8" ?> <resources> <!-- Add sync module strings here --> -</resources> + <string name="app_name">DHIS2</string> + </resources> diff --git a/sync/src/commonMain/composeResources/values-zh/strings.xml b/sync/src/commonMain/composeResources/values-zh/strings.xml index 4c1c46011bd..f38f31555db 100644 --- a/sync/src/commonMain/composeResources/values-zh/strings.xml +++ b/sync/src/commonMain/composeResources/values-zh/strings.xml @@ -1,5 +1,8 @@ <?xml version="1.0" encoding="UTF-8" ?> <resources> <!-- Add sync module strings here --> -</resources> + <string name="app_name">DHIS2</string> + <string name="syncing_settings">检查网络设置</string> + <string name="syncing_configuration">同步配置</string> + </resources> diff --git a/sync/src/commonMain/composeResources/values/strings.xml b/sync/src/commonMain/composeResources/values/strings.xml index 4c1c46011bd..3ec3434da4f 100644 --- a/sync/src/commonMain/composeResources/values/strings.xml +++ b/sync/src/commonMain/composeResources/values/strings.xml @@ -1,5 +1,9 @@ <?xml version="1.0" encoding="UTF-8" ?> <resources> <!-- Add sync module strings here --> + <string name="app_name">Dhis2</string> + <string name="syncing_settings">Checking web settings</string> + <string name="syncing_configuration">Syncing your configuration</string> + <string name="syncing_data">Syncing your data</string> </resources> diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncBackgroundJobAction.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncBackgroundJobAction.kt new file mode 100644 index 00000000000..3e9f8adc8ff --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncBackgroundJobAction.kt @@ -0,0 +1,30 @@ +package org.dhis2.mobile.sync.data + +import kotlinx.coroutines.flow.Flow +import org.dhis2.mobile.sync.model.SyncJobStatus + +interface SyncBackgroundJobAction { + fun launchMetadataSync(syncingPeriod: Long) + + fun launchDataSync(syncingPeriod: Long) + + fun launchSyncSettings() + + fun observeMetadataJob(): Flow<List<SyncJobStatus>> + + fun observeDataJob(): Flow<List<SyncJobStatus>> + + suspend fun cancelSyncSettings() + + suspend fun cancelMetadataSync() + + suspend fun cancelDataSync() + + suspend fun cancelAll() + + fun getNextMetadataSync(): Long? + + fun getNextDataSync(): Long? + + fun getNextSettingsSync(): Long? +} diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt new file mode 100644 index 00000000000..b9e4bb6a7fc --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/data/SyncRepository.kt @@ -0,0 +1,55 @@ +package org.dhis2.mobile.sync.data + +import org.dhis2.mobile.sync.model.DataSyncProgressStatus +import org.dhis2.mobile.sync.model.SMSConfigResult +import org.dhis2.mobile.sync.model.SyncPeriod + +interface SyncRepository { + suspend fun refreshSyncSettings(): Result<Unit> + + suspend fun currentMetadataSyncPeriod(): SyncPeriod? + + suspend fun currentDataSyncPeriod(): SyncPeriod? + + suspend fun syncMetadata(onProgressUpdate: (Int) -> Unit): Result<Unit> + + suspend fun updateProjectAnalytics(): Result<Unit> + + suspend fun setUpSMS(): Result<SMSConfigResult> + + suspend fun downloadMapMetadata(): Result<Unit> + + suspend fun downloadFileResources(): Result<Unit> + + suspend fun saveMetadataSyncState(isSuccess: Boolean) + + suspend fun uploadEvents(): Result<Unit> + + suspend fun downloadEvents(onProgressUpdate: suspend (progressData: Map<String, DataSyncProgressStatus>) -> Unit): Result<Unit> + + suspend fun uploadTEIs(): Result<Unit> + + suspend fun downloadTEIs(onProgressUpdate: suspend (progressData: Map<String, DataSyncProgressStatus>) -> Unit): Result<Unit> + + suspend fun uploadDataValues(): Result<Unit> + + suspend fun downloadDataValues(onProgressUpdate: (progressData: Map<String, DataSyncProgressStatus>) -> Unit): Result<Unit> + + suspend fun downloadDataFileResources(onProgressUpdate: (progress: Double?) -> Unit): Result<Unit> + + suspend fun downloadReservedValues(onProgressUpdate: (progress: Double?) -> Unit): Result<Unit> + + suspend fun saveDataSyncState(isSuccess: Boolean): Result<Unit> + + suspend fun getAllProgramsInitialStatus(): Result<Map<String, DataSyncProgressStatus>> + + suspend fun getAllEventPrograms(): Result<List<String>> + + suspend fun getAllTrackerPrograms(): Result<List<String>> + + suspend fun getAllDataSets(): Result<List<String>> + + suspend fun saveDataSyncError(stackTrace: String) + + suspend fun toggleSMS(enable: Boolean): Result<Unit> +} diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.kt new file mode 100644 index 00000000000..9beaff8c03b --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.kt @@ -0,0 +1,5 @@ +package org.dhis2.mobile.sync.di + +import org.koin.core.module.Module + +expect val syncModule: Module diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncData.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncData.kt new file mode 100644 index 00000000000..82ada6462a8 --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncData.kt @@ -0,0 +1,90 @@ +package org.dhis2.mobile.sync.domain + +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.mobile.sync.data.SyncRepository +import org.dhis2.mobile.sync.model.DataSyncProgress +import org.dhis2.mobile.sync.model.DataSyncTask + +class SyncData( + private val repository: SyncRepository, + private val syncStatusController: SyncStatusController, +) : UseCase<(progress: DataSyncProgress) -> Unit, Unit> { + override suspend fun invoke(input: (progress: DataSyncProgress) -> Unit): Result<Unit> = + try { + syncStatusController.initDownloadProcess( + repository.getAllProgramsInitialStatus().getOrNull() ?: emptyMap(), + ) + input(DataSyncProgress(DataSyncTask.UploadEvent, null)) + val uploadEventResult = repository.uploadEvents() + syncStatusController.startDownloadingEvents() + val downloadEventResult = + repository.downloadEvents { progressData -> + val done = progressData.count { (_, value) -> value.isComplete() } + val progress = 100.0 * done / progressData.size + input(DataSyncProgress(DataSyncTask.DownloadEvent, progress)) + syncStatusController.updateDownloadProcess(progressData) + } + syncStatusController.finishDownloadingEvents( + repository.getAllEventPrograms().getOrNull() ?: emptyList(), + ) + + input(DataSyncProgress(DataSyncTask.UploadTEI, null)) + val uploadTEIResult = repository.uploadTEIs() + syncStatusController.startDownloadingTracker() + val downloadTEIResult = + repository.downloadTEIs { progressData -> + val done = progressData.count { (_, value) -> value.isComplete() } + val progress = 100.0 * done / progressData.size + input(DataSyncProgress(DataSyncTask.DownloadTEI, progress)) + syncStatusController.updateDownloadProcess(progressData) + } + syncStatusController.finishDownloadingTracker( + repository.getAllTrackerPrograms().getOrNull() ?: emptyList(), + ) + + input(DataSyncProgress(DataSyncTask.UploadDataValue, null)) + val uploadDataValueResult = repository.uploadDataValues() + syncStatusController.startDownloadingDataSets() + val downloadDataValueResult = + repository.downloadDataValues { progressData -> + val done = progressData.count { (_, value) -> value.isComplete() } + val progress = 100.0 * done / progressData.size + input(DataSyncProgress(DataSyncTask.DownloadDataValue, progress)) + } + syncStatusController.finishDownloadingDataSets( + repository.getAllDataSets().getOrNull() ?: emptyList(), + ) + + syncStatusController.initDownloadMedia() + repository.downloadDataFileResources { progress -> + input(DataSyncProgress(DataSyncTask.DownloadFileResource, progress)) + } + + repository.downloadReservedValues { progress -> + input(DataSyncProgress(DataSyncTask.SyncReservedValues, progress)) + } + + val isSuccess = + uploadEventResult.isSuccess && + downloadEventResult.isSuccess && + uploadTEIResult.isSuccess && + downloadTEIResult.isSuccess && + uploadDataValueResult.isSuccess && + downloadDataValueResult.isSuccess + + repository.saveDataSyncState(isSuccess) + + Result.success(Unit) + } catch (domainError: DomainError) { + if (domainError is DomainError.NetworkError) { + syncStatusController.onNetworkUnavailable() + } + Result.failure(domainError) + } catch (e: Exception) { + repository.saveDataSyncError(e.stackTraceToString()) + Result.failure(e) + } finally { + syncStatusController.finishSync() + } +} diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt new file mode 100644 index 00000000000..5e522ccb47a --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncMetadata.kt @@ -0,0 +1,107 @@ +package org.dhis2.mobile.sync.domain + +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.data.SyncRepository +import org.dhis2.mobile.sync.model.SMSConfigResult +import org.dhis2.mobile.sync.model.SyncPeriod + +class SyncMetadata( + private val repository: SyncRepository, + private val syncBackgroundJobAction: SyncBackgroundJobAction, +) : UseCase<(progress: Int) -> Unit, Unit> { + override suspend fun invoke(input: (progress: Int) -> Unit): Result<Unit> = + try { + val initialMetadataSyncPeriod = repository.currentMetadataSyncPeriod() + val initialDataSyncPeriod = repository.currentDataSyncPeriod() + + val syncMetadataResult = + repository.syncMetadata { progress -> + val totalProgress = 30 * progress / 100 + input(totalProgress) + } + if (syncMetadataResult.isSuccess) { + repository.updateProjectAnalytics() + input(40) + val smsConfigResult = repository.setUpSMS().getOrDefault(SMSConfigResult.DoNothing) + when (smsConfigResult) { + SMSConfigResult.DisableModule -> repository.toggleSMS(false) + SMSConfigResult.EnableModule -> repository.toggleSMS(true) + SMSConfigResult.DoNothing -> { + // no-op + } + } + input(50) + repository.downloadMapMetadata() + input(60) + repository.downloadFileResources() + input(70) + repository.saveMetadataSyncState(true) + input(80) + + val finalMetadataSyncPeriod = repository.currentMetadataSyncPeriod() + val finalDataSyncPeriod = repository.currentDataSyncPeriod() + + handleMetadataPeriodChange(initialMetadataSyncPeriod, finalMetadataSyncPeriod) + input(90) + handleDataPeriodChange(initialDataSyncPeriod, finalDataSyncPeriod) + input(100) + Result.success(Unit) + } else { + repository.saveMetadataSyncState(false) + Result.failure(syncMetadataResult.exceptionOrNull()!!) + } + } catch (e: Exception) { + Result.failure(e) + } + + private suspend fun handleMetadataPeriodChange( + initialMetadataSyncPeriod: SyncPeriod?, + finalMetadataSyncPeriod: SyncPeriod?, + ) { + val metadataSyncPeriodChanged = + initialMetadataSyncPeriod != finalMetadataSyncPeriod + val metadataSyncPeriodChangedToManual = + initialMetadataSyncPeriod !is SyncPeriod.Manual && finalMetadataSyncPeriod is SyncPeriod.Manual + + val notScheduled = + syncBackgroundJobAction.getNextMetadataSync() == null && finalMetadataSyncPeriod !is SyncPeriod.Manual + + when { + metadataSyncPeriodChangedToManual -> { + syncBackgroundJobAction.cancelMetadataSync() + syncBackgroundJobAction.launchSyncSettings() + } + + metadataSyncPeriodChanged || notScheduled -> { + syncBackgroundJobAction.launchMetadataSync( + finalMetadataSyncPeriod?.toSeconds() ?: SyncPeriod.Every7Days.toSeconds(), + ) + } + } + } + + private suspend fun handleDataPeriodChange( + initialDataSyncPeriod: SyncPeriod?, + finalDataSyncPeriod: SyncPeriod?, + ) { + val dataSyncPeriodChanged = initialDataSyncPeriod != finalDataSyncPeriod + val dataSyncPeriodChangedToManual = + initialDataSyncPeriod !is SyncPeriod.Manual && finalDataSyncPeriod is SyncPeriod.Manual + + val notScheduled = + syncBackgroundJobAction.getNextDataSync() == null && finalDataSyncPeriod !is SyncPeriod.Manual + + when { + dataSyncPeriodChangedToManual -> { + syncBackgroundJobAction.cancelDataSync() + } + + dataSyncPeriodChanged || notScheduled -> { + syncBackgroundJobAction.launchDataSync( + finalDataSyncPeriod?.toSeconds() ?: SyncPeriod.Every24Hour.toSeconds(), + ) + } + } + } +} diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncSettings.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncSettings.kt new file mode 100644 index 00000000000..7ddf2666f1f --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncSettings.kt @@ -0,0 +1,45 @@ +package org.dhis2.mobile.sync.domain + +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.data.SyncRepository +import org.dhis2.mobile.sync.model.SyncPeriod + +class SyncSettings( + private val repository: SyncRepository, + private val syncBackgroundJobAction: SyncBackgroundJobAction, +) : UseCase<Unit, Unit> { + override suspend fun invoke(input: Unit): Result<Unit> = + try { + val previousMetadataSyncPeriod = repository.currentMetadataSyncPeriod() + val previousDataSyncPeriod = repository.currentDataSyncPeriod() + + val result = repository.refreshSyncSettings() + if (result.isSuccess) { + val currentMetadataSyncPeriod = repository.currentMetadataSyncPeriod() + val currentDataSyncPeriod = repository.currentDataSyncPeriod() + + val dataPeriodChangedFromManual = + (previousDataSyncPeriod is SyncPeriod.Manual || previousDataSyncPeriod == null) && + currentDataSyncPeriod !is SyncPeriod.Manual + + if (dataPeriodChangedFromManual) { + syncBackgroundJobAction.launchDataSync(currentDataSyncPeriod?.toSeconds() ?: 0L) + } + + val metadataPeriodChangedFromManual = + (previousMetadataSyncPeriod is SyncPeriod.Manual || previousMetadataSyncPeriod == null) && + currentMetadataSyncPeriod !is SyncPeriod.Manual + + if (metadataPeriodChangedFromManual) { + syncBackgroundJobAction.launchMetadataSync(currentMetadataSyncPeriod?.toSeconds() ?: 0L) + syncBackgroundJobAction.cancelSyncSettings() + } + } + + result + } catch (e: DomainError) { + Result.failure(e) + } +} diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncStatusController.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncStatusController.kt new file mode 100644 index 00000000000..273104e5424 --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/domain/SyncStatusController.kt @@ -0,0 +1,163 @@ +package org.dhis2.mobile.sync.domain + +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import org.dhis2.mobile.sync.model.DataSyncProgressStatus +import org.dhis2.mobile.sync.model.SyncStatusData + +class SyncStatusController { + private var progressStatusMap: Map<String, DataSyncProgressStatus> = emptyMap() + private val downloadStatus = MutableStateFlow(SyncStatusData(isInitialSync = true)) + + fun observeDownloadProcess() = downloadStatus.asStateFlow() + + suspend fun initDownloadProcess(programDownload: Map<String, DataSyncProgressStatus>) { + progressStatusMap = programDownload + downloadStatus.emit( + SyncStatusData( + running = true, + downloadingEvents = false, + downloadingTracker = false, + downloadingDataSetValues = false, + false, + progressStatusMap, + ), + ) + } + + suspend fun updateDownloadProcess(programDownload: Map<String, DataSyncProgressStatus>) { + progressStatusMap = + progressStatusMap.toMutableMap().also { + it.putAll(programDownload) + } + downloadStatus.emit( + downloadStatus.value.copy(programSyncStatusMap = progressStatusMap), + ) + } + + suspend fun finishSync() { + progressStatusMap = progressStatusMap.toMutableMap() + downloadStatus.emit( + downloadStatus.value.copy( + running = false, + programSyncStatusMap = progressStatusMap, + ), + ) + } + + suspend fun startDownloadingEvents() { + downloadStatus.emit( + downloadStatus.value.copy(running = true, downloadingEvents = true), + ) + } + + suspend fun finishDownloadingEvents(eventProgramUids: List<String>) { + progressStatusMap = + progressStatusMap.toMutableMap().mapValues { entry -> + if (!eventProgramUids.contains(entry.key) || entry.value.isComplete()) { + entry.value + } else { + DataSyncProgressStatus.Failed + } + } + downloadStatus.emit( + downloadStatus.value.copy( + downloadingEvents = false, + programSyncStatusMap = progressStatusMap, + ), + ) + } + + suspend fun startDownloadingTracker() { + downloadStatus.emit( + downloadStatus.value.copy(downloadingTracker = true), + ) + } + + suspend fun finishDownloadingTracker(trackerProgramUids: List<String>) { + progressStatusMap = + progressStatusMap.toMutableMap().mapValues { entry -> + if (!trackerProgramUids.contains(entry.key) || entry.value.isComplete()) { + entry.value + } else { + DataSyncProgressStatus.Failed + } + } + downloadStatus.emit( + downloadStatus.value.copy( + downloadingTracker = false, + programSyncStatusMap = progressStatusMap, + ), + ) + } + + suspend fun startDownloadingDataSets() { + downloadStatus.emit( + downloadStatus.value.copy(downloadingDataSetValues = true), + ) + } + + suspend fun finishDownloadingDataSets(dataSetUids: List<String>) { + progressStatusMap = + progressStatusMap.toMutableMap().mapValues { entry -> + if (!dataSetUids.contains(entry.key) || entry.value.isComplete()) { + entry.value + } else { + DataSyncProgressStatus.Failed + } + } + downloadStatus.emit( + downloadStatus.value.copy( + downloadingDataSetValues = false, + programSyncStatusMap = progressStatusMap, + ), + ) + } + + suspend fun initDownloadMedia() { + downloadStatus.emit( + downloadStatus.value.copy(downloadingMedia = true), + ) + } + + suspend fun restore() { + if (downloadStatus.value.running == true) { + downloadStatus.emit( + SyncStatusData( + isInitialSync = true, + running = true, + ), + ) + } else { + downloadStatus.emit(SyncStatusData()) + } + } + + suspend fun onNetworkUnavailable() { + progressStatusMap = + progressStatusMap.toMutableMap().mapValues { entry -> + if (entry.value.isComplete()) { + entry.value + } else { + DataSyncProgressStatus.Failed + } + } + downloadStatus.emit( + SyncStatusData(true, programSyncStatusMap = progressStatusMap), + ) + } + + suspend fun updateSingleProgramToSuccess(programUid: String) { + progressStatusMap = + progressStatusMap.toMutableMap().mapValues { entry -> + if (programUid != entry.key) { + entry.value + } else { + DataSyncProgressStatus.Success + } + } + downloadStatus.emit( + SyncStatusData(false, programSyncStatusMap = progressStatusMap), + ) + } +} diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/DataSyncProgress.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/DataSyncProgress.kt new file mode 100644 index 00000000000..1f5f61fafe4 --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/DataSyncProgress.kt @@ -0,0 +1,6 @@ +package org.dhis2.mobile.sync.model + +data class DataSyncProgress( + val dataSyncTask: DataSyncTask, + val progress: Double?, +) diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/DataSyncProgressStatus.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/DataSyncProgressStatus.kt new file mode 100644 index 00000000000..d233e0e5b51 --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/DataSyncProgressStatus.kt @@ -0,0 +1,15 @@ +package org.dhis2.mobile.sync.model + +sealed interface DataSyncProgressStatus { + data object InProgress : DataSyncProgressStatus + + data object Success : DataSyncProgressStatus + + data object Failed : DataSyncProgressStatus + + data object PartiallyFailed : DataSyncProgressStatus + + data object None : DataSyncProgressStatus + + fun isComplete() = this == Success || this == Failed || this == PartiallyFailed +} diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/DataSyncTask.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/DataSyncTask.kt new file mode 100644 index 00000000000..c7b4729747f --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/DataSyncTask.kt @@ -0,0 +1,19 @@ +package org.dhis2.mobile.sync.model + +sealed interface DataSyncTask { + data object UploadEvent : DataSyncTask + + data object DownloadEvent : DataSyncTask + + data object UploadTEI : DataSyncTask + + data object DownloadTEI : DataSyncTask + + data object UploadDataValue : DataSyncTask + + data object DownloadDataValue : DataSyncTask + + data object DownloadFileResource : DataSyncTask + + data object SyncReservedValues : DataSyncTask +} diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SMSConfigResult.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SMSConfigResult.kt new file mode 100644 index 00000000000..c5b4ec68b4b --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SMSConfigResult.kt @@ -0,0 +1,9 @@ +package org.dhis2.mobile.sync.model + +sealed interface SMSConfigResult { + data object EnableModule : SMSConfigResult + + data object DisableModule : SMSConfigResult + + data object DoNothing : SMSConfigResult +} diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncJobStatus.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncJobStatus.kt new file mode 100644 index 00000000000..71f6f4dea61 --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncJobStatus.kt @@ -0,0 +1,21 @@ +package org.dhis2.mobile.sync.model + +data class SyncJobStatus( + val tags: List<String>, + val status: SyncStatus, + val message: String?, +) + +sealed interface SyncStatus { + data object Enqueue : SyncStatus + + data object Running : SyncStatus + + data object Succeed : SyncStatus + + data object Failed : SyncStatus + + data object Blocked : SyncStatus + + data object Cancelled : SyncStatus +} diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncPeriod.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncPeriod.kt new file mode 100644 index 00000000000..437fe882394 --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncPeriod.kt @@ -0,0 +1,48 @@ +package org.dhis2.mobile.sync.model + +import kotlin.time.Duration.Companion.days +import kotlin.time.Duration.Companion.hours +import kotlin.time.Duration.Companion.minutes + +sealed interface SyncPeriod { + object Every15Min : SyncPeriod + + object Every30Min : SyncPeriod + + object EveryHour : SyncPeriod + + object Every6Hour : SyncPeriod + + object Every12Hour : SyncPeriod + + object Every24Hour : SyncPeriod + + object Every7Days : SyncPeriod + + object Manual : SyncPeriod + + fun toSeconds() = + when (this) { + Every12Hour -> 12.hours.inWholeSeconds + Every15Min -> 15.minutes.inWholeSeconds + Every24Hour -> 1.days.inWholeSeconds + Every30Min -> 30.minutes.inWholeSeconds + Every6Hour -> 6.hours.inWholeSeconds + Every7Days -> 7.days.inWholeSeconds + EveryHour -> 1.hours.inWholeSeconds + Manual -> 0 + } +} + +fun Long.toSyncPeriod() = + when { + this == 0.toLong() -> SyncPeriod.Manual + this == 15.minutes.inWholeSeconds -> SyncPeriod.Every15Min + this == 30.minutes.inWholeSeconds -> SyncPeriod.Every30Min + this == 1.hours.inWholeSeconds -> SyncPeriod.EveryHour + this == 6.hours.inWholeSeconds -> SyncPeriod.Every6Hour + this == 12.hours.inWholeSeconds -> SyncPeriod.Every12Hour + this == 1.days.inWholeSeconds -> SyncPeriod.Every24Hour + this == 7.days.inWholeSeconds -> SyncPeriod.Every7Days + else -> throw IllegalArgumentException("Invalid sync period") + } diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncResult.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncResult.kt new file mode 100644 index 00000000000..1fc194ceec2 --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncResult.kt @@ -0,0 +1,11 @@ +package org.dhis2.mobile.sync.model + +sealed class SyncResult( + val name: String, +) { + data object Sync : SyncResult("SYNC") + + data object Incomplete : SyncResult("INCOMPLETE") + + data object Error : SyncResult("ERROR") +} diff --git a/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncStatusData.kt b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncStatusData.kt new file mode 100644 index 00000000000..bede24b66fb --- /dev/null +++ b/sync/src/commonMain/kotlin/org/dhis2/mobile/sync/model/SyncStatusData.kt @@ -0,0 +1,33 @@ +package org.dhis2.mobile.sync.model + +data class SyncStatusData( + val running: Boolean? = null, + val downloadingEvents: Boolean = false, + val downloadingTracker: Boolean = false, + val downloadingDataSetValues: Boolean = false, + val downloadingMedia: Boolean = false, + val programSyncStatusMap: Map<String, DataSyncProgressStatus> = emptyMap(), + val isInitialSync: Boolean = false, +) { + fun isProgramDownloading(uid: String): Boolean = programSyncStatusMap.isNotEmpty() && programSyncStatusMap[uid]?.isComplete() == false + + fun hasDownloadError(uid: String): Boolean = + programSyncStatusMap.isNotEmpty() && + ( + programSyncStatusMap[uid] is DataSyncProgressStatus.Failed || + programSyncStatusMap[uid] is DataSyncProgressStatus.PartiallyFailed + ) + + fun isProgramDownloaded(uid: String): Boolean = programSyncStatusMap[uid]?.isComplete() == true && running == true + + fun canDisplayMessage() = + when { + running == false or + downloadingEvents or + downloadingTracker or + downloadingDataSetValues or + downloadingMedia -> true + + else -> false + } +} diff --git a/sync/src/commonTest/kotlin/org/dhis2/mobile/sync/domain/SyncMetadataTest.kt b/sync/src/commonTest/kotlin/org/dhis2/mobile/sync/domain/SyncMetadataTest.kt new file mode 100644 index 00000000000..39bb092ba0d --- /dev/null +++ b/sync/src/commonTest/kotlin/org/dhis2/mobile/sync/domain/SyncMetadataTest.kt @@ -0,0 +1,126 @@ +package org.dhis2.mobile.sync.domain + +import kotlinx.coroutines.runBlocking +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.data.SyncRepository +import org.dhis2.mobile.sync.model.SMSConfigResult +import org.dhis2.mobile.sync.model.SyncPeriod +import org.junit.Test +import org.mockito.kotlin.any +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock +import org.mockito.kotlin.never +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever + +class SyncMetadataTest { + private val repository: SyncRepository = mock() + private val syncBackgroundJobAction: SyncBackgroundJobAction = mock() + + private val syncMetadata = + SyncMetadata( + repository, + syncBackgroundJobAction, + ) + + @Test + fun `Should not trigger background jobs if sync periods do not change`() = + runBlocking { + whenever(repository.currentMetadataSyncPeriod()) doReturn SyncPeriod.Manual + whenever(repository.currentDataSyncPeriod()) doReturn SyncPeriod.Manual + whenever(repository.syncMetadata(any())) doReturn Result.success(Unit) + + syncMetadata.invoke { } + + verify(syncBackgroundJobAction, never()).launchMetadataSync(any()) + verify(syncBackgroundJobAction, never()).cancelMetadataSync() + verify(syncBackgroundJobAction, never()).launchDataSync(any()) + verify(syncBackgroundJobAction, never()).cancelDataSync() + } + + @Test + fun `Should cancel metadata sync if period changes to manual`() = + runBlocking { + whenever(repository.currentMetadataSyncPeriod()).thenReturn( + SyncPeriod.Every24Hour, + SyncPeriod.Manual, + ) + whenever(repository.currentDataSyncPeriod()) doReturn SyncPeriod.Manual + whenever(repository.syncMetadata(any())) doReturn Result.success(Unit) + whenever(repository.setUpSMS()) doReturn Result.success(SMSConfigResult.DoNothing) + whenever(repository.toggleSMS(true)) doReturn Result.success(Unit) + + syncMetadata.invoke { } + + verify(syncBackgroundJobAction).cancelMetadataSync() + verify(syncBackgroundJobAction).launchSyncSettings() + } + + @Test + fun `Should re-launch metadata sync if period changes`() = + runBlocking { + whenever(repository.currentMetadataSyncPeriod()).thenReturn( + SyncPeriod.Every24Hour, + SyncPeriod.Every7Days, + ) + whenever(repository.currentDataSyncPeriod()) doReturn SyncPeriod.Manual + whenever(repository.syncMetadata(any())) doReturn Result.success(Unit) + whenever(repository.setUpSMS()) doReturn Result.success(SMSConfigResult.DoNothing) + whenever(repository.toggleSMS(true)) doReturn Result.success(Unit) + + syncMetadata.invoke { } + + verify(syncBackgroundJobAction).launchMetadataSync(SyncPeriod.Every7Days.toSeconds()) + } + + @Test + fun `Should cancel data sync if period changes to manual`() = + runBlocking { + whenever(repository.currentMetadataSyncPeriod()) doReturn SyncPeriod.Manual + whenever(repository.currentDataSyncPeriod()).thenReturn( + SyncPeriod.Every24Hour, + SyncPeriod.Manual, + ) + whenever(repository.syncMetadata(any())) doReturn Result.success(Unit) + whenever(repository.setUpSMS()) doReturn Result.success(SMSConfigResult.DoNothing) + whenever(repository.toggleSMS(true)) doReturn Result.success(Unit) + + syncMetadata.invoke { } + + verify(syncBackgroundJobAction).cancelDataSync() + } + + @Test + fun `Should re-launch data sync if period changes`() = + runBlocking { + whenever(repository.currentMetadataSyncPeriod()) doReturn SyncPeriod.Manual + whenever(repository.currentDataSyncPeriod()).thenReturn( + SyncPeriod.Every24Hour, + SyncPeriod.Every7Days, + ) + whenever(repository.syncMetadata(any())) doReturn Result.success(Unit) + whenever(repository.setUpSMS()) doReturn Result.success(SMSConfigResult.DoNothing) + whenever(repository.toggleSMS(true)) doReturn Result.success(Unit) + + syncMetadata.invoke { } + + verify(syncBackgroundJobAction).launchDataSync(SyncPeriod.Every7Days.toSeconds()) + } + + @Test + fun `Should return failure and save state when metadata sync fails`() = + runBlocking { + val exception = Exception("Sync failed") + whenever(repository.currentMetadataSyncPeriod()) doReturn SyncPeriod.Manual + whenever(repository.currentDataSyncPeriod()) doReturn SyncPeriod.Manual + whenever(repository.syncMetadata(any())) doReturn Result.failure(exception) + whenever(repository.setUpSMS()) doReturn Result.success(SMSConfigResult.DoNothing) + whenever(repository.toggleSMS(true)) doReturn Result.success(Unit) + + val result = syncMetadata.invoke { } + + verify(repository).saveMetadataSyncState(false) + assert(result.isFailure) + assert(result.exceptionOrNull() == exception) + } +} diff --git a/sync/src/commonTest/kotlin/org/dhis2/mobile/sync/domain/SyncSettingsTest.kt b/sync/src/commonTest/kotlin/org/dhis2/mobile/sync/domain/SyncSettingsTest.kt new file mode 100644 index 00000000000..dbeff9413a3 --- /dev/null +++ b/sync/src/commonTest/kotlin/org/dhis2/mobile/sync/domain/SyncSettingsTest.kt @@ -0,0 +1,57 @@ +package org.dhis2.mobile.sync.domain + +import kotlinx.coroutines.runBlocking +import org.dhis2.mobile.commons.domain.invoke +import org.dhis2.mobile.sync.data.SyncBackgroundJobAction +import org.dhis2.mobile.sync.data.SyncRepository +import org.dhis2.mobile.sync.model.SyncPeriod +import org.junit.Test +import org.mockito.kotlin.doReturnConsecutively +import org.mockito.kotlin.mock +import org.mockito.kotlin.never +import org.mockito.kotlin.times +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever + +class SyncSettingsTest { + private val syncRepository: SyncRepository = mock() + private val syncBackgroundJobAction: SyncBackgroundJobAction = mock() + + private val syncSettings = SyncSettings(syncRepository, syncBackgroundJobAction) + + @Test + fun `Should not cancel sync settings if period does not change to manual`() = + runBlocking { + whenever(syncRepository.currentMetadataSyncPeriod()) doReturnConsecutively + listOf( + SyncPeriod.Every24Hour, + SyncPeriod.Every12Hour, + ) + + syncSettings.invoke() + + verify( + syncBackgroundJobAction, + never(), + ).launchMetadataSync(SyncPeriod.Every12Hour.toSeconds()) + verify(syncBackgroundJobAction, never()).cancelSyncSettings() + } + + @Test + fun `Should cancel sync settings if period changes from manual`() = + runBlocking { + whenever(syncRepository.currentMetadataSyncPeriod()) doReturnConsecutively + listOf( + SyncPeriod.Manual, + SyncPeriod.Every12Hour, + ) + + syncSettings.invoke() + + verify( + syncBackgroundJobAction, + times(1), + ).launchMetadataSync(SyncPeriod.Every12Hour.toSeconds()) + verify(syncBackgroundJobAction, times(1)).cancelSyncSettings() + } +} diff --git a/sync/src/desktopMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.desktop.kt b/sync/src/desktopMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.desktop.kt new file mode 100644 index 00000000000..a4d7b8e2cb7 --- /dev/null +++ b/sync/src/desktopMain/kotlin/org/dhis2/mobile/sync/di/SyncModule.desktop.kt @@ -0,0 +1,9 @@ +package org.dhis2.mobile.sync.di + +import org.koin.core.module.Module +import org.koin.dsl.module + +actual val syncModule: Module + get() = + module { + } diff --git a/tracker/build.gradle.kts b/tracker/build.gradle.kts index 39bd0a7dd63..ae21c54eb6d 100644 --- a/tracker/build.gradle.kts +++ b/tracker/build.gradle.kts @@ -1,14 +1,22 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { - kotlin("multiplatform") + alias(libs.plugins.kotlin.multiplatform) alias(libs.plugins.compose) - id("com.android.library") + alias(libs.plugins.android.kotlin.multiplatform.library) alias(libs.plugins.kotlin.compose.compiler) } kotlin { - androidTarget { - compilerOptions { - jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17) + androidLibrary { + namespace = "org.dhis2.mobile.tracker" + compileSdk = libs.versions.sdk.get().toInt() + minSdk = libs.versions.minSdk.get().toInt() + compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } + androidResources { enable = true } + withHostTestBuilder {}.configure {} + withDeviceTestBuilder {}.configure { + instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } } @@ -24,18 +32,20 @@ kotlin { } commonMain.dependencies { - implementation(compose.runtime) - implementation(compose.foundation) - implementation(compose.ui) - implementation(compose.material3) - api(compose.materialIconsExtended) + implementation(libs.compose.runtime) + implementation(libs.compose.foundation) + implementation(libs.compose.ui) + implementation(libs.compose.material3) + implementation(libs.compose.components.resources) + api(libs.compose.material3.iconsExtendend) val designSystem = libs.dhis2.mobile.designsystem implementation("${designSystem.get().group}:${designSystem.get().name}:${designSystem.get().version}") { isChanging = true } + implementation(libs.kotlinx.datetime) implementation(libs.compose.material3.window) - implementation(compose.components.resources) implementation(project(":commonskmm")) + implementation(libs.androidx.compose.paging) // Koin api(libs.koin.core) @@ -47,12 +57,10 @@ kotlin { implementation(kotlin("test")) // Koin Test features implementation(libs.koin.test) - implementation(libs.koin.test.junit5) - implementation(libs.koin.test.junit4) implementation(libs.test.turbine) implementation(libs.test.kotlinCoroutines) implementation(libs.test.mockitoKotlin) - implementation(compose.components.resources) + implementation(libs.compose.components.resources) } androidMain.dependencies { @@ -63,19 +71,22 @@ kotlin { implementation(libs.koin.androidx.compose) implementation(project(":commons")) implementation(project(":dhis2_android_maps")) + compileOnly(libs.androidx.compose.uitooling) } - androidUnitTest.dependencies { - implementation(kotlin("test")) - implementation(libs.junit.jupiter) - implementation(libs.test.turbine) - implementation(libs.test.kotlinCoroutines) - implementation(libs.test.mockitoKotlin) + getByName("androidHostTest") { + dependencies { + implementation(kotlin("test")) + implementation(libs.junit.jupiter) + implementation(libs.test.turbine) + implementation(libs.test.kotlinCoroutines) + implementation(libs.test.mockitoKotlin) + } } val desktopMain by getting { dependencies { - implementation(compose.desktop.common) + implementation(libs.compose.desktop.common) } } } @@ -87,35 +98,6 @@ compose.resources { generateResClass = always } -android { - namespace = "org.dhis2.mobile.tracker" - compileSdk = libs.versions.sdk.get().toInt() - - sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml") - sourceSets["main"].res.srcDirs("src/androidMain/res") - - defaultConfig { - minSdk = libs.versions.minSdk.get().toInt() - - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") - } - - compileOptions { - isCoreLibraryDesugaringEnabled = true - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - - dependencies { - coreLibraryDesugaring(libs.desugar) - } -} - - - dependencies { - testImplementation(libs.junit.jupiter) - debugImplementation(libs.androidx.compose.preview) - debugImplementation(libs.androidx.compose.uitooling) -} \ No newline at end of file + coreLibraryDesugaring(libs.desugar) +} diff --git a/tracker/src/androidUnitTest/kotlin/org/dhis2/tracker/relationships/AndroidRelationshipFakeModels.kt b/tracker/src/androidHostTest/kotlin/org/dhis2/tracker/relationships/AndroidRelationshipFakeModels.kt similarity index 100% rename from tracker/src/androidUnitTest/kotlin/org/dhis2/tracker/relationships/AndroidRelationshipFakeModels.kt rename to tracker/src/androidHostTest/kotlin/org/dhis2/tracker/relationships/AndroidRelationshipFakeModels.kt diff --git a/tracker/src/androidUnitTest/kotlin/org/dhis2/tracker/relationships/data/TrackerRelationshipsRepositoryTest.kt b/tracker/src/androidHostTest/kotlin/org/dhis2/tracker/relationships/data/TrackerRelationshipsRepositoryTest.kt similarity index 100% rename from tracker/src/androidUnitTest/kotlin/org/dhis2/tracker/relationships/data/TrackerRelationshipsRepositoryTest.kt rename to tracker/src/androidHostTest/kotlin/org/dhis2/tracker/relationships/data/TrackerRelationshipsRepositoryTest.kt diff --git a/tracker/src/androidHostTest/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImplTest.kt b/tracker/src/androidHostTest/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImplTest.kt new file mode 100644 index 00000000000..8fe4610f73f --- /dev/null +++ b/tracker/src/androidHostTest/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImplTest.kt @@ -0,0 +1,470 @@ +package org.dhis2.tracker.search.data + +import kotlinx.coroutines.test.runTest +import org.dhis2.commons.filters.data.FilterPresenter +import org.dhis2.tracker.data.ProfilePictureProvider +import org.dhis2.tracker.search.model.SearchOperator +import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.arch.repositories.`object`.ReadOnlyOneObjectRepositoryFinalImpl +import org.hisp.dhis.android.core.common.ObjectWithUid +import org.hisp.dhis.android.core.trackedentity.TrackedEntityAttribute +import org.hisp.dhis.android.core.trackedentity.TrackedEntityTypeAttribute +import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchCollectionRepository +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.mockito.Mockito +import org.mockito.kotlin.any +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever + +class SearchTrackedEntityRepositoryImplTest { + private lateinit var repository: SearchTrackedEntityRepositoryImpl + + private val d2: D2 = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) + private val filterPresenter: FilterPresenter = mock() + private val profilePictureProvider: ProfilePictureProvider = mock() + private val teType = "personType" + private val programUid = "programUid" + + @Before + fun setup() { + repository = + SearchTrackedEntityRepositoryImpl( + d2 = d2, + filterPresenter = filterPresenter, + profilePictureProvider = profilePictureProvider, + ) + } + + @Test + fun `isTETypeAttribute should return true when attribute belongs to teType`() = + runTest { + // Given + val attributeUid = "attr1" + val mockOneRepository: ReadOnlyOneObjectRepositoryFinalImpl<TrackedEntityTypeAttribute> = mock() + + whenever( + d2 + .trackedEntityModule() + .trackedEntityTypeAttributes() + .byTrackedEntityTypeUid() + .eq(teType), + ) doReturn mock() + + whenever( + d2 + .trackedEntityModule() + .trackedEntityTypeAttributes() + .byTrackedEntityTypeUid() + .eq(teType) + .byTrackedEntityAttributeUid(), + ) doReturn mock() + + whenever( + d2 + .trackedEntityModule() + .trackedEntityTypeAttributes() + .byTrackedEntityTypeUid() + .eq(teType) + .byTrackedEntityAttributeUid() + .eq(attributeUid), + ) doReturn mock() + + whenever( + d2 + .trackedEntityModule() + .trackedEntityTypeAttributes() + .byTrackedEntityTypeUid() + .eq(teType) + .byTrackedEntityAttributeUid() + .eq(attributeUid) + .one(), + ) doReturn mockOneRepository + + whenever(mockOneRepository.blockingExists()) doReturn true + + // When + val result = repository.isTETypeAttribute(teType, attributeUid) + + // Then + assertTrue(result) + } + + @Test + fun `isTETypeAttribute should return false when attribute does not belong to teType`() = + runTest { + // Given + val attributeUid = "attr1" + val mockOneRepository: ReadOnlyOneObjectRepositoryFinalImpl<TrackedEntityTypeAttribute> = mock() + + whenever( + d2 + .trackedEntityModule() + .trackedEntityTypeAttributes() + .byTrackedEntityTypeUid() + .eq(teType), + ) doReturn mock() + + whenever( + d2 + .trackedEntityModule() + .trackedEntityTypeAttributes() + .byTrackedEntityTypeUid() + .eq(teType) + .byTrackedEntityAttributeUid(), + ) doReturn mock() + + whenever( + d2 + .trackedEntityModule() + .trackedEntityTypeAttributes() + .byTrackedEntityTypeUid() + .eq(teType) + .byTrackedEntityAttributeUid() + .eq(attributeUid), + ) doReturn mock() + + whenever( + d2 + .trackedEntityModule() + .trackedEntityTypeAttributes() + .byTrackedEntityTypeUid() + .eq(teType) + .byTrackedEntityAttributeUid() + .eq(attributeUid) + .one(), + ) doReturn mockOneRepository + + whenever(mockOneRepository.blockingExists()) doReturn false + + // When + val result = repository.isTETypeAttribute(teType, attributeUid) + + // Then + assertFalse(result) + } + + @Test + fun `getTEAttribute should return unique attribute properties`() = + runTest { + // Given + val attributeUid = "uniqueAttr" + val attribute = + TrackedEntityAttribute + .builder() + .uid(attributeUid) + .unique(true) + .optionSet(null) + .build() + + whenever( + d2 + .trackedEntityModule() + .trackedEntityAttributes() + .uid(attributeUid) + .blockingGet(), + ) doReturn attribute + + // When + val result = repository.getTEAttribute(attributeUid) + + // Then + assertTrue(result.isUnique) + assertFalse(result.isOptionSet) + } + + @Test + fun `getTEAttribute should return option set attribute properties`() = + runTest { + // Given + val attributeUid = "optionSetAttr" + + val attribute = + TrackedEntityAttribute + .builder() + .uid(attributeUid) + .unique(false) + .optionSet( + ObjectWithUid + .create("optionSetUid"), + ).build() + + whenever( + d2 + .trackedEntityModule() + .trackedEntityAttributes() + .uid(attributeUid) + .blockingGet(), + ) doReturn attribute + + // When + val result = repository.getTEAttribute(attributeUid) + + // Then + assertFalse(result.isUnique) + assertTrue(result.isOptionSet) + } + + @Test + fun `addToQuery should add filter with multiple values using in`() = + runTest { + // Given + val dataId = "attr1" + val dataValues = listOf("value1", "value2", "value3") + val mockQuery: TrackedEntitySearchCollectionRepository = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) + + // Initialize query first + whenever(filterPresenter.filteredTrackedEntityInstances(any(), any())) doReturn mockQuery + + repository.addFiltersToQuery(programUid, teType) + + // When + repository.addToQuery( + dataId = dataId, + dataValues = dataValues, + searchOperator = null, + ) + + // Then - verify the filter was applied + verify(mockQuery).byFilter(dataId) + } + + @Test + fun `addToQuery should add filter with exact match for unique attribute`() = + runTest { + // Given + val dataId = "uniqueAttr" + val dataValues = listOf("exactValue") + val mockQuery: TrackedEntitySearchCollectionRepository = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) + + // Initialize query first + whenever(filterPresenter.filteredTrackedEntityInstances(any(), any())) doReturn mockQuery + + repository.addFiltersToQuery(programUid, teType) + + // When + repository.addToQuery( + dataId = dataId, + dataValues = dataValues, + searchOperator = SearchOperator.EQ, + ) + + // Then - verify the filter was applied + verify(mockQuery).byFilter(dataId) + } + + @Test + fun `addToQuery should add filter with exact match for option set attribute`() = + runTest { + // Given + val dataId = "optionSetAttr" + val dataValues = listOf("optionValue") + val mockQuery: TrackedEntitySearchCollectionRepository = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) + + // Initialize query first + whenever(filterPresenter.filteredTrackedEntityInstances(any(), any())) doReturn mockQuery + + repository.addFiltersToQuery(programUid, teType) + + // When + repository.addToQuery( + dataId = dataId, + dataValues = dataValues, + searchOperator = SearchOperator.EQ, + ) + + // Then - verify the filter was applied + verify(mockQuery).byFilter(dataId) + } + + @Test + fun `addToQuery should add filter with like for regular attribute`() = + runTest { + // Given + val dataId = "regularAttr" + val dataValues = listOf("searchValue") + val mockQuery: TrackedEntitySearchCollectionRepository = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) + + // Initialize query first + whenever(filterPresenter.filteredTrackedEntityInstances(any(), any())) doReturn mockQuery + + repository.addFiltersToQuery(programUid, teType) + + // When + repository.addToQuery( + dataId = dataId, + dataValues = dataValues, + searchOperator = SearchOperator.LIKE, + ) + + // Then - verify the filter was applied + verify(mockQuery).byFilter(dataId) + } + + @Test + fun `addToQuery should do nothing when dataValues is null`() = + runTest { + // Given + val dataId = "attr1" + val mockQuery: TrackedEntitySearchCollectionRepository = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) + + whenever(filterPresenter.filteredTrackedEntityInstances(any(), any())) doReturn mockQuery + + repository.addFiltersToQuery(programUid, teType) + + // When + repository.addToQuery( + dataId = dataId, + dataValues = null, + searchOperator = null, + ) + + // Then - byFilter should never be called, query remains unchanged + verify(mockQuery, Mockito.never()).byFilter(any()) + } + + @Test + fun `addToQuery should do nothing when dataValues is empty`() = + runTest { + // Given + val dataId = "attr1" + val mockQuery: TrackedEntitySearchCollectionRepository = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) + + whenever(filterPresenter.filteredTrackedEntityInstances(any(), any())) doReturn mockQuery + + repository.addFiltersToQuery(programUid, teType) + + // When + repository.addToQuery( + dataId = dataId, + dataValues = emptyList(), + searchOperator = null, + ) + + // Then - byFilter should never be called, query remains unchanged + verify(mockQuery, Mockito.never()).byFilter(any()) + } + + @Test + fun `addFiltersToQuery should initialize query with filter presenter`() = + runTest { + // Given + val mockQuery: TrackedEntitySearchCollectionRepository = mock() + whenever(filterPresenter.filteredTrackedEntityInstances(programUid, teType)) doReturn mockQuery + + // When + repository.addFiltersToQuery(programUid, teType) + + // Then + verify(filterPresenter).filteredTrackedEntityInstances(programUid, teType) + } + + @Test + fun `excludeValuesFromQuery should add exclude filter`() = + runTest { + // Given + val excludeValues = listOf("uid1", "uid2", "uid3") + val mockQuery: TrackedEntitySearchCollectionRepository = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) + + whenever(filterPresenter.filteredTrackedEntityInstances(any(), any())) doReturn mockQuery + + repository.addFiltersToQuery(programUid, teType) + + // When + repository.excludeValuesFromQuery(excludeValues) + + // Then + verify(mockQuery).excludeUids() + } + + @Test + fun `fetchResults should return offline only when offline or has state filters`() = + runTest { + // Given + val mockQuery: TrackedEntitySearchCollectionRepository = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) + + whenever(filterPresenter.filteredTrackedEntityInstances(any(), any())) doReturn mockQuery + + repository.addFiltersToQuery(programUid, teType) + + // When + val result = + repository.fetchResults( + isOnline = false, + hasStateFilters = false, + allowCache = true, + selectedProgram = programUid, + ) + + // Then + assertNotNull(result) + verify(mockQuery).allowOnlineCache() + } + + @Test + fun `fetchResults should return offline first when online and no state filters`() = + runTest { + // Given + val mockQuery: TrackedEntitySearchCollectionRepository = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) + + whenever(filterPresenter.filteredTrackedEntityInstances(any(), any())) doReturn mockQuery + + repository.addFiltersToQuery(programUid, teType) + + // When + val result = + repository.fetchResults( + isOnline = true, + hasStateFilters = false, + allowCache = false, + selectedProgram = programUid, + ) + + // Then + assertNotNull(result) + verify(mockQuery).allowOnlineCache() + } + + @Test + fun `fetchResults should use allowCache parameter correctly`() = + runTest { + // Given + val mockQuery: TrackedEntitySearchCollectionRepository = mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS) + + whenever(filterPresenter.filteredTrackedEntityInstances(any(), any())) doReturn mockQuery + + repository.addFiltersToQuery(programUid, teType) + + // When + repository.fetchResults( + isOnline = true, + hasStateFilters = false, + allowCache = true, + selectedProgram = programUid, + ) + + // Then + verify(mockQuery).allowOnlineCache() + } + + @Test(expected = IllegalStateException::class) + fun `fetchResults should throw exception when query not initialized`() = + runTest { + // Given - no query initialized + + // When + repository.fetchResults( + isOnline = false, + hasStateFilters = false, + allowCache = true, + selectedProgram = programUid, + ) + + // Then - exception is thrown + } +} diff --git a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepositoryImpl.kt b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepositoryImpl.kt new file mode 100644 index 00000000000..533b3056919 --- /dev/null +++ b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepositoryImpl.kt @@ -0,0 +1,73 @@ +package org.dhis2.tracker.search.data + +import androidx.paging.PagingData +import androidx.paging.map +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.emitAll +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.map +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.mobile.commons.error.DomainErrorMapper +import org.dhis2.tracker.input.ui.state.TrackerOptionItem +import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.arch.repositories.scope.RepositoryScope +import org.hisp.dhis.android.core.maintenance.D2Error + +/** + * Android implementation of OptionSetRepository using DHIS2 Android SDK. + */ +class OptionSetRepositoryImpl( + private val d2: D2, + private val domainErrorMapper: DomainErrorMapper, +) : OptionSetRepository { + /** + * Fetches paginated options for a given option set. + * @param optionSetUid The unique identifier of the option set + * @param pageSize Number of items per page + * @param searchQuery Optional search query to filter options + * @return Flow of paginated option items. The `flow { }` builder creates a cold (lazy) flow that + * will be executed when collected. The code inside runs in the collector's coroutine context. + */ + override fun getOptions( + optionSetUid: String, + pageSize: Int, + searchQuery: String?, + ): Flow<PagingData<TrackerOptionItem>> = + flow { + try { + var query = + d2 + .optionModule() + .options() + .byOptionSetUid() + .eq(optionSetUid) + .orderBySortOrder(RepositoryScope.OrderByDirection.ASC) + + // Apply search filter if provided + searchQuery?.takeIf { it.isNotBlank() }?.let { search -> + query = query.byDisplayName().like("%$search%") + } + + val pagingFlow = + query + .getPagingData(pageSize) + .map { pagingData -> + pagingData.map { option -> + TrackerOptionItem( + code = option.code() ?: "", + displayName = option.displayName() ?: "", + ) + } + } + + emitAll(pagingFlow) + } catch (e: CancellationException) { + // Rethrow CancellationException to properly cancel the coroutine + } catch (d2Error: D2Error) { + throw domainErrorMapper.mapToDomainError(d2Error) + } catch (e: Exception) { + throw DomainError.UnexpectedError(e.message ?: "Unknown error fetching options") + } + } +} diff --git a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchParametersRepositoryImpl.kt b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchParametersRepositoryImpl.kt new file mode 100644 index 00000000000..45b2145bed7 --- /dev/null +++ b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchParametersRepositoryImpl.kt @@ -0,0 +1,298 @@ +package org.dhis2.tracker.search.data + +import org.dhis2.mobile.commons.customintents.CustomIntentRepository +import org.dhis2.mobile.commons.error.DomainErrorMapper +import org.dhis2.mobile.commons.model.CustomIntentActionTypeModel +import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.search.model.SearchOperator +import org.dhis2.tracker.search.model.SearchParameterModel +import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.arch.repositories.scope.RepositoryScope +import org.hisp.dhis.android.core.arch.repositories.scope.internal.TrackerSearchOperator +import org.hisp.dhis.android.core.common.ValueType +import org.hisp.dhis.android.core.common.ValueTypeRenderingType +import org.hisp.dhis.android.core.maintenance.D2Error +import org.hisp.dhis.android.core.program.ProgramTrackedEntityAttribute +import org.hisp.dhis.android.core.trackedentity.TrackedEntityAttribute +import org.hisp.dhis.android.core.trackedentity.TrackedEntityTypeAttribute + +class SearchParametersRepositoryImpl( + val d2: D2, + val customIntentRepository: CustomIntentRepository, + val domainErrorMapper: DomainErrorMapper, +) : SearchParametersRepository { + override suspend fun getSearchParametersByProgram(programUid: String): List<SearchParameterModel> = + try { + // this is the attribute and its properties related to a specific program + val programTrackedEntityAttributes = + getSearchableProgramTrackedEntityAttributes(programUid) + programTrackedEntityAttributes.mapNotNull { programTrackedEntityAttribute -> + + // Now, we get the TrackedEntityAttribute with all the info + val trackedEntityAttribute = + getTrackedEntityAttributeByProgram(programTrackedEntityAttribute) + trackedEntityAttribute?.let { attribute -> + val renderingType = programTrackedEntityAttribute.renderType()?.mobile()?.type() + val customIntent = + customIntentRepository.getCustomIntent( + attribute.uid(), + orgUnitUid = null, + actionType = CustomIntentActionTypeModel.SEARCH, + ) + + SearchParameterModel( + uid = attribute.uid(), + label = attribute.displayFormName() ?: "", + inputType = + getInputType( + attribute = attribute, + isCustomIntent = customIntent != null, + valueTypeRenderingType = renderingType, + ), + optionSet = attribute.optionSet()?.uid(), + customIntentUid = customIntent?.uid, + minCharactersToSearch = attribute.minCharactersToSearch(), + searchOperator = getSearchOperator(attribute), + isUnique = attribute.unique() ?: false, + ) + } + } + } catch (d2Error: D2Error) { + throw domainErrorMapper.mapToDomainError(d2Error) + } + + override suspend fun getSearchParametersByTrackedEntityType(trackedEntityTypeUid: String): List<SearchParameterModel> = + try { + val trackedEntityAttributes = + getTrackedEntityAttributesByTrackedEntityType(trackedEntityTypeUid) + trackedEntityAttributes.mapNotNull { trackedEntityTypeAttribute -> + // Now, we get the TrackedEntityAttribute with all the info + val trackedEntityAttribute = + getTrackedEntityAttributeByTrackedEntityType(trackedEntityTypeAttribute) + trackedEntityAttribute?.let { attribute -> + SearchParameterModel( + uid = attribute.uid(), + label = attribute.displayFormName() ?: "", + inputType = + getInputType( + attribute = attribute, + isCustomIntent = false, + valueTypeRenderingType = null, + ), + optionSet = attribute.optionSet()?.uid(), + customIntentUid = null, + minCharactersToSearch = attribute.minCharactersToSearch(), + searchOperator = getSearchOperator(attribute), + isUnique = attribute.unique() ?: false, + ) + } + } + } catch (d2Error: D2Error) { + throw domainErrorMapper.mapToDomainError(d2Error) + } + + private fun getTrackedEntityAttributeByTrackedEntityType( + trackedEntityTypeAttribute: TrackedEntityTypeAttribute, + ): TrackedEntityAttribute? = + trackedEntityTypeAttribute.trackedEntityAttribute()?.uid()?.let { uid -> + d2 + .trackedEntityModule() + .trackedEntityAttributes() + .uid(uid) + .blockingGet() + } + + private fun getTrackedEntityAttributesByTrackedEntityType(trackedEntityTypeUid: String): List<TrackedEntityTypeAttribute> = + d2 + .trackedEntityModule() + .trackedEntityTypeAttributes() + .byTrackedEntityTypeUid() + .eq(trackedEntityTypeUid) + .bySearchable() + .isTrue + .blockingGet() + + private fun getTrackedEntityAttributeByProgram(programTrackedEntityAttribute: ProgramTrackedEntityAttribute): TrackedEntityAttribute? = + programTrackedEntityAttribute.trackedEntityAttribute()?.uid()?.let { uid -> + d2 + .trackedEntityModule() + .trackedEntityAttributes() + .uid(uid) + .blockingGet() + } + + private fun getSearchableProgramTrackedEntityAttributes(programUid: String): List<ProgramTrackedEntityAttribute> = + d2 + .programModule() + .programTrackedEntityAttributes() + .withRenderType() + .byProgram() + .eq(programUid) + .orderBySortOrder(RepositoryScope.OrderByDirection.ASC) + .blockingGet() + .filter { programAttribute -> + val isSearchable = programAttribute.searchable()!! + val isUnique = + d2 + .trackedEntityModule() + .trackedEntityAttributes() + .uid(programAttribute.trackedEntityAttribute()!!.uid()) + .blockingGet() + ?.unique() == true + isSearchable || isUnique + } + + private fun getInputType( + attribute: TrackedEntityAttribute, + isCustomIntent: Boolean, + valueTypeRenderingType: ValueTypeRenderingType?, + ): TrackerInputType = + when { + attribute.optionSet()?.uid() != null && attribute.valueType() != ValueType.MULTI_TEXT + -> getInputTypeForOptionSetByRenderingType(valueTypeRenderingType) + + isCustomIntent -> TrackerInputType.CUSTOM_INTENT + + else -> getInputTypeByValueType(attribute.valueType(), valueTypeRenderingType) + } + + private fun getInputTypeByValueType( + valueType: ValueType?, + valueTypeRenderingType: ValueTypeRenderingType?, + ): TrackerInputType = + when (valueType) { + ValueType.TEXT -> { + when (valueTypeRenderingType) { + ValueTypeRenderingType.QR_CODE, ValueTypeRenderingType.GS1_DATAMATRIX -> TrackerInputType.QR_CODE + ValueTypeRenderingType.BAR_CODE -> TrackerInputType.BAR_CODE + else -> TrackerInputType.TEXT + } + } + + ValueType.INTEGER_POSITIVE -> TrackerInputType.INTEGER_POSITIVE + ValueType.INTEGER_ZERO_OR_POSITIVE -> TrackerInputType.INTEGER_ZERO_OR_POSITIVE + ValueType.PERCENTAGE -> TrackerInputType.PERCENTAGE + ValueType.NUMBER -> TrackerInputType.NUMBER + ValueType.INTEGER_NEGATIVE -> TrackerInputType.INTEGER_NEGATIVE + ValueType.LONG_TEXT -> TrackerInputType.LONG_TEXT + ValueType.INTEGER -> TrackerInputType.INTEGER + ValueType.ORGANISATION_UNIT -> TrackerInputType.ORGANISATION_UNIT + ValueType.EMAIL -> TrackerInputType.EMAIL + ValueType.BOOLEAN -> { + when (valueTypeRenderingType) { + ValueTypeRenderingType.HORIZONTAL_CHECKBOXES -> TrackerInputType.HORIZONTAL_CHECKBOXES + ValueTypeRenderingType.VERTICAL_CHECKBOXES -> TrackerInputType.VERTICAL_CHECKBOXES + ValueTypeRenderingType.HORIZONTAL_RADIOBUTTONS -> TrackerInputType.HORIZONTAL_RADIOBUTTONS + else -> TrackerInputType.VERTICAL_RADIOBUTTONS + } + } + + ValueType.TRUE_ONLY -> { + when (valueTypeRenderingType) { + ValueTypeRenderingType.TOGGLE -> TrackerInputType.YES_ONLY_SWITCH + else -> TrackerInputType.YES_ONLY_CHECKBOX + } + } + + ValueType.PHONE_NUMBER -> TrackerInputType.PHONE_NUMBER + ValueType.DATE -> TrackerInputType.DATE + ValueType.DATETIME -> TrackerInputType.DATE_TIME + ValueType.TIME -> TrackerInputType.TIME + + ValueType.AGE -> TrackerInputType.AGE + ValueType.MULTI_TEXT -> TrackerInputType.MULTI_SELECTION + + ValueType.USERNAME, + ValueType.LETTER, + ValueType.UNIT_INTERVAL, + ValueType.TRACKER_ASSOCIATE, + ValueType.REFERENCE, + ValueType.FILE_RESOURCE, + ValueType.GEOJSON, + ValueType.URL, + null, + -> TrackerInputType.NOT_SUPPORTED + + ValueType.COORDINATE -> TrackerInputType.COORDINATES + ValueType.IMAGE -> TrackerInputType.IMAGE + } + + private fun getInputTypeForOptionSetByRenderingType(valueTypeRenderingType: ValueTypeRenderingType?): TrackerInputType = + when (valueTypeRenderingType) { + ValueTypeRenderingType.HORIZONTAL_RADIOBUTTONS -> TrackerInputType.HORIZONTAL_RADIOBUTTONS + ValueTypeRenderingType.VERTICAL_RADIOBUTTONS -> TrackerInputType.VERTICAL_RADIOBUTTONS + ValueTypeRenderingType.HORIZONTAL_CHECKBOXES -> TrackerInputType.HORIZONTAL_CHECKBOXES + ValueTypeRenderingType.VERTICAL_CHECKBOXES -> TrackerInputType.VERTICAL_CHECKBOXES + else -> TrackerInputType.DROPDOWN + } + + private fun getSearchOperator(attribute: TrackedEntityAttribute): SearchOperator? { + val mainOperators = listOf(SearchOperator.LIKE, SearchOperator.SW, SearchOperator.EQ) + val blockedOperators = + attribute + .blockedSearchOperators() + ?.mapNotNull { sdkOperator -> + sdkOperator.toSearchOperator() + } ?: emptyList() + val preferredOperator: SearchOperator? = + attribute.preferredSearchOperator()?.toSearchOperator() + val valueType = attribute.valueType() + val hasOptionSet = attribute.optionSet() != null + val isUnique = attribute.unique() == true + + val alwaysEqValueTypes = + listOf( + ValueType.BOOLEAN, + ValueType.TRUE_ONLY, + ValueType.AGE, + ValueType.ORGANISATION_UNIT, + ) + + val preferredOperatorValueTypes = + listOf( + ValueType.NUMBER, + ValueType.INTEGER, + ValueType.INTEGER_POSITIVE, + ValueType.INTEGER_NEGATIVE, + ValueType.INTEGER_ZERO_OR_POSITIVE, + ValueType.DATE, + ValueType.DATETIME, + ValueType.TIME, + ValueType.TEXT, + ValueType.LONG_TEXT, + ValueType.EMAIL, + ValueType.PHONE_NUMBER, + ValueType.PERCENTAGE, + ) + + return when { + isUnique || + (hasOptionSet && valueType != ValueType.MULTI_TEXT) || + valueType in alwaysEqValueTypes -> { + SearchOperator.EQ + } + + valueType == ValueType.MULTI_TEXT -> { + mainOperators.firstOrNull { it !in blockedOperators } + } + + valueType in preferredOperatorValueTypes -> { + if (preferredOperator != null && preferredOperator !in blockedOperators) { + preferredOperator + } else { + mainOperators.firstOrNull { it !in blockedOperators } + } + } + + else -> null + } + } + + private fun TrackerSearchOperator.toSearchOperator() = + when (this) { + TrackerSearchOperator.LIKE -> SearchOperator.LIKE + TrackerSearchOperator.SW -> SearchOperator.SW + TrackerSearchOperator.EW -> SearchOperator.EW + TrackerSearchOperator.EQ -> SearchOperator.EQ + } +} diff --git a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImpl.kt b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImpl.kt new file mode 100644 index 00000000000..0c1306a445f --- /dev/null +++ b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepositoryImpl.kt @@ -0,0 +1,599 @@ +package org.dhis2.tracker.search.data + +import androidx.paging.PagingData +import androidx.paging.map +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map +import org.dhis2.commons.filters.data.FilterPresenter +import org.dhis2.mobile.commons.extensions.getTodayAsInstant +import org.dhis2.mobile.commons.extensions.toKtxInstant +import org.dhis2.tracker.data.ProfilePictureProvider +import org.dhis2.tracker.relationships.model.RelationshipDirection +import org.dhis2.tracker.relationships.model.RelationshipGeometry +import org.dhis2.tracker.relationships.model.RelationshipModel +import org.dhis2.tracker.relationships.model.RelationshipOwnerType +import org.dhis2.tracker.search.model.DomainEnrollment +import org.dhis2.tracker.search.model.DomainObjectStyle +import org.dhis2.tracker.search.model.DomainProgram +import org.dhis2.tracker.search.model.SearchOperator +import org.dhis2.tracker.search.model.SearchTrackedEntityAttribute +import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult +import org.hisp.dhis.android.core.D2 +import org.hisp.dhis.android.core.arch.repositories.scope.RepositoryScope +import org.hisp.dhis.android.core.common.State +import org.hisp.dhis.android.core.enrollment.EnrollmentStatus +import org.hisp.dhis.android.core.event.EventStatus +import org.hisp.dhis.android.core.relationship.RelationshipItem +import org.hisp.dhis.android.core.relationship.RelationshipItemTrackedEntityInstance +import org.hisp.dhis.android.core.trackedentity.TrackedEntityAttributeValue +import org.hisp.dhis.android.core.trackedentity.TrackedEntityInstance +import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchCollectionRepository +import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItem +import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItemHelper.toTrackedEntityInstance +import kotlin.time.Instant + +class SearchTrackedEntityRepositoryImpl( + private val d2: D2, + private val filterPresenter: FilterPresenter, + private val profilePictureProvider: ProfilePictureProvider, +) : SearchTrackedEntityRepository { + private var trackedEntityInstanceQuery: TrackedEntitySearchCollectionRepository? = null + + // Checks whether the dataId is an attribute of the teType + override suspend fun isTETypeAttribute( + teType: String, + dataId: String, + ): Boolean = + d2 + .trackedEntityModule() + .trackedEntityTypeAttributes() + .byTrackedEntityTypeUid() + .eq(teType) + .byTrackedEntityAttributeUid() + .eq(dataId) + .one() + .blockingExists() + + override suspend fun getTEAttribute(dataId: String): SearchTrackedEntityAttribute { + val attribute = + d2 + .trackedEntityModule() + .trackedEntityAttributes() + .uid(dataId) + .blockingGet() + return SearchTrackedEntityAttribute( + isUnique = attribute?.unique() == true, + isOptionSet = (attribute?.optionSet() != null), + ) + } + + override suspend fun addToQuery( + dataId: String, + dataValues: List<String>?, + searchOperator: SearchOperator?, + ) { + if (dataValues.isNullOrEmpty()) return + + trackedEntityInstanceQuery = + if (dataValues.size > 1) { + // return any tracked entities with attributes that match the values in the list + trackedEntityInstanceQuery?.byFilter(dataId)?.`in`(dataValues) + } else { + when (searchOperator) { + SearchOperator.LIKE -> { + trackedEntityInstanceQuery?.byFilter(dataId)?.like(dataValues[0]) + } + + SearchOperator.SW -> { + trackedEntityInstanceQuery?.byFilter(dataId)?.sw(dataValues[0]) + } + + SearchOperator.EW -> { + trackedEntityInstanceQuery?.byFilter(dataId)?.ew(dataValues[0]) + } + + SearchOperator.EQ -> { + trackedEntityInstanceQuery?.byFilter(dataId)?.eq(dataValues[0]) + } + + else -> trackedEntityInstanceQuery?.byFilter(dataId)?.like(dataValues[0]) + } + } + } + + override suspend fun addFiltersToQuery( + program: String?, + teType: String, + ) { + trackedEntityInstanceQuery = + filterPresenter.filteredTrackedEntityInstances( + program, + teType, + ) + } + + override suspend fun excludeValuesFromQuery(excludeValues: List<String>) { + trackedEntityInstanceQuery = trackedEntityInstanceQuery?.excludeUids()?.`in`(excludeValues) + } + + override fun fetchResults( + isOnline: Boolean, + hasStateFilters: Boolean, + allowCache: Boolean, + selectedProgram: String?, + ): Flow<PagingData<TrackedEntitySearchItemResult>> { + // if the device is online and there are no state filters, we can use online cache + val pagerFlow = + if (isOnline && !hasStateFilters) { + trackedEntityInstanceQuery?.allowOnlineCache()?.eq(allowCache)?.offlineFirst() + } else { + // otherwise we use offline only + trackedEntityInstanceQuery?.allowOnlineCache()?.eq(allowCache)?.offlineOnly() + } + val displayOrgUnit = shouldDisplayOrgUnit(selectedProgram) + // map the paging data to TrackedEntitySearchItemResult + return pagerFlow?.getPagingData(10)?.map { pagingData -> + pagingData.map { item -> + mapItemToDomainResult(item, selectedProgram, hasStateFilters, displayOrgUnit, isOnline) + } + } ?: throw IllegalStateException("TrackedEntityInstanceQuery is not initialized") + } + + override suspend fun fetchImmediateResults( + isOnline: Boolean, + hasStateFilters: Boolean, + selectedProgram: String?, + ): List<TrackedEntitySearchItemResult> { + // if the device is online and there are no state filters, we can use online cache + val results = + if (isOnline && !hasStateFilters) { + trackedEntityInstanceQuery?.offlineFirst()?.blockingGet() + } else { + // otherwise we use offline only + trackedEntityInstanceQuery?.offlineOnly()?.blockingGet() + } + val displayOrgUnit = shouldDisplayOrgUnit(selectedProgram) + return results?.map { item -> + mapItemToDomainResult(item, selectedProgram, hasStateFilters, displayOrgUnit, isOnline) + } ?: throw IllegalStateException("TrackedEntityInstanceQuery is not initialized") + } + + private fun mapItemToDomainResult( + item: TrackedEntitySearchItem, + selectedProgram: String?, + hasStateFilters: Boolean, + displayOrgUnit: Boolean, + deviceIsOnline: Boolean, + ): TrackedEntitySearchItemResult { + val dbTei = getDatabaseTei(item) + val selectedEnrollment = getSelectedEnrollment(dbTei, selectedProgram) + val isOnline = + if (!deviceIsOnline) { + false + } else { + !( + !item.isOnline && !hasStateFilters && + (dbTei.deleted() == false || dbTei.deleted() == null) + ) + } + val enrollments = getTeiEnrollments(item.uid) + val overDueDate: Instant? = getOverdueDate(enrollments, selectedProgram) + val relationships = + if (dbTei.aggregatedSyncState() != State.RELATIONSHIP && selectedProgram?.isNotEmpty() == true) { + getRelationShips(item.uid, selectedProgram, item.type.uid()) + } else { + null + } + + val enrolledOrgUnit = + if (selectedEnrollment != null) { + orgUnitName(selectedEnrollment.orgUnit) + } else { + orgUnitName(item.organisationUnit) + } + + val ownerOrgUnit = item.programOwners?.firstOrNull()?.ownerOrgUnit + val ownerOrgUnitName = + if (ownerOrgUnit != selectedEnrollment?.orgUnit) { + orgUnitName(ownerOrgUnit) + } else { + null + } + + val profilePicture = profilePictureProvider.invoke(dbTei, selectedProgram) + val enrolledPrograms = getEnrolledPrograms(enrollments) + return item.toTrackedEntitySearchItemResult( + selectedEnrollment = selectedEnrollment, + isOnline = isOnline, + overDueDate = overDueDate, + ownerOrgUnit = ownerOrgUnitName, + enrollmentOrgUnit = enrolledOrgUnit, + shouldDisplayOrgUnit = displayOrgUnit, + profilePicture = profilePicture, + enrollments = enrollments, + enrolledPrograms = enrolledPrograms, + relationships = relationships, + ) + } + + private fun getEnrolledPrograms(enrollments: List<DomainEnrollment>): List<DomainProgram>? { + val programUids = + enrollments + .mapNotNull { it.program } + .distinct() + if (programUids.isEmpty()) { + return null + } + + val programs = + d2 + .programModule() + .programs() + .byUid() + .`in`(programUids) + .blockingGet() + if (programs.isEmpty()) { + return null + } + + val programsByUid = programs.associateBy { it.uid() } + val enrolledPrograms = + enrollments.mapNotNull { enrollment -> + val programUid = enrollment.program ?: return@mapNotNull null + val program = programsByUid[programUid] ?: return@mapNotNull null + DomainProgram( + uid = program.uid(), + displayName = program.displayName() ?: "", + style = + DomainObjectStyle( + icon = program.style()?.icon(), + color = program.style()?.color(), + ), + ) + } + return enrolledPrograms.ifEmpty { null } + } + + private fun shouldDisplayOrgUnit(selectedProgram: String?): Boolean = + if (selectedProgram != null) { + d2 + .organisationUnitModule() + .organisationUnits() + .byProgramUids(listOf(selectedProgram)) + .blockingCount() > 1 + } else { + false + } + + private fun orgUnitName(orgUnit: String?): String? = + orgUnit?.let { + d2 + .organisationUnitModule() + .organisationUnits() + .uid(it) + .blockingGet() + ?.displayName() + } + + private fun getRelationShips( + teiUid: String, + selectedProgram: String, + teType: String, + ): List<RelationshipModel> { + val relationships = + d2.relationshipModule().relationships().getByItem( + RelationshipItem + .builder() + .trackedEntityInstance( + RelationshipItemTrackedEntityInstance + .builder() + .trackedEntityInstance(teiUid) + .build(), + ).build(), + ) + return relationships.mapNotNull { relationship -> + relationship + .from() + ?.trackedEntityInstance() + ?.let { trackedEntityInstanceFromRelationship -> + var relationshipTeiUid: String + + var direction: RelationshipDirection + if (trackedEntityInstanceFromRelationship.trackedEntityInstance() == teiUid) { + relationshipTeiUid = + trackedEntityInstanceFromRelationship.trackedEntityInstance() + direction = RelationshipDirection.FROM + } else { + relationshipTeiUid = + relationship.to()?.trackedEntityInstance()?.trackedEntityInstance() + ?: "" + direction = RelationshipDirection.TO + } + + val fromTeiUid = + relationship.from()?.trackedEntityInstance()?.trackedEntityInstance() + val toTeiUid = + relationship.to()?.trackedEntityInstance()?.trackedEntityInstance() + + val fromTei = + d2 + .trackedEntityModule() + .trackedEntityInstances() + .uid(fromTeiUid) + .blockingGet() + val toTei = + d2 + .trackedEntityModule() + .trackedEntityInstances() + .uid(toTeiUid) + .blockingGet() + val fromAttributes: List<kotlin.Pair<String, String>> = + getTrackedEntityAttributesForRelationship( + fromTeiUid, + selectedProgram, + teType, + ).mapNotNull { trackedEntityAttributeValue -> + val attribute = trackedEntityAttributeValue.trackedEntityAttribute() + val value = trackedEntityAttributeValue.value() + attribute?.let { attribute -> + value?.let { v -> + Pair(attribute, v) + } + } + } + val toAttributes: List<Pair<String, String>> = + getTrackedEntityAttributesForRelationship( + toTeiUid, + selectedProgram, + teType, + ).mapNotNull { trackedEntityAttributeValue -> + val attribute = trackedEntityAttributeValue.trackedEntityAttribute() + val value = trackedEntityAttributeValue.value() + if (attribute != null && value != null) { + Pair(attribute, value) + } else { + null + } + } + + val fromGeometry = + fromTei?.geometry()?.let { geometry -> + RelationshipGeometry( + featureType = geometry.type()?.name, + coordinates = geometry.coordinates(), + ) + } + val toGeometry = + toTei?.geometry()?.let { geometry -> + RelationshipGeometry( + featureType = geometry.type()?.name, + coordinates = geometry.coordinates(), + ) + } + RelationshipModel( + relationshipUid = relationship.uid()!!, + relationshipState = relationship.syncState()?.name ?: State.TO_POST.name, + fromGeometry = fromGeometry, + toGeometry = toGeometry, + direction = direction, + ownerUid = relationshipTeiUid, + ownerType = RelationshipOwnerType.TEI, + fromValues = fromAttributes, + toValues = toAttributes, + fromImage = null, + toImage = null, + fromDefaultImageResource = -1, + toDefaultImageResource = -1, + ownerStyleIcon = null, + ownerStyleColor = null, + canBeOpened = true, + toLastUpdated = null, + fromLastUpdated = null, + toDescription = null, + fromDescription = null, + ) + } + } + } + + private fun getTrackedEntityAttributesForRelationship( + uid: String?, + selectedProgram: String, + teType: String, + ): List<TrackedEntityAttributeValue> { + val attributeValues = + d2 + .trackedEntityModule() + .trackedEntityAttributeValues() + .byTrackedEntityInstance() + .eq(uid) + .byTrackedEntityAttribute() + .`in`(getProgramTrackedEntityAttributeUids(selectedProgram)) + .blockingGet() + return attributeValues.ifEmpty { + d2 + .trackedEntityModule() + .trackedEntityAttributeValues() + .byTrackedEntityInstance() + .eq(uid) + .byTrackedEntityAttribute() + .`in`(getTeTypeTrackedEntityAttributeUids(teType)) + .blockingGet() + } + } + + private fun getProgramTrackedEntityAttributeUids(selectedProgram: String): List<String> = + d2 + .programModule() + .programTrackedEntityAttributes() + .byProgram() + .eq(selectedProgram) + .byDisplayInList() + .isTrue + .orderBySortOrder(RepositoryScope.OrderByDirection.ASC) + .blockingGet() + .map { it.uid() } + + private fun getTeTypeTrackedEntityAttributeUids(teTypeUid: String): List<String> = + d2 + .trackedEntityModule() + .trackedEntityTypeAttributes() + .byTrackedEntityTypeUid() + .eq(teTypeUid) + .byDisplayInList() + .isTrue + .blockingGet() + .mapNotNull { + it.trackedEntityAttribute()?.uid() + } + + private fun getTeiEnrollments(teiUid: String): List<DomainEnrollment> { + val enrollments = + d2 + .enrollmentModule() + .enrollments() + .byTrackedEntityInstance() + .eq(teiUid) + .byDeleted() + .eq(false) + .orderByEnrollmentDate(RepositoryScope.OrderByDirection.DESC) + .blockingGet() + return enrollments.map { it.toDomainEnrollment() } + } + + /** + * Returns the most recent overdue date from events in the given enrollments. + * Returns null if there are no overdue events. + * + * This method checks: + * 1. Events with OVERDUE status + * 2. Events with SCHEDULE status that have passed their due date + * + * Uses kotlinx.datetime exclusively for date comparison (no java.util.Date operations) + */ + private fun getOverdueDate( + enrollments: List<DomainEnrollment>, + selectedProgram: String?, + ): Instant? { + if (enrollments.isEmpty()) return null + + val enrollmentUids = enrollments.map { it.uid } + + // Query for OVERDUE events + var overdueEventsQuery = + d2 + .eventModule() + .events() + .byEnrollmentUid() + .`in`(enrollmentUids) + .byStatus() + .eq(EventStatus.OVERDUE) + + // Query for SCHEDULE events that may be overdue + var scheduledEventsQuery = + d2 + .eventModule() + .events() + .byEnrollmentUid() + .`in`(enrollmentUids) + .byStatus() + .eq(EventStatus.SCHEDULE) + + // Filter by program if specified + if (selectedProgram != null) { + overdueEventsQuery = overdueEventsQuery.byProgramUid().eq(selectedProgram) + scheduledEventsQuery = scheduledEventsQuery.byProgramUid().eq(selectedProgram) + } + + // Get events ordered by due date (most recent first) + val overdueEvents = + overdueEventsQuery + .orderByDueDate(RepositoryScope.OrderByDirection.DESC) + .blockingGet() + + val scheduledEvents = + scheduledEventsQuery + .orderByDueDate(RepositoryScope.OrderByDirection.DESC) + .blockingGet() + + // Get today's date using kotlinx.datetime (non-deprecated way) + val today = getTodayAsInstant() + + // Filter events that are actually overdue (due date is before today) + val allOverdueEvents = + buildList { + // Add all OVERDUE events that have a due date before today + overdueEvents.forEach { event -> + event.dueDate()?.let { dueDate -> + val dueDateLocal = dueDate.toKtxInstant() + // Event is overdue if due date is before today (not equal to today) + if (dueDateLocal < today) { + add(event) + } + } + } + + // Add SCHEDULE events that have passed their due date + scheduledEvents.forEach { event -> + event.dueDate()?.let { dueDate -> + val dueDateLocal = dueDate.toKtxInstant() + // Event is overdue if due date is before today (not equal to today) + if (dueDateLocal < today) { + add(event) + } + } + } + } + + // Return the most recent overdue date as Instant, or null if no overdue events + return allOverdueEvents + .mapNotNull { it.dueDate()?.toKtxInstant() } + .maxOrNull() + } + + private fun getDatabaseTei(item: TrackedEntitySearchItem): TrackedEntityInstance { + val teiFromItem = toTrackedEntityInstance(item) + + return if (item.isOnline) { + d2 + .trackedEntityModule() + .trackedEntityInstances() + .uid(item.uid()) + .blockingGet() ?: teiFromItem + } else { + teiFromItem + } + } + + private fun getSelectedEnrollment( + dbTei: TrackedEntityInstance?, + selectedProgram: String?, + ): DomainEnrollment? { + var selectedEnrollment: DomainEnrollment? = null + // SDK mapping from SearchTrackedEntityItem to TrackedEntityInstance, this might not be needed + if (dbTei != null && dbTei.aggregatedSyncState() != State.RELATIONSHIP) { + // if dbTei is not null we will map the db tei instead of the online tei + + var enrollmentRepository = + d2 + .enrollmentModule() + .enrollments() + .byTrackedEntityInstance() + .eq(dbTei.uid()) + if (selectedProgram != null) { + enrollmentRepository = enrollmentRepository.byProgram().eq(selectedProgram) + } + val enrollmentsInProgram = + enrollmentRepository + .orderByEnrollmentDate(RepositoryScope.OrderByDirection.DESC) + .blockingGet() + if (selectedProgram != null && enrollmentsInProgram.isNotEmpty()) { + selectedEnrollment = + enrollmentsInProgram + .firstOrNull { it.status() == EnrollmentStatus.ACTIVE } + ?.toDomainEnrollment() ?: enrollmentsInProgram.firstOrNull()?.toDomainEnrollment() + } + } + return selectedEnrollment + } +} diff --git a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/TrackedEntitySearchItemMapper.kt b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/TrackedEntitySearchItemMapper.kt new file mode 100644 index 00000000000..7047a9cda58 --- /dev/null +++ b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/data/TrackedEntitySearchItemMapper.kt @@ -0,0 +1,188 @@ +package org.dhis2.tracker.search.data + +import org.dhis2.mobile.commons.extensions.toKtxInstant +import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.relationships.model.RelationshipModel +import org.dhis2.tracker.search.model.DomainEnrollment +import org.dhis2.tracker.search.model.DomainProgram +import org.dhis2.tracker.search.model.EnrollmentStatus +import org.dhis2.tracker.search.model.GeometryFeatureType +import org.dhis2.tracker.search.model.SyncState +import org.dhis2.tracker.search.model.TrackedEntityGeometry +import org.dhis2.tracker.search.model.TrackedEntitySearchItemAttributeDomain +import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult +import org.dhis2.tracker.search.model.TrackedEntityTypeAttributeDomain +import org.dhis2.tracker.search.model.TrackedEntityTypeDomain +import org.hisp.dhis.android.core.common.FeatureType +import org.hisp.dhis.android.core.common.Geometry +import org.hisp.dhis.android.core.common.State +import org.hisp.dhis.android.core.common.ValueType +import org.hisp.dhis.android.core.enrollment.Enrollment +import org.hisp.dhis.android.core.trackedentity.TrackedEntityType +import org.hisp.dhis.android.core.trackedentity.TrackedEntityTypeAttribute +import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItem +import org.hisp.dhis.android.core.trackedentity.search.TrackedEntitySearchItemAttribute +import kotlin.time.Instant +import org.hisp.dhis.android.core.enrollment.EnrollmentStatus as SDKEnrollmentStatus + +fun TrackedEntitySearchItem.toTrackedEntitySearchItemResult( + selectedEnrollment: DomainEnrollment?, + isOnline: Boolean, + overDueDate: Instant?, + ownerOrgUnit: String?, + enrollmentOrgUnit: String?, + shouldDisplayOrgUnit: Boolean, + profilePicture: String?, + enrollments: List<DomainEnrollment>?, + enrolledPrograms: List<DomainProgram>?, + relationships: List<RelationshipModel>?, +): TrackedEntitySearchItemResult = + TrackedEntitySearchItemResult( + uid = this.uid, + created = this.created?.toKtxInstant(), + lastUpdated = this.lastUpdated?.toKtxInstant(), + createdAtClient = this.createdAtClient?.toKtxInstant(), + lastUpdatedAtClient = this.lastUpdatedAtClient?.toKtxInstant(), + ownerOrgUnit = ownerOrgUnit, + enrollmentOrgUnit = enrollmentOrgUnit, + shouldDisplayOrgUnit = shouldDisplayOrgUnit, + geometry = this.geometry.toDomainGeometry(), + syncState = this.syncState?.toSyncState(), + aggregatedSyncState = this.aggregatedSyncState?.toSyncState(), + deleted = this.deleted, + isOnline = isOnline, + teTypeName = this.type.displayName(), + type = this.type.toTrackedEntityType(), + header = this.header, + overDueDate = overDueDate, + selectedEnrollment = selectedEnrollment, + profilePicture = profilePicture, + enrolledPrograms = enrolledPrograms, + defaultTypeIcon = this.type.style()?.icon(), + enrollments = enrollments, + relationships = relationships, + attributeValues = this.attributeValues?.map { it.toTrackedEntitySearchItemAttribute() } ?: emptyList(), + ) + +fun Enrollment.toDomainEnrollment(): DomainEnrollment = + DomainEnrollment( + uid = this.uid(), + orgUnit = this.organisationUnit(), + program = this.program(), + enrollmentDate = this.enrollmentDate()?.toKtxInstant(), + incidentDate = this.incidentDate()?.toKtxInstant(), + completedDate = this.completedDate()?.toKtxInstant(), + followUp = this.followUp() ?: false, + status = + when (this.status()) { + SDKEnrollmentStatus.ACTIVE -> EnrollmentStatus.ACTIVE + SDKEnrollmentStatus.COMPLETED -> EnrollmentStatus.COMPLETED + SDKEnrollmentStatus.CANCELLED -> EnrollmentStatus.CANCELLED + null -> EnrollmentStatus.ACTIVE + }, + trackedEntityInstance = this.trackedEntityInstance(), + ) + +private fun Geometry?.toDomainGeometry(): TrackedEntityGeometry? = + this?.let { + TrackedEntityGeometry( + geometryFeatureType = getGeometryType(it.type()), + coordinates = it.coordinates(), + ) + } + +private fun getGeometryType(type: FeatureType?): GeometryFeatureType = + when (type) { + FeatureType.POINT -> GeometryFeatureType.POINT + FeatureType.MULTI_POLYGON -> GeometryFeatureType.MULTI_POLYGON + FeatureType.POLYGON -> GeometryFeatureType.POLYGON + FeatureType.NONE -> GeometryFeatureType.NONE + FeatureType.SYMBOL -> GeometryFeatureType.SYMBOL + else -> GeometryFeatureType.NONE + } + +private fun State?.toSyncState(): SyncState? = + when (this) { + State.TO_POST -> SyncState.TO_POST + State.TO_UPDATE -> SyncState.TO_UPDATE + State.ERROR -> SyncState.ERROR + State.SYNCED -> SyncState.SYNCED + State.WARNING -> SyncState.WARNING + State.UPLOADING -> SyncState.UPLOADING + State.RELATIONSHIP -> SyncState.RELATIONSHIP + State.SENT_VIA_SMS -> SyncState.SENT_VIA_SMS + State.SYNCED_VIA_SMS -> SyncState.SYNCED_VIA_SMS + null -> null + } + +private fun TrackedEntityType.toTrackedEntityType(): TrackedEntityTypeDomain = + TrackedEntityTypeDomain( + trackedEntityTypeAttributeDomains = this.trackedEntityTypeAttributes()?.map { it.toTrackedEntityTypeAttribute() } ?: emptyList(), + featureType = getGeometryType(this.featureType()), + ) + +private fun TrackedEntityTypeAttribute.toTrackedEntityTypeAttribute(): TrackedEntityTypeAttributeDomain = + TrackedEntityTypeAttributeDomain( + trackedEntityTypeUid = this.trackedEntityType()?.uid(), + trackedEntityAttributeUid = this.trackedEntityAttribute()?.uid(), + displayInList = this.displayInList() ?: false, + mandatory = this.mandatory() ?: false, + searchable = this.searchable() ?: false, + sortOrder = this.sortOrder() ?: 0, + ) + +private fun TrackedEntitySearchItemAttribute.toTrackedEntitySearchItemAttribute(): TrackedEntitySearchItemAttributeDomain = + TrackedEntitySearchItemAttributeDomain( + attribute = this.attribute, + displayName = this.displayName, + displayFormName = this.displayFormName, + value = this.value, + valueType = this.valueType.toTrackerInputType(), + displayInList = this.displayInList, + optionSet = this.optionSet, + ) + +private fun ValueType.toTrackerInputType(): TrackerInputType = + when (this) { + ValueType.TEXT -> TrackerInputType.TEXT + ValueType.LONG_TEXT -> TrackerInputType.LONG_TEXT + ValueType.NUMBER -> TrackerInputType.NUMBER + ValueType.INTEGER -> TrackerInputType.INTEGER + ValueType.INTEGER_POSITIVE -> TrackerInputType.INTEGER_POSITIVE + ValueType.INTEGER_NEGATIVE -> TrackerInputType.INTEGER_NEGATIVE + ValueType.INTEGER_ZERO_OR_POSITIVE -> TrackerInputType.INTEGER_ZERO_OR_POSITIVE + ValueType.BOOLEAN -> TrackerInputType.HORIZONTAL_RADIOBUTTONS + ValueType.TRUE_ONLY -> TrackerInputType.YES_ONLY_CHECKBOX + ValueType.DATE -> TrackerInputType.DATE + ValueType.DATETIME -> TrackerInputType.DATE_TIME + ValueType.TIME -> TrackerInputType.TIME + ValueType.EMAIL -> TrackerInputType.EMAIL + ValueType.PHONE_NUMBER -> TrackerInputType.PHONE_NUMBER + ValueType.PERCENTAGE -> TrackerInputType.PERCENTAGE + ValueType.URL -> TrackerInputType.URL + ValueType.COORDINATE -> TrackerInputType.NOT_SUPPORTED + ValueType.AGE -> TrackerInputType.AGE + ValueType.ORGANISATION_UNIT -> TrackerInputType.ORGANISATION_UNIT + ValueType.UNIT_INTERVAL -> TrackerInputType.UNIT_INTERVAL + ValueType.FILE_RESOURCE -> TrackerInputType.NOT_SUPPORTED + ValueType.IMAGE -> TrackerInputType.NOT_SUPPORTED + ValueType.LETTER -> TrackerInputType.LETTER + ValueType.USERNAME -> TrackerInputType.TEXT + ValueType.TRACKER_ASSOCIATE -> TrackerInputType.NOT_SUPPORTED + ValueType.REFERENCE -> TrackerInputType.NOT_SUPPORTED + ValueType.GEOJSON -> TrackerInputType.NOT_SUPPORTED + ValueType.MULTI_TEXT -> TrackerInputType.MULTI_SELECTION + } + +fun SyncState.toSDKState(): State = + when (this) { + SyncState.SYNCED -> State.SYNCED + SyncState.TO_POST -> State.TO_POST + SyncState.TO_UPDATE -> State.TO_UPDATE + SyncState.ERROR -> State.ERROR + SyncState.WARNING -> State.WARNING + SyncState.UPLOADING -> State.UPLOADING + SyncState.RELATIONSHIP -> State.RELATIONSHIP + SyncState.SENT_VIA_SMS -> State.SENT_VIA_SMS + SyncState.SYNCED_VIA_SMS -> State.SYNCED_VIA_SMS + } diff --git a/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.android.kt b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.android.kt new file mode 100644 index 00000000000..b9cb0aaa938 --- /dev/null +++ b/tracker/src/androidMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.android.kt @@ -0,0 +1,42 @@ +package org.dhis2.tracker.search.di + +import org.dhis2.tracker.search.data.OptionSetRepository +import org.dhis2.tracker.search.data.OptionSetRepositoryImpl +import org.dhis2.tracker.search.data.SearchParametersRepository +import org.dhis2.tracker.search.data.SearchParametersRepositoryImpl +import org.dhis2.tracker.search.data.SearchTrackedEntityRepository +import org.dhis2.tracker.search.data.SearchTrackedEntityRepositoryImpl +import org.koin.core.module.Module +import org.koin.dsl.module + +/** + * Android-specific implementation of the tracker search repository module. + */ +internal actual val trackerSearchRepositoryModule: Module = + module { + // SearchTrackedEntityRepository - factory implementation + factory<SearchTrackedEntityRepository> { + SearchTrackedEntityRepositoryImpl( + d2 = get(), + filterPresenter = get(), + profilePictureProvider = get(), + ) + } + + // SearchParametersRepository - interface implementation + single<SearchParametersRepository> { + SearchParametersRepositoryImpl( + d2 = get(), + customIntentRepository = get(), + domainErrorMapper = get(), + ) + } + + // OptionSetRepository - interface implementation + single<OptionSetRepository> { + OptionSetRepositoryImpl( + d2 = get(), + domainErrorMapper = get(), + ) + } + } diff --git a/tracker/src/commonMain/composeResources/values-ar/strings.xml b/tracker/src/commonMain/composeResources/values-ar/strings.xml index 8845cfac49a..16ef803b527 100644 --- a/tracker/src/commonMain/composeResources/values-ar/strings.xml +++ b/tracker/src/commonMain/composeResources/values-ar/strings.xml @@ -10,5 +10,6 @@ <string name="remove">إزلة</string> <string name="search">بحث</string> <string name="optional">اختياري</string> - -</resources> \ No newline at end of file + <string name="yes">نعم</string> + <string name="no">لا</string> + </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-ckb/strings.xml b/tracker/src/commonMain/composeResources/values-ckb/strings.xml index 194e179ced2..cc9373697a2 100644 --- a/tracker/src/commonMain/composeResources/values-ckb/strings.xml +++ b/tracker/src/commonMain/composeResources/values-ckb/strings.xml @@ -3,4 +3,6 @@ <string name="cancel">لابردن</string> <string name="remove">لابردن</string> <string name="search">گەڕان</string> + <string name="yes">بەڵێ</string> + <string name="no">نەخێر</string> </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-cs/strings.xml b/tracker/src/commonMain/composeResources/values-cs/strings.xml index 0283111c0af..d005c9bff96 100644 --- a/tracker/src/commonMain/composeResources/values-cs/strings.xml +++ b/tracker/src/commonMain/composeResources/values-cs/strings.xml @@ -18,5 +18,7 @@ <string name="clear_search">Vymazat hledání</string> <string name="search">Hledat</string> <string name="optional">Volitelný</string> - -</resources> \ No newline at end of file + <string name="custom_intent_launch">Spustit</string> + <string name="yes">ano</string> + <string name="no">ne</string> + </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-da/strings.xml b/tracker/src/commonMain/composeResources/values-da/strings.xml index 60ff2b43248..755406527e6 100644 --- a/tracker/src/commonMain/composeResources/values-da/strings.xml +++ b/tracker/src/commonMain/composeResources/values-da/strings.xml @@ -3,5 +3,4 @@ <string name="cancel">Cancel</string> <string name="remove">Remove</string> <string name="optional">Optional</string> - -</resources> \ No newline at end of file + </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-es-rES/strings.xml b/tracker/src/commonMain/composeResources/values-es-rES/strings.xml index 9bd242cba0f..70c2bef51df 100644 --- a/tracker/src/commonMain/composeResources/values-es-rES/strings.xml +++ b/tracker/src/commonMain/composeResources/values-es-rES/strings.xml @@ -7,4 +7,6 @@ <string name="cancel">Cancelar</string> <string name="remove">Eliminar</string> <string name="search">Buscar</string> + <string name="yes">sí</string> + <string name="no">no</string> </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-es/strings.xml b/tracker/src/commonMain/composeResources/values-es/strings.xml index 3cbf7e26cca..302f58c87a9 100644 --- a/tracker/src/commonMain/composeResources/values-es/strings.xml +++ b/tracker/src/commonMain/composeResources/values-es/strings.xml @@ -17,5 +17,7 @@ <string name="clear_search">Borrar búsqueda</string> <string name="search">Buscar</string> <string name="optional">Opcional</string> - -</resources> \ No newline at end of file + <string name="equal_search_operator">Solo coincidencias exactas</string> + <string name="yes">sí</string> + <string name="no">no</string> + </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-fr/strings.xml b/tracker/src/commonMain/composeResources/values-fr/strings.xml index 2580d750017..f4f756a26d1 100644 --- a/tracker/src/commonMain/composeResources/values-fr/strings.xml +++ b/tracker/src/commonMain/composeResources/values-fr/strings.xml @@ -15,5 +15,7 @@ <string name="remove">Supprimer</string> <string name="search">Rechercher</string> <string name="optional">Optional</string> - -</resources> \ No newline at end of file + <string name="equal_search_operator">Correspondances exactes uniquement</string> + <string name="yes">oui </string> + <string name="no">non</string> + </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-hi-rIN/strings.xml b/tracker/src/commonMain/composeResources/values-hi-rIN/strings.xml index 6d9b2a97a32..e696bac7412 100644 --- a/tracker/src/commonMain/composeResources/values-hi-rIN/strings.xml +++ b/tracker/src/commonMain/composeResources/values-hi-rIN/strings.xml @@ -2,9 +2,9 @@ <resources> <string name="empty_relationships">कोई संबंध नहीं है, नया जोड़ने के लिए “+” पर क्लिक करें</string> <string name="relation_creation_date">संबंध बनाया गया</string> - <string name="remove_relationship_title">हटाएँ %1$s\?</string> + <string name="remove_relationship_title">हटाएँ %1$s?</string> <string name="remove_relationship_desc">%1$s हटा दिया जाएगा। यह कार्रवाई वापस नहीं की जा सकती</string> - <string name="remove_some_relationships_title">%1$d संबंध हटाएँ\?</string> + <string name="remove_some_relationships_title">%1$d संबंध हटाएँ?</string> <string name="remove_some_relationships_desc">%1$d हटा दिया जाएगा। यह कार्रवाई वापस नहीं की जा सकती</string> <string name="show_number_more">%1$d और दिखाएँ</string> <string name="relationship">संबंध</string> @@ -18,5 +18,5 @@ <string name="clear_search">खोज साफ़ करें</string> <string name="search">सर्च करें / खोजें</string> <string name="optional">वैकल्पिक</string> - -</resources> \ No newline at end of file + <string name="custom_intent_launch">लॉन्च</string> + </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-id/strings.xml b/tracker/src/commonMain/composeResources/values-id/strings.xml index 7b577896372..cba81ebfdd6 100644 --- a/tracker/src/commonMain/composeResources/values-id/strings.xml +++ b/tracker/src/commonMain/composeResources/values-id/strings.xml @@ -9,4 +9,6 @@ <string name="cancel">Batal</string> <string name="remove">Hapus</string> <string name="search">Pencarian</string> + <string name="yes">ya</string> + <string name="no">tidak</string> </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-km/strings.xml b/tracker/src/commonMain/composeResources/values-km/strings.xml index 354a52217c5..e7b153c7e3d 100644 --- a/tracker/src/commonMain/composeResources/values-km/strings.xml +++ b/tracker/src/commonMain/composeResources/values-km/strings.xml @@ -6,5 +6,6 @@ <string name="remove">លុបចេញ</string> <string name="search">ស្វែងរក</string> <string name="optional">មិនមានក៏បាន</string> - -</resources> \ No newline at end of file + <string name="yes">យល់ព្រម</string> + <string name="no">មិនព្រម</string> + </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-lo/strings.xml b/tracker/src/commonMain/composeResources/values-lo/strings.xml index 47d3b8dadb9..fd5c7b8566f 100644 --- a/tracker/src/commonMain/composeResources/values-lo/strings.xml +++ b/tracker/src/commonMain/composeResources/values-lo/strings.xml @@ -10,5 +10,6 @@ <string name="remove">ລົບອອກ</string> <string name="search">ຄົ້ນຫາ</string> <string name="optional">​ຢ່າງ​ຕ່ຳ ມີ​ ທັງ​ໝົດ 8 ຄຳ ໃນ​ນັ້ນ​ຕ້ອງ​ມີ​ໂຕ​ໃຫ​ຍ່ 1 ໂຕ ແລະ ໂຕ​ເລກ 1 ໂຕ</string> - -</resources> \ No newline at end of file + <string name="yes">ແມ່ນ</string> + <string name="no">ບໍ່ແມ່ນ</string> + </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-my/strings.xml b/tracker/src/commonMain/composeResources/values-my/strings.xml index 84af54c4bb4..68f2b75e23b 100644 --- a/tracker/src/commonMain/composeResources/values-my/strings.xml +++ b/tracker/src/commonMain/composeResources/values-my/strings.xml @@ -4,5 +4,6 @@ <string name="cancel">ပယ်ဖျက်သည်</string> <string name="remove">ဖယ်ရှားခြင်း</string> <string name="optional">မဖြစ်မနေလုပ်ရန်မလိုပါ။</string> - -</resources> \ No newline at end of file + <string name="yes">ဟုတ်ပါသည်</string> + <string name="no">မဟုတ်ပါ</string> + </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-nb/strings.xml b/tracker/src/commonMain/composeResources/values-nb/strings.xml index f5613ecc3f3..be6710e566e 100644 --- a/tracker/src/commonMain/composeResources/values-nb/strings.xml +++ b/tracker/src/commonMain/composeResources/values-nb/strings.xml @@ -10,5 +10,6 @@ <string name="remove">Fjern</string> <string name="search">Søk</string> <string name="optional">Valgfri</string> - -</resources> \ No newline at end of file + <string name="yes">ja</string> + <string name="no">nei</string> + </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-or/strings.xml b/tracker/src/commonMain/composeResources/values-or/strings.xml new file mode 100644 index 00000000000..a3a33ce7773 --- /dev/null +++ b/tracker/src/commonMain/composeResources/values-or/strings.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="yes">ହଁ</string> + <string name="no">ନାହିଁ</string> + </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-prs/strings.xml b/tracker/src/commonMain/composeResources/values-prs/strings.xml index 3b5c15f66fb..a9146b48628 100644 --- a/tracker/src/commonMain/composeResources/values-prs/strings.xml +++ b/tracker/src/commonMain/composeResources/values-prs/strings.xml @@ -8,5 +8,4 @@ <string name="remove">حذف</string> <string name="search">جستجو</string> <string name="optional">گزینه ها</string> - -</resources> \ No newline at end of file + </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-ps/strings.xml b/tracker/src/commonMain/composeResources/values-ps/strings.xml index 1db8a3aef10..54b359fe55e 100644 --- a/tracker/src/commonMain/composeResources/values-ps/strings.xml +++ b/tracker/src/commonMain/composeResources/values-ps/strings.xml @@ -8,5 +8,4 @@ <string name="remove">لرې کول</string> <string name="search">جستجو</string> <string name="optional">اختیاري دی</string> - -</resources> \ No newline at end of file + </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-pt-rBR/strings.xml b/tracker/src/commonMain/composeResources/values-pt-rBR/strings.xml index 1b8678fea74..158f9908b30 100644 --- a/tracker/src/commonMain/composeResources/values-pt-rBR/strings.xml +++ b/tracker/src/commonMain/composeResources/values-pt-rBR/strings.xml @@ -6,5 +6,6 @@ <string name="remove">Remover</string> <string name="search">Pesquisar</string> <string name="optional">Opcional</string> - -</resources> \ No newline at end of file + <string name="yes">sim</string> + <string name="no">não</string> + </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-pt/strings.xml b/tracker/src/commonMain/composeResources/values-pt/strings.xml index 3ca362513aa..69ff5bb063e 100644 --- a/tracker/src/commonMain/composeResources/values-pt/strings.xml +++ b/tracker/src/commonMain/composeResources/values-pt/strings.xml @@ -17,5 +17,6 @@ <string name="clear_search">Limpar pesquisa</string> <string name="search">Procurar</string> <string name="optional">Opcional</string> - -</resources> \ No newline at end of file + <string name="yes">sim</string> + <string name="no">não</string> + </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-ru/strings.xml b/tracker/src/commonMain/composeResources/values-ru/strings.xml index 1479e8dbc9c..d633f802f9c 100644 --- a/tracker/src/commonMain/composeResources/values-ru/strings.xml +++ b/tracker/src/commonMain/composeResources/values-ru/strings.xml @@ -17,5 +17,6 @@ <string name="clear_search">Очистить поиск</string> <string name="search">Поиск</string> <string name="optional">Опционно</string> - -</resources> \ No newline at end of file + <string name="yes">Да</string> + <string name="no">нет</string> + </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-sv/strings.xml b/tracker/src/commonMain/composeResources/values-sv/strings.xml index e546e37a096..111a92dc1c3 100644 --- a/tracker/src/commonMain/composeResources/values-sv/strings.xml +++ b/tracker/src/commonMain/composeResources/values-sv/strings.xml @@ -6,5 +6,6 @@ <string name="remove">Ta bort</string> <string name="search">Sök</string> <string name="optional">Frivillig</string> - -</resources> \ No newline at end of file + <string name="yes">ja</string> + <string name="no">nej</string> + </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-tet/strings.xml b/tracker/src/commonMain/composeResources/values-tet/strings.xml index e45c3dc35e3..8e01704e5a1 100644 --- a/tracker/src/commonMain/composeResources/values-tet/strings.xml +++ b/tracker/src/commonMain/composeResources/values-tet/strings.xml @@ -4,5 +4,4 @@ <string name="cancel">Kansela</string> <string name="remove">Hasai</string> <string name="optional">Opsional</string> - -</resources> \ No newline at end of file + </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-tg/strings.xml b/tracker/src/commonMain/composeResources/values-tg/strings.xml index 5a698c31b13..e59af9a3757 100644 --- a/tracker/src/commonMain/composeResources/values-tg/strings.xml +++ b/tracker/src/commonMain/composeResources/values-tg/strings.xml @@ -5,5 +5,4 @@ <string name="remove">Тоза кардан</string> <string name="search">Ҷустуҷӯ</string> <string name="optional">Ихтиёрӣ</string> - -</resources> \ No newline at end of file + </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-uk/strings.xml b/tracker/src/commonMain/composeResources/values-uk/strings.xml index 632bd42d7d7..00580e190b5 100644 --- a/tracker/src/commonMain/composeResources/values-uk/strings.xml +++ b/tracker/src/commonMain/composeResources/values-uk/strings.xml @@ -11,5 +11,7 @@ <string name="clear_search">Очистити пошук</string> <string name="search">Пошук</string> <string name="optional">Необов\'язково</string> - -</resources> \ No newline at end of file + <string name="equal_search_operator">Тільки точне збіги</string> + <string name="yes">так</string> + <string name="no">ні</string> + </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-ur/strings.xml b/tracker/src/commonMain/composeResources/values-ur/strings.xml index 5458cc5374b..9d20049aa25 100644 --- a/tracker/src/commonMain/composeResources/values-ur/strings.xml +++ b/tracker/src/commonMain/composeResources/values-ur/strings.xml @@ -8,5 +8,4 @@ <string name="remove">حذف</string> <string name="search">تلاش کریں</string> <string name="optional">اختیاری</string> - -</resources> \ No newline at end of file + </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-uz-rUZ/strings.xml b/tracker/src/commonMain/composeResources/values-uz-rUZ/strings.xml index a472d228bbb..54847a12554 100644 --- a/tracker/src/commonMain/composeResources/values-uz-rUZ/strings.xml +++ b/tracker/src/commonMain/composeResources/values-uz-rUZ/strings.xml @@ -10,5 +10,4 @@ <string name="remove">Олиб ташлаш</string> <string name="search">Izlash</string> <string name="optional">Ixtiyoriy</string> - -</resources> \ No newline at end of file + </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-uz/strings.xml b/tracker/src/commonMain/composeResources/values-uz/strings.xml index 743386bbbd9..01af292fd63 100644 --- a/tracker/src/commonMain/composeResources/values-uz/strings.xml +++ b/tracker/src/commonMain/composeResources/values-uz/strings.xml @@ -11,5 +11,6 @@ <string name="remove">Олиб ташлаш</string> <string name="search">Излаш</string> <string name="optional">Ихтиёрий</string> - -</resources> \ No newline at end of file + <string name="yes">ҳа</string> + <string name="no">йўқ</string> + </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-vi/strings.xml b/tracker/src/commonMain/composeResources/values-vi/strings.xml index 9efa1f3f84d..fe6852f210a 100644 --- a/tracker/src/commonMain/composeResources/values-vi/strings.xml +++ b/tracker/src/commonMain/composeResources/values-vi/strings.xml @@ -17,5 +17,6 @@ <string name="clear_search">Bỏ tìm kiếm</string> <string name="search">Tìm kiếm</string> <string name="optional">Không bắt buộc</string> - -</resources> \ No newline at end of file + <string name="yes">có</string> + <string name="no">không</string> + </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-zh-rCN/strings.xml b/tracker/src/commonMain/composeResources/values-zh-rCN/strings.xml index e9bd51827e4..44faee14fa9 100644 --- a/tracker/src/commonMain/composeResources/values-zh-rCN/strings.xml +++ b/tracker/src/commonMain/composeResources/values-zh-rCN/strings.xml @@ -17,5 +17,6 @@ <string name="clear_search">清除搜索</string> <string name="search">搜索</string> <string name="optional">可选项描述</string> - -</resources> \ No newline at end of file + <string name="yes">是</string> + <string name="no">否</string> + </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values-zh/strings.xml b/tracker/src/commonMain/composeResources/values-zh/strings.xml index d52d25c7c99..07ff4461bcc 100644 --- a/tracker/src/commonMain/composeResources/values-zh/strings.xml +++ b/tracker/src/commonMain/composeResources/values-zh/strings.xml @@ -19,5 +19,10 @@ <string name="clear_search">清除搜索</string> <string name="search">搜索</string> <string name="optional">可选项描述</string> - -</resources> \ No newline at end of file + <string name="custom_intent_launch">启动</string> + <string name="equal_search_operator">仅限完全匹配</string> + <string name="starts_with_search_operator">必须与值的起始部分相匹配</string> + <string name="end_with_search_operator">必须与数值的末尾一致</string> + <string name="yes">是</string> + <string name="no">否</string> + </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/composeResources/values/strings.xml b/tracker/src/commonMain/composeResources/values/strings.xml index a716e26fc62..bacd371734f 100644 --- a/tracker/src/commonMain/composeResources/values/strings.xml +++ b/tracker/src/commonMain/composeResources/values/strings.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <string name="empty_relationships">There are no relationships, click "+" to add a new one.</string> + <string name="empty_relationships">There are no relationships, click \"+\" to add a new one.</string> <string name="relation_creation_date">Relation created on</string> <string name="remove_relationship_title">Remove %1$s?</string> <string name="remove_relationship_desc">The %1$s will be deleted. This action cannot be undone.</string> @@ -18,5 +18,11 @@ <string name="clear_search">Clear search</string> <string name="search">Search</string> <string name="optional">Optional</string> - + <string name="custom_intent_launch">Launch</string> + <string name="equal_search_operator">Exact matches only</string> + <string name="starts_with_search_operator">Must match the start of the value</string> + <string name="end_with_search_operator">Must match the end of the value</string> + <string name="yes">yes</string> + <string name="no">no</string> + <string name="min_characters_warning">Enter at least %1$d characters</string> </resources> \ No newline at end of file diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/model/TrackerInputType.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/model/TrackerInputType.kt new file mode 100644 index 00000000000..baf77aeb8c1 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/model/TrackerInputType.kt @@ -0,0 +1,39 @@ +package org.dhis2.tracker.input.model + +enum class TrackerInputType { + TEXT, + LONG_TEXT, + LETTER, + PHONE_NUMBER, + EMAIL, + URL, + NUMBER, + INTEGER, + INTEGER_POSITIVE, + INTEGER_NEGATIVE, + INTEGER_ZERO_OR_POSITIVE, + PERCENTAGE, + UNIT_INTERVAL, + AGE, + ORGANISATION_UNIT, + MULTI_SELECTION, + QR_CODE, + BAR_CODE, + HORIZONTAL_CHECKBOXES, + VERTICAL_CHECKBOXES, + HORIZONTAL_RADIOBUTTONS, + VERTICAL_RADIOBUTTONS, + YES_ONLY_SWITCH, + YES_ONLY_CHECKBOX, + DATE_TIME, + DATE, + TIME, + PERIOD_SELECTOR, + MATRIX, + SEQUENTIAL, + DROPDOWN, + NOT_SUPPORTED, + COORDINATES, + IMAGE, + CUSTOM_INTENT, +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/action/TrackerInputAction.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/action/TrackerInputAction.kt new file mode 100644 index 00000000000..d368c574868 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/action/TrackerInputAction.kt @@ -0,0 +1,25 @@ +package org.dhis2.tracker.input.ui.action + +import org.dhis2.mobile.commons.model.CustomIntentModel +import org.dhis2.tracker.input.model.TrackerInputType + +typealias CustomIntentUid = String +typealias FieldUid = String + +sealed interface TrackerInputAction { + data class LaunchCustomIntent( + val fieldUid: FieldUid, + val customIntentModel: CustomIntentModel, + ) : TrackerInputAction + + data class Scan( + val fieldUid: FieldUid, + val optionSet: String?, + val renderType: TrackerInputType, + ) : TrackerInputAction + + data class ValueChanged( + val fieldUid: FieldUid, + val value: String?, + ) : TrackerInputAction +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/action/TrackerInputUiEvent.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/action/TrackerInputUiEvent.kt new file mode 100644 index 00000000000..afcb2632da3 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/action/TrackerInputUiEvent.kt @@ -0,0 +1,33 @@ +package org.dhis2.tracker.input.ui.action + +import org.dhis2.mobile.commons.orgunit.OrgUnitSelectorScope +import org.dhis2.tracker.input.model.TrackerInputType + +sealed interface TrackerInputUiEvent { + data class OnScanButtonClicked( + val uid: String, + val optionSet: String?, + val renderType: TrackerInputType, + ) : TrackerInputUiEvent + + data class OnOrgUnitButtonClicked( + val uid: String, + val label: String, + val value: String?, + val orgUnitSelectorScope: OrgUnitSelectorScope?, + ) : TrackerInputUiEvent + + data class OnLaunchCustomIntent( + val uid: String, + val customIntentUid: String, + ) : TrackerInputUiEvent + + data class OnItemClick( + val uid: String, + ) : TrackerInputUiEvent + + data class OnValueChange( + val uid: String, + val value: String?, + ) : TrackerInputUiEvent +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/mapper/TrackerInputUiStateMapper.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/mapper/TrackerInputUiStateMapper.kt new file mode 100644 index 00000000000..ed9ea3431b0 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/mapper/TrackerInputUiStateMapper.kt @@ -0,0 +1,38 @@ +package org.dhis2.tracker.input.ui.mapper + +import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.input.ui.state.TrackerInputUiState +import org.dhis2.tracker.search.model.SearchParameterModel +import org.hisp.dhis.mobile.ui.designsystem.component.Orientation + +fun SearchParameterModel.toTrackerInputUiState() = + TrackerInputUiState( + uid = uid, + label = label, + value = null, + focused = false, + valueType = inputType, + optionSet = optionSet, + error = null, + warning = null, + description = null, + mandatory = false, + editable = true, + legend = null, + orientation = inputType.getOrientation(), + optionSetConfiguration = null, + customIntentUid = customIntentUid, + displayName = null, + orgUnitSelectorScope = null, + searchOperator = searchOperator, + minCharactersToSearch = minCharactersToSearch, + ) + +private fun TrackerInputType.getOrientation(): Orientation = + when (this) { + TrackerInputType.HORIZONTAL_CHECKBOXES, + TrackerInputType.HORIZONTAL_RADIOBUTTONS, + -> Orientation.HORIZONTAL + + else -> Orientation.VERTICAL + } diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerAgeInputProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerAgeInputProvider.kt new file mode 100644 index 00000000000..edd05b75d9d --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerAgeInputProvider.kt @@ -0,0 +1,138 @@ +package org.dhis2.tracker.input.ui.provider + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.TextRange +import androidx.compose.ui.text.input.TextFieldValue +import org.dhis2.mobile.commons.dates.calculateAgeFromDate +import org.dhis2.mobile.commons.dates.calculateDateFromAge +import org.dhis2.mobile.commons.resources.Res +import org.dhis2.mobile.commons.resources.age +import org.dhis2.mobile.commons.resources.age_or +import org.dhis2.mobile.commons.resources.cancel +import org.dhis2.mobile.commons.resources.date_of_birth +import org.dhis2.mobile.commons.resources.ok +import org.dhis2.tracker.input.ui.state.TrackerInputUiState +import org.dhis2.tracker.input.ui.state.inputState +import org.dhis2.tracker.input.ui.state.supportingText +import org.hisp.dhis.mobile.ui.designsystem.component.AgeInputType +import org.hisp.dhis.mobile.ui.designsystem.component.InputAge +import org.hisp.dhis.mobile.ui.designsystem.component.InputStyle +import org.hisp.dhis.mobile.ui.designsystem.component.state.InputAgeData +import org.hisp.dhis.mobile.ui.designsystem.component.state.rememberInputAgeState +import org.jetbrains.compose.resources.stringResource + +@Composable +fun ProvideTrackerAgeInput( + model: TrackerInputUiState, + inputStyle: InputStyle, + onNextClicked: () -> Unit, + modifier: Modifier, + onValueChange: (String?) -> Unit, +) { + var inputType by remember { + mutableStateOf( + if (!model.value.isNullOrEmpty()) { + model.value.let { + AgeInputType.DateOfBirth(TextFieldValue(it, TextRange(it.length))) + } + } else { + AgeInputType.None + }, + ) + } + + DisposableEffect(model.value) { + when (inputType) { + is AgeInputType.Age -> + if (!model.value.isNullOrEmpty()) { + calculateAgeFromDate( + model.value, + (inputType as AgeInputType.Age).unit.name, + )?.let { + (inputType as AgeInputType.Age).copy( + value = + TextFieldValue( + it, + TextRange(it.length), + ), + ) + } ?: AgeInputType.None + } + + is AgeInputType.DateOfBirth -> + if (!model.value.isNullOrEmpty()) { + model.value.let { + (inputType as AgeInputType.DateOfBirth).copy( + value = + TextFieldValue( + it, + TextRange(it.length), + ), + ) + } + } + + AgeInputType.None -> { + // no-op + } + } + + onDispose { } + } + + InputAge( + state = + rememberInputAgeState( + inputAgeData = + InputAgeData( + title = model.label, + inputStyle = inputStyle, + isRequired = model.mandatory, + dateOfBirthLabel = stringResource(Res.string.date_of_birth), + orLabel = stringResource(Res.string.age_or), + ageLabel = stringResource(Res.string.age), + cancelText = stringResource(Res.string.cancel), + acceptText = stringResource(Res.string.ok), + ), + inputType = inputType, + inputState = model.inputState(), + legendData = model.legend, + supportingText = model.supportingText(), + ), + onValueChanged = { ageInputType -> + if (ageInputType != null) { + inputType = ageInputType + } + + when (val type = inputType) { + is AgeInputType.Age -> { + calculateDateFromAge(type.value.text, type.unit.name)?.let { calculatedDate -> + onValueChange(calculatedDate) + } + } + + is AgeInputType.DateOfBirth -> { + type.value.text + .takeIf { it != model.value } + ?.let { + onValueChange(it) + } + } + + AgeInputType.None -> { + onValueChange(null) + } + } + }, + onImeActionClick = { _ -> + onNextClicked() + }, + modifier = modifier, + ) +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerCheckboxInputProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerCheckboxInputProvider.kt new file mode 100644 index 00000000000..58001abd402 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerCheckboxInputProvider.kt @@ -0,0 +1,56 @@ +package org.dhis2.tracker.input.ui.provider + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import org.dhis2.tracker.input.ui.state.TrackerInputUiState +import org.dhis2.tracker.input.ui.state.inputState +import org.dhis2.tracker.input.ui.state.supportingText +import org.hisp.dhis.mobile.ui.designsystem.component.CheckBoxData +import org.hisp.dhis.mobile.ui.designsystem.component.InputCheckBox +import org.hisp.dhis.mobile.ui.designsystem.component.InputStyle + +@Composable +fun TrackerCheckboxInputProvider( + model: TrackerInputUiState, + inputStyle: InputStyle, + modifier: Modifier, + onValueChange: (String?) -> Unit, +) { + val dataMap = + buildMap { + model.optionSetConfiguration?.options.let { optionDataList -> + optionDataList?.forEach { optionData -> + put( + optionData.code, + CheckBoxData( + uid = optionData.code, + checked = model.value == optionData.code, + enabled = model.editable, + textInput = optionData.displayName, + ), + ) + } + } + } + + val (codeList, data) = dataMap.toList().unzip() + + InputCheckBox( + modifier = modifier, + inputStyle = inputStyle, + title = model.label, + checkBoxData = data, + orientation = model.orientation, + state = model.inputState(), + supportingText = model.supportingText(), + legendData = model.legend, + isRequired = model.mandatory, + onItemChange = { item -> + val selectedIndex = data.indexOf(item) + onValueChange(if (item.checked) null else codeList[selectedIndex]) + }, + onClearSelection = { + onValueChange(null) + }, + ) +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerDateTimeProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerDateTimeProvider.kt new file mode 100644 index 00000000000..d1025c92fc7 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerDateTimeProvider.kt @@ -0,0 +1,108 @@ +package org.dhis2.tracker.input.ui.provider + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.text.TextRange +import androidx.compose.ui.text.input.TextFieldValue +import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.input.ui.state.TrackerInputUiState +import org.dhis2.tracker.input.ui.state.inputState +import org.dhis2.tracker.input.ui.state.supportingText +import org.hisp.dhis.mobile.ui.designsystem.component.DateTimeActionType +import org.hisp.dhis.mobile.ui.designsystem.component.InputDateTime +import org.hisp.dhis.mobile.ui.designsystem.component.InputStyle +import org.hisp.dhis.mobile.ui.designsystem.component.SelectableDates +import org.hisp.dhis.mobile.ui.designsystem.component.model.DateTimeTransformation +import org.hisp.dhis.mobile.ui.designsystem.component.model.DateTransformation +import org.hisp.dhis.mobile.ui.designsystem.component.model.TimeTransformation +import org.hisp.dhis.mobile.ui.designsystem.component.state.InputDateTimeData +import org.hisp.dhis.mobile.ui.designsystem.component.state.rememberInputDateTimeState + +@Composable +fun ProvideTrackerDateTimeInput( + model: TrackerInputUiState, + inputStyle: InputStyle, + onNextClicked: () -> Unit, + modifier: Modifier, + onValueChange: (String?) -> Unit, +) { + val (actionType, visualTransformation) = + when (model.valueType) { + TrackerInputType.DATE_TIME -> DateTimeActionType.DATE_TIME to DateTimeTransformation() + TrackerInputType.TIME -> DateTimeActionType.TIME to TimeTransformation() + else -> DateTimeActionType.DATE to DateTransformation() + } + val textSelection = + TextRange( + model.value?.length ?: 0, + ) + + val yearIntRange = getYearRange() + val selectableDates = + SelectableDates( + initialDate = DEFAULT_MIN_DATE, + endDate = DEFAULT_MAX_DATE, + ) + + var value by remember(model.value) { + mutableStateOf( + model.value?.let { value -> + TextFieldValue( + value, + textSelection, + ) + } ?: TextFieldValue(), + ) + } + + val inputState = + rememberInputDateTimeState( + InputDateTimeData( + title = model.label, + actionType = actionType, + visualTransformation = visualTransformation, + isRequired = model.mandatory, + selectableDates = selectableDates, + yearRange = yearIntRange, + inputStyle = inputStyle, + ), + inputTextFieldValue = value, + inputState = model.inputState(), + legendData = model.legend, + supportingText = model.supportingText(), + ) + + InputDateTime( + state = inputState, + modifier = + modifier.semantics { + contentDescription = value.text + }, + onValueChanged = { + value = it ?: TextFieldValue() + onValueChange(value.text.ifEmpty { null }) + }, + onImeActionClick = { _ -> + onNextClicked() + }, + ) +} + +private fun getYearRange(): IntRange = + IntRange( + DEFAULT_MIN_DATE + .substring(4, 8) + .toInt(), + DEFAULT_MAX_DATE + .substring(4, 8) + .toInt(), + ) + +const val DEFAULT_MIN_DATE = "12111924" +const val DEFAULT_MAX_DATE = "12112124" diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt new file mode 100644 index 00000000000..0965f46d189 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerInputProvider.kt @@ -0,0 +1,793 @@ +package org.dhis2.tracker.input.ui.provider + +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.text.TextRange +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.TextFieldValue +import org.dhis2.mobile.commons.orgunit.OrgUnitSelectorScope +import org.dhis2.mobile.tracker.resources.Res +import org.dhis2.mobile.tracker.resources.custom_intent_launch +import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.input.ui.action.TrackerInputUiEvent +import org.dhis2.tracker.input.ui.state.TrackerInputUiState +import org.dhis2.tracker.input.ui.state.inputState +import org.dhis2.tracker.input.ui.state.supportingText +import org.hisp.dhis.mobile.ui.designsystem.component.CheckBoxData +import org.hisp.dhis.mobile.ui.designsystem.component.CustomIntentState +import org.hisp.dhis.mobile.ui.designsystem.component.DropdownItem +import org.hisp.dhis.mobile.ui.designsystem.component.InputBarCode +import org.hisp.dhis.mobile.ui.designsystem.component.InputCustomIntent +import org.hisp.dhis.mobile.ui.designsystem.component.InputDropDown +import org.hisp.dhis.mobile.ui.designsystem.component.InputEmail +import org.hisp.dhis.mobile.ui.designsystem.component.InputInteger +import org.hisp.dhis.mobile.ui.designsystem.component.InputLetter +import org.hisp.dhis.mobile.ui.designsystem.component.InputLink +import org.hisp.dhis.mobile.ui.designsystem.component.InputLongText +import org.hisp.dhis.mobile.ui.designsystem.component.InputMultiSelection +import org.hisp.dhis.mobile.ui.designsystem.component.InputNegativeInteger +import org.hisp.dhis.mobile.ui.designsystem.component.InputNumber +import org.hisp.dhis.mobile.ui.designsystem.component.InputOrgUnit +import org.hisp.dhis.mobile.ui.designsystem.component.InputPercentage +import org.hisp.dhis.mobile.ui.designsystem.component.InputPhoneNumber +import org.hisp.dhis.mobile.ui.designsystem.component.InputPositiveInteger +import org.hisp.dhis.mobile.ui.designsystem.component.InputPositiveIntegerOrZero +import org.hisp.dhis.mobile.ui.designsystem.component.InputQRCode +import org.hisp.dhis.mobile.ui.designsystem.component.InputStyle +import org.hisp.dhis.mobile.ui.designsystem.component.InputText +import org.hisp.dhis.mobile.ui.designsystem.component.InputUnitInterval +import org.hisp.dhis.mobile.ui.designsystem.component.InputYesOnlyCheckBox +import org.hisp.dhis.mobile.ui.designsystem.component.InputYesOnlySwitch +import org.hisp.dhis.mobile.ui.designsystem.component.model.RegExValidations +import org.jetbrains.compose.resources.stringResource + +@Composable +fun TrackerInputProvider( + modifier: Modifier = Modifier, + inputModel: TrackerInputUiState, + inputStyle: InputStyle, + onNextClicked: () -> Unit, + onUiEvent: (TrackerInputUiEvent) -> Unit, +) { + var savedTextSelection by remember(inputModel.uid) { + mutableStateOf(TextRange(inputModel.value?.length ?: 0)) + } + + var textValue by remember(inputModel.uid, inputModel.value) { + mutableStateOf( + TextFieldValue( + text = inputModel.value ?: "", + selection = savedTextSelection, + ), + ) + } + + val focusRequester = remember { FocusRequester() } + val modifierWithFocus = modifier.focusRequester(focusRequester) + + LaunchedEffect(inputModel.focused) { + if (inputModel.focused) { + focusRequester.requestFocus() + } + } + + val onTextValueChanged: (TextFieldValue?) -> Unit = { newValue -> + textValue = newValue ?: TextFieldValue() + savedTextSelection = newValue?.selection ?: TextRange.Zero + manageOnValueChange( + newValue = newValue?.text, + inputModel = inputModel, + onUiEvent = onUiEvent, + ) + } + + val onImeActionClick: (ImeAction) -> Unit = { imeAction -> + if (imeAction == ImeAction.Next) { + onNextClicked() + } + } + + when (inputModel.valueType) { + TrackerInputType.TEXT -> { + InputText( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onValueChanged = onTextValueChanged, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + onFocusChanged = { isFocused -> + handleOnFocusChange( + isFocused = isFocused, + inputModelId = inputModel.uid, + onUiEvent = onUiEvent, + ) + }, + ) + } + + TrackerInputType.LONG_TEXT -> { + InputLongText( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onValueChanged = onTextValueChanged, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + onFocusChanged = { isFocused -> + handleOnFocusChange( + isFocused = isFocused, + inputModelId = inputModel.uid, + onUiEvent = onUiEvent, + ) + }, + ) + } + + TrackerInputType.LETTER -> { + InputLetter( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onValueChanged = onTextValueChanged, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + onFocusChanged = { isFocused -> + handleOnFocusChange( + isFocused = isFocused, + inputModelId = inputModel.uid, + onUiEvent = onUiEvent, + ) + }, + ) + } + + TrackerInputType.EMAIL -> { + InputEmail( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onEmailActionCLicked = {}, + onValueChanged = onTextValueChanged, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + onFocusChanged = { isFocused -> + handleOnFocusChange( + isFocused = isFocused, + inputModelId = inputModel.uid, + onUiEvent = onUiEvent, + ) + }, + ) + } + + TrackerInputType.PHONE_NUMBER -> { + InputPhoneNumber( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onCallActionClicked = {}, + onValueChanged = onTextValueChanged, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + onFocusChanged = { isFocused -> + handleOnFocusChange( + isFocused = isFocused, + inputModelId = inputModel.uid, + onUiEvent = onUiEvent, + ) + }, + ) + } + + TrackerInputType.URL -> { + InputLink( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onLinkActionCLicked = {}, + onValueChanged = onTextValueChanged, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + onFocusChanged = { isFocused -> + handleOnFocusChange( + isFocused = isFocused, + inputModelId = inputModel.uid, + onUiEvent = onUiEvent, + ) + }, + ) + } + + TrackerInputType.NUMBER -> { + InputNumber( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onValueChanged = onTextValueChanged, + notation = RegExValidations.BRITISH_DECIMAL_NOTATION, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + onFocusChanged = { isFocused -> + handleOnFocusChange( + isFocused = isFocused, + inputModelId = inputModel.uid, + onUiEvent = onUiEvent, + ) + }, + ) + } + + TrackerInputType.INTEGER -> { + InputInteger( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onValueChanged = onTextValueChanged, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + onFocusChanged = { isFocused -> + handleOnFocusChange( + isFocused = isFocused, + inputModelId = inputModel.uid, + onUiEvent = onUiEvent, + ) + }, + ) + } + + TrackerInputType.INTEGER_POSITIVE -> { + InputPositiveInteger( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onValueChanged = onTextValueChanged, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + onFocusChanged = { isFocused -> + handleOnFocusChange( + isFocused = isFocused, + inputModelId = inputModel.uid, + onUiEvent = onUiEvent, + ) + }, + ) + } + + TrackerInputType.INTEGER_NEGATIVE -> { + InputNegativeInteger( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onValueChanged = onTextValueChanged, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + onFocusChanged = { isFocused -> + handleOnFocusChange( + isFocused = isFocused, + inputModelId = inputModel.uid, + onUiEvent = onUiEvent, + ) + }, + ) + } + + TrackerInputType.INTEGER_ZERO_OR_POSITIVE -> { + InputPositiveIntegerOrZero( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onValueChanged = onTextValueChanged, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + onFocusChanged = { isFocused -> + handleOnFocusChange( + isFocused = isFocused, + inputModelId = inputModel.uid, + onUiEvent = onUiEvent, + ) + }, + ) + } + + TrackerInputType.PERCENTAGE -> { + InputPercentage( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onValueChanged = onTextValueChanged, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + onFocusChanged = { isFocused -> + handleOnFocusChange( + isFocused = isFocused, + inputModelId = inputModel.uid, + onUiEvent = onUiEvent, + ) + }, + ) + } + + TrackerInputType.UNIT_INTERVAL -> { + InputUnitInterval( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onValueChanged = onTextValueChanged, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + ) + } + + TrackerInputType.AGE -> { + ProvideTrackerAgeInput( + model = inputModel, + inputStyle = inputStyle, + onNextClicked = onNextClicked, + modifier = modifierWithFocus, + onValueChange = { newValue -> + manageOnValueChange( + newValue = newValue, + inputModel = inputModel, + onUiEvent = onUiEvent, + ) + }, + ) + } + + TrackerInputType.DATE_TIME, TrackerInputType.DATE, TrackerInputType.TIME -> { + ProvideTrackerDateTimeInput( + model = inputModel, + inputStyle = inputStyle, + onNextClicked = onNextClicked, + modifier = modifierWithFocus, + onValueChange = { newValue -> + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = newValue, + ), + ) + }, + ) + } + + TrackerInputType.ORGANISATION_UNIT -> { + InputOrgUnit( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputText = inputModel.displayName, + onValueChanged = { newValue -> + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = newValue, + ), + ) + }, + onOrgUnitActionCLicked = { + onUiEvent( + TrackerInputUiEvent.OnOrgUnitButtonClicked( + uid = inputModel.uid, + label = inputModel.label, + value = inputModel.value, + orgUnitSelectorScope = + inputModel.orgUnitSelectorScope + ?: OrgUnitSelectorScope.UserSearchScope(), + ), + ) + }, + ) + } + + TrackerInputType.MULTI_SELECTION -> { + val options = + inputModel.optionSetConfiguration?.options?.map { optionItem -> + CheckBoxData( + uid = optionItem.code, + checked = + optionItem.code.let { code -> + inputModel.value + ?.takeIf { it.isNotEmpty() } + ?.split(",") + ?.contains(code) + } ?: false, + enabled = inputModel.editable, + textInput = optionItem.displayName, + ) + } ?: emptyList() + + InputMultiSelection( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + items = options, + state = inputModel.inputState(), + supportingTextData = inputModel.supportingText(), + legendData = inputModel.legend, + isRequired = inputModel.mandatory, + inputStyle = inputStyle, + onItemsSelected = { checkBoxData -> + val checkedValues = + checkBoxData + .filter { it.checked } + .joinToString(",") { it.uid } + .takeIf { it.isNotEmpty() } + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = checkedValues, + ), + ) + }, + onClearItemSelection = { + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = null, + ), + ) + }, + ) + } + + TrackerInputType.QR_CODE -> { + InputQRCode( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onQRButtonClicked = { + onUiEvent( + TrackerInputUiEvent.OnScanButtonClicked( + uid = inputModel.uid, + optionSet = inputModel.optionSet, + renderType = inputModel.valueType, + ), + ) + }, + onValueChanged = onTextValueChanged, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + ) + } + + TrackerInputType.BAR_CODE -> { + InputBarCode( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + inputStyle = inputStyle, + inputTextFieldValue = textValue, + onActionButtonClicked = { + onUiEvent( + TrackerInputUiEvent.OnScanButtonClicked( + uid = inputModel.uid, + optionSet = inputModel.optionSet, + renderType = inputModel.valueType, + ), + ) + }, + onValueChanged = onTextValueChanged, + imeAction = ImeAction.Next, + onImeActionClick = onImeActionClick, + ) + } + + TrackerInputType.HORIZONTAL_CHECKBOXES, TrackerInputType.VERTICAL_CHECKBOXES -> { + TrackerCheckboxInputProvider( + model = inputModel, + inputStyle = inputStyle, + modifier = modifierWithFocus, + onValueChange = { newValue -> + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = newValue, + ), + ) + }, + ) + } + + TrackerInputType.HORIZONTAL_RADIOBUTTONS, TrackerInputType.VERTICAL_RADIOBUTTONS -> { + TrackerRadioButtonInputProvider( + model = inputModel, + inputStyle = inputStyle, + modifier = modifierWithFocus, + onValueChange = { newValue -> + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = newValue, + ), + ) + }, + ) + } + + TrackerInputType.YES_ONLY_SWITCH -> { + InputYesOnlySwitch( + modifier = modifierWithFocus.fillMaxWidth(), + title = inputModel.label, + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequired = inputModel.mandatory, + inputStyle = inputStyle, + isChecked = inputModel.value?.toBooleanStrictOrNull() == true, + onClick = { isChecked -> + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = getYesOnlyValue(isChecked), + ), + ) + }, + ) + } + + TrackerInputType.YES_ONLY_CHECKBOX -> { + InputYesOnlyCheckBox( + modifier = modifierWithFocus.fillMaxWidth(), + checkBoxData = + CheckBoxData( + uid = inputModel.uid, + checked = inputModel.value?.toBooleanStrictOrNull() == true, + enabled = inputModel.editable, + textInput = inputModel.label, + ), + state = inputModel.inputState(), + supportingText = inputModel.supportingText(), + legendData = inputModel.legend, + isRequired = inputModel.mandatory, + inputStyle = inputStyle, + onClick = { isChecked -> + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = if (isChecked) "true" else null, + ), + ) + }, + ) + } + + TrackerInputType.DROPDOWN -> { + val optionSetConfiguration = inputModel.optionSetConfiguration!! + + var selectedItem by remember(inputModel.uid, inputModel.value) { + val displayName = + optionSetConfiguration.options + .find { + it.code == inputModel.value + }?.displayName + mutableStateOf(displayName ?: inputModel.value ?: "") + } + + val options = optionSetConfiguration.options + val useDropdown by remember { + derivedStateOf { options.size < 15 } + } + + InputDropDown( + modifier = modifierWithFocus.fillMaxWidth(), + inputStyle = inputStyle, + title = inputModel.label, + state = inputModel.inputState(), + selectedItem = DropdownItem(selectedItem), + supportingTextData = inputModel.supportingText(), + legendData = inputModel.legend, + isRequiredField = inputModel.mandatory, + onResetButtonClicked = { + selectedItem = "" + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = null, + ), + ) + }, + fetchItem = { index -> + DropdownItem(options.getOrNull(index)?.displayName ?: "") + }, + onSearchOption = { query -> + optionSetConfiguration.onSearch?.invoke(query) + }, + itemCount = options.size, + useDropDown = useDropdown, + onItemSelected = { index, newSelectedItem -> + selectedItem = newSelectedItem.label + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = options.getOrNull(index)?.code, + ), + ) + }, + loadOptions = { + optionSetConfiguration.onLoadOptions?.invoke() + }, + onDismiss = { + optionSetConfiguration.onSearch?.invoke("") + }, + ) + } + + TrackerInputType.CUSTOM_INTENT -> { + val values by remember(inputModel) { + derivedStateOf { + inputModel.value + ?.takeIf { it.isNotEmpty() } + ?.split(",") + ?.toMutableList() ?: mutableListOf() + } + } + + var customIntentState by remember(inputModel, inputModel.value) { + mutableStateOf( + if (inputModel.value.isNullOrEmpty()) { + CustomIntentState.LAUNCH + } else { + CustomIntentState.LOADED + }, + ) + } + + InputCustomIntent( + title = inputModel.label, + buttonText = stringResource(Res.string.custom_intent_launch), + supportingText = inputModel.supportingText(), + inputShellState = inputModel.inputState(), + inputStyle = inputStyle, + modifier = modifier, + isRequired = inputModel.mandatory, + onLaunch = { + customIntentState = CustomIntentState.LOADING + inputModel.customIntentUid?.let { customIntentUid -> + onUiEvent( + TrackerInputUiEvent.OnLaunchCustomIntent( + inputModel.uid, + customIntentUid, + ), + ) + } + }, + onClear = { + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = null, + ), + ) + }, + customIntentState = customIntentState, + values = values.toList(), + ) + } + + TrackerInputType.PERIOD_SELECTOR, + TrackerInputType.MATRIX, + TrackerInputType.SEQUENTIAL, + TrackerInputType.NOT_SUPPORTED, + TrackerInputType.COORDINATES, + TrackerInputType.IMAGE, + -> { + // no-op + } + } +} + +fun manageOnValueChange( + newValue: String?, + inputModel: TrackerInputUiState, + onUiEvent: (TrackerInputUiEvent) -> Unit, +) { + newValue?.let { + if (it != inputModel.value) { + onUiEvent( + TrackerInputUiEvent.OnValueChange( + uid = inputModel.uid, + value = it.takeIf { text -> text.isNotEmpty() }, + ), + ) + } + } +} + +private fun getYesOnlyValue(checked: Boolean): String? = if (!checked) "true" else null + +private fun handleOnFocusChange( + isFocused: Boolean, + inputModelId: String, + onUiEvent: (TrackerInputUiEvent) -> Unit, +) { + if (isFocused) { + onUiEvent(TrackerInputUiEvent.OnItemClick(inputModelId)) + } +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerRadioButtonInputProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerRadioButtonInputProvider.kt new file mode 100644 index 00000000000..63656617658 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/provider/TrackerRadioButtonInputProvider.kt @@ -0,0 +1,58 @@ +package org.dhis2.tracker.input.ui.provider + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import org.dhis2.tracker.input.ui.state.TrackerInputUiState +import org.dhis2.tracker.input.ui.state.inputState +import org.dhis2.tracker.input.ui.state.supportingText +import org.hisp.dhis.mobile.ui.designsystem.component.InputRadioButton +import org.hisp.dhis.mobile.ui.designsystem.component.InputStyle +import org.hisp.dhis.mobile.ui.designsystem.component.RadioButtonData + +@Composable +fun TrackerRadioButtonInputProvider( + model: TrackerInputUiState, + inputStyle: InputStyle, + modifier: Modifier, + onValueChange: (String?) -> Unit, +) { + val dataMap = + buildMap { + model.optionSetConfiguration?.options.let { optionDataList -> + optionDataList?.forEach { optionData -> + put( + optionData.code, + RadioButtonData( + uid = optionData.code, + selected = model.value == optionData.code, + enabled = true, + textInput = optionData.displayName, + ), + ) + } + } + } + + val (codeList, data) = dataMap.toList().unzip() + + InputRadioButton( + modifier = modifier, + inputStyle = inputStyle, + title = model.label, + radioButtonData = data, + orientation = model.orientation, + state = model.inputState(), + supportingText = model.supportingText(), + legendData = model.legend, + isRequired = model.mandatory, + itemSelected = data.find { it.selected }, + onItemChange = { item -> + if (item != null) { + val selectedIndex = data.indexOf(item) + onValueChange(codeList[selectedIndex]) + } else { + onValueChange(null) + } + }, + ) +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerInputUiState.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerInputUiState.kt new file mode 100644 index 00000000000..41d7768f940 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerInputUiState.kt @@ -0,0 +1,198 @@ +package org.dhis2.tracker.input.ui.state + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.paging.PagingData +import androidx.paging.compose.collectAsLazyPagingItems +import kotlinx.coroutines.flow.Flow +import org.dhis2.mobile.commons.orgunit.OrgUnitSelectorScope +import org.dhis2.mobile.tracker.resources.Res +import org.dhis2.mobile.tracker.resources.end_with_search_operator +import org.dhis2.mobile.tracker.resources.equal_search_operator +import org.dhis2.mobile.tracker.resources.no +import org.dhis2.mobile.tracker.resources.starts_with_search_operator +import org.dhis2.mobile.tracker.resources.yes +import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.search.model.SearchOperator +import org.hisp.dhis.mobile.ui.designsystem.component.InputShellState +import org.hisp.dhis.mobile.ui.designsystem.component.LegendData +import org.hisp.dhis.mobile.ui.designsystem.component.Orientation +import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextData +import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextState +import org.jetbrains.compose.resources.stringResource + +data class TrackerInputUiState( + val uid: String, + val label: String, + val value: String?, + val focused: Boolean, + val valueType: TrackerInputType, + val optionSet: String?, + val error: String?, + val warning: String?, + val description: String?, + val mandatory: Boolean, + val editable: Boolean, + val legend: LegendData?, + val orientation: Orientation, + val optionSetConfiguration: TrackerOptionSetConfiguration?, + val customIntentUid: String?, + val displayName: String?, + val orgUnitSelectorScope: OrgUnitSelectorScope?, + val searchOperator: SearchOperator?, + val minCharactersToSearch: Int?, +) + +@Composable +fun TrackerInputUiState.supportingText(): List<SupportingTextData>? { + val label = + searchOperator?.let { operator -> + if (focused) operator.supportingTextString() else null + } + return supportingTextList(searchOperatorLabel = label) +} + +fun TrackerInputUiState.inputState(): InputShellState = + when { + !editable -> InputShellState.DISABLED + error != null -> InputShellState.ERROR + focused -> InputShellState.FOCUSED + else -> InputShellState.UNFOCUSED + } + +/** + * Non-composable function to be used wherever a composable context is not available. For example, + * Unit Tests. Should use the [TrackerInputUiState.supportingText] method instead. + */ +fun TrackerInputUiState.supportingTextList(searchOperatorLabel: String?): List<SupportingTextData>? = + listOfNotNull( + error?.let { + SupportingTextData( + it, + SupportingTextState.ERROR, + ) + }, + warning?.let { + SupportingTextData( + it, + SupportingTextState.WARNING, + ) + }, + if (focused && searchOperator != null) { + searchOperatorLabel?.let { text -> + SupportingTextData( + text, + SupportingTextState.DEFAULT, + ) + } + } else { + null + }, + description?.let { + SupportingTextData( + it, + SupportingTextState.DEFAULT, + ) + }, + ).ifEmpty { null } + +@Composable +private fun SearchOperator.supportingTextString() = + when (this) { + SearchOperator.EQ -> + stringResource(Res.string.equal_search_operator) + SearchOperator.SW -> + stringResource(Res.string.starts_with_search_operator) + SearchOperator.EW -> + stringResource(Res.string.end_with_search_operator) + else -> null + } + +@Composable +fun TrackerInputUiState.loadOptionSetConfiguration( + getOptionSetFlow: (fieldUid: String, optionSetUid: String) -> Flow<PagingData<TrackerOptionItem>>?, + onOptionSetSearch: (fieldUid: String, query: String) -> Unit, +): TrackerInputUiState = + when { + valueType == TrackerInputType.YES_ONLY_CHECKBOX || + valueType == TrackerInputType.YES_ONLY_SWITCH || ( + optionSet == null && ( + valueType == TrackerInputType.HORIZONTAL_CHECKBOXES || + valueType == TrackerInputType.HORIZONTAL_RADIOBUTTONS || + valueType == TrackerInputType.VERTICAL_CHECKBOXES || + valueType == TrackerInputType.VERTICAL_RADIOBUTTONS + ) + ) + -> + this.getBooleanOptionConfiguration() + + optionSet != null -> { + val optionSetFlow = + getOptionSetFlow( + uid, + optionSet, + ) + this.loadWithOptionSetFlow( + optionSetFlow = optionSetFlow, + onSearch = { query -> + onOptionSetSearch(uid, query) + }, + ) + } + + else -> this + } + +@Composable +private fun TrackerInputUiState.getBooleanOptionConfiguration(): TrackerInputUiState { + val booleanConfiguration = + TrackerOptionSetConfiguration( + options = + listOf( + TrackerOptionItem( + code = true.toString(), + displayName = stringResource(Res.string.yes), + ), + TrackerOptionItem( + code = false.toString(), + displayName = stringResource(Res.string.no), + ), + ), + ) + + return copy(optionSetConfiguration = booleanConfiguration) +} + +@Composable +private fun TrackerInputUiState.loadWithOptionSetFlow( + optionSetFlow: Flow<PagingData<TrackerOptionItem>>?, + onSearch: ((String) -> Unit)?, +): TrackerInputUiState { + if (optionSetFlow == null) return this + + val optionsData = optionSetFlow.collectAsLazyPagingItems() + + LaunchedEffect(Unit) { + optionsData.refresh() + } + + val options by remember { + derivedStateOf { + (0 until optionsData.itemCount).mapNotNull { index -> + optionsData[index] + } + } + } + + return copy( + optionSetConfiguration = + TrackerOptionSetConfiguration( + options = options, + onSearch = onSearch, + onLoadOptions = { optionsData.refresh() }, + ), + ) +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerOptionSetConfiguration.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerOptionSetConfiguration.kt new file mode 100644 index 00000000000..7f2a2917c6a --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/input/ui/state/TrackerOptionSetConfiguration.kt @@ -0,0 +1,16 @@ +package org.dhis2.tracker.input.ui.state + +/** + * Configuration for option set fields in tracker inputs. + * Provides options and callbacks for dropdown/selection components. + */ +data class TrackerOptionSetConfiguration( + val options: List<TrackerOptionItem>, + val onSearch: ((String) -> Unit)? = null, + val onLoadOptions: (() -> Unit)? = null, +) + +data class TrackerOptionItem( + val code: String, + val displayName: String, +) diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/relationships/ui/RelationshipsScreen.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/relationships/ui/RelationshipsScreen.kt index 679cdf17b08..fe879bf836e 100644 --- a/tracker/src/commonMain/kotlin/org/dhis2/tracker/relationships/ui/RelationshipsScreen.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/relationships/ui/RelationshipsScreen.kt @@ -85,7 +85,6 @@ import org.hisp.dhis.mobile.ui.designsystem.files.buildPainterForFile import org.hisp.dhis.mobile.ui.designsystem.theme.DHIS2TextStyle import org.hisp.dhis.mobile.ui.designsystem.theme.Shape import org.hisp.dhis.mobile.ui.designsystem.theme.Spacing -import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor import org.hisp.dhis.mobile.ui.designsystem.theme.TextColor import org.hisp.dhis.mobile.ui.designsystem.theme.dropShadow import org.hisp.dhis.mobile.ui.designsystem.theme.getTextStyle @@ -117,8 +116,6 @@ fun RelationShipsScreen( Snackbar( modifier = Modifier.dropShadow(shape = SnackbarDefaults.shape), snackbarData = data, - containerColor = SurfaceColor.SurfaceBright, - contentColor = TextColor.OnSurface, ) } }, diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepository.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepository.kt new file mode 100644 index 00000000000..03075e6c880 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/OptionSetRepository.kt @@ -0,0 +1,25 @@ +package org.dhis2.tracker.search.data + +import androidx.paging.PagingData +import kotlinx.coroutines.flow.Flow +import org.dhis2.tracker.input.ui.state.TrackerOptionItem + +/** + * Repository for fetching option set data. + * Handles pagination and search of options for dropdown/selection inputs. + */ +interface OptionSetRepository { + /** + * Fetches paginated options for a given option set. + * + * @param optionSetUid The unique identifier of the option set + * @param pageSize Number of items per page + * @param searchQuery Optional search query to filter options + * @return Flow of paginated option items + */ + fun getOptions( + optionSetUid: String, + pageSize: Int = 10, + searchQuery: String? = null, + ): Flow<PagingData<TrackerOptionItem>> +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/SearchParametersRepository.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/SearchParametersRepository.kt new file mode 100644 index 00000000000..5b13e398794 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/SearchParametersRepository.kt @@ -0,0 +1,9 @@ +package org.dhis2.tracker.search.data + +import org.dhis2.tracker.search.model.SearchParameterModel + +interface SearchParametersRepository { + suspend fun getSearchParametersByProgram(programUid: String): List<SearchParameterModel> + + suspend fun getSearchParametersByTrackedEntityType(trackedEntityTypeUid: String): List<SearchParameterModel> +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepository.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepository.kt new file mode 100644 index 00000000000..c434cefdfb0 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/data/SearchTrackedEntityRepository.kt @@ -0,0 +1,42 @@ +package org.dhis2.tracker.search.data + +import androidx.paging.PagingData +import kotlinx.coroutines.flow.Flow +import org.dhis2.tracker.search.model.SearchOperator +import org.dhis2.tracker.search.model.SearchTrackedEntityAttribute +import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult + +interface SearchTrackedEntityRepository { + suspend fun isTETypeAttribute( + teType: String, + dataId: String, + ): Boolean + + suspend fun getTEAttribute(dataId: String): SearchTrackedEntityAttribute + + suspend fun addToQuery( + dataId: String, + dataValues: List<String>? = null, + searchOperator: SearchOperator?, + ) + + suspend fun addFiltersToQuery( + program: String?, + teType: String, + ) + + suspend fun excludeValuesFromQuery(excludeValues: List<String>) + + fun fetchResults( + isOnline: Boolean, + hasStateFilters: Boolean, + allowCache: Boolean, + selectedProgram: String?, + ): Flow<PagingData<TrackedEntitySearchItemResult>> + + suspend fun fetchImmediateResults( + isOnline: Boolean, + hasStateFilters: Boolean, + selectedProgram: String?, + ): List<TrackedEntitySearchItemResult> +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.kt new file mode 100644 index 00000000000..8018e82997f --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.kt @@ -0,0 +1,42 @@ +package org.dhis2.tracker.search.di + +import org.dhis2.mobile.commons.resources.StringResourceProvider +import org.dhis2.tracker.search.domain.FetchOptionSetOptions +import org.dhis2.tracker.search.domain.SearchTrackedEntities +import org.dhis2.tracker.search.ui.viewmodel.SearchParametersViewModel +import org.koin.core.module.Module +import org.koin.core.module.dsl.factoryOf +import org.koin.core.module.dsl.viewModelOf +import org.koin.dsl.module + +/** + * Platform-specific repository module. + * Implemented in androidMain and other platform-specific source sets. + */ +internal expect val trackerSearchRepositoryModule: Module + +/** + * Common tracker search module containing use cases and common dependencies. + */ +val trackerSearchModule = + module { + // Include platform-specific repository implementations + includes(trackerSearchRepositoryModule) + + // Use cases + // With teType parameter + factory { params -> + SearchTrackedEntities( + repository = get(), + customIntentRepository = get(), + teType = params.get(), + ) + } + factoryOf(::FetchOptionSetOptions) + + // Providers + single<StringResourceProvider> { StringResourceProvider() } + + // ViewModels + viewModelOf(::SearchParametersViewModel) + } diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/FetchOptionSetOptions.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/FetchOptionSetOptions.kt new file mode 100644 index 00000000000..bdc123bf1fc --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/FetchOptionSetOptions.kt @@ -0,0 +1,35 @@ +package org.dhis2.tracker.search.domain + +import androidx.paging.PagingData +import kotlinx.coroutines.flow.Flow +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.tracker.input.ui.state.TrackerOptionItem +import org.dhis2.tracker.search.data.OptionSetRepository + +/** + * Use case for fetching option set options with pagination. + * Coordinates between repository and UI layer. + */ +class FetchOptionSetOptions( + private val optionSetRepository: OptionSetRepository, +) : UseCase<FetchOptionSetOptions.Params, Flow<PagingData<TrackerOptionItem>>> { + override suspend fun invoke(input: Params): Result<Flow<PagingData<TrackerOptionItem>>> = + try { + val flow = + optionSetRepository.getOptions( + optionSetUid = input.optionSetUid, + pageSize = input.pageSize, + searchQuery = input.searchQuery, + ) + Result.success(flow) + } catch (e: DomainError) { + Result.failure(e) + } + + data class Params( + val optionSetUid: String, + val pageSize: Int = 10, + val searchQuery: String? = null, + ) +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/FetchSearchParameters.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/FetchSearchParameters.kt new file mode 100644 index 00000000000..df57dfdbceb --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/FetchSearchParameters.kt @@ -0,0 +1,59 @@ +package org.dhis2.tracker.search.domain + +import kotlinx.coroutines.withContext +import org.dhis2.mobile.commons.coroutine.Dispatcher +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.search.data.SearchParametersRepository +import org.dhis2.tracker.search.model.FetchSearchParametersData +import org.dhis2.tracker.search.model.SearchParameterModel + +class FetchSearchParameters( + val dispatcher: Dispatcher, + val repository: SearchParametersRepository, +) : UseCase<FetchSearchParametersData, List<SearchParameterModel>> { + val hiddenInputTypes = + listOf( + TrackerInputType.IMAGE, + TrackerInputType.COORDINATES, + TrackerInputType.LETTER, + TrackerInputType.UNIT_INTERVAL, + TrackerInputType.COORDINATES, + TrackerInputType.URL, + TrackerInputType.NOT_SUPPORTED, + ) + + override suspend fun invoke(input: FetchSearchParametersData): Result<List<SearchParameterModel>> = + withContext(dispatcher.io) { + try { + val searchParameters = + input.programUid?.let { + repository.getSearchParametersByProgram(it) + } ?: repository.getSearchParametersByTrackedEntityType(input.teiTypeUid) + + val filteredSearchParameters = + searchParameters + .filter { + it.inputType !in hiddenInputTypes + } + + Result.success(sortSearchParameters(filteredSearchParameters)) + } catch (e: DomainError) { + Result.failure(e) + } + } + + // Sort parameters to list first QR or BarCode uniques, then QR or BarCode and then remaining uniques + internal fun sortSearchParameters(parameters: List<SearchParameterModel>): List<SearchParameterModel> = + parameters.sortedWith( + compareByDescending<SearchParameterModel> { + isQrCodeOrBarCode(it.inputType) && it.isUnique + }.thenByDescending { + isQrCodeOrBarCode(it.inputType) + }.thenByDescending { it.isUnique }, + ) + + internal fun isQrCodeOrBarCode(inputType: TrackerInputType?): Boolean = + inputType == TrackerInputType.QR_CODE || inputType == TrackerInputType.BAR_CODE +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntities.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntities.kt new file mode 100644 index 00000000000..cc13a14e6d9 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntities.kt @@ -0,0 +1,109 @@ +package org.dhis2.tracker.search.domain + +import androidx.paging.PagingData +import kotlinx.coroutines.flow.Flow +import org.dhis2.mobile.commons.customintents.CustomIntentRepository +import org.dhis2.mobile.commons.domain.UseCase +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.mobile.commons.model.CustomIntentActionTypeModel +import org.dhis2.tracker.search.data.SearchTrackedEntityRepository +import org.dhis2.tracker.search.model.SearchTrackedEntitiesInput +import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult + +class SearchTrackedEntities( + private val repository: SearchTrackedEntityRepository, + private val customIntentRepository: CustomIntentRepository, + private val teType: String, +) : UseCase<SearchTrackedEntitiesInput, Flow<PagingData<TrackedEntitySearchItemResult>>> { + override suspend fun invoke(input: SearchTrackedEntitiesInput): Result<Flow<PagingData<TrackedEntitySearchItemResult>>> { + try { + prepareQuery(input, teType) + // Due to performance issues and possible duplicates we exclude the values in the exclude list only when no program is selected + if (input.excludeValues?.isNotEmpty() == true && input.selectedProgram == null) { + repository.excludeValuesFromQuery(input.excludeValues.toList()) + } + // fetch results from repository based on the prepared query + // and if the device is online and has state filters + return Result.success( + repository.fetchResults( + isOnline = input.isOnline, + hasStateFilters = input.hasStateFilters, + allowCache = input.allowCache, + selectedProgram = input.selectedProgram, + ), + ) + } catch (domainError: DomainError) { + // Errors will be handled by the view layer + return Result.failure(domainError) + } + } + + /** + * Invoke method for immediate non-paginated results. + * Useful for scenarios like QR code scanning where immediate results are needed. + */ + suspend fun invokeImmediate(input: SearchTrackedEntitiesInput): Result<List<TrackedEntitySearchItemResult>> { + try { + prepareQuery(input, teType) + // Due to performance issues and possible duplicates we exclude the values in the exclude list only when no program is selected + if (input.excludeValues?.isNotEmpty() == true && input.selectedProgram == null) { + repository.excludeValuesFromQuery(input.excludeValues.toList()) + } + // fetch immediate results from repository + return Result.success( + repository.fetchImmediateResults( + isOnline = input.isOnline, + hasStateFilters = input.hasStateFilters, + selectedProgram = input.selectedProgram, + ), + ) + } catch (domainError: DomainError) { + return Result.failure(domainError) + } + } + + private suspend fun prepareQuery( + input: SearchTrackedEntitiesInput, + teType: String, + ) { + // Add filters from FilterManager + repository.addFiltersToQuery(input.selectedProgram, teType) + + input.queryDataList?.forEach { data -> + val isTETypeAttribute = getIsTETypeAttribute(input.selectedProgram, data.attributeId, teType) + + if (input.selectedProgram != null || isTETypeAttribute) { + val normalizedValues = + data.values?.let { + if (it.size > 1 && + !customIntentRepository.attributeHasCustomIntentAndReturnsAListOfValues( + data.attributeId, + CustomIntentActionTypeModel.SEARCH, + ) + ) { + mutableListOf(it.joinToString(",")) + } else { + it + } + } + + repository.addToQuery( + data.attributeId, + normalizedValues, + data.searchOperator, + ) + } + } + } + + private suspend fun getIsTETypeAttribute( + selectedProgram: String?, + dataId: String, + teType: String, + ): Boolean = + if (selectedProgram == null) { + repository.isTETypeAttribute(teType, dataId) + } else { + false + } +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/FetchSearchParametersData.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/FetchSearchParametersData.kt new file mode 100644 index 00000000000..7e09670f911 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/FetchSearchParametersData.kt @@ -0,0 +1,6 @@ +package org.dhis2.tracker.search.model + +data class FetchSearchParametersData( + val teiTypeUid: String, + val programUid: String? = null, +) diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/QueryData.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/QueryData.kt new file mode 100644 index 00000000000..a306466dda0 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/QueryData.kt @@ -0,0 +1,7 @@ +package org.dhis2.tracker.search.model + +data class QueryData( + val attributeId: String, + val values: List<String>?, + val searchOperator: SearchOperator?, +) diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchOperator.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchOperator.kt new file mode 100644 index 00000000000..ab6ccf44e7a --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchOperator.kt @@ -0,0 +1,24 @@ +package org.dhis2.tracker.search.model + +import androidx.annotation.VisibleForTesting + +enum class SearchOperator { + LIKE, + SW, + EW, + EQ, +} + +/** + * Method use explicitly for testing purposes. Simulating that the search operator + * has a label assigned. + */ +@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) +fun SearchOperator.hasLabel(): Boolean = + when (this) { + SearchOperator.EQ, + SearchOperator.SW, + SearchOperator.EW, + -> true + else -> false + } diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchParameterModel.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchParameterModel.kt new file mode 100644 index 00000000000..83f5a98dfba --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchParameterModel.kt @@ -0,0 +1,14 @@ +package org.dhis2.tracker.search.model + +import org.dhis2.tracker.input.model.TrackerInputType + +data class SearchParameterModel( + val uid: String, + val label: String, + val inputType: TrackerInputType, + val optionSet: String?, + val customIntentUid: String? = null, + val minCharactersToSearch: Int?, + val searchOperator: SearchOperator?, + val isUnique: Boolean, +) diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchTrackedEntitiesInput.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchTrackedEntitiesInput.kt new file mode 100644 index 00000000000..48d8061fc59 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchTrackedEntitiesInput.kt @@ -0,0 +1,10 @@ +package org.dhis2.tracker.search.model + +data class SearchTrackedEntitiesInput( + val selectedProgram: String?, + val allowCache: Boolean, + val excludeValues: Set<String>?, + val hasStateFilters: Boolean, + val isOnline: Boolean, + val queryDataList: List<QueryData>? = null, +) diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchTrackedEntityAttribute.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchTrackedEntityAttribute.kt new file mode 100644 index 00000000000..916ec481093 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/SearchTrackedEntityAttribute.kt @@ -0,0 +1,6 @@ +package org.dhis2.tracker.search.model + +data class SearchTrackedEntityAttribute( + val isUnique: Boolean, + val isOptionSet: Boolean, +) diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/TrackedEntitySearchItemResult.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/TrackedEntitySearchItemResult.kt new file mode 100644 index 00000000000..30c973fa10b --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/model/TrackedEntitySearchItemResult.kt @@ -0,0 +1,113 @@ +package org.dhis2.tracker.search.model + +import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.relationships.model.RelationshipModel +import kotlin.time.Instant + +data class TrackedEntitySearchItemResult( + val uid: String, + val created: Instant?, + val lastUpdated: Instant?, + val createdAtClient: Instant?, + val lastUpdatedAtClient: Instant?, + val ownerOrgUnit: String?, + val enrollmentOrgUnit: String?, + val shouldDisplayOrgUnit: Boolean, + val geometry: TrackedEntityGeometry?, + val syncState: SyncState?, + val aggregatedSyncState: SyncState?, + val deleted: Boolean, + val isOnline: Boolean, + val teTypeName: String?, + val type: TrackedEntityTypeDomain, + val header: String?, + val overDueDate: Instant?, + val selectedEnrollment: DomainEnrollment?, + val profilePicture: String?, + val enrolledPrograms: List<DomainProgram>?, + val enrollments: List<DomainEnrollment>?, + val relationships: List<RelationshipModel>?, + val defaultTypeIcon: String?, + val attributeValues: List<TrackedEntitySearchItemAttributeDomain>, +) + +class DomainEnrollment( + val uid: String, + val orgUnit: String?, + val program: String?, + val enrollmentDate: Instant?, + val incidentDate: Instant?, + val completedDate: Instant?, + val followUp: Boolean, + val status: EnrollmentStatus, + val trackedEntityInstance: String?, +) + +class DomainProgram( + val uid: String, + val displayName: String, + val style: DomainObjectStyle, +) + +class DomainObjectStyle( + val icon: String?, + val color: String?, +) + +enum class EnrollmentStatus { + ACTIVE, + COMPLETED, + CANCELLED, +} + +data class TrackedEntitySearchItemAttributeDomain( + val attribute: String, + val displayName: String, + val displayFormName: String, + val value: String?, + val valueType: TrackerInputType, + val displayInList: Boolean, + val optionSet: String?, +) + +data class TrackedEntityTypeDomain( + val trackedEntityTypeAttributeDomains: List<TrackedEntityTypeAttributeDomain>, + val featureType: GeometryFeatureType, +) + +data class TrackedEntityTypeAttributeDomain( + val trackedEntityTypeUid: String?, + val trackedEntityAttributeUid: String?, + val displayInList: Boolean, + val mandatory: Boolean, + val searchable: Boolean, + val sortOrder: Int, +) + +data class TrackedEntityGeometry( + val geometryFeatureType: GeometryFeatureType, + val coordinates: String?, +) + +enum class GeometryFeatureType( + val featureType: String, + val geometryType: String, +) { + POINT("POINT", "Point"), + POLYGON("POLYGON", "Polygon"), + MULTI_POLYGON("MULTI_POLYGON", "MultiPolygon"), + NONE("NONE", "None"), + SYMBOL("SYMBOL", "Symbol"), +} + +enum class SyncState { + TO_POST, + TO_UPDATE, + ERROR, + SYNCED, + WARNING, + UPLOADING, + RELATIONSHIP, + SENT_VIA_SMS, + SYNCED_VIA_SMS, +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/action/SearchScreenUiEvent.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/action/SearchScreenUiEvent.kt new file mode 100644 index 00000000000..22b8e1c5010 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/action/SearchScreenUiEvent.kt @@ -0,0 +1,9 @@ +package org.dhis2.tracker.search.ui.action + +sealed interface SearchScreenUiEvent { + data object OnSearchButtonClicked : SearchScreenUiEvent + + data object OnClearSearchButtonClicked : SearchScreenUiEvent + + data object OnCloseClicked : SearchScreenUiEvent +} diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/provider/ParameterSelectorItemProvider.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/provider/ParameterSelectorItemProvider.kt new file mode 100644 index 00000000000..b9652e9e481 --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/provider/ParameterSelectorItemProvider.kt @@ -0,0 +1,93 @@ +package org.dhis2.tracker.search.ui.provider + +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.AddCircleOutline +import androidx.compose.material.icons.outlined.QrCode2 +import androidx.compose.material3.Icon +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.input.ui.action.TrackerInputUiEvent +import org.dhis2.tracker.input.ui.provider.TrackerInputProvider +import org.dhis2.tracker.input.ui.state.TrackerInputUiState +import org.hisp.dhis.mobile.ui.designsystem.component.parameter.ParameterInputStyle +import org.hisp.dhis.mobile.ui.designsystem.component.parameter.model.ParameterSelectorItemModel +import org.hisp.dhis.mobile.ui.designsystem.resource.provideDHIS2Icon +import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor + +@Composable +fun provideParameterSelectorItem( + inputModel: TrackerInputUiState, + helperText: String, + onNextClicked: () -> Unit, + onUiEvent: (TrackerInputUiEvent) -> Unit, +): ParameterSelectorItemModel { + val status = + if (inputModel.focused) { + ParameterSelectorItemModel.Status.FOCUSED + } else if (inputModel.value.isNullOrEmpty()) { + ParameterSelectorItemModel.Status.CLOSED + } else { + ParameterSelectorItemModel.Status.UNFOCUSED + } + + return ParameterSelectorItemModel( + icon = { ProvideParameterIcon(inputModel.valueType) }, + label = inputModel.label, + helper = helperText, + inputField = { + TrackerInputProvider( + modifier = Modifier, + inputStyle = ParameterInputStyle(), + inputModel = inputModel, + onNextClicked = onNextClicked, + onUiEvent = onUiEvent, + ) + }, + status = status, + onExpand = { + onUiEvent(TrackerInputUiEvent.OnItemClick(inputModel.uid)) + when (inputModel.valueType) { + TrackerInputType.QR_CODE, + TrackerInputType.BAR_CODE, + -> + onUiEvent( + TrackerInputUiEvent.OnScanButtonClicked( + inputModel.uid, + inputModel.optionSet, + inputModel.valueType, + ), + ) + + else -> { + // no-op + } + } + }, + ) +} + +@Composable +private fun ProvideParameterIcon(valueType: TrackerInputType?) = + when (valueType) { + TrackerInputType.QR_CODE -> + Icon( + imageVector = Icons.Outlined.QrCode2, + contentDescription = "QR Code Icon", + tint = SurfaceColor.Primary, + ) + + TrackerInputType.BAR_CODE -> + Icon( + painter = provideDHIS2Icon("material_barcode_scanner"), + contentDescription = "Barcode Icon", + tint = SurfaceColor.Primary, + ) + + else -> + Icon( + imageVector = Icons.Outlined.AddCircleOutline, + contentDescription = "Add Icon", + tint = SurfaceColor.Primary, + ) + } diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/screen/SearchParametersScreen.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/screen/SearchParametersScreen.kt new file mode 100644 index 00000000000..cacf4b0d15a --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/screen/SearchParametersScreen.kt @@ -0,0 +1,308 @@ +package org.dhis2.tracker.search.ui.screen + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.calculateEndPadding +import androidx.compose.foundation.layout.calculateStartPadding +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.shape.CornerSize +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Cancel +import androidx.compose.material.icons.outlined.ErrorOutline +import androidx.compose.material.icons.outlined.Search +import androidx.compose.material3.Icon +import androidx.compose.material3.Scaffold +import androidx.compose.material3.SnackbarDuration +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusManager +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.platform.LocalLayoutDirection +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.unit.dp +import androidx.paging.PagingData +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch +import org.dhis2.mobile.tracker.resources.Res +import org.dhis2.mobile.tracker.resources.clear_search +import org.dhis2.mobile.tracker.resources.empty_search_attributes_message +import org.dhis2.mobile.tracker.resources.optional +import org.dhis2.mobile.tracker.resources.search +import org.dhis2.tracker.input.ui.action.TrackerInputUiEvent +import org.dhis2.tracker.input.ui.state.TrackerInputUiState +import org.dhis2.tracker.input.ui.state.TrackerOptionItem +import org.dhis2.tracker.input.ui.state.loadOptionSetConfiguration +import org.dhis2.tracker.search.ui.action.SearchScreenUiEvent +import org.dhis2.tracker.search.ui.provider.provideParameterSelectorItem +import org.dhis2.tracker.search.ui.state.SearchParametersUiState +import org.dhis2.tracker.search.ui.viewmodel.SearchParametersViewModel +import org.hisp.dhis.mobile.ui.designsystem.component.AdditionalInfoItemColor +import org.hisp.dhis.mobile.ui.designsystem.component.Button +import org.hisp.dhis.mobile.ui.designsystem.component.ButtonStyle +import org.hisp.dhis.mobile.ui.designsystem.component.InfoBar +import org.hisp.dhis.mobile.ui.designsystem.component.parameter.ParameterSelectorItem +import org.hisp.dhis.mobile.ui.designsystem.theme.Radius +import org.hisp.dhis.mobile.ui.designsystem.theme.Shape +import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor +import org.hisp.dhis.mobile.ui.designsystem.theme.TextColor +import org.jetbrains.compose.resources.stringResource +import org.koin.compose.viewmodel.koinViewModel + +@Composable +fun SearchParametersScreen( + externalUiState: SearchParametersUiState, + onSearchScreenUiEvent: (SearchScreenUiEvent) -> Unit, + onTrackerInputUiEvent: (TrackerInputUiEvent) -> Unit, + isLandscape: Boolean, + getOptionSetFlow: (fieldUid: String, optionSetUid: String) -> Flow<PagingData<TrackerOptionItem>>?, + onOptionSetSearch: (fieldUid: String, query: String) -> Unit, +) { + val viewModel = koinViewModel<SearchParametersViewModel>() + + LaunchedEffect(externalUiState) { + viewModel.updateFromExternal(externalUiState) + } + + val uiState by viewModel.uiState.collectAsState() + val validationResult by viewModel.validationResult.collectAsState() + + val snackBarHostState = remember { SnackbarHostState() } + val coroutineScope = rememberCoroutineScope() + val focusManager = LocalFocusManager.current + + uiState.minAttributesMessage?.let { message -> + coroutineScope.launch { + uiState.shouldShowMinAttributeWarning.collectLatest { + if (it) { + snackBarHostState.showSnackbar( + message = message, + duration = SnackbarDuration.Short, + ) + uiState.updateMinAttributeWarning(false) + } + } + } + } + + LaunchedEffect(uiState.isOnBackPressed) { + uiState.isOnBackPressed.collectLatest { + manageOnBackPressed(it, focusManager, onSearchScreenUiEvent) + } + } + + LaunchedEffect(validationResult) { + validationResult?.let { isValid -> + if (isValid) { + onSearchScreenUiEvent(SearchScreenUiEvent.OnSearchButtonClicked) + } + + viewModel.resetValidationResult() + } + } + + val backgroundShape = getBackgroundShape(isLandscape) + + Scaffold( + containerColor = Color.Transparent, + snackbarHost = { + SnackbarHost( + hostState = snackBarHostState, + modifier = + Modifier.padding( + start = 8.dp, + top = 8.dp, + end = 8.dp, + bottom = 48.dp, + ), + ) + }, + ) { paddingValues -> + val layoutDirection = LocalLayoutDirection.current + Column( + modifier = + Modifier + .fillMaxSize() + .background(color = Color.White, shape = backgroundShape) + .padding( + top = 0.dp, + bottom = paddingValues.calculateBottomPadding(), + start = paddingValues.calculateStartPadding(layoutDirection), + end = paddingValues.calculateEndPadding(layoutDirection), + ), + ) { + LazyColumn( + modifier = + Modifier + .weight(1F) + .testTag(SEARCH_PARAMETERS_LIST_TAG), + ) { + if (uiState.items.isEmpty()) { + item { + Box( + modifier = + Modifier + .fillMaxWidth() + .padding(16.dp), + contentAlignment = Alignment.Center, + ) { + InfoBar( + modifier = Modifier.testTag("EMPTY_SEARCH_ATTRIBUTES_TEXT_TAG"), + text = stringResource(Res.string.empty_search_attributes_message), + icon = { + Icon( + imageVector = Icons.Outlined.ErrorOutline, + contentDescription = "warning", + tint = AdditionalInfoItemColor.WARNING.color, + ) + }, + textColor = AdditionalInfoItemColor.WARNING.color, + backgroundColor = AdditionalInfoItemColor.WARNING.color.copy(alpha = 0.1f), + ) + } + } + } else { + itemsIndexed( + items = uiState.items, + key = { _, fieldUiModel -> + fieldUiModel.uid + }, + ) { index, trackerInputModel -> + ParameterSelectorItem( + modifier = + Modifier + .testTag("SEARCH_PARAM_ITEM"), + model = + provideParameterSelectorItem( + inputModel = + trackerInputModel.loadOptionSetConfiguration( + getOptionSetFlow = getOptionSetFlow, + onOptionSetSearch = onOptionSetSearch, + ), + helperText = stringResource(Res.string.optional), + onNextClicked = { + manageOnNextClick( + index, + uiState.items, + onTrackerInputUiEvent, + ) + }, + onUiEvent = onTrackerInputUiEvent, + ), + ) + } + } + + if (uiState.clearSearchEnabled) { + item { + Box( + modifier = Modifier.fillMaxWidth(), + contentAlignment = Alignment.Center, + ) { + Button( + modifier = Modifier.padding(16.dp, 24.dp, 16.dp, 8.dp), + style = ButtonStyle.TEXT, + text = stringResource(Res.string.clear_search), + icon = { + Icon( + imageVector = Icons.Outlined.Cancel, + contentDescription = "clear search", + tint = SurfaceColor.Primary, + ) + }, + ) { + focusManager.clearFocus() + onSearchScreenUiEvent(SearchScreenUiEvent.OnClearSearchButtonClicked) + } + } + } + } + } + + Button( + enabled = uiState.searchEnabled, + modifier = + Modifier + .fillMaxWidth() + .padding(16.dp, 8.dp, 16.dp, 8.dp) + .testTag("SEARCH_BUTTON"), + style = ButtonStyle.FILLED, + text = stringResource(Res.string.search), + icon = { + val iconTint = getButtonColour(uiState.searchEnabled) + Icon( + imageVector = Icons.Outlined.Search, + contentDescription = "search", + tint = iconTint, + ) + }, + ) { + focusManager.clearFocus() + viewModel.onValidateSearch() + } + } + } +} + +private fun manageOnBackPressed( + it: Boolean, + focusManager: FocusManager, + onSearchScreenUiEvent: (SearchScreenUiEvent) -> Unit, +) { + if (it) { + focusManager.clearFocus() + onSearchScreenUiEvent(SearchScreenUiEvent.OnCloseClicked) + } +} + +private fun manageOnNextClick( + index: Int, + items: List<TrackerInputUiState>, + onTrackerInputUiEvent: (TrackerInputUiEvent) -> Unit, +) { + val nextIndex = index + 1 + if (index + 1 < items.size && nextIndex < items.size) { + val nexItemUid = items[nextIndex].uid + onTrackerInputUiEvent( + TrackerInputUiEvent.OnItemClick( + nexItemUid, + ), + ) + } +} + +fun getBackgroundShape(isLandscape: Boolean): RoundedCornerShape = + if (isLandscape) { + RoundedCornerShape( + topStart = CornerSize(Radius.L), + topEnd = CornerSize(Radius.NoRounding), + bottomEnd = CornerSize(Radius.NoRounding), + bottomStart = CornerSize(Radius.NoRounding), + ) + } else { + Shape.LargeTop + } + +fun getButtonColour(enabled: Boolean): Color = + if (enabled) { + TextColor.OnPrimary + } else { + TextColor.OnDisabledSurface + } + +const val SEARCH_PARAMETERS_LIST_TAG = "SEARCH_PARAMETERS_LIST_TAG" diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/model/SearchParametersUiState.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/state/SearchParametersUiState.kt similarity index 86% rename from app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/model/SearchParametersUiState.kt rename to tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/state/SearchParametersUiState.kt index be65022a20e..3f3fed50f4b 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/searchparameters/model/SearchParametersUiState.kt +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/state/SearchParametersUiState.kt @@ -1,11 +1,11 @@ -package org.dhis2.usescases.searchTrackEntity.searchparameters.model +package org.dhis2.tracker.search.ui.state import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharedFlow -import org.dhis2.form.model.FieldUiModel +import org.dhis2.tracker.input.ui.state.TrackerInputUiState data class SearchParametersUiState( - val items: List<FieldUiModel> = listOf(), + val items: List<TrackerInputUiState> = listOf(), val minAttributesMessage: String? = null, private val _shouldShowMinAttributeWarning: MutableSharedFlow<Boolean> = MutableSharedFlow( diff --git a/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/viewmodel/SearchParametersViewModel.kt b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/viewmodel/SearchParametersViewModel.kt new file mode 100644 index 00000000000..3ea6a59c0cb --- /dev/null +++ b/tracker/src/commonMain/kotlin/org/dhis2/tracker/search/ui/viewmodel/SearchParametersViewModel.kt @@ -0,0 +1,72 @@ +package org.dhis2.tracker.search.ui.viewmodel + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import org.dhis2.mobile.commons.resources.StringResourceProvider +import org.dhis2.mobile.tracker.resources.Res +import org.dhis2.mobile.tracker.resources.min_characters_warning +import org.dhis2.tracker.search.ui.state.SearchParametersUiState + +class SearchParametersViewModel( + private val resourceProvider: StringResourceProvider, +) : ViewModel() { + private val _uiState = MutableStateFlow(SearchParametersUiState()) + val uiState: StateFlow<SearchParametersUiState> = _uiState.asStateFlow() + + private val _validationResult = MutableStateFlow<Boolean?>(null) + val validationResult: StateFlow<Boolean?> = _validationResult.asStateFlow() + + fun updateFromExternal(externalState: SearchParametersUiState) { + _uiState.value = externalState + } + + fun onValidateSearch() { + viewModelScope.launch { + _validationResult.value = onValidateMinCharacters() + } + } + + private suspend fun onValidateMinCharacters(): Boolean { + val items = _uiState.value.items + // Check if there are invalid items to later check the warning + val invalidItems = + items.filter { item -> + val min = item.minCharactersToSearch ?: return@filter false + val value = item.value + !value.isNullOrEmpty() && value.length < min + } + + if (invalidItems.isNotEmpty()) { + val updatedItems = + items.map { item -> + val min = item.minCharactersToSearch + if (min != null && !item.value.isNullOrEmpty() && item.value.length < min) { + item.copy( + error = + resourceProvider.provideString( + resource = Res.string.min_characters_warning, + min, + ), + ) + } else { + item.copy(error = null) + } + } + _uiState.update { it.copy(items = updatedItems) } + return false + } + + val clearedItems = items.map { it.copy(error = null) } + _uiState.update { it.copy(items = clearedItems) } + return true + } + + fun resetValidationResult() { + _validationResult.value = null + } +} diff --git a/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/SearchParametersIntegrationTest.kt b/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/SearchParametersIntegrationTest.kt new file mode 100644 index 00000000000..881b0f3364f --- /dev/null +++ b/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/SearchParametersIntegrationTest.kt @@ -0,0 +1,290 @@ +package org.dhis2.tracker.search + +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.resetMain +import kotlinx.coroutines.test.runTest +import kotlinx.coroutines.test.setMain +import org.dhis2.mobile.commons.coroutine.Dispatcher +import org.dhis2.mobile.commons.resources.StringResourceProvider +import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.input.ui.mapper.toTrackerInputUiState +import org.dhis2.tracker.input.ui.state.supportingTextList +import org.dhis2.tracker.search.data.SearchParametersRepository +import org.dhis2.tracker.search.domain.FetchSearchParameters +import org.dhis2.tracker.search.model.FetchSearchParametersData +import org.dhis2.tracker.search.model.SearchOperator +import org.dhis2.tracker.search.model.SearchParameterModel +import org.dhis2.tracker.search.model.hasLabel +import org.dhis2.tracker.search.ui.state.SearchParametersUiState +import org.dhis2.tracker.search.ui.viewmodel.SearchParametersViewModel +import org.hisp.dhis.mobile.ui.designsystem.component.SupportingTextState +import org.mockito.kotlin.any +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever +import kotlin.test.AfterTest +import kotlin.test.BeforeTest +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNotNull +import kotlin.test.assertNull +import kotlin.test.assertTrue + +@ExperimentalCoroutinesApi +class SearchParametersIntegrationTest { + private val testDispatcher = StandardTestDispatcher() + private val dispatcher = + Dispatcher( + io = testDispatcher, + main = testDispatcher, + default = testDispatcher, + ) + + private val repository: SearchParametersRepository = mock() + private val resourceProvider: StringResourceProvider = mock() + + private lateinit var fetchSearchParameters: FetchSearchParameters + private lateinit var viewModel: SearchParametersViewModel + + @BeforeTest + fun setUp() { + Dispatchers.setMain(testDispatcher) + fetchSearchParameters = FetchSearchParameters(dispatcher, repository) + viewModel = SearchParametersViewModel(resourceProvider) + } + + @AfterTest + fun tearDown() { + Dispatchers.resetMain() + } + + @Test + fun `given min character limit is configured, when user enters exactly min characters, then search proceeds successfully`() = + runTest(testDispatcher) { + // Given + val min = 2 + val teiTypeUid = "teiType123" + val searchParameter = + buildSearchParameter( + uid = "field1", + minCharactersToSearch = min, + ) + whenever(repository.getSearchParametersByTrackedEntityType(teiTypeUid)) + .thenReturn(listOf(searchParameter)) + + val fetchResult = + fetchSearchParameters(FetchSearchParametersData(teiTypeUid = teiTypeUid)) + assertTrue(fetchResult.isSuccess) + + // When - user enters exactly min characters + val itemWithExactMinChars = + fetchResult + .getOrNull()!! + .map { it.toTrackerInputUiState().copy(value = "a".repeat(min)) } + viewModel.updateFromExternal(SearchParametersUiState(items = itemWithExactMinChars)) + viewModel.onValidateSearch() + advanceUntilIdle() + + // Then - search proceeds successfully + val validationResult = viewModel.validationResult.first() + assertEquals(true, validationResult) + + // And no error message is shown + val uiState = viewModel.uiState.first() + assertTrue(uiState.items.all { it.error == null }) + } + + @Test + fun `given min character limit, when user enters fewer than min characters, then search fails and error is shown`() = + runTest(testDispatcher) { + // Given + val min = 3 + val teiTypeUid = "teiType123" + val errorMessage = "Minimum $min characters required" + val searchParameter = + buildSearchParameter( + uid = "field1", + minCharactersToSearch = min, + ) + whenever(repository.getSearchParametersByTrackedEntityType(teiTypeUid)) + .thenReturn(listOf(searchParameter)) + whenever(resourceProvider.provideString(any(), any())).thenReturn(errorMessage) + + val fetchResult = + fetchSearchParameters(FetchSearchParametersData(teiTypeUid = teiTypeUid)) + assertTrue(fetchResult.isSuccess) + + // When - user enters fewer than min characters + val itemWithInsufficientChars = + fetchResult + .getOrNull()!! + .map { it.toTrackerInputUiState().copy(value = "a".repeat(min - 1)) } + viewModel.updateFromExternal(SearchParametersUiState(items = itemWithInsufficientChars)) + viewModel.onValidateSearch() + advanceUntilIdle() + + // Then - search proceeds unsuccessfully + val validationResult = viewModel.validationResult.first() + assertEquals(false, validationResult) + + // And an error message is shown + val uiState = viewModel.uiState.first() + assertNull(uiState.items.firstOrNull { it.error == null }) + assertEquals(errorMessage, uiState.items.first().error) + } + + @Test + fun `given a configured search operator, when user clicks field, then search operator message is shown`() = + runTest(testDispatcher) { + // Given + val teiTypeUid = "teiType123" + val searchParameters = + listOf( + buildSearchParameter( + uid = "field1", + minCharactersToSearch = 0, + searchOperator = SearchOperator.EQ, + ), + buildSearchParameter( + uid = "field2", + minCharactersToSearch = 0, + searchOperator = SearchOperator.LIKE, + ), + buildSearchParameter( + uid = "field3", + minCharactersToSearch = 0, + searchOperator = SearchOperator.SW, + ), + buildSearchParameter( + uid = "field4", + minCharactersToSearch = 0, + searchOperator = SearchOperator.EW, + ), + ) + + whenever(repository.getSearchParametersByTrackedEntityType(teiTypeUid)) + .thenReturn(searchParameters) + + val fetchResult = + fetchSearchParameters(FetchSearchParametersData(teiTypeUid = teiTypeUid)) + assertTrue(fetchResult.isSuccess) + + fetchResult + .getOrNull() + ?.forEach { searchParam -> + // Simulate the user clicking the field (focused = true) + val item = searchParam.toTrackerInputUiState().copy(focused = true) + val operator = searchParam.searchOperator + + // Mimic what the Composable layer does: resolve a label only when the + // operator has one (stringResource is not available in unit tests). + val operatorLabel = if (operator?.hasLabel() == true) "operator label" else null + val supportingText = item.supportingTextList(searchOperatorLabel = operatorLabel) + + if (operator?.hasLabel() == true) { + // EQ, SW, EW – a DEFAULT supporting text entry must be present + assertNotNull(supportingText) + assertTrue(supportingText.any { it.state == SupportingTextState.DEFAULT }) + } else { + // LIKE – no label, no error/warning/description → null + assertNull(supportingText) + } + } + } + + @Test + fun `given a configured search operator with error, when user clicks field, supporting text color in Red`() = + runTest(testDispatcher) { + // Given + val teiTypeUid = "teiType123" + val searchParameters = + listOf( + buildSearchParameter( + uid = "field1", + minCharactersToSearch = 0, + searchOperator = SearchOperator.EQ, + ), + ) + + whenever(repository.getSearchParametersByTrackedEntityType(teiTypeUid)) + .thenReturn(searchParameters) + + val fetchResult = + fetchSearchParameters(FetchSearchParametersData(teiTypeUid = teiTypeUid)) + assertTrue(fetchResult.isSuccess) + + val itemWithError = + fetchResult + .getOrNull()!! + .map { searchParam -> + searchParam.toTrackerInputUiState().copy(error = "any Error", focused = true) + } + viewModel.updateFromExternal(SearchParametersUiState(items = itemWithError)) + val uiState = viewModel.uiState.first() + val supportingListData = + uiState + .items + .first() + .supportingTextList(null) + ?.firstOrNull() + assertNotNull(supportingListData) + assertEquals(SupportingTextState.ERROR, supportingListData.state) + } + + @Test + fun `given a configured search operator with warning, when user clicks field, supporting text color in Orange`() = + runTest(testDispatcher) { + // Given + val teiTypeUid = "teiType123" + val searchParameters = + listOf( + buildSearchParameter( + uid = "field1", + minCharactersToSearch = 0, + searchOperator = SearchOperator.EQ, + ), + ) + + whenever(repository.getSearchParametersByTrackedEntityType(teiTypeUid)) + .thenReturn(searchParameters) + + val fetchResult = + fetchSearchParameters(FetchSearchParametersData(teiTypeUid = teiTypeUid)) + assertTrue(fetchResult.isSuccess) + + val itemWithError = + fetchResult + .getOrNull()!! + .map { searchParam -> + searchParam.toTrackerInputUiState().copy(warning = "any Warning", focused = true) + } + viewModel.updateFromExternal(SearchParametersUiState(items = itemWithError)) + val uiState = viewModel.uiState.first() + val supportingListData = + uiState.items + .first() + .supportingTextList(null) + ?.firstOrNull() + assertNotNull(supportingListData) + assertEquals(SupportingTextState.WARNING, supportingListData.state) + } + + private fun buildSearchParameter( + uid: String, + minCharactersToSearch: Int, + searchOperator: SearchOperator? = null, + ): SearchParameterModel = + SearchParameterModel( + uid = uid, + label = "First Name", + inputType = TrackerInputType.TEXT, + optionSet = null, + customIntentUid = null, + minCharactersToSearch = minCharactersToSearch, + searchOperator = searchOperator, + isUnique = false, + ) +} diff --git a/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/domain/FetchSearchParametersTest.kt b/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/domain/FetchSearchParametersTest.kt new file mode 100644 index 00000000000..9b97999b5c5 --- /dev/null +++ b/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/domain/FetchSearchParametersTest.kt @@ -0,0 +1,340 @@ +package org.dhis2.tracker.search.domain + +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.runTest +import org.dhis2.mobile.commons.coroutine.Dispatcher +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.tracker.input.model.TrackerInputType +import org.dhis2.tracker.search.data.SearchParametersRepository +import org.dhis2.tracker.search.model.FetchSearchParametersData +import org.dhis2.tracker.search.model.SearchOperator +import org.dhis2.tracker.search.model.SearchParameterModel +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever + +class FetchSearchParametersTest { + private lateinit var useCase: FetchSearchParameters + + private val repository: SearchParametersRepository = mock() + + @OptIn(ExperimentalCoroutinesApi::class) + private val testDispatcher = UnconfinedTestDispatcher() + private val dispatcher = + Dispatcher( + io = testDispatcher, + main = Dispatchers.Unconfined, + default = Dispatchers.Unconfined, + ) + + @Before + fun setup() { + useCase = + FetchSearchParameters( + dispatcher = dispatcher, + repository = repository, + ) + } + + @Test + fun `invoke should return sorted parameters for program`() = + runTest { + // Given + val programUid = "programUid123" + val teiTypeUid = "teiTypeUid123" + val input = FetchSearchParametersData(teiTypeUid = teiTypeUid, programUid = programUid) + + val parameters = + listOf( + createSearchParameter("param1", TrackerInputType.TEXT, isUnique = false), + createSearchParameter("param2", TrackerInputType.QR_CODE, isUnique = true), + createSearchParameter("param3", TrackerInputType.BAR_CODE, isUnique = false), + createSearchParameter( + "param4", + TrackerInputType.IMAGE, + isUnique = false, + ), + ) + + whenever(repository.getSearchParametersByProgram(programUid)) doReturn parameters + + // When + val result = useCase.invoke(input) + + // Then + assertTrue(result.isSuccess) + verify(repository).getSearchParametersByProgram(programUid) + + val sortedParameters = result.getOrNull() + assertEquals(3, sortedParameters?.size) + // QR_CODE unique should be first + assertEquals("param2", sortedParameters?.get(0)?.uid) + assertEquals(TrackerInputType.QR_CODE, sortedParameters?.get(0)?.inputType) + assertTrue(sortedParameters?.get(0)?.isUnique == true) + } + + @Test + fun `invoke should return sorted parameters for tracked entity type when no program`() = + runTest { + // Given + val teiTypeUid = "teiTypeUid123" + val input = FetchSearchParametersData(teiTypeUid = teiTypeUid, programUid = null) + + val parameters = + listOf( + createSearchParameter("param1", TrackerInputType.TEXT, isUnique = true), + createSearchParameter("param2", TrackerInputType.EMAIL, isUnique = false), + ) + + whenever(repository.getSearchParametersByTrackedEntityType(teiTypeUid)) doReturn parameters + + // When + val result = useCase.invoke(input) + + // Then + assertTrue(result.isSuccess) + verify(repository).getSearchParametersByTrackedEntityType(teiTypeUid) + + val sortedParameters = result.getOrNull() + assertEquals(2, sortedParameters?.size) + } + + @Test + fun `invoke should return failure when repository throws DomainError`() = + runTest { + // Given + val teiTypeUid = "teiTypeUid123" + val input = FetchSearchParametersData(teiTypeUid = teiTypeUid, programUid = null) + val domainError = DomainError.UnexpectedError("Test error") + + whenever(repository.getSearchParametersByTrackedEntityType(teiTypeUid)).thenAnswer { throw domainError } + + val result = useCase.invoke(input) + + // Then + assertTrue(result.isFailure) + assertEquals(domainError, result.exceptionOrNull()) + } + + @Test + fun `sortSearchParameters should prioritize QR and BarCode unique parameters`() { + // Given + val parameters = + listOf( + createSearchParameter("text1", TrackerInputType.TEXT, isUnique = false), + createSearchParameter("qr1", TrackerInputType.QR_CODE, isUnique = true), + createSearchParameter("text2", TrackerInputType.TEXT, isUnique = true), + createSearchParameter("bar1", TrackerInputType.BAR_CODE, isUnique = true), + createSearchParameter("qr2", TrackerInputType.QR_CODE, isUnique = false), + ) + + // When + val sorted = useCase.sortSearchParameters(parameters) + + // Then + assertEquals(5, sorted.size) + // First two should be QR_CODE or BAR_CODE with unique + assertTrue(useCase.isQrCodeOrBarCode(sorted[0].inputType) && sorted[0].isUnique) + assertTrue(useCase.isQrCodeOrBarCode(sorted[1].inputType) && sorted[1].isUnique) + // Third should be QR_CODE without unique + assertTrue(useCase.isQrCodeOrBarCode(sorted[2].inputType)) + // Fourth should be text with unique + assertEquals(TrackerInputType.TEXT, sorted[3].inputType) + assertTrue(sorted[3].isUnique) + // Last should be text without unique + assertEquals(TrackerInputType.TEXT, sorted[4].inputType) + assertFalse(sorted[4].isUnique) + } + + @Test + fun `sortSearchParameters should handle empty list`() { + // Given + val parameters = emptyList<SearchParameterModel>() + + // When + val sorted = useCase.sortSearchParameters(parameters) + + // Then + assertTrue(sorted.isEmpty()) + } + + @Test + fun `sortSearchParameters should handle list with only non-QR-BarCode parameters`() { + // Given + val parameters = + listOf( + createSearchParameter("text1", TrackerInputType.TEXT, isUnique = false), + createSearchParameter("email1", TrackerInputType.EMAIL, isUnique = true), + createSearchParameter("number1", TrackerInputType.NUMBER, isUnique = false), + ) + + // When + val sorted = useCase.sortSearchParameters(parameters) + + // Then + assertEquals(3, sorted.size) + // Unique should come before non-unique + assertTrue(sorted[0].isUnique) + assertEquals("email1", sorted[0].uid) + assertFalse(sorted[1].isUnique) + assertFalse(sorted[2].isUnique) + } + + @Test + fun `sortSearchParameters should handle list with only QR and BarCode parameters`() { + // Given + val parameters = + listOf( + createSearchParameter("qr1", TrackerInputType.QR_CODE, isUnique = false), + createSearchParameter("bar1", TrackerInputType.BAR_CODE, isUnique = true), + createSearchParameter("qr2", TrackerInputType.QR_CODE, isUnique = true), + createSearchParameter("bar2", TrackerInputType.BAR_CODE, isUnique = false), + ) + + // When + val sorted = useCase.sortSearchParameters(parameters) + + // Then + assertEquals(4, sorted.size) + // First two should be unique QR or BarCode + assertTrue(sorted[0].isUnique) + assertTrue(sorted[1].isUnique) + // Last two should be non-unique QR or BarCode + assertFalse(sorted[2].isUnique) + assertFalse(sorted[3].isUnique) + } + + @Test + fun `isQrCodeOrBarCode should return true for QR_CODE`() { + // When + val result = useCase.isQrCodeOrBarCode(TrackerInputType.QR_CODE) + + // Then + assertTrue(result) + } + + @Test + fun `isQrCodeOrBarCode should return true for BAR_CODE`() { + // When + val result = useCase.isQrCodeOrBarCode(TrackerInputType.BAR_CODE) + + // Then + assertTrue(result) + } + + @Test + fun `isQrCodeOrBarCode should return false for TEXT`() { + // When + val result = useCase.isQrCodeOrBarCode(TrackerInputType.TEXT) + + // Then + assertFalse(result) + } + + @Test + fun `isQrCodeOrBarCode should return false for null`() { + // When + val result = useCase.isQrCodeOrBarCode(null) + + // Then + assertFalse(result) + } + + @Test + fun `isQrCodeOrBarCode should return false for other input types`() { + // Test various other input types + assertFalse(useCase.isQrCodeOrBarCode(TrackerInputType.EMAIL)) + assertFalse(useCase.isQrCodeOrBarCode(TrackerInputType.NUMBER)) + assertFalse(useCase.isQrCodeOrBarCode(TrackerInputType.DATE)) + assertFalse(useCase.isQrCodeOrBarCode(TrackerInputType.DATE_TIME)) + assertFalse(useCase.isQrCodeOrBarCode(TrackerInputType.PHONE_NUMBER)) + assertFalse(useCase.isQrCodeOrBarCode(TrackerInputType.ORGANISATION_UNIT)) + } + + @Test + fun `sortSearchParameters should maintain stable order for equal priority items`() { + // Given - multiple items with same priority + val parameters = + listOf( + createSearchParameter("text1", TrackerInputType.TEXT, isUnique = false), + createSearchParameter("text2", TrackerInputType.TEXT, isUnique = false), + createSearchParameter("text3", TrackerInputType.TEXT, isUnique = false), + ) + + // When + val sorted = useCase.sortSearchParameters(parameters) + + // Then - order should be maintained + assertEquals(3, sorted.size) + assertEquals("text1", sorted[0].uid) + assertEquals("text2", sorted[1].uid) + assertEquals("text3", sorted[2].uid) + } + + @Test + fun `sortSearchParameters should handle complex mixed scenario`() { + // Given - a complex realistic scenario + val parameters = + listOf( + createSearchParameter("firstName", TrackerInputType.TEXT, isUnique = false), + createSearchParameter("nationalId", TrackerInputType.TEXT, isUnique = true), + createSearchParameter("qrCode", TrackerInputType.QR_CODE, isUnique = true), + createSearchParameter("email", TrackerInputType.EMAIL, isUnique = false), + createSearchParameter("barCode", TrackerInputType.BAR_CODE, isUnique = false), + createSearchParameter("uniqueCode", TrackerInputType.TEXT, isUnique = true), + createSearchParameter("scanQr", TrackerInputType.QR_CODE, isUnique = false), + ) + + // When + val sorted = useCase.sortSearchParameters(parameters) + + // Then - verify correct sorting priority + assertEquals(7, sorted.size) + + // Position 0: QR_CODE unique + assertEquals("qrCode", sorted[0].uid) + assertTrue(sorted[0].isUnique) + assertEquals(TrackerInputType.QR_CODE, sorted[0].inputType) + + // Position 1-2: BAR_CODE or QR_CODE non-unique + assertTrue(useCase.isQrCodeOrBarCode(sorted[1].inputType)) + assertTrue(useCase.isQrCodeOrBarCode(sorted[2].inputType)) + + // Position 3-4: Other unique parameters + assertTrue(sorted[3].isUnique) + assertTrue(sorted[4].isUnique) + assertFalse(useCase.isQrCodeOrBarCode(sorted[3].inputType)) + assertFalse(useCase.isQrCodeOrBarCode(sorted[4].inputType)) + + // Position 5-6: Non-unique, non-QR/BarCode + assertFalse(sorted[5].isUnique) + assertFalse(sorted[6].isUnique) + assertFalse(useCase.isQrCodeOrBarCode(sorted[5].inputType)) + assertFalse(useCase.isQrCodeOrBarCode(sorted[6].inputType)) + } + + // Helper function to create SearchParameterModel for testing + private fun createSearchParameter( + uid: String, + inputType: TrackerInputType, + isUnique: Boolean, + ): SearchParameterModel = + SearchParameterModel( + uid = uid, + label = "Label for $uid", + inputType = inputType, + optionSet = null, + customIntentUid = null, + minCharactersToSearch = null, + searchOperator = SearchOperator.LIKE, + isUnique = isUnique, + ) +} diff --git a/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntitiesTest.kt b/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntitiesTest.kt new file mode 100644 index 00000000000..1f36c0b3776 --- /dev/null +++ b/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/domain/SearchTrackedEntitiesTest.kt @@ -0,0 +1,556 @@ +package org.dhis2.tracker.search.domain + +import androidx.paging.PagingData +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.test.runTest +import org.dhis2.mobile.commons.customintents.CustomIntentRepository +import org.dhis2.mobile.commons.error.DomainError +import org.dhis2.mobile.commons.model.CustomIntentActionTypeModel +import org.dhis2.tracker.search.data.SearchTrackedEntityRepository +import org.dhis2.tracker.search.model.QueryData +import org.dhis2.tracker.search.model.SearchOperator +import org.dhis2.tracker.search.model.SearchTrackedEntitiesInput +import org.dhis2.tracker.search.model.SearchTrackedEntityAttribute +import org.dhis2.tracker.search.model.TrackedEntitySearchItemResult +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.mockito.kotlin.any +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.eq +import org.mockito.kotlin.mock +import org.mockito.kotlin.never +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever + +class SearchTrackedEntitiesTest { + private lateinit var useCase: SearchTrackedEntities + + private val repository: SearchTrackedEntityRepository = mock() + private val customIntentRepository: CustomIntentRepository = mock() + private val teType = "personType" + private val programUid = "programUid" + + @Before + fun setup() { + useCase = + SearchTrackedEntities( + repository = repository, + customIntentRepository = customIntentRepository, + teType = teType, + ) + } + + @Test + fun `invoke should successfully return flow when query has data`() = + runTest { + // Given + val queryDataList = + mutableListOf( + QueryData( + attributeId = "attr1", + values = listOf("value1"), + searchOperator = null, + ), + QueryData( + attributeId = "attr2", + values = listOf("value2"), + searchOperator = null, + ), + ) + val searchParams = + SearchTrackedEntitiesInput( + selectedProgram = programUid, + allowCache = true, + excludeValues = hashSetOf(), + hasStateFilters = false, + isOnline = true, + queryDataList = queryDataList, + ) + + val mockPagingData: PagingData<TrackedEntitySearchItemResult> = PagingData.empty() + val mockFlow: Flow<PagingData<TrackedEntitySearchItemResult>> = flowOf(mockPagingData) + + whenever(repository.isTETypeAttribute(any(), any())) doReturn true + whenever(repository.getTEAttribute(any())) doReturn + SearchTrackedEntityAttribute( + isUnique = false, + isOptionSet = false, + ) + whenever( + customIntentRepository.attributeHasCustomIntentAndReturnsAListOfValues( + any(), + eq(CustomIntentActionTypeModel.SEARCH), + ), + ) doReturn false + whenever(repository.fetchResults(any(), any(), any(), any())) doReturn mockFlow + + // When + val result = useCase.invoke(searchParams) + + // Then + assertTrue(result.isSuccess) + verify(repository).addFiltersToQuery(programUid, teType) + verify(repository).addToQuery( + dataId = "attr1", + dataValues = listOf("value1"), + searchOperator = null, + ) + verify(repository).addToQuery( + dataId = "attr2", + dataValues = listOf("value2"), + searchOperator = null, + ) + verify(repository).fetchResults( + isOnline = eq(true), + hasStateFilters = eq(false), + allowCache = eq(true), + selectedProgram = eq(programUid), + ) + } + + @Test + fun `invoke should successfully return flow when query is null`() = + runTest { + // Given + val searchParams = + SearchTrackedEntitiesInput( + selectedProgram = programUid, + allowCache = true, + excludeValues = hashSetOf(), + hasStateFilters = false, + isOnline = false, + queryDataList = null, + ) + + val mockPagingData: PagingData<TrackedEntitySearchItemResult> = PagingData.empty() + val mockFlow: Flow<PagingData<TrackedEntitySearchItemResult>> = flowOf(mockPagingData) + + whenever(repository.fetchResults(any(), any(), any(), any())) doReturn mockFlow + + // When + val result = useCase.invoke(searchParams) + + // Then + assertTrue(result.isSuccess) + verify(repository).addFiltersToQuery("programUid", teType) + verify(repository, never()).addToQuery(any(), any(), any()) + verify(repository).fetchResults( + isOnline = false, + hasStateFilters = false, + allowCache = true, + selectedProgram = programUid, + ) + } + + @Test + fun `invoke should exclude values when no program is selected`() = + runTest { + // Given + val excludedValues = hashSetOf("excludedUid1", "excludedUid2") + val searchParams = + SearchTrackedEntitiesInput( + selectedProgram = null, + allowCache = true, + excludeValues = excludedValues, + hasStateFilters = false, + isOnline = false, + queryDataList = null, + ) + + val mockPagingData: PagingData<TrackedEntitySearchItemResult> = PagingData.empty() + val mockFlow: Flow<PagingData<TrackedEntitySearchItemResult>> = flowOf(mockPagingData) + + whenever(repository.fetchResults(any(), any(), any(), any())) doReturn mockFlow + + // When + val result = useCase.invoke(searchParams) + + // Then + assertTrue(result.isSuccess) + verify(repository).excludeValuesFromQuery(excludedValues.toList()) + } + + @Test + fun `invoke should not exclude values when program is selected`() = + runTest { + // Given + val excludedValues = hashSetOf("excludedUid1", "excludedUid2") + val searchParams = + SearchTrackedEntitiesInput( + selectedProgram = programUid, + allowCache = true, + excludeValues = excludedValues, + hasStateFilters = false, + isOnline = false, + queryDataList = null, + ) + + val mockPagingData: PagingData<TrackedEntitySearchItemResult> = PagingData.empty() + val mockFlow: Flow<PagingData<TrackedEntitySearchItemResult>> = flowOf(mockPagingData) + + whenever(repository.fetchResults(any(), any(), any(), any())) doReturn mockFlow + + // When + val result = useCase.invoke(searchParams) + + // Then + assertTrue(result.isSuccess) + verify(repository, never()).excludeValuesFromQuery(any()) + } + + @Test + fun `invoke should add query for unique attributes`() = + runTest { + // Given + val queryData = + mutableListOf( + QueryData( + attributeId = "uniqueAttr", + values = listOf("exactValue"), + searchOperator = SearchOperator.EQ, + ), + ) + val searchParams = + SearchTrackedEntitiesInput( + selectedProgram = programUid, + allowCache = true, + excludeValues = hashSetOf(), + hasStateFilters = false, + isOnline = true, + queryDataList = queryData, + ) + + val mockPagingData: PagingData<TrackedEntitySearchItemResult> = PagingData.empty() + val mockFlow: Flow<PagingData<TrackedEntitySearchItemResult>> = flowOf(mockPagingData) + + whenever(repository.isTETypeAttribute(eq(teType), any())) doReturn true + whenever(repository.getTEAttribute("uniqueAttr")) doReturn + SearchTrackedEntityAttribute( + isUnique = true, + isOptionSet = false, + ) + whenever( + customIntentRepository.attributeHasCustomIntentAndReturnsAListOfValues( + any(), + eq(CustomIntentActionTypeModel.SEARCH), + ), + ) doReturn false + whenever(repository.fetchResults(any(), any(), any(), any())) doReturn mockFlow + + // When + val result = useCase.invoke(searchParams) + + // Then + assertTrue(result.isSuccess) + verify(repository).addToQuery( + dataId = "uniqueAttr", + dataValues = listOf("exactValue"), + searchOperator = SearchOperator.EQ, + ) + } + + @Test + fun `invoke should add query for option set attributes`() = + runTest { + // Given + val queryData = + mutableListOf( + QueryData( + attributeId = "optionSetAttr", + values = listOf("optionValue"), + searchOperator = SearchOperator.EQ, + ), + ) + val searchParams = + SearchTrackedEntitiesInput( + selectedProgram = programUid, + allowCache = true, + excludeValues = hashSetOf(), + hasStateFilters = false, + isOnline = true, + queryDataList = queryData, + ) + + val mockPagingData: PagingData<TrackedEntitySearchItemResult> = PagingData.empty() + val mockFlow: Flow<PagingData<TrackedEntitySearchItemResult>> = flowOf(mockPagingData) + + whenever(repository.isTETypeAttribute(eq(teType), any())) doReturn true + whenever(repository.getTEAttribute("optionSetAttr")) doReturn + SearchTrackedEntityAttribute( + isUnique = false, + isOptionSet = true, + ) + whenever( + customIntentRepository.attributeHasCustomIntentAndReturnsAListOfValues( + any(), + eq(CustomIntentActionTypeModel.SEARCH), + ), + ) doReturn false + whenever(repository.fetchResults(any(), any(), any(), any())) doReturn mockFlow + + // When + val result = useCase.invoke(searchParams) + + // Then + assertTrue(result.isSuccess) + verify(repository).addToQuery( + dataId = "optionSetAttr", + dataValues = listOf("optionValue"), + searchOperator = SearchOperator.EQ, + ) + } + + @Test + fun `invoke should join multiple values when custom intent does not return list`() = + runTest { + // Given + val queryData = + mutableListOf( + QueryData( + attributeId = "attr1", + values = listOf("value1", "value2", "value3"), + searchOperator = null, + ), + ) + val searchParams = + SearchTrackedEntitiesInput( + selectedProgram = programUid, + allowCache = true, + excludeValues = hashSetOf(), + hasStateFilters = false, + isOnline = true, + queryDataList = queryData, + ) + + val mockPagingData: PagingData<TrackedEntitySearchItemResult> = PagingData.empty() + val mockFlow: Flow<PagingData<TrackedEntitySearchItemResult>> = flowOf(mockPagingData) + + whenever(repository.isTETypeAttribute(eq(teType), any())) doReturn true + whenever(repository.getTEAttribute(any())) doReturn + SearchTrackedEntityAttribute( + isUnique = false, + isOptionSet = false, + ) + whenever( + customIntentRepository.attributeHasCustomIntentAndReturnsAListOfValues( + "attr1", + CustomIntentActionTypeModel.SEARCH, + ), + ) doReturn false + whenever(repository.fetchResults(any(), any(), any(), any())) doReturn mockFlow + + // When + val result = useCase.invoke(searchParams) + + // Then + assertTrue(result.isSuccess) + verify(repository).addToQuery( + dataId = "attr1", + dataValues = listOf("value1,value2,value3"), + searchOperator = null, + ) + } + + @Test + fun `invoke should keep multiple values when custom intent returns list`() = + runTest { + // Given + val queryData = + mutableListOf( + QueryData( + attributeId = "attr1", + values = listOf("value1", "value2", "value3"), + searchOperator = null, + ), + ) + val searchParams = + SearchTrackedEntitiesInput( + selectedProgram = programUid, + allowCache = true, + excludeValues = hashSetOf(), + hasStateFilters = false, + isOnline = true, + queryDataList = queryData, + ) + + val mockPagingData: PagingData<TrackedEntitySearchItemResult> = PagingData.empty() + val mockFlow: Flow<PagingData<TrackedEntitySearchItemResult>> = flowOf(mockPagingData) + + whenever(repository.isTETypeAttribute(eq(teType), any())) doReturn true + whenever(repository.getTEAttribute(any())) doReturn + SearchTrackedEntityAttribute( + isUnique = false, + isOptionSet = false, + ) + whenever( + customIntentRepository.attributeHasCustomIntentAndReturnsAListOfValues( + "attr1", + CustomIntentActionTypeModel.SEARCH, + ), + ) doReturn true + whenever(repository.fetchResults(any(), any(), any(), any())) doReturn mockFlow + + // When + val result = useCase.invoke(searchParams) + + // Then + assertTrue(result.isSuccess) + verify(repository).addToQuery( + dataId = "attr1", + dataValues = listOf("value1", "value2", "value3"), + searchOperator = null, + ) + } + + @Test + fun `invoke should skip attributes not belonging to teType when no program selected`() = + runTest { + // Given + val queryData = + mutableListOf( + QueryData( + attributeId = "attr1", + values = listOf("value1"), + searchOperator = SearchOperator.EQ, + ), + QueryData( + attributeId = "attr2", + values = listOf("value2"), + searchOperator = SearchOperator.LIKE, + ), + ) + val searchParams = + SearchTrackedEntitiesInput( + selectedProgram = null, + allowCache = true, + excludeValues = hashSetOf(), + hasStateFilters = false, + isOnline = false, + queryDataList = queryData, + ) + + val mockPagingData: PagingData<TrackedEntitySearchItemResult> = PagingData.empty() + val mockFlow: Flow<PagingData<TrackedEntitySearchItemResult>> = flowOf(mockPagingData) + + whenever(repository.isTETypeAttribute(teType, "attr1")) doReturn true + whenever(repository.isTETypeAttribute(teType, "attr2")) doReturn false + whenever(repository.getTEAttribute("attr1")) doReturn + SearchTrackedEntityAttribute( + isUnique = false, + isOptionSet = false, + ) + whenever( + customIntentRepository.attributeHasCustomIntentAndReturnsAListOfValues( + any(), + eq(CustomIntentActionTypeModel.SEARCH), + ), + ) doReturn false + whenever(repository.fetchResults(any(), any(), any(), any())) doReturn mockFlow + + // When + val result = useCase.invoke(searchParams) + + // Then + assertTrue(result.isSuccess) + verify(repository).addToQuery( + dataId = "attr1", + dataValues = listOf("value1"), + SearchOperator.EQ, + ) + verify(repository, never()).getTEAttribute("attr2") + } + + @Test + fun `invoke should return failure when domain error occurs`() = + runTest { + // Given + val searchParams = + SearchTrackedEntitiesInput( + selectedProgram = programUid, + allowCache = true, + excludeValues = hashSetOf(), + hasStateFilters = false, + isOnline = true, + queryDataList = null, + ) + + val domainError = DomainError.UnexpectedError("Test error") + + whenever(repository.fetchResults(any(), any(), any(), any())).thenAnswer { throw domainError } + + // When + val result = useCase.invoke(searchParams) + + // Then + assertTrue(result.isFailure) + assertTrue(result.exceptionOrNull() is DomainError.UnexpectedError) + assertEquals("Test error", (result.exceptionOrNull() as DomainError.UnexpectedError).message) + } + + @Test + fun `invoke should handle online search with state filters`() = + runTest { + // Given + val searchParams = + SearchTrackedEntitiesInput( + selectedProgram = programUid, + allowCache = false, + excludeValues = hashSetOf(), + hasStateFilters = true, + isOnline = true, + queryDataList = null, + ) + + val mockPagingData: PagingData<TrackedEntitySearchItemResult> = PagingData.empty() + val mockFlow: Flow<PagingData<TrackedEntitySearchItemResult>> = flowOf(mockPagingData) + + whenever(repository.fetchResults(any(), any(), any(), any())) doReturn mockFlow + + // When + val result = useCase.invoke(searchParams) + + // Then + assertTrue(result.isSuccess) + verify(repository).fetchResults( + isOnline = true, + hasStateFilters = true, + allowCache = false, + selectedProgram = programUid, + ) + } + + @Test + fun `invoke should handle offline search`() = + runTest { + // Given + val searchParams = + SearchTrackedEntitiesInput( + selectedProgram = programUid, + allowCache = true, + excludeValues = hashSetOf(), + hasStateFilters = false, + isOnline = false, + queryDataList = null, + ) + + val mockPagingData: PagingData<TrackedEntitySearchItemResult> = PagingData.empty() + val mockFlow: Flow<PagingData<TrackedEntitySearchItemResult>> = flowOf(mockPagingData) + + whenever(repository.fetchResults(any(), any(), any(), any())) doReturn mockFlow + + // When + val result = useCase.invoke(searchParams) + + // Then + assertTrue(result.isSuccess) + verify(repository).fetchResults( + isOnline = false, + hasStateFilters = false, + allowCache = true, + selectedProgram = programUid, + ) + } +} diff --git a/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/ui/viewmodel/SearchParametersViewModelTest.kt b/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/ui/viewmodel/SearchParametersViewModelTest.kt new file mode 100644 index 00000000000..f334b522772 --- /dev/null +++ b/tracker/src/commonTest/kotlin/org/dhis2/tracker/search/ui/viewmodel/SearchParametersViewModelTest.kt @@ -0,0 +1,165 @@ +package org.dhis2.tracker.search.ui.viewmodel + +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.resetMain +import kotlinx.coroutines.test.runTest +import kotlinx.coroutines.test.setMain +import org.dhis2.mobile.commons.resources.StringResourceProvider +import org.dhis2.tracker.input.ui.state.TrackerInputUiState +import org.dhis2.tracker.search.ui.state.SearchParametersUiState +import org.junit.Assert +import org.mockito.kotlin.any +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever +import kotlin.test.AfterTest +import kotlin.test.BeforeTest +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNotEquals +import kotlin.test.assertNull + +@ExperimentalCoroutinesApi +class SearchParametersViewModelTest { + private val testingDispatcher = StandardTestDispatcher() + private val resourceProvider = mock<StringResourceProvider>() + private lateinit var viewModel: SearchParametersViewModel + + @BeforeTest + fun setUp() { + Dispatchers.setMain(testingDispatcher) + viewModel = SearchParametersViewModel(resourceProvider) + } + + @AfterTest + fun tearDown() { + Dispatchers.resetMain() + } + + @Test + fun `onValidateSearch should set validationResult to true when all items are valid`() = + runTest(testingDispatcher) { + // Given + val validItems = + listOf( + provideItem( + uid = "test1", + label = "Test 1", + value = "validvalue", + minCharactersToSearch = 3, + ), + provideItem( + uid = "test2", + label = "Test 2", + value = "another", + minCharactersToSearch = null, + ), + provideItem( + uid = "test3", + label = "Test 3", + value = null, + minCharactersToSearch = 3, + ), + ) + + viewModel.updateFromExternal(SearchParametersUiState(items = validItems)) + + // When + viewModel.onValidateSearch() + advanceUntilIdle() + + // Then + val validationResult = viewModel.validationResult.first() + assertEquals(true, validationResult) + } + + @Test + fun `onValidateSearch should set validationResult to false when items have insufficient characters`() = + runTest(testingDispatcher) { + // Given + val invalidItems = + listOf( + provideItem( + uid = "test1", + value = "ab", + minCharactersToSearch = 3, + ), + provideItem( + uid = "test2", + label = "Test 2", + value = "abcde", + minCharactersToSearch = 5, + ), + provideItem( + uid = "test3", + label = "Test 3", + value = "a", + minCharactersToSearch = 2, + ), + ) + whenever( + resourceProvider.provideString(any(), any()), + ).thenReturn("Minimum characters required") + + viewModel.updateFromExternal(SearchParametersUiState(items = invalidItems)) + + // When + viewModel.onValidateSearch() + advanceUntilIdle() + + // Then + val validationResult = viewModel.validationResult.first() + assertNotEquals(true, validationResult) + + val uiState = viewModel.uiState.first() // Also check that error is set on the item + assertEquals(3, uiState.items.size) + Assert.assertTrue(uiState.items[0].error?.isNotEmpty() == true) // Error should be set + } + + @Test + fun `resetValidationResult should set validationResult to null`() = + runTest(testingDispatcher) { + // Given + viewModel.updateFromExternal(SearchParametersUiState(items = listOf())) + viewModel.onValidateSearch() + advanceUntilIdle() + + // When + viewModel.resetValidationResult() + + // Then + val validationResult = viewModel.validationResult.first() + assertNull(validationResult) + } + + private fun provideItem( + uid: String = "test1", + label: String = "Test 1", + value: String?, + minCharactersToSearch: Int?, + ): TrackerInputUiState = + TrackerInputUiState( + uid = uid, + label = label, + value = value, + focused = false, + valueType = mock(), + optionSet = null, + error = null, + warning = null, + description = null, + mandatory = false, + editable = true, + legend = null, + orientation = mock(), + optionSetConfiguration = null, + customIntentUid = null, + displayName = null, + orgUnitSelectorScope = null, + searchOperator = null, + minCharactersToSearch = minCharactersToSearch, + ) +} diff --git a/tracker/src/desktopMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.desktop.kt b/tracker/src/desktopMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.desktop.kt new file mode 100644 index 00000000000..94b83b71c1d --- /dev/null +++ b/tracker/src/desktopMain/kotlin/org/dhis2/tracker/search/di/TrackerSearchModule.desktop.kt @@ -0,0 +1,13 @@ +package org.dhis2.tracker.search.di + +import org.koin.core.module.Module +import org.koin.dsl.module + +/** + * Desktop-specific implementation of the tracker search repository module. + * Currently empty as desktop support is not yet implemented for search. + */ +internal actual val trackerSearchRepositoryModule: Module = + module { + // Desktop implementation placeholder + } diff --git a/ui-components/.gitignore b/ui-components/.gitignore deleted file mode 100644 index 42afabfd2ab..00000000000 --- a/ui-components/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/ui-components/build.gradle.kts b/ui-components/build.gradle.kts deleted file mode 100644 index 10ce27ba8a6..00000000000 --- a/ui-components/build.gradle.kts +++ /dev/null @@ -1,60 +0,0 @@ -import org.jetbrains.kotlin.gradle.dsl.JvmTarget - -plugins { - id("com.android.library") - kotlin("android") - id("kotlin-parcelize") - alias(libs.plugins.kotlin.serialization) - alias(libs.plugins.kotlin.compose.compiler) -} -apply(from = "${project.rootDir}/jacoco/jacoco.gradle.kts") - -android { - compileSdk = libs.versions.sdk.get().toInt() - namespace = "org.dhis2.ui" - - defaultConfig { - minSdk = libs.versions.minSdk.get().toInt() - testOptions.targetSdk = libs.versions.sdk.get().toInt() - - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") - vectorDrawables.useSupportLibrary = true - } - - buildTypes { - getByName("debug") { - } - getByName("release") { - isMinifyEnabled = false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" - ) - } - } - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - flavorDimensions += listOf("default") - - buildFeatures { - compose = true - } -} - -kotlin { - compilerOptions { - jvmTarget.set(JvmTarget.JVM_17) - } -} - -dependencies { - - implementation(libs.bundles.uicomponents.implementation) - api(libs.bundles.uicomponents.api) - debugApi(libs.bundles.uicomponents.debugapi) - androidTestImplementation(libs.bundles.uicomponents.androidtest) -} diff --git a/ui-components/consumer-rules.pro b/ui-components/consumer-rules.pro deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/ui-components/proguard-rules.pro b/ui-components/proguard-rules.pro deleted file mode 100644 index 466966b2539..00000000000 --- a/ui-components/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle.kts. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. --keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. --renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/ui-components/src/main/res/drawable/ic_add_image.xml b/ui-components/src/main/res/drawable/ic_add_image.xml deleted file mode 100644 index 4383e0f436a..00000000000 --- a/ui-components/src/main/res/drawable/ic_add_image.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="21dp" - android:height="22dp" - android:viewportWidth="21" - android:viewportHeight="22"> - <path - android:pathData="M16,19.5H2V5.5H11V3.5H2C0.9,3.5 0,4.4 0,5.5V19.5C0,20.6 0.9,21.5 2,21.5H16C17.1,21.5 18,20.6 18,19.5V10.5H16V19.5ZM8.21,16.33L6.25,13.97L3.5,17.5H14.5L10.96,12.79L8.21,16.33ZM18,3.5V0.5H16V3.5H13C13.01,3.51 13,5.5 13,5.5H16V8.49C16.01,8.5 18,8.49 18,8.49V5.5H21V3.5H18Z" - android:fillColor="#2C98F0"/> -</vector> diff --git a/ui-components/src/main/res/font/rubik_bold.ttf b/ui-components/src/main/res/font/rubik_bold.ttf deleted file mode 100644 index 50eada5c69aa1b945a74fe4cbae55739fa7ff6ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143356 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 Sa&a@hif=q9LVF~>W&Hz^ppggw diff --git a/ui-components/src/main/res/font/rubik_light.ttf b/ui-components/src/main/res/font/rubik_light.ttf deleted file mode 100644 index 5ffda61826bfbf22dab23ba2dfbce9cd2ac8969f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 136816 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 diff --git a/ui-components/src/main/res/font/rubik_medium.ttf b/ui-components/src/main/res/font/rubik_medium.ttf deleted file mode 100644 index 24519e56fd46c7080d8453c067b13601a2822494..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135760 zcmdRX2bf&Nm2Oqtj`w!o2|YbIcAT7gdh$rE8EF(|l#$Q~Nh2W*3Mc_WAc7D=*d&87 z#+bF&3EPW}18ai=W{rskoD;!doLKMkI&QGnYg?`NpQ?L1%#390eeZqW<Fhs0)z!C8 zojP^$ImI|*tO)-&SmDyeOU5Jbh#hDAZPge(vUJVr_4gJZ?8p1J;_ZT^>o<%h{LAZ@ zaD9_8<HYLq9o?6$dh$WWFFcI-+jkz=akzD?bR*v5b9epDqetpTKTz;5j9>8-K7ak9 z!@Cb0-E}>lzxTI{`Ac{2xQxD6i07B!uV?rEV;Avln;&J2S2MnP-JY2pyS$G-@dV== zkKps(Js5DcJ0HgLC-FYA=fIIG`va?Q#^)acJn!3oXy=ao->hh4e9c=KbN=MOjw=s4 zrcA)IhJL61;En?`m46)QW&Fzf@f(K^AG++w%YXhtE#p^}GgkJe!<Wt+ZoXJQ26#P~ z|0om8WK7&I9%W^$l69rpE4hOiLU18g0AYeV#6_4mIN{U;=R+J&Rg`0HusE4?dCOY5 zW68ciZz9oM7APxmg~OqEyuppXfrM7+6Tj6f4_4~G6@JfD(9@oNsofKt`tnaM@p--C z#)^v5S9`s_z_DWi&Unw6GYS&zdKSVDGp31W#3{xy<Hs}O&x>fzcy|7?VoA>UOlJO* zVo}a`cK*`>M3H&^`po>Vi9Y;3Fmom%G1JOA*ifp!gS$jUp;O}wsBr<iE_M-fxVh8e z+{uI(oY1(1q4qY`%9?wU$?kHGx1z-nOZN2k#VpK(W?{_b3YL@tfu+G9A&@6D(Yi8J z>ve<`zP!0;tgQ)!>-@TD>P6|JKe^=9^-E$&ujbo&ERc&+9;>O1nR-Mw`KvjYy*0DK zuke4%S^2@t_*caOxpF7ae;a6`ll8C#sUd+i@)f{{<`LQq^Dvjg<C^hexooQ>4(4z; zw*nK+A?IXIq9`0lHbfhu{kpe?2&AX4w-+?hU@fsBIL|9!B^h=p$|(vL`9$rJ_v_`N zz%WfC{S=SMzu)JJ<=+Y2d||-lExF)FANTvbnrGvmcz1<qj2Zq<n#MxI|FGX!Z1_$6 z$nIjIt;N`5xgtqhpm(Az%}syVDs1!#th9vHuoxRlrTp9}_zE`{%;^x$8K!C08a>?M z;9Fg4kLzkngN#MPwXwQbb!D)ov<6QoPI|pTT5wU1T5XBTU0O=J+Q7SelRdF;I2f>B zY%%=?4_$sF5o#Vheo6X!yfD$%+w-mu^$ZRrK4j|RR>Ryq)w8@Xu(5CJrTp)^o15Do zN`HNzwRPZmkRD5(`MtPNJj2@AaB85LYqURHIB;H%GlwP|+BG0aHjOooPGAkrX%}{9 z%t=h8owfDEBE5}nkY;HtuJ#A?S6U_sFodC4IOGOdmX#*Dd$D;$oo-WvzkQFBbLTs6 zo;tN0M|y|P=O|b)atBc2x?^~vz~S@l@cOw}erig8%gL&d1=T0+7}+-}JceN|NW8DA zzrW^vi3O(N^N#Ktp>s!TI3@R_NbQL@A*piq_;YlA<(eaM&FgvD#DnIVO{wB>?)Fr1 zuX}<EU2uarR#eRy<c<|nYI-kox;!qY=Q#7YT^{!}OxLi@y4Vdm_Tk&cPUdnsra{cW zncMB1W?t`@cd}~Y!Aktt$n0-}ISR&)XP&}19>UM|kkr`h?`whyjUC6z@E8DtcYx)b zPnnuZRRI<2*}7GeE0!-_G%}P-bhO4I4UvYJ-&-y@O<!LxwhJ3a1Q&7<N2V?Ai~Utw z?WTtiJ@Eb>N0HO%s0|bbgN1sH)8i_3xJnLP`36ZLXq1Orx?5kZHl2<FXHlTQEcUtr z*a%;TdCO&gfl6B39kEzqK3aL!;^~T34zmzbH1rhz9uOqtxxN|ax`@@X)>KpW7&{@^ z_*REH#(`qSYO0EB1GSh~0D+b{zKQw(mhX0fBlpo6NcPaF2p7?@{ZAfu3E{Zo?*IPJ z^(zGaTXo)5>cpmhJ6IAJyzRy#D>e=n6b`OinQjFv1pw$BfTfxx=(OUzxH)rhwwpPf zVyhG#UN9GJtA}gakTzLc!&rA`OH*U4CQ+Nf*D4dyu&#t{QJ6R-_)CJA4ECsOJ}`r{ zdGa&|_nJK<E_zJ;cX!`|Rr9;v@rU27Uq-Jc)?a%_$9fK#Ixoc(h>Ie_y!FQFuI}nv z--I<(ceGcppZtvc=n>il;+8kd6I%u>YvMUECb4a=u!?oRp%vCZ`ReLuZj48(yKA~x z6{|Sw3g_R4`4`Be9`L8P-i-w=r+t~k0!a?21sVy%PYX={wx+AICbLOcpdTNZkATC_ z`cl}bFzZOs&S?&kcllzD7%9XY)*WUIB<7ODNOQQpWcc&RILY!qFD2OLc(?rfb-qUa zU8v}1jtsMKo{~7Hqfc7V4#_1YtQu)WYW#WddwY*^=RYSx^Nv58H%{7;dd`!gHfKJa zEH(ZV|4hy}X;EtYY5rQyIB8L8{A+?VUf>j36yda=4W{}aaUD+0F~i(m?s0oaZ{k~l z;K2!;1qLC-*bpP!_Osp|sYE0ry0=;}wg!;CEn3fp<nU~D>KiM~^b17gd|u2K*3^gU z{D$9e6hWDa)}3V^Y>mqBTU64G71gq)RBSGlIB}MT9JGj9R!#Kb0%tx4eUR2CN#oO! z6u!h;<=^j`#%3FuWxDyOspH@O(oMo?FC^z}kp8`_Kb3_1fXd=L4jsp#If2_;!S9-O zbC+w(Md0)@=va-BWTVGhIZN^r43^-B5=N3=N|0oR+bDkG3V-ij@O{U-Z`yL>V&T*G z>bk=mA0A%~+d!-tU%K%s;x)fD%oR6Xpx=I7O)6D$&07|3ZS(p(-e}Ln>YAa!+O;bu zCxPZZnz?WN)uTkSay^okV}Mf=&x<xmQ)--OO^rV*R$AjVa{c!B*ZI$K<`d1T`A_j5 z<9X^_lRg_}@l*uw9U6DckoG?~;c^PebTJR-Igm^Qa?dmI(V_;6)dq_cnvxi?H*Jey z@`$N#B?{WAo9S0gV~f3O=`)<uR-V3`*2<0a?`Zb~!6rTrX!=0wsnm$i>(-pQLomb1 zcKe}+K$8(O9&B62r0DO*i5Ti18XUlvdJ_R~OZvxze$6aKKMOWGDw)lb@`84-A@eHX zPBsL^$G{weS-^F(kRUDe8`)(AKahS^O!<u{7FUv82iEgTQ;!<{6|}+?>fg^^c%jXK zZj&6VMegRa;(U7-*lSpK0jo%rVq|avWTR|KjQNvVj`$_KD;%5pc0%rUVD&b7ar%hD z;wqeh?eb|+wrb+Ra;Rt}u+8vPVk*-v@EQ5=s#Lie2I2A{`p^MB<8X{QCZ|#*g@v%r zqlJ;W>aw5&!aWZVrAp*NrOKs*EkKn5?FGDAyu>u74fAa`<-)0(`lMm5Tgl%B%o*ve zr`}}Yhp(6TX_xqUhCe2$*9%e&$y1=lpXb|Y{LC*ft~k0Hf0mz+<G;fALdd5ORC+o! zPeO~dp3h#>=oF~&r#Lt<p7R6DdM)R7pXS4I{J-#=q(+=u&Hoy|6f-$%ITL0-2Zp1p zF%<>&7}<aht_f`?J_nxd&5N>dPjc7^4F#BjsS8yp4^vP>^K9HJSBC4nPB)<sXz|sB z!*xD-RrrJTOX5kdQ+QqCAkiA_b-cDFE^S$?;12*Rp^?3+ApI&oCLyf_Ei3_~4Xix{ znzIyhA+)Vf{3M``X=2ORbIfmG^~rEpvgJ}}#Zr&57+w*{7&;_mqJjWj;h$YS0Y<l@ z%;i~<TrigYxI6-1G5m|KJx}l6wbbjc=;>a&oTp4<DO3&Y@%k$lf}=@@B(4YWi<)>= z^h!uq0lEVcr?FJHK3Htv-18N{E$|7uO^6{uAOfR9(IjEi5*$*YgJw^EOWd4G-JDpq zmSIJk4fBTu<rjJU&h&42#NqSo4Hom?<VcZ!{kLN98fW_3>4)7eudj%6Pdcreq+^_^ zkx+%ekqFwa^Dk$hB}rGp>QYeI)SioNFq<qmVf2QR4sU5Lm_-@$o=(U%C|x78x#^Xe zlkr_C%PifdTViQM{_ZpU5u1WVH{@H0VVt|g*M%wmz`Xy+`RBwR9!#`IDhJF2o17zI zekkX=);PZV5=*CFQr}I#MBfEv`>+dx_--p3NcD!wOpQEUAa0PjAd3tPL%T+)C7R~g zmX+vm>oi6Oqn1QZ!e622rLWKC3_)prk@D?!XO+NRX0ylP@##M3;lRk99;e69eedE6 zh@8@skeP*=;qCVs&Jqqa)o=W%U(@CLk!K~c2x_7o;-4|1@`g$st_c9Gkp?1;D-wdw z!rqz~i-3}Il@D^#!4D&4nk~sR68t$tv^HQo{<sm4TIojJywxae4*GBP8yl5S3#9*! zUlbsbMtU{>MEVb<rJ$m9V95%;qkylDMN$9{YREj4UB_yY$$ZK#<2Le?5R3B+O|J^* zycWL>0@7EP=;@zkASp^O<_{5Fojz)qMf_9g4T_S1qob0d7AuMpw`Qm!cl<dzW)|fW z%ps=cf1SUsDE~~Ipz$UK>#^ErfaHN|21;O#T}1ym?5~N%lgU1bX}J27i0w@#)haBV z6}Zn|CBFen3bcmP|BNM(ewtnCr3bw~_8ZXl+MD7)F&3tfpI!3O9s8`)b5wFe1^ZV8 z{GXr((wc6-=?SnnL7&wJov<(YG}*pme6j>Wp(I`stF6Yw;zqK4bG<>fUD=y4enT0} z@H_9sGaT=}@zmdg+#L7bG`0$yOIx#ObPef&tH<<PZmQ`YsJZd>+ix7Kt{S}QmLqG{ z4+qNz*R5T<uBInZyKXI@mr%-`0$xGE&xjl4j;L|6Yt;Dj0{YTC^Pd&tIpZV+)%+*L zXwEq4j%xgA%RZX@yI&Uf=FBH4sOEo7K<UEiGJwrzfz3F)p#yAbYH@F}v!T>4+>&K5 z=-v#vH++NBU>I;539)2?T%j7Y3{4x;CcC;|><)DGw>IM$u}EvgBL!tVhk3-wMT&D- zmcu;Cr1v2JuLB{ztQ7kYcS0@y{ab@EkHZW05rM<+?@#T&vm&nEH{ks{Z+@$Ha%gll zy!9`wh8~oD$+L2SKC|1D?8N8v4^|A`c>9Ih3h;ga?8Y}*JABhE{FOziwd?xJe!q6z zX!Vh0O9<a`-Ex1{S^M+096XT>R(SfVSg5ED$hr<ECJa20rDs{s@OIc<Vy|0}pV*@e z=tu<djm}6%9J0<bq;+XX$K!p)4H+4d<)PVEeNb&P#Q2pvpqhAijQ^4NX8J`Qkbi&0 zyQH@G-z&$?TSa8KV*QP`tz5+mVPoqi`H6Lt{KUF>gnxJCx|+7O+KpI{@*G``bp+se z=}fg@6Co5dK7%c`Ji+8bf|w5C0993#R0rt*6-8h+WW*prPaIbMlkxpZBhPp2mRpY9 zWg6SLdvIiE_^s+_UwUBwp?`&>ytFUbGx+@+D9Tv_>q&KiyTS$UoN<Hy2zVuCfO6O_ zATaogDk~VPudQgPY+&WAG!jk{f#vEAQfaWkiDo^}roIER=&D<9x%y5C(7*x(kkqqh zE;(@E&;i5$I|UM8N}hR4oWx0}M^pfEvm6dgxSfFwhCmH*7I^?jx0a6QF*e!I0Bx(M zA<@!=FV!|i2t^JALP%_89nXr@xba8gD>e_u5u(T)Z5z4iUSd3df9l3}6XRJtuK7IM zE&-Vfv1SxB&$+g0Y>{8@F3x8_r$%?V9PmRwuy$Q88(P1{-tXhs?^>KrSkrJ|V^I>% zh<(kFTVkt1wiN)YuVXmHb@BQ*+4q6LTx_d-r<ExA8jsIM0@~HLjxW4Z^Lw@w7Q0W} z42zMoVf=TiMGJeE?<_sza(aCQzF++oPPwa+iA3MGrL+RT$K{!vvd-j1@=TIukURdI zh^ukvNVK*PQ}e$ry`!8(z|*F&lYL}=)**TT)KOFmdXPi8q#fjvb~wZ|_!*cQ+-f-y z1lXYAWGhiTMG!0v8lFhY>r4RzNI_y~rB+Z-axvHdrDe4OxN(L5*NIW#^Il+>E`8~O z@uiXF%Z?sQU9o!ov4t3(F7-GUclRx<U%Y5)Z}-ycH|V{adOUvJ8*1-ps)|$vs<&($ zyr5_B{1%VDxW1*i5o1Lq-IGI$rn|wp<mx1rXy-_>Tr9CMd;B@kiq8of5s8g0yix@U zN{0|vs6)^Tu?6ROR&2qE*us1taA!8Y;D(atrU;DF<8aOwU+{Qb(+DyEqfY0X_`<Aj z+h&X%rN~4E=6wj_3$woe7vc-^Jq7UvGR(KI3(nuLejV-chzc##oHMl0E|d}VSCN1_ z8)B%FAqHn{u@z!)%Min|JxTsXN#w+NL8I(!aRyJ{+V(d>J*nw#o{c!nrj}=kS|oMV zNNNd5zCgCp<C2Qt5f@8w)+$&-s+N39mSYnJGcjq*sbFQ%WY{+9Z10RM>B3U!{k{2l z>8w0Ms_p0e#y0STxM@t#Tl{nSWvOYy!zw26TW#d0hWLZu)Xmw91A@sic|F|i9&*#K zwy_p+LN-LhUT>8Y3-&K3GVZ+$3|YUrgyxUtK7wZ7=kx;8;0mUFBv$vC1R1Y4bwp+# zEYKBvdclLH5rd=XM}{Amk{FTako*M{Er6h+ad0KVREVkZuk(*f3@!s#I*IWb8-r5E z)}XLTJqmMbSanjF#c(uajRwhgvTt4C*WMvrSQAT@On|!@{=46--*Owjhme@wyL!!< z)%NS#ZUH><cO{&=C7jQQ+a;W8oHS82{=DeO87IwBjXx_^=Zupks>Yub6FKAA`A-XD z-tjMs59ExKCaRwEHL=LTPekIUizzQA6cc!hG}t7XW0&-1O4oT8>ljK#2gydI%mW1e z&VedKxbj>xd}gJw_tJdq9o~(!gRGN0QdMx%RW<^1k$L5ti(R!<GV?(0zrr779jJAD zh5spMeWXFE@vn+ya((bHh&Rg<6i(Hb_}~u77?4?y0}fHFS9%=c8c7)$1A|$s>{>V3 zvw!x!0LC%pFVz0weo^S(?D325={1L{#Yqir57U!|F5@wgFmd`gev*?v7Lix7_135S zl@RkR8Ze;Gh!qnLHo&bIkhmowxMTtbwmi;|1^A}i0rjc<!BonR#lR%&k5YyVJpXac z=8l&2ow34804~|zvA9NXf6#ptaBuee#QG_{tPk*SUZ+)T_W1Zw5hz$}7HfwOd#V=K zit9aIpVvq);Gv2FJ^dPgqQvKQYNxL=3k!5UnSQ8(PMKVlr0UBoss^8$XZ%@lGH0Bq zSIvJ?z!5Uf{HJA(2&Z_fcoVP|XQ5PGxT3VcDO__lEHV@sbg1x0PhY^^urji9q*ChE zD9lPYh?6}OuJt>9_$`Ouv$xp)w!4gyogTmATR+l#-iwR<?|HYsc#qHP@bJaF*M*G? zyzm0DUL2nE^XW(FeesWfT#P+|0JFFVyb$F<KeXj}$f$-@CHskt>S3{G;L6Yuc1D85 zOUz$EQQI8w-Tx6sfw9@^(|##E{6FURc?Dnq_Cs!;&+BrgxBggCz5IQN_hS~`FPC_n zJuW?hz^@u7ysP<7itc&mKh6JLo|3r5`|DXW6`~O<enzZ6D{G)`$C7bN*5H`*@m$X) zxe#rh-_Yaty7&d@&q=xSL&Nl^KhD=n8_IxF(_iS}kD10e@y_v*g7gCEnE>1p4!KUy ziPW;7W6m@FoT$thC$F@c{}lfOz9(4yncwrYC}xd_9bcL<THV6Qqg->+=_99pJ@(Ye zD87Z+q>g6H>&#K4kj|_rut$cZ8J^?p4>UF5WOg@o;kV++Xiu{TlnMQn&;uif3~gAI zbRLrn1d*q5M}a_aN_*kap~zTi;=>!d4sO4>wX>nI!r?GhA?2mx!evMI`;GOwS-NI; zYJAsa$*A5m-n{s{f|6iMYk37SWAuuJ9s4$>pCMmPyuNAsvc)BZ#Y6RB!kEIq&wv@6 zL}2pU?41&0`Qt)-XYJhCLcGwO9sPmz3?W`zoE^2FEX2#P?C6u3xvwl$`w)@)FvOOy z6{)2Q131o29;e1!Fbo7#4B>)eYo)uv(wYW}mrPKY%C`1~5l$FhGQ1d0<bffex7iE( zz)F6TI1HT|*KUPh!n{0uB7<`NuI05QULZFyKkjv}XP~OmO+;&aMB@L|HDk5ieuuZV zzUeGG0ja=?`fEanEx_>Zwl^fRAHU1&#}8;<GUMOO;O#YtWsP=En+E+318=L@p43bg zOer_l`Eu^i2f5qnKxP)Qd$@iad2>#O%X!?-b>?vC4y4c#O_OjVMMXHB?rEP#xZPv! z$?@?K_`b(ikFOe8GO~Cyh35mO;aCWWEkHzke!7)bSDCcDBn}&b(kLVElH|7_<WL+* zJ&M}hL01OF_iySvwEd=*t_)Ro?p%6xd+MU81MN_n9udQ>)tyBipRv*F>)pHbx<#XJ z=Ks;#(>fx)27LF#^v3a)#TyF(B{sd6r#i;QR$Va`)J@N#R9TtsGW60#otroFVaL#t z(FKlI^Dzz_{)~miw>cub;0m|Nf5)H^4!};Wg-_|ZRG=6Zd0SJYzN*XxZwSu3X7Pv` z$mZb*+g?=+0@(ymAV7<D0$0PVN%#fDA~K#jWO{Xj<IqH?o|g5y1WMeTiI|i97?6;m zIqP9lFs4fC;4G-?tRp8^Evtznd!+9#u0&o|FALI+WjwAb+bGAy^`}15SVNrSe8b<r zW99&?b;tghB?tq#FYX&8=T`rKz7!E!7z^*9L-5+@4f}k-694||_n*>BO7v6X-M*?y zUy>-X4LB_Wy*88WZ{WKz*#9`<^JfoY_4(O@&8(>>8cD{i?7=vZ7TNiwl5xWFC%EAO z$<G{o_y%&^+;DL9fu!IC`jnwN3%X*70l@Cs6Ynf=7{-)dz(vpgwfa^28yoju)xQ?& z@%mz+)M&KfWJBCQEH%7#kj^2kpcK>+Vs`-T#4kT2&u9L)5Z?tqqV-1PdRJ$x`#5*H zMy<@jrMcGqJRjs*_ir?N5IFmvXAkB-<ZsO$%zKJu-LGb=RxBG|Lc7@hMyz`{c;4VH zXDxa$D{0W}3OL*)=g$!3{$(mi>|cGhv_Y5IX<okVtOT-VNEz@MD*2_N5~OawFzjL; zL=YczAqbfH{6`rodWonAoTnAk6$a0#Ms)D$Q~@&cSh!9&9hFG4nZs|S=u`Yg5WkU* zVJl%Y!*8rfP+exRh}rz+>=Pxwu|LL{rL4hO50m_+rUpiGYfTIIO*J&!o|qMDP#aig z*-JT!4fGm2xiKV<?R)mapWrw!vwc9a8^5tuH~aQX_hIM6VBf`(=jhk(Z)n(e!{}?o zYfi&OfJ~63`<M6nDyw|m<ELtCPXUk3z+*M+gB~`@u1)#dLO~tsDV+asG)_EN3O<Vf z0CHlPb2nIwH1*}O2Bl8nK;Dv!*H@+DIO61iCk0SVw-7LE=2R+}Ofr@nO)eT9#Lp&T zBhjc=s(4s8xKvpzH|8Q8&?FYi%JSka;AKIn@AV}WGb0iDiBlt&Omu|;^?OyQWh~NI z2ve=9u&C15qK1;~-45-B%X<4c@56sw^!4i3A6~wHu&lSS3DK4^pU+tts)gC<^B0u* zB67%Z28Z5zN%g_&X2u7~2gk<;D+ZQ;Hi-uR9W)qXcY}qw#ba8BjDHI|{tf&Rx7&v~ zorqliN2&<<bZpT`U&7(_v~!o&rqnomLX^58IAIww(&Mqn$lzYDYg%^;mutvn%gC0q zPKVcWXo9}up4Q=8f`(#IZ~j-XkC|VX=PRk)+1ZIOf49z^O%z=&qi2h|#)by4(hf>| ziiTo7c(M?zw5dAl&{F<@;4C*5#pp?c&rmwle3j#N?{3H?ZO^_P106)g9g^nTDYo4% zDZhWubU#u4P~Tt={%Spg`i*-U8ZLVC=nm7UG5j5L0y_M7X`cQUdP3uh%sE&#Orm#q z8TP6LdsPXUTL;TyVQLup1p;X_$DusKh2uhOiIN{d-eA|1o@9}JeLZ9KjrH+p7+<VS zgl%e$lRv>yl9hs&tKS8bZWj!G8Z!5WBUfAx_3a@s&^-|G>b^~0|G>WS14D_#pnl?L z#kFsJ>y@OS^)GKXoVvGsQ70c3Lra$q36ir4YLc_}0ydJfAC+=8e;jtn=DD+_^qunz zSS!QXxn!--lVPn)WJif3tKX9xd7fvy+?Jh9R*ZVaD{B?^j)*E?x*LigtQZG0M#_;; z_@?Y7;kd@j-9WpWLV93F4(BeAo<hHCGLc{`F_akW@5LiJ2Z8ivib`6Jw0Kf#J2|R# z4(4ZBFPVMdg)99N8ywD42kpJ+8dQ7XYgyO3(9V78r%gc)YExD4*tV`qZ%{kaw?ghr zNq?u;NLWQZNQO~+1nmZ182)bYI%{DYRGC5zj=40G7f(20U8q#|5tzd2n5U{hjzEXD zd!A3HQb^>+qne`OBu*NoiBcGG?(vcy8`tb(c9RKNVd`ry+_{AQrsDP2(%)-g8N*k6 zqp1(+X5$4@@^7p$EdQpjR@r={rNyLHI>6qm4F7^!?$Wy2gxgibg<C`Tg+?4XBdF^j z4*_{1IGjAFy2E~QRAaeZ%4@u20(<S2=s>`>DknG0p6PImOvvd#TmEc>LRwmYje(Z_ zWCGf9Q!*BbB#9W5=_MVH(z+t%0w12GBxQtb09Y!{@*KCjB=OyY?WR8E^*fB#_Tm2C zoqP6@TD)&}a!qA{jwBj>&9yzmZ?yjY{Vsmlt3#7jy5H-oj3!4Hr;Z<}s=D}OV<;}& z*tLhQ;wzT*c*@H?J<Cp&zZ>U7;gHVj2j!{y&JH>!vqxV*%D$#X5$-F3T{*%2(ZYBq z_c+HE3a=;39S|YFI7VDKBNoOxaFQrD9vG*b7=|(_2nEf(6U<))3YSP(A&Y5{3tg2; zob?+n7j}TY1}2#QEpY#lk>cW!iIEjcmlO{d577?vHb#m2vr>2ql&=Q0EjX14A)O0< z%dYV2bsi9f<_5Q+wYyAz--rIXZPFZm@6~3p;c>aI@R@(E|66vAxE}4AhJ3Y;;V);{ zCTaUd*x`o_4x)h8M0H4rsxZiLE8Z?W(zez~#w&dcAw2hEe3BW&9I@5T6@!!|mvw}N zqRB{pz8D-aQqtItup;RsQ|jYd9PJAX|M1L~gMI^n+<{~QzQGG@6ZG|E$M&S9NaTUR zMWX}hUs2@hOxjviKYQE5b#RW@t7^akQ4#}M+6{St^|{>^MR+|K4MiH~c@weHxf4^l z56gUv$GW!K55t<lIjPDZnhcRn5vD4G`I((9YQty8#Tv7fI9;m=MEKRqp^LU0H1#by z@X|A)@DeojTEm|pKWhRnb#o`-=zr01=EXLSaAM`oOV8>@r1tj$JD<Hv*)H#*1V+IY z0QRql7m=`B$0jYZ04Gs?2p~_05paJiP!UAsGgKG`d6zRjl`59G&vk`0<tp=;GQf)M z{59JJm-SId8koc?ksDs1Z*k$3%uL%Lwwn5KTEueQJbfQH{Y#`jr5k0Waukq$S$F`c z%K09713BMoGLO!C7%+pU@eyhHQ^Zh+ZyVrnXa0;)BWLtGU!c)fG1`_h`oeo?^j|Sr zD@gNDPk8ZTH2PHuC2>wQ`tn;a$`+g%<v#(IL-Isw?6Vvh+L--YJflL8=AmZ4@+rW= z>dthsm*t)$*;^kDLchz<b|weP+8P{0B%&i13YwnNxzI_fbT!T{oJE+L*{QkHQq|cR zwkwwQlxAv^WZ%m@O%^8FTjI!R2ipC}Pno-~*ylHpr@aXqfuaWd<DIOp5tOmLffQbM zT?p|&qT?cK^9yur{-3|IYEiV?t3hP&$7mkWKp3$@)2Kt?jD`I=K^|0vx!1tz#F_7& z8MQDMXPXo?SHot>P_w3Ch0u$)Q)<ydk|u~KU;?6VRG*vwp`FtoFO1gPlubGP^H8?3 zhVzs9!yB>O9kk{h*I@;f%{8XJ$?#veJuX*Dad28Gk~X2tv^4Wy%XJoP-U*If0D1|7 z)~gvsW-KEW(1EMV81_P$1%PtCWLPG^T4e=Ps+rZX?65-(Kxk{K*-xPSfB+c$qMv@c zwTa(i>I>x0)=wWIte(N|u91}fIe98xcpL;OxkxSS!#Laf*-)85*-MrLDaI^NBIhHS zlyl3LqfewIp7Tknf*!h6C8y_q3k2uGhjA7i?8{H-MeL*xF%)8*CFEAH9G-FI`6SVS zV9AFyRBun~KK-lzjCke_)35&%#+3j81NrECh2ik&Uhm_7@OpHgTYv5euoU8t$RD7U zg&4BMAu%80Z^2(q+yUbr*jT`Sn3ik>{<5pVyhawA3vF;dXra<cxQQPjAoidDxQGCH zzxGqFPruOTGsL4xwFSfT8=ro}0{7(~5x6d|`243xx0O2q9{3Cn;}S*PgtTFs5n8CH zu}ncsmBcIGian$H7~omQ$7idNA#|QcAe?6lU-HRFOyTF3NlEfgc;$u#SDGtHl&s<J zkhoMc9^>DclWE_4rbfaaVwfZG4Xw}m?o~P8eThAqe%8vgf7Z&hFURlJV@{l1m-1#Z z?G+keig37{a}(}|C#(>rg_U`xpiaV;Z1a4YiGgNm6Z!gf&JCh_=gQZYB5scvayu!# zww17IqMHS!>bIDLUC#Yh-fSUnBPsXa^u8aSouc$tZF#4yfF0A%Hh!kS5J;o5LKLMc zFOm!uHZtLHJ2gu@gO_1|KIPN2--xN%A5NuEourf$Bo0N;UO*-A*j^6uX(@wrJ_Su? zo|8LX>1#yAs||ne1&3P8Hzn5Xk@3o8OS}(sqno|W^kRb&xPBwFc&f4M@WtsL6Z_$1 z3;PEaq<^knFBnj-iL&X$^<cFTHc2{aX0ZXVWi|~Cj+NPJW|dS;rL2;fqFK%LZ__`m zQ#rD43qr4(NzWqv6V@f^AAX~0;>x|V^-s{Of|w-zQ<9dy%^s7qtj7PW#>wNx+qHH@ z%UV0p@|^F&!*QM*1verb*iU?nKZ+*<H>e<>@m4nVa0tT6CIqlkln^smsTh=UK?*Qw zpTc`<eI~^kRATBzAiYBPd@2QYg6B1(utQZH=ad`ds^)U%Rm3kxXXPW<%Rqa`LKN*L zxEkT_k^==lHuZ7c?Cj<}wj!E`$R{p3n8g6eZ^E7suOWd;c_JfNX%P#vWU9No#MB`z z;C2zJ0|j;(CpJ@fPz)(k94-!3SK=FmF{|*vww_5~DEF&XbFaclrHN0UfXH{AJaXAd z`g`K?Bn6MeU{6v8zy_20mHS#-_Z~a8*H>Tf+jr&6XiBfC(Nkk%sdzjkt4zsb8j*7H zE7sm40|EP*KMsG^_W4F%$ax0okMs<9u4GJp_7h%~G5Oh}-`|jZE@_YI39p<Fp2~cH zZ5MFZ2rp+ZTb>&4NpwatRR-WA$YOy5-05J*E47LZGKmntu3cx)+m&o<!BgV%))}Dn zjN})&bp{r~twMufX<yP^n)tzG6;b8ZuA$Q6D>q+KX%!t*<NeiFU91l@b`NW>x_(fy zNnf6#>Vi19pb-nicO758umHtOaa0!=1&wvSnQQs3mZsr_?H|3aW#f6kw_2-=_OdS! z7TI@l_JOENVdgb>^fcCv`1&otOdIgB44&?CA9u46mk=ImPSng%PQGFQ{=MZB57t13 zZUv^O|H*M5_rT}i5eTxo-HI74negjK-*QeHF2vf=4Fyt$61;lnd<Ryg{S`C;v0u*q zc4`s6s0)Xl{jsxrk?Xqst16&sLjW;V*VotH&RE~FzNL#6w)eIt6J1zrYZSi6aHBb^ zR9nXO=l4I74+<y8itPsx+t2ZLLkGhVx=tRU%SN`<rViWA$nIXtG2Fj*$-w5inym}? zi{y&@@&Gxa277u2>F+>NS0`)lvF6yC*<RzOXtc@p9KSg0;0fq!qwr)D%P9Wkseplq z8b$F-3K7Mx$cw5`<$#hJWEe@m-I%O$fa+Y8Y5=W(SLRWF{+!tn_i9wTs|Z*o1u`$x z9#RS(Q;5omxRXkS8o1=Xnf(+XI54v-={L^jD`og=pkH#HJ}BfAZYQVzbr<`}%YA#V zU;0zzlGLl1`--HmveMr@4*Dhx3_=U4Lno>Cr;3099&HE~AsfVwDw1c1)(5@(9P6{R zBAN&_{ah3Au=zg57d7-S(lj6xq*qd3&scp&eS2dJu+=n1=VFWeKXzuqTy#mYB4i;m zp>kQj#Fpd0u9+;h_6=A86ktn}TIx?ik@?WIyf+pHvZOp21)na49o5d>qCAsD1wdJA zW4I0|Lvbbou~jJ=6M18ncd|w<UFlLpN7A>SM@Q0T&cjds9AHL9Qrm0VWF)l`4U>qD zNZ#i7dNZzGseXy<c~jw~1b@Ix&g?osKHmK^d;8!TC(Y#i4QQwZ7w^D6qNaVo%TJeH zzc&)O__`I1^!aIISo8YvZhvK^uXnkkC8cZedtlw5P9+sFIN3H*z^e0N>BQJy6s4f- z)7E&is$#~Cm8%f0GtBO7&Gf6QJ9^=ohR}bJTscjn(%9_nNdH<{63~zMyQJ*=K7Iq9 zm%Sv*`Y?J=&gggln?~bjY9yo~Mss1GF?jv3f+#Zm{tf$@WWDeQ&tGc-T?f)Vr`9CN zdLqfzXw<4TQ8qiONK}I(1aZleK}2fVnDKT&Dle6q$dN}c>hgQnq3u(+t*WuRY-ni1 z+Ro|G#TO?0-U-9yu8UPg8v}!b4_$pwZyzbueI7?`QC&?*MbKZoVx)0tTgz~n*Y9yw z71mc4mj{jTRZBO~8r51zk9<w8@!RZ8QikP^Lr09z%28n=SH77STb--y>XLQ2ovUUI z=60@{Roh|LgkbZn&Q(@92k`eluPn)b2y#zm{rVfLEXjKcm<<wL*=9DiVg1@Q*wJid z3H1zs3m;oJw`mnBOJXuc|Asd_TUPS3IXNiQxT=3ulylR&%Ik53TdQYL#H5}>5yuXe z=x6O+<!S9fouS8Bb8cc8-;`5PGMhGDh$u>`k+fk`(qsH4d0NN|yZ|zzpY^4B{Hnv7 z1E<NMQQs)ZuVl3;pLV;zPh@LGvK1peJ;|Y{9lMi}Vmb(J`bPy!Y`+(r`N|wlB#_;j z=i0yG*xHM`Tf!Ij99%o-D=6^A2S-PT<34{ysCQtvt9wxT8u)WFC;B#ZC&o(}Pb8*c zeD%Ye=;*|Yu5#Yl+LT<lAdNOJpnqumGD_LNR@<h3CQ3<*r4(lJSj)yaRq!}jG0Hig zDO0h5)lq!X?yF<j^ofL8nB}^*+1$-mRC348B_yj;&DEx{4t$Q{k%m9Ib+dHk#p9<b zKmk}`a`Sfr?=9?F1#1o19r+~)PN+fv6!>>-vm>f1XOJe5XW}fAQuv$;1mx%c9H+yI zyvhUzJMx;T&&jSV!^QKeHomiEHJNj(rA4QLuC<|YV(aUsxBNr~T0czhJ}h6p*wX5! z@>jru&JM)apJ5Bx`_yXV5K11-keNyqufx#3D6yOjIIP?2MfU>evO~I^{gFSNN>a}< zJrzf3q2q?^)6X`O)DrCbLN?N$MBx%*Gx*1cPB)0o<RE13re{%;eN|E_eUQ?P_u|%7 zgrrsKUxg~7h-<GU)LdH|27MsuV|vSssUx*xrA+WpXp;#ZEAg*xZnlsI89<csBP{?K z@H4!E&p^~@ODvzk63b^$2w6zfB<D!q*?M`pM_})@LYjx+Icb1%!1fNvS`%Oz3c_}~ zqy(N5sxiT+j2l3k*iJ`9Hn8#IX<-&hT9LcFvMA|TwiE!{K?L>XANH9#{3RFnj6mSi zlHrQ&JEUK^msb!v(!aWTbigX2hX3Bwn<lVU1@F(W4n$C}j&GCib<Q|!=l%1IzOX7g zO13jS1Ge+l?5O=@AzqffA@hGvi0^O9&L!JfJ>eDjA2?u(NL=<Z^sn`x9-n*<4meUA z&YjkQg(qS=eiJ3h__vq!3;|zFq*7$l(}|$6HDt4JH#;?*KSv4aeTTN><I?bY`>U-y zbjm>QEN~h%a74|6SudrZ_gU%Z*|kyDxx(-d*n4s?Ojfa4^J`ma&F~^2U&4c)y<w`A zLU-PbuUo?rgtrI_tz_lNKGmHiQ!GWrN6IyX8W+feUlckY<$lll68EW70<_@u@h=z^ zlYSrnCaR_Uf%JWRtJ{YX5iQ+`ALXzUm{y8kMn*&`7OM&R&}a$2Z8<h=n#Hd-v&LTh zXVpNFnkIwu_U~r_v8td{5!7crcc2JrQZEoYc54N`gs(vC*&$H;2!!3?DDaO~x_9sK zR4%Ge@cG>7&+>7v-|tO7!j}`E-gGDA6dz1KQvv!^&=Ph19w32kITW&a#$R9$<%|=J zs`)RnCv(QL&v}{Mhv%tkBZ@gRu~;e`tt!O&GaHf9&!>sS2YUxCr5xH06~8NVz!hU} zM<!09YN5h@*8}fy`MsMA!*%!&_nRBMKG*v`hLJ6W#+Ap6!YM4)^ZE-Ouh;MO+<iAM z^m}yAi$A6Jh3|O}dQP)S*qtqau9{V+Do~)6g$>7Vp_q)pxR=c+NCQI^lmsQGJdJ}u z-syL&{*nWGvcA}J<D2#3wO*ei{m-6~HDC03+}_Xgr@c-hlSlY?fCf%q5+MAlUnYDZ zIxG1FV%c-Xkq<VM9VM*OY;cAZ*-`r$;0!H<@kadfZ&*_UYe_YhAb^0wjv=K&;JcX! z07juG#Ph45Y_VZgKe@F`8C0(cpU)X60niN~LcPvEqJ9G*&h&0mAM|3dr9dB`PZxL! z-RT!i18)dQ1rMO);L&oWcgdCJkHZp>wKr-M*&f#Hmt+pRs;2uT^0=0gwuhDqu+b?= z%Z>Ck-6NzpM!d=EZS&H>Udon?E?O`|X<F!57Y+M8Qaom(h_f}JU{-^eKX;3mpQ=Ef zo5l6D3oX?N30+cDN|Et3{A;OEd1+n9@RAx8GQ8wp%J8CjD$`4@R6B~5PBL@}$zQ4A zMPVis55G^>Jf1cWEp?KuSUNtI8W~2=R4vy08x~8uY>Pl^oqu7)-ym7|e7qhVLzRg9 z@Ecz>#l7t%+kZj1$T-pd9xGqVP<f#?_<Y)6pRP6-qDu(xR?wVgZ}eKWdU9f!+-zFB z-0XtCVf~ry|Lc%2OsO7y@%pbpWhOMhT|nEe%YV<Z`BKHi=08P;=k(;+FahcHI%V|2 zVXKt=8EXD%rz?6;1!#3y?PTo%+WYzH*Dd8ns&~-$WrvtqE6kGfygQn^h%DLWZXod- z?3`E$c#~|K(vs_-iV3uo6Jjw^E3<Ih`9)Q!dYNT;e(r}fJtqYzMHxs*mf6>{XCP&c ztbMG{y2fFmTDf5q+nIN(>{ZU$AM8U5|2S_KkFzNJlpj={3ST39<t$Vws3H?_X?n}8 zw^m>6QaIVrUqy3jJBh0aD$=}AmR+^OtBKkyRh*ffg>`2prLx7FXkH3u{&AYe;pc;H zmzf5m009a#Ug?On1G-2w7H;$y<&@Py#hYZiX3_zrH%Pk3C9{{oB$RH-+Rg3B;pC9N zEPw!oyWOqV^hF028lDc1;cczxs)|<!i%tIV)=;d&<3&OrN1nK^p?olL2YQ%$^n$>` zhHAI72({Pbr39|}fvX}&nf0G3FG19Slz1v^C<6kdfqo$@LTK_J6iu7qaAB9=6*-hS zb-q<oD6Us5V`2@(^;H#k9%5n!C9GsJN@2Rw>g)t|tX2A5FJBDpR$DeWxRm}b9tj3P zV4|rR-T)pf<sa|wtE%c980baUC};1$;<5@Ib*P=4rKJ@BP~EnG`iyhl`%tOweW=R6 z_rd*t@ZJYNvI_fr1dvof{*z}A4Yg$JeGn6LT~>(`M%}T=ZC!;p00QO>b(Nv25WY}` z&K4d84(aY0VJ-^*$luYB)9wg8fS;GSvk&~kCD->KSebsEn~C9p-g}WYaVvd*4vz0V zynSHD(8UYd+XgZncj$fqLDn89nP4r)d({y!10m_$RZ{0JVa3s;!=2X(iuhBuWh}o} z0+HJ(7C(IYyP5uV<&?3($ss_!Yc9+FuC@$IMs5q7y+XSI<Fa6;lB`9!LxhlMBI*P} zthTV~S1rp%b$=D$$cF4wOAMMvk<h0t^Bdn)AShHELAsWJ4tF^^@lwCRR_crd@uV?r zEwZJhvQ;^OeqI`K3%9~gQ0176BMm#=8gFevf(?rh%TDTUN|w%c#Its&C}W=kFtnj1 z_Qs3QDaqXkv02j50;c?+VRllo6%r`Z`_Q45Kk=15v?2VyZhq|kZ_x@)ziR4u=Ql39 z4DNEBfAN}MoNw*VSvz<GQ`CTrI(S#*ckl+Fa4+POP?nf7ul|P}ym>(GsjTFO=18=Z z((c4wV;ug2heQ}w2x`>CgAbAWfWw#1H0r>*fOMrn?sATxvy7{XLyy;1pn3%79ti_8 z*a)YyasoZE(2<Ny_9p|0;=%3!S_JFvnwE$XkFmI>6g;W;km-jPJvmJo0+}9`MP*i- z$P)Bt(0=as?)AYI+2l7i8Rn)3^pd^0U;D<RPD7um(BHq##IS$u`;Cej-EjQVH|xMU zy&hgn-Hx%5M*7!9rq}J@%Xk;^YJA1%|3cVaD%NSvy{aSWH`1TOYGd$;Y=W<30h>rI zLje_X24q(%gnS?vjssh?aCAHYZEAwtQ?i*-1JS>GnmXQuWXGEYY$Sr9K~JRD>!v!P zSll+YRJwk~?@5N2<@mIuhYF7?f2neqzJAq0Cv_ph^%i5j3)YM;L=GNuC6Wt9dy-=w zhtJrC1_17xu3vL>LA0f(d;G*kz304c;nBTDL#(&GGf@CHV?kScV;AKZ`@C!SCZ~GZ zR+m>!B^OMicekX12e8MoYi1R$-m&aQ>?hR|Dz0L6&CGH-IzmNUS&kWPfXuZEAoY>6 z$(MRdWV8+0y6H#szy_3;-y-==AOBVnHSm<X^H_SY$fCptfZ-5Fz7}x%8?j5;Fhrpb zNN%LYp9Y26T#!2T#7KV&q5lkg>JV#0mAJbH{k8cFiM&eWxJioahT>YBaJegOV$7vQ zONq-PI&spk?=8_E*d{rEY)7*Z6n2qrI3N8+t=o%^pB8~B&P}bhiI$x1G-%0M(Mbt8 zdL>CddQd_R;UV4z$m<!pG-1Tzpp>s-@lbTm7%2%54@GMb;!4yMLNYNBM{aN6a99M) zm)iF4&<p(f&;V%tQ9>}a|Bhbsp~t2)6gsceeZu<>ANm&5GKq2vGV0=rsBi|y)SDdI z7r}G3?wt)eNi?Ck-8<d?FS~bIR7+6HZdatsC`p}zN64Z88og#oHqQpjibMEz6v^iG zPFM6PqNiU`RyI*0b!8N6qr{rL_XE5_kZumFqU=HTloGP16lVtBQ=jE9L+|RkAUFqK zA<vVPmTWsv4Ni%F!>pk%*>8zV@H<>{WBUle9LOmm=~FpH#15b1x$xlnF<C7b4Rw^B z7Jl!pBJYEDxP#loqdt%BPAAu#*NDE~x*2Ka-}VS{j(m<UlU@-Cl{{xr{4||2_yfSt zl4pLTEfc?H4e%o+i2JofotoQ45nfzJv;lk&%pL)U-LR0sN}1Cw%Ospzb$skx+1w0o zTcSD9-PP0>4&f<vWr0L6;Dc17h;_XtldEjwA!r5kg_69QRj*%fXNwf^H<{`0mV&2# z^iHIHqeJ9J;k6H@zXQfnwtf>{dq2W^@y9*2uHJ8~;I2sI#7#0IdBII53M&G>^dDCk zelfOuRbBl(_vlpt_p0UTyJ(llj-sAHf?bJqbClRIaUR}B$(Mt;zDyc}N+H-DteHdm zgysj`0+XXGjHI`y%Uv#8_CU1@#n7}xaX<=&fRo#AB}3%jGfOvjUUQ7giiP3vZg?xe z4CMj+MQQ2LqiELyg<_~T+VUrQb()kOqU<wA#P=lSz`qGqK{(ebSWr7C*fxNYAsjT} zPlnwVmhIaqBxlZE8IaL+#6~lX@(&4wb!9-O1m`xtaRl7?R{HGpD*|l~0L&|<{)z<; z2!u4yu+;nj0u*8b$hj>~kAbkq%>`LKMuK5q5)&-Sz9L<e8gl~|PXif-{}~G}e?9}w zh1Q?BPzZGRS8do8X0&GkNgHcRHACDA_d0niT;&9;zdYQa=Nw&70PK(iCK}AcP8OJ) zR}g4YQPGy0r&~xk%>uBK@Urzb-0F2!FfF91JyiESs6AxPQ)&;1Q*FZm%I;w_cMs|0 zXJP=^JtPHHX{kNtmn_gSw>~_6HmK0MUg^=qyEXuCbjKJv$^w(fVZl8ew3B4i2s9X% zf}ZXa%ibmy#&%}R2uVitj|}4CN+OEahJ)5dp1AVlz$I&b_nV%ffnK_bNbch6m+W7( zd+3sdJ;}Zw;=~b$d>l~Bwz5F;<U2j5l@(5gZ7a)Wj#4L{3((iiJ87S|%kW<%f%?tQ zdxrY^XwN!LeGJ{DjMonz$igLWVAGl;b|RoG+_MM#xSZUDUJ-;KFO+q$&Es%G8G<ep ziw1$D*5+titSuM`hH5H-R`j6P&xR@z;<koC`<P=7N)kILq5P>>1d3C)Ii%l45bw#L zQG%=95tq<S3#Gs*v<a!7N0F)2o$9b5r|f6ja-}pj;v9fI9&2lfwa42_a4v>D>ZpQc z<*F4KyH!%6Qa&;eH`#i|1BU;Q1p9T}d<F`L_zZ3Q-duG9XqMX#xRo+;*ro$eqlCGU zburxS2kC<*PafQI1gU}!!=$lQPEd)zV;invknFb^eX}~-o4T5*b5;z{<IEUP<}8y* zvYO0k$zOt!^O+@(0flqTE2NTY;T|U5zkm~o8*IEwW8AtuMOWk^EeTi@7VaTS>>jpC z^?)pa^{^irK{rE>Ze;3{EP)MyLi<eLC9KuqqT7eS1*UQQU^!6BrL5)9&ANKR(Gc3( zD9a(^fsv;l`IXcWBB$(G$sH?#Lng$x=z1LI-<`bt9jM#ghAubyX#ZU>Q(>#F9Pb}P zMy#>bYjXYXF4J$nd&!cw-?8(2^d<Hf^^G4ZDli5OGqCo8#(Kl!^PYbpb_BVvVmH>5 zq&0zq!8Cwx<gc@aD1oX6HI8SqhH_%+Ju(9lhXkTkdeQ8}zdszCaQQu34Zy#+Z+xX% z&|Q6FSf8|i^m{Hl`7YTD{*>Ofe!yDN1#1HZ`k+xz^f9%hO&8wr_TGYm-n(xnT>x|_ zZ-WsyJ9sav_&UiNruSqG^8>loFuq~m@*&WNog_7Jw5Py1+F2si8AKv5u%i)voV$sN zZMJ3+F}~7{tXk|ZF|+*2cH6*5i6`=qvc5y|E5fZzeB+<YljJ_*KR0}S{gu*fU9U?@ z9vDfk#S0v>KEJ+D_xq4o;eV*2@>S`Z_(q~T(t#QZ01Cb0_u411mr+1}RZ1^M;|Iaf zMBb_oX#nWVts(2e<x(7jc%R$Nr{Q;zwn<eA*VtKegn%AvT~;XV-zquT30ihKLr%C9 zVfMmZIuPsclnzr|$(bl2e+=4h$C6n`fXx~c`5SJ#8fpD@uMB?rPLFsq4yq*qZ{qr$ zH^1dB1TCCzyIoxYusYL)TfhCPN_pXt%|_Gdx}$g8a}C`GaNS);R;?Q@uN+*rYSp@$ zzTVn(tAHO^Lt+bdvyR0n23Cf1MA1ETrb25!l>3prubhAxvl0%cXs90FsKN5!6D6;g zZ45&(!+9h&iqNK&B$#m1c9x)4d^Hq4@S%e@x{3?8c>LO(3&$Zq|8V*7p234?n63Cc zc<7J)=o9L6{i=NL<ig#<;Gz3+=&qNc3wn^eFhqAQr{>C~JFphVG~yVx0*kDJXi`!i z@fKp8d7@P67_+EP`6sN*ta+#~INkO7n@^!LmZ=*{1_nm@SIr^C2g)m7Y1nhAtQZ_f z1bez-ZK&fRdZg2HkN6TedMC*N$SANbkR<ZuT}b$Ixv932BmvsASX!^_pV-;d(cX%0 zp)CnwGExoz?RIWiW>J}lQ??gNFi{M(1zJl&1W8}{Ps7|vXKJTZLm#4p_0Wlq!Gl*{ z&A(&`UH*HY-emX|lTNYNXEf=)Rq20R*t7qKv;x@gh$KFW^E6C5QG?j8gAx(o5_5pl z??zXFjHi;yt>8RHf;E~Gvc7O4(ics}b+r?ee%RZWP_`cNf)cluKmw`CAf?`<;QLAg z1U-RaqQe<zi}y7&`^1`x^@~EkarnIAJ6@mjKf_}iD%Rk}pzUSO#r{ZmNLJ7ehob() z&a&<N?f0co<LGexaOtq%B~FjW??>Wh`d4Cj=?`5F-7I=MTJvYx&p+2j9xvjzK8Ypf zcmz;cYI(>VPT@er%&O>bfQ#J92@J8xnwpZ5nrKa=p}wTLq^h(rO1c|UF$9ufI1!4w zN3f0tS{vF_^fge00PYRJeI7Sw@ApXGOLuzUg4s2TaKw4~1-jpZACtFw+>*KF<GpLw zg~RLCrpwo?Z)#e%7H5R~EFTq5AoF1P!(OWvI*!mtv6Q`#WKc3FXPF%OGBXtXjIQm1 zCfZ<sFeR%XQ7_w*?2&#1B(czuuro(2KJAiuET{DsG{ZMlrvJmmb(>d|1<*F5DqMV% z>icU1D$;^qu=|1v#4g(g(@RiC4QmrHk}toJ>=_V0jsX1lyCEoCxXjq)0!S9oklLd% z(MWRGzV$3++e{}*{nC}JT<tGiM^V)4;3n0ryEvgA-zy%K@rI|+It%)bN;?SP4V>9w zL*Axy=96Lvpz9{zdk19%;8p?`Ok@{8B=H7M2UrYw-*W(k27|uC_+Jj7HlI-@a#o~S z#*Qug8c6u@-(32p8{I^K?(zQq1^sAC34TuiOXuOMRqK2BCk`E0E?EkS?h+#d$(DZf zEC-*rV<^v8Q~|o$Ge;aHfPV>9Go`rOH5L)V-GD3cv=tC+K(^r)GnBmyXUz^IIS|67 zJ*i?DOW5KCLj(PmCp(bzlPlZK?W9u}i~mgy?XrZ!sR9e(0{sm-weMbi9qe(!!x2$n zdmi7QYx@_#MGQU#@@y|5J#G{sKojaIxq1a0rl^8J_!O;F5Y*vlx{M@W@GmH-#N&2I z4HZ>I4bDmB)E>arR=42jS~_VGZOZ;u2e;UCU|I^onFH>>!pVK?;-X8)FL2Oz(c(Ac z=_YC=zsjdT5A77oXhL#cD<qDT?!xV)`wrdEZP*SfgjEg>MFzO7T6&MeNfMiR1Q5z4 z09%pC30;&W#C_IIpT(8@_6?bRJ%>Y?c5oFo<32z?NV2jQjY|gFsV6R&2<;$LbDU4C zfx<B0WA16}ShY+ChO?*_<`TRi#R+dV8UxTX`!|m^W_z-NiJVA`xKBF8KaEb9IHA4P z$%Gn%$_@0s)jpzE$`Fj@Ag=|#LGuDtw`;k{{~e(k6v^^Z_{z~aTg6?V320SVTMJch z#zCFU(7njmz|w5p3)i3_Zbn;^b?Jw(BsXn}T1oD1*er*5OP*t2t3os>;QROm5_<3r zu$DH%-0%T7_q}%bD7zQ-)d#kJAGg;jm~AgzoAjtS(Q)@2G=yq8xdrpl5cIITAZfla zTa*ybC=%)dm!^;{K};5`y7aR%LqE2GYV*O&<)5!ww6A=M&8axtb|~b;$wo^H#l6Wl zrKmlORNh2@JU<n)Xni)E60`F{M-KH|xRev!hU+xJlf+r1+v9tQno&mSG?6t+O<*aB zLpYBEM7l~Am8NjU0#aMeAO(ujXK{UeYrldKT6P{M%4ip*=eSN@T#0LTuGlTnx$jak zna_2p{C~n4zPjizQSPCln-8D;&Ty;@QF?I=Xj%5)C@b;1khYQusAZ${P%0w*6s4ct z{+&`(N&S-~jhxG0qWL^^f4|=sz&!%g{C%sb|CrzBqz3fV{2eXmg%`cwp;S9_e!ZSW zpft2H+?!Zl1nlA*k!nhQHlPqpA=2NkDT~GaHBv3}!wo!?42HsqWJxd??oNb*;*f$s z&jTy{6Hx&7YZ3ncXa<;BK&BVt(-QnVapG?5{(FF<4u+eh3gvxA*ku7H?jF)Gn2YUD z(L2Db$g+dAlk*)nOHl|fR|pf(=k~=X#2xAcb)!A{JP!G;oFg=^U;Y(>Ie~p8ZK#i= zM+YbtwU>e@mTqnY;1;9WjanG8S`?1)Zy!r0fW3ZOAF?&IWDeEZ%!;-i9-T~8AM_#R zI~40FY@nO9xZ@R^S3e0KD|o;_iukVCjL;tpSLG%*^<UH=>IcTV?D8vQgyCQN`!rm$ zg?k^Ju`oB_)aPs+Rzn#tR@{Rq6tIG`3bf_Rmw!2Nk79r)75D6c%W+Ux+Fat>euZVp zrYP(oUjTkGYZZcthpE5^y&`Y%Tz`zTu6{0KRaCe|v8rF-uc97`*+}X^n<KRF0`kE% zv^~&Qpx5lc9!Q<k_Of@dHuzkSm}2Rqat|`nj|BHQNJxwW_nlY+;k0uu0V!kM@Wa*a zH~!J^e_~E(2WumP_kOt+pS6}z88uYnl!1Y9nSs$QeNIAUU?{AJl>Da3-S~|FC1RZv zf4mMHG{l;ThgL}w2Us8zg1X`%h0RHRM%loD%rmRSB+RpLINTg=3P$0SQy8%=GZkEp zE1!#td>7P}2GKeJ>x^8D_(kVC-hAu3N=*I^?z*FYu^%@JY(@Toz-_cQztee-i>JRo zv7BEQ3iV!p`)58}Y8E%YuQA~_eBQq8LwB4=fBJpR1zTk$1=-F&m$@g{UAgjCW_jCW zHin!5{XotL&YD3w(F58Qz#esZaf>gC)oKQp`70Lo9+1yaGaeG>&3cBqjgfYs-ujh< zoMG+2|1Z{WJg%%?`iphLrV$4uW}+5m0<$oqX3)CTjE6+|EX=4Gf0vo@IdOE>4C0CB zN$kQuFL%iL6-B+ELei4R!mVY9g5y2Na|g)RfqE`^LT&RFHN#=t5JkaN+qlh7(jpd_ zW758A=Vn1G$}wis@OCIGNogC30<<OxW2Xh<U2+v#=7ia|3JSJKo=LbZ<!wAd-a{j- z+cEx%`$59e8G@$%bU%pnFJx0pficQX4NJ>j&Qte;gy=Hxx%YzrAM@X{AkSsi*9Zyt zf9rk_@EVG2G>hLuqv&P0&$X5d-WY*DOF;aQ0YW|tM4Tw10rt|<-P#<gk2;VM0>zx1 zpz!&`!Abi1x=ZT>DnVUtQ@E7}$d&9N|Bu~c1ql!MB{WyL<|-&<+PZgt(&h1Uq}O>$ z^kchw9p$TA_a1THjNaCry(wrjVlas|EPwR-i+3Hl{<`7e+izdg%ni?&%i}|xYGrg{ zWo_ihuHHb<yI^!|q_%S5qD2d_y$swJJ^4K{A{t|3sgxgacJgo7sh?H=ts1?+QKk>e zLuw**wG<(ZhHGPWv22_ahG8%_6h*bJ<d6)919q6S%zi;lgI?RSx3)GM-@oVQuQs-~ zHeYsSQ+rG6mC)bOH)wKkV@Gjes&V-$-V>^;tvvQ}ZCyjn)gWDhnSWBkOm|^JlcES; zHA3-rj@H>SKb3h$zl@8pA*8;EE_&+MGW8J@525EjMz!>O4<4+E&+^mwYya*^#BG;O zJg8H4F{OVB-1`e8QXlwg%725N20vPUVyOLr@}tek4b3+@rNznLkK;`6k+A(1`d^8Y zrv5N2A63Hv1YHO{SFqAEZ-cMigZ!`gGDEBXk7kBOWoBpu0D0mty7)zgAFa30s|sK} zg+F}P+u9HMjgJ`qYfiqIK1g5VH$F-)Hf}Wh-{)OpAEVI18}7jk-aulTa*n|j>gyS+ zZ>-Pl!7Z7>|MMQ)e7~fM&+vCjE~$EOqhiV$e~44%6lXXe+BkM*0Yfe12%7i6ZHU|< ziXGaCqVP+=^F%fXC5i?pQM5QWQPjS)lvH~JQAiJ=7z+7~WwuROS&nZXb^FR<a+hi2 zhQ7PNe{vY5wYoWSgRgKmO2t0>R)?WqfPQ#aER^HJ$Mhn+b-wk(l^&$jKlKG7wJ$tX zpyNvP-@F2kxbE>h@+s1nKlMnVjxfY4zoB)-(L3Tl&^uy)vZH$bQf}yOJ2w=Yi9Ds8 z2=4&vkD-%VB0MWMl$_thB;;z<LNl46SxpRFMb^=WAKBTa86H%`d3#z~l56`YjFE^$ zTH4y0bWiabT-hc%E?jYFZ%t^;@r(7&u@HCbMb#Cd(3s!b;`LY6)WoXmiVQazOl%y9 z_Y~F6EGMry@x>nOo}CK{fvvLEswc>FQ;A2}T+p0wSCN&_o5^(`zmbUHIOClB$|zc? z1EciPSGZDmP%VjT8gZBwraxck*ZIqY@ATt*X`#i500nWPOC-(xS|laSDd@7}pW&#P zw4iPT)QAbCB60Gg=VgIb+b$#J2Fu9;g<Q&b!EC^TG7@RilxXyMcY}CNE|;||vS@q7 z6)vB53rOhp`^sHNxbr;uh+GS}li&E%BSb-({_3yol{Ctg9FZ&eEVL|wn5t(<{?rr1 z<lUeQ7_dtWPowt0=I975B89P()FQ;|Koy9a<Y$1AT0~25g&UEa(Ha9vXDsG)XXDhW z0zIYsxOT*1OjcRg*vY%Wk<@NqE%AmdrASSQ0rm~lab($ZcATOk8Pr9R_+=-YLb+RR z1vukz+o)AIv{Drh;a0jSuWz5*Z#1A&#a^Gj$?NlZHWYd9z1Lg3fnxOOdW?8^@ChIO z`(pYx^4*WzzM}NM^3oy;LaHAPOFUV5OE6O*_gtt3P!Tmsp(F?A?Ci5_&7lonQtdX0 zLXhGQ@vns|dZ|Prjy<|&s@AdK3*ZjKyHzK(vv-&a=O@R`?l7m4WB+e=n6vOz2Ylsa z#e&~vvy0E26`P|fe4J2&#*E+1pvFduDy4+RVE5G$>_vG#2}`Bmk;1AeCDb`>XlU0g zGAGKCu~5J%Z=|(ybcxXu>$3ww3Yr(p56I*7Wdi5}IEL6L)jK1rzTiZm(m0CWim*_s zuD(>}+mdP|br7~4C##lxUbu4+hY3Usr`N1Z+u5nM<$lK(>$+F;w9&8E)zp^iPodBH z+JNWOP41Fa!sGLJ-RZ&QQ-dha)y+_%f<Lb+kw4Fu27ny}5pk>I_;pSET0k~J_iO{C z-+<*FhQGTPH`92#+pEePlx(Xyc|;-pE9D(D95=HOTcD&{w1bmrgNTPaowev3mx@BH zy5^mN2guA^nm3iIY;8rtT5l`FNlSAyLZ_uXkSNV$=SuAy+PD%raPegOZAm3oBjsG? zw`LP`SC}{42%Xq<(+S!6^~6o|=EfU9Fl9@|G`?u!%cE3fHnteer9OQ5-dJqUQPs%e z=pOVW^X<JH@5GMOXwCY`g=5~567Og#{RD6ZUx4hOE7+faE6&I^P0RB?Z+>odPJS+y zh5QDDrL6p1o0u%8TB2K$7QK_)fM0KRO>f&S8;3P_9+0i%Wta4iwoFaGpGfWR8bgCp zjk7z6pLr8HBoZ&m%gd!G3)C4aLjh0&khACI&XaG-e{H6(A{qlr!eK+vgzW5k9(;Tk z+B_+JHNTNyN?+|a9tKNNy!)ReG*pj8`V^T0aAf}vvT}(pqUqdSraqzLUt<mZ<mtEM z0zq&RFgA-MNY1=TYX&5<vvR?rNs{GY=6{lvD;_dWKSaMi3&8ntl?P@PXV^jFj$yV^ zSuzzW6mp0V2S!1_TDiGZsdD<vDbsfIKT=&#vCEmvT`Dmna<f&4{A6b(bN+0;J#UZw z#@h?@`S%!7T3I>JclaLxZvfGR{JdS@7CbbQw;M#mnyQMD>R>hI7M(3`HyqBS?Mew~ z_;>HxvwzQ5pX+XI>!RDVr2=!?_6_H6+8$|XY5pKdKH}jMfT5f<<kd!In0a1pWF-`v z`r3+y$_9L)be^nTc^aj11-(84&d1GTgq)ul{w=$9@89#Kf9h^)@5=T_@*B5JZ_EIt ztoKJHUc#{dW@YTc_ydQ`$=HoXN`Ri0rbuhFwIp29P+g&rG=Ii!IDFQGT?=U!?gY}F z;lBXDII;LA{dEF&Qyu~{X9k;TAybgnr-cAF<ryQV0<u8nY=LK3b~MFr(M}5``D9PW z!2MLBF-f&Bih{g~x#boG!LO2)nR5`!?>0{~ZCRril-0$M+`++IR?wb*@?*5;i!gHI z*vY#_1viaU!0GJTJ0&gHSu_ATM2577#Z{&j;HHdSN&?Ab>{idp*hLX0>u782Z0f|f zqJf@yGIq1-nU%3iW)2RL6gruNT}xMcRw8=^QO75Aliu+^5Y`a^A+jZ{jsBH%qSQ8p zb;uOE>z|OF@;K{)mJ)!L@>k^P!it-dryB`HyCc0(D^C~dF_51hazunjk~?{Vf@IxM z))PiZZGQMVr}O$FD`pZ7pJ$cV>nu*7oh`qg6yW={{Y~A)4zG7DtT^|j2ldMjZai?b zeK~eOcX^_9BMY3c;b4<oQycTRe4bJGfmEh$Ay(DPCR5839q`Y9sUf-ZFQx0wF;IIM zZYB;#yXH^V?aRs5Ren1x2K#0O3P`WQz%v(hXg>E^U3V39H}2QeviMM<F;Reo-BoDu zqjk=#QjL_aJF0gri)n786ohN9L30_Hr_PZDwPA#|ys>57M-TYw>U;+;$4)N5NugUu z1l@;$jNM;g;dPn2G&E%FZjs~meGY<sR%#JQ>=2{Sxcb?y%$+ZEl}jB^M8!;W=ZllM zT~0UM{erYt$_1*zopfiJVf9eJjJdbCAT=g8wKA(!Wl4c3W!@Cu&8E~f+oUpbHwoXn zhiA5<`dHp>W8dQ9kln$S(8o(;N3iRcT{|OtqyKbp(W1ehDvM<l*}inkYKZl)eJO8G zEQH)d7{;odX&u6rlmbP`zN$L_WE|<3q@}}$OP3znGsp_WG<h2is0FsEnhMln=2Xgv zHHN6X60xM}oGd?ej&r195KaED^0K)uU#*P8<$L6Wd$Y|_b@Kx6^@l+qaP?+8Y*WYW zh-|KXbhmWdSVw>7CCBzI&*`;2n!<+5-k^U1*Q$Y+5c%1tCsUC^+VE^HZ^pt!vT~#z zcjU4vtY)5EUdf&8RNjP@$y=I8@Lyvi&ezSU9p1u?9-nJ(N9W#|uOHaf(cIhwb<sAO z-ueClG8jHsvMPDrhV2cFQIyQVB?eo7C^N;bc(|8}>?|9g5veY2TvkcF7Cne*dT@K9 zmD&UBGlp9$a1&y!7aKMIR4GvMr=rUPzL{bR)O|yUryEEIqS`3wRwKtkerjGugU(n6 z8Nv-_X_&_#1C143xMm2A7cW41BMHSk8op@zzN=4^!4w!m`?^i<wx|>#8X{%goJGnX zJarFt54MspfEkiGmng$1mY*1m00CEt>fyX3;i^;&)|PfdX7<@8PNm8kA*LET8!4eU zt}-mcJycji2BPF^*(B-tPO{7=j!{A}zYkIsrCG=^F!gSbvEe^KI`WAvF;ZpL@m-`= zL0ElSUc96Zw|u!f{b!|Y3FJL6trrwK$VMoi7-!Mr@Gu9mVH`vX*Vy^Q<loNZ6ORmI zem_#7XXg_q63Syr)->)wp`&N#6T|NX=AAjAISIw#VxMzg!{X-fyPSTH(2!7kZ*AL> z`u*^sUIdY|!(UroB|TwP<#qn;@UZezm;98xq#sJeo^j!VM_e!Jd^Xy3zjUO!-&<NB z59${RgYPZi)%TE3%=V=S{xIlK`NBr9>N={yL?Id)$|Agw?JZ0OmhCTq>oJ<_Q#HLg z9pz;9w8d0mt&%J9=Y`HkR9m@|Tgr!rs=+Sxs!+jEqheW3Yq>ux>V@hvV3_rd>8GHc zaajdIQI@mi<boI4z|5DE3sSI|yG=nk5|exz`~%<@-`qoVf)X!iknQxc9i#yy$Rl!v zOv#lgt)G_(xzEd-jZyFlA0X=@jW;JB7iAp89Aqk&f{uL7G8zY$2T<I_I+6H~b3T7c zu66J;5{aysj0Xk>oquTeRVNAwNF&i(+?U+uH&jz48BBV)_dMQn?M(TRQxf*bNPFQ> zDk<$*Wl!MD--%O($N=m_vY(f-MX3c#qDWHYXUoHdU7z(>EoI}Wk)c5qC_w4joIKok zt{eBSiWnp`x@`%2(7?T}HySs%WZ}g!CI$0cb9mlB{NO%Xef-RuWc*+eW#BG+Lm9YG zMo5nBurqMO&Pf$II7bHVUlT^)|FLEq{sz5Z>O99Aj3t~uVQwc%xWG8S^Djmeuxj`Q z#Cq&G?vzL++Nr{Wa&_k9N-EcdO7)^kcFCJNZ?5ED^w%fE61AhDvpVe$O=kA*EUx<x z5ad8T0u{uIQ-iqP!ATW;VnsW5dhmBStpXuq=uepI;=9QTrd7xoiORR_O~^cH#RhT! zw=A4I%_u8jbK+TIC75opev=Cqp5flDYybim10mhkeXU-!1q}N356VE+SJu$Rta*a| zRVVKe6v3lB{s|eyLOcSHk~RMUtg3}74rG??+zi`{MufEI*%`Ju;SyUrkgNhRlS~*+ zd;nk<`EEc@AGB+GhlGb4{$*DwaPRn#1lNk0*pA%1SQ}BzVL*A-+}d1vId^XDxsZ+A z+6xu2KxLr_0D+2sR9v7fLnX?d%o>`~_jR>J-7|nQ%;w3e&4n?1uB_U;FgRfoaGjrl zi`?%Lh49C>=YXV~@b*@xWrjc-@J2d+f{msYqDc>UC`t`n$gD*o^|>=^!x~A71d2Bz z$>sqovldwz86k!oe=B}bT2?Amqio)WZQ2S?0T<DgNJj+7>$j72b;H5c2a*DfNTyJW zTF@0s(4{%9J@L*0hha=1XR&7Spl_NMxUKNWmd3{YSM{$&J&M;C3#CS*4JRAoh7L^Q zW;@*FPJKj?`%oQ3w}MPQD@2~{+n4#QR_ZLd67rK-fmu<_pD;;Tf1KKhmbh;?<t|x| z1e0HC>4pahh)?k!WSY*Rf+y#f+etfVkJqEV6CqKK2pKdLei596PCy{wwVsS1K^2#S zQ${)pDbJw?%m>%!Q}p}GC3Gw3<>=?<z}PPpgG=dC6x2mgsq^eCXrrJ2(xuwiIWubk zv7K3q<3n!qvt`!Wr(CTDPK>M<Js~>&H*@a+-&T3`kKgBNUk%HWx4bmG<t1B|x8)Vb zvEw*<lTFADflRU!W`MMeGC~Vw7Rm^Fv;_(slmdk^O9!Q;w50|5(o#l=^!uLY-m7J2 zz}xrp{|Bxm-Sw<<&U5xbN3hbso-wNQvII~aN25;I1ML=khK<lzaDGOs%R=7C<GR%H zWtQ#F@c(Ye2*Q?==*~&&o#0YSPDin>qSShfz$!^PL@h`ogq7kNPFzjSd8czz0IYx@ zts~gs;-cGqxd^PqP@CDDIovYvtziu(tpifvZm?$HY01H(1=5Nr$XRCbn^&w8sbU?j zLz;nC1lfW%;0oD-Zp0_%09*mtH~4xT-<LIE@X(=C#n==2vL=r`wrK2sFlH11fl&{h ztSL*T4i}ndn{+iYN2HiRXcWcpfr#)?tWZYb;-iz#lP`#T{s9)@=VNu+6(5lgM6lSH zqjG5Ah)xv?6>>Ft)oT?NElRuqbdvpFxZX|mD|5RA!Cm1lFZJQUA`~Y=j69k0WT8e` zZa0FFke*OhN@3BP8Z>f@d@#rkA5iPjv*B^-(Tk3~TlCJc73m{CidUqU*O5jluj2#a zxqPIucL<%|$Y<sO_Gf;cxQIro)T($gJTAhE7c(iJr~73O2lBq8^RjG2=eNu65%Ixo zhEzF>?9a%zEg*YqI`=?<s{jbQkQ|FCyC15v=5je4F0Tu|WR5&XZdPeZET(Fcrf{wX znma^dV$Xy#is&Py%$B{7p5>xvk(XM<w@Dk*LLWgz6QdSAJFhovwT62m*U6t4i){a- zvCH<)$Jsym80GUcM)~{$?9+tvaeL__qMT_7bOKOE_wQHc_OJNlye0RC8`rlK7^8}5 zV|`1#$MG$dMKi9ykjYwtP!@SXW%}hkS6#*L^PXKO_Y7JWc@^dQL89<0{<{cENEypT zp3|Ghav=||689P7B*`sS@m$B|q69ub#^kYEs_Q!6k5zYu;{^`6HD3d!f5uZ>q{a-f z^*rzsm6Bf}Oh*ji$MhM`V#Z@X2|hnSkGT{)wugzl%?W#WJod{izKtG!mpca~b6zY* zk%DEHKXSm3CtP;S09@%Xn{vJ~aI^Rg>Z4f%+z^F}`R^{_J@!+vP4Kekm<H=2vgbIw zP_Cy2oNo|{!vz6vu0)X=lgLNF&z+m9;g1F}Q)|po1IobjXppuw#sk6sMpmg%2(aRb zqipkrY_Y*=oFQ3_>{(9^V#OiXcQ4ghj8h%9$I3FT=7}h7*uS~JXo41yv7-FJstYKf z^}^A$)rU+5iskuFPK$p(Me3g4v%KmSg78}OI1@dVy@bGUkhi6uOBu2Ubv4gSg@ke5 zV4y^gj>}#`4M?;p8&kMu56Whh8F5nyMrOTqGtKIb^Dgj_gb<m;E0Mf*n15{F^9GmX z(SBX@6L!DYg$RS5hjI+OtijMx7Zm5|=!a$zFf2B6u5f1j9HzUPIE(-)$37J7D6i*p zDl?5`aQ}rr0SZP?5IFtMRZ;QXIxE}B?oWf~iIq7ED@wb4hV)F`P+m@TnlsH`kI-bB zxn$D9CP%vs>b27<^Kx7UW*<p6iaBZ4>YURib=hdQZa8Ch<mWVp*fc}~=CDvezCF@z z%jwzu)W2%VDvK-mB~2wdV=QN>7i%6vvBr?Po4VO&Xgg@N*`-m*lKlk-%m+odoI}Nt z9xjVKZbII0HZ)qq=MnJOkG5OUb|!e8ns60CA^CZsZP;!X>XB1Y6syJIEO<R+m1KDf zUAWU3Y%~~oSXg?(8WzhPN;OTgXKa`Lg8K0aGg-}}k$w2ejrOBh<;qKWKR%7T%6r<% zm-;7U9bnWm;b-WXS{2>Tivi2?!K?fllRTRFY#;_HUgZ~IL~soN>7ch&<IfrYr8%bb zkxewmQ!vL<X|<UowsD9|on!6?L37-Jwq3No0732*?Uy~C<ng$KT+}P2^(DiMf)Vlc z^~&-WjqbJc;lTni`tT}zfF@#)+x9BcS9xg!C`_a60{1c%SWzP&_heOB9w-R38fY2b zIxyH0U}=$XS*s0j>_q%<bxBE(ursMR3fMAiwZyFeBNP||Isj9Np&<_Dhwy!#2!rjw zgkF&~)})nMweV}#qlBst6)DiluJfh6TUird*kANd?CqP|KLFoDvngb;>&%ujw@NiN z($*c+XVmTh8zZkb9+jQP{T%+)^=?X;oynLH*+1?*KoeZ}Kq=nhb6y`khzba8@Yc!Y zsS{MF7R4HII2f$c5H2MVpxAV?jfcTp+N5utcM#R+kR}w)-l&3f_TI=$606y*G{e|^ z;P=o5t2eNwI3M{cFsJZKR0$w}SH|LMF15lq9z^+Xd4Xj{AB2Sh3ljUF&Z?Iz%3qsE zDXVpte2w~Y<++^6*?aDlART7w-~_AFX#p|B_x(Gp8JX4{U_3yLqaU$9g2yirI){#$ zcq$3(9c(>%BVy@6naOSjuSJm^NIWN(j4Ba)?!w#*tuaG3E+Byi7f>kk2b8m=RbpA3 z27+L-vo>C|rb4n?&ED3o+_pxSb|WFfpxN3lw(U4?&$Y!?4St&JT3hyv(NI@Dvr5m> z6rP3daLN<l>zzpv8*#j#xJo(4J&?nWU{!mjJu|}rz_0>D#~?kjTZ0Ov6LP$Ga35TM zdfD7d*UPA}Wq0J4X4{(AFO3|*?9`yyVYFB(z&naOqU1Ek932Fdt-_YTmC>bw&kNo? zXfVcnNhviSUp6v8d9mZtvW1*+y89v=>LZ`fQr*xMm_JoSp(*SR^FVe1n1y27p3RY$ z=sN)E)$nj+GHs${Xu$%aXZ_KG!jJh}$j~a&x|$@|Pr^*JPXm?-DVi3!PsFk9{B0EJ zv=`W4D8TQk5Hac;_m#~Mzc~HDP=k#n>b4gfAC(4FM+H2moo+8uVZTXzf6$__`h46L zP&c};Qfs%-fF#@7foAL{a4>9IHJx@ek<*_U7*9GZCaKkq!GD4R@kNHaAm4$xFKUsa zP|obm7dbv!6)DtoOJozuYIqVW{pkf;;M1qubLmtNAEvwDih(|9|2EcOwr<@fl~+jH zwr}W~DEYk7g}<9HfLSh&{usVhZP;(&I+be^g#ie4=nP+UBm~WJYGlv{DNtaaSA3D_ zah#nJ9o9V?-j^I1+jfF`g8#61W?usqgZ6;PA5J?zuTx_&w?PBNevqy~nlgQ4IA>P> zr+jT%qX(fs0Ou#5+Dshgu_{<?ue%^G(?OkZBE%MY^33cEJ=wujH9@vhHTji#4Y%1G z#bDI3EVTiI6WqIZH(X>WtX8~qlpXYx=_F0MxzcPFjiv=tt~Of_Zi^u2G3eK~zXnKW zLN^x5iJrjp60S}I8(LkFmqm4fk*G;d%?HE)@gQ~ph*)1+<}1q2NGIyx%t-E>>@%V+ zR2+O15(kXAyO_F~W3PY*iB<aHb_$)+?b!Yxfz{ED38bkS=vc`v>oA$n>k_L?G#cj* zUP!%`vU8+upv2&qhWezeOsNmsmyiSc{vLYo5#USfvS4dtlK|O(EFyED@qjXqP~6g_ z1*f8o+2Js&DNM0bHlwma<LAgv1Z}WxS#yhxc;PeVtVUMrX*-?b9*fQh@9&5-99~I? zyKcq4oXAJ;s<)sg$l}BPgPxR8Px3KgF^-*3?KJcQs1^#AG!us@=&67aaqBURV@k{j zdZsQjiWK~(vwc3Cg(CZChK@ykX|S4RI4n1Gb1t3jUgzGMp4Lp)VBuo7o3ZJpzg@9v zfaotAOh8?u-LPs9Pgz6#LX~Gqow5YIk#|C2xTvV8rpVtO?4VsqHnFROK1Kn!T~@}0 zB(8*2*)3)t5&fWC@t&PaTfraDAEj~}(fu@?LibToP_oJ!!UF)n&v+yS>;;%T$Pd`D zXrHEtF|~Jm5y5uiM3#^dY@|ixjAg86BrWhAo1JMpd@&9CvU6eHi!qgwZR;+gxOk(` z7X4Jb6>ZcD$Ug}U7SThbkAZ<}H+krDZWmRRm8C+P^+IhRv!$siz5(dV0M&8kBUQ43 zE}|g|fW;?CyxKN&aN5kl4X7Ol-bkDX?`we5_D#;AKz_@t8UPn@<dKhN?eAwDYkL__ z3mo}eKe>M$4P@i0ea7lqRx_iC8TlL`DpcHn{#VKS7BGjW=jS}Su#f}>dEdfyUrCcM zao-|bBqm+2=cGg3zq5m-O);UNf&GnU4m@R_1n)i|B*E1bW}xa#Ht7?wZTmU$<^_J; zKN5)i3p^1jr~vRDYnTEr3hZf+aoeJwVU~X=c-U_+=?3v{;%&kz%GA$}u0p2%F?Z<2 zzxSNrx=<#*$9@uhC-$avyy=nXJ9yQ-qWnsdtdm-eJtMz+{3im@HC)E_u%~%H-({8L zElB;;$o&jNwedTk34I@T5KhIV^IoEvTt26eO!C6j!ijBVlAzw$*x1|H-9hp?!I4^F z;LFJCiCH9Q6FMdNJ@OIatja0as{GVN`MnmYj2^)snpIV*_pl%FIeJgHBl?b9wUMs? z-9wW1z2GuD?8mrAFTS@e=?=`78<Qr>wLJ4H(yt-uJ*G((amhQFvtHO-ilBZXYE<R} z!6H%DNbI@dfp#2GSDWadhRGRM^o_h3n~dX1!5=1%U6qJE?5FbBnU9ZMRG<%IkNykr z@BuK=!=6FNIL59^9XqATmgUX=i?Qod$3C7&`k#cMA4fP%7&=x|l^Q*a)Di~ZpFefg zao2moKl#X?Ln>d4+@3UYTvsJ84|`sIi|~u+9~Id7BbDsHJ*xENVJ|56{5ZKKKu=tj z2@11hX(kVX3rRDmTdC1%mJw3&`chn~$(5y=ajwk`XO<yizSdtFENg^p#HAd=sY*E- zmGxJgW=<gWAdpQ#y_3j4k;ju^j_{2n6AybynfZq38_Jx$q0AX^^?NwJy^L>|`CX|q zPwPiqw}-u=yrnc1as`$D^sv{IdpyzCm6l#tTIxn`h%@vs#7uEGsExj=-1Dk(kIMCU z81%=~n{|&WcRZ@xp>iM|_NMZdoH4yocYhE2wS158bTS+OR%8lKy^;47zAGqg(Qd$L z5qeBJq=)@hX=}xp_sIIBU*eu;_&t9X4kYeRfVdXS-#kdqPVjPyL`wMrdJ=?{-mz6B zOed)-QAV{fVBQ0d@bm$aSI#?l@H`}h)gL&ovlDWQ*olAgr*y?OS9eeTmMgB<(p*~F zwC#$`Q-=!L+g*dx7@IceYHu$Xq6k=o3b2cyo6n_;6%bpApCRBEkQk4#R?a-NapnoJ zYt1E8+?1FnQsF?Dpg3jO6GG;n%(knLr^!&IGymRfn@2l7vNws^vvm@(S6PgA8)CWb zp+kcn>lp}4q$z}b8DW@Y9}y{C1nO*4{xec4wQ;4AU#KiAY4j@vsHs(i0dV(C)%3*^ zL=gLp%zX-Sx!Y{H*9}ZA4KxH=44QOl9)zooO_N7AHV;iX#9YK4Mcg*2G2eNld7!<Z zwyCYwg3K*#E4xCAJ9^i3UIONd%USTK2S$A#tXzAzr2>{Hl7SI4DhlW^gdMh%cNa0x zt)vapEg~y<FE4lmfhbto=m}EkTPlph#lLLQg>m7ZlLI81QOJVab6#u=Bhh=`I;TTK z=xvrUYkfz5SI0_-T=zx(NF8T)BeVORmc?fd>>8DtXI7gm83WCYjkPwZ%4xovCw{k? zJJQYfGUM`vJxhat$U;mmRp@ZbdL|zhnN5QKAr>9=A5Q114bMw?#=RcgS5)F{_8Lrb zfSKIK5R>IIIBh7iEPGXI8qyJA7I|7i*UEGmmi1=qJkp?{*!P^@|J)`aZm!>MV^<rY zw~ef^ng=8s{6(3W6=Chmq92R>=vhdZ6dpj9LVcm^5t&l<9=SLZegF7e%c17IybMuD zXo8{zw*4lPDX|O@VT(N9P(3O^kW`a51}AcE4gwy%_xIa7MXPa9w%*q5Zyp?ME-ZB* zzndOKhdeCZ!nVn3L3?(4UH69GzMa#|%?pAE?alC4_O&<lVu%ugCfQ7D8n=nunC1+v z>>FIyhWRHe@N|qa4>}{{)UraLvqOG>hz#h50C5JOpXzyQwem*PD-OG0Z+4ZsO58<w zDz~)R0PN%WQAoH_9gvzD3Ps*^u2_S5l~fvk-_t+xkkMvcgdBet+w*$Q?Csq(y=i1} zOY`K(%~E*dggL7}myj~up#Pzkb*=5`JG1xf{*Lzk{`QW3^rrx@qDNnO^)pgz5LJ++ zy%drV<Rk%_=EjgS1&q07>jI1TkH}BCuHX@~P5MA@vn;flu#P1*iA$JWnOVo)0-AvW zP~MeApqXeDxYif$b|A48kPV*Uu=#4V6s^GRygdjPrN|*rKn5yWTAGI~q_n=Y&R>~V zl1Fasxk65riBnUOh~<3L1hJG)KwfAE$3S_u62Je?uAWeBN%^_kwjC@hsSEY&p555r z7i{e7Yiye`rLApbq)iGf?P{K#ojq7PXU*z4wSzg?vs=2BgxGf*Dytfio}eM}M0+66 z-qsLk$24-zwHu?#hjkI_j_3=-JHfaFRv+2^L@k0bprfQjytFy+Qql#O|AO*@GOrs? z<&~Dwy7MUx>Af`|d{}&_(`eD5T7vp6vHy2lbeE^+_N)tc?wB=uXIGxP@E)VhviRtv zNuj1mgCP`_Hax2pyH<s}HuQI|>#mp>to)}Wv6=lXt^NJ2E&bRfz0v=$QML@bHTf^x z0eMCckKTdp5!bL#!t3lbT*H*h*O+<@GB@ky&jD^zuI1pJ9sD`mm2wSU2567oiE*d2 z=fZQ%{2J(2%5#Od*3Ykj<xhEz_B9v3R;*r&^|Khy$^C>>AwQ>4#{k<D`blH=sMlg+ z_p-TcRQ#blFR&JyFfWgYMul&%veSgu#qY~ABVT3ltNG|lH-8p$Gv;az-rT{T#q5l^ znu%ve`BlQp)OKBXwwYfg3eT@5v|EU)psnZ?=4i~b8F(`?k>V<5Y0R_5cvkK+NniZU zn)rya@N5Sk5oRj+&47AubSfJa9_9QGe6xJTS+D`pzA0nytOP!2_E<hhItd@djYu*d zv~>y;znaPY{gYu`)J*9uaEajS^9%Cxi4SrW+%vHwJ-^V=IdNiVxy4-AF>%D3TP&Fi z^Ss`?w7fift{3#q8l8oh{s)f31&wenXi5SXBoQ4BqR8oZT+juUkPbO9GIYqKVXY=M zzV;4_^t%eJDbHXq8Al8jDe?kjW3-zeoyEE_OBLk5Mp=k4Ln*w_tT-<;h4VrvZC>I7 zFC=jT8&Nmeq{8QfYzYc|AX*pOq{}Uc)tFF|o0;P<>LsJ!QPSn>80;81NZtDk-OD$o znSBlZJV&-8&1^_7s4wWMtL+O~q++?JIatpQ%uqns7?!X{V=*b*Zs=$MEJI!Z0BsT| z6$rKse9#DKd*{WOq1ilu|2Rw&ZdREl+$V<{Bds?0Ca9kz;+vFo%h`p<&X>eEd6VTS z)bAmx=v_8ZW6`;7cIXT<^4$3@zsX|m-$6rt9d6R5-nxd-zI%cm(E#hA)d=06-6Ca~ z&0Q7=ZqybDRili}`X+w^r{9@aqfv~!Snv|B>P_aG&OqNs_^!=Y$K%F*g(cpQ*PyJA z+(ng5j(H}?Y*Sf7@aL8*(B`?;^bX15rPjR`$-iVWmZZWW`E2$F9Tw>^oRus{#((iT zf*Kdrq8UAE5FQCjmEf14cI0be!&*SJQ`SO>k-+p)g$r;R;xw9RnPr-77<LUEt-u4| z#5Kgk?pA{;ln1baxL>2;%NTzsTuY2E*k9s(vF1C+eJr6FloE#B4V?{mN=gGh#92y7 z+*xc<J&Gj^;2eqpu7S2X+UdMI!$qP+hd@wWTDCL0z?E%JPt!HQFlHC6(qlAp7wL0K zLw)YB|DOEH3@ol*n`UxlX1WaKH1n0_G}QgZ^0wMK8j6~UWFcevRMwAq%)}l|)r16r zgQ8|JMm;To6PvC0EV#3Z^Yd_bMpl_YrT`rIR7OmOy+khTteLLNSyp?s(IPdYN?n)B z?RL3}i(U8hw0Z)0s}Uh*wDhrXOLPBVL3Vb2es(qpJY+IJoD2OLhx<w)Mc}@aj)dYW zSeY>gXW;eDGHX{}BAG475@^x0HIlvV4vWcPd=HRC6INt$i2up~=T(fEAUZ@dQ7vqG zC{4>5uc4z}0Ej0}w84pKc!te+2^<*cH_C61VbW$L--5&(9uK*Gc&a`A^3tr>WLB6s zwFd*qtA_C9R`57+F0&H&wY9@F_Kd!so<4VG_Hci8K|yv_zAHP+>(0sXc(d>6stx2z zzU->@_Nv+}OGRF7=dUu-)1A(Ahx5v;jEu}IrxPhQDXZEn(6mQUnS<xJfVhdX3H%sH zuPB1-=j7ygb37$wC0Pp5rDf-Qm<*eIsuTOV++xtSxI4>cc6QAy%$Q-d*UZ7HyWGY3 zcUX*CN#DovLnWbsz7}^=&KYU<#nzs9FYLL;;V}Ri3Xd_~K1KM=xyYpn`;<A0Dt4dx zKE+OpZB&vWwozf9lDQY`Q^<0bvQHr)Eh;1}0rqg&eJQtqs+*KtGW@@?Nm1WUx=Ug9 zz(--1T9dp>Q64|Hy#K&smB`&rXqpfqt6Qe-Sxc!h24Fo|upfI<$_8c5rOM$LA;`dg zb%SDaPicn&%$$Hfq}>8@0{##Lc-z?B!iQCpcW!JVh{!}}9inm#%n++}v6QxMST&Mq zzAB54y?G3^H@h%FV`u2UNA20%laqVQ(g`?WqPa3BoJezNLd1iBYi{L~;TlRX&|Dd< zpoJR4e~e3W0l8y|E_(FU`D+#}L$|hLRh<I7J7Kbh=8i=4R_@r=#+^No8YQHG3=AHr zF{Zc4pv=f#?+eI%_CDl7@D$pJgT9zeuwPz;D$4jgwnZ|be~|UWC(wpR1ege3u^M<o zI$Rfc1(FJ3I#Z=WXmBXse(Ih1$ewt!eCN%w{Fop8RMS9~J+VZ2=R*F@eD-hQHu=um z6iG80MTX<C?<|1Q{&u=kJbJr)XHGPt$>VoIGtc|EfWNbVJu7@izVkckJ3kSh8t0vE zwokZ~?$jK;Rek3tn!<73>4sJ~`A%2#6Ak73_3+xVG)uF1>uzYglkd!kej@&p-$^z= zx|4L)2GPy#OS}`%Si=sn!{VDlA2g2Ec7I_(rqh6+c&zcz(L9hc3vu6!V6&Z^uq3=j zIDm8P?73l6Pj@Jom#s0uw}Mu_4yh#J_CZoYb|5>OC(@*S%U~d;R8CQwCc={dY!>Zg z9^7132E79RzQCl__0KmNjfh}KH)?bvPG&U?A_aEF6vRs-mMDjr42A{$dabEVZ?KXA z!-rT`rn4f$*JFAMUej(wvV7A7yh2+u*J!lajK;Y&T4pp%zyqR)=Kzuxy<cMlcQJD& zlp#jYXLx1Y$==a80O5sUR~l@i9KzLcV(2P-qr#f%_mGv%xB%c~`_nX$J49p)vDh_i zCbX#G8CIjFp2`SVjbHqNKG8;<@Epry4<Uav+Q1|-VK!dOkQM^1O~F^QAo&P~;4BCV z&pA===KlV=Ivmf*A9XMWFkuL9YW%WqI^5S+U)R@{_$K%}q1jj1hj39VqBuLa$wQ76 z5NZPP7AkR#rcEPzvK842ax!I4HuRA8dA<oL<~%XwH@P=1C)M$CQp?NV7_uNOrgI2# zjocXjj`37P9~52@uEgte!la*J!c0ChxWuNE`9!XXRHYgYH{J$`<>_4u4Q5TZl-)RF zF@3k#j0*I(LQ$jvoC@N4;SxToS^=J<Jck!sXw)Hm9S%GoS;fWVpjTX5TwPvbj}MO2 zcu;;N4en&WCt-*v7y$p3pCx}IMdSkY8cl?JSK>Exl&`@Hz*JfTSZ}ZbvZEVx&L>_4 zz)6yGi|q8sB?J;oxuYGDwIZ)39NwhUsEemP4X?hRaW|HbWW$d|^nDS$HAJC3ItdwI z^lCq71r}0gI=K2oB>(s>aa?FfG3r7#;T9U~1-yTcLpLwCuERIEM<N1m(JXKKX{hPp zltDcszZY0gg);G=co=X#ML6%F@<I_RYY-#it16+$gjlfNZWYbIm<=|Q2vJKE%uHC3 z2HXeOqF9VZ(*cDxPv4=@9^m(y51!!GxnZcYri@G;Mw5dR`g^+CTZ5>7hq^u`?h<dh zsQ@^cumQ)nVpTP6K#;DiB#)~>627Uzrd+l#)DZH1!^+ZUO30hAJZmw1Y_x-Hw3#gS zo$8nAbb4v_BKla5lTsT9VLDxw+BWUXI;YHHT5E;#qV*g6?^;T4v{wE*-s!)7gD3|u zLwJc}n(AFlgk0Xjxv%m#@IMKww1QxH1^?uKXq89<m;qgL1@iVHjvH?WCDkCIh6Y8h zv^&v~YG2c8b*Q<f)3xb_c{THv%21#d&y|$~{6<qYCwL@?)BmLuVaC0s;#M}=9=Pr~ z6~g~yVY-0d;}*3YRZB7qS+gap*tKPJ`kMM`f3a5&rwxmFnHBwCCZSBpvL9HCndaJw zevdz=qHamH&5Xhc!D;@$q&iQ1el8*mP`+<20VV#>2#es0mMI#55iJx;M}8m(QPn{6 zB;tP>p`5+EgD_RQ7`mt~t&AWo_E2THx41AL&su{<%&O`XqAHO{fam)jMwZnOP%N9U z7?HacWImb;4pVGetpEB`8LkMsr#gs}4wyz+%YMl=U>&XS^Isru`DrkKke-M8XthJ+ zmXpLJoo*#bJd<`xkZXKkC*x0nWJ3$%uwe#mE?aJ<11~l=>S@;iYrv6&%dml@UlX+% z%wm}f*Q^X}X7x?<%RJ9)VHsjpHTz}mla@4_^~qfI6R?I}3y<(#C$K3p;f!~fSQmwu zQg2bAo;pkGrtG@tDfk)QL)v+hdzjp(crP$#0qj_B^L^8uvTs83Jd@})B6y%776f-u zw!ClZ==~{Mi^w@8Ri{H#VjdP--Y?4~Xv^(3+Ty}`o2@Zv|D25t&*tDeo`t*-bHTs- ziSsYmL1P>`_!kWL?6Q!&gO26QOE5t*w0283tksb_G-=lE8SwhmY3hwu`uyS-MzG~n zQR=7Sy~x&(CY0W*U*4y1FMJ*WA%K9%m_wC(+^ZM*NM8;9AZGOJ#i+y~+JKHd*kU#J z60z?k9AknzT7<p-W0~{f>yyG2IR%GLqiAiw6~PBp_DaAP@3z^q`*K`;eXg9hH|*NE zKFgaS>aV;?FJ^ejv;y5_k?_Jv-tFh_Mt9|?27FOCFBgArA6j^uzxS#u`Fq#z+_iz; z?TjvAn>9vc0E3o7wr>+$fq8=E5I``S0|9qlCEl)42vk)Ty0V-)u*#U8MzFm=bi#CC zIek#GeA~8>g_SF%;KhzgrSjQ#w&Wq5lf_~)7vyf)tOv0&X{!SnWnOPtM!>HFr)koC z>$1Z&E$KRg!<KJz81(7QHHW{B-Lczb)s#;kXrJy#pV>Ary#hO?smH`uHW#Bf2ctl8 zf^dx&ydTBiYapg;NI1uMW)sH1nS^00<~a;1D+*kh4jP366ijyZrv8GKW!h1KR~}OX zxlG8WP-5^^qIXAZ5czq38#4yfOEu{<1{#E2XLMK#tPZ0ty`?7d2aOdSM%s0ZqGOuF zL8B-aAsckd_JUrFVi2R?ekIB(fQ4025nK##kzf=OHKHzb*mAH0D(}Q6J?>&K6|njm zS>De&i#EO2u1DnjR{GtExK4P+P9Xa+yr<EoJJu$a9h0^K%%_Ia7al?*sBNP9iqa-w zMMJ!hD3+XaO66#inzKo-Q%kR3k7nQx5B>~|TFqa;pPbsPN1M~pri=V%lyQy=Z7vvc zOMFV3vMfQPB*+3xDS&qW{{0uANmHoP<?0NX(D?Olef;t7;F*o4hp*ke`^Ye&LGS}D z=b+`5Sj+NgSMt#kwrUU$0ZkS`2(_G*I9l#IQ>sD$nnpj6)yx>`a=E%f5YVLa_wPR+ z1LmzB*}eN(rPa6o_3>NK3%FUC@QQd0lItKgt5l1l3s+y@SD}zdzKUKKL=Uk&ngEaw ze03_0f<&X&ni>r`Ysb+O-gRFEJwM#yQqePS^JYC1-ayZKpr@xiqn^;yBI(YS(G!rJ z56F(Ar)1HTPn$RfJ;_()Vs@dXLG6DEcFJj}YPbqCssCdU6Zjd^9wlL>SEfM?4G(W| z<pb0}mkW;De@!5H0QMGzzQhLLnAtj!Ff&G92CxDnSb<!@8!pB?$A!!I+$%^4$Jyf} z<xIfIYqWoC+C-e(Ynx@H<oLmnl0#`ZTC0h*7Q;y;piN$BQmO$R<<^daj!kGyMn_Hv zs5KQG2|YPFGNBo*%|&ajgt3v=NFrP*h$y#qJVbnS-@X(?+<Y8F1WcEr)qz;6F-(+k zP=RIz3FBiN4+$H`AmQfmk&yfp-O-;xPjJ1Ag(;p9E?j$oUjq)NT>IZ(Z>R8)_!v7K zjD@N%IS$9sl)`NcWBJ5k;xUdr@R3cD>x;|W2HwfO_^R(@m(n{Uo5p$PjbHhljr^U@ zrM$C;`NYSe&ph$i5mTselrc_=0x(6MLhjfDRK~QAUXK|7<j^~Xuli1QDeX>?O=I85 zZvD#dY~=5JF6o^jJO+ovT5$kgXhDj>t1d2b=-?a;jhrlO%uW_IxZhgPg|emOw^l)d zh7Y_|S&%p@g{hLg9BJz*KK>=djXYx$McXrG6A}qXd-qBRfkQ>>u_uR2Pg|Wnr|l_| z#ng{*>YY0!yR9ET#y<^tp&4W9jgP6W)<bOUNyk)GL1U_+G08wqm3m}ohjtYik%{l3 zq}s%6jd!UpHV~6C4!B>j*hxu}2Pa9;pe2puDH{f8eL8i3>S^LeuuiOmkEt~5#S&>~ zIJhuIuSv^7($xu;W!$+x-ZZ0a%qMG6+s0I$sO=g>r}|~)=y=mX@^X3fL3TNGDCvSn zK%8ol1gwF(9arXhigUAZM;cfmaxWq#KT*sJB%kqm1Cp30+S3*oC9zv?vo=0V(qCFy zT)`>bLGqqaf2+k7m;Ipa6om@*F1s9(aJt|YvcnmW+rb$Sj`Xl$*pWk8IMsqokoUAI zeM8WMR#Ww-=HhsR(y&PpJ0FoXt43MR%HCDmmis}PR*Q58wscXbL;KgFeLLo3x~xC2 z@uDcH>Vw3yTzim_G<WojtUR!!r>A?;i%ZKmBk343SIH+ZnAYUkdf3Eblc`IyHnMlo zSDHS(@wQy$t4Vj8g(8?Sd*Cl=_MC7Xp{c_rMl;8S=CSjZI#0<nLwJGt5Pr?)<G-Mp zunV>lu9-+4v)9{VN&=9iAyO{@rNYY`N|ScaxV3?RlioZIaHhcGkTPW)_&CG~Gmv>{ z3a8Lh!{!7EJ#;h|N?KJ<#Gw$05Mp|w6w(bfQ7ZMumUaR%aU$w%Q3xE2ilA?M_Lx!h zK1RJ0PtGtsWpk7`txw@3r+K@;QWEtZ|1==H9pfE{k2isOf93J2lpW*!YLtCqjEI{} zDiKeh?D3P(==3A>cbB|JnN3ewoh1%s>l)`Y!A^xRgH`hJc0Q~Uc6p?-LXA*_FRQFj zOH|m%`ZP}QPrQ`S@5$Xhm8C(Sum<q9AeifXSS9#hwof&h6HoVeb9%h#lQDfeFnum4 z-*|Q_R7@g|7?tdz)1=r=AysU<Ld}UZ$<%Z^s42bEBY4Bb<59>sbp(e$rh$~LWo(lV zC!jZ{j)`4RdZSXucJ?CJF3N3kGR+@mmNb6~KN?eJO@!e42Xg=V1AEbeP<VX9AFO9> z^g2|pU5aen{o$Sr)cY2ismwG*C?L-O)9yxMP56azGXiug@LSjEG_#>!;W5M-9jS9V zgf_5!EuC_}OE5^PCTwycF4mEjg9j^+F#%i?xvV0F9lCZ|ug+BwN>;;v+NLeWzNuL} zjRFO%;hAM=CZ1F?SXxU-H8st(WsN+mrYWs#24dL<mRrq(w#`VYxnQ#msW3=8)HyNF zWToVq-Q6Ybp0KCXjF^YKiJcTnO)J|fw1~y<jBXPKg!_k%+CeCtIZ#*%WnPmGHL98d zqQ;<^<dV;__*pH^&Xpg?hQACF)8W2laI~atUKE6WR8tr_T88%(<1*&WfanD(Uxn?g zpBwLFexRS6jtXM80JLD?75JOvdr@-%dE49D+Xvbw^n_cRgAKJc`FYuy4!a5Zz7Xda z=#LtU1s)U}b~dru;6@3+>5u%4Z2M*O2SD#BOLSQ4HW>U~uis!OHAs@d-yH60uEsZg znZZ!)^;R1UWpG?JRR?=|gMO3IX!?9`u(1)x=?2NH_c!%~oBi})DQ@@qaJ%}No+iKE zoN#`F{8-~4pv?zpTcjz*%nybqlobNP4A|;>0C7x%n0hTHjr*7)8O}~D6@eb~p9uRP z{U?vHVmeZ94G8_-mM&ilK^&zXs1fBTt1KC?pw=Z&BTh2`29XN`Ferl{SHN+wl+(Ym z9NWZ|LD6cOXR+$d1D*W?zQKVl>(5*Y)rQ&Hy|5l;!9|%yeQzMtRn#AzyDG2?H7hy+ zeiIDMQ)^J{QS#K(R=9jFXa0g&BWo=@;s1cCZKT9xaTHfomb-lU_Kd)A+w8SwQeBb; z;ostO;7^8yh2eS7)ld|k9$s~N&2AgB0-~&JH!Aa*pfp8^1c`}e>?<N$i5eEXP6Yzy zEEdit^>W?QurO&tUvGDNYfH%OYx2Ni>M2Qs$<&uc0Z_obnCdB>tz8Z($>yq81v}&B z(zxGp3|Yk|PzQbBym@=Cv~`ov*a^L;P3pE@xo_Ti1BjtoVzFt{CbjR(xP|21+ixd~ zyd`62`=m6j&9dYjm{ymyZ9fyaUd&dMam3$EJ8%ZERAyU4%{HqUIbcfp-z_x_HW-$f zAVrJV?czJ|?wcp`v_*nIr~_v;t(L4inm%~#LSqg$2~q4ICZ_<_LEt7JN4YcUy6meK zK)!fND2EK(JZ_96HwXsEz!0CMMlLDHbAt?dF<Q!1#W_%dWz>3*-U&ILeuULVj*7CP zoiyN`D>h`j%{9k$0d^}-Z%~f36-abbTJGhaky&S~#n>o1Yy}`-t}r`119g(LI=z<G z9<X4w#Mgd>y!HSI%7JfK1OP}~d%R)Bw2|R~{+@6N@}^?tOO&<GR85(2V|hGtgIlEs zv?Ibe5DPMj0|AJ&I&e3SG9$8$OagPPtasnM!A;%fOqzljx&CYDla1zNH&zGxO~$N6 zCQHxmnf)u8GCVXZdyDHWzojpc!;WxE_kcypnE$-h*f6)LenGnj39wvdYr2Dfq<M47 zt13MXtFdZ!YhX@OjmK(sNwze*mVait{q;2-BpDU49}42N@Y$#bRYyK(iwPN^p`O)< zE3oDU)Rurdf*?seKB0BU%#6l1<8TA=FtmgMtqrY|sH4Q~<K6{U6R&C$$Bp<mvQUs_ zhv-Kf4ERr`#3p3!vvF<Du>2QEN-Wzix@i05H`0i2gtHAZw05+$f6XSXL!m{pwF#+q zVPvg0+cvE`V@;FQTqN1nAvkhVDA>^UCPvl+b^c`R_%0zNpq2mt8v8MP@Ti8jZYNY0 z<h3lW06=I?gQFoTmBU3SKOZIXLixeE>WVU-8_!Z!I0<GJNSW#&6kG?uD_P-`YqZL+ zzQoKi1m$j0W3f!0GR|zf^fr{sdlqMqHR?N;^3-Mr&X4>JiY}f+ZVRpdW}ZS056$LF z{l%rMk}K9;-Mfvjxdu5t4v9Y%rVBSd)a4K%<U%%cW5;X}bb9y%!KN>XCQ&jW(7?oy zn|e1@h+(3H6~$J{-OvI1CKFp^F@qt1$Al}~@ui-{L-YdkA`3Ia0*crZ*eKDVX_G-d zOMIT7ucX4~vx0EK$4q8dWVaENzk;`VoQe{<VA8VGZ3T=CqLWl)@zPc#??zySI3)ol zvIoKyp7I<dGeTCS$wsr-5kNdFhnZ&0xw}TUhOy5q&N5~%YHk+4OA~sNk>!@;<&|W6 zOE5Er37E3F$u)+&oQ(A1VuQ(S49~RZ_Zc}jx!l_hwVu&yvgE9v+*<)$LV}+OKAi)M zs?Vdxy)9F#2y3$OXMlS;@fakEL?xDwa7J}`Qrtv%_OuFnna_j7Qcj?o>_nk(moaT8 ze#hvhdQwg~Sb`z2C|L|5?5DOz$%-cbd<4EoBJxp}&^4s_K6Wi`yo0jB;5WRGBC}*o zvD()#WlU+R_IvZv?MChu3BF0ODDbFY*?9(~e_BGt1zg>ux_V@Wn#g!-FeqO@(qc$p z&?`zi_{*!`)E&SrwxBPM?2&9ad+^6<-h)0PFA#m*D*sgmMCoQ>RzKH?LMy%uoipSV z5m_Z!L?<s*aHm80=?FQHCcXq097p&QgcI1%Pzm7sz<A^c?`dn)0P;~zTmWYTJu$Mc z6LW<94BLRogrV|i?XHfNCi00Q(&aG&Sd+4`$AB<4PIXKTajG^pL;FU}qf2;l*7Io* z&W9(R*>*kw;raaUl1DTa;{vDUnrki2`9`aFiz#xHr)~4vq!uX+iKJk-NW)hfPGBcz zqvUbvjC{z_ofh&fR=p!cXbfrOrGi@wiy;9O4#UXb2huhh+`pFiVUTU4*Q20%ku!W= zfe#ju>BxkGg^G`d@7q}4<S{d|?Fs7n6E>;cY{gfr`3bAJ9ijg)<~B*T9}szhn-RVu zejR=35k3?9!G5O+`umZ0zfMsH#C<0?DSVmU8L9pZ57KDyG>sz&zCInax=Mfsw$x>Z zWB?T`a0$}XY<$20i~E&N@zwbJqz05(_yqPnfpt${+d0eLZZKSYvBA(ny!OQx8%-u7 zN*C}m#FXO;&R<Vo4_!ikaq*Iijm8#Y!7n~U7nR$=6orHq<UDg@j79M63xjZ?tOo%Z zCL45?U<@(WI_*rrm~J7$t+l$zCvebIs6cGuWdw@P7|e(<?whvG-(l`h*%X_|P58zR z@Qq>D;n-Pr3yQMRbyQ}(3m`>H1Yp7vs%QDWcn<qF{IU5M!u|wL*_fLF&;@P=oOH!K zO1a~c+#!`hxl=pLm-rxG;+^!DDc>0^a@egoJ^eiX6)WF@IE=rGec(Ry_anIshnmC? zfjHAeOcSvXadyfZW2|I%#C;Y`0W3r|X+y`I^zpjKlvNLhpdyG1R`Z!1NW*V6zv<T4 zEp?gX6*PhO<TCzu8b32&HG|?`#{W)*%McU7LWsQ~ULfR??T$pPB+CG9U{hQ*<drm5 z`K6ORUJN?Dci3XFe)N$Qh0RT7Hr;NurA6+NK&ee5mNe6iH=5F{lO?n1&*ltUjx9s_ zi;-}`jg}wfE&IamjMSF7w-O0*`GTuTwn>zf%JjE{HdXSqi5rX95h-#P9M9}*I&4B_ zwKE~(UnJh7`OhY^G}$Wm#WG?t15PHQ6K{)qpr@)7j1LyOEP|-uG#O|(U<R@i#+V8V zGc0-k_(vY**~X@)*=WQTqk&*z6^D<jo-&)-@}#wEq`WqhS$~7ckyc=H8gDQ>l|ULq z=okd{azZcAvpOhNQ^!g}<?cmFrMeh|vWF~@yX{tte3}iLJ@1k+auN083<8J9)lV62 zFl5*Y($Kb^cWKR9-X*yo$TJKQMRqTNeIf1wrEL&Ul{Jyd0?qZJjuaJ!g(hY&v>Aqd z2>tLi`0D)?ctEDR66h|$$jRt#>NI|2yPPoka_kId>*dtt%dO^)@6rJF@B!?5+$LSc zDd}ZIqyfC>@l}!yr+Ly}x&J-FGWI_ESnvoFu$nDp$TL}2<&alV;j$o>gvcumYK|D+ z=GC9%7ClI8Pj_`uZE;aWUS<*UcN(4D)rD1_{ObJdBBx})FXdukCNdMpE@l*FXe0w$ zoZFgPAxS2a&5B(*w=K8aB$<%VR{yzr0huV{7jPHVQtA<Y&;HJ~0Y@6SA76z4XKKck z^3Z>f#)D}V@yvqUm&Yv>`+ONbAMJgl+mq8gQVwNVE+0E=8d7~>0TPE7X7CXeRJ-%5 zUHB#G|ETsX%@*%invMF^DQt&T{xswVnjm|5XVbQY%t*K<u$g3)p}-wsvMZdW1WKh` zK&4C|b%x*wdMRrV?bOK$La+_6>ur%A6B4mYh}me}4o^!??RoJ5@O1FAsn^uA_aVQO zB3eUwxT>ruUoU6~e^nVZTh?4)x%qnIFEQtw1<z{G%3-61tcC|>S5(aIZkz4*&us0U zQ&~yht14%=_jR~BVVVw>v2O*N%6dAw!u6di+S*ohP7HSsbe`VYdU|JHXJ_B?Ey2NX zYipQw<IgTG!K6bUakKa`c2NEOps;o1EECfmsJsa6c8~_RqM!&P^;dfq%tcyRs~Oel z7t9GlJJ2Mh)%eBE=}S4lSJxc-$;{=LYK&PB_lZ})4>Jppo|R!BiUAP~>OLoJA=$_` zN<i)oxiwXG!<)9Ep(5Lxdb|19iyPVKckJeTK%Cp{KK2&An(eFE1GHiT(Pps?JZ7%S z-JsX1K*)Ou;XhsG*vZ9*{fPRCRIs1p?=$f6K}}`&+uTWi#rKY7as5>V-f6}=k(2cP zwD?SfSdhu2JkAL)WiMed!iEwpX4Vq<saZm6C~FK-_Awlf&1OsFUy#e__XrxEWU-rB zqr@7`b_*{@GYvs2pP21tk0nit{M#l?lRfe>F>Bw`EWqq3s}d;FD0!Ehl=dgaqfptz zCyd`FpT!Kr=BJQe8c`Tl^SQq=X3lo9*Gwj>Gjfx7C$=;*ydsXdxh<dqdKzTRz}qXZ zChq(+S`*moxVj{pRE;tOAQTj?002c`s4O{Bk&(L&vi38F>OEPrd+Zj|JeNH@qd_Yk zI6KrVHV1>vA`6A2{Tl|?wq|!O3!t>5#Tr<1?Ygq{dshs!6oh(vL;0;>mq9f!-y!(c zRSPp7D))$>;gFrF#BUBsLhyYjszL5tZBU5mbX^p~nUiu-HU)R685ek=9TZ7b6!)qp zW;&7ykt$39XB9w#GOiKyd8fkrYrfgqTV34?H+Pys#FJ!o_>1eaP*(`GtHm3LoJZad z_4S3AlP_pFA$>)mC&T#$@y$A+GWxmr7sLfpzO*(twk~6qp`$f4qGE()H#gQ)YIWMh z3uaBzLY>4kCM}fmbV(fV5;XIqdiTROAFdTf9h7By!D!MO&j2?oE8bg&Y!IO|i>&bF z=K2z->#4cA6Fy_+Q%X-77Fn@DBJq?f+&Io7qR6E)u978X6RkwjW6<hXj*hmsmzPtu z_R(ddOXtmLpVB@up|8BHyfsjlQI=7H0txW6E>D9+7$L?0EYcpt^W}?lM$N~i#C4*a z4G5m9tB^CK2;)3Up$w__?WRmB+F@i;L2Q<GO7DCNj}f&7C9^i-M2u)~y$d;3#CUEM zHljQ-VOV~okdm(?-mqXoyPAE)XEA%)Cq!;e4K!u9dGb6)H6crGdagGzeGoZY3V6;I zpV{o`7(~t%k4chqw&dpF7QsLeqecFiIK&8Bg+r`KUdH?csJY<a?j2`uTz$IHECF)N z1UYnBg`6>$73c}rk-wHP3DAQ&O%?`Ahm;6E8CIvpY}PDtn9>cfu9MD9fuW|8Jc$I^ z00;Sb13j-%AgOiS2a{pxI1dA!TDNUmzB~?7+YW8JX#d{jTbFNHzxIUimHB@FU&Z6V zoNpYMD<0?Ee*q4eQwGcl{W4(oM4m~7%(LVZ0A?~Kx(e8T2~<xCy2+rN=OKDtCQKE( z#g$)5`$2ht!3&&>3ul&bwI5Tt_9JLkwIAkSO#8vAp#Atdq-w~C=$sOrlM+<|+j6Sr zFHtMPsyH9d|6qJUVWVglCxbue3Y%hDk)fmcptx4Bk4OrIb_72~2s-f%Cz6yUb06aB z5+ptUlIoH}hoCMYMadzq98uLJT!C_kbR<W~f+=fGT8zfHc12Z};5h^Fp-sYS=u4){ zx(3>ts3Jx|g06(CNS4IZrsRtuGtNkkbW+U<Zl&BkCw*TUZaT&HWuE+fr}V11^e>!u zJl#(m4q|*&s@xajie+w9*8R}_KYBCqmj^jRu=8tlf}drt*`#3-2cQeTlPg-d7UM}e z3&ji0a^25e?B8PAm)HHoI~-#`Q#*WI-Op`tg-^2Xr(GCe{}8u;b3u-cVp5;MU_sfj ztXPE#frrNmCfG4HKp_P!F0@jolL`is6h7eKMp|rPiYr`(d$k8}tLfkg??e)kwif7n zOTGA0A{i+f7TiFBjwwbLh-sj;If1(AT&tpP+So3uo4n90A>d3?$n{N|+GTx{2hnJC z1Bjw9kiH4pCH{9B1*U0?sR}2oQNM5{`%o+cRT~iY%Z@?i0<$0%7y+rYsS1)wFTscn zNdh&&$cig7XMQc{Kn=07iVUniBN!x;VRpik2Gb(>;VFn0=DLajAN(ZRTbml|YAVao zw8uyPY@n87bObzdEv_Sg0>Ge8RT7MIProWrXBK8@jXKf;)D#s~xiSi~bo{3*Z)X%{ z>-75A)y$$y+{`Y^Yt1d^S^}F!tBT)Nd}p7lSFC9%S7?XmWe)ZMy8{Cv{rCxW1nQV6 zQ~arnxmVR|WI(TB;ChYP_;^@mtY0>bE~&>Pqax!5k2ubTL}Yw0FGrGPR9++lQmQJZ zX7D2QP`4TWooo1x(fA!huA{2Rd7IIAo3p4Y^T2@v8CF(dhrWcBTQl5|H>_5RHS)T9 z%ljXEfL0o#2Q*IcdSR-tfHe#q%>h<rc$lQI>tW;tSI2adnZXFoPR>V{e9f#}<Bw=# zk0__-g59I{1<64GNhx4$6!aQFzY^k;An7#HN&pxPt+E(l0Ovm&Mt9R<3-Vr=MwJHJ z1S7K3kM}S{8#3Cgv@+=XVB`a|r@kWG12C5~T4{IcTd?o&9-RCoM53on6NG6Crp=!- z3-dG@EH6i$TVGj)4HhA!&?EAI@a<x%QDTT`O1Pn)WQw?Up38e<go6M{3@Rbfs~JZr z)$A7!r-`C8>&P0m%mKM!wB6rkv$uqXX3v`Bt4p^@<z{P<t0+$tjR!8@alS>PF(2B~ zIa-km?HFi?e)V&nii(<9RaLugxvaE4;F*8Pw8&4&VdtDU;>mE8tX;f#U2awy?GZ1Q zl-3j!y3>5yHl4E}w<%b#acg?E!+_XoowS8z!AGiNd#D?8MtNi(g)c=lbn@N8&aksZ z5AU`1Hg{$Q+=r^jzzNb!i|*qj2P+OkGOQnq^d#T34UxrD{Xr~=JNY(ByCB~L)f{;F zUJWeA8Lh2Izti0sZVaGde`^~LqvzRrmHe|LyOHC7Av-peP_&Ybhg3vmWwBW$-->KU zsEqqq{C0iE#GcBMx&>YBbL%Dz9QLL&vuP3{FPlo%fEq5fOQC7!)CFoh?%F)><c8~K z_SZ>)`R$$aORERVYDQ|SM{3$;lwZ;@K&2SVHrKB;7>$w?9AvN66c<;NyR&P&k-HkM zt7)$Z5uM48UWe+V-$y0^)U^WRgLGKpZWysdaX<WPcqXJ)9-fEV3eI4YlTvb%0!a>$ zmwh8tC4r(vddJo<GZ2{B!0fcWBc^Z)tZ(p^Vprm1U}gX@LAU}e`_8dBP~m{4M9&sW zv3|WU#UsXl`cQ`p=?h@4NO1~Nb8}I~WGqP!PmkFv^wif@m3xYPO-j0CB{^4CHrJ7I ze=thkMw}#<rxCNkR{%JoXbrQVy#bcc$|#FcR?1fc@5p|0c_Vzorl1nNR8du4>1+xP z%_*OhRkygee|ZB;_M^CBF0U%DP_NW4>fM|Z80hrXJA;AB(8blg#qf4Ol7;;8;_Uov zTV~^6<CIWgL*2AMbq~KJWx3*)Mw<C0HmxwrTb1cd%dE_H7o=IB=F*^U#=o&XKjB=^ zBw;<*ATOH$Qi#dY>5Y1w5i|uZ_6F{=2`7=2C@uo$B0b0u2$;rTS_$0*<e%B3qF{@m zEzz)1h1Z)@JlNOW(H08U*OZqcAxmLS78-(67UV_JJ!_%bi+KrQqU4A+C_4#mvl^fa zi&aohoM19=#2r4#AB{ELvSi6EOPBJ$Bm0Mk_m51bzmtdNQs3qdH4T?QOBaCij?q)t zPvxHa3q44rCk2rHk(CTLNwLTAl8GY+M`Hgkp40F1_0RD(xkQuMY|3;_^?0T_GbPC) zxthRAYm?>>p0C0>K8s7MnI5xfF^H-&3N|`r0!>D(2?X7UnKbHGBu?NWK7muZI^`+s z>*?(8>M!mnZfgz&13asZI*GPZoy3^xjR;4KR><i?Ljj&eKJ&N}xF5c~=XXu_7Pg`M zyx(CCby%dD^FnzAJ;$H1)hO!OgFKm?rH$4#dL(Rjt~o=p{H!`7Z$5Cdirt4ApQJtR z!+u|s$M<`Z1Y`WBY_X%tY9MP|Tg|tPZ1|+g`-cJyl$MYPAHam4*=K1aSLFNYPa|?u z-j2@#$!chBHdyfmzX~Nw0Z1OW1VaISvHL92cj+E}qvgBw`8)bEcW&(K+8VMF)~tnp zvnZ6YOW7)pEiR#%uW~g=KT)`qV73Vh@PSm^P=jgM6mB$j+4Hh8IMkETSoWq)hI-X) zj<&+<CRJ5U^85K;Pi3Wt4t8n9fZsn*A^#nfPkJhe*7il~goiYH@%kEB6y`aBc^<DW za%Pg~CN-@We&9xHP>v6YK?SF^l#Zl_h-=S_R<pL4q@@4+p7g3BY-ED)h^7ONCS{Y7 zgJNm8$IT{{r1FKXG3oaVYK%5zxmo^={Tk9-fUA06fNCBI-s8V85csyR+W<K{*Cxny z>kzy<kgWw1k9<a?rbaFr^wyi;-U0B5ITJO+Sd^Hg$p`<4jYsL9#it<l6^)<ED<WP^ zvvD;q`9>v{X-XUM=lkeMNI)!OOw3vVNep6`iTq8dk^{New3(<!xKH)3@sfWH0d)-A z6TYb?pIHA=98sQEdK&AblzPG@UCcXu6aNdVs7>0#yG|!0+r{#l2EpHqh)ZDstpX0B zdY^2A0J&B2^AJ9{$=-k*HZsnE$~sj$#Iu)Rq}skMBh$BsVL7=(>~EfxueVx}`-rt{ zn!1loXl?BirOOX`Jk!tV9XK$j)NGfArZ!7@tK{ylVXJjR)22_-5$%LALVGr5vIsp1 z;n!*5`FWCvD9TB+&ls@JSP(|YbVh@2C5gKta{q(VMH%2B0r}u!zr^9@X1~9<SP+^A zn)|~Y{*b>ZP*+@4T!|3UBB3A{4B8M_LEykAIh!Rxqo<5<P=G!Rmr2&;h8JESgzz#| zz@G_jV>A=#=B(yf1iGV6DRK<o#XAq4zj5Pv2RGHXwbcjO+5&%t7J_}BgLEJ47>CTZ z^vD#H$b%XC*cSX?w?>vowpIJLZQZ|b+qV77Ck+n|4h~Nqd>+25gpc?Gcxx61*oDaE zmm`#Ms*@k{fe;RW;Y2zZ09lTJqHkm<<wS;Ld3ou$7eD6@4WO3ICbVY`Nol5~rZfah z&75h@K)|QfWLhri_0n<}tqdTng!zrppF(E(!>Pzjg=6HY|6`en8vOsY%mjtX|E0`y z?2%NNsWt87GE-#^d<RKpTJ^jlGqv3E^%KiXzu+=cF=VE*b}BNHBg+Y$u%tIaW@_Uy zQ&<oqhsD#QPm8iIRe(cj8T2o}Svil?LM4yXc&=0gumVV;O8%1feQu%lMvh=#o<w=m zCfy(VCZ4XIqy1XGij5jI(R#(j=*{mTe!LL{p%GZ*1#x=xDe+ywAr$f6!Dy!LjkxX* z>^#*ebwvb2!RY`9fr30&r<r!?B-0AG1x?f0yTs{w!|6J5m^Clc84+Qc@OCAp$_yQy z>>#CVz;Yu^wEOb$#u1bhYsAPzUeHa0t$2k=((N*(nbC^fs9T0MOa|TQ1|-al3@T$t z#~#<lM^RVcG?SB~8b_a!w2RlW^*Y?H9Ew|RQdtlorE#!XW6nedbyd3bv}tfinrq4M z-<|XeUDHWR;GKf{FDsBHKmI)$jch_MpT<mU#MdI&DU;5;qMSJ@jzpi}_q-h0K=(u) zIP;YFF`oKu<Q4wZr8x7n_#)2yE;7p3@EUO$?s*!#$jKtt)LBk}s>m&XlP?I0z7Usz zOC+$tAAmx%JX#QaI{E_UshH0!#3KS;Y8NqA@NFwEA>TGyJAHEeAC~R~i8+ziYbI>L zHHh>M{n2VV2eHXUy<sa-d0}+6s4x07G+Y|-)yRu{ygHnDN|=E&zlr>ukIpVcqVpM9 z2u^WyWW52-#MID{LTpQn?;DXnMaUf*+kXjm5HWJ5_(Ak(cw{PE+$muu6x}Dq%3U$M zdnxu!{2-2t@ozN8-MkkY(TkH<hQKW*Q3FDGo>_4wy<GlA5r>g)<Biv8_5ptpC66YO zkS#=^q2pllk7aCLhuN8`vriB|NX6!B@YXB%ThY(sVlvH73fd4BU&FC@t%AjPdny(; z<LwXO?S#b*;V+57<1{)h_BL~TohxH+!<{-maCr{@<!nTk6pS_M;@C^yF{5kHyC>1R z907TuGZLs+3ZsEI*o4t1GZ~RJ#9c`3@W)wVvXwi)Wmp~M;s;ivX$5f^D@;a(%Sdbw zHFq)BinB8q8(8(u24aA(Y2<~I;f6qTnf#V0JQ0d@m2iH*xf!(`8?iW2JC;>i0qK+2 z8LP>NhB3O^#do7mAuuFYnEDWQP$Hai5GMJ(0N>Xm+a<i`@Kv)I`dg+Mb%nF(l7Osx zDOcu(K{)WHoJL<G<sJgEC_9+!@}mCGdn51nNv42F$|=at;a~bDitkQpL!_F~<@LJg zvkjGPKm*@F?+yuOL{%U{0dGH^Y>8k!!IEvsa@cXR<fBUT<jpZ2@A|z4#BkxTrl(u! z5Z|fw`ReL?zS^LC!b%a}kv-yHqmOCULm$6b_J9Df!jNYpoCB9drN|T<2}!hdkxdFE zT(p=<M#^O!@@FE8CKBYuZsrd68XfE^keTq>5}&Ws>m!>2P?9Ukh#%$pW9qi7TvNpj z(wjZ*a@x|d$LNjbT9nJEc01J*5C>|EQg%(T_*Y3XLYZ!p4B3r7`i?}?dj5mPbS_}| zX$?`-lh7N5&c!L|*FkVtI&Bn@4~gWo&`yCrcx%)f+bNRXnv#V9D>8PUcv;>j=J9<Z z&Dxs0PvG6^K2gG+96CzITB!iqW|3j{hu4Yv12x}ZbRYwAJ}Ui+THQu~F7mPqdNP5@ zrCLyRJZ3+Z?}3p3>!=k;kV2d>w~y-=@yDhp_T!ViPBtH(((4@Pomc4{;Fu5_u!7du zm`;+V*(cvB!g_MTdtJD<a?HKz$WW3&&#{+}i|J`x6cJV$e?lo$15F&nNO;F8J>p5@ zT;aOdjVbjCV)v&sz^&V4;70VIfNHLuY`4!{YBc6y_4(!i&?f&kE=rP;o}X<{tI~KM zZ`9d!I$fc|o|$Qv3Umg&Lkmr4xjEbGZ}9&n-=@{2>C&BPHit>?ghtjfI%=pbEo}g- zs2oIr;0dcW)t8|cJnkEHjPbQVa5V-waiZQNYR|Z7fFxb6I=g%F<biaOH?2h;Pmz_r zrT=DnfB$qVB9CmPg@vUy$p_Us;%)?SwQ#M*g{)yu2(N1<Qw=lrh-Na9-lJuqQ=HBM zoXb8%KG-pK2kksD8;n-E#Szpvc^6c2F7av)Aqo6{fs$tnSq<JsO0Y;wo+CD483<&I z)AED8lBv!l)d%=TZ@)M))Jg=rvy=Y9X-}Dj!{}d3UO)c6rpoKb+uPu@umpm-yoHwX zeNJkI{E@n~QL9m(@K5lVCBhdpE3!w3N;1ZwALK9+!%!82#-|O0%oQ?fp!$h|pz0&z zAsy8i_%dkvl@Kol=S+Eg;b2VSNsvyAcbmR4-f<Y0SGSx?3Mb-{)a8vsc`~Qe$$6D# zSsha<uX2eveGH={qSe#crmrqv1DsVL<`_>Z$V7rLDaO8^RJ<lEUo1Qh>H3r<mDJX$ zHJ%H7y0}>VM*O@0p_esq`f)NT9S*IjQu?n>ETtnWKi>Wb-u}OppHqp}cpP|FlE8eb z;<HRWma&yzM#>#;cE=HN8R~8Ogij!I76^45a!Y8pz{U(^{@Cos%HE-nL&B=#?;q#W z{y~aRdH<kq<L)0|4?D#XRIC4(^SCFsp``M;F&hf?W~`p}%v4@?WISG%`oPYDW}#F# zL#CAExIG@fyIAITAq1QPzq=SF2#szuh2K@;Y{>tbjKe44d5`5eto9hso9TBu<r8L| z%=2bd7mFh@pG!P%z$<?@82As6=IE=Dj|6}8e&A-25aO%shmM^`W+pB(tQJURo*LH( zrd3vOBohZk{T*W$ih#bTqnGsO+e)$da>=qTsh)iFw8;MmkD^Cj@h#NvKp(|FJxe-~ zh3M(?%K2~e^Y8wO&X3~!)5`g)`1$vr1Dr-*jV@9~mZ%?@O)wniy}5<!IKzl{JE5~Q zXIJ3OXDV}+q`OSXZFY*&l}cL|W2XExUH)@o-x7KdpEy|LqgP<I)V|aTJ$wa2U~l06 zgt}>js}xl`8+^VFPJf81opJ)t%JCL6wRfqDJ6>-`PTcSH2}5AfgV8gDy?izk*NJP= z#`*w{*Taoy?M0fe7q5mHm%iW+LBMNbrcfiUO4)Z#00F6bq{7%Z#LT2V9~LvC@BVMz zyaI2QQ6lNhn&_pGcZHi2*s2vK^7WKsrRBxc&|*@=G`t$IwqJEsL7$Tdbn5TZV<Vpt z`!*}q=LBekfxnEV9DmvqrU<kDA<Kjp;Td0j_H}qI$OHZ`%)Z(R-h5EhM&A(UeDyaI z#K><Jwdyy{PvpSmV$GL%bLw8|lcxgRO@1?=T+5+6SC}sEA>^r>3l>IT8_4rd(9ERx zDejM|A<tZdPYLYcIG0pCQZ^DWkRFLpLXL4$d?27Bi5rQ}Mu#R^q-@F3&rxJD$Bq&D zJ|ZIui>wldqer=XH1)qL8yS+cTuE|K<lzy?)M}D?q3XiN$SiSqsGW;MTs&%re;h0W z??j(~$|xJ!x0uY9j(Pja+BZdJOV++6_v@)q-l2gB{A0>&@g2EeEiKeL^b0G7P2eBG z#fS;o0%evcRKgGY5YFFh%_1cjzN!EEVGUg<tP(a0`>>aNBt)3R&SHDmuf+~=P@Jim zu34m6qq$d`rS)jf)4r(vjrK3vf9V9BMVF)V>FRXX=-$-#=tuPP^r!1L=^r&z7=nfc zhDQxQHoRo`t>LeRkB!V|HO?|FHGbFlut_x8Or7x6TVOiFw8Qi&bonc#v!p%JA?df$ zU(N02iRKyR#pbo<ZRUgKuURaX9E;C#f#v7cOzU3jYt}zlKd^poTV>m9+n086+SO?{ zr@d*fwzt^(?fdMP*srnQV!zk^1N+bHuclY0x1{%{?@RxC`lk-9!|up;oZ<M6;{nH$ zj^`Y2IP;z5&PHe0`9tUP&NrNYbbjFcEJK@dVaAmiH)Qr?j%0qCH8*QT*2e6$**mi@ z$nobqoAaC8`|_-Lxp}_4+Pv1h{=BJq3-VUxz2)k4{mJzY*MIV#%zv&RRPeKcHw$YE zXB93fTwA!caDU+?h1V3`T+~$5U35#)+eLpbo?E=4_}=0VilgpycY(XseVeDyv(<CJ zbEW47&z;^ZuiLxXyU%;E_bTs=-n+byc%SyQ`1*aLCG{oul@6A^QsyixEUPFBmK`a( zt?a(?2g{!<f36}>aY042@|%_SRDQ3@Syfb3Srx1bR}EFos#;R@qpBCHe(lfkZ}6Yv zKi_}3|9bxi)m7D@>YnP!)pM$EsJ^rM;p(Srnrj}cZLPhmPG5Ij-52%U^@r=Ps{d*I z%K>X(W#Hbx4+1YV^fx@&C^p&}^BUJQZf$&|@yW(#g0A57;QZjS;F{n=!Ka#<nmU^< zXnHY}8Co5>H}tROaPzmCKW$mivb^Pm*7nxE)|ssfTOVlaYrCfHi}r=>FLhLP?CN-~ z)8BbtS7X=ZVHTbrzAyZF_sZ^DyFcrh-t$<mw%5{|)4Qp6ckkieBfbCWv-B18)%11s zjrQHq_r1R7`hMH@L4R$3xPM~*X#YzSS|?mF;YSl*9LO6ud*BxXzaIGW#OV`%GH4pi z9CQz^AKWqcgGshY(<a?I>9>>qH0k{z@6g(zZNvIu+whFxBg4O+9GrZ~<X?>Bj%*%z zX-eIc<|#LgW{wt&R*cq<es`*W>h5XgY3EM+bh<EoVEPr)|25;R86V6Xn)%Qy)2xNF zZkg?vJ!ST-v%i?Lbk6EIo967E^Xi<p=e$4Xv$?b8E}gr6?vA<V&An{y-{*chPdm>( zFMr;`d8_7~IdA*CXXoe4FP>jMzj6L0^PgW(yI|dd#}>T3uxR0&h4(G|)oG^FW}J4% zX@6W)w`lgFs~7!oamnJ<i+{Gnwq)*-yOzAQv}@^QOK)0w|I+7|zPt33WtwH%mR+>$ z$g+PgH!jaze%A7Hmw#jVca}f4qHaacis>s>tk}BZ!WGx9xO2thD_&gjhZX-kec<#1 zr~hhY`^pPfesRXMGcGyf(^XSfEn2m1)j6v!Ty@o|TUOn_>W8a-vFf+0{=VuztEJVs ztIJo1R!>+xbM^AoXRUsAjegDiHE*nSul@15^mUWg{dj%a`oi_|*5AFMVng$W?{E0| zM%~7YjoytjH?H2eXX6zcZ{PU%#+Nt#W#h3k9cNx~=1<Q2+a~*_>6^~k^vkod&YFL= z@$8zjuixz0yl(TIoBy@NyJhN@JzMVDYTtU+*1NX;d7E$Bl5HEe?b-I$_VD(t+wb1~ z*B!ncfgRx;Q+AxT<ANRc?fA`(-<+dAr|z72=lp1A&Cazu@7Vd#uE4IZ?|N+4vE5a> zZ`$M9vtrLZdw#XIc<*HV_mh1G_e=Y~dBA+&&V#uJ51u=4?l;e~op<28L+8D8-iPP+ zo`1{vf4`vpg6$VPdchYLhA+I~BEv<~FS_cYKOM?E6h5^2(9uJ0UF^B|&?Pq?mJW{| z-f{TXU%TmR?|psqWv<IsUUu!}_g*pOimzW;dgU|USoDn_T&24zbk)wQet5O}>eH|O z?3%`FhpxTs+9TIKd+o6!qetc*S$bs6k+YBNI`Z8kZyx#Mk-uM;ciqD4&b#j3>wf>u z+HbD>=C{82{<o^Wb>+97{MH9IXm9AcVdRE=H@x(1%eSBW_J3~dzH$AH-@Nf3Hx=Bp z=%#PqoObh^o0s3b@#dX3-+uFlw~XGh>y|ridHvS*TUXusja#3-E&aBIx7`l%PE;Po zi$9<C$TN%5+F^&*{Dp}A%by->q0d+R|0#*sBkyX@)?AC9@R*{rc+4Yz3h&?(hxm|S zJC#H8J(x>yi1!F1;$1>;+~WycdqGHprgcPo9-kZVc`C;|-1h^aY0U8^&c7*?;uv9m zeE*L8iSH)nkNyqE`*a?kzs2zhYl63?Kl-V7iBQOo?RbWc{&9}Uf<;5`eEK-Y!|2b6 zj+X^9G9j4h9?d<t_X@n{DjW}EZf?Y9;&DLmiQ^ro3E5ETyF~h=<5^+iDIYfp`I<VR zH1$9q(#30ptTD$~sArgXv<t=JDIA&$gkn0x(}iB#Up?+|IszGogi74w$5Acz2vsLN zdXc^Pdi3=S+@E@EL0em*5yY4EGLz7WqeniXUocbjH#pwI@f@-_;ac<`;PZ?4xt!=L z47EDg>8PYzj(5;efoCPWhmP6&vl22vFAE7dn)8Jo@yrt(Q_;5*9UBFUNC)oG9EGGu zbF>l%=78OVcI6|4&oW4YB?*Tw_MQ3?798vz!H#ql8K`4nr|;r=q2rW~E+JPF6pB(0 zF$g&567t3z8A7?3czh_NYaYSzd%hm&;@5<9%uy9vj`0(HxDfD6cwd}wyodKD;I`HX zoI4-5`Wfy~j~novj<<w7j%$R^gj4iM_(F7q;C>zO2#01DeiQuODg?xT3nQB6ar_nc z(f!+S{7J~xY!ODZ79me-#c#r?YjE!o)DM>Fz!x0vKf!(P;QAd{i@)Ig-^1@K&_8PX z4)og(ozA&<k4Nb<(W@V#tybKNcKJblyBO<m4UWgr#(hEq`ZbN(;bWyfs<e~l;eH`F zW)4*Pp^T4@^H#hE^GM?$T0!{B@o*O2Hwc({Jbs9qv3?1-q?s>dim=fD=6YgB2fov> zK*$xJRL&F3F2{EjXPsEXc3h|93tS_(=mk9PM)u)K9KE=g?sxJ}8-&3gO&egU2fqn! z!$Lid8W|TscY$Y^XM?5>*O6rl{nU#-AroHLdX6s>gk1J`^b4^N?^&z#c^>XvisNAp zPd(H&rzKU`C+L`kcIY6S2d?t5w&1r)qvUxgA2SCkeyZc6PmGP`k;Xx|$noM<%=Z^K zNBbDjGd;BH%Q5G5sN(pNP$yO+AK!MNpV@GH19P-f=oj}2U672s#9EBM9Pe@nwV)UM z;vvk1g!^t6Dgc9BfZ=kiQ>)kwOP@u^!8`NB^KhRB_rEE$iFf1u^qF{2+v<_phlc3C z&<87TKLA>m*#05(S8aEK(&jkr(Ky7*k@N0FAwyh?@odFh(!RJ3@N+i$>lO;cucHsE z1vlFycri{Zf}Qf&0wD)FyG+#dcCq=WAzurcv_vRo^MtJbukI6Wh?a>T3RbMARWn)0 z7vIBY1LpY;`0NB7Zx&n{C;IsVtjjU<e-i3n>_K%FC)Uq|HM&D+XI6aI3+=$uT6}L8 zn=lu3*f*{hYK1@JT#*pKv$>!#LE!_zjl;z*6`VM7K?i$r<gwL4J&v5%^;?Akb}OPR zHX|B(vrrC)fo2?~>UH%~{1h7eR_s;3N0zD2DU1oQ)B`;K3qDtZhONYN3k4sJX7&u; z^8-`_d040uj{U#h-UH66;(FkpnOC+KmMSPdSU`k@EDH;ZBEqr@7J`VVpvJJkQj{h| z(IoziQDcZ2V-jN$V~in237Ur*G*&FJVu>B3EC>h)O0UZMf6uw|-o9M{HTnPl_kQNy zb7#(+In&RaDc786_7ay&@@oe1m_a-y;5LCj5r{oF_6A^);|5XIMpGWHgWi{>lU>4L zvNz%HU#1}RGs1b2{wXPE+(Nu1t`lf`qz@cSTgRDot^&9NWoDllVE0oW+8~d#q1^Uj zMR#}Hx?%d8{;bREW&cS#eJ8TZwPuK`g11+x=V$P~k~-GJbP10^9+*T~6Z+NAkJ0uD z{cfavPs(O@+UApxUxt`o?oG<!VDfb+-#tvJ7|MQEd#gFY>^D^=VFufO!}I6h(no~< zMtVQXS^cNV&W1z3V142s-fwurKl%>M^d^p55%4XT-vM{Vu)Igs*d8jxTn0Rl_n!mz zL!1?N=u&TxveobZ@qImTF(&YfL~So4KYwWk+NHcpG4lQg`FoJ}Wt6o&n7;y-o0I4> z`r9~ehB<+Y6W>b==lyH$>k{uLev!B(@p<Ap{%&~Pp~>)#Tp#*dBFY@d-wqWfP6*Fd zNgrW7dAT~)#8lZ`Xnu^Fhpy1@UnhNYdRdtz2JGieBAe`t0l`>7ZO%RO{9$H^F$d2K z!U!$0J!8f^DvmCbGGa{3pt?3PTA-M6npvPvYG%S2V*i-A2I3M%9`&ZLx!TsCO}fn{ zI3uc$d(yq+R`S>0%n*MQ43&plhl|4}g$ISdA08LJG(0E#$M9dne-AGTKM{T|yfnNl zygIxoygzbWq+{gK$di$$BhN)PM|QQnzU|Ifvsmj`+gSTpr&ww1q*zsKM(oPi)v=$& zZiy|3EsQ-FdnEQ)?5TDw+O==jz1_%m7q@rqqwNdY7qxHB(K>D0cWr-K`!VfnJHC3* z9qfIu-@*O|2Og|Cc&4ldQO;x3t&_~%c08Pa!5<)m^B3KR{D&aQzT{4DZo+NC9l|Gv ztHNW$mxO1AZw=oaUJ!mTyg0lh{95=;^ki$ppG8`uBa25KgY#!2Z$);ry{7GsSkqXm z*s-yga^6=tpB?*A?3&okhvEF3b{Bfin>65jJe=EuT@F^j`GA9i4i1KMo7hc8zNRrS zM#p-Ger#Cvo4gXgOE6pYB{}ycCog{8_2qYr`C{>xT@LO{Vy-<$ptUX6Ub42^noVmS z=6-k0@76rI=AAXKuX%gTOWe<_`NNtU*IZk-qVB`G-_+e)N3E!vTKB`cS#=ZZ2G>!y zRxD$}@R8`l(TAdoqVecIeA#^j!f)A8^nWIlA7b4r?-rp}q4uFJq3-&{Gc*P>FSI1| zT<C?+tD$wF&qCWmd&r4!I7&&1g}aj*{M$>6T;ZYN;o%Fy7Xe*FYxAwHaPM^Va7p@? zheNKvt8xR}T=zToS6A)Ma>FSnKXLus_c^&{2q(%7rq=z`{mfOm`E33vWR_me1n5Zn z-_>-dZk%jRVMlM3Im4W1Msd#l_slp}CC)Un%v^J&x!Qf#Rk&g9A$OWvX0A22m|yUx zq~DppnEB>@vyeLZxOvJvZ(cC3nGeh|v)rsQ8_Z_@B)o?<<_jiB&vXmjQ1=Tr$DQgf zcUQYBI6LnF_c!-}yU%93@$ObP#@+8ea({O>yN>KHe%syQ?sa|Ld#;1cakZ|8>+Z_v zH?n9+GN{j))ckyEe0y^&bFne{!BYM_KtF3v=X|m=&3BoJABNmK!b~xf%q8YhbCo%t zzUQarC+2$e&o`KP=%jBmcbngvKbpJDL*_vfH;c^e=2i2SS;}9K-!pF_7rkRXH=mlV z^p0Pe4{6)8&5g7v*D=HXGuB1lN}2wZX<_6Pz+akU%x^ix^bS*O{>&<XKhQ7#$#gLH zn6~Cl)7jAXn!lPZ=05t#znO04@1}%*KUSE<oL=*Y>0$oC9<6`UM?64V^)NO5U-Xqv zm?vq8pEd(%2TwK6n1SY5&ZK;feX###KiA7<uzAV6XihV)n6u5>{9EF6Gn~KGpKIPX z7nqOCMP{YB(5x^Qo7JYqtTkiI8jd`xV+Y+vGafnOGP8>{x!cjWZ!t4i-89u~Gt<$# z&oTSV56mI+L-T(uVED0RE(VEfJu^r*v*-I=GuC`;CYVj`efO?=$9?Elx)pAfTkaOS zN7>o`lzZAe;r{6!p`Ch+|4}xx&22whXnWb7wzutLD{K#2X8YP>ZEM@fc9UNy*nC^S z2^vjp3)|ARvd38dQfoWgF7`yu11PcIv8A><hZUa0De|>;f}Ln5*-PydJKfH(m)V(i zw!Oyw*#5*`Yp=7{+Z*lA>`&QC`YZcuJJn9Jzp<0;&Gshy3wx{mrJZMgPCGhB=M`?S zr`X$VfBRc|s=dPwu)niS>?L-f{k^TUf3Sn>owmyU(N^2L>|p-ZImF&=PqTlvPupiW zGWsv}OgrBWwSTqW<$sRD?BDEJ_C7n@o^2P{5%%x)etV8xXh+%y>=OH|J=Z>H&$Iuq z=i9g)Wf$4e_91(Leb`=TAF&tNf7<Wa#r9(RsQtcu%#N}DqMv%)j<rwNarQ~t{ip2d z_8zy@eZm=ho7`smoSTVu<O-y-*+^EGBX#`98h5e#o}270ag*GG?jP&|{*AlN-Q<2A zHzl#SId@d`=veH`$4vg&XU3!FTreu$t4+M~=rI#w^UfU=cO7f~l}VKvH?DYWn|AHu zW^~*PDz18n7IDy+%5HI65|53U&@JvtV&h}+CBx(4P8U4X*=7%_9#<WYR*z~I4|N>P z(H8BB+qIcDDi$9;9IFAN+r;7(0#%G29a|J&*Nl&M#>#)i;-%tVDws=#kBY&~yqZ`% zd-$j^*u=ywTcF+o^&Zn^3~NE##BJBnql@Ea_^8^^qr1gJC9&#QJlwGc&LV?`kBUc% zE90CMOFTx$?U-)ya0!zc?PB8>MaEXf#6>u66L28Ucw|iVxOk{bI~)ha=Edd_z@pMf zM<RLls4>Ia)QlKCs(5s}(Xse|b4KCTMxy4!?-q}g#4`qUeFzyuQ!2`5ab+<nUR+rd zcVj2S?KrrIN4j*2XRw75R&xf8dn|0mf&#Mx#*7w}F;&WHX30YtIc89GWtVoTw9hJO zm>1ar726dS1`+QuvFdrnHIgryUZ#ztX*|{jCX-x}JH<6sK@d4d@E-4gFFdEBmhLH6 zicoRoLpj+YGP_N2yU|_Rb&KbfEOM?oKE9@^TRgvn2*hIX+(BnZya0+TN5}KzYXo0; ze07T#K&DWWBt{C1gY9_!pfRy|V`A}q60KXju;k2<qZWn7SB>rv&#Nt-+b!Ot<jk{2 zoq0}R*`^)#P1U}rWRWQtbnd7{1qFlRwx%*(&{fJTCAo4@t~~O1#BB?5BGhsCs6|qc zNvz6w<gWzVrCl-Jk}#z~+{Fu3L0m@@lOgaw1lxvLb%YFDWK7dyl6VlJ^F!>J*3!_l zgdW9Jj~o>*D6WiE$8#ur*~JvN%Gel!|7VjXmQJj)a^9FlMbWPDpLK21o@8o9+?san z7H?j%$jZ9~=`8P-C5uAxZdI}<Ebn7V7DeRUx@1vQ-fc=2Wyt&3l0}*FKCWa@mb_0a zAr*pjk4MLl!o{)far-@~Al>3!(i~f)94`wTyQVpIN;%F99NU(dcwX24B7Vmczqard zBYyI3NBrd7p7_bTnE1)N1M!o0N8%^%PQ*{%ClEh*cP4)FW@~aktv=mKNY*A}VuQ%r zF;W(4c*jemtadMnck3GOMlJjf6<`P@^{~~jxTd05TEwGbPz<}pOH)~ETg1Q9Wl_X7 zuO3B1CK=cxJ!QV?Tvie*SAKhfXRE*38qmlbmOZgIEkr&wrmBB&#iBCXTq4(t1c2ki z`WZv5sHx}{FE8odvR}7&@2^9p1dju~4|!r*bc}V64Uw8pTAn^{-jL!Uv^1mWB4}A@ z4tiVLyctPaK@-&?UI<#4R<om`#j^%=t)17sI2P+S4|;tYqQtrfwBlhrff<XBkw#;{ z*`pqIu~4kd!>&`P_2^1zNHb}Z373$I2UCT~)`s<w#=~|E`VBW|%=qGXXi&{~+A=q& zrVa3z(KG;!{nWq~&3p0Snu<2XgfN)+@zPMBcbGt6L|WW1tpu46p=8lPG~xt`HF)l* zOz@=BlBTjgEQ-cS$#h`Q6_0fC=}_E{Bsw|e6wjo!h{XmM50OA6_xdH>G%`Mg&B#&R zWBurIg?krRLbN^$q8<4<9j8?99%SBEOWc@ZpHuMLEq+QeG);Y<Rbxa1XdLBa_V%Zt z=q{-^I9@nt)bKWRnX!JOyD#c)n^8eeZQweh&F}`U0~)v{{if4v>|<a_yrOG5Lef(* zz{-+%->&m0dQ!gTQKgT>8yVU?-W?VPX_Te-Ci6s!Wij=tJM}DxMiuQ2U5J!*E$837 z5Dz(Ak@|1St)#FtQT>W5+O$h6A?-$c9;<0vE4n7rVK85PyS9^Dl9cc<Nkw`Hk!~JT zaKsJja?|edUexE)j$nT}<ZQF1@p5p^D2eysb*7|SH3=LWOuw2;si7rOgyUzDu-`3t zh{g(F7=RVvtdfT~Tm@h_fZCibIMvvU5F7!{5gY+V3XTBhmOM<WHxTGNAa<z$onP`W z3Mhd_0R?uW1<#7z1%jv0g@UKhMS`c$_aw|gpj|9s3h;diQ-CoNrT{g9GZ<j3;0Q2I za0D1HI0DovUzI=;lrMoMDqjLkQoaP5tb7S{iSi}TrOKB;Q<N`(rjo`dr801ue#QIa zFg*ZI1)L#?E@<%qd|gI23Me=;15j{gDULV@&TKrNoT55MztqR&0VqDM2tYxf3!Re# zl2-<xAY2uIg75=y`=#jpP`{Mkj{;E8uMR*#|37^83+P=FfP(Pj02G94!968K?<e}D z^sWm)LBBo#1^otmo)XaeX#fhsjR7bKKP!1Si!GF1Sgq_D&#aAyIt-ti?51V+CxfAv zM<5y6Tj<S#;m?dkCZlrk)X~+Zm^07iV?geh%%PbTnO!2SG9sDY>XPVrtTXEoYR9^9 zta2-#ZZ)9kfcyd3OQHi%Ph?@&q*4a$$y@D0rfN|Kd*j&%{Wp$U6dGT(sFQp>o_P%i zMh>`f9Fi|6vgK_+?%2#>nI~nIL|SJ=a=Scc6W7PXH`5_kJscU&`o$`^|K`_?Xe`E? z@uDwvnP_z@LyHc*?q1}Snxe#>;0qnkTr?z?@@FKIxK7<q#!Vr7*ZY655ruVWG(4Vp zByk@4$y7+JPCuLP`mpNhElkJb<fnx$pw~e-AcC1_8PMp4vw(+V0@$MC8SY_+_&mwO zA@o?6dpMki6G104-`hvAf7-+O=vv-K=QSPO$CYThCZq3~#E3eE9;p<4OgYd<Y-)Lr zKqoR5j7x!sgF79KQY{)X!5)a)Z1AS5wk#d<yWot+*Bmq}BY-CYO+gbglMuQShTJEk ztvM6T)G(lWzunMZ)%!gUSTu2y31b=|*84t^4~fTY;&l?br0?K!9R4TsJsY^YQkueB zIG%|6S?H058W$8PPH89$poUMkjds<66+)-=iVdN88fzZlc#H_tA2hexsA?0xL`OEB zeV>_VyEfS@W*$46TFXxs(N?|6T-Ix%>p=t7#q2{T)WjAsbJEl{V|_()v(&aggY^b_ zjW+{55GxZ}GfUQn8LwmQakee<UTY<9Y|OT^?QJpTqs+WzJD~HLXx_0MZ71_fdjguY zIGVt%<Zn4zq!Voy)7y4M_jeFoQaAo~)Lk@6Xx`qnJ<#$^GVi00>WO};-1bHjdXnm> z`r4Dok$&b=d$M`L_A{s0Q_Ke29}Vebdn)B%3MWnvumj1Dsp#e_(Z~&Ey{a+O(Hm8v zo7;@u$fB8>VF%kGl6&?va~XP^Gtf_-VfLdv8fw4Gtluzu7HR*1nQeztdap2Z&>)RK zcQn#`7p>8GtQR`pjxuMVF}eV4(M4$9hMTj|7hR05XpF6)-j3j3Fk{iz{m@*6zG%Gp zv#m8hV%&KSI?Ivf+(2Ju&a;!z;C+F9>r(SGJB1C(q8pozuJ>v?gL#r4qw5o0+AOqb zbI|`@U@x~<*tzyfG>8|OE%qw&xc!0o9zXm2#Qw-$%{<CA=p>&N-6^`aYtg=m?(GIN zZ=!z_E!$0K-EQ$(x7$=3_ZzfrzeUsbJ2Y&6K)d!wG;4oCtM+Gm5BjwE=+f>*k9Hrr zvju3-7NR?Q5S>{Zec40k${s;awiq4RW9Y{oM>qB)dNI+(iGJ-l`@DU@{@cE2U$QUT zSM00yHM`WlZr`wP@;~nX*thLF_Fem)ecygyKeWs2a{G~8VOQE!cD1duYwTM4v0Z1^ z+YR;;yU}j4o9(Ck_h&0-`hIS=+3j|R-D!8(-TcpNuia<&+XMC>|KIu29%3%Zuw&D? z5PwLHxTu^nE5F6$e=E5z&*i%UPF8Q?id<99;cf0(xR%V|9OGIu19hxB&b4*NyO?X| z+Ph-cLG|7zxX$iG*Tr>pC9WGf@9(%$bl+vJr|ad)U2nAd6==mzLZjc0Rnh&?rVl{F zU+D&+|F1^NKLic^>Fx~l?L*Po57U`|v)u@HjvMLDb?3SB-6%KOUEnTs7ojh_nE8P* zuEvdZ<Ius^x(RL~`a{toUh1Z}scxE^j%K?VTJ9Fi7qmjd-I`g0WBCi>Wuk+0v(e{Y zjxK+$yV70de&BxSeuQrS|J*fb_pfFC;W~G{yMcL!8<}~S$NxlcLc4zpvjDfcU%K1e zuiUTEQr^xgnkUUJ^!>k+`2zkD`v-TY`y)F3Q<+itDVp>Gbmd{@8lucvv`3#FK?~m& z?R%xWi&KX$Mz7tUt~Q6YO?SILyL;SU+<az1?qzo2KIRk_xWA)Mf5;Rv1Mz_9Mwzi# zKriqNI`l`-xG!e*;sqCXi<sSb7_Id`MURb!|0$E<9y9l%(SDpYIoG4je#+d=>Y99J z1hz4^7-J5k9di%ALHqwJH2O94GPjvKSx@+TW=8&M?r=-!!CrLFy64>U?gjU6db^k0 z%jorsnZ>w~8Hk_j9K=u1$!}y%<vI5X^U?#|Yy4~ab@zsQ)4k>X!#v14XxZOG*Zu*T z_GM_<KSJBS5`Ft>SLfEaweDkj&Gl|WpdCg-{}EdLRm@e~g64k^n*Zf!{8yS~ZnOK; zZ9$9tnfu&rbKBhxx6|!%yWJkQ*X?ur-GT71bB7L%4jenP_VU_{fm3V7&73|hW8n0O z)2G#5nlZ4tX55_FwP;Ny&m1>r>Vzq^bF&AHpFX>0+_>6lv!hkxYQW|-b9&9}XtmOa zR;y)pbqXz`+Ec9#sOAi*r<OZp-1MnaYXW-NLsEXir;V+dnR8k_qC5SJ=;;BIr+adz z2jrrs&z?MGd~MDd^~kwrrcsR!)i^|lDqp!n)11OX2{1Y=a32=94@+|oRZp83JxfE) zJ8ROMX%lN^&Y3!;X3p%4vjQG+&YCr)X4a&DzzF{e=!{6C6Fo<ra?VL(@tidG@JM1C z9jP8O=1iMhTGnG=^xPoaa~p(vu8;e<LEIzf&YTR3=V}T>&ksU5zdn?#^T$uFomo3; z@~r6j6KB?3UYj$z-Z45_t)dsGx9kg2i65;A61v6*R^v-UO>GdsxOy7d<LZ5lSN@~5 z>N#4gU)i-O_l#OkuGSZWiS=Z1C#I!F_QaH*@FXb)lj;$pla;!gd`ZS+Pj0d=29q@r zg5>MjC+CuSPq~+-QO~_};>_CGX;W&Zjh{R&Iz?j?of72Plr+5X6u5{^3t~L2X2$ec zvu949F{w5>Ex?_Yh8wCS6Q&3GHN8Q8O%IsNnVwcoW(Hx-4Cu^EqZ6GK1UD;<_gQJ~ zktx%sO`H{;Ev03)diSNJGCC&+eNKbW=lCR=<4emNEiH3`(sD%*))n<(WnGafEms7k z<;r@;=#@cfxk|ldUzN(E(1h<#h+w`yS)WssrCvQs{kw;Mm-%<k;9ct9eUo^-ynDHK z_x7bp|Gm9?AOEiK@4g<t%6|{^--G;jrGF>ClX%tMesJ(E^Wl~G@X9>DWl4TLewpX9 z%=201`6=`Km3h9(l6)oU`|!&=e`TJp(j;Dz?_~Uw;dp*aJ^fN2Ua1eK)YB<T^5?@V z_5AlvzCHau{=1K--`9WlO@8}u`g;0(y}!Pm|A9W81_u7hlj$+g;|=tDRC>HhPp{I` ztMqt-y!#-Z-h+HRs=R%b=c~&5uk!w@JRem)oNA9(?fI|v_|+c2+T#uObO(F<!5)9G z#~&Qvm-h(xEAQdM>FNFT^nCX8{(JgzQJyTvNq0}Tr_aZ7@4r0h?!)Wp^RcJrv!^cy z<vzcA`gAH!^5N5`XYxCV=i}GY=X)<7UN0YBFVAnUB)=ZNm*=yW=d+jRr<doim*=Zj zlCLCvAAT>-UoX#Bc@i(lcQXFTa6G@|o_@IxuiS@I?&<VO^5?@V_x$(v{P*^Fef)PH zA5Pz7J|w?A{l1>BzTRJ7&&NQYJ_7@P<;nUy(BlpC;a7URN>8uS)2sA&gFN0K&*vbY zK2_ddmFKI<`>*o;t2`f7-hZ{ntM>d?d;DsTU+wV*d%A-?{$P(k*y9fl@XLDy{FV1e z#@FY=K#yPLzpH}pa$hgXef=x<{FnQBSnlId?){Y~{rUP??&DYP>uI@<XL*&cPgR~D zUw_Me{L6hkF8AqBULBO*^6DU-<-UHG`}8UI^}O7tQ@OA2<vzX2eZ4RD=~iB?;Sa71 z+Fjnt2XD<M-kLtVwcPR6bRJw8)O+5_2XD<^-kR>bHT`&N`tjCs&0EVeZ_NkZKK!0O z+@Stq@52k~>)^_uzVi0;gZjz0ryJByzCHb*Uh?hf_o^(ss&?k|?&E8xO`ke>TFva~ zGYb&m8+^~cqJevp*^`ij(lH7rOrJBep~d9O8(<X7nmjihp~)<U4bvLf)J~o_X?D6z z;k3yO8Oc{pr_GsKJ5%_~6F%#|gv-=dLBM0`J6}0W`xO3CpLxPv>Z>5&t^PaUEcKnQ ze5F1`4k#<F(DKJy^PRWmJ8#Vw-kR^cHQ#w_{_xiN$6ND<x8{FYX`i4xm-=?2v@&QX zN-I6RpdSX$)9d5u_3`xjczS&TdOd>vrmRPKuPl;HV>BsO6Dfda<xC(+Je;d3;6Hr) zw7kQgmOsMv-+ij{$0C^4PN|(RyZgABS+xcFIa4!Jz6<61(%RW6geKmi9wmQ9%}gZg z6b1dPcWz$qoK{L(q+z95H?2ob<xsOU)Rd))Z>0mPa%!iJXDFt;=hRNChbLW$)ILq^ zizd#QJY`Dl)amuHXqvLBXH?N<F|Y#Hr-q`bRXv)9T<#m<axYMnR|Xwe>A=!(^_-d0 zgH*5drKZxSb|5X4l?GB#S!p0Om65HAU*@H~(#rCz8B^xWQs%R%)*j58I%mr4$up*0 z8N_z{<jW_IuMLoDFPl>{MZvsj(`VOz71qp{F?0IddW(V@Mj64FNzt=vXU%3vHM@4a zve2VP?~IzDBxpQ)dV#ZNX`d_|2rw)eo26p`fjmyo$oKTZXV220GwkW3)3bD7mX1Br zd<5MP$N2>myg1#{i_txMmgmZNn9!9;|ItT3@>6^SpDAY2Q7h9w%F;gurGNBJ{}`wr z`6*V@-Fl^cl%@MB3z!NxEDPAxIF(ffsZj1k;&Lxil>4TjJZK6^%Y#C~TMGg2AWh1> z=uz&Qka90VmwOSUJW1b+(&b(hDX*-^(Ltf4_P8slzckeWtZ_iG&x-8?dNvf;x}x5o zPjhIm!mRz|e=h7xah%2Q6!6pbIpF8*0VV@3XMc)CWA+y3EU$K3nHj(j-;W!Iw(M!1 zOVEK?v|q0Szv<otUhOvU+~hX#+=?GUCd_QKc<-A~)!?BcO|wbp4NQkAHM6IoZ4b*V z1iXcKh2bdM*wfD+5knst*vbK^%nyMfa}&`t{1EGevrW#WwKJ!g^YmGz&*6d1)S8)> znh9yoF&@5j>ZNAJ)U>CDENSGF3#(7zM{ML7<;maR;Y1)uxS8<OEbF{MQ-(fy;rrvN zE`8{-{+F#&?6AoXFUag5lYVIKC3YQHeZ0iH!QU;qpwYhyJ@^K6#%G{gy#amcLumUp zhnj`@hlYl(3f&l5%v$putTJ!QivN?s1HvQ1Q&{nTd-$gC?NID+SiQ7pj0d0@4s^n@ zHayS<i!QicN2^*_(WtTpdlC6qk=X2pBsRIBm|?)fIm2gUVy!zbvCfT3tRl}x@>l5d z68rhuXYwgP`|<Oc>zmk(pMCh*i=W-;Snel$UzhmQ-H_Pn?o4cRcO~}nW4AAWDiQ|? zZ7<lnp}8BHyTI5F#sT(veE|;+e_=wbNUQ?$AYpvs`C5;!Pw@3AzCOm+9(?UHQGD(8 zboYU=3yfW0>@?Y)-fCPwfYv@}t%24$_+1I+$6#&%b2YnL6N%N%;?kEC7(nPl5>J7# z$J5%y&fm?%Y8|nvBUbC&Pl>}Hl=qErv4ee06^V@+v!U=eEU|?!HbP+o6gCpZTKL_k zvCOxJ61xd+H{nT2?j%eJ?-jV)hR<#I+=|aSeAeM}IbrT0%)P|tAbX6zNIVCH15nuG z3_fjQ2Whs!h2SWh_y~$8P@hR_`z6?i65Db8fLiF-tC0nTO}OpF?K3F+8wz`%@G8DH z;d>u^bkcAH>tnF?g0%{)U0^K-YYSMr+?imXMUI8wSxSw@HpQR#lNhe`{#N5}tM|7B ze+LzF10k#ia~GH&fVqPZ-t~NJCxne)?$;0w5W+!HWxvUR|F!sAhQ9;EO}MMW?^gV- z!tVw`S<lJ&>)rY4cO*F#<ncQ7yUzRF=l!n7?@s)##qUP^Zouyb{2oy3m0-V3NP;c# z`4H^QV1EeqTCmrEy$<Z1T1WO1(g7`ZlKPwQC#k=ebbmw3sKj+OHannl0NYofuvhbC zhl${0J?@|2z7w~%aoeYE+cYl^;I<35&v09=)V5=@0h_h(C1Jb?Pl1nJ>b?{A?YM8k zT|$$*J3xz`poG|jw9O8_9Xoevo0vn2(}uRDeccV#x4aVT5+8p{FD9`*p}U2?jlaa( zi8m8#60apzCk`a`CboYQzu@jpY)||r@rhu==|0l@Yp%rIiMtX{C)TQu_wltK8m}k* zl=ukW?05S1SAt!B-|R}fLwL^$ZsNCzcM~5Zwk9?tb|gOI{#SyT`LAB23OtcAt9ag( z_&BkVoqJ+)fcqKA&BU{bXTIw1s5Y#<VE!?fdmQLz9D`ZJU=Fdi(fr|bb|5=u-YQ&$ z$&wjM6LACGK%UH2(#L$yeV;l~<2YHH*~eN+-$XZ&=Oi}?oXKu7d$ccM*KY>%k(UBb zVRvu_^O93>ozC2(V;)jMaO?|a6B?%}d||&ZA!cU3r0yKDhv;1rmR&o7f`98+aLsJ3 zoYXBpPt0Q0HVnm+S^2__bNDM%{tA^p$9yWg!|6GP5O3i%PkGH@u5>&*N++-<l`|pW zwNQD@RbH*~nyb88<(2ah+%!|ftmzD%^VxybjQPpGnx@Q8-pB6t``!KQ<$oAysyS?S zR;i#D>k0U+BDu6$Y7u$1U!VK@(-H%j<z$AF^qP<4A##*lBBfw7239$8%8MkyB})4$ zW-MhNm7&~1HMo-Xn{_|ClXWohA~;fJHt~NAlUU<1^_}KZYh2=UarO0purxo6{gU)W z#v^aCk&5JO7fxHpCZe1Orx}{=PSf2f*C9>ou%>lT7M!M|#2^z2&5B-azpwPpiVhVk z`m!(&SybexeQp;!In!?^Uy<>V@u8y7Y4x|*G`vH@LX#rHgPR?F>)6Sc8SX9L;ql?y z!t*m{WX=e`7=AHwM&yj}I(c$?eE+^UaxpZoio6hYnf;@gnf<x(b(s6wtlZSyJ!?kl zelRPzKg@a|>%-LjhCq4yxDREm%3GSXj=wK7%iEV-sdi%T?}9t|_qM+SyMo09i?c^$ z@5||wv!Y;e-rU?9a+l_=&6^8+OWxAF`FW4?T$=QsdLPQGzgMMT!p}RDAI@))UzXn) z6WkT~7w6X%^e?C?IHO>0!R-Zi66VWlmKVhfHW#eJY%ADP@I_&?utVWhMP-Gj6`q6{ zRyc<Hs={juUu=@u<cuaaHMytBV@=-Hdqoqu*EZQErl_pRo}xlAMP)_(xGRf>7fmRd zU36_xoYHV2Wu1|L?qqDnPR7%jj~~Ixm;S7(8pRl99JAn6?9#iHwNJlc=KV5e^_Q^6 z?>Xkjf6q+$3f9T2VqMI`%)oDCx7{}GC)okF1H9ebPqTaRpm~O7!<i*I4tiG0^^25i zYhIF7A7-hn$uMuwhMZ#FVm-#G<{d4|@47*>8}A`?pJ|q}7UR3-BUWRaWmX`4pJP_C z8sl8EiuD-ho7Gz0>nQJ2&BxlVZPRvbyVP*AL+ki1Rxd1Mb%eAMdx`Z-`s#mC+jjGI ztY9e7FRRZyTt7E+6Q8mUDr^oWzC`x>3<+)rQdv?4{RBx;WM+{;KXwZeUs5OI(2erU zBUQ3kF%e;HL?*ObLiGUY9HMWXiIg@samd^b`~ZDsoOKwBSQGIO<`H}^#`mL8`xjEg zI&jw~cERILxDe@2q*IY;-y-zAguai^_YlThcnroGBGVlZnGTGk#J+=A#NlX>augvQ zS~Rj5MMyafa4Jj}H`JWqhM7)oxasUh(t@9d8AW@(5L%6~JA>T;?Dk-H0Q(q^-5P90 zk&S2{4|Z#?TY=pMY&j7mAKI)jAq^UEOZqh-hUxqd<+PyTn342f=V3<SBZF0IA+RLv zn~|EWNX=YQvyhbB!@8SsiA82SrWP{+Gm{p1R^lTw8#4!UIpzw?m5C+hD$EZsKg9e9 z^DiX6?8JPVllYtKlemx4@U*K+Jm#t~mn80WQ!on>k5dA`R4!6!P2bXo7)3m1^`$~e zL=h!oGn{N8|JG6>wt|&`Y`LFYmT`fM)nw%GGUaZo9}R3KUuAryV@UT`<aa511yI=l zmDeaMUs6`~!0SGEm2uD-DAYk=B^2sNw`EXx9}3GUJ8$D#GzmlC;bwC!C&B&%a~<Y- z%ng{IVs6Cz3^Nb&bIeVcn=!W_8UG^jgt-;-OU!MUUtxZY`Ay;}^IOavnBVdJd(0m& zcVhmCxeN0r%-xtjWA4HHC9%%TPdsh@in$l_H_UyQ`w3?O=I@vX_<oR73v&Aya{Cx^ zyA8SBl-zDc-8rZ^{y4Z#V4h68X`bT!H0Bx163nxh=P=LX_5$YLm=`fGVP3|(f_WA5 z8ayq<ypDMT^Cspk%zrR%W8T5Mi+K<8KIQ}bd<flTNSn)nKf<iQti-HBR$Ps#!>qxq z#e9rGa;A>2GaJZ(PcR!Xn=qRb|1qCpwqUkmKEr&D*@i*xHajpoF}pCk6K|P4iDhOl zW*=rh<^bkk;%)N<ynKl{gh?dcu?7=Ktg}%}1|}1eMQJ*j@#bL6_Y(hc7h}GUsiCZl z#f-y@r@TzSOr!M8z}!a(y`Q!zm$hKgugw*ygDa4v*HOcycIT3BndDoTJj-BB8Y4`~ z|MSrKh}_*l?g~~@uv&oClHAP)vxuDC1)VzRd`hbAAm*PD%TE}+ZfB&oixzSRbw@_M z+o?ax7@KWl#J9^;s&?ctO8$0A{x(Yf=Waf+{wwA_+VuM|4?`;x4tD#HiwHT7kh2Ln zpHROb)GujIZb!NcVj%5|@Fwj{0le*pC-&@fF4@5Z>l-<fSadpJ!mi|er281--j90$ z^=c*c>LXGvM0igU<8{P1+lSi*s>k~B+ybf_2>T<-%Sysuo@z-X^@9FIS`r7I^iuC= zUnah!Khh_*??Zbx+#Mu!a^R#7rUL!M5Mmv)ET7RXY^E(ZNLw%%uB5$|mNXTL&0)mQ zhjBn9lJQXBVVL2V1>j2P2ch^bVLnRVa3WGeg#G*>RtiRlWrX#I5l%U1#oqi@taUcT zwiO|?B7|1NqZRUlwAZazP1uUGYz37fPDF?xQACg=BFGUD)*D8UJtC}`jUazSkU%2H zAI({vm&e*<j*K@s$Ps-xv!=jRaXw8oW+>;+48siPe6>s9c8YS`iC(6y#xVyDGBg(# zGrFlDepSS;TH~07&n$dq6UV6OMx1hqkCgXZ;*(2!vWZVN@yYhNmkqUSsAUtMY%Mwe z<h>a4D7-$7pC>R+VV=f3gIR)k7V{kDL(Dpp%Zl$JQu`QEyB!>biBB_9y$zhTfU_2E zDDW_PPw6>p8BtBdOa|`~-k0*8!h3;<5yt}41+FvUIuoul;W`tpGvGP{uBFG!AQv)x z8f3tA23%*53mI^o0mqqeoC(L7aGVLpnQ)v5$C+@P3CEdmoC(JTaNHb@i{Q8=95;dE zoU~kM3CAtrxFsBC!f__tX2EHe=QM{tK2DCL<pxwUp_&KPT&U(kHA_oh6?WB_q2%*0 z%y6WJ1*FA7BO2sJR7m+|tgF8TxBD>*FtQd_q>KkJ4`Tj-iDMRF9>P3~5lQTy7)k}H z5GEDEq(Ycf2$Kq7QXxz#gh_=ksSqX=!tfh{-zfZseJV%_G=bM9@G2?LLQ`OYISyW_ zPlw?(^RTx3ybRn1^$`lk6Yei*mENE})lsgc-b$<401y6Ym#CW?yzIJ_n!cWzzE;}@ z>btlr$C+?x;nKjRjPEOuKZepy4ny`Gj*diX`5|A+fvD%}X=Qffa*!6bf|hg$m_w0> zhtZD==X(LtP>j<;@>#2!%}V5!tk}(>T?n(@H-|GlBCLMTLwlcT?xr5!ONn~`ejcPZ z|A(1NOs0}2^T?CGk{`3lk1piLWOB5GGdo%k?=15sG~S}E_z!;HgYF9UAILn)=Y%O7 zCa`PCcP1Rj2_s<*^+6~+${vF{+S&E^-VL>boPwCmE`=OcMfc(4lL|A65_dKwu8Ne+ zCT`nEpK+wmSkh-aCGIlvU@$3$ep=hTX2ePQv6=KEa})2;PprdDq_5XVmF1+$N2JO- z^f^08nLThk6Q8%!1`F0udZwg~dI9pj&|OdN{R8<XPF^n}_7Aa3f>R?&g*L>baY;|l z`<CEjl4CQ;ow?Gg14)j{=tG{X^!d4B>;z*M+}w`7egXLur$1gqss#NSeJ<%3!Ovr0 zY$e^=QVtG~@2`=r<Ka<a@hGV)C21#o%}o3Y%<b5<0_#PMgYec8s?CW*b13J*UlBgW zBYieu56TJbH|fMVF8sM3ZRt;uX>LcmdpB}Z&@YDZ+Y-MOo~tNw-T}hfNC;~ve``!3 zR60SW9aLJHKFnuT5dQ6n6<X&5Ds4QKeo!fZgO>2v4GPPluw5y1fC6Wi!DB$71r+L_ z5Q2{^;?S5v3n-L8;Ug$)OYzV?;DPuBJbakO!?B)+Q{bV{^Uxg%??7QI>0Cxx?1|}3 z8qpt-n%f%K=6c)DN!K!BASd?prnL7VJt`=HGIDjK>wh#iB!!p3eX>=MQXzKex`~mr z{*o(_vd4RVnt~C;Hy>A#uaC#I8?I8Oj)CeIO8<ov{g0tPlYE?uB>O0E1p2G7Sw$U= z5HrTE_>i))6Wh(;ZPKq@{%bQ_myx<XG36R_Ide>SE+F(ALT^jxA}QuTUrNnPa?9m) z$Ij$c<gJ6V)6tymMW4GT@hDp9b%{sN_iaYMyamnMr|85FBwi40ZDK9Zro@WGQobJt zQ?S-^KHE!tf57(^w8Bp$RwkI`N$f=5yB$68PTJT1`66#q7o6@&eRzO21DUn4ZSYNs zbHUpuaI+Eq*P?ek0EgSZUgv%|iV`Czcx~k2Ff_bR!8*cR0+KfuX;lYLYq>un?RTIf z--PaSf57jN=r*>e+@>zl9pA)FW(Ia9>3F-HNlbAkbWHl?HK*xTX>ihSn$=OkAcSCc z<H(4VWFt9uxGTsTEniZqJ|V5P6DP?-#^{Z?KOBXxvr90_I1&y$^ARpmPfCxN)QruM z=^UO2C3uDCtAkLeZ=0AudV^Z^dg5hD0XlZvKB4BlPb;n$<#s(-2N~J=?;r=6UpZnN zz(BuFPx*~5i4Er~Zclv3*?9ZV`tPGwGpeVa@6+=af5QydF8G_zeRJX;)TaYreT4hX ziJKCy^8G11-;`K@{Vx3MB%i)g!+gpA9xct@Af88O?pxF~%2MM?N^Q{oz}XtokQqT* zC#h?UG~x0<vW_(NdAM(C)*(q#%w9^Q(3ZKZ{j_uY8`lroX$|>swJOLlQipbobl7n? zoWq5GBs=A350XUcqMS6E4@?}AwkW+7O(6qFjpDh56xu?%NLgdPm6{fm#6~Sey3fWi zX|%Jx?j-(}SeCdyfj)@8ufLX<A7InoJ&PSPI`mTTL|OWfw=bu{qw@MvkivXPitndq zTEzQFnT4bjzLK~%u@Gnj_fBRZ4`7~7JVjpYO1wo|v7s?%jlUb#n|huF@5rTsaHQ1i zf}b6f?$2q7nAgOIl#DMMQfVAw@|(Ir>yi4B_>$6;hR=zKuix0ES{K3mYD-$*2d2{L z0Ofl*xGSV@f}6e6$VPo4`TB*Vbi?vN+EF`F94(|)FHHQK`oDyFO?_4l>iBvcsZ}q+ zxL12Eo%^K}uYl&qCJKg>d~7uzKSz?d7kDAsPD7qOk@%y2Zz1hO8zfvlN!gG&;%A}v zE*vwbtl_0n2)A9tWd}U2N-U>M^krM?&(36-CT7&AfIIb{R-Wo@8$(*Q8nyLD&V4wM zwEI%}t@^7zFYE2T4MaS&hJD*UjhsyD!N>zz6A4#JSE@GA%91YMQU*hodr2w16~u$q zGmv>w=?hKY-ZZR70e<6WL!56`OB&J$`VHddWAcsbS}NwG7Cjae0%=fYmA^&1){q<d zO1zU;qVK1D{b<zUirbMdbbZq5`rf@Bk2c`5R2*qjzRiVBS1)?yR4dZh|KZY}*5}ju z5{(qHgIZiiZCl1OS>Jb4_dY)|-NxZ~PL`sf=L%Mi@RnHusm<E2sLMymH9AS|)pif9 zL%n>okv{2T+J?7D^EYYlwG>h&x6qfrE%^WaMX5-Y>7!7Q6$4?;D3H|+$1++hpyw*o zy9pyM%LuA9E^Sy#8A4mukuiBE^bKJnXWK?N;o>`tyX3@&h@9_Wa`j|~C@0=lGKL() z=qtjR3?msip35EL1l;q`2b|B{j9KJS*pKE6ge=a)9m|Mz9H&m?aNfja(3#2IobxoU zV6-b|sI=fDksra|)$m#XM>SBB^D@G?cUQi@18*&G5&oQVV+s3QU<t`-7$FTKtYM(J z;BKj5L^X_34I@Lt=*hnEn;Adf!rhPk=)We^-*9I#$9+5L@mo%#&15(FJ=p(+JBvN) z_YsHt(IWOki@2CHc$B*mE#VW`Jjs13n!@LpL4Tf;a8Knt-}mwR0r#nB3O@vA8FwbT z%2#5uit{M?pgmlN{d(?WIrVoFX}6h^Wt-^?dM8c*K0q4DJbEwApD>)vZ*ABN(Ajj( z2SICfJm-Vtn3&G2pP(yv+Ug3P({$}lxvt$AqHA{s>DrxQUAr?_*X|t0?0X;PVP%EU zF|2d#%jxg3nx{%vm6SPIZB*teT_xIRS#wmRYkI15O-~Qjw+&@(c$gc;Z1He6+>~%i z!bo$XJI|eGy1G$rl<AhX?k8W@{m5y=wdm<(^-qqjSL&;4fXZ|YP@%54X`*X@3U%F0 z6J5JfrfYz5b$0(GT?v${bNnaidZ21u4>VBM1GU!mK<zoVV1enV^Zh3qm;Hul3$j<` zyp0Z{4|RAx?NprpXS0q<m>HqX*h<?WV-y+ne@tt!26^TS?$45a^igWqQJs(@w<1Fv zq-9$Jy&bey64Gl(189AK-s8DKbpU&jU02cnZNz39Qku5*M<xChM^@DBQYnSF5!2no z<Za^c7FsG+gF^Rx`qVWdS<wr9hOP#Ahu$~UrhSFrQ7x3~MiR(TJ^a7nm`yJBru~qW z1%`Ujn^T0uE=Em^(fZ_RAk-3hlM0#A@*^Q;lJZ-TE%MNpZJ`zGLu!A<c@o_@ujnvW z;xDA#UF4BS>8$w0_bZs!k@OCda+^uXt>l(Szz1l}S7W<HMnrsn%f2raIIGII7+2^e zt)HRQkt?imjVdgUELI;I=Jt%r%*X=pz_?zVM26*=%2E0n-?xf=aQ&}RUy{x@do$ws zGO<*6OyZM{2T42CBw>%ttm!D@5Yfh_T`IF~qDBO<LQ)53V@g6?Pc4zLXj+Q@|4}9- z^@EGHWNYF9xcG!pBAS)YsNJ7ZyEkID4d`RsR|6fS?o<Af{{Fi+p>0te#Rkgm7nI4( zgd}DeVSfhwcW@8N<ZkR&V!MIxr7by%rsYVyh#cKeM$xg+4jJ*trDag*>MG0Cv^4LE zRG4@bL-`{$xE1qbeWqkqDU(Sm;vyGg?azqcAzU_VecM93wxU^D!<USbmut(lRYzW* zGixrIjIZb}lv1kfE8)XFRF-QXe`&c{pOmO%gqnoYp>$$ic231A-K`<a=zceI{ZdPP zKG2G=N+T%M*fSo{8t^5#dO)Pd|K&=&0=3uEDX2WUR$6<xRAUk3o7BA3^g%1NE%}Ig zDw3<{n1XS$)=<h>a^xZ!mSnB<y_1%b24ewD$&Y1Jt)acg%vcbb<QeN3C?!bd<SsRW zx2(esN{O~pQeM5!kEQMPaFT<^$@QlKJEhKk2WTu$wi=p>TZl)%zo*my|3EMX7cTKx z-zG^b>T{<azadoLsy4K5{6)D;Ympke9{n5M85wJt|Ays2+Loi!{Qumw_csio2w8VD zvr2L<){(E{>z!nFlG0Zw`T=sMlVKGm|7&2zw7zzFY*``ge~6=HvOx{-IA3`MngG_< z=tXPuh3bH$OzPMw7&THR)AFLRK1=&I+Pts34p%0$o!o|`q4YgBpVya4%H%G1@}-Hl z2=v#QC4}{y&0-WGYu;~S923!TjMZ_B({W5l$1zPA$NU!g;STPQj%Fe{nu+RYra(tC z*^FlX#c1wvMliDC<7uRhXZ%`+CBV;dXX%(Gn=#FM$Rh7^M;O<9$oNslGzB`Q$<;B9 ztjJkM{>qr9Ib)hn7`w>|;TDW;HUZ1{ra;FxEp>cTsN<VfI=*S5<C`MJH|z(r+^mV@ zW{*{-W%W8|B4)vf<Ag_%j=rN~!(((**h5E!J#<u9s-walIx6g;qr%=gDzrK(Y_6li zY#kLk9Tm3LQDI0&g)MYcc)X@&M@`KWH8tC5YIfIAVLMI76Ez*fnvU%?9Xsl%@B|$d zcGFQ|M;#TG>!`4^reL{_3QyEgVY!Y9J8BBH(-bV%6zrlY*iln3Uq^)*nrda5YRxp& zGBwqX)l|#URBNlFLe`=%Dr8L#qryTR-?1`^@m;Qt?|SO^j{kwO-ugIB!0XSbO-6ag z=_s#AM|n{l<;8TA*G5Nqc{<8ty)L7?COW3;q@%fF9nE#n(Oj{P<~rzT?l>LIwbapE zL`QQibu<^z(cE!5UhAb}w5GZ;yQ^`Ldt{6j*%h6^c%AxBFY#%j?(1sQk=&7jb|rg` zBjFs`9_?|R%KGck_P<NrM9M(+5D9xP{dn5k+2LrQd9Fj#vkA$sPNXOGscp&Oup8T< zr(T9mS>~-*6ZU%5jEZi32NY%YaEta1N7yrk#v82{zE+_HeUq?dCOf4?l(3H0!zCU@ zkNs>qM})P8a6bwpI$FnrDj%#Pb@%JNuQ5F|;_-9}jbZJr_cKqo8Xot<<p$rUX2@tK z@tDku@Fu;IeJ%ZADh4WXZf7+6A*1H)jKEeUWd-&1jA-f=I_#J<C=tZy6P34?Nm>T@ zJVUGk_*d%dFhHPXBsD|^!XM=#kTKv`WV_@=`PeVB7;uN4G`I-yAUu<U;BM9NXalKH z@+pNYGTBDbXI&uEXt|SF)=zY-w@g!zToHVgwDyz7UgD*EewyBQfUz%_YdP|aKk-P7 zxHNY+Y1k?`Y1lH`xKU?0R<e#r_WK2rlf;D`gK0Aws-sTEBQ0#?zQ&j4q?ZsIyM5E| zdP$M6M3P)j8rS(AJIIAksD<z0@(wFuq)kyyG}ZP|qkOHTR_TmreYnIckbJ#dQ19}; zKpN)<;p2&VD&)^T_}a|ai4k&eNxO$#pr!ddy@Y%B#}kV^6x7G9v{QBU<0)E!-ISNt z7>T~7b6amo?4h}xu)I7S`2QA9%YKmH{M29v<Eiu;gQUNpw~*cO-*soPH|Jb;KK+B7 zj9PQFb5Z3CR93n5K?@^VoTkc0lyyl4y>uYMHKU&w-A8kE3r<$Z2X5lO^LQ6viu|{{ z!g|w<=q)D<h(U%xsu2@K29Z5avU5&W5anS+A0AO{c#+Bxa#m|csEUrc1v>BwV9|SL z!RzV3qHk`2mg#(8(K@$K{dQ5BemkU6MpKnCoJtuvDrID-lwnoMh^my)Oy!GXRK94L zrgd(q^2ISKU*xKMA*-Svg-g*fAE(kpTa_k`Q)%KDl_ri;IijV?5yz<<5onZ~tL)HP zWrrpzJLIYCkg2jmzRC^-Dm&zoE@Ma&!^zC^NEMN&BeaZf(HrhawlS2W&C(L__G2eX zm5$uhZX2}{eWt=PPu1|7y^G16m+Zxom8SFEd`g1s<qWCrHmq7(k#aLMhvX+eG8-T> z2O+P?mwAG)relW2A%gog%J;8XK`MDIdcU+Q$!TCk>%6hvCa7Q7`I$`R{0)yOJx!{m z4%)pWS!x*Z_aiUMdgX)Y-P2Aq_WL&BMa#96#rl1lvd>9MpOh>)1AGE8keQHBgEHb; z$vli{bvv^lmYO0f2G+s*$Ba&-7urDE?ywhHUrnbhr6p(o{)I4PZXv3<AEa5P=D4I> zCZXnr>Z0(#K3~G)<m4N$6)CKamgH$x(A<R9C5s;NMOHHWJHaW!=+9qd)J<O|@=$%* zNT!ZYzo3WI(W&-}soC757NH@2!!KWo0^N~cVdUvH7~35#bU%7a^{U>VXmwPRDBrZO z>ty7Ij3vD*=^9{RvyyWA0eZd1u*oH!D`=lrBp$)#Vfst7mq02LdLJYlDVe&0@tSI? z4yi_GpY*ZP#|OPr5>ah@?<<m8vPVj}*UKl;ho$NnC13+QE``gNc&~xiSAgi9zj~>> zm_`R4q|ZtAeInKRdQ1#5_?I9pFsI71o0`7~wqtKaN85?<#EG_yRnq0Q4}VMMUxKX5 zw6-a`J=mYjEmwx#LCqCd&X5T%X_w{7pd1E9+Irc|EG@ohyahiAIZl~B&K?K-n2o_j zu`T8)T(soxhdr?GWqV;W(N1R7{S-S59xt<VfG@X~vlgF|*MYC(^z{fQ!u$aEhn&0~ zk#pCH$4~4}vH6+(8P9ok9{4}EKL@_qGKQ8D*BN)-W^W@Uer11!{cr4V*kvvAWO+J{ zYNaEnLLEWn>ewk)$4+f^>~x%toeFjAl&@o_V|47qjt$06>~>^^tf|hBHPacg<~o|n zrnel&e3<Nv&(twhus@#N66}`<cFE`Jn5u=2sgBh#RSO+c9jjxiT%94y(iyT~uY8uy zkQI?mBPI1YWqvt*7`-KBXD=&T(BkSS;osyx8nlL2AQ$Ug$7<x*U}eT;Fl8=8W>K~z z@fodbqBUBV`sNfBN}RNeTIQr3MxK=QMo5kL{E9>+B@u~Pbl58?<4Bc!2VsfiNjt|k z@+~+^sfnu?6$Lmlhp?G?yM^#Y`dbb4*N}u(aK8tHES%(uH=_%=q-NIZMxnV2-!h*g zD*##b8(@L+3=-IC=x9A5)cx2zL7Vp;BP6LOlPG;gOP{0k{XomtHJo{KEv1QniQ8NF zV>o}&)Os?dK|PTgB5R^W3XwaE31)tzJ_sazUtr|NlF~v4x~-rV35()~*?b?qlzXcs z-f3BPTGn&4d|NHqPRn$zmgZb7%>`PT!&;6*T8=|nj)T)1^0frBD}*^-_ItTuCaNVk z!<SbnsaZPi&(aZpNK0oEEuHK{a+gwS<-CbJEuF;Fj@ME+-^Gx!q$m4?G~JSHg@RN^ zeqSCy^-o&m<>ZXa%%<8fO0XX})Z0N3cUnPNSH$R4D5xAQWt*0n{9C1^XbpYWGFoPl z5w???jB|9wS$*5TUMbO*YJVUyr<O-~%SE3-eSo8&6iVscj*kfC{u8MU0aoy&on7Oh zKo&Y^IE9Hgt!yMq>`T@l8BIxvgx-GQ`A*W_Q`wuWKN`2^1M2WX?V%NJs}j2W+hCwd z=0}#x4|mo`Adk!GTfvoVwN)m-DrlocK9`F;WDeFKods78uRM&%<jE^2-%|JFPF}K8 zOUk*(KvW?$at28rJx^47o+v%fvA{tuAb&22YG06H+u8QO(j#P8=@FdmV!LBgYD;+r zy+av2RaE<k4Ebj+@JaS0p3+}rX^qL${vu2Ji;(sgSz3ECwZF*HI+Uq(D6IWOmi8A} zTAxDNUu0>m%G6pF(Vikp>z2q<vSX&uy6lblBl4dle#dH^&SIa#0RB`nmOqu;$}Wo+ zkkBps$lo{Q-x?qCSB*{7$stH#6_k&a>>b)dJL~L+%mp0cYa?^mA^V<uVaIw+>^?yk zP1+&{$SGjU*!4PuR&XmR%Wfq0ef1&i2re%sUc^OKCyL7^_GqzF4e6WR?CfXf6ff#V z*gmgR`_QUx#zme(D1q<b@|^I3J2c^dP~l(?^&o@`ykZAU?C@h;hU{7~nYo$QFnVhx z*^V4pN3Gl?^u-@FI<;0(-2c~$KH*)FpM(zWzN{PEC%kB1@CJG-(dR$GxSKeOj!U>z zUcX_$N=sIQ2=5YykGUl^zvfb0!IztSqwXhVtp+}6Q$(kRbPE3xhK!-U0sRI<j`D$g z_yLkUZA*|o`j+&Ocr54M&iy+5A~lxOdPDO^%F#Exq;$|;1+A_~l#;(bKHreUQPJp$ zS4+MMl7#dBdin@W@+ZlJ);0f;Zl84jZ{NxMmwF^Lv|LC%64;jwt@UE@EiT3+qNNVf zUuF*_KRn%UK}J!vEjWUwWG}4k4mip`Wk=9c`6F$>x4g6*N*g3}Brl{6Q-;1JnXg4p z@wh&iY5Q6a|0O~)4<%2N@sN5Y<fOg)wq&*bHg4afj!C_En_Ke#<;2U{7rewsP}(=? zJ-*>3`I;=}$@e$$D)}#X$@h``NE&FqN*kIi=f2z=$xo85@bh)_k3>WJ9NIXg#dzmP zcwc9aWGZ73E!W9(mG)Hom;Z1Qp42x<|Fr99^(YNZLFr}F`!BK7K1bT-SGlGCdLZ#Y zy1yhp>2_ZSqbcz6Xn?8to~*xq4mzC%<F-H#?%zo_O%LP|%}Yiw$S~05A7DFJkGjk5 z;oo!o>5Emv);`aQOOXjh|CP&~kI7bjmF!s0MN-H`63j-o*#rr*2yJjK`e2blWz>@# z`AEP4g=SEw_b*bUNTM0)PyTu+v%@D#J>cZi7wikjiT}3$MmzVSeUZ`sOZFvXu2<|U z=rUfluL8ejUxWXpcByH`KhItV=MDP?QrDaIO{6&fe+JGw_8p$@+IPWx&%VbQ4e#6c zvH8G$fX#>YLq>ed>@xHd%Nb=CBFTM(>k7L9c%@wlyo&TGBz@My&jz~zem=3E5Y|S! z5!cOjGyHsNKZV*By9G|R+O4>LW<P_I&+X^<<xgs0?jVK3r0_1DyX|g5+(T*?lG^)t z?kCN&baa=T^Oe=S`8vkS)-hhTYAIT%mLeGAMRY`GRqGH{eM3}7blEzhYpx@@kdEk@ z>xeF-Bf4y)R8AQrQ*L*=$N`o5wKS!T(<IZr>7}(vYSg!AwUV?|8W4#|N~B0nzJ*D; zAMGtYS+X}v;;95AS_F}Vq$iRdN$w-`sAvk9S!y^^6Ivow={qUe9j3(-nH`<QS2TAi zzsXh~2|vkS@{Ml#!^SmQ!}F4(^a}cY7)effK1?r|3O8Bv)56uXmGpg_n-N9hUPgN& z(GVexYq)PQbKt{}IHt!_%Su{LsI8qyq>XvCa<&NLqK4;Y4)L>0<IzE+{d14HU!dhb zL$w>34YV7wf<3BwjVvwmPW5e8wHU!kiGdb_(^Q<C7b98>PE<jQ5v*I_52~EsT|pZo zBVxX2#qtR;kG4lnkj&C{N$kWXSD&Kol-4RR*}SE-k}I7;L;o_8mJ>n*Q~Wu!|DqMT zl^H3SL*UZXlANG)XulykSkWhCYn$h^&9mC(g|xK`Yugsm7RYG}WVHnfY1<Rl_D1~2 zl)lV;$(|7j$xARQy%36=V2(99DGkYLNKWZmrRy4`xt#AAv>4Lb%V?i72r{nHHvegK zLJloiu0@ZadS^7sjQc}6*3Z*Xe!h<KMf-drEu@U{i}>4UPug1<**CMN+EdvRG00Za z5}v_7L0j9i?75~b|NR_mI@<C4&9jGU>UuKnpTi$bMJs%&j_e1Zsk_!x>d1bOy%oK0 z6@S;f!&LKs&EK2B{9*GhGlcWR?=@%eN6iQMqiEbd!TE?M8rPgrdGnVs^b^hB#Vp6v zdBcf<>Q2AeJlELFToWqbjHc%MFs$Bcf#$9St!Ilu40~DB9Lu{srZc8H{y66#6HRUN z4j9JI&3j|oVoEV$Cx)3JR59T~H0aoe3h7A;i}()kFV1b1+csxovw6uo(kjw635PEU z;N0tS=jHcmHZOlfvv~>+t%t)i0$BWnUkH4LR{;M$Nd@@wBfvjQv%fohZ}KaAZ2;#@ z%bT57l6Ou1h`bwehY@zaBnC8ZJOcb`q)1#M9U@)AxA5-WY+ha*vpB%dU6s2o_d(A; zaQN2&oF0~79x*PS&&K@VV__OcDLCx;2|uJ%9}7QCJkoeb4@+T>pPnxQhu;dQr{{&@ zzaQ9Zny(FDwNJ~_@MnR&#4)@pNYAgt_dvbhh)IK^X>e|kwqlbkCz8&Q(jcAlJCl}$ zY52FM!P_Exl3$U2Y4Dv%TWD0K!KbCc*9CCozGm}^D2K^ALYYY34d9VUTWHRV%uRkp zE=YryMqW(Wk4Zw{r^E9io0Be)2}uZ?DQWQ1G&ntuN8&k+A1Ga&<~s#P(!=$11h0X8 zdfMKeMkPHx?+NTB-6E9v<Q;h=31R<u8oVSeP157_b{fuyY4EBvcwJgrrKiIe0S-OF zZJ{6Y92)v1&mZxpbZh&o&CU88s5Vc^)7-8&{ne&gpM`cD_@|mrd0ry@1OHfNJpgCB zg3lf`q1I2I7m8mORtnXM**^#|bOks+Qurc$4pf_g3jZMVd!e9kKidlU454Q3u@^&4 z#zHnUnqJo0Ck2OfD-vS0{Aa_|$<uapD|rs&pX}Crp*Cam*-mWi4QhYA;vB2+TFaTu zHV<8uwGS#zkv>oGPodUP;Rn?h?L0PxK9uKy2P%AG@KkCiDt<dBuI<$RLgk@I;V7qI zv4}%(IG6Ve;2W?{^|ti2XvocCJBi*lqJJ1M`iGGWw}gL-WXr#D*#jv5Ad!8bayqO? z9=XW$8H~xAB8xP~HlH0<$1qB3!;YyYoY~YF>@M8Laz0RZ)})lO59@fOqY75eoWy+s zyCVmJCI9p8#>$zI?6Mlo-+E7BU*}kCYq<xrQf3<NGuRJ$macy|n>7nRW_1m{Z2k?H zu^9NypN5%@xyqYsc#Hc@Ogh|4yze#P%wO|;8|DtoU6}cp1sKjcR<oG*lNcnJd`9Yd z3-Py*_tTh%FmGWV!@P<SJ25YqQ0DJ3cdLCk^Ij9lT*!BTZxeS(*-8AJ=l8?+h8Kn} z&ub;O!aq!duT6t*OoMMpgMXa{|2_@AI}Luw!%q{&V`=aU9$ta{t7-6CY4H0;fY%20 z@{B$iz>%UztMJBXoqQ?$SsJ`64L)#qm|=O!ZzP%q=cd7J16af85QM96mo&IE4elMl zktwwO{X89kE7Rc9(%@lf@W?dyf;4zc8ayElo*TdtV)P9k?scTaJj|_;+am&Bod&1d z9}a#H-1|Hof$vO%?@5ExaUSvZUqoHx@n~H%KiVuJ@RBt6#WZ+n8vJ$|{9zirDh*!e z;cf7<*@q?Yp89a3nE_6;6X{SA*el#R4UVP3Nu2)RS9yDZ%hKSABfuVCT%%`roExGy zMTe`+9Z`YLOM@>;gU6=9lhWX6Y4Gec_^LGcnl$(}4=;v?y9DMf@ccA*K^h!SgMHn} zro2R-3(AkeFQ>t8q`~i|!OH_U=LP(32xuz2B@Nz@2JZ`C+WHH%$NG!*wHJo278?)q zM+keYhtE;_pUYGF8#hDyybD9qu+hHOu2TC>ihsV+{8Io2PjR*9hi34sP}ghJzCuH+ z@UVnfAvk7#V52m9Xjl~?;bENOk5kuiN^PpZ{2N|+<y8SJILHcWAA%;Z&^+JUK!>%G z!jEVI#g$l?W#Vevi@o`!a@bz`_#O%`P}i}+Q*Fj7g|V6f7pcvBb-hSAyvV~6qvI65 z)!RrcCM!PcKY$kn_5!<^8q<pcni~3F6!Ut;IYpmmtFKekexBM?22ZuGRQvC!O|8NY z1h8^d>tW$4$f@6X8{w)pB>7vboLsA%)CwnVvC_FipLL3Vhkpv4J2c$UYBN-EejUL6 zDL8ooa}uq{My2|ktFEQ~IRlx&a*G6#%Z}`b>2F0x5N#xFEJ50M4w)lI|7X@xWsX+h zp(VC5FM5J;(OWT7Ff%c8F;`=*^JX4zaVPg9al)dPkKT#72Xi0hLChnV$Gus?`$f!B z%-i@`jG^a`Jc(hYN#r>Unkuyu`!~>`%*QNHdpXlzP96-g=2r0Sp$E}ISkue?N&fgI zPjifo@ob?skMpc>x4ApqU7=kO`B%vT_ilIsP+aoBJqPr%d&9l!mIEPOx-H_W{~((i zzB*DA$_^EVT7-_pwG91Le{l`94|NW8S1MKR3^!cuhK5FjMujfMb$sZO(2UUKKtBv! z%OB2e!S8wQA~#m?ejWOK=<d+H*iB-6*le|17<wr5m_kp7UI@J!K<+AcjY4mQ-Vd!% zXl-a?=rfH6e^Lw0P`d+6pGO4>=Z1^ItrU`fsdWjLV%Iy|FI*WuEj%ndGJHXJjJnp_ z9TiGTwfgj{hrVG-x*cwxI}{41r(}Klg?fcf3JnMi#`UP_7fPjC=x}Lum=p?q`*e~2 z&S{=g_WNrM?5~o3f0g2|78^AGQmd|2*}t#i^i`a`igUf<T(3CSE6#=LdZEIyuF|r9 zPR1f73R_mF1FI`KA}Bwve)lN+OT{cy$}JUVsM;@3`&Me-S?y0zYNx3EDQf?B#cZq8 z7OG91K9QdZrH|ULR-1Bp+967zS}6=sdzsg=XzC=si_~V2K3_1OVY5pyJE={DJS~k2 z_N&yMU&a7;)u*%}mVJ>zXRq3X6#q;Oaj4;6Uba&0bM^V2;@__LZ!6|Wig~J1K1pqk zQ=60dZwNhs+O$xc(^yY$Z40HN>0_HIwHsK4Z*4QhyiGARUbctY{7G?EDE(sf+gt6Y zDduXmzea30rJbjHN?rd?U9VQxX<|cLEYBOno<BxNe1EDoPw<SAJju4WGf=6yjb|>S zy*Fub>)aZ*)_v^Ox%IR_n;7*`(!`CH+ptE-FoHAeaxk1?V>r3TFjg~+$O1dDAMU>| zBJ8t(ZDN=_RdY<csBn-&j@e;>#5K?w%L+%En3U*1-%!sbdQ#3EUI$L7L60H-zRcDg zAXh;{co2T1=bnU-G!ru$BktE=Bt>q*NXkpkb{A&8H?-=s=!O>E(4yPKPb9?>H|sMj z&qJ>%+*+TP=u=1DiSFKBd|fO3U*ZCJ9{NC^&#O%fefHMpCHg#0pB;EM=bYd&9UJ#2 zHLFP7;l$=5Vls&s%!d1`;Qj_UC#MoR@`t-R;L~KBpNQzQwLUL#lsj<V;@Mp^0*Tfl zBPFgC87a|5dgR3M@;tOx;THPrE%HO+5|I!R$B9&s=zu&XIUsWkZ@XI>{6Dl*{~tP( z-j9nMl@)<e%105ax!Tf8cjLU?dN+%nAP+skF^vB^qYLPTwjeZU;K-Qi{@t^N#>{CW z&iZala!o18YSw&q2e&pcM)}|2)L*gZ{B%MoAf?)HigO3_3ZhR4TtpvH2+d<DBOTe1 z(?iej5kC=h6HQD@v=7B-9fCCOTT?S-wjFi!r~HZ8j`^DBxT!PjgmFiGj-N7lqMdT| z=LCNEY-b+*37Hyu>(@M|kDFp|pCZpY^?A?qnd7I~`;PvcHD~NB8~?iJj9GT^tT{(} zQUas~2le_Gg@W%Ez<K1U%zg#4Ub0_DX7h_E6G5BUT=AvESjv$+BRm~B7xYB3_Fv|& zj^lKIJ@y*=pncc1;_mK7h93$q4R4G@Bb_3rG4j7H@_1xjv_*7q^v3AYjLM9884EK@ zGcV4(({q*y)e9&+A$CFMn6di&*mYxP+DP`MoyR)+v2Gl)&~({>=Ia02dbj(tyN8`e z&$}1gzuk-OB_y?1+^g<2x759k%qBWAD|9LMXP7bU-g?b&x;y*chO+Z*SZX%1mf6IK zY5#@2(cR*Hfh72d`zJEsqwX>HFZZ~60%`Cm_q2P4cK2CmO6+NWBIBuJZ7Ip!Df|7= zjt!%gxR|{`)7U>2a>uv=$8Idwnm^n|dAD&*9J?&su}(CMA$Oc>>auvZb<G_0$sO;S zJ5Hr{G1tN|3+39mmM)KXdr~%^na$JPg>JMvALtAu#tWSMNy&2p7qYLY8GME9Ci;iX z3Ni1ckh3qdULq(9q<DBCy-Ts{;5xca?gZD_o#?u_uCBzL?M7&R3#|?sPY2EJ_!P>9 zHb6!VPkEQtYAbf$#r0M9Q`9Et(W3AreaRTJCS~iwC4_$r>C%R@IF9%qPn_Ek&(qx* z8h%UKr1MC_JIrI8Td>O(+7dh1j<Iu@_q*3V$tsU^c8|*>T{^qot_pr~Ld(B;yAJfo z9pEn5O~Bti!F%khw``+=Mt11-#<#6QHmDN<8fR-65rr;qd}Ax_S)ub9-u7;M-;G<+ z_qE_uG`yM96xYm9>-5`>$LIJopQo|U<WTx;Pg8#x$Ofq!$uW=~li?Ma4C+PdwngeE z>K;tqB4J_V3QBby{rv68+tjIj#9bZS=4G%Mcd4zEJpO7UYft0`78+qULT>)tU@`TW zH{!zS1+KrjQSm~QxGwahR;7Vt=wm7Ev?D4pFuP5y84iZXFG-96NZEVL0R0w8NsL?p z_wD&^AGonrNK380<)3+!TsOqGX4F2gti2C&9xmb@v~x+9TL@>q?RQwWnY30na>owq z%I+QJMC6u||5eJ2wwd|X+pIk-MiCNW=j3gc91aILJHzt7^5m`Q{gtrDt4vm{r{C;5 z`6^H5ZhC{ojqYKG#k`!B;ij+L)H9_jY1}O>B`tl5MSha9Vvq+!UX0L|8Cv*m=oUu1 z3+RLDQ$A>Cgj$!B5B{y`!uUAL@pm6=gLM;*ww1n!7V#o%amSt(nRZy-vPP|$${(FA zEid~i7h2ih_80RM=ae|}7c2eFLMv;}p2CO4rJlw`$Vbg+Q9C08_M=soGAR3w<;+ci zz5^sJU06@D4D4>g?ssY@yJR0#=>4P}XLp3$KsOLu*(2MX9_d<UGG4<*;+|}6EfSHW zSTePw-3)^nQd`-VkaVGB1*w9IgBmO1QYj!UwWLJYEyAaSA@Qri1Zm{xr8=bgSNSXY z|I){@>xn*<8mcRFqO8!F$cna~xEt9?L{G}zIoU7Voc{D#B*J<w)A}oBot*X@@|T_f za?CnOz9c!0L9KvZv<W?DQ+mth^pGuSDY|L?Q>uI!8A1)u){>Hw=DRbpjmj4yT~Pj_ nE`z=!%VoP9m+SIezLrBPSa2wL^BQ}DzhHOpq4fR1Lihgx<33G- diff --git a/ui-components/src/main/res/font/rubik_regular.ttf b/ui-components/src/main/res/font/rubik_regular.ttf deleted file mode 100644 index fb52c8eec809c567a13e829772e38273ebfc1291..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140732 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 JJrZA0{s5qu-!A|F diff --git a/ui-components/src/main/res/raw/warning.json b/ui-components/src/main/res/raw/warning.json deleted file mode 100644 index 8deece941c4..00000000000 --- a/ui-components/src/main/res/raw/warning.json +++ /dev/null @@ -1 +0,0 @@ -{"v":"5.1.5","fr":29.9700012207031,"ip":0,"op":42.0000017106951,"w":32,"h":32,"nm":"System-states-Sin conexión","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":3,"ty":4,"nm":"! contornos","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[16,16,0],"ix":2},"a":{"a":0,"k":[8.25,8.25,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.847,0.847,0.667],"y":[1,1,1]},"o":{"x":[1,1,0.333],"y":[0,0,0]},"n":["0p847_1_1_0","0p847_1_1_0","0p667_1_0p333_0"],"t":0,"s":[100,100,100],"e":[130,130,100]},{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.127,0.127,0.333],"y":[0,0,0]},"n":["0_1_0p127_0","0_1_0p127_0","0p667_1_0p333_0"],"t":21,"s":[130,130,100],"e":[100,100,100]},{"t":42.0000017106951}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.442,0],[0,-0.443],[-0.442,0],[0,0.441]],"o":[[-0.442,0],[0,0.441],[0.442,0],[0,-0.443]],"v":[[0,-0.8],[-0.8,0],[0,0.8],[0.8,0]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.25,12.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.221,0],[0,0.221],[0,0],[0.221,0],[0,-0.221],[0,0]],"o":[[0.221,0],[0,0],[0,-0.221],[-0.221,0],[0,0],[0,0.221]],"v":[[0,2.544],[0.4,2.144],[0.4,-2.144],[0,-2.544],[-0.4,-2.144],[-0.4,2.144]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.25,7.194],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-4.416],[-4.416,0],[0,4.416],[4.416,0]],"o":[[0,4.416],[4.416,0],[0,-4.416],[-4.416,0]],"v":[[-8,0],[0,8],[8,0],[0,-8]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.987999949736,0.172999991623,0.340999977261,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.25,8.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 3","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3597.00014650881,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Sombra contornos","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":8.4,"s":[100],"e":[0]},{"t":23.8000009693939}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[16,16,0],"ix":2},"a":{"a":0,"k":[8.25,8.25,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.847,0.847,0.667],"y":[1,1,1]},"o":{"x":[1,1,0.333],"y":[0,0,0]},"n":["0p847_1_1_0","0p847_1_1_0","0p667_1_0p333_0"],"t":0,"s":[100,100,100],"e":[180,180,100]},{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.127,0.127,0.333],"y":[0,0,0]},"n":["0_1_0p127_0","0_1_0p127_0","0p667_1_0p333_0"],"t":21,"s":[180,180,100],"e":[100,100,100]},{"t":42.0000017106951}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-4.416],[-4.416,0],[0,4.416],[4.416,0]],"o":[[0,4.416],[4.416,0],[0,-4.416],[-4.416,0]],"v":[[-8,0],[0,8],[8,0],[0,-8]],"c":true},"ix":2},"nm":"Trazado 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.987999949736,0.172999991623,0.340999977261,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Relleno 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.25,8.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 3","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3597.00014650881,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/ui-components/src/main/res/values-ar-rEG/strings.xml b/ui-components/src/main/res/values-ar-rEG/strings.xml deleted file mode 100644 index 5db79203977..00000000000 --- a/ui-components/src/main/res/values-ar-rEG/strings.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="cancel">إلغاء</string> - <string name="action_cancel">إلغاء</string> - </resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-ar-rIQ/strings.xml b/ui-components/src/main/res/values-ar-rIQ/strings.xml deleted file mode 100644 index 66ba3baf444..00000000000 --- a/ui-components/src/main/res/values-ar-rIQ/strings.xml +++ /dev/null @@ -1,10 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">مكتمل</string> - <string name="cancel">إلغاء</string> - <string name="save">حفظ</string> - <string name="clear">مسح</string> - <string name="action_cancel">إلغاء</string> - <string name="action_close">إغلاق</string> - <string name="hint_search">البحث</string> - </resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-ar/strings.xml b/ui-components/src/main/res/values-ar/strings.xml deleted file mode 100644 index 56382963bd4..00000000000 --- a/ui-components/src/main/res/values-ar/strings.xml +++ /dev/null @@ -1,32 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">مكتمل</string> - <string name="discard_changes">تجاهل التغييرات</string> - <string name="not_now">ليس الان</string> - <string name="keep_editing">استمر في التعديل</string> - <string name="review">المراجعة</string> - <string name="cancel">إلغاء</string> - <string name="save">حفظ</string> - <string name="clear">مسح</string> - <string name="action_done">تم</string> - <string name="action_cancel">إلغاء</string> - <string name="action_close">إغلاق</string> - <string name="hint_search">بحث</string> - <string name="action_clear_all">تنظيف الكل</string> - <plurals name="error_count"> - <item quantity="zero">%s الأخطاء</item> - <item quantity="one">%s الخطأ</item> - <item quantity="two">%s الأخطاء</item> - <item quantity="few">%s الأخطاء</item> - <item quantity="many">%s الأخطاء</item> - <item quantity="other">%s الأخطاء</item> - </plurals> - <plurals name="warning_count"> - <item quantity="zero">%s التحذيرات</item> - <item quantity="one">%s تحذير</item> - <item quantity="two">%s التحذيرات</item> - <item quantity="few">%s التحذيرات</item> - <item quantity="many">%s التحذيرات</item> - <item quantity="other">%s التحذيرات</item> - </plurals> -</resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-ckb/strings.xml b/ui-components/src/main/res/values-ckb/strings.xml deleted file mode 100644 index 5ae5c7edb82..00000000000 --- a/ui-components/src/main/res/values-ckb/strings.xml +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">تەواوبکە</string> - <string name="cancel">لابردن</string> - <string name="save">تۆمارکردن</string> - <string name="clear">پاککردنەوە</string> - <string name="action_done">تةواو كرا</string> - <string name="action_cancel">لابردن</string> - <string name="action_close">داخستن</string> - <string name="hint_search">گەڕان</string> - </resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-cs/strings.xml b/ui-components/src/main/res/values-cs/strings.xml deleted file mode 100644 index d0f0beb5124..00000000000 --- a/ui-components/src/main/res/values-cs/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">Dokončit</string> - <string name="discard_changes">Zrušit změny</string> - <string name="not_now">Teď ne</string> - <string name="keep_editing">Pokračovat v úpravách</string> - <string name="review">Posouzení</string> - <string name="cancel">Zrušit</string> - <string name="save">Uložit</string> - <string name="clear">Vyčistit</string> - <string name="draw_here">Zde kreslete</string> - <string name="action_done">Hotovo</string> - <string name="action_cancel">Zrušit</string> - <string name="action_close">Zavřít</string> - <string name="hint_search">Hledat</string> - <string name="action_clear_all">Vymazat vše</string> - <plurals name="error_count"> - <item quantity="one">%s chyba</item> - <item quantity="few">%s chyby</item> - <item quantity="many">%s chyb</item> - <item quantity="other">%s chyb</item> - </plurals> - <plurals name="warning_count"> - <item quantity="one">%s varování</item> - <item quantity="few">%s varování</item> - <item quantity="many">%s varování</item> - <item quantity="other">%s varování</item> - </plurals> -</resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-da/strings.xml b/ui-components/src/main/res/values-da/strings.xml deleted file mode 100644 index fc0ecd37a5b..00000000000 --- a/ui-components/src/main/res/values-da/strings.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="cancel">Cancel</string> - <string name="save">Save</string> - <string name="clear">Clear</string> - <string name="action_cancel">Cancel</string> - <string name="action_close">Close</string> - </resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-en-rUS/strings.xml b/ui-components/src/main/res/values-en-rUS/strings.xml deleted file mode 100644 index a29e9d1d491..00000000000 --- a/ui-components/src/main/res/values-en-rUS/strings.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">Complete</string> - <string name="discard_changes">Discard changes</string> - <string name="not_now">Not now</string> - <string name="keep_editing">Keep editing</string> - <string name="review">Review</string> - <string name="cancel">Cancel</string> - <string name="action_done">Done</string> - <string name="action_cancel">Cancel</string> - <string name="action_close">Close</string> - </resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-es-rES/strings.xml b/ui-components/src/main/res/values-es-rES/strings.xml deleted file mode 100644 index 2020a1e8ff1..00000000000 --- a/ui-components/src/main/res/values-es-rES/strings.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">Completar</string> - <string name="discard_changes">Descartar los cambios</string> - <string name="not_now">Ahora no</string> - <string name="keep_editing">Seguir editando</string> - <string name="review">Revisar</string> - <string name="cancel">Cancelar</string> - <string name="save">Guardar</string> - <string name="clear">Limpiar</string> - <string name="action_done">Terminado</string> - <string name="action_cancel">Cancelar</string> - <string name="action_close">Cerrar</string> - <string name="hint_search">Buscar</string> - </resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-es/strings.xml b/ui-components/src/main/res/values-es/strings.xml deleted file mode 100644 index 511e942b0d0..00000000000 --- a/ui-components/src/main/res/values-es/strings.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">Completar</string> - <string name="discard_changes">Descartar los cambios</string> - <string name="not_now">Ahora no</string> - <string name="keep_editing">Seguir editando</string> - <string name="review">Revisar</string> - <string name="cancel">Cancelar</string> - <string name="save">Guardar</string> - <string name="clear">Limpiar</string> - <string name="draw_here">Dibujar aquí</string> - <string name="action_done">Hecho</string> - <string name="action_cancel">Cancelar</string> - <string name="action_close">Cerrar</string> - <string name="hint_search">Buscar</string> - <string name="action_clear_all">Limpiar todo</string> - <plurals name="error_count"> - <item quantity="one">%s error</item> - <item quantity="many">%s errores</item> - <item quantity="other">%s errores</item> - </plurals> - <plurals name="warning_count"> - <item quantity="one">%s advertencia</item> - <item quantity="many">%s advertencias</item> - <item quantity="other">%s advertencias</item> - </plurals> -</resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-fr/strings.xml b/ui-components/src/main/res/values-fr/strings.xml deleted file mode 100644 index 5abb56131ff..00000000000 --- a/ui-components/src/main/res/values-fr/strings.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">Terminer</string> - <string name="discard_changes">Annuler les modifications</string> - <string name="not_now">Pas maintenant</string> - <string name="keep_editing">Continuer l’édition</string> - <string name="review">Vérifier</string> - <string name="cancel">Annuler</string> - <string name="save">Sauvegarder</string> - <string name="clear">Effacer</string> - <string name="draw_here">Dessinez ici</string> - <string name="action_done">Terminé</string> - <string name="action_cancel">Annuler</string> - <string name="action_close">Fermer</string> - <string name="hint_search">Rechercher</string> - <string name="action_clear_all">Tout effacer</string> - <plurals name="error_count"> - <item quantity="one">%s erreur</item> - <item quantity="many">%s erreurs</item> - <item quantity="other">%s erreurs</item> - </plurals> - <plurals name="warning_count"> - <item quantity="one">%s avertissement</item> - <item quantity="many">%s avertissements</item> - <item quantity="other">%s avertissements</item> - </plurals> -</resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-hi-rIN/strings.xml b/ui-components/src/main/res/values-hi-rIN/strings.xml deleted file mode 100644 index 99d20b1a222..00000000000 --- a/ui-components/src/main/res/values-hi-rIN/strings.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">पूरा हुआ</string> - <string name="discard_changes">बदलावों को छोड़ना है</string> - <string name="not_now">अभी नहीं</string> - <string name="keep_editing">संपादन करते रहें</string> - <string name="review">रिव्यू</string> - <string name="cancel">रद्द करें</string> - <string name="save">सहेजें</string> - <string name="clear">साफ़ करें</string> - <string name="draw_here">यहाँ चित्र बनाएँ</string> - <string name="action_done">पूरा हुआ</string> - <string name="action_cancel">रद्द करें</string> - <string name="action_close">बंद करें</string> - <string name="hint_search">सर्च करें / खोजें</string> - </resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-id/strings.xml b/ui-components/src/main/res/values-id/strings.xml deleted file mode 100644 index 5a9bfb7f266..00000000000 --- a/ui-components/src/main/res/values-id/strings.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">Lengkap</string> - <string name="discard_changes">Hapus perubahan</string> - <string name="cancel">Batal</string> - <string name="save">Simpan</string> - <string name="clear">Hapus</string> - <string name="action_done">Selesai</string> - <string name="action_cancel">Batal</string> - <string name="action_close">Tutup</string> - <string name="hint_search">Pencarian</string> - </resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-km/strings.xml b/ui-components/src/main/res/values-km/strings.xml deleted file mode 100644 index 494d58bf5d4..00000000000 --- a/ui-components/src/main/res/values-km/strings.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">បញ្ចប់</string> - <string name="discard_changes">លុបការកែប្រែ</string> - <string name="keep_editing">រក្សាទុកការកែប្រែ</string> - <string name="cancel">បោះបង់</string> - <string name="save">រក្សាទុក​</string> - <string name="clear">សម្អាត</string> - <string name="action_done">Done</string> - <string name="action_cancel">បោះបង់</string> - <string name="action_close">បិទ</string> - <string name="hint_search">ស្វែងរក</string> - </resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-lo/strings.xml b/ui-components/src/main/res/values-lo/strings.xml deleted file mode 100644 index 373be607e47..00000000000 --- a/ui-components/src/main/res/values-lo/strings.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">ສຳເລັດແລ້ວ</string> - <string name="discard_changes">ລຶບການປ່ຽນແປງ</string> - <string name="not_now">ບໍ່​ແມ່ນ​ຕອນ​ນີ້</string> - <string name="keep_editing">ສຶບຕໍ່ແກ້ໄຂ</string> - <string name="review">ທົບທວນຄືນ</string> - <string name="cancel">ຍົກເລີກ</string> - <string name="save">ບັນທຶກ</string> - <string name="clear">ລຶບ</string> - <string name="action_done">ສຳເລັດ</string> - <string name="action_cancel">ຍົກເລີກ</string> - <string name="action_close">ປິດ</string> - <string name="hint_search">ຄົ້ນຫາ</string> - <string name="action_clear_all">ລຶບທັງໝົດ</string> - <plurals name="error_count"> - <item quantity="other">%s ຂໍ້ຜິດພາດ</item> - </plurals> - </resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-my/strings.xml b/ui-components/src/main/res/values-my/strings.xml deleted file mode 100644 index 3fc9554ded3..00000000000 --- a/ui-components/src/main/res/values-my/strings.xml +++ /dev/null @@ -1,10 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">ပြည့်စုံသည်။</string> - <string name="cancel">ပယ်ဖျက်သည်</string> - <string name="save">သိမ်းဆည်းသည်</string> - <string name="clear">ရှင်းလင်းသည်</string> - <string name="action_done">Done</string> - <string name="action_cancel">ပယ်ဖျက်သည်</string> - <string name="action_close">ပိတ်သည်</string> - </resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-nb/strings.xml b/ui-components/src/main/res/values-nb/strings.xml deleted file mode 100644 index ce8f592faf1..00000000000 --- a/ui-components/src/main/res/values-nb/strings.xml +++ /dev/null @@ -1,14 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">Fullfør</string> - <string name="discard_changes">Forkast endringer</string> - <string name="keep_editing">Fortsett å rediger</string> - <string name="cancel">Avbryt</string> - <string name="save">Lagre</string> - <string name="clear">Fjern</string> - <string name="action_done">Fullfør</string> - <string name="action_cancel">Avbryt</string> - <string name="action_close">Lukk</string> - <string name="hint_search">Søk</string> - <string name="action_clear_all">Fjern alt</string> - </resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-ne/strings.xml b/ui-components/src/main/res/values-ne/strings.xml deleted file mode 100644 index 70b00f6ec82..00000000000 --- a/ui-components/src/main/res/values-ne/strings.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="cancel">रद्द गर्नुहोस्</string> - <string name="action_cancel">रद्द गर्नुहोस्</string> - <string name="hint_search">खोज</string> - </resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-nl/strings.xml b/ui-components/src/main/res/values-nl/strings.xml deleted file mode 100644 index 1a082762bd7..00000000000 --- a/ui-components/src/main/res/values-nl/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">Compleet</string> - <string name="discard_changes">Veranderingen ongedaan maken</string> - <string name="not_now">Niet nu</string> - <string name="keep_editing">Blijf bewerken</string> - <string name="review">Beoordeling</string> - <string name="cancel">Annuleren</string> - <string name="save">Sla op</string> - <string name="clear">Verwijder</string> - <string name="action_done">Klaar</string> - <string name="action_cancel">Annuleren</string> - <string name="action_close">Sluit</string> - <string name="hint_search">Zoek</string> - <plurals name="error_count"> - <item quantity="one">%s-fout</item> - <item quantity="other">%s fouten</item> - </plurals> - <plurals name="warning_count"> - <item quantity="one">%s waarschuwing</item> - <item quantity="other">%s waarschuwingen</item> - </plurals> -</resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-or/strings.xml b/ui-components/src/main/res/values-or/strings.xml deleted file mode 100644 index 02e0b184706..00000000000 --- a/ui-components/src/main/res/values-or/strings.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="action_done">ହୋଇଗଲା</string> - </resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-prs/strings.xml b/ui-components/src/main/res/values-prs/strings.xml deleted file mode 100644 index cb379842f56..00000000000 --- a/ui-components/src/main/res/values-prs/strings.xml +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">تکمیل</string> - <string name="cancel">انصراف</string> - <string name="save">ذخیره</string> - <string name="clear">پاک کردن</string> - <string name="action_done">انجام شد</string> - <string name="action_cancel">انصراف</string> - <string name="action_close">بستن</string> - <string name="hint_search">جستجو</string> - </resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-ps/strings.xml b/ui-components/src/main/res/values-ps/strings.xml deleted file mode 100644 index 90fc8eab303..00000000000 --- a/ui-components/src/main/res/values-ps/strings.xml +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">بشپړ یې کړئ</string> - <string name="cancel">رد یې کړئ [ ژباړه ـ ردول ]</string> - <string name="save">ثبت یې کړئ [ ژباړه - ثبت کړئ ]</string> - <string name="clear">پاک یې کړئ</string> - <string name="action_done">ترسره شو</string> - <string name="action_cancel">رد یې کړئ [ ژباړه ـ ردول ]</string> - <string name="action_close">بند یې کړئ</string> - <string name="hint_search">جستجو</string> - </resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-pt-rBR/strings.xml b/ui-components/src/main/res/values-pt-rBR/strings.xml deleted file mode 100644 index 7afc55e912d..00000000000 --- a/ui-components/src/main/res/values-pt-rBR/strings.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">Completo</string> - <string name="cancel">Cancelar</string> - <string name="save">Salvar</string> - <string name="clear">Limpar</string> - <string name="action_done">Concluído</string> - <string name="action_cancel">Cancelar</string> - <string name="action_close">Fechar</string> - <string name="hint_search">Pesquisar</string> - <string name="action_clear_all">Limpar tudo</string> - </resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-pt/strings.xml b/ui-components/src/main/res/values-pt/strings.xml deleted file mode 100644 index 2b34c177dfc..00000000000 --- a/ui-components/src/main/res/values-pt/strings.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">Concluir</string> - <string name="discard_changes">Descartar alterações</string> - <string name="not_now">Agora não</string> - <string name="keep_editing">Continue a editar</string> - <string name="review">Revisão</string> - <string name="cancel">Cancelar</string> - <string name="save">Guardar</string> - <string name="clear">Limpar</string> - <string name="draw_here">Desenhar aqui</string> - <string name="action_done">concluído</string> - <string name="action_cancel">Cancelar</string> - <string name="action_close">Fechar</string> - <string name="hint_search">Pesquisar</string> - <string name="action_clear_all">Limpar tudo</string> - <plurals name="error_count"> - <item quantity="one">%s erro</item> - <item quantity="many">%s erros</item> - <item quantity="other">%s Erros</item> - </plurals> - <plurals name="warning_count"> - <item quantity="one">%s aviso</item> - <item quantity="many">%s avisos</item> - <item quantity="other">%s Alertas</item> - </plurals> -</resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-ro/strings.xml b/ui-components/src/main/res/values-ro/strings.xml deleted file mode 100644 index 3467c6ee24e..00000000000 --- a/ui-components/src/main/res/values-ro/strings.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="cancel">Anulare</string> - <string name="save">salva</string> - <string name="action_done">Terminat</string> - <string name="action_cancel">Anulare</string> - <string name="action_close">Închidere</string> - <string name="hint_search">Căutare</string> - </resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-ru/strings.xml b/ui-components/src/main/res/values-ru/strings.xml deleted file mode 100644 index 462a4f26949..00000000000 --- a/ui-components/src/main/res/values-ru/strings.xml +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">Завершить</string> - <string name="discard_changes">Не сохранять изменения</string> - <string name="not_now">Не сейчас</string> - <string name="keep_editing">Продолжить редактирование</string> - <string name="review">Просмотр</string> - <string name="cancel">Отменить</string> - <string name="save">Сохранить</string> - <string name="clear">Очистить</string> - <string name="action_done">Готово</string> - <string name="action_cancel">Отменить</string> - <string name="action_close">Закрыть</string> - <string name="hint_search">Поиск</string> - <string name="action_clear_all">Очистить все</string> - <plurals name="error_count"> - <item quantity="one">%s ошибка</item> - <item quantity="few">%s ошибки</item> - <item quantity="many">%s ошибки</item> - <item quantity="other">%s ошибок</item> - </plurals> - <plurals name="warning_count"> - <item quantity="one">%s предупреждение</item> - <item quantity="few">%s предупреждения</item> - <item quantity="many">%s предупреждения</item> - <item quantity="other">%s предупреждений</item> - </plurals> -</resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-si/strings.xml b/ui-components/src/main/res/values-si/strings.xml deleted file mode 100644 index 04e57120b45..00000000000 --- a/ui-components/src/main/res/values-si/strings.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="discard_changes">වෙනස් කිරීම් ඉවතලන්න</string> - <string name="save">සුරකින්න</string> - <string name="action_done">නිම කළා</string> - <string name="action_close">වසන්න</string> - <string name="hint_search">සොයන්න</string> - </resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-sv/strings.xml b/ui-components/src/main/res/values-sv/strings.xml deleted file mode 100644 index e5bae8302e9..00000000000 --- a/ui-components/src/main/res/values-sv/strings.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">Färdigt</string> - <string name="discard_changes">Ignorera ändringar</string> - <string name="keep_editing">Fortsätt redigera</string> - <string name="cancel">Avbryt</string> - <string name="save">Spara</string> - <string name="clear">Klar</string> - <string name="action_cancel">Avbryt</string> - <string name="action_close">Stänga</string> - <string name="hint_search">Sök</string> - <string name="action_clear_all">Rensa alla</string> - </resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-tet/strings.xml b/ui-components/src/main/res/values-tet/strings.xml deleted file mode 100644 index 4de090c4391..00000000000 --- a/ui-components/src/main/res/values-tet/strings.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">Kompletu</string> - <string name="cancel">Kansela</string> - <string name="save">Rai</string> - <string name="clear">Hamós</string> - <string name="action_cancel">Kansela</string> - <string name="action_close">Taka</string> - </resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-tg/strings.xml b/ui-components/src/main/res/values-tg/strings.xml deleted file mode 100644 index 0e95b9a4042..00000000000 --- a/ui-components/src/main/res/values-tg/strings.xml +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">Анҷом ёфт</string> - <string name="cancel">Бекор кардан</string> - <string name="save">Захира кардан</string> - <string name="clear">Пок кардан</string> - <string name="action_done">Иҷро шуд</string> - <string name="action_cancel">Бекор кардан</string> - <string name="action_close">Пӯшидан</string> - <string name="hint_search">Ҷустуҷӯ</string> - </resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-uk/strings.xml b/ui-components/src/main/res/values-uk/strings.xml deleted file mode 100644 index d054ffd3e7b..00000000000 --- a/ui-components/src/main/res/values-uk/strings.xml +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">Завершити</string> - <string name="discard_changes">Відхилити внесені зміни</string> - <string name="not_now">Не зараз</string> - <string name="keep_editing">Продовжити редагування</string> - <string name="review">Перегляд</string> - <string name="cancel">Скасувати</string> - <string name="save">Зберегти</string> - <string name="clear">Очистити</string> - <string name="draw_here">Намалюй тут.</string> - <string name="action_done">Обрати</string> - <string name="action_cancel">Скасувати</string> - <string name="action_close">Закрити</string> - <string name="hint_search">Пошук</string> - <string name="action_clear_all">Очистити все</string> - </resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-ur/strings.xml b/ui-components/src/main/res/values-ur/strings.xml deleted file mode 100644 index 915587895b9..00000000000 --- a/ui-components/src/main/res/values-ur/strings.xml +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">مکمل</string> - <string name="cancel">منسوخ</string> - <string name="save">محفوظ</string> - <string name="clear">کلیئر</string> - <string name="action_done">ہو گیا</string> - <string name="action_cancel">منسوخ</string> - <string name="action_close">بند</string> - <string name="hint_search">تلاش کریں</string> - </resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-uz-rUZ/strings.xml b/ui-components/src/main/res/values-uz-rUZ/strings.xml deleted file mode 100644 index bf48d074e68..00000000000 --- a/ui-components/src/main/res/values-uz-rUZ/strings.xml +++ /dev/null @@ -1,14 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">Bajarildi</string> - <string name="discard_changes">Oʼzgartirishlar bekor qilinsin</string> - <string name="keep_editing">Tahrirni davom eting</string> - <string name="review">Ko‘rib chiqish</string> - <string name="cancel">Бекор қилиш</string> - <string name="save">Saqlash</string> - <string name="clear">Аниқ</string> - <string name="action_cancel">Бекор қилиш</string> - <string name="action_close">Yopmoq</string> - <string name="hint_search">Izlash</string> - <string name="action_clear_all">Barchasini tozalash</string> - </resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-uz/strings.xml b/ui-components/src/main/res/values-uz/strings.xml deleted file mode 100644 index abeb9f1dd86..00000000000 --- a/ui-components/src/main/res/values-uz/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">Тўлдириш</string> - <string name="discard_changes">Ўзгартиришлар бекор қилинсин</string> - <string name="not_now">Hozir emas</string> - <string name="keep_editing">Таҳрирни давом этинг</string> - <string name="review">Кўриб чиқиш</string> - <string name="cancel">Рад этиш</string> - <string name="save">Сақлаш</string> - <string name="clear">Тозалаш</string> - <string name="draw_here">Шу ерда чизинг</string> - <string name="action_done">Бўлди</string> - <string name="action_cancel">Рад этиш</string> - <string name="action_close">Ёпмоқ</string> - <string name="hint_search">Излаш</string> - <string name="action_clear_all">Барчасини тозалаш</string> - <plurals name="error_count"> - <item quantity="other">%s da xatoliklar</item> - </plurals> - <plurals name="warning_count"> - <item quantity="other">%s da ogohlantirishlar</item> - </plurals> -</resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-vi/strings.xml b/ui-components/src/main/res/values-vi/strings.xml deleted file mode 100644 index 8af5d33ccf2..00000000000 --- a/ui-components/src/main/res/values-vi/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">Hoàn tất</string> - <string name="discard_changes">Hủy bỏ các thay đổi</string> - <string name="not_now">Không phải bây giờ</string> - <string name="keep_editing">Tiếp tục chỉnh sửa</string> - <string name="review">Xem lại</string> - <string name="cancel">Hủy</string> - <string name="save">Lưu</string> - <string name="clear">Xóa</string> - <string name="draw_here">Vẽ ở đây</string> - <string name="action_done">Hoàn thành</string> - <string name="action_cancel">Hủy</string> - <string name="action_close">Đóng</string> - <string name="hint_search">Tìm kiếm</string> - <string name="action_clear_all">Xóa tất cả</string> - <plurals name="error_count"> - <item quantity="other">Các lỗi %s</item> - </plurals> - <plurals name="warning_count"> - <item quantity="other">Các cảnh báo %s</item> - </plurals> -</resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-zh-rCN/strings.xml b/ui-components/src/main/res/values-zh-rCN/strings.xml deleted file mode 100644 index 5a20c6f8bbc..00000000000 --- a/ui-components/src/main/res/values-zh-rCN/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">完成</string> - <string name="discard_changes">忽略修改</string> - <string name="not_now">现在不要</string> - <string name="keep_editing">继续编辑</string> - <string name="review">审查</string> - <string name="cancel">取消</string> - <string name="save">保存</string> - <string name="clear">清除</string> - <string name="draw_here">在此画图</string> - <string name="action_done">完成</string> - <string name="action_cancel">取消</string> - <string name="action_close">关闭</string> - <string name="hint_search">搜索</string> - <string name="action_clear_all">全清除</string> - <plurals name="error_count"> - <item quantity="other">%s 错误</item> - </plurals> - <plurals name="warning_count"> - <item quantity="other">%s 警告</item> - </plurals> -</resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values-zh/strings.xml b/ui-components/src/main/res/values-zh/strings.xml deleted file mode 100644 index 5a20c6f8bbc..00000000000 --- a/ui-components/src/main/res/values-zh/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">完成</string> - <string name="discard_changes">忽略修改</string> - <string name="not_now">现在不要</string> - <string name="keep_editing">继续编辑</string> - <string name="review">审查</string> - <string name="cancel">取消</string> - <string name="save">保存</string> - <string name="clear">清除</string> - <string name="draw_here">在此画图</string> - <string name="action_done">完成</string> - <string name="action_cancel">取消</string> - <string name="action_close">关闭</string> - <string name="hint_search">搜索</string> - <string name="action_clear_all">全清除</string> - <plurals name="error_count"> - <item quantity="other">%s 错误</item> - </plurals> - <plurals name="warning_count"> - <item quantity="other">%s 警告</item> - </plurals> -</resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values/colors.xml b/ui-components/src/main/res/values/colors.xml deleted file mode 100644 index a6b3daec935..00000000000 --- a/ui-components/src/main/res/values/colors.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources></resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values/strings.xml b/ui-components/src/main/res/values/strings.xml deleted file mode 100644 index a39d266a406..00000000000 --- a/ui-components/src/main/res/values/strings.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="complete">Complete</string> - <string name="discard_changes">Discard changes</string> - <string name="not_now">Not now</string> - <string name="keep_editing">Keep editing</string> - <string name="review">Review</string> - <string name="cancel">Cancel</string> - <string name="save">Save</string> - <string name="clear">Clear</string> - <string name="draw_here">Draw here</string> - <string name="button_extended" translatable="false">Extended Button</string> - <string name="action_done">Done</string> - <string name="action_cancel">Cancel</string> - <string name="action_close">Close</string> - <string name="hint_search">Search</string> - <string name="action_clear_all">Clear all</string> - <plurals name="error_count"> - <item quantity="one">%s error</item> - <item quantity="other">%s errors</item> - </plurals> - <plurals name="warning_count"> - <item quantity="one">%s warning</item> - <item quantity="other">%s warnings</item> - </plurals> -</resources> \ No newline at end of file diff --git a/ui-components/src/main/res/values/styles.xml b/ui-components/src/main/res/values/styles.xml deleted file mode 100644 index 32e17fef12a..00000000000 --- a/ui-components/src/main/res/values/styles.xml +++ /dev/null @@ -1,10 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <style name="CustomBottomSheetDialogTheme" parent="Theme.Design.Light.BottomSheetDialog"> - <item name="bottomSheetStyle">@style/CustomBottomSheetStyle</item> - </style> - - <style name="CustomBottomSheetStyle" parent="Widget.Design.BottomSheet.Modal"> - <item name="android:background">@android:color/transparent</item> - </style> -</resources> \ No newline at end of file diff --git a/whatsnew/whatsnew-en-US b/whatsnew/whatsnew-en-US index 9e29dc675af..d7d138dfd25 100644 --- a/whatsnew/whatsnew-en-US +++ b/whatsnew/whatsnew-en-US @@ -1,7 +1,5 @@ This is a patch version that fixes: -- ANDROAPP-7269 Crash on search -- ANDROAPP-7293 Bottom sheet landscape behavior -- ANDROAPP-7345 Changes to enrollment date not respected by program rules -- ANDROAPP-7368 Crash when trying to update fields in Tracker -.... + +- ANDROAPP-7634 SMS module is accidentally enabled when ASWA is installed + You can find all the details on Jira and Github. \ No newline at end of file
  • yi6%RWC{f=V3hI>cfG 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